src/musashi/m68kdasm.c

Thu, 11 Apr 2013 09:37:11 +0100

author
Philip Pemberton <philpem@philpem.me.uk>
date
Thu, 11 Apr 2013 09:37:11 +0100
changeset 138
d744db15cdf7
parent 0
8bf1bf91a36d
permissions
-rw-r--r--

Check return value of fread()

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