summaryrefslogtreecommitdiffstatshomepage
path: root/src/devices/cpu/m6502/m6509.h
diff options
context:
space:
mode:
author Miodrag Milanovic <mmicko@gmail.com>2015-09-13 08:41:44 +0200
committer Miodrag Milanovic <mmicko@gmail.com>2015-09-13 08:41:44 +0200
commitf88cefad27a1737c76e09d99c9fb43e173506081 (patch)
tree2d8167d03579c46e226471747eb4407bd00ed6fa /src/devices/cpu/m6502/m6509.h
parente92ac9e0fa8e99869894bea00589bbb526be30aa (diff)
Move all devices into separate part of src tree (nw)
Diffstat (limited to 'src/devices/cpu/m6502/m6509.h')
-rw-r--r--src/devices/cpu/m6502/m6509.h87
1 files changed, 87 insertions, 0 deletions
diff --git a/src/devices/cpu/m6502/m6509.h b/src/devices/cpu/m6502/m6509.h
new file mode 100644
index 00000000000..2bfee01981a
--- /dev/null
+++ b/src/devices/cpu/m6502/m6509.h
@@ -0,0 +1,87 @@
+// license:BSD-3-Clause
+// copyright-holders:Olivier Galibert
+/***************************************************************************
+
+ m6509.h
+
+ 6502 with banking and extended address bus
+
+***************************************************************************/
+
+#ifndef __M6509_H__
+#define __M6509_H__
+
+#include "m6502.h"
+
+class m6509_device : public m6502_device {
+public:
+ m6509_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();
+
+protected:
+ class mi_6509_normal : public memory_interface {
+ public:
+ m6509_device *base;
+
+ mi_6509_normal(m6509_device *base);
+ virtual ~mi_6509_normal() {}
+ virtual UINT8 read(UINT16 adr);
+ virtual UINT8 read_9(UINT16 adr);
+ virtual UINT8 read_sync(UINT16 adr);
+ virtual UINT8 read_arg(UINT16 adr);
+ virtual void write(UINT16 adr, UINT8 val);
+ virtual void write_9(UINT16 adr, UINT8 val);
+ };
+
+ class mi_6509_nd : public mi_6509_normal {
+ public:
+ mi_6509_nd(m6509_device *base);
+ virtual ~mi_6509_nd() {}
+ virtual UINT8 read_sync(UINT16 adr);
+ virtual UINT8 read_arg(UINT16 adr);
+ };
+
+ virtual void device_start();
+ virtual void device_reset();
+ virtual void state_export(const device_state_entry &entry);
+
+ UINT32 XPC;
+
+ UINT8 bank_i, bank_y;
+
+ UINT8 bank_i_r() { return bank_i; }
+ UINT8 bank_y_r() { return bank_y; }
+ void bank_i_w(UINT8 data) { bank_i = data; }
+ void bank_y_w(UINT8 data) { bank_y = data; }
+
+ UINT32 adr_in_bank_i(UINT16 adr) { return adr | ((bank_i & 0xf) << 16); }
+ UINT32 adr_in_bank_y(UINT16 adr) { return adr | ((bank_y & 0xf) << 16); }
+
+#define O(o) void o ## _full(); void o ## _partial()
+
+ // 6509 opcodes
+ O(lda_9_idy);
+ O(sta_9_idy);
+
+#undef O
+};
+
+enum {
+ M6509_IRQ_LINE = m6502_device::IRQ_LINE,
+ M6509_NMI_LINE = m6502_device::NMI_LINE,
+ M6509_SET_OVERFLOW = m6502_device::V_LINE
+};
+
+enum {
+ M6509_BI = M6502_IR+1,
+ M6509_BY
+};
+
+extern const device_type M6509;
+
+#endif