summaryrefslogtreecommitdiffstatshomepage
path: root/src/devices/cpu/m6805/6805dasm.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/devices/cpu/m6805/6805dasm.cpp')
-rw-r--r--src/devices/cpu/m6805/6805dasm.cpp184
1 files changed, 53 insertions, 131 deletions
diff --git a/src/devices/cpu/m6805/6805dasm.cpp b/src/devices/cpu/m6805/6805dasm.cpp
index e8cca5bf4e3..3f6b2fbb14b 100644
--- a/src/devices/cpu/m6805/6805dasm.cpp
+++ b/src/devices/cpu/m6805/6805dasm.cpp
@@ -5,56 +5,21 @@
*
* Note: this is not the good and proper way to disassemble anything, but it works
*
+ * Secondary note: it actually stopped being not nice a while ago
+ *
* I'm afraid to put my name on it, but I feel obligated:
* This code written by Aaron Giles (agiles@sirius.com) for the MAME project
*
*/
#include "emu.h"
-#include "m6805.h"
-
-#include "debugger.h"
-
-namespace {
-
-enum class md {
- INH, // inherent
- BTR, // bit test and relative
- BIT, // bit set/clear
- REL, // relative
- IMM, // immediate
- DIR, // direct address
- EXT, // extended address
- IDX, // indexed
- IX1, // indexed + byte offset
- IX2 // indexed + word offset
-};
-
-enum class lvl {
- HMOS,
- CMOS,
- HC
-};
-
-enum class op_names {
- adca, adda, anda, asl, asla, aslx, asr, asra,
- asrx, bcc, bclr, bcs, beq, bhcc, bhcs, bhi,
- bih, bil, bit, bls, bmc, bmi, bms, bne,
- bpl, bra, brclr, brn, brset, bset, bsr, clc,
- cli, clr, clra, clrx, cmpa, com, coma, comx,
- cpx, dec, deca, decx, eora, ill, inc, inca,
- incx, jmp, jsr, lda, ldx, lsr, lsra, lsrx,
- mul, neg, nega, negx, nop, ora, rol, rola,
- rolx, ror, rora, rorx, rsp, rti, rts, sbca,
- sec, sei, sta, stop, stx, suba, swi, tax,
- tst, tsta, tstx, txa, wait
-};
+#include "6805dasm.h"
#define OP(name, mode) { op_names::name, #name, md::mode, lvl::HMOS }
#define OPC(name, mode) { op_names::name, #name, md::mode, lvl::CMOS }
#define OPHC(name, mode) { op_names::name, #name, md::mode, lvl::HC }
#define ILLEGAL { op_names::ill, nullptr, md::INH, lvl::HMOS }
-struct { op_names op; char const *name; md mode; lvl level; } const disasm[0x100] = {
+const m6805_base_disassembler::info m6805_base_disassembler::disasm[0x100] = {
OP (brset,BTR), OP (brclr,BTR), OP (brset,BTR), OP (brclr,BTR), // 00
OP (brset,BTR), OP (brclr,BTR), OP (brset,BTR), OP (brclr,BTR),
OP (brset,BTR), OP (brclr,BTR), OP (brset,BTR), OP (brclr,BTR),
@@ -121,43 +86,35 @@ struct { op_names op; char const *name; md mode; lvl level; } const disasm[0x100
OP (jmp, IDX), OP (jsr, IDX), OP (ldx, IDX), OP (stx, IDX)
};
+m6805_base_disassembler::m6805_base_disassembler(lvl level, std::pair<u16, char const *> const symbols[], std::size_t symbol_count) : m_level(level), m_symbols(symbols), m_symbol_count(symbol_count)
+{
+}
+
+u32 m6805_base_disassembler::opcode_alignment() const
+{
+ return 1;
+}
-template <typename T>
-void format_address(
- std::ostream& stream,
- T address,
- std::pair<u16, char const *> const symbols[],
- std::size_t symbol_count)
+template <typename T> std::string m6805_base_disassembler::address(T offset) const
{
- auto const symbol= std::lower_bound(
- &symbols[0],
- &symbols[symbol_count],
- address,
- [] (auto const &sym, u16 addr) { return sym.first < addr; });
- if ((symbol_count != (symbol - symbols)) && (symbol->first == address))
- stream << symbol->second;
+ auto const symbol = std::lower_bound(m_symbols,
+ m_symbols + m_symbol_count,
+ offset,
+ [] (auto const &sym, u16 addr) { return sym.first < addr; });
+ if ((m_symbol_count != (symbol - m_symbols)) && (symbol->first == offset))
+ return symbol->second;
else
- util::stream_format(stream, "$%0*X", 2 * sizeof(T), address);
+ return util::string_format("$%0*X", 2 * sizeof(T), offset);
}
-
-offs_t disassemble(
- cpu_device *device,
- std::ostream &stream,
- offs_t pc,
- const u8 *oprom,
- const u8 *opram,
- int options,
- lvl level,
- std::pair<u16, char const *> const symbols[],
- std::size_t symbol_count)
+offs_t m6805_base_disassembler::disassemble(std::ostream &stream, offs_t pc, const data_buffer &opcodes, const data_buffer &params)
{
- u8 const code = oprom[0];
+ u8 const code = opcodes.r8(pc);
- if (!disasm[code].name || (disasm[code].level > level))
+ if (!disasm[code].name || (disasm[code].level > m_level))
{
util::stream_format(stream, "%-6s$%02X", "fcb", code);
- return 1 | DASMFLAG_SUPPORTED;
+ return 1 | SUPPORTED;
}
else
{
@@ -166,11 +123,11 @@ offs_t disassemble(
{
case op_names::bsr:
case op_names::jsr:
- flags = DASMFLAG_STEP_OVER;
+ flags = STEP_OVER;
break;
case op_names::rts:
case op_names::rti:
- flags = DASMFLAG_STEP_OUT;
+ flags = STEP_OUT;
break;
default:
flags = 0;
@@ -178,55 +135,46 @@ offs_t disassemble(
util::stream_format(stream, "%-6s", disasm[code].name);
- int bit;
- u16 ea;
switch (disasm[code].mode)
{
case md::INH: // inherent
- return 1 | flags | DASMFLAG_SUPPORTED;
+ return 1 | flags | SUPPORTED;
case md::BTR: // bit test and relative branch
- bit = (code >> 1) & 7;
- util::stream_format(stream, "%d,", bit);
- format_address(stream, opram[1], symbols, symbol_count);
- util::stream_format(stream, ",$%03X", pc + 3 + s8(opram[2]));
- return 3 | flags | DASMFLAG_SUPPORTED;
+ util::stream_format(stream, "%d, %s, $%03X", (code >> 1) & 7, address(params.r8(pc+1)), pc + 3 + s8(params.r8(pc+2)));
+ return 3 | flags | SUPPORTED;
case md::BIT: // bit test
- bit = (code >> 1) & 7;
- util::stream_format(stream, "%d,", bit);
- format_address(stream, opram[1], symbols, symbol_count);
- return 2 | flags | DASMFLAG_SUPPORTED;
+ util::stream_format(stream, "%d, %s", (code >> 1) & 7, address(params.r8(pc+1)));
+ return 2 | flags | SUPPORTED;
case md::REL: // relative
- util::stream_format(stream, "$%03X", pc + 2 + s8(opram[1]));
- return 2 | flags | DASMFLAG_SUPPORTED;
+ util::stream_format(stream, "$%03X", pc + 2 + s8(params.r8(pc+1)));
+ return 2 | flags | SUPPORTED;
case md::IMM: // immediate
- util::stream_format(stream, "#$%02X", opram[1]);
- return 2 | flags | DASMFLAG_SUPPORTED;
+ util::stream_format(stream, "#$%02X", params.r8(pc+1));
+ return 2 | flags | SUPPORTED;
case md::DIR: // direct (zero page address)
- format_address(stream, opram[1], symbols, symbol_count);
- return 2 | flags | DASMFLAG_SUPPORTED;
+ util::stream_format(stream, "%s", address(params.r8(pc+1)));
+ return 2 | flags | SUPPORTED;
case md::EXT: // extended (16 bit address)
- ea = (opram[1] << 8) + opram[2];
- format_address(stream, ea, symbols, symbol_count);
- return 3 | flags | DASMFLAG_SUPPORTED;
+ util::stream_format(stream, "%s", address(params.r16(pc+1)));
+ return 3 | flags | SUPPORTED;
case md::IDX: // indexed
util::stream_format(stream, "(x)");
- return 1 | flags | DASMFLAG_SUPPORTED;
+ return 1 | flags | SUPPORTED;
case md::IX1: // indexed + byte (zero page)
- util::stream_format(stream, "(x+$%02X)", opram[1]);
- return 2 | flags | DASMFLAG_SUPPORTED;
+ util::stream_format(stream, "(x+$%02X)", params.r8(pc+1));
+ return 2 | flags | SUPPORTED;
case md::IX2: // indexed + word (16 bit address)
- ea = (opram[1] << 8) + opram[2];
- util::stream_format(stream, "(x+$%04X)", ea);
- return 3 | flags | DASMFLAG_SUPPORTED;
+ util::stream_format(stream, "(x+$%04X)", params.r16(pc+1));
+ return 3 | flags | SUPPORTED;
}
// if we fall off the switch statement something is very wrong
@@ -234,48 +182,22 @@ offs_t disassemble(
}
}
-} // anonymous namespace
-
+m6805_disassembler::m6805_disassembler() : m6805_base_disassembler(lvl::HMOS)
+{
+}
-offs_t CPU_DISASSEMBLE_NAME(m6805)(
- cpu_device *device,
- std::ostream &stream,
- offs_t pc,
- const u8 *oprom,
- const u8 *opram,
- int options,
- std::pair<u16, char const *> const symbols[],
- std::size_t symbol_count)
+m6805_disassembler::m6805_disassembler(std::pair<u16, char const *> const symbols[], std::size_t symbol_count) : m6805_base_disassembler(lvl::HMOS, symbols, symbol_count)
{
- return disassemble(device, stream, pc, oprom, opram, options, lvl::HMOS, symbols, symbol_count);
}
-offs_t CPU_DISASSEMBLE_NAME(m146805)(
- cpu_device *device,
- std::ostream &stream,
- offs_t pc,
- const u8 *oprom,
- const u8 *opram,
- int options,
- std::pair<u16, char const *> const symbols[],
- std::size_t symbol_count)
+m146805_disassembler::m146805_disassembler() : m6805_base_disassembler(lvl::CMOS)
{
- return disassemble(device, stream, pc, oprom, opram, options, lvl::CMOS, symbols, symbol_count);
}
-offs_t CPU_DISASSEMBLE_NAME(m68hc05)(
- cpu_device *device,
- std::ostream &stream,
- offs_t pc,
- const u8 *oprom,
- const u8 *opram,
- int options,
- std::pair<u16, char const *> const symbols[],
- std::size_t symbol_count)
+m68hc05_disassembler::m68hc05_disassembler() : m6805_base_disassembler(lvl::HC)
{
- return disassemble(device, stream, pc, oprom, opram, options, lvl::HC, symbols, symbol_count);
}
-CPU_DISASSEMBLE(m6805) { return CPU_DISASSEMBLE_NAME(m6805) (device, stream, pc, oprom, opram, options, nullptr, 0); }
-CPU_DISASSEMBLE(m146805) { return CPU_DISASSEMBLE_NAME(m146805)(device, stream, pc, oprom, opram, options, nullptr, 0); }
-CPU_DISASSEMBLE(m68hc05) { return CPU_DISASSEMBLE_NAME(m68hc05)(device, stream, pc, oprom, opram, options, nullptr, 0); }
+m68hc05_disassembler::m68hc05_disassembler(std::pair<u16, char const *> const symbols[], std::size_t symbol_count) : m6805_base_disassembler(lvl::HC, symbols, symbol_count)
+{
+}