diff --git a/src/devices/cpu/lr35902/lr35902d.cpp b/src/devices/cpu/lr35902/lr35902d.cpp index 09ee836c287..1f7c63aca18 100644 --- a/src/devices/cpu/lr35902/lr35902d.cpp +++ b/src/devices/cpu/lr35902/lr35902d.cpp @@ -190,17 +190,15 @@ static const lr35902dasm mnemonic_main[256]= { * Disassemble opcode at PC and return number of bytes it takes ****************************************************************************/ -CPU_DISASSEMBLE( lr35902 ) +static offs_t internal_disasm_lr35902(cpu_device *device, std::ostream &stream, offs_t pc, const uint8_t *oprom, const uint8_t *opram, int options) { const lr35902dasm *d; const char /* *symbol,*/ *src; - char *dst; int8_t offset; uint8_t op, op1; uint16_t ea; int pos = 0; - dst = buffer; //symbol = nullptr; op = oprom[pos++]; @@ -214,64 +212,74 @@ CPU_DISASSEMBLE( lr35902 ) } 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] + ( 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 '(': /* Memory byte at (...) */ - *dst++ = *src; + stream << *src; if( !strncmp( src, "(bc)", 4) ) { } else if( !strncmp( src, "(de)", 4) ) { } else if( !strncmp( src, "(hl)", 4) ) { } else if( !strncmp( src, "(sp)", 4) ) { } else if( !strncmp( src, "(F)", 3) ) { ea = 0xFF00 + opram[pos++]; - dst += sprintf( dst, "$%02X", ea ); + util::stream_format(stream, "$%02X", ea ); src++; } else if( !strncmp( src, "(C)", 3) ) { - dst += sprintf( dst, "$FF00+c" ); + util::stream_format(stream, "$FF00+c" ); src++; } break; case 'N': /* Immediate 16 bit */ ea = opram[pos] + ( 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 ); + util::stream_format(stream, "$%04X", pc + offset + 2 ); 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] + ( opram[pos+1] << 8 ); pos += 2; - dst += sprintf( dst, "$%04X", ea ); + util::stream_format(stream, "$%04X", ea ); break; default: - *dst++ = *src; + stream << *src; + break; } 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(lr35902) +{ + std::ostringstream stream; + offs_t result = internal_disasm_lr35902(device, stream, pc, oprom, opram, options); + std::string stream_str = stream.str(); + strcpy(buffer, stream_str.c_str()); + return result; +}