sm5*: added sm530 disasm (nw)

This commit is contained in:
hap 2018-05-12 17:37:27 +02:00
parent e198e9c771
commit 0fae49dc31
9 changed files with 254 additions and 52 deletions

View File

@ -1984,6 +1984,9 @@ if (CPUS["SM510"]~=null) then
MAME_DIR .. "src/devices/cpu/sm510/sm510op.cpp", MAME_DIR .. "src/devices/cpu/sm510/sm510op.cpp",
MAME_DIR .. "src/devices/cpu/sm510/sm510core.cpp", MAME_DIR .. "src/devices/cpu/sm510/sm510core.cpp",
MAME_DIR .. "src/devices/cpu/sm510/sm511core.cpp", MAME_DIR .. "src/devices/cpu/sm510/sm511core.cpp",
MAME_DIR .. "src/devices/cpu/sm510/sm530.h",
MAME_DIR .. "src/devices/cpu/sm510/sm530op.cpp",
MAME_DIR .. "src/devices/cpu/sm510/sm530core.cpp",
MAME_DIR .. "src/devices/cpu/sm510/sm500.h", MAME_DIR .. "src/devices/cpu/sm510/sm500.h",
MAME_DIR .. "src/devices/cpu/sm510/sm500op.cpp", MAME_DIR .. "src/devices/cpu/sm510/sm500op.cpp",
MAME_DIR .. "src/devices/cpu/sm510/sm500core.cpp", MAME_DIR .. "src/devices/cpu/sm510/sm500core.cpp",

View File

@ -235,8 +235,8 @@ protected:
virtual void get_opcode_param() { } virtual void get_opcode_param() { }
virtual void update_w_latch() { } virtual void update_w_latch() { }
u8 ram_r(); virtual u8 ram_r();
void ram_w(u8 data); virtual void ram_w(u8 data);
void pop_stack(); void pop_stack();
void push_stack(); void push_stack();
virtual void do_branch(u8 pu, u8 pm, u8 pl); virtual void do_branch(u8 pu, u8 pm, u8 pl);

View File

