diff options
Diffstat (limited to 'src/emu/didisasm.cpp')
-rw-r--r-- | src/emu/didisasm.cpp | 113 |
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 ¶ms) +{ + offs_t result = m_dasm_override(stream, pc, opcodes, params); + if(!result) + result = m_disasm->disassemble(stream, pc, opcodes, params); return result; } + + |