diff options
author | hap <happppp@users.noreply.github.com> | 2018-05-12 17:37:27 +0200 |
---|---|---|
committer | hap <happppp@users.noreply.github.com> | 2018-05-12 17:37:41 +0200 |
commit | 0fae49dc3136d03736b7ca0f96d739cbc2834666 (patch) | |
tree | a3552fc6b0e8b2babc60d2dbe8d8e80410c1bc7d /src/devices/cpu | |
parent | e198e9c771d380b543283f97ad60e084ce4ce5a7 (diff) |
sm5*: added sm530 disasm (nw)
Diffstat (limited to 'src/devices/cpu')
-rw-r--r-- | src/devices/cpu/sm510/sm510.h | 4 | ||||
-rw-r--r-- | src/devices/cpu/sm510/sm510d.cpp | 105 | ||||
-rw-r--r-- | src/devices/cpu/sm510/sm510d.h | 32 | ||||
-rw-r--r-- | src/devices/cpu/sm510/sm511core.cpp | 6 | ||||
-rw-r--r-- | src/devices/cpu/sm510/sm530.h | 49 | ||||
-rw-r--r-- | src/devices/cpu/sm510/sm530core.cpp | 83 | ||||
-rw-r--r-- | src/devices/cpu/sm510/sm530op.cpp | 23 |
7 files changed, 250 insertions, 52 deletions
diff --git a/src/devices/cpu/sm510/sm510.h b/src/devices/cpu/sm510/sm510.h index 0d8cf983412..69521f8de4d 100644 --- a/src/devices/cpu/sm510/sm510.h +++ b/src/devices/cpu/sm510/sm510.h @@ -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); diff --git a/src/devices/cpu/sm510/sm510d.cpp b/src/devices/cpu/sm510/sm510d.cpp index 186efde5cbc..5f107babd4c 100644 --- a/src/devices/cpu/sm510/sm510d.cpp +++ b/src/devices/cpu/sm510/sm510d.cpp @@ -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 ¶ms) +{ + 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]; } - diff --git a/src/devices/cpu/sm510/sm510d.h b/src/devices/cpu/sm510/sm510d.h index 899b8815334..a29a1f201a0 100644 --- a/src/devices/cpu/sm510/sm510d.h +++ b/src/devices/cpu/sm510/sm510d.h @@ -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 ¶ms) 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 ¶ms) 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; diff --git a/src/devices/cpu/sm510/sm511core.cpp b/src/devices/cpu/sm510/sm511core.cpp index 6ad8eada0e4..6585f18febf 100644 --- a/src/devices/cpu/sm510/sm511core.cpp +++ b/src/devices/cpu/sm510/sm511core.cpp @@ -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)) { } diff --git a/src/devices/cpu/sm510/sm530.h b/src/devices/cpu/sm510/sm530.h new file mode 100644 index 00000000000..64e03884481 --- /dev/null +++ b/src/devices/cpu/sm510/sm530.h @@ -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 diff --git a/src/devices/cpu/sm510/sm530core.cpp b/src/devices/cpu/sm510/sm530core.cpp new file mode 100644 index 00000000000..1a1b00b392f --- /dev/null +++ b/src/devices/cpu/sm510/sm530core.cpp @@ -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() +{ +} diff --git a/src/devices/cpu/sm510/sm530op.cpp b/src/devices/cpu/sm510/sm530op.cpp new file mode 100644 index 00000000000..256feccdb4b --- /dev/null +++ b/src/devices/cpu/sm510/sm530op.cpp @@ -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 |