mirror of
https://github.com/holub/mame
synced 2025-07-03 09:06:08 +03:00
sm500: start on opcodes
This commit is contained in:
parent
a21453fcde
commit
d981b66bba
@ -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
|
||||
|
38
src/devices/cpu/sm510/kb1013vk1-2.h
Normal file
38
src/devices/cpu/sm510/kb1013vk1-2.h
Normal file
@ -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_ */
|
@ -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
|
||||
}
|
||||
|
9
src/devices/cpu/sm510/kb1013vk1-2op.cpp
Normal file
9
src/devices/cpu/sm510/kb1013vk1-2op.cpp
Normal file
@ -0,0 +1,9 @@
|
||||
// license:BSD-3-Clause
|
||||
// copyright-holders:hap, Igor
|
||||
|
||||
// KB1013VK1-2 opcode handlers
|
||||
|
||||
#include "kb1013vk1-2.h"
|
||||
|
||||
|
||||
// instruction set
|
@ -1,8 +0,0 @@
|
||||
// license:BSD-3-Clause
|
||||
// copyright-holders:hap, Igor
|
||||
/*
|
||||
|
||||
*/
|
||||
|
||||
#include "sm500.h"
|
||||
#include "debugger.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();
|
||||
virtual void op_lb() override;
|
||||
virtual void op_incb() override;
|
||||
|
||||
virtual void op_comcb();
|
||||
virtual void op_ssr();
|
||||
virtual void op_trs();
|
||||
|
||||
void op_pdtw();
|
||||
void op_tw();
|
||||
void op_dtw();
|
||||
virtual void op_pdtw();
|
||||
virtual void op_tw();
|
||||
virtual void op_dtw();
|
||||
|
||||
void op_ats();
|
||||
void op_exksa();
|
||||
void op_exkfa();
|
||||
virtual void op_ats();
|
||||
virtual void op_exksa();
|
||||
virtual 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_rmf();
|
||||
virtual void op_smf();
|
||||
virtual void op_comcn();
|
||||
};
|
||||
|
||||
|
||||
extern const device_type SM500;
|
||||
extern const device_type KB1013VK12;
|
||||
|
||||
|
||||
#endif /* _SM500_H_ */
|
||||
|
@ -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;
|
||||
|
@ -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()
|
||||
{
|
||||
}
|
||||
|
@ -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();
|
||||
virtual void op_lb();
|
||||
virtual void op_lbl();
|
||||
virtual void op_sbm();
|
||||
virtual void op_exbla();
|
||||
virtual void op_incb();
|
||||
virtual void op_decb();
|
||||
|
||||
void op_atpl();
|
||||
void op_rtn0();
|
||||
void op_rtn1();
|
||||
void op_tl();
|
||||
void op_tml();
|
||||
void op_tm();
|
||||
void op_t();
|
||||
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();
|
||||
|
||||
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();
|
||||
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();
|
||||
|
||||
void op_kta();
|
||||
void op_atbp();
|
||||
void op_atx();
|
||||
void op_atl();
|
||||
void op_atfc();
|
||||
void op_atr();
|
||||
virtual void op_kta();
|
||||
virtual void op_atbp();
|
||||
virtual void op_atx();
|
||||
virtual void op_atl();
|
||||
virtual void op_atfc();
|
||||
virtual void op_atr();
|
||||
|
||||
void op_add();
|
||||
void op_add11();
|
||||
void op_adx();
|
||||
void op_coma();
|
||||
void op_rot();
|
||||
void op_rc();
|
||||
void op_sc();
|
||||
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();
|
||||
|
||||
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();
|
||||
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();
|
||||
|
||||
void op_rm();
|
||||
void op_sm();
|
||||
virtual void op_rm();
|
||||
virtual void op_sm();
|
||||
|
||||
void op_pre();
|
||||
void op_sme();
|
||||
void op_rme();
|
||||
void op_tmel();
|
||||
virtual void op_pre();
|
||||
virtual void op_sme();
|
||||
virtual void op_rme();
|
||||
virtual void op_tmel();
|
||||
|
||||
void op_skip();
|
||||
void op_cend();
|
||||
void op_idiv();
|
||||
void op_dr();
|
||||
void op_dta();
|
||||
virtual void op_skip();
|
||||
virtual void op_cend();
|
||||
virtual void op_idiv();
|
||||
virtual void op_dr();
|
||||
virtual void op_dta();
|
||||
|
||||
void op_illegal();
|
||||
};
|
||||
|
Loading…
Reference in New Issue
Block a user