summaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
author hap <happppp@users.noreply.github.com>2015-07-01 01:03:12 +0200
committer hap <happppp@users.noreply.github.com>2015-07-01 01:03:12 +0200
commitae0fd9f1a54e4f91f01660bbcc5eafe7d87198fb (patch)
treedff604c970945b012e28cc1e87ed14950625a76f
parentbfe59caac5eb3e52d231298a134d3f07b8b708ea (diff)
added sm510 disasm
-rw-r--r--src/emu/cpu/sm510/sm510.c18
-rw-r--r--src/emu/cpu/sm510/sm510.h1
-rw-r--r--src/emu/cpu/sm510/sm510d.c121
3 files changed, 133 insertions, 7 deletions
diff --git a/src/emu/cpu/sm510/sm510.c b/src/emu/cpu/sm510/sm510.c
index 5a5c364376d..ff504447dd5 100644
--- a/src/emu/cpu/sm510/sm510.c
+++ b/src/emu/cpu/sm510/sm510.c
@@ -143,6 +143,18 @@ void sm510_base_device::device_reset()
inline void sm510_base_device::increment_pc()
{
+ m_pc = (m_pc + 1) & m_prgmask;
+}
+
+void sm510_base_device::get_opcode_param()
+{
+ // LBL, TL, TML, TM opcodes are 2 bytes
+ if (m_op == 0x5f || (m_op & 0xf0) == 0x70 || m_op >= 0xc0)
+ {
+ m_icount -= 2; // guessed
+ m_param = m_program->read_byte(m_pc);
+ increment_pc();
+ }
}
void sm510_base_device::execute_run()
@@ -155,12 +167,10 @@ void sm510_base_device::execute_run()
// fetch next opcode
debugger_instruction_hook(this, m_pc);
- m_icount--;
+ m_icount -= 2; // 61us typical
m_op = m_program->read_byte(m_pc);
- //m_param = fetch_opcode_param();
-
-
increment_pc();
+ get_opcode_param();
// handle opcode
diff --git a/src/emu/cpu/sm510/sm510.h b/src/emu/cpu/sm510/sm510.h
index 34042b093c4..2b8c84cc534 100644
--- a/src/emu/cpu/sm510/sm510.h
+++ b/src/emu/cpu/sm510/sm510.h
@@ -85,6 +85,7 @@ protected:
// misc internal helpers
void increment_pc();
+ virtual void get_opcode_param();
UINT8 ram_r();
void ram_w(UINT8 data);
diff --git a/src/emu/cpu/sm510/sm510d.c b/src/emu/cpu/sm510/sm510d.c
index f90bb4f06f0..2945bbded3b 100644
--- a/src/emu/cpu/sm510/sm510d.c
+++ b/src/emu/cpu/sm510/sm510d.c
@@ -11,12 +11,127 @@
#include "sm510.h"
+enum e_mnemonics
+{
+ mILL,
+ mLB, mLBL, mSBM, mEXBLA, mINCB, mDECB,
+ mATPL, mRTN0, mRTN1, mTL, mTML, mTM, mT,
+ mEXC, mBDC, mEXCI, mEXCD, mLDA, mLAX, mWR, mWS,
+ mKTA, mATBP, mATL, mATFC, mATR,
+ mADD, mADD11, mADX, mCOMA, mROT, mRC, mSC,
+ mTB, mTC, mTAM, mTMI, mTA0, mTABL, mTIS, mTAL, mTF1, mTF4,
+ mRM, mSM, mSKIP, mCEND, mIDIV
+};
+
+static const char *const s_mnemonics[] =
+{
+ "?",
+ "LB", "LBL", "SBM", "EXBLA", "INCB", "DECB",
+ "ATPL", "RTN0", "RTN1", "TL", "TML", "TM", "T",
+ "EXC", "BDC", "EXCI", "EXCD", "LDA", "LAX", "WR", "WS",
+ "KTA", "ATBP", "ATL", "ATFC", "ATR",
+ "ADD", "ADD11", "ADX", "COMA", "ROT", "RC", "SC",
+ "TB", "TC", "TAM", "TMI", "TA0", "TABL", "TIS", "TAL", "TF1", "TF4",
+ "RM", "SM", "SKIP", "CEND", "IDIV"
+};
+
+// number of bits per opcode parameter, 8 or larger means 2-byte opcode
+static const UINT8 s_bits[] =
+{
+ 0,
+ 4, 8, 0, 0, 0, 0,
+ 0, 0, 0, 4+8, 2+8, 6+8, 6,
+ 2, 0, 2, 2, 2, 4, 0, 0,
+ 0, 0, 0, 0, 0,
+ 0, 0, 4, 0, 0, 0, 0,
+ 0, 0, 0, 2, 0, 0, 0, 0, 0, 0,
+ 2, 2, 0, 0, 0
+};
+
+#define _OVER DASMFLAG_STEP_OVER
+#define _OUT DASMFLAG_STEP_OUT
+
+static const UINT32 s_flags[] =
+{
+ 0,
+ 0, 0, 0, 0, 0, 0,
+ 0, _OUT, _OUT, 0, _OVER, _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, 0, 0, 0, 0,
+ 0, 0, 0, _OVER, 0
+};
+
+static const UINT8 sm510_mnemonic[0x100] =
+{
+/* 0 1 2 3 4 5 6 7 8 9 A B C D E F */
+ mSKIP, mATBP, mSBM, mATPL, mRM, mRM, mRM, mRM, mADD, mADD11,mCOMA, mEXBLA,mSM, mSM, mSM, mSM, // 0
+ mEXC, mEXC, mEXC, mEXC, mEXCI, mEXCI, mEXCI, mEXCI, mLDA, mLDA, mLDA, mLDA, mEXCD, mEXCD, mEXCD, mEXCD, // 1
+ mLAX, mLAX, mLAX, mLAX, mLAX, mLAX, mLAX, mLAX, mLAX, mLAX, mLAX, mLAX, mLAX, mLAX, mLAX, mLAX, // 2
+ mADX, mADX, mADX, mADX, mADX, mADX, mADX, mADX, mADX, mADX, mADX, mADX, mADX, mADX, mADX, mADX, // 3 - note: $3A has synonym DC(decimal correct)
+
+ mLB, mLB, mLB, mLB, mLB, mLB, mLB, mLB, mLB, mLB, mLB, mLB, mLB, mLB, mLB, mLB, // 4
+ 0, mTB, mTC, mTAM, mTMI, mTMI, mTMI, mTMI, mTIS, mATL, mTA0, mTABL, 0, mCEND, mTAL, mLBL, // 5
+ mATFC, mATR, mWR, mWS, mINCB, mIDIV, mRC, mSC, mTF1, mTF4, mKTA, mROT, mDECB, mBDC, mRTN0, mRTN1, // 6
+ mTL, mTL, mTL, mTL, mTL, mTL, mTL, mTL, mTL, mTL, mTL, mTL, mTML, mTML, mTML, mTML, // 7
+
+ mT, mT, mT, mT, mT, mT, mT, mT, mT, mT, mT, mT, mT, mT, mT, mT, // 8
+ mT, mT, mT, mT, mT, mT, mT, mT, mT, mT, mT, mT, mT, mT, mT, mT, // 9
+ mT, mT, mT, mT, mT, mT, mT, mT, mT, mT, mT, mT, mT, mT, mT, mT, // A
+ mT, mT, mT, mT, mT, mT, mT, mT, mT, mT, mT, mT, mT, mT, mT, mT, // B
+
+ mTM, mTM, mTM, mTM, mTM, mTM, mTM, mTM, mTM, mTM, mTM, mTM, mTM, mTM, mTM, mTM, // C
+ mTM, mTM, mTM, mTM, mTM, mTM, mTM, mTM, mTM, mTM, mTM, mTM, mTM, mTM, mTM, mTM, // D
+ mTM, mTM, mTM, mTM, mTM, mTM, mTM, mTM, mTM, mTM, mTM, mTM, mTM, mTM, mTM, mTM, // E
+ mTM, mTM, mTM, mTM, mTM, mTM, mTM, mTM, mTM, mTM, mTM, mTM, mTM, mTM, mTM, mTM // F
+};
+
CPU_DISASSEMBLE(sm510)
{
- //int pos = 0;
- //UINT8 op = oprom[pos++];
- return 1 | DASMFLAG_SUPPORTED;
+ // get raw opcode
+ int pos = 0;
+ UINT8 op = oprom[pos];
+ pos++;
+ UINT8 instr = sm510_mnemonic[op];
+
+ int bits = s_bits[instr];
+ UINT8 mask = op & ((1 << (bits & 7)) - 1);
+ UINT16 param = mask;
+ if (bits >= 8)
+ {
+ param = oprom[pos];
+ pos++;
+ }
+ // disassemble it
+ char *dst = buffer;
+ dst += sprintf(dst, "%-6s ", s_mnemonics[instr]);
+ if (bits > 0)
+ {
+ if (bits <= 4)
+ {
+ if (param < 10)
+ dst += sprintf(dst, "%d", param);
+ else
+ dst += sprintf(dst, "$%X", param);
+ }
+ else if (bits <= 8)
+ {
+ dst += sprintf(dst, "$%02X", param);
+ }
+ else if (instr == mTL || instr == mTML)
+ {
+ UINT16 address = (param << 4 & 0xc00) | (mask << 6 & 0x3c0) | (param & 0x3f);
+ dst += sprintf(dst, "$%03X", address);
+ }
+ else if (instr == mTM)
+ {
+ //todo
+ }
+ }
+
+ return (pos & DASMFLAG_LENGTHMASK) | s_flags[instr] | DASMFLAG_SUPPORTED;
}