summaryrefslogtreecommitdiffstatshomepage
path: root/src/devices/cpu
diff options
context:
space:
mode:
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
commit0fae49dc3136d03736b7ca0f96d739cbc2834666 (patch)
treea3552fc6b0e8b2babc60d2dbe8d8e80410c1bc7d /src/devices/cpu
parente198e9c771d380b543283f97ad60e084ce4ce5a7 (diff)
sm5*: added sm530 disasm (nw)
Diffstat (limited to 'src/devices/cpu')
-rw-r--r--src/devices/cpu/sm510/sm510.h4
-rw-r--r--src/devices/cpu/sm510/sm510d.cpp105
-rw-r--r--src/devices/cpu/sm510/sm510d.h32
-rw-r--r--src/devices/cpu/sm510/sm511core.cpp6
-rw-r--r--src/devices/cpu/sm510/sm530.h49
-rw-r--r--src/devices/cpu/sm510/sm530core.cpp83
-rw-r--r--src/devices/cpu/sm510/sm530op.cpp23
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 &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];
}
-
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 &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;
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