diff options
Diffstat (limited to 'src/devices/cpu/arcompact/arcompactdasm.c')
-rw-r--r-- | src/devices/cpu/arcompact/arcompactdasm.c | 92 |
1 files changed, 92 insertions, 0 deletions
diff --git a/src/devices/cpu/arcompact/arcompactdasm.c b/src/devices/cpu/arcompact/arcompactdasm.c new file mode 100644 index 00000000000..0b917a05d56 --- /dev/null +++ b/src/devices/cpu/arcompact/arcompactdasm.c @@ -0,0 +1,92 @@ +// license:BSD-3-Clause +// copyright-holders:David Haywood +/*********************************\ + + ARCompact disassembler + +\*********************************/ + +#include "emu.h" +#include <stdarg.h> + +#include "arcompactdasm_dispatch.h" +#include "arcompactdasm_ops.h" + + +/*****************************************************************************/ + + + +/*****************************************************************************/ + + +#define ARCOMPACT_OPERATION ((op & 0xf800) >> 11) + +extern char *output; + +CPU_DISASSEMBLE(arcompact) +{ + int size = 2; + + UINT32 op = oprom[0] | (oprom[1] << 8); + output = buffer; + + UINT8 instruction = ARCOMPACT_OPERATION; + + if (instruction < 0x0c) + { + size = 4; + op <<= 16; + op |= oprom[2] | (oprom[3] << 8); + + op &= ~0xf8000000; + + switch (instruction) // 32-bit instructions (with optional extra dword for immediate data) + { + case 0x00: size = arcompact_handle00_dasm(DASM_PARAMS); break; // Bcc + case 0x01: size = arcompact_handle01_dasm(DASM_PARAMS); break; // BLcc/BRcc + case 0x02: size = arcompact_handle02_dasm(DASM_PARAMS); break; // LD r+o + case 0x03: size = arcompact_handle03_dasm(DASM_PARAMS); break; // ST r+o + case 0x04: size = arcompact_handle04_dasm(DASM_PARAMS); break; // op a,b,c (basecase) + case 0x05: size = arcompact_handle05_dasm(DASM_PARAMS); break; // op a,b,c (05 ARC ext) + case 0x06: size = arcompact_handle06_dasm(DASM_PARAMS); break; // op a,b,c (06 ARC ext) + case 0x07: size = arcompact_handle07_dasm(DASM_PARAMS); break; // op a,b,c (07 User ext) + case 0x08: size = arcompact_handle08_dasm(DASM_PARAMS); break; // op a,b,c (08 User ext) + case 0x09: size = arcompact_handle09_dasm(DASM_PARAMS); break; // op a,b,c (09 Market ext) + case 0x0a: size = arcompact_handle0a_dasm(DASM_PARAMS); break; // op a,b,c (0a Market ext) + case 0x0b: size = arcompact_handle0b_dasm(DASM_PARAMS); break; // op a,b,c (0b Market ext) + } + } + else + { + size = 2; + op &= ~0xf800; + + + switch (instruction) // 16-bit instructions + { + case 0x0c: size = arcompact_handle0c_dasm(DASM_PARAMS); break; // Load/Add reg-reg + case 0x0d: size = arcompact_handle0d_dasm(DASM_PARAMS); break; // Add/Sub/Shft imm + case 0x0e: size = arcompact_handle0e_dasm(DASM_PARAMS); break; // Mov/Cmp/Add + case 0x0f: size = arcompact_handle0f_dasm(DASM_PARAMS); break; // op_S b,b,c (single 16-bit ops) + case 0x10: size = arcompact_handle10_dasm(DASM_PARAMS); break; // LD_S + case 0x11: size = arcompact_handle11_dasm(DASM_PARAMS); break; // LDB_S + case 0x12: size = arcompact_handle12_dasm(DASM_PARAMS); break; // LDW_S + case 0x13: size = arcompact_handle13_dasm(DASM_PARAMS); break; // LSW_S.X + case 0x14: size = arcompact_handle14_dasm(DASM_PARAMS); break; // ST_S + case 0x15: size = arcompact_handle15_dasm(DASM_PARAMS); break; // STB_S + case 0x16: size = arcompact_handle16_dasm(DASM_PARAMS); break; // STW_S + case 0x17: size = arcompact_handle17_dasm(DASM_PARAMS); break; // Shift/Sub/Bit + case 0x18: size = arcompact_handle18_dasm(DASM_PARAMS); break; // Stack Instr + case 0x19: size = arcompact_handle19_dasm(DASM_PARAMS); break; // GP Instr + case 0x1a: size = arcompact_handle1a_dasm(DASM_PARAMS); break; // PCL Instr + case 0x1b: size = arcompact_handle1b_dasm(DASM_PARAMS); break; // MOV_S + case 0x1c: size = arcompact_handle1c_dasm(DASM_PARAMS); break; // ADD_S/CMP_S + case 0x1d: size = arcompact_handle1d_dasm(DASM_PARAMS); break; // BRcc_S + case 0x1e: size = arcompact_handle1e_dasm(DASM_PARAMS); break; // Bcc_S + case 0x1f: size = arcompact_handle1f_dasm(DASM_PARAMS); break; // BL_S + } + } + + return size | DASMFLAG_SUPPORTED; +} |