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/sm510core.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/sm500op.cpp",
MAME_DIR .. "src/devices/cpu/sm510/sm500core.cpp",

View File

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

View File

@ -14,6 +14,7 @@
const char *const sm510_common_disassembler::s_mnemonics[] =
{
// SM510
"?", "",
"LB", "LBL", "SBM", "EXBLA", "INCB", "DECB",
"ATPL", "RTN0", "RTN1", "TL", "TML", "TM", "T",
@ -25,22 +26,29 @@ const char *const sm510_common_disassembler::s_mnemonics[] =
"PRE", "SME", "RME", "TMEL",
"SKIP", "CEND", "IDIV", "DR", "DTA", "CLKLO", "CLKHI",
//
// SM500
"COMCB", "RTN", "RTNS", "SSR", "TR", "TRS", "RBM",
"ADDC", "PDTW", "TW", "DTW",
"ATS", "EXKSA", "EXKFA",
"RMF", "SMF", "COMCN",
"TA", "TM", "TG",
//
// SM530
"SABM", "SABL", "EXBL",
"TG", "TBA",
"KETA", "ATF", "SDS", "RDS",
"INIS",
// SM590
"NOP", "CCTRL", "INBL", "DEBL", "XBLA", "ADCS", "TR",
//
// "
"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
const u8 sm510_common_disassembler::s_bits[] =
{
// SM510
0, 8,
4, 8, 0, 0, 0, 0,
0, 0, 0, 4+8, 2+8, 6, 6,
@ -52,21 +60,28 @@ const u8 sm510_common_disassembler::s_bits[] =
8, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0,
//
// SM500
0, 0, 0, 4, 6, 6, 0,
0, 0, 0, 0,
0, 0, 0,
0, 0, 0,
0, 2, 0,
//
// SM530
0, 0, 0,
2, 0,
0, 0, 0, 0,
0,
// SM590
0, 0, 0, 0, 0, 0, 7,
//
// "
4, 4, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 2, 2+8
};
const u32 sm510_common_disassembler::s_flags[] =
{
// SM510
0, 0,
0, 0, 0, 0, 0, 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, STEP_OVER, 0, 0, 0, 0, 0,
//
// SM500
0, STEP_OUT, STEP_OUT, 0, 0, STEP_OVER, 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, 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
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
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
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);
}
u32 sm510_common_disassembler::opcode_alignment() const
{
return 1;
}
u32 sm510_common_disassembler::interface_flags() const
{
return NONLINEAR_PC|PAGED2LEVEL;
}
u32 sm510_common_disassembler::page_address_bits() const
{
return 6;
}
u32 sm510_common_disassembler::page2_address_bits() const
{
return 4;
}
// Sarayan's little helpers
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];
}
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
{
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];
}

View File

@ -17,10 +17,10 @@ public:
sm510_common_disassembler() = default;
virtual ~sm510_common_disassembler() = default;
virtual u32 opcode_alignment() const override;
virtual u32 interface_flags() const override;
virtual u32 page_address_bits() const override;
virtual u32 page2_address_bits() const override;
virtual u32 opcode_alignment() const override { return 1; }
virtual u32 interface_flags() const override { return NONLINEAR_PC | PAGED2LEVEL; }
virtual u32 page_address_bits() const override { return 6; }
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_real_to_linear(offs_t pc) const override;
@ -46,10 +46,16 @@ protected:
mRMF, mSMF, mCOMCN,
mTA, mTM2, mTG,
// SM530 common
mSABM, mSABL, mEXBL,
mTG2, mTBA,
mKETA, mATF, mSDS, mRDS,
mINIS,
// SM590 aliases
mNOP, mCCTRL, mINBL, mDEBL, mXBLA, mADCS, mTR7,
// 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[];
@ -111,6 +117,18 @@ private:
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
{
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 u32 page_address_bits() const override;
virtual u32 page2_address_bits() const override;
virtual u32 page_address_bits() const override { return 7; }
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_real_to_linear(offs_t pc) const override;

View File

@ -5,7 +5,7 @@
Sharp SM511 MCU core implementation
TODO:
- undocumented/guessed opcodes:
- verify undocumented/guessed opcodes:
* $01 is guessed as DIV to ACC transfer, unknown which bits
* $5d is certainly CEND
* $65 is certainly divider reset, but not sure if it behaves same as on SM510
@ -55,7 +55,7 @@ std::unique_ptr<util::disasm_interface> sm511_device::create_disassembler()
// device definitions
sm511_device::sm511_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock)
: sm511_device(mconfig, SM511, tag, owner, clock, 2 /* stack levels */, 12 /* prg width */, address_map_constructor(FUNC(sm511_device::program_4k), this), 7 /* data width */, address_map_constructor(FUNC(sm511_device::data_96_32x4), this))
: sm511_device(mconfig, SM511, tag, owner, clock, 2 /* stack levels */, 12 /* prg width */, address_map_constructor(FUNC(sm511_device::program_4k), this), 7 /* data width */, address_map_constructor(FUNC(sm511_device::data_96_32x4), this))
{
}
@ -65,7 +65,7 @@ sm511_device::sm511_device(const machine_config &mconfig, device_type type, cons
}
sm512_device::sm512_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock)
: sm511_device(mconfig, SM512, tag, owner, clock, 2, 12, address_map_constructor(FUNC(sm512_device::program_4k), this), 7, address_map_constructor(FUNC(sm512_device::data_80_48x4), this))
: sm511_device(mconfig, SM512, tag, owner, clock, 2, 12, address_map_constructor(FUNC(sm512_device::program_4k), this), 7, address_map_constructor(FUNC(sm512_device::data_80_48x4), this))
{
}

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; } },
{ "sm510", le, 0, []() -> util::disasm_interface * { return new sm510_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; } },
{ "sm5a", le, 0, []() -> util::disasm_interface * { return new sm5a_disassembler; } },
{ "sm8500", le, 0, []() -> util::disasm_interface * { return new sm8500_disassembler; } },