add test that checks all opcodes per current cpu flags
This commit is contained in:
813
test/asm/cpudetect/allinst.inc
Normal file
813
test/asm/cpudetect/allinst.inc
Normal file
@@ -0,0 +1,813 @@
|
|||||||
|
|
||||||
|
; just emit to bss for now, this way the output wont get checked, which is
|
||||||
|
; fine - we only want to see if the assembler accepts all the opcodes it
|
||||||
|
; should accept for the current CPU mode
|
||||||
|
.bss
|
||||||
|
|
||||||
|
.if (.cpu .bitand CPU_ISET_6502)
|
||||||
|
.scope
|
||||||
|
; regular basic 6502 (legal) instruction set
|
||||||
|
LABEL0:
|
||||||
|
brk ; $00
|
||||||
|
ora ($12,x) ; $01
|
||||||
|
ora $12 ; $05
|
||||||
|
asl $12 ; $06
|
||||||
|
php ; $08
|
||||||
|
ora #$12 ; $09
|
||||||
|
asl a ; $0a
|
||||||
|
ora $1234 ; $0d
|
||||||
|
asl $1234 ; $0e
|
||||||
|
bpl LABEL0 ; $10
|
||||||
|
ora ($12),y ; $11
|
||||||
|
ora $12,x ; $15
|
||||||
|
asl $12,x ; $16
|
||||||
|
clc ; $18
|
||||||
|
ora $1234,y ; $19
|
||||||
|
ora $1234,x ; $1d
|
||||||
|
asl $1234,x ; $1e
|
||||||
|
jsr $1234 ; $20
|
||||||
|
and ($12,x) ; $21
|
||||||
|
bit $12 ; $24
|
||||||
|
and $12 ; $25
|
||||||
|
rol $12 ; $26
|
||||||
|
plp ; $28
|
||||||
|
and #$12 ; $29
|
||||||
|
rol a ; $2a
|
||||||
|
bit $1234 ; $2c
|
||||||
|
and $1234 ; $2d
|
||||||
|
rol $1234 ; $2e
|
||||||
|
bmi LABEL ; $30
|
||||||
|
and ($12),y ; $31
|
||||||
|
and $12,x ; $35
|
||||||
|
rol $12,x ; $36
|
||||||
|
sec ; $38
|
||||||
|
and $1234,y ; $39
|
||||||
|
and $1234,x ; $3d
|
||||||
|
rol $1234,x ; $3e
|
||||||
|
rti ; $40
|
||||||
|
eor ($12,x) ; $41
|
||||||
|
eor $12 ; $45
|
||||||
|
lsr $12 ; $46
|
||||||
|
pha ; $48
|
||||||
|
eor #$12 ; $49
|
||||||
|
lsr a ; $4a
|
||||||
|
jmp $1234 ; $4c
|
||||||
|
eor $1234 ; $4d
|
||||||
|
lsr $1234 ; $4e
|
||||||
|
bvc LABEL ; $50
|
||||||
|
eor ($12),y ; $51
|
||||||
|
eor $12,x ; $55
|
||||||
|
lsr $12,x ; $56
|
||||||
|
cli ; $58
|
||||||
|
eor $1234,y ; $59
|
||||||
|
eor $1234,x ; $5d
|
||||||
|
lsr $1234,x ; $5e
|
||||||
|
rts ; $60
|
||||||
|
adc ($12,x) ; $61
|
||||||
|
adc $12 ; $65
|
||||||
|
ror $12 ; $66
|
||||||
|
pla ; $68
|
||||||
|
adc #$12 ; $69
|
||||||
|
ror a ; $6a
|
||||||
|
jmp ($1234) ; $6c
|
||||||
|
adc $1234 ; $6d
|
||||||
|
ror $1234 ; $6e
|
||||||
|
bvs LABEL ; $70
|
||||||
|
adc ($12),y ; $71
|
||||||
|
adc $12,x ; $75
|
||||||
|
ror $12,x ; $76
|
||||||
|
sei ; $78
|
||||||
|
adc $1234,y ; $79
|
||||||
|
adc $1234,x ; $7d
|
||||||
|
ror $1234,x ; $7e
|
||||||
|
LABEL:
|
||||||
|
sta ($12,x) ; $81
|
||||||
|
sty $12 ; $84
|
||||||
|
sta $12 ; $85
|
||||||
|
stx $12 ; $86
|
||||||
|
dey ; $88
|
||||||
|
txa ; $8a
|
||||||
|
sty $1234 ; $8c
|
||||||
|
sta $1234 ; $8d
|
||||||
|
stx $1234 ; $8e
|
||||||
|
bcc LABEL ; $90
|
||||||
|
sta ($12),y ; $91
|
||||||
|
sty $12,x ; $94
|
||||||
|
sta $12,x ; $95
|
||||||
|
stx $12,y ; $96
|
||||||
|
tya ; $98
|
||||||
|
sta $1234,y ; $99
|
||||||
|
txs ; $9a
|
||||||
|
sta $1234,x ; $9d
|
||||||
|
ldy #$12 ; $a0
|
||||||
|
lda ($12,x) ; $a1
|
||||||
|
ldx #$12 ; $a2
|
||||||
|
ldy $12 ; $a4
|
||||||
|
lda $12 ; $a5
|
||||||
|
ldx $12 ; $a6
|
||||||
|
tay ; $a8
|
||||||
|
lda #$12 ; $a9
|
||||||
|
tax ; $aa
|
||||||
|
ldy $1234 ; $ac
|
||||||
|
lda $1234 ; $ad
|
||||||
|
ldx $1234 ; $ae
|
||||||
|
bcs LABEL ; $b0
|
||||||
|
lda ($12),y ; $b1
|
||||||
|
ldy $12,x ; $b4
|
||||||
|
lda $12,x ; $b5
|
||||||
|
ldx $12,y ; $b6
|
||||||
|
clv ; $b8
|
||||||
|
lda $1234,y ; $b9
|
||||||
|
tsx ; $ba
|
||||||
|
ldy $1234,x ; $bc
|
||||||
|
lda $1234,x ; $bd
|
||||||
|
ldx $1234,y ; $be
|
||||||
|
cpy #$12 ; $c0
|
||||||
|
cmp ($12,x) ; $c1
|
||||||
|
cpy $12 ; $c4
|
||||||
|
cmp $12 ; $c5
|
||||||
|
dec $12 ; $c6
|
||||||
|
iny ; $c8
|
||||||
|
cmp #$12 ; $c9
|
||||||
|
dex ; $ca
|
||||||
|
cpy $1234 ; $cc
|
||||||
|
cmp $1234 ; $cd
|
||||||
|
dec $1234 ; $ce
|
||||||
|
bne LABEL ; $d0
|
||||||
|
cmp ($12),y ; $d1
|
||||||
|
cmp $12,x ; $d5
|
||||||
|
dec $12,x ; $d6
|
||||||
|
cld ; $d8
|
||||||
|
cmp $1234,y ; $d9
|
||||||
|
cmp $1234,x ; $dd
|
||||||
|
dec $1234,x ; $de
|
||||||
|
cpx #$12 ; $e0
|
||||||
|
sbc ($12,x) ; $e1
|
||||||
|
cpx $12 ; $e4
|
||||||
|
sbc $12 ; $e5
|
||||||
|
inc $12 ; $e6
|
||||||
|
inx ; $e8
|
||||||
|
sbc #$12 ; $e9
|
||||||
|
nop ; $ea
|
||||||
|
cpx $1234 ; $ec
|
||||||
|
sbc $1234 ; $ed
|
||||||
|
inc $1234 ; $ee
|
||||||
|
beq LABEL1 ; $f0
|
||||||
|
sbc ($12),y ; $f1
|
||||||
|
sbc $12,x ; $f5
|
||||||
|
inc $12,x ; $f6
|
||||||
|
sed ; $f8
|
||||||
|
sbc $1234,y ; $f9
|
||||||
|
sbc $1234,x ; $fd
|
||||||
|
inc $1234,x ; $fe
|
||||||
|
LABEL1:
|
||||||
|
.endscope
|
||||||
|
.endif
|
||||||
|
|
||||||
|
|
||||||
|
.if (.cpu .bitand CPU_ISET_6502X)
|
||||||
|
.scope
|
||||||
|
; all "undocumented" 6502 instructions (aka "unintended opcodes")
|
||||||
|
jam ; $02
|
||||||
|
slo ($12,x) ; $03
|
||||||
|
nop $12 ; $04
|
||||||
|
slo $12 ; $07
|
||||||
|
anc #$12 ; $0b
|
||||||
|
nop $1234 ; $0c
|
||||||
|
slo $1234 ; $0f
|
||||||
|
jam ; $12
|
||||||
|
slo ($12),y ; $13
|
||||||
|
nop $12,x ; $14
|
||||||
|
slo $12,y ; $17
|
||||||
|
nop ; $1a
|
||||||
|
slo $1234,y ; $1b
|
||||||
|
nop $1234,x ; $1c
|
||||||
|
slo $1234,x ; $1f
|
||||||
|
jam ; $22
|
||||||
|
rla ($12,x) ; $23
|
||||||
|
rla $12 ; $27
|
||||||
|
anc #$12 ; $2b
|
||||||
|
rla $1234 ; $2f
|
||||||
|
jam ; $32
|
||||||
|
rla ($12),y ; $33
|
||||||
|
nop $12,x ; $34
|
||||||
|
rla $12,y ; $37
|
||||||
|
nop ; $3a
|
||||||
|
rla $1234,y ; $3b
|
||||||
|
nop $1234,x ; $3c
|
||||||
|
rla $1234,x ; $3f
|
||||||
|
jam ; $42
|
||||||
|
sre ($12,x) ; $43
|
||||||
|
nop $12 ; $44
|
||||||
|
sre $12 ; $47
|
||||||
|
alr #$12 ; $4b
|
||||||
|
sre $1234 ; $4f
|
||||||
|
jam ; $52
|
||||||
|
sre ($12),y ; $53
|
||||||
|
nop $12,x ; $54
|
||||||
|
sre $12,y ; $57
|
||||||
|
nop ; $5a
|
||||||
|
sre $1234,y ; $5b
|
||||||
|
nop $1234,x ; $5c
|
||||||
|
sre $1234,x ; $5f
|
||||||
|
jam ; $62
|
||||||
|
rra ($12,x) ; $63
|
||||||
|
nop $12 ; $64
|
||||||
|
rra $12 ; $67
|
||||||
|
arr #$12 ; $6b
|
||||||
|
rra $1234 ; $6f
|
||||||
|
jam ; $72
|
||||||
|
rra ($12),y ; $73
|
||||||
|
nop $12,x ; $74
|
||||||
|
rra $12,y ; $77
|
||||||
|
nop ; $7a
|
||||||
|
rra $1234,y ; $7b
|
||||||
|
nop $1234,x ; $7c
|
||||||
|
rra $1234,x ; $7f
|
||||||
|
nop #$12 ; $80
|
||||||
|
nop #$12 ; $82
|
||||||
|
sax ($12,x) ; $83
|
||||||
|
sax $12 ; $87
|
||||||
|
nop #$12 ; $89
|
||||||
|
;xaa #$12 ; $8b FIXME (implement in assembler)
|
||||||
|
sax $1234 ; $8f
|
||||||
|
jam ; $92
|
||||||
|
;ahx ($12),y ; $93 FIXME (implement in assembler)
|
||||||
|
sax $12,y ; $97
|
||||||
|
tas $1234,y ; $9b
|
||||||
|
shy $1234,x ; $9c
|
||||||
|
shx $1234,y ; $9e
|
||||||
|
;ahx $1234,y ; $9f FIXME (implement in assembler)
|
||||||
|
lax ($12,x) ; $a3
|
||||||
|
lax $12 ; $a7
|
||||||
|
lax #$12 ; $ab
|
||||||
|
lax $1234 ; $af
|
||||||
|
jam ; $b2
|
||||||
|
lax ($12),y ; $b3
|
||||||
|
lax $12,y ; $b7
|
||||||
|
las $1234,y ; $bb
|
||||||
|
lax $1234,y ; $bf
|
||||||
|
nop #$12 ; $c2
|
||||||
|
dcp ($12,x) ; $c3
|
||||||
|
dcp $12 ; $c7
|
||||||
|
axs #$12 ; $cb
|
||||||
|
dcp $1234 ; $cf
|
||||||
|
jam ; $d2
|
||||||
|
dcp ($12),y ; $d3
|
||||||
|
nop $12,x ; $d4
|
||||||
|
dcp $12,y ; $d7
|
||||||
|
nop ; $da
|
||||||
|
dcp $1234,y ; $db
|
||||||
|
nop $1234,x ; $dc
|
||||||
|
dcp $1234,x ; $df
|
||||||
|
nop #$12 ; $e2
|
||||||
|
isc ($12,x) ; $e3
|
||||||
|
isc $12 ; $e7
|
||||||
|
sbc #$12 ; $eb
|
||||||
|
isc $1234 ; $ef
|
||||||
|
jam ; $f2
|
||||||
|
isc ($12),y ; $f3
|
||||||
|
nop $12,x ; $f4
|
||||||
|
isc $12,y ; $f7
|
||||||
|
nop ; $fa
|
||||||
|
isc $1234,y ; $fb
|
||||||
|
nop $1234,x ; $fc
|
||||||
|
isc $1234,x ; $ff
|
||||||
|
.endscope
|
||||||
|
.endif
|
||||||
|
|
||||||
|
|
||||||
|
.if (.cpu .bitand CPU_ISET_6502DTV)
|
||||||
|
.scope
|
||||||
|
LABEL:
|
||||||
|
; opcodes added over 6502 (these are JAM on 6502)
|
||||||
|
bra LABEL ; $12
|
||||||
|
sac #$12 ; $32
|
||||||
|
sir #$12 ; $42
|
||||||
|
|
||||||
|
; opcodes added over 6502, which work the same as the "illegal" opcodes on 6502
|
||||||
|
nop $12 ; $04
|
||||||
|
nop $1234 ; $0c
|
||||||
|
nop $12,x ; $14
|
||||||
|
nop ; $1a
|
||||||
|
nop $1234,x ; $1c
|
||||||
|
nop $12,x ; $34
|
||||||
|
nop ; $3a
|
||||||
|
nop $1234,x ; $3c
|
||||||
|
nop $12 ; $44
|
||||||
|
nop $12,x ; $54
|
||||||
|
nop ; $5a
|
||||||
|
nop $1234,x ; $5c
|
||||||
|
nop $12 ; $64
|
||||||
|
nop $12,x ; $74
|
||||||
|
nop ; $7a
|
||||||
|
nop $1234,x ; $7c
|
||||||
|
nop #$12 ; $80
|
||||||
|
nop #$12 ; $82
|
||||||
|
nop #$12 ; $89
|
||||||
|
nop #$12 ; $c2
|
||||||
|
nop $12,x ; $d4
|
||||||
|
nop ; $da
|
||||||
|
nop $1234,x ; $dc
|
||||||
|
nop #$12 ; $e2
|
||||||
|
nop $12,x ; $f4
|
||||||
|
nop ; $fa
|
||||||
|
nop $1234,x ; $fc
|
||||||
|
|
||||||
|
anc #$12 ; $0b
|
||||||
|
anc #$12 ; $2b
|
||||||
|
|
||||||
|
rla ($12,x) ; $23
|
||||||
|
rla $12 ; $27
|
||||||
|
rla $1234 ; $2f
|
||||||
|
rla ($12),y ; $33
|
||||||
|
rla $12,y ; $37
|
||||||
|
rla $1234,y ; $3b
|
||||||
|
rla $1234,x ; $3f
|
||||||
|
|
||||||
|
lax ($12,x) ; $a3
|
||||||
|
lax $12 ; $a7
|
||||||
|
lax #$12 ; $ab
|
||||||
|
lax $1234 ; $af
|
||||||
|
lax ($12),y ; $b3
|
||||||
|
lax $12,y ; $b7
|
||||||
|
las $1234,y ; $bb
|
||||||
|
lax $1234,y ; $bf
|
||||||
|
|
||||||
|
alr #$12 ; $4b
|
||||||
|
|
||||||
|
arr #$12 ; $6b
|
||||||
|
|
||||||
|
rra ($12,x) ; $63
|
||||||
|
rra $12 ; $67
|
||||||
|
rra $1234 ; $6f
|
||||||
|
rra ($12),y ; $73
|
||||||
|
rra $12,y ; $77
|
||||||
|
rra $1234,y ; $7b
|
||||||
|
rra $1234,x ; $7f
|
||||||
|
|
||||||
|
shy $1234,x ; $9c
|
||||||
|
shx $1234,y ; $9e
|
||||||
|
|
||||||
|
axs #$12 ; $cb
|
||||||
|
|
||||||
|
sbc #$12 ; $eb
|
||||||
|
|
||||||
|
.endscope
|
||||||
|
.endif
|
||||||
|
|
||||||
|
|
||||||
|
;------------------------------------------------------------------------------
|
||||||
|
; The 65c02 is the CMOS re-design of the 6502. It has a few improvements:
|
||||||
|
;
|
||||||
|
; 65C02 65ce02
|
||||||
|
;
|
||||||
|
; $04 tsb zp
|
||||||
|
; $0c tsb abs16
|
||||||
|
; $12 ora (zp) (-> ora (zp), z)
|
||||||
|
; $14 trb zp
|
||||||
|
; $1a inc
|
||||||
|
; $1c trb abs16
|
||||||
|
; $32 and (zp) (-> and (zp), z)
|
||||||
|
; $34 bit zp, x
|
||||||
|
; $3a dec
|
||||||
|
; $3c bit abs16, x
|
||||||
|
; $52 eor (zp) (-> eor (zp), z)
|
||||||
|
; $5a phy
|
||||||
|
; $64 stz zp (store z, not 0)
|
||||||
|
; $72 adc (zp) (-> adc (zp), z)
|
||||||
|
; $74 stz zp, x (store z, not 0)
|
||||||
|
; $7a ply
|
||||||
|
; $7c jmp (abs16, x)
|
||||||
|
; $80 bra rel8
|
||||||
|
; $89 bit #imm8
|
||||||
|
; $92 sta (zp) (-> sta (zp), z)
|
||||||
|
; $9c stz abs16 (store z, not 0)
|
||||||
|
; $9e stz abs16, x (store z, not 0)
|
||||||
|
; $b2 lda (zp) (-> lda (zp), z)
|
||||||
|
; $d2 cmp (zp) (-> cmp (zp), z)
|
||||||
|
; $da phx
|
||||||
|
; $f2 sbc (zp) (-> sbc (zp), z)
|
||||||
|
; $fa plx
|
||||||
|
|
||||||
|
; FIXME: currently CPU_ISET_65SC02 and CPU_65SC02 really means "65C02"
|
||||||
|
|
||||||
|
; FIXME: should really check for 65C02
|
||||||
|
|
||||||
|
.if (.cpu .bitand CPU_ISET_65SC02)
|
||||||
|
.scope
|
||||||
|
; 65c02 instruction set adds some extra legal instructions to 6502
|
||||||
|
tsb $12 ; $04
|
||||||
|
tsb $1234 ; $0c
|
||||||
|
;ora ($12) ; $12 FIXME: not working with 4510:ora (zp), z
|
||||||
|
trb $12 ; $14
|
||||||
|
inc a ; $1a
|
||||||
|
trb $1234 ; $1c
|
||||||
|
;and ($12) ; $32 FIXME: not working with 4510:and (zp), z
|
||||||
|
bit $12,x ; $34
|
||||||
|
dec a ; $3a
|
||||||
|
bit $1234,x ; $3c
|
||||||
|
;eor ($12) ; $52 FIXME: not working with 4510:eor (zp), z
|
||||||
|
phy ; $5a
|
||||||
|
stz $12 ; $64
|
||||||
|
;adc ($12) ; $72 FIXME: not working with 4510:adc (zp), z
|
||||||
|
stz $12,x ; $74
|
||||||
|
ply ; $7a
|
||||||
|
jmp ($1234) ; $7c
|
||||||
|
LABEL:
|
||||||
|
bra LABEL ; $80
|
||||||
|
bit #$12 ; $89
|
||||||
|
;sta ($12) ; $92 FIXME: not working with 4510:sta (zp), z
|
||||||
|
stz $1234 ; $9c
|
||||||
|
stz $1234,x ; $9e
|
||||||
|
;lda ($12) ; $b2 FIXME: not working with 4510:lda (zp), z
|
||||||
|
;cmp ($12) ; $d2 FIXME: not working with 4510:cmp (zp), z
|
||||||
|
phx ; $da
|
||||||
|
;sbc ($12) ; $f2 FIXME: not working with 4510:sbc (zp), z
|
||||||
|
plx ; $fa
|
||||||
|
.endscope
|
||||||
|
.endif
|
||||||
|
|
||||||
|
; FIXME: hack so these opcodes get fixed anyway, while 4510 is still quirky
|
||||||
|
.if (.cpu .bitand CPU_ISET_65SC02)
|
||||||
|
.if (.not .cpu = CPU_4510)
|
||||||
|
ora ($12) ; $12
|
||||||
|
and ($12) ; $32
|
||||||
|
eor ($12) ; $52
|
||||||
|
adc ($12) ; $72
|
||||||
|
sta ($12) ; $92
|
||||||
|
lda ($12) ; $b2
|
||||||
|
cmp ($12) ; $d2
|
||||||
|
sbc ($12) ; $f2
|
||||||
|
.endif
|
||||||
|
.endif
|
||||||
|
|
||||||
|
; TODO: R65C02
|
||||||
|
; The R65C02 is a superset of the 65C02. It adds bit manipulation instructions:
|
||||||
|
; smbB zp set bit in zp location
|
||||||
|
; rmbB zp reset bit in zp location
|
||||||
|
; bbsB zp, rel8 branch if bit is set in zp location
|
||||||
|
; bbrB zp, rel8 branch if bit is reset in zp location
|
||||||
|
|
||||||
|
; FIXME: currently CPU_ISET_65C02 and CPU_65C02 really means "W65C02"
|
||||||
|
|
||||||
|
; FIXME: should really check for R65C02
|
||||||
|
|
||||||
|
.if (.cpu .bitand CPU_ISET_65C02)
|
||||||
|
|
||||||
|
; R65C02 instruction set adds some extra legal instructions to 65C02
|
||||||
|
rmb0 $12 ; $07
|
||||||
|
bbr0 $12, LABEL3 ; $0f
|
||||||
|
rmb1 $12 ; $17
|
||||||
|
bbr1 $12, LABEL3 ; $1f
|
||||||
|
rmb2 $12 ; $27
|
||||||
|
bbr2 $12, LABEL3 ; $2f
|
||||||
|
rmb3 $12 ; $37
|
||||||
|
bbr3 $12, LABEL3 ; $3f
|
||||||
|
rmb4 $12 ; $47
|
||||||
|
bbr4 $12, LABEL3 ; $4f
|
||||||
|
rmb5 $12 ; $57
|
||||||
|
bbr5 $12, LABEL3 ; $5f
|
||||||
|
rmb6 $12 ; $67
|
||||||
|
bbr6 $12, LABEL3 ; $6f
|
||||||
|
rmb7 $12 ; $77
|
||||||
|
bbr7 $12, LABEL3 ; $7f
|
||||||
|
LABEL3:
|
||||||
|
smb0 $12 ; $87
|
||||||
|
bbs0 $12, LABEL3 ; $8f
|
||||||
|
smb1 $12 ; $97
|
||||||
|
bbs1 $12, LABEL3 ; $9f
|
||||||
|
smb2 $12 ; $a7
|
||||||
|
bbs2 $12, LABEL3 ; $af
|
||||||
|
smb3 $12 ; $b7
|
||||||
|
bbs3 $12, LABEL3 ; $bf
|
||||||
|
smb4 $12 ; $c7
|
||||||
|
bbs4 $12, LABEL3 ; $cf
|
||||||
|
smb5 $12 ; $d7
|
||||||
|
bbs5 $12, LABEL3 ; $df
|
||||||
|
smb6 $12 ; $e7
|
||||||
|
bbs6 $12, LABEL3 ; $ef
|
||||||
|
smb7 $12 ; $f7
|
||||||
|
bbs7 $12, LABEL3 ; $ff
|
||||||
|
|
||||||
|
.endif
|
||||||
|
|
||||||
|
|
||||||
|
; TODO: W65C02
|
||||||
|
; The W65C02 is a superset of the R65C02. It only adds two instructions:
|
||||||
|
;
|
||||||
|
; $cb wai wait for interrupt
|
||||||
|
; $db stp wait for reset
|
||||||
|
|
||||||
|
; FIXME: currently CPU_ISET_65C02 and CPU_65C02 really means "W65C02"
|
||||||
|
|
||||||
|
; FIXME: should really check for W65C02
|
||||||
|
|
||||||
|
.if (.cpu = CPU_65C02)
|
||||||
|
wai ; $cb
|
||||||
|
stp ; $db
|
||||||
|
.endif
|
||||||
|
|
||||||
|
|
||||||
|
; TODO: 65CE02
|
||||||
|
; The 65CE02 is another superset of the R65C02. It has several improvements:
|
||||||
|
;
|
||||||
|
; $02 cle clear stack extend disable
|
||||||
|
; $03 see set stack extend disable
|
||||||
|
; $0b tsy transfer stack_ptr_high to Y
|
||||||
|
; $12 ora (zp), z
|
||||||
|
; $13 lbpl rel16
|
||||||
|
; $1b inz increment Z
|
||||||
|
; $22 jsr (abs16)
|
||||||
|
; $23 jsr (abs16, x)
|
||||||
|
; $2b tys transfer Y to stack_ptr_high
|
||||||
|
; $32 and (zp), z
|
||||||
|
; $33 lbmi rel16
|
||||||
|
; $3b dez decrement Z
|
||||||
|
; $42 neg negate A
|
||||||
|
; $43 asr
|
||||||
|
; $44 asr zp
|
||||||
|
; $4b taz transfer A to Z
|
||||||
|
; $52 eor (zp), z
|
||||||
|
; $53 lbvc rel16
|
||||||
|
; $54 asr zp, x
|
||||||
|
; $5b tab
|
||||||
|
; $5c aug "4-byte NOP reserved for future expansion"
|
||||||
|
; $62 rtn #imm8
|
||||||
|
; $63 lbsr rel16 relative jsr, "branch to subroutine"
|
||||||
|
; $64 stz zp store Z
|
||||||
|
; $6b tza transfer Z to A
|
||||||
|
; $72 adc (zp), z
|
||||||
|
; $73 lbvs rel16
|
||||||
|
; $74 stz zp, x store Z
|
||||||
|
; $7b tba
|
||||||
|
; $82 sta (off8, s), y
|
||||||
|
; $83 lbra rel16 relative jmp
|
||||||
|
; $8b sty abs16, x
|
||||||
|
; $92 sta (zp), z
|
||||||
|
; $93 lbcc rel16
|
||||||
|
; $9b stx abs16, y
|
||||||
|
; $9c stz abs16 store Z
|
||||||
|
; $9e stz abs16, x store Z
|
||||||
|
; $a3 ldz #imm8
|
||||||
|
; $ab ldz abs16
|
||||||
|
; $b2 lda (zp), z
|
||||||
|
; $b3 lbcs rel16
|
||||||
|
; $bb ldz abs16, x
|
||||||
|
; $c2 cpz #imm8
|
||||||
|
; $c3 dew zp
|
||||||
|
; $cb asw abs16
|
||||||
|
; $d2 cmp (zp), z
|
||||||
|
; $d3 lbne rel16
|
||||||
|
; $d4 cpz zp
|
||||||
|
; $db phz push Z
|
||||||
|
; $dc cpz abs16
|
||||||
|
; $e2 lda (off8, s), y
|
||||||
|
; $e3 inw zp
|
||||||
|
; $eb row abs16
|
||||||
|
; $f2 sbc (zp), z
|
||||||
|
; $f3 lbeq rel16
|
||||||
|
; $f4 phw #imm16
|
||||||
|
; $fb plz pull Z
|
||||||
|
; $fc phw abs16
|
||||||
|
|
||||||
|
; FIXME: should really check for 65CE02
|
||||||
|
|
||||||
|
.if (.cpu .bitand CPU_ISET_4510)
|
||||||
|
.scope
|
||||||
|
; 65CE02 adds the following:
|
||||||
|
cle ; $02
|
||||||
|
see ; $03
|
||||||
|
tsy ; $0b
|
||||||
|
ora ($12), z ; $12 (ora (zp) on 65C02)
|
||||||
|
lbpl $1234 ; $13
|
||||||
|
inz ; $1b
|
||||||
|
jsr ($1234) ; $22
|
||||||
|
jsr ($1234,x) ; $23
|
||||||
|
tys ; $2b
|
||||||
|
and ($12), z ; $32 (and (zp) on 65C02)
|
||||||
|
lbmi $1234 ; $33
|
||||||
|
dez ; $3b
|
||||||
|
neg ; $42
|
||||||
|
asr a ; $43
|
||||||
|
asr $12 ; $44
|
||||||
|
taz ; $4b
|
||||||
|
lbvc $1234 ; $53
|
||||||
|
asr $12,x ; $54
|
||||||
|
tab ; $5b
|
||||||
|
;aug ; $5c FIXME: implement in assembler
|
||||||
|
rtn #$12 ; $62
|
||||||
|
bsr $1234 ; $63
|
||||||
|
stz $12 ; $64 (stores 0 on 65C02)
|
||||||
|
tza ; $6b
|
||||||
|
adc ($12), z ; $72 (adc (zp) on 65C02)
|
||||||
|
lbvs $1234 ; $73
|
||||||
|
stz $12, x ; $74 (stores 0 on 65C02)
|
||||||
|
tba ; $7b
|
||||||
|
sta ($12,s),y ; $82
|
||||||
|
lbra $1234 ; $83
|
||||||
|
sty $1234,x ; $8b
|
||||||
|
lbcc $1234 ; $93
|
||||||
|
sta ($12), z ; $92 (sta (zp) on 65C02)
|
||||||
|
stx $1234,y ; $9b
|
||||||
|
stz $1234 ; $9c (stores 0 on 65C02)
|
||||||
|
ldz #$12 ; $a3
|
||||||
|
ldz $1234 ; $ab
|
||||||
|
lda ($12), z ; $b2 (lda (zp) on 65C02)
|
||||||
|
lbcs $1234 ; $b3
|
||||||
|
ldz $1234,x ; $bb
|
||||||
|
cpz #$12 ; $c2
|
||||||
|
dew $12 ; $c3
|
||||||
|
cmp ($12), z ; $d2 (cmp ($12) on 65C02)
|
||||||
|
lbne $1234 ; $d3
|
||||||
|
cpz $12 ; $d4
|
||||||
|
cpz $1234 ; $dc
|
||||||
|
lda ($12,s),y ; $e2
|
||||||
|
inw $12 ; $e3
|
||||||
|
row $1234 ; $eb
|
||||||
|
sbc ($12), z ; $f2 (sbc (zp) on 65C02)
|
||||||
|
lbeq $1234 ; $f3
|
||||||
|
phw #$1234 ; $f4
|
||||||
|
plz ; $fb
|
||||||
|
phw $1234 ; $fc
|
||||||
|
|
||||||
|
.endscope
|
||||||
|
.endif
|
||||||
|
|
||||||
|
|
||||||
|
; The 4502 is a superset of the 65CE02. Opcode 5c (originally a "4-byte NOP
|
||||||
|
; reserved for future expansion") has been changed to the "map" instruction,
|
||||||
|
; now using implied addressing.
|
||||||
|
;
|
||||||
|
; $5c map
|
||||||
|
; $cb asw abs
|
||||||
|
; $db phz
|
||||||
|
|
||||||
|
.if (.cpu .bitand CPU_ISET_4510)
|
||||||
|
.scope
|
||||||
|
|
||||||
|
; added to 65CE02
|
||||||
|
map ; $5c ("4-byte NOP reserved for future expansion" on 65CE02)
|
||||||
|
asw $1234 ; $cb (wai on W65C02)
|
||||||
|
phz ; $db (stp on W65C02)
|
||||||
|
|
||||||
|
.endscope
|
||||||
|
.endif
|
||||||
|
|
||||||
|
|
||||||
|
; TODO: MEGA65
|
||||||
|
; The m65 instruction set extends the 4502 instruction set using prefix bytes.
|
||||||
|
; Therefore, the "normal" opcode table is the same as for the 4502 cpu
|
||||||
|
|
||||||
|
|
||||||
|
; The HUC6280 is a superset of the R65C02. It adds some other instructions:
|
||||||
|
|
||||||
|
.if (.cpu .bitand CPU_ISET_HUC6280)
|
||||||
|
.scope
|
||||||
|
|
||||||
|
; added to R65C02
|
||||||
|
sxy ; $02
|
||||||
|
st0 #$12 ; $03
|
||||||
|
st1 #$12 ; $13
|
||||||
|
sax ; $22
|
||||||
|
st2 #$12 ; $23
|
||||||
|
say ; $42
|
||||||
|
tma #$10 ; $43
|
||||||
|
bsr LABEL ; $44
|
||||||
|
tam #$12 ; $53
|
||||||
|
csl ; $54
|
||||||
|
cla ; $62
|
||||||
|
tii $1234, $5678, $9abc ; $73
|
||||||
|
LABEL:
|
||||||
|
clx ; $82
|
||||||
|
tst #$12, $34 ; $83
|
||||||
|
clx ; $82
|
||||||
|
tst #$12, $34 ; $83
|
||||||
|
tst #$12, $3456 ; $93
|
||||||
|
tst #$12, $34, x ; $a3
|
||||||
|
tst #$12, $3456, x ; $b3
|
||||||
|
cly ; $c2
|
||||||
|
tdd $1234, $5678, $9abc ; $c3
|
||||||
|
tin $1234, $5678, $9abc ; $d3
|
||||||
|
csh ; $d4
|
||||||
|
tia $1234, $5678, $9abc ; $e3
|
||||||
|
tai $1234, $5678, $9abc ; $f3
|
||||||
|
set ; $f4
|
||||||
|
|
||||||
|
.endscope
|
||||||
|
.endif
|
||||||
|
|
||||||
|
|
||||||
|
.if (.cpu .bitand CPU_ISET_M740)
|
||||||
|
.scope
|
||||||
|
; Mitsubishi M740 - adds new instructions to 65SC02 (but also removes some)
|
||||||
|
|
||||||
|
jsr ($12) ; $02
|
||||||
|
bbs0 a, LABEL ; $03
|
||||||
|
bbs0 $12, LABEL ; $07
|
||||||
|
seb0 a ; $0b
|
||||||
|
seb0 $12 ; $0f
|
||||||
|
bbc0 a, LABEL ; $13
|
||||||
|
bbc0 $12, LABEL ; $17
|
||||||
|
clb0 a ; $1b
|
||||||
|
clb0 $12 ; $1f
|
||||||
|
jsr $ff12 ; $22
|
||||||
|
bbs1 a, LABEL ; $23
|
||||||
|
bbs1 $12, LABEL ; $27
|
||||||
|
seb1 a ; $2b
|
||||||
|
seb1 $12 ; $2f
|
||||||
|
bbc1 a, LABEL ; $33
|
||||||
|
bbc1 $12, LABEL ; $37
|
||||||
|
clb1 a ; $3b
|
||||||
|
clb1 $12 ; $3f
|
||||||
|
stp ; $42
|
||||||
|
bbs2 a, LABEL ; $43
|
||||||
|
com $12 ; $44
|
||||||
|
bbs2 $12, LABEL ; $47
|
||||||
|
seb2 a ; $4b
|
||||||
|
seb2 $12 ; $4f
|
||||||
|
bbc2 a, LABEL ; $53
|
||||||
|
bbc2 $12, LABEL ; $57
|
||||||
|
clb2 a ; $5b
|
||||||
|
clb2 $12 ; $5f
|
||||||
|
bbs3 a, LABEL ; $63
|
||||||
|
bbs3 $12, LABEL ; $67
|
||||||
|
seb3 a ; $6b
|
||||||
|
seb3 $12 ; $6f
|
||||||
|
bbc3 a, LABEL ; $73
|
||||||
|
bbc3 $12, LABEL ; $77
|
||||||
|
clb3 a ; $7b
|
||||||
|
clb3 $12 ; $7f
|
||||||
|
LABEL:
|
||||||
|
rrf $12 ; $82
|
||||||
|
bbs4 a, LABEL ; $83
|
||||||
|
bbs4 $12, LABEL ; $87
|
||||||
|
seb4 a ; $8b
|
||||||
|
seb4 $12 ; $8f
|
||||||
|
bbc4 a, LABEL ; $93
|
||||||
|
bbc4 $12, LABEL ; $97
|
||||||
|
clb4 a ; $9b
|
||||||
|
clb4 $12 ; $9f
|
||||||
|
bbs5 a, LABEL ; $a3
|
||||||
|
bbs5 $12, LABEL ; $a7
|
||||||
|
seb5 a ; $ab
|
||||||
|
seb5 $12 ; $af
|
||||||
|
bbc5 a, LABEL ; $b3
|
||||||
|
bbc5 $12, LABEL ; $b7
|
||||||
|
clb5 a ; $bb
|
||||||
|
clb5 $12 ; $bf
|
||||||
|
slw ; $c2
|
||||||
|
bbs6 a, LABEL ; $c3
|
||||||
|
bbs6 $12, LABEL ; $c7
|
||||||
|
seb6 a ; $cb
|
||||||
|
seb6 $12 ; $cf
|
||||||
|
bbc6 a, LABEL ; $d3
|
||||||
|
bbc6 $12, LABEL ; $d7
|
||||||
|
clb6 a ; $db
|
||||||
|
clb6 $12 ; $df
|
||||||
|
fst ; $e2
|
||||||
|
bbs7 a, LABEL ; $e3
|
||||||
|
bbs7 $12, LABEL ; $e7
|
||||||
|
seb7 a ; $eb
|
||||||
|
seb7 $12 ; $ef
|
||||||
|
bbc7 a, LABEL ; $f3
|
||||||
|
bbc7 $12, LABEL ; $f7
|
||||||
|
clb7 a ; $fb
|
||||||
|
clb7 $12 ; $ff
|
||||||
|
|
||||||
|
; replaced from 65SC02
|
||||||
|
clt ; $12
|
||||||
|
set ; $32
|
||||||
|
ldm $12, #$34 ; $3c
|
||||||
|
tst $12 ; $64
|
||||||
|
|
||||||
|
; removed from 65SC02 (replaced by new)
|
||||||
|
; ora ($12) ; $12
|
||||||
|
; and ($12) ; $32
|
||||||
|
; bit $1234,x ; $3c
|
||||||
|
; stz $12 ; $64
|
||||||
|
|
||||||
|
; removed from 65SC02
|
||||||
|
; tsb $12 ; $04
|
||||||
|
; tsb $1234 ; $0c
|
||||||
|
; trb $12 ; $14
|
||||||
|
; trb $1234 ; $1c
|
||||||
|
; bit $12,y ; $34
|
||||||
|
; eor ($12) ; $52
|
||||||
|
; phy ; $5a
|
||||||
|
; adc ($12) ; $72
|
||||||
|
; stz $12,y ; $74
|
||||||
|
; ply ; $7a
|
||||||
|
; jmp ($1234) ; $7c
|
||||||
|
; bit #$12 ; $89
|
||||||
|
; sta ($12) ; $92
|
||||||
|
; stz $1234 ; $9c
|
||||||
|
; stz $1234,x ; $9e
|
||||||
|
; cmp ($12) ; $d2
|
||||||
|
; phx ; $da
|
||||||
|
; sbc ($12) ; $f2
|
||||||
|
; plx ; $fa
|
||||||
|
|
||||||
|
.endscope
|
||||||
|
.endif
|
||||||
|
|
||||||
@@ -84,6 +84,12 @@
|
|||||||
.byte 0,"CPU_ISET_M740"
|
.byte 0,"CPU_ISET_M740"
|
||||||
.endif
|
.endif
|
||||||
|
|
||||||
|
; FIXME: something with 65816 is quirky
|
||||||
|
.if (.not .cpu .bitand CPU_ISET_65816)
|
||||||
|
.include "allinst.inc"
|
||||||
|
.endif
|
||||||
|
|
||||||
|
|
||||||
; step 3: switch through all supported cpus to verify the pseudo-op is there
|
; step 3: switch through all supported cpus to verify the pseudo-op is there
|
||||||
|
|
||||||
.p02
|
.p02
|
||||||
|
|||||||
Reference in New Issue
Block a user