sm500: start on opcodes

This commit is contained in:
hap 2016-04-11 12:43:34 +02:00
parent a21453fcde
commit d981b66bba
9 changed files with 247 additions and 101 deletions

View File

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

View 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_ */

View File

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

View File

@ -0,0 +1,9 @@
// license:BSD-3-Clause
// copyright-holders:hap, Igor
// KB1013VK1-2 opcode handlers
#include "kb1013vk1-2.h"
// instruction set

View File

@ -1,8 +0,0 @@
// license:BSD-3-Clause
// copyright-holders:hap, Igor
/*
*/
#include "sm500.h"
#include "debugger.h"

View File

@ -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_ */

View File

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

View File

@ -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()
{
}

View File

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