summaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
author AJR <ajrhacker@users.noreply.github.com>2019-09-02 20:53:09 -0400
committer AJR <ajrhacker@users.noreply.github.com>2019-09-02 20:56:58 -0400
commit62c658d9d0eb73e3dda538ef599ddc0ec03f5c12 (patch)
tree5c3661fb679b56efd920fa54c99735d989177b9a
parent08cd02a876cba1e14b2f2329f0cdd782a3675c73 (diff)
h8: Disassembly improvements
- Correct sign extension for 16-bit absolute addresses - Use H' prefix for hexadecimal numbers - Restrict address length depending on model - Format arguments in separate column
-rw-r--r--src/devices/cpu/h8/h8d.cpp71
-rw-r--r--src/devices/cpu/h8/h8d.h5
-rw-r--r--src/devices/cpu/h8/h8hd.cpp2
-rw-r--r--src/devices/cpu/h8/h8s2000d.cpp2
-rw-r--r--src/devices/cpu/h8/h8s2600d.cpp2
5 files changed, 51 insertions, 31 deletions
diff --git a/src/devices/cpu/h8/h8d.cpp b/src/devices/cpu/h8/h8d.cpp
index b157aedd3c7..921ef85a522 100644
--- a/src/devices/cpu/h8/h8d.cpp
+++ b/src/devices/cpu/h8/h8d.cpp
@@ -12,11 +12,11 @@
#include "h8d.h"
#include "cpu/h8/h8d.hxx"
-h8_disassembler::h8_disassembler(const disasm_entry *_table) : table(_table)
+h8_disassembler::h8_disassembler(const disasm_entry *_table, bool _advanced) : table(_table), advanced(_advanced)
{
}
-h8_disassembler::h8_disassembler() : h8_disassembler(disasm_entries)
+h8_disassembler::h8_disassembler() : h8_disassembler(disasm_entries, false)
{
}
@@ -89,7 +89,7 @@ void h8_disassembler::disassemble_am(std::ostream &stream, int am, offs_t pc, co
break;
case DASM_r16d16h:
- util::stream_format(stream, "@(%x, %s)", opcodes.r16(epc-2), r16_names[(opcode >> 4) & 7]);
+ util::stream_format(stream, "@(h'%x, %s)", opcodes.r16(epc-2), r16_names[(opcode >> 4) & 7]);
break;
case DASM_r32ih:
@@ -113,11 +113,11 @@ void h8_disassembler::disassemble_am(std::ostream &stream, int am, offs_t pc, co
break;
case DASM_r32d16h:
- util::stream_format(stream, "@(%x, %s)", opcodes.r16(epc-2), r32_names[(opcode >> 4) & 7]);
+ util::stream_format(stream, "@(h'%x, %s)", opcodes.r16(epc-2), r32_names[(opcode >> 4) & 7]);
break;
case DASM_r32d32hh:
- util::stream_format(stream, "@(%x, %s)", opcodes.r32(epc-4), r32_names[(opcode >> 20) & 7]);
+ util::stream_format(stream, "@(h'%x, %s)", opcodes.r32(epc-4), r32_names[(opcode >> 20) & 7]);
break;
case DASM_psp:
@@ -141,41 +141,60 @@ void h8_disassembler::disassemble_am(std::ostream &stream, int am, offs_t pc, co
break;
case DASM_abs8:
- util::stream_format(stream, "@%08x", 0xffffff00 | opcodes.r8(pc+1));
+ if (advanced)
+ util::stream_format(stream, "@h'%06x", 0xffff00 | opcodes.r8(pc+1));
+ else
+ util::stream_format(stream, "@h'%04x", 0xff00 | opcodes.r8(pc+1));
break;
case DASM_abs16:
if(offset >= 6)
- util::stream_format(stream, "@%08x", s16(opcodes.r16(epc-4)));
+ {
+ if (advanced)
+ util::stream_format(stream, "@h'%06x", s32(s16(opcodes.r16(epc-4))) & 0xffffff);
+ else
+ util::stream_format(stream, "@h'%04x", opcodes.r16(epc-4));
+ }
else
- util::stream_format(stream, "@%08x", s16(opcodes.r16(epc-2)));
+ {
+ if (advanced)
+ util::stream_format(stream, "@h'%06x", s32(s16(opcodes.r16(epc-2))) & 0xffffff);
+ else
+ util::stream_format(stream, "@h'%04x", opcodes.r16(epc-2));
+ }
break;
case DASM_abs32:
if(slot == 3)
- util::stream_format(stream, "@%08x", opcodes.r32(epc-6));
+ util::stream_format(stream, "@h'%06x", opcodes.r32(epc-6));
else
- util::stream_format(stream, "@%08x", opcodes.r32(epc-4));
+ util::stream_format(stream, "@h'%06x", opcodes.r32(epc-4));
break;
case DASM_abs8i:
- util::stream_format(stream, "@%02x", opcodes.r8(pc+1));
+ util::stream_format(stream, "@h'%02x", opcodes.r8(pc+1));
break;
case DASM_abs16e:
- util::stream_format(stream, "%04x", opcodes.r16(pc+2));
+ util::stream_format(stream, "h'%04x", opcodes.r16(pc+2));
break;
case DASM_abs24e:
- util::stream_format(stream, "%08x", opcodes.r32(pc) & 0xffffff);
+ util::stream_format(stream, "h'%06x", opcodes.r32(pc) & 0xffffff);
break;
case DASM_rel8:
- util::stream_format(stream, "%08x", pc + 2 + s8(opcodes.r8(pc+1)));
+ if (advanced)
+ util::stream_format(stream, "h'%06x", (pc + 2 + s8(opcodes.r8(pc+1))) & 0xffffff);
+ else
+ util::stream_format(stream, "h'%04x", (pc + 2 + s8(opcodes.r8(pc+1))) & 0xffff);
break;
case DASM_rel16:
- util::stream_format(stream, "%08x", pc + 4 + s16(opcodes.r16(pc+2)));
+ if (advanced)
+ util::stream_format(stream, "h'%06x", (pc + 4 + s16(opcodes.r16(pc+2))) & 0xffffff);
+ else
+ util::stream_format(stream, "h'%04x", (pc + 4 + s16(opcodes.r16(pc+2))) & 0xffff);
break;
case DASM_one:
@@ -199,15 +218,15 @@ void h8_disassembler::disassemble_am(std::ostream &stream, int am, offs_t pc, co
break;
case DASM_imm8:
- util::stream_format(stream, "#%02x", opcodes.r8(pc+1));
+ util::stream_format(stream, "#h'%02x", opcodes.r8(pc+1));
break;
case DASM_imm16:
- util::stream_format(stream, "#%04x", opcodes.r16(pc+2));
+ util::stream_format(stream, "#h'%04x", opcodes.r16(pc+2));
break;
case DASM_imm32:
- util::stream_format(stream, "#%08x", opcodes.r32(pc+2));
+ util::stream_format(stream, "#h'%08x", opcodes.r32(pc+2));
break;
case DASM_ccr:
@@ -248,15 +267,15 @@ offs_t h8_disassembler::disassemble(std::ostream &stream, offs_t pc, const data_
break;
}
const disasm_entry &e = table[inst];
- stream << e.opcode;
-
- if(e.am1 != DASM_none) {
- stream << ' ';
+ if(e.am1 == DASM_none)
+ stream << e.opcode;
+ else {
+ util::stream_format(stream, "%-08s", e.opcode);
disassemble_am(stream, e.am1, pc, opcodes, slot[e.slot], e.slot, e.flags & LENGTHMASK);
- }
- if(e.am2 != DASM_none) {
- stream << ", ";
- disassemble_am(stream, e.am2, pc, opcodes, slot[e.slot], e.slot, e.flags & LENGTHMASK);
+ if(e.am2 != DASM_none) {
+ stream << ", ";
+ disassemble_am(stream, e.am2, pc, opcodes, slot[e.slot], e.slot, e.flags & LENGTHMASK);
+ }
}
return e.flags | SUPPORTED;
}
diff --git a/src/devices/cpu/h8/h8d.h b/src/devices/cpu/h8/h8d.h
index f2023ba5e28..c58208d4bfe 100644
--- a/src/devices/cpu/h8/h8d.h
+++ b/src/devices/cpu/h8/h8d.h
@@ -26,7 +26,7 @@ protected:
};
public:
- h8_disassembler(const disasm_entry *_table);
+ h8_disassembler(const disasm_entry *_table, bool _advanced);
h8_disassembler();
virtual u32 opcode_alignment() const override;
@@ -93,7 +93,8 @@ protected:
void disassemble_am(std::ostream &stream, int am, offs_t pc, const data_buffer &opcodes, u32 opcode, int slot, int offset);
- const disasm_entry *table;
+ const disasm_entry *const table;
+ const bool advanced;
static const disasm_entry disasm_entries[];
};
diff --git a/src/devices/cpu/h8/h8hd.cpp b/src/devices/cpu/h8/h8hd.cpp
index c6cb3238784..ee3a1d4b4a2 100644
--- a/src/devices/cpu/h8/h8hd.cpp
+++ b/src/devices/cpu/h8/h8hd.cpp
@@ -12,6 +12,6 @@
#include "h8hd.h"
#include "cpu/h8/h8hd.hxx"
-h8h_disassembler::h8h_disassembler() : h8_disassembler(disasm_entries)
+h8h_disassembler::h8h_disassembler() : h8_disassembler(disasm_entries, true)
{
}
diff --git a/src/devices/cpu/h8/h8s2000d.cpp b/src/devices/cpu/h8/h8s2000d.cpp
index 1e0b3830f53..e85643b3cbe 100644
--- a/src/devices/cpu/h8/h8s2000d.cpp
+++ b/src/devices/cpu/h8/h8s2000d.cpp
@@ -12,6 +12,6 @@
#include "h8s2000d.h"
#include "cpu/h8/h8s2000d.hxx"
-h8s2000_disassembler::h8s2000_disassembler() : h8_disassembler(disasm_entries)
+h8s2000_disassembler::h8s2000_disassembler() : h8_disassembler(disasm_entries, true)
{
}
diff --git a/src/devices/cpu/h8/h8s2600d.cpp b/src/devices/cpu/h8/h8s2600d.cpp
index 7e55784bed0..038d8525e3c 100644
--- a/src/devices/cpu/h8/h8s2600d.cpp
+++ b/src/devices/cpu/h8/h8s2600d.cpp
@@ -12,6 +12,6 @@
#include "h8s2600d.h"
#include "cpu/h8/h8s2600d.hxx"
-h8s2600_disassembler::h8s2600_disassembler() : h8_disassembler(disasm_entries)
+h8s2600_disassembler::h8s2600_disassembler() : h8_disassembler(disasm_entries, true)
{
}