summaryrefslogtreecommitdiffstatshomepage
path: root/src/devices/cpu
diff options
context:
space:
mode:
author Vas Crabb <cuavas@users.noreply.github.com>2016-11-18 00:31:34 +1100
committer GitHub <noreply@github.com>2016-11-18 00:31:34 +1100
commit3bc03384b1549f3fcd5204725ab5933c4a60a71f (patch)
tree25adee4992341fc9f5b57baa785ce10cc2787991 /src/devices/cpu
parent539c2e7bf070e41e4929c5ed19171ecceae298f3 (diff)
parent93817a17511c437598636df750fac39126eb3153 (diff)
Merge pull request #1728 from npwoods/dasmstream_saturn
Changed the Saturn disassembler to use 'std::ostream &' internally
Diffstat (limited to 'src/devices/cpu')
-rw-r--r--src/devices/cpu/saturn/saturnds.cpp86
1 files changed, 48 insertions, 38 deletions
diff --git a/src/devices/cpu/saturn/saturnds.cpp b/src/devices/cpu/saturn/saturnds.cpp
index e41be2a2d7f..a834ca5bc9c 100644
--- a/src/devices/cpu/saturn/saturnds.cpp
+++ b/src/devices/cpu/saturn/saturnds.cpp
@@ -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;
+}