regs/65816.h
2018-08-19 17:24:54 -07:00

375 lines
9.5 KiB
C

#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
{"per", IMP, NORMAL}, // 62
{"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
};