summaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
author Vas Crabb <cuavas@users.noreply.github.com>2016-10-26 21:24:09 +1100
committer GitHub <noreply@github.com>2016-10-26 21:24:09 +1100
commit85ce6e8c9d58eb0d9b49c0fc39be16d70f799e07 (patch)
treeaa9bdf53f29c42e7197326fdf23dd85286ca4d89
parent3495c256828a6a1280bed0f92c43bd3ab0f06d7d (diff)
parent0e63f662796d6ae02c2d3ca90ade7f872c34a1ce (diff)
Merge pull request #1559 from npwoods/dasmstream_z80
Changed the Z80 disassembler to use 'std::ostream &' internally
-rw-r--r--src/devices/cpu/z80/z80dasm.cpp41
1 files changed, 24 insertions, 17 deletions
diff --git a/src/devices/cpu/z80/z80dasm.cpp b/src/devices/cpu/z80/z80dasm.cpp
index e7bf8b60051..38b32aae482 100644
--- a/src/devices/cpu/z80/z80dasm.cpp
+++ b/src/devices/cpu/z80/z80dasm.cpp
@@ -413,18 +413,16 @@ static int offs(int8_t offset)
/****************************************************************************
* Disassemble opcode at PC and return number of bytes it takes
****************************************************************************/
-CPU_DISASSEMBLE( z80 )
+static offs_t internal_disasm_z80(cpu_device *device, std::ostream &stream, offs_t pc, const uint8_t *oprom, const uint8_t *opram, int options)
{
const z80dasm *d;
const char *src, *ixy;
- char *dst;
int8_t offset = 0;
uint8_t op, op1 = 0;
uint16_t ea;
int pos = 0;
ixy = "oops!!";
- dst = buffer;
op = oprom[pos++];
@@ -467,66 +465,75 @@ CPU_DISASSEMBLE( z80 )
if( d->arguments )
{
- dst += sprintf(dst, "%-4s ", s_mnemonic[d->mnemonic]);
+ util::stream_format(stream, "%-4s ", s_mnemonic[d->mnemonic]);
src = d->arguments;
while( *src )
{
switch( *src )
{
case '?': /* illegal opcode */
- dst += sprintf( dst, "$%02x,$%02x", op, op1 );
+ util::stream_format(stream, "$%02x,$%02x", op, op1 );
break;
case 'A':
ea = opram[pos+0] + ( opram[pos+1] << 8 );
pos += 2;
- dst += sprintf( dst, "$%04X", ea );
+ util::stream_format(stream, "$%04X", ea );
break;
case 'B': /* Byte op arg */
ea = opram[pos++];
- dst += sprintf( dst, "$%02X", ea );
+ util::stream_format(stream, "$%02X", ea );
break;
case 'N': /* Immediate 16 bit */
ea = opram[pos+0] + ( opram[pos+1] << 8 );
pos += 2;
- dst += sprintf( dst, "$%04X", ea );
+ util::stream_format(stream, "$%04X", ea );
break;
case 'O': /* Offset relative to PC */
offset = (int8_t) opram[pos++];
- dst += sprintf( dst, "$%04X", (pc + offset + 2) & 0xffff );
+ util::stream_format(stream, "$%04X", (pc + offset + 2) & 0xffff);
break;
case 'P': /* Port number */
ea = opram[pos++];
- dst += sprintf( dst, "$%02X", ea );
+ util::stream_format(stream, "$%02X", ea );
break;
case 'V': /* Restart vector */
ea = op & 0x38;
- dst += sprintf( dst, "$%02X", ea );
+ util::stream_format(stream, "$%02X", ea );
break;
case 'W': /* Memory address word */
ea = opram[pos+0] + ( opram[pos+1] << 8 );
pos += 2;
- dst += sprintf( dst, "$%04X", ea );
+ util::stream_format(stream, "$%04X", ea );
break;
case 'X':
offset = (int8_t) opram[pos++];
/* fall through */
case 'Y':
- dst += sprintf( dst,"(%s%c$%02x)", ixy, sign(offset), offs(offset) );
+ util::stream_format(stream,"(%s%c$%02x)", ixy, sign(offset), offs(offset) );
break;
case 'I':
- dst += sprintf( dst, "%s", ixy);
+ util::stream_format(stream, "%s", ixy);
break;
default:
- *dst++ = *src;
+ stream << *src;
}
src++;
}
- *dst = '\0';
}
else
{
- dst += sprintf(dst, "%s", s_mnemonic[d->mnemonic]);
+ util::stream_format(stream, "%s", s_mnemonic[d->mnemonic]);
}
return pos | s_flags[d->mnemonic] | DASMFLAG_SUPPORTED;
}
+
+
+CPU_DISASSEMBLE(z80)
+{
+ std::ostringstream stream;
+ offs_t result = internal_disasm_z80(device, stream, pc, oprom, opram, options);
+ std::string stream_str = stream.str();
+ strcpy(buffer, stream_str.c_str());
+ return result;
+} \ No newline at end of file