From 93817a17511c437598636df750fac39126eb3153 Mon Sep 17 00:00:00 2001 From: Nathan Woods Date: Thu, 17 Nov 2016 08:21:59 -0500 Subject: [PATCH] Changed the Saturn disassembler to use 'std::ostream &' internally --- src/devices/cpu/saturn/saturnds.cpp | 86 ++++++++++++++++------------- 1 file 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; +}