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

This commit is contained in:
Nathan Woods 2016-10-27 06:28:11 -04:00
parent 0d87ff49b1
commit a372f28b67
2 changed files with 40 additions and 30 deletions

View File

@ -466,11 +466,11 @@ uint32_t m6502_device::disasm_max_opcode_bytes() const
return 4; return 4;
} }
offs_t m6502_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 m6502_device::disassemble_generic(std::ostream &stream, offs_t pc, const uint8_t *oprom, const uint8_t *opram, uint32_t options, const disasm_entry *table)
{ {
const disasm_entry &e = table[oprom[0] | inst_state_base]; const disasm_entry &e = table[oprom[0] | inst_state_base];
uint32_t flags = e.flags | DASMFLAG_SUPPORTED; uint32_t flags = e.flags | DASMFLAG_SUPPORTED;
buffer += sprintf(buffer, "%s", e.opcode); util::stream_format(stream, "%s", e.opcode);
switch(e.mode) { switch(e.mode) {
case DASM_non: case DASM_non:
@ -478,57 +478,57 @@ offs_t m6502_device::disassemble_generic(char *buffer, offs_t pc, const uint8_t
break; break;
case DASM_aba: case DASM_aba:
sprintf(buffer, " $%02x%02x", opram[2], opram[1]); util::stream_format(stream, " $%02x%02x", opram[2], opram[1]);
flags |= 3; flags |= 3;
break; break;
case DASM_abx: case DASM_abx:
sprintf(buffer, " $%02x%02x, x", opram[2], opram[1]); util::stream_format(stream, " $%02x%02x, x", opram[2], opram[1]);
flags |= 3; flags |= 3;
break; break;
case DASM_aby: case DASM_aby:
sprintf(buffer, " $%02x%02x, y", opram[2], opram[1]); util::stream_format(stream, " $%02x%02x, y", opram[2], opram[1]);
flags |= 3; flags |= 3;
break; break;
case DASM_acc: case DASM_acc:
sprintf(buffer, " a"); util::stream_format(stream, " a");
flags |= 1; flags |= 1;
break; break;
case DASM_adr: case DASM_adr:
sprintf(buffer, " $%02x%02x", opram[2], opram[1]); util::stream_format(stream, " $%02x%02x", opram[2], opram[1]);
flags |= 3; flags |= 3;
break; break;
case DASM_bzp: case DASM_bzp:
sprintf(buffer, "%d $%02x", (oprom[0] >> 4) & 7, opram[1]); util::stream_format(stream, "%d $%02x", (oprom[0] >> 4) & 7, opram[1]);
flags |= 2; flags |= 2;
break; break;
case DASM_iax: case DASM_iax:
sprintf(buffer, " ($%02x%02x, x)", opram[2], opram[1]); util::stream_format(stream, " ($%02x%02x, x)", opram[2], opram[1]);
flags |= 3; flags |= 3;
break; break;
case DASM_idx: case DASM_idx:
sprintf(buffer, " ($%02x, x)", opram[1]); util::stream_format(stream, " ($%02x, x)", opram[1]);
flags |= 2; flags |= 2;
break; break;
case DASM_idy: case DASM_idy:
sprintf(buffer, " ($%02x), y", opram[1]); util::stream_format(stream, " ($%02x), y", opram[1]);
flags |= 2; flags |= 2;
break; break;
case DASM_idz: case DASM_idz:
sprintf(buffer, " ($%02x), z", opram[1]); util::stream_format(stream, " ($%02x), z", opram[1]);
flags |= 2; flags |= 2;
break; break;
case DASM_imm: case DASM_imm:
sprintf(buffer, " #$%02x", opram[1]); util::stream_format(stream, " #$%02x", opram[1]);
flags |= 2; flags |= 2;
break; break;
@ -537,87 +537,87 @@ offs_t m6502_device::disassemble_generic(char *buffer, offs_t pc, const uint8_t
break; break;
case DASM_ind: case DASM_ind:
sprintf(buffer, " ($%02x%02x)", opram[2], opram[1]); util::stream_format(stream, " ($%02x%02x)", opram[2], opram[1]);
flags |= 3; flags |= 3;
break; break;
case DASM_isy: case DASM_isy:
sprintf(buffer, " ($%02x, s), y", opram[1]); util::stream_format(stream, " ($%02x, s), y", opram[1]);
flags |= 2; flags |= 2;
break; break;
case DASM_iw2: case DASM_iw2:
sprintf(buffer, " #$%02x%02x", opram[2], opram[1]); util::stream_format(stream, " #$%02x%02x", opram[2], opram[1]);
flags |= 3; flags |= 3;
break; break;
case DASM_iw3: case DASM_iw3:
sprintf(buffer, " #$%02x%02x%02x", opram[3], opram[2], opram[1]); util::stream_format(stream, " #$%02x%02x%02x", opram[3], opram[2], opram[1]);
flags |= 4; flags |= 4;
break; break;
case DASM_rel: case DASM_rel:
sprintf(buffer, " $%04x", (pc & 0xf0000) | uint16_t(pc + 2 + int8_t(opram[1]))); util::stream_format(stream, " $%04x", (pc & 0xf0000) | uint16_t(pc + 2 + int8_t(opram[1])));
flags |= 2; flags |= 2;
break; break;
case DASM_rw2: case DASM_rw2:
sprintf(buffer, " $%04x", (pc & 0xf0000) | uint16_t(pc + 2 + int16_t((opram[2] << 8) | opram[1]))); util::stream_format(stream, " $%04x", (pc & 0xf0000) | uint16_t(pc + 2 + int16_t((opram[2] << 8) | opram[1])));
flags |= 3; flags |= 3;
break; break;
case DASM_zpb: case DASM_zpb:
sprintf(buffer, "%d $%02x, $%04x", (oprom[0] >> 4) & 7, opram[1], (pc & 0xf0000) | uint16_t(pc + 3 + int8_t(opram[2]))); util::stream_format(stream, "%d $%02x, $%04x", (oprom[0] >> 4) & 7, opram[1], (pc & 0xf0000) | uint16_t(pc + 3 + int8_t(opram[2])));
flags |= 3; flags |= 3;
break; break;
case DASM_zpg: case DASM_zpg:
sprintf(buffer, " $%02x", opram[1]); util::stream_format(stream, " $%02x", opram[1]);
flags |= 2; flags |= 2;
break; break;
case DASM_zpi: case DASM_zpi:
sprintf(buffer, " ($%02x)", opram[1]); util::stream_format(stream, " ($%02x)", opram[1]);
flags |= 2; flags |= 2;
break; break;
case DASM_zpx: case DASM_zpx:
sprintf(buffer, " $%02x, x", opram[1]); util::stream_format(stream, " $%02x, x", opram[1]);
flags |= 2; flags |= 2;
break; break;
case DASM_zpy: case DASM_zpy:
sprintf(buffer, " $%02x, y", opram[1]); util::stream_format(stream, " $%02x, y", opram[1]);
flags |= 2; flags |= 2;
break; break;
case DASM_imz: case DASM_imz:
sprintf(buffer, " #$%02x, $%02x", opram[1], opram[2]); util::stream_format(stream, " #$%02x, $%02x", opram[1], opram[2]);
flags |= 3; flags |= 3;
break; break;
case DASM_spg: case DASM_spg:
sprintf(buffer, " \\$%02x", opram[1]); util::stream_format(stream, " \\$%02x", opram[1]);
flags |= 2; flags |= 2;
break; break;
case DASM_biz: case DASM_biz:
sprintf(buffer, " %d, $%02x", (opram[0] >> 5) & 7, opram[1]); util::stream_format(stream, " %d, $%02x", (opram[0] >> 5) & 7, opram[1]);
flags |= 2; flags |= 2;
break; break;
case DASM_bzr: case DASM_bzr:
sprintf(buffer, " %d, $%02x, $%04x", (opram[0] >> 5) & 7, opram[1], (pc & 0xf0000) | uint16_t(pc + 3 + int8_t(opram[2]))); util::stream_format(stream, " %d, $%02x, $%04x", (opram[0] >> 5) & 7, opram[1], (pc & 0xf0000) | uint16_t(pc + 3 + int8_t(opram[2])));
flags |= 3; flags |= 3;
break; break;
case DASM_bar: case DASM_bar:
sprintf(buffer, " %d, a, $%04x", (opram[0] >> 5) & 7, (pc & 0xf0000) | uint16_t(pc + 3 + int8_t(opram[1]))); util::stream_format(stream, " %d, a, $%04x", (opram[0] >> 5) & 7, (pc & 0xf0000) | uint16_t(pc + 3 + int8_t(opram[1])));
flags |= 2; flags |= 2;
break; break;
case DASM_bac: case DASM_bac:
sprintf(buffer, " %d, a", (opram[0] >> 5) & 7); util::stream_format(stream, " %d, a", (opram[0] >> 5) & 7);
flags |= 1; flags |= 1;
break; break;
@ -628,6 +628,15 @@ offs_t m6502_device::disassemble_generic(char *buffer, offs_t pc, const uint8_t
return flags; return flags;
} }
offs_t m6502_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;
}
void m6502_device::prefetch() void m6502_device::prefetch()
{ {
sync = true; sync = true;

View File

@ -171,6 +171,7 @@ protected:
static const disasm_entry disasm_entries[0x100]; static const disasm_entry disasm_entries[0x100];
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);
uint8_t read(uint16_t adr) { return mintf->read(adr); } uint8_t read(uint16_t adr) { return mintf->read(adr); }
uint8_t read_9(uint16_t adr) { return mintf->read_9(adr); } uint8_t read_9(uint16_t adr) { return mintf->read_9(adr); }