diff options
author | 2016-11-15 21:31:36 -0500 | |
---|---|---|
committer | 2016-11-15 21:31:36 -0500 | |
commit | 2b44448c7a8d622220040ba36bfd6a4fb8f1d6f3 (patch) | |
tree | b624abbe2107eb73b39d9b00c60b2e2cdff77899 | |
parent | 0ca7ac3b2a1a61e4ea7c65564a7bd90561fb13d1 (diff) |
Changed the hc11 disassembler to use 'std::ostream &' internally
-rw-r--r-- | src/devices/cpu/mc68hc11/hc11dasm.cpp | 61 |
1 files changed, 30 insertions, 31 deletions
diff --git a/src/devices/cpu/mc68hc11/hc11dasm.cpp b/src/devices/cpu/mc68hc11/hc11dasm.cpp index a696c9069ad..e0ff95a7ad7 100644 --- a/src/devices/cpu/mc68hc11/hc11dasm.cpp +++ b/src/devices/cpu/mc68hc11/hc11dasm.cpp @@ -1152,18 +1152,8 @@ static const M68HC11_OPCODE opcode_table_page4[256] = /*****************************************************************************/ -static char *output; static const uint8_t *rombase; -static void ATTR_PRINTF(1,2) print(const char *fmt, ...) -{ - va_list vl; - - va_start(vl, fmt); - output += vsprintf(output, fmt, vl); - va_end(vl); -} - static uint8_t fetch(void) { return *rombase++; @@ -1177,7 +1167,7 @@ static uint16_t fetch16(void) return w; } -static uint32_t decode_opcode(uint32_t pc, const M68HC11_OPCODE *op_table) +static uint32_t decode_opcode(std::ostream &stream, uint32_t pc, const M68HC11_OPCODE *op_table) { uint8_t imm8, mask; int8_t rel8; @@ -1194,106 +1184,115 @@ static uint32_t decode_opcode(uint32_t pc, const M68HC11_OPCODE *op_table) { case EA_IMM8: imm8 = fetch(); - print("%s 0x%02X", op_table->mnemonic, imm8); + util::stream_format(stream, "%s 0x%02X", op_table->mnemonic, imm8); break; case EA_IMM16: imm16 = fetch16(); - print("%s 0x%04X", op_table->mnemonic, imm16); + util::stream_format(stream, "%s 0x%04X", op_table->mnemonic, imm16); break; case EA_DIRECT: imm8 = fetch(); - print("%s (0x%04X)", op_table->mnemonic, imm8); + util::stream_format(stream, "%s (0x%04X)", op_table->mnemonic, imm8); break; case EA_EXT: imm16 = fetch16(); - print("%s (0x%04X)", op_table->mnemonic, imm16); + util::stream_format(stream, "%s (0x%04X)", op_table->mnemonic, imm16); break; case EA_IND_X: imm8 = fetch(); - print("%s (X+0x%02X)", op_table->mnemonic, imm8); + util::stream_format(stream, "%s (X+0x%02X)", op_table->mnemonic, imm8); break; case EA_REL: rel8 = fetch(); - print("%s [0x%04X]", op_table->mnemonic, pc+2+rel8); + util::stream_format(stream, "%s [0x%04X]", op_table->mnemonic, pc+2+rel8); break; case EA_DIRECT_IMM8: imm8 = fetch(); mask = fetch(); - print("%s (0x%04X), 0x%02X", op_table->mnemonic, imm8, mask); + util::stream_format(stream, "%s (0x%04X), 0x%02X", op_table->mnemonic, imm8, mask); break; case EA_IND_X_IMM8: imm8 = fetch(); mask = fetch(); - print("%s (X+0x%02X), 0x%02X", op_table->mnemonic, imm8, mask); + util::stream_format(stream, "%s (X+0x%02X), 0x%02X", op_table->mnemonic, imm8, mask); break; case EA_DIRECT_IMM8_REL: imm8 = fetch(); mask = fetch(); rel8 = fetch(); - print("%s (0x%04X), 0x%02X, [0x%04X]", op_table->mnemonic, imm8, mask, pc+4+rel8); + util::stream_format(stream, "%s (0x%04X), 0x%02X, [0x%04X]", op_table->mnemonic, imm8, mask, pc+4+rel8); break; case EA_IND_X_IMM8_REL: imm8 = fetch(); mask = fetch(); rel8 = fetch(); - print("%s (X+0x%02X), 0x%02X, [0x%04X]", op_table->mnemonic, imm8, mask, pc+4+rel8); + util::stream_format(stream, "%s (X+0x%02X), 0x%02X, [0x%04X]", op_table->mnemonic, imm8, mask, pc+4+rel8); break; case EA_IND_Y: imm8 = fetch(); - print("%s (Y+0x%02X)", op_table->mnemonic, imm8); + util::stream_format(stream, "%s (Y+0x%02X)", op_table->mnemonic, imm8); break; case EA_IND_Y_IMM8: imm8 = fetch(); mask = fetch(); - print("%s (Y+0x%02X), 0x%02X", op_table->mnemonic, imm8, mask); + util::stream_format(stream, "%s (Y+0x%02X), 0x%02X", op_table->mnemonic, imm8, mask); break; case EA_IND_Y_IMM8_REL: imm8 = fetch(); mask = fetch(); rel8 = fetch(); - print("%s (Y+0x%02X), 0x%02X, [0x%04X]", op_table->mnemonic, imm8, mask, pc+2+rel8); + util::stream_format(stream, "%s (Y+0x%02X), 0x%02X, [0x%04X]", op_table->mnemonic, imm8, mask, pc+2+rel8); break; case PAGE2: op2 = fetch(); - return decode_opcode(pc, &opcode_table_page2[op2]); + return decode_opcode(stream, pc, &opcode_table_page2[op2]); case PAGE3: op2 = fetch(); - return decode_opcode(pc, &opcode_table_page3[op2]); + return decode_opcode(stream, pc, &opcode_table_page3[op2]); case PAGE4: op2 = fetch(); - return decode_opcode(pc, &opcode_table_page4[op2]); + return decode_opcode(stream, pc, &opcode_table_page4[op2]); default: - print("%s", op_table->mnemonic); + util::stream_format(stream, "%s", op_table->mnemonic); } return flags; } -CPU_DISASSEMBLE( hc11 ) +static offs_t internal_disasm_hc11(cpu_device *device, std::ostream &stream, offs_t pc, const uint8_t *oprom, const uint8_t *opram, int options) { uint32_t flags; uint8_t opcode; - output = buffer; rombase = oprom; opcode = fetch(); - flags = decode_opcode(pc, &opcode_table[opcode]); + flags = decode_opcode(stream, pc, &opcode_table[opcode]); return (rombase-oprom) | flags | DASMFLAG_SUPPORTED; } + + +CPU_DISASSEMBLE(hc11) +{ + std::ostringstream stream; + offs_t result = internal_disasm_hc11(device, stream, pc, oprom, opram, options); + std::string stream_str = stream.str(); + strcpy(buffer, stream_str.c_str()); + return result; +} |