URL
https://opencores.org/ocsvn/rtf65002/rtf65002/trunk
Subversion Repositories rtf65002
[/] [rtf65002/] [trunk/] [software/] [asm/] [t65002d.asm] - Rev 4
Compare with Previous | Blame | View Log
UART EQU $CF00XMIT_FUL EQU 8cpu rtf65002org $0FFFFE000 ; 8kB ROMstartseilda #0x01 ; turn on instruction cachetrs r1,cc ; transfer to cache control regldx #$1000 ; set stack pointer to word address $1000txsemm ; switch to emulation mode;------------------------------------------------------------------------------; 65C02 testing;------------------------------------------------------------------------------cpu W65C02 ; tell assembler to use 6502 tablesldx #$FFtxsjsr putmsgdb "C02 Testing Processor", 13, 10, 0bra braok8jsr putmsgdb "BRA:F", 13, 10, 0braok8brl brlok8jsr putmsgdb "BRL:F", 13, 10, 0brlok8secbcs bcsok8jsr putmsgdb "BCS:F", 13, 10, 0bcsok8clcbcc bccok8jsr putmsgdb "BCC:F", 13, 10, 0bccok8ld r1,#$00beq beqok8jsr putmsgdb "BEQ:F", 13, 10, 0beqok8ld r1,#$80000000bne bneok8jsr putmsgdb "BNE:F", 13, 10, 0bneok8or r1,r1,#$00bmi bmiok8jsr putmsgdb "BMI:F", 13, 10, 0bmiok8eor r1,r1,#$80000000bpl bplok8jsr putmsgdb "BPL:F", 13, 10, 0bplok8ld r1,#$7fffffffadd r1,r1,#$1 ; should give signed overflowbvs bvsok8jsr putmsgdb "BVS:F", 13, 10, 0bvsok8clvbvc bvcokjsr putmsgdb "BVC:F", 13, 10, 0bvcok8;--------------------------------------------------------------------------------------; Native mode tests;--------------------------------------------------------------------------------------nat ; switch to native modecpu rtf65002jsr putmsg3db "65k Testing Processor", 13, 10, 0;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -; First thing to test is branches. If you can't branch reliably; then the validity of the remaining tests are in question.; Test branches and also simultaneously some other simple; instructions.;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -seibra braokjsr putmsg3db "BRA:F", 13, 10, 0braokbrl brlokjsr putmsg3db "BRL:F", 13, 10, 0brloksecbcs bcsokjsr putmsg3db "BCS:F", 13, 10, 0bcsokclcbcc bccokjsr putmsg3db "BCC:F", 13, 10, 0bccokld r1,#$00beq beqokjsr putmsg3db "BEQ:F", 13, 10, 0beqokld r1,#$80000000bne bneokjsr putmsg3db "BNE:F", 13, 10, 0bneokor r1,r1,#$00bmi bmiokjsr putmsg3db "BMI:F", 13, 10, 0bmiokeor r1,r1,#$80000000bpl bplokjsr putmsg3db "BPL:F", 13, 10, 0bplokld r1,#$7fffffffadd r1,r1,#$1 ; should give signed overflowbvs bvsokjsr putmsg3db "BVS:F", 13, 10, 0bvsokclvbvc bvcokjsr putmsg3db "BVC:F", 13, 10, 0bvcok;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -; Compare Instructions;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -jsr putmsg3db "test cmp/cpx/cpy", 13, 10, 0ld r1,#27 ; bit 7 = 0clccmp r1,#27bcs cmperrbne cmperrbmi cmperrlda #$A1000000cmp r1,#20000000bpl cmperr ; should be neg.seclda #10cmp r1,#20 ; should be a borrow herebcc cmperrclvlda #$80000000 ; -128 - 32 = -160 should overflowcmp r1,#$20000000 ; compare doesn't affect overflowbvs cmperrbvc cmpokcmperrjsr putmsgdb "CMP:F", 13, 10, 0cmpokldx #27clccpx #27bcs cpxerrbne cpxerrbmi cpxerrldx #$A1000000cpx #20000000bpl cpxerrldx #10cpx #20 ; should be a borrow herebcc cpxerrclvldx #$80000000 ; -128 - 32 = -160 should overflowcpx #$20000000 ; but cpx shouldn't change overflowbvs cpxerrbvc cpxokcpxerrjsr putmsgdb "CPX:F", 13, 10, 0cpxokldy #27clccpy #27bcs cpyerrbne cpyerrbmi cpyerrldy #$B0000000cpy #20000000bpl cpyerrldy #10cpy #20 ; should be a borrow herebcc cpyerrclvldy #$80000000 ; -128 - 32 = -160 should overflowcpy #$20000000 ; but cpy shouldn't change overflowbvs cpyerrbvc cpyokcpyerrjsr putmsgdb "CPY:F", 13, 10, 0cpyok;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -; Accumulator ops;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -jsr putmsgdb "Test Acc ops", 13, 10, 0; ORclvclclda #0or r1,r1,#0bne oraerrbvs oraerrbmi oraerrbcs oraerrsecor r1,r1,#0bcc oraerror r1,r1,#$55beq oraerrcmp r1,#$55bne oraerror r1,r1,#$aacmp r1,#$ffbne oraerrbeq oraokoraerrjsr putmsgdb "ORA:F", 13, 10, 0oraok; SUBlda #27 ; bit 7 = 0secsub r1,r1,#27bcs sbcerr1bne sbcerr3bmi sbcerr2bvs sbcerr4lda #$A1000000sub r1,r1,#$20000000bpl sbcerr2 ; should be neg.cmp r1,#$81000000bne sbcerr3seclda #10sub r1,r1,#20 ; should be a borrow herebcc sbcerr1clvlda #$80000000 ; -128 - 32 = -160 should overflowsub r1,r1,#$20000000 ;bvc sbcerr4bvs sbcoksbcerrbsr putmsgdb "SBC:F", 13, 10, 0jmp sbcoksbcerr1bsr putmsgdb "SBC:C", 13, 10, 0jmp sbcoksbcerr2jsr putmsgdb "SBC2:N", 13, 10, 0jmp sbcoksbcerr3jsr putmsgdb "SBC3:Z", 13, 10, 0jmp sbcoksbcerr4jsr putmsgdb "SBC:V", 13, 10, 0jmp sbcoksbcok; BIT / ANDclvlda #$ffFFFFFFbit r1,n5555bvc biterrbmi biterrbit r1,nAAAAbvs biterrbpl biterrbmi bitokbiterrjsr putmsgdb "BIT:F", 13, 10, 0bitok; PLPlda #$DFFFFFFF ; leave em bit clearphaplpbpl plperrbvc plperrbne plperrbcc plperrbcs plpokplperrjsr putmsgdb "PLP:F", 13, 10, 0plpok;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -; Load;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -jsr putmsgdb "Test lda/ldx/ldy", 13, 10, 0; ldaclclda #0bne ldaerrbmi ldaerrbcs ldaerrlda #$80000000beq ldaerrbpl ldaerrlda #$00st r1,$800bne ldaerrbmi ldaerrbcs ldaerrlda #-1lda $800bne ldaerrbmi ldaerrbcs ldaerrcmp r1,#0bne ldaerrseclda #-1st r1,$800beq ldaerrbpl ldaerrbcc ldaerrlda #0lda $800beq ldaerrbpl ldaerrbcc ldaerrcmp r1,#-1beq ldaokldaerrjsr putmsgdb "LDA:F", 13, 10, 0ldaok; ldxclclda #$80000000 ; z = 0, n = 1ldx #0bcs ldxerrbne ldxerrbmi ldxerrstx $800bne ldxerrbmi ldxerrbcs ldxerrldx #-1ldx $800bne ldxerrbmi ldxerrbcs ldxerrcpx #0bne ldxerrsecldx #-1stx $800beq ldxerrbpl ldxerrbcc ldxerrldx #0ldx $800beq ldxerrbpl ldxerrbcc ldxerrcpx #-1beq ldxokldxerrjsr putmsgdb "LDX:F", 13, 10, 0; ldyldxokclclda #$80000000 ; z = 0, n = 1ldy #0bcs ldyerrbne ldyerrbmi ldyerrsty $800bne ldyerrbmi ldyerrbcs ldyerrldy #-1ldy $800bne ldyerrbmi ldyerrbcs ldyerrcpy #0bne ldyerrsecldy #-1sty $800beq ldyerrbpl ldyerrbcc ldyerrldy #0ldy $800beq ldyerrbpl ldyerrbcc ldyerrcpy #-1beq ldyokldyerrjsr putmsgdb "LDY:F", 13, 10, 0ldyok;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -; Test register transfers;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -jsr putmsgdb "Test tax/tay/txa/tya/tsx/txs", 13, 10, 0; taxclclda #0ldx #$80000000 ; z = 0, n = 1taxbcs taxerrbmi taxerrbne taxerrtxabne taxerrlda #-1secldx #0taxbcc taxerrbpl taxerrbeq taxerrtxacmp r1,#-1beq taxoktaxerrjsr putmsgdb "TAX:F", 13, 10, 0taxok; tayclclda #0ldy #$80000000 ; z = 0, n = 1taybcs tayerrbmi tayerrbne tayerrtyabne tayerrlda #-1secldy #0taybcc tayerrbpl tayerrbeq tayerrtyacmp r1,#-1beq tayoktayerrjsr putmsgdb "TAY:F", 13, 10, 0tayok; txsldx #15txsldx #87tsxcpx #15beq txsokldx #$1000txsjsr putmsgdb "TSX:F", 13, 10, 0txsokldx #87txacmp r1,#87beq txaokjsr putmsgdb "TXA:F", 13, 10, 0txaoktaycpy #87beq tayok1jsr putmsgdb "TAY:F", 13, 10, 0tayok1tyabeq tyaerrbmi tyaerrcmp r1,#87beq tyaoktyaerrjsr putmsgdb "TYA:F", 13, 10, 0tyaok;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -; Increment / Decrement;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -jsr putmsgdb "Test inx/dex/iny/dey/ina/dea/inc/dec", 13, 10, 0ldx #$FFFFFFFEclclda #0inxbcs inxerrbeq inxerrbpl inxerrcpx #$ffFFFFFFbne inxerrseclda #$80inxbcc inxerrbne inxerrbmi inxerrcpx #0bne inxerrclc;inxl1 ; test loop; inx; bcs inxerr; bne inxl1sec;inxl2; inx; bcc inxerr; bne inxl2beq inxokinxerrjsr putmsgdb "INX:F", 13, 10, 0inxok; dexldx #2clclda #0dexbcs dexerrbeq dexerrbmi dexerrcpx #1bne dexerrseclda #$80dexbcc dexerrbne dexerrbmi dexerrcpx #0bne dexerrlda #0dexbeq dexerrbpl dexerrcpx #$ffffffffbne dexerrclc;dexl1; dex; bcs dexerr; bne dexl1; secdexl2; dex; bcc dexerr; bne dexl2beq dexokdexerrjsr putmsgdb "DEX:F", 13, 10, 0dexok; inyldy #$FFFFFFFEclcadd r1,r1,#0inybcs inyerrbeq inyerrbpl inyerrcpy #$ffffffffbne inyerrseclda #$80inybcc inyerrbne inyerrbmi inyerrcpy #0bne inyerrclcinyl1 ; test loop; iny; bcs inyerr; bne inyl1secinyl2; iny; bcc inyerr; bne inyl2beq inyokinyerrjsr putmsgdb "INY:F", 13, 10, 0; deyinyokldy #2clclda #0deybcs deyerrbeq deyerrbmi deyerrcpy #1bne deyerrseclda #$80deybcc deyerrbne deyerrbmi deyerrcpy #0bne deyerrlda #0deybeq deyerrbpl deyerrcpy #$ffffffffbne deyerr; clcdeyl1; dey; bcs deyerr; bne deyl1; secdeyl2; dey; bcc deyerr; bne deyl2bra deyokdeyerrjsr putmsgdb "DEY:F", 13, 10, 0deyoklda #1inacmp r1,#2beq inaokjsr putmsgdb "INA:F", 13, 10, 0inaoklda #2deacmp r1,#1beq deaokjsr putmsgdb "DEA:F", 13, 10, 0deaokstpputmsgputmsg3plx ; pop the return address off the stackpm5lb r1,$0,x ; load byte into accumulatorinxora #0 ; test for end of stringbeq pm6bsr putSerbra pm5pm6jmp (x) ; return to next code byte; put character to serial port; test and,bne,pha,pla,sta,lda,rtsputSerpha ; temporarily save characterps1lb r1,UART+1 ; get serial port statusand #XMIT_FUL ; is it full ?bne ps1 ; If full then waitpla ; get back the char to writesb r1,UART ; write it to the xmit registerrtsnmiroutrtialign 4n5555dw $55555555nAAAAdw $AAAAAAAAdw 12dw 34org $0FFFFFFF4 ; NMI vectordw nmiroutorg $0FFFFFFF8 ; reset vector, native modedw start
