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