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