diff options
Diffstat (limited to 'src/devices/cpu/minx/minxd.cpp')
-rw-r--r-- | src/devices/cpu/minx/minxd.cpp | 127 |
1 files changed, 36 insertions, 91 deletions
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; } |