@ -14,6 +14,7 @@
const char *const sm510_common_disassembler::s_mnemonics[] = const char *const sm510_common_disassembler::s_mnemonics[] =
{ {
// SM510
"?", "", "?", "",
"LB", "LBL", "SBM", "EXBLA", "INCB", "DECB", "LB", "LBL", "SBM", "EXBLA", "INCB", "DECB",
"ATPL", "RTN0", "RTN1", "TL", "TML", "TM", "T", "ATPL", "RTN0", "RTN1", "TL", "TML", "TM", "T",
@ -25,22 +26,29 @@ const char *const sm510_common_disassembler::s_mnemonics[] =
"PRE", "SME", "RME", "TMEL", "PRE", "SME", "RME", "TMEL",
"SKIP", "CEND", "IDIV", "DR", "DTA", "CLKLO", "CLKHI", "SKIP", "CEND", "IDIV", "DR", "DTA", "CLKLO", "CLKHI",
// // SM500
"COMCB", "RTN", "RTNS", "SSR", "TR", "TRS", "RBM", "COMCB", "RTN", "RTNS", "SSR", "TR", "TRS", "RBM",
"ADDC", "PDTW", "TW", "DTW", "ADDC", "PDTW", "TW", "DTW",
"ATS", "EXKSA", "EXKFA", "ATS", "EXKSA", "EXKFA",
"RMF", "SMF", "COMCN", "RMF", "SMF", "COMCN",
"TA", "TM", "TG", "TA", "TM", "TG",
// // SM530
"SABM", "SABL", "EXBL",
"TG", "TBA",
"KETA", "ATF", "SDS", "RDS",
"INIS",
// SM590
"NOP", "CCTRL", "INBL", "DEBL", "XBLA", "ADCS", "TR", "NOP", "CCTRL", "INBL", "DEBL", "XBLA", "ADCS", "TR",
// // "
"TAX", "LBLX", "MTR", "STR", "INBM", "DEBM", "RTA", "BLTA", "EXAX", "TBA", "ADS", "ADC", "LBMX", "TLS" "TAX", "LBLX", "MTR", "STR", "INBM", "DEBM", "RTA", "BLTA", "EXAX", "TBA", "ADS", "ADC", "LBMX", "TLS"
}; };
// number of bits per opcode parameter, 8 or larger means 2-byte opcode // number of bits per opcode parameter, 8 or larger means 2-byte opcode
const u8 sm510_common_disassembler::s_bits[] = const u8 sm510_common_disassembler::s_bits[] =
{ {
// SM510
0, 8, 0, 8,
4, 8, 0, 0, 0, 0, 4, 8, 0, 0, 0, 0,
0, 0, 0, 4+8, 2+8, 6, 6, 0, 0, 0, 4+8, 2+8, 6, 6,
@ -52,21 +60,28 @@ const u8 sm510_common_disassembler::s_bits[] =
8, 0, 0, 0, 8, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
// // SM500
0, 0, 0, 4, 6, 6, 0, 0, 0, 0, 4, 6, 6, 0,
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0,
0, 2, 0, 0, 2, 0,
// // SM530
0, 0, 0,
2, 0,
0, 0, 0, 0,
0,
// SM590
0, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 7,
// // "
4, 4, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 2, 2+8 4, 4, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 2, 2+8
}; };
const u32 sm510_common_disassembler::s_flags[] = const u32 sm510_common_disassembler::s_flags[] =
{ {
// SM510
0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, STEP_OUT, STEP_OUT, 0, STEP_OVER, STEP_OVER, 0, 0, STEP_OUT, STEP_OUT, 0, STEP_OVER, STEP_OVER, 0,
@ -78,16 +93,22 @@ const u32 sm510_common_disassembler::s_flags[] =
0, 0, 0, 0, 0, 0, 0, 0,
0, STEP_OVER, 0, 0, 0, 0, 0, 0, STEP_OVER, 0, 0, 0, 0, 0,
// // SM500
0, STEP_OUT, STEP_OUT, 0, 0, STEP_OVER, 0, 0, STEP_OUT, STEP_OUT, 0, 0, STEP_OVER, 0,
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0,
// // SM530
0, 0, 0,
0, 0,
0, 0, 0, 0,
0,
// SM590
0, 0, 0, 0, 0, 0, STEP_OVER, 0, 0, 0, 0, 0, 0, STEP_OVER,
// // "
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, STEP_OVER 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, STEP_OVER
}; };
@ -150,7 +171,7 @@ offs_t sm510_common_disassembler::common_disasm(const u8 *lut_mnemonic, const u8
} }
} }
return len | s_flags[instr] |SUPPORTED; return len | s_flags[instr] | SUPPORTED;
} }
@ -312,6 +333,38 @@ offs_t sm5a_disassembler::disassemble(std::ostream &stream, offs_t pc, const dat
} }
// SM530 disasm
const u8 sm530_disassembler::sm530_mnemonic[0x100] =
{
/* 0 1 2 3 4 5 6 7 8 9 A B C D E F */
mADX, mADX, mADX, mADX, mADX, mADX, mADX, mADX, mADX, mADX, mADX, mADX, mADX, mADX, mADX, mADX, // 0 - note: $00 has synonym SKIP
mLAX, mLAX, mLAX, mLAX, mLAX, mLAX, mLAX, mLAX, mLAX, mLAX, mLAX, mLAX, mLAX, mLAX, mLAX, mLAX, // 1
mLDA, mLDA, mLDA, mLDA, mEXC, mEXC, mEXC, mEXC, mEXCI, mEXCI, mEXCI, mEXCI, mEXCD, mEXCD, mEXCD, mEXCD, // 2
mLB, mLB, mLB, mLB, mLB, mLB, mLB, mLB, mLB, mLB, mLB, mLB, mLB, mLB, mLB, mLB, // 3
mRM, mRM, mRM, mRM, mSM, mSM, mSM, mSM, mTM2, mTM2, mTM2, mTM2, mINCB, mDECB, mRDS, mSDS, // 4
mKTA, mKETA, mDTA, mCOMA, mADD, mADDC, mRC, mSC, mTABL, mTAM, mEXBL, mTC, mATS, mATF, mATBP, 0, // 5
mTL, mTL, mTL, mTL, mTL, mTL, mTL, mTL, mRTN, mRTNS, mATPL, mLBL, mTG2, mTG2, mTG2, mTG2, // 6
mIDIV, mINIS, mSABM, mSABL, mCEND, mTMEL, mRME, mSME, mPRE, mTBA, 0, 0, 0, 0, 0, 0, // 7
mTR, mTR, mTR, mTR, mTR, mTR, mTR, mTR, mTR, mTR, mTR, mTR, mTR, mTR, mTR, mTR, // 8
mTR, mTR, mTR, mTR, mTR, mTR, mTR, mTR, mTR, mTR, mTR, mTR, mTR, mTR, mTR, mTR, // 9
mTR, mTR, mTR, mTR, mTR, mTR, mTR, mTR, mTR, mTR, mTR, mTR, mTR, mTR, mTR, mTR, // A
mTR, mTR, mTR, mTR, mTR, mTR, mTR, mTR, mTR, mTR, mTR, mTR, mTR, mTR, mTR, mTR, // B
mTRS, mTRS, mTRS, mTRS, mTRS, mTRS, mTRS, mTRS, mTRS, mTRS, mTRS, mTRS, mTRS, mTRS, mTRS, mTRS, // C
mTRS, mTRS, mTRS, mTRS, mTRS, mTRS, mTRS, mTRS, mTRS, mTRS, mTRS, mTRS, mTRS, mTRS, mTRS, mTRS, // D
mTRS, mTRS, mTRS, mTRS, mTRS, mTRS, mTRS, mTRS, mTRS, mTRS, mTRS, mTRS, mTRS, mTRS, mTRS, mTRS, // E
mTRS, mTRS, mTRS, mTRS, mTRS, mTRS, mTRS, mTRS, mTRS, mTRS, mTRS, mTRS, mTRS, mTRS, mTRS, mTRS // F
};
offs_t sm530_disassembler::disassemble(std::ostream &stream, offs_t pc, const data_buffer &opcodes, const data_buffer &params)
{
return common_disasm(sm530_mnemonic, nullptr, stream, pc, opcodes, params, 6);
}
// SM590 disasm // SM590 disasm
const u8 sm590_disassembler::sm590_mnemonic[0x100] = const u8 sm590_disassembler::sm590_mnemonic[0x100] =
@ -324,7 +377,7 @@ const u8 sm590_disassembler::sm590_mnemonic[0x100] =
mLDA, mEXC, mEXCI, mEXCD, mCOMA, mTAM, mATR, mMTR, mRC, mSC, mSTR, mCCTRL,mRTN, mRTNS, 0, 0, // 4 mLDA, mEXC, mEXCI, mEXCD, mCOMA, mTAM, mATR, mMTR, mRC, mSC, mSTR, mCCTRL,mRTN, mRTNS, 0, 0, // 4
mINBM, mDEBM, mINBL, mDEBL, mTC, mRTA, mBLTA, mXBLA, 0, 0, 0, 0, mATX, mEXAX, 0, 0, // 5 mINBM, mDEBM, mINBL, mDEBL, mTC, mRTA, mBLTA, mXBLA, 0, 0, 0, 0, mATX, mEXAX, 0, 0, // 5
mTMI, mTMI, mTMI, mTMI, mTBA, mTBA, mTBA, mTBA, mRM, mRM, mRM, mRM, mSM, mSM, mSM, mSM, // 6 mTMI, mTMI, mTMI, mTMI, mTBA2, mTBA2, mTBA2, mTBA2, mRM, mRM, mRM, mRM, mSM, mSM, mSM, mSM, // 6
mADD, mADS, mADC, mADCS, mLBMX, mLBMX, mLBMX, mLBMX, mTL, mTL, mTL, mTL, mTLS, mTLS, mTLS, mTLS, // 7 mADD, mADS, mADC, mADCS, mLBMX, mLBMX, mLBMX, mLBMX, mTL, mTL, mTL, mTL, mTLS, mTLS, mTLS, mTLS, // 7
mTR7, mTR7, mTR7, mTR7, mTR7, mTR7, mTR7, mTR7, mTR7, mTR7, mTR7, mTR7, mTR7, mTR7, mTR7, mTR7, // 8 mTR7, mTR7, mTR7, mTR7, mTR7, mTR7, mTR7, mTR7, mTR7, mTR7, mTR7, mTR7, mTR7, mTR7, mTR7, mTR7, // 8
@ -344,25 +397,8 @@ offs_t sm590_disassembler::disassemble(std::ostream &stream, offs_t pc, const da
return common_disasm(sm590_mnemonic, nullptr, stream, pc, opcodes, params, 7); return common_disasm(sm590_mnemonic, nullptr, stream, pc, opcodes, params, 7);
} }
u32 sm510_common_disassembler::opcode_alignment() const
{
return 1;
}
u32 sm510_common_disassembler::interface_flags() const // Sarayan's little helpers
{
return NONLINEAR_PC|PAGED2LEVEL;
}
u32 sm510_common_disassembler::page_address_bits() const
{
return 6;
}
u32 sm510_common_disassembler::page2_address_bits() const
{
return 4;
}
offs_t sm510_common_disassembler::pc_linear_to_real(offs_t pc) const offs_t sm510_common_disassembler::pc_linear_to_real(offs_t pc) const
{ {
@ -386,16 +422,6 @@ offs_t sm510_common_disassembler::pc_real_to_linear(offs_t pc) const
return (pc & ~0x3f) | r2l[pc & 0x3f]; return (pc & ~0x3f) | r2l[pc & 0x3f];
} }
u32 sm590_disassembler::page_address_bits() const
{
return 7;
}
u32 sm590_disassembler::page2_address_bits() const
{
return 2;
}
offs_t sm590_disassembler::pc_linear_to_real(offs_t pc) const offs_t sm590_disassembler::pc_linear_to_real(offs_t pc) const
{ {
static const u8 l2r[128] = { static const u8 l2r[128] = {
@ -425,4 +451,3 @@ offs_t sm590_disassembler::pc_real_to_linear(offs_t pc) const
}; };
return (pc & ~0x7f) | r2l[pc & 0x7f]; return (pc & ~0x7f) | r2l[pc & 0x7f];
} }

