diff options
Diffstat (limited to 'src/devices/cpu/m6502')
42 files changed, 792 insertions, 291 deletions
diff --git a/src/devices/cpu/m6502/deco16.cpp b/src/devices/cpu/m6502/deco16.cpp index 163403228d9..e5121676253 100644 --- a/src/devices/cpu/m6502/deco16.cpp +++ b/src/devices/cpu/m6502/deco16.cpp @@ -10,6 +10,7 @@ #include "emu.h" #include "deco16.h" +#include "deco16d.h" #define DECO16_VERBOSE 1 @@ -22,12 +23,11 @@ deco16_device::deco16_device(const machine_config &mconfig, const char *tag, dev { } -offs_t deco16_device::disasm_disassemble(std::ostream &stream, offs_t pc, const uint8_t *oprom, const uint8_t *opram, uint32_t options) +util::disasm_interface *deco16_device::create_disassembler() { - return disassemble_generic(stream, pc, oprom, opram, options, disasm_entries); + return new deco16_disassembler; } - void deco16_device::device_start() { if(direct_disabled) diff --git a/src/devices/cpu/m6502/deco16.h b/src/devices/cpu/m6502/deco16.h index c3f55764553..1c980b2e4c6 100644 --- a/src/devices/cpu/m6502/deco16.h +++ b/src/devices/cpu/m6502/deco16.h @@ -12,14 +12,14 @@ #define MAME_CPU_M6502_DECO16_H #include "m6502.h" +#include "deco16d.h" class deco16_device : public m6502_device { public: deco16_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); - static const disasm_entry disasm_entries[0x100]; + virtual util::disasm_interface *create_disassembler() override; - virtual offs_t disasm_disassemble(std::ostream &stream, offs_t pc, const uint8_t *oprom, const uint8_t *opram, uint32_t options) override; virtual void do_exec_full() override; virtual void do_exec_partial() override; diff --git a/src/devices/cpu/m6502/deco16d.cpp b/src/devices/cpu/m6502/deco16d.cpp new file mode 100644 index 00000000000..8f126ef3023 --- /dev/null +++ b/src/devices/cpu/m6502/deco16d.cpp @@ -0,0 +1,17 @@ +// license:BSD-3-Clause +// copyright-holders:Olivier Galibert +/*************************************************************************** + + deco16d.cpp + + 6502, reverse-engineered DECO variant, disassembler + +***************************************************************************/ + +#include "emu.h" +#include "deco16d.h" +#include "cpu/m6502/deco16d.hxx" + +deco16_disassembler::deco16_disassembler() : m6502_base_disassembler(disasm_entries) +{ +} diff --git a/src/devices/cpu/m6502/deco16d.h b/src/devices/cpu/m6502/deco16d.h new file mode 100644 index 00000000000..3658da9ea9a --- /dev/null +++ b/src/devices/cpu/m6502/deco16d.h @@ -0,0 +1,28 @@ +// license:BSD-3-Clause +// copyright-holders:Olivier Galibert +/*************************************************************************** + + deco16d.h + + 6502, reverse-engineered DECO variant, disassembler + +***************************************************************************/ + +#ifndef MAME_CPU_M6502_DECO16D_H +#define MAME_CPU_M6502_DECO16D_H + +#pragma once + +#include "m6502d.h" + +class deco16_disassembler : public m6502_base_disassembler +{ +public: + deco16_disassembler(); + virtual ~deco16_disassembler() = default; + +private: + static const disasm_entry disasm_entries[0x100]; +}; + +#endif diff --git a/src/devices/cpu/m6502/m4510.cpp b/src/devices/cpu/m6502/m4510.cpp index 852d3e5807a..5848f66970d 100644 --- a/src/devices/cpu/m6502/m4510.cpp +++ b/src/devices/cpu/m6502/m4510.cpp @@ -10,6 +10,7 @@ #include "emu.h" #include "m4510.h" +#include "m4510d.h" DEFINE_DEVICE_TYPE(M4510, m4510_device, "m4510", "M4510") @@ -26,9 +27,9 @@ m4510_device::m4510_device(const machine_config &mconfig, const char *tag, devic sprogram_config.m_page_shift = 13; } -offs_t m4510_device::disasm_disassemble(std::ostream &stream, offs_t pc, const uint8_t *oprom, const uint8_t *opram, uint32_t options) +util::disasm_interface *m4510_device::create_disassembler() { - return disassemble_generic(stream, pc, oprom, opram, options, disasm_entries); + return new m4510_disassembler; } void m4510_device::device_start() diff --git a/src/devices/cpu/m6502/m4510.h b/src/devices/cpu/m6502/m4510.h index b093c8aeb56..a41a0620c93 100644 --- a/src/devices/cpu/m6502/m4510.h +++ b/src/devices/cpu/m6502/m4510.h @@ -19,9 +19,8 @@ class m4510_device : public m65ce02_device { public: m4510_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); - static const disasm_entry disasm_entries[0x100]; + virtual util::disasm_interface *create_disassembler() override; - virtual offs_t disasm_disassemble(std::ostream &stream, offs_t pc, const uint8_t *oprom, const uint8_t *opram, uint32_t options) override; virtual void do_exec_full() override; virtual void do_exec_partial() override; diff --git a/src/devices/cpu/m6502/m4510d.cpp b/src/devices/cpu/m6502/m4510d.cpp new file mode 100644 index 00000000000..896a3f78124 --- /dev/null +++ b/src/devices/cpu/m6502/m4510d.cpp @@ -0,0 +1,17 @@ +// license:BSD-3-Clause +// copyright-holders:Olivier Galibert +/*************************************************************************** + + m4510d.cpp + + 65ce02 with a mmu and a port, disassembler + +***************************************************************************/ + +#include "emu.h" +#include "m4510d.h" +#include "cpu/m6502/m4510d.hxx" + +m4510_disassembler::m4510_disassembler() : m6502_base_disassembler(disasm_entries) +{ +} diff --git a/src/devices/cpu/m6502/m4510d.h b/src/devices/cpu/m6502/m4510d.h new file mode 100644 index 00000000000..1c025cfb8e7 --- /dev/null +++ b/src/devices/cpu/m6502/m4510d.h @@ -0,0 +1,28 @@ +// license:BSD-3-Clause +// copyright-holders:Olivier Galibert +/*************************************************************************** + + m4510d.h + + 65ce02 with a mmu and a port, disassembler + +***************************************************************************/ + +#ifndef MAME_CPU_M6502_M4510D_H +#define MAME_CPU_M6502_M4510D_H + +#pragma once + +#include "m6502d.h" + +class m4510_disassembler : public m6502_base_disassembler +{ +public: + m4510_disassembler(); + virtual ~m4510_disassembler() = default; + +private: + static const disasm_entry disasm_entries[0x100]; +}; + +#endif diff --git a/src/devices/cpu/m6502/m6502.cpp b/src/devices/cpu/m6502/m6502.cpp index f498ca87771..2cbded54949 100644 --- a/src/devices/cpu/m6502/m6502.cpp +++ b/src/devices/cpu/m6502/m6502.cpp @@ -11,6 +11,7 @@ #include "emu.h" #include "debugger.h" #include "m6502.h" +#include "m6502d.h" DEFINE_DEVICE_TYPE(M6502, m6502_device, "m6502", "M6502") @@ -44,8 +45,8 @@ void m6502_device::init() mintf->program = &space(AS_PROGRAM); mintf->sprogram = has_space(AS_OPCODES) ? &space(AS_OPCODES) : mintf->program; - mintf->direct = &mintf->program->direct(); - mintf->sdirect = &mintf->sprogram->direct(); + mintf->direct = mintf->program->direct<0>(); + mintf->sdirect = mintf->sprogram->direct<0>(); sync_w.resolve_safe(); @@ -453,179 +454,6 @@ void m6502_device::state_string_export(const device_state_entry &entry, std::str } } - -uint32_t m6502_device::disasm_min_opcode_bytes() const -{ - return 1; -} - -uint32_t m6502_device::disasm_max_opcode_bytes() const -{ - return 4; -} - -offs_t m6502_device::disassemble_generic(std::ostream &stream, offs_t pc, const uint8_t *oprom, const uint8_t *opram, uint32_t options, const disasm_entry *table) -{ - const disasm_entry &e = table[oprom[0] | inst_state_base]; - uint32_t flags = e.flags | DASMFLAG_SUPPORTED; - util::stream_format(stream, "%s", e.opcode); - - switch(e.mode) { - case DASM_non: - flags |= 1; - break; - - case DASM_aba: - util::stream_format(stream, " $%02x%02x", opram[2], opram[1]); - flags |= 3; - break; - - case DASM_abx: - util::stream_format(stream, " $%02x%02x, x", opram[2], opram[1]); - flags |= 3; - break; - - case DASM_aby: - util::stream_format(stream, " $%02x%02x, y", opram[2], opram[1]); - flags |= 3; - break; - - case DASM_acc: - util::stream_format(stream, " a"); - flags |= 1; - break; - - case DASM_adr: - util::stream_format(stream, " $%02x%02x", opram[2], opram[1]); - flags |= 3; - break; - - case DASM_bzp: - util::stream_format(stream, "%d $%02x", (oprom[0] >> 4) & 7, opram[1]); - flags |= 2; - break; - - case DASM_iax: - util::stream_format(stream, " ($%02x%02x, x)", opram[2], opram[1]); - flags |= 3; - break; - - case DASM_idx: - util::stream_format(stream, " ($%02x, x)", opram[1]); - flags |= 2; - break; - - case DASM_idy: - util::stream_format(stream, " ($%02x), y", opram[1]); - flags |= 2; - break; - - case DASM_idz: - util::stream_format(stream, " ($%02x), z", opram[1]); - flags |= 2; - break; - - case DASM_imm: - util::stream_format(stream, " #$%02x", opram[1]); - flags |= 2; - break; - - case DASM_imp: - flags |= 1; - break; - - case DASM_ind: - util::stream_format(stream, " ($%02x%02x)", opram[2], opram[1]); - flags |= 3; - break; - - case DASM_isy: - util::stream_format(stream, " ($%02x, s), y", opram[1]); - flags |= 2; - break; - - case DASM_iw2: - util::stream_format(stream, " #$%02x%02x", opram[2], opram[1]); - flags |= 3; - break; - - case DASM_iw3: - util::stream_format(stream, " #$%02x%02x%02x", opram[3], opram[2], opram[1]); - flags |= 4; - break; - - case DASM_rel: - util::stream_format(stream, " $%04x", (pc & 0xf0000) | uint16_t(pc + 2 + int8_t(opram[1]))); - flags |= 2; - break; - - case DASM_rw2: - util::stream_format(stream, " $%04x", (pc & 0xf0000) | uint16_t(pc + 2 + int16_t((opram[2] << 8) | opram[1]))); - flags |= 3; - break; - - case DASM_zpb: - util::stream_format(stream, "%d $%02x, $%04x", (oprom[0] >> 4) & 7, opram[1], (pc & 0xf0000) | uint16_t(pc + 3 + int8_t(opram[2]))); - flags |= 3; - break; - - case DASM_zpg: - util::stream_format(stream, " $%02x", opram[1]); - flags |= 2; - break; - - case DASM_zpi: - util::stream_format(stream, " ($%02x)", opram[1]); - flags |= 2; - break; - - case DASM_zpx: - util::stream_format(stream, " $%02x, x", opram[1]); - flags |= 2; - break; - - case DASM_zpy: - util::stream_format(stream, " $%02x, y", opram[1]); - flags |= 2; - break; - - case DASM_imz: - util::stream_format(stream, " #$%02x, $%02x", opram[1], opram[2]); - flags |= 3; - break; - - case DASM_spg: - util::stream_format(stream, " \\$%02x", opram[1]); - flags |= 2; - break; - - case DASM_biz: - util::stream_format(stream, " %d, $%02x", (opram[0] >> 5) & 7, opram[1]); - flags |= 2; - break; - - case DASM_bzr: - util::stream_format(stream, " %d, $%02x, $%04x", (opram[0] >> 5) & 7, opram[1], (pc & 0xf0000) | uint16_t(pc + 3 + int8_t(opram[2]))); - flags |= 3; - break; - - case DASM_bar: - util::stream_format(stream, " %d, a, $%04x", (opram[0] >> 5) & 7, (pc & 0xf0000) | uint16_t(pc + 3 + int8_t(opram[1]))); - flags |= 2; - break; - - case DASM_bac: - util::stream_format(stream, " %d, a", (opram[0] >> 5) & 7); - flags |= 1; - break; - - default: - fprintf(stderr, "Unhandled dasm mode %d\n", e.mode); - abort(); - } - return flags; -} - void m6502_device::prefetch() { sync = true; @@ -662,12 +490,11 @@ void m6502_device::set_nz(uint8_t v) P |= F_Z; } -offs_t m6502_device::disasm_disassemble(std::ostream &stream, offs_t pc, const uint8_t *oprom, const uint8_t *opram, uint32_t options) +util::disasm_interface *m6502_device::create_disassembler() { - return disassemble_generic(stream, pc, oprom, opram, options, disasm_entries); + return new m6502_disassembler; } - uint8_t m6502_device::memory_interface::read_9(uint16_t adr) { return read(adr); diff --git a/src/devices/cpu/m6502/m6502.h b/src/devices/cpu/m6502/m6502.h index 71bc63a534e..8f5236818f9 100644 --- a/src/devices/cpu/m6502/m6502.h +++ b/src/devices/cpu/m6502/m6502.h @@ -41,7 +41,7 @@ protected: class memory_interface { public: address_space *program, *sprogram; - direct_read_data *direct, *sdirect; + direct_read_data<0> *direct, *sdirect; virtual ~memory_interface() {} virtual uint8_t read(uint16_t adr) = 0; @@ -68,50 +68,11 @@ protected: virtual uint8_t read_arg(uint16_t adr) override; }; - struct disasm_entry { - const char *opcode; - int mode; - offs_t flags; - }; - enum { STATE_RESET = 0xff00 }; enum { - DASM_non, /* no additional arguments */ - DASM_aba, /* absolute */ - DASM_abx, /* absolute + X */ - DASM_aby, /* absolute + Y */ - DASM_acc, /* accumulator */ - DASM_adr, /* absolute address (jmp,jsr) */ - DASM_bzp, /* zero page with bit selection */ - DASM_iax, /* indirect + X (65c02 jmp) */ - DASM_idx, /* zero page pre indexed */ - DASM_idy, /* zero page post indexed */ - DASM_idz, /* zero page post indexed (65ce02) */ - DASM_imm, /* immediate */ - DASM_imp, /* implicit */ - DASM_ind, /* indirect (jmp) */ - DASM_isy, /* zero page pre indexed sp and post indexed Y (65ce02) */ - DASM_iw2, /* immediate word (65ce02) */ - DASM_iw3, /* augment (65ce02) */ - DASM_rel, /* relative */ - DASM_rw2, /* relative word (65cs02, 65ce02) */ - DASM_zpb, /* zero page and branch (65c02 bbr, bbs) */ - DASM_zpg, /* zero page */ - DASM_zpi, /* zero page indirect (65c02) */ - DASM_zpx, /* zero page + X */ - DASM_zpy, /* zero page + Y */ - DASM_imz, /* load immediate byte, store to zero page address (M740) */ - DASM_spg, /* "special page": implied FF00 OR immediate value (M740)*/ - DASM_biz, /* bit, zero page (M740) */ - DASM_bzr, /* bit, zero page, relative offset (M740) */ - DASM_bar, /* bit, accumulator, relative offset (M740) */ - DASM_bac /* bit, accumulator (M740) */ - }; - - enum { F_N = 0x80, F_V = 0x40, F_E = 0x20, // 65ce02 @@ -145,9 +106,7 @@ protected: virtual void state_string_export(const device_state_entry &entry, std::string &str) const override; // device_disasm_interface overrides - virtual uint32_t disasm_min_opcode_bytes() const override; - virtual uint32_t disasm_max_opcode_bytes() const override; - virtual offs_t disasm_disassemble(std::ostream &stream, offs_t pc, const uint8_t *oprom, const uint8_t *opram, uint32_t options) override; + virtual util::disasm_interface *create_disassembler() override; address_space_config program_config, sprogram_config; @@ -170,9 +129,6 @@ protected: bool nmi_state, irq_state, apu_irq_state, v_state; bool irq_taken, sync, direct_disabled, inhibit_interrupts; - static const disasm_entry disasm_entries[0x100]; - - offs_t disassemble_generic(std::ostream &stream, offs_t pc, const uint8_t *oprom, const uint8_t *opram, uint32_t options, const disasm_entry *table); uint8_t read(uint16_t adr) { return mintf->read(adr); } uint8_t read_9(uint16_t adr) { return mintf->read_9(adr); } void write(uint16_t adr, uint8_t val) { mintf->write(adr, val); } diff --git a/src/devices/cpu/m6502/m6502d.cpp b/src/devices/cpu/m6502/m6502d.cpp new file mode 100644 index 00000000000..89763113cde --- /dev/null +++ b/src/devices/cpu/m6502/m6502d.cpp @@ -0,0 +1,193 @@ +// license:BSD-3-Clause +// copyright-holders:Olivier Galibert +/*************************************************************************** + + m6502d.cpp + + Mostek 6502, original NMOS variant, disassembler + +***************************************************************************/ + +#include "emu.h" +#include "m6502d.h" +#include "cpu/m6502/m6502d.hxx" + +m6502_base_disassembler::m6502_base_disassembler(const disasm_entry *_table) : table(_table) +{ +} + +u32 m6502_base_disassembler::get_instruction_bank() const +{ + return 0; +} + +u32 m6502_base_disassembler::opcode_alignment() const +{ + return 1; +} + +offs_t m6502_base_disassembler::disassemble(std::ostream &stream, offs_t pc, const data_buffer &opcodes, const data_buffer ¶ms) +{ + const disasm_entry &e = table[opcodes.r8(pc) | get_instruction_bank()]; + uint32_t flags = e.flags | SUPPORTED; + util::stream_format(stream, "%s", e.opcode); + + switch(e.mode) { + case DASM_non: + flags |= 1; + break; + + case DASM_aba: + util::stream_format(stream, " $%02x%02x", params.r8(pc+2), params.r8(pc+1)); + flags |= 3; + break; + + case DASM_abx: + util::stream_format(stream, " $%02x%02x, x", params.r8(pc+2), params.r8(pc+1)); + flags |= 3; + break; + + case DASM_aby: + util::stream_format(stream, " $%02x%02x, y", params.r8(pc+2), params.r8(pc+1)); + flags |= 3; + break; + + case DASM_acc: + util::stream_format(stream, " a"); + flags |= 1; + break; + + case DASM_adr: + util::stream_format(stream, " $%02x%02x", params.r8(pc+2), params.r8(pc+1)); + flags |= 3; + break; + + case DASM_bzp: + util::stream_format(stream, "%d $%02x", (opcodes.r8(pc) >> 4) & 7, params.r8(pc+1)); + flags |= 2; + break; + + case DASM_iax: + util::stream_format(stream, " ($%02x%02x, x)", params.r8(pc+2), params.r8(pc+1)); + flags |= 3; + break; + + case DASM_idx: + util::stream_format(stream, " ($%02x, x)", params.r8(pc+1)); + flags |= 2; + break; + + case DASM_idy: + util::stream_format(stream, " ($%02x), y", params.r8(pc+1)); + flags |= 2; + break; + + case DASM_idz: + util::stream_format(stream, " ($%02x), z", params.r8(pc+1)); + flags |= 2; + break; + + case DASM_imm: + util::stream_format(stream, " #$%02x", params.r8(pc+1)); + flags |= 2; + break; + + case DASM_imp: + flags |= 1; + break; + + case DASM_ind: + util::stream_format(stream, " ($%02x%02x)", params.r8(pc+2), params.r8(pc+1)); + flags |= 3; + break; + + case DASM_isy: + util::stream_format(stream, " ($%02x, s), y", params.r8(pc+1)); + flags |= 2; + break; + + case DASM_iw2: + util::stream_format(stream, " #$%02x%02x", params.r8(pc+2), params.r8(pc+1)); + flags |= 3; + break; + + case DASM_iw3: + util::stream_format(stream, " #$%02x%02x%02x", params.r8(pc+3), params.r8(pc+2), params.r8(pc+1)); + flags |= 4; + break; + + case DASM_rel: + util::stream_format(stream, " $%04x", (pc & 0xf0000) | uint16_t(pc + 2 + int8_t(params.r8(pc+1)))); + flags |= 2; + break; + + case DASM_rw2: + util::stream_format(stream, " $%04x", (pc & 0xf0000) | uint16_t(pc + 2 + int16_t((params.r8(pc+2) << 8) | params.r8(pc+1)))); + flags |= 3; + break; + + case DASM_zpb: + util::stream_format(stream, "%d $%02x, $%04x", (opcodes.r8(pc) >> 4) & 7, params.r8(pc+1), (pc & 0xf0000) | uint16_t(pc + 3 + int8_t(params.r8(pc+2)))); + flags |= 3; + break; + + case DASM_zpg: + util::stream_format(stream, " $%02x", params.r8(pc+1)); + flags |= 2; + break; + + case DASM_zpi: + util::stream_format(stream, " ($%02x)", params.r8(pc+1)); + flags |= 2; + break; + + case DASM_zpx: + util::stream_format(stream, " $%02x, x", params.r8(pc+1)); + flags |= 2; + break; + + case DASM_zpy: + util::stream_format(stream, " $%02x, y", params.r8(pc+1)); + flags |= 2; + break; + + case DASM_imz: + util::stream_format(stream, " #$%02x, $%02x", params.r8(pc+1), params.r8(pc+2)); + flags |= 3; + break; + + case DASM_spg: + util::stream_format(stream, " \\$%02x", params.r8(pc+1)); + flags |= 2; + break; + + case DASM_biz: + util::stream_format(stream, " %d, $%02x", (opcodes.r8(pc) >> 5) & 7, params.r8(pc+1)); + flags |= 2; + break; + + case DASM_bzr: + util::stream_format(stream, " %d, $%02x, $%04x", (opcodes.r8(pc) >> 5) & 7, params.r8(pc+1), (pc & 0xf0000) | uint16_t(pc + 3 + int8_t(params.r8(pc+2)))); + flags |= 3; + break; + + case DASM_bar: + util::stream_format(stream, " %d, a, $%04x", (opcodes.r8(pc) >> 5) & 7, (pc & 0xf0000) | uint16_t(pc + 3 + int8_t(params.r8(pc+1)))); + flags |= 2; + break; + + case DASM_bac: + util::stream_format(stream, " %d, a", (opcodes.r8(pc) >> 5) & 7); + flags |= 1; + break; + + default: + fprintf(stderr, "Unhandled dasm mode %d\n", e.mode); + abort(); + } + return flags; +} + +m6502_disassembler::m6502_disassembler() : m6502_base_disassembler(disasm_entries) +{ +} diff --git a/src/devices/cpu/m6502/m6502d.h b/src/devices/cpu/m6502/m6502d.h new file mode 100644 index 00000000000..7b23417f753 --- /dev/null +++ b/src/devices/cpu/m6502/m6502d.h @@ -0,0 +1,81 @@ +// license:BSD-3-Clause +// copyright-holders:Olivier Galibert +/*************************************************************************** + + m6502d.h + + Mostek 6502, original NMOS variant, disassembler + +***************************************************************************/ + +#ifndef MAME_CPU_M6502_M6502D_H +#define MAME_CPU_M6502_M6502D_H + +#pragma once + +class m6502_base_disassembler : public util::disasm_interface +{ +public: + struct disasm_entry { + const char *opcode; + int mode; + offs_t flags; + }; + + m6502_base_disassembler(const disasm_entry *table); + virtual ~m6502_base_disassembler() = default; + + virtual u32 opcode_alignment() const override; + virtual offs_t disassemble(std::ostream &stream, offs_t pc, const data_buffer &opcodes, const data_buffer ¶ms) override; + +protected: + enum { + DASM_non, /* no additional arguments */ + DASM_aba, /* absolute */ + DASM_abx, /* absolute + X */ + DASM_aby, /* absolute + Y */ + DASM_acc, /* accumulator */ + DASM_adr, /* absolute address (jmp,jsr) */ + DASM_bzp, /* zero page with bit selection */ + DASM_iax, /* indirect + X (65c02 jmp) */ + DASM_idx, /* zero page pre indexed */ + DASM_idy, /* zero page post indexed */ + DASM_idz, /* zero page post indexed (65ce02) */ + DASM_imm, /* immediate */ + DASM_imp, /* implicit */ + DASM_ind, /* indirect (jmp) */ + DASM_isy, /* zero page pre indexed sp and post indexed Y (65ce02) */ + DASM_iw2, /* immediate word (65ce02) */ + DASM_iw3, /* augment (65ce02) */ + DASM_rel, /* relative */ + DASM_rw2, /* relative word (65cs02, 65ce02) */ + DASM_zpb, /* zero page and branch (65c02 bbr, bbs) */ + DASM_zpg, /* zero page */ + DASM_zpi, /* zero page indirect (65c02) */ + DASM_zpx, /* zero page + X */ + DASM_zpy, /* zero page + Y */ + DASM_imz, /* load immediate byte, store to zero page address (M740) */ + DASM_spg, /* "special page": implied FF00 OR immediate value (M740)*/ + DASM_biz, /* bit, zero page (M740) */ + DASM_bzr, /* bit, zero page, relative offset (M740) */ + DASM_bar, /* bit, accumulator, relative offset (M740) */ + DASM_bac /* bit, accumulator (M740) */ + }; + + virtual u32 get_instruction_bank() const; + +private: + const disasm_entry *table; +}; + +class m6502_disassembler : public m6502_base_disassembler +{ +public: + m6502_disassembler(); + virtual ~m6502_disassembler() = default; + +private: + static const disasm_entry disasm_entries[0x100]; +}; + +#endif diff --git a/src/devices/cpu/m6502/m6502make.py b/src/devices/cpu/m6502/m6502make.py index 8bcd85f8e21..b874b7c5ba9 100755 --- a/src/devices/cpu/m6502/m6502make.py +++ b/src/devices/cpu/m6502/m6502make.py @@ -6,7 +6,7 @@ from __future__ import print_function USAGE = """ Usage: -%s device_name {opc.lst|-} disp.lst device.inc +%s prefix {opc.lst|-} disp.lst device.inc deviced.inc """ import sys import logging @@ -59,7 +59,7 @@ def emit(f, text): print(text, file=f) FULL_PROLOG="""\ -void %(device)s::%(opcode)s_full() +void %(device)s_device::%(opcode)s_full() { """ @@ -82,7 +82,7 @@ FULL_NONE="""\ """ PARTIAL_PROLOG="""\ -void %(device)s::%(opcode)s_partial() +void %(device)s_device::%(opcode)s_partial() { switch(inst_substate) { case 0: @@ -158,7 +158,7 @@ def save_opcodes(f, device, opcodes): DO_EXEC_FULL_PROLOG="""\ -void %(device)s::do_exec_full() +void %(device)s_device::do_exec_full() { \tswitch(inst_state) { """ @@ -169,7 +169,7 @@ DO_EXEC_FULL_EPILOG="""\ """ DO_EXEC_PARTIAL_PROLOG="""\ -void %(device)s::do_exec_partial() +void %(device)s_device::do_exec_partial() { \tswitch(inst_state) { """ @@ -180,7 +180,7 @@ DO_EXEC_PARTIAL_EPILOG="""\ """ DISASM_PROLOG="""\ -const %(device)s::disasm_entry %(device)s::disasm_entries[0x%(disasm_count)x] = { +const %(device)s_disassembler::disasm_entry %(device)s_disassembler::disasm_entries[0x%(disasm_count)x] = { """ DISASM_EPILOG="""\ @@ -194,25 +194,31 @@ def save_tables(f, device, states): "disasm_count": total_states-1 } - emit(f, DO_EXEC_FULL_PROLOG % d) for n, state in enumerate(states): if state == ".": continue if n < total_states - 1: - emit(f, "\tcase 0x%02x: %s_full(); break;\n" % (n, state)) + emit(f, "\tcase 0x%02x: %s_full(); break;" % (n, state)) else: - emit(f, "\tcase %s: %s_full(); break;\n" % ("STATE_RESET", state)) + emit(f, "\tcase %s: %s_full(); break;" % ("STATE_RESET", state)) emit(f, DO_EXEC_FULL_EPILOG % d) emit(f, DO_EXEC_PARTIAL_PROLOG % d) for n, state in enumerate(states): if state == ".": continue if n < total_states - 1: - emit(f, "\tcase 0x%02x: %s_partial(); break;\n" % (n, state)) + emit(f, "\tcase 0x%02x: %s_partial(); break;" % (n, state)) else: - emit(f, "\tcase %s: %s_partial(); break;\n" % ("STATE_RESET", state)) + emit(f, "\tcase %s: %s_partial(); break;" % ("STATE_RESET", state)) emit(f, DO_EXEC_PARTIAL_EPILOG % d) +def save_dasm(f, device, states): + total_states = len(states) + + d = { "device": device, + "disasm_count": total_states-1 + } + emit(f, DISASM_PROLOG % d ) for n, state in enumerate(states): if state == ".": continue @@ -222,13 +228,13 @@ def save_tables(f, device, states): mode = tokens[-1] extra = "0" if opc in ["jsr", "bsr"]: - extra = "DASMFLAG_STEP_OVER" + extra = "STEP_OVER" elif opc in ["rts", "rti", "rtn"]: - extra = "DASMFLAG_STEP_OUT" - emit(f, '\t{ "%s", DASM_%s, %s },\n' % (opc, mode, extra)) + extra = "STEP_OUT" + emit(f, '\t{ "%s", DASM_%s, %s },' % (opc, mode, extra)) emit(f, DISASM_EPILOG % d) -def save(fname, device, opcodes, states): +def saves(fname, device, opcodes, states): logging.info("saving: %s", fname) try: f = open(fname, "w") @@ -236,12 +242,24 @@ def save(fname, device, opcodes, states): err = sys.exc_info()[1] logging.error("cannot write file %s [%s]", fname, err) sys.exit(1) - save_opcodes(f,device, opcodes) + save_opcodes(f, device, opcodes) emit(f, "\n") save_tables(f, device, states) f.close() +def saved(fname, device, opcodes, states): + logging.info("saving: %s", fname) + try: + f = open(fname, "w") + except Exception: + err = sys.exc_info()[1] + logging.error("cannot write file %s [%s]", fname, err) + sys.exit(1) + save_dasm(f, device, states) + f.close() + + def main(argv): debug = False logformat=("%(levelname)s:" @@ -255,25 +273,29 @@ def main(argv): logging.basicConfig(level=logging.WARNING, format=logformat) - if len(argv) != 5: + if len(argv) != 6: print(USAGE % argv[0]) return 1 - device_name = argv[1] + mode = argv[1] + device_name = argv[2] opcodes = [] - if argv[2] != "-": - opcodes = load_opcodes(argv[2]) + if argv[3] != "-": + opcodes = load_opcodes(argv[3]) logging.info("found %d opcodes", len(opcodes)) else: logging.info("skipping opcode reading") - states = load_disp(argv[3]) + states = load_disp(argv[4]) logging.info("loaded %s states", len(states)) assert (len(states) & 0xff) == 1 - save(argv[4], device_name, opcodes, states) + if mode == 's': + saves(argv[5], device_name, opcodes, states) + else: + saved(argv[5], device_name, opcodes, states) # ====================================================================== diff --git a/src/devices/cpu/m6502/m6509.cpp b/src/devices/cpu/m6502/m6509.cpp index 729b919fb50..e1af60eac4b 100644 --- a/src/devices/cpu/m6502/m6509.cpp +++ b/src/devices/cpu/m6502/m6509.cpp @@ -10,6 +10,7 @@ #include "emu.h" #include "m6509.h" +#include "m6509d.h" DEFINE_DEVICE_TYPE(M6509, m6509_device, "m6509", "M6509") @@ -54,12 +55,11 @@ void m6509_device::state_export(const device_state_entry &entry) } } -offs_t m6509_device::disasm_disassemble(std::ostream &stream, offs_t pc, const uint8_t *oprom, const uint8_t *opram, uint32_t options) +util::disasm_interface *m6509_device::create_disassembler() { - return disassemble_generic(stream, pc, oprom, opram, options, disasm_entries); + return new m6509_disassembler; } - m6509_device::mi_6509_normal::mi_6509_normal(m6509_device *_base) { base = _base; diff --git a/src/devices/cpu/m6502/m6509.h b/src/devices/cpu/m6502/m6509.h index 0057f900c83..c8fa2ba937e 100644 --- a/src/devices/cpu/m6502/m6509.h +++ b/src/devices/cpu/m6502/m6509.h @@ -17,9 +17,7 @@ class m6509_device : public m6502_device { public: m6509_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); - static const disasm_entry disasm_entries[0x100]; - - virtual offs_t disasm_disassemble(std::ostream &stream, offs_t pc, const uint8_t *oprom, const uint8_t *opram, uint32_t options) override; + virtual util::disasm_interface *create_disassembler() override; virtual void do_exec_full() override; virtual void do_exec_partial() override; diff --git a/src/devices/cpu/m6502/m6509d.cpp b/src/devices/cpu/m6502/m6509d.cpp new file mode 100644 index 00000000000..e7a27d9e1ce --- /dev/null +++ b/src/devices/cpu/m6502/m6509d.cpp @@ -0,0 +1,17 @@ +// license:BSD-3-Clause +// copyright-holders:Olivier Galibert +/*************************************************************************** + + m6509d.cpp + + 6502 with banking and extended address bus, disassembler + +***************************************************************************/ + +#include "emu.h" +#include "m6509d.h" +#include "cpu/m6502/m6509d.hxx" + +m6509_disassembler::m6509_disassembler() : m6502_base_disassembler(disasm_entries) +{ +} diff --git a/src/devices/cpu/m6502/m6509d.h b/src/devices/cpu/m6502/m6509d.h new file mode 100644 index 00000000000..196b2d66de2 --- /dev/null +++ b/src/devices/cpu/m6502/m6509d.h @@ -0,0 +1,28 @@ +// license:BSD-3-Clause +// copyright-holders:Olivier Galibert +/*************************************************************************** + + m6509d.h + + 6502 with banking and extended address bus, disassembler + +***************************************************************************/ + +#ifndef MAME_CPU_M6502_M6509D_H +#define MAME_CPU_M6502_M6509D_H + +#pragma once + +#include "m6502d.h" + +class m6509_disassembler : public m6502_base_disassembler +{ +public: + m6509_disassembler(); + virtual ~m6509_disassembler() = default; + +private: + static const disasm_entry disasm_entries[0x100]; +}; + +#endif diff --git a/src/devices/cpu/m6502/m6510.cpp b/src/devices/cpu/m6502/m6510.cpp index e4b4585eaaa..a8fb427210b 100644 --- a/src/devices/cpu/m6502/m6510.cpp +++ b/src/devices/cpu/m6502/m6510.cpp @@ -10,6 +10,7 @@ #include "emu.h" #include "m6510.h" +#include "m6510d.h" DEFINE_DEVICE_TYPE(M6510, m6510_device, "m6510", "M6510") @@ -33,9 +34,9 @@ void m6510_device::set_pulls(uint8_t _pullup, uint8_t _floating) floating = _floating; } -offs_t m6510_device::disasm_disassemble(std::ostream &stream, offs_t pc, const uint8_t *oprom, const uint8_t *opram, uint32_t options) +util::disasm_interface *m6510_device::create_disassembler() { - return disassemble_generic(stream, pc, oprom, opram, options, disasm_entries); + return new m6510_disassembler; } void m6510_device::device_start() diff --git a/src/devices/cpu/m6502/m6510.h b/src/devices/cpu/m6502/m6510.h index d3819f4899f..84f2cea32c7 100644 --- a/src/devices/cpu/m6502/m6510.h +++ b/src/devices/cpu/m6502/m6510.h @@ -32,9 +32,7 @@ public: write_port.set_callback(wr); } - static const disasm_entry disasm_entries[0x100]; - - virtual offs_t disasm_disassemble(std::ostream &stream, offs_t pc, const uint8_t *oprom, const uint8_t *opram, uint32_t options) override; + virtual util::disasm_interface *create_disassembler() override; virtual void do_exec_full() override; virtual void do_exec_partial() override; diff --git a/src/devices/cpu/m6502/m6510d.cpp b/src/devices/cpu/m6502/m6510d.cpp new file mode 100644 index 00000000000..78be285262a --- /dev/null +++ b/src/devices/cpu/m6502/m6510d.cpp @@ -0,0 +1,17 @@ +// license:BSD-3-Clause +// copyright-holders:Olivier Galibert +/*************************************************************************** + + m6510d.cpp + + 6502 with 6 i/o pins, also known as 8500, disassembler + +***************************************************************************/ + +#include "emu.h" +#include "m6510d.h" +#include "cpu/m6502/m6510d.hxx" + +m6510_disassembler::m6510_disassembler() : m6502_base_disassembler(disasm_entries) +{ +} diff --git a/src/devices/cpu/m6502/m6510d.h b/src/devices/cpu/m6502/m6510d.h new file mode 100644 index 00000000000..ddf94f93626 --- /dev/null +++ b/src/devices/cpu/m6502/m6510d.h @@ -0,0 +1,28 @@ +// license:BSD-3-Clause +// copyright-holders:Olivier Galibert +/*************************************************************************** + + m6510d.h + + 6502 with 6 i/o pins, also known as 8500, disassembler + +***************************************************************************/ + +#ifndef MAME_CPU_M6502_M6510D_H +#define MAME_CPU_M6502_M6510D_H + +#pragma once + +#include "m6502d.h" + +class m6510_disassembler : public m6502_base_disassembler +{ +public: + m6510_disassembler(); + virtual ~m6510_disassembler() = default; + +private: + static const disasm_entry disasm_entries[0x100]; +}; + +#endif diff --git a/src/devices/cpu/m6502/m65c02.cpp b/src/devices/cpu/m6502/m65c02.cpp index d109cc502bf..bc79ea84231 100644 --- a/src/devices/cpu/m6502/m65c02.cpp +++ b/src/devices/cpu/m6502/m65c02.cpp @@ -11,6 +11,7 @@ #include "emu.h" #include "m65c02.h" +#include "m65c02d.h" DEFINE_DEVICE_TYPE(M65C02, m65c02_device, "m65c02", "M65C02") @@ -24,9 +25,9 @@ m65c02_device::m65c02_device(const machine_config &mconfig, device_type type, co { } -offs_t m65c02_device::disasm_disassemble(std::ostream &stream, offs_t pc, const uint8_t *oprom, const uint8_t *opram, uint32_t options) +util::disasm_interface *m65c02_device::create_disassembler() { - return disassemble_generic(stream, pc, oprom, opram, options, disasm_entries); + return new m65c02_disassembler; } #include "cpu/m6502/m65c02.hxx" diff --git a/src/devices/cpu/m6502/m65c02.h b/src/devices/cpu/m6502/m65c02.h index 828556e5f83..c1898912b03 100644 --- a/src/devices/cpu/m6502/m65c02.h +++ b/src/devices/cpu/m6502/m65c02.h @@ -19,9 +19,7 @@ class m65c02_device : public m6502_device { public: m65c02_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); - static const disasm_entry disasm_entries[0x100]; - - virtual offs_t disasm_disassemble(std::ostream &stream, offs_t pc, const uint8_t *oprom, const uint8_t *opram, uint32_t options) override; + virtual util::disasm_interface *create_disassembler() override; virtual void do_exec_full() override; virtual void do_exec_partial() override; diff --git a/src/devices/cpu/m6502/m65c02d.cpp b/src/devices/cpu/m6502/m65c02d.cpp new file mode 100644 index 00000000000..7a78219f129 --- /dev/null +++ b/src/devices/cpu/m6502/m65c02d.cpp @@ -0,0 +1,18 @@ +// license:BSD-3-Clause +// copyright-holders:Olivier Galibert +/*************************************************************************** + + m65c02d.cpp + + Mostek 6502, CMOS variant with some additional instructions (but + not the bitwise ones), disassembler + +***************************************************************************/ + +#include "emu.h" +#include "m65c02d.h" +#include "cpu/m6502/m65c02d.hxx" + +m65c02_disassembler::m65c02_disassembler() : m6502_base_disassembler(disasm_entries) +{ +} diff --git a/src/devices/cpu/m6502/m65c02d.h b/src/devices/cpu/m6502/m65c02d.h new file mode 100644 index 00000000000..d9599e548bb --- /dev/null +++ b/src/devices/cpu/m6502/m65c02d.h @@ -0,0 +1,29 @@ +// license:BSD-3-Clause +// copyright-holders:Olivier Galibert +/*************************************************************************** + + m65c02d.h + + Mostek 6502, CMOS variant with some additional instructions (but + not the bitwise ones), disassembler + +***************************************************************************/ + +#ifndef MAME_CPU_M6502_M65C02D_H +#define MAME_CPU_M6502_M65C02D_H + +#pragma once + +#include "m6502d.h" + +class m65c02_disassembler : public m6502_base_disassembler +{ +public: + m65c02_disassembler(); + virtual ~m65c02_disassembler() = default; + +private: + static const disasm_entry disasm_entries[0x100]; +}; + +#endif diff --git a/src/devices/cpu/m6502/m65ce02.cpp b/src/devices/cpu/m6502/m65ce02.cpp index 239e900ed6d..e416cfa0089 100644 --- a/src/devices/cpu/m6502/m65ce02.cpp +++ b/src/devices/cpu/m6502/m65ce02.cpp @@ -10,6 +10,7 @@ #include "emu.h" #include "m65ce02.h" +#include "m65ce02d.h" DEFINE_DEVICE_TYPE(M65CE02, m65ce02_device, "m65ce02", "M65CE02") @@ -23,9 +24,9 @@ m65ce02_device::m65ce02_device(const machine_config &mconfig, device_type type, { } -offs_t m65ce02_device::disasm_disassemble(std::ostream &stream, offs_t pc, const uint8_t *oprom, const uint8_t *opram, uint32_t options) +util::disasm_interface *m65ce02_device::create_disassembler() { - return disassemble_generic(stream, pc, oprom, opram, options, disasm_entries); + return new m65ce02_disassembler; } void m65ce02_device::init() diff --git a/src/devices/cpu/m6502/m65ce02.h b/src/devices/cpu/m6502/m65ce02.h index 191123683f6..e3c7a440ca8 100644 --- a/src/devices/cpu/m6502/m65ce02.h +++ b/src/devices/cpu/m6502/m65ce02.h @@ -18,9 +18,7 @@ class m65ce02_device : public m65c02_device { public: m65ce02_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); - static const disasm_entry disasm_entries[0x100]; - - virtual offs_t disasm_disassemble(std::ostream &stream, offs_t pc, const uint8_t *oprom, const uint8_t *opram, uint32_t options) override; + virtual util::disasm_interface *create_disassembler() override; virtual void do_exec_full() override; virtual void do_exec_partial() override; diff --git a/src/devices/cpu/m6502/m65ce02d.cpp b/src/devices/cpu/m6502/m65ce02d.cpp new file mode 100644 index 00000000000..f815eae4b5a --- /dev/null +++ b/src/devices/cpu/m6502/m65ce02d.cpp @@ -0,0 +1,17 @@ +// license:BSD-3-Clause +// copyright-holders:Olivier Galibert +/*************************************************************************** + + m65ce02d.cpp + + 6502 with Z register and some more stuff, disassembler + +***************************************************************************/ + +#include "emu.h" +#include "m65ce02d.h" +#include "cpu/m6502/m65ce02d.hxx" + +m65ce02_disassembler::m65ce02_disassembler() : m6502_base_disassembler(disasm_entries) +{ +} diff --git a/src/devices/cpu/m6502/m65ce02d.h b/src/devices/cpu/m6502/m65ce02d.h new file mode 100644 index 00000000000..ea5cd8f072f --- /dev/null +++ b/src/devices/cpu/m6502/m65ce02d.h @@ -0,0 +1,28 @@ +// license:BSD-3-Clause +// copyright-holders:Olivier Galibert +/*************************************************************************** + + m65ce02d.h + + 6502 with Z register and some more stuff, disassembler + +***************************************************************************/ + +#ifndef MAME_CPU_M6502_M65CE02D_H +#define MAME_CPU_M6502_M65CE02D_H + +#pragma once + +#include "m6502d.h" + +class m65ce02_disassembler : public m6502_base_disassembler +{ +public: + m65ce02_disassembler(); + virtual ~m65ce02_disassembler() = default; + +private: + static const disasm_entry disasm_entries[0x100]; +}; + +#endif diff --git a/src/devices/cpu/m6502/m740.cpp b/src/devices/cpu/m6502/m740.cpp index 807eac55b09..cce9289b1de 100644 --- a/src/devices/cpu/m6502/m740.cpp +++ b/src/devices/cpu/m6502/m740.cpp @@ -23,9 +23,14 @@ m740_device::m740_device(const machine_config &mconfig, device_type type, const { } -offs_t m740_device::disasm_disassemble(std::ostream &stream, offs_t pc, const uint8_t *oprom, const uint8_t *opram, uint32_t options) +u32 m740_device::get_state_base() const { - return disassemble_generic(stream, pc, oprom, opram, options, disasm_entries); + return inst_state_base; +} + +util::disasm_interface *m740_device::create_disassembler() +{ + return new m740_disassembler(this); } void m740_device::device_start() diff --git a/src/devices/cpu/m6502/m740.h b/src/devices/cpu/m6502/m740.h index 350ea8bced6..be7245e328c 100644 --- a/src/devices/cpu/m6502/m740.h +++ b/src/devices/cpu/m6502/m740.h @@ -12,8 +12,9 @@ #define MAME_CPU_M6502_M740_H #include "m6502.h" +#include "m740d.h" -class m740_device : public m6502_device { +class m740_device : public m6502_device, public m740_disassembler::config { public: enum { @@ -41,11 +42,9 @@ public: virtual void device_start() override; virtual void device_reset() override; - static const disasm_entry disasm_entries[0x200]; - virtual void state_string_export(const device_state_entry &entry, std::string &str) const override; - virtual offs_t disasm_disassemble(std::ostream &stream, offs_t pc, const uint8_t *oprom, const uint8_t *opram, uint32_t options) override; + virtual util::disasm_interface *create_disassembler() override; virtual void do_exec_full() override; virtual void do_exec_partial() override; virtual void execute_set_input(int inputnum, int state) override; @@ -55,6 +54,9 @@ protected: #define O(o) void o ## _full(); void o ## _partial() + u32 inst_state_base; /* Current instruction bank */ + virtual u32 get_state_base() const override; + uint8_t do_clb(uint8_t in, uint8_t bit); uint8_t do_seb(uint8_t in, uint8_t bit); uint8_t do_rrf(uint8_t in); diff --git a/src/devices/cpu/m6502/m740d.cpp b/src/devices/cpu/m6502/m740d.cpp new file mode 100644 index 00000000000..5da5ef53020 --- /dev/null +++ b/src/devices/cpu/m6502/m740d.cpp @@ -0,0 +1,22 @@ +// license:BSD-3-Clause +// copyright-holders:Olivier Galibert +/*************************************************************************** + + m740d.cpp + + Mitsubishi M740 series (M507xx/M509xx), disassembler + +***************************************************************************/ + +#include "emu.h" +#include "m740d.h" +#include "cpu/m6502/m740d.hxx" + +m740_disassembler::m740_disassembler(config *_conf) : m6502_base_disassembler(disasm_entries), conf(_conf) +{ +} + +u32 m740_disassembler::get_instruction_bank() const +{ + return conf->get_state_base(); +} diff --git a/src/devices/cpu/m6502/m740d.h b/src/devices/cpu/m6502/m740d.h new file mode 100644 index 00000000000..80029cc56a8 --- /dev/null +++ b/src/devices/cpu/m6502/m740d.h @@ -0,0 +1,37 @@ +// license:BSD-3-Clause +// copyright-holders:Olivier Galibert +/*************************************************************************** + + m740d.h + + Mitsubishi M740 series (M507xx/M509xx), disassembler + +***************************************************************************/ + +#ifndef MAME_CPU_M6502_M740D_H +#define MAME_CPU_M6502_M740D_H + +#pragma once + +#include "m6502d.h" + +class m740_disassembler : public m6502_base_disassembler +{ +public: + struct config { + virtual ~config() = default; + virtual u32 get_state_base() const = 0; + }; + + m740_disassembler(config *conf); + virtual ~m740_disassembler() = default; + +protected: + virtual u32 get_instruction_bank() const override; + +private: + static const disasm_entry disasm_entries[0x200]; + config *conf; +}; + +#endif diff --git a/src/devices/cpu/m6502/n2a03.cpp b/src/devices/cpu/m6502/n2a03.cpp index ca3a8a9b87b..f989d8d50f3 100644 --- a/src/devices/cpu/m6502/n2a03.cpp +++ b/src/devices/cpu/m6502/n2a03.cpp @@ -10,6 +10,7 @@ #include "emu.h" #include "n2a03.h" +#include "n2a03d.h" DEFINE_DEVICE_TYPE(N2A03, n2a03_device, "n2a03", "N2A03") @@ -56,9 +57,9 @@ n2a03_device::n2a03_device(const machine_config &mconfig, const char *tag, devic program_config.m_internal_map = ADDRESS_MAP_NAME(n2a03_map); } -offs_t n2a03_device::disasm_disassemble(std::ostream &stream, offs_t pc, const uint8_t *oprom, const uint8_t *opram, uint32_t options) +util::disasm_interface *n2a03_device::create_disassembler() { - return disassemble_generic(stream, pc, oprom, opram, options, disasm_entries); + return new n2a03_disassembler; } void n2a03_device::device_start() diff --git a/src/devices/cpu/m6502/n2a03.h b/src/devices/cpu/m6502/n2a03.h index 0a4cf346797..42e5eac8257 100644 --- a/src/devices/cpu/m6502/n2a03.h +++ b/src/devices/cpu/m6502/n2a03.h @@ -19,9 +19,8 @@ class n2a03_device : public m6502_device { public: n2a03_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); - static const disasm_entry disasm_entries[0x100]; + virtual util::disasm_interface *create_disassembler() override; - virtual offs_t disasm_disassemble(std::ostream &stream, offs_t pc, const uint8_t *oprom, const uint8_t *opram, uint32_t options) override; virtual void do_exec_full() override; virtual void do_exec_partial() override; virtual void device_clock_changed() override; diff --git a/src/devices/cpu/m6502/n2a03d.cpp b/src/devices/cpu/m6502/n2a03d.cpp new file mode 100644 index 00000000000..bedb062f018 --- /dev/null +++ b/src/devices/cpu/m6502/n2a03d.cpp @@ -0,0 +1,17 @@ +// license:BSD-3-Clause +// copyright-holders:Olivier Galibert +/*************************************************************************** + + n2a03d.cpp + + 6502, NES variant, disassembler + +***************************************************************************/ + +#include "emu.h" +#include "n2a03d.h" +#include "cpu/m6502/n2a03d.hxx" + +n2a03_disassembler::n2a03_disassembler() : m6502_base_disassembler(disasm_entries) +{ +} diff --git a/src/devices/cpu/m6502/n2a03d.h b/src/devices/cpu/m6502/n2a03d.h new file mode 100644 index 00000000000..568df91c23a --- /dev/null +++ b/src/devices/cpu/m6502/n2a03d.h @@ -0,0 +1,28 @@ +// license:BSD-3-Clause +// copyright-holders:Olivier Galibert +/*************************************************************************** + + n2a03d.h + + 6502, NES variant, disassembler + +***************************************************************************/ + +#ifndef MAME_CPU_M6502_N2A03D_H +#define MAME_CPU_M6502_N2A03D_H + +#pragma once + +#include "m6502d.h" + +class n2a03_disassembler : public m6502_base_disassembler +{ +public: + n2a03_disassembler(); + virtual ~n2a03_disassembler() = default; + +private: + static const disasm_entry disasm_entries[0x100]; +}; + +#endif diff --git a/src/devices/cpu/m6502/or65c02.lst b/src/devices/cpu/m6502/or65c02.lst new file mode 100644 index 00000000000..e69de29bb2d --- /dev/null +++ b/src/devices/cpu/m6502/or65c02.lst diff --git a/src/devices/cpu/m6502/r65c02.cpp b/src/devices/cpu/m6502/r65c02.cpp index 53c5b40b662..ab7bb936876 100644 --- a/src/devices/cpu/m6502/r65c02.cpp +++ b/src/devices/cpu/m6502/r65c02.cpp @@ -10,6 +10,7 @@ #include "emu.h" #include "r65c02.h" +#include "r65c02d.h" DEFINE_DEVICE_TYPE(R65C02, r65c02_device, "r65c02", "R65C02") @@ -23,9 +24,9 @@ r65c02_device::r65c02_device(const machine_config &mconfig, device_type type, co { } -offs_t r65c02_device::disasm_disassemble(std::ostream &stream, offs_t pc, const uint8_t *oprom, const uint8_t *opram, uint32_t options) +util::disasm_interface *r65c02_device::create_disassembler() { - return disassemble_generic(stream, pc, oprom, opram, options, disasm_entries); + return new r65c02_disassembler; } #include "cpu/m6502/r65c02.hxx" diff --git a/src/devices/cpu/m6502/r65c02.h b/src/devices/cpu/m6502/r65c02.h index 41cea972944..d6c88417bd6 100644 --- a/src/devices/cpu/m6502/r65c02.h +++ b/src/devices/cpu/m6502/r65c02.h @@ -17,9 +17,7 @@ class r65c02_device : public m65c02_device { public: r65c02_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); - static const disasm_entry disasm_entries[0x100]; - - virtual offs_t disasm_disassemble(std::ostream &stream, offs_t pc, const uint8_t *oprom, const uint8_t *opram, uint32_t options) override; + virtual util::disasm_interface *create_disassembler() override; virtual void do_exec_full() override; virtual void do_exec_partial() override; diff --git a/src/devices/cpu/m6502/r65c02d.cpp b/src/devices/cpu/m6502/r65c02d.cpp new file mode 100644 index 00000000000..20eae90c9bc --- /dev/null +++ b/src/devices/cpu/m6502/r65c02d.cpp @@ -0,0 +1,17 @@ +// license:BSD-3-Clause +// copyright-holders:Olivier Galibert +/*************************************************************************** + + r65c02d.cpp + + Rockwell 65c02, CMOS variant with bitwise instructions, disassembler + +***************************************************************************/ + +#include "emu.h" +#include "r65c02d.h" +#include "cpu/m6502/r65c02d.hxx" + +r65c02_disassembler::r65c02_disassembler() : m6502_base_disassembler(disasm_entries) +{ +} diff --git a/src/devices/cpu/m6502/r65c02d.h b/src/devices/cpu/m6502/r65c02d.h new file mode 100644 index 00000000000..5f5f3a4a58a --- /dev/null +++ b/src/devices/cpu/m6502/r65c02d.h @@ -0,0 +1,28 @@ +// license:BSD-3-Clause +// copyright-holders:Olivier Galibert +/*************************************************************************** + + r65c02d.h + + Rockwell 65c02, CMOS variant with bitwise instructions, disassembler + +***************************************************************************/ + +#ifndef MAME_CPU_M6502_R65C02D_H +#define MAME_CPU_M6502_R65C02D_H + +#pragma once + +#include "m6502d.h" + +class r65c02_disassembler : public m6502_base_disassembler +{ +public: + r65c02_disassembler(); + virtual ~r65c02_disassembler() = default; + +private: + static const disasm_entry disasm_entries[0x100]; +}; + +#endif |