mirror of
https://github.com/holub/mame
synced 2025-04-29 03:20:50 +03:00
Merge pull request #1577 from npwoods/dasmstream_lr35902
Changed the lr35902 disassembler to use 'std::ostream &' internally
This commit is contained in:
commit
25662acbcf
@ -190,17 +190,15 @@ static const lr35902dasm mnemonic_main[256]= {
|
|||||||
* Disassemble opcode at PC and return number of bytes it takes
|
* 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 lr35902dasm *d;
|
||||||
const char /* *symbol,*/ *src;
|
const char /* *symbol,*/ *src;
|
||||||
char *dst;
|
|
||||||
int8_t offset;
|
int8_t offset;
|
||||||
uint8_t op, op1;
|
uint8_t op, op1;
|
||||||
uint16_t ea;
|
uint16_t ea;
|
||||||
int pos = 0;
|
int pos = 0;
|
||||||
|
|
||||||
dst = buffer;
|
|
||||||
//symbol = nullptr;
|
//symbol = nullptr;
|
||||||
|
|
||||||
op = oprom[pos++];
|
op = oprom[pos++];
|
||||||
@ -214,64 +212,74 @@ CPU_DISASSEMBLE( lr35902 )
|
|||||||
}
|
}
|
||||||
|
|
||||||
if( d->arguments ) {
|
if( d->arguments ) {
|
||||||
dst += sprintf(dst, "%-4s ", s_mnemonic[d->mnemonic]);
|
util::stream_format(stream, "%-4s ", s_mnemonic[d->mnemonic]);
|
||||||
src = d->arguments;
|
src = d->arguments;
|
||||||
while( *src ) {
|
while( *src ) {
|
||||||
switch( *src ) {
|
switch( *src ) {
|
||||||
case '?': /* illegal opcode */
|
case '?': /* illegal opcode */
|
||||||
dst += sprintf( dst, "$%02X,$%02X", op, op1);
|
util::stream_format(stream, "$%02X,$%02X", op, op1);
|
||||||
break;
|
break;
|
||||||
case 'A':
|
case 'A':
|
||||||
ea = opram[pos] + ( opram[pos+1] << 8);
|
ea = opram[pos] + ( opram[pos+1] << 8);
|
||||||
pos += 2;
|
pos += 2;
|
||||||
dst += sprintf( dst, "$%04X", ea );
|
util::stream_format(stream, "$%04X", ea );
|
||||||
break;
|
break;
|
||||||
case 'B': /* Byte op arg */
|
case 'B': /* Byte op arg */
|
||||||
ea = opram[pos++];
|
ea = opram[pos++];
|
||||||
dst += sprintf( dst, "$%02X", ea );
|
util::stream_format(stream, "$%02X", ea );
|
||||||
break;
|
break;
|
||||||
case '(': /* Memory byte at (...) */
|
case '(': /* Memory byte at (...) */
|
||||||
*dst++ = *src;
|
stream << *src;
|
||||||
if( !strncmp( src, "(bc)", 4) ) {
|
if( !strncmp( src, "(bc)", 4) ) {
|
||||||
} else if( !strncmp( src, "(de)", 4) ) {
|
} else if( !strncmp( src, "(de)", 4) ) {
|
||||||
} else if( !strncmp( src, "(hl)", 4) ) {
|
} else if( !strncmp( src, "(hl)", 4) ) {
|
||||||
} else if( !strncmp( src, "(sp)", 4) ) {
|
} else if( !strncmp( src, "(sp)", 4) ) {
|
||||||
} else if( !strncmp( src, "(F)", 3) ) {
|
} else if( !strncmp( src, "(F)", 3) ) {
|
||||||
ea = 0xFF00 + opram[pos++];
|
ea = 0xFF00 + opram[pos++];
|
||||||
dst += sprintf( dst, "$%02X", ea );
|
util::stream_format(stream, "$%02X", ea );
|
||||||
src++;
|
src++;
|
||||||
} else if( !strncmp( src, "(C)", 3) ) {
|
} else if( !strncmp( src, "(C)", 3) ) {
|
||||||
dst += sprintf( dst, "$FF00+c" );
|
util::stream_format(stream, "$FF00+c" );
|
||||||
src++;
|
src++;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case 'N': /* Immediate 16 bit */
|
case 'N': /* Immediate 16 bit */
|
||||||
ea = opram[pos] + ( opram[pos+1] << 8 );
|
ea = opram[pos] + ( opram[pos+1] << 8 );
|
||||||
pos += 2;
|
pos += 2;
|
||||||
dst += sprintf( dst, "$%04X", ea );
|
util::stream_format(stream, "$%04X", ea );
|
||||||
break;
|
break;
|
||||||
case 'O': /* Offset relative to PC */
|
case 'O': /* Offset relative to PC */
|
||||||
offset = (int8_t) opram[pos++];
|
offset = (int8_t) opram[pos++];
|
||||||
dst += sprintf( dst, "$%04X", pc + offset + 2 );
|
util::stream_format(stream, "$%04X", pc + offset + 2 );
|
||||||
break;
|
break;
|
||||||
case 'V': /* Restart vector */
|
case 'V': /* Restart vector */
|
||||||
ea = op & 0x38;
|
ea = op & 0x38;
|
||||||
dst += sprintf( dst, "$%02X", ea );
|
util::stream_format(stream, "$%02X", ea );
|
||||||
break;
|
break;
|
||||||
case 'W': /* Memory address word */
|
case 'W': /* Memory address word */
|
||||||
ea = opram[pos] + ( opram[pos+1] << 8 );
|
ea = opram[pos] + ( opram[pos+1] << 8 );
|
||||||
pos += 2;
|
pos += 2;
|
||||||
dst += sprintf( dst, "$%04X", ea );
|
util::stream_format(stream, "$%04X", ea );
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
*dst++ = *src;
|
stream << *src;
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
src++;
|
src++;
|
||||||
}
|
}
|
||||||
*dst = '\0';
|
|
||||||
} else {
|
} 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;
|
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