summaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
-rw-r--r--scripts/src/cpu.lua3
-rw-r--r--src/devices/cpu/sm510/kb1013vk1-2.h38
-rw-r--r--src/devices/cpu/sm510/kb1013vk1-2core.cpp104
-rw-r--r--src/devices/cpu/sm510/kb1013vk1-2op.cpp9
-rw-r--r--src/devices/cpu/sm510/sm500.cpp8
-rw-r--r--src/devices/cpu/sm510/sm500.h45
-rw-r--r--src/devices/cpu/sm510/sm500core.cpp11
-rw-r--r--src/devices/cpu/sm510/sm500op.cpp20
-rw-r--r--src/devices/cpu/sm510/sm510.h132
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();
};