Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
wine-mirror
GitHub Repository: wine-mirror/wine
Path: blob/master/libs/capstone/include/capstone/mos65xx.h
5971 views
1
#ifndef CAPSTONE_MOS65XX_H
2
#define CAPSTONE_MOS65XX_H
3
4
/* Capstone Disassembly Engine */
5
/* By Sebastian Macke <[email protected], 2018 */
6
7
#ifdef __cplusplus
8
extern "C" {
9
#endif
10
11
#include "platform.h"
12
13
/// MOS65XX registers and special registers
14
typedef enum mos65xx_reg {
15
MOS65XX_REG_INVALID = 0,
16
MOS65XX_REG_ACC, ///< accumulator
17
MOS65XX_REG_X, ///< X index register
18
MOS65XX_REG_Y, ///< Y index register
19
MOS65XX_REG_P, ///< status register
20
MOS65XX_REG_SP, ///< stack pointer register
21
MOS65XX_REG_DP, ///< direct page register
22
MOS65XX_REG_B, ///< data bank register
23
MOS65XX_REG_K, ///< program bank register
24
MOS65XX_REG_ENDING, // <-- mark the end of the list of registers
25
} mos65xx_reg;
26
27
/// MOS65XX Addressing Modes
28
typedef enum mos65xx_address_mode {
29
MOS65XX_AM_NONE = 0, ///< No address mode.
30
MOS65XX_AM_IMP, ///< implied addressing (no addressing mode)
31
MOS65XX_AM_ACC, ///< accumulator addressing
32
MOS65XX_AM_IMM, ///< 8/16 Bit immediate value
33
MOS65XX_AM_REL, ///< relative addressing used by branches
34
MOS65XX_AM_INT, ///< interrupt addressing
35
MOS65XX_AM_BLOCK, ///< memory block addressing
36
MOS65XX_AM_ZP, ///< zeropage addressing
37
MOS65XX_AM_ZP_X, ///< indexed zeropage addressing by the X index register
38
MOS65XX_AM_ZP_Y, ///< indexed zeropage addressing by the Y index register
39
MOS65XX_AM_ZP_REL, ///< zero page address, branch relative address
40
MOS65XX_AM_ZP_IND, ///< indirect zeropage addressing
41
MOS65XX_AM_ZP_X_IND, ///< indexed zeropage indirect addressing by the X index register
42
MOS65XX_AM_ZP_IND_Y, ///< indirect zeropage indexed addressing by the Y index register
43
MOS65XX_AM_ZP_IND_LONG, ///< zeropage indirect long addressing
44
MOS65XX_AM_ZP_IND_LONG_Y, ///< zeropage indirect long addressing indexed by Y register
45
MOS65XX_AM_ABS, ///< absolute addressing
46
MOS65XX_AM_ABS_X, ///< indexed absolute addressing by the X index register
47
MOS65XX_AM_ABS_Y, ///< indexed absolute addressing by the Y index register
48
MOS65XX_AM_ABS_IND, ///< absolute indirect addressing
49
MOS65XX_AM_ABS_X_IND, ///< indexed absolute indirect addressing by the X index register
50
MOS65XX_AM_ABS_IND_LONG, ///< absolute indirect long addressing
51
MOS65XX_AM_ABS_LONG, ///< absolute long address mode
52
MOS65XX_AM_ABS_LONG_X, ///< absolute long address mode, indexed by X register
53
MOS65XX_AM_SR, ///< stack relative addressing
54
MOS65XX_AM_SR_IND_Y, ///< indirect stack relative addressing indexed by the Y index register
55
} mos65xx_address_mode;
56
57
/// MOS65XX instruction
58
typedef enum mos65xx_insn {
59
MOS65XX_INS_INVALID = 0,
60
MOS65XX_INS_ADC,
61
MOS65XX_INS_AND,
62
MOS65XX_INS_ASL,
63
MOS65XX_INS_BBR,
64
MOS65XX_INS_BBS,
65
MOS65XX_INS_BCC,
66
MOS65XX_INS_BCS,
67
MOS65XX_INS_BEQ,
68
MOS65XX_INS_BIT,
69
MOS65XX_INS_BMI,
70
MOS65XX_INS_BNE,
71
MOS65XX_INS_BPL,
72
MOS65XX_INS_BRA,
73
MOS65XX_INS_BRK,
74
MOS65XX_INS_BRL,
75
MOS65XX_INS_BVC,
76
MOS65XX_INS_BVS,
77
MOS65XX_INS_CLC,
78
MOS65XX_INS_CLD,
79
MOS65XX_INS_CLI,
80
MOS65XX_INS_CLV,
81
MOS65XX_INS_CMP,
82
MOS65XX_INS_COP,
83
MOS65XX_INS_CPX,
84
MOS65XX_INS_CPY,
85
MOS65XX_INS_DEC,
86
MOS65XX_INS_DEX,
87
MOS65XX_INS_DEY,
88
MOS65XX_INS_EOR,
89
MOS65XX_INS_INC,
90
MOS65XX_INS_INX,
91
MOS65XX_INS_INY,
92
MOS65XX_INS_JML,
93
MOS65XX_INS_JMP,
94
MOS65XX_INS_JSL,
95
MOS65XX_INS_JSR,
96
MOS65XX_INS_LDA,
97
MOS65XX_INS_LDX,
98
MOS65XX_INS_LDY,
99
MOS65XX_INS_LSR,
100
MOS65XX_INS_MVN,
101
MOS65XX_INS_MVP,
102
MOS65XX_INS_NOP,
103
MOS65XX_INS_ORA,
104
MOS65XX_INS_PEA,
105
MOS65XX_INS_PEI,
106
MOS65XX_INS_PER,
107
MOS65XX_INS_PHA,
108
MOS65XX_INS_PHB,
109
MOS65XX_INS_PHD,
110
MOS65XX_INS_PHK,
111
MOS65XX_INS_PHP,
112
MOS65XX_INS_PHX,
113
MOS65XX_INS_PHY,
114
MOS65XX_INS_PLA,
115
MOS65XX_INS_PLB,
116
MOS65XX_INS_PLD,
117
MOS65XX_INS_PLP,
118
MOS65XX_INS_PLX,
119
MOS65XX_INS_PLY,
120
MOS65XX_INS_REP,
121
MOS65XX_INS_RMB,
122
MOS65XX_INS_ROL,
123
MOS65XX_INS_ROR,
124
MOS65XX_INS_RTI,
125
MOS65XX_INS_RTL,
126
MOS65XX_INS_RTS,
127
MOS65XX_INS_SBC,
128
MOS65XX_INS_SEC,
129
MOS65XX_INS_SED,
130
MOS65XX_INS_SEI,
131
MOS65XX_INS_SEP,
132
MOS65XX_INS_SMB,
133
MOS65XX_INS_STA,
134
MOS65XX_INS_STP,
135
MOS65XX_INS_STX,
136
MOS65XX_INS_STY,
137
MOS65XX_INS_STZ,
138
MOS65XX_INS_TAX,
139
MOS65XX_INS_TAY,
140
MOS65XX_INS_TCD,
141
MOS65XX_INS_TCS,
142
MOS65XX_INS_TDC,
143
MOS65XX_INS_TRB,
144
MOS65XX_INS_TSB,
145
MOS65XX_INS_TSC,
146
MOS65XX_INS_TSX,
147
MOS65XX_INS_TXA,
148
MOS65XX_INS_TXS,
149
MOS65XX_INS_TXY,
150
MOS65XX_INS_TYA,
151
MOS65XX_INS_TYX,
152
MOS65XX_INS_WAI,
153
MOS65XX_INS_WDM,
154
MOS65XX_INS_XBA,
155
MOS65XX_INS_XCE,
156
MOS65XX_INS_ENDING, // <-- mark the end of the list of instructions
157
} mos65xx_insn;
158
159
/// Group of MOS65XX instructions
160
typedef enum mos65xx_group_type {
161
MOS65XX_GRP_INVALID = 0, ///< CS_GRP_INVALID
162
MOS65XX_GRP_JUMP, ///< = CS_GRP_JUMP
163
MOS65XX_GRP_CALL, ///< = CS_GRP_RET
164
MOS65XX_GRP_RET, ///< = CS_GRP_RET
165
MOS65XX_GRP_INT, ///< = CS_GRP_INT
166
MOS65XX_GRP_IRET = 5, ///< = CS_GRP_IRET
167
MOS65XX_GRP_BRANCH_RELATIVE = 6, ///< = CS_GRP_BRANCH_RELATIVE
168
MOS65XX_GRP_ENDING,// <-- mark the end of the list of groups
169
} mos65xx_group_type;
170
171
/// Operand type for instruction's operands
172
typedef enum mos65xx_op_type {
173
MOS65XX_OP_INVALID = 0, ///< = CS_OP_INVALID (Uninitialized).
174
MOS65XX_OP_REG, ///< = CS_OP_REG (Register operand).
175
MOS65XX_OP_IMM, ///< = CS_OP_IMM (Immediate operand).
176
MOS65XX_OP_MEM, ///< = CS_OP_MEM (Memory operand).
177
} mos65xx_op_type;
178
179
/// Instruction operand
180
typedef struct cs_mos65xx_op {
181
mos65xx_op_type type; ///< operand type
182
union {
183
mos65xx_reg reg; ///< register value for REG operand
184
uint16_t imm; ///< immediate value for IMM operand
185
uint32_t mem; ///< address for MEM operand
186
};
187
} cs_mos65xx_op;
188
189
/// The MOS65XX address mode and it's operands
190
typedef struct cs_mos65xx {
191
mos65xx_address_mode am;
192
bool modifies_flags;
193
194
/// Number of operands of this instruction,
195
/// or 0 when instruction has no operand.
196
uint8_t op_count;
197
cs_mos65xx_op operands[3]; ///< operands for this instruction.
198
} cs_mos65xx;
199
200
#ifdef __cplusplus
201
}
202
#endif
203
204
#endif //CAPSTONE_MOS65XX_H
205
206