vm6502/testall.asm

954 lines
9.9 KiB
NASM

; Testing 6502 opcodes.
; Copied and adapted from AllSuiteA.asm from project hmc-6502:
; https://code.google.com/archive/p/hmc-6502/
; EXPECTED FINAL RESULTS: $0210 = FF
; (any other number will be the test that failed)
; To build with cl65:
; cl65 -C testall_cl65.cfg -l --start-addr 16384 -t none -o tall.bin testall.asm
; then load to simulator from debug console with 'L B TALL.BIN'
; and execute with 'X 4000'.
.segment "CODE1"
.segment "CODE2"
.ORG $4000
start:
; initialize:
LDA #$00
STA $0210
; store each test's expected
LDA #$55
STA $0200
LDA #$AA
STA $0201
LDA #$FF
STA $0202
LDA #$6E
STA $0203
LDA #$42
STA $0204
LDA #$33
STA $0205
LDA #$9D
STA $0206
LDA #$7F
STA $0207
LDA #$A5
STA $0208
LDA #$1F
STA $0209
LDA #$CE
STA $020A
LDA #$29
STA $020B
LDA #$42
STA $020C
LDA #$6C
STA $020D
LDA #$42
STA $020E
; expected result: $022A = 0x55
test00:
LDA #85
LDX #42
LDY #115
STA $81
LDA #$01
STA $61
LDA #$7E
LDA $81
STA $0910
LDA #$7E
LDA $0910
STA $56,X
LDA #$7E
LDA $56,X
STY $60
STA ($60),Y
LDA #$7E
LDA ($60),Y
STA $07ff,X
LDA #$7E
LDA $07ff,X
STA $07ff,Y
LDA #$7E
LDA $07ff,Y
STA ($36,X)
LDA #$7E
LDA ($36,X)
STX $50
LDX $60
LDY $50
STX $0913
LDX #$22
LDX $0913
STY $0914
LDY #$99
LDY $0914
STY $2D,X
STX $77,Y
LDY #$99
LDY $2D,X
LDX #$22
LDX $77,Y
LDY #$99
LDY $08A0,X
LDX #$22
LDX $08A1,Y
STA $0200,X
; CHECK test00:
LDA $022A
CMP $0200
BEQ test00pass
JMP theend
test00pass:
LDA #$FE
STA $0210
; expected result: $A9 = 0xAA
test01:
; imm
LDA #85
AND #83
ORA #56
EOR #17
; zpg
STA $99
LDA #185
STA $10
LDA #231
STA $11
LDA #57
STA $12
LDA $99
AND $10
ORA $11
EOR $12
; zpx
LDX #16
STA $99
LDA #188
STA $20
LDA #49
STA $21
LDA #23
STA $22
LDA $99
AND $10,X
ORA $11,X
EOR $12,X
; abs
STA $99
LDA #111
STA $0110
LDA #60
STA $0111
LDA #39
STA $0112
LDA $99
AND $0110
ORA $0111
EOR $0112
; abx
STA $99
LDA #138
STA $0120
LDA #71
STA $0121
LDA #143
STA $0122
LDA $99
AND $0110,X
ORA $0111,X
EOR $0112,X
; aby
LDY #32
STA $99
LDA #115
STA $0130
LDA #42
STA $0131
LDA #241
STA $0132
LDA $99
AND $0110,Y
ORA $0111,Y
EOR $0112,Y
; idx
STA $99
LDA #112
STA $30
LDA #$01
STA $31
LDA #113
STA $32
LDA #$01
STA $33
LDA #114
STA $34
LDA #$01
STA $35
LDA #197
STA $0170
LDA #124
STA $0171
LDA #161
STA $0172
LDA $99
AND ($20,X)
ORA ($22,X)
EOR ($24,X)
; idy
STA $99
LDA #96
STA $40
LDA #$01
STA $41
LDA #97
STA $42
LDA #$01
STA $43
LDA #98
STA $44
LDA #$01
STA $45
LDA #55
STA $0250
LDA #35
STA $0251
LDA #157
STA $0252
LDA $99
LDY #$F0
AND ($40),Y
ORA ($42),Y
EOR ($44),Y
STA $A9
; CHECK test01
LDA $A9
CMP $0201
BEQ test02
LDA #$01
STA $0210
JMP theend
; expected result: $71 = 0xFF
test02:
LDA #$FF
LDX #$00
STA $90
INC $90
INC $90
LDA $90
LDX $90
STA $90,X
INC $90,X
LDA $90,X
LDX $91
STA $0190,X
INC $0192
LDA $0190,X
LDX $0192
STA $0190,X
INC $0190,X
LDA $0190,X
LDX $0193
STA $0170,X
DEC $0170,X
LDA $0170,X
LDX $0174
STA $0170,X
DEC $0173
LDA $0170,X
LDX $0173
STA $70,X
DEC $70,X
LDA $70,X
LDX $72
STA $70,X
DEC $71
DEC $71
; CHECK test02
LDA $71
CMP $0202
BEQ test03
LDA #$02
STA $0210
JMP theend
; expected result: $01DD = 0x6E
test03:
LDA #$4B
LSR
ASL
STA $50
ASL $50
ASL $50
LSR $50
LDA $50
LDX $50
ORA #$C9
STA $60
ASL $4C,X
LSR $4C,X
LSR $4C,X
LDA $4C,X
LDX $60
ORA #$41
STA $012E
LSR $0100,X
LSR $0100,X
ASL $0100,X
LDA $0100,X
LDX $012E
ORA #$81
STA $0100,X
LSR $0136
LSR $0136
ASL $0136
LDA $0100,X
; rol & ror
ROL
ROL
ROR
STA $70
LDX $70
ORA #$03
STA $0C,X
ROL $C0
ROR $C0
ROR $C0
LDA $0C,X
LDX $C0
STA $D0
ROL $75,X
ROL $75,X
ROR $75,X
LDA $D0
LDX $D0
STA $0100,X
ROL $01B7
ROL $01B7
ROL $01B7
ROR $01B7
LDA $0100,X
LDX $01B7
STA $01DD
ROL $0100,X
ROR $0100,X
ROR $0100,X
; CHECK test03
LDA $01DD
CMP $0203
BEQ test04
LDA #$03
STA $0210
JMP theend
; expected result: $40 = 0x42
test04:
LDA #$E8 ;originally:#$7C
STA $20
LDA #$42 ;originally:#$02
STA $21
LDA #$00
ORA #$03
JMP jump1
ORA #$FF ; not done
jump1:
ORA #$30
JSR subr
ORA #$42
JMP ($0020)
ORA #$FF ; not done
subr:
STA $30
LDX $30
LDA #$00
RTS
final:
STA $0D,X
; CHECK test04
LDA $40
CMP $0204
BEQ test05
LDA #$04
STA $0210
JMP theend
; expected result: $40 = 0x33
test05:
LDA #$35
TAX
DEX
DEX
INX
TXA
TAY
DEY
DEY
INY
TYA
TAX
LDA #$20
TXS
LDX #$10
TSX
TXA
STA $40
; CHECK test05
LDA $40
CMP $0205
BEQ test06
LDA #$05
STA $0210
JMP theend
; expected result: $30 = 9D
test06:
; RESET TO CARRY FLAG = 0
ROL
LDA #$6A
STA $50
LDA #$6B
STA $51
LDA #$A1
STA $60
LDA #$A2
STA $61
LDA #$FF
ADC #$FF
ADC #$FF
SBC #$AE
STA $40
LDX $40
ADC $00,X
SBC $01,X
ADC $60
SBC $61
STA $0120
LDA #$4D
STA $0121
LDA #$23
ADC $0120
SBC $0121
STA $F0
LDX $F0
LDA #$64
STA $0124
LDA #$62
STA $0125
LDA #$26
ADC $0100,X
SBC $0101,X
STA $F1
LDY $F1
LDA #$E5
STA $0128
LDA #$E9
STA $0129
LDA #$34
ADC $0100,Y
SBC $0101,Y
STA $F2
LDX $F2
LDA #$20
STA $70
LDA #$01
STA $71
LDA #$24
STA $72
LDA #$01
STA $73
ADC ($41,X)
SBC ($3F,X)
STA $F3
LDY $F3
LDA #$DA
STA $80
LDA #$00
STA $81
LDA #$DC
STA $82
LDA #$00
STA $83
LDA #$AA
ADC ($80),Y
SBC ($82),Y
STA $30
; CHECK test06
LDA $30
CMP $0206
BEQ test07
LDA #$06
STA $0210
JMP theend
; expected result: $15 = 0x7F
test07:
; prepare memory
LDA #$00
STA $34
LDA #$FF
STA $0130
LDA #$99
STA $019D
LDA #$DB
STA $0199
LDA #$2F
STA $32
LDA #$32
STA $4F
LDA #$30
STA $33
LDA #$70
STA $AF
LDA #$18
STA $30
; imm
CMP #$18
BEQ beq1 ; taken
AND #$00 ; not done
beq1:
; zpg
ORA #$01
CMP $30
BNE bne1 ; taken
AND #$00 ; not done
bne1:
; abs
LDX #$00
CMP $0130
BEQ beq2 ; not taken
STA $40
LDX $40
beq2:
; zpx
CMP $27,X
BNE bne2 ; not taken
ORA #$84
STA $41
LDX $41
bne2:
; abx
AND #$DB
CMP $0100,X
BEQ beq3 ; taken
AND #$00 ; not done
beq3:
; aby
STA $42
LDY $42
AND #$00
CMP $0100,Y
BNE bne3 ; taken
ORA #$0F ; not done
bne3:
; idx
STA $43
LDX $43
ORA #$24
CMP ($40,X)
BEQ beq4 ; not taken
ORA #$7F
beq4:
; idy
STA $44
LDY $44
EOR #$0F
CMP ($33),Y
BNE bne4 ; not taken
LDA $44
STA $15
bne4:
; CHECK test07
LDA $15
CMP $0207
BEQ test08
LDA #$07
STA $0210
JMP theend
; expected result: $42 = 0xA5
test08:
; prepare memory
LDA #$A5
STA $20
STA $0120
LDA #$5A
STA $21
; cpx imm...
LDX #$A5
CPX #$A5
BEQ b1 ; taken
LDX #$01 ; not done
b1:
; cpx zpg...
CPX $20
BEQ b2 ; taken
LDX #$02 ; not done
b2:
; cpx abs...
CPX $0120
BEQ b3 ; taken
LDX #$03 ; not done
b3:
; cpy imm...
STX $30
LDY $30
CPY #$A5
BEQ b4 ; taken
LDY #$04 ; not done
b4:
; cpy zpg...
CPY $20
BEQ b5 ; taken
LDY #$05 ; not done
b5:
; cpy abs...
CPY $0120
BEQ b6 ; taken
LDY #$06 ; not done
b6:
; bit zpg...
STY $31
LDA $31
BIT $20
BNE b7 ; taken
LDA #$07 ; not done
b7:
; bit abs...
BIT $0120
BNE b8 ; taken
LDA #$08 ; not done
b8:
BIT $21
BNE b9 ; not taken
STA $42
b9:
; CHECK test08
LDA $42
CMP $0208
BEQ test09
LDA #$08
STA $0210
JMP theend
; expected result: $80 = 0x1F
test09:
; prepare memory
LDA #$54
STA $32
LDA #$B3
STA $A1
LDA #$87
STA $43
; BPL
LDX #$A1
BPL bpl1 ; not taken
LDX #$32
bpl1:
LDY $00,X
BPL bpl2 ; taken
LDA #$05 ; not done
LDX $A1 ; not done
bpl2:
; BMI
BMI bmi1 ; not taken
SBC #$03
bmi1:
BMI bmi2 ; taken
LDA #$41 ; not done
bmi2:
; BVC
EOR #$30
STA $32
ADC $00,X
BVC bvc1 ; not taken
LDA #$03
bvc1:
STA $54
LDX $00,Y
ADC $51,X
BVC bvc2 ; taken
LDA #$E5 ; not done
bvc2:
; BVS
ADC $40,X
BVS bvs1 ; not taken
STA $0001,Y
ADC $55
bvs1:
BVS bvs2 ; taken
LDA #$00
bvs2:
; BCC
ADC #$F0
BCC bcc1 ; not taken
STA $60
ADC $43
bcc1:
BCC bcc2 ; taken
LDA #$FF
bcc2:
; BCS
ADC $54
BCS bcs1 ; not taken
ADC #$87
LDX $60
bcs1:
BCS bcs2 ; taken
LDA #$00 ; not done
bcs2:
STA $73,X
; CHECK test09
LDA $80
CMP $0209
BEQ test10
LDA #$09
STA $0210
JMP theend
; expected result: $30 = 0xCE
test10:
; RESET TO CARRY = 0 & OVERFLOW = 0
ADC #$00
LDA #$99
ADC #$87
CLC
NOP
BCC t10bcc1 ; taken
ADC #$60 ; not done
ADC #$93 ; not done
t10bcc1:
SEC
NOP
BCC t10bcc2 ; not taken
CLV
t10bcc2:
BVC t10bvc1 ; taken
LDA #$00 ; not done
t10bvc1:
ADC #$AD
NOP
STA $30
; CHECK test10
LDA $30
CMP $020A
BEQ test11
LDA #$0A
STA $0210
JMP theend
; expected result: $30 = 0x29
test11:
; RESET TO CARRY = 0 & ZERO = 0
ADC #$01
LDA #$27
ADC #$01
SEC
PHP
CLC
PLP
ADC #$00
PHA
LDA #$00
PLA
STA $30
; CHECK test11
LDA $30
CMP $020B
BEQ test12
LDA #$0B
STA $0210
JMP theend
; expected result: $33 = 0x42
test12:
CLC
LDA #$42
BCC runstuff
STA $33
BCS t12end
runstuff:
LDA #$45
PHA
LDA #$61
PHA
SEC
PHP
CLC
RTI
t12end:
; CHECK test12
LDA $33
CMP $020C
BEQ test13
LDA #$0C
STA $0210
JMP theend
; expected result: $21 = 0x6C (simulator)
; $21 = 0x0C (ours)
test13:
; RESET TO CARRY = 0 & ZERO = 0
ADC #$01
SEI
SED
PHP
PLA
STA $20
CLI
CLD
PHP
PLA
ADC $20
STA $21
; CHECK test13
LDA $21
CMP $020D
BEQ test14
LDA #$0D
STA $0210
JMP theend
; expect result: $60 = 0x42
test14:
; !!! NOTICE: BRK doesn't work in this
; simulator, so commented instructions
; are what should be executed...
;JMP pass_intrp
LDA #$41
STA $60
;RTI
;pass_intrp:
;LDA #$FF
;STA $60
;BRK (two bytes)
INC $60
; CHECK test14
LDA $60
CMP $020E
BEQ suiteafinal
LDA #$0E
STA $0210
JMP theend
suiteafinal:
; IF $0210 == 0xFE, INCREMENT
; (checking that it didn't
; happen to wander off and
; not run our instructions
; to say which tests failed...)
LDA #$FE
CMP $0210
BNE theend
INC $0210
theend:
BRK
BRK
;JMP theend
LDX #$FF
TXS
RTS
.segment "KERN"
.ORG $FF00
RTI
.segment "VECT"
.ORG $FFFA
.BYTE $00,$FF,$00,$FF,$00,$FF
;-------------------------- END