added sm510 disasm

This commit is contained in:
hap 2015-07-01 01:03:12 +02:00
parent bfe59caac5
commit ae0fd9f1a5
3 changed files with 133 additions and 7 deletions

View File

@ -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

View File

@ -85,6 +85,7 @@ protected:
// misc internal helpers
void increment_pc();
virtual void get_opcode_param();
UINT8 ram_r();
void ram_w(UINT8 data);

View File

@ -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;
}