summaryrefslogtreecommitdiffstatshomepage
path: root/src/emu/didisasm.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/emu/didisasm.cpp')
-rw-r--r--src/emu/didisasm.cpp121
1 files changed, 46 insertions, 75 deletions
diff --git a/src/emu/didisasm.cpp b/src/emu/didisasm.cpp
index 51a96915a04..7454e54ec3c 100644
--- a/src/emu/didisasm.cpp
+++ b/src/emu/didisasm.cpp
@@ -9,95 +9,66 @@
***************************************************************************/
#include "emu.h"
+#include "didisasm.h"
-device_disasm_interface::device_disasm_interface(const machine_config &mconfig, device_t &device)
- : device_interface(device, "disasm")
-{
-}
+namespace {
-util::disasm_interface *device_disasm_interface::get_disassembler()
+class device_disasm_indirect : public util::disasm_interface
{
- if(!m_disasm) {
- if(m_dasm_override.isnull())
- m_disasm.reset(create_disassembler());
- else
- m_disasm = std::make_unique<device_disasm_indirect>(create_disassembler(), m_dasm_override);
+public:
+ device_disasm_indirect(std::unique_ptr<util::disasm_interface> &&upper, dasm_override_delegate const &dasm_override)
+ : m_disasm(std::move(upper)), m_dasm_override(dasm_override)
+ {
+ }
+ virtual ~device_disasm_indirect() = default;
+
+ virtual u32 interface_flags() const override { return m_disasm->interface_flags(); }
+ virtual u32 page_address_bits() const override { return m_disasm->page_address_bits(); }
+ virtual u32 page2_address_bits() const override { return m_disasm->page2_address_bits(); }
+ virtual offs_t pc_linear_to_real(offs_t pc) const override { return m_disasm->pc_linear_to_real(pc); }
+ virtual offs_t pc_real_to_linear(offs_t pc) const override { return m_disasm->pc_real_to_linear(pc); }
+ virtual u8 decrypt8 (u8 value, offs_t pc, bool opcode) const override { return m_disasm->decrypt8(value, pc, opcode); }
+ virtual u16 decrypt16(u16 value, offs_t pc, bool opcode) const override { return m_disasm->decrypt16(value, pc, opcode); }
+ virtual u32 decrypt32(u32 value, offs_t pc, bool opcode) const override { return m_disasm->decrypt32(value, pc, opcode); }
+ virtual u64 decrypt64(u64 value, offs_t pc, bool opcode) const override { return m_disasm->decrypt64(value, pc, opcode); }
+
+ virtual u32 opcode_alignment() const override { return m_disasm->opcode_alignment(); }
+ virtual offs_t disassemble(std::ostream &stream, offs_t pc, data_buffer const &opcodes, data_buffer const &params) override
+ {
+ offs_t const result(m_dasm_override(stream, pc, opcodes, params));
+ return result ? result : m_disasm->disassemble(stream, pc, opcodes, params);
}
- return m_disasm.get();
-}
-
-void device_disasm_interface::interface_pre_start()
-{
- m_dasm_override.bind_relative_to(*device().owner());
-}
-
-void device_disasm_interface::set_dasm_override(dasm_override_delegate dasm_override)
-{
- m_dasm_override = dasm_override;
-}
-
-device_disasm_indirect::device_disasm_indirect(util::disasm_interface *upper, dasm_override_delegate &dasm_override) : m_dasm_override(dasm_override)
-{
- m_disasm.reset(upper);
-}
-
-u32 device_disasm_indirect::interface_flags() const
-{
- return m_disasm->interface_flags();
-}
-
-u32 device_disasm_indirect::page_address_bits() const
-{
- return m_disasm->page_address_bits();
-}
-
-u32 device_disasm_indirect::page2_address_bits() const
-{
- return m_disasm->page2_address_bits();
-}
-
-offs_t device_disasm_indirect::pc_linear_to_real(offs_t pc) const
-{
- return m_disasm->pc_linear_to_real(pc);
-}
-
-offs_t device_disasm_indirect::pc_real_to_linear(offs_t pc) const
-{
- return m_disasm->pc_real_to_linear(pc);
-}
-u8 device_disasm_indirect::decrypt8 (u8 value, offs_t pc, bool opcode) const
-{
- return m_disasm->decrypt8(value, pc, opcode);
-}
+private:
+ std::unique_ptr<util::disasm_interface> const m_disasm;
+ dasm_override_delegate const &m_dasm_override;
+};
-u16 device_disasm_indirect::decrypt16(u16 value, offs_t pc, bool opcode) const
-{
- return m_disasm->decrypt16(value, pc, opcode);
-}
+} // anonymous namespace
-u32 device_disasm_indirect::decrypt32(u32 value, offs_t pc, bool opcode) const
-{
- return m_disasm->decrypt32(value, pc, opcode);
-}
-u64 device_disasm_indirect::decrypt64(u64 value, offs_t pc, bool opcode) const
+device_disasm_interface::device_disasm_interface(const machine_config &mconfig, device_t &device)
+ : device_interface(device, "disasm"), m_disasm(), m_dasm_override(), m_started(false)
{
- return m_disasm->decrypt64(value, pc, opcode);
}
-u32 device_disasm_indirect::opcode_alignment() const
+util::disasm_interface &device_disasm_interface::get_disassembler()
{
- return m_disasm->opcode_alignment();
+ if (!m_disasm) {
+ if (m_dasm_override.isnull())
+ m_disasm = create_disassembler();
+ else
+ m_disasm.reset(new device_disasm_indirect(create_disassembler(), m_dasm_override));
+ }
+ return *m_disasm;
}
-offs_t device_disasm_indirect::disassemble(std::ostream &stream, offs_t pc, const data_buffer &opcodes, const data_buffer &params)
+void device_disasm_interface::interface_pre_start()
{
- offs_t result = m_dasm_override(stream, pc, opcodes, params);
- if(!result)
- result = m_disasm->disassemble(stream, pc, opcodes, params);
- return result;
+ if (!m_started)
+ {
+ m_started = true;
+ m_dasm_override.bind_relative_to(*device().owner());
+ }
}
-
-