diff options
-rw-r--r-- | scripts/src/cpu.lua | 3 | ||||
-rw-r--r-- | src/devices/cpu/sm510/kb1013vk1-2.h | 38 | ||||
-rw-r--r-- | src/devices/cpu/sm510/kb1013vk1-2core.cpp | 104 | ||||
-rw-r--r-- | src/devices/cpu/sm510/kb1013vk1-2op.cpp | 9 | ||||
-rw-r--r-- | src/devices/cpu/sm510/sm500.cpp | 8 | ||||
-rw-r--r-- | src/devices/cpu/sm510/sm500.h | 45 | ||||
-rw-r--r-- | src/devices/cpu/sm510/sm500core.cpp | 11 | ||||
-rw-r--r-- | src/devices/cpu/sm510/sm500op.cpp | 20 | ||||
-rw-r--r-- | src/devices/cpu/sm510/sm510.h | 132 |
9 files changed, 258 insertions, 112 deletions
diff --git a/scripts/src/cpu.lua b/scripts/src/cpu.lua index cc942237c20..143cf78b4d0 100644 --- a/scripts/src/cpu.lua +++ b/scripts/src/cpu.lua @@ -1716,10 +1716,11 @@ if (CPUS["SM510"]~=null) then MAME_DIR .. "src/devices/cpu/sm510/sm510op.cpp", MAME_DIR .. "src/devices/cpu/sm510/sm510core.cpp", MAME_DIR .. "src/devices/cpu/sm510/sm511core.cpp", - MAME_DIR .. "src/devices/cpu/sm510/sm500.cpp", MAME_DIR .. "src/devices/cpu/sm510/sm500.h", MAME_DIR .. "src/devices/cpu/sm510/sm500op.cpp", MAME_DIR .. "src/devices/cpu/sm510/sm500core.cpp", + MAME_DIR .. "src/devices/cpu/sm510/kb1013vk1-2.h", + MAME_DIR .. "src/devices/cpu/sm510/kb1013vk1-2op.cpp", MAME_DIR .. "src/devices/cpu/sm510/kb1013vk1-2core.cpp", } end diff --git a/src/devices/cpu/sm510/kb1013vk1-2.h b/src/devices/cpu/sm510/kb1013vk1-2.h new file mode 100644 index 00000000000..bc436fb1e9b --- /dev/null +++ b/src/devices/cpu/sm510/kb1013vk1-2.h @@ -0,0 +1,38 @@ +// license:BSD-3-Clause +// copyright-holders:hap, Igor +/* + + KB1013VK1-2 + +*/ + +#ifndef _KB1013VK12_H_ +#define _KB1013VK12_H_ + +#include "sm500.h" + + +// I/O ports setup + +// .. + + + + + +class kb1013vk12_device : public sm500_device +{ +public: + kb1013vk12_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock); + +protected: + virtual void execute_one() override; + + // opcode handlers +}; + + +extern const device_type KB1013VK12; + + +#endif /* _KB1013VK12_H_ */ diff --git a/src/devices/cpu/sm510/kb1013vk1-2core.cpp b/src/devices/cpu/sm510/kb1013vk1-2core.cpp index ddeeb547b39..a413758e44a 100644 --- a/src/devices/cpu/sm510/kb1013vk1-2core.cpp +++ b/src/devices/cpu/sm510/kb1013vk1-2core.cpp @@ -6,7 +6,7 @@ */ -#include "sm500.h" +#include "kb1013vk1-2.h" #include "debugger.h" // MCU types @@ -19,10 +19,108 @@ static ADDRESS_MAP_START(program_2_7k, AS_PROGRAM, 8, sm510_base_device) ADDRESS_MAP_END static ADDRESS_MAP_START(data_96_32x4, AS_DATA, 8, sm510_base_device) - AM_RANGE(0x00, 0x1f) AM_RAM + AM_RANGE(0x00, 0x0c) AM_RAM + AM_RANGE(0x10, 0x1c) AM_RAM + AM_RANGE(0x20, 0x2c) AM_RAM + AM_RANGE(0x30, 0x3c) AM_RAM + AM_RANGE(0x40, 0x4c) AM_RAM ADDRESS_MAP_END // device definitions kb1013vk12_device::kb1013vk12_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) - : sm500_device(mconfig, KB1013VK12, "KB1013VK1-2", tag, owner, clock, 2 /* stack levels */, 12 /* prg width */, ADDRESS_MAP_NAME(program_2_7k), 7 /* data width */, ADDRESS_MAP_NAME(data_96_32x4), "kb1013vk1-2", __FILE__) + : sm500_device(mconfig, KB1013VK12, "KB1013VK1-2", tag, owner, clock, 1 /* stack levels */, 12 /* prg width */, ADDRESS_MAP_NAME(program_2_7k), 7 /* data width */, ADDRESS_MAP_NAME(data_96_32x4), "kb1013vk1-2", __FILE__) { } + + + +//------------------------------------------------- +// execute +//------------------------------------------------- + +void kb1013vk12_device::execute_one() +{ + switch (m_op & 0xf0) + { + case 0x20: op_lax(); break; + case 0x30: op_adx(); break; + case 0x40: op_lb(); break; + case 0x70: op_ssr(); break; + + case 0x80: case 0x90: case 0xa0: case 0xb0: + op_t(); break; + case 0xc0: case 0xd0: case 0xe0: case 0xf0: + op_trs(); break; + + default: + switch (m_op & 0xfc) + { + case 0x04: op_rm(); break; + case 0x0c: op_sm(); break; + case 0x10: op_exc(); break; + case 0x14: op_exci(); break; + case 0x18: op_lda(); break; + case 0x1c: op_excd(); break; + case 0x54: op_tmi(); break; + + default: + switch (m_op) + { + case 0x00: op_skip(); break; + case 0x01: op_atr(); break; + case 0x02: op_exksa(); break; + case 0x03: op_atbp(); break; + case 0x08: op_add(); break; + case 0x09: op_add11(); break; + case 0x0a: op_coma(); break; + case 0x0b: op_exbla(); break; + + case 0x50: op_tal(); break; + case 0x51: op_tb(); break; + case 0x52: op_tc(); break; + case 0x53: op_tam(); break; + case 0x58: op_tis(); break; + case 0x59: op_ptw(); break; + case 0x5a: op_ta0(); break; + case 0x5b: op_tabl(); break; + case 0x5c: op_tw(); break; + case 0x5d: op_dtw(); break; + case 0x5f: op_lbl(); break; + + case 0x60: op_comcn(); break; + case 0x61: op_pdtw(); break; + case 0x62: op_wr(); break; + case 0x63: op_ws(); break; + case 0x64: op_incb(); break; + case 0x65: op_idiv(); break; + case 0x66: op_rc(); break; + case 0x67: op_sc(); break; + case 0x68: op_rmf(); break; + case 0x69: op_smf(); break; + case 0x6a: op_kta(); break; + case 0x6b: op_exkfa(); break; + case 0x6c: op_decb(); break; + case 0x6d: op_comcb(); break; + case 0x6e: op_rtn0(); break; + case 0x6f: op_rtn1(); break; + + // extended opcodes + case 0x5e: + m_op = m_op << 8 | m_param; + switch (m_param) + { + case 0x00: op_cend(); break; + case 0x04: op_dta(); break; + + default: op_illegal(); break; + } + break; // 0x5e + + default: op_illegal(); break; + } + break; // 0xff + + } + break; // 0xfc + + } // big switch +} diff --git a/src/devices/cpu/sm510/kb1013vk1-2op.cpp b/src/devices/cpu/sm510/kb1013vk1-2op.cpp new file mode 100644 index 00000000000..8d05aacb45f --- /dev/null +++ b/src/devices/cpu/sm510/kb1013vk1-2op.cpp @@ -0,0 +1,9 @@ +// license:BSD-3-Clause +// copyright-holders:hap, Igor + +// KB1013VK1-2 opcode handlers + +#include "kb1013vk1-2.h" + + +// instruction set diff --git a/src/devices/cpu/sm510/sm500.cpp b/src/devices/cpu/sm510/sm500.cpp deleted file mode 100644 index b24953709fc..00000000000 --- a/src/devices/cpu/sm510/sm500.cpp +++ /dev/null @@ -1,8 +0,0 @@ -// license:BSD-3-Clause -// copyright-holders:hap, Igor -/* - -*/ - -#include "sm500.h" -#include "debugger.h" diff --git a/src/devices/cpu/sm510/sm500.h b/src/devices/cpu/sm510/sm500.h index 4896d9f3ff5..aaf083c293a 100644 --- a/src/devices/cpu/sm510/sm500.h +++ b/src/devices/cpu/sm510/sm500.h @@ -1,5 +1,5 @@ // license:BSD-3-Clause -// copyright-holders:hap, Igor +// copyright-holders:hap /* Sharp SM500 MCU family cores @@ -55,35 +55,28 @@ protected: virtual void get_opcode_param() override; // opcode handlers - void op_comcb(); - void op_ssr(); - void op_trs(); - - void op_pdtw(); - void op_tw(); - void op_dtw(); - - void op_ats(); - void op_exksa(); - void op_exkfa(); - - void op_rmf(); - void op_smf(); - void op_comcn(); - - void op_ta(); -}; - - -class kb1013vk12_device : public sm500_device -{ -public: - kb1013vk12_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock); + virtual void op_lb() override; + virtual void op_incb() override; + + virtual void op_comcb(); + virtual void op_ssr(); + virtual void op_trs(); + + virtual void op_pdtw(); + virtual void op_tw(); + virtual void op_dtw(); + + virtual void op_ats(); + virtual void op_exksa(); + virtual void op_exkfa(); + + virtual void op_rmf(); + virtual void op_smf(); + virtual void op_comcn(); }; extern const device_type SM500; -extern const device_type KB1013VK12; #endif /* _SM500_H_ */ diff --git a/src/devices/cpu/sm510/sm500core.cpp b/src/devices/cpu/sm510/sm500core.cpp index 0b8a75f46cd..bb8fff74ddd 100644 --- a/src/devices/cpu/sm510/sm500core.cpp +++ b/src/devices/cpu/sm510/sm500core.cpp @@ -1,5 +1,5 @@ // license:BSD-3-Clause -// copyright-holders:hap, Igor +// copyright-holders:hap /* Sharp SM500 MCU core implementation @@ -20,13 +20,16 @@ static ADDRESS_MAP_START(program_2_7k, AS_PROGRAM, 8, sm510_base_device) ADDRESS_MAP_END static ADDRESS_MAP_START(data_96_32x4, AS_DATA, 8, sm510_base_device) - AM_RANGE(0x00, 0x1f) AM_RAM + AM_RANGE(0x00, 0x09) AM_RAM + AM_RANGE(0x10, 0x19) AM_RAM + AM_RANGE(0x20, 0x29) AM_RAM + AM_RANGE(0x30, 0x39) AM_RAM ADDRESS_MAP_END // device definitions sm500_device::sm500_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) - : sm510_base_device(mconfig, SM500, "SM500", tag, owner, clock, 2 /* stack levels */, 12 /* prg width */, ADDRESS_MAP_NAME(program_2_7k), 7 /* data width */, ADDRESS_MAP_NAME(data_96_32x4), "sm500", __FILE__) + : sm510_base_device(mconfig, SM500, "SM500", tag, owner, clock, 1 /* stack levels */, 12 /* prg width */, ADDRESS_MAP_NAME(program_2_7k), 6 /* data width */, ADDRESS_MAP_NAME(data_96_32x4), "sm500", __FILE__) { } sm500_device::sm500_device(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, UINT32 clock, int stack_levels, int prgwidth, address_map_constructor program, int datawidth, address_map_constructor data, const char *shortname, const char *source) @@ -98,7 +101,7 @@ void sm500_device::execute_one() case 0x0a: op_coma(); break; case 0x0b: op_exbla(); break; - case 0x50: op_ta(); break; + case 0x50: op_tal(); break; // aka ta: test alpha case 0x51: op_tb(); break; case 0x52: op_tc(); break; case 0x53: op_tam(); break; diff --git a/src/devices/cpu/sm510/sm500op.cpp b/src/devices/cpu/sm510/sm500op.cpp index 15d789f7c35..bb0bc6f043b 100644 --- a/src/devices/cpu/sm510/sm500op.cpp +++ b/src/devices/cpu/sm510/sm500op.cpp @@ -1,5 +1,5 @@ // license:BSD-3-Clause -// copyright-holders:hap, Igor +// copyright-holders:hap // SM500 opcode handlers @@ -10,6 +10,21 @@ // RAM address instructions +void sm500_device::op_lb() +{ + // LB x: load BM/BL with 4-bit immediate value (partial) + // BL bit 2 is clearned, bit 3 is param bit 2|3 + m_bm = (m_op & 3); + m_bl = ((m_op << 1 | m_op) & 8) | (m_op >> 2 & 3); +} + +void sm500_device::op_incb() +{ + // INCB: increment BL, skip next on overflow, of 3rd bit! + m_bl = (m_bl + 1) & 0xf; + m_skip = (m_bl == 8); +} + // ROM address instructions @@ -78,6 +93,3 @@ void sm500_device::op_comcn() // Test instructions -void sm500_device::op_ta() -{ -} diff --git a/src/devices/cpu/sm510/sm510.h b/src/devices/cpu/sm510/sm510.h index 8d973ab5de9..54b71077159 100644 --- a/src/devices/cpu/sm510/sm510.h +++ b/src/devices/cpu/sm510/sm510.h @@ -21,7 +21,7 @@ // driver is required to use execute_set_input(SM510_INPUT_LINE_K, state) #define SM510_INPUT_LINE_K 0 -// 1-bit BA input pin (pull-up) +// 1-bit BA(aka alpha) input pin (pull-up) #define MCFG_SM510_READ_BA_CB(_devcb) \ sm510_base_device::set_read_ba_callback(*device, DEVCB_##_devcb); @@ -181,7 +181,7 @@ protected: UINT16 get_lcd_row(int column, UINT8* ram); TIMER_CALLBACK_MEMBER(lcd_timer_cb); - void init_lcd_driver(); + virtual void init_lcd_driver(); // melody controller optional_region_ptr<UINT8> m_melody_rom; @@ -223,70 +223,70 @@ protected: UINT8 bitmask(UINT16 param); // opcode handlers - void op_lb(); - void op_lbl(); - void op_sbm(); - void op_exbla(); - void op_incb(); - void op_decb(); - - void op_atpl(); - void op_rtn0(); - void op_rtn1(); - void op_tl(); - void op_tml(); - void op_tm(); - void op_t(); - - void op_exc(); - void op_bdc(); - void op_exci(); - void op_excd(); - void op_lda(); - void op_lax(); - void op_ptw(); - void op_wr(); - void op_ws(); - - void op_kta(); - void op_atbp(); - void op_atx(); - void op_atl(); - void op_atfc(); - void op_atr(); - - void op_add(); - void op_add11(); - void op_adx(); - void op_coma(); - void op_rot(); - void op_rc(); - void op_sc(); - - void op_tb(); - void op_tc(); - void op_tam(); - void op_tmi(); - void op_ta0(); - void op_tabl(); - void op_tis(); - void op_tal(); - void op_tf1(); - void op_tf4(); - - void op_rm(); - void op_sm(); - - void op_pre(); - void op_sme(); - void op_rme(); - void op_tmel(); - - void op_skip(); - void op_cend(); - void op_idiv(); - void op_dr(); - void op_dta(); + virtual void op_lb(); + virtual void op_lbl(); + virtual void op_sbm(); + virtual void op_exbla(); + virtual void op_incb(); + virtual void op_decb(); + + virtual void op_atpl(); + virtual void op_rtn0(); + virtual void op_rtn1(); + virtual void op_tl(); + virtual void op_tml(); + virtual void op_tm(); + virtual void op_t(); + + virtual void op_exc(); + virtual void op_bdc(); + virtual void op_exci(); + virtual void op_excd(); + virtual void op_lda(); + virtual void op_lax(); + virtual void op_ptw(); + virtual void op_wr(); + virtual void op_ws(); + + virtual void op_kta(); + virtual void op_atbp(); + virtual void op_atx(); + virtual void op_atl(); + virtual void op_atfc(); + virtual void op_atr(); + + virtual void op_add(); + virtual void op_add11(); + virtual void op_adx(); + virtual void op_coma(); + virtual void op_rot(); + virtual void op_rc(); + virtual void op_sc(); + + virtual void op_tb(); + virtual void op_tc(); + virtual void op_tam(); + virtual void op_tmi(); + virtual void op_ta0(); + virtual void op_tabl(); + virtual void op_tis(); + virtual void op_tal(); + virtual void op_tf1(); + virtual void op_tf4(); + + virtual void op_rm(); + virtual void op_sm(); + + virtual void op_pre(); + virtual void op_sme(); + virtual void op_rme(); + virtual void op_tmel(); + + virtual void op_skip(); + virtual void op_cend(); + virtual void op_idiv(); + virtual void op_dr(); + virtual void op_dta(); void op_illegal(); }; |