summaryrefslogtreecommitdiffstatshomepage
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/devices/cpu/mn1400/mn1400.cpp79
-rw-r--r--src/devices/cpu/mn1400/mn1400.h60
-rw-r--r--src/devices/cpu/mn1400/mn1400base.cpp20
-rw-r--r--src/devices/cpu/mn1400/mn1400base.h11
-rw-r--r--src/devices/cpu/mn1400/mn1400op.cpp296
-rw-r--r--src/mame/handheld/hh_mn1400.cpp4
6 files changed, 467 insertions, 3 deletions
diff --git a/src/devices/cpu/mn1400/mn1400.cpp b/src/devices/cpu/mn1400/mn1400.cpp
index e1a2b46965b..3981866938b 100644
--- a/src/devices/cpu/mn1400/mn1400.cpp
+++ b/src/devices/cpu/mn1400/mn1400.cpp
@@ -53,5 +53,82 @@ bool mn1400_cpu_device::op_has_param(u8 op)
void mn1400_cpu_device::execute_one()
{
- op_illegal();
+ 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
+ }
}
diff --git a/src/devices/cpu/mn1400/mn1400.h b/src/devices/cpu/mn1400/mn1400.h
index c69a926c24e..3dfb42009a4 100644
--- a/src/devices/cpu/mn1400/mn1400.h
+++ b/src/devices/cpu/mn1400/mn1400.h
@@ -59,6 +59,66 @@ protected:
void op_illegal();
// opcode handlers
+ void op_l();
+ void op_ld();
+ void op_li();
+ void op_lic();
+ void op_ldc();
+ void op_st();
+ void op_std();
+ void op_stic();
+ void op_stdc();
+ void op_lx();
+ void op_ly();
+ void op_tax();
+ void op_tay();
+ void op_tya();
+ void op_tacu();
+ void op_tacl();
+ void op_tcau();
+ void op_tcal();
+
+ void op_nop();
+ void op_and();
+ void op_andi();
+ void op_or();
+ void op_xor();
+ void op_a();
+ void op_ai();
+ void op_cpl();
+ void op_c();
+ void op_ci();
+ void op_cy();
+ void op_sl();
+ void op_icy();
+ void op_dcy();
+ void op_icm();
+ void op_dcm();
+ void op_sm();
+ void op_rm();
+ void op_tb();
+
+ void op_ina();
+ void op_inb();
+ void op_otd();
+ void op_otmd();
+ void op_ote();
+ void op_otie();
+ void op_rco();
+ void op_sco();
+ void op_cco();
+
+ void op_rc();
+ void op_rp();
+ void op_sc();
+ void op_sp();
+ void op_bs01();
+ void op_bpcz();
+ void op_jmp();
+ void op_cal();
+ void op_ret();
+ void op_ec();
+ void op_dc();
};
class mn1405_cpu_device : public mn1400_cpu_device
diff --git a/src/devices/cpu/mn1400/mn1400base.cpp b/src/devices/cpu/mn1400/mn1400base.cpp
index 01543bd4ae3..2877e750a55 100644
--- a/src/devices/cpu/mn1400/mn1400base.cpp
+++ b/src/devices/cpu/mn1400/mn1400base.cpp
@@ -63,6 +63,8 @@ void mn1400_base_device::device_start()
m_a = 0;
m_x = 0;
m_y = 0;
+ m_status = 0;
+ m_counter = 0;
// register for savestates
save_item(NAME(m_pc));
@@ -74,16 +76,20 @@ void mn1400_base_device::device_start()
save_item(NAME(m_a));
save_item(NAME(m_x));
save_item(NAME(m_y));
+ save_item(NAME(m_status));
+ save_item(NAME(m_counter));
// register state for debugger
state_add(STATE_GENPC, "GENPC", m_pc).formatstr("%03X").noshow();
state_add(STATE_GENPCBASE, "CURPC", m_prev_pc).formatstr("%03X").noshow();
+ state_add(STATE_GENFLAGS, "GENFLAGS", m_status).formatstr("%3s").noshow();
m_state_count = 0;
state_add(++m_state_count, "PC", m_pc).formatstr("%03X"); // 1
state_add(++m_state_count, "A", m_a).formatstr("%01X"); // 2
state_add(++m_state_count, "X", m_x).formatstr("%01X"); // 3
state_add(++m_state_count, "Y", m_y).formatstr("%01X"); // 4
+ state_add(++m_state_count, "CNT", m_y).formatstr("%02X"); // 5
set_icountptr(m_icount);
}
@@ -96,6 +102,20 @@ device_memory_interface::space_config_vector mn1400_base_device::memory_space_co
};
}
+void mn1400_base_device::state_string_export(const device_state_entry &entry, std::string &str) const
+{
+ switch (entry.index())
+ {
+ case STATE_GENFLAGS:
+ str = string_format("%c%c%c",
+ (m_status & FLAG_P) ? 'P' : 'p',
+ (m_status & FLAG_C) ? 'C' : 'c',
+ (m_status & FLAG_Z) ? 'Z' : 'z'
+ );
+ break;
+ }
+}
+
//-------------------------------------------------
// device_reset - device-specific reset
diff --git a/src/devices/cpu/mn1400/mn1400base.h b/src/devices/cpu/mn1400/mn1400base.h
index 7780d616d23..161fc9a185c 100644
--- a/src/devices/cpu/mn1400/mn1400base.h
+++ b/src/devices/cpu/mn1400/mn1400base.h
@@ -29,6 +29,8 @@ protected:
virtual void device_start() override;
virtual void device_reset() override;
+ virtual void state_string_export(const device_state_entry &entry, std::string &str) const override;
+
// device_execute_interface overrides
virtual u64 execute_clocks_to_cycles(u64 clocks) const noexcept override { return (clocks + 3 - 1) / 3; } // 3-phase clock
virtual u64 execute_cycles_to_clocks(u64 cycles) const noexcept override { return (cycles * 3); }
@@ -72,6 +74,15 @@ protected:
u8 m_a;
u8 m_x;
u8 m_y;
+ u8 m_status;
+ u8 m_counter;
+
+ enum
+ {
+ FLAG_Z = 1,
+ FLAG_C = 2,
+ FLAG_P = 4,
+ };
// i/o handlers
};
diff --git a/src/devices/cpu/mn1400/mn1400op.cpp b/src/devices/cpu/mn1400/mn1400op.cpp
index d5555befe51..60904f55df6 100644
--- a/src/devices/cpu/mn1400/mn1400op.cpp
+++ b/src/devices/cpu/mn1400/mn1400op.cpp
@@ -16,3 +16,299 @@ void mn1400_cpu_device::op_illegal()
// opcodes
+
+// load/store instructions
+
+void mn1400_cpu_device::op_l()
+{
+ // L: load A from memory
+}
+
+void mn1400_cpu_device::op_ld()
+{
+ // LD: load A direct from memory
+}
+
+void mn1400_cpu_device::op_li()
+{
+ // LI: load A immediate
+}
+
+void mn1400_cpu_device::op_lic()
+{
+ // LIC: L + increment Y
+}
+
+void mn1400_cpu_device::op_ldc()
+{
+ // LDC: L + decrement Y
+}
+
+void mn1400_cpu_device::op_st()
+{
+ // S: store A into memory
+}
+
+void mn1400_cpu_device::op_std()
+{
+ // STD: store A direct into memory
+}
+
+void mn1400_cpu_device::op_stic()
+{
+ // STIC: S + increment Y
+}
+
+void mn1400_cpu_device::op_stdc()
+{
+ // STDC: S + decrement Y
+}
+
+void mn1400_cpu_device::op_lx()
+{
+ // LX: load X immediate
+}
+
+void mn1400_cpu_device::op_ly()
+{
+ // LY: load Y immediate
+}
+
+void mn1400_cpu_device::op_tax()
+{
+ // TAX: transfer A to X
+}
+
+void mn1400_cpu_device::op_tay()
+{
+ // TAY: transfer A to Y
+}
+
+void mn1400_cpu_device::op_tya()
+{
+ // TYA: transfer Y to A
+}
+
+void mn1400_cpu_device::op_tacu()
+{
+ // TACU: transfer A to counter upper
+}
+
+void mn1400_cpu_device::op_tacl()
+{
+ // TACL: transfer A to counter lower
+}
+
+void mn1400_cpu_device::op_tcau()
+{
+ // TCAU: transfer counter upper to A
+}
+
+void mn1400_cpu_device::op_tcal()
+{
+ // TCAL: transfer counter lower to A
+}
+
+
+// arithmetic instructions
+
+void mn1400_cpu_device::op_nop()
+{
+ // NOP: no operation
+}
+
+void mn1400_cpu_device::op_and()
+{
+ // AND: AND A with memory
+}
+
+void mn1400_cpu_device::op_andi()
+{
+ // ANDI: AND A with immediate
+}
+
+void mn1400_cpu_device::op_or()
+{
+ // OR: OR A with memory
+}
+
+void mn1400_cpu_device::op_xor()
+{
+ // XOR: XOR A with memory
+}
+
+void mn1400_cpu_device::op_a()
+{
+ // A: add memory + carry to A
+}
+
+void mn1400_cpu_device::op_ai()
+{
+ // AI: add immediate to A
+}
+
+void mn1400_cpu_device::op_cpl()
+{
+ // CPL: complement A
+}
+
+void mn1400_cpu_device::op_c()
+{
+ // C: compare A to memory
+}
+
+void mn1400_cpu_device::op_ci()
+{
+ // CI: compare A to immediate
+}
+
+void mn1400_cpu_device::op_cy()
+{
+ // CY: compare A to Y
+}
+
+void mn1400_cpu_device::op_sl()
+{
+ // SL: shift left A
+}
+
+void mn1400_cpu_device::op_icy()
+{
+ // ICY: increment Y
+}
+
+void mn1400_cpu_device::op_dcy()
+{
+ // DCY: decrement Y
+}
+
+void mn1400_cpu_device::op_icm()
+{
+ // ICM: increment memory
+}
+
+void mn1400_cpu_device::op_dcm()
+{
+ // DCM: decrement memory
+}
+
+void mn1400_cpu_device::op_sm()
+{
+ // SM: set memory bits
+}
+
+void mn1400_cpu_device::op_rm()
+{
+ // RM: reset memory bits
+}
+
+void mn1400_cpu_device::op_tb()
+{
+ // TB: test A bits
+}
+
+
+// I/O instructions
+
+void mn1400_cpu_device::op_ina()
+{
+ // INA: input from port A
+}
+
+void mn1400_cpu_device::op_inb()
+{
+ // INB: input from port B
+}
+
+void mn1400_cpu_device::op_otd()
+{
+ // OTD: output A + PS to port D
+}
+
+void mn1400_cpu_device::op_otmd()
+{
+ // OTMD: output memory + PS to port D
+}
+
+void mn1400_cpu_device::op_ote()
+{
+ // OTE: output A to port E
+}
+
+void mn1400_cpu_device::op_otie()
+{
+ // OTIE: output immediate to port E
+}
+
+void mn1400_cpu_device::op_rco()
+{
+ // RCO: reset C pin
+}
+
+void mn1400_cpu_device::op_sco()
+{
+ // SCO: set C pin
+}
+
+void mn1400_cpu_device::op_cco()
+{
+ // CCO: clear C port
+}
+
+
+// control/branch instructions
+
+void mn1400_cpu_device::op_rc()
+{
+ // RC: reset CF
+}
+
+void mn1400_cpu_device::op_rp()
+{
+ // RP: reset PS
+}
+
+void mn1400_cpu_device::op_sc()
+{
+ // SC: set CF
+}
+
+void mn1400_cpu_device::op_sp()
+{
+ // SP: set PS
+}
+
+void mn1400_cpu_device::op_bs01()
+{
+ // BS(N)0/1: branch on S pins
+}
+
+void mn1400_cpu_device::op_bpcz()
+{
+ // B(N)P/C/Z: branch on status
+}
+
+void mn1400_cpu_device::op_jmp()
+{
+ // JMP: jump
+}
+
+void mn1400_cpu_device::op_cal()
+{
+ // CAL: call subroutine
+}
+
+void mn1400_cpu_device::op_ret()
+{
+ // RET: return from subroutine
+}
+
+void mn1400_cpu_device::op_ec()
+{
+ // EC: enable counter
+}
+
+void mn1400_cpu_device::op_dc()
+{
+ // DC: disable counter
+}
diff --git a/src/mame/handheld/hh_mn1400.cpp b/src/mame/handheld/hh_mn1400.cpp
index 862a2c0ee1b..7befe2ce49d 100644
--- a/src/mame/handheld/hh_mn1400.cpp
+++ b/src/mame/handheld/hh_mn1400.cpp
@@ -110,7 +110,7 @@ u8 hh_mn1400_state::read_inputs(int columns)
Lakeside Computer Perfection
* PCB label: Lakeside, PANASONIC, TCI-A4H94HB
- * MN1400ML MCU (28 pins, die label: 1400 ML-0)
+ * MN1400ML (28 pins, die label: 1400 ML-0)
* 10 LEDs, 2-bit sound
*******************************************************************************/
@@ -165,7 +165,7 @@ ROM_END
Selchow & Righter Scrabble Lexor
* PCB label: 2294HB
- * MN1405MS MCU (die label: 1405 MS-0)
+ * MN1405MS (die label: 1405 MS-0)
* 8-digit 14-seg LEDs, 2-bit sound
This is the MN1405 version, see scrablex.cpp for the MB8841 version.