PageRenderTime 55ms CodeModel.GetById 17ms RepoModel.GetById 0ms app.codeStats 1ms

/src/m68000/m68kdasm.c

https://bitbucket.org/infact/neo-cd-redux
C | 3499 lines | 2903 code | 453 blank | 143 comment | 367 complexity | ce1a5e8bd0167a79cda18fe70300c1a5 MD5 | raw file
Possible License(s): GPL-2.0, LGPL-2.1

Large files files are truncated, but you can click here to view the full file

  1. /* ======================================================================== */
  2. /* ========================= LICENSING & COPYRIGHT ======================== */
  3. /* ======================================================================== */
  4. /*
  5. * MUSASHI
  6. * Version 3.3
  7. *
  8. * A portable Motorola M680x0 processor emulation engine.
  9. * Copyright 1998-2001 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. /* ================================ INCLUDES ============================== */
  23. /* ======================================================================== */
  24. #include <stdlib.h>
  25. #include <stdio.h>
  26. #include <string.h>
  27. #include "m68k.h"
  28. #ifndef DECL_SPEC
  29. #define DECL_SPEC
  30. #endif
  31. /* ======================================================================== */
  32. /* ============================ GENERAL DEFINES =========================== */
  33. /* ======================================================================== */
  34. /* unsigned int and int must be at least 32 bits wide */
  35. #undef uint
  36. #define uint unsigned int
  37. /* Bit Isolation Functions */
  38. #define BIT_0(A) ((A) & 0x00000001)
  39. #define BIT_1(A) ((A) & 0x00000002)
  40. #define BIT_2(A) ((A) & 0x00000004)
  41. #define BIT_3(A) ((A) & 0x00000008)
  42. #define BIT_4(A) ((A) & 0x00000010)
  43. #define BIT_5(A) ((A) & 0x00000020)
  44. #define BIT_6(A) ((A) & 0x00000040)
  45. #define BIT_7(A) ((A) & 0x00000080)
  46. #define BIT_8(A) ((A) & 0x00000100)
  47. #define BIT_9(A) ((A) & 0x00000200)
  48. #define BIT_A(A) ((A) & 0x00000400)
  49. #define BIT_B(A) ((A) & 0x00000800)
  50. #define BIT_C(A) ((A) & 0x00001000)
  51. #define BIT_D(A) ((A) & 0x00002000)
  52. #define BIT_E(A) ((A) & 0x00004000)
  53. #define BIT_F(A) ((A) & 0x00008000)
  54. #define BIT_10(A) ((A) & 0x00010000)
  55. #define BIT_11(A) ((A) & 0x00020000)
  56. #define BIT_12(A) ((A) & 0x00040000)
  57. #define BIT_13(A) ((A) & 0x00080000)
  58. #define BIT_14(A) ((A) & 0x00100000)
  59. #define BIT_15(A) ((A) & 0x00200000)
  60. #define BIT_16(A) ((A) & 0x00400000)
  61. #define BIT_17(A) ((A) & 0x00800000)
  62. #define BIT_18(A) ((A) & 0x01000000)
  63. #define BIT_19(A) ((A) & 0x02000000)
  64. #define BIT_1A(A) ((A) & 0x04000000)
  65. #define BIT_1B(A) ((A) & 0x08000000)
  66. #define BIT_1C(A) ((A) & 0x10000000)
  67. #define BIT_1D(A) ((A) & 0x20000000)
  68. #define BIT_1E(A) ((A) & 0x40000000)
  69. #define BIT_1F(A) ((A) & 0x80000000)
  70. /* These are the CPU types understood by this disassembler */
  71. #define TYPE_68000 1
  72. #define TYPE_68010 2
  73. #define TYPE_68020 4
  74. #define TYPE_68030 8
  75. #define TYPE_68040 16
  76. #define M68000_ONLY TYPE_68000
  77. #define M68010_ONLY TYPE_68010
  78. #define M68010_LESS (TYPE_68000 | TYPE_68010)
  79. #define M68010_PLUS (TYPE_68010 | TYPE_68020 | TYPE_68030 | TYPE_68040)
  80. #define M68020_ONLY TYPE_68020
  81. #define M68020_LESS (TYPE_68010 | TYPE_68020)
  82. #define M68020_PLUS (TYPE_68020 | TYPE_68030 | TYPE_68040)
  83. #define M68030_ONLY TYPE_68030
  84. #define M68030_LESS (TYPE_68010 | TYPE_68020 | TYPE_68030)
  85. #define M68030_PLUS (TYPE_68030 | TYPE_68040)
  86. #define M68040_PLUS TYPE_68040
  87. /* Extension word formats */
  88. #define EXT_8BIT_DISPLACEMENT(A) ((A)&0xff)
  89. #define EXT_FULL(A) BIT_8(A)
  90. #define EXT_EFFECTIVE_ZERO(A) (((A)&0xe4) == 0xc4 || ((A)&0xe2) == 0xc0)
  91. #define EXT_BASE_REGISTER_PRESENT(A) (!BIT_7(A))
  92. #define EXT_INDEX_REGISTER_PRESENT(A) (!BIT_6(A))
  93. #define EXT_INDEX_REGISTER(A) (((A)>>12)&7)
  94. #define EXT_INDEX_PRE_POST(A) (EXT_INDEX_PRESENT(A) && (A)&3)
  95. #define EXT_INDEX_PRE(A) (EXT_INDEX_PRESENT(A) && ((A)&7) < 4 && ((A)&7) != 0)
  96. #define EXT_INDEX_POST(A) (EXT_INDEX_PRESENT(A) && ((A)&7) > 4)
  97. #define EXT_INDEX_SCALE(A) (((A)>>9)&3)
  98. #define EXT_INDEX_LONG(A) BIT_B(A)
  99. #define EXT_INDEX_AR(A) BIT_F(A)
  100. #define EXT_BASE_DISPLACEMENT_PRESENT(A) (((A)&0x30) > 0x10)
  101. #define EXT_BASE_DISPLACEMENT_WORD(A) (((A)&0x30) == 0x20)
  102. #define EXT_BASE_DISPLACEMENT_LONG(A) (((A)&0x30) == 0x30)
  103. #define EXT_OUTER_DISPLACEMENT_PRESENT(A) (((A)&3) > 1 && ((A)&0x47) < 0x44)
  104. #define EXT_OUTER_DISPLACEMENT_WORD(A) (((A)&3) == 2 && ((A)&0x47) < 0x44)
  105. #define EXT_OUTER_DISPLACEMENT_LONG(A) (((A)&3) == 3 && ((A)&0x47) < 0x44)
  106. /* ======================================================================== */
  107. /* =============================== PROTOTYPES ============================= */
  108. /* ======================================================================== */
  109. /* Read data at the PC and increment PC */
  110. uint read_imm_8(void);
  111. uint read_imm_16(void);
  112. uint read_imm_32(void);
  113. /* Read data at the PC but don't imcrement the PC */
  114. uint peek_imm_8(void);
  115. uint peek_imm_16(void);
  116. uint peek_imm_32(void);
  117. /* make signed integers 100% portably */
  118. static int make_int_8(int value);
  119. static int make_int_16(int value);
  120. /* make a string of a hex value */
  121. static char* make_signed_hex_str_8(uint val);
  122. static char* make_signed_hex_str_16(uint val);
  123. static char* make_signed_hex_str_32(uint val);
  124. /* make string of ea mode */
  125. static char* get_ea_mode_str(uint instruction, uint size);
  126. char* get_ea_mode_str_8(uint instruction);
  127. char* get_ea_mode_str_16(uint instruction);
  128. char* get_ea_mode_str_32(uint instruction);
  129. /* make string of immediate value */
  130. static char* get_imm_str_s(uint size);
  131. static char* get_imm_str_u(uint size);
  132. char* get_imm_str_s8(void);
  133. char* get_imm_str_s16(void);
  134. char* get_imm_str_s32(void);
  135. /* Stuff to build the opcode handler jump table */
  136. static void build_opcode_table(void);
  137. static int valid_ea(uint opcode, uint mask);
  138. static int DECL_SPEC compare_nof_true_bits(const void *aptr, const void *bptr);
  139. /* used to build opcode handler jump table */
  140. typedef struct
  141. {
  142. void (*opcode_handler)(void); /* handler function */
  143. uint mask; /* mask on opcode */
  144. uint match; /* what to match after masking */
  145. uint ea_mask; /* what ea modes are allowed */
  146. } opcode_struct;
  147. /* ======================================================================== */
  148. /* ================================= DATA ================================= */
  149. /* ======================================================================== */
  150. /* Opcode handler jump table */
  151. static void (*g_instruction_table[0x10000])(void);
  152. /* Flag if disassembler initialized */
  153. static int g_initialized = 0;
  154. /* Address mask to simulate address lines */
  155. static unsigned int g_address_mask = 0xffffffff;
  156. static char g_dasm_str[100]; /* string to hold disassembly */
  157. static char g_helper_str[100]; /* string to hold helpful info */
  158. static uint g_cpu_pc; /* program counter */
  159. static uint g_cpu_ir; /* instruction register */
  160. static uint g_cpu_type;
  161. /* used by ops like asr, ror, addq, etc */
  162. static uint g_3bit_qdata_table[8] = {8, 1, 2, 3, 4, 5, 6, 7};
  163. static uint g_5bit_data_table[32] =
  164. {
  165. 32, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15,
  166. 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31
  167. };
  168. static const char* g_cc[16] =
  169. {"t", "f", "hi", "ls", "cc", "cs", "ne", "eq", "vc", "vs", "pl", "mi", "ge", "lt", "gt", "le"};
  170. static const char* g_cpcc[64] =
  171. {/* 000 001 010 011 100 101 110 111 */
  172. "f", "eq", "ogt", "oge", "olt", "ole", "ogl", "or", /* 000 */
  173. "un", "ueq", "ugt", "uge", "ult", "ule", "ne", "t", /* 001 */
  174. "sf", "seq", "gt", "ge", "lt", "le", "gl" "gle", /* 010 */
  175. "ngle", "ngl", "nle", "nlt", "nge", "ngt", "sne", "st", /* 011 */
  176. "?", "?", "?", "?", "?", "?", "?", "?", /* 100 */
  177. "?", "?", "?", "?", "?", "?", "?", "?", /* 101 */
  178. "?", "?", "?", "?", "?", "?", "?", "?", /* 110 */
  179. "?", "?", "?", "?", "?", "?", "?", "?" /* 111 */
  180. };
  181. /* ======================================================================== */
  182. /* =========================== UTILITY FUNCTIONS ========================== */
  183. /* ======================================================================== */
  184. #define LIMIT_CPU_TYPES(ALLOWED_CPU_TYPES) \
  185. if(!(g_cpu_type & ALLOWED_CPU_TYPES)) \
  186. { \
  187. d68000_illegal(); \
  188. return; \
  189. }
  190. #define read_imm_8() (m68k_read_disassembler_16(((g_cpu_pc+=2)-2)&g_address_mask)&0xff)
  191. #define read_imm_16() m68k_read_disassembler_16(((g_cpu_pc+=2)-2)&g_address_mask)
  192. #define read_imm_32() m68k_read_disassembler_32(((g_cpu_pc+=4)-4)&g_address_mask)
  193. #define peek_imm_8() (m68k_read_disassembler_16(g_cpu_pc & g_address_mask)&0xff)
  194. #define peek_imm_16() m68k_read_disassembler_16(g_cpu_pc & g_address_mask)
  195. #define peek_imm_32() m68k_read_disassembler_32(g_cpu_pc & g_address_mask)
  196. /* Fake a split interface */
  197. #define get_ea_mode_str_8(instruction) get_ea_mode_str(instruction, 0)
  198. #define get_ea_mode_str_16(instruction) get_ea_mode_str(instruction, 1)
  199. #define get_ea_mode_str_32(instruction) get_ea_mode_str(instruction, 2)
  200. #define get_imm_str_s8() get_imm_str_s(0)
  201. #define get_imm_str_s16() get_imm_str_s(1)
  202. #define get_imm_str_s32() get_imm_str_s(2)
  203. #define get_imm_str_u8() get_imm_str_u(0)
  204. #define get_imm_str_u16() get_imm_str_u(1)
  205. #define get_imm_str_u32() get_imm_str_u(2)
  206. /* 100% portable signed int generators */
  207. static int make_int_8(int value)
  208. {
  209. return (value & 0x80) ? value | ~0xff : value & 0xff;
  210. }
  211. static int make_int_16(int value)
  212. {
  213. return (value & 0x8000) ? value | ~0xffff : value & 0xffff;
  214. }
  215. /* Get string representation of hex values */
  216. static char* make_signed_hex_str_8(uint val)
  217. {
  218. static char str[20];
  219. val &= 0xff;
  220. if(val == 0x80)
  221. sprintf(str, "-$80");
  222. else if(val & 0x80)
  223. sprintf(str, "-$%x", (0-val) & 0x7f);
  224. else
  225. sprintf(str, "$%x", val & 0x7f);
  226. return str;
  227. }
  228. static char* make_signed_hex_str_16(uint val)
  229. {
  230. static char str[20];
  231. val &= 0xffff;
  232. if(val == 0x8000)
  233. sprintf(str, "-$8000");
  234. else if(val & 0x8000)
  235. sprintf(str, "-$%x", (0-val) & 0x7fff);
  236. else
  237. sprintf(str, "$%x", val & 0x7fff);
  238. return str;
  239. }
  240. static char* make_signed_hex_str_32(uint val)
  241. {
  242. static char str[20];
  243. val &= 0xffffffff;
  244. if(val == 0x80000000)
  245. sprintf(str, "-$80000000");
  246. else if(val & 0x80000000)
  247. sprintf(str, "-$%x", (0-val) & 0x7fffffff);
  248. else
  249. sprintf(str, "$%x", val & 0x7fffffff);
  250. return str;
  251. }
  252. /* make string of immediate value */
  253. static char* get_imm_str_s(uint size)
  254. {
  255. static char str[15];
  256. if(size == 0)
  257. sprintf(str, "#%s", make_signed_hex_str_8(read_imm_8()));
  258. else if(size == 1)
  259. sprintf(str, "#%s", make_signed_hex_str_16(read_imm_16()));
  260. else
  261. sprintf(str, "#%s", make_signed_hex_str_32(read_imm_32()));
  262. return str;
  263. }
  264. static char* get_imm_str_u(uint size)
  265. {
  266. static char str[15];
  267. if(size == 0)
  268. sprintf(str, "#$%x", read_imm_8() & 0xff);
  269. else if(size == 1)
  270. sprintf(str, "#$%x", read_imm_16() & 0xffff);
  271. else
  272. sprintf(str, "#$%x", read_imm_32() & 0xffffffff);
  273. return str;
  274. }
  275. /* Make string of effective address mode */
  276. static char* get_ea_mode_str(uint instruction, uint size)
  277. {
  278. static char b1[64];
  279. static char b2[64];
  280. static char* mode = b2;
  281. uint extension;
  282. uint base;
  283. uint outer;
  284. char base_reg[4];
  285. char index_reg[8];
  286. uint preindex;
  287. uint postindex;
  288. uint comma = 0;
  289. uint temp_value;
  290. char invalid_mode = 0;
  291. /* Switch buffers so we don't clobber on a double-call to this function */
  292. mode = mode == b1 ? b2 : b1;
  293. switch(instruction & 0x3f)
  294. {
  295. case 0x00: case 0x01: case 0x02: case 0x03: case 0x04: case 0x05: case 0x06: case 0x07:
  296. /* data register direct */
  297. sprintf(mode, "D%d", instruction&7);
  298. break;
  299. case 0x08: case 0x09: case 0x0a: case 0x0b: case 0x0c: case 0x0d: case 0x0e: case 0x0f:
  300. /* address register direct */
  301. sprintf(mode, "A%d", instruction&7);
  302. break;
  303. case 0x10: case 0x11: case 0x12: case 0x13: case 0x14: case 0x15: case 0x16: case 0x17:
  304. /* address register indirect */
  305. sprintf(mode, "(A%d)", instruction&7);
  306. break;
  307. case 0x18: case 0x19: case 0x1a: case 0x1b: case 0x1c: case 0x1d: case 0x1e: case 0x1f:
  308. /* address register indirect with postincrement */
  309. sprintf(mode, "(A%d)+", instruction&7);
  310. break;
  311. case 0x20: case 0x21: case 0x22: case 0x23: case 0x24: case 0x25: case 0x26: case 0x27:
  312. /* address register indirect with predecrement */
  313. sprintf(mode, "-(A%d)", instruction&7);
  314. break;
  315. case 0x28: case 0x29: case 0x2a: case 0x2b: case 0x2c: case 0x2d: case 0x2e: case 0x2f:
  316. /* address register indirect with displacement*/
  317. sprintf(mode, "(%s,A%d)", make_signed_hex_str_16(read_imm_16()), instruction&7);
  318. break;
  319. case 0x30: case 0x31: case 0x32: case 0x33: case 0x34: case 0x35: case 0x36: case 0x37:
  320. /* address register indirect with index */
  321. extension = read_imm_16();
  322. if((g_cpu_type & M68010_LESS) && EXT_INDEX_SCALE(extension))
  323. {
  324. invalid_mode = 1;
  325. break;
  326. }
  327. if(EXT_FULL(extension))
  328. {
  329. if(g_cpu_type & M68010_LESS)
  330. {
  331. invalid_mode = 1;
  332. break;
  333. }
  334. if(EXT_EFFECTIVE_ZERO(extension))
  335. {
  336. strcpy(mode, "0");
  337. break;
  338. }
  339. base = EXT_BASE_DISPLACEMENT_PRESENT(extension) ? (EXT_BASE_DISPLACEMENT_LONG(extension) ? read_imm_32() : read_imm_16()) : 0;
  340. outer = EXT_OUTER_DISPLACEMENT_PRESENT(extension) ? (EXT_OUTER_DISPLACEMENT_LONG(extension) ? read_imm_32() : read_imm_16()) : 0;
  341. if(EXT_BASE_REGISTER_PRESENT(extension))
  342. sprintf(base_reg, "A%d", instruction&7);
  343. else
  344. *base_reg = 0;
  345. if(EXT_INDEX_REGISTER_PRESENT(extension))
  346. {
  347. sprintf(index_reg, "%c%d.%c", EXT_INDEX_AR(extension) ? 'A' : 'D', EXT_INDEX_REGISTER(extension), EXT_INDEX_LONG(extension) ? 'l' : 'w');
  348. if(EXT_INDEX_SCALE(extension))
  349. sprintf(index_reg+strlen(index_reg), "*%d", 1 << EXT_INDEX_SCALE(extension));
  350. }
  351. else
  352. *index_reg = 0;
  353. preindex = (extension&7) > 0 && (extension&7) < 4;
  354. postindex = (extension&7) > 4;
  355. strcpy(mode, "(");
  356. if(preindex || postindex)
  357. strcat(mode, "[");
  358. if(base)
  359. {
  360. strcat(mode, make_signed_hex_str_16(base));
  361. comma = 1;
  362. }
  363. if(*base_reg)
  364. {
  365. if(comma)
  366. strcat(mode, ",");
  367. strcat(mode, base_reg);
  368. comma = 1;
  369. }
  370. if(postindex)
  371. {
  372. strcat(mode, "]");
  373. comma = 1;
  374. }
  375. if(*index_reg)
  376. {
  377. if(comma)
  378. strcat(mode, ",");
  379. strcat(mode, index_reg);
  380. comma = 1;
  381. }
  382. if(preindex)
  383. {
  384. strcat(mode, "]");
  385. comma = 1;
  386. }
  387. if(outer)
  388. {
  389. if(comma)
  390. strcat(mode, ",");
  391. strcat(mode, make_signed_hex_str_16(outer));
  392. }
  393. strcat(mode, ")");
  394. break;
  395. }
  396. if(EXT_8BIT_DISPLACEMENT(extension) == 0)
  397. 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');
  398. else
  399. 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');
  400. if(EXT_INDEX_SCALE(extension))
  401. sprintf(mode+strlen(mode), "*%d", 1 << EXT_INDEX_SCALE(extension));
  402. strcat(mode, ")");
  403. break;
  404. case 0x38:
  405. /* absolute short address */
  406. sprintf(mode, "$%x.w", read_imm_16());
  407. break;
  408. case 0x39:
  409. /* absolute long address */
  410. sprintf(mode, "$%x.l", read_imm_32());
  411. break;
  412. case 0x3a:
  413. /* program counter with displacement */
  414. temp_value = read_imm_16();
  415. sprintf(mode, "(%s,PC)", make_signed_hex_str_16(temp_value));
  416. sprintf(g_helper_str, "; ($%x)", (make_int_16(temp_value) + g_cpu_pc-2) & 0xffffffff);
  417. break;
  418. case 0x3b:
  419. /* program counter with index */
  420. extension = read_imm_16();
  421. if((g_cpu_type & M68010_LESS) && EXT_INDEX_SCALE(extension))
  422. {
  423. invalid_mode = 1;
  424. break;
  425. }
  426. if(EXT_FULL(extension))
  427. {
  428. if(g_cpu_type & M68010_LESS)
  429. {
  430. invalid_mode = 1;
  431. break;
  432. }
  433. if(EXT_EFFECTIVE_ZERO(extension))
  434. {
  435. strcpy(mode, "0");
  436. break;
  437. }
  438. base = EXT_BASE_DISPLACEMENT_PRESENT(extension) ? (EXT_BASE_DISPLACEMENT_LONG(extension) ? read_imm_32() : read_imm_16()) : 0;
  439. outer = EXT_OUTER_DISPLACEMENT_PRESENT(extension) ? (EXT_OUTER_DISPLACEMENT_LONG(extension) ? read_imm_32() : read_imm_16()) : 0;
  440. if(EXT_BASE_REGISTER_PRESENT(extension))
  441. strcpy(base_reg, "PC");
  442. else
  443. *base_reg = 0;
  444. if(EXT_INDEX_REGISTER_PRESENT(extension))
  445. {
  446. sprintf(index_reg, "%c%d.%c", EXT_INDEX_AR(extension) ? 'A' : 'D', EXT_INDEX_REGISTER(extension), EXT_INDEX_LONG(extension) ? 'l' : 'w');
  447. if(EXT_INDEX_SCALE(extension))
  448. sprintf(index_reg+strlen(index_reg), "*%d", 1 << EXT_INDEX_SCALE(extension));
  449. }
  450. else
  451. *index_reg = 0;
  452. preindex = (extension&7) > 0 && (extension&7) < 4;
  453. postindex = (extension&7) > 4;
  454. strcpy(mode, "(");
  455. if(preindex || postindex)
  456. strcat(mode, "[");
  457. if(base)
  458. {
  459. strcat(mode, make_signed_hex_str_16(base));
  460. comma = 1;
  461. }
  462. if(*base_reg)
  463. {
  464. if(comma)
  465. strcat(mode, ",");
  466. strcat(mode, base_reg);
  467. comma = 1;
  468. }
  469. if(postindex)
  470. {
  471. strcat(mode, "]");
  472. comma = 1;
  473. }
  474. if(*index_reg)
  475. {
  476. if(comma)
  477. strcat(mode, ",");
  478. strcat(mode, index_reg);
  479. comma = 1;
  480. }
  481. if(preindex)
  482. {
  483. strcat(mode, "]");
  484. comma = 1;
  485. }
  486. if(outer)
  487. {
  488. if(comma)
  489. strcat(mode, ",");
  490. strcat(mode, make_signed_hex_str_16(outer));
  491. }
  492. strcat(mode, ")");
  493. break;
  494. }
  495. if(EXT_8BIT_DISPLACEMENT(extension) == 0)
  496. sprintf(mode, "(PC,%c%d.%c", EXT_INDEX_AR(extension) ? 'A' : 'D', EXT_INDEX_REGISTER(extension), EXT_INDEX_LONG(extension) ? 'l' : 'w');
  497. else
  498. 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');
  499. if(EXT_INDEX_SCALE(extension))
  500. sprintf(mode+strlen(mode), "*%d", 1 << EXT_INDEX_SCALE(extension));
  501. strcat(mode, ")");
  502. break;
  503. case 0x3c:
  504. /* Immediate */
  505. sprintf(mode, "%s", get_imm_str_u(size));
  506. break;
  507. default:
  508. invalid_mode = 1;
  509. }
  510. if(invalid_mode)
  511. sprintf(mode, "INVALID %x", instruction & 0x3f);
  512. return mode;
  513. }
  514. /* ======================================================================== */
  515. /* ========================= INSTRUCTION HANDLERS ========================= */
  516. /* ======================================================================== */
  517. /* Instruction handler function names follow this convention:
  518. *
  519. * d68000_NAME_EXTENSIONS(void)
  520. * where NAME is the name of the opcode it handles and EXTENSIONS are any
  521. * extensions for special instances of that opcode.
  522. *
  523. * Examples:
  524. * d68000_add_er_8(): add opcode, from effective address to register,
  525. * size = byte
  526. *
  527. * d68000_asr_s_8(): arithmetic shift right, static count, size = byte
  528. *
  529. *
  530. * Common extensions:
  531. * 8 : size = byte
  532. * 16 : size = word
  533. * 32 : size = long
  534. * rr : register to register
  535. * mm : memory to memory
  536. * r : register
  537. * s : static
  538. * er : effective address -> register
  539. * re : register -> effective address
  540. * ea : using effective address mode of operation
  541. * d : data register direct
  542. * a : address register direct
  543. * ai : address register indirect
  544. * pi : address register indirect with postincrement
  545. * pd : address register indirect with predecrement
  546. * di : address register indirect with displacement
  547. * ix : address register indirect with index
  548. * aw : absolute word
  549. * al : absolute long
  550. */
  551. static void d68000_illegal(void)
  552. {
  553. sprintf(g_dasm_str, "dc.w $%04x; ILLEGAL", g_cpu_ir);
  554. }
  555. static void d68000_1010(void)
  556. {
  557. sprintf(g_dasm_str, "dc.w $%04x; opcode 1010", g_cpu_ir);
  558. }
  559. static void d68000_1111(void)
  560. {
  561. sprintf(g_dasm_str, "dc.w $%04x; opcode 1111", g_cpu_ir);
  562. }
  563. static void d68000_abcd_rr(void)
  564. {
  565. sprintf(g_dasm_str, "abcd D%d, D%d", g_cpu_ir&7, (g_cpu_ir>>9)&7);
  566. }
  567. static void d68000_abcd_mm(void)
  568. {
  569. sprintf(g_dasm_str, "abcd -(A%d), -(A%d)", g_cpu_ir&7, (g_cpu_ir>>9)&7);
  570. }
  571. static void d68000_add_er_8(void)
  572. {
  573. sprintf(g_dasm_str, "add.b %s, D%d", get_ea_mode_str_8(g_cpu_ir), (g_cpu_ir>>9)&7);
  574. }
  575. static void d68000_add_er_16(void)
  576. {
  577. sprintf(g_dasm_str, "add.w %s, D%d", get_ea_mode_str_16(g_cpu_ir), (g_cpu_ir>>9)&7);
  578. }
  579. static void d68000_add_er_32(void)
  580. {
  581. sprintf(g_dasm_str, "add.l %s, D%d", get_ea_mode_str_32(g_cpu_ir), (g_cpu_ir>>9)&7);
  582. }
  583. static void d68000_add_re_8(void)
  584. {
  585. sprintf(g_dasm_str, "add.b D%d, %s", (g_cpu_ir>>9)&7, get_ea_mode_str_8(g_cpu_ir));
  586. }
  587. static void d68000_add_re_16(void)
  588. {
  589. sprintf(g_dasm_str, "add.w D%d, %s", (g_cpu_ir>>9)&7, get_ea_mode_str_16(g_cpu_ir));
  590. }
  591. static void d68000_add_re_32(void)
  592. {
  593. sprintf(g_dasm_str, "add.l D%d, %s", (g_cpu_ir>>9)&7, get_ea_mode_str_32(g_cpu_ir));
  594. }
  595. static void d68000_adda_16(void)
  596. {
  597. sprintf(g_dasm_str, "adda.w %s, A%d", get_ea_mode_str_16(g_cpu_ir), (g_cpu_ir>>9)&7);
  598. }
  599. static void d68000_adda_32(void)
  600. {
  601. sprintf(g_dasm_str, "adda.l %s, A%d", get_ea_mode_str_32(g_cpu_ir), (g_cpu_ir>>9)&7);
  602. }
  603. static void d68000_addi_8(void)
  604. {
  605. char* str = get_imm_str_s8();
  606. sprintf(g_dasm_str, "addi.b %s, %s", str, get_ea_mode_str_8(g_cpu_ir));
  607. }
  608. static void d68000_addi_16(void)
  609. {
  610. char* str = get_imm_str_s16();
  611. sprintf(g_dasm_str, "addi.w %s, %s", str, get_ea_mode_str_16(g_cpu_ir));
  612. }
  613. static void d68000_addi_32(void)
  614. {
  615. char* str = get_imm_str_s32();
  616. sprintf(g_dasm_str, "addi.l %s, %s", str, get_ea_mode_str_32(g_cpu_ir));
  617. }
  618. static void d68000_addq_8(void)
  619. {
  620. 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));
  621. }
  622. static void d68000_addq_16(void)
  623. {
  624. 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));
  625. }
  626. static void d68000_addq_32(void)
  627. {
  628. 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));
  629. }
  630. static void d68000_addx_rr_8(void)
  631. {
  632. sprintf(g_dasm_str, "addx.b D%d, D%d", g_cpu_ir&7, (g_cpu_ir>>9)&7);
  633. }
  634. static void d68000_addx_rr_16(void)
  635. {
  636. sprintf(g_dasm_str, "addx.w D%d, D%d", g_cpu_ir&7, (g_cpu_ir>>9)&7);
  637. }
  638. static void d68000_addx_rr_32(void)
  639. {
  640. sprintf(g_dasm_str, "addx.l D%d, D%d", g_cpu_ir&7, (g_cpu_ir>>9)&7);
  641. }
  642. static void d68000_addx_mm_8(void)
  643. {
  644. sprintf(g_dasm_str, "addx.b -(A%d), -(A%d)", g_cpu_ir&7, (g_cpu_ir>>9)&7);
  645. }
  646. static void d68000_addx_mm_16(void)
  647. {
  648. sprintf(g_dasm_str, "addx.w -(A%d), -(A%d)", g_cpu_ir&7, (g_cpu_ir>>9)&7);
  649. }
  650. static void d68000_addx_mm_32(void)
  651. {
  652. sprintf(g_dasm_str, "addx.l -(A%d), -(A%d)", g_cpu_ir&7, (g_cpu_ir>>9)&7);
  653. }
  654. static void d68000_and_er_8(void)
  655. {
  656. sprintf(g_dasm_str, "and.b %s, D%d", get_ea_mode_str_8(g_cpu_ir), (g_cpu_ir>>9)&7);
  657. }
  658. static void d68000_and_er_16(void)
  659. {
  660. sprintf(g_dasm_str, "and.w %s, D%d", get_ea_mode_str_16(g_cpu_ir), (g_cpu_ir>>9)&7);
  661. }
  662. static void d68000_and_er_32(void)
  663. {
  664. sprintf(g_dasm_str, "and.l %s, D%d", get_ea_mode_str_32(g_cpu_ir), (g_cpu_ir>>9)&7);
  665. }
  666. static void d68000_and_re_8(void)
  667. {
  668. sprintf(g_dasm_str, "and.b D%d, %s", (g_cpu_ir>>9)&7, get_ea_mode_str_8(g_cpu_ir));
  669. }
  670. static void d68000_and_re_16(void)
  671. {
  672. sprintf(g_dasm_str, "and.w D%d, %s", (g_cpu_ir>>9)&7, get_ea_mode_str_16(g_cpu_ir));
  673. }
  674. static void d68000_and_re_32(void)
  675. {
  676. sprintf(g_dasm_str, "and.l D%d, %s", (g_cpu_ir>>9)&7, get_ea_mode_str_32(g_cpu_ir));
  677. }
  678. static void d68000_andi_8(void)
  679. {
  680. char* str = get_imm_str_u8();
  681. sprintf(g_dasm_str, "andi.b %s, %s", str, get_ea_mode_str_8(g_cpu_ir));
  682. }
  683. static void d68000_andi_16(void)
  684. {
  685. char* str = get_imm_str_u16();
  686. sprintf(g_dasm_str, "andi.w %s, %s", str, get_ea_mode_str_16(g_cpu_ir));
  687. }
  688. static void d68000_andi_32(void)
  689. {
  690. char* str = get_imm_str_u32();
  691. sprintf(g_dasm_str, "andi.l %s, %s", str, get_ea_mode_str_32(g_cpu_ir));
  692. }
  693. static void d68000_andi_to_ccr(void)
  694. {
  695. sprintf(g_dasm_str, "andi %s, CCR", get_imm_str_u8());
  696. }
  697. static void d68000_andi_to_sr(void)
  698. {
  699. sprintf(g_dasm_str, "andi %s, SR", get_imm_str_u16());
  700. }
  701. static void d68000_asr_s_8(void)
  702. {
  703. sprintf(g_dasm_str, "asr.b #%d, D%d", g_3bit_qdata_table[(g_cpu_ir>>9)&7], g_cpu_ir&7);
  704. }
  705. static void d68000_asr_s_16(void)
  706. {
  707. sprintf(g_dasm_str, "asr.w #%d, D%d", g_3bit_qdata_table[(g_cpu_ir>>9)&7], g_cpu_ir&7);
  708. }
  709. static void d68000_asr_s_32(void)
  710. {
  711. sprintf(g_dasm_str, "asr.l #%d, D%d", g_3bit_qdata_table[(g_cpu_ir>>9)&7], g_cpu_ir&7);
  712. }
  713. static void d68000_asr_r_8(void)
  714. {
  715. sprintf(g_dasm_str, "asr.b D%d, D%d", (g_cpu_ir>>9)&7, g_cpu_ir&7);
  716. }
  717. static void d68000_asr_r_16(void)
  718. {
  719. sprintf(g_dasm_str, "asr.w D%d, D%d", (g_cpu_ir>>9)&7, g_cpu_ir&7);
  720. }
  721. static void d68000_asr_r_32(void)
  722. {
  723. sprintf(g_dasm_str, "asr.l D%d, D%d", (g_cpu_ir>>9)&7, g_cpu_ir&7);
  724. }
  725. static void d68000_asr_ea(void)
  726. {
  727. sprintf(g_dasm_str, "asr.w %s", get_ea_mode_str_16(g_cpu_ir));
  728. }
  729. static void d68000_asl_s_8(void)
  730. {
  731. sprintf(g_dasm_str, "asl.b #%d, D%d", g_3bit_qdata_table[(g_cpu_ir>>9)&7], g_cpu_ir&7);
  732. }
  733. static void d68000_asl_s_16(void)
  734. {
  735. sprintf(g_dasm_str, "asl.w #%d, D%d", g_3bit_qdata_table[(g_cpu_ir>>9)&7], g_cpu_ir&7);
  736. }
  737. static void d68000_asl_s_32(void)
  738. {
  739. sprintf(g_dasm_str, "asl.l #%d, D%d", g_3bit_qdata_table[(g_cpu_ir>>9)&7], g_cpu_ir&7);
  740. }
  741. static void d68000_asl_r_8(void)
  742. {
  743. sprintf(g_dasm_str, "asl.b D%d, D%d", (g_cpu_ir>>9)&7, g_cpu_ir&7);
  744. }
  745. static void d68000_asl_r_16(void)
  746. {
  747. sprintf(g_dasm_str, "asl.w D%d, D%d", (g_cpu_ir>>9)&7, g_cpu_ir&7);
  748. }
  749. static void d68000_asl_r_32(void)
  750. {
  751. sprintf(g_dasm_str, "asl.l D%d, D%d", (g_cpu_ir>>9)&7, g_cpu_ir&7);
  752. }
  753. static void d68000_asl_ea(void)
  754. {
  755. sprintf(g_dasm_str, "asl.w %s", get_ea_mode_str_16(g_cpu_ir));
  756. }
  757. static void d68000_bcc_8(void)
  758. {
  759. uint temp_pc = g_cpu_pc;
  760. sprintf(g_dasm_str, "b%-2s %x", g_cc[(g_cpu_ir>>8)&0xf], temp_pc + make_int_8(g_cpu_ir));
  761. }
  762. static void d68000_bcc_16(void)
  763. {
  764. uint temp_pc = g_cpu_pc;
  765. sprintf(g_dasm_str, "b%-2s %x", g_cc[(g_cpu_ir>>8)&0xf], temp_pc + make_int_16(read_imm_16()));
  766. }
  767. static void d68020_bcc_32(void)
  768. {
  769. uint temp_pc = g_cpu_pc;
  770. LIMIT_CPU_TYPES(M68020_PLUS);
  771. sprintf(g_dasm_str, "b%-2s %x; (2+)", g_cc[(g_cpu_ir>>8)&0xf], temp_pc + read_imm_32());
  772. }
  773. static void d68000_bchg_r(void)
  774. {
  775. sprintf(g_dasm_str, "bchg D%d, %s", (g_cpu_ir>>9)&7, get_ea_mode_str_8(g_cpu_ir));
  776. }
  777. static void d68000_bchg_s(void)
  778. {
  779. char* str = get_imm_str_u8();
  780. sprintf(g_dasm_str, "bchg %s, %s", str, get_ea_mode_str_8(g_cpu_ir));
  781. }
  782. static void d68000_bclr_r(void)
  783. {
  784. sprintf(g_dasm_str, "bclr D%d, %s", (g_cpu_ir>>9)&7, get_ea_mode_str_8(g_cpu_ir));
  785. }
  786. static void d68000_bclr_s(void)
  787. {
  788. char* str = get_imm_str_u8();
  789. sprintf(g_dasm_str, "bclr %s, %s", str, get_ea_mode_str_8(g_cpu_ir));
  790. }
  791. static void d68010_bkpt(void)
  792. {
  793. LIMIT_CPU_TYPES(M68010_PLUS);
  794. sprintf(g_dasm_str, "bkpt #%d; (1+)", g_cpu_ir&7);
  795. }
  796. static void d68020_bfchg(void)
  797. {
  798. uint extension;
  799. char offset[3];
  800. char width[3];
  801. LIMIT_CPU_TYPES(M68020_PLUS);
  802. extension = read_imm_16();
  803. if(BIT_B(extension))
  804. sprintf(offset, "D%d", (extension>>6)&7);
  805. else
  806. sprintf(offset, "%d", (extension>>6)&31);
  807. if(BIT_5(extension))
  808. sprintf(width, "D%d", extension&7);
  809. else
  810. sprintf(width, "%d", g_5bit_data_table[extension&31]);
  811. sprintf(g_dasm_str, "bfchg %s {%s:%s}; (2+)", get_ea_mode_str_8(g_cpu_ir), offset, width);
  812. }
  813. static void d68020_bfclr(void)
  814. {
  815. uint extension;
  816. char offset[3];
  817. char width[3];
  818. LIMIT_CPU_TYPES(M68020_PLUS);
  819. extension = read_imm_16();
  820. if(BIT_B(extension))
  821. sprintf(offset, "D%d", (extension>>6)&7);
  822. else
  823. sprintf(offset, "%d", (extension>>6)&31);
  824. if(BIT_5(extension))
  825. sprintf(width, "D%d", extension&7);
  826. else
  827. sprintf(width, "%d", g_5bit_data_table[extension&31]);
  828. sprintf(g_dasm_str, "bfclr %s {%s:%s}; (2+)", get_ea_mode_str_8(g_cpu_ir), offset, width);
  829. }
  830. static void d68020_bfexts(void)
  831. {
  832. uint extension;
  833. char offset[3];
  834. char width[3];
  835. LIMIT_CPU_TYPES(M68020_PLUS);
  836. extension = read_imm_16();
  837. if(BIT_B(extension))
  838. sprintf(offset, "D%d", (extension>>6)&7);
  839. else
  840. sprintf(offset, "%d", (extension>>6)&31);
  841. if(BIT_5(extension))
  842. sprintf(width, "D%d", extension&7);
  843. else
  844. sprintf(width, "%d", g_5bit_data_table[extension&31]);
  845. sprintf(g_dasm_str, "bfexts D%d, %s {%s:%s}; (2+)", (extension>>12)&7, get_ea_mode_str_8(g_cpu_ir), offset, width);
  846. }
  847. static void d68020_bfextu(void)
  848. {
  849. uint extension;
  850. char offset[3];
  851. char width[3];
  852. LIMIT_CPU_TYPES(M68020_PLUS);
  853. extension = read_imm_16();
  854. if(BIT_B(extension))
  855. sprintf(offset, "D%d", (extension>>6)&7);
  856. else
  857. sprintf(offset, "%d", (extension>>6)&31);
  858. if(BIT_5(extension))
  859. sprintf(width, "D%d", extension&7);
  860. else
  861. sprintf(width, "%d", g_5bit_data_table[extension&31]);
  862. sprintf(g_dasm_str, "bfextu D%d, %s {%s:%s}; (2+)", (extension>>12)&7, get_ea_mode_str_8(g_cpu_ir), offset, width);
  863. }
  864. static void d68020_bfffo(void)
  865. {
  866. uint extension;
  867. char offset[3];
  868. char width[3];
  869. LIMIT_CPU_TYPES(M68020_PLUS);
  870. extension = read_imm_16();
  871. if(BIT_B(extension))
  872. sprintf(offset, "D%d", (extension>>6)&7);
  873. else
  874. sprintf(offset, "%d", (extension>>6)&31);
  875. if(BIT_5(extension))
  876. sprintf(width, "D%d", extension&7);
  877. else
  878. sprintf(width, "%d", g_5bit_data_table[extension&31]);
  879. sprintf(g_dasm_str, "bfffo D%d, %s {%s:%s}; (2+)", (extension>>12)&7, get_ea_mode_str_8(g_cpu_ir), offset, width);
  880. }
  881. static void d68020_bfins(void)
  882. {
  883. uint extension;
  884. char offset[3];
  885. char width[3];
  886. LIMIT_CPU_TYPES(M68020_PLUS);
  887. extension = read_imm_16();
  888. if(BIT_B(extension))
  889. sprintf(offset, "D%d", (extension>>6)&7);
  890. else
  891. sprintf(offset, "%d", (extension>>6)&31);
  892. if(BIT_5(extension))
  893. sprintf(width, "D%d", extension&7);
  894. else
  895. sprintf(width, "%d", g_5bit_data_table[extension&31]);
  896. sprintf(g_dasm_str, "bfins D%d, %s {%s:%s}; (2+)", (extension>>12)&7, get_ea_mode_str_8(g_cpu_ir), offset, width);
  897. }
  898. static void d68020_bfset(void)
  899. {
  900. uint extension;
  901. char offset[3];
  902. char width[3];
  903. LIMIT_CPU_TYPES(M68020_PLUS);
  904. extension = read_imm_16();
  905. if(BIT_B(extension))
  906. sprintf(offset, "D%d", (extension>>6)&7);
  907. else
  908. sprintf(offset, "%d", (extension>>6)&31);
  909. if(BIT_5(extension))
  910. sprintf(width, "D%d", extension&7);
  911. else
  912. sprintf(width, "%d", g_5bit_data_table[extension&31]);
  913. sprintf(g_dasm_str, "bfset %s {%s:%s}; (2+)", get_ea_mode_str_8(g_cpu_ir), offset, width);
  914. }
  915. static void d68020_bftst(void)
  916. {
  917. uint extension;
  918. char offset[3];
  919. char width[3];
  920. LIMIT_CPU_TYPES(M68020_PLUS);
  921. extension = read_imm_16();
  922. if(BIT_B(extension))
  923. sprintf(offset, "D%d", (extension>>6)&7);
  924. else
  925. sprintf(offset, "%d", (extension>>6)&31);
  926. if(BIT_5(extension))
  927. sprintf(width, "D%d", extension&7);
  928. else
  929. sprintf(width, "%d", g_5bit_data_table[extension&31]);
  930. sprintf(g_dasm_str, "bftst %s {%s:%s}; (2+)", get_ea_mode_str_8(g_cpu_ir), offset, width);
  931. }
  932. static void d68000_bra_8(void)
  933. {
  934. uint temp_pc = g_cpu_pc;
  935. sprintf(g_dasm_str, "bra %x", temp_pc + make_int_8(g_cpu_ir));
  936. }
  937. static void d68000_bra_16(void)
  938. {
  939. uint temp_pc = g_cpu_pc;
  940. sprintf(g_dasm_str, "bra %x", temp_pc + make_int_16(read_imm_16()));
  941. }
  942. static void d68020_bra_32(void)
  943. {
  944. uint temp_pc = g_cpu_pc;
  945. LIMIT_CPU_TYPES(M68020_PLUS);
  946. sprintf(g_dasm_str, "bra %x; (2+)", temp_pc + read_imm_32());
  947. }
  948. static void d68000_bset_r(void)
  949. {
  950. sprintf(g_dasm_str, "bset D%d, %s", (g_cpu_ir>>9)&7, get_ea_mode_str_8(g_cpu_ir));
  951. }
  952. static void d68000_bset_s(void)
  953. {
  954. char* str = get_imm_str_u8();
  955. sprintf(g_dasm_str, "bset %s, %s", str, get_ea_mode_str_8(g_cpu_ir));
  956. }
  957. static void d68000_bsr_8(void)
  958. {
  959. uint temp_pc = g_cpu_pc;
  960. sprintf(g_dasm_str, "bsr %x", temp_pc + make_int_8(g_cpu_ir));
  961. }
  962. static void d68000_bsr_16(void)
  963. {
  964. uint temp_pc = g_cpu_pc;
  965. sprintf(g_dasm_str, "bsr %x", temp_pc + make_int_16(read_imm_16()));
  966. }
  967. static void d68020_bsr_32(void)
  968. {
  969. uint temp_pc = g_cpu_pc;
  970. LIMIT_CPU_TYPES(M68020_PLUS);
  971. sprintf(g_dasm_str, "bsr %x; (2+)", temp_pc + peek_imm_32());
  972. }
  973. static void d68000_btst_r(void)
  974. {
  975. sprintf(g_dasm_str, "btst D%d, %s", (g_cpu_ir>>9)&7, get_ea_mode_str_8(g_cpu_ir));
  976. }
  977. static void d68000_btst_s(void)
  978. {
  979. char* str = get_imm_str_u8();
  980. sprintf(g_dasm_str, "btst %s, %s", str, get_ea_mode_str_8(g_cpu_ir));
  981. }
  982. static void d68020_callm(void)
  983. {
  984. char* str;
  985. LIMIT_CPU_TYPES(M68020_ONLY);
  986. str = get_imm_str_u8();
  987. sprintf(g_dasm_str, "callm %s, %s; (2)", str, get_ea_mode_str_8(g_cpu_ir));
  988. }
  989. static void d68020_cas_8(void)
  990. {
  991. uint extension;
  992. LIMIT_CPU_TYPES(M68020_PLUS);
  993. extension = read_imm_16();
  994. 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));
  995. }
  996. static void d68020_cas_16(void)
  997. {
  998. uint extension;
  999. LIMIT_CPU_TYPES(M68020_PLUS);
  1000. extension = read_imm_16();
  1001. 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));
  1002. }
  1003. static void d68020_cas_32(void)
  1004. {
  1005. uint extension;
  1006. LIMIT_CPU_TYPES(M68020_PLUS);
  1007. extension = read_imm_16();
  1008. 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));
  1009. }
  1010. static void d68020_cas2_16(void)
  1011. {
  1012. /* CAS2 Dc1:Dc2,Du1:Dc2:(Rn1):(Rn2)
  1013. f e d c b a 9 8 7 6 5 4 3 2 1 0
  1014. DARn1 0 0 0 Du1 0 0 0 Dc1
  1015. DARn2 0 0 0 Du2 0 0 0 Dc2
  1016. */
  1017. uint extension;
  1018. LIMIT_CPU_TYPES(M68020_PLUS);
  1019. extension = read_imm_32();
  1020. sprintf(g_dasm_str, "cas2.w D%d:D%d:D%d:D%d, (%c%d):(%c%d); (2+)",
  1021. (extension>>16)&7, extension&7, (extension>>22)&7, (extension>>6)&7,
  1022. BIT_1F(extension) ? 'A' : 'D', (extension>>28)&7,
  1023. BIT_F(extension) ? 'A' : 'D', (extension>>12)&7);
  1024. }
  1025. static void d68020_cas2_32(void)
  1026. {
  1027. uint extension;
  1028. LIMIT_CPU_TYPES(M68020_PLUS);
  1029. extension = read_imm_32();
  1030. sprintf(g_dasm_str, "cas2.l D%d:D%d:D%d:D%d, (%c%d):(%c%d); (2+)",
  1031. (extension>>16)&7, extension&7, (extension>>22)&7, (extension>>6)&7,
  1032. BIT_1F(extension) ? 'A' : 'D', (extension>>28)&7,
  1033. BIT_F(extension) ? 'A' : 'D', (extension>>12)&7);
  1034. }
  1035. static void d68000_chk_16(void)
  1036. {
  1037. sprintf(g_dasm_str, "chk.w %s, D%d", get_ea_mode_str_16(g_cpu_ir), (g_cpu_ir>>9)&7);
  1038. }
  1039. static void d68020_chk_32(void)
  1040. {
  1041. LIMIT_CPU_TYPES(M68020_PLUS);
  1042. sprintf(g_dasm_str, "chk.l %s, D%d; (2+)", get_ea_mode_str_32(g_cpu_ir), (g_cpu_ir>>9)&7);
  1043. }
  1044. static void d68020_chk2_cmp2_8(void)
  1045. {
  1046. uint extension;
  1047. LIMIT_CPU_TYPES(M68020_PLUS);
  1048. extension = read_imm_16();
  1049. 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);
  1050. }
  1051. static void d68020_chk2_cmp2_16(void)
  1052. {
  1053. uint extension;
  1054. LIMIT_CPU_TYPES(M68020_PLUS);
  1055. extension = read_imm_16();
  1056. 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);
  1057. }
  1058. static void d68020_chk2_cmp2_32(void)
  1059. {
  1060. uint extension;
  1061. LIMIT_CPU_TYPES(M68020_PLUS);
  1062. extension = read_imm_16();
  1063. 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);
  1064. }
  1065. static void d68040_cinv(void)
  1066. {
  1067. LIMIT_CPU_TYPES(M68040_PLUS);
  1068. switch((g_cpu_ir>>3)&3)
  1069. {
  1070. case 0:
  1071. sprintf(g_dasm_str, "cinv (illegal scope); (4)");
  1072. break;
  1073. case 1:
  1074. sprintf(g_dasm_str, "cinvl %d, (A%d); (4)", (g_cpu_ir>>6)&3, g_cpu_ir&7);
  1075. break;
  1076. case 2:
  1077. sprintf(g_dasm_str, "cinvp %d, (A%d); (4)", (g_cpu_ir>>6)&3, g_cpu_ir&7);
  1078. break;
  1079. case 3:
  1080. sprintf(g_dasm_str, "cinva %d; (4)", (g_cpu_ir>>6)&3);
  1081. break;
  1082. }
  1083. }
  1084. static void d68000_clr_8(void)
  1085. {
  1086. sprintf(g_dasm_str, "clr.b %s", get_ea_mode_str_8(g_cpu_ir));
  1087. }
  1088. static void d68000_clr_16(void)
  1089. {
  1090. sprintf(g_dasm_str, "clr.w %s", get_ea_mode_str_16(g_cpu_ir));
  1091. }
  1092. static void d68000_clr_32(void)
  1093. {
  1094. sprintf(g_dasm_str, "clr.l %s", get_ea_mode_str_32(g_cpu_ir));
  1095. }
  1096. static void d68000_cmp_8(void)
  1097. {
  1098. sprintf(g_dasm_str, "cmp.b %s, D%d", get_ea_mode_str_8(g_cpu_ir), (g_cpu_ir>>9)&7);
  1099. }
  1100. static void d68000_cmp_16(void)
  1101. {
  1102. sprintf(g_dasm_str, "cmp.w %s, D%d", get_ea_mode_str_16(g_cpu_ir), (g_cpu_ir>>9)&7);
  1103. }
  1104. static void d68000_cmp_32(void)
  1105. {
  1106. sprintf(g_dasm_str, "cmp.l %s, D%d", get_ea_mode_str_32(g_cpu_ir), (g_cpu_ir>>9)&7);
  1107. }
  1108. static void d68000_cmpa_16(void)
  1109. {
  1110. sprintf(g_dasm_str, "cmpa.w %s, A%d", get_ea_mode_str_16(g_cpu_ir), (g_cpu_ir>>9)&7);
  1111. }
  1112. static void d68000_cmpa_32(void)
  1113. {
  1114. sprintf(g_dasm_str, "cmpa.l %s, A%d", get_ea_mode_str_32(g_cpu_ir), (g_cpu_ir>>9)&7);
  1115. }
  1116. static void d68000_cmpi_8(void)
  1117. {
  1118. char* str = get_imm_str_s8();
  1119. sprintf(g_dasm_str, "cmpi.b %s, %s", str, get_ea_mode_str_8(g_cpu_ir));
  1120. }
  1121. static void d68020_cmpi_pcdi_8(void)
  1122. {
  1123. char* str;
  1124. LIMIT_CPU_TYPES(M68010_PLUS);
  1125. str = get_imm_str_s8();
  1126. sprintf(g_dasm_str, "cmpi.b %s, %s; (2+)", str, get_ea_mode_str_8(g_cpu_ir));
  1127. }
  1128. static void d68020_cmpi_pcix_8(void)
  1129. {
  1130. char* str;
  1131. LIMIT_CPU_TYPES(M68010_PLUS);
  1132. str = get_imm_str_s8();
  1133. sprintf(g_dasm_str, "cmpi.b %s, %s; (2+)", str, get_ea_mode_str_8(g_cpu_ir));
  1134. }
  1135. static void d68000_cmpi_16(void)
  1136. {
  1137. char* str;
  1138. str = get_imm_str_s16();
  1139. sprintf(g_dasm_str, "cmpi.w %s, %s", str, get_ea_mode_str_16(g_cpu_ir));
  1140. }
  1141. static void d68020_cmpi_pcdi_16(void)
  1142. {
  1143. char* str;
  1144. LIMIT_CPU_TYPES(M68010_PLUS);
  1145. str = get_imm_str_s16();
  1146. sprintf(g_dasm_str, "cmpi.w %s, %s; (2+)", str, get_ea_mode_str_16(g_cpu_ir));
  1147. }
  1148. static void d68020_cmpi_pcix_16(void)
  1149. {
  1150. char* str;
  1151. LIMIT_CPU_TYPES(M68010_PLUS);
  1152. str = get_imm_str_s16();
  1153. sprintf(g_dasm_str, "cmpi.w %s, %s; (2+)", str, get_ea_mode_str_16(g_cpu_ir));
  1154. }
  1155. static void d68000_cmpi_32(void)
  1156. {
  1157. char* str;
  1158. str = get_imm_str_s32();
  1159. sprintf(g_dasm_str, "cmpi.l %s, %s", str, get_ea_mode_str_32(g_cpu_ir));
  1160. }
  1161. static void d68020_cmpi_pcdi_32(void)
  1162. {
  1163. char* str;
  1164. LIMIT_CPU_TYPES(M68010_PLUS);
  1165. str = get_imm_str_s32();
  1166. sprintf(g_dasm_str, "cmpi.l %s, %s; (2+)", str, get_ea_mode_str_32(g_cpu_ir));
  1167. }
  1168. static void d68020_cmpi_pcix_32(void)
  1169. {
  1170. char* str;
  1171. LIMIT_CPU_TYPES(M68010_PLUS);
  1172. str = get_imm_str_s32();
  1173. sprintf(g_dasm_str, "cmpi.l %s, %s; (2+)", str, get_ea_mode_str_32(g_cpu_ir));
  1174. }
  1175. static void d68000_cmpm_8(void)
  1176. {
  1177. sprintf(g_dasm_str, "cmpm.b (A%d)+, (A%d)+", g_cpu_ir&7, (g_cpu_ir>>9)&7);
  1178. }
  1179. static void d68000_cmpm_16(void)
  1180. {
  1181. sprintf(g_dasm_str, "cmpm.w (A%d)+, (A%d)+", g_cpu_ir&7, (g_cpu_ir>>9)&7);
  1182. }
  1183. static void d68000_cmpm_32(void)
  1184. {
  1185. sprintf(g_dasm_str, "cmpm.l (A%d)+, (A%d)+", g_cpu_ir&7, (g_cpu_ir>>9)&7);
  1186. }
  1187. static void d68020_cpbcc_16(void)
  1188. {
  1189. uint extension;
  1190. uint new_pc = g_cpu_pc;
  1191. LIMIT_CPU_TYPES(M68020_PLUS);
  1192. extension = read_imm_16();
  1193. new_pc += make_int_16(peek_imm_16());
  1194. 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);
  1195. }
  1196. static void d68020_cpbcc_32(void)
  1197. {
  1198. uint extension;
  1199. uint new_pc = g_cpu_pc;
  1200. LIMIT_CPU_TYPES(M68020_PLUS);
  1201. extension = read_imm_16();
  1202. new_pc += peek_imm_32();
  1203. 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);
  1204. }
  1205. static void d68020_cpdbcc(void)
  1206. {
  1207. uint extension1;
  1208. uint extension2;
  1209. uint new_pc = g_cpu_pc;
  1210. LIMIT_CPU_TYPES(M68020_PLUS);
  1211. extension1 = read_imm_16();
  1212. extension2 = read_imm_16();
  1213. new_pc += make_int_16(peek_imm_16());
  1214. 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);
  1215. }
  1216. static void d68020_cpgen(void)
  1217. {
  1218. LIMIT_CPU_TYPES(M68020_PLUS);
  1219. sprintf(g_dasm_str, "%dgen %s; (2-3)", (g_cpu_ir>>9)&7, get_imm_str_u32());
  1220. }
  1221. static void d68020_cprestore(void)
  1222. {
  1223. LIMIT_CPU_TYPES(M68020_PLUS);
  1224. sprintf(g_dasm_str, "%drestore %s; (2-3)", (g_cpu_ir>>9)&7, get_ea_mode_str_8(g_cpu_ir));
  1225. }
  1226. static void d68020_cpsave(void)
  1227. {
  1228. LIMIT_CPU_TYPES(M68020_PLUS);
  1229. sprintf(g_dasm_str, "%dsave %s; (2-3)", (g_cpu_ir>>9)&7, get_ea_mode_str_8(g_cpu_ir));
  1230. }
  1231. static void d68020_cpscc(void)
  1232. {
  1233. uint extension1;
  1234. uint extension2;
  1235. LIMIT_CPU_TYPES(M68020_PLUS);
  1236. extension1 = read_imm_16();
  1237. extension2 = read_imm_16();
  1238. 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);
  1239. }
  1240. static void d68020_cptrapcc_0(void)
  1241. {
  1242. uint extension1;
  1243. uint extension2;
  1244. LIMIT_CPU_TYPES(M68020_PLUS);
  1245. extension1 = read_imm_16();
  1246. extension2 = read_imm_16();
  1247. sprintf(g_dasm_str, "%dtrap%-4s; (extension = %x) (2-3)", (g_cpu_ir>>9)&7, g_cpcc[extension1&0x3f], extension2);
  1248. }
  1249. static void d68020_cptrapcc_16(void)
  1250. {
  1251. uint extension1;
  1252. uint extension2;
  1253. LIMIT_CPU_TYPES(M68020_PLUS);
  1254. extension1 = read_imm_16();
  1255. extension2 = read_imm_16();
  1256. 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);
  1257. }
  1258. static void d68020_cptrapcc_32(void)
  1259. {
  1260. uint extension1;
  1261. uint extension2;
  1262. LIMIT_CPU_TYPES(M68020_PLUS);
  1263. extension1 = read_imm_16();
  1264. extension2 = read_imm_16();
  1265. 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);
  1266. }
  1267. static void d68040_cpush(void)
  1268. {
  1269. LIMIT_CPU_TYPES(M68040_PLUS);
  1270. switch((g_cpu_ir>>3)&3)
  1271. {
  1272. case 0:
  1273. sprintf(g_dasm_str, "cpush (illegal scope); (4)");
  1274. break;
  1275. case 1:
  1276. sprintf(g_dasm_str, "cpushl %d, (A%d); (4)", (g_cpu_ir>>6)&3, g_cpu_ir&7);
  1277. break;
  1278. case 2:
  1279. sprintf(g_dasm_str, "cpushp %d, (A%d); (4)", (g_cpu_ir>>6)&3, g_cpu_ir&7);
  1280. break;
  1281. case 3:
  1282. sprintf(g_dasm_str, "cpusha %d; (4)", (g_cpu_ir>>6)&3);
  1283. break;
  1284. }
  1285. }
  1286. static void d68000_dbra(void)
  1287. {
  1288. uint temp_pc = g_cpu_pc;
  1289. sprintf(g_dasm_str, "dbra D%d, %x", g_cpu_ir & 7, temp_pc + make_int_16(read_imm_16()));
  1290. }
  1291. static void d68000_dbcc(void)
  1292. {
  1293. uint temp_pc = g_cpu_pc;
  1294. 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()));
  1295. }
  1296. static void d68000_divs(void)
  1297. {
  1298. sprintf(g_dasm_str, "divs.w %s, D%d", get_ea_mode_str_16(g_cpu_ir), (g_cpu_ir>>9)&7);
  1299. }
  1300. static void d68000_divu(void)
  1301. {
  1302. sprintf(g_dasm_str, "divu.w %s, D%d", get_ea_mode_str_16(g_cpu_ir), (g_cpu_ir>>9)&7);
  1303. }
  1304. static void d68020_divl(void)
  1305. {
  1306. uint extension;
  1307. LIMIT_CPU_TYPES(M68020_PLUS);
  1308. extension = read_imm_16();
  1309. if(BIT_A(extension))
  1310. 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);
  1311. else if((extension&7) == ((extension>>12)&7))
  1312. 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);
  1313. else
  1314. 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);
  1315. }
  1316. static void d68000_eor_8(void)
  1317. {
  1318. sprintf(g_dasm_str, "eor.b D%d, %s", (g_cpu_ir>>9)&7, get_ea_mode_str_8(g_cpu_ir));
  1319. }
  1320. static void d68000_eor_16(void)
  1321. {
  1322. sprintf(g_dasm_str, "eor.w D%d, %s", (g_cpu_ir>>9)&7, get_ea_mode_str_16(g_cpu_ir));
  1323. }
  1324. static void d68000_eor_32(void)
  1325. {
  1326. sprintf(g_dasm_str, "eor.l D%d, %s", (g_cpu_ir>>9)&7, get_ea_mode_str_32(g_cpu_ir));
  1327. }
  1328. static void d68000_eori_8(void)
  1329. {
  1330. char* str = get_imm_str_u8();
  1331. sprintf(g_dasm_str, "eori.b %s, %s", str, get_ea_mode_str_8(g_cpu_ir));
  1332. }
  1333. static void d68000_eori_16(void)
  1334. {
  1335. char* str = get_imm_str_u16();
  1336. sprintf(g_dasm_str, "eori.w %s, %s", str, get_ea_mode_str_16(g_cpu_ir));
  1337. }
  1338. static void d68000_eori_32(void)
  1339. {
  1340. char* str = get_imm_str_u32();
  1341. sprintf(g_dasm_str, "eori.l %s, %s", str, get_ea_mode_str_32(g_cpu_ir));
  1342. }
  1343. static void d68000_eori_to_ccr(void)
  1344. {
  1345. sprintf(g_dasm_str, "eori %s, CCR", get_imm_str_u8());
  1346. }
  1347. static void d68000_eori_to_sr(void)
  1348. {
  1349. sprintf(g_dasm_str, "eori %s, SR", get_imm_str_u16());
  1350. }
  1351. static void d68000_exg_dd(void)
  1352. {
  1353. sprintf(g_dasm_str, "exg D%d, D%d", (g_cpu_ir>>9)&7, g_cpu_ir&7);
  1354. }
  1355. static void d68000_exg_aa(void)
  1356. {
  1357. sprintf(g_dasm_str, "exg A%d, A%d", (g_cpu_ir>>9)&7, g_cpu_ir&7);
  1358. }
  1359. static void d68000_exg_da(void)
  1360. {
  1361. sprintf(g_dasm_str, "exg D%d, A%d", (g_cpu_ir>>9)&7, g_cpu_ir&7);
  1362. }
  1363. static void d68000_ext_16(void)
  1364. {
  1365. sprintf(g_dasm_str, "ext.w D%d", g_cpu_ir&7);
  1366. }
  1367. static void d68000_ext_32(void)
  1368. {
  1369. sprintf(g_dasm_str, "ext.l D%d", g_cpu_ir&7);
  1370. }
  1371. static void d68020_extb_32(void)
  1372. {
  1373. LIMIT_CPU_TYPES(M68020_PLUS);
  1374. sprintf(g_dasm_str, "extb.l D%d; (2+)", g_cpu_ir&7);
  1375. }
  1376. static void d68000_jmp(void)
  1377. {
  1378. sprintf(g_dasm_str, "jmp %s", get_ea_mode_str_32(g_cpu_ir));
  1379. }
  1380. static void d68000_jsr(void)
  1381. {
  1382. sprintf(g_dasm_str, "jsr %s", get_ea_mode_str_32(g_cpu_ir));
  1383. }
  1384. static void d68000_lea(void)
  1385. {
  1386. sprintf(g_dasm_str, "lea %s, A%d", get_ea_mode_str_32(g_cpu_ir), (g_cpu_ir>>9)&7);
  1387. }
  1388. static void d68000_link_16(void)
  1389. {
  1390. sprintf(g_dasm_str, "link A%d, %s", g_cpu_ir&7, get_imm_str_s16());
  1391. }
  1392. static void d68020_link_32(void)
  1393. {
  1394. LIMIT_CPU_TYPES(M68020_PLUS);
  1395. sprintf(g_dasm_str, "link A%d, %s; (2+)", g_cpu_ir&7, get_imm_str_s32());
  1396. }
  1397. static void d68000_lsr_s_8(void)
  1398. {
  1399. sprintf(g_dasm_str, "lsr.b #%d, D%d", g_3bit_qdata_table[(g_cpu_ir>>9)&7], g_cpu_ir&7);
  1400. }
  1401. static void d68000_lsr_s_16(void)
  1402. {
  1403. sprintf(g_dasm_str, "lsr.w #%d, D%d", g_3bit_qdata_table[(g_cpu_ir>>9)&7], g_cpu_ir&7);
  1404. }
  1405. static void d68000_lsr_s_32(void)
  1406. {
  1407. sprintf(g_dasm_str, "lsr.l #%d, D%d", g_3bit_qdata_table[(g_cpu_ir>>9)&7], g_cpu_ir&7);
  1408. }
  1409. static void d68000_lsr_r_8(void)
  1410. {
  1411. sprintf(g_dasm_str, "lsr.b D%d, D%d", (g_cpu_ir>>9)&7, g_cpu_ir&7);
  1412. }
  1413. static void d68000_lsr_r_16(void)
  1414. {
  1415. sprintf(g_dasm_str, "lsr.w D%d, D%d", (g_cpu_ir>>9)&7, g_cpu_ir&7);
  1416. }
  1417. static void d68000_lsr_r_32(void)
  1418. {
  1419. sprintf(g_dasm_str, "lsr.l D%d, D%d", (g_cpu_ir>>9)&7, g_cpu_ir&7);
  1420. }
  1421. static void d68000_lsr_ea(void)
  1422. {
  1423. sprintf(g_dasm_str, "lsr.w %s", get_ea_mode_str_32(g_cpu_ir));
  1424. }
  1425. static void d68000_lsl_s_8(void)
  1426. {
  1427. sprintf(g_dasm_str, "lsl.b #%d, D%d", g_3bit_qdata_table[(g_cpu_ir>>9)&7], g_cpu_ir&7);
  1428. }
  1429. static void d68000_lsl_s_16(void)
  1430. {
  1431. sprintf(g_dasm_str, "lsl.w #%d, D%d", g_3bit_qdata_table[(g_cpu_ir>>9)&7], g_cpu_ir&7);
  1432. }
  1433. static void d68000_lsl_s_32(void)
  1434. {
  1435. sprintf(g_dasm_str, "lsl.l #%d, D%d", g_3bit_qdata_table[(g_cpu_ir>>9)&7], g_cpu_ir&7);
  1436. }
  1437. static void d68000_lsl_r_8(void)
  1438. {
  1439. sprintf(g_dasm_str, "lsl.b D%d, D%d", (g_cpu_ir>>9)&7, g_cpu_ir&7);
  1440. }
  1441. static void d68000_lsl_r_16(void)
  1442. {
  1443. sprintf(g_dasm_str, "lsl.w D%d, D%d", (g_cpu_ir>>9)&7, g_cpu_ir&7);
  1444. }
  1445. static void d68000_lsl_r_32(void)
  1446. {
  1447. sprintf(g_dasm_str, "lsl.l D%d, D%d", (g_cpu_ir>>9)&7, g_cpu_ir&7);
  1448. }
  1449. static void d68000_lsl_ea(void)
  1450. {
  1451. sprintf(g_dasm_str, "lsl.w %s", get_ea_mode_str_32(g_cpu_ir));
  1452. }
  1453. static void d68000_move_8(void)
  1454. {
  1455. char* str = get_ea_mode_str_8(g_cpu_ir);
  1456. sprintf(g_dasm_str, "move.b %s, %s", str, get_ea_mode_str_8(((g_cpu_ir>>9) & 7) | ((g_cpu_ir>>3) & 0x38)));
  1457. }
  1458. static void d68000_move_16(void)
  1459. {
  1460. char* str = get_ea_mode_str_16(g_cpu_ir);
  1461. sprintf(g_dasm_str, "move.w %s, %s", str, get_ea_mode_str_16(((g_cpu_ir>>9) & 7) | ((g_cpu_ir>>3) & 0x38)));
  1462. }
  1463. static void d68000_move_32(void)
  1464. {
  1465. char* str = get_ea_mode_str_32(g_cpu_ir);
  1466. sprintf(g_dasm_str, "move.l %s, %s", str, get_ea_mode_str_32(((g_cpu_ir>>9) & 7) | ((g_cpu_ir>>3) & 0x38)));
  1467. }
  1468. static void d68000_movea_16(void)
  1469. {
  1470. sprintf(g_dasm_str, "movea.w %s, A%d", get_ea_mode_str_16(g_cpu_ir), (g_cpu_ir>>9)&7);
  1471. }
  1472. static void d68000_movea_32(void)
  1473. {
  1474. sprintf(g_dasm_str, "movea.l %s, A%d", get_ea_mode_str_32(g_cpu_ir), (g_cpu_ir>>9)&7);
  1475. }
  1476. static void d68000_move_to_ccr(void)
  1477. {
  1478. sprintf(g_dasm_str, "move %s, CCR", get_ea_mode_str_8(g_cpu_ir));
  1479. }
  1480. static void d68010_move_fr_ccr(void)
  1481. {
  1482. LIMIT_CPU_TYPES(M68010_PLUS);
  1483. sprintf(g_dasm_str, "move CCR, %s; (1+)", get_ea_mode_str_8(g_cpu_ir));
  1484. }
  1485. static void d68000_move_fr_sr(void)
  1486. {
  1487. sprintf(g_dasm_str, "move SR, %s", get_ea_mode_str_16(g_cpu_ir));
  1488. }
  1489. static void d68000_move_to_sr(void)
  1490. {
  1491. sprintf(g_dasm_str, "move %s, SR", get_ea_mode_str_16(g_cpu_ir));
  1492. }
  1493. static void d68000_move_fr_usp(void)
  1494. {
  1495. sprintf(g_dasm_str, "move USP, A%d", g_cpu_ir&7);
  1496. }
  1497. static void d68000_move_to_usp(void)
  1498. {
  1499. sprintf(g_dasm_str, "move A%d, USP", g_cpu_ir&7);
  1500. }
  1501. static void d68010_movec(void)
  1502. {
  1503. uint extension;
  1504. const char* reg_name;
  1505. const char* processor;
  1506. LIMIT_CPU_TYPES(M68010_PLUS);
  1507. extension = read_imm_16();
  1508. switch(extension & 0xfff)
  1509. {
  1510. case 0x000:
  1511. reg_name = "SFC";
  1512. processor = "1+";
  1513. break;
  1514. case 0x001:
  1515. reg_name = "DFC";
  1516. processor = "1+";
  1517. break;
  1518. case 0x800:
  1519. reg_name = "USP";
  1520. processor = "1+";
  1521. break;
  1522. case 0x801:
  1523. reg_name = "VBR";
  1524. processor = "1+";
  1525. break;
  1526. case 0x002:
  1527. reg_name = "CACR";
  1528. processor = "2+";
  1529. break;
  1530. case 0x802:
  1531. reg_name = "CAAR";
  1532. processor = "2,3";
  1533. break;
  1534. case 0x803:
  1535. reg_name = "MSP";
  1536. processor = "2+";
  1537. break;
  1538. case 0x804:
  1539. reg_name = "ISP";
  1540. processor = "2+";
  1541. break;
  1542. case 0x003:
  1543. reg_name = "TC";
  1544. processor = "4+";
  1545. break;
  1546. case 0x004:
  1547. reg_name = "ITT0";
  1548. processor = "4+";
  1549. break;
  1550. case 0x005:
  1551. reg_name = "ITT1";
  1552. processor = "4+";
  1553. break;
  1554. case 0x006:
  1555. reg_name = "DTT0";
  1556. processor = "4+";
  1557. break;
  1558. case 0x007:
  1559. reg_name = "DTT1";
  1560. processor = "4+";
  1561. break;
  1562. case 0x805:
  1563. reg_name = "MMUSR";
  1564. processor = "4+";
  1565. break;
  1566. case 0x806:
  1567. reg_name = "URP";
  1568. processor = "4+";
  1569. break;
  1570. case 0x807:
  1571. reg_name = "SRP";
  1572. processor = "4+";
  1573. break;
  1574. default:
  1575. reg_name = make_signed_hex_str_16(extension & 0xfff);
  1576. processor = "?";
  1577. }
  1578. if(BIT_1(g_cpu_ir))
  1579. sprintf(g_dasm_str, "movec %c%d, %s; (%s)", BIT_F(extension) ? 'A' : 'D', (extension>>12)&7, reg_name, processor);
  1580. else
  1581. sprintf(g_dasm_str, "movec %s, %c%d; (%s)", reg_name, BIT_F(extension) ? 'A' : 'D', (extension>>12)&7, processor);
  1582. }
  1583. static void d68000_movem_pd_16(void)
  1584. {
  1585. uint data = read_imm_16();
  1586. char buffer[40];
  1587. uint first;
  1588. uint run_length;
  1589. uint i;
  1590. buffer[0] = 0;
  1591. for(i=0;i<8;i++)
  1592. {
  1593. if(data&(1<<(15-i)))
  1594. {
  1595. first = i;
  1596. run_length = 0;
  1597. while(i

Large files files are truncated, but you can click here to view the full file