Changed the lr35902 disassembler to use 'std::ostream &' internally

This commit is contained in:
Nathan Woods 2016-10-27 06:55:36 -04:00
parent 0d87ff49b1
commit 6b5070b02f

View File

@ -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;
}