diff options
Diffstat (limited to 'src/devices/cpu/unsp/unspdasm.h')
-rw-r--r-- | src/devices/cpu/unsp/unspdasm.h | 67 |
1 files changed, 58 insertions, 9 deletions
diff --git a/src/devices/cpu/unsp/unspdasm.h b/src/devices/cpu/unsp/unspdasm.h index cd896b03ea7..32d73605b76 100644 --- a/src/devices/cpu/unsp/unspdasm.h +++ b/src/devices/cpu/unsp/unspdasm.h @@ -1,5 +1,5 @@ // license:GPL-2.0 -// copyright-holders:Segher Boessenkool +// copyright-holders:Segher Boessenkool, David Haywood /***************************************************************************** SunPlus ยต'nSP disassembler @@ -15,39 +15,88 @@ #pragma once +#define UNSP_DASM_OK (len | SUPPORTED) + class unsp_disassembler : public util::disasm_interface { public: - unsp_disassembler() = default; + unsp_disassembler() + { + m_iso = 10; + } + virtual ~unsp_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; - offs_t disassemble(std::ostream &stream, offs_t pc, uint16_t op, uint16_t imm16); + offs_t disassemble_code(std::ostream &stream, offs_t pc, uint16_t op, uint16_t imm16, const data_buffer& opcodes); protected: - virtual offs_t disassemble_f_group(std::ostream& stream, offs_t pc, uint16_t op, uint16_t ximm, uint8_t opN, uint8_t opA, uint8_t opB, uint32_t len); + offs_t disassemble_fxxx_group(std::ostream& stream, offs_t pc, uint16_t op, uint16_t ximm, const data_buffer& opcodes); + offs_t disassemble_jumps(std::ostream& stream, offs_t pc, const uint16_t op); + offs_t disassemble_remaining(std::ostream& stream, offs_t pc, uint16_t op, uint16_t ximm, const data_buffer& opcodes); + + offs_t disassemble_fxxx_000_group(std::ostream& stream, offs_t pc, uint16_t op, uint16_t ximm); + offs_t disassemble_fxxx_001_group(std::ostream& stream, offs_t pc, uint16_t op, uint16_t ximm); + offs_t disassemble_fxxx_010_group(std::ostream& stream, offs_t pc, uint16_t op, uint16_t ximm); + offs_t disassemble_fxxx_011_group(std::ostream& stream, offs_t pc, uint16_t op, uint16_t ximm); + offs_t disassemble_fxxx_100_group(std::ostream& stream, offs_t pc, uint16_t op, uint16_t ximm); + virtual offs_t disassemble_fxxx_101_group(std::ostream& stream, offs_t pc, uint16_t op, uint16_t ximm); + offs_t disassemble_fxxx_110_group(std::ostream& stream, offs_t pc, uint16_t op, uint16_t ximm); + offs_t disassemble_fxxx_111_group(std::ostream& stream, offs_t pc, uint16_t op, uint16_t ximm, const data_buffer& opcodes); + + virtual offs_t disassemble_exxx_group(std::ostream& stream, offs_t pc, uint16_t op, uint16_t ximm); + virtual offs_t disassemble_extended_group(std::ostream& stream, offs_t pc, uint16_t op, uint16_t ximm, const data_buffer& opcodes); static char const *const regs[]; + static char const *const extregs[]; static char const *const jumps[]; + static char const *const bitops[]; + static char const *const signmodes[]; + static char const *const lsft[]; + static char const *const aluops[]; + static char const *const forms[]; -private: + int m_iso; + +protected: void print_alu_op_start(std::ostream &stream, uint8_t op0, uint8_t opA); void print_alu_op3(std::ostream &stream, uint8_t op0, uint8_t opB); void print_alu_op_end(std::ostream &stream, uint8_t op0); void print_indirect_op(std::ostream &stream, uint8_t opN, uint8_t opB); + void print_muls(std::ostream& stream, uint16_t op); + void print_mul(std::ostream& stream, uint16_t op); }; -class unsp_newer_disassembler : public unsp_disassembler +class unsp_12_disassembler : public unsp_disassembler { public: - unsp_newer_disassembler() = default; - virtual ~unsp_newer_disassembler() = default; + unsp_12_disassembler() + { + m_iso = 12; + } + + virtual ~unsp_12_disassembler() = default; + +private: + virtual offs_t disassemble_fxxx_101_group(std::ostream& stream, offs_t pc, uint16_t op, uint16_t ximm) override; + virtual offs_t disassemble_exxx_group(std::ostream& stream, offs_t pc, uint16_t op, uint16_t ximm) override; +}; + +class unsp_20_disassembler : public unsp_12_disassembler +{ +public: + unsp_20_disassembler() + { + m_iso = 20; + } + + virtual ~unsp_20_disassembler() = default; private: - virtual offs_t disassemble_f_group(std::ostream& stream, offs_t pc, uint16_t op, uint16_t ximm, uint8_t opN, uint8_t opA, uint8_t opB, uint32_t len) override; + virtual offs_t disassemble_extended_group(std::ostream& stream, offs_t pc, uint16_t op, uint16_t ximm, const data_buffer& opcodes) override; }; |