mn1400: add opcode placeholders

This commit is contained in:
hap 2023-05-07 00:56:07 +02:00
parent 4e1d6d8547
commit 3226714fff
6 changed files with 467 additions and 3 deletions

View File

@ -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
}
}

View File

@ -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

View File

@ -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

View File

@ -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
};

View File

@ -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
}

View File

@ -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.