View File

@ -17,10 +17,10 @@ public:
sm510_common_disassembler() = default; sm510_common_disassembler() = default;
virtual ~sm510_common_disassembler() = default; virtual ~sm510_common_disassembler() = default;
virtual u32 opcode_alignment() const override; virtual u32 opcode_alignment() const override { return 1; }
virtual u32 interface_flags() const override; virtual u32 interface_flags() const override { return NONLINEAR_PC | PAGED2LEVEL; }
virtual u32 page_address_bits() const override; virtual u32 page_address_bits() const override { return 6; }
virtual u32 page2_address_bits() const override; virtual u32 page2_address_bits() const override { return 4; }
virtual offs_t pc_linear_to_real(offs_t pc) const override; virtual offs_t pc_linear_to_real(offs_t pc) const override;
virtual offs_t pc_real_to_linear(offs_t pc) const override; virtual offs_t pc_real_to_linear(offs_t pc) const override;
@ -46,10 +46,16 @@ protected:
mRMF, mSMF, mCOMCN, mRMF, mSMF, mCOMCN,
mTA, mTM2, mTG, mTA, mTM2, mTG,
// SM530 common
mSABM, mSABL, mEXBL,
mTG2, mTBA,
mKETA, mATF, mSDS, mRDS,
mINIS,
// SM590 aliases // SM590 aliases
mNOP, mCCTRL, mINBL, mDEBL, mXBLA, mADCS, mTR7, mNOP, mCCTRL, mINBL, mDEBL, mXBLA, mADCS, mTR7,
// SM590 uniques // SM590 uniques
mTAX, mLBLX, mMTR, mSTR, mINBM, mDEBM, mRTA, mBLTA, mEXAX, mTBA, mADS, mADC, mLBMX, mTLS mTAX, mLBLX, mMTR, mSTR, mINBM, mDEBM, mRTA, mBLTA, mEXAX, mTBA2, mADS, mADC, mLBMX, mTLS
}; };
static const char *const s_mnemonics[]; static const char *const s_mnemonics[];
@ -111,6 +117,18 @@ private:
static const u8 sm5a_extended[0x10]; static const u8 sm5a_extended[0x10];
}; };
class sm530_disassembler : public sm510_common_disassembler
{
public:
sm530_disassembler() = default;
virtual ~sm530_disassembler() = default;
virtual offs_t disassemble(std::ostream &stream, offs_t pc, const data_buffer &opcodes, const data_buffer &params) override;
private:
static const u8 sm530_mnemonic[0x100];
};
class sm590_disassembler : public sm510_common_disassembler class sm590_disassembler : public sm510_common_disassembler
{ {
public: public:
@ -119,8 +137,8 @@ public:
virtual offs_t disassemble(std::ostream &stream, offs_t pc, const data_buffer &opcodes, const data_buffer &params) override; virtual offs_t disassemble(std::ostream &stream, offs_t pc, const data_buffer &opcodes, const data_buffer &params) override;
virtual u32 page_address_bits() const override; virtual u32 page_address_bits() const override { return 7; }
virtual u32 page2_address_bits() const override; virtual u32 page2_address_bits() const override { return 2; }
virtual offs_t pc_linear_to_real(offs_t pc) const override; virtual offs_t pc_linear_to_real(offs_t pc) const override;
virtual offs_t pc_real_to_linear(offs_t pc) const override; virtual offs_t pc_real_to_linear(offs_t pc) const override;

View File

@ -5,7 +5,7 @@
Sharp SM511 MCU core implementation Sharp SM511 MCU core implementation
TODO: TODO:
- undocumented/guessed opcodes: - verify undocumented/guessed opcodes:
* $01 is guessed as DIV to ACC transfer, unknown which bits * $01 is guessed as DIV to ACC transfer, unknown which bits
* $5d is certainly CEND * $5d is certainly CEND
* $65 is certainly divider reset, but not sure if it behaves same as on SM510 * $65 is certainly divider reset, but not sure if it behaves same as on SM510

View File

@ -0,0 +1,49 @@
// license:BSD-3-Clause
// copyright-holders:hap
/*
Sharp SM530 MCU family cores
*/
#ifndef MAME_CPU_SM510_SM530_H
#define MAME_CPU_SM510_SM530_H
#pragma once
#include "sm510.h"
class sm530_device : public sm511_device
{
public:
sm530_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock = 32768);
protected:
sm530_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, u32 clock, int stack_levels, int prgwidth, address_map_constructor program, int datawidth, address_map_constructor data);
void program_2k(address_map &map);
void data_64_24x4(address_map &map);
virtual void device_reset() override;
virtual std::unique_ptr<util::disasm_interface> create_disassembler() override;
virtual void execute_one() override;
virtual void get_opcode_param() override;
virtual u8 ram_r() override;
virtual void ram_w(u8 data) override;
};
class sm531_device : public sm530_device
{
public:
sm531_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock = 32768);
};
DECLARE_DEVICE_TYPE(SM530, sm530_device)
DECLARE_DEVICE_TYPE(SM531, sm531_device)
#endif // MAME_CPU_SM510_SM530_H

