summaryrefslogtreecommitdiffstatshomepage
path: root/src/devices/cpu
diff options
context:
space:
mode:
author Nathan Woods <npwoods@mess.org>2016-11-19 09:39:12 -0500
committer Nathan Woods <npwoods@mess.org>2016-11-19 09:39:12 -0500
commit42f7a46e85c8bff32095d5bc79ca933584ce97e9 (patch)
tree4d19433f44deb8665a2b4bdc501ec8d006594bb7 /src/devices/cpu
parentf53a594cb5dc71a00939f7887b22f68694fede03 (diff)
Changed the h8 disassembler to use 'std::ostream &' internally
Diffstat (limited to 'src/devices/cpu')
-rw-r--r--src/devices/cpu/h8/h8.cpp118
-rw-r--r--src/devices/cpu/h8/h8.h3
2 files changed, 65 insertions, 56 deletions
diff --git a/src/devices/cpu/h8/h8.cpp b/src/devices/cpu/h8/h8.cpp
index d7b3abf1bb1..7a95b59b922 100644
--- a/src/devices/cpu/h8/h8.cpp
+++ b/src/devices/cpu/h8/h8.cpp
@@ -334,7 +334,7 @@ uint32_t h8_device::disasm_max_opcode_bytes() const
return 10;
}
-void h8_device::disassemble_am(char *&buffer, int am, offs_t pc, const uint8_t *oprom, uint32_t opcode, int slot, int offset)
+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",
@@ -352,194 +352,194 @@ void h8_device::disassemble_am(char *&buffer, int am, offs_t pc, const uint8_t *
switch(am) {
case DASM_r8l:
- buffer += sprintf(buffer, "%s", r8_names[opcode & 15]);
+ util::stream_format(stream, "%s", r8_names[opcode & 15]);
break;
case DASM_r8h:
- buffer += sprintf(buffer, "%s", r8_names[(opcode >> 4) & 15]);
+ util::stream_format(stream, "%s", r8_names[(opcode >> 4) & 15]);
break;
case DASM_r8u:
- buffer += sprintf(buffer, "%s", r8_names[(opcode >> 8) & 15]);
+ util::stream_format(stream, "%s", r8_names[(opcode >> 8) & 15]);
break;
case DASM_r16l:
- buffer += sprintf(buffer, "%s", r16_names[opcode & 15]);
+ util::stream_format(stream, "%s", r16_names[opcode & 15]);
break;
case DASM_r16h:
- buffer += sprintf(buffer, "%s", r16_names[(opcode >> 4) & 15]);
+ util::stream_format(stream, "%s", r16_names[(opcode >> 4) & 15]);
break;
case DASM_r32l:
- buffer += sprintf(buffer, "%s", r32_names[opcode & 7]);
+ util::stream_format(stream, "%s", r32_names[opcode & 7]);
break;
case DASM_r32h:
- buffer += sprintf(buffer, "%s", r32_names[(opcode >> 4) & 7]);
+ util::stream_format(stream, "%s", r32_names[(opcode >> 4) & 7]);
break;
case DASM_r16ih:
- buffer += sprintf(buffer, "@%s", r16_names[(opcode >> 4) & 7]);
+ util::stream_format(stream, "@%s", r16_names[(opcode >> 4) & 7]);
break;
case DASM_r16ihh:
- buffer += sprintf(buffer, "@%s", r16_names[(opcode >> 20) & 7]);
+ util::stream_format(stream, "@%s", r16_names[(opcode >> 20) & 7]);
break;
case DASM_pr16h:
- buffer += sprintf(buffer, "@-%s", r16_names[(opcode >> 4) & 7]);
+ util::stream_format(stream, "@-%s", r16_names[(opcode >> 4) & 7]);
break;
case DASM_r16ph:
- buffer += sprintf(buffer, "@%s+", r16_names[(opcode >> 4) & 7]);
+ util::stream_format(stream, "@%s+", r16_names[(opcode >> 4) & 7]);
break;
case DASM_r16d16h:
- buffer += sprintf(buffer, "@(%x, %s)", (oprom[offset-2] << 8) | oprom[offset-1], r16_names[(opcode >> 4) & 7]);
+ util::stream_format(stream, "@(%x, %s)", (oprom[offset-2] << 8) | oprom[offset-1], r16_names[(opcode >> 4) & 7]);
break;
case DASM_r32ih:
- buffer += sprintf(buffer, "@%s", r32_names[(opcode >> 4) & 7]);
+ util::stream_format(stream, "@%s", r32_names[(opcode >> 4) & 7]);
break;
case DASM_r32ihh:
- buffer += sprintf(buffer, "@%s", r32_names[(opcode >> 20) & 7]);
+ util::stream_format(stream, "@%s", r32_names[(opcode >> 20) & 7]);
break;
case DASM_pr32h:
- buffer += sprintf(buffer, "@-%s", r32_names[(opcode >> 4) & 7]);
+ util::stream_format(stream, "@-%s", r32_names[(opcode >> 4) & 7]);
break;
case DASM_r32pl:
- buffer += sprintf(buffer, "@%s+", r32_names[opcode & 7]);
+ util::stream_format(stream, "@%s+", r32_names[opcode & 7]);
break;
case DASM_r32ph:
- buffer += sprintf(buffer, "@%s+", r32_names[(opcode >> 4) & 7]);
+ util::stream_format(stream, "@%s+", r32_names[(opcode >> 4) & 7]);
break;
case DASM_r32d16h:
- buffer += sprintf(buffer, "@(%x, %s)", (oprom[offset-2] << 8) | oprom[offset-1], r32_names[(opcode >> 4) & 7]);
+ util::stream_format(stream, "@(%x, %s)", (oprom[offset-2] << 8) | oprom[offset-1], r32_names[(opcode >> 4) & 7]);
break;
case DASM_r32d32hh:
- buffer += sprintf(buffer, "@(%x, %s)", (oprom[offset-4] << 24) | (oprom[offset-3] << 16) | (oprom[offset-2] << 8) | oprom[offset-1], r32_names[(opcode >> 20) & 7]);
+ 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:
- buffer += sprintf(buffer, "@-sp");
+ util::stream_format(stream, "@-sp");
break;
case DASM_spp:
- buffer += sprintf(buffer, "@sp+");
+ util::stream_format(stream, "@sp+");
break;
case DASM_r32n2l:
- buffer += sprintf(buffer, "%s-%s", r32_names[opcode & 6], r32_names[(opcode & 6) + 1]);
+ util::stream_format(stream, "%s-%s", r32_names[opcode & 6], r32_names[(opcode & 6) + 1]);
break;
case DASM_r32n3l:
- buffer += sprintf(buffer, "%s-%s", r32_names[opcode & 4], r32_names[(opcode & 4) + 2]);
+ util::stream_format(stream, "%s-%s", r32_names[opcode & 4], r32_names[(opcode & 4) + 2]);
break;
case DASM_r32n4l:
- buffer += sprintf(buffer, "%s-%s", r32_names[opcode & 4], r32_names[(opcode & 4) + 3]);
+ util::stream_format(stream, "%s-%s", r32_names[opcode & 4], r32_names[(opcode & 4) + 3]);
break;
case DASM_abs8:
- buffer += sprintf(buffer, "@%08x", 0xffffff00 | oprom[1]);
+ util::stream_format(stream, "@%08x", 0xffffff00 | oprom[1]);
break;
case DASM_abs16:
if(offset >= 6)
- buffer += sprintf(buffer, "@%08x", int16_t((oprom[offset-4] << 8) | oprom[offset-3]));
+ util::stream_format(stream, "@%08x", int16_t((oprom[offset-4] << 8) | oprom[offset-3]));
else
- buffer += sprintf(buffer, "@%08x", int16_t((oprom[offset-2] << 8) | oprom[offset-1]));
+ util::stream_format(stream, "@%08x", int16_t((oprom[offset-2] << 8) | oprom[offset-1]));
break;
case DASM_abs32:
if(slot == 3)
- buffer += sprintf(buffer, "@%08x", (oprom[offset-6] << 24) | (oprom[offset-5] << 16) | (oprom[offset-4] << 8) | oprom[offset-3]);
+ util::stream_format(stream, "@%08x", (oprom[offset-6] << 24) | (oprom[offset-5] << 16) | (oprom[offset-4] << 8) | oprom[offset-3]);
else
- buffer += sprintf(buffer, "@%08x", (oprom[offset-4] << 24) | (oprom[offset-3] << 16) | (oprom[offset-2] << 8) | oprom[offset-1]);
+ util::stream_format(stream, "@%08x", (oprom[offset-4] << 24) | (oprom[offset-3] << 16) | (oprom[offset-2] << 8) | oprom[offset-1]);
break;
case DASM_abs8i:
- buffer += sprintf(buffer, "@%02x", oprom[1]);
+ util::stream_format(stream, "@%02x", oprom[1]);
break;
case DASM_abs16e:
- buffer += sprintf(buffer, "%04x", (oprom[2] << 8) | oprom[3]);
+ util::stream_format(stream, "%04x", (oprom[2] << 8) | oprom[3]);
break;
case DASM_abs24e:
- buffer += sprintf(buffer, "%08x", (oprom[1] << 16) | (oprom[2] << 8) | oprom[3]);
+ util::stream_format(stream, "%08x", (oprom[1] << 16) | (oprom[2] << 8) | oprom[3]);
break;
case DASM_rel8:
- buffer += sprintf(buffer, "%08x", pc + 2 + int8_t(oprom[1]));
+ util::stream_format(stream, "%08x", pc + 2 + int8_t(oprom[1]));
break;
case DASM_rel16:
- buffer += sprintf(buffer, "%08x", pc + 4 + int16_t((oprom[2] << 8) | oprom[3]));
+ util::stream_format(stream, "%08x", pc + 4 + int16_t((oprom[2] << 8) | oprom[3]));
break;
case DASM_one:
- buffer += sprintf(buffer, "#1");
+ util::stream_format(stream, "#1");
break;
case DASM_two:
- buffer += sprintf(buffer, "#2");
+ util::stream_format(stream, "#2");
break;
case DASM_four:
- buffer += sprintf(buffer, "#4");
+ util::stream_format(stream, "#4");
break;
case DASM_imm2:
- buffer += sprintf(buffer, "#%x", (opcode >> 4) & 3);
+ util::stream_format(stream, "#%x", (opcode >> 4) & 3);
break;
case DASM_imm3:
- buffer += sprintf(buffer, "#%x", (opcode >> 4) & 7);
+ util::stream_format(stream, "#%x", (opcode >> 4) & 7);
break;
case DASM_imm8:
- buffer += sprintf(buffer, "#%02x", oprom[1]);
+ util::stream_format(stream, "#%02x", oprom[1]);
break;
case DASM_imm16:
- buffer += sprintf(buffer, "#%04x", (oprom[2] << 8) | oprom[3]);
+ util::stream_format(stream, "#%04x", (oprom[2] << 8) | oprom[3]);
break;
case DASM_imm32:
- buffer += sprintf(buffer, "#%08x", (oprom[2] << 16) | (oprom[3] << 16) | (oprom[4] << 8) | oprom[5]);
+ util::stream_format(stream, "#%08x", (oprom[2] << 16) | (oprom[3] << 16) | (oprom[4] << 8) | oprom[5]);
break;
case DASM_ccr:
- buffer += sprintf(buffer, "ccr");
+ util::stream_format(stream, "ccr");
break;
case DASM_exr:
- buffer += sprintf(buffer, "exr");
+ util::stream_format(stream, "exr");
break;
case DASM_macl:
- buffer += sprintf(buffer, "macl");
+ util::stream_format(stream, "macl");
break;
case DASM_mach:
- buffer += sprintf(buffer, "mach");
+ util::stream_format(stream, "mach");
break;
default:
- buffer += sprintf(buffer, "<%d>", am);
+ util::stream_format(stream, "<%d>", am);
break;
}
}
-offs_t h8_device::disassemble_generic(char *buffer, offs_t pc, const uint8_t *oprom, const uint8_t *opram, uint32_t options, const disasm_entry *table)
+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];
@@ -555,20 +555,28 @@ offs_t h8_device::disassemble_generic(char *buffer, offs_t pc, const uint8_t *op
break;
}
const disasm_entry &e = table[inst];
- buffer += sprintf(buffer, "%s", e.opcode);
+ stream << e.opcode;
if(e.am1 != DASM_none) {
- *buffer++ = ' ';
- disassemble_am(buffer, e.am1, pc, oprom, slot[e.slot], e.slot, e.flags & DASMFLAG_LENGTHMASK);
+ stream << ' ';
+ disassemble_am(stream, e.am1, pc, oprom, slot[e.slot], e.slot, e.flags & DASMFLAG_LENGTHMASK);
}
if(e.am2 != DASM_none) {
- *buffer++ = ',';
- *buffer++ = ' ';
- disassemble_am(buffer, e.am2, pc, oprom, slot[e.slot], e.slot, e.flags & DASMFLAG_LENGTHMASK);
+ 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::disassemble_generic(char *buffer, offs_t pc, const uint8_t *oprom, const uint8_t *opram, uint32_t options, const disasm_entry *table)
+{
+ std::ostringstream stream;
+ offs_t result = disassemble_generic(stream, pc, oprom, opram, options, table);
+ std::string stream_str = stream.str();
+ strcpy(buffer, stream_str.c_str());
+ return result;
+}
+
offs_t h8_device::disasm_disassemble(char *buffer, offs_t pc, const uint8_t *oprom, const uint8_t *opram, uint32_t options)
{
return disassemble_generic(buffer, pc, oprom, opram, options, disasm_entries);
diff --git a/src/devices/cpu/h8/h8.h b/src/devices/cpu/h8/h8.h
index 8a106ed852d..735df6f9de9 100644
--- a/src/devices/cpu/h8/h8.h
+++ b/src/devices/cpu/h8/h8.h
@@ -208,8 +208,9 @@ protected:
static const disasm_entry disasm_entries[];
+ offs_t disassemble_generic(std::ostream &stream, offs_t pc, const uint8_t *oprom, const uint8_t *opram, uint32_t options, const disasm_entry *table);
offs_t disassemble_generic(char *buffer, offs_t pc, const uint8_t *oprom, const uint8_t *opram, uint32_t options, const disasm_entry *table);
- void disassemble_am(char *&buffer, int am, offs_t pc, const uint8_t *oprom, uint32_t opcode, int slot, int offset);
+ void disassemble_am(std::ostream &stream, int am, offs_t pc, const uint8_t *oprom, uint32_t opcode, int slot, int offset);
virtual void do_exec_full();
virtual void do_exec_partial();