summaryrefslogtreecommitdiffstatshomepage
path: root/src/devices/cpu/m6502/m4510.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/devices/cpu/m6502/m4510.h')
-rw-r--r--src/devices/cpu/m6502/m4510.h82
1 files changed, 82 insertions, 0 deletions
diff --git a/src/devices/cpu/m6502/m4510.h b/src/devices/cpu/m6502/m4510.h
new file mode 100644
index 00000000000..492572fddb6
--- /dev/null
+++ b/src/devices/cpu/m6502/m4510.h
@@ -0,0 +1,82 @@
+// license:BSD-3-Clause
+// copyright-holders:Olivier Galibert
+/***************************************************************************
+
+ m4510.h
+
+ 65ce02 with a mmu and a port
+
+***************************************************************************/
+
+#ifndef __M4510_H__
+#define __M4510_H__
+
+#include "m65ce02.h"
+
+class m4510_device : public m65ce02_device {
+public:
+ m4510_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock);
+
+ static const disasm_entry disasm_entries[0x100];
+
+ virtual offs_t disasm_disassemble(char *buffer, offs_t pc, const UINT8 *oprom, const UINT8 *opram, UINT32 options);
+ virtual void do_exec_full();
+ virtual void do_exec_partial();
+
+ bool get_nomap() const { return nomap; }
+
+protected:
+ UINT32 map_offset[2];
+ UINT8 map_enable;
+ bool nomap;
+
+ class mi_4510_normal : public memory_interface {
+ public:
+ m4510_device *base;
+
+ mi_4510_normal(m4510_device *base);
+ virtual ~mi_4510_normal() {}
+ virtual UINT8 read(UINT16 adr);
+ virtual UINT8 read_sync(UINT16 adr);
+ virtual UINT8 read_arg(UINT16 adr);
+ virtual void write(UINT16 adr, UINT8 val);
+ };
+
+ class mi_4510_nd : public mi_4510_normal {
+ public:
+ mi_4510_nd(m4510_device *base);
+ virtual ~mi_4510_nd() {}
+ virtual UINT8 read_sync(UINT16 adr);
+ virtual UINT8 read_arg(UINT16 adr);
+ };
+
+ virtual void device_start();
+ virtual void device_reset();
+ virtual bool memory_translate(address_spacenum spacenum, int intention, offs_t &address);
+
+ inline UINT32 map(UINT16 adr) {
+ if(map_enable & (1 << (adr >> 13))) {
+ nomap = false;
+ return adr + map_offset[adr >> 15];
+ }
+ nomap = true;
+ return adr;
+ }
+
+#define O(o) void o ## _full(); void o ## _partial()
+
+ // 4510 opcodes
+ O(eom_imp);
+ O(map_imp);
+
+#undef O
+};
+
+enum {
+ M4510_IRQ_LINE = m6502_device::IRQ_LINE,
+ M4510_NMI_LINE = m6502_device::NMI_LINE
+};
+
+extern const device_type M4510;
+
+#endif