Merge pull request #1728 from npwoods/dasmstream_saturn

Changed the Saturn disassembler to use 'std::ostream &' internally
This commit is contained in:
Vas Crabb 2016-11-18 00:31:34 +11:00 committed by GitHub
commit 3bc03384b1

View File

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