Mercurial > repos > blastem
comparison 68kinst.h @ 744:fc68992cf18d
Merge windows branch with latest changes
author | Michael Pavone <pavone@retrodev.com> |
---|---|
date | Thu, 28 May 2015 21:19:55 -0700 |
parents | 8a3198c17207 |
children | 902c53d9c16f |
comparison
equal
deleted
inserted
replaced
743:cf78cb045fa4 | 744:fc68992cf18d |
---|---|
5 */ | 5 */ |
6 #ifndef M68KINST_H_ | 6 #ifndef M68KINST_H_ |
7 #define M68KINST_H_ | 7 #define M68KINST_H_ |
8 | 8 |
9 #include <stdint.h> | 9 #include <stdint.h> |
10 | |
11 #ifdef M68030 | |
12 #define M68020 | |
13 #endif | |
14 #ifdef M68020 | |
15 #define M68010 | |
16 #endif | |
10 | 17 |
11 typedef enum { | 18 typedef enum { |
12 BIT_MOVEP_IMMED = 0, | 19 BIT_MOVEP_IMMED = 0, |
13 MOVE_BYTE, | 20 MOVE_BYTE, |
14 MOVE_LONG, | 21 MOVE_LONG, |
95 M68K_TAS, | 102 M68K_TAS, |
96 M68K_TRAP, | 103 M68K_TRAP, |
97 M68K_TRAPV, | 104 M68K_TRAPV, |
98 M68K_TST, | 105 M68K_TST, |
99 M68K_UNLK, | 106 M68K_UNLK, |
100 M68K_INVALID | 107 M68K_INVALID, |
108 #ifdef M68010 | |
109 M68K_BKPT, | |
110 M68K_MOVE_FROM_CCR, | |
111 M68K_MOVEC, | |
112 M68K_MOVES, | |
113 M68K_RTD, | |
114 #endif | |
115 #ifdef M68020 | |
116 M68K_BFCHG, | |
117 M68K_BFCLR, | |
118 M68K_BFEXTS, | |
119 M68K_BFEXTU, | |
120 M68K_BFFFO, | |
121 M68K_BFINS, | |
122 M68K_BFSET, | |
123 M68K_BFTST, | |
124 M68K_CALLM, | |
125 M68K_CAS, | |
126 M68K_CAS2, | |
127 M68K_CHK2, | |
128 M68K_CMP2, | |
129 M68K_CP_BCC, | |
130 M68K_CP_DBCC, | |
131 M68K_CP_GEN, | |
132 M68K_CP_RESTORE, | |
133 M68K_CP_SAVE, | |
134 M68K_CP_SCC, | |
135 M68K_CP_TRAPCC, | |
136 M68K_DIVSL, | |
137 M68K_DIVUL, | |
138 M68K_EXTB, | |
139 M68K_PACK, | |
140 M68K_RTM, | |
141 M68K_TRAPCC, | |
142 M68K_UNPK, | |
143 #endif | |
101 } m68K_op; | 144 } m68K_op; |
102 | 145 |
103 typedef enum { | 146 typedef enum { |
104 VAR_NORMAL, | 147 VAR_NORMAL, |
105 VAR_QUICK, | 148 VAR_QUICK, |
128 MODE_AREG_INDEX_MEM, //bunch of relatively complicated modes | 171 MODE_AREG_INDEX_MEM, //bunch of relatively complicated modes |
129 MODE_PC_INDIRECT_ABS_IMMED, //Modes that use the program counter, an absolute address or immediate value | 172 MODE_PC_INDIRECT_ABS_IMMED, //Modes that use the program counter, an absolute address or immediate value |
130 //expanded values | 173 //expanded values |
131 MODE_AREG_INDEX_DISP8, | 174 MODE_AREG_INDEX_DISP8, |
132 #ifdef M68020 | 175 #ifdef M68020 |
133 MODE_AREG_INDEX_DISP32, | 176 MODE_AREG_INDEX_BASE_DISP, |
177 MODE_AREG_PREINDEX, | |
178 MODE_AREG_POSTINDEX, | |
179 MODE_AREG_MEM_INDIRECT, | |
180 MODE_AREG_BASE_DISP, | |
181 MODE_INDEX_BASE_DISP, | |
182 MODE_PREINDEX, | |
183 MODE_POSTINDEX, | |
184 MODE_MEM_INDIRECT, | |
185 MODE_BASE_DISP, | |
134 #endif | 186 #endif |
135 MODE_ABSOLUTE_SHORT, | 187 MODE_ABSOLUTE_SHORT, |
136 MODE_ABSOLUTE, | 188 MODE_ABSOLUTE, |
137 MODE_PC_DISPLACE, | 189 MODE_PC_DISPLACE, |
138 MODE_PC_INDEX_DISP8, | 190 MODE_PC_INDEX_DISP8, |
139 #ifdef M68020 | 191 #ifdef M68020 |
140 MODE_PC_INDEX_DISP32, | 192 MODE_PC_INDEX_BASE_DISP, |
193 MODE_PC_PREINDEX, | |
194 MODE_PC_POSTINDEX, | |
195 MODE_PC_MEM_INDIRECT, | |
196 MODE_PC_BASE_DISP, | |
197 MODE_ZPC_INDEX_BASE_DISP, | |
198 MODE_ZPC_PREINDEX, | |
199 MODE_ZPC_POSTINDEX, | |
200 MODE_ZPC_MEM_INDIRECT, | |
201 MODE_ZPC_BASE_DISP, | |
141 #endif | 202 #endif |
142 MODE_IMMEDIATE, | 203 MODE_IMMEDIATE, |
143 MODE_IMMEDIATE_WORD,//used to indicate an immediate operand that only uses a single extension word even for a long operation | 204 MODE_IMMEDIATE_WORD,//used to indicate an immediate operand that only uses a single extension word even for a long operation |
144 MODE_UNUSED | 205 MODE_UNUSED |
145 } m68k_addr_modes; | 206 } m68k_addr_modes; |
207 #ifdef M68020 | |
208 #define M68K_FLAG_BITFIELD 0x80 | |
209 #endif | |
146 | 210 |
147 typedef enum { | 211 typedef enum { |
148 COND_TRUE, | 212 COND_TRUE, |
149 COND_FALSE, | 213 COND_FALSE, |
150 COND_HIGH, | 214 COND_HIGH, |
161 COND_LESS, | 225 COND_LESS, |
162 COND_GREATER, | 226 COND_GREATER, |
163 COND_LESS_EQ | 227 COND_LESS_EQ |
164 } m68K_condition; | 228 } m68K_condition; |
165 | 229 |
230 #ifdef M68010 | |
231 typedef enum { | |
232 CR_SFC, | |
233 CR_DFC, | |
234 #ifdef M68020 | |
235 CR_CACR, | |
236 #endif | |
237 CR_USP, | |
238 CR_VBR, | |
239 #ifdef M68020 | |
240 CR_CAAR, | |
241 CR_MSP, | |
242 CR_ISP | |
243 #endif | |
244 } m68k_control_reg; | |
245 | |
246 #ifdef M68020 | |
247 #define MAX_HIGH_CR 0x804 | |
248 #define MAX_LOW_CR 0x002 | |
249 #else | |
250 #define MAX_HIGH_CR 0x801 | |
251 #define MAX_LOW_CR 0x001 | |
252 #endif | |
253 | |
254 #endif | |
255 | |
166 typedef struct { | 256 typedef struct { |
167 uint8_t addr_mode; | 257 #ifdef M68020 |
258 uint16_t bitfield; | |
259 #endif | |
260 uint8_t addr_mode; | |
168 union { | 261 union { |
169 struct { | 262 struct { |
170 uint8_t pri; | 263 uint8_t pri; |
171 uint8_t sec; | 264 uint8_t sec; |
265 #ifdef M68020 | |
266 uint8_t scale; | |
267 uint8_t disp_sizes; | |
268 #endif | |
172 int32_t displacement; | 269 int32_t displacement; |
270 #ifdef M68020 | |
271 int32_t outer_disp; | |
272 #endif | |
173 } regs; | 273 } regs; |
174 uint32_t immed; | 274 uint32_t immed; |
175 } params; | 275 } params; |
176 } m68k_op_info; | 276 } m68k_op_info; |
177 | 277 |
227 VECTOR_TRAP_13, | 327 VECTOR_TRAP_13, |
228 VECTOR_TRAP_14, | 328 VECTOR_TRAP_14, |
229 VECTOR_TRAP_15 | 329 VECTOR_TRAP_15 |
230 } m68k_vector; | 330 } m68k_vector; |
231 | 331 |
332 typedef int (*format_label_fun)(char * dst, uint32_t address, void * data); | |
333 | |
232 uint16_t * m68k_decode(uint16_t * istream, m68kinst * dst, uint32_t address); | 334 uint16_t * m68k_decode(uint16_t * istream, m68kinst * dst, uint32_t address); |
233 uint32_t m68k_branch_target(m68kinst * inst, uint32_t *dregs, uint32_t *aregs); | 335 uint32_t m68k_branch_target(m68kinst * inst, uint32_t *dregs, uint32_t *aregs); |
234 uint8_t m68k_is_branch(m68kinst * inst); | 336 uint8_t m68k_is_branch(m68kinst * inst); |
235 uint8_t m68k_is_noncall_branch(m68kinst * inst); | 337 uint8_t m68k_is_noncall_branch(m68kinst * inst); |
236 int m68k_disasm(m68kinst * decoded, char * dst); | 338 int m68k_disasm(m68kinst * decoded, char * dst); |
237 int m68k_disasm_labels(m68kinst * decoded, char * dst); | 339 int m68k_disasm_labels(m68kinst * decoded, char * dst, format_label_fun label_fun, void * data); |
238 | 340 int m68k_default_label_fun(char * dst, uint32_t address, void * data); |
239 #endif | 341 |
240 | 342 #endif |
343 |