mirror of
https://github.com/holub/mame
synced 2025-06-01 02:21:48 +03:00
Changed the mcs96 disassembler to use 'std::ostream &' internally
This commit is contained in:
parent
0d87ff49b1
commit
19fa006126
@ -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;
|
||||
}
|
||||
|
@ -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 {
|
||||
|
Loading…
Reference in New Issue
Block a user