summaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
author R. Belmont <rb6502@users.noreply.github.com>2016-10-27 16:27:38 -0400
committer GitHub <noreply@github.com>2016-10-27 16:27:38 -0400
commitba8caed27f68ce2a0c65aa0aab2a3a288b4f6c48 (patch)
treec1d24a6ae1da0e7dbbc54dac218442f7db877bf1
parent04a56a8ebe77dad34e7b1d2a15cb8da0d4e11cf5 (diff)
parent19fa0061266198940d7f5dc68ae3181ed57fd837 (diff)
Merge pull request #1580 from npwoods/dasmstream_mcs96
Changed the mcs96 disassembler to use 'std::ostream &' internally
-rw-r--r--src/devices/cpu/mcs96/mcs96.cpp88
-rw-r--r--src/devices/cpu/mcs96/mcs96.h12
2 files changed, 55 insertions, 45 deletions
diff --git a/src/devices/cpu/mcs96/mcs96.cpp b/src/devices/cpu/mcs96/mcs96.cpp
index 1711caaec32..be96adecaa7 100644
--- a/src/devices/cpu/mcs96/mcs96.cpp
+++ b/src/devices/cpu/mcs96/mcs96.cpp
@@ -172,7 +172,7 @@ std::string mcs96_device::regname(uint8_t reg)
return res;
}
-offs_t mcs96_device::disasm_generic(char *buffer, offs_t pc, const uint8_t *oprom, const uint8_t *opram, uint32_t options, const disasm_entry *entries)
+offs_t mcs96_device::disasm_generic(std::ostream &stream, offs_t pc, const uint8_t *oprom, const uint8_t *opram, uint32_t options, const disasm_entry *entries)
{
bool prefix_fe = false;
int off = 0;
@@ -184,7 +184,7 @@ offs_t mcs96_device::disasm_generic(char *buffer, offs_t pc, const uint8_t *opro
}
const disasm_entry &e = entries[oprom[0]];
uint32_t flags = e.flags | DASMFLAG_SUPPORTED;
- buffer += sprintf(buffer, "%s", prefix_fe ? e.opcode_fe : e.opcode);
+ util::stream_format(stream, "%s", prefix_fe ? e.opcode_fe : e.opcode);
switch(e.mode) {
case DASM_none:
@@ -192,7 +192,7 @@ offs_t mcs96_device::disasm_generic(char *buffer, offs_t pc, const uint8_t *opro
break;
case DASM_nop_2:
- sprintf(buffer, " %02x", oprom[1]);
+ util::stream_format(stream, " %02x", oprom[1]);
flags |= 2;
break;
@@ -200,7 +200,7 @@ offs_t mcs96_device::disasm_generic(char *buffer, offs_t pc, const uint8_t *opro
int delta = oprom[1];
if(delta & 0x80)
delta -= 0x100;
- sprintf(buffer, " %04x", (pc+2+delta) & 0xffff);
+ util::stream_format(stream, " %04x", (pc+2+delta) & 0xffff);
flags |= 2;
break;
}
@@ -209,14 +209,14 @@ offs_t mcs96_device::disasm_generic(char *buffer, offs_t pc, const uint8_t *opro
int delta = ((oprom[0] << 8) | oprom[1]) & 0x7ff;
if(delta & 0x400)
delta -= 0x800;
- sprintf(buffer, " %04x", (pc+2+delta) & 0xffff);
+ util::stream_format(stream, " %04x", (pc+2+delta) & 0xffff);
flags |= 2;
break;
}
case DASM_rel16: {
int delta = oprom[1] | (oprom[2] << 8);
- sprintf(buffer, " %04x", (pc+3+delta) & 0xffff);
+ util::stream_format(stream, " %04x", (pc+3+delta) & 0xffff);
flags |= 3;
break;
}
@@ -225,7 +225,7 @@ offs_t mcs96_device::disasm_generic(char *buffer, offs_t pc, const uint8_t *opro
int delta = oprom[2];
if(delta & 0x80)
delta -= 0x100;
- sprintf(buffer, " %s, %04x", regname(oprom[1]).c_str(), (pc+3+delta) & 0xffff);
+ util::stream_format(stream, " %s, %04x", regname(oprom[1]), (pc+3+delta) & 0xffff);
flags |= 3;
break;
}
@@ -234,95 +234,95 @@ offs_t mcs96_device::disasm_generic(char *buffer, offs_t pc, const uint8_t *opro
int delta = oprom[2];
if(delta & 0x80)
delta -= 0x100;
- sprintf(buffer, " %d, %s, %04x", oprom[0] & 7, regname(oprom[1]).c_str(), (pc+3+delta) & 0xffff);
+ util::stream_format(stream, " %d, %s, %04x", oprom[0] & 7, regname(oprom[1]), (pc+3+delta) & 0xffff);
flags |= 3;
break;
}
case DASM_direct_1:
- sprintf(buffer, " %s", regname(oprom[1]).c_str());
+ util::stream_format(stream, " %s", regname(oprom[1]));
flags |= 2;
break;
case DASM_direct_2:
- sprintf(buffer, " %s, %s", regname(oprom[2]).c_str(), regname(oprom[1]).c_str());
+ util::stream_format(stream, " %s, %s", regname(oprom[2]), regname(oprom[1]));
flags |= 3;
break;
case DASM_direct_3:
- sprintf(buffer, " %s, %s, %s", regname(oprom[3]).c_str(), regname(oprom[2]).c_str(), regname(oprom[1]).c_str());
+ util::stream_format(stream, " %s, %s, %s", regname(oprom[3]), regname(oprom[2]), regname(oprom[1]));
flags |= 4;
break;
case DASM_immed_1b:
- sprintf(buffer, " #%02x", oprom[1]);
+ util::stream_format(stream, " #%02x", oprom[1]);
flags |= 2;
break;
case DASM_immed_2b:
- sprintf(buffer, " %s, #%02x", regname(oprom[2]).c_str(), oprom[1]);
+ util::stream_format(stream, " %s, #%02x", regname(oprom[2]), oprom[1]);
flags |= 3;
break;
case DASM_immed_or_reg_2b:
if(oprom[1] >= 0x10)
- sprintf(buffer, " %s, %s", regname(oprom[2]).c_str(), regname(oprom[1]).c_str());
+ util::stream_format(stream, " %s, %s", regname(oprom[2]), regname(oprom[1]));
else
- sprintf(buffer, " %s, #%02x", regname(oprom[2]).c_str(), oprom[1]);
+ util::stream_format(stream, " %s, #%02x", regname(oprom[2]), oprom[1]);
flags |= 3;
break;
case DASM_immed_3b:
- sprintf(buffer, " %s, %s, #%02x", regname(oprom[3]).c_str(), regname(oprom[2]).c_str(), oprom[1]);
+ util::stream_format(stream, " %s, %s, #%02x", regname(oprom[3]), regname(oprom[2]), oprom[1]);
flags |= 4;
break;
case DASM_immed_1w:
- sprintf(buffer, " #%02x%02x", oprom[2], oprom[1]);
+ util::stream_format(stream, " #%02x%02x", oprom[2], oprom[1]);
flags |= 3;
break;
case DASM_immed_2w:
- sprintf(buffer, " %s, #%02x%02x", regname(oprom[3]).c_str(), oprom[2], oprom[1]);
+ util::stream_format(stream, " %s, #%02x%02x", regname(oprom[3]), oprom[2], oprom[1]);
flags |= 4;
break;
case DASM_immed_3w:
- sprintf(buffer, " %s, %s, #%02x%02x", regname(oprom[4]).c_str(), regname(oprom[3]).c_str(), oprom[2], oprom[1]);
+ util::stream_format(stream, " %s, %s, #%02x%02x", regname(oprom[4]), regname(oprom[3]), oprom[2], oprom[1]);
flags |= 5;
break;
case DASM_indirect_1n:
- sprintf(buffer, " [%s]", regname(oprom[1]).c_str());
+ util::stream_format(stream, " [%s]", regname(oprom[1]));
flags |= 2;
break;
case DASM_indirect_1:
if(oprom[1] & 0x01) {
- sprintf(buffer, " [%s]+", regname(oprom[1]-1).c_str());
+ util::stream_format(stream, " [%s]+", regname(oprom[1]-1));
flags |= 2;
} else {
- sprintf(buffer, " [%s]", regname(oprom[1]).c_str());
+ util::stream_format(stream, " [%s]", regname(oprom[1]));
flags |= 2;
}
break;
case DASM_indirect_2:
if(oprom[1] & 0x01) {
- sprintf(buffer, " %s, [%s]+", regname(oprom[2]).c_str(), regname(oprom[1]-1).c_str());
+ util::stream_format(stream, " %s, [%s]+", regname(oprom[2]), regname(oprom[1]-1));
flags |= 3;
} else {
- sprintf(buffer, " %s, [%s]", regname(oprom[2]).c_str(), regname(oprom[1]).c_str());
+ util::stream_format(stream, " %s, [%s]", regname(oprom[2]), regname(oprom[1]));
flags |= 3;
}
break;
case DASM_indirect_3:
if(oprom[1] & 0x01) {
- sprintf(buffer, " %s, %s, [%s]+", regname(oprom[3]).c_str(), regname(oprom[2]).c_str(), regname(oprom[1]-1).c_str());
+ util::stream_format(stream, " %s, %s, [%s]+", regname(oprom[3]), regname(oprom[2]), regname(oprom[1]-1));
flags |= 4;
} else {
- sprintf(buffer, " %s, %s, [%s]", regname(oprom[3]).c_str(), regname(oprom[2]).c_str(), regname(oprom[1]).c_str());
+ util::stream_format(stream, " %s, %s, [%s]", regname(oprom[3]), regname(oprom[2]), regname(oprom[1]));
flags |= 4;
}
break;
@@ -330,9 +330,9 @@ offs_t mcs96_device::disasm_generic(char *buffer, offs_t pc, const uint8_t *opro
case DASM_indexed_1:
if(oprom[1] & 0x01) {
if(oprom[1] == 0x01)
- sprintf(buffer, " %02x%02x", oprom[3], oprom[2]);
+ util::stream_format(stream, " %02x%02x", oprom[3], oprom[2]);
else
- sprintf(buffer, " %02x%02x[%s]", oprom[3], oprom[2], regname(oprom[1]-1).c_str());
+ util::stream_format(stream, " %02x%02x[%s]", oprom[3], oprom[2], regname(oprom[1]-1));
flags |= 4;
} else {
int delta = oprom[2];
@@ -340,14 +340,14 @@ offs_t mcs96_device::disasm_generic(char *buffer, offs_t pc, const uint8_t *opro
delta -= 0x100;
if(oprom[1] == 0x00) {
if(delta < 0)
- sprintf(buffer, " %04x", delta & 0xffff);
+ util::stream_format(stream, " %04x", delta & 0xffff);
else
- sprintf(buffer, " %02x", delta);
+ util::stream_format(stream, " %02x", delta);
} else {
if(delta < 0)
- sprintf(buffer, " -%02x[%s]", -delta, regname(oprom[1]).c_str());
+ util::stream_format(stream, " -%02x[%s]", -delta, regname(oprom[1]));
else
- sprintf(buffer, " %02x[%s]", delta, regname(oprom[1]).c_str());
+ util::stream_format(stream, " %02x[%s]", delta, regname(oprom[1]));
}
flags |= 3;
}
@@ -356,9 +356,9 @@ offs_t mcs96_device::disasm_generic(char *buffer, offs_t pc, const uint8_t *opro
case DASM_indexed_2:
if(oprom[1] & 0x01) {
if(oprom[1] == 0x01)
- sprintf(buffer, " %s, %02x%02x", regname(oprom[4]).c_str(), oprom[3], oprom[2]);
+ util::stream_format(stream, " %s, %02x%02x", regname(oprom[4]), oprom[3], oprom[2]);
else
- sprintf(buffer, " %s, %02x%02x[%s]", regname(oprom[4]).c_str(), oprom[3], oprom[2], regname(oprom[1]-1).c_str());
+ util::stream_format(stream, " %s, %02x%02x[%s]", regname(oprom[4]), oprom[3], oprom[2], regname(oprom[1]-1));
flags |= 5;
} else {
int delta = oprom[2];
@@ -366,14 +366,14 @@ offs_t mcs96_device::disasm_generic(char *buffer, offs_t pc, const uint8_t *opro
delta -= 0x100;
if(oprom[1] == 0x00) {
if(delta < 0)
- sprintf(buffer, " %s, %04x", regname(oprom[3]).c_str(), delta & 0xffff);
+ util::stream_format(stream, " %s, %04x", regname(oprom[3]), delta & 0xffff);
else
- sprintf(buffer, " %s, %02x", regname(oprom[3]).c_str(), delta);
+ util::stream_format(stream, " %s, %02x", regname(oprom[3]), delta);
} else {
if(delta < 0)
- sprintf(buffer, " %s, -%02x[%s]", regname(oprom[3]).c_str(), -delta, regname(oprom[1]).c_str());
+ util::stream_format(stream, " %s, -%02x[%s]", regname(oprom[3]), -delta, regname(oprom[1]));
else
- sprintf(buffer, " %s, %02x[%s]", regname(oprom[3]).c_str(), delta, regname(oprom[1]).c_str());
+ util::stream_format(stream, " %s, %02x[%s]", regname(oprom[3]), delta, regname(oprom[1]));
}
flags |= 4;
}
@@ -382,9 +382,9 @@ offs_t mcs96_device::disasm_generic(char *buffer, offs_t pc, const uint8_t *opro
case DASM_indexed_3:
if(oprom[1] & 0x01) {
if(oprom[1] == 0x01)
- sprintf(buffer, " %s, %s, %02x%02x", regname(oprom[5]).c_str(), regname(oprom[4]).c_str(), oprom[3], oprom[2]);
+ util::stream_format(stream, " %s, %s, %02x%02x", regname(oprom[5]), regname(oprom[4]), oprom[3], oprom[2]);
else
- sprintf(buffer, " %s, %s, %02x%02x[%s]", regname(oprom[5]).c_str(), regname(oprom[4]).c_str(), oprom[3], oprom[2], regname(oprom[1]-1).c_str());
+ util::stream_format(stream, " %s, %s, %02x%02x[%s]", regname(oprom[5]), regname(oprom[4]), oprom[3], oprom[2], regname(oprom[1]-1));
flags |= 6;
} else {
int delta = oprom[2];
@@ -392,14 +392,14 @@ offs_t mcs96_device::disasm_generic(char *buffer, offs_t pc, const uint8_t *opro
delta -= 0x100;
if(oprom[1] == 0x00) {
if(delta < 0)
- sprintf(buffer, " %s, %s, %04x", regname(oprom[4]).c_str(), regname(oprom[3]).c_str(), delta & 0xffff);
+ util::stream_format(stream, " %s, %s, %04x", regname(oprom[4]), regname(oprom[3]), delta & 0xffff);
else
- sprintf(buffer, " %s, %s, %02x", regname(oprom[4]).c_str(), regname(oprom[3]).c_str(), delta);
+ util::stream_format(stream, " %s, %s, %02x", regname(oprom[4]), regname(oprom[3]), delta);
} else {
if(delta < 0)
- sprintf(buffer, " %s, %s, -%02x[%s]", regname(oprom[4]).c_str(), regname(oprom[3]).c_str(), -delta, regname(oprom[1]).c_str());
+ util::stream_format(stream, " %s, %s, -%02x[%s]", regname(oprom[4]), regname(oprom[3]), -delta, regname(oprom[1]));
else
- sprintf(buffer, " %s, %s, %02x[%s]", regname(oprom[4]).c_str(), regname(oprom[3]).c_str(), delta, regname(oprom[1]).c_str());
+ util::stream_format(stream, " %s, %s, %02x[%s]", regname(oprom[4]), regname(oprom[3]), delta, regname(oprom[1]));
}
flags |= 5;
}
diff --git a/src/devices/cpu/mcs96/mcs96.h b/src/devices/cpu/mcs96/mcs96.h
index 2f372cdab5b..26c7886a070 100644
--- a/src/devices/cpu/mcs96/mcs96.h
+++ b/src/devices/cpu/mcs96/mcs96.h
@@ -90,7 +90,14 @@ protected:
// device_disasm_interface overrides
virtual uint32_t disasm_min_opcode_bytes() const override;
virtual uint32_t disasm_max_opcode_bytes() const override;
- virtual offs_t disasm_generic(char *buffer, offs_t pc, const uint8_t *oprom, const uint8_t *opram, uint32_t options, const disasm_entry *entries);
+ virtual offs_t disasm_generic(char *buffer, offs_t pc, const uint8_t *oprom, const uint8_t *opram, uint32_t options, const disasm_entry *entries)
+ {
+ std::ostringstream stream;
+ offs_t result = disasm_generic(stream, pc, oprom, opram, options, entries);
+ std::string stream_str = stream.str();
+ strcpy(buffer, stream_str.c_str());
+ return result;
+ }
address_space_config program_config;
address_space *program;
@@ -245,6 +252,9 @@ protected:
O(fetch_noirq);
#undef O
+
+private:
+ offs_t disasm_generic(std::ostream &stream, offs_t pc, const uint8_t *oprom, const uint8_t *opram, uint32_t options, const disasm_entry *entries);
};
enum {