diff options
Diffstat (limited to 'src/devices/cpu/dsp16/dsp16dis.h')
-rw-r--r-- | src/devices/cpu/dsp16/dsp16dis.h | 63 |
1 files changed, 50 insertions, 13 deletions
diff --git a/src/devices/cpu/dsp16/dsp16dis.h b/src/devices/cpu/dsp16/dsp16dis.h index 09b480733a9..34f31812ba8 100644 --- a/src/devices/cpu/dsp16/dsp16dis.h +++ b/src/devices/cpu/dsp16/dsp16dis.h @@ -1,32 +1,69 @@ // license:BSD-3-Clause -// copyright-holders:Andrew Gardner, Vas Crabb +// copyright-holders:Vas Crabb +/*************************************************************************** + + WE|AT&T DSP16 series disassembler + +***************************************************************************/ #ifndef MAME_CPU_DSP16_DSP16DIS_H #define MAME_CPU_DSP16_DSP16DIS_H #pragma once +#include <iosfwd> +#include <string> + + class dsp16_disassembler : public util::disasm_interface { public: - dsp16_disassembler() = default; + // interface to live CPU + class cpu + { + public: + enum class predicate : u8 { INDETERMINATE, TAKEN, SKIPPED }; + virtual predicate check_con(offs_t pc, u16 op) const = 0; + virtual predicate check_branch(offs_t pc) const = 0; + protected: + virtual ~cpu() = default; + }; + + // construction/destruction + dsp16_disassembler(); + dsp16_disassembler(cpu const &host); virtual ~dsp16_disassembler() = default; + // util::disasm_interface implementation virtual u32 interface_flags() const override; virtual u32 page_address_bits() const override; 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; + virtual offs_t disassemble(std::ostream &stream, offs_t pc, data_buffer const &opcodes, data_buffer const ¶ms) override; private: - std::string disasmF1Field(u8 F1, u8 D, u8 S); - std::string disasmYField(u8 Y); - std::string disasmZField(u8 Z); - std::string disasmF2Field(u8 F2, u8 D, u8 S); - std::string disasmCONField(u8 CON); - std::string disasmBField(u8 B, u32 &dasmflags); - std::string disasmRImmediateField(u8 R); - std::string disasmRField(u8 R); - std::string disasmIField(u8 I); - bool disasmSIField(u8 SI); + struct result { bool nop; bool ambiguous; std::string text; }; + + // sub-instruction helpers + static result dasm_int(u16 op); + static result dasm_con(u16 op); + static result dasm_b(u16 op, u32 &flags); + static result dasm_ja(u16 op, offs_t pc, u32 &flags); + static result dasm_f1(u16 op); + static result dasm_f2(u16 op); + static result dasm_r(u16 op); + static result dasm_x(u16 op); + static result dasm_y(u16 op); + static result dasm_z(u16 op); + + // common maths + static constexpr offs_t inc_pc(offs_t pc, offs_t inc); + + // live state checks + char const *check_branch_predicate(offs_t pc) const; + char const *check_branch_con(offs_t pc, u16 op) const; + char const *check_special_con(offs_t pc, u16 op) const; + + // access to live CPU + cpu const *const m_host; }; #endif // MAME_CPU_DSP16_DSP16DIS_H |