mirror of
https://github.com/holub/mame
synced 2025-04-22 16:31:49 +03:00
mn1400: add opcode placeholders
This commit is contained in:
parent
4e1d6d8547
commit
3226714fff
@ -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
|
||||
}
|
||||
}
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
};
|
||||
|
@ -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
|
||||
}
|
||||
|
@ -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.
|
||||
|
Loading…
Reference in New Issue
Block a user