Changed the h8 disassembler to use 'std::ostream &' internally

This commit is contained in:
Nathan Woods 2016-11-19 09:39:12 -05:00
parent f53a594cb5
commit 42f7a46e85
2 changed files with 65 additions and 56 deletions

View File

@ -334,7 +334,7 @@ uint32_t h8_device::disasm_max_opcode_bytes() const
return 10; 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] = { static const char *const r8_names[16] = {
"r0h", "r1h", "r2h", "r3h", "r4h", "r5h", "r6h", "r7h", "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) { switch(am) {
case DASM_r8l: case DASM_r8l:
buffer += sprintf(buffer, "%s", r8_names[opcode & 15]); util::stream_format(stream, "%s", r8_names[opcode & 15]);
break; break;
case DASM_r8h: case DASM_r8h:
buffer += sprintf(buffer, "%s", r8_names[(opcode >> 4) & 15]); util::stream_format(stream, "%s", r8_names[(opcode >> 4) & 15]);
break; break;
case DASM_r8u: case DASM_r8u:
buffer += sprintf(buffer, "%s", r8_names[(opcode >> 8) & 15]); util::stream_format(stream, "%s", r8_names[(opcode >> 8) & 15]);
break; break;
case DASM_r16l: case DASM_r16l:
buffer += sprintf(buffer, "%s", r16_names[opcode & 15]); util::stream_format(stream, "%s", r16_names[opcode & 15]);
break; break;
case DASM_r16h: case DASM_r16h:
buffer += sprintf(buffer, "%s", r16_names[(opcode >> 4) & 15]); util::stream_format(stream, "%s", r16_names[(opcode >> 4) & 15]);
break; break;
case DASM_r32l: case DASM_r32l:
buffer += sprintf(buffer, "%s", r32_names[opcode & 7]); util::stream_format(stream, "%s", r32_names[opcode & 7]);
break; break;
case DASM_r32h: case DASM_r32h:
buffer += sprintf(buffer, "%s", r32_names[(opcode >> 4) & 7]); util::stream_format(stream, "%s", r32_names[(opcode >> 4) & 7]);
break; break;
case DASM_r16ih: case DASM_r16ih:
buffer += sprintf(buffer, "@%s", r16_names[(opcode >> 4) & 7]); util::stream_format(stream, "@%s", r16_names[(opcode >> 4) & 7]);
break; break;
case DASM_r16ihh: case DASM_r16ihh:
buffer += sprintf(buffer, "@%s", r16_names[(opcode >> 20) & 7]); util::stream_format(stream, "@%s", r16_names[(opcode >> 20) & 7]);
break; break;
case DASM_pr16h: case DASM_pr16h:
buffer += sprintf(buffer, "@-%s", r16_names[(opcode >> 4) & 7]); util::stream_format(stream, "@-%s", r16_names[(opcode >> 4) & 7]);
break; break;
case DASM_r16ph: case DASM_r16ph:
buffer += sprintf(buffer, "@%s+", r16_names[(opcode >> 4) & 7]); util::stream_format(stream, "@%s+", r16_names[(opcode >> 4) & 7]);
break; break;
case DASM_r16d16h: 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; break;
case DASM_r32ih: case DASM_r32ih:
buffer += sprintf(buffer, "@%s", r32_names[(opcode >> 4) & 7]); util::stream_format(stream, "@%s", r32_names[(opcode >> 4) & 7]);
break; break;
case DASM_r32ihh: case DASM_r32ihh:
buffer += sprintf(buffer, "@%s", r32_names[(opcode >> 20) & 7]); util::stream_format(stream, "@%s", r32_names[(opcode >> 20) & 7]);
break; break;
case DASM_pr32h: case DASM_pr32h:
buffer += sprintf(buffer, "@-%s", r32_names[(opcode >> 4) & 7]); util::stream_format(stream, "@-%s", r32_names[(opcode >> 4) & 7]);
break; break;
case DASM_r32pl: case DASM_r32pl:
buffer += sprintf(buffer, "@%s+", r32_names[opcode & 7]); util::stream_format(stream, "@%s+", r32_names[opcode & 7]);
break; break;
case DASM_r32ph: case DASM_r32ph:
buffer += sprintf(buffer, "@%s+", r32_names[(opcode >> 4) & 7]); util::stream_format(stream, "@%s+", r32_names[(opcode >> 4) & 7]);
break; break;
case DASM_r32d16h: 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; break;
case DASM_r32d32hh: 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; break;
case DASM_psp: case DASM_psp:
buffer += sprintf(buffer, "@-sp"); util::stream_format(stream, "@-sp");
break; break;
case DASM_spp: case DASM_spp:
buffer += sprintf(buffer, "@sp+"); util::stream_format(stream, "@sp+");
break; break;
case DASM_r32n2l: 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; break;
case DASM_r32n3l: 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; break;
case DASM_r32n4l: 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; break;
case DASM_abs8: case DASM_abs8:
buffer += sprintf(buffer, "@%08x", 0xffffff00 | oprom[1]); util::stream_format(stream, "@%08x", 0xffffff00 | oprom[1]);
break; break;
case DASM_abs16: case DASM_abs16:
if(offset >= 6) 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 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; break;
case DASM_abs32: case DASM_abs32:
if(slot == 3) 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 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; break;
case DASM_abs8i: case DASM_abs8i:
buffer += sprintf(buffer, "@%02x", oprom[1]); util::stream_format(stream, "@%02x", oprom[1]);
break; break;
case DASM_abs16e: case DASM_abs16e:
buffer += sprintf(buffer, "%04x", (oprom[2] << 8) | oprom[3]); util::stream_format(stream, "%04x", (oprom[2] << 8) | oprom[3]);
break; break;
case DASM_abs24e: 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; break;
case DASM_rel8: 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; break;
case DASM_rel16: 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; break;
case DASM_one: case DASM_one:
buffer += sprintf(buffer, "#1"); util::stream_format(stream, "#1");
break; break;
case DASM_two: case DASM_two:
buffer += sprintf(buffer, "#2"); util::stream_format(stream, "#2");
break; break;
case DASM_four: case DASM_four:
buffer += sprintf(buffer, "#4"); util::stream_format(stream, "#4");
break; break;
case DASM_imm2: case DASM_imm2:
buffer += sprintf(buffer, "#%x", (opcode >> 4) & 3); util::stream_format(stream, "#%x", (opcode >> 4) & 3);
break; break;
case DASM_imm3: case DASM_imm3:
buffer += sprintf(buffer, "#%x", (opcode >> 4) & 7); util::stream_format(stream, "#%x", (opcode >> 4) & 7);
break; break;
case DASM_imm8: case DASM_imm8:
buffer += sprintf(buffer, "#%02x", oprom[1]); util::stream_format(stream, "#%02x", oprom[1]);
break; break;
case DASM_imm16: case DASM_imm16:
buffer += sprintf(buffer, "#%04x", (oprom[2] << 8) | oprom[3]); util::stream_format(stream, "#%04x", (oprom[2] << 8) | oprom[3]);
break; break;
case DASM_imm32: 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; break;
case DASM_ccr: case DASM_ccr:
buffer += sprintf(buffer, "ccr"); util::stream_format(stream, "ccr");
break; break;
case DASM_exr: case DASM_exr:
buffer += sprintf(buffer, "exr"); util::stream_format(stream, "exr");
break; break;
case DASM_macl: case DASM_macl:
buffer += sprintf(buffer, "macl"); util::stream_format(stream, "macl");
break; break;
case DASM_mach: case DASM_mach:
buffer += sprintf(buffer, "mach"); util::stream_format(stream, "mach");
break; break;
default: default:
buffer += sprintf(buffer, "<%d>", am); util::stream_format(stream, "<%d>", am);
break; 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]; uint32_t slot[5];
slot[0] = (oprom[0] << 8) | oprom[1]; 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; break;
} }
const disasm_entry &e = table[inst]; const disasm_entry &e = table[inst];
buffer += sprintf(buffer, "%s", e.opcode); stream << e.opcode;
if(e.am1 != DASM_none) { if(e.am1 != DASM_none) {
*buffer++ = ' '; stream << ' ';
disassemble_am(buffer, e.am1, pc, oprom, slot[e.slot], e.slot, e.flags & DASMFLAG_LENGTHMASK); disassemble_am(stream, e.am1, pc, oprom, slot[e.slot], e.slot, e.flags & DASMFLAG_LENGTHMASK);
} }
if(e.am2 != DASM_none) { if(e.am2 != DASM_none) {
*buffer++ = ','; stream << ", ";
*buffer++ = ' '; disassemble_am(stream, e.am2, pc, oprom, slot[e.slot], e.slot, e.flags & DASMFLAG_LENGTHMASK);
disassemble_am(buffer, e.am2, pc, oprom, slot[e.slot], e.slot, e.flags & DASMFLAG_LENGTHMASK);
} }
return e.flags | DASMFLAG_SUPPORTED; 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) 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); return disassemble_generic(buffer, pc, oprom, opram, options, disasm_entries);

View File

@ -208,8 +208,9 @@ protected:
static const disasm_entry disasm_entries[]; 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); 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_full();
virtual void do_exec_partial(); virtual void do_exec_partial();