summaryrefslogtreecommitdiffstatshomepage
path: root/src/devices/cpu/lc8670/lc8670dsm.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/devices/cpu/lc8670/lc8670dsm.c')
-rw-r--r--src/devices/cpu/lc8670/lc8670dsm.c178
1 files changed, 178 insertions, 0 deletions
diff --git a/src/devices/cpu/lc8670/lc8670dsm.c b/src/devices/cpu/lc8670/lc8670dsm.c
new file mode 100644
index 00000000000..45985ea6e5f
--- /dev/null
+++ b/src/devices/cpu/lc8670/lc8670dsm.c
@@ -0,0 +1,178 @@
+// license:BSD-3-Clause
+// copyright-holders:Sandro Ronco
+/******************************************************************************
+
+ Sanyo LC8670 disassembler
+
+******************************************************************************/
+
+#include "emu.h"
+#include "debugger.h"
+#include "lc8670.h"
+
+const lc8670_cpu_device::dasm_entry lc8670_cpu_device::s_dasm_table[] =
+{
+ { "NOP" , OP_NULL, OP_NULL, 0 }, // 0x0*
+ { "BR" , OP_R8 , OP_NULL, 0 },
+ { "LD" , OP_D9 , OP_NULL, 0 },
+ { "LD" , OP_RI , OP_NULL, 0 },
+ { "CALL", OP_A12 , OP_NULL, 0 },
+ { "CALLR", OP_R16 , OP_NULL, 0 }, // 0x1*
+ { "BRF" , OP_R16 , OP_NULL, 0 },
+ { "ST" , OP_D9 , OP_NULL, 0 },
+ { "ST" , OP_RI , OP_NULL, 0 },
+ { "CALL", OP_A12 , OP_NULL, 0 },
+ { "CALLF", OP_A16 , OP_NULL, 0 }, // 0x2*
+ { "JMPF", OP_A16 , OP_NULL, 0 },
+ { "MOV" , OP_D9 , OP_I8 , 1 },
+ { "MOV" , OP_RI , OP_I8 , 1 },
+ { "JMP" , OP_A12 , OP_NULL, 0 },
+ { "MUL" , OP_NULL, OP_NULL, 0 }, // 0x3*
+ { "BE" , OP_I8 , OP_R8 , 0 },
+ { "BE" , OP_D9 , OP_R8 , 0 },
+ { "BE" , OP_RII8, OP_R8 , 0 },
+ { "JMP" , OP_A12 , OP_NULL, 0 },
+ { "DIV" , OP_NULL, OP_NULL, 0 }, // 0x4*
+ { "BNE" , OP_I8 , OP_R8 , 0 },
+ { "BNE" , OP_D9 , OP_R8 , 0 },
+ { "BNE" , OP_RII8, OP_R8 , 0 },
+ { "BPC" , OP_D9B3, OP_R8 , 0 },
+ { "LDF" , OP_NULL, OP_NULL, 0 }, // 0x5*
+ { "STF" , OP_NULL, OP_NULL, 0 },
+ { "DBNZ", OP_D9 , OP_R8 , 0 },
+ { "DBNZ", OP_RI , OP_R8RI, 0 },
+ { "BPC" , OP_D9B3, OP_R8 , 0 },
+ { "PUSH", OP_D9 , OP_NULL, 0 }, // 0x6*
+ { "PUSH", OP_D9 , OP_NULL, 0 },
+ { "INC" , OP_D9 , OP_NULL, 0 },
+ { "INC" , OP_RI , OP_NULL, 0 },
+ { "BP" , OP_D9B3, OP_R8 , 0 },
+ { "POP" , OP_D9 , OP_NULL, 0 }, // 0x7*
+ { "POP" , OP_D9 , OP_NULL, 0 },
+ { "DEC" , OP_D9 , OP_NULL, 0 },
+ { "DEC" , OP_RI , OP_NULL, 0 },
+ { "BP" , OP_D9B3, OP_R8 , 0 },
+ { "BZ" , OP_R8 , OP_NULL, 0 }, // 0x8*
+ { "ADD" , OP_I8 , OP_NULL, 0 },
+ { "ADD" , OP_D9 , OP_NULL, 0 },
+ { "ADD" , OP_RI , OP_NULL, 0 },
+ { "BN" , OP_D9B3, OP_R8 , 0 },
+ { "BNZ" , OP_R8 , OP_NULL, 0 }, // 0x9*
+ { "ADDC", OP_I8 , OP_NULL, 0 },
+ { "ADDC", OP_D9 , OP_NULL, 0 },
+ { "ADDC", OP_RI , OP_NULL, 0 },
+ { "BN" , OP_D9B3, OP_R8 , 0 },
+ { "RET" , OP_NULL, OP_NULL, 0 }, // 0xa*
+ { "SUB" , OP_I8 , OP_NULL, 0 },
+ { "SUB" , OP_D9 , OP_NULL, 0 },
+ { "SUB" , OP_RI , OP_NULL, 0 },
+ { "NOT1", OP_D9B3, OP_NULL, 0 },
+ { "RETI", OP_NULL, OP_NULL, 0 }, // 0xb*
+ { "SUBC", OP_I8 , OP_NULL, 0 },
+ { "SUBC", OP_D9 , OP_NULL, 0 },
+ { "SUBC", OP_RI , OP_NULL, 0 },
+ { "NOT1", OP_D9B3, OP_NULL, 0 },
+ { "ROR" , OP_NULL, OP_NULL, 0 }, // 0xc*
+ { "LDC" , OP_NULL, OP_NULL, 0 },
+ { "XCH" , OP_D9 , OP_NULL, 0 },
+ { "XCH" , OP_RI , OP_NULL, 0 },
+ { "CLR1", OP_D9B3, OP_NULL, 0 },
+ { "RORC", OP_NULL, OP_NULL, 0 }, // 0xd*
+ { "OR" , OP_I8 , OP_NULL, 0 },
+ { "OR" , OP_D9 , OP_NULL, 0 },
+ { "OR" , OP_RI , OP_NULL, 0 },
+ { "CLR1", OP_D9B3, OP_NULL, 0 },
+ { "ROL" , OP_NULL, OP_NULL, 0 }, // 0xe*
+ { "AND" , OP_I8 , OP_NULL, 0 },
+ { "AND" , OP_D9 , OP_NULL, 0 },
+ { "AND" , OP_RI , OP_NULL, 0 },
+ { "SET1", OP_D9B3, OP_NULL, 0 },
+ { "ROLC", OP_NULL, OP_NULL, 0 }, // 0xf*
+ { "XOR" , OP_I8 , OP_NULL, 0 },
+ { "XOR" , OP_D9 , OP_NULL, 0 },
+ { "XOR" , OP_RI , OP_NULL, 0 },
+ { "SET1", OP_D9B3, OP_NULL, 0 },
+};
+
+void lc8670_cpu_device::dasm_arg(UINT8 op, char *buffer, offs_t pc, int arg, const UINT8 *oprom, int &pos)
+{
+ switch( arg )
+ {
+ case OP_NULL:
+ buffer[0] = '\0';
+ break;
+ case OP_R8:
+ pc++;
+ // fall through
+ case OP_R8RI:
+ buffer += sprintf(buffer, "%04x", (pc + 1 + oprom[pos] - (oprom[pos]&0x80 ? 0x100 : 0)) & 0xffff);
+ pos++;
+ break;
+ case OP_R16:
+ buffer += sprintf(buffer, "%04x", (pc + 2 + ((oprom[pos+1]<<8) | oprom[pos])) & 0xffff);
+ pos += 2;
+ break;
+ case OP_RI:
+ buffer += sprintf(buffer, "@%x", op & 0x03);
+ break;
+ case OP_A12:
+ buffer += sprintf(buffer, "%04x", ((pc + 2) & 0xf000) | ((op & 0x10)<<7) | ((op & 0x07)<<8) | oprom[pos]);
+ pos++;
+ break;
+ case OP_A16:
+ buffer += sprintf(buffer, "%04x", (oprom[pos]<<8) | oprom[pos+1]);
+ pos += 2;
+ break;
+ case OP_I8:
+ buffer += sprintf(buffer, "#$%02x", oprom[pos++]);
+ break;
+ case OP_B3:
+ buffer += sprintf(buffer, "%x", op & 0x07);
+ break;
+ case OP_D9:
+ buffer += sprintf(buffer, "($%03x)", ((op & 0x01)<<8) | oprom[pos]);
+ pos++;
+ break;
+ case OP_D9B3:
+ buffer += sprintf(buffer, "($%03x)", ((op & 0x10)<<4) | oprom[pos]);
+ buffer += sprintf(buffer, ",%x", op & 0x07);
+ pos++;
+ break;
+ case OP_RII8:
+ buffer += sprintf(buffer, "@%x", op & 0x03);
+ buffer += sprintf(buffer, ",#$%02x", oprom[pos]);
+ pos++;
+ break;
+ }
+}
+
+//-------------------------------------------------
+// disasm_disassemble - call the disassembly
+// helper function
+//-------------------------------------------------
+
+offs_t lc8670_cpu_device::disasm_disassemble(char *buffer, offs_t pc, const UINT8 *oprom, const UINT8 *opram, UINT32 options)
+{
+ int pos = 0;
+ char arg1[16], arg2[16];
+
+ UINT8 op = oprom[pos++];
+
+ int op_idx = decode_op(op);
+ const dasm_entry *inst = &s_dasm_table[op_idx];
+
+ buffer += sprintf(buffer,"%-8s", inst->str);
+
+ dasm_arg(op, inst->inv ? arg2 : arg1, pc+0, inst->arg1, oprom, pos);
+ dasm_arg(op, inst->inv ? arg1 : arg2, pc+1, inst->arg2, oprom, pos);
+
+ strcat(buffer, arg1);
+
+ if (inst->arg2 != OP_NULL)
+ {
+ strcat(buffer, ",");
+ strcat(buffer, arg2);
+ }
+
+ return pos;
+}