summaryrefslogtreecommitdiffstatshomepage
path: root/src/devices/cpu/melps4/melps4d.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/devices/cpu/melps4/melps4d.cpp')
-rw-r--r--src/devices/cpu/melps4/melps4d.cpp118
1 files changed, 64 insertions, 54 deletions
diff --git a/src/devices/cpu/melps4/melps4d.cpp b/src/devices/cpu/melps4/melps4d.cpp
index 8ab9c0bd2c7..656bef4eee0 100644
--- a/src/devices/cpu/melps4/melps4d.cpp
+++ b/src/devices/cpu/melps4/melps4d.cpp
@@ -12,7 +12,25 @@
#include "emu.h"
#include "melps4d.h"
-const char *const melps4_disassembler::em_name[] =
+
+// common lookup tables
+
+enum melps4_disassembler::e_mnemonics : unsigned
+{
+ mILL,
+ mTAB, mTBA, mTAY, mTYA, mTEAB, mTABE, mTEPA, mTXA, mTAX,
+ mLXY, mLZ, mINY, mDEY, mLCPS, mSADR,
+ mTAM, mXAM, mXAMD, mXAMI,
+ mLA, mAM, mAMC, mAMCS, mA, mSC, mRC, mSZC, mCMA, mRL, mRR,
+ mSB, mRB, mSZB, mSEAM, mSEY,
+ mTLA, mTHA, mTAJ, mXAL, mXAH, mLC7, mDEC, mSHL, mRHL, mCPA, mCPAS, mCPAE, mSZJ,
+ mT1AB, mTRAB, mT2AB, mTAB1, mTABR, mTAB2, mTVA, mTWA, mSNZ1, mSNZ2,
+ mBA, mSP, mB, mBM, mRT, mRTS, mRTI,
+ mCLD, mCLS, mCLDS, mSD, mRD, mSZD, mOSAB, mOSPA, mOSE, mIAS, mOFA, mIAF, mOGA, mIAK, mSZK, mSU, mRU,
+ mEI, mDI, mINTH, mINTL, mNOP
+};
+
+const char *const melps4_disassembler::s_name[] =
{
"?",
"TAB", "TBA", "TAY", "TYA", "TEAB", "TABE", "TEPA", "TXA", "TAX",
@@ -28,7 +46,7 @@ const char *const melps4_disassembler::em_name[] =
};
// number of bits per opcode parameter
-const uint8_t melps4_disassembler::em_bits[] =
+const u8 melps4_disassembler::s_bits[] =
{
0,
0, 0, 0, 0, 0, 0, 0, 0, 0,
@@ -43,18 +61,18 @@ const uint8_t melps4_disassembler::em_bits[] =
0, 0, 0, 0, 0
};
-const uint32_t melps4_disassembler::em_flags[] =
+const u32 melps4_disassembler::s_flags[] =
{
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, 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, STEP_COND, STEP_COND, 0, 0,
+ 0, 0, STEP_COND, STEP_COND,
+ 0, 0, 0, STEP_COND, STEP_COND, 0, 0, STEP_COND, 0, 0, 0,
+ 0, 0, STEP_COND, STEP_COND, STEP_COND,
+ 0, 0, 0, 0, 0, 0, STEP_COND, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, STEP_COND, STEP_COND,
0, 0, 0, STEP_OVER, STEP_OUT, STEP_OUT, STEP_OUT,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, STEP_COND, 0, 0, 0, 0, 0, 0, 0, 0, STEP_COND, 0, 0,
0, 0, 0, 0, 0
};
@@ -62,73 +80,65 @@ const uint32_t melps4_disassembler::em_flags[] =
// M58846 disasm
-const uint8_t melps4_disassembler::m58846_opmap[0xc0] =
+const u8 melps4_disassembler::m58846_opmap[0xc0] =
{
-// 0 1 2 3 4 5 6 7 8 9 A B C D E F
- em_NOP, em_BA, em_INY, em_DEY, em_DI, em_EI, em_RU, em_SU, 0, em_TABE, em_AM, em_OSE, em_TYA, 0, 0, em_CMA, // 0x
- em_CLS, em_CLDS, 0, em_CLD, em_RD, em_SD, em_TEPA, em_OSPA, em_RL, em_RR, em_TEAB, em_OSAB, em_TBA, em_TAY, em_TAB, 0, // 1x
- em_SZB, em_SZB, em_SZB, em_SZB, 0, 0, em_SEAM, 0, 0, 0, 0, em_SZD, 0, 0, 0, em_SZC, // 2x
- em_SEY, em_SEY, em_SEY, em_SEY, em_SEY, em_SEY, em_SEY, em_SEY, em_SEY, em_SEY, em_SEY, em_SEY, em_SEY, em_SEY, em_SEY, em_SEY, // 3x
- em_LCPS, em_LCPS, 0, em_AMC, em_RT, em_RTS, em_RTI, 0, em_RC, em_SC, em_LZ, em_LZ, em_SB, em_SB, em_SB, em_SB, // 4x
- 0, 0, 0, em_AMCS, em_IAS, em_IAS, 0, em_IAK, em_SZK, em_SZK, em_SZK, em_SZK, em_RB, em_RB, em_RB, em_RB, // 5x
- em_XAM, em_XAM, em_XAM, em_XAM, em_TAM, em_TAM, em_TAM, em_TAM, em_XAMD, em_XAMD, em_XAMD, em_XAMD, em_XAMI, em_XAMI, em_XAMI, em_XAMI, // 6x
- em_SP, em_SP, em_SP, em_SP, em_SP, em_SP, em_SP, em_SP, em_SP, em_SP, em_SP, em_SP, em_SP, em_SP, em_SP, em_SP, // 7x
- 0, em_OFA, em_SNZ1, em_SNZ2, em_OGA, em_T2AB, em_TVA, 0, 0, 0, em_TAB2, 0, em_IAF, 0, 0, 0, // 8x
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 9x
- em_A, em_A, em_A, em_A, em_A, em_A, em_A, em_A, em_A, em_A, em_A, em_A, em_A, em_A, em_A, em_A, // Ax
- em_LA, em_LA, em_LA, em_LA, em_LA, em_LA, em_LA, em_LA, em_LA, em_LA, em_LA, em_LA, em_LA, em_LA, em_LA, em_LA // Bx
+// 0 1 2 3 4 5 6 7 8 9 A B C D E F
+ mNOP, mBA, mINY, mDEY, mDI, mEI, mRU, mSU, 0, mTABE, mAM, mOSE, mTYA, 0, 0, mCMA, // 0x
+ mCLS, mCLDS, 0, mCLD, mRD, mSD, mTEPA, mOSPA, mRL, mRR, mTEAB, mOSAB, mTBA, mTAY, mTAB, 0, // 1x
+ mSZB, mSZB, mSZB, mSZB, 0, 0, mSEAM, 0, 0, 0, 0, mSZD, 0, 0, 0, mSZC, // 2x
+ mSEY, mSEY, mSEY, mSEY, mSEY, mSEY, mSEY, mSEY, mSEY, mSEY, mSEY, mSEY, mSEY, mSEY, mSEY, mSEY, // 3x
+
+ mLCPS, mLCPS, 0, mAMC, mRT, mRTS, mRTI, 0, mRC, mSC, mLZ, mLZ, mSB, mSB, mSB, mSB, // 4x
+ 0, 0, 0, mAMCS, mIAS, mIAS, 0, mIAK, mSZK, mSZK, mSZK, mSZK, mRB, mRB, mRB, mRB, // 5x
+ mXAM, mXAM, mXAM, mXAM, mTAM, mTAM, mTAM, mTAM, mXAMD, mXAMD, mXAMD, mXAMD, mXAMI, mXAMI, mXAMI, mXAMI, // 6x
+ mSP, mSP, mSP, mSP, mSP, mSP, mSP, mSP, mSP, mSP, mSP, mSP, mSP, mSP, mSP, mSP, // 7x
+
+ 0, mOFA, mSNZ1, mSNZ2, mOGA, mT2AB, mTVA, 0, 0, 0, mTAB2, 0, mIAF, 0, 0, 0, // 8x
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 9x
+ mA, mA, mA, mA, mA, mA, mA, mA, mA, mA, mA, mA, mA, mA, mA, mA, // Ax
+ mLA, mLA, mLA, mLA, mLA, mLA, mLA, mLA, mLA, mLA, mLA, mLA, mLA, mLA, mLA, mLA // Bx
};
offs_t melps4_disassembler::disassemble(std::ostream &stream, offs_t pc, const data_buffer &opcodes, const data_buffer &params)
{
- uint16_t op = opcodes.r16(pc) & 0x1ff;
+ u16 op = opcodes.r16(pc) & 0x1ff;
// get opcode
- uint8_t instr;
+ u8 instr;
if (op >= 0x180)
- instr = em_B;
+ instr = mB;
else if (op >= 0x100)
- instr = em_BM;
+ instr = mBM;
else if (op >= 0xc0)
- instr = em_LXY;
+ instr = mLXY;
else
instr = m58846_opmap[op];
- util::stream_format(stream, "%-6s", em_name[instr]);
+ u32 flags = s_flags[instr];
+ util::stream_format(stream, "%-6s", s_name[instr]);
// get immediate param
- uint8_t bits = em_bits[instr];
+ u8 bits = s_bits[instr];
// special case for LXY x,y
- if (instr == em_LXY)
+ if (instr == mLXY)
{
- uint8_t x = op >> 4 & 3;
- uint8_t y = op & 0xf;
- util::stream_format(stream, " %d,%d", x, y);
+ u8 x = op >> 4 & 3;
+ u8 y = op & 0xf;
+ util::stream_format(stream, "%d,%d", x, y);
}
else if (bits > 0)
{
- uint8_t param = op & ((1 << bits) - 1);
+ u8 param = op & ((1 << bits) - 1);
+
+ if (instr == mA && param == 6)
+ flags &= ~STEP_COND;
+
if (bits > 4)
- util::stream_format(stream, " $%02X", param);
+ util::stream_format(stream, "$%02X", param);
else
- util::stream_format(stream, " %d", param);
+ util::stream_format(stream, "%d", param);
}
- return 1 | em_flags[instr] | SUPPORTED;
-}
-
-u32 melps4_disassembler::opcode_alignment() const
-{
- return 1;
-}
-
-u32 melps4_disassembler::interface_flags() const
-{
- return PAGED;
-}
-
-u32 melps4_disassembler::page_address_bits() const
-{
- return 7;
+ return 1 | flags | SUPPORTED;
}