2018-08-20 00:24:54 +00:00
|
|
|
#pragma once
|
|
|
|
|
|
|
|
/**
|
|
|
|
* @copyright 2018 Sean Kasun
|
|
|
|
* Defines the 65816 opcodes, their addressing modes, and sizes
|
|
|
|
*/
|
|
|
|
|
|
|
|
/**
|
|
|
|
Addressing modes:
|
|
|
|
imp implied
|
|
|
|
imm #$const (l)
|
|
|
|
immm #$const (l | h) if m16
|
|
|
|
immx #$const (l | h) if x16
|
|
|
|
imms #$const (l | h)
|
|
|
|
abs $addr (addrl | addrh)
|
|
|
|
abl $addr (addrl | addrh | bank)
|
|
|
|
abx $addr,x (addrl | addrh)
|
|
|
|
aby $addr,y (addrl | addrh)
|
|
|
|
ablx $addr,x (addrl | addrh | bank)
|
|
|
|
aix ($addr,x) (addrl | addrh)
|
|
|
|
zp $zp (offset)
|
|
|
|
zpx $zp,x (offset)
|
|
|
|
zpy $zp,y (offset)
|
|
|
|
zps $zp,s (offset)
|
|
|
|
ind ($addr) (addrl | addrh)
|
|
|
|
inz ($zp) (offset)
|
|
|
|
inl [$zp] (offset)
|
|
|
|
inx ($zp,x) (offset)
|
|
|
|
iny ($zp),y (offset)
|
|
|
|
inly [$zp],y (offset)
|
|
|
|
ins ($zp,s),y (offset)
|
|
|
|
rel $r (signed byte + pc)
|
|
|
|
rell $r (offsetl | offseth) + pc
|
|
|
|
bank $sb,$db (dstbnk | srcbnk)
|
|
|
|
db $op
|
|
|
|
dw $op
|
|
|
|
dd $op
|
|
|
|
*/
|
|
|
|
|
|
|
|
typedef enum {
|
|
|
|
IMP = 0,
|
|
|
|
IMM,
|
|
|
|
IMMM,
|
|
|
|
IMMX,
|
|
|
|
IMMS,
|
|
|
|
ABS,
|
|
|
|
ABL,
|
|
|
|
ABX,
|
|
|
|
ABY,
|
|
|
|
ABLX,
|
|
|
|
AIX,
|
|
|
|
ZP,
|
|
|
|
ZPX,
|
|
|
|
ZPY,
|
|
|
|
ZPS,
|
|
|
|
IND,
|
|
|
|
INZ,
|
|
|
|
INL,
|
|
|
|
INX,
|
|
|
|
INY,
|
|
|
|
INLY,
|
|
|
|
INS,
|
|
|
|
REL,
|
|
|
|
RELL,
|
|
|
|
BANK,
|
|
|
|
DB,
|
|
|
|
DW,
|
|
|
|
DD
|
|
|
|
} Address;
|
|
|
|
|
|
|
|
typedef enum {
|
|
|
|
BREAK = 0,
|
|
|
|
NORMAL = 1,
|
|
|
|
BRANCH = 2,
|
|
|
|
CALL = 3,
|
|
|
|
RETURN = 4,
|
|
|
|
JUMP = 5
|
|
|
|
} OpType;
|
|
|
|
|
|
|
|
typedef struct {
|
|
|
|
const char *inst;
|
|
|
|
Address address;
|
|
|
|
OpType type;
|
|
|
|
} Opcode;
|
|
|
|
|
|
|
|
static Opcode opcodes[] = {
|
|
|
|
{"brk", IMP, BREAK}, // 00
|
|
|
|
{"ora", INX, NORMAL}, // 01
|
|
|
|
{"cop", IMP, NORMAL}, // 02
|
|
|
|
{"ora", ZPS, NORMAL}, // 03
|
|
|
|
{"tsb", ZP, NORMAL}, // 04
|
|
|
|
{"ora", ZP, NORMAL}, // 05
|
|
|
|
{"asl", ZP, NORMAL}, // 06
|
|
|
|
{"ora", INL, NORMAL}, // 07
|
|
|
|
{"php", IMP, NORMAL}, // 08
|
|
|
|
{"ora", IMMM, NORMAL}, // 09
|
|
|
|
{"asl", IMP, NORMAL}, // 0a
|
|
|
|
{"phd", IMP, NORMAL}, // 0b
|
|
|
|
{"tsb", ABS, NORMAL}, // 0c
|
|
|
|
{"ora", ABS, NORMAL}, // 0d
|
|
|
|
{"asl", ABS, NORMAL}, // 0e
|
|
|
|
{"ora", ABL, NORMAL}, // 0f
|
|
|
|
{"bpl", REL, BRANCH}, // 10
|
|
|
|
{"ora", INY, NORMAL}, // 11
|
|
|
|
{"ora", INZ, NORMAL}, // 12
|
|
|
|
{"ora", INS, NORMAL}, // 13
|
|
|
|
{"trb", ZP, NORMAL}, // 14
|
|
|
|
{"ora", ZPX, NORMAL}, // 15
|
|
|
|
{"asl", ZPX, NORMAL}, // 16
|
|
|
|
{"ora", INLY, NORMAL}, // 17
|
|
|
|
{"clc", IMP, NORMAL}, // 18
|
|
|
|
{"ora", ABY, NORMAL}, // 19
|
|
|
|
{"inc", IMP, NORMAL}, // 1a
|
|
|
|
{"tcs", IMP, NORMAL}, // 1b
|
|
|
|
{"trb", ABS, NORMAL}, // 1c
|
|
|
|
{"ora", ABX, NORMAL}, // 1d
|
|
|
|
{"asl", ABX, NORMAL}, // 1e
|
|
|
|
{"ora", ABLX, NORMAL}, // 1f
|
|
|
|
{"jsr", ABS, CALL}, // 20
|
|
|
|
{"and", INX, NORMAL}, // 21
|
|
|
|
{"jsl", ABL, CALL}, // 22
|
|
|
|
{"and", ZPS, NORMAL}, // 23
|
|
|
|
{"bit", ZP, NORMAL}, // 24
|
|
|
|
{"and", ZP, NORMAL}, // 25
|
|
|
|
{"rol", ZP, NORMAL}, // 26
|
|
|
|
{"and", INL, NORMAL}, // 27
|
|
|
|
{"plp", IMP, NORMAL}, // 28
|
|
|
|
{"and", IMMM, NORMAL}, // 29
|
|
|
|
{"rol", IMP, NORMAL}, // 2a
|
|
|
|
{"pld", IMP, NORMAL}, // 2b
|
|
|
|
{"bit", ABS, NORMAL}, // 2c
|
|
|
|
{"and", ABS, NORMAL}, // 2d
|
|
|
|
{"rol", ABS, NORMAL}, // 2e
|
|
|
|
{"and", ABL, NORMAL}, // 2f
|
|
|
|
{"bmi", REL, BRANCH}, // 30
|
|
|
|
{"and", INY, NORMAL}, // 31
|
|
|
|
{"and", INZ, NORMAL}, // 32
|
|
|
|
{"and", INS, NORMAL}, // 33
|
|
|
|
{"bit", ZPX, NORMAL}, // 34
|
|
|
|
{"and", ZPX, NORMAL}, // 35
|
|
|
|
{"rol", ZPX, NORMAL}, // 36
|
|
|
|
{"and", INLY, NORMAL}, // 37
|
|
|
|
{"sec", IMP, NORMAL}, // 38
|
|
|
|
{"and", ABY, NORMAL}, // 39
|
|
|
|
{"dec", IMP, NORMAL}, // 3a
|
|
|
|
{"tsc", IMP, NORMAL}, // 3b
|
|
|
|
{"bit", ABX, NORMAL}, // 3c
|
|
|
|
{"and", ABX, NORMAL}, // 3d
|
|
|
|
{"rol", ABX, NORMAL}, // 3e
|
|
|
|
{"and", ABLX, NORMAL}, // 3f
|
|
|
|
{"rti", IMP, RETURN}, // 40
|
|
|
|
{"eor", INX, NORMAL}, // 41
|
|
|
|
{"db", DB, BREAK}, // 42
|
|
|
|
{"eor", ZPS, NORMAL}, // 43
|
|
|
|
{"mvp", BANK, NORMAL}, // 44
|
|
|
|
{"eor", ZP, NORMAL}, // 45
|
|
|
|
{"lsr", ZP, NORMAL}, // 46
|
|
|
|
{"eor", INL, NORMAL}, // 47
|
|
|
|
{"pha", IMP, NORMAL}, // 48
|
|
|
|
{"eor", IMMM, NORMAL}, // 49
|
|
|
|
{"lsr", IMP, NORMAL}, // 4a
|
|
|
|
{"phk", IMP, NORMAL}, // 4b
|
|
|
|
{"jmp", ABS, JUMP}, // 4c
|
|
|
|
{"eor", ABS, NORMAL}, // 4d
|
|
|
|
{"lsr", ABS, NORMAL}, // 4e
|
|
|
|
{"eor", ABL, NORMAL}, // 4f
|
|
|
|
{"bvc", REL, BRANCH}, // 50
|
|
|
|
{"eor", INY, NORMAL}, // 51
|
|
|
|
{"eor", INZ, NORMAL}, // 52
|
|
|
|
{"eor", INS, NORMAL}, // 53
|
|
|
|
{"mvn", BANK, NORMAL}, // 54
|
|
|
|
{"eor", ZPX, NORMAL}, // 55
|
|
|
|
{"lsr", ZPX, NORMAL}, // 56
|
|
|
|
{"eor", INLY, NORMAL}, // 57
|
|
|
|
{"cli", IMP, NORMAL}, // 58
|
|
|
|
{"eor", ABY, NORMAL}, // 59
|
|
|
|
{"phy", IMP, NORMAL}, // 5a
|
|
|
|
{"tcd", IMP, NORMAL}, // 5b
|
|
|
|
{"jmp", ABL, JUMP}, // 5c
|
|
|
|
{"eor", ABX, NORMAL}, // 5d
|
|
|
|
{"lsr", ABX, NORMAL}, // 5e
|
|
|
|
{"eor", ABLX, NORMAL}, // 5f
|
|
|
|
{"rts", IMP, RETURN}, // 60
|
|
|
|
{"adc", INX, NORMAL}, // 61
|
2018-08-20 22:57:52 +00:00
|
|
|
{"per", REL, NORMAL}, // 62
|
2018-08-20 00:24:54 +00:00
|
|
|
{"adc", ZPS, NORMAL}, // 63
|
|
|
|
{"stz", ZP, NORMAL}, // 64
|
|
|
|
{"adc", ZP, NORMAL}, // 65
|
|
|
|
{"ror", ZP, NORMAL}, // 66
|
|
|
|
{"adc", INL, NORMAL}, // 67
|
|
|
|
{"pla", IMP, NORMAL}, // 68
|
|
|
|
{"adc", IMMM, NORMAL}, // 69
|
|
|
|
{"ror", IMP, NORMAL}, // 6a
|
|
|
|
{"rtl", IMP, RETURN}, // 6b
|
|
|
|
{"jmp", IND, JUMP}, // 6c
|
|
|
|
{"adc", ABS, NORMAL}, // 6d
|
|
|
|
{"ror", ABS, NORMAL}, // 6e
|
|
|
|
{"adc", ABL, NORMAL}, // 6f
|
|
|
|
{"bvs", REL, BRANCH}, // 70
|
|
|
|
{"adc", INY, NORMAL}, // 71
|
|
|
|
{"adc", INZ, NORMAL}, // 72
|
|
|
|
{"adc", INS, NORMAL}, // 73
|
|
|
|
{"stz", ZPX, NORMAL}, // 74
|
|
|
|
{"adc", ZPX, NORMAL}, // 75
|
|
|
|
{"ror", ZPX, NORMAL}, // 76
|
|
|
|
{"adc", INLY, NORMAL}, // 77
|
|
|
|
{"sei", IMP, NORMAL}, // 78
|
|
|
|
{"adc", ABY, NORMAL}, // 79
|
|
|
|
{"ply", IMP, NORMAL}, // 7a
|
|
|
|
{"tdc", IMP, NORMAL}, // 7b
|
|
|
|
{"jmp", AIX, JUMP}, // 7c
|
|
|
|
{"adc", ABX, NORMAL}, // 7d
|
|
|
|
{"ror", ABX, NORMAL}, // 7e
|
|
|
|
{"adc", ABLX, NORMAL}, // 7f
|
|
|
|
{"bra", REL, JUMP}, // 80
|
|
|
|
{"sta", INX, NORMAL}, // 81
|
|
|
|
{"brl", RELL, JUMP}, // 82
|
|
|
|
{"sta", ZPS, NORMAL}, // 83
|
|
|
|
{"sty", ZP, NORMAL}, // 84
|
|
|
|
{"sta", ZP, NORMAL}, // 85
|
|
|
|
{"stx", ZP, NORMAL}, // 86
|
|
|
|
{"sta", INL, NORMAL}, // 87
|
|
|
|
{"dey", IMP, NORMAL}, // 88
|
|
|
|
{"bit", IMMM, NORMAL}, // 89
|
|
|
|
{"txa", IMP, NORMAL}, // 8a
|
|
|
|
{"phb", IMP, NORMAL}, // 8b
|
|
|
|
{"sty", ABS, NORMAL}, // 8c
|
|
|
|
{"sta", ABS, NORMAL}, // 8d
|
|
|
|
{"stx", ABS, NORMAL}, // 8e
|
|
|
|
{"sta", ABL, NORMAL}, // 8f
|
|
|
|
{"bcc", REL, BRANCH}, // 90
|
|
|
|
{"sta", INY, NORMAL}, // 91
|
|
|
|
{"sta", INZ, NORMAL}, // 92
|
|
|
|
{"sta", INS, NORMAL}, // 93
|
|
|
|
{"sty", ZPX, NORMAL}, // 94
|
|
|
|
{"sta", ZPX, NORMAL}, // 95
|
|
|
|
{"stx", ZPY, NORMAL}, // 96
|
|
|
|
{"sta", INLY, NORMAL}, // 97
|
|
|
|
{"tya", IMP, NORMAL}, // 98
|
|
|
|
{"sta", ABY, NORMAL}, // 99
|
|
|
|
{"txs", IMP, NORMAL}, // 9a
|
|
|
|
{"txy", IMP, NORMAL}, // 9b
|
|
|
|
{"stz", ABS, NORMAL}, // 9c
|
|
|
|
{"sta", ABX, NORMAL}, // 9d
|
|
|
|
{"stz", ABX, NORMAL}, // 9e
|
|
|
|
{"sta", ABLX, NORMAL}, // 9f
|
|
|
|
{"ldy", IMMX, NORMAL}, // a0
|
|
|
|
{"lda", INX, NORMAL}, // a1
|
|
|
|
{"ldx", IMMX, NORMAL}, // a2
|
|
|
|
{"lda", ZPS, NORMAL}, // a3
|
|
|
|
{"ldy", ZP, NORMAL}, // a4
|
|
|
|
{"lda", ZP, NORMAL}, // a5
|
|
|
|
{"ldx", ZP, NORMAL}, // a6
|
|
|
|
{"lda", INL, NORMAL}, // a7
|
|
|
|
{"tay", IMP, NORMAL}, // a8
|
|
|
|
{"lda", IMMM, NORMAL}, // a9
|
|
|
|
{"tax", IMP, NORMAL}, // aa
|
|
|
|
{"plb", IMP, NORMAL}, // ab
|
|
|
|
{"ldy", ABS, NORMAL}, // ac
|
|
|
|
{"lda", ABS, NORMAL}, // ad
|
|
|
|
{"ldx", ABS, NORMAL}, // ae
|
|
|
|
{"lda", ABL, NORMAL}, // af
|
|
|
|
{"bcs", REL, BRANCH}, // b0
|
|
|
|
{"lda", INY, NORMAL}, // b1
|
|
|
|
{"lda", INZ, NORMAL}, // b2
|
|
|
|
{"lda", INS, NORMAL}, // b3
|
|
|
|
{"ldy", ZPX, NORMAL}, // b4
|
|
|
|
{"lda", ZPX, NORMAL}, // b5
|
|
|
|
{"ldx", ZPY, NORMAL}, // b6
|
|
|
|
{"lda", INLY, NORMAL}, // b7
|
|
|
|
{"clv", IMP, NORMAL}, // b8
|
|
|
|
{"lda", ABY, NORMAL}, // b9
|
|
|
|
{"tsx", IMP, NORMAL}, // ba
|
|
|
|
{"tyx", IMP, NORMAL}, // bb
|
|
|
|
{"ldy", ABX, NORMAL}, // bc
|
|
|
|
{"lda", ABX, NORMAL}, // bd
|
|
|
|
{"ldx", ABY, NORMAL}, // be
|
|
|
|
{"lda", ABLX, NORMAL}, // bf
|
|
|
|
{"cpy", IMMX, NORMAL}, // c0
|
|
|
|
{"cmp", INX, NORMAL}, // c1
|
|
|
|
{"rep", IMM, NORMAL}, // c2
|
|
|
|
{"cmp", ZPS, NORMAL}, // c3
|
|
|
|
{"cpy", ZP, NORMAL}, // c4
|
|
|
|
{"cmp", ZP, NORMAL}, // c5
|
|
|
|
{"dec", ZP, NORMAL}, // c6
|
|
|
|
{"cmp", INL, NORMAL}, // c7
|
|
|
|
{"iny", IMP, NORMAL}, // c8
|
|
|
|
{"cmp", IMMM, NORMAL}, // c9
|
|
|
|
{"dex", IMP, NORMAL}, // ca
|
|
|
|
{"wai", IMP, NORMAL}, // cb
|
|
|
|
{"cpy", ABS, NORMAL}, // cc
|
|
|
|
{"cmp", ABS, NORMAL}, // cd
|
|
|
|
{"dec", ABS, NORMAL}, // ce
|
|
|
|
{"cmp", ABL, NORMAL}, // cf
|
|
|
|
{"bne", REL, BRANCH}, // d0
|
|
|
|
{"cmp", INY, NORMAL}, // d1
|
|
|
|
{"cmp", INZ, NORMAL}, // d2
|
|
|
|
{"cmp", INS, NORMAL}, // d3
|
|
|
|
{"pei", ZP, NORMAL}, // d4
|
|
|
|
{"cmp", ZPX, NORMAL}, // d5
|
|
|
|
{"dec", ZPX, NORMAL}, // d6
|
|
|
|
{"cmp", INLY, NORMAL}, // d7
|
|
|
|
{"cld", IMP, NORMAL}, // d8
|
|
|
|
{"cmp", ABY, NORMAL}, // d9
|
|
|
|
{"phx", IMP, NORMAL}, // da
|
|
|
|
{"stp", IMP, BREAK}, // db
|
|
|
|
{"jmp", IND, JUMP}, // dc
|
|
|
|
{"cmp", ABX, NORMAL}, // dd
|
|
|
|
{"dec", ABX, NORMAL}, // de
|
|
|
|
{"cmp", ABLX, NORMAL}, // df
|
|
|
|
{"cpx", IMMX, NORMAL}, // e0
|
|
|
|
{"sbc", INX, NORMAL}, // e1
|
|
|
|
{"sep", IMM, NORMAL}, // e2
|
|
|
|
{"sbc", ZPS, NORMAL}, // e3
|
|
|
|
{"cpx", ZP, NORMAL}, // e4
|
|
|
|
{"sbc", ZP, NORMAL}, // e5
|
|
|
|
{"inc", ZP, NORMAL}, // e6
|
|
|
|
{"sbc", INL, NORMAL}, // e7
|
|
|
|
{"inx", IMP, NORMAL}, // e8
|
|
|
|
{"sbc", IMMM, NORMAL}, // e9
|
|
|
|
{"nop", IMP, NORMAL}, // ea
|
|
|
|
{"xba", IMP, NORMAL}, // eb
|
|
|
|
{"cpx", ABS, NORMAL}, // ec
|
|
|
|
{"sbc", ABS, NORMAL}, // ed
|
|
|
|
{"inc", ABS, NORMAL}, // ee
|
|
|
|
{"sbc", ABL, NORMAL}, // ef
|
|
|
|
{"beq", REL, BRANCH}, // f0
|
|
|
|
{"sbc", INY, NORMAL}, // f1
|
|
|
|
{"sbc", INZ, NORMAL}, // f2
|
|
|
|
{"sbc", INS, NORMAL}, // f3
|
|
|
|
{"pea", IMMS, NORMAL}, // f4
|
|
|
|
{"sbc", ZPX, NORMAL}, // f5
|
|
|
|
{"inc", ZPX, NORMAL}, // f6
|
|
|
|
{"sbc", INLY, NORMAL}, // f7
|
|
|
|
{"sed", IMP, NORMAL}, // f8
|
|
|
|
{"sbc", ABY, NORMAL}, // f9
|
|
|
|
{"plx", IMP, NORMAL}, // fa
|
|
|
|
{"xce", IMP, NORMAL}, // fb
|
|
|
|
{"jsr", AIX, CALL}, // fc
|
|
|
|
{"sbc", ABX, NORMAL}, // fd
|
|
|
|
{"inc", ABX, NORMAL}, // fe
|
|
|
|
{"sbc", ABLX, NORMAL} // ff
|
|
|
|
};
|
|
|
|
|
|
|
|
static uint8_t addressSizes[] = {
|
|
|
|
1, // IMP
|
|
|
|
2, // IMM
|
|
|
|
3, // IMMM
|
|
|
|
3, // IMMX
|
|
|
|
3, // IMMS
|
|
|
|
3, // ABS
|
|
|
|
4, // ABL
|
|
|
|
3, // ABX
|
|
|
|
3, // ABY
|
|
|
|
4, // ABLX
|
|
|
|
3, // AIX
|
|
|
|
2, // ZP
|
|
|
|
2, // ZPX
|
|
|
|
2, // ZPY
|
|
|
|
2, // ZPS
|
|
|
|
3, // IND
|
|
|
|
2, // INZ
|
|
|
|
2, // INL
|
|
|
|
2, // INX
|
|
|
|
2, // INY
|
|
|
|
2, // INLY
|
|
|
|
2, // INS
|
|
|
|
2, // REL
|
|
|
|
3, // RELL
|
|
|
|
3, // BANK
|
|
|
|
1, // DB
|
|
|
|
2, // DW
|
|
|
|
4 // DD
|
|
|
|
};
|