mirror of
https://github.com/makarcz/vm6502.git
synced 2024-09-27 12:58:15 +00:00
67f1a62596
Version 2.0, full emulation of 6502 op-codes, fully tested and functional. Extended description in ReadMe file. Bin2Hex tool to convert binary images to memory definition format. Microchess, EhBasic added.
954 lines
11 KiB
NASM
954 lines
11 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 |