summaryrefslogtreecommitdiffstatshomepage
path: root/src/devices/cpu/m6502
diff options
context:
space:
mode:
Diffstat (limited to 'src/devices/cpu/m6502')
-rw-r--r--src/devices/cpu/m6502/deco16.cpp6
-rw-r--r--src/devices/cpu/m6502/deco16.h4
-rw-r--r--src/devices/cpu/m6502/deco16d.cpp17
-rw-r--r--src/devices/cpu/m6502/deco16d.h28
-rw-r--r--src/devices/cpu/m6502/m4510.cpp5
-rw-r--r--src/devices/cpu/m6502/m4510.h3
-rw-r--r--src/devices/cpu/m6502/m4510d.cpp17
-rw-r--r--src/devices/cpu/m6502/m4510d.h28
-rw-r--r--src/devices/cpu/m6502/m6502.cpp183
-rw-r--r--src/devices/cpu/m6502/m6502.h48
-rw-r--r--src/devices/cpu/m6502/m6502d.cpp193
-rw-r--r--src/devices/cpu/m6502/m6502d.h81
-rwxr-xr-xsrc/devices/cpu/m6502/m6502make.py66
-rw-r--r--src/devices/cpu/m6502/m6509.cpp6
-rw-r--r--src/devices/cpu/m6502/m6509.h4
-rw-r--r--src/devices/cpu/m6502/m6509d.cpp17
-rw-r--r--src/devices/cpu/m6502/m6509d.h28
-rw-r--r--src/devices/cpu/m6502/m6510.cpp5
-rw-r--r--src/devices/cpu/m6502/m6510.h4
-rw-r--r--src/devices/cpu/m6502/m6510d.cpp17
-rw-r--r--src/devices/cpu/m6502/m6510d.h28
-rw-r--r--src/devices/cpu/m6502/m65c02.cpp5
-rw-r--r--src/devices/cpu/m6502/m65c02.h4
-rw-r--r--src/devices/cpu/m6502/m65c02d.cpp18
-rw-r--r--src/devices/cpu/m6502/m65c02d.h29
-rw-r--r--src/devices/cpu/m6502/m65ce02.cpp5
-rw-r--r--src/devices/cpu/m6502/m65ce02.h4
-rw-r--r--src/devices/cpu/m6502/m65ce02d.cpp17
-rw-r--r--src/devices/cpu/m6502/m65ce02d.h28
-rw-r--r--src/devices/cpu/m6502/m740.cpp9
-rw-r--r--src/devices/cpu/m6502/m740.h10
-rw-r--r--src/devices/cpu/m6502/m740d.cpp22
-rw-r--r--src/devices/cpu/m6502/m740d.h37
-rw-r--r--src/devices/cpu/m6502/n2a03.cpp5
-rw-r--r--src/devices/cpu/m6502/n2a03.h3
-rw-r--r--src/devices/cpu/m6502/n2a03d.cpp17
-rw-r--r--src/devices/cpu/m6502/n2a03d.h28
-rw-r--r--src/devices/cpu/m6502/or65c02.lst0
-rw-r--r--src/devices/cpu/m6502/r65c02.cpp5
-rw-r--r--src/devices/cpu/m6502/r65c02.h4
-rw-r--r--src/devices/cpu/m6502/r65c02d.cpp17
-rw-r--r--src/devices/cpu/m6502/r65c02d.h28
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 &params)
+{
+ 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 &params) 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