diff options
Diffstat (limited to 'src/devices/cpu/minx')
-rw-r--r-- | src/devices/cpu/minx/minx.cpp | 6 | ||||
-rw-r--r-- | src/devices/cpu/minx/minx.h | 4 | ||||
-rw-r--r-- | src/devices/cpu/minx/minxd.cpp | 127 | ||||
-rw-r--r-- | src/devices/cpu/minx/minxd.h | 89 |
4 files changed, 129 insertions, 97 deletions
diff --git a/src/devices/cpu/minx/minx.cpp b/src/devices/cpu/minx/minx.cpp index 883abb6f843..7e4a898e22c 100644 --- a/src/devices/cpu/minx/minx.cpp +++ b/src/devices/cpu/minx/minx.cpp @@ -46,6 +46,7 @@ TODO: #include "emu.h" #include "minx.h" +#include "minxd.h" #include "debugger.h" #define FLAG_I 0x80 @@ -234,8 +235,7 @@ void minx_cpu_device::execute_set_input(int inputnum, int state) } -offs_t minx_cpu_device::disasm_disassemble(std::ostream &stream, offs_t pc, const uint8_t *oprom, const uint8_t *opram, uint32_t options) +util::disasm_interface *minx_cpu_device::create_disassembler() { - extern CPU_DISASSEMBLE( minx ); - return CPU_DISASSEMBLE_NAME(minx)(this, stream, pc, oprom, opram, options); + return new minx_disassembler; } diff --git a/src/devices/cpu/minx/minx.h b/src/devices/cpu/minx/minx.h index babc3d182aa..57f0456c76b 100644 --- a/src/devices/cpu/minx/minx.h +++ b/src/devices/cpu/minx/minx.h @@ -39,9 +39,7 @@ protected: virtual void state_string_export(const device_state_entry &entry, std::string &str) const override; // device_disasm_interface overrides - virtual uint32_t disasm_min_opcode_bytes() const override { return 1; } - virtual uint32_t disasm_max_opcode_bytes() const override { return 5; } - virtual offs_t disasm_disassemble(std::ostream &stream, offs_t pc, const uint8_t *oprom, const uint8_t *opram, uint32_t options) override; + virtual util::disasm_interface *create_disassembler() override; private: address_space_config m_program_config; diff --git a/src/devices/cpu/minx/minxd.cpp b/src/devices/cpu/minx/minxd.cpp index 0e3b9d5b090..413f588369f 100644 --- a/src/devices/cpu/minx/minxd.cpp +++ b/src/devices/cpu/minx/minxd.cpp @@ -8,61 +8,10 @@ ************************************************************/ #include "emu.h" -#include "debugger.h" -#include "minx.h" +#include "minxd.h" -enum e_mnemonic { - zADD=0, zADDC, zAND, zBCDD, zBCDE, zBCDX, zCALL, zCALLC, zCALLG, zCALLGE, zCALLL, - zCALLLE, zCALLN, zCALLNC, zCALLNO, zCALLNZ, zCALLO, zCALLP, zCALLNX0, - zCALLNX1, zCALLNX2, zCALLNX3, zCALLX0, zCALLX1, zCALLX2, zCALLX3, zCALLZ, - zCMP, zCMPN, zDEC, zDIV, zEXT, zHALT, zINC, zINT, - zJC, zJDBNZ, zJG, zJGE, zJINT, zJL, zJLE, zJMP, - zJN, zJNX0, zJNX1, zJNX2, zJNX3, zJNC, zJNO, zJNZ, - zJO, zJP, zJX0, zJX1, zJX2, zJX3, zJZ, zMOV, - zMUL, zNEG, zNOP, zNOT, zOR, zPOP, zPOPA, zPOPAX, - zPOPX, zPUSH, zPUSHA, zPUSHAX, zPUSHX, zRET, zRETI, zRETSKIP, - zROL, zROLC, zROR, zRORC, zSAL, zSAR, zSHL, zSHR, zSUB, - zSUBC, zTEST, zXCHG, zXOR, zDB -}; - -enum e_operand { - R_A=1, /* A */ - R_B, /* B */ - R_L, /* L */ - R_H, /* H */ - R_N, /* N */ - R_F, /* F */ - R_SP, /* SP */ - R_BA, /* BA */ - R_HL, /* HL */ - R_X, /* X */ - R_Y, /* Y */ - R_U, /* U */ - R_V, /* V */ - R_I, /* I */ - R_XI, /* XI */ - R_YI, /* YI */ - R_PC, /* PC */ - I_8, /* 8 bit immediate */ - I_16, /* 16 bit immediate */ - D_8, /* PC + 8 bit displacement (signed) */ - D_16, /* PC + 16 bit displacement */ - S_8, /* SP + 8 bit displacement (signed) */ - M_IHL, /* [I+HL] */ - M_N8, /* [I+N+ofs8] */ - M_I16, /* [I+ofs16] */ - M_X, /* [X] */ - M_Y, /* [Y] */ - M_X8, /* [X + 8 bit displacement (signed)] */ - M_Y8, /* [Y + 8 bit displacement (signed)] */ - M_XL, /* [X + L (signed)] */ - M_YL, /* [Y + L (signed)] */ - M_16, /* [16bit] */ - M_HL, /* [HL] */ - OP, OP1 -}; -static const char *const s_mnemonic[] = { +const char *const minx_disassembler::s_mnemonic[] = { "add", "addc", "and", "bcdd", "bcde", "bcdx", "call", "callc", "callg", "callge", "calll", "callle", "calln", "callnc", "callno", "callnz", "callo", "callp", "callnx0", "callnx1", "callnx2", "callnx3", "callx0", "callx1", "callx2", "callx3", "callz", @@ -76,30 +25,21 @@ static const char *const s_mnemonic[] = { "subc", "test", "xchg", "xor", "db" }; -#define _OVER DASMFLAG_STEP_OVER -#define _OUT DASMFLAG_STEP_OUT - -static const uint32_t s_flags[] = { - 0, 0, 0, 0, 0, 0, _OVER, _OVER, _OVER, _OVER, _OVER, - _OVER, _OVER, _OVER, _OVER, _OVER, _OVER, _OVER, _OVER, - _OVER, _OVER, _OVER, _OVER, _OVER, _OVER, _OVER, _OVER, - 0, 0, 0, 0, 0, _OVER, 0, _OVER, +const uint32_t minx_disassembler::s_flags[] = { + 0, 0, 0, 0, 0, 0, STEP_OVER, STEP_OVER, STEP_OVER, STEP_OVER, STEP_OVER, + STEP_OVER, STEP_OVER, STEP_OVER, STEP_OVER, STEP_OVER, STEP_OVER, STEP_OVER, STEP_OVER, + STEP_OVER, STEP_OVER, STEP_OVER, STEP_OVER, STEP_OVER, STEP_OVER, STEP_OVER, STEP_OVER, + 0, 0, 0, 0, 0, STEP_OVER, 0, STEP_OVER, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, _OUT, _OUT, _OUT, + 0, 0, 0, 0, 0, STEP_OUT, STEP_OUT, STEP_OUT, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }; -struct minxdasm { - uint8_t mnemonic; - uint8_t argument1; - uint8_t argument2; -}; - -static const minxdasm mnemonic[256] = { +const minx_disassembler::minxdasm minx_disassembler::mnemonic[256] = { /* 00 - 0F */ {zADD,R_A,R_A}, {zADD,R_A,R_B}, {zADD,R_A,I_8}, {zADD,R_A,M_IHL}, {zADD,R_A,M_N8}, {zADD,R_A,M_I16}, {zADD,R_A,M_X}, {zADD,R_A,M_Y}, @@ -182,7 +122,7 @@ static const minxdasm mnemonic[256] = { {zINT,I_8,0}, {zJINT,I_8,0}, {zDB,OP,0}, {zNOP,0,0} }; -static const minxdasm mnemonic_ce[256] = { +const minx_disassembler::minxdasm minx_disassembler::mnemonic_ce[256] = { /* 00 - 0F */ {zADD,R_A,M_X8}, {zADD,R_A,M_Y8}, {zADD,R_A,M_XL}, {zADD,R_A,M_YL}, {zADD,M_IHL,R_A}, {zADD,M_IHL,I_8}, {zADD,M_IHL,M_X}, {zADD,M_IHL,M_Y}, @@ -265,7 +205,7 @@ static const minxdasm mnemonic_ce[256] = { {zCALLX0,D_8,0}, {zCALLX1,D_8,0}, {zCALLX2,D_8,0}, {zCALLX3,D_8,0} }; -static const minxdasm mnemonic_cf[256] = { +const minx_disassembler::minxdasm minx_disassembler::mnemonic_cf[256] = { /* 00 - 0F */ {zADD,R_BA,R_BA}, {zADD,R_BA,R_HL}, {zADD,R_BA,R_X}, {zADD,R_BA,R_Y}, {zADDC,R_BA,R_BA}, {zADDC,R_BA,R_HL}, {zADDC,R_BA,R_X}, {zADDC,R_BA,R_Y}, @@ -367,76 +307,81 @@ case R_XI: util::stream_format(stream, "%cXI", fill); break; \ case R_YI: util::stream_format(stream, "%cYI", fill); break; \ case R_PC: util::stream_format(stream, "%cPC", fill); break; \ case I_8: /* 8 bit immediate */ \ - ea = oprom[pos++]; \ + ea = opcodes.r8(pos++); \ util::stream_format(stream, "%c$%02X", fill, ea); \ break; \ case I_16: /* 16 bit immediate */ \ - ea = oprom[pos++]; \ - ea += oprom[pos++] << 8; \ + ea = opcodes.r8(pos++); \ + ea += opcodes.r8(pos++) << 8; \ util::stream_format(stream, "%c$%04X", fill, ea); \ break; \ case D_8: /* PC + 8 bit displacement (signed) */ \ - ofs8 = oprom[pos++]; \ + ofs8 = opcodes.r8(pos++); \ util::stream_format(stream, "%c$%04X", fill, pc + pos - 1 + ofs8); \ break; \ case D_16: /* PC + 16 bit displacement */ \ - ea = oprom[pos++]; \ - ea += oprom[pos++] << 8; \ + ea = opcodes.r8(pos++); \ + ea += opcodes.r8(pos++) << 8; \ ea = ea - 1; \ util::stream_format(stream, "%c$%04X", fill, pc + pos + ea); \ break; \ case S_8: /* SP + 8 bit displacement (signed) */ \ - ea = oprom[pos++]; \ + ea = opcodes.r8(pos++); \ util::stream_format(stream, "%cSP+$%02X", fill, ea); \ break; \ case M_IHL: util::stream_format(stream, "%c[I+HL]", fill); break; \ case M_N8: /* [I+N+ofs8] */ \ - ea = oprom[pos++]; \ + ea = opcodes.r8(pos++); \ util::stream_format(stream, "%c[I+N+$%02X]", fill, ea); \ break; \ case M_I16: /* [I+ofs16] */ \ - ea = oprom[pos++]; \ - ea += oprom[pos++] << 8; \ + ea = opcodes.r8(pos++); \ + ea += opcodes.r8(pos++) << 8; \ util::stream_format(stream, "%c[I+$%04X]", fill, ea); \ break; \ case M_X: util::stream_format(stream, "%c[X]", fill); break; \ case M_Y: util::stream_format(stream, "%c[Y]", fill); break; \ case M_X8: /* [X + 8 bit displacement (signed)] */ \ - ea = oprom[pos++]; \ + ea = opcodes.r8(pos++); \ util::stream_format(stream, "%c[X+$%02X]", fill, ea); \ break; \ case M_Y8: /* [Y + 8 bit displacement (signed)] */ \ - ea = oprom[pos++]; \ + ea = opcodes.r8(pos++); \ util::stream_format(stream, "%c[Y+$%02X]", fill, ea); \ break; \ case M_XL: util::stream_format(stream, "%c[X+L]", fill); break; \ case M_YL: util::stream_format(stream, "%c[Y+L]", fill); break; \ case M_16: /* [16bit] */ \ - ea = oprom[pos++]; \ - ea += oprom[pos++] << 8; \ + ea = opcodes.r8(pos++); \ + ea += opcodes.r8(pos++) << 8; \ util::stream_format(stream, "%c[$%04X]", fill, ea); \ break; \ case M_HL: util::stream_format(stream, "%c[HL]", fill); break; \ case OP: util::stream_format(stream, "%c$%02X", fill, op); break; \ case OP1: util::stream_format(stream, "%c$%02X", fill, op1); break; -CPU_DISASSEMBLE(minx) +u32 minx_disassembler::opcode_alignment() const +{ + return 1; +} + +offs_t minx_disassembler::disassemble(std::ostream &stream, offs_t pc, const data_buffer &opcodes, const data_buffer ¶ms) { const minxdasm *instr; uint8_t op, op1; int8_t ofs8; uint16_t ea; - int pos = 0; + offs_t pos = pc; - op1 = op = oprom[pos++]; + op1 = op = opcodes.r8(pos++); switch (op) { case 0xCE: - op = oprom[pos++]; + op = opcodes.r8(pos++); instr = &mnemonic_ce[op]; break; case 0xCF: - op = oprom[pos++]; + op = opcodes.r8(pos++); instr = &mnemonic_cf[op]; break; default: @@ -460,5 +405,5 @@ CPU_DISASSEMBLE(minx) HANDLE_ARGUMENT; } } - return pos | s_flags[instr->mnemonic] | DASMFLAG_SUPPORTED; + return (pos - pc) | s_flags[instr->mnemonic] | SUPPORTED; } diff --git a/src/devices/cpu/minx/minxd.h b/src/devices/cpu/minx/minxd.h new file mode 100644 index 00000000000..bb7a6da4e0d --- /dev/null +++ b/src/devices/cpu/minx/minxd.h @@ -0,0 +1,89 @@ +// license:BSD-3-Clause +// copyright-holders:Wilbert Pol +/************************************************************ + + Nintendo Minx CPU disassembly + + +************************************************************/ + +#ifndef MAME_CPU_MINX_MINXDASM_H +#define MAME_CPU_MINX_MINXDASM_H + +#pragma once + +class minx_disassembler : public util::disasm_interface +{ +public: + minx_disassembler() = default; + virtual ~minx_disassembler() = default; + + virtual u32 opcode_alignment() const override; + virtual offs_t disassemble(std::ostream &stream, offs_t pc, const data_buffer &opcodes, const data_buffer ¶ms) override; + +private: + enum e_mnemonic { + zADD=0, zADDC, zAND, zBCDD, zBCDE, zBCDX, zCALL, zCALLC, zCALLG, zCALLGE, zCALLL, + zCALLLE, zCALLN, zCALLNC, zCALLNO, zCALLNZ, zCALLO, zCALLP, zCALLNX0, + zCALLNX1, zCALLNX2, zCALLNX3, zCALLX0, zCALLX1, zCALLX2, zCALLX3, zCALLZ, + zCMP, zCMPN, zDEC, zDIV, zEXT, zHALT, zINC, zINT, + zJC, zJDBNZ, zJG, zJGE, zJINT, zJL, zJLE, zJMP, + zJN, zJNX0, zJNX1, zJNX2, zJNX3, zJNC, zJNO, zJNZ, + zJO, zJP, zJX0, zJX1, zJX2, zJX3, zJZ, zMOV, + zMUL, zNEG, zNOP, zNOT, zOR, zPOP, zPOPA, zPOPAX, + zPOPX, zPUSH, zPUSHA, zPUSHAX, zPUSHX, zRET, zRETI, zRETSKIP, + zROL, zROLC, zROR, zRORC, zSAL, zSAR, zSHL, zSHR, zSUB, + zSUBC, zTEST, zXCHG, zXOR, zDB + }; + + enum e_operand { + R_A=1, /* A */ + R_B, /* B */ + R_L, /* L */ + R_H, /* H */ + R_N, /* N */ + R_F, /* F */ + R_SP, /* SP */ + R_BA, /* BA */ + R_HL, /* HL */ + R_X, /* X */ + R_Y, /* Y */ + R_U, /* U */ + R_V, /* V */ + R_I, /* I */ + R_XI, /* XI */ + R_YI, /* YI */ + R_PC, /* PC */ + I_8, /* 8 bit immediate */ + I_16, /* 16 bit immediate */ + D_8, /* PC + 8 bit displacement (signed) */ + D_16, /* PC + 16 bit displacement */ + S_8, /* SP + 8 bit displacement (signed) */ + M_IHL, /* [I+HL] */ + M_N8, /* [I+N+ofs8] */ + M_I16, /* [I+ofs16] */ + M_X, /* [X] */ + M_Y, /* [Y] */ + M_X8, /* [X + 8 bit displacement (signed)] */ + M_Y8, /* [Y + 8 bit displacement (signed)] */ + M_XL, /* [X + L (signed)] */ + M_YL, /* [Y + L (signed)] */ + M_16, /* [16bit] */ + M_HL, /* [HL] */ + OP, OP1 + }; + + struct minxdasm { + uint8_t mnemonic; + uint8_t argument1; + uint8_t argument2; + }; + + static const char *const s_mnemonic[]; + static const uint32_t s_flags[]; + static const minxdasm mnemonic[256]; + static const minxdasm mnemonic_ce[256]; + static const minxdasm mnemonic_cf[256]; +}; + +#endif |