diff options
Diffstat (limited to 'src/devices/cpu/vax/vaxdasm.cpp')
-rw-r--r-- | src/devices/cpu/vax/vaxdasm.cpp | 65 |
1 files changed, 30 insertions, 35 deletions
diff --git a/src/devices/cpu/vax/vaxdasm.cpp b/src/devices/cpu/vax/vaxdasm.cpp index 9919e171f14..7e15cd1b953 100644 --- a/src/devices/cpu/vax/vaxdasm.cpp +++ b/src/devices/cpu/vax/vaxdasm.cpp @@ -23,37 +23,11 @@ u32 vax_disassembler::opcode_alignment() const return 1; } -enum class vax_disassembler::mode : u8 -{ - none, - rb, srb, urb, cntb, rw, srw, urw, mskw, rl, srl, url, posl, prl, rq, srq, urq, ro, uro, - mb, mw, ml, mq, mo, - wb, ww, wl, wq, wo, - ab, aw, al, aq, ao, - bb, bw, - vb -}; - namespace { using namespace std::literals; using mode = vax_disassembler::mode; -static constexpr bool is_read_mode(mode m) -{ - switch (m) - { - case mode::rb: case mode::srb: case mode::urb: case mode::cntb: - case mode::rw: case mode::srw: case mode::urw: case mode::mskw: - case mode::rl: case mode::srl: case mode::url: case mode::posl: case mode::prl: - case mode::rq: case mode::urq: - case mode::ro: case mode::uro: - return true; - default: - return false; - } -} - static constexpr bool is_address_mode(mode m) { return m == mode::ab || m == mode::aw || m == mode::al || m == mode::aq || m == mode::ao; @@ -380,12 +354,12 @@ static const vax_disassembler::opdef s_nonprefix_ops[0x100 - 3] = { "DIVP"sv, { mode::rw, mode::ab, mode::rw, mode::ab, mode::rw, mode::ab }, 0 }, { "MOVC3"sv, { mode::rw, mode::ab, mode::ab, mode::none, mode::none, mode::none }, 0 }, { "CMPC3"sv, { mode::rw, mode::ab, mode::ab, mode::none, mode::none, mode::none }, 0 }, - { "SCANC"sv, { mode::rw, mode::ab, mode::ab, mode::rb, mode::none, mode::none }, 0 }, - { "SPANC"sv, { mode::rw, mode::ab, mode::ab, mode::rb, mode::none, mode::none }, 0 }, - { "MOVC5"sv, { mode::rw, mode::ab, mode::rb, mode::rw, mode::ab, mode::none }, 0 }, - { "CMPC5"sv, { mode::rw, mode::ab, mode::rb, mode::rw, mode::ab, mode::none }, 0 }, - { "MOVTC"sv, { mode::rw, mode::ab, mode::rb, mode::ab, mode::rw, mode::ab }, 0 }, - { "MOVTUC"sv, { mode::rw, mode::ab, mode::rb, mode::ab, mode::rw, mode::ab }, 0 }, + { "SCANC"sv, { mode::rw, mode::ab, mode::ab, mode::urb, mode::none, mode::none }, 0 }, + { "SPANC"sv, { mode::rw, mode::ab, mode::ab, mode::urb, mode::none, mode::none }, 0 }, + { "MOVC5"sv, { mode::rw, mode::ab, mode::urb, mode::rw, mode::ab, mode::none }, 0 }, + { "CMPC5"sv, { mode::rw, mode::ab, mode::urb, mode::rw, mode::ab, mode::none }, 0 }, + { "MOVTC"sv, { mode::rw, mode::ab, mode::urb, mode::ab, mode::rw, mode::ab }, 0 }, + { "MOVTUC"sv, { mode::rw, mode::ab, mode::urb, mode::ab, mode::rw, mode::ab }, 0 }, { "BSBW"sv, { mode::bw, mode::none, mode::none, mode::none, mode::none, mode::none }, vax_disassembler::STEP_OVER }, { "BRW"sv, { mode::bw, mode::none, mode::none, mode::none, mode::none, mode::none }, 0 }, @@ -397,8 +371,8 @@ static const vax_disassembler::opdef s_nonprefix_ops[0x100 - 3] = { "CMPP4"sv, { mode::rw, mode::ab, mode::rw, mode::ab, mode::none, mode::none }, 0 }, { "EDITPC"sv, { mode::rw, mode::ab, mode::ab, mode::ab, mode::none, mode::none }, 0 }, { "MATCHC"sv, { mode::rw, mode::ab, mode::rw, mode::ab, mode::none, mode::none }, 0 }, - { "LOCC"sv, { mode::rb, mode::rw, mode::ab, mode::none, mode::none, mode::none }, 0 }, - { "SKPC"sv, { mode::rb, mode::rw, mode::ab, mode::none, mode::none, mode::none }, 0 }, + { "LOCC"sv, { mode::urb, mode::rw, mode::ab, mode::none, mode::none, mode::none }, 0 }, + { "SKPC"sv, { mode::urb, mode::rw, mode::ab, mode::none, mode::none, mode::none }, 0 }, { "MOVZWL"sv, { mode::rw, mode::wl, mode::none, mode::none, mode::none, mode::none }, 0 }, { "ACBW"sv, { mode::srw, mode::srw, mode::mw, mode::bw, mode::none, mode::none }, vax_disassembler::STEP_COND }, { "MOVAW"sv, { mode::aw, mode::wl, mode::none, mode::none, mode::none, mode::none }, 0 }, @@ -963,6 +937,7 @@ offs_t vax_disassembler::disassemble_inst(std::ostream &stream, const vax_disass break; case mode::urb: + case mode::ab: // Immediate bytes may be used as MOVCn sources, at least with a length of 0 util::stream_format(stream, "#^X%02X", opcodes.r8(pc++)); break; @@ -1024,7 +999,7 @@ offs_t vax_disassembler::disassemble_inst(std::ostream &stream, const vax_disass break; case mode::ro: case mode::uro: - util::stream_format(stream, "#^X%016X%016X", opcodes.r64(pc), opcodes.r64(pc + 4)); + util::stream_format(stream, "#^X%016X%016X", opcodes.r64(pc + 8), opcodes.r64(pc)); pc += 16; break; @@ -1118,3 +1093,23 @@ offs_t vax_disassembler::disassemble(std::ostream &stream, offs_t pc, const vax_ else return disassemble_inst(stream, s_nonprefix_ops[op], pc, ppc, opcodes); } + +bool vax_disassembler::is_read_mode(vax_disassembler::mode m) +{ + switch (m) + { + case mode::rb: case mode::srb: case mode::urb: case mode::cntb: + case mode::rw: case mode::srw: case mode::urw: case mode::mskw: + case mode::rl: case mode::srl: case mode::url: case mode::posl: case mode::prl: + case mode::rq: case mode::urq: + case mode::ro: case mode::uro: + return true; + default: + return false; + } +} + +const vax_disassembler::mode *vax_disassembler::get_operands(u8 op) +{ + return s_nonprefix_ops[op].operand; +} |