xref: /aosp_15_r20/external/capstone/arch/MOS65XX/MOS65XXDisassembler.c (revision 9a0e4156d50a75a99ec4f1653a0e9602a5d45c18)
1*9a0e4156SSadaf Ebrahimi /* Capstone Disassembly Engine */
2*9a0e4156SSadaf Ebrahimi /* MOS65XX Backend by Sebastian Macke <[email protected]> 2018 */
3*9a0e4156SSadaf Ebrahimi 
4*9a0e4156SSadaf Ebrahimi #include "capstone/mos65xx.h"
5*9a0e4156SSadaf Ebrahimi #include "MOS65XXDisassembler.h"
6*9a0e4156SSadaf Ebrahimi 
7*9a0e4156SSadaf Ebrahimi typedef struct OpInfo {
8*9a0e4156SSadaf Ebrahimi 	mos65xx_insn ins;
9*9a0e4156SSadaf Ebrahimi 	mos65xx_address_mode am;
10*9a0e4156SSadaf Ebrahimi } OpInfo;
11*9a0e4156SSadaf Ebrahimi 
12*9a0e4156SSadaf Ebrahimi static const struct OpInfo OpInfoTable[]= {
13*9a0e4156SSadaf Ebrahimi 	{ MOS65XX_INS_BRK    , MOS65XX_AM_IMP  }, // 0x00
14*9a0e4156SSadaf Ebrahimi 	{ MOS65XX_INS_ORA    , MOS65XX_AM_INDX }, // 0x01
15*9a0e4156SSadaf Ebrahimi 	{ MOS65XX_INS_INVALID, MOS65XX_AM_NONE }, // 0x02
16*9a0e4156SSadaf Ebrahimi 	{ MOS65XX_INS_INVALID, MOS65XX_AM_NONE }, // 0x03
17*9a0e4156SSadaf Ebrahimi 	{ MOS65XX_INS_NOP    , MOS65XX_AM_ZP   }, // 0x04
18*9a0e4156SSadaf Ebrahimi 	{ MOS65XX_INS_ORA    , MOS65XX_AM_ZP   }, // 0x05
19*9a0e4156SSadaf Ebrahimi 	{ MOS65XX_INS_ASL    , MOS65XX_AM_ZP   }, // 0x06
20*9a0e4156SSadaf Ebrahimi 	{ MOS65XX_INS_INVALID, MOS65XX_AM_NONE }, // 0x07
21*9a0e4156SSadaf Ebrahimi 	{ MOS65XX_INS_PHP    , MOS65XX_AM_IMP  }, // 0x08
22*9a0e4156SSadaf Ebrahimi 	{ MOS65XX_INS_ORA    , MOS65XX_AM_IMM  }, // 0x09
23*9a0e4156SSadaf Ebrahimi 	{ MOS65XX_INS_ASL    , MOS65XX_AM_ACC  }, // 0x0a
24*9a0e4156SSadaf Ebrahimi 	{ MOS65XX_INS_INVALID, MOS65XX_AM_NONE }, // 0x0b
25*9a0e4156SSadaf Ebrahimi 	{ MOS65XX_INS_NOP    , MOS65XX_AM_ABS  }, // 0x0c
26*9a0e4156SSadaf Ebrahimi 	{ MOS65XX_INS_ORA    , MOS65XX_AM_ABS  }, // 0x0d
27*9a0e4156SSadaf Ebrahimi 	{ MOS65XX_INS_ASL    , MOS65XX_AM_ABS  }, // 0x0e
28*9a0e4156SSadaf Ebrahimi 	{ MOS65XX_INS_INVALID, MOS65XX_AM_NONE }, // 0x0f
29*9a0e4156SSadaf Ebrahimi 	{ MOS65XX_INS_BPL    , MOS65XX_AM_REL  }, // 0x10
30*9a0e4156SSadaf Ebrahimi 	{ MOS65XX_INS_ORA    , MOS65XX_AM_INDY }, // 0x11
31*9a0e4156SSadaf Ebrahimi 	{ MOS65XX_INS_INVALID, MOS65XX_AM_NONE }, // 0x12
32*9a0e4156SSadaf Ebrahimi 	{ MOS65XX_INS_INVALID, MOS65XX_AM_NONE }, // 0x13
33*9a0e4156SSadaf Ebrahimi 	{ MOS65XX_INS_NOP    , MOS65XX_AM_ZPX  }, // 0x14
34*9a0e4156SSadaf Ebrahimi 	{ MOS65XX_INS_ORA    , MOS65XX_AM_ZPX  }, // 0x15
35*9a0e4156SSadaf Ebrahimi 	{ MOS65XX_INS_ASL    , MOS65XX_AM_ZPX  }, // 0x16
36*9a0e4156SSadaf Ebrahimi 	{ MOS65XX_INS_INVALID, MOS65XX_AM_NONE }, // 0x17
37*9a0e4156SSadaf Ebrahimi 	{ MOS65XX_INS_CLC    , MOS65XX_AM_IMP  }, // 0x18
38*9a0e4156SSadaf Ebrahimi 	{ MOS65XX_INS_ORA    , MOS65XX_AM_ABSY }, // 0x19
39*9a0e4156SSadaf Ebrahimi 	{ MOS65XX_INS_NOP    , MOS65XX_AM_IMP  }, // 0x1a
40*9a0e4156SSadaf Ebrahimi 	{ MOS65XX_INS_INVALID, MOS65XX_AM_NONE }, // 0x1b
41*9a0e4156SSadaf Ebrahimi 	{ MOS65XX_INS_NOP    , MOS65XX_AM_ABS  }, // 0x1c
42*9a0e4156SSadaf Ebrahimi 	{ MOS65XX_INS_ORA    , MOS65XX_AM_ABSX }, // 0x1d
43*9a0e4156SSadaf Ebrahimi 	{ MOS65XX_INS_ASL    , MOS65XX_AM_ABSX }, // 0x1e
44*9a0e4156SSadaf Ebrahimi 	{ MOS65XX_INS_INVALID, MOS65XX_AM_NONE }, // 0x1f
45*9a0e4156SSadaf Ebrahimi 	{ MOS65XX_INS_JSR    , MOS65XX_AM_ABS  }, // 0x20
46*9a0e4156SSadaf Ebrahimi 	{ MOS65XX_INS_AND    , MOS65XX_AM_INDX }, // 0x21
47*9a0e4156SSadaf Ebrahimi 	{ MOS65XX_INS_INVALID, MOS65XX_AM_NONE }, // 0x22
48*9a0e4156SSadaf Ebrahimi 	{ MOS65XX_INS_INVALID, MOS65XX_AM_NONE }, // 0x23
49*9a0e4156SSadaf Ebrahimi 	{ MOS65XX_INS_BIT    , MOS65XX_AM_ZP   }, // 0x24
50*9a0e4156SSadaf Ebrahimi 	{ MOS65XX_INS_AND    , MOS65XX_AM_ZP   }, // 0x25
51*9a0e4156SSadaf Ebrahimi 	{ MOS65XX_INS_ROL    , MOS65XX_AM_ZP   }, // 0x26
52*9a0e4156SSadaf Ebrahimi 	{ MOS65XX_INS_INVALID, MOS65XX_AM_NONE }, // 0x27
53*9a0e4156SSadaf Ebrahimi 	{ MOS65XX_INS_PLP    , MOS65XX_AM_IMP  }, // 0x28
54*9a0e4156SSadaf Ebrahimi 	{ MOS65XX_INS_AND    , MOS65XX_AM_IMM  }, // 0x29
55*9a0e4156SSadaf Ebrahimi 	{ MOS65XX_INS_ROL    , MOS65XX_AM_ACC  }, // 0x2a
56*9a0e4156SSadaf Ebrahimi 	{ MOS65XX_INS_INVALID, MOS65XX_AM_NONE }, // 0x2b
57*9a0e4156SSadaf Ebrahimi 	{ MOS65XX_INS_BIT    , MOS65XX_AM_ABS  }, // 0x2c
58*9a0e4156SSadaf Ebrahimi 	{ MOS65XX_INS_AND    , MOS65XX_AM_ABS  }, // 0x2d
59*9a0e4156SSadaf Ebrahimi 	{ MOS65XX_INS_ROL    , MOS65XX_AM_ABS  }, // 0x2e
60*9a0e4156SSadaf Ebrahimi 	{ MOS65XX_INS_INVALID, MOS65XX_AM_NONE }, // 0x2f
61*9a0e4156SSadaf Ebrahimi 	{ MOS65XX_INS_BMI    , MOS65XX_AM_REL  }, // 0x30
62*9a0e4156SSadaf Ebrahimi 	{ MOS65XX_INS_AND    , MOS65XX_AM_INDY }, // 0x31
63*9a0e4156SSadaf Ebrahimi 	{ MOS65XX_INS_INVALID, MOS65XX_AM_NONE }, // 0x32
64*9a0e4156SSadaf Ebrahimi 	{ MOS65XX_INS_INVALID, MOS65XX_AM_NONE }, // 0x33
65*9a0e4156SSadaf Ebrahimi 	{ MOS65XX_INS_NOP    , MOS65XX_AM_ZPX  }, // 0x34
66*9a0e4156SSadaf Ebrahimi 	{ MOS65XX_INS_AND    , MOS65XX_AM_ZPX  }, // 0x35
67*9a0e4156SSadaf Ebrahimi 	{ MOS65XX_INS_ROL    , MOS65XX_AM_ZPX  }, // 0x36
68*9a0e4156SSadaf Ebrahimi 	{ MOS65XX_INS_INVALID, MOS65XX_AM_NONE }, // 0x37
69*9a0e4156SSadaf Ebrahimi 	{ MOS65XX_INS_SEC    , MOS65XX_AM_IMP  }, // 0x38
70*9a0e4156SSadaf Ebrahimi 	{ MOS65XX_INS_AND    , MOS65XX_AM_ABSY }, // 0x39
71*9a0e4156SSadaf Ebrahimi 	{ MOS65XX_INS_NOP    , MOS65XX_AM_IMP  }, // 0x3a
72*9a0e4156SSadaf Ebrahimi 	{ MOS65XX_INS_INVALID, MOS65XX_AM_NONE }, // 0x3b
73*9a0e4156SSadaf Ebrahimi 	{ MOS65XX_INS_NOP    , MOS65XX_AM_ABSX }, // 0x3c
74*9a0e4156SSadaf Ebrahimi 	{ MOS65XX_INS_AND    , MOS65XX_AM_ABSX }, // 0x3d
75*9a0e4156SSadaf Ebrahimi 	{ MOS65XX_INS_ROL    , MOS65XX_AM_ABSX }, // 0x3e
76*9a0e4156SSadaf Ebrahimi 	{ MOS65XX_INS_INVALID, MOS65XX_AM_NONE }, // 0x3f
77*9a0e4156SSadaf Ebrahimi 	{ MOS65XX_INS_RTI    , MOS65XX_AM_IMP  }, // 0x40
78*9a0e4156SSadaf Ebrahimi 	{ MOS65XX_INS_EOR    , MOS65XX_AM_INDX }, // 0x41
79*9a0e4156SSadaf Ebrahimi 	{ MOS65XX_INS_INVALID, MOS65XX_AM_NONE }, // 0x42
80*9a0e4156SSadaf Ebrahimi 	{ MOS65XX_INS_INVALID, MOS65XX_AM_NONE }, // 0x43
81*9a0e4156SSadaf Ebrahimi 	{ MOS65XX_INS_NOP    , MOS65XX_AM_ZP   }, // 0x44
82*9a0e4156SSadaf Ebrahimi 	{ MOS65XX_INS_EOR    , MOS65XX_AM_ZP   }, // 0x45
83*9a0e4156SSadaf Ebrahimi 	{ MOS65XX_INS_LSR    , MOS65XX_AM_ZP   }, // 0x46
84*9a0e4156SSadaf Ebrahimi 	{ MOS65XX_INS_INVALID, MOS65XX_AM_NONE }, // 0x47
85*9a0e4156SSadaf Ebrahimi 	{ MOS65XX_INS_PHA    , MOS65XX_AM_IMP  }, // 0x48
86*9a0e4156SSadaf Ebrahimi 	{ MOS65XX_INS_EOR    , MOS65XX_AM_IMM  }, // 0x49
87*9a0e4156SSadaf Ebrahimi 	{ MOS65XX_INS_LSR    , MOS65XX_AM_ACC  }, // 0x4a
88*9a0e4156SSadaf Ebrahimi 	{ MOS65XX_INS_INVALID, MOS65XX_AM_NONE }, // 0x4b
89*9a0e4156SSadaf Ebrahimi 	{ MOS65XX_INS_JMP    , MOS65XX_AM_ABS  }, // 0x4c
90*9a0e4156SSadaf Ebrahimi 	{ MOS65XX_INS_EOR    , MOS65XX_AM_ABS  }, // 0x4d
91*9a0e4156SSadaf Ebrahimi 	{ MOS65XX_INS_LSR    , MOS65XX_AM_ABS  }, // 0x4e
92*9a0e4156SSadaf Ebrahimi 	{ MOS65XX_INS_INVALID, MOS65XX_AM_NONE }, // 0x4f
93*9a0e4156SSadaf Ebrahimi 	{ MOS65XX_INS_BVC    , MOS65XX_AM_REL  }, // 0x50
94*9a0e4156SSadaf Ebrahimi 	{ MOS65XX_INS_EOR    , MOS65XX_AM_INDY }, // 0x51
95*9a0e4156SSadaf Ebrahimi 	{ MOS65XX_INS_INVALID, MOS65XX_AM_NONE }, // 0x52
96*9a0e4156SSadaf Ebrahimi 	{ MOS65XX_INS_INVALID, MOS65XX_AM_NONE }, // 0x53
97*9a0e4156SSadaf Ebrahimi 	{ MOS65XX_INS_NOP    , MOS65XX_AM_ZPX  }, // 0x54
98*9a0e4156SSadaf Ebrahimi 	{ MOS65XX_INS_EOR    , MOS65XX_AM_ZPX  }, // 0x55
99*9a0e4156SSadaf Ebrahimi 	{ MOS65XX_INS_LSR    , MOS65XX_AM_ZPX  }, // 0x56
100*9a0e4156SSadaf Ebrahimi 	{ MOS65XX_INS_INVALID, MOS65XX_AM_NONE }, // 0x57
101*9a0e4156SSadaf Ebrahimi 	{ MOS65XX_INS_CLI    , MOS65XX_AM_IMP  }, // 0x58
102*9a0e4156SSadaf Ebrahimi 	{ MOS65XX_INS_EOR    , MOS65XX_AM_ABSY }, // 0x59
103*9a0e4156SSadaf Ebrahimi 	{ MOS65XX_INS_NOP    , MOS65XX_AM_IMP  }, // 0x5a
104*9a0e4156SSadaf Ebrahimi 	{ MOS65XX_INS_INVALID, MOS65XX_AM_NONE }, // 0x5b
105*9a0e4156SSadaf Ebrahimi 	{ MOS65XX_INS_NOP    , MOS65XX_AM_ABSX }, // 0x5c
106*9a0e4156SSadaf Ebrahimi 	{ MOS65XX_INS_EOR    , MOS65XX_AM_ABSX }, // 0x5d
107*9a0e4156SSadaf Ebrahimi 	{ MOS65XX_INS_LSR    , MOS65XX_AM_ABSX }, // 0x5e
108*9a0e4156SSadaf Ebrahimi 	{ MOS65XX_INS_INVALID, MOS65XX_AM_NONE }, // 0x5f
109*9a0e4156SSadaf Ebrahimi 	{ MOS65XX_INS_RTS    , MOS65XX_AM_IMP  }, // 0x60
110*9a0e4156SSadaf Ebrahimi 	{ MOS65XX_INS_ADC    , MOS65XX_AM_INDX }, // 0x61
111*9a0e4156SSadaf Ebrahimi 	{ MOS65XX_INS_INVALID, MOS65XX_AM_NONE }, // 0x62
112*9a0e4156SSadaf Ebrahimi 	{ MOS65XX_INS_INVALID, MOS65XX_AM_NONE }, // 0x63
113*9a0e4156SSadaf Ebrahimi 	{ MOS65XX_INS_NOP    , MOS65XX_AM_ZP   }, // 0x64
114*9a0e4156SSadaf Ebrahimi 	{ MOS65XX_INS_ADC    , MOS65XX_AM_ZP   }, // 0x65
115*9a0e4156SSadaf Ebrahimi 	{ MOS65XX_INS_ROR    , MOS65XX_AM_ZP   }, // 0x66
116*9a0e4156SSadaf Ebrahimi 	{ MOS65XX_INS_INVALID, MOS65XX_AM_NONE }, // 0x67
117*9a0e4156SSadaf Ebrahimi 	{ MOS65XX_INS_PLA    , MOS65XX_AM_IMP  }, // 0x68
118*9a0e4156SSadaf Ebrahimi 	{ MOS65XX_INS_ADC    , MOS65XX_AM_IMM  }, // 0x69
119*9a0e4156SSadaf Ebrahimi 	{ MOS65XX_INS_ROR    , MOS65XX_AM_ACC  }, // 0x6a
120*9a0e4156SSadaf Ebrahimi 	{ MOS65XX_INS_INVALID, MOS65XX_AM_NONE }, // 0x6b
121*9a0e4156SSadaf Ebrahimi 	{ MOS65XX_INS_JMP    , MOS65XX_AM_IND  }, // 0x6c
122*9a0e4156SSadaf Ebrahimi 	{ MOS65XX_INS_ADC    , MOS65XX_AM_ABS  }, // 0x6d
123*9a0e4156SSadaf Ebrahimi 	{ MOS65XX_INS_ROR    , MOS65XX_AM_ABS  }, // 0x6e
124*9a0e4156SSadaf Ebrahimi 	{ MOS65XX_INS_INVALID, MOS65XX_AM_NONE }, // 0x6f
125*9a0e4156SSadaf Ebrahimi 	{ MOS65XX_INS_BVS    , MOS65XX_AM_REL  }, // 0x70
126*9a0e4156SSadaf Ebrahimi 	{ MOS65XX_INS_ADC    , MOS65XX_AM_INDY }, // 0x71
127*9a0e4156SSadaf Ebrahimi 	{ MOS65XX_INS_INVALID, MOS65XX_AM_NONE }, // 0x72
128*9a0e4156SSadaf Ebrahimi 	{ MOS65XX_INS_INVALID, MOS65XX_AM_NONE }, // 0x73
129*9a0e4156SSadaf Ebrahimi 	{ MOS65XX_INS_NOP    , MOS65XX_AM_ZPX  }, // 0x74
130*9a0e4156SSadaf Ebrahimi 	{ MOS65XX_INS_ADC    , MOS65XX_AM_ZPX  }, // 0x75
131*9a0e4156SSadaf Ebrahimi 	{ MOS65XX_INS_ROR    , MOS65XX_AM_ZPX  }, // 0x76
132*9a0e4156SSadaf Ebrahimi 	{ MOS65XX_INS_INVALID, MOS65XX_AM_NONE }, // 0x77
133*9a0e4156SSadaf Ebrahimi 	{ MOS65XX_INS_SEI    , MOS65XX_AM_IMP  }, // 0x78
134*9a0e4156SSadaf Ebrahimi 	{ MOS65XX_INS_ADC    , MOS65XX_AM_ABSY }, // 0x79
135*9a0e4156SSadaf Ebrahimi 	{ MOS65XX_INS_NOP    , MOS65XX_AM_IMP  }, // 0x7a
136*9a0e4156SSadaf Ebrahimi 	{ MOS65XX_INS_INVALID, MOS65XX_AM_NONE }, // 0x7b
137*9a0e4156SSadaf Ebrahimi 	{ MOS65XX_INS_NOP    , MOS65XX_AM_ABSX }, // 0x7c
138*9a0e4156SSadaf Ebrahimi 	{ MOS65XX_INS_ADC    , MOS65XX_AM_ABSX }, // 0x7d
139*9a0e4156SSadaf Ebrahimi 	{ MOS65XX_INS_ROR    , MOS65XX_AM_ABSX }, // 0x7e
140*9a0e4156SSadaf Ebrahimi 	{ MOS65XX_INS_INVALID, MOS65XX_AM_NONE }, // 0x7f
141*9a0e4156SSadaf Ebrahimi 	{ MOS65XX_INS_NOP    , MOS65XX_AM_IMP  }, // 0x80
142*9a0e4156SSadaf Ebrahimi 	{ MOS65XX_INS_STA    , MOS65XX_AM_INDX }, // 0x81
143*9a0e4156SSadaf Ebrahimi 	{ MOS65XX_INS_NOP    , MOS65XX_AM_IMP  }, // 0x82
144*9a0e4156SSadaf Ebrahimi 	{ MOS65XX_INS_INVALID, MOS65XX_AM_NONE }, // 0x83
145*9a0e4156SSadaf Ebrahimi 	{ MOS65XX_INS_STY    , MOS65XX_AM_ZP   }, // 0x84
146*9a0e4156SSadaf Ebrahimi 	{ MOS65XX_INS_STA    , MOS65XX_AM_ZP   }, // 0x85
147*9a0e4156SSadaf Ebrahimi 	{ MOS65XX_INS_STX    , MOS65XX_AM_ZP   }, // 0x86
148*9a0e4156SSadaf Ebrahimi 	{ MOS65XX_INS_INVALID, MOS65XX_AM_NONE }, // 0x87
149*9a0e4156SSadaf Ebrahimi 	{ MOS65XX_INS_DEY    , MOS65XX_AM_IMP  }, // 0x88
150*9a0e4156SSadaf Ebrahimi 	{ MOS65XX_INS_NOP    , MOS65XX_AM_IMP  }, // 0x89
151*9a0e4156SSadaf Ebrahimi 	{ MOS65XX_INS_TXA    , MOS65XX_AM_IMP  }, // 0x8a
152*9a0e4156SSadaf Ebrahimi 	{ MOS65XX_INS_INVALID, MOS65XX_AM_NONE }, // 0x8b
153*9a0e4156SSadaf Ebrahimi 	{ MOS65XX_INS_STY    , MOS65XX_AM_ABS  }, // 0x8c
154*9a0e4156SSadaf Ebrahimi 	{ MOS65XX_INS_STA    , MOS65XX_AM_ABS  }, // 0x8d
155*9a0e4156SSadaf Ebrahimi 	{ MOS65XX_INS_STX    , MOS65XX_AM_ABS  }, // 0x8e
156*9a0e4156SSadaf Ebrahimi 	{ MOS65XX_INS_INVALID, MOS65XX_AM_NONE }, // 0x8f
157*9a0e4156SSadaf Ebrahimi 	{ MOS65XX_INS_BCC    , MOS65XX_AM_REL  }, // 0x90
158*9a0e4156SSadaf Ebrahimi 	{ MOS65XX_INS_STA    , MOS65XX_AM_INDY }, // 0x91
159*9a0e4156SSadaf Ebrahimi 	{ MOS65XX_INS_INVALID, MOS65XX_AM_NONE }, // 0x92
160*9a0e4156SSadaf Ebrahimi 	{ MOS65XX_INS_INVALID, MOS65XX_AM_NONE }, // 0x93
161*9a0e4156SSadaf Ebrahimi 	{ MOS65XX_INS_STY    , MOS65XX_AM_ZPX  }, // 0x94
162*9a0e4156SSadaf Ebrahimi 	{ MOS65XX_INS_STA    , MOS65XX_AM_ZPX  }, // 0x95
163*9a0e4156SSadaf Ebrahimi 	{ MOS65XX_INS_STX    , MOS65XX_AM_ZPY  }, // 0x96
164*9a0e4156SSadaf Ebrahimi 	{ MOS65XX_INS_INVALID, MOS65XX_AM_NONE }, // 0x97
165*9a0e4156SSadaf Ebrahimi 	{ MOS65XX_INS_TYA    , MOS65XX_AM_IMP  }, // 0x98
166*9a0e4156SSadaf Ebrahimi 	{ MOS65XX_INS_STA    , MOS65XX_AM_ABSY }, // 0x99
167*9a0e4156SSadaf Ebrahimi 	{ MOS65XX_INS_TXS    , MOS65XX_AM_IMP  }, // 0x9a
168*9a0e4156SSadaf Ebrahimi 	{ MOS65XX_INS_INVALID, MOS65XX_AM_NONE }, // 0x9b
169*9a0e4156SSadaf Ebrahimi 	{ MOS65XX_INS_INVALID, MOS65XX_AM_NONE }, // 0x9c
170*9a0e4156SSadaf Ebrahimi 	{ MOS65XX_INS_STA    , MOS65XX_AM_ABSX }, // 0x9d
171*9a0e4156SSadaf Ebrahimi 	{ MOS65XX_INS_INVALID, MOS65XX_AM_NONE }, // 0x9e
172*9a0e4156SSadaf Ebrahimi 	{ MOS65XX_INS_INVALID, MOS65XX_AM_NONE }, // 0x9f
173*9a0e4156SSadaf Ebrahimi 	{ MOS65XX_INS_LDY    , MOS65XX_AM_IMM  }, // 0xa0
174*9a0e4156SSadaf Ebrahimi 	{ MOS65XX_INS_LDA    , MOS65XX_AM_INDX }, // 0xa1
175*9a0e4156SSadaf Ebrahimi 	{ MOS65XX_INS_LDX    , MOS65XX_AM_IMM  }, // 0xa2
176*9a0e4156SSadaf Ebrahimi 	{ MOS65XX_INS_INVALID, MOS65XX_AM_NONE }, // 0xa3
177*9a0e4156SSadaf Ebrahimi 	{ MOS65XX_INS_LDY    , MOS65XX_AM_ZP   }, // 0xa4
178*9a0e4156SSadaf Ebrahimi 	{ MOS65XX_INS_LDA    , MOS65XX_AM_ZP   }, // 0xa5
179*9a0e4156SSadaf Ebrahimi 	{ MOS65XX_INS_LDX    , MOS65XX_AM_ZP   }, // 0xa6
180*9a0e4156SSadaf Ebrahimi 	{ MOS65XX_INS_INVALID, MOS65XX_AM_NONE }, // 0xa7
181*9a0e4156SSadaf Ebrahimi 	{ MOS65XX_INS_TAY    , MOS65XX_AM_IMP  }, // 0xa8
182*9a0e4156SSadaf Ebrahimi 	{ MOS65XX_INS_LDA    , MOS65XX_AM_IMM  }, // 0xa9
183*9a0e4156SSadaf Ebrahimi 	{ MOS65XX_INS_TAX    , MOS65XX_AM_IMP  }, // 0xaa
184*9a0e4156SSadaf Ebrahimi 	{ MOS65XX_INS_INVALID, MOS65XX_AM_NONE }, // 0xab
185*9a0e4156SSadaf Ebrahimi 	{ MOS65XX_INS_LDY    , MOS65XX_AM_ABS  }, // 0xac
186*9a0e4156SSadaf Ebrahimi 	{ MOS65XX_INS_LDA    , MOS65XX_AM_ABS  }, // 0xad
187*9a0e4156SSadaf Ebrahimi 	{ MOS65XX_INS_LDX    , MOS65XX_AM_ABS  }, // 0xae
188*9a0e4156SSadaf Ebrahimi 	{ MOS65XX_INS_INVALID, MOS65XX_AM_NONE }, // 0xaf
189*9a0e4156SSadaf Ebrahimi 	{ MOS65XX_INS_BCS    , MOS65XX_AM_REL  }, // 0xb0
190*9a0e4156SSadaf Ebrahimi 	{ MOS65XX_INS_LDA    , MOS65XX_AM_INDY }, // 0xb1
191*9a0e4156SSadaf Ebrahimi 	{ MOS65XX_INS_INVALID, MOS65XX_AM_NONE }, // 0xb2
192*9a0e4156SSadaf Ebrahimi 	{ MOS65XX_INS_INVALID, MOS65XX_AM_NONE }, // 0xb3
193*9a0e4156SSadaf Ebrahimi 	{ MOS65XX_INS_LDY    , MOS65XX_AM_ZPX  }, // 0xb4
194*9a0e4156SSadaf Ebrahimi 	{ MOS65XX_INS_LDA    , MOS65XX_AM_ZPX  }, // 0xb5
195*9a0e4156SSadaf Ebrahimi 	{ MOS65XX_INS_LDX    , MOS65XX_AM_ZPY  }, // 0xb6
196*9a0e4156SSadaf Ebrahimi 	{ MOS65XX_INS_INVALID, MOS65XX_AM_NONE }, // 0xb7
197*9a0e4156SSadaf Ebrahimi 	{ MOS65XX_INS_CLV    , MOS65XX_AM_IMP  }, // 0xb8
198*9a0e4156SSadaf Ebrahimi 	{ MOS65XX_INS_LDA    , MOS65XX_AM_ABSY }, // 0xb9
199*9a0e4156SSadaf Ebrahimi 	{ MOS65XX_INS_TSX    , MOS65XX_AM_IMP  }, // 0xba
200*9a0e4156SSadaf Ebrahimi 	{ MOS65XX_INS_INVALID, MOS65XX_AM_NONE }, // 0xbb
201*9a0e4156SSadaf Ebrahimi 	{ MOS65XX_INS_LDY    , MOS65XX_AM_ABSX }, // 0xbc
202*9a0e4156SSadaf Ebrahimi 	{ MOS65XX_INS_LDA    , MOS65XX_AM_ABSX }, // 0xbd
203*9a0e4156SSadaf Ebrahimi 	{ MOS65XX_INS_LDX    , MOS65XX_AM_ABSY }, // 0xbe
204*9a0e4156SSadaf Ebrahimi 	{ MOS65XX_INS_INVALID, MOS65XX_AM_NONE }, // 0xbf
205*9a0e4156SSadaf Ebrahimi 	{ MOS65XX_INS_CPY    , MOS65XX_AM_IMM  }, // 0xc0
206*9a0e4156SSadaf Ebrahimi 	{ MOS65XX_INS_CMP    , MOS65XX_AM_INDX }, // 0xc1
207*9a0e4156SSadaf Ebrahimi 	{ MOS65XX_INS_NOP    , MOS65XX_AM_IMP  }, // 0xc2
208*9a0e4156SSadaf Ebrahimi 	{ MOS65XX_INS_INVALID, MOS65XX_AM_NONE }, // 0xc3
209*9a0e4156SSadaf Ebrahimi 	{ MOS65XX_INS_CPY    , MOS65XX_AM_ZP   }, // 0xc4
210*9a0e4156SSadaf Ebrahimi 	{ MOS65XX_INS_CMP    , MOS65XX_AM_ZP   }, // 0xc5
211*9a0e4156SSadaf Ebrahimi 	{ MOS65XX_INS_DEC    , MOS65XX_AM_ZP   }, // 0xc6
212*9a0e4156SSadaf Ebrahimi 	{ MOS65XX_INS_INVALID, MOS65XX_AM_NONE }, // 0xc7
213*9a0e4156SSadaf Ebrahimi 	{ MOS65XX_INS_INY    , MOS65XX_AM_IMP  }, // 0xc8
214*9a0e4156SSadaf Ebrahimi 	{ MOS65XX_INS_CMP    , MOS65XX_AM_IMM  }, // 0xc9
215*9a0e4156SSadaf Ebrahimi 	{ MOS65XX_INS_DEX    , MOS65XX_AM_IMP  }, // 0xca
216*9a0e4156SSadaf Ebrahimi 	{ MOS65XX_INS_INVALID, MOS65XX_AM_NONE }, // 0xcb
217*9a0e4156SSadaf Ebrahimi 	{ MOS65XX_INS_CPY    , MOS65XX_AM_ABS  }, // 0xcc
218*9a0e4156SSadaf Ebrahimi 	{ MOS65XX_INS_CMP    , MOS65XX_AM_ABS  }, // 0xcd
219*9a0e4156SSadaf Ebrahimi 	{ MOS65XX_INS_DEC    , MOS65XX_AM_ABS  }, // 0xce
220*9a0e4156SSadaf Ebrahimi 	{ MOS65XX_INS_INVALID, MOS65XX_AM_NONE }, // 0xcf
221*9a0e4156SSadaf Ebrahimi 	{ MOS65XX_INS_BNE    , MOS65XX_AM_REL  }, // 0xd0
222*9a0e4156SSadaf Ebrahimi 	{ MOS65XX_INS_CMP    , MOS65XX_AM_INDY }, // 0xd1
223*9a0e4156SSadaf Ebrahimi 	{ MOS65XX_INS_INVALID, MOS65XX_AM_NONE }, // 0xd2
224*9a0e4156SSadaf Ebrahimi 	{ MOS65XX_INS_INVALID, MOS65XX_AM_NONE }, // 0xd3
225*9a0e4156SSadaf Ebrahimi 	{ MOS65XX_INS_NOP    , MOS65XX_AM_ZPX  }, // 0xd4
226*9a0e4156SSadaf Ebrahimi 	{ MOS65XX_INS_CMP    , MOS65XX_AM_ZPX  }, // 0xd5
227*9a0e4156SSadaf Ebrahimi 	{ MOS65XX_INS_DEC    , MOS65XX_AM_ZPX  }, // 0xd6
228*9a0e4156SSadaf Ebrahimi 	{ MOS65XX_INS_INVALID, MOS65XX_AM_NONE }, // 0xd7
229*9a0e4156SSadaf Ebrahimi 	{ MOS65XX_INS_CLD    , MOS65XX_AM_IMP  }, // 0xd8
230*9a0e4156SSadaf Ebrahimi 	{ MOS65XX_INS_CMP    , MOS65XX_AM_ABSY }, // 0xd9
231*9a0e4156SSadaf Ebrahimi 	{ MOS65XX_INS_NOP    , MOS65XX_AM_IMP  }, // 0xda
232*9a0e4156SSadaf Ebrahimi 	{ MOS65XX_INS_INVALID, MOS65XX_AM_NONE }, // 0xdb
233*9a0e4156SSadaf Ebrahimi 	{ MOS65XX_INS_NOP    , MOS65XX_AM_ABSX }, // 0xdc
234*9a0e4156SSadaf Ebrahimi 	{ MOS65XX_INS_CMP    , MOS65XX_AM_ABSX }, // 0xdd
235*9a0e4156SSadaf Ebrahimi 	{ MOS65XX_INS_DEC    , MOS65XX_AM_ABSX }, // 0xde
236*9a0e4156SSadaf Ebrahimi 	{ MOS65XX_INS_INVALID, MOS65XX_AM_NONE }, // 0xdf
237*9a0e4156SSadaf Ebrahimi 	{ MOS65XX_INS_CPX    , MOS65XX_AM_IMM  }, // 0xe0
238*9a0e4156SSadaf Ebrahimi 	{ MOS65XX_INS_SBC    , MOS65XX_AM_INDX }, // 0xe1
239*9a0e4156SSadaf Ebrahimi 	{ MOS65XX_INS_NOP    , MOS65XX_AM_IMP  }, // 0xe2
240*9a0e4156SSadaf Ebrahimi 	{ MOS65XX_INS_INVALID, MOS65XX_AM_NONE }, // 0xe3
241*9a0e4156SSadaf Ebrahimi 	{ MOS65XX_INS_CPX    , MOS65XX_AM_ZP   }, // 0xe4
242*9a0e4156SSadaf Ebrahimi 	{ MOS65XX_INS_SBC    , MOS65XX_AM_ZP   }, // 0xe5
243*9a0e4156SSadaf Ebrahimi 	{ MOS65XX_INS_INC    , MOS65XX_AM_ZP   }, // 0xe6
244*9a0e4156SSadaf Ebrahimi 	{ MOS65XX_INS_INVALID, MOS65XX_AM_NONE }, // 0xe7
245*9a0e4156SSadaf Ebrahimi 	{ MOS65XX_INS_INX    , MOS65XX_AM_IMP  }, // 0xe8
246*9a0e4156SSadaf Ebrahimi 	{ MOS65XX_INS_SBC    , MOS65XX_AM_IMM  }, // 0xe9
247*9a0e4156SSadaf Ebrahimi 	{ MOS65XX_INS_NOP    , MOS65XX_AM_IMP  }, // 0xea
248*9a0e4156SSadaf Ebrahimi 	{ MOS65XX_INS_INVALID, MOS65XX_AM_NONE }, // 0xeb
249*9a0e4156SSadaf Ebrahimi 	{ MOS65XX_INS_CPX    , MOS65XX_AM_ABS  }, // 0xec
250*9a0e4156SSadaf Ebrahimi 	{ MOS65XX_INS_SBC    , MOS65XX_AM_ABS  }, // 0xed
251*9a0e4156SSadaf Ebrahimi 	{ MOS65XX_INS_INC    , MOS65XX_AM_ABS  }, // 0xee
252*9a0e4156SSadaf Ebrahimi 	{ MOS65XX_INS_INVALID, MOS65XX_AM_NONE }, // 0xef
253*9a0e4156SSadaf Ebrahimi 	{ MOS65XX_INS_BEQ    , MOS65XX_AM_REL  }, // 0xf0
254*9a0e4156SSadaf Ebrahimi 	{ MOS65XX_INS_SBC    , MOS65XX_AM_INDY }, // 0xf1
255*9a0e4156SSadaf Ebrahimi 	{ MOS65XX_INS_INVALID, MOS65XX_AM_NONE }, // 0xf2
256*9a0e4156SSadaf Ebrahimi 	{ MOS65XX_INS_INVALID, MOS65XX_AM_NONE }, // 0xf3
257*9a0e4156SSadaf Ebrahimi 	{ MOS65XX_INS_NOP    , MOS65XX_AM_ZPX  }, // 0xf4
258*9a0e4156SSadaf Ebrahimi 	{ MOS65XX_INS_SBC    , MOS65XX_AM_ZPX  }, // 0xf5
259*9a0e4156SSadaf Ebrahimi 	{ MOS65XX_INS_INC    , MOS65XX_AM_ZPX  }, // 0xf6
260*9a0e4156SSadaf Ebrahimi 	{ MOS65XX_INS_INVALID, MOS65XX_AM_NONE }, // 0xf7
261*9a0e4156SSadaf Ebrahimi 	{ MOS65XX_INS_SED    , MOS65XX_AM_IMP  }, // 0xf8
262*9a0e4156SSadaf Ebrahimi 	{ MOS65XX_INS_SBC    , MOS65XX_AM_ABSY }, // 0xf9
263*9a0e4156SSadaf Ebrahimi 	{ MOS65XX_INS_NOP    , MOS65XX_AM_IMP  }, // 0xfa
264*9a0e4156SSadaf Ebrahimi 	{ MOS65XX_INS_INVALID, MOS65XX_AM_NONE }, // 0xfb
265*9a0e4156SSadaf Ebrahimi 	{ MOS65XX_INS_NOP    , MOS65XX_AM_ABSX }, // 0xfc
266*9a0e4156SSadaf Ebrahimi 	{ MOS65XX_INS_SBC    , MOS65XX_AM_ABSX }, // 0xfd
267*9a0e4156SSadaf Ebrahimi 	{ MOS65XX_INS_INC    , MOS65XX_AM_ABSX }, // 0xfe
268*9a0e4156SSadaf Ebrahimi 	{ MOS65XX_INS_INVALID, MOS65XX_AM_NONE }, // 0xff
269*9a0e4156SSadaf Ebrahimi };
270*9a0e4156SSadaf Ebrahimi 
271*9a0e4156SSadaf Ebrahimi static const char* RegNames[] = {
272*9a0e4156SSadaf Ebrahimi 	"invalid", "A", "X", "Y", "P", "SP"
273*9a0e4156SSadaf Ebrahimi };
274*9a0e4156SSadaf Ebrahimi 
275*9a0e4156SSadaf Ebrahimi #ifndef CAPSTONE_DIET
276*9a0e4156SSadaf Ebrahimi static const char* GroupNames[] = {
277*9a0e4156SSadaf Ebrahimi 	NULL,
278*9a0e4156SSadaf Ebrahimi 	"jump",
279*9a0e4156SSadaf Ebrahimi 	"call",
280*9a0e4156SSadaf Ebrahimi 	"ret",
281*9a0e4156SSadaf Ebrahimi 	NULL,
282*9a0e4156SSadaf Ebrahimi 	"iret",
283*9a0e4156SSadaf Ebrahimi 	"branch_relative"
284*9a0e4156SSadaf Ebrahimi };
285*9a0e4156SSadaf Ebrahimi 
286*9a0e4156SSadaf Ebrahimi typedef struct InstructionInfo {
287*9a0e4156SSadaf Ebrahimi 	const char* name;
288*9a0e4156SSadaf Ebrahimi 	mos65xx_group_type group_type;
289*9a0e4156SSadaf Ebrahimi 	mos65xx_reg write, read;
290*9a0e4156SSadaf Ebrahimi 	bool modifies_status;
291*9a0e4156SSadaf Ebrahimi } InstructionInfo;
292*9a0e4156SSadaf Ebrahimi 
293*9a0e4156SSadaf Ebrahimi static const struct InstructionInfo InstructionInfoTable[]= {
294*9a0e4156SSadaf Ebrahimi 	{ "invalid", MOS65XX_GRP_INVALID,         MOS65XX_REG_INVALID, MOS65XX_REG_INVALID, false },
295*9a0e4156SSadaf Ebrahimi 	{ "adc",     MOS65XX_GRP_INVALID,         MOS65XX_REG_ACC, MOS65XX_REG_INVALID, true },
296*9a0e4156SSadaf Ebrahimi 	{ "and",     MOS65XX_GRP_INVALID,         MOS65XX_REG_ACC,     MOS65XX_REG_INVALID, true },
297*9a0e4156SSadaf Ebrahimi 	{ "asl",     MOS65XX_GRP_INVALID,         MOS65XX_REG_INVALID, MOS65XX_REG_INVALID, true },
298*9a0e4156SSadaf Ebrahimi 	{ "bcc",     MOS65XX_GRP_BRANCH_RELATIVE, MOS65XX_REG_INVALID, MOS65XX_REG_P,       false },
299*9a0e4156SSadaf Ebrahimi 	{ "bcs",     MOS65XX_GRP_BRANCH_RELATIVE, MOS65XX_REG_INVALID, MOS65XX_REG_P,       false },
300*9a0e4156SSadaf Ebrahimi 	{ "beq",     MOS65XX_GRP_BRANCH_RELATIVE, MOS65XX_REG_INVALID, MOS65XX_REG_P,       false },
301*9a0e4156SSadaf Ebrahimi 	{ "bit",     MOS65XX_GRP_INVALID,         MOS65XX_REG_INVALID, MOS65XX_REG_INVALID, true },
302*9a0e4156SSadaf Ebrahimi 	{ "bmi",     MOS65XX_GRP_BRANCH_RELATIVE, MOS65XX_REG_INVALID, MOS65XX_REG_P,       false },
303*9a0e4156SSadaf Ebrahimi 	{ "bne",     MOS65XX_GRP_BRANCH_RELATIVE, MOS65XX_REG_INVALID, MOS65XX_REG_P,       false },
304*9a0e4156SSadaf Ebrahimi 	{ "bpl",     MOS65XX_GRP_BRANCH_RELATIVE, MOS65XX_REG_INVALID, MOS65XX_REG_P,       false },
305*9a0e4156SSadaf Ebrahimi 	{ "brk",     MOS65XX_GRP_INVALID,         MOS65XX_REG_SP,      MOS65XX_REG_INVALID, false },
306*9a0e4156SSadaf Ebrahimi 	{ "bvc",     MOS65XX_GRP_BRANCH_RELATIVE, MOS65XX_REG_INVALID, MOS65XX_REG_P,       false },
307*9a0e4156SSadaf Ebrahimi 	{ "bvs",     MOS65XX_GRP_BRANCH_RELATIVE, MOS65XX_REG_INVALID, MOS65XX_REG_P,       false },
308*9a0e4156SSadaf Ebrahimi 	{ "clc",     MOS65XX_GRP_INVALID,         MOS65XX_REG_INVALID, MOS65XX_REG_INVALID, true },
309*9a0e4156SSadaf Ebrahimi 	{ "cld",     MOS65XX_GRP_INVALID,         MOS65XX_REG_INVALID, MOS65XX_REG_INVALID, true },
310*9a0e4156SSadaf Ebrahimi 	{ "cli",     MOS65XX_GRP_INVALID,         MOS65XX_REG_INVALID, MOS65XX_REG_INVALID, true },
311*9a0e4156SSadaf Ebrahimi 	{ "clv",     MOS65XX_GRP_INVALID,         MOS65XX_REG_INVALID, MOS65XX_REG_INVALID, true },
312*9a0e4156SSadaf Ebrahimi 	{ "cmp",     MOS65XX_GRP_INVALID,         MOS65XX_REG_INVALID, MOS65XX_REG_ACC,     true },
313*9a0e4156SSadaf Ebrahimi 	{ "cpx",     MOS65XX_GRP_INVALID,         MOS65XX_REG_INVALID, MOS65XX_REG_X,       true },
314*9a0e4156SSadaf Ebrahimi 	{ "cpy",     MOS65XX_GRP_INVALID,         MOS65XX_REG_INVALID, MOS65XX_REG_Y,       true },
315*9a0e4156SSadaf Ebrahimi 	{ "dec",     MOS65XX_GRP_INVALID,         MOS65XX_REG_INVALID, MOS65XX_REG_INVALID, true },
316*9a0e4156SSadaf Ebrahimi 	{ "dex",     MOS65XX_GRP_INVALID,         MOS65XX_REG_X,       MOS65XX_REG_X,       true },
317*9a0e4156SSadaf Ebrahimi 	{ "dey",     MOS65XX_GRP_INVALID,         MOS65XX_REG_Y,       MOS65XX_REG_Y,       true },
318*9a0e4156SSadaf Ebrahimi 	{ "eor",     MOS65XX_GRP_INVALID,         MOS65XX_REG_INVALID, MOS65XX_REG_INVALID, true },
319*9a0e4156SSadaf Ebrahimi 	{ "inc",     MOS65XX_GRP_INVALID,         MOS65XX_REG_INVALID, MOS65XX_REG_INVALID, true },
320*9a0e4156SSadaf Ebrahimi 	{ "inx",     MOS65XX_GRP_INVALID,         MOS65XX_REG_X,       MOS65XX_REG_X,       true },
321*9a0e4156SSadaf Ebrahimi 	{ "iny",     MOS65XX_GRP_INVALID,         MOS65XX_REG_Y,       MOS65XX_REG_Y,       true },
322*9a0e4156SSadaf Ebrahimi 	{ "jmp",     MOS65XX_GRP_JUMP,            MOS65XX_REG_INVALID, MOS65XX_REG_INVALID, false },
323*9a0e4156SSadaf Ebrahimi 	{ "jsr",     MOS65XX_GRP_CALL,            MOS65XX_REG_INVALID, MOS65XX_REG_INVALID, false },
324*9a0e4156SSadaf Ebrahimi 	{ "lda",     MOS65XX_GRP_INVALID,         MOS65XX_REG_ACC,     MOS65XX_REG_INVALID, true },
325*9a0e4156SSadaf Ebrahimi 	{ "ldx",     MOS65XX_GRP_INVALID,         MOS65XX_REG_X,       MOS65XX_REG_INVALID, true },
326*9a0e4156SSadaf Ebrahimi 	{ "ldy",     MOS65XX_GRP_INVALID,         MOS65XX_REG_Y,       MOS65XX_REG_INVALID, true },
327*9a0e4156SSadaf Ebrahimi 	{ "lsr",     MOS65XX_GRP_INVALID,         MOS65XX_REG_INVALID, MOS65XX_REG_INVALID, true },
328*9a0e4156SSadaf Ebrahimi 	{ "nop",     MOS65XX_GRP_INVALID,         MOS65XX_REG_INVALID, MOS65XX_REG_INVALID, false },
329*9a0e4156SSadaf Ebrahimi 	{ "ora",     MOS65XX_GRP_INVALID,         MOS65XX_REG_ACC,     MOS65XX_REG_INVALID, true },
330*9a0e4156SSadaf Ebrahimi 	{ "pha",     MOS65XX_GRP_INVALID,         MOS65XX_REG_SP,      MOS65XX_REG_ACC,     false },
331*9a0e4156SSadaf Ebrahimi 	{ "pla",     MOS65XX_GRP_INVALID,         MOS65XX_REG_ACC,     MOS65XX_REG_SP,      true },
332*9a0e4156SSadaf Ebrahimi 	{ "php",     MOS65XX_GRP_INVALID,         MOS65XX_REG_SP,      MOS65XX_REG_P,       false },
333*9a0e4156SSadaf Ebrahimi 	{ "plp",     MOS65XX_GRP_INVALID,         MOS65XX_REG_INVALID, MOS65XX_REG_SP,      true },
334*9a0e4156SSadaf Ebrahimi 	{ "rol",     MOS65XX_GRP_INVALID,         MOS65XX_REG_INVALID, MOS65XX_REG_INVALID, true },
335*9a0e4156SSadaf Ebrahimi 	{ "ror",     MOS65XX_GRP_INVALID,         MOS65XX_REG_INVALID, MOS65XX_REG_INVALID, true },
336*9a0e4156SSadaf Ebrahimi 	{ "rti",     MOS65XX_GRP_IRET,            MOS65XX_REG_SP,      MOS65XX_REG_INVALID, true },
337*9a0e4156SSadaf Ebrahimi 	{ "rts",     MOS65XX_GRP_RET,             MOS65XX_REG_SP,      MOS65XX_REG_INVALID, false },
338*9a0e4156SSadaf Ebrahimi 	{ "sbc",     MOS65XX_GRP_INVALID,         MOS65XX_REG_ACC,     MOS65XX_REG_INVALID, true },
339*9a0e4156SSadaf Ebrahimi 	{ "sec",     MOS65XX_GRP_INVALID,         MOS65XX_REG_INVALID, MOS65XX_REG_INVALID, true },
340*9a0e4156SSadaf Ebrahimi 	{ "sed",     MOS65XX_GRP_INVALID,         MOS65XX_REG_INVALID, MOS65XX_REG_INVALID, true },
341*9a0e4156SSadaf Ebrahimi 	{ "sei",     MOS65XX_GRP_INVALID,         MOS65XX_REG_INVALID, MOS65XX_REG_INVALID, true },
342*9a0e4156SSadaf Ebrahimi 	{ "sta",     MOS65XX_GRP_INVALID,         MOS65XX_REG_INVALID, MOS65XX_REG_ACC,     false },
343*9a0e4156SSadaf Ebrahimi 	{ "stx",     MOS65XX_GRP_INVALID,         MOS65XX_REG_INVALID, MOS65XX_REG_X,       false },
344*9a0e4156SSadaf Ebrahimi 	{ "sty",     MOS65XX_GRP_INVALID,         MOS65XX_REG_INVALID, MOS65XX_REG_Y,       false },
345*9a0e4156SSadaf Ebrahimi 	{ "tax",     MOS65XX_GRP_INVALID,         MOS65XX_REG_X,       MOS65XX_REG_ACC,     true },
346*9a0e4156SSadaf Ebrahimi 	{ "tay",     MOS65XX_GRP_INVALID,         MOS65XX_REG_Y,       MOS65XX_REG_ACC,     true },
347*9a0e4156SSadaf Ebrahimi 	{ "tsx",     MOS65XX_GRP_INVALID,         MOS65XX_REG_X,       MOS65XX_REG_SP,      true },
348*9a0e4156SSadaf Ebrahimi 	{ "txa",     MOS65XX_GRP_INVALID,         MOS65XX_REG_ACC,     MOS65XX_REG_X,       true },
349*9a0e4156SSadaf Ebrahimi 	{ "txs",     MOS65XX_GRP_INVALID,         MOS65XX_REG_SP,      MOS65XX_REG_X,       true },
350*9a0e4156SSadaf Ebrahimi 	{ "tya",     MOS65XX_GRP_INVALID,         MOS65XX_REG_ACC,     MOS65XX_REG_Y,       true },
351*9a0e4156SSadaf Ebrahimi };
352*9a0e4156SSadaf Ebrahimi #endif
353*9a0e4156SSadaf Ebrahimi 
getInstructionLength(mos65xx_address_mode am)354*9a0e4156SSadaf Ebrahimi static int getInstructionLength(mos65xx_address_mode am)
355*9a0e4156SSadaf Ebrahimi {
356*9a0e4156SSadaf Ebrahimi 	switch(am) {
357*9a0e4156SSadaf Ebrahimi 		case MOS65XX_AM_NONE:
358*9a0e4156SSadaf Ebrahimi 		case MOS65XX_AM_ACC:
359*9a0e4156SSadaf Ebrahimi 		case MOS65XX_AM_IMP:
360*9a0e4156SSadaf Ebrahimi 			return 1;
361*9a0e4156SSadaf Ebrahimi 
362*9a0e4156SSadaf Ebrahimi 		case MOS65XX_AM_IMM:
363*9a0e4156SSadaf Ebrahimi 		case MOS65XX_AM_ZPX:
364*9a0e4156SSadaf Ebrahimi 		case MOS65XX_AM_ZPY:
365*9a0e4156SSadaf Ebrahimi 		case MOS65XX_AM_ZP:
366*9a0e4156SSadaf Ebrahimi 		case MOS65XX_AM_REL:
367*9a0e4156SSadaf Ebrahimi 		case MOS65XX_AM_INDX:
368*9a0e4156SSadaf Ebrahimi 		case MOS65XX_AM_INDY:
369*9a0e4156SSadaf Ebrahimi 			return 2;
370*9a0e4156SSadaf Ebrahimi 
371*9a0e4156SSadaf Ebrahimi 		case MOS65XX_AM_ABS:
372*9a0e4156SSadaf Ebrahimi 		case MOS65XX_AM_ABSX:
373*9a0e4156SSadaf Ebrahimi 		case MOS65XX_AM_ABSY:
374*9a0e4156SSadaf Ebrahimi 		case MOS65XX_AM_IND:
375*9a0e4156SSadaf Ebrahimi 			return 3;
376*9a0e4156SSadaf Ebrahimi 		default:
377*9a0e4156SSadaf Ebrahimi 			return 1;
378*9a0e4156SSadaf Ebrahimi 	}
379*9a0e4156SSadaf Ebrahimi }
380*9a0e4156SSadaf Ebrahimi 
381*9a0e4156SSadaf Ebrahimi #ifndef CAPSTONE_DIET
fillDetails(MCInst * MI,unsigned char opcode)382*9a0e4156SSadaf Ebrahimi static void fillDetails(MCInst *MI, unsigned char opcode)
383*9a0e4156SSadaf Ebrahimi {
384*9a0e4156SSadaf Ebrahimi 	cs_detail *detail = MI->flat_insn->detail;
385*9a0e4156SSadaf Ebrahimi 	mos65xx_insn ins = OpInfoTable[opcode].ins;
386*9a0e4156SSadaf Ebrahimi 	mos65xx_address_mode am = OpInfoTable[opcode].am;
387*9a0e4156SSadaf Ebrahimi 
388*9a0e4156SSadaf Ebrahimi 	detail->mos65xx.am = am;
389*9a0e4156SSadaf Ebrahimi 	detail->mos65xx.modifies_flags = InstructionInfoTable[ins].modifies_status;
390*9a0e4156SSadaf Ebrahimi 	detail->groups_count = 0;
391*9a0e4156SSadaf Ebrahimi 	detail->regs_read_count = 0;
392*9a0e4156SSadaf Ebrahimi 	detail->regs_write_count = 0;
393*9a0e4156SSadaf Ebrahimi 	detail->mos65xx.op_count = 0;
394*9a0e4156SSadaf Ebrahimi 
395*9a0e4156SSadaf Ebrahimi 	if (InstructionInfoTable[ins].group_type != MOS65XX_GRP_INVALID) {
396*9a0e4156SSadaf Ebrahimi 		detail->groups[0] = InstructionInfoTable[ins].group_type;
397*9a0e4156SSadaf Ebrahimi 		detail->groups_count++;
398*9a0e4156SSadaf Ebrahimi 	}
399*9a0e4156SSadaf Ebrahimi 
400*9a0e4156SSadaf Ebrahimi 	if (InstructionInfoTable[ins].read != MOS65XX_REG_INVALID) {
401*9a0e4156SSadaf Ebrahimi 		detail->regs_read[detail->regs_read_count++] = InstructionInfoTable[ins].read;
402*9a0e4156SSadaf Ebrahimi 	} else if (OpInfoTable[opcode].am == MOS65XX_AM_ACC) {
403*9a0e4156SSadaf Ebrahimi 		detail->regs_read[detail->regs_read_count++] = MOS65XX_REG_ACC;
404*9a0e4156SSadaf Ebrahimi 	} else if (OpInfoTable[opcode].am == MOS65XX_AM_INDY || OpInfoTable[opcode].am == MOS65XX_AM_ABSY || OpInfoTable[opcode].am == MOS65XX_AM_ZPY) {
405*9a0e4156SSadaf Ebrahimi 		detail->regs_read[detail->regs_read_count++] = MOS65XX_REG_Y;
406*9a0e4156SSadaf Ebrahimi 	} else if (OpInfoTable[opcode].am == MOS65XX_AM_INDX || OpInfoTable[opcode].am == MOS65XX_AM_ABSX || OpInfoTable[opcode].am == MOS65XX_AM_ZPX) {
407*9a0e4156SSadaf Ebrahimi 		detail->regs_read[detail->regs_read_count++] = MOS65XX_REG_X;
408*9a0e4156SSadaf Ebrahimi 	}
409*9a0e4156SSadaf Ebrahimi 
410*9a0e4156SSadaf Ebrahimi 	if (InstructionInfoTable[ins].write != MOS65XX_REG_INVALID) {
411*9a0e4156SSadaf Ebrahimi 		detail->regs_write[detail->regs_write_count++] = InstructionInfoTable[ins].write;
412*9a0e4156SSadaf Ebrahimi 	} else if (OpInfoTable[opcode].am == MOS65XX_AM_ACC) {
413*9a0e4156SSadaf Ebrahimi 		detail->regs_write[detail->regs_write_count++] = MOS65XX_REG_ACC;
414*9a0e4156SSadaf Ebrahimi 	}
415*9a0e4156SSadaf Ebrahimi 
416*9a0e4156SSadaf Ebrahimi 	if (InstructionInfoTable[ins].modifies_status) {
417*9a0e4156SSadaf Ebrahimi 		detail->regs_write[detail->regs_write_count++] = MOS65XX_REG_P;
418*9a0e4156SSadaf Ebrahimi 	}
419*9a0e4156SSadaf Ebrahimi 
420*9a0e4156SSadaf Ebrahimi 	switch(am) {
421*9a0e4156SSadaf Ebrahimi 		case MOS65XX_AM_IMP:
422*9a0e4156SSadaf Ebrahimi 		case MOS65XX_AM_REL:
423*9a0e4156SSadaf Ebrahimi 			break;
424*9a0e4156SSadaf Ebrahimi 		case MOS65XX_AM_IMM:
425*9a0e4156SSadaf Ebrahimi 			detail->mos65xx.operands[detail->mos65xx.op_count].type = MOS65XX_OP_IMM;
426*9a0e4156SSadaf Ebrahimi 			detail->mos65xx.operands[detail->mos65xx.op_count].mem = MI->Operands[0].ImmVal;
427*9a0e4156SSadaf Ebrahimi 			detail->mos65xx.op_count++;
428*9a0e4156SSadaf Ebrahimi 			break;
429*9a0e4156SSadaf Ebrahimi 		case MOS65XX_AM_ACC:
430*9a0e4156SSadaf Ebrahimi 			detail->mos65xx.operands[detail->mos65xx.op_count].type = MOS65XX_OP_REG;
431*9a0e4156SSadaf Ebrahimi 			detail->mos65xx.operands[detail->mos65xx.op_count].reg = MOS65XX_REG_ACC;
432*9a0e4156SSadaf Ebrahimi 			detail->mos65xx.op_count++;
433*9a0e4156SSadaf Ebrahimi 			break;
434*9a0e4156SSadaf Ebrahimi 		default:
435*9a0e4156SSadaf Ebrahimi 			detail->mos65xx.operands[detail->mos65xx.op_count].type = MOS65XX_OP_MEM;
436*9a0e4156SSadaf Ebrahimi 			detail->mos65xx.operands[detail->mos65xx.op_count].mem = MI->Operands[0].ImmVal;
437*9a0e4156SSadaf Ebrahimi 			detail->mos65xx.op_count++;
438*9a0e4156SSadaf Ebrahimi 			break;
439*9a0e4156SSadaf Ebrahimi 	}
440*9a0e4156SSadaf Ebrahimi }
441*9a0e4156SSadaf Ebrahimi #endif
442*9a0e4156SSadaf Ebrahimi 
MOS65XX_printInst(MCInst * MI,struct SStream * O,void * PrinterInfo)443*9a0e4156SSadaf Ebrahimi void MOS65XX_printInst(MCInst *MI, struct SStream *O, void *PrinterInfo)
444*9a0e4156SSadaf Ebrahimi {
445*9a0e4156SSadaf Ebrahimi #ifndef CAPSTONE_DIET
446*9a0e4156SSadaf Ebrahimi 	unsigned char opcode = MI->Opcode;
447*9a0e4156SSadaf Ebrahimi 	unsigned int value = MI->Operands[0].ImmVal;
448*9a0e4156SSadaf Ebrahimi 
449*9a0e4156SSadaf Ebrahimi 	SStream_concat0(O, InstructionInfoTable[OpInfoTable[MI->Opcode].ins].name);
450*9a0e4156SSadaf Ebrahimi 
451*9a0e4156SSadaf Ebrahimi 	switch (OpInfoTable[opcode].am) {
452*9a0e4156SSadaf Ebrahimi 		default:
453*9a0e4156SSadaf Ebrahimi 			break;
454*9a0e4156SSadaf Ebrahimi 
455*9a0e4156SSadaf Ebrahimi 		case MOS65XX_AM_IMP:
456*9a0e4156SSadaf Ebrahimi 			break;
457*9a0e4156SSadaf Ebrahimi 
458*9a0e4156SSadaf Ebrahimi 		case MOS65XX_AM_ACC:
459*9a0e4156SSadaf Ebrahimi 			SStream_concat(O, " a");
460*9a0e4156SSadaf Ebrahimi 			break;
461*9a0e4156SSadaf Ebrahimi 
462*9a0e4156SSadaf Ebrahimi 		case MOS65XX_AM_ABS:
463*9a0e4156SSadaf Ebrahimi 			SStream_concat(O, " $0x%04x", value);
464*9a0e4156SSadaf Ebrahimi 			break;
465*9a0e4156SSadaf Ebrahimi 
466*9a0e4156SSadaf Ebrahimi 		case MOS65XX_AM_IMM:
467*9a0e4156SSadaf Ebrahimi 			SStream_concat(O, " #$0x%02x", value);
468*9a0e4156SSadaf Ebrahimi 			break;
469*9a0e4156SSadaf Ebrahimi 
470*9a0e4156SSadaf Ebrahimi 		case MOS65XX_AM_ZP:
471*9a0e4156SSadaf Ebrahimi 			SStream_concat(O, " $0x%02x", value);
472*9a0e4156SSadaf Ebrahimi 			break;
473*9a0e4156SSadaf Ebrahimi 
474*9a0e4156SSadaf Ebrahimi 		case MOS65XX_AM_ABSX:
475*9a0e4156SSadaf Ebrahimi 			SStream_concat(O, " $0x%04x, x", value);
476*9a0e4156SSadaf Ebrahimi 			break;
477*9a0e4156SSadaf Ebrahimi 
478*9a0e4156SSadaf Ebrahimi 		case MOS65XX_AM_ABSY:
479*9a0e4156SSadaf Ebrahimi 			SStream_concat(O, " $0x%04x, y", value);
480*9a0e4156SSadaf Ebrahimi 			break;
481*9a0e4156SSadaf Ebrahimi 
482*9a0e4156SSadaf Ebrahimi 		case MOS65XX_AM_ZPX:
483*9a0e4156SSadaf Ebrahimi 			SStream_concat(O, " $0x%02x, x", value);
484*9a0e4156SSadaf Ebrahimi 			break;
485*9a0e4156SSadaf Ebrahimi 
486*9a0e4156SSadaf Ebrahimi 		case MOS65XX_AM_ZPY:
487*9a0e4156SSadaf Ebrahimi 			SStream_concat(O, " $0x%02x, y", value);
488*9a0e4156SSadaf Ebrahimi 			break;
489*9a0e4156SSadaf Ebrahimi 
490*9a0e4156SSadaf Ebrahimi 		case MOS65XX_AM_REL:
491*9a0e4156SSadaf Ebrahimi 			SStream_concat(O, " $0x%04x", MI->address + (signed char) value + 2);
492*9a0e4156SSadaf Ebrahimi 			break;
493*9a0e4156SSadaf Ebrahimi 
494*9a0e4156SSadaf Ebrahimi 		case MOS65XX_AM_IND:
495*9a0e4156SSadaf Ebrahimi 			SStream_concat(O, " ($0x%04x)", value);
496*9a0e4156SSadaf Ebrahimi 			break;
497*9a0e4156SSadaf Ebrahimi 
498*9a0e4156SSadaf Ebrahimi 		case MOS65XX_AM_INDX:
499*9a0e4156SSadaf Ebrahimi 			SStream_concat(O, " ($0x%02x, x)", value);
500*9a0e4156SSadaf Ebrahimi 			break;
501*9a0e4156SSadaf Ebrahimi 
502*9a0e4156SSadaf Ebrahimi 		case MOS65XX_AM_INDY:
503*9a0e4156SSadaf Ebrahimi 			SStream_concat(O, " ($0x%02x), y", value);
504*9a0e4156SSadaf Ebrahimi 			break;
505*9a0e4156SSadaf Ebrahimi 	}
506*9a0e4156SSadaf Ebrahimi #endif
507*9a0e4156SSadaf Ebrahimi }
508*9a0e4156SSadaf Ebrahimi 
MOS65XX_getInstruction(csh ud,const uint8_t * code,size_t code_len,MCInst * MI,uint16_t * size,uint64_t address,void * inst_info)509*9a0e4156SSadaf Ebrahimi bool MOS65XX_getInstruction(csh ud, const uint8_t *code, size_t code_len,
510*9a0e4156SSadaf Ebrahimi 							MCInst *MI, uint16_t *size, uint64_t address, void *inst_info)
511*9a0e4156SSadaf Ebrahimi {
512*9a0e4156SSadaf Ebrahimi 	unsigned char opcode;
513*9a0e4156SSadaf Ebrahimi 	unsigned char len;
514*9a0e4156SSadaf Ebrahimi 	mos65xx_insn ins;
515*9a0e4156SSadaf Ebrahimi 
516*9a0e4156SSadaf Ebrahimi 	if (code_len == 0) {
517*9a0e4156SSadaf Ebrahimi 		*size = 1;
518*9a0e4156SSadaf Ebrahimi 		return false;
519*9a0e4156SSadaf Ebrahimi 	}
520*9a0e4156SSadaf Ebrahimi 
521*9a0e4156SSadaf Ebrahimi 	opcode = code[0];
522*9a0e4156SSadaf Ebrahimi 	ins = OpInfoTable[opcode].ins;
523*9a0e4156SSadaf Ebrahimi 	if (ins == MOS65XX_INS_INVALID) {
524*9a0e4156SSadaf Ebrahimi 		*size = 1;
525*9a0e4156SSadaf Ebrahimi 		return false;
526*9a0e4156SSadaf Ebrahimi 	}
527*9a0e4156SSadaf Ebrahimi 
528*9a0e4156SSadaf Ebrahimi 	len = getInstructionLength(OpInfoTable[opcode].am);
529*9a0e4156SSadaf Ebrahimi 	if (code_len < len) {
530*9a0e4156SSadaf Ebrahimi 		*size = 1;
531*9a0e4156SSadaf Ebrahimi 		return false;
532*9a0e4156SSadaf Ebrahimi 	}
533*9a0e4156SSadaf Ebrahimi 
534*9a0e4156SSadaf Ebrahimi 	MI->address = address;
535*9a0e4156SSadaf Ebrahimi 	MI->Opcode = opcode;
536*9a0e4156SSadaf Ebrahimi 	MI->OpcodePub = ins;
537*9a0e4156SSadaf Ebrahimi 	MI->size = 0;
538*9a0e4156SSadaf Ebrahimi 
539*9a0e4156SSadaf Ebrahimi 	*size = len;
540*9a0e4156SSadaf Ebrahimi 	if (len == 2) {
541*9a0e4156SSadaf Ebrahimi 		MCOperand_CreateImm0(MI, code[1]);
542*9a0e4156SSadaf Ebrahimi 	} else
543*9a0e4156SSadaf Ebrahimi 	if (len == 3) {
544*9a0e4156SSadaf Ebrahimi 		MCOperand_CreateImm0(MI, (code[2]<<8) | code[1]);
545*9a0e4156SSadaf Ebrahimi 	}
546*9a0e4156SSadaf Ebrahimi #ifndef CAPSTONE_DIET
547*9a0e4156SSadaf Ebrahimi 	if (MI->flat_insn->detail) {
548*9a0e4156SSadaf Ebrahimi 		fillDetails(MI, opcode);
549*9a0e4156SSadaf Ebrahimi 	}
550*9a0e4156SSadaf Ebrahimi #endif
551*9a0e4156SSadaf Ebrahimi 
552*9a0e4156SSadaf Ebrahimi 	return true;
553*9a0e4156SSadaf Ebrahimi }
554*9a0e4156SSadaf Ebrahimi 
MOS65XX_insn_name(csh handle,unsigned int id)555*9a0e4156SSadaf Ebrahimi const char *MOS65XX_insn_name(csh handle, unsigned int id)
556*9a0e4156SSadaf Ebrahimi {
557*9a0e4156SSadaf Ebrahimi #ifdef CAPSTONE_DIET
558*9a0e4156SSadaf Ebrahimi 	return NULL;
559*9a0e4156SSadaf Ebrahimi #else
560*9a0e4156SSadaf Ebrahimi 	if (id >= ARR_SIZE(InstructionInfoTable)) {
561*9a0e4156SSadaf Ebrahimi 		return NULL;
562*9a0e4156SSadaf Ebrahimi 	}
563*9a0e4156SSadaf Ebrahimi 	return InstructionInfoTable[id].name;
564*9a0e4156SSadaf Ebrahimi #endif
565*9a0e4156SSadaf Ebrahimi }
566*9a0e4156SSadaf Ebrahimi 
MOS65XX_reg_name(csh handle,unsigned int reg)567*9a0e4156SSadaf Ebrahimi const char* MOS65XX_reg_name(csh handle, unsigned int reg)
568*9a0e4156SSadaf Ebrahimi {
569*9a0e4156SSadaf Ebrahimi #ifdef CAPSTONE_DIET
570*9a0e4156SSadaf Ebrahimi 	return NULL;
571*9a0e4156SSadaf Ebrahimi #else
572*9a0e4156SSadaf Ebrahimi 	if (reg >= ARR_SIZE(RegNames)) {
573*9a0e4156SSadaf Ebrahimi 		return NULL;
574*9a0e4156SSadaf Ebrahimi 	}
575*9a0e4156SSadaf Ebrahimi 	return RegNames[(int)reg];
576*9a0e4156SSadaf Ebrahimi #endif
577*9a0e4156SSadaf Ebrahimi }
578*9a0e4156SSadaf Ebrahimi 
MOS65XX_get_insn_id(cs_struct * h,cs_insn * insn,unsigned int id)579*9a0e4156SSadaf Ebrahimi void MOS65XX_get_insn_id(cs_struct *h, cs_insn *insn, unsigned int id)
580*9a0e4156SSadaf Ebrahimi {
581*9a0e4156SSadaf Ebrahimi 	if (id < 256) {
582*9a0e4156SSadaf Ebrahimi 		insn->id = OpInfoTable[id].ins;
583*9a0e4156SSadaf Ebrahimi 	}
584*9a0e4156SSadaf Ebrahimi }
585*9a0e4156SSadaf Ebrahimi 
MOS65XX_group_name(csh handle,unsigned int id)586*9a0e4156SSadaf Ebrahimi const char *MOS65XX_group_name(csh handle, unsigned int id)
587*9a0e4156SSadaf Ebrahimi {
588*9a0e4156SSadaf Ebrahimi #ifdef CAPSTONE_DIET
589*9a0e4156SSadaf Ebrahimi 	return NULL;
590*9a0e4156SSadaf Ebrahimi #else
591*9a0e4156SSadaf Ebrahimi 	if (id >= ARR_SIZE(GroupNames)) {
592*9a0e4156SSadaf Ebrahimi 		return NULL;
593*9a0e4156SSadaf Ebrahimi 	}
594*9a0e4156SSadaf Ebrahimi 	return GroupNames[(int)id];
595*9a0e4156SSadaf Ebrahimi #endif
596*9a0e4156SSadaf Ebrahimi }
597