View File

@ -0,0 +1,83 @@
// license:BSD-3-Clause
// copyright-holders:hap
/*
Sharp SM530 MCU core implementation
TODO:
- everything
*/
#include "emu.h"
#include "sm530.h"
#include "sm510d.h"
#include "debugger.h"
// MCU types
DEFINE_DEVICE_TYPE(SM530, sm530_device, "sm530", "Sharp SM530") // x
DEFINE_DEVICE_TYPE(SM531, sm531_device, "sm531", "Sharp SM531") // x
// internal memory maps
void sm530_device::program_2k(address_map &map)
{
map(0x000, 0x7ff).rom();
}
void sm530_device::data_64_24x4(address_map &map)
{
map(0x00, 0x3f).ram();
map(0x40, 0x4b).ram();
map(0x50, 0x5b).ram();
}
// disasm
std::unique_ptr<util::disasm_interface> sm530_device::create_disassembler()
{
return std::make_unique<sm530_disassembler>();
}
// device definitions
sm530_device::sm530_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock)
: sm530_device(mconfig, SM530, tag, owner, clock, 1 /* stack levels */, 11 /* prg width */, address_map_constructor(FUNC(sm530_device::program_2k), this), 7 /* data width */, address_map_constructor(FUNC(sm530_device::data_64_24x4), this))
{
}
sm530_device::sm530_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, u32 clock, int stack_levels, int prgwidth, address_map_constructor program, int datawidth, address_map_constructor data)
: sm511_device(mconfig, type, tag, owner, clock, stack_levels, prgwidth, program, datawidth, data)
{
}
sm531_device::sm531_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock)
: sm530_device(mconfig, SM531, tag, owner, clock, 1, 11, address_map_constructor(FUNC(sm531_device::program_2k), this), 7, address_map_constructor(FUNC(sm531_device::data_64_24x4), this))
{
}
//-------------------------------------------------
// device_reset - device-specific reset
//-------------------------------------------------
void sm530_device::device_reset()
{
sm510_base_device::device_reset();
}
//-------------------------------------------------
// execute
//-------------------------------------------------
void sm530_device::get_opcode_param()
{
}
void sm530_device::execute_one()
{
}

View File

@ -0,0 +1,23 @@
// license:BSD-3-Clause
// copyright-holders:hap
// SM530 shared opcode handlers
#include "emu.h"
#include "sm530.h"
// internal helpers
u8 sm530_device::ram_r()
{
return 0;
}
void sm530_device::ram_w(u8 data)
{
}
// instruction set

View File

@ -434,6 +434,7 @@ static const dasm_table_entry dasm_table[] =
{ "sm500", le, 0, []() -> util::disasm_interface * { return new sm500_disassembler; } }, { "sm500", le, 0, []() -> util::disasm_interface * { return new sm500_disassembler; } },
{ "sm510", le, 0, []() -> util::disasm_interface * { return new sm510_disassembler; } }, { "sm510", le, 0, []() -> util::disasm_interface * { return new sm510_disassembler; } },
{ "sm511", le, 0, []() -> util::disasm_interface * { return new sm511_disassembler; } }, { "sm511", le, 0, []() -> util::disasm_interface * { return new sm511_disassembler; } },
{ "sm530", le, 0, []() -> util::disasm_interface * { return new sm530_disassembler; } },
{ "sm590", le, 0, []() -> util::disasm_interface * { return new sm590_disassembler; } }, { "sm590", le, 0, []() -> util::disasm_interface * { return new sm590_disassembler; } },
{ "sm5a", le, 0, []() -> util::disasm_interface * { return new sm5a_disassembler; } }, { "sm5a", le, 0, []() -> util::disasm_interface * { return new sm5a_disassembler; } },
{ "sm8500", le, 0, []() -> util::disasm_interface * { return new sm8500_disassembler; } }, { "sm8500", le, 0, []() -> util::disasm_interface * { return new sm8500_disassembler; } },