diff options
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 |
commit | 85ce6e8c9d58eb0d9b49c0fc39be16d70f799e07 (patch) | |
tree | aa9bdf53f29c42e7197326fdf23dd85286ca4d89 | |
parent | 3495c256828a6a1280bed0f92c43bd3ab0f06d7d (diff) | |
parent | 0e63f662796d6ae02c2d3ca90ade7f872c34a1ce (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.cpp | 41 |
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 |