mirror of
https://github.com/holub/mame
synced 2025-06-17 17:59:05 +03:00
sm5*: added sm530 disasm (nw)
This commit is contained in:
parent
e198e9c771
commit
0fae49dc31
@ -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",
|
||||||
|
@ -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);
|
||||||
|
@ -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 ¶ms)
|
||||||
|
{
|
||||||
|
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];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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 ¶ms) 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 ¶ms) override;
|
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 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;
|
||||||
|
|
||||||
|
@ -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
|
||||||
|
49
src/devices/cpu/sm510/sm530.h
Normal file
49
src/devices/cpu/sm510/sm530.h
Normal 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
|
83
src/devices/cpu/sm510/sm530core.cpp
Normal file
83
src/devices/cpu/sm510/sm530core.cpp
Normal 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()
|
||||||
|
{
|
||||||
|
}
|
23
src/devices/cpu/sm510/sm530op.cpp
Normal file
23
src/devices/cpu/sm510/sm530op.cpp
Normal 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
|
@ -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; } },
|
||||||
|
Loading…
Reference in New Issue
Block a user