summaryrefslogtreecommitdiffstatshomepage
path: root/src/devices/cpu/mn1400/mn1400.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/devices/cpu/mn1400/mn1400.cpp')
-rw-r--r--src/devices/cpu/mn1400/mn1400.cpp141
1 files changed, 141 insertions, 0 deletions
diff --git a/src/devices/cpu/mn1400/mn1400.cpp b/src/devices/cpu/mn1400/mn1400.cpp
new file mode 100644
index 00000000000..b1a8d8449fb
--- /dev/null
+++ b/src/devices/cpu/mn1400/mn1400.cpp
@@ -0,0 +1,141 @@
+// license:BSD-3-Clause
+// copyright-holders:hap
+/*
+
+ Matsushita MN1400, MN1405
+
+*/
+
+#include "emu.h"
+#include "mn1400.h"
+
+#include "mn1400d.h"
+
+
+// device definitions
+DEFINE_DEVICE_TYPE(MN1400_40PINS, mn1400_cpu_device, "mn1400", "Matsushita MN1400 (40 pins)")
+DEFINE_DEVICE_TYPE(MN1400_28PINS, mn1400_reduced_cpu_device, "mn1400_reduced", "Matsushita MN1400 (28 pins)")
+DEFINE_DEVICE_TYPE(MN1405, mn1405_cpu_device, "mn1405", "Matsushita MN1405")
+
+
+// constructor
+mn1400_cpu_device::mn1400_cpu_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, u32 clock, int stack_levels, int prgwidth, address_map_constructor program, int datawidth, address_map_constructor data) :
+ mn1400_base_device(mconfig, type, tag, owner, clock, stack_levels, prgwidth, program, datawidth, data)
+{ }
+
+mn1400_cpu_device::mn1400_cpu_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock) :
+ mn1400_cpu_device(mconfig, MN1400_40PINS, tag, owner, clock, 2 /* stack levels */, 10 /* rom bits */, address_map_constructor(FUNC(mn1400_cpu_device::program_1kx8), this), 6 /* ram bits */, address_map_constructor(FUNC(mn1400_cpu_device::data_64x4), this))
+{ }
+
+mn1400_reduced_cpu_device::mn1400_reduced_cpu_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock) :
+ mn1400_cpu_device(mconfig, MN1400_28PINS, tag, owner, clock, 2, 10, address_map_constructor(FUNC(mn1400_reduced_cpu_device::program_1kx8), this), 6, address_map_constructor(FUNC(mn1400_reduced_cpu_device::data_64x4), this))
+{
+ // CO5-CO9, DO0-DO3 (scrambled)
+ set_c_mask(0x3e0);
+ set_d_mask(0xf, 0x5321);
+}
+
+mn1405_cpu_device::mn1405_cpu_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock) :
+ mn1400_cpu_device(mconfig, MN1405, tag, owner, clock, 2, 11, address_map_constructor(FUNC(mn1405_cpu_device::program_2kx8), this), 7, address_map_constructor(FUNC(mn1405_cpu_device::data_128x4), this))
+{ }
+
+
+// disasm
+std::unique_ptr<util::disasm_interface> mn1400_cpu_device::create_disassembler()
+{
+ return std::make_unique<mn1400_disassembler>();
+}
+
+
+//-------------------------------------------------
+// execute
+//-------------------------------------------------
+
+bool mn1400_cpu_device::op_has_param(u8 op)
+{
+ // branch opcodes are 2 bytes
+ return ((op & 0xf8) == 0x38 || (op & 0xf0) == 0x40 || (op & 0xf0) == 0xe0);
+}
+
+void mn1400_cpu_device::execute_one()
+{
+ switch (m_op & 0xf0)
+ {
+ case 0x50: op_li(); break;
+ case 0x60: op_ly(); break;
+ case 0x70: op_andi(); break;
+ case 0x80: op_ai(); break;
+ case 0x90: op_ci(); break;
+ case 0xa0: op_cy(); break;
+ case 0xb0: op_sm(); break;
+ case 0xc0: op_rm(); break;
+ case 0xd0: op_tb(); break;
+ case 0xe0: op_bpcz(); break;
+ case 0xf0: op_otie(); break;
+
+ default:
+ switch (m_op & 0xf8)
+ {
+ case 0x30: op_lx(); break;
+ case 0x38: op_bs01(); break;
+ case 0x40: op_jmp(); break;
+ case 0x48: op_cal(); break;
+
+ default:
+ switch (m_op)
+ {
+ case 0x00: op_nop(); break;
+ case 0x01: op_tax(); break;
+ case 0x02: op_tya(); break;
+ case 0x03: op_tay(); break;
+ case 0x04: op_and(); break;
+ case 0x05: op_or(); break;
+ case 0x06: op_xor(); break;
+ case 0x07: op_a(); break;
+ case 0x08: op_cpl(); break;
+ case 0x09: op_c(); break;
+ case 0x0a: op_st(); break;
+ case 0x0b: op_stic(); break;
+ case 0x0c: op_stdc(); break;
+ case 0x0d: op_l(); break;
+ case 0x0e: op_lic(); break;
+ case 0x0f: op_ldc(); break;
+
+ case 0x10: op_ote(); break;
+ case 0x11: op_otmd(); break;
+ case 0x12: op_otd(); break;
+ case 0x13: op_cco(); break;
+ case 0x14: op_ina(); break;
+ case 0x15: op_inb(); break;
+ case 0x16: op_rco(); break;
+ case 0x17: op_sco(); break;
+ case 0x18: op_tacl(); break;
+ case 0x19: op_tacu(); break;
+ case 0x1a: op_tcal(); break;
+ case 0x1b: op_tcau(); break;
+ case 0x1c: op_dc(); break;
+ case 0x1d: op_ec(); break;
+ case 0x1e: op_sl(); break;
+ case 0x1f: op_ret(); break;
+
+ case 0x20: case 0x21: case 0x22: case 0x23: op_ld(); break;
+ case 0x24: case 0x25: case 0x26: case 0x27: op_std(); break;
+
+ case 0x28: op_rc(); break;
+ case 0x29: op_rp(); break;
+ case 0x2a: op_sc(); break;
+ case 0x2b: op_sp(); break;
+ case 0x2c: op_icy(); break;
+ case 0x2d: op_dcy(); break;
+ case 0x2e: op_icm(); break;
+ case 0x2f: op_dcm(); break;
+
+ default: op_illegal(); break;
+ }
+ break; // 0xff
+
+ }
+ break; // 0xfc
+
+ } // 0xf0
+}