diff options
Diffstat (limited to 'src/devices/cpu/lc8670/lc8670dsm.cpp')
-rw-r--r-- | src/devices/cpu/lc8670/lc8670dsm.cpp | 178 |
1 files changed, 178 insertions, 0 deletions
diff --git a/src/devices/cpu/lc8670/lc8670dsm.cpp b/src/devices/cpu/lc8670/lc8670dsm.cpp new file mode 100644 index 00000000000..45985ea6e5f --- /dev/null +++ b/src/devices/cpu/lc8670/lc8670dsm.cpp @@ -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; +} |