summaryrefslogtreecommitdiffstatshomepage
path: root/src/devices/cpu/dsp16/dsp16dis.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/devices/cpu/dsp16/dsp16dis.h')
-rw-r--r--src/devices/cpu/dsp16/dsp16dis.h63
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 &params) override;
+ virtual offs_t disassemble(std::ostream &stream, offs_t pc, data_buffer const &opcodes, data_buffer const &params) 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