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.cpp113
1 files changed, 62 insertions, 51 deletions
diff --git a/src/emu/didisasm.cpp b/src/emu/didisasm.cpp
index 95353889a65..51a96915a04 100644
--- a/src/emu/didisasm.cpp
+++ b/src/emu/didisasm.cpp
@@ -11,82 +11,93 @@
#include "emu.h"
-//**************************************************************************
-// DEVICE DISASM INTERFACE
-//**************************************************************************
-
-//-------------------------------------------------
-// device_disasm_interface - constructor
-//-------------------------------------------------
-
device_disasm_interface::device_disasm_interface(const machine_config &mconfig, device_t &device)
: device_interface(device, "disasm")
{
}
+util::disasm_interface *device_disasm_interface::get_disassembler()
+{
+ 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);
+ }
+ return m_disasm.get();
+}
-//-------------------------------------------------
-// ~device_disasm_interface - destructor
-//-------------------------------------------------
+void device_disasm_interface::interface_pre_start()
+{
+ m_dasm_override.bind_relative_to(*device().owner());
+}
-device_disasm_interface::~device_disasm_interface()
+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);
+}
-//-------------------------------------------------
-// interface_pre_start - work to be done prior to
-// actually starting a device
-//-------------------------------------------------
+u32 device_disasm_indirect::interface_flags() const
+{
+ return m_disasm->interface_flags();
+}
-void device_disasm_interface::interface_pre_start()
+u32 device_disasm_indirect::page_address_bits() const
{
- // bind delegate
- m_dasm_override.bind_relative_to(*device().owner());
+ return m_disasm->page_address_bits();
}
+u32 device_disasm_indirect::page2_address_bits() const
+{
+ return m_disasm->page2_address_bits();
+}
-//-------------------------------------------------
-// static_set_dasm_override - configuration
-// helper to override disassemble function
-//-------------------------------------------------
+offs_t device_disasm_indirect::pc_linear_to_real(offs_t pc) const
+{
+ return m_disasm->pc_linear_to_real(pc);
+}
-void device_disasm_interface::static_set_dasm_override(device_t &device, dasm_override_delegate dasm_override)
+offs_t device_disasm_indirect::pc_real_to_linear(offs_t pc) const
{
- device_disasm_interface *dasm;
- if (!device.interface(dasm))
- throw emu_fatalerror("MCFG_DEVICE_DISASSEMBLE_OVERRIDE called on device '%s' with no disasm interface", device.tag());
- dasm->m_dasm_override = dasm_override;
+ 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);
+}
-//-------------------------------------------------
-// disassemble - interface for disassembly
-//-------------------------------------------------
+u16 device_disasm_indirect::decrypt16(u16 value, offs_t pc, bool opcode) const
+{
+ return m_disasm->decrypt16(value, pc, opcode);
+}
-offs_t device_disasm_interface::disassemble(std::ostream &stream, offs_t pc, const u8 *oprom, const u8 *opram, u32 options)
+u32 device_disasm_indirect::decrypt32(u32 value, offs_t pc, bool opcode) const
{
- offs_t result = 0;
+ return m_disasm->decrypt32(value, pc, opcode);
+}
- // check for disassembler override
- if (!m_dasm_override.isnull())
- result = m_dasm_override(device(), stream, pc, oprom, opram, options);
- if (result == 0)
- result = disasm_disassemble(stream, pc, oprom, opram, options);
+u64 device_disasm_indirect::decrypt64(u64 value, offs_t pc, bool opcode) const
+{
+ return m_disasm->decrypt64(value, pc, opcode);
+}
- // make sure we get good results
- assert((result & DASMFLAG_LENGTHMASK) != 0);
-#ifdef MAME_DEBUG
- device_memory_interface *memory;
- if (device().interface(memory))
- {
- address_space &space = memory->space(AS_PROGRAM);
- int bytes = space.address_to_byte(result & DASMFLAG_LENGTHMASK);
- assert(bytes >= min_opcode_bytes());
- assert(bytes <= max_opcode_bytes());
- (void) bytes; // appease compiler
- }
-#endif
+u32 device_disasm_indirect::opcode_alignment() const
+{
+ return m_disasm->opcode_alignment();
+}
+offs_t device_disasm_indirect::disassemble(std::ostream &stream, offs_t pc, const data_buffer &opcodes, const data_buffer &params)
+{
+ offs_t result = m_dasm_override(stream, pc, opcodes, params);
+ if(!result)
+ result = m_disasm->disassemble(stream, pc, opcodes, params);
return result;
}
+
+