From 3226714fffb8a7cd11f4272156879b0caaffcf51 Mon Sep 17 00:00:00 2001 From: hap Date: Sun, 7 May 2023 00:56:07 +0200 Subject: mn1400: add opcode placeholders --- src/devices/cpu/mn1400/mn1400.cpp | 79 ++++++++- src/devices/cpu/mn1400/mn1400.h | 60 +++++++ src/devices/cpu/mn1400/mn1400base.cpp | 20 +++ src/devices/cpu/mn1400/mn1400base.h | 11 ++ src/devices/cpu/mn1400/mn1400op.cpp | 296 ++++++++++++++++++++++++++++++++++ src/mame/handheld/hh_mn1400.cpp | 4 +- 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. -- cgit v1.2.3