summaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
author Nathan Woods <npwoods@mess.org>2016-11-15 21:31:36 -0500
committer Nathan Woods <npwoods@mess.org>2016-11-15 21:31:36 -0500
commit2b44448c7a8d622220040ba36bfd6a4fb8f1d6f3 (patch)
treeb624abbe2107eb73b39d9b00c60b2e2cdff77899
parent0ca7ac3b2a1a61e4ea7c65564a7bd90561fb13d1 (diff)
Changed the hc11 disassembler to use 'std::ostream &' internally
-rw-r--r--src/devices/cpu/mc68hc11/hc11dasm.cpp61
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;
+}