summaryrefslogtreecommitdiffstatshomepage
path: root/src/devices/cpu/rw5000/a5900.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/devices/cpu/rw5000/a5900.cpp')
-rw-r--r--src/devices/cpu/rw5000/a5900.cpp42
1 files changed, 42 insertions, 0 deletions
diff --git a/src/devices/cpu/rw5000/a5900.cpp b/src/devices/cpu/rw5000/a5900.cpp
new file mode 100644
index 00000000000..e294469f35b
--- /dev/null
+++ b/src/devices/cpu/rw5000/a5900.cpp
@@ -0,0 +1,42 @@
+// license:BSD-3-Clause
+// copyright-holders:hap
+/*
+
+ Rockwell A5900 MCU
+
+TODO:
+- what happens when 0 or >1 keys are held down on READ?
+
+*/
+
+#include "emu.h"
+#include "a5900.h"
+
+
+DEFINE_DEVICE_TYPE(A5900, a5900_cpu_device, "a5900", "Rockwell A5900")
+
+
+// constructor
+a5900_cpu_device::a5900_cpu_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock) :
+ a5000_cpu_device(mconfig, A5900, tag, owner, clock, 9, address_map_constructor(FUNC(a5900_cpu_device::program_512x8), this), 6, address_map_constructor(FUNC(a5900_cpu_device::data_45x4), this))
+{ }
+
+
+// internal memory maps
+void a5900_cpu_device::program_512x8(address_map &map)
+{
+ map(0x000, 0x1ff).rom();
+}
+
+
+//-------------------------------------------------
+// changed opcodes (no need for separate file)
+//-------------------------------------------------
+
+void a5900_cpu_device::op_read()
+{
+ // READ: add _KB (prioritized) to A, skip next on no overflow
+ m_a += ~((count_leading_zeros_32(m_read_kb() & 0xf) - 28) & 3) & 0xf;
+ m_skip = !BIT(m_a, 4);
+ m_a &= 0xf;
+}