summaryrefslogtreecommitdiffstatshomepage
path: root/src/devices/cpu/h8/h8.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/devices/cpu/h8/h8.cpp')
-rw-r--r--src/devices/cpu/h8/h8.cpp256
1 files changed, 6 insertions, 250 deletions
diff --git a/src/devices/cpu/h8/h8.cpp b/src/devices/cpu/h8/h8.cpp
index 516c2253496..078e89c31d1 100644
--- a/src/devices/cpu/h8/h8.cpp
+++ b/src/devices/cpu/h8/h8.cpp
@@ -14,6 +14,7 @@
#include "h8.h"
#include "h8_dma.h"
#include "h8_dtc.h"
+#include "h8d.h"
h8_device::h8_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock, bool mode_a16, address_map_delegate map_delegate) :
cpu_device(mconfig, type, tag, owner, clock),
@@ -324,256 +325,6 @@ void h8_device::state_string_export(const device_state_entry &entry, std::string
}
}
-
-uint32_t h8_device::disasm_min_opcode_bytes() const
-{
- return 2;
-}
-
-uint32_t h8_device::disasm_max_opcode_bytes() const
-{
- return 10;
-}
-
-void h8_device::disassemble_am(std::ostream &stream, int am, offs_t pc, const uint8_t *oprom, uint32_t opcode, int slot, int offset)
-{
- static const char *const r8_names[16] = {
- "r0h", "r1h", "r2h", "r3h", "r4h", "r5h", "r6h", "r7h",
- "r0l", "r1l", "r2l", "r3l", "r4l", "r5l", "r6l", "r7l"
- };
-
- static const char *const r16_names[16] = {
- "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
- "e0", "e1", "e2", "e3", "e4", "e5", "e6", "e7",
- };
-
- static const char *const r32_names[8] = {
- "er0", "er1", "er2", "er3", "er4", "er5", "er6", "sp",
- };
-
- switch(am) {
- case DASM_r8l:
- util::stream_format(stream, "%s", r8_names[opcode & 15]);
- break;
-
- case DASM_r8h:
- util::stream_format(stream, "%s", r8_names[(opcode >> 4) & 15]);
- break;
-
- case DASM_r8u:
- util::stream_format(stream, "%s", r8_names[(opcode >> 8) & 15]);
- break;
-
- case DASM_r16l:
- util::stream_format(stream, "%s", r16_names[opcode & 15]);
- break;
-
- case DASM_r16h:
- util::stream_format(stream, "%s", r16_names[(opcode >> 4) & 15]);
- break;
-
- case DASM_r32l:
- util::stream_format(stream, "%s", r32_names[opcode & 7]);
- break;
-
- case DASM_r32h:
- util::stream_format(stream, "%s", r32_names[(opcode >> 4) & 7]);
- break;
-
- case DASM_r16ih:
- util::stream_format(stream, "@%s", r16_names[(opcode >> 4) & 7]);
- break;
-
- case DASM_r16ihh:
- util::stream_format(stream, "@%s", r16_names[(opcode >> 20) & 7]);
- break;
-
- case DASM_pr16h:
- util::stream_format(stream, "@-%s", r16_names[(opcode >> 4) & 7]);
- break;
-
- case DASM_r16ph:
- util::stream_format(stream, "@%s+", r16_names[(opcode >> 4) & 7]);
- break;
-
- case DASM_r16d16h:
- util::stream_format(stream, "@(%x, %s)", (oprom[offset-2] << 8) | oprom[offset-1], r16_names[(opcode >> 4) & 7]);
- break;
-
- case DASM_r32ih:
- util::stream_format(stream, "@%s", r32_names[(opcode >> 4) & 7]);
- break;
-
- case DASM_r32ihh:
- util::stream_format(stream, "@%s", r32_names[(opcode >> 20) & 7]);
- break;
-
- case DASM_pr32h:
- util::stream_format(stream, "@-%s", r32_names[(opcode >> 4) & 7]);
- break;
-
- case DASM_r32pl:
- util::stream_format(stream, "@%s+", r32_names[opcode & 7]);
- break;
-
- case DASM_r32ph:
- util::stream_format(stream, "@%s+", r32_names[(opcode >> 4) & 7]);
- break;
-
- case DASM_r32d16h:
- util::stream_format(stream, "@(%x, %s)", (oprom[offset-2] << 8) | oprom[offset-1], r32_names[(opcode >> 4) & 7]);
- break;
-
- case DASM_r32d32hh:
- util::stream_format(stream, "@(%x, %s)", (oprom[offset-4] << 24) | (oprom[offset-3] << 16) | (oprom[offset-2] << 8) | oprom[offset-1], r32_names[(opcode >> 20) & 7]);
- break;
-
- case DASM_psp:
- util::stream_format(stream, "@-sp");
- break;
-
- case DASM_spp:
- util::stream_format(stream, "@sp+");
- break;
-
- case DASM_r32n2l:
- util::stream_format(stream, "%s-%s", r32_names[opcode & 6], r32_names[(opcode & 6) + 1]);
- break;
-
- case DASM_r32n3l:
- util::stream_format(stream, "%s-%s", r32_names[opcode & 4], r32_names[(opcode & 4) + 2]);
- break;
-
- case DASM_r32n4l:
- util::stream_format(stream, "%s-%s", r32_names[opcode & 4], r32_names[(opcode & 4) + 3]);
- break;
-
- case DASM_abs8:
- util::stream_format(stream, "@%08x", 0xffffff00 | oprom[1]);
- break;
-
- case DASM_abs16:
- if(offset >= 6)
- util::stream_format(stream, "@%08x", int16_t((oprom[offset-4] << 8) | oprom[offset-3]));
- else
- util::stream_format(stream, "@%08x", int16_t((oprom[offset-2] << 8) | oprom[offset-1]));
- break;
-
- case DASM_abs32:
- if(slot == 3)
- util::stream_format(stream, "@%08x", (oprom[offset-6] << 24) | (oprom[offset-5] << 16) | (oprom[offset-4] << 8) | oprom[offset-3]);
- else
- util::stream_format(stream, "@%08x", (oprom[offset-4] << 24) | (oprom[offset-3] << 16) | (oprom[offset-2] << 8) | oprom[offset-1]);
- break;
-
- case DASM_abs8i:
- util::stream_format(stream, "@%02x", oprom[1]);
- break;
-
- case DASM_abs16e:
- util::stream_format(stream, "%04x", (oprom[2] << 8) | oprom[3]);
- break;
-
- case DASM_abs24e:
- util::stream_format(stream, "%08x", (oprom[1] << 16) | (oprom[2] << 8) | oprom[3]);
- break;
-
- case DASM_rel8:
- util::stream_format(stream, "%08x", pc + 2 + int8_t(oprom[1]));
- break;
-
- case DASM_rel16:
- util::stream_format(stream, "%08x", pc + 4 + int16_t((oprom[2] << 8) | oprom[3]));
- break;
-
- case DASM_one:
- util::stream_format(stream, "#1");
- break;
-
- case DASM_two:
- util::stream_format(stream, "#2");
- break;
-
- case DASM_four:
- util::stream_format(stream, "#4");
- break;
-
- case DASM_imm2:
- util::stream_format(stream, "#%x", (opcode >> 4) & 3);
- break;
-
- case DASM_imm3:
- util::stream_format(stream, "#%x", (opcode >> 4) & 7);
- break;
-
- case DASM_imm8:
- util::stream_format(stream, "#%02x", oprom[1]);
- break;
-
- case DASM_imm16:
- util::stream_format(stream, "#%04x", (oprom[2] << 8) | oprom[3]);
- break;
-
- case DASM_imm32:
- util::stream_format(stream, "#%08x", (oprom[2] << 16) | (oprom[3] << 16) | (oprom[4] << 8) | oprom[5]);
- break;
-
- case DASM_ccr:
- util::stream_format(stream, "ccr");
- break;
-
- case DASM_exr:
- util::stream_format(stream, "exr");
- break;
-
- case DASM_macl:
- util::stream_format(stream, "macl");
- break;
-
- case DASM_mach:
- util::stream_format(stream, "mach");
- break;
-
- default:
- util::stream_format(stream, "<%d>", am);
- break;
- }
-}
-
-offs_t h8_device::disassemble_generic(std::ostream &stream, offs_t pc, const uint8_t *oprom, const uint8_t *opram, uint32_t options, const disasm_entry *table)
-{
- uint32_t slot[5];
- slot[0] = (oprom[0] << 8) | oprom[1];
- slot[1] = (oprom[0] << 24) | (oprom[1] << 16) | (oprom[2] << 8) | oprom[3];
- slot[2] = (oprom[0] << 24) | (oprom[1] << 16) | (oprom[4] << 8) | oprom[5];
- slot[3] = (oprom[0] << 24) | (oprom[1] << 16) | (oprom[6] << 8) | oprom[7];
- slot[4] = (oprom[2] << 24) | (oprom[3] << 16) | (oprom[4] << 8) | oprom[5];
-
- int inst;
- for(inst=0;; inst++) {
- const disasm_entry &e = table[inst];
- if((slot[e.slot] & e.mask) == e.val && (slot[0] & e.mask0) == e.val0)
- break;
- }
- const disasm_entry &e = table[inst];
- stream << e.opcode;
-
- if(e.am1 != DASM_none) {
- stream << ' ';
- disassemble_am(stream, e.am1, pc, oprom, slot[e.slot], e.slot, e.flags & DASMFLAG_LENGTHMASK);
- }
- if(e.am2 != DASM_none) {
- stream << ", ";
- disassemble_am(stream, e.am2, pc, oprom, slot[e.slot], e.slot, e.flags & DASMFLAG_LENGTHMASK);
- }
- return e.flags | DASMFLAG_SUPPORTED;
-}
-
-offs_t h8_device::disasm_disassemble(std::ostream &stream, offs_t pc, const uint8_t *oprom, const uint8_t *opram, uint32_t options)
-{
- return disassemble_generic(stream, pc, oprom, opram, options, disasm_entries);
-}
-
uint16_t h8_device::read16i(uint32_t adr)
{
icount--;
@@ -1592,4 +1343,9 @@ void h8_device::set_nz32(uint32_t v)
CCR |= F_N;
}
+util::disasm_interface *h8_device::create_disassembler()
+{
+ return new h8_disassembler;
+}
+
#include "cpu/h8/h8.hxx"