]> Shamusworld >> Repos - virtualjaguar/blob - src/m68kdasm.c
Adding 1.0.1/2 uncompressed tarballs to tags for historical purposes.
[virtualjaguar] / src / m68kdasm.c
1 /* ======================================================================== */\r
2 /* ========================= LICENSING & COPYRIGHT ======================== */\r
3 /* ======================================================================== */\r
4 /*\r
5  *                                  MUSASHI\r
6  *                                Version 3.3\r
7  *\r
8  * A portable Motorola M680x0 processor emulation engine.\r
9  * Copyright 1998-2001 Karl Stenerud.  All rights reserved.\r
10  *\r
11  * This code may be freely used for non-commercial purposes as long as this\r
12  * copyright notice remains unaltered in the source code and any binary files\r
13  * containing this code in compiled form.\r
14  *\r
15  * All other lisencing terms must be negotiated with the author\r
16  * (Karl Stenerud).\r
17  *\r
18  * The latest version of this code can be obtained at:\r
19  * http://kstenerud.cjb.net\r
20  */\r
21 \r
22 \r
23 \r
24 /* ======================================================================== */\r
25 /* ================================ INCLUDES ============================== */\r
26 /* ======================================================================== */\r
27 \r
28 #include <stdlib.h>\r
29 #include <stdio.h>\r
30 #include <string.h>\r
31 #include "m68k.h"\r
32 \r
33 /* ======================================================================== */\r
34 /* ============================ GENERAL DEFINES =========================== */\r
35 /* ======================================================================== */\r
36 \r
37 /* unsigned int and int must be at least 32 bits wide */\r
38 #undef uint\r
39 #define uint unsigned int\r
40 \r
41 /* Bit Isolation Functions */\r
42 #define BIT_0(A)  ((A) & 0x00000001)\r
43 #define BIT_1(A)  ((A) & 0x00000002)\r
44 #define BIT_2(A)  ((A) & 0x00000004)\r
45 #define BIT_3(A)  ((A) & 0x00000008)\r
46 #define BIT_4(A)  ((A) & 0x00000010)\r
47 #define BIT_5(A)  ((A) & 0x00000020)\r
48 #define BIT_6(A)  ((A) & 0x00000040)\r
49 #define BIT_7(A)  ((A) & 0x00000080)\r
50 #define BIT_8(A)  ((A) & 0x00000100)\r
51 #define BIT_9(A)  ((A) & 0x00000200)\r
52 #define BIT_A(A)  ((A) & 0x00000400)\r
53 #define BIT_B(A)  ((A) & 0x00000800)\r
54 #define BIT_C(A)  ((A) & 0x00001000)\r
55 #define BIT_D(A)  ((A) & 0x00002000)\r
56 #define BIT_E(A)  ((A) & 0x00004000)\r
57 #define BIT_F(A)  ((A) & 0x00008000)\r
58 #define BIT_10(A) ((A) & 0x00010000)\r
59 #define BIT_11(A) ((A) & 0x00020000)\r
60 #define BIT_12(A) ((A) & 0x00040000)\r
61 #define BIT_13(A) ((A) & 0x00080000)\r
62 #define BIT_14(A) ((A) & 0x00100000)\r
63 #define BIT_15(A) ((A) & 0x00200000)\r
64 #define BIT_16(A) ((A) & 0x00400000)\r
65 #define BIT_17(A) ((A) & 0x00800000)\r
66 #define BIT_18(A) ((A) & 0x01000000)\r
67 #define BIT_19(A) ((A) & 0x02000000)\r
68 #define BIT_1A(A) ((A) & 0x04000000)\r
69 #define BIT_1B(A) ((A) & 0x08000000)\r
70 #define BIT_1C(A) ((A) & 0x10000000)\r
71 #define BIT_1D(A) ((A) & 0x20000000)\r
72 #define BIT_1E(A) ((A) & 0x40000000)\r
73 #define BIT_1F(A) ((A) & 0x80000000)\r
74 \r
75 /* These are the CPU types understood by this disassembler */\r
76 #define TYPE_68000 1\r
77 #define TYPE_68010 2\r
78 #define TYPE_68020 4\r
79 #define TYPE_68030 8\r
80 #define TYPE_68040 16\r
81 \r
82 #define M68000_ONLY             TYPE_68000\r
83 \r
84 #define M68010_ONLY             TYPE_68010\r
85 #define M68010_LESS             (TYPE_68000 | TYPE_68010)\r
86 #define M68010_PLUS             (TYPE_68010 | TYPE_68020 | TYPE_68030 | TYPE_68040)\r
87 \r
88 #define M68020_ONLY     TYPE_68020\r
89 #define M68020_LESS     (TYPE_68010 | TYPE_68020)\r
90 #define M68020_PLUS             (TYPE_68020 | TYPE_68030 | TYPE_68040)\r
91 \r
92 #define M68030_ONLY     TYPE_68030\r
93 #define M68030_LESS     (TYPE_68010 | TYPE_68020 | TYPE_68030)\r
94 #define M68030_PLUS             (TYPE_68030 | TYPE_68040)\r
95 \r
96 #define M68040_PLUS             TYPE_68040\r
97 \r
98 \r
99 /* Extension word formats */\r
100 #define EXT_8BIT_DISPLACEMENT(A)          ((A)&0xff)\r
101 #define EXT_FULL(A)                       BIT_8(A)\r
102 #define EXT_EFFECTIVE_ZERO(A)             (((A)&0xe4) == 0xc4 || ((A)&0xe2) == 0xc0)\r
103 #define EXT_BASE_REGISTER_PRESENT(A)      (!BIT_7(A))\r
104 #define EXT_INDEX_REGISTER_PRESENT(A)     (!BIT_6(A))\r
105 #define EXT_INDEX_REGISTER(A)             (((A)>>12)&7)\r
106 #define EXT_INDEX_PRE_POST(A)             (EXT_INDEX_PRESENT(A) && (A)&3)\r
107 #define EXT_INDEX_PRE(A)                  (EXT_INDEX_PRESENT(A) && ((A)&7) < 4 && ((A)&7) != 0)\r
108 #define EXT_INDEX_POST(A)                 (EXT_INDEX_PRESENT(A) && ((A)&7) > 4)\r
109 #define EXT_INDEX_SCALE(A)                (((A)>>9)&3)\r
110 #define EXT_INDEX_LONG(A)                 BIT_B(A)\r
111 #define EXT_INDEX_AR(A)                   BIT_F(A)\r
112 #define EXT_BASE_DISPLACEMENT_PRESENT(A)  (((A)&0x30) > 0x10)\r
113 #define EXT_BASE_DISPLACEMENT_WORD(A)     (((A)&0x30) == 0x20)\r
114 #define EXT_BASE_DISPLACEMENT_LONG(A)     (((A)&0x30) == 0x30)\r
115 #define EXT_OUTER_DISPLACEMENT_PRESENT(A) (((A)&3) > 1 && ((A)&0x47) < 0x44)\r
116 #define EXT_OUTER_DISPLACEMENT_WORD(A)    (((A)&3) == 2 && ((A)&0x47) < 0x44)\r
117 #define EXT_OUTER_DISPLACEMENT_LONG(A)    (((A)&3) == 3 && ((A)&0x47) < 0x44)\r
118 \r
119 \r
120 \r
121 /* ======================================================================== */\r
122 /* =============================== PROTOTYPES ============================= */\r
123 /* ======================================================================== */\r
124 \r
125 /* Read data at the PC and increment PC */\r
126 uint  read_imm_8(void);\r
127 uint  read_imm_16(void);\r
128 uint  read_imm_32(void);\r
129 \r
130 /* Read data at the PC but don't imcrement the PC */\r
131 uint  peek_imm_8(void);\r
132 uint  peek_imm_16(void);\r
133 uint  peek_imm_32(void);\r
134 \r
135 /* make signed integers 100% portably */\r
136 static int make_int_8(int value);\r
137 static int make_int_16(int value);\r
138 \r
139 /* make a string of a hex value */\r
140 static char* make_signed_hex_str_8(uint val);\r
141 static char* make_signed_hex_str_16(uint val);\r
142 static char* make_signed_hex_str_32(uint val);\r
143 \r
144 /* make string of ea mode */\r
145 static char* get_ea_mode_str(uint instruction, uint size);\r
146 \r
147 char* get_ea_mode_str_8(uint instruction);\r
148 char* get_ea_mode_str_16(uint instruction);\r
149 char* get_ea_mode_str_32(uint instruction);\r
150 \r
151 /* make string of immediate value */\r
152 static char* get_imm_str_s(uint size);\r
153 static char* get_imm_str_u(uint size);\r
154 \r
155 char* get_imm_str_s8(void);\r
156 char* get_imm_str_s16(void);\r
157 char* get_imm_str_s32(void);\r
158 \r
159 /* Stuff to build the opcode handler jump table */\r
160 static void  build_opcode_table(void);\r
161 static int   valid_ea(uint opcode, uint mask);\r
162 static int DECL_SPEC compare_nof_true_bits(const void *aptr, const void *bptr);\r
163 \r
164 /* used to build opcode handler jump table */\r
165 typedef struct\r
166 {\r
167         void (*opcode_handler)(void); /* handler function */\r
168         uint mask;                    /* mask on opcode */\r
169         uint match;                   /* what to match after masking */\r
170         uint ea_mask;                 /* what ea modes are allowed */\r
171 } opcode_struct;\r
172 \r
173 \r
174 \r
175 /* ======================================================================== */\r
176 /* ================================= DATA ================================= */\r
177 /* ======================================================================== */\r
178 \r
179 /* Opcode handler jump table */\r
180 static void (*g_instruction_table[0x10000])(void);\r
181 /* Flag if disassembler initialized */\r
182 static int  g_initialized = 0;\r
183 \r
184 /* Address mask to simulate address lines */\r
185 static unsigned int g_address_mask = 0xffffffff;\r
186 \r
187 static char g_dasm_str[100]; /* string to hold disassembly */\r
188 static char g_helper_str[100]; /* string to hold helpful info */\r
189 static uint g_cpu_pc;        /* program counter */\r
190 static uint g_cpu_ir;        /* instruction register */\r
191 static uint g_cpu_type;\r
192 \r
193 /* used by ops like asr, ror, addq, etc */\r
194 static uint g_3bit_qdata_table[8] = {8, 1, 2, 3, 4, 5, 6, 7};\r
195 \r
196 static uint g_5bit_data_table[32] =\r
197 {\r
198         32,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15,\r
199         16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31\r
200 };\r
201 \r
202 static char* g_cc[16] =\r
203 {"t", "f", "hi", "ls", "cc", "cs", "ne", "eq", "vc", "vs", "pl", "mi", "ge", "lt", "gt", "le"};\r
204 \r
205 static char* g_cpcc[64] =\r
206 {/* 000    001    010    011    100    101    110    111 */\r
207           "f",  "eq", "ogt", "oge", "olt", "ole", "ogl",  "or", /* 000 */\r
208          "un", "ueq", "ugt", "uge", "ult", "ule",  "ne",   "t", /* 001 */\r
209          "sf", "seq",  "gt",  "ge",  "lt",  "le",  "gl"  "gle", /* 010 */\r
210   "ngle", "ngl", "nle", "nlt", "nge", "ngt", "sne",  "st", /* 011 */\r
211           "?",   "?",   "?",   "?",   "?",   "?",   "?",   "?", /* 100 */\r
212           "?",   "?",   "?",   "?",   "?",   "?",   "?",   "?", /* 101 */\r
213           "?",   "?",   "?",   "?",   "?",   "?",   "?",   "?", /* 110 */\r
214           "?",   "?",   "?",   "?",   "?",   "?",   "?",   "?"  /* 111 */\r
215 };\r
216 \r
217 \r
218 /* ======================================================================== */\r
219 /* =========================== UTILITY FUNCTIONS ========================== */\r
220 /* ======================================================================== */\r
221 \r
222 #define LIMIT_CPU_TYPES(ALLOWED_CPU_TYPES)      \\r
223         if(!(g_cpu_type & ALLOWED_CPU_TYPES))   \\r
224         {                                                                               \\r
225                 d68000_illegal();                                       \\r
226                 return;                                                         \\r
227         }\r
228 \r
229 #define read_imm_8()  (m68k_read_disassembler_16(((g_cpu_pc+=2)-2)&g_address_mask)&0xff)\r
230 #define read_imm_16() m68k_read_disassembler_16(((g_cpu_pc+=2)-2)&g_address_mask)\r
231 #define read_imm_32() m68k_read_disassembler_32(((g_cpu_pc+=4)-4)&g_address_mask)\r
232 \r
233 #define peek_imm_8()  (m68k_read_disassembler_16(g_cpu_pc & g_address_mask)&0xff)\r
234 #define peek_imm_16() m68k_read_disassembler_16(g_cpu_pc & g_address_mask)\r
235 #define peek_imm_32() m68k_read_disassembler_32(g_cpu_pc & g_address_mask)\r
236 \r
237 /* Fake a split interface */\r
238 #define get_ea_mode_str_8(instruction) get_ea_mode_str(instruction, 0)\r
239 #define get_ea_mode_str_16(instruction) get_ea_mode_str(instruction, 1)\r
240 #define get_ea_mode_str_32(instruction) get_ea_mode_str(instruction, 2)\r
241 \r
242 #define get_imm_str_s8() get_imm_str_s(0)\r
243 #define get_imm_str_s16() get_imm_str_s(1)\r
244 #define get_imm_str_s32() get_imm_str_s(2)\r
245 \r
246 #define get_imm_str_u8() get_imm_str_u(0)\r
247 #define get_imm_str_u16() get_imm_str_u(1)\r
248 #define get_imm_str_u32() get_imm_str_u(2)\r
249 \r
250 \r
251 /* 100% portable signed int generators */\r
252 static int make_int_8(int value)\r
253 {\r
254         return (value & 0x80) ? value | ~0xff : value & 0xff;\r
255 }\r
256 \r
257 static int make_int_16(int value)\r
258 {\r
259         return (value & 0x8000) ? value | ~0xffff : value & 0xffff;\r
260 }\r
261 \r
262 \r
263 /* Get string representation of hex values */\r
264 static char* make_signed_hex_str_8(uint val)\r
265 {\r
266         static char str[20];\r
267 \r
268         val &= 0xff;\r
269 \r
270         if(val == 0x80)\r
271                 sprintf(str, "-$80");\r
272         else if(val & 0x80)\r
273                 sprintf(str, "-$%x", (0-val) & 0x7f);\r
274         else\r
275                 sprintf(str, "$%x", val & 0x7f);\r
276 \r
277         return str;\r
278 }\r
279 \r
280 static char* make_signed_hex_str_16(uint val)\r
281 {\r
282         static char str[20];\r
283 \r
284         val &= 0xffff;\r
285 \r
286         if(val == 0x8000)\r
287                 sprintf(str, "-$8000");\r
288         else if(val & 0x8000)\r
289                 sprintf(str, "-$%x", (0-val) & 0x7fff);\r
290         else\r
291                 sprintf(str, "$%x", val & 0x7fff);\r
292 \r
293         return str;\r
294 }\r
295 \r
296 static char* make_signed_hex_str_32(uint val)\r
297 {\r
298         static char str[20];\r
299 \r
300         val &= 0xffffffff;\r
301 \r
302         if(val == 0x80000000)\r
303                 sprintf(str, "-$80000000");\r
304         else if(val & 0x80000000)\r
305                 sprintf(str, "-$%x", (0-val) & 0x7fffffff);\r
306         else\r
307                 sprintf(str, "$%x", val & 0x7fffffff);\r
308 \r
309         return str;\r
310 }\r
311 \r
312 \r
313 /* make string of immediate value */\r
314 static char* get_imm_str_s(uint size)\r
315 {\r
316         static char str[15];\r
317         if(size == 0)\r
318                 sprintf(str, "#%s", make_signed_hex_str_8(read_imm_8()));\r
319         else if(size == 1)\r
320                 sprintf(str, "#%s", make_signed_hex_str_16(read_imm_16()));\r
321         else\r
322                 sprintf(str, "#%s", make_signed_hex_str_32(read_imm_32()));\r
323         return str;\r
324 }\r
325 \r
326 static char* get_imm_str_u(uint size)\r
327 {\r
328         static char str[15];\r
329         if(size == 0)\r
330                 sprintf(str, "#$%x", read_imm_8() & 0xff);\r
331         else if(size == 1)\r
332                 sprintf(str, "#$%x", read_imm_16() & 0xffff);\r
333         else\r
334                 sprintf(str, "#$%x", read_imm_32() & 0xffffffff);\r
335         return str;\r
336 }\r
337 \r
338 /* Make string of effective address mode */\r
339 static char* get_ea_mode_str(uint instruction, uint size)\r
340 {\r
341         static char b1[64];\r
342         static char b2[64];\r
343         static char* mode = b2;\r
344         uint extension;\r
345         uint base;\r
346         uint outer;\r
347         char base_reg[4];\r
348         char index_reg[8];\r
349         uint preindex;\r
350         uint postindex;\r
351         uint comma = 0;\r
352         uint temp_value;\r
353 \r
354         /* Switch buffers so we don't clobber on a double-call to this function */\r
355         mode = mode == b1 ? b2 : b1;\r
356 \r
357         switch(instruction & 0x3f)\r
358         {\r
359                 case 0x00: case 0x01: case 0x02: case 0x03: case 0x04: case 0x05: case 0x06: case 0x07:\r
360                 /* data register direct */\r
361                         sprintf(mode, "D%d", instruction&7);\r
362                         break;\r
363                 case 0x08: case 0x09: case 0x0a: case 0x0b: case 0x0c: case 0x0d: case 0x0e: case 0x0f:\r
364                 /* address register direct */\r
365                         sprintf(mode, "A%d", instruction&7);\r
366                         break;\r
367                 case 0x10: case 0x11: case 0x12: case 0x13: case 0x14: case 0x15: case 0x16: case 0x17:\r
368                 /* address register indirect */\r
369                         sprintf(mode, "(A%d)", instruction&7);\r
370                         break;\r
371                 case 0x18: case 0x19: case 0x1a: case 0x1b: case 0x1c: case 0x1d: case 0x1e: case 0x1f:\r
372                 /* address register indirect with postincrement */\r
373                         sprintf(mode, "(A%d)+", instruction&7);\r
374                         break;\r
375                 case 0x20: case 0x21: case 0x22: case 0x23: case 0x24: case 0x25: case 0x26: case 0x27:\r
376                 /* address register indirect with predecrement */\r
377                         sprintf(mode, "-(A%d)", instruction&7);\r
378                         break;\r
379                 case 0x28: case 0x29: case 0x2a: case 0x2b: case 0x2c: case 0x2d: case 0x2e: case 0x2f:\r
380                 /* address register indirect with displacement*/\r
381                         sprintf(mode, "(%s,A%d)", make_signed_hex_str_16(read_imm_16()), instruction&7);\r
382                         break;\r
383                 case 0x30: case 0x31: case 0x32: case 0x33: case 0x34: case 0x35: case 0x36: case 0x37:\r
384                 /* address register indirect with index */\r
385                         extension = read_imm_16();\r
386 \r
387                         if(EXT_FULL(extension))\r
388                         {\r
389                                 if(EXT_EFFECTIVE_ZERO(extension))\r
390                                 {\r
391                                         strcpy(mode, "0");\r
392                                         break;\r
393                                 }\r
394                                 base = EXT_BASE_DISPLACEMENT_PRESENT(extension) ? (EXT_BASE_DISPLACEMENT_LONG(extension) ? read_imm_32() : read_imm_16()) : 0;\r
395                                 outer = EXT_OUTER_DISPLACEMENT_PRESENT(extension) ? (EXT_OUTER_DISPLACEMENT_LONG(extension) ? read_imm_32() : read_imm_16()) : 0;\r
396                                 if(EXT_BASE_REGISTER_PRESENT(extension))\r
397                                         sprintf(base_reg, "A%d", instruction&7);\r
398                                 else\r
399                                         *base_reg = 0;\r
400                                 if(EXT_INDEX_REGISTER_PRESENT(extension))\r
401                                 {\r
402                                         sprintf(index_reg, "%c%d.%c", EXT_INDEX_AR(extension) ? 'A' : 'D', EXT_INDEX_REGISTER(extension), EXT_INDEX_LONG(extension) ? 'l' : 'w');\r
403                                         if(EXT_INDEX_SCALE(extension))\r
404                                                 sprintf(index_reg+strlen(index_reg), "*%d", 1 << EXT_INDEX_SCALE(extension));\r
405                                 }\r
406                                 else\r
407                                         *index_reg = 0;\r
408                                 preindex = (extension&7) > 0 && (extension&7) < 4;\r
409                                 postindex = (extension&7) > 4;\r
410 \r
411                                 strcpy(mode, "(");\r
412                                 if(preindex || postindex)\r
413                                         strcat(mode, "[");\r
414                                 if(base)\r
415                                 {\r
416                                         strcat(mode, make_signed_hex_str_16(base));\r
417                                         comma = 1;\r
418                                 }\r
419                                 if(*base_reg)\r
420                                 {\r
421                                         if(comma)\r
422                                                 strcat(mode, ",");\r
423                                         strcat(mode, base_reg);\r
424                                         comma = 1;\r
425                                 }\r
426                                 if(postindex)\r
427                                 {\r
428                                         strcat(mode, "]");\r
429                                         comma = 1;\r
430                                 }\r
431                                 if(*index_reg)\r
432                                 {\r
433                                         if(comma)\r
434                                                 strcat(mode, ",");\r
435                                         strcat(mode, index_reg);\r
436                                         comma = 1;\r
437                                 }\r
438                                 if(preindex)\r
439                                 {\r
440                                         strcat(mode, "]");\r
441                                         comma = 1;\r
442                                 }\r
443                                 if(outer)\r
444                                 {\r
445                                         if(comma)\r
446                                                 strcat(mode, ",");\r
447                                         strcat(mode, make_signed_hex_str_16(outer));\r
448                                 }\r
449                                 strcat(mode, ")");\r
450                                 break;\r
451                         }\r
452 \r
453                         if(EXT_8BIT_DISPLACEMENT(extension) == 0)\r
454                                 sprintf(mode, "(A%d,%c%d.%c", instruction&7, EXT_INDEX_AR(extension) ? 'A' : 'D', EXT_INDEX_REGISTER(extension), EXT_INDEX_LONG(extension) ? 'l' : 'w');\r
455                         else\r
456                                 sprintf(mode, "(%s,A%d,%c%d.%c", make_signed_hex_str_8(extension), instruction&7, EXT_INDEX_AR(extension) ? 'A' : 'D', EXT_INDEX_REGISTER(extension), EXT_INDEX_LONG(extension) ? 'l' : 'w');\r
457                         if(EXT_INDEX_SCALE(extension))\r
458                                 sprintf(mode+strlen(mode), "*%d", 1 << EXT_INDEX_SCALE(extension));\r
459                         strcat(mode, ")");\r
460                         break;\r
461                 case 0x38:\r
462                 /* absolute short address */\r
463                         sprintf(mode, "$%x.w", read_imm_16());\r
464                         break;\r
465                 case 0x39:\r
466                 /* absolute long address */\r
467                         sprintf(mode, "$%x.l", read_imm_32());\r
468                         break;\r
469                 case 0x3a:\r
470                 /* program counter with displacement */\r
471                         temp_value = read_imm_16();\r
472                         sprintf(mode, "(%s,PC)", make_signed_hex_str_16(temp_value));\r
473                         sprintf(g_helper_str, "; ($%x)", (make_int_16(temp_value) + g_cpu_pc-2) & 0xffffffff);\r
474                         break;\r
475                 case 0x3b:\r
476                 /* program counter with index */\r
477                         extension = read_imm_16();\r
478 \r
479                         if(EXT_FULL(extension))\r
480                         {\r
481                                 if(EXT_EFFECTIVE_ZERO(extension))\r
482                                 {\r
483                                         strcpy(mode, "0");\r
484                                         break;\r
485                                 }\r
486                                 base = EXT_BASE_DISPLACEMENT_PRESENT(extension) ? (EXT_BASE_DISPLACEMENT_LONG(extension) ? read_imm_32() : read_imm_16()) : 0;\r
487                                 outer = EXT_OUTER_DISPLACEMENT_PRESENT(extension) ? (EXT_OUTER_DISPLACEMENT_LONG(extension) ? read_imm_32() : read_imm_16()) : 0;\r
488                                 if(EXT_BASE_REGISTER_PRESENT(extension))\r
489                                         strcpy(base_reg, "PC");\r
490                                 else\r
491                                         *base_reg = 0;\r
492                                 if(EXT_INDEX_REGISTER_PRESENT(extension))\r
493                                 {\r
494                                         sprintf(index_reg, "%c%d.%c", EXT_INDEX_AR(extension) ? 'A' : 'D', EXT_INDEX_REGISTER(extension), EXT_INDEX_LONG(extension) ? 'l' : 'w');\r
495                                         if(EXT_INDEX_SCALE(extension))\r
496                                                 sprintf(index_reg+strlen(index_reg), "*%d", 1 << EXT_INDEX_SCALE(extension));\r
497                                 }\r
498                                 else\r
499                                         *index_reg = 0;\r
500                                 preindex = (extension&7) > 0 && (extension&7) < 4;\r
501                                 postindex = (extension&7) > 4;\r
502 \r
503                                 strcpy(mode, "(");\r
504                                 if(preindex || postindex)\r
505                                         strcat(mode, "[");\r
506                                 if(base)\r
507                                 {\r
508                                         strcat(mode, make_signed_hex_str_16(base));\r
509                                         comma = 1;\r
510                                 }\r
511                                 if(*base_reg)\r
512                                 {\r
513                                         if(comma)\r
514                                                 strcat(mode, ",");\r
515                                         strcat(mode, base_reg);\r
516                                         comma = 1;\r
517                                 }\r
518                                 if(postindex)\r
519                                 {\r
520                                         strcat(mode, "]");\r
521                                         comma = 1;\r
522                                 }\r
523                                 if(*index_reg)\r
524                                 {\r
525                                         if(comma)\r
526                                                 strcat(mode, ",");\r
527                                         strcat(mode, index_reg);\r
528                                         comma = 1;\r
529                                 }\r
530                                 if(preindex)\r
531                                 {\r
532                                         strcat(mode, "]");\r
533                                         comma = 1;\r
534                                 }\r
535                                 if(outer)\r
536                                 {\r
537                                         if(comma)\r
538                                                 strcat(mode, ",");\r
539                                         strcat(mode, make_signed_hex_str_16(outer));\r
540                                 }\r
541                                 strcat(mode, ")");\r
542                                 break;\r
543                         }\r
544 \r
545                         if(EXT_8BIT_DISPLACEMENT(extension) == 0)\r
546                                 sprintf(mode, "(PC,%c%d.%c", EXT_INDEX_AR(extension) ? 'A' : 'D', EXT_INDEX_REGISTER(extension), EXT_INDEX_LONG(extension) ? 'l' : 'w');\r
547                         else\r
548                                 sprintf(mode, "(%s,PC,%c%d.%c", make_signed_hex_str_8(extension), EXT_INDEX_AR(extension) ? 'A' : 'D', EXT_INDEX_REGISTER(extension), EXT_INDEX_LONG(extension) ? 'l' : 'w');\r
549                         if(EXT_INDEX_SCALE(extension))\r
550                                 sprintf(mode+strlen(mode), "*%d", 1 << EXT_INDEX_SCALE(extension));\r
551                         strcat(mode, ")");\r
552                         break;\r
553                 case 0x3c:\r
554                 /* Immediate */\r
555                         sprintf(mode, "%s", get_imm_str_u(size));\r
556                         break;\r
557                 default:\r
558                         sprintf(mode, "INVALID %x", instruction & 0x3f);\r
559         }\r
560         return mode;\r
561 }\r
562 \r
563 \r
564 \r
565 /* ======================================================================== */\r
566 /* ========================= INSTRUCTION HANDLERS ========================= */\r
567 /* ======================================================================== */\r
568 /* Instruction handler function names follow this convention:\r
569  *\r
570  * d68000_NAME_EXTENSIONS(void)\r
571  * where NAME is the name of the opcode it handles and EXTENSIONS are any\r
572  * extensions for special instances of that opcode.\r
573  *\r
574  * Examples:\r
575  *   d68000_add_er_8(): add opcode, from effective address to register,\r
576  *                      size = byte\r
577  *\r
578  *   d68000_asr_s_8(): arithmetic shift right, static count, size = byte\r
579  *\r
580  *\r
581  * Common extensions:\r
582  * 8   : size = byte\r
583  * 16  : size = word\r
584  * 32  : size = long\r
585  * rr  : register to register\r
586  * mm  : memory to memory\r
587  * r   : register\r
588  * s   : static\r
589  * er  : effective address -> register\r
590  * re  : register -> effective address\r
591  * ea  : using effective address mode of operation\r
592  * d   : data register direct\r
593  * a   : address register direct\r
594  * ai  : address register indirect\r
595  * pi  : address register indirect with postincrement\r
596  * pd  : address register indirect with predecrement\r
597  * di  : address register indirect with displacement\r
598  * ix  : address register indirect with index\r
599  * aw  : absolute word\r
600  * al  : absolute long\r
601  */\r
602 \r
603 static void d68000_illegal(void)\r
604 {\r
605         sprintf(g_dasm_str, "dc.w $%04x; ILLEGAL", g_cpu_ir);\r
606 }\r
607 \r
608 static void d68000_1010(void)\r
609 {\r
610         sprintf(g_dasm_str, "dc.w    $%04x; opcode 1010", g_cpu_ir);\r
611 }\r
612 \r
613 \r
614 static void d68000_1111(void)\r
615 {\r
616         sprintf(g_dasm_str, "dc.w    $%04x; opcode 1111", g_cpu_ir);\r
617 }\r
618 \r
619 \r
620 static void d68000_abcd_rr(void)\r
621 {\r
622         sprintf(g_dasm_str, "abcd    D%d, D%d", g_cpu_ir&7, (g_cpu_ir>>9)&7);\r
623 }\r
624 \r
625 \r
626 static void d68000_abcd_mm(void)\r
627 {\r
628         sprintf(g_dasm_str, "abcd    -(A%d), -(A%d)", g_cpu_ir&7, (g_cpu_ir>>9)&7);\r
629 }\r
630 \r
631 static void d68000_add_er_8(void)\r
632 {\r
633         sprintf(g_dasm_str, "add.b   %s, D%d", get_ea_mode_str_8(g_cpu_ir), (g_cpu_ir>>9)&7);\r
634 }\r
635 \r
636 \r
637 static void d68000_add_er_16(void)\r
638 {\r
639         sprintf(g_dasm_str, "add.w   %s, D%d", get_ea_mode_str_16(g_cpu_ir), (g_cpu_ir>>9)&7);\r
640 }\r
641 \r
642 static void d68000_add_er_32(void)\r
643 {\r
644         sprintf(g_dasm_str, "add.l   %s, D%d", get_ea_mode_str_32(g_cpu_ir), (g_cpu_ir>>9)&7);\r
645 }\r
646 \r
647 static void d68000_add_re_8(void)\r
648 {\r
649         sprintf(g_dasm_str, "add.b   D%d, %s", (g_cpu_ir>>9)&7, get_ea_mode_str_8(g_cpu_ir));\r
650 }\r
651 \r
652 static void d68000_add_re_16(void)\r
653 {\r
654         sprintf(g_dasm_str, "add.w   D%d, %s", (g_cpu_ir>>9)&7, get_ea_mode_str_16(g_cpu_ir));\r
655 }\r
656 \r
657 static void d68000_add_re_32(void)\r
658 {\r
659         sprintf(g_dasm_str, "add.l   D%d, %s", (g_cpu_ir>>9)&7, get_ea_mode_str_32(g_cpu_ir));\r
660 }\r
661 \r
662 static void d68000_adda_16(void)\r
663 {\r
664         sprintf(g_dasm_str, "adda.w  %s, A%d", get_ea_mode_str_16(g_cpu_ir), (g_cpu_ir>>9)&7);\r
665 }\r
666 \r
667 static void d68000_adda_32(void)\r
668 {\r
669         sprintf(g_dasm_str, "adda.l  %s, A%d", get_ea_mode_str_32(g_cpu_ir), (g_cpu_ir>>9)&7);\r
670 }\r
671 \r
672 static void d68000_addi_8(void)\r
673 {\r
674         char* str = get_imm_str_s8();\r
675         sprintf(g_dasm_str, "addi.b  %s, %s", str, get_ea_mode_str_8(g_cpu_ir));\r
676 }\r
677 \r
678 static void d68000_addi_16(void)\r
679 {\r
680         char* str = get_imm_str_s16();\r
681         sprintf(g_dasm_str, "addi.w  %s, %s", str, get_ea_mode_str_16(g_cpu_ir));\r
682 }\r
683 \r
684 static void d68000_addi_32(void)\r
685 {\r
686         char* str = get_imm_str_s32();\r
687         sprintf(g_dasm_str, "addi.l  %s, %s", str, get_ea_mode_str_32(g_cpu_ir));\r
688 }\r
689 \r
690 static void d68000_addq_8(void)\r
691 {\r
692         sprintf(g_dasm_str, "addq.b  #%d, %s", g_3bit_qdata_table[(g_cpu_ir>>9)&7], get_ea_mode_str_8(g_cpu_ir));\r
693 }\r
694 \r
695 static void d68000_addq_16(void)\r
696 {\r
697         sprintf(g_dasm_str, "addq.w  #%d, %s", g_3bit_qdata_table[(g_cpu_ir>>9)&7], get_ea_mode_str_16(g_cpu_ir));\r
698 }\r
699 \r
700 static void d68000_addq_32(void)\r
701 {\r
702         sprintf(g_dasm_str, "addq.l  #%d, %s", g_3bit_qdata_table[(g_cpu_ir>>9)&7], get_ea_mode_str_32(g_cpu_ir));\r
703 }\r
704 \r
705 static void d68000_addx_rr_8(void)\r
706 {\r
707         sprintf(g_dasm_str, "addx.b  D%d, D%d", g_cpu_ir&7, (g_cpu_ir>>9)&7);\r
708 }\r
709 \r
710 static void d68000_addx_rr_16(void)\r
711 {\r
712         sprintf(g_dasm_str, "addx.w  D%d, D%d", g_cpu_ir&7, (g_cpu_ir>>9)&7);\r
713 }\r
714 \r
715 static void d68000_addx_rr_32(void)\r
716 {\r
717         sprintf(g_dasm_str, "addx.l  D%d, D%d", g_cpu_ir&7, (g_cpu_ir>>9)&7);\r
718 }\r
719 \r
720 static void d68000_addx_mm_8(void)\r
721 {\r
722         sprintf(g_dasm_str, "addx.b  -(A%d), -(A%d)", g_cpu_ir&7, (g_cpu_ir>>9)&7);\r
723 }\r
724 \r
725 static void d68000_addx_mm_16(void)\r
726 {\r
727         sprintf(g_dasm_str, "addx.w  -(A%d), -(A%d)", g_cpu_ir&7, (g_cpu_ir>>9)&7);\r
728 }\r
729 \r
730 static void d68000_addx_mm_32(void)\r
731 {\r
732         sprintf(g_dasm_str, "addx.l  -(A%d), -(A%d)", g_cpu_ir&7, (g_cpu_ir>>9)&7);\r
733 }\r
734 \r
735 static void d68000_and_er_8(void)\r
736 {\r
737         sprintf(g_dasm_str, "and.b   %s, D%d", get_ea_mode_str_8(g_cpu_ir), (g_cpu_ir>>9)&7);\r
738 }\r
739 \r
740 static void d68000_and_er_16(void)\r
741 {\r
742         sprintf(g_dasm_str, "and.w   %s, D%d", get_ea_mode_str_16(g_cpu_ir), (g_cpu_ir>>9)&7);\r
743 }\r
744 \r
745 static void d68000_and_er_32(void)\r
746 {\r
747         sprintf(g_dasm_str, "and.l   %s, D%d", get_ea_mode_str_32(g_cpu_ir), (g_cpu_ir>>9)&7);\r
748 }\r
749 \r
750 static void d68000_and_re_8(void)\r
751 {\r
752         sprintf(g_dasm_str, "and.b   D%d, %s", (g_cpu_ir>>9)&7, get_ea_mode_str_8(g_cpu_ir));\r
753 }\r
754 \r
755 static void d68000_and_re_16(void)\r
756 {\r
757         sprintf(g_dasm_str, "and.w   D%d, %s", (g_cpu_ir>>9)&7, get_ea_mode_str_16(g_cpu_ir));\r
758 }\r
759 \r
760 static void d68000_and_re_32(void)\r
761 {\r
762         sprintf(g_dasm_str, "and.l   D%d, %s", (g_cpu_ir>>9)&7, get_ea_mode_str_32(g_cpu_ir));\r
763 }\r
764 \r
765 static void d68000_andi_8(void)\r
766 {\r
767         char* str = get_imm_str_u8();\r
768         sprintf(g_dasm_str, "andi.b  %s, %s", str, get_ea_mode_str_8(g_cpu_ir));\r
769 }\r
770 \r
771 static void d68000_andi_16(void)\r
772 {\r
773         char* str = get_imm_str_u16();\r
774         sprintf(g_dasm_str, "andi.w  %s, %s", str, get_ea_mode_str_16(g_cpu_ir));\r
775 }\r
776 \r
777 static void d68000_andi_32(void)\r
778 {\r
779         char* str = get_imm_str_u32();\r
780         sprintf(g_dasm_str, "andi.l  %s, %s", str, get_ea_mode_str_32(g_cpu_ir));\r
781 }\r
782 \r
783 static void d68000_andi_to_ccr(void)\r
784 {\r
785         sprintf(g_dasm_str, "andi    %s, CCR", get_imm_str_u8());\r
786 }\r
787 \r
788 static void d68000_andi_to_sr(void)\r
789 {\r
790         sprintf(g_dasm_str, "andi    %s, SR", get_imm_str_u16());\r
791 }\r
792 \r
793 static void d68000_asr_s_8(void)\r
794 {\r
795         sprintf(g_dasm_str, "asr.b   #%d, D%d", g_3bit_qdata_table[(g_cpu_ir>>9)&7], g_cpu_ir&7);\r
796 }\r
797 \r
798 static void d68000_asr_s_16(void)\r
799 {\r
800         sprintf(g_dasm_str, "asr.w   #%d, D%d", g_3bit_qdata_table[(g_cpu_ir>>9)&7], g_cpu_ir&7);\r
801 }\r
802 \r
803 static void d68000_asr_s_32(void)\r
804 {\r
805         sprintf(g_dasm_str, "asr.l   #%d, D%d", g_3bit_qdata_table[(g_cpu_ir>>9)&7], g_cpu_ir&7);\r
806 }\r
807 \r
808 static void d68000_asr_r_8(void)\r
809 {\r
810         sprintf(g_dasm_str, "asr.b   D%d, D%d", (g_cpu_ir>>9)&7, g_cpu_ir&7);\r
811 }\r
812 \r
813 static void d68000_asr_r_16(void)\r
814 {\r
815         sprintf(g_dasm_str, "asr.w   D%d, D%d", (g_cpu_ir>>9)&7, g_cpu_ir&7);\r
816 }\r
817 \r
818 static void d68000_asr_r_32(void)\r
819 {\r
820         sprintf(g_dasm_str, "asr.l   D%d, D%d", (g_cpu_ir>>9)&7, g_cpu_ir&7);\r
821 }\r
822 \r
823 static void d68000_asr_ea(void)\r
824 {\r
825         sprintf(g_dasm_str, "asr.w   %s", get_ea_mode_str_16(g_cpu_ir));\r
826 }\r
827 \r
828 static void d68000_asl_s_8(void)\r
829 {\r
830         sprintf(g_dasm_str, "asl.b   #%d, D%d", g_3bit_qdata_table[(g_cpu_ir>>9)&7], g_cpu_ir&7);\r
831 }\r
832 \r
833 static void d68000_asl_s_16(void)\r
834 {\r
835         sprintf(g_dasm_str, "asl.w   #%d, D%d", g_3bit_qdata_table[(g_cpu_ir>>9)&7], g_cpu_ir&7);\r
836 }\r
837 \r
838 static void d68000_asl_s_32(void)\r
839 {\r
840         sprintf(g_dasm_str, "asl.l   #%d, D%d", g_3bit_qdata_table[(g_cpu_ir>>9)&7], g_cpu_ir&7);\r
841 }\r
842 \r
843 static void d68000_asl_r_8(void)\r
844 {\r
845         sprintf(g_dasm_str, "asl.b   D%d, D%d", (g_cpu_ir>>9)&7, g_cpu_ir&7);\r
846 }\r
847 \r
848 static void d68000_asl_r_16(void)\r
849 {\r
850         sprintf(g_dasm_str, "asl.w   D%d, D%d", (g_cpu_ir>>9)&7, g_cpu_ir&7);\r
851 }\r
852 \r
853 static void d68000_asl_r_32(void)\r
854 {\r
855         sprintf(g_dasm_str, "asl.l   D%d, D%d", (g_cpu_ir>>9)&7, g_cpu_ir&7);\r
856 }\r
857 \r
858 static void d68000_asl_ea(void)\r
859 {\r
860         sprintf(g_dasm_str, "asl.w   %s", get_ea_mode_str_16(g_cpu_ir));\r
861 }\r
862 \r
863 static void d68000_bcc_8(void)\r
864 {\r
865         uint temp_pc = g_cpu_pc;\r
866         sprintf(g_dasm_str, "b%-2s     %x", g_cc[(g_cpu_ir>>8)&0xf], temp_pc + make_int_8(g_cpu_ir));\r
867 }\r
868 \r
869 static void d68000_bcc_16(void)\r
870 {\r
871         uint temp_pc = g_cpu_pc;\r
872         sprintf(g_dasm_str, "b%-2s     %x", g_cc[(g_cpu_ir>>8)&0xf], temp_pc + make_int_16(read_imm_16()));\r
873 }\r
874 \r
875 static void d68020_bcc_32(void)\r
876 {\r
877         uint temp_pc = g_cpu_pc;\r
878         LIMIT_CPU_TYPES(M68020_PLUS);\r
879         sprintf(g_dasm_str, "b%-2s     %x; (2+)", g_cc[(g_cpu_ir>>8)&0xf], temp_pc + read_imm_32());\r
880 }\r
881 \r
882 static void d68000_bchg_r(void)\r
883 {\r
884         sprintf(g_dasm_str, "bchg    D%d, %s", (g_cpu_ir>>9)&7, get_ea_mode_str_8(g_cpu_ir));\r
885 }\r
886 \r
887 static void d68000_bchg_s(void)\r
888 {\r
889         char* str = get_imm_str_u8();\r
890         sprintf(g_dasm_str, "bchg    %s, %s", str, get_ea_mode_str_8(g_cpu_ir));\r
891 }\r
892 \r
893 static void d68000_bclr_r(void)\r
894 {\r
895         sprintf(g_dasm_str, "bclr    D%d, %s", (g_cpu_ir>>9)&7, get_ea_mode_str_8(g_cpu_ir));\r
896 }\r
897 \r
898 static void d68000_bclr_s(void)\r
899 {\r
900         char* str = get_imm_str_u8();\r
901         sprintf(g_dasm_str, "bclr    %s, %s", str, get_ea_mode_str_8(g_cpu_ir));\r
902 }\r
903 \r
904 static void d68010_bkpt(void)\r
905 {\r
906         LIMIT_CPU_TYPES(M68010_PLUS);\r
907         sprintf(g_dasm_str, "bkpt #%d; (1+)", g_cpu_ir&7);\r
908 }\r
909 \r
910 static void d68020_bfchg(void)\r
911 {\r
912         uint extension;\r
913         char offset[3];\r
914         char width[3];\r
915 \r
916         LIMIT_CPU_TYPES(M68020_PLUS);\r
917 \r
918         extension = read_imm_16();\r
919 \r
920         if(BIT_B(extension))\r
921                 sprintf(offset, "D%d", (extension>>6)&7);\r
922         else\r
923                 sprintf(offset, "%d", (extension>>6)&31);\r
924         if(BIT_5(extension))\r
925                 sprintf(width, "D%d", extension&7);\r
926         else\r
927                 sprintf(width, "%d", g_5bit_data_table[extension&31]);\r
928         sprintf(g_dasm_str, "bfchg   %s {%s:%s}; (2+)", get_ea_mode_str_8(g_cpu_ir), offset, width);\r
929 }\r
930 \r
931 static void d68020_bfclr(void)\r
932 {\r
933         uint extension;\r
934         char offset[3];\r
935         char width[3];\r
936 \r
937         LIMIT_CPU_TYPES(M68020_PLUS);\r
938 \r
939         extension = read_imm_16();\r
940 \r
941         if(BIT_B(extension))\r
942                 sprintf(offset, "D%d", (extension>>6)&7);\r
943         else\r
944                 sprintf(offset, "%d", (extension>>6)&31);\r
945         if(BIT_5(extension))\r
946                 sprintf(width, "D%d", extension&7);\r
947         else\r
948                 sprintf(width, "%d", g_5bit_data_table[extension&31]);\r
949         sprintf(g_dasm_str, "bfclr   %s {%s:%s}; (2+)", get_ea_mode_str_8(g_cpu_ir), offset, width);\r
950 }\r
951 \r
952 static void d68020_bfexts(void)\r
953 {\r
954         uint extension;\r
955         char offset[3];\r
956         char width[3];\r
957 \r
958         LIMIT_CPU_TYPES(M68020_PLUS);\r
959 \r
960         extension = read_imm_16();\r
961 \r
962         if(BIT_B(extension))\r
963                 sprintf(offset, "D%d", (extension>>6)&7);\r
964         else\r
965                 sprintf(offset, "%d", (extension>>6)&31);\r
966         if(BIT_5(extension))\r
967                 sprintf(width, "D%d", extension&7);\r
968         else\r
969                 sprintf(width, "%d", g_5bit_data_table[extension&31]);\r
970         sprintf(g_dasm_str, "bfexts  D%d, %s {%s:%s}; (2+)", (extension>>12)&7, get_ea_mode_str_8(g_cpu_ir), offset, width);\r
971 }\r
972 \r
973 static void d68020_bfextu(void)\r
974 {\r
975         uint extension;\r
976         char offset[3];\r
977         char width[3];\r
978 \r
979         LIMIT_CPU_TYPES(M68020_PLUS);\r
980 \r
981         extension = read_imm_16();\r
982 \r
983         if(BIT_B(extension))\r
984                 sprintf(offset, "D%d", (extension>>6)&7);\r
985         else\r
986                 sprintf(offset, "%d", (extension>>6)&31);\r
987         if(BIT_5(extension))\r
988                 sprintf(width, "D%d", extension&7);\r
989         else\r
990                 sprintf(width, "%d", g_5bit_data_table[extension&31]);\r
991         sprintf(g_dasm_str, "bfextu  D%d, %s {%s:%s}; (2+)", (extension>>12)&7, get_ea_mode_str_8(g_cpu_ir), offset, width);\r
992 }\r
993 \r
994 static void d68020_bfffo(void)\r
995 {\r
996         uint extension;\r
997         char offset[3];\r
998         char width[3];\r
999 \r
1000         LIMIT_CPU_TYPES(M68020_PLUS);\r
1001 \r
1002         extension = read_imm_16();\r
1003 \r
1004         if(BIT_B(extension))\r
1005                 sprintf(offset, "D%d", (extension>>6)&7);\r
1006         else\r
1007                 sprintf(offset, "%d", (extension>>6)&31);\r
1008         if(BIT_5(extension))\r
1009                 sprintf(width, "D%d", extension&7);\r
1010         else\r
1011                 sprintf(width, "%d", g_5bit_data_table[extension&31]);\r
1012         sprintf(g_dasm_str, "bfffo   D%d, %s {%s:%s}; (2+)", (extension>>12)&7, get_ea_mode_str_8(g_cpu_ir), offset, width);\r
1013 }\r
1014 \r
1015 static void d68020_bfins(void)\r
1016 {\r
1017         uint extension;\r
1018         char offset[3];\r
1019         char width[3];\r
1020 \r
1021         LIMIT_CPU_TYPES(M68020_PLUS);\r
1022 \r
1023         extension = read_imm_16();\r
1024 \r
1025         if(BIT_B(extension))\r
1026                 sprintf(offset, "D%d", (extension>>6)&7);\r
1027         else\r
1028                 sprintf(offset, "%d", (extension>>6)&31);\r
1029         if(BIT_5(extension))\r
1030                 sprintf(width, "D%d", extension&7);\r
1031         else\r
1032                 sprintf(width, "%d", g_5bit_data_table[extension&31]);\r
1033         sprintf(g_dasm_str, "bfins   D%d, %s {%s:%s}; (2+)", (extension>>12)&7, get_ea_mode_str_8(g_cpu_ir), offset, width);\r
1034 }\r
1035 \r
1036 static void d68020_bfset(void)\r
1037 {\r
1038         uint extension;\r
1039         char offset[3];\r
1040         char width[3];\r
1041 \r
1042         LIMIT_CPU_TYPES(M68020_PLUS);\r
1043 \r
1044         extension = read_imm_16();\r
1045 \r
1046         if(BIT_B(extension))\r
1047                 sprintf(offset, "D%d", (extension>>6)&7);\r
1048         else\r
1049                 sprintf(offset, "%d", (extension>>6)&31);\r
1050         if(BIT_5(extension))\r
1051                 sprintf(width, "D%d", extension&7);\r
1052         else\r
1053                 sprintf(width, "%d", g_5bit_data_table[extension&31]);\r
1054         sprintf(g_dasm_str, "bfset   %s {%s:%s}; (2+)", get_ea_mode_str_8(g_cpu_ir), offset, width);\r
1055 }\r
1056 \r
1057 static void d68020_bftst(void)\r
1058 {\r
1059         uint extension;\r
1060         char offset[3];\r
1061         char width[3];\r
1062 \r
1063         LIMIT_CPU_TYPES(M68020_PLUS);\r
1064 \r
1065         extension = read_imm_16();\r
1066 \r
1067         if(BIT_B(extension))\r
1068                 sprintf(offset, "D%d", (extension>>6)&7);\r
1069         else\r
1070                 sprintf(offset, "%d", (extension>>6)&31);\r
1071         if(BIT_5(extension))\r
1072                 sprintf(width, "D%d", extension&7);\r
1073         else\r
1074                 sprintf(width, "%d", g_5bit_data_table[extension&31]);\r
1075         sprintf(g_dasm_str, "bftst   %s {%s:%s}; (2+)", get_ea_mode_str_8(g_cpu_ir), offset, width);\r
1076 }\r
1077 \r
1078 static void d68000_bra_8(void)\r
1079 {\r
1080         uint temp_pc = g_cpu_pc;\r
1081         sprintf(g_dasm_str, "bra     %x", temp_pc + make_int_8(g_cpu_ir));\r
1082 }\r
1083 \r
1084 static void d68000_bra_16(void)\r
1085 {\r
1086         uint temp_pc = g_cpu_pc;\r
1087         sprintf(g_dasm_str, "bra     %x", temp_pc + make_int_16(read_imm_16()));\r
1088 }\r
1089 \r
1090 static void d68020_bra_32(void)\r
1091 {\r
1092         uint temp_pc = g_cpu_pc;\r
1093         LIMIT_CPU_TYPES(M68020_PLUS);\r
1094         sprintf(g_dasm_str, "bra     %x; (2+)", temp_pc + read_imm_32());\r
1095 }\r
1096 \r
1097 static void d68000_bset_r(void)\r
1098 {\r
1099         sprintf(g_dasm_str, "bset    D%d, %s", (g_cpu_ir>>9)&7, get_ea_mode_str_8(g_cpu_ir));\r
1100 }\r
1101 \r
1102 static void d68000_bset_s(void)\r
1103 {\r
1104         char* str = get_imm_str_u8();\r
1105         sprintf(g_dasm_str, "bset    %s, %s", str, get_ea_mode_str_8(g_cpu_ir));\r
1106 }\r
1107 \r
1108 static void d68000_bsr_8(void)\r
1109 {\r
1110         uint temp_pc = g_cpu_pc;\r
1111         sprintf(g_dasm_str, "bsr     %x", temp_pc + make_int_8(g_cpu_ir));\r
1112 }\r
1113 \r
1114 static void d68000_bsr_16(void)\r
1115 {\r
1116         uint temp_pc = g_cpu_pc;\r
1117         sprintf(g_dasm_str, "bsr     %x", temp_pc + make_int_16(read_imm_16()));\r
1118 }\r
1119 \r
1120 static void d68020_bsr_32(void)\r
1121 {\r
1122         uint temp_pc = g_cpu_pc;\r
1123         LIMIT_CPU_TYPES(M68020_PLUS);\r
1124         sprintf(g_dasm_str, "bsr     %x; (2+)", temp_pc + peek_imm_32());\r
1125 }\r
1126 \r
1127 static void d68000_btst_r(void)\r
1128 {\r
1129         sprintf(g_dasm_str, "btst    D%d, %s", (g_cpu_ir>>9)&7, get_ea_mode_str_8(g_cpu_ir));\r
1130 }\r
1131 \r
1132 static void d68000_btst_s(void)\r
1133 {\r
1134         char* str = get_imm_str_u8();\r
1135         sprintf(g_dasm_str, "btst    %s, %s", str, get_ea_mode_str_8(g_cpu_ir));\r
1136 }\r
1137 \r
1138 static void d68020_callm(void)\r
1139 {\r
1140         char* str;\r
1141         LIMIT_CPU_TYPES(M68020_ONLY);\r
1142         str = get_imm_str_u8();\r
1143 \r
1144         sprintf(g_dasm_str, "callm   %s, %s; (2)", str, get_ea_mode_str_8(g_cpu_ir));\r
1145 }\r
1146 \r
1147 static void d68020_cas_8(void)\r
1148 {\r
1149         uint extension;\r
1150         LIMIT_CPU_TYPES(M68020_PLUS);\r
1151         extension = read_imm_16();\r
1152         sprintf(g_dasm_str, "cas.b   D%d, D%d, %s; (2+)", extension&7, (extension>>8)&7, get_ea_mode_str_8(g_cpu_ir));\r
1153 }\r
1154 \r
1155 static void d68020_cas_16(void)\r
1156 {\r
1157         uint extension;\r
1158         LIMIT_CPU_TYPES(M68020_PLUS);\r
1159         extension = read_imm_16();\r
1160         sprintf(g_dasm_str, "cas.w   D%d, D%d, %s; (2+)", extension&7, (extension>>8)&7, get_ea_mode_str_16(g_cpu_ir));\r
1161 }\r
1162 \r
1163 static void d68020_cas_32(void)\r
1164 {\r
1165         uint extension;\r
1166         LIMIT_CPU_TYPES(M68020_PLUS);\r
1167         extension = read_imm_16();\r
1168         sprintf(g_dasm_str, "cas.l   D%d, D%d, %s; (2+)", extension&7, (extension>>8)&7, get_ea_mode_str_32(g_cpu_ir));\r
1169 }\r
1170 \r
1171 static void d68020_cas2_16(void)\r
1172 {\r
1173 /* CAS2 Dc1:Dc2,Du1:Dc2:(Rn1):(Rn2)\r
1174 f e d c b a 9 8 7 6 5 4 3 2 1 0\r
1175  DARn1  0 0 0  Du1  0 0 0  Dc1\r
1176  DARn2  0 0 0  Du2  0 0 0  Dc2\r
1177 */\r
1178 \r
1179         uint extension;\r
1180         LIMIT_CPU_TYPES(M68020_PLUS);\r
1181         extension = read_imm_32();\r
1182         sprintf(g_dasm_str, "cas2.w  D%d:D%d:D%d:D%d, (%c%d):(%c%d); (2+)",\r
1183                 (extension>>16)&7, extension&7, (extension>>22)&7, (extension>>6)&7,\r
1184                 BIT_1F(extension) ? 'A' : 'D', (extension>>28)&7,\r
1185                 BIT_F(extension) ? 'A' : 'D', (extension>>12)&7);\r
1186 }\r
1187 \r
1188 static void d68020_cas2_32(void)\r
1189 {\r
1190         uint extension;\r
1191         LIMIT_CPU_TYPES(M68020_PLUS);\r
1192         extension = read_imm_32();\r
1193         sprintf(g_dasm_str, "cas2.l  D%d:D%d:D%d:D%d, (%c%d):(%c%d); (2+)",\r
1194                 (extension>>16)&7, extension&7, (extension>>22)&7, (extension>>6)&7,\r
1195                 BIT_1F(extension) ? 'A' : 'D', (extension>>28)&7,\r
1196                 BIT_F(extension) ? 'A' : 'D', (extension>>12)&7);\r
1197 }\r
1198 \r
1199 static void d68000_chk_16(void)\r
1200 {\r
1201         sprintf(g_dasm_str, "chk.w   %s, D%d", get_ea_mode_str_16(g_cpu_ir), (g_cpu_ir>>9)&7);\r
1202 }\r
1203 \r
1204 static void d68020_chk_32(void)\r
1205 {\r
1206         LIMIT_CPU_TYPES(M68020_PLUS);\r
1207         sprintf(g_dasm_str, "chk.l   %s, D%d; (2+)", get_ea_mode_str_32(g_cpu_ir), (g_cpu_ir>>9)&7);\r
1208 }\r
1209 \r
1210 static void d68020_chk2_cmp2_8(void)\r
1211 {\r
1212         uint extension;\r
1213         LIMIT_CPU_TYPES(M68020_PLUS);\r
1214         extension = read_imm_16();\r
1215         sprintf(g_dasm_str, "%s.b  %s, %c%d; (2+)", BIT_B(extension) ? "chk2" : "cmp2", get_ea_mode_str_8(g_cpu_ir), BIT_F(extension) ? 'A' : 'D', (extension>>12)&7);\r
1216 }\r
1217 \r
1218 static void d68020_chk2_cmp2_16(void)\r
1219 {\r
1220         uint extension;\r
1221         LIMIT_CPU_TYPES(M68020_PLUS);\r
1222         extension = read_imm_16();\r
1223         sprintf(g_dasm_str, "%s.w  %s, %c%d; (2+)", BIT_B(extension) ? "chk2" : "cmp2", get_ea_mode_str_16(g_cpu_ir), BIT_F(extension) ? 'A' : 'D', (extension>>12)&7);\r
1224 }\r
1225 \r
1226 static void d68020_chk2_cmp2_32(void)\r
1227 {\r
1228         uint extension;\r
1229         LIMIT_CPU_TYPES(M68020_PLUS);\r
1230         extension = read_imm_16();\r
1231         sprintf(g_dasm_str, "%s.l  %s, %c%d; (2+)", BIT_B(extension) ? "chk2" : "cmp2", get_ea_mode_str_32(g_cpu_ir), BIT_F(extension) ? 'A' : 'D', (extension>>12)&7);\r
1232 }\r
1233 \r
1234 static void d68040_cinv(void)\r
1235 {\r
1236         LIMIT_CPU_TYPES(M68040_PLUS);\r
1237         switch((g_cpu_ir>>3)&3)\r
1238         {\r
1239                 case 0:\r
1240                         sprintf(g_dasm_str, "cinv (illegal scope); (4)");\r
1241                         break;\r
1242                 case 1:\r
1243                         sprintf(g_dasm_str, "cinvl   %d, (A%d); (4)", (g_cpu_ir>>6)&3, g_cpu_ir&7);\r
1244                         break;\r
1245                 case 2:\r
1246                         sprintf(g_dasm_str, "cinvp   %d, (A%d); (4)", (g_cpu_ir>>6)&3, g_cpu_ir&7);\r
1247                         break;\r
1248                 case 3:\r
1249                         sprintf(g_dasm_str, "cinva   %d; (4)", (g_cpu_ir>>6)&3);\r
1250                         break;\r
1251         }\r
1252 }\r
1253 \r
1254 static void d68000_clr_8(void)\r
1255 {\r
1256         sprintf(g_dasm_str, "clr.b   %s", get_ea_mode_str_8(g_cpu_ir));\r
1257 }\r
1258 \r
1259 static void d68000_clr_16(void)\r
1260 {\r
1261         sprintf(g_dasm_str, "clr.w   %s", get_ea_mode_str_16(g_cpu_ir));\r
1262 }\r
1263 \r
1264 static void d68000_clr_32(void)\r
1265 {\r
1266         sprintf(g_dasm_str, "clr.l   %s", get_ea_mode_str_32(g_cpu_ir));\r
1267 }\r
1268 \r
1269 static void d68000_cmp_8(void)\r
1270 {\r
1271         sprintf(g_dasm_str, "cmp.b   %s, D%d", get_ea_mode_str_8(g_cpu_ir), (g_cpu_ir>>9)&7);\r
1272 }\r
1273 \r
1274 static void d68000_cmp_16(void)\r
1275 {\r
1276         sprintf(g_dasm_str, "cmp.w   %s, D%d", get_ea_mode_str_16(g_cpu_ir), (g_cpu_ir>>9)&7);\r
1277 }\r
1278 \r
1279 static void d68000_cmp_32(void)\r
1280 {\r
1281         sprintf(g_dasm_str, "cmp.l   %s, D%d", get_ea_mode_str_32(g_cpu_ir), (g_cpu_ir>>9)&7);\r
1282 }\r
1283 \r
1284 static void d68000_cmpa_16(void)\r
1285 {\r
1286         sprintf(g_dasm_str, "cmpa.w  %s, A%d", get_ea_mode_str_16(g_cpu_ir), (g_cpu_ir>>9)&7);\r
1287 }\r
1288 \r
1289 static void d68000_cmpa_32(void)\r
1290 {\r
1291         sprintf(g_dasm_str, "cmpa.l  %s, A%d", get_ea_mode_str_32(g_cpu_ir), (g_cpu_ir>>9)&7);\r
1292 }\r
1293 \r
1294 static void d68000_cmpi_8(void)\r
1295 {\r
1296         char* str = get_imm_str_s8();\r
1297         sprintf(g_dasm_str, "cmpi.b  %s, %s", str, get_ea_mode_str_8(g_cpu_ir));\r
1298 }\r
1299 \r
1300 static void d68020_cmpi_pcdi_8(void)\r
1301 {\r
1302         char* str;\r
1303         LIMIT_CPU_TYPES(M68020_PLUS);\r
1304         str = get_imm_str_s8();\r
1305         sprintf(g_dasm_str, "cmpi.b  %s, %s; (2+)", str, get_ea_mode_str_8(g_cpu_ir));\r
1306 }\r
1307 \r
1308 static void d68020_cmpi_pcix_8(void)\r
1309 {\r
1310         char* str;\r
1311         LIMIT_CPU_TYPES(M68020_PLUS);\r
1312         str = get_imm_str_s8();\r
1313         sprintf(g_dasm_str, "cmpi.b  %s, %s; (2+)", str, get_ea_mode_str_8(g_cpu_ir));\r
1314 }\r
1315 \r
1316 static void d68000_cmpi_16(void)\r
1317 {\r
1318         char* str;\r
1319         LIMIT_CPU_TYPES(M68020_PLUS);\r
1320         str = get_imm_str_s16();\r
1321         sprintf(g_dasm_str, "cmpi.w  %s, %s", str, get_ea_mode_str_16(g_cpu_ir));\r
1322 }\r
1323 \r
1324 static void d68020_cmpi_pcdi_16(void)\r
1325 {\r
1326         char* str;\r
1327         LIMIT_CPU_TYPES(M68020_PLUS);\r
1328         str = get_imm_str_s16();\r
1329         sprintf(g_dasm_str, "cmpi.w  %s, %s; (2+)", str, get_ea_mode_str_16(g_cpu_ir));\r
1330 }\r
1331 \r
1332 static void d68020_cmpi_pcix_16(void)\r
1333 {\r
1334         char* str;\r
1335         LIMIT_CPU_TYPES(M68020_PLUS);\r
1336         str = get_imm_str_s16();\r
1337         sprintf(g_dasm_str, "cmpi.w  %s, %s; (2+)", str, get_ea_mode_str_16(g_cpu_ir));\r
1338 }\r
1339 \r
1340 static void d68000_cmpi_32(void)\r
1341 {\r
1342         char* str;\r
1343         LIMIT_CPU_TYPES(M68020_PLUS);\r
1344         str = get_imm_str_s32();\r
1345         sprintf(g_dasm_str, "cmpi.l  %s, %s", str, get_ea_mode_str_32(g_cpu_ir));\r
1346 }\r
1347 \r
1348 static void d68020_cmpi_pcdi_32(void)\r
1349 {\r
1350         char* str;\r
1351         LIMIT_CPU_TYPES(M68020_PLUS);\r
1352         str = get_imm_str_s32();\r
1353         sprintf(g_dasm_str, "cmpi.l  %s, %s; (2+)", str, get_ea_mode_str_32(g_cpu_ir));\r
1354 }\r
1355 \r
1356 static void d68020_cmpi_pcix_32(void)\r
1357 {\r
1358         char* str;\r
1359         LIMIT_CPU_TYPES(M68020_PLUS);\r
1360         str = get_imm_str_s32();\r
1361         sprintf(g_dasm_str, "cmpi.l  %s, %s; (2+)", str, get_ea_mode_str_32(g_cpu_ir));\r
1362 }\r
1363 \r
1364 static void d68000_cmpm_8(void)\r
1365 {\r
1366         sprintf(g_dasm_str, "cmpm.b  (A%d)+, (A%d)+", g_cpu_ir&7, (g_cpu_ir>>9)&7);\r
1367 }\r
1368 \r
1369 static void d68000_cmpm_16(void)\r
1370 {\r
1371         sprintf(g_dasm_str, "cmpm.w  (A%d)+, (A%d)+", g_cpu_ir&7, (g_cpu_ir>>9)&7);\r
1372 }\r
1373 \r
1374 static void d68000_cmpm_32(void)\r
1375 {\r
1376         sprintf(g_dasm_str, "cmpm.l  (A%d)+, (A%d)+", g_cpu_ir&7, (g_cpu_ir>>9)&7);\r
1377 }\r
1378 \r
1379 static void d68020_cpbcc_16(void)\r
1380 {\r
1381         uint extension;\r
1382         uint new_pc = g_cpu_pc;\r
1383         LIMIT_CPU_TYPES(M68020_PLUS);\r
1384         extension = read_imm_16();\r
1385         new_pc += make_int_16(peek_imm_16());\r
1386         sprintf(g_dasm_str, "%db%-4s  %s; %x (extension = %x) (2-3)", (g_cpu_ir>>9)&7, g_cpcc[g_cpu_ir&0x3f], get_imm_str_s16(), new_pc, extension);\r
1387 }\r
1388 \r
1389 static void d68020_cpbcc_32(void)\r
1390 {\r
1391         uint extension;\r
1392         uint new_pc = g_cpu_pc;\r
1393         LIMIT_CPU_TYPES(M68020_PLUS);\r
1394         extension = read_imm_16();\r
1395         new_pc += peek_imm_32();\r
1396         sprintf(g_dasm_str, "%db%-4s  %s; %x (extension = %x) (2-3)", (g_cpu_ir>>9)&7, g_cpcc[g_cpu_ir&0x3f], get_imm_str_s16(), new_pc, extension);\r
1397 }\r
1398 \r
1399 static void d68020_cpdbcc(void)\r
1400 {\r
1401         uint extension1;\r
1402         uint extension2;\r
1403         uint new_pc = g_cpu_pc;\r
1404         LIMIT_CPU_TYPES(M68020_PLUS);\r
1405         extension1 = read_imm_16();\r
1406         extension2 = read_imm_16();\r
1407         new_pc += make_int_16(peek_imm_16());\r
1408         sprintf(g_dasm_str, "%ddb%-4s D%d,%s; %x (extension = %x) (2-3)", (g_cpu_ir>>9)&7, g_cpcc[extension1&0x3f], g_cpu_ir&7, get_imm_str_s16(), new_pc, extension2);\r
1409 }\r
1410 \r
1411 static void d68020_cpgen(void)\r
1412 {\r
1413         LIMIT_CPU_TYPES(M68020_PLUS);\r
1414         sprintf(g_dasm_str, "%dgen    %s; (2-3)", (g_cpu_ir>>9)&7, get_imm_str_u32());\r
1415 }\r
1416 \r
1417 static void d68020_cprestore(void)\r
1418 {\r
1419         LIMIT_CPU_TYPES(M68020_PLUS);\r
1420         sprintf(g_dasm_str, "%drestore %s; (2-3)", (g_cpu_ir>>9)&7, get_ea_mode_str_8(g_cpu_ir));\r
1421 }\r
1422 \r
1423 static void d68020_cpsave(void)\r
1424 {\r
1425         LIMIT_CPU_TYPES(M68020_PLUS);\r
1426         sprintf(g_dasm_str, "%dsave   %s; (2-3)", (g_cpu_ir>>9)&7, get_ea_mode_str_8(g_cpu_ir));\r
1427 }\r
1428 \r
1429 static void d68020_cpscc(void)\r
1430 {\r
1431         uint extension1;\r
1432         uint extension2;\r
1433         LIMIT_CPU_TYPES(M68020_PLUS);\r
1434         extension1 = read_imm_16();\r
1435         extension2 = read_imm_16();\r
1436         sprintf(g_dasm_str, "%ds%-4s  %s; (extension = %x) (2-3)", (g_cpu_ir>>9)&7, g_cpcc[extension1&0x3f], get_ea_mode_str_8(g_cpu_ir), extension2);\r
1437 }\r
1438 \r
1439 static void d68020_cptrapcc_0(void)\r
1440 {\r
1441         uint extension1;\r
1442         uint extension2;\r
1443         LIMIT_CPU_TYPES(M68020_PLUS);\r
1444         extension1 = read_imm_16();\r
1445         extension2 = read_imm_16();\r
1446         sprintf(g_dasm_str, "%dtrap%-4s; (extension = %x) (2-3)", (g_cpu_ir>>9)&7, g_cpcc[extension1&0x3f], extension2);\r
1447 }\r
1448 \r
1449 static void d68020_cptrapcc_16(void)\r
1450 {\r
1451         uint extension1;\r
1452         uint extension2;\r
1453         LIMIT_CPU_TYPES(M68020_PLUS);\r
1454         extension1 = read_imm_16();\r
1455         extension2 = read_imm_16();\r
1456         sprintf(g_dasm_str, "%dtrap%-4s %s; (extension = %x) (2-3)", (g_cpu_ir>>9)&7, g_cpcc[extension1&0x3f], get_imm_str_u16(), extension2);\r
1457 }\r
1458 \r
1459 static void d68020_cptrapcc_32(void)\r
1460 {\r
1461         uint extension1;\r
1462         uint extension2;\r
1463         LIMIT_CPU_TYPES(M68020_PLUS);\r
1464         extension1 = read_imm_16();\r
1465         extension2 = read_imm_16();\r
1466         sprintf(g_dasm_str, "%dtrap%-4s %s; (extension = %x) (2-3)", (g_cpu_ir>>9)&7, g_cpcc[extension1&0x3f], get_imm_str_u32(), extension2);\r
1467 }\r
1468 \r
1469 static void d68040_cpush(void)\r
1470 {\r
1471         LIMIT_CPU_TYPES(M68040_PLUS);\r
1472         switch((g_cpu_ir>>3)&3)\r
1473         {\r
1474                 case 0:\r
1475                         sprintf(g_dasm_str, "cpush (illegal scope); (4)");\r
1476                         break;\r
1477                 case 1:\r
1478                         sprintf(g_dasm_str, "cpushl  %d, (A%d); (4)", (g_cpu_ir>>6)&3, g_cpu_ir&7);\r
1479                         break;\r
1480                 case 2:\r
1481                         sprintf(g_dasm_str, "cpushp  %d, (A%d); (4)", (g_cpu_ir>>6)&3, g_cpu_ir&7);\r
1482                         break;\r
1483                 case 3:\r
1484                         sprintf(g_dasm_str, "cpusha  %d; (4)", (g_cpu_ir>>6)&3);\r
1485                         break;\r
1486         }\r
1487 }\r
1488 \r
1489 static void d68000_dbra(void)\r
1490 {\r
1491         uint temp_pc = g_cpu_pc;\r
1492         sprintf(g_dasm_str, "dbra    D%d, %x", g_cpu_ir & 7, temp_pc + make_int_16(read_imm_16()));\r
1493 }\r
1494 \r
1495 static void d68000_dbcc(void)\r
1496 {\r
1497         uint temp_pc = g_cpu_pc;\r
1498         sprintf(g_dasm_str, "db%-2s    D%d, %x", g_cc[(g_cpu_ir>>8)&0xf], g_cpu_ir & 7, temp_pc + make_int_16(read_imm_16()));\r
1499 }\r
1500 \r
1501 static void d68000_divs(void)\r
1502 {\r
1503         sprintf(g_dasm_str, "divs.w  %s, D%d", get_ea_mode_str_16(g_cpu_ir), (g_cpu_ir>>9)&7);\r
1504 }\r
1505 \r
1506 static void d68000_divu(void)\r
1507 {\r
1508         sprintf(g_dasm_str, "divu.w  %s, D%d", get_ea_mode_str_16(g_cpu_ir), (g_cpu_ir>>9)&7);\r
1509 }\r
1510 \r
1511 static void d68020_divl(void)\r
1512 {\r
1513         uint extension;\r
1514         LIMIT_CPU_TYPES(M68020_PLUS);\r
1515         extension = read_imm_16();\r
1516 \r
1517         if(BIT_A(extension))\r
1518                 sprintf(g_dasm_str, "div%c.l  %s, D%d:D%d; (2+)", BIT_B(extension) ? 's' : 'u', get_ea_mode_str_32(g_cpu_ir), extension&7, (extension>>12)&7);\r
1519         else if((extension&7) == ((extension>>12)&7))\r
1520                 sprintf(g_dasm_str, "div%c.l  %s, D%d; (2+)", BIT_B(extension) ? 's' : 'u', get_ea_mode_str_32(g_cpu_ir), (extension>>12)&7);\r
1521         else\r
1522                 sprintf(g_dasm_str, "div%cl.l %s, D%d:D%d; (2+)", BIT_B(extension) ? 's' : 'u', get_ea_mode_str_32(g_cpu_ir), extension&7, (extension>>12)&7);\r
1523 }\r
1524 \r
1525 static void d68000_eor_8(void)\r
1526 {\r
1527         sprintf(g_dasm_str, "eor.b   D%d, %s", (g_cpu_ir>>9)&7, get_ea_mode_str_8(g_cpu_ir));\r
1528 }\r
1529 \r
1530 static void d68000_eor_16(void)\r
1531 {\r
1532         sprintf(g_dasm_str, "eor.w   D%d, %s", (g_cpu_ir>>9)&7, get_ea_mode_str_16(g_cpu_ir));\r
1533 }\r
1534 \r
1535 static void d68000_eor_32(void)\r
1536 {\r
1537         sprintf(g_dasm_str, "eor.l   D%d, %s", (g_cpu_ir>>9)&7, get_ea_mode_str_32(g_cpu_ir));\r
1538 }\r
1539 \r
1540 static void d68000_eori_8(void)\r
1541 {\r
1542         char* str = get_imm_str_u8();\r
1543         sprintf(g_dasm_str, "eori.b  %s, %s", str, get_ea_mode_str_8(g_cpu_ir));\r
1544 }\r
1545 \r
1546 static void d68000_eori_16(void)\r
1547 {\r
1548         char* str = get_imm_str_u16();\r
1549         sprintf(g_dasm_str, "eori.w  %s, %s", str, get_ea_mode_str_16(g_cpu_ir));\r
1550 }\r
1551 \r
1552 static void d68000_eori_32(void)\r
1553 {\r
1554         char* str = get_imm_str_u32();\r
1555         sprintf(g_dasm_str, "eori.l  %s, %s", str, get_ea_mode_str_32(g_cpu_ir));\r
1556 }\r
1557 \r
1558 static void d68000_eori_to_ccr(void)\r
1559 {\r
1560         sprintf(g_dasm_str, "eori    %s, CCR", get_imm_str_u8());\r
1561 }\r
1562 \r
1563 static void d68000_eori_to_sr(void)\r
1564 {\r
1565         sprintf(g_dasm_str, "eori    %s, SR", get_imm_str_u16());\r
1566 }\r
1567 \r
1568 static void d68000_exg_dd(void)\r
1569 {\r
1570         sprintf(g_dasm_str, "exg     D%d, D%d", (g_cpu_ir>>9)&7, g_cpu_ir&7);\r
1571 }\r
1572 \r
1573 static void d68000_exg_aa(void)\r
1574 {\r
1575         sprintf(g_dasm_str, "exg     A%d, A%d", (g_cpu_ir>>9)&7, g_cpu_ir&7);\r
1576 }\r
1577 \r
1578 static void d68000_exg_da(void)\r
1579 {\r
1580         sprintf(g_dasm_str, "exg     D%d, A%d", (g_cpu_ir>>9)&7, g_cpu_ir&7);\r
1581 }\r
1582 \r
1583 static void d68000_ext_16(void)\r
1584 {\r
1585         sprintf(g_dasm_str, "ext.w   D%d", g_cpu_ir&7);\r
1586 }\r
1587 \r
1588 static void d68000_ext_32(void)\r
1589 {\r
1590         sprintf(g_dasm_str, "ext.l   D%d", g_cpu_ir&7);\r
1591 }\r
1592 \r
1593 static void d68020_extb_32(void)\r
1594 {\r
1595         LIMIT_CPU_TYPES(M68020_PLUS);\r
1596         sprintf(g_dasm_str, "extb.l  D%d; (2+)", g_cpu_ir&7);\r
1597 }\r
1598 \r
1599 static void d68000_jmp(void)\r
1600 {\r
1601         sprintf(g_dasm_str, "jmp     %s", get_ea_mode_str_32(g_cpu_ir));\r
1602 }\r
1603 \r
1604 static void d68000_jsr(void)\r
1605 {\r
1606         sprintf(g_dasm_str, "jsr     %s", get_ea_mode_str_32(g_cpu_ir));\r
1607 }\r
1608 \r
1609 static void d68000_lea(void)\r
1610 {\r
1611         sprintf(g_dasm_str, "lea     %s, A%d", get_ea_mode_str_32(g_cpu_ir), (g_cpu_ir>>9)&7);\r
1612 }\r
1613 \r
1614 static void d68000_link_16(void)\r
1615 {\r
1616         sprintf(g_dasm_str, "link    A%d, %s", g_cpu_ir&7, get_imm_str_s16());\r
1617 }\r
1618 \r
1619 static void d68020_link_32(void)\r
1620 {\r
1621         LIMIT_CPU_TYPES(M68020_PLUS);\r
1622         sprintf(g_dasm_str, "link    A%d, %s; (2+)", g_cpu_ir&7, get_imm_str_s32());\r
1623 }\r
1624 \r
1625 static void d68000_lsr_s_8(void)\r
1626 {\r
1627         sprintf(g_dasm_str, "lsr.b   #%d, D%d", g_3bit_qdata_table[(g_cpu_ir>>9)&7], g_cpu_ir&7);\r
1628 }\r
1629 \r
1630 static void d68000_lsr_s_16(void)\r
1631 {\r
1632         sprintf(g_dasm_str, "lsr.w   #%d, D%d", g_3bit_qdata_table[(g_cpu_ir>>9)&7], g_cpu_ir&7);\r
1633 }\r
1634 \r
1635 static void d68000_lsr_s_32(void)\r
1636 {\r
1637         sprintf(g_dasm_str, "lsr.l   #%d, D%d", g_3bit_qdata_table[(g_cpu_ir>>9)&7], g_cpu_ir&7);\r
1638 }\r
1639 \r
1640 static void d68000_lsr_r_8(void)\r
1641 {\r
1642         sprintf(g_dasm_str, "lsr.b   D%d, D%d", (g_cpu_ir>>9)&7, g_cpu_ir&7);\r
1643 }\r
1644 \r
1645 static void d68000_lsr_r_16(void)\r
1646 {\r
1647         sprintf(g_dasm_str, "lsr.w   D%d, D%d", (g_cpu_ir>>9)&7, g_cpu_ir&7);\r
1648 }\r
1649 \r
1650 static void d68000_lsr_r_32(void)\r
1651 {\r
1652         sprintf(g_dasm_str, "lsr.l   D%d, D%d", (g_cpu_ir>>9)&7, g_cpu_ir&7);\r
1653 }\r
1654 \r
1655 static void d68000_lsr_ea(void)\r
1656 {\r
1657         sprintf(g_dasm_str, "lsr.w   %s", get_ea_mode_str_32(g_cpu_ir));\r
1658 }\r
1659 \r
1660 static void d68000_lsl_s_8(void)\r
1661 {\r
1662         sprintf(g_dasm_str, "lsl.b   #%d, D%d", g_3bit_qdata_table[(g_cpu_ir>>9)&7], g_cpu_ir&7);\r
1663 }\r
1664 \r
1665 static void d68000_lsl_s_16(void)\r
1666 {\r
1667         sprintf(g_dasm_str, "lsl.w   #%d, D%d", g_3bit_qdata_table[(g_cpu_ir>>9)&7], g_cpu_ir&7);\r
1668 }\r
1669 \r
1670 static void d68000_lsl_s_32(void)\r
1671 {\r
1672         sprintf(g_dasm_str, "lsl.l   #%d, D%d", g_3bit_qdata_table[(g_cpu_ir>>9)&7], g_cpu_ir&7);\r
1673 }\r
1674 \r
1675 static void d68000_lsl_r_8(void)\r
1676 {\r
1677         sprintf(g_dasm_str, "lsl.b   D%d, D%d", (g_cpu_ir>>9)&7, g_cpu_ir&7);\r
1678 }\r
1679 \r
1680 static void d68000_lsl_r_16(void)\r
1681 {\r
1682         sprintf(g_dasm_str, "lsl.w   D%d, D%d", (g_cpu_ir>>9)&7, g_cpu_ir&7);\r
1683 }\r
1684 \r
1685 static void d68000_lsl_r_32(void)\r
1686 {\r
1687         sprintf(g_dasm_str, "lsl.l   D%d, D%d", (g_cpu_ir>>9)&7, g_cpu_ir&7);\r
1688 }\r
1689 \r
1690 static void d68000_lsl_ea(void)\r
1691 {\r
1692         sprintf(g_dasm_str, "lsl.w   %s", get_ea_mode_str_32(g_cpu_ir));\r
1693 }\r
1694 \r
1695 static void d68000_move_8(void)\r
1696 {\r
1697         char* str = get_ea_mode_str_8(g_cpu_ir);\r
1698         sprintf(g_dasm_str, "move.b  %s, %s", str, get_ea_mode_str_8(((g_cpu_ir>>9) & 7) | ((g_cpu_ir>>3) & 0x38)));\r
1699 }\r
1700 \r
1701 static void d68000_move_16(void)\r
1702 {\r
1703         char* str = get_ea_mode_str_16(g_cpu_ir);\r
1704         sprintf(g_dasm_str, "move.w  %s, %s", str, get_ea_mode_str_16(((g_cpu_ir>>9) & 7) | ((g_cpu_ir>>3) & 0x38)));\r
1705 }\r
1706 \r
1707 static void d68000_move_32(void)\r
1708 {\r
1709         char* str = get_ea_mode_str_32(g_cpu_ir);\r
1710         sprintf(g_dasm_str, "move.l  %s, %s", str, get_ea_mode_str_32(((g_cpu_ir>>9) & 7) | ((g_cpu_ir>>3) & 0x38)));\r
1711 }\r
1712 \r
1713 static void d68000_movea_16(void)\r
1714 {\r
1715         sprintf(g_dasm_str, "movea.w %s, A%d", get_ea_mode_str_16(g_cpu_ir), (g_cpu_ir>>9)&7);\r
1716 }\r
1717 \r
1718 static void d68000_movea_32(void)\r
1719 {\r
1720         sprintf(g_dasm_str, "movea.l %s, A%d", get_ea_mode_str_32(g_cpu_ir), (g_cpu_ir>>9)&7);\r
1721 }\r
1722 \r
1723 static void d68000_move_to_ccr(void)\r
1724 {\r
1725         sprintf(g_dasm_str, "move    %s, CCR", get_ea_mode_str_8(g_cpu_ir));\r
1726 }\r
1727 \r
1728 static void d68010_move_fr_ccr(void)\r
1729 {\r
1730         LIMIT_CPU_TYPES(M68010_PLUS);\r
1731         sprintf(g_dasm_str, "move    CCR, %s; (1+)", get_ea_mode_str_8(g_cpu_ir));\r
1732 }\r
1733 \r
1734 static void d68000_move_fr_sr(void)\r
1735 {\r
1736         sprintf(g_dasm_str, "move    SR, %s", get_ea_mode_str_16(g_cpu_ir));\r
1737 }\r
1738 \r
1739 static void d68000_move_to_sr(void)\r
1740 {\r
1741         sprintf(g_dasm_str, "move    %s, SR", get_ea_mode_str_16(g_cpu_ir));\r
1742 }\r
1743 \r
1744 static void d68000_move_fr_usp(void)\r
1745 {\r
1746         sprintf(g_dasm_str, "move    USP, A%d", g_cpu_ir&7);\r
1747 }\r
1748 \r
1749 static void d68000_move_to_usp(void)\r
1750 {\r
1751         sprintf(g_dasm_str, "move    A%d, USP", g_cpu_ir&7);\r
1752 }\r
1753 \r
1754 static void d68010_movec(void)\r
1755 {\r
1756         uint extension;\r
1757         char* reg_name;\r
1758         char* processor;\r
1759         LIMIT_CPU_TYPES(M68010_PLUS);\r
1760         extension = read_imm_16();\r
1761 \r
1762         switch(extension & 0xfff)\r
1763         {\r
1764                 case 0x000:\r
1765                         reg_name = "SFC";\r
1766                         processor = "1+";\r
1767                         break;\r
1768                 case 0x001:\r
1769                         reg_name = "DFC";\r
1770                         processor = "1+";\r
1771                         break;\r
1772                 case 0x800:\r
1773                         reg_name = "USP";\r
1774                         processor = "1+";\r
1775                         break;\r
1776                 case 0x801:\r
1777                         reg_name = "VBR";\r
1778                         processor = "1+";\r
1779                         break;\r
1780                 case 0x002:\r
1781                         reg_name = "CACR";\r
1782                         processor = "2+";\r
1783                         break;\r
1784                 case 0x802:\r
1785                         reg_name = "CAAR";\r
1786                         processor = "2,3";\r
1787                         break;\r
1788                 case 0x803:\r
1789                         reg_name = "MSP";\r
1790                         processor = "2+";\r
1791                         break;\r
1792                 case 0x804:\r
1793                         reg_name = "ISP";\r
1794                         processor = "2+";\r
1795                         break;\r
1796                 case 0x003:\r
1797                         reg_name = "TC";\r
1798                         processor = "4+";\r
1799                         break;\r
1800                 case 0x004:\r
1801                         reg_name = "ITT0";\r
1802                         processor = "4+";\r
1803                         break;\r
1804                 case 0x005:\r
1805                         reg_name = "ITT1";\r
1806                         processor = "4+";\r
1807                         break;\r
1808                 case 0x006:\r
1809                         reg_name = "DTT0";\r
1810                         processor = "4+";\r
1811                         break;\r
1812                 case 0x007:\r
1813                         reg_name = "DTT1";\r
1814                         processor = "4+";\r
1815                         break;\r
1816                 case 0x805:\r
1817                         reg_name = "MMUSR";\r
1818                         processor = "4+";\r
1819                         break;\r
1820                 case 0x806:\r
1821                         reg_name = "URP";\r
1822                         processor = "4+";\r
1823                         break;\r
1824                 case 0x807:\r
1825                         reg_name = "SRP";\r
1826                         processor = "4+";\r
1827                         break;\r
1828                 default:\r
1829                         reg_name = make_signed_hex_str_16(extension & 0xfff);\r
1830                         processor = "?";\r
1831         }\r
1832 \r
1833         if(BIT_1(g_cpu_ir))\r
1834                 sprintf(g_dasm_str, "movec %c%d, %s; (%s)", BIT_F(extension) ? 'A' : 'D', (extension>>12)&7, reg_name, processor);\r
1835         else\r
1836                 sprintf(g_dasm_str, "movec %s, %c%d; (%s)", reg_name, BIT_F(extension) ? 'A' : 'D', (extension>>12)&7, processor);\r
1837 }\r
1838 \r
1839 static void d68000_movem_pd_16(void)\r
1840 {\r
1841         uint data = read_imm_16();\r
1842         char buffer[40];\r
1843         uint first;\r
1844         uint run_length;\r
1845         uint i;\r
1846 \r
1847         buffer[0] = 0;\r
1848         for(i=0;i<8;i++)\r
1849         {\r
1850                 if(data&(1<<(15-i)))\r
1851                 {\r
1852                         first = i;\r
1853                         run_length = 0;\r
1854                         for(i++;i<8;i++)\r
1855                                 if(data&(1<<(15-i)))\r
1856                                         run_length++;\r
1857                         if(buffer[0] != 0)\r
1858                                 strcat(buffer, "/");\r
1859                         sprintf(buffer+strlen(buffer), "D%d", first);\r
1860                         if(run_length > 0)\r
1861                                 sprintf(buffer+strlen(buffer), "-D%d", first + run_length);\r
1862                 }\r
1863         }\r
1864         for(i=0;i<8;i++)\r
1865         {\r
1866                 if(data&(1<<(7-i)))\r
1867                 {\r
1868                         first = i;\r
1869                         run_length = 0;\r
1870                         for(i++;i<8;i++)\r
1871                                 if(data&(1<<(7-i)))\r
1872                                         run_length++;\r
1873                         if(buffer[0] != 0)\r
1874                                 strcat(buffer, "/");\r
1875                         sprintf(buffer+strlen(buffer), "A%d", first);\r
1876                         if(run_length > 0)\r
1877                                 sprintf(buffer+strlen(buffer), "-A%d", first + run_length);\r
1878                 }\r
1879         }\r
1880         sprintf(g_dasm_str, "movem.w %s, %s", buffer, get_ea_mode_str_16(g_cpu_ir));\r
1881 }\r
1882 \r
1883 static void d68000_movem_pd_32(void)\r
1884 {\r
1885         uint data = read_imm_16();\r
1886         char buffer[40];\r
1887         uint first;\r
1888         uint run_length;\r
1889         uint i;\r
1890 \r
1891         buffer[0] = 0;\r
1892         for(i=0;i<8;i++)\r
1893         {\r
1894                 if(data&(1<<(15-i)))\r
1895                 {\r
1896                         first = i;\r
1897                         run_length = 0;\r
1898                         for(i++;i<8;i++)\r
1899                                 if(data&(1<<(15-i)))\r
1900                                         run_length++;\r
1901                         if(buffer[0] != 0)\r
1902                                 strcat(buffer, "/");\r
1903                         sprintf(buffer+strlen(buffer), "D%d", first);\r
1904                         if(run_length > 0)\r
1905                                 sprintf(buffer+strlen(buffer), "-D%d", first + run_length);\r
1906                 }\r
1907         }\r
1908         for(i=0;i<8;i++)\r
1909         {\r
1910                 if(data&(1<<(7-i)))\r
1911                 {\r
1912                         first = i;\r
1913                         run_length = 0;\r
1914                         for(i++;i<8;i++)\r
1915                                 if(data&(1<<(7-i)))\r
1916                                         run_length++;\r
1917                         if(buffer[0] != 0)\r
1918                                 strcat(buffer, "/");\r
1919                         sprintf(buffer+strlen(buffer), "A%d", first);\r
1920                         if(run_length > 0)\r
1921                                 sprintf(buffer+strlen(buffer), "-A%d", first + run_length);\r
1922                 }\r
1923         }\r
1924         sprintf(g_dasm_str, "movem.l %s, %s", buffer, get_ea_mode_str_32(g_cpu_ir));\r
1925 }\r
1926 \r
1927 static void d68000_movem_er_16(void)\r
1928 {\r
1929         uint data = read_imm_16();\r
1930         char buffer[40];\r
1931         uint first;\r
1932         uint run_length;\r
1933         uint i;\r
1934 \r
1935         buffer[0] = 0;\r
1936         for(i=0;i<8;i++)\r
1937         {\r
1938                 if(data&(1<<i))\r
1939                 {\r
1940                         first = i;\r
1941                         run_length = 0;\r
1942                         for(i++;i<8;i++)\r
1943                                 if(data&(1<<i))\r
1944                                         run_length++;\r
1945                         if(buffer[0] != 0)\r
1946                                 strcat(buffer, "/");\r
1947                         sprintf(buffer+strlen(buffer), "D%d", first);\r
1948                         if(run_length > 0)\r
1949                                 sprintf(buffer+strlen(buffer), "-D%d", first + run_length);\r
1950                 }\r
1951         }\r
1952         for(i=0;i<8;i++)\r
1953         {\r
1954                 if(data&(1<<(i+8)))\r
1955                 {\r
1956                         first = i;\r
1957                         run_length = 0;\r
1958                         for(i++;i<8;i++)\r
1959                                 if(data&(1<<(i+8)))\r
1960                                         run_length++;\r
1961                         if(buffer[0] != 0)\r
1962                                 strcat(buffer, "/");\r
1963                         sprintf(buffer+strlen(buffer), "A%d", first);\r
1964                         if(run_length > 0)\r
1965                                 sprintf(buffer+strlen(buffer), "-A%d", first + run_length);\r
1966                 }\r
1967         }\r
1968         sprintf(g_dasm_str, "movem.w %s, %s", get_ea_mode_str_16(g_cpu_ir), buffer);\r
1969 }\r
1970 \r
1971 static void d68000_movem_er_32(void)\r
1972 {\r
1973         uint data = read_imm_16();\r
1974         char buffer[40];\r
1975         uint first;\r
1976         uint run_length;\r
1977         uint i;\r
1978 \r
1979         buffer[0] = 0;\r
1980         for(i=0;i<8;i++)\r
1981         {\r
1982                 if(data&(1<<i))\r
1983                 {\r
1984                         first = i;\r
1985                         run_length = 0;\r
1986                         for(i++;i<8;i++)\r
1987                                 if(data&(1<<i))\r
1988                                         run_length++;\r
1989                         if(buffer[0] != 0)\r
1990                                 strcat(buffer, "/");\r
1991                         sprintf(buffer+strlen(buffer), "D%d", first);\r
1992                         if(run_length > 0)\r
1993                                 sprintf(buffer+strlen(buffer), "-D%d", first + run_length);\r
1994                 }\r
1995         }\r
1996         for(i=0;i<8;i++)\r
1997         {\r
1998                 if(data&(1<<(i+8)))\r
1999                 {\r
2000                         first = i;\r
2001                         run_length = 0;\r
2002                         for(i++;i<8;i++)\r
2003                                 if(data&(1<<(i+8)))\r
2004                                         run_length++;\r
2005                         if(buffer[0] != 0)\r
2006                                 strcat(buffer, "/");\r
2007                         sprintf(buffer+strlen(buffer), "A%d", first);\r
2008                         if(run_length > 0)\r
2009                                 sprintf(buffer+strlen(buffer), "-A%d", first + run_length);\r
2010                 }\r
2011         }\r
2012         sprintf(g_dasm_str, "movem.l %s, %s", get_ea_mode_str_32(g_cpu_ir), buffer);\r
2013 }\r
2014 \r
2015 static void d68000_movem_re_16(void)\r
2016 {\r
2017         uint data = read_imm_16();\r
2018         char buffer[40];\r
2019         uint first;\r
2020         uint run_length;\r
2021         uint i;\r
2022 \r
2023         buffer[0] = 0;\r
2024         for(i=0;i<8;i++)\r
2025         {\r
2026                 if(data&(1<<i))\r
2027                 {\r
2028                         first = i;\r
2029                         run_length = 0;\r
2030                         for(i++;i<8;i++)\r
2031                                 if(data&(1<<i))\r
2032                                         run_length++;\r
2033                         if(buffer[0] != 0)\r
2034                                 strcat(buffer, "/");\r
2035                         sprintf(buffer+strlen(buffer), "D%d", first);\r
2036                         if(run_length > 0)\r
2037                                 sprintf(buffer+strlen(buffer), "-D%d", first + run_length);\r
2038                 }\r
2039         }\r
2040         for(i=0;i<8;i++)\r
2041         {\r
2042                 if(data&(1<<(i+8)))\r
2043                 {\r
2044                         first = i;\r
2045                         run_length = 0;\r
2046                         for(i++;i<8;i++)\r
2047                                 if(data&(1<<(i+8)))\r
2048                                         run_length++;\r
2049                         if(buffer[0] != 0)\r
2050                                 strcat(buffer, "/");\r
2051                         sprintf(buffer+strlen(buffer), "A%d", first);\r
2052                         if(run_length > 0)\r
2053                                 sprintf(buffer+strlen(buffer), "-A%d", first + run_length);\r
2054                 }\r
2055         }\r
2056         sprintf(g_dasm_str, "movem.w %s, %s", buffer, get_ea_mode_str_16(g_cpu_ir));\r
2057 }\r
2058 \r
2059 static void d68000_movem_re_32(void)\r
2060 {\r
2061         uint data = read_imm_16();\r
2062         char buffer[40];\r
2063         uint first;\r
2064         uint run_length;\r
2065         uint i;\r
2066 \r
2067         buffer[0] = 0;\r
2068         for(i=0;i<8;i++)\r
2069         {\r
2070                 if(data&(1<<i))\r
2071                 {\r
2072                         first = i;\r
2073                         run_length = 0;\r
2074                         for(i++;i<8;i++)\r
2075                                 if(data&(1<<i))\r
2076                                         run_length++;\r
2077                         if(buffer[0] != 0)\r
2078                                 strcat(buffer, "/");\r
2079                         sprintf(buffer+strlen(buffer), "D%d", first);\r
2080                         if(run_length > 0)\r
2081                                 sprintf(buffer+strlen(buffer), "-D%d", first + run_length);\r
2082                 }\r
2083         }\r
2084         for(i=0;i<8;i++)\r
2085         {\r
2086                 if(data&(1<<(i+8)))\r
2087                 {\r
2088                         first = i;\r
2089                         run_length = 0;\r
2090                         for(i++;i<8;i++)\r
2091                                 if(data&(1<<(i+8)))\r
2092                                         run_length++;\r
2093                         if(buffer[0] != 0)\r
2094                                 strcat(buffer, "/");\r
2095                         sprintf(buffer+strlen(buffer), "A%d", first);\r
2096                         if(run_length > 0)\r
2097                                 sprintf(buffer+strlen(buffer), "-A%d", first + run_length);\r
2098                 }\r
2099         }\r
2100         sprintf(g_dasm_str, "movem.l %s, %s", buffer, get_ea_mode_str_32(g_cpu_ir));\r
2101 }\r
2102 \r
2103 static void d68000_movep_re_16(void)\r
2104 {\r
2105         sprintf(g_dasm_str, "movep.w D%d, ($%x,A%d)", (g_cpu_ir>>9)&7, read_imm_16(), g_cpu_ir&7);\r
2106 }\r
2107 \r
2108 static void d68000_movep_re_32(void)\r
2109 {\r
2110         sprintf(g_dasm_str, "movep.l D%d, ($%x,A%d)", (g_cpu_ir>>9)&7, read_imm_16(), g_cpu_ir&7);\r
2111 }\r
2112 \r
2113 static void d68000_movep_er_16(void)\r
2114 {\r
2115         sprintf(g_dasm_str, "movep.w ($%x,A%d), D%d", read_imm_16(), g_cpu_ir&7, (g_cpu_ir>>9)&7);\r
2116 }\r
2117 \r
2118 static void d68000_movep_er_32(void)\r
2119 {\r
2120         sprintf(g_dasm_str, "movep.l ($%x,A%d), D%d", read_imm_16(), g_cpu_ir&7, (g_cpu_ir>>9)&7);\r
2121 }\r
2122 \r
2123 static void d68010_moves_8(void)\r
2124 {\r
2125         uint extension;\r
2126         LIMIT_CPU_TYPES(M68010_PLUS);\r
2127         extension = read_imm_16();\r
2128         if(BIT_B(extension))\r
2129                 sprintf(g_dasm_str, "moves.b %c%d, %s; (1+)", BIT_F(extension) ? 'A' : 'D', (extension>>12)&7, get_ea_mode_str_8(g_cpu_ir));\r
2130         else\r
2131                 sprintf(g_dasm_str, "moves.b %s, %c%d; (1+)", get_ea_mode_str_8(g_cpu_ir), BIT_F(extension) ? 'A' : 'D', (extension>>12)&7);\r
2132 }\r
2133 \r
2134 static void d68010_moves_16(void)\r
2135 {\r
2136         uint extension;\r
2137         LIMIT_CPU_TYPES(M68010_PLUS);\r
2138         extension = read_imm_16();\r
2139         if(BIT_B(extension))\r
2140                 sprintf(g_dasm_str, "moves.w %c%d, %s; (1+)", BIT_F(extension) ? 'A' : 'D', (extension>>12)&7, get_ea_mode_str_16(g_cpu_ir));\r
2141         else\r
2142                 sprintf(g_dasm_str, "moves.w %s, %c%d; (1+)", get_ea_mode_str_16(g_cpu_ir), BIT_F(extension) ? 'A' : 'D', (extension>>12)&7);\r
2143 }\r
2144 \r
2145 static void d68010_moves_32(void)\r
2146 {\r
2147         uint extension;\r
2148         LIMIT_CPU_TYPES(M68010_PLUS);\r
2149         extension = read_imm_16();\r
2150         if(BIT_B(extension))\r
2151                 sprintf(g_dasm_str, "moves.l %c%d, %s; (1+)", BIT_F(extension) ? 'A' : 'D', (extension>>12)&7, get_ea_mode_str_32(g_cpu_ir));\r
2152         else\r
2153                 sprintf(g_dasm_str, "moves.l %s, %c%d; (1+)", get_ea_mode_str_32(g_cpu_ir), BIT_F(extension) ? 'A' : 'D', (extension>>12)&7);\r
2154 }\r
2155 \r
2156 static void d68000_moveq(void)\r
2157 {\r
2158         sprintf(g_dasm_str, "moveq   #%s, D%d", make_signed_hex_str_8(g_cpu_ir), (g_cpu_ir>>9)&7);\r
2159 }\r
2160 \r
2161 static void d68040_move16_pi_pi(void)\r
2162 {\r
2163         LIMIT_CPU_TYPES(M68040_PLUS);\r
2164         sprintf(g_dasm_str, "move16  (A%d)+, (A%d)+; (4)", g_cpu_ir&7, (read_imm_16()>>12)&7);\r
2165 }\r
2166 \r
2167 static void d68040_move16_pi_al(void)\r
2168 {\r
2169         LIMIT_CPU_TYPES(M68040_PLUS);\r
2170         sprintf(g_dasm_str, "move16  (A%d)+, %s; (4)", g_cpu_ir&7, get_imm_str_u32());\r
2171 }\r
2172 \r
2173 static void d68040_move16_al_pi(void)\r
2174 {\r
2175         LIMIT_CPU_TYPES(M68040_PLUS);\r
2176         sprintf(g_dasm_str, "move16  %s, (A%d)+; (4)", get_imm_str_u32(), g_cpu_ir&7);\r
2177 }\r
2178 \r
2179 static void d68040_move16_ai_al(void)\r
2180 {\r
2181         LIMIT_CPU_TYPES(M68040_PLUS);\r
2182         sprintf(g_dasm_str, "move16  (A%d), %s; (4)", g_cpu_ir&7, get_imm_str_u32());\r
2183 }\r
2184 \r
2185 static void d68040_move16_al_ai(void)\r
2186 {\r
2187         LIMIT_CPU_TYPES(M68040_PLUS);\r
2188         sprintf(g_dasm_str, "move16  %s, (A%d); (4)", get_imm_str_u32(), g_cpu_ir&7);\r
2189 }\r
2190 \r
2191 static void d68000_muls(void)\r
2192 {\r
2193         sprintf(g_dasm_str, "muls.w  %s, D%d", get_ea_mode_str_16(g_cpu_ir), (g_cpu_ir>>9)&7);\r
2194 }\r
2195 \r
2196 static void d68000_mulu(void)\r
2197 {\r
2198         sprintf(g_dasm_str, "mulu.w  %s, D%d", get_ea_mode_str_16(g_cpu_ir), (g_cpu_ir>>9)&7);\r
2199 }\r
2200 \r
2201 static void d68020_mull(void)\r
2202 {\r
2203         uint extension;\r
2204         LIMIT_CPU_TYPES(M68020_PLUS);\r
2205         extension = read_imm_16();\r
2206 \r
2207         if(BIT_A(extension))\r
2208                 sprintf(g_dasm_str, "mul%c.l %s, D%d-D%d; (2+)", BIT_B(extension) ? 's' : 'u', get_ea_mode_str_32(g_cpu_ir), extension&7, (extension>>12)&7);\r
2209         else\r
2210                 sprintf(g_dasm_str, "mul%c.l  %s, D%d; (2+)", BIT_B(extension) ? 's' : 'u', get_ea_mode_str_32(g_cpu_ir), (extension>>12)&7);\r
2211 }\r
2212 \r
2213 static void d68000_nbcd(void)\r
2214 {\r
2215         sprintf(g_dasm_str, "nbcd    %s", get_ea_mode_str_8(g_cpu_ir));\r
2216 }\r
2217 \r
2218 static void d68000_neg_8(void)\r
2219 {\r
2220         sprintf(g_dasm_str, "neg.b   %s", get_ea_mode_str_8(g_cpu_ir));\r
2221 }\r
2222 \r
2223 static void d68000_neg_16(void)\r
2224 {\r
2225         sprintf(g_dasm_str, "neg.w   %s", get_ea_mode_str_16(g_cpu_ir));\r
2226 }\r
2227 \r
2228 static void d68000_neg_32(void)\r
2229 {\r
2230         sprintf(g_dasm_str, "neg.l   %s", get_ea_mode_str_32(g_cpu_ir));\r
2231 }\r
2232 \r
2233 static void d68000_negx_8(void)\r
2234 {\r
2235         sprintf(g_dasm_str, "negx.b  %s", get_ea_mode_str_8(g_cpu_ir));\r
2236 }\r
2237 \r
2238 static void d68000_negx_16(void)\r
2239 {\r
2240         sprintf(g_dasm_str, "negx.w  %s", get_ea_mode_str_16(g_cpu_ir));\r
2241 }\r
2242 \r
2243 static void d68000_negx_32(void)\r
2244 {\r
2245         sprintf(g_dasm_str, "negx.l  %s", get_ea_mode_str_32(g_cpu_ir));\r
2246 }\r
2247 \r
2248 static void d68000_nop(void)\r
2249 {\r
2250         sprintf(g_dasm_str, "nop");\r
2251 }\r
2252 \r
2253 static void d68000_not_8(void)\r
2254 {\r
2255         sprintf(g_dasm_str, "not.b   %s", get_ea_mode_str_8(g_cpu_ir));\r
2256 }\r
2257 \r
2258 static void d68000_not_16(void)\r
2259 {\r
2260         sprintf(g_dasm_str, "not.w   %s", get_ea_mode_str_16(g_cpu_ir));\r
2261 }\r
2262 \r
2263 static void d68000_not_32(void)\r
2264 {\r
2265         sprintf(g_dasm_str, "not.l   %s", get_ea_mode_str_32(g_cpu_ir));\r
2266 }\r
2267 \r
2268 static void d68000_or_er_8(void)\r
2269 {\r
2270         sprintf(g_dasm_str, "or.b    %s, D%d", get_ea_mode_str_8(g_cpu_ir), (g_cpu_ir>>9)&7);\r
2271 }\r
2272 \r
2273 static void d68000_or_er_16(void)\r
2274 {\r
2275         sprintf(g_dasm_str, "or.w    %s, D%d", get_ea_mode_str_16(g_cpu_ir), (g_cpu_ir>>9)&7);\r
2276 }\r
2277 \r
2278 static void d68000_or_er_32(void)\r
2279 {\r
2280         sprintf(g_dasm_str, "or.l    %s, D%d", get_ea_mode_str_32(g_cpu_ir), (g_cpu_ir>>9)&7);\r
2281 }\r
2282 \r
2283 static void d68000_or_re_8(void)\r
2284 {\r
2285         sprintf(g_dasm_str, "or.b    D%d, %s", (g_cpu_ir>>9)&7, get_ea_mode_str_8(g_cpu_ir));\r
2286 }\r
2287 \r
2288 static void d68000_or_re_16(void)\r
2289 {\r
2290         sprintf(g_dasm_str, "or.w    D%d, %s", (g_cpu_ir>>9)&7, get_ea_mode_str_16(g_cpu_ir));\r
2291 }\r
2292 \r
2293 static void d68000_or_re_32(void)\r
2294 {\r
2295         sprintf(g_dasm_str, "or.l    D%d, %s", (g_cpu_ir>>9)&7, get_ea_mode_str_32(g_cpu_ir));\r
2296 }\r
2297 \r
2298 static void d68000_ori_8(void)\r
2299 {\r
2300         char* str = get_imm_str_u8();\r
2301         sprintf(g_dasm_str, "ori.b   %s, %s", str, get_ea_mode_str_8(g_cpu_ir));\r
2302 }\r
2303 \r
2304 static void d68000_ori_16(void)\r
2305 {\r
2306         char* str = get_imm_str_u16();\r
2307         sprintf(g_dasm_str, "ori.w   %s, %s", str, get_ea_mode_str_16(g_cpu_ir));\r
2308 }\r
2309 \r
2310 static void d68000_ori_32(void)\r
2311 {\r
2312         char* str = get_imm_str_u32();\r
2313         sprintf(g_dasm_str, "ori.l   %s, %s", str, get_ea_mode_str_32(g_cpu_ir));\r
2314 }\r
2315 \r
2316 static void d68000_ori_to_ccr(void)\r
2317 {\r
2318         sprintf(g_dasm_str, "ori     %s, CCR", get_imm_str_u8());\r
2319 }\r
2320 \r
2321 static void d68000_ori_to_sr(void)\r
2322 {\r
2323         sprintf(g_dasm_str, "ori     %s, SR", get_imm_str_u16());\r
2324 }\r
2325 \r
2326 static void d68020_pack_rr(void)\r
2327 {\r
2328         LIMIT_CPU_TYPES(M68020_PLUS);\r
2329         sprintf(g_dasm_str, "pack    D%d, D%d, %s; (2+)", g_cpu_ir&7, (g_cpu_ir>>9)&7, get_imm_str_u16());\r
2330 }\r
2331 \r
2332 static void d68020_pack_mm(void)\r
2333 {\r
2334         LIMIT_CPU_TYPES(M68020_PLUS);\r
2335         sprintf(g_dasm_str, "pack    -(A%d), -(A%d), %s; (2+)", g_cpu_ir&7, (g_cpu_ir>>9)&7, get_imm_str_u16());\r
2336 }\r
2337 \r
2338 static void d68000_pea(void)\r
2339 {\r
2340         sprintf(g_dasm_str, "pea     %s", get_ea_mode_str_32(g_cpu_ir));\r
2341 }\r
2342 \r
2343 static void d68000_reset(void)\r
2344 {\r
2345         sprintf(g_dasm_str, "reset");\r
2346 }\r
2347 \r
2348 static void d68000_ror_s_8(void)\r
2349 {\r
2350         sprintf(g_dasm_str, "ror.b   #%d, D%d", g_3bit_qdata_table[(g_cpu_ir>>9)&7], g_cpu_ir&7);\r
2351 }\r
2352 \r
2353 static void d68000_ror_s_16(void)\r
2354 {\r
2355         sprintf(g_dasm_str, "ror.w   #%d, D%d", g_3bit_qdata_table[(g_cpu_ir>>9)&7],g_cpu_ir&7);\r
2356 }\r
2357 \r
2358 static void d68000_ror_s_32(void)\r
2359 {\r
2360         sprintf(g_dasm_str, "ror.l   #%d, D%d", g_3bit_qdata_table[(g_cpu_ir>>9)&7], g_cpu_ir&7);\r
2361 }\r
2362 \r
2363 static void d68000_ror_r_8(void)\r
2364 {\r
2365         sprintf(g_dasm_str, "ror.b   D%d, D%d", (g_cpu_ir>>9)&7, g_cpu_ir&7);\r
2366 }\r
2367 \r
2368 static void d68000_ror_r_16(void)\r
2369 {\r
2370         sprintf(g_dasm_str, "ror.w   D%d, D%d", (g_cpu_ir>>9)&7, g_cpu_ir&7);\r
2371 }\r
2372 \r
2373 static void d68000_ror_r_32(void)\r
2374 {\r
2375         sprintf(g_dasm_str, "ror.l   D%d, D%d", (g_cpu_ir>>9)&7, g_cpu_ir&7);\r
2376 }\r
2377 \r
2378 static void d68000_ror_ea(void)\r
2379 {\r
2380         sprintf(g_dasm_str, "ror.w   %s", get_ea_mode_str_32(g_cpu_ir));\r
2381 }\r
2382 \r
2383 static void d68000_rol_s_8(void)\r
2384 {\r
2385         sprintf(g_dasm_str, "rol.b   #%d, D%d", g_3bit_qdata_table[(g_cpu_ir>>9)&7], g_cpu_ir&7);\r
2386 }\r
2387 \r
2388 static void d68000_rol_s_16(void)\r
2389 {\r
2390         sprintf(g_dasm_str, "rol.w   #%d, D%d", g_3bit_qdata_table[(g_cpu_ir>>9)&7], g_cpu_ir&7);\r
2391 }\r
2392 \r
2393 static void d68000_rol_s_32(void)\r
2394 {\r
2395         sprintf(g_dasm_str, "rol.l   #%d, D%d", g_3bit_qdata_table[(g_cpu_ir>>9)&7], g_cpu_ir&7);\r
2396 }\r
2397 \r
2398 static void d68000_rol_r_8(void)\r
2399 {\r
2400         sprintf(g_dasm_str, "rol.b   D%d, D%d", (g_cpu_ir>>9)&7, g_cpu_ir&7);\r
2401 }\r
2402 \r
2403 static void d68000_rol_r_16(void)\r
2404 {\r
2405         sprintf(g_dasm_str, "rol.w   D%d, D%d", (g_cpu_ir>>9)&7, g_cpu_ir&7);\r
2406 }\r
2407 \r
2408 static void d68000_rol_r_32(void)\r
2409 {\r
2410         sprintf(g_dasm_str, "rol.l   D%d, D%d", (g_cpu_ir>>9)&7, g_cpu_ir&7);\r
2411 }\r
2412 \r
2413 static void d68000_rol_ea(void)\r
2414 {\r
2415         sprintf(g_dasm_str, "rol.w   %s", get_ea_mode_str_32(g_cpu_ir));\r
2416 }\r
2417 \r
2418 static void d68000_roxr_s_8(void)\r
2419 {\r
2420         sprintf(g_dasm_str, "roxr.b  #%d, D%d", g_3bit_qdata_table[(g_cpu_ir>>9)&7], g_cpu_ir&7);\r
2421 }\r
2422 \r
2423 static void d68000_roxr_s_16(void)\r
2424 {\r
2425         sprintf(g_dasm_str, "roxr.w  #%d, D%d", g_3bit_qdata_table[(g_cpu_ir>>9)&7], g_cpu_ir&7);\r
2426 }\r
2427 \r
2428 \r
2429 static void d68000_roxr_s_32(void)\r
2430 {\r
2431         sprintf(g_dasm_str, "roxr.l  #%d, D%d", g_3bit_qdata_table[(g_cpu_ir>>9)&7], g_cpu_ir&7);\r
2432 }\r
2433 \r
2434 static void d68000_roxr_r_8(void)\r
2435 {\r
2436         sprintf(g_dasm_str, "roxr.b  D%d, D%d", (g_cpu_ir>>9)&7, g_cpu_ir&7);\r
2437 }\r
2438 \r
2439 static void d68000_roxr_r_16(void)\r
2440 {\r
2441         sprintf(g_dasm_str, "roxr.w  D%d, D%d", (g_cpu_ir>>9)&7, g_cpu_ir&7);\r
2442 }\r
2443 \r
2444 static void d68000_roxr_r_32(void)\r
2445 {\r
2446         sprintf(g_dasm_str, "roxr.l  D%d, D%d", (g_cpu_ir>>9)&7, g_cpu_ir&7);\r
2447 }\r
2448 \r
2449 static void d68000_roxr_ea(void)\r
2450 {\r
2451         sprintf(g_dasm_str, "roxr.w  %s", get_ea_mode_str_32(g_cpu_ir));\r
2452 }\r
2453 \r
2454 static void d68000_roxl_s_8(void)\r
2455 {\r
2456         sprintf(g_dasm_str, "roxl.b  #%d, D%d", g_3bit_qdata_table[(g_cpu_ir>>9)&7], g_cpu_ir&7);\r
2457 }\r
2458 \r
2459 static void d68000_roxl_s_16(void)\r
2460 {\r
2461         sprintf(g_dasm_str, "roxl.w  #%d, D%d", g_3bit_qdata_table[(g_cpu_ir>>9)&7], g_cpu_ir&7);\r
2462 }\r
2463 \r
2464 static void d68000_roxl_s_32(void)\r
2465 {\r
2466         sprintf(g_dasm_str, "roxl.l  #%d, D%d", g_3bit_qdata_table[(g_cpu_ir>>9)&7], g_cpu_ir&7);\r
2467 }\r
2468 \r
2469 static void d68000_roxl_r_8(void)\r
2470 {\r
2471         sprintf(g_dasm_str, "roxl.b  D%d, D%d", (g_cpu_ir>>9)&7, g_cpu_ir&7);\r
2472 }\r
2473 \r
2474 static void d68000_roxl_r_16(void)\r
2475 {\r
2476         sprintf(g_dasm_str, "roxl.w  D%d, D%d", (g_cpu_ir>>9)&7, g_cpu_ir&7);\r
2477 }\r
2478 \r
2479 static void d68000_roxl_r_32(void)\r
2480 {\r
2481         sprintf(g_dasm_str, "roxl.l  D%d, D%d", (g_cpu_ir>>9)&7, g_cpu_ir&7);\r
2482 }\r
2483 \r
2484 static void d68000_roxl_ea(void)\r
2485 {\r
2486         sprintf(g_dasm_str, "roxl.w  %s", get_ea_mode_str_32(g_cpu_ir));\r
2487 }\r
2488 \r
2489 static void d68010_rtd(void)\r
2490 {\r
2491         LIMIT_CPU_TYPES(M68010_PLUS);\r
2492         sprintf(g_dasm_str, "rtd     %s; (1+)", get_imm_str_s16());\r
2493 }\r
2494 \r
2495 static void d68000_rte(void)\r
2496 {\r
2497         sprintf(g_dasm_str, "rte");\r
2498 }\r
2499 \r
2500 static void d68020_rtm(void)\r
2501 {\r
2502         LIMIT_CPU_TYPES(M68020_ONLY);\r
2503         sprintf(g_dasm_str, "rtm     %c%d; (2+)", BIT_3(g_cpu_ir) ? 'A' : 'D', g_cpu_ir&7);\r
2504 }\r
2505 \r
2506 static void d68000_rtr(void)\r
2507 {\r
2508         sprintf(g_dasm_str, "rtr");\r
2509 }\r
2510 \r
2511 static void d68000_rts(void)\r
2512 {\r
2513         sprintf(g_dasm_str, "rts");\r
2514 }\r
2515 \r
2516 static void d68000_sbcd_rr(void)\r
2517 {\r
2518         sprintf(g_dasm_str, "sbcd    D%d, D%d", g_cpu_ir&7, (g_cpu_ir>>9)&7);\r
2519 }\r
2520 \r
2521 static void d68000_sbcd_mm(void)\r
2522 {\r
2523         sprintf(g_dasm_str, "sbcd    -(A%d), -(A%d)", g_cpu_ir&7, (g_cpu_ir>>9)&7);\r
2524 }\r
2525 \r
2526 static void d68000_scc(void)\r
2527 {\r
2528         sprintf(g_dasm_str, "s%-2s     %s", g_cc[(g_cpu_ir>>8)&0xf], get_ea_mode_str_8(g_cpu_ir));\r
2529 }\r
2530 \r
2531 static void d68000_stop(void)\r
2532 {\r
2533         sprintf(g_dasm_str, "stop    %s", get_imm_str_s16());\r
2534 }\r
2535 \r
2536 static void d68000_sub_er_8(void)\r
2537 {\r
2538         sprintf(g_dasm_str, "sub.b   %s, D%d", get_ea_mode_str_8(g_cpu_ir), (g_cpu_ir>>9)&7);\r
2539 }\r
2540 \r
2541 static void d68000_sub_er_16(void)\r
2542 {\r
2543         sprintf(g_dasm_str, "sub.w   %s, D%d", get_ea_mode_str_16(g_cpu_ir), (g_cpu_ir>>9)&7);\r
2544 }\r
2545 \r
2546 static void d68000_sub_er_32(void)\r
2547 {\r
2548         sprintf(g_dasm_str, "sub.l   %s, D%d", get_ea_mode_str_32(g_cpu_ir), (g_cpu_ir>>9)&7);\r
2549 }\r
2550 \r
2551 static void d68000_sub_re_8(void)\r
2552 {\r
2553         sprintf(g_dasm_str, "sub.b   D%d, %s", (g_cpu_ir>>9)&7, get_ea_mode_str_8(g_cpu_ir));\r
2554 }\r
2555 \r
2556 static void d68000_sub_re_16(void)\r
2557 {\r
2558         sprintf(g_dasm_str, "sub.w   D%d, %s", (g_cpu_ir>>9)&7, get_ea_mode_str_16(g_cpu_ir));\r
2559 }\r
2560 \r
2561 static void d68000_sub_re_32(void)\r
2562 {\r
2563         sprintf(g_dasm_str, "sub.l   D%d, %s", (g_cpu_ir>>9)&7, get_ea_mode_str_32(g_cpu_ir));\r
2564 }\r
2565 \r
2566 static void d68000_suba_16(void)\r
2567 {\r
2568         sprintf(g_dasm_str, "suba.w  %s, A%d", get_ea_mode_str_16(g_cpu_ir), (g_cpu_ir>>9)&7);\r
2569 }\r
2570 \r
2571 static void d68000_suba_32(void)\r
2572 {\r
2573         sprintf(g_dasm_str, "suba.l  %s, A%d", get_ea_mode_str_32(g_cpu_ir), (g_cpu_ir>>9)&7);\r
2574 }\r
2575 \r
2576 static void d68000_subi_8(void)\r
2577 {\r
2578         char* str = get_imm_str_s8();\r
2579         sprintf(g_dasm_str, "subi.b  %s, %s", str, get_ea_mode_str_8(g_cpu_ir));\r
2580 }\r
2581 \r
2582 static void d68000_subi_16(void)\r
2583 {\r
2584         char* str = get_imm_str_s16();\r
2585         sprintf(g_dasm_str, "subi.w  %s, %s", str, get_ea_mode_str_16(g_cpu_ir));\r
2586 }\r
2587 \r
2588 static void d68000_subi_32(void)\r
2589 {\r
2590         char* str = get_imm_str_s32();\r
2591         sprintf(g_dasm_str, "subi.l  %s, %s", str, get_ea_mode_str_32(g_cpu_ir));\r
2592 }\r
2593 \r
2594 static void d68000_subq_8(void)\r
2595 {\r
2596         sprintf(g_dasm_str, "subq.b  #%d, %s", g_3bit_qdata_table[(g_cpu_ir>>9)&7], get_ea_mode_str_8(g_cpu_ir));\r
2597 }\r
2598 \r
2599 static void d68000_subq_16(void)\r
2600 {\r
2601         sprintf(g_dasm_str, "subq.w  #%d, %s", g_3bit_qdata_table[(g_cpu_ir>>9)&7], get_ea_mode_str_16(g_cpu_ir));\r
2602 }\r
2603 \r
2604 static void d68000_subq_32(void)\r
2605 {\r
2606         sprintf(g_dasm_str, "subq.l  #%d, %s", g_3bit_qdata_table[(g_cpu_ir>>9)&7], get_ea_mode_str_32(g_cpu_ir));\r
2607 }\r
2608 \r
2609 static void d68000_subx_rr_8(void)\r
2610 {\r
2611         sprintf(g_dasm_str, "subx.b  D%d, D%d", g_cpu_ir&7, (g_cpu_ir>>9)&7);\r
2612 }\r
2613 \r
2614 static void d68000_subx_rr_16(void)\r
2615 {\r
2616         sprintf(g_dasm_str, "subx.w  D%d, D%d", g_cpu_ir&7, (g_cpu_ir>>9)&7);\r
2617 }\r
2618 \r
2619 static void d68000_subx_rr_32(void)\r
2620 {\r
2621         sprintf(g_dasm_str, "subx.l  D%d, D%d", g_cpu_ir&7, (g_cpu_ir>>9)&7);\r
2622 }\r
2623 \r
2624 static void d68000_subx_mm_8(void)\r
2625 {\r
2626         sprintf(g_dasm_str, "subx.b  -(A%d), -(A%d)", g_cpu_ir&7, (g_cpu_ir>>9)&7);\r
2627 }\r
2628 \r
2629 static void d68000_subx_mm_16(void)\r
2630 {\r
2631         sprintf(g_dasm_str, "subx.w  -(A%d), -(A%d)", g_cpu_ir&7, (g_cpu_ir>>9)&7);\r
2632 }\r
2633 \r
2634 static void d68000_subx_mm_32(void)\r
2635 {\r
2636         sprintf(g_dasm_str, "subx.l  -(A%d), -(A%d)", g_cpu_ir&7, (g_cpu_ir>>9)&7);\r
2637 }\r
2638 \r
2639 static void d68000_swap(void)\r
2640 {\r
2641         sprintf(g_dasm_str, "swap    D%d", g_cpu_ir&7);\r
2642 }\r
2643 \r
2644 static void d68000_tas(void)\r
2645 {\r
2646         sprintf(g_dasm_str, "tas     %s", get_ea_mode_str_8(g_cpu_ir));\r
2647 }\r
2648 \r
2649 static void d68000_trap(void)\r
2650 {\r
2651         sprintf(g_dasm_str, "trap    #$%x", g_cpu_ir&0xf);\r
2652 }\r
2653 \r
2654 static void d68020_trapcc_0(void)\r
2655 {\r
2656         LIMIT_CPU_TYPES(M68020_PLUS);\r
2657         sprintf(g_dasm_str, "trap%-2s; (2+)", g_cc[(g_cpu_ir>>8)&0xf]);\r
2658 }\r
2659 \r
2660 static void d68020_trapcc_16(void)\r
2661 {\r
2662         LIMIT_CPU_TYPES(M68020_PLUS);\r
2663         sprintf(g_dasm_str, "trap%-2s  %s; (2+)", g_cc[(g_cpu_ir>>8)&0xf], get_imm_str_u16());\r
2664 }\r
2665 \r
2666 static void d68020_trapcc_32(void)\r
2667 {\r
2668         LIMIT_CPU_TYPES(M68020_PLUS);\r
2669         sprintf(g_dasm_str, "trap%-2s  %s; (2+)", g_cc[(g_cpu_ir>>8)&0xf], get_imm_str_u32());\r
2670 }\r
2671 \r
2672 static void d68000_trapv(void)\r
2673 {\r
2674         sprintf(g_dasm_str, "trapv");\r
2675 }\r
2676 \r
2677 static void d68000_tst_8(void)\r
2678 {\r
2679         sprintf(g_dasm_str, "tst.b   %s", get_ea_mode_str_8(g_cpu_ir));\r
2680 }\r
2681 \r
2682 static void d68020_tst_pcdi_8(void)\r
2683 {\r
2684         LIMIT_CPU_TYPES(M68020_PLUS);\r
2685         sprintf(g_dasm_str, "tst.b   %s; (2+)", get_ea_mode_str_8(g_cpu_ir));\r
2686 }\r
2687 \r
2688 static void d68020_tst_pcix_8(void)\r
2689 {\r
2690         LIMIT_CPU_TYPES(M68020_PLUS);\r
2691         sprintf(g_dasm_str, "tst.b   %s; (2+)", get_ea_mode_str_8(g_cpu_ir));\r
2692 }\r
2693 \r
2694 static void d68020_tst_i_8(void)\r
2695 {\r
2696         LIMIT_CPU_TYPES(M68020_PLUS);\r
2697         sprintf(g_dasm_str, "tst.b   %s; (2+)", get_ea_mode_str_8(g_cpu_ir));\r
2698 }\r
2699 \r
2700 static void d68000_tst_16(void)\r
2701 {\r
2702         sprintf(g_dasm_str, "tst.w   %s", get_ea_mode_str_16(g_cpu_ir));\r
2703 }\r
2704 \r
2705 static void d68020_tst_a_16(void)\r
2706 {\r
2707         LIMIT_CPU_TYPES(M68020_PLUS);\r
2708         sprintf(g_dasm_str, "tst.w   %s; (2+)", get_ea_mode_str_16(g_cpu_ir));\r
2709 }\r
2710 \r
2711 static void d68020_tst_pcdi_16(void)\r
2712 {\r
2713         LIMIT_CPU_TYPES(M68020_PLUS);\r
2714         sprintf(g_dasm_str, "tst.w   %s; (2+)", get_ea_mode_str_16(g_cpu_ir));\r
2715 }\r
2716 \r
2717 static void d68020_tst_pcix_16(void)\r
2718 {\r
2719         LIMIT_CPU_TYPES(M68020_PLUS);\r
2720         sprintf(g_dasm_str, "tst.w   %s; (2+)", get_ea_mode_str_16(g_cpu_ir));\r
2721 }\r
2722 \r
2723 static void d68020_tst_i_16(void)\r
2724 {\r
2725         LIMIT_CPU_TYPES(M68020_PLUS);\r
2726         sprintf(g_dasm_str, "tst.w   %s; (2+)", get_ea_mode_str_16(g_cpu_ir));\r
2727 }\r
2728 \r
2729 static void d68000_tst_32(void)\r
2730 {\r
2731         sprintf(g_dasm_str, "tst.l   %s", get_ea_mode_str_32(g_cpu_ir));\r
2732 }\r
2733 \r
2734 static void d68020_tst_a_32(void)\r
2735 {\r
2736         LIMIT_CPU_TYPES(M68020_PLUS);\r
2737         sprintf(g_dasm_str, "tst.l   %s; (2+)", get_ea_mode_str_32(g_cpu_ir));\r
2738 }\r
2739 \r
2740 static void d68020_tst_pcdi_32(void)\r
2741 {\r
2742         LIMIT_CPU_TYPES(M68020_PLUS);\r
2743         sprintf(g_dasm_str, "tst.l   %s; (2+)", get_ea_mode_str_32(g_cpu_ir));\r
2744 }\r
2745 \r
2746 static void d68020_tst_pcix_32(void)\r
2747 {\r
2748         LIMIT_CPU_TYPES(M68020_PLUS);\r
2749         sprintf(g_dasm_str, "tst.l   %s; (2+)", get_ea_mode_str_32(g_cpu_ir));\r
2750 }\r
2751 \r
2752 static void d68020_tst_i_32(void)\r
2753 {\r
2754         LIMIT_CPU_TYPES(M68020_PLUS);\r
2755         sprintf(g_dasm_str, "tst.l   %s; (2+)", get_ea_mode_str_32(g_cpu_ir));\r
2756 }\r
2757 \r
2758 static void d68000_unlk(void)\r
2759 {\r
2760         sprintf(g_dasm_str, "unlk    A%d", g_cpu_ir&7);\r
2761 }\r
2762 \r
2763 static void d68020_unpk_rr(void)\r
2764 {\r
2765         LIMIT_CPU_TYPES(M68020_PLUS);\r
2766         sprintf(g_dasm_str, "unpk    D%d, D%d, %s; (2+)", g_cpu_ir&7, (g_cpu_ir>>9)&7, get_imm_str_u16());\r
2767 }\r
2768 \r
2769 static void d68020_unpk_mm(void)\r
2770 {\r
2771         LIMIT_CPU_TYPES(M68020_PLUS);\r
2772         sprintf(g_dasm_str, "unpk    -(A%d), -(A%d), %s; (2+)", g_cpu_ir&7, (g_cpu_ir>>9)&7, get_imm_str_u16());\r
2773 }\r
2774 \r
2775 \r
2776 \r
2777 /* ======================================================================== */\r
2778 /* ======================= INSTRUCTION TABLE BUILDER ====================== */\r
2779 /* ======================================================================== */\r
2780 \r
2781 /* EA Masks:\r
2782 800 = data register direct\r
2783 400 = address register direct\r
2784 200 = address register indirect\r
2785 100 = ARI postincrement\r
2786  80 = ARI pre-decrement\r
2787  40 = ARI displacement\r
2788  20 = ARI index\r
2789  10 = absolute short\r
2790   8 = absolute long\r
2791   4 = immediate / sr\r
2792   2 = pc displacement\r
2793   1 = pc idx\r
2794 */\r
2795 \r
2796 static opcode_struct g_opcode_info[] =\r
2797 {\r
2798 /*  opcode handler    mask    match   ea mask */\r
2799         {d68000_1010         , 0xf000, 0xa000, 0x000},\r
2800         {d68000_1111         , 0xf000, 0xf000, 0x000},\r
2801         {d68000_abcd_rr      , 0xf1f8, 0xc100, 0x000},\r
2802         {d68000_abcd_mm      , 0xf1f8, 0xc108, 0x000},\r
2803         {d68000_add_er_8     , 0xf1c0, 0xd000, 0xbff},\r
2804         {d68000_add_er_16    , 0xf1c0, 0xd040, 0xfff},\r
2805         {d68000_add_er_32    , 0xf1c0, 0xd080, 0xfff},\r
2806         {d68000_add_re_8     , 0xf1c0, 0xd100, 0x3f8},\r
2807         {d68000_add_re_16    , 0xf1c0, 0xd140, 0x3f8},\r
2808         {d68000_add_re_32    , 0xf1c0, 0xd180, 0x3f8},\r
2809         {d68000_adda_16      , 0xf1c0, 0xd0c0, 0xfff},\r
2810         {d68000_adda_32      , 0xf1c0, 0xd1c0, 0xfff},\r
2811         {d68000_addi_8       , 0xffc0, 0x0600, 0xbf8},\r
2812         {d68000_addi_16      , 0xffc0, 0x0640, 0xbf8},\r
2813         {d68000_addi_32      , 0xffc0, 0x0680, 0xbf8},\r
2814         {d68000_addq_8       , 0xf1c0, 0x5000, 0xbf8},\r
2815         {d68000_addq_16      , 0xf1c0, 0x5040, 0xff8},\r
2816         {d68000_addq_32      , 0xf1c0, 0x5080, 0xff8},\r
2817         {d68000_addx_rr_8    , 0xf1f8, 0xd100, 0x000},\r
2818         {d68000_addx_rr_16   , 0xf1f8, 0xd140, 0x000},\r
2819         {d68000_addx_rr_32   , 0xf1f8, 0xd180, 0x000},\r
2820         {d68000_addx_mm_8    , 0xf1f8, 0xd108, 0x000},\r
2821         {d68000_addx_mm_16   , 0xf1f8, 0xd148, 0x000},\r
2822         {d68000_addx_mm_32   , 0xf1f8, 0xd188, 0x000},\r
2823         {d68000_and_er_8     , 0xf1c0, 0xc000, 0xbff},\r
2824         {d68000_and_er_16    , 0xf1c0, 0xc040, 0xbff},\r
2825         {d68000_and_er_32    , 0xf1c0, 0xc080, 0xbff},\r
2826         {d68000_and_re_8     , 0xf1c0, 0xc100, 0x3f8},\r
2827         {d68000_and_re_16    , 0xf1c0, 0xc140, 0x3f8},\r
2828         {d68000_and_re_32    , 0xf1c0, 0xc180, 0x3f8},\r
2829         {d68000_andi_to_ccr  , 0xffff, 0x023c, 0x000},\r
2830         {d68000_andi_to_sr   , 0xffff, 0x027c, 0x000},\r
2831         {d68000_andi_8       , 0xffc0, 0x0200, 0xbf8},\r
2832         {d68000_andi_16      , 0xffc0, 0x0240, 0xbf8},\r
2833         {d68000_andi_32      , 0xffc0, 0x0280, 0xbf8},\r
2834         {d68000_asr_s_8      , 0xf1f8, 0xe000, 0x000},\r
2835         {d68000_asr_s_16     , 0xf1f8, 0xe040, 0x000},\r
2836         {d68000_asr_s_32     , 0xf1f8, 0xe080, 0x000},\r
2837         {d68000_asr_r_8      , 0xf1f8, 0xe020, 0x000},\r
2838         {d68000_asr_r_16     , 0xf1f8, 0xe060, 0x000},\r
2839         {d68000_asr_r_32     , 0xf1f8, 0xe0a0, 0x000},\r
2840         {d68000_asr_ea       , 0xffc0, 0xe0c0, 0x3f8},\r
2841         {d68000_asl_s_8      , 0xf1f8, 0xe100, 0x000},\r
2842         {d68000_asl_s_16     , 0xf1f8, 0xe140, 0x000},\r
2843         {d68000_asl_s_32     , 0xf1f8, 0xe180, 0x000},\r
2844         {d68000_asl_r_8      , 0xf1f8, 0xe120, 0x000},\r
2845         {d68000_asl_r_16     , 0xf1f8, 0xe160, 0x000},\r
2846         {d68000_asl_r_32     , 0xf1f8, 0xe1a0, 0x000},\r
2847         {d68000_asl_ea       , 0xffc0, 0xe1c0, 0x3f8},\r
2848         {d68000_bcc_8        , 0xf000, 0x6000, 0x000},\r
2849         {d68000_bcc_16       , 0xf0ff, 0x6000, 0x000},\r
2850         {d68020_bcc_32       , 0xf0ff, 0x60ff, 0x000},\r
2851         {d68000_bchg_r       , 0xf1c0, 0x0140, 0xbf8},\r
2852         {d68000_bchg_s       , 0xffc0, 0x0840, 0xbf8},\r
2853         {d68000_bclr_r       , 0xf1c0, 0x0180, 0xbf8},\r
2854         {d68000_bclr_s       , 0xffc0, 0x0880, 0xbf8},\r
2855         {d68020_bfchg        , 0xffc0, 0xeac0, 0xa78},\r
2856         {d68020_bfclr        , 0xffc0, 0xecc0, 0xa78},\r
2857         {d68020_bfexts       , 0xffc0, 0xebc0, 0xa7b},\r
2858         {d68020_bfextu       , 0xffc0, 0xe9c0, 0xa7b},\r
2859         {d68020_bfffo        , 0xffc0, 0xedc0, 0xa7b},\r
2860         {d68020_bfins        , 0xffc0, 0xefc0, 0xa78},\r
2861         {d68020_bfset        , 0xffc0, 0xeec0, 0xa78},\r
2862         {d68020_bftst        , 0xffc0, 0xe8c0, 0xa7b},\r
2863         {d68010_bkpt         , 0xfff8, 0x4848, 0x000},\r
2864         {d68000_bra_8        , 0xff00, 0x6000, 0x000},\r
2865         {d68000_bra_16       , 0xffff, 0x6000, 0x000},\r
2866         {d68020_bra_32       , 0xffff, 0x60ff, 0x000},\r
2867         {d68000_bset_r       , 0xf1c0, 0x01c0, 0xbf8},\r
2868         {d68000_bset_s       , 0xffc0, 0x08c0, 0xbf8},\r
2869         {d68000_bsr_8        , 0xff00, 0x6100, 0x000},\r
2870         {d68000_bsr_16       , 0xffff, 0x6100, 0x000},\r
2871         {d68020_bsr_32       , 0xffff, 0x61ff, 0x000},\r
2872         {d68000_btst_r       , 0xf1c0, 0x0100, 0xbff},\r
2873         {d68000_btst_s       , 0xffc0, 0x0800, 0xbfb},\r
2874         {d68020_callm        , 0xffc0, 0x06c0, 0x27b},\r
2875         {d68020_cas_8        , 0xffc0, 0x0ac0, 0x3f8},\r
2876         {d68020_cas_16       , 0xffc0, 0x0cc0, 0x3f8},\r
2877         {d68020_cas_32       , 0xffc0, 0x0ec0, 0x3f8},\r
2878         {d68020_cas2_16      , 0xffff, 0x0cfc, 0x000},\r
2879         {d68020_cas2_32      , 0xffff, 0x0efc, 0x000},\r
2880         {d68000_chk_16       , 0xf1c0, 0x4180, 0xbff},\r
2881         {d68020_chk_32       , 0xf1c0, 0x4100, 0xbff},\r
2882         {d68020_chk2_cmp2_8  , 0xffc0, 0x00c0, 0x27b},\r
2883         {d68020_chk2_cmp2_16 , 0xffc0, 0x02c0, 0x27b},\r
2884         {d68020_chk2_cmp2_32 , 0xffc0, 0x04c0, 0x27b},\r
2885         {d68040_cinv         , 0xff20, 0xf400, 0x000},\r
2886         {d68000_clr_8        , 0xffc0, 0x4200, 0xbf8},\r
2887         {d68000_clr_16       , 0xffc0, 0x4240, 0xbf8},\r
2888         {d68000_clr_32       , 0xffc0, 0x4280, 0xbf8},\r
2889         {d68000_cmp_8        , 0xf1c0, 0xb000, 0xbff},\r
2890         {d68000_cmp_16       , 0xf1c0, 0xb040, 0xfff},\r
2891         {d68000_cmp_32       , 0xf1c0, 0xb080, 0xfff},\r
2892         {d68000_cmpa_16      , 0xf1c0, 0xb0c0, 0xfff},\r
2893         {d68000_cmpa_32      , 0xf1c0, 0xb1c0, 0xfff},\r
2894         {d68000_cmpi_8       , 0xffc0, 0x0c00, 0xbf8},\r
2895         {d68020_cmpi_pcdi_8  , 0xffff, 0x0c3a, 0x000},\r
2896         {d68020_cmpi_pcix_8  , 0xffff, 0x0c3b, 0x000},\r
2897         {d68000_cmpi_16      , 0xffc0, 0x0c40, 0xbf8},\r
2898         {d68020_cmpi_pcdi_16 , 0xffff, 0x0c7a, 0x000},\r
2899         {d68020_cmpi_pcix_16 , 0xffff, 0x0c7b, 0x000},\r
2900         {d68000_cmpi_32      , 0xffc0, 0x0c80, 0xbf8},\r
2901         {d68020_cmpi_pcdi_32 , 0xffff, 0x0cba, 0x000},\r
2902         {d68020_cmpi_pcix_32 , 0xffff, 0x0cbb, 0x000},\r
2903         {d68000_cmpm_8       , 0xf1f8, 0xb108, 0x000},\r
2904         {d68000_cmpm_16      , 0xf1f8, 0xb148, 0x000},\r
2905         {d68000_cmpm_32      , 0xf1f8, 0xb188, 0x000},\r
2906         {d68020_cpbcc_16     , 0xf1c0, 0xf080, 0x000},\r
2907         {d68020_cpbcc_32     , 0xf1c0, 0xf0c0, 0x000},\r
2908         {d68020_cpdbcc       , 0xf1f8, 0xf048, 0x000},\r
2909         {d68020_cpgen        , 0xf1c0, 0xf000, 0x000},\r
2910         {d68020_cprestore    , 0xf1c0, 0xf140, 0x37f},\r
2911         {d68020_cpsave       , 0xf1c0, 0xf100, 0x2f8},\r
2912         {d68020_cpscc        , 0xf1c0, 0xf040, 0xbf8},\r
2913         {d68020_cptrapcc_0   , 0xf1ff, 0xf07c, 0x000},\r
2914         {d68020_cptrapcc_16  , 0xf1ff, 0xf07a, 0x000},\r
2915         {d68020_cptrapcc_32  , 0xf1ff, 0xf07b, 0x000},\r
2916         {d68040_cpush        , 0xff20, 0xf420, 0x000},\r
2917         {d68000_dbcc         , 0xf0f8, 0x50c8, 0x000},\r
2918         {d68000_dbra         , 0xfff8, 0x51c8, 0x000},\r
2919         {d68000_divs         , 0xf1c0, 0x81c0, 0xbff},\r
2920         {d68000_divu         , 0xf1c0, 0x80c0, 0xbff},\r
2921         {d68020_divl         , 0xffc0, 0x4c40, 0xbff},\r
2922         {d68000_eor_8        , 0xf1c0, 0xb100, 0xbf8},\r
2923         {d68000_eor_16       , 0xf1c0, 0xb140, 0xbf8},\r
2924         {d68000_eor_32       , 0xf1c0, 0xb180, 0xbf8},\r
2925         {d68000_eori_to_ccr  , 0xffff, 0x0a3c, 0x000},\r
2926         {d68000_eori_to_sr   , 0xffff, 0x0a7c, 0x000},\r
2927         {d68000_eori_8       , 0xffc0, 0x0a00, 0xbf8},\r
2928         {d68000_eori_16      , 0xffc0, 0x0a40, 0xbf8},\r
2929         {d68000_eori_32      , 0xffc0, 0x0a80, 0xbf8},\r
2930         {d68000_exg_dd       , 0xf1f8, 0xc140, 0x000},\r
2931         {d68000_exg_aa       , 0xf1f8, 0xc148, 0x000},\r
2932         {d68000_exg_da       , 0xf1f8, 0xc188, 0x000},\r
2933         {d68020_extb_32      , 0xfff8, 0x49c0, 0x000},\r
2934         {d68000_ext_16       , 0xfff8, 0x4880, 0x000},\r
2935         {d68000_ext_32       , 0xfff8, 0x48c0, 0x000},\r
2936         {d68000_illegal      , 0xffff, 0x4afc, 0x000},\r
2937         {d68000_jmp          , 0xffc0, 0x4ec0, 0x27b},\r
2938         {d68000_jsr          , 0xffc0, 0x4e80, 0x27b},\r
2939         {d68000_lea          , 0xf1c0, 0x41c0, 0x27b},\r
2940         {d68000_link_16      , 0xfff8, 0x4e50, 0x000},\r
2941         {d68020_link_32      , 0xfff8, 0x4808, 0x000},\r
2942         {d68000_lsr_s_8      , 0xf1f8, 0xe008, 0x000},\r
2943         {d68000_lsr_s_16     , 0xf1f8, 0xe048, 0x000},\r
2944         {d68000_lsr_s_32     , 0xf1f8, 0xe088, 0x000},\r
2945         {d68000_lsr_r_8      , 0xf1f8, 0xe028, 0x000},\r
2946         {d68000_lsr_r_16     , 0xf1f8, 0xe068, 0x000},\r
2947         {d68000_lsr_r_32     , 0xf1f8, 0xe0a8, 0x000},\r
2948         {d68000_lsr_ea       , 0xffc0, 0xe2c0, 0x3f8},\r
2949         {d68000_lsl_s_8      , 0xf1f8, 0xe108, 0x000},\r
2950         {d68000_lsl_s_16     , 0xf1f8, 0xe148, 0x000},\r
2951         {d68000_lsl_s_32     , 0xf1f8, 0xe188, 0x000},\r
2952         {d68000_lsl_r_8      , 0xf1f8, 0xe128, 0x000},\r
2953         {d68000_lsl_r_16     , 0xf1f8, 0xe168, 0x000},\r
2954         {d68000_lsl_r_32     , 0xf1f8, 0xe1a8, 0x000},\r
2955         {d68000_lsl_ea       , 0xffc0, 0xe3c0, 0x3f8},\r
2956         {d68000_move_8       , 0xf000, 0x1000, 0xbff},\r
2957         {d68000_move_16      , 0xf000, 0x3000, 0xfff},\r
2958         {d68000_move_32      , 0xf000, 0x2000, 0xfff},\r
2959         {d68000_movea_16     , 0xf1c0, 0x3040, 0xfff},\r
2960         {d68000_movea_32     , 0xf1c0, 0x2040, 0xfff},\r
2961         {d68000_move_to_ccr  , 0xffc0, 0x44c0, 0xbff},\r
2962         {d68010_move_fr_ccr  , 0xffc0, 0x42c0, 0xbf8},\r
2963         {d68000_move_to_sr   , 0xffc0, 0x46c0, 0xbff},\r
2964         {d68000_move_fr_sr   , 0xffc0, 0x40c0, 0xbf8},\r
2965         {d68000_move_to_usp  , 0xfff8, 0x4e60, 0x000},\r
2966         {d68000_move_fr_usp  , 0xfff8, 0x4e68, 0x000},\r
2967         {d68010_movec        , 0xfffe, 0x4e7a, 0x000},\r
2968         {d68000_movem_pd_16  , 0xfff8, 0x48a0, 0x000},\r
2969         {d68000_movem_pd_32  , 0xfff8, 0x48e0, 0x000},\r
2970         {d68000_movem_re_16  , 0xffc0, 0x4880, 0x2f8},\r
2971         {d68000_movem_re_32  , 0xffc0, 0x48c0, 0x2f8},\r
2972         {d68000_movem_er_16  , 0xffc0, 0x4c80, 0x37b},\r
2973         {d68000_movem_er_32  , 0xffc0, 0x4cc0, 0x37b},\r
2974         {d68000_movep_er_16  , 0xf1f8, 0x0108, 0x000},\r
2975         {d68000_movep_er_32  , 0xf1f8, 0x0148, 0x000},\r
2976         {d68000_movep_re_16  , 0xf1f8, 0x0188, 0x000},\r
2977         {d68000_movep_re_32  , 0xf1f8, 0x01c8, 0x000},\r
2978         {d68010_moves_8      , 0xffc0, 0x0e00, 0x3f8},\r
2979         {d68010_moves_16     , 0xffc0, 0x0e40, 0x3f8},\r
2980         {d68010_moves_32     , 0xffc0, 0x0e80, 0x3f8},\r
2981         {d68000_moveq        , 0xf100, 0x7000, 0x000},\r
2982         {d68040_move16_pi_pi , 0xfff8, 0xf620, 0x000},\r
2983         {d68040_move16_pi_al , 0xfff8, 0xf600, 0x000},\r
2984         {d68040_move16_al_pi , 0xfff8, 0xf608, 0x000},\r
2985         {d68040_move16_ai_al , 0xfff8, 0xf610, 0x000},\r
2986         {d68040_move16_al_ai , 0xfff8, 0xf618, 0x000},\r
2987         {d68000_muls         , 0xf1c0, 0xc1c0, 0xbff},\r
2988         {d68000_mulu         , 0xf1c0, 0xc0c0, 0xbff},\r
2989         {d68020_mull         , 0xffc0, 0x4c00, 0xbff},\r
2990         {d68000_nbcd         , 0xffc0, 0x4800, 0xbf8},\r
2991         {d68000_neg_8        , 0xffc0, 0x4400, 0xbf8},\r
2992         {d68000_neg_16       , 0xffc0, 0x4440, 0xbf8},\r
2993         {d68000_neg_32       , 0xffc0, 0x4480, 0xbf8},\r
2994         {d68000_negx_8       , 0xffc0, 0x4000, 0xbf8},\r
2995         {d68000_negx_16      , 0xffc0, 0x4040, 0xbf8},\r
2996         {d68000_negx_32      , 0xffc0, 0x4080, 0xbf8},\r
2997         {d68000_nop          , 0xffff, 0x4e71, 0x000},\r
2998         {d68000_not_8        , 0xffc0, 0x4600, 0xbf8},\r
2999         {d68000_not_16       , 0xffc0, 0x4640, 0xbf8},\r
3000         {d68000_not_32       , 0xffc0, 0x4680, 0xbf8},\r
3001         {d68000_or_er_8      , 0xf1c0, 0x8000, 0xbff},\r
3002         {d68000_or_er_16     , 0xf1c0, 0x8040, 0xbff},\r
3003         {d68000_or_er_32     , 0xf1c0, 0x8080, 0xbff},\r
3004         {d68000_or_re_8      , 0xf1c0, 0x8100, 0x3f8},\r
3005         {d68000_or_re_16     , 0xf1c0, 0x8140, 0x3f8},\r
3006         {d68000_or_re_32     , 0xf1c0, 0x8180, 0x3f8},\r
3007         {d68000_ori_to_ccr   , 0xffff, 0x003c, 0x000},\r
3008         {d68000_ori_to_sr    , 0xffff, 0x007c, 0x000},\r
3009         {d68000_ori_8        , 0xffc0, 0x0000, 0xbf8},\r
3010         {d68000_ori_16       , 0xffc0, 0x0040, 0xbf8},\r
3011         {d68000_ori_32       , 0xffc0, 0x0080, 0xbf8},\r
3012         {d68020_pack_rr      , 0xf1f8, 0x8140, 0x000},\r
3013         {d68020_pack_mm      , 0xf1f8, 0x8148, 0x000},\r
3014         {d68000_pea          , 0xffc0, 0x4840, 0x27b},\r
3015         {d68000_reset        , 0xffff, 0x4e70, 0x000},\r
3016         {d68000_ror_s_8      , 0xf1f8, 0xe018, 0x000},\r
3017         {d68000_ror_s_16     , 0xf1f8, 0xe058, 0x000},\r
3018         {d68000_ror_s_32     , 0xf1f8, 0xe098, 0x000},\r
3019         {d68000_ror_r_8      , 0xf1f8, 0xe038, 0x000},\r
3020         {d68000_ror_r_16     , 0xf1f8, 0xe078, 0x000},\r
3021         {d68000_ror_r_32     , 0xf1f8, 0xe0b8, 0x000},\r
3022         {d68000_ror_ea       , 0xffc0, 0xe6c0, 0x3f8},\r
3023         {d68000_rol_s_8      , 0xf1f8, 0xe118, 0x000},\r
3024         {d68000_rol_s_16     , 0xf1f8, 0xe158, 0x000},\r
3025         {d68000_rol_s_32     , 0xf1f8, 0xe198, 0x000},\r
3026         {d68000_rol_r_8      , 0xf1f8, 0xe138, 0x000},\r
3027         {d68000_rol_r_16     , 0xf1f8, 0xe178, 0x000},\r
3028         {d68000_rol_r_32     , 0xf1f8, 0xe1b8, 0x000},\r
3029         {d68000_rol_ea       , 0xffc0, 0xe7c0, 0x3f8},\r
3030         {d68000_roxr_s_8     , 0xf1f8, 0xe010, 0x000},\r
3031         {d68000_roxr_s_16    , 0xf1f8, 0xe050, 0x000},\r
3032         {d68000_roxr_s_32    , 0xf1f8, 0xe090, 0x000},\r
3033         {d68000_roxr_r_8     , 0xf1f8, 0xe030, 0x000},\r
3034         {d68000_roxr_r_16    , 0xf1f8, 0xe070, 0x000},\r
3035         {d68000_roxr_r_32    , 0xf1f8, 0xe0b0, 0x000},\r
3036         {d68000_roxr_ea      , 0xffc0, 0xe4c0, 0x3f8},\r
3037         {d68000_roxl_s_8     , 0xf1f8, 0xe110, 0x000},\r
3038         {d68000_roxl_s_16    , 0xf1f8, 0xe150, 0x000},\r
3039         {d68000_roxl_s_32    , 0xf1f8, 0xe190, 0x000},\r
3040         {d68000_roxl_r_8     , 0xf1f8, 0xe130, 0x000},\r
3041         {d68000_roxl_r_16    , 0xf1f8, 0xe170, 0x000},\r
3042         {d68000_roxl_r_32    , 0xf1f8, 0xe1b0, 0x000},\r
3043         {d68000_roxl_ea      , 0xffc0, 0xe5c0, 0x3f8},\r
3044         {d68010_rtd          , 0xffff, 0x4e74, 0x000},\r
3045         {d68000_rte          , 0xffff, 0x4e73, 0x000},\r
3046         {d68020_rtm          , 0xfff0, 0x06c0, 0x000},\r
3047         {d68000_rtr          , 0xffff, 0x4e77, 0x000},\r
3048         {d68000_rts          , 0xffff, 0x4e75, 0x000},\r
3049         {d68000_sbcd_rr      , 0xf1f8, 0x8100, 0x000},\r
3050         {d68000_sbcd_mm      , 0xf1f8, 0x8108, 0x000},\r
3051         {d68000_scc          , 0xf0c0, 0x50c0, 0xbf8},\r
3052         {d68000_stop         , 0xffff, 0x4e72, 0x000},\r
3053         {d68000_sub_er_8     , 0xf1c0, 0x9000, 0xbff},\r
3054         {d68000_sub_er_16    , 0xf1c0, 0x9040, 0xfff},\r
3055         {d68000_sub_er_32    , 0xf1c0, 0x9080, 0xfff},\r
3056         {d68000_sub_re_8     , 0xf1c0, 0x9100, 0x3f8},\r
3057         {d68000_sub_re_16    , 0xf1c0, 0x9140, 0x3f8},\r
3058         {d68000_sub_re_32    , 0xf1c0, 0x9180, 0x3f8},\r
3059         {d68000_suba_16      , 0xf1c0, 0x90c0, 0xfff},\r
3060         {d68000_suba_32      , 0xf1c0, 0x91c0, 0xfff},\r
3061         {d68000_subi_8       , 0xffc0, 0x0400, 0xbf8},\r
3062         {d68000_subi_16      , 0xffc0, 0x0440, 0xbf8},\r
3063         {d68000_subi_32      , 0xffc0, 0x0480, 0xbf8},\r
3064         {d68000_subq_8       , 0xf1c0, 0x5100, 0xbf8},\r
3065         {d68000_subq_16      , 0xf1c0, 0x5140, 0xff8},\r
3066         {d68000_subq_32      , 0xf1c0, 0x5180, 0xff8},\r
3067         {d68000_subx_rr_8    , 0xf1f8, 0x9100, 0x000},\r
3068         {d68000_subx_rr_16   , 0xf1f8, 0x9140, 0x000},\r
3069         {d68000_subx_rr_32   , 0xf1f8, 0x9180, 0x000},\r
3070         {d68000_subx_mm_8    , 0xf1f8, 0x9108, 0x000},\r
3071         {d68000_subx_mm_16   , 0xf1f8, 0x9148, 0x000},\r
3072         {d68000_subx_mm_32   , 0xf1f8, 0x9188, 0x000},\r
3073         {d68000_swap         , 0xfff8, 0x4840, 0x000},\r
3074         {d68000_tas          , 0xffc0, 0x4ac0, 0xbf8},\r
3075         {d68000_trap         , 0xfff0, 0x4e40, 0x000},\r
3076         {d68020_trapcc_0     , 0xf0ff, 0x50fc, 0x000},\r
3077         {d68020_trapcc_16    , 0xf0ff, 0x50fa, 0x000},\r
3078         {d68020_trapcc_32    , 0xf0ff, 0x50fb, 0x000},\r
3079         {d68000_trapv        , 0xffff, 0x4e76, 0x000},\r
3080         {d68000_tst_8        , 0xffc0, 0x4a00, 0xbf8},\r
3081         {d68020_tst_pcdi_8   , 0xffff, 0x4a3a, 0x000},\r
3082         {d68020_tst_pcix_8   , 0xffff, 0x4a3b, 0x000},\r
3083         {d68020_tst_i_8      , 0xffff, 0x4a3c, 0x000},\r
3084         {d68000_tst_16       , 0xffc0, 0x4a40, 0xbf8},\r
3085         {d68020_tst_a_16     , 0xfff8, 0x4a48, 0x000},\r
3086         {d68020_tst_pcdi_16  , 0xffff, 0x4a7a, 0x000},\r
3087         {d68020_tst_pcix_16  , 0xffff, 0x4a7b, 0x000},\r
3088         {d68020_tst_i_16     , 0xffff, 0x4a7c, 0x000},\r
3089         {d68000_tst_32       , 0xffc0, 0x4a80, 0xbf8},\r
3090         {d68020_tst_a_32     , 0xfff8, 0x4a88, 0x000},\r
3091         {d68020_tst_pcdi_32  , 0xffff, 0x4aba, 0x000},\r
3092         {d68020_tst_pcix_32  , 0xffff, 0x4abb, 0x000},\r
3093         {d68020_tst_i_32     , 0xffff, 0x4abc, 0x000},\r
3094         {d68000_unlk         , 0xfff8, 0x4e58, 0x000},\r
3095         {d68020_unpk_rr      , 0xf1f8, 0x8180, 0x000},\r
3096         {d68020_unpk_mm      , 0xf1f8, 0x8188, 0x000},\r
3097         {0, 0, 0, 0}\r
3098 };\r
3099 \r
3100 /* Check if opcode is using a valid ea mode */\r
3101 static int valid_ea(uint opcode, uint mask)\r
3102 {\r
3103         if(mask == 0)\r
3104                 return 1;\r
3105 \r
3106         switch(opcode & 0x3f)\r
3107         {\r
3108                 case 0x00: case 0x01: case 0x02: case 0x03:\r
3109                 case 0x04: case 0x05: case 0x06: case 0x07:\r
3110                         return (mask & 0x800) != 0;\r
3111                 case 0x08: case 0x09: case 0x0a: case 0x0b:\r
3112                 case 0x0c: case 0x0d: case 0x0e: case 0x0f:\r
3113                         return (mask & 0x400) != 0;\r
3114                 case 0x10: case 0x11: case 0x12: case 0x13:\r
3115                 case 0x14: case 0x15: case 0x16: case 0x17:\r
3116                         return (mask & 0x200) != 0;\r
3117                 case 0x18: case 0x19: case 0x1a: case 0x1b:\r
3118                 case 0x1c: case 0x1d: case 0x1e: case 0x1f:\r
3119                         return (mask & 0x100) != 0;\r
3120                 case 0x20: case 0x21: case 0x22: case 0x23:\r
3121                 case 0x24: case 0x25: case 0x26: case 0x27:\r
3122                         return (mask & 0x080) != 0;\r
3123                 case 0x28: case 0x29: case 0x2a: case 0x2b:\r
3124                 case 0x2c: case 0x2d: case 0x2e: case 0x2f:\r
3125                         return (mask & 0x040) != 0;\r
3126                 case 0x30: case 0x31: case 0x32: case 0x33:\r
3127                 case 0x34: case 0x35: case 0x36: case 0x37:\r
3128                         return (mask & 0x020) != 0;\r
3129                 case 0x38:\r
3130                         return (mask & 0x010) != 0;\r
3131                 case 0x39:\r
3132                         return (mask & 0x008) != 0;\r
3133                 case 0x3a:\r
3134                         return (mask & 0x002) != 0;\r
3135                 case 0x3b:\r
3136                         return (mask & 0x001) != 0;\r
3137                 case 0x3c:\r
3138                         return (mask & 0x004) != 0;\r
3139         }\r
3140         return 0;\r
3141 \r
3142 }\r
3143 \r
3144 /* Used by qsort */\r
3145 static int DECL_SPEC compare_nof_true_bits(const void *aptr, const void *bptr)\r
3146 {\r
3147         uint a = ((const opcode_struct*)aptr)->mask;\r
3148         uint b = ((const opcode_struct*)bptr)->mask;\r
3149 \r
3150         a = ((a & 0xAAAA) >> 1) + (a & 0x5555);\r
3151         a = ((a & 0xCCCC) >> 2) + (a & 0x3333);\r
3152         a = ((a & 0xF0F0) >> 4) + (a & 0x0F0F);\r
3153         a = ((a & 0xFF00) >> 8) + (a & 0x00FF);\r
3154 \r
3155         b = ((b & 0xAAAA) >> 1) + (b & 0x5555);\r
3156         b = ((b & 0xCCCC) >> 2) + (b & 0x3333);\r
3157         b = ((b & 0xF0F0) >> 4) + (b & 0x0F0F);\r
3158         b = ((b & 0xFF00) >> 8) + (b & 0x00FF);\r
3159 \r
3160         return b - a; /* reversed to get greatest to least sorting */\r
3161 }\r
3162 \r
3163 /* build the opcode handler jump table */\r
3164 static void build_opcode_table(void)\r
3165 {\r
3166         uint i;\r
3167         uint opcode;\r
3168         opcode_struct* ostruct;\r
3169         uint opcode_info_length = 0;\r
3170 \r
3171         for(ostruct = g_opcode_info;ostruct->opcode_handler != 0;ostruct++)\r
3172                 opcode_info_length++;\r
3173 \r
3174         qsort((void *)g_opcode_info, opcode_info_length, sizeof(g_opcode_info[0]), compare_nof_true_bits);\r
3175 \r
3176         for(i=0;i<0x10000;i++)\r
3177         {\r
3178                 g_instruction_table[i] = d68000_illegal; /* default to illegal */\r
3179                 opcode = i;\r
3180                 /* search through opcode info for a match */\r
3181                 for(ostruct = g_opcode_info;ostruct->opcode_handler != 0;ostruct++)\r
3182                 {\r
3183                         /* match opcode mask and allowed ea modes */\r
3184                         if((opcode & ostruct->mask) == ostruct->match)\r
3185                         {\r
3186                                 /* Handle destination ea for move instructions */\r
3187                                 if((ostruct->opcode_handler == d68000_move_8 ||\r
3188                                          ostruct->opcode_handler == d68000_move_16 ||\r
3189                                          ostruct->opcode_handler == d68000_move_32) &&\r
3190                                          !valid_ea(((opcode>>9)&7) | ((opcode>>3)&0x38), 0xbf8))\r
3191                                                 continue;\r
3192                                 if(valid_ea(opcode, ostruct->ea_mask))\r
3193                                 {\r
3194                                         g_instruction_table[i] = ostruct->opcode_handler;\r
3195                                         break;\r
3196                                 }\r
3197                         }\r
3198                 }\r
3199         }\r
3200 }\r
3201 \r
3202 \r
3203 \r
3204 /* ======================================================================== */\r
3205 /* ================================= API ================================== */\r
3206 /* ======================================================================== */\r
3207 \r
3208 /* Disasemble one instruction at pc and store in str_buff */\r
3209 unsigned int m68k_disassemble(char* str_buff, unsigned int pc, unsigned int cpu_type)\r
3210 {\r
3211         if(!g_initialized)\r
3212         {\r
3213                 build_opcode_table();\r
3214                 g_initialized = 1;\r
3215         }\r
3216         switch(cpu_type)\r
3217         {\r
3218                 case M68K_CPU_TYPE_68000:\r
3219                         g_cpu_type = TYPE_68000;\r
3220                         g_address_mask = 0x00ffffff;\r
3221                         break;\r
3222                 case M68K_CPU_TYPE_68010:\r
3223                         g_cpu_type = TYPE_68010;\r
3224                         g_address_mask = 0x00ffffff;\r
3225                         break;\r
3226                 case M68K_CPU_TYPE_68EC020:\r
3227                         g_cpu_type = TYPE_68020;\r
3228                         g_address_mask = 0x00ffffff;\r
3229                         break;\r
3230                 case M68K_CPU_TYPE_68020:\r
3231                         g_cpu_type = TYPE_68020;\r
3232                         g_address_mask = 0xffffffff;\r
3233                         break;\r
3234                 case M68K_CPU_TYPE_68030:\r
3235                         g_cpu_type = TYPE_68030;\r
3236                         g_address_mask = 0xffffffff;\r
3237                         break;\r
3238                 case M68K_CPU_TYPE_68040:\r
3239                         g_cpu_type = TYPE_68040;\r
3240                         g_address_mask = 0xffffffff;\r
3241                         break;\r
3242                 default:\r
3243                         return 0;\r
3244         }\r
3245 \r
3246         g_cpu_pc = pc;\r
3247         g_helper_str[0] = 0;\r
3248         g_cpu_ir = read_imm_16();\r
3249         g_instruction_table[g_cpu_ir]();\r
3250         sprintf(str_buff, "%s%s", g_dasm_str, g_helper_str);\r
3251         return g_cpu_pc - pc;\r
3252 }\r
3253 \r
3254 char* m68ki_disassemble_quick(unsigned int pc, unsigned int cpu_type)\r
3255 {\r
3256         static char buff[100];\r
3257         buff[0] = 0;\r
3258         m68k_disassemble(buff, pc, cpu_type);\r
3259         return buff;\r
3260 }\r
3261 \r
3262 /* Check if the instruction is a valid one */\r
3263 unsigned int m68k_is_valid_instruction(unsigned int instruction, unsigned int cpu_type)\r
3264 {\r
3265         if(!g_initialized)\r
3266         {\r
3267                 build_opcode_table();\r
3268                 g_initialized = 1;\r
3269         }\r
3270 \r
3271         instruction &= 0xffff;\r
3272         if(g_instruction_table[instruction] == d68000_illegal)\r
3273                 return 0;\r
3274 \r
3275         switch(cpu_type)\r
3276         {\r
3277                 case M68K_CPU_TYPE_68000:\r
3278                         if(g_instruction_table[instruction] == d68010_bkpt)\r
3279                                 return 0;\r
3280                         if(g_instruction_table[instruction] == d68010_move_fr_ccr)\r
3281                                 return 0;\r
3282                         if(g_instruction_table[instruction] == d68010_movec)\r
3283                                 return 0;\r
3284                         if(g_instruction_table[instruction] == d68010_moves_8)\r
3285                                 return 0;\r
3286                         if(g_instruction_table[instruction] == d68010_moves_16)\r
3287                                 return 0;\r
3288                         if(g_instruction_table[instruction] == d68010_moves_32)\r
3289                                 return 0;\r
3290                         if(g_instruction_table[instruction] == d68010_rtd)\r
3291                                 return 0;\r
3292                 case M68K_CPU_TYPE_68010:\r
3293                         if(g_instruction_table[instruction] == d68020_bcc_32)\r
3294                                 return 0;\r
3295                         if(g_instruction_table[instruction] == d68020_bfchg)\r
3296                                 return 0;\r
3297                         if(g_instruction_table[instruction] == d68020_bfclr)\r
3298                                 return 0;\r
3299                         if(g_instruction_table[instruction] == d68020_bfexts)\r
3300                                 return 0;\r
3301                         if(g_instruction_table[instruction] == d68020_bfextu)\r
3302                                 return 0;\r
3303                         if(g_instruction_table[instruction] == d68020_bfffo)\r
3304                                 return 0;\r
3305                         if(g_instruction_table[instruction] == d68020_bfins)\r
3306                                 return 0;\r
3307                         if(g_instruction_table[instruction] == d68020_bfset)\r
3308                                 return 0;\r
3309                         if(g_instruction_table[instruction] == d68020_bftst)\r
3310                                 return 0;\r
3311                         if(g_instruction_table[instruction] == d68020_bra_32)\r
3312                                 return 0;\r
3313                         if(g_instruction_table[instruction] == d68020_bsr_32)\r
3314                                 return 0;\r
3315                         if(g_instruction_table[instruction] == d68020_callm)\r
3316                                 return 0;\r
3317                         if(g_instruction_table[instruction] == d68020_cas_8)\r
3318                                 return 0;\r
3319                         if(g_instruction_table[instruction] == d68020_cas_16)\r
3320                                 return 0;\r
3321                         if(g_instruction_table[instruction] == d68020_cas_32)\r
3322                                 return 0;\r
3323                         if(g_instruction_table[instruction] == d68020_cas2_16)\r
3324                                 return 0;\r
3325                         if(g_instruction_table[instruction] == d68020_cas2_32)\r
3326                                 return 0;\r
3327                         if(g_instruction_table[instruction] == d68020_chk_32)\r
3328                                 return 0;\r
3329                         if(g_instruction_table[instruction] == d68020_chk2_cmp2_8)\r
3330                                 return 0;\r
3331                         if(g_instruction_table[instruction] == d68020_chk2_cmp2_16)\r
3332                                 return 0;\r
3333                         if(g_instruction_table[instruction] == d68020_chk2_cmp2_32)\r
3334                                 return 0;\r
3335                         if(g_instruction_table[instruction] == d68020_cmpi_pcdi_8)\r
3336                                 return 0;\r
3337                         if(g_instruction_table[instruction] == d68020_cmpi_pcix_8)\r
3338                                 return 0;\r
3339                         if(g_instruction_table[instruction] == d68020_cmpi_pcdi_16)\r
3340                                 return 0;\r
3341                         if(g_instruction_table[instruction] == d68020_cmpi_pcix_16)\r
3342                                 return 0;\r
3343                         if(g_instruction_table[instruction] == d68020_cmpi_pcdi_32)\r
3344                                 return 0;\r
3345                         if(g_instruction_table[instruction] == d68020_cmpi_pcix_32)\r
3346                                 return 0;\r
3347                         if(g_instruction_table[instruction] == d68020_cpbcc_16)\r
3348                                 return 0;\r
3349                         if(g_instruction_table[instruction] == d68020_cpbcc_32)\r
3350                                 return 0;\r
3351                         if(g_instruction_table[instruction] == d68020_cpdbcc)\r
3352                                 return 0;\r
3353                         if(g_instruction_table[instruction] == d68020_cpgen)\r
3354                                 return 0;\r
3355                         if(g_instruction_table[instruction] == d68020_cprestore)\r
3356                                 return 0;\r
3357                         if(g_instruction_table[instruction] == d68020_cpsave)\r
3358                                 return 0;\r
3359                         if(g_instruction_table[instruction] == d68020_cpscc)\r
3360                                 return 0;\r
3361                         if(g_instruction_table[instruction] == d68020_cptrapcc_0)\r
3362                                 return 0;\r
3363                         if(g_instruction_table[instruction] == d68020_cptrapcc_16)\r
3364                                 return 0;\r
3365                         if(g_instruction_table[instruction] == d68020_cptrapcc_32)\r
3366                                 return 0;\r
3367                         if(g_instruction_table[instruction] == d68020_divl)\r
3368                                 return 0;\r
3369                         if(g_instruction_table[instruction] == d68020_extb_32)\r
3370                                 return 0;\r
3371                         if(g_instruction_table[instruction] == d68020_link_32)\r
3372                                 return 0;\r
3373                         if(g_instruction_table[instruction] == d68020_mull)\r
3374                                 return 0;\r
3375                         if(g_instruction_table[instruction] == d68020_pack_rr)\r
3376                                 return 0;\r
3377                         if(g_instruction_table[instruction] == d68020_pack_mm)\r
3378                                 return 0;\r
3379                         if(g_instruction_table[instruction] == d68020_rtm)\r
3380                                 return 0;\r
3381                         if(g_instruction_table[instruction] == d68020_trapcc_0)\r
3382                                 return 0;\r
3383                         if(g_instruction_table[instruction] == d68020_trapcc_16)\r
3384                                 return 0;\r
3385                         if(g_instruction_table[instruction] == d68020_trapcc_32)\r
3386                                 return 0;\r
3387                         if(g_instruction_table[instruction] == d68020_tst_pcdi_8)\r
3388                                 return 0;\r
3389                         if(g_instruction_table[instruction] == d68020_tst_pcix_8)\r
3390                                 return 0;\r
3391                         if(g_instruction_table[instruction] == d68020_tst_i_8)\r
3392                                 return 0;\r
3393                         if(g_instruction_table[instruction] == d68020_tst_a_16)\r
3394                                 return 0;\r
3395                         if(g_instruction_table[instruction] == d68020_tst_pcdi_16)\r
3396                                 return 0;\r
3397                         if(g_instruction_table[instruction] == d68020_tst_pcix_16)\r
3398                                 return 0;\r
3399                         if(g_instruction_table[instruction] == d68020_tst_i_16)\r
3400                                 return 0;\r
3401                         if(g_instruction_table[instruction] == d68020_tst_a_32)\r
3402                                 return 0;\r
3403                         if(g_instruction_table[instruction] == d68020_tst_pcdi_32)\r
3404                                 return 0;\r
3405                         if(g_instruction_table[instruction] == d68020_tst_pcix_32)\r
3406                                 return 0;\r
3407                         if(g_instruction_table[instruction] == d68020_tst_i_32)\r
3408                                 return 0;\r
3409                         if(g_instruction_table[instruction] == d68020_unpk_rr)\r
3410                                 return 0;\r
3411                         if(g_instruction_table[instruction] == d68020_unpk_mm)\r
3412                                 return 0;\r
3413                 case M68K_CPU_TYPE_68EC020:\r
3414                 case M68K_CPU_TYPE_68020:\r
3415                 case M68K_CPU_TYPE_68030:\r
3416                         if(g_instruction_table[instruction] == d68040_cinv)\r
3417                                 return 0;\r
3418                         if(g_instruction_table[instruction] == d68040_cpush)\r
3419                                 return 0;\r
3420                         if(g_instruction_table[instruction] == d68040_move16_pi_pi)\r
3421                                 return 0;\r
3422                         if(g_instruction_table[instruction] == d68040_move16_pi_al)\r
3423                                 return 0;\r
3424                         if(g_instruction_table[instruction] == d68040_move16_al_pi)\r
3425                                 return 0;\r
3426                         if(g_instruction_table[instruction] == d68040_move16_ai_al)\r
3427                                 return 0;\r
3428                         if(g_instruction_table[instruction] == d68040_move16_al_ai)\r
3429                                 return 0;\r
3430         }\r
3431         if(cpu_type != M68K_CPU_TYPE_68020 && cpu_type != M68K_CPU_TYPE_68EC020 &&\r
3432           (g_instruction_table[instruction] == d68020_callm ||\r
3433           g_instruction_table[instruction] == d68020_rtm))\r
3434                 return 0;\r
3435 \r
3436         return 1;\r
3437 }\r
3438 \r
3439 \r
3440 \r
3441 /* ======================================================================== */\r
3442 /* ============================== END OF FILE ============================= */\r
3443 /* ======================================================================== */\r