summaryrefslogtreecommitdiffstatshomepage
path: root/src/devices/cpu/mcs40/mcs40dasm.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/devices/cpu/mcs40/mcs40dasm.cpp')
-rw-r--r--src/devices/cpu/mcs40/mcs40dasm.cpp93
1 files changed, 34 insertions, 59 deletions
diff --git a/src/devices/cpu/mcs40/mcs40dasm.cpp b/src/devices/cpu/mcs40/mcs40dasm.cpp
index 3ecf5712308..fbc938f61c1 100644
--- a/src/devices/cpu/mcs40/mcs40dasm.cpp
+++ b/src/devices/cpu/mcs40/mcs40dasm.cpp
@@ -9,96 +9,68 @@
*****************************************************************************/
#include "emu.h"
+#include "mcs40dasm.h"
-namespace {
-
-enum class format
-{
- ILL,
- SIMPLE,
- IMM4,
- REG,
- REGPAGE,
- PAIR,
- PAIRIMM,
- ABS,
- PAGE,
- COND,
- EXT
-};
-
-enum class level
-{
- I4004,
- I4040
-};
-
-struct op
-{
- format m_format;
- level m_level;
- char const *m_name;
- op const *m_ext;
-};
#define OP(fmt, lvl, name) { format::fmt, level::lvl, #name, nullptr }
#define OPX(tbl) { format::EXT, level::I4004, nullptr, f_opx_##tbl }
-op const f_opx_0[16] = {
+mcs40_disassembler::op const mcs40_disassembler::f_opx_0[16] = {
OP(SIMPLE, I4004, nop), OP(SIMPLE, I4040, hlt), OP(SIMPLE, I4040, bbs), OP(SIMPLE, I4040, lcr),
OP(SIMPLE, I4040, or4), OP(SIMPLE, I4040, or5), OP(SIMPLE, I4040, an6), OP(SIMPLE, I4040, an7),
OP(SIMPLE, I4040, db0), OP(SIMPLE, I4040, db1), OP(SIMPLE, I4040, sb0), OP(SIMPLE, I4040, sb1),
OP(SIMPLE, I4040, ein), OP(SIMPLE, I4040, din), OP(SIMPLE, I4040, rpm), OP(ILL, I4004, ill) };
-op const f_opx_2[16] = {
+mcs40_disassembler::op const mcs40_disassembler::f_opx_2[16] = {
OP(PAIRIMM, I4004, fim), OP(PAIR, I4004, src), OP(PAIRIMM, I4004, fim), OP(PAIR, I4004, src),
OP(PAIRIMM, I4004, fim), OP(PAIR, I4004, src), OP(PAIRIMM, I4004, fim), OP(PAIR, I4004, src),
OP(PAIRIMM, I4004, fim), OP(PAIR, I4004, src), OP(PAIRIMM, I4004, fim), OP(PAIR, I4004, src),
OP(PAIRIMM, I4004, fim), OP(PAIR, I4004, src), OP(PAIRIMM, I4004, fim), OP(PAIR, I4004, src) };
-op const f_opx_3[16] = {
+mcs40_disassembler::op const mcs40_disassembler::f_opx_3[16] = {
OP(PAIR, I4004, fin), OP(PAIR, I4004, jin), OP(PAIR, I4004, fin), OP(PAIR, I4004, jin),
OP(PAIR, I4004, fin), OP(PAIR, I4004, jin), OP(PAIR, I4004, fin), OP(PAIR, I4004, jin),
OP(PAIR, I4004, fin), OP(PAIR, I4004, jin), OP(PAIR, I4004, fin), OP(PAIR, I4004, jin),
OP(PAIR, I4004, fin), OP(PAIR, I4004, jin), OP(PAIR, I4004, fin), OP(PAIR, I4004, jin) };
-op const f_opx_io[16] = {
+mcs40_disassembler::op const mcs40_disassembler::f_opx_io[16] = {
OP(SIMPLE, I4004, wrm), OP(SIMPLE, I4004, wmp), OP(SIMPLE, I4004, wrr), OP(SIMPLE, I4004, wpm),
OP(SIMPLE, I4004, wr0), OP(SIMPLE, I4004, wr1), OP(SIMPLE, I4004, wr2), OP(SIMPLE, I4004, wr3),
OP(SIMPLE, I4004, sbm), OP(SIMPLE, I4004, rdm), OP(SIMPLE, I4004, rdr), OP(SIMPLE, I4004, adm),
OP(SIMPLE, I4004, rd0), OP(SIMPLE, I4004, rd1), OP(SIMPLE, I4004, rd2), OP(SIMPLE, I4004, rd3) };
-op const f_opx_f[16] = {
+mcs40_disassembler::op const mcs40_disassembler::f_opx_f[16] = {
OP(SIMPLE, I4004, clb), OP(SIMPLE, I4004, clc), OP(SIMPLE, I4004, iac), OP(SIMPLE, I4004, cmc),
OP(SIMPLE, I4004, cma), OP(SIMPLE, I4004, ral), OP(SIMPLE, I4004, rar), OP(SIMPLE, I4004, tcc),
OP(SIMPLE, I4004, dac), OP(SIMPLE, I4004, tcs), OP(SIMPLE, I4004, stc), OP(SIMPLE, I4004, daa),
OP(SIMPLE, I4004, kbp), OP(SIMPLE, I4004, dcl), OP(ILL, I4004, ill), OP(ILL, I4004, ill) };
-op const f_ops[16] = {
+mcs40_disassembler::op const mcs40_disassembler::f_ops[16] = {
OPX(0), OP(COND, I4004, jcn), OPX(2), OPX(3),
OP(ABS, I4004, jun), OP(ABS, I4004, jms), OP(REG, I4004, inc), OP(REGPAGE, I4004, isz),
OP(REG, I4004, add), OP(REG, I4004, sub), OP(REG, I4004, ld ), OP(REG, I4004, xch),
OP(IMM4, I4004, bbl), OP(IMM4, I4004, ldm), OPX(io), OPX(f) };
-char const *const f_cond[16] = {
+char const *const mcs40_disassembler::f_cond[16] = {
"$0", "nt", "c", "$3", "z", "$5", "$6", "$7",
"$8", "t", "nc", "$b", "nz", "$d", "$e", "$f" };
-offs_t disassemble(
- cpu_device *device,
- std::ostream &stream,
- offs_t pc,
- u8 const *oprom,
- u8 const *opram,
- int options,
- level lvl,
- unsigned pcmask)
+u32 mcs40_disassembler::opcode_alignment() const
+{
+ return 1;
+}
+
+mcs40_disassembler::mcs40_disassembler(level lvl, unsigned pcmask) : m_lvl(lvl), m_pcmask(pcmask)
+{
+}
+
+offs_t mcs40_disassembler::disassemble(std::ostream &stream, offs_t pc, const data_buffer &opcodes, const data_buffer &params)
{
offs_t npc(pc + 1);
- u8 const opcode(oprom[0]);
+ u8 const opcode(opcodes.r8(pc));
op const &base_op(f_ops[(opcode >> 4) & 0x0f]);
op const &ext_op((base_op.m_format == format::EXT) ? base_op.m_ext[opcode & 0x0f] : base_op);
- op const desc((ext_op.m_level > lvl) ? f_opx_f[0x0f] : ext_op);
+ op const desc((ext_op.m_level > m_lvl) ? f_opx_f[0x0f] : ext_op);
u8 const imm4(opcode & 0x0f);
u8 const pair(opcode & 0x0e);
@@ -118,26 +90,26 @@ offs_t disassemble(
break;
case format::REGPAGE:
npc++;
- util::stream_format(stream, "%-3s r%01x,$%03x", desc.m_name, imm4, oprom[1] | (npc & 0x0f00U));
+ util::stream_format(stream, "%-3s r%01x,$%03x", desc.m_name, imm4, opcodes.r8(pc+1) | (npc & 0x0f00U));
break;
case format::PAIR:
util::stream_format(stream, "%-3s r%01xr%01x", desc.m_name, pair, pair + 1U);
break;
case format::PAIRIMM:
npc++;
- util::stream_format(stream, "%-3s r%01xr%01x,$%02x", desc.m_name, pair, pair + 1, oprom[1]);
+ util::stream_format(stream, "%-3s r%01xr%01x,$%02x", desc.m_name, pair, pair + 1, opcodes.r8(pc+1));
break;
case format::ABS:
npc++;
- util::stream_format(stream, "%-3s $%03x", desc.m_name, ((u16(opcode) & 0x0fU) << 8) | oprom[1]);
+ util::stream_format(stream, "%-3s $%03x", desc.m_name, ((u16(opcode) & 0x0fU) << 8) | opcodes.r8(pc+1));
break;
case format::PAGE:
npc++;
- util::stream_format(stream, "%-3s $%03x", desc.m_name, oprom[1] | (npc & 0x0f00U));
+ util::stream_format(stream, "%-3s $%03x", desc.m_name, opcodes.r8(pc+1) | (npc & 0x0f00U));
break;
case format::COND:
npc++;
- util::stream_format(stream, "%-3s %s,$%03x", desc.m_name, f_cond[imm4], oprom[1] | (npc & 0x0f00U));
+ util::stream_format(stream, "%-3s %s,$%03x", desc.m_name, f_cond[imm4], opcodes.r8(pc+1) | (npc & 0x0f00U));
break;
default:
throw false;
@@ -147,16 +119,19 @@ offs_t disassemble(
if (format::ILL != desc.m_format)
{
if (0x50U == (opcode & 0xf0U)) // JMS
- flags = DASMFLAG_STEP_OVER;
+ flags = STEP_OVER;
else if ((0xc0 == (opcode & 0xf0)) || (0x02 == opcode)) // BBL/BBS
- flags = DASMFLAG_STEP_OUT;
+ flags = STEP_OUT;
}
- return (npc - pc) | flags | DASMFLAG_SUPPORTED;
+ return (npc - pc) | flags | SUPPORTED;
}
-} // anonymous namespace
+i4004_disassembler::i4004_disassembler() : mcs40_disassembler(level::I4004, 0x0fffU)
+{
+}
-CPU_DISASSEMBLE(i4004) { return disassemble(device, stream, pc, oprom, opram, options, level::I4004, 0x0fffU); }
-CPU_DISASSEMBLE(i4040) { return disassemble(device, stream, pc, oprom, opram, options, level::I4040, 0x1fffU); }
+i4040_disassembler::i4040_disassembler() : mcs40_disassembler(level::I4040, 0x1fffU)
+{
+}