mirror of
https://github.com/holub/mame
synced 2025-04-25 17:56:43 +03:00
Changed the lr35902 disassembler to use 'std::ostream &' internally
This commit is contained in:
parent
0d87ff49b1
commit
6b5070b02f
@ -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;
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user