diff options
Diffstat (limited to 'src/emu/didisasm.cpp')
-rw-r--r-- | src/emu/didisasm.cpp | 121 |
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 ¶ms) 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 ¶ms) +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()); + } } - - |