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

This commit is contained in:
Nathan Woods 2016-10-25 05:54:33 -04:00
parent 9f7819cb35
commit 0e63f66279

View File

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