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

This commit is contained in:
Nathan Woods 2016-11-17 08:21:59 -05:00
parent fd8f739ec7
commit 93817a1751

View File

@ -1267,7 +1267,7 @@ static const int field_adr_a[]=
static const int field_adr_b[]=
{ FieldP, FieldWP, FieldXS, FieldX, FieldS, FieldM, FieldB, FieldW };
CPU_DISASSEMBLE( saturn )
static offs_t internal_disasm_saturn(cpu_device *device, std::ostream &stream, offs_t pc, const uint8_t *oprom, const uint8_t *opram, int options)
{
int adr=0;
@ -1289,7 +1289,7 @@ CPU_DISASSEMBLE( saturn )
cont=0;
bin[binsize++]=number_2_hex[op];
bin[binsize]=0;
sprintf(buffer, "???%s",bin);
util::stream_format(stream, "???%s",bin);
break;
default:
bin[binsize++]=number_2_hex[op];
@ -1308,7 +1308,7 @@ CPU_DISASSEMBLE( saturn )
cont = 0;
bin[binsize++]=number_2_hex[op];
bin[binsize]=0;
sprintf(buffer, "???%s",bin);
util::stream_format(stream, "???%s",bin);
break;
}
break;
@ -1316,32 +1316,32 @@ CPU_DISASSEMBLE( saturn )
cont=0;
switch (level->adr==AdrNone?adr:level->adr) {
case AdrNone:
strcpy(buffer, mnemonics[level->mnemonic].name[set]);
stream << mnemonics[level->mnemonic].name[set];
break;
case Imm:
sprintf(buffer, mnemonics[level->mnemonic].name[set], oprom[pos++]);
util::stream_format(stream, mnemonics[level->mnemonic].name[set], oprom[pos++]);
break;
case ImmCount:
sprintf(buffer, mnemonics[level->mnemonic].name[set], oprom[pos++]+1);
util::stream_format(stream, mnemonics[level->mnemonic].name[set], oprom[pos++]+1);
break;
case AdrImmCount:
sprintf(buffer, mnemonics[level->mnemonic].name[set], field_2_string(adr), oprom[pos++]+1);
util::stream_format(stream, mnemonics[level->mnemonic].name[set], field_2_string(adr), oprom[pos++]+1);
break;
case AdrCount: // mnemonics have string %s for address field
snprintf(number,sizeof(number),"%x",oprom[pos++]+1);
sprintf(buffer, mnemonics[level->mnemonic].name[set], number);
util::stream_format(stream, mnemonics[level->mnemonic].name[set], number);
break;
case Imm2:
v=oprom[pos++];
v|=oprom[pos++]<<4;
sprintf(buffer, mnemonics[level->mnemonic].name[set], v);
util::stream_format(stream, mnemonics[level->mnemonic].name[set], v);
break;
case Imm4:
v=oprom[pos++];
v|=oprom[pos++]<<4;
v|=oprom[pos++]<<8;
v|=oprom[pos++]<<12;
sprintf(buffer, mnemonics[level->mnemonic].name[set], v);
util::stream_format(stream, mnemonics[level->mnemonic].name[set], v);
break;
case Imm5:
v=oprom[pos++];
@ -1349,116 +1349,116 @@ CPU_DISASSEMBLE( saturn )
v|=oprom[pos++]<<8;
v|=oprom[pos++]<<12;
v|=oprom[pos++]<<16;
sprintf(buffer, mnemonics[level->mnemonic].name[set], v);
util::stream_format(stream, mnemonics[level->mnemonic].name[set], v);
break;
case ImmCload:
c=i=oprom[pos++] & 0xf;
number[i+1]=0;
for (;i>=0; i--) number[i]=number_2_hex[oprom[pos++] & 0xf];
sprintf(buffer, mnemonics[level->mnemonic].name[set], c+1, number);
util::stream_format(stream, mnemonics[level->mnemonic].name[set], c+1, number);
break;
case Dis3:
SATURN_PEEKOP_DIS12(v);
c=(pc+pos-3+v)&0xfffff;
sprintf(buffer, mnemonics[level->mnemonic].name[set], c );
util::stream_format(stream, mnemonics[level->mnemonic].name[set], c );
break;
case Dis3Call:
SATURN_PEEKOP_DIS12(v);
c=(pc+pos+v)&0xfffff;
sprintf(buffer, mnemonics[level->mnemonic].name[set], c );
util::stream_format(stream, mnemonics[level->mnemonic].name[set], c );
break;
case Dis4:
SATURN_PEEKOP_DIS16(v);
c=(pc+pos-4+v)&0xfffff;
sprintf(buffer, mnemonics[level->mnemonic].name[set], c );
util::stream_format(stream, mnemonics[level->mnemonic].name[set], c );
break;
case Dis4Call:
SATURN_PEEKOP_DIS16(v);
c=(pc+pos+v)&0xfffff;
sprintf(buffer, mnemonics[level->mnemonic].name[set], c );
util::stream_format(stream, mnemonics[level->mnemonic].name[set], c );
break;
case Abs:
SATURN_PEEKOP_ADR(v);
sprintf(buffer, mnemonics[level->mnemonic].name[set], v );
util::stream_format(stream, mnemonics[level->mnemonic].name[set], v );
break;
case BranchReturn:
SATURN_PEEKOP_DIS8(v);
if (v==0) {
strcpy(buffer, mnemonics[level->mnemonic+1].name[set]);
stream << mnemonics[level->mnemonic+1].name[set];
} else {
c=(pc+pos-2+v)&0xfffff;
sprintf(buffer, mnemonics[level->mnemonic].name[set], c);
util::stream_format(stream, mnemonics[level->mnemonic].name[set], c);
}
break;
case ABranchReturn:
SATURN_PEEKOP_DIS8(v);
if (v==0) {
sprintf(buffer, mnemonics[level->mnemonic+1].name[set], A);
util::stream_format(stream, mnemonics[level->mnemonic+1].name[set], A);
} else {
c=(pc+pos-2+v)&0xfffff;
sprintf(buffer, mnemonics[level->mnemonic].name[set], A, c);
util::stream_format(stream, mnemonics[level->mnemonic].name[set], A, c);
}
break;
case xBranchReturn:
SATURN_PEEKOP_DIS8(v);
if (v==0) {
sprintf(buffer, mnemonics[level->mnemonic+1].name[set], field_2_string(adr));
util::stream_format(stream, mnemonics[level->mnemonic+1].name[set], field_2_string(adr));
} else {
c=(pc+pos-2+v)&0xfffff;
sprintf(buffer, mnemonics[level->mnemonic].name[set], field_2_string(adr), c);
util::stream_format(stream, mnemonics[level->mnemonic].name[set], field_2_string(adr), c);
}
break;
case TestBranchRet:
i=oprom[pos++];
SATURN_PEEKOP_DIS8(v);
if (v==0) {
sprintf(buffer, mnemonics[level->mnemonic+1].name[set], i);
util::stream_format(stream, mnemonics[level->mnemonic+1].name[set], i);
} else {
c=(pc+pos-2+v)&0xfffff;
sprintf(buffer, mnemonics[level->mnemonic].name[set], i, c);
util::stream_format(stream, mnemonics[level->mnemonic].name[set], i, c);
}
break;
case ImmBranch:
i=oprom[pos++];
SATURN_PEEKOP_DIS8(v);
c=(pc+pos-2+v)&0xfffff;
sprintf(buffer, mnemonics[level->mnemonic].name[set], i, c);
util::stream_format(stream, mnemonics[level->mnemonic].name[set], i, c);
break;
case FieldP:
sprintf(buffer, mnemonics[level->mnemonic].name[set], P );
util::stream_format(stream, mnemonics[level->mnemonic].name[set], P );
break;
case FieldWP:
sprintf(buffer, mnemonics[level->mnemonic].name[set], WP );
util::stream_format(stream, mnemonics[level->mnemonic].name[set], WP );
break;
case FieldXS:
sprintf(buffer, mnemonics[level->mnemonic].name[set], XS );
util::stream_format(stream, mnemonics[level->mnemonic].name[set], XS );
break;
case FieldX:
sprintf(buffer, mnemonics[level->mnemonic].name[set], X );
util::stream_format(stream, mnemonics[level->mnemonic].name[set], X );
break;
case FieldS:
sprintf(buffer, mnemonics[level->mnemonic].name[set], S );
util::stream_format(stream, mnemonics[level->mnemonic].name[set], S );
break;
case FieldM:
sprintf(buffer, mnemonics[level->mnemonic].name[set], M );
util::stream_format(stream, mnemonics[level->mnemonic].name[set], M );
break;
case FieldB:
sprintf(buffer, mnemonics[level->mnemonic].name[set], B );
util::stream_format(stream, mnemonics[level->mnemonic].name[set], B );
break;
case FieldA:
sprintf(buffer, mnemonics[level->mnemonic].name[set], A );
util::stream_format(stream, mnemonics[level->mnemonic].name[set], A );
break;
case FieldW:
sprintf(buffer, mnemonics[level->mnemonic].name[set], W );
util::stream_format(stream, mnemonics[level->mnemonic].name[set], W );
break;
case AdrA:
sprintf(buffer, mnemonics[level->mnemonic].name[set], adr_a[oprom[pos++] & 0x7] );
util::stream_format(stream, mnemonics[level->mnemonic].name[set], adr_a[oprom[pos++] & 0x7] );
break;
case AdrAF:
sprintf(buffer, mnemonics[level->mnemonic].name[set], adr_af[oprom[pos++] & 0xf] );
util::stream_format(stream, mnemonics[level->mnemonic].name[set], adr_af[oprom[pos++] & 0xf] );
break;
case AdrB:
sprintf(buffer, mnemonics[level->mnemonic].name[set], adr_b[oprom[pos++] & 0x7] );
util::stream_format(stream, mnemonics[level->mnemonic].name[set], adr_b[oprom[pos++] & 0x7] );
break;
}
break;
@ -1468,3 +1468,13 @@ CPU_DISASSEMBLE( saturn )
return pos;
}
CPU_DISASSEMBLE(saturn)
{
std::ostringstream stream;
offs_t result = internal_disasm_saturn(device, stream, pc, oprom, opram, options);
std::string stream_str = stream.str();
strcpy(buffer, stream_str.c_str());
return result;
}