mirror of
https://github.com/holub/mame
synced 2025-07-02 00:29:37 +03:00
Changed the Z80 disassembler to use 'std::ostream &' internally
This commit is contained in:
parent
9f7819cb35
commit
0e63f66279
@ -413,18 +413,16 @@ static int offs(int8_t offset)
|
|||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
* Disassemble opcode at PC and return number of bytes it takes
|
* 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 z80dasm *d;
|
||||||
const char *src, *ixy;
|
const char *src, *ixy;
|
||||||
char *dst;
|
|
||||||
int8_t offset = 0;
|
int8_t offset = 0;
|
||||||
uint8_t op, op1 = 0;
|
uint8_t op, op1 = 0;
|
||||||
uint16_t ea;
|
uint16_t ea;
|
||||||
int pos = 0;
|
int pos = 0;
|
||||||
|
|
||||||
ixy = "oops!!";
|
ixy = "oops!!";
|
||||||
dst = buffer;
|
|
||||||
|
|
||||||
op = oprom[pos++];
|
op = oprom[pos++];
|
||||||
|
|
||||||
@ -467,66 +465,75 @@ CPU_DISASSEMBLE( z80 )
|
|||||||
|
|
||||||
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+0] + ( opram[pos+1] << 8 );
|
ea = opram[pos+0] + ( 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 'N': /* Immediate 16 bit */
|
case 'N': /* Immediate 16 bit */
|
||||||
ea = opram[pos+0] + ( opram[pos+1] << 8 );
|
ea = opram[pos+0] + ( 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) & 0xffff );
|
util::stream_format(stream, "$%04X", (pc + offset + 2) & 0xffff);
|
||||||
break;
|
break;
|
||||||
case 'P': /* Port number */
|
case 'P': /* Port number */
|
||||||
ea = opram[pos++];
|
ea = opram[pos++];
|
||||||
dst += sprintf( dst, "$%02X", ea );
|
util::stream_format(stream, "$%02X", ea );
|
||||||
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+0] + ( opram[pos+1] << 8 );
|
ea = opram[pos+0] + ( opram[pos+1] << 8 );
|
||||||
pos += 2;
|
pos += 2;
|
||||||
dst += sprintf( dst, "$%04X", ea );
|
util::stream_format(stream, "$%04X", ea );
|
||||||
break;
|
break;
|
||||||
case 'X':
|
case 'X':
|
||||||
offset = (int8_t) opram[pos++];
|
offset = (int8_t) opram[pos++];
|
||||||
/* fall through */
|
/* fall through */
|
||||||
case 'Y':
|
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;
|
break;
|
||||||
case 'I':
|
case 'I':
|
||||||
dst += sprintf( dst, "%s", ixy);
|
util::stream_format(stream, "%s", ixy);
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
*dst++ = *src;
|
stream << *src;
|
||||||
}
|
}
|
||||||
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(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;
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user