From e725caeae993df4a56d7cdcbf61082863a5ac1dd Mon Sep 17 00:00:00 2001 From: Nathan Woods Date: Fri, 11 Nov 2016 16:45:15 -0500 Subject: [PATCH] Changed the dsp16a disassembler to use 'std::ostream &' internally --- src/devices/cpu/dsp16/dsp16dis.cpp | 77 ++++++++++++++++++------------ 1 file changed, 46 insertions(+), 31 deletions(-) diff --git a/src/devices/cpu/dsp16/dsp16dis.cpp b/src/devices/cpu/dsp16/dsp16dis.cpp index 136eaab0e22..52b76fee297 100644 --- a/src/devices/cpu/dsp16/dsp16dis.cpp +++ b/src/devices/cpu/dsp16/dsp16dis.cpp @@ -248,7 +248,7 @@ bool disasmSIField(const uint8_t& SI) } -CPU_DISASSEMBLE( dsp16a ) +static offs_t internal_disasm_dsp16a(cpu_device *device, std::ostream &stream, offs_t pc, const uint8_t *oprom, const uint8_t *opram, int options) { uint8_t opSize = 1; uint32_t dasmflags = 0; @@ -270,7 +270,7 @@ CPU_DISASSEMBLE( dsp16a ) const uint8_t F1 = (op & 0x01e0) >> 5; std::string yString = disasmYField(Y); std::string fString = disasmF1Field(F1, D, S); - sprintf(buffer, "%s, %s", fString.c_str(), yString.c_str()); + util::stream_format(stream, "%s, %s", fString, yString); break; } case 0x04: case 0x1c: @@ -285,7 +285,7 @@ CPU_DISASSEMBLE( dsp16a ) std::string fString = disasmF1Field(F1, D, S); std::string aString = (opcode == 0x1c) ? "a0" : "a1"; std::string xString = (X) ? "" : "l"; - sprintf(buffer, "%s = %s%s, %s", yString.c_str(), aString.c_str(), xString.c_str(), fString.c_str()); + util::stream_format(stream, "%s = %s%s, %s", yString, aString, xString, fString); break; } case 0x16: @@ -297,7 +297,7 @@ CPU_DISASSEMBLE( dsp16a ) const uint8_t F1 = (op & 0x01e0) >> 5; std::string yString = disasmYField(Y); std::string fString = disasmF1Field(F1, D, S); - sprintf(buffer, "%s, x = %s", fString.c_str(), yString.c_str()); + util::stream_format(stream, "%s, x = %s", fString, yString); break; } case 0x17: @@ -311,7 +311,7 @@ CPU_DISASSEMBLE( dsp16a ) std::string yString = disasmYField(Y); std::string fString = disasmF1Field(F1, D, S); std::string xString = (X ? "y" : "y1"); - sprintf(buffer, "%s, %s = %s", fString.c_str(), xString.c_str(), yString.c_str()); + util::stream_format(stream, "%s, %s = %s", fString, xString, yString); break; } case 0x1f: @@ -325,7 +325,7 @@ CPU_DISASSEMBLE( dsp16a ) std::string yString = disasmYField(Y); std::string fString = disasmF1Field(F1, D, S); std::string xString = (X ? "*pt++i" : "*pt++"); - sprintf(buffer, "%s, y = %s, x = %s", fString.c_str(), yString.c_str(), xString.c_str()); + util::stream_format(stream, "%s, y = %s, x = %s", fString, yString, xString); break; } case 0x19: case 0x1b: @@ -339,8 +339,11 @@ CPU_DISASSEMBLE( dsp16a ) std::string fString = disasmF1Field(F1, D, S); std::string xString = (X ? "*pt++i" : "*pt++"); std::string aString = (opcode == 0x19) ? "a0" : "a1"; - sprintf(buffer, "%s, y = %s, x = %s", fString.c_str(), aString.c_str(), xString.c_str()); - if (Y != 0x00) sprintf(buffer, "UNKNOWN"); + + if (Y != 0x00) + util::stream_format(stream, "UNKNOWN"); + else + util::stream_format(stream, "%s, y = %s, x = %s", fString, aString, xString); break; } case 0x14: @@ -354,7 +357,7 @@ CPU_DISASSEMBLE( dsp16a ) std::string yString = disasmYField(Y); std::string xString = (X ? "y" : "y1"); std::string fString = disasmF1Field(F1, D, S); - sprintf(buffer, "%s, %s = %s", fString.c_str(), yString.c_str(), xString.c_str()); + util::stream_format(stream, "%s, %s = %s", fString, yString, xString); break; } @@ -369,7 +372,7 @@ CPU_DISASSEMBLE( dsp16a ) std::string yString = disasmYField(Y); std::string atString = (aT ? "a0" : "a1"); std::string fString = disasmF1Field(F1, aT, S); - sprintf(buffer, "%s, %s = %s", fString.c_str(), atString.c_str(), yString.c_str()); + util::stream_format(stream, "%s, %s = %s", fString, atString, yString); break; } @@ -385,7 +388,7 @@ CPU_DISASSEMBLE( dsp16a ) std::string zString = disasmZField(Z); std::string xString = (X ? "y" : "y1"); std::string fString = disasmF1Field(F1, D, S); - sprintf(buffer, "%s, %s <=> %s", fString.c_str(), xString.c_str(), zString.c_str()); + util::stream_format(stream, "%s, %s <=> %s", fString, xString, zString); break; } case 0x1d: @@ -399,7 +402,7 @@ CPU_DISASSEMBLE( dsp16a ) std::string zString = disasmZField(Z); std::string xString = (X ? "*pt++i" : "*pt++"); std::string fString = disasmF1Field(F1, D, S); - sprintf(buffer, "%s, %s <=> y, x = %s", fString.c_str(), zString.c_str(), xString.c_str()); + util::stream_format(stream, "%s, %s <=> y, x = %s", fString, zString, xString); break; } @@ -416,7 +419,7 @@ CPU_DISASSEMBLE( dsp16a ) std::string atString = (aT ? "a0" : "a1"); atString += X ? "" : "1"; // TODO: Figure out unclear wording. std::string fString = disasmF1Field(F1, aT, S); - sprintf(buffer, "%s, %s <=> %s", fString.c_str(), zString.c_str(), atString.c_str()); + util::stream_format(stream, "%s, %s <=> %s", fString, zString, atString); break; } @@ -431,8 +434,8 @@ CPU_DISASSEMBLE( dsp16a ) const uint8_t F2 = (op & 0x01e0) >> 5; std::string fString = disasmF2Field(F2, D, S); std::string conString = disasmCONField(CON); - if (op & 0x0800) sprintf(buffer, "if %s : %s", conString.c_str(), fString.c_str()); - else sprintf(buffer, "ifc %s : %s", conString.c_str(), fString.c_str()); + if (op & 0x0800) util::stream_format(stream, "if %s : %s", conString, fString); + else util::stream_format(stream, "ifc %s : %s", conString, fString); break; } @@ -441,14 +444,14 @@ CPU_DISASSEMBLE( dsp16a ) { // goto JA const uint16_t JA = (op & 0x0fff) | (pc & 0xf000); - sprintf(buffer, "goto 0x%04x", JA); + util::stream_format(stream, "goto 0x%04x", JA); break; } case 0x10: case 0x11: { // call JA const uint16_t JA = (op & 0x0fff) | (pc & 0xf000); - sprintf(buffer, "call 0x%04x", JA); + util::stream_format(stream, "call 0x%04x", JA); break; } @@ -458,7 +461,7 @@ CPU_DISASSEMBLE( dsp16a ) // goto B const uint8_t B = (op & 0x0700) >> 8; std::string bString = disasmBField(B); - sprintf(buffer, "%s", bString.c_str()); + util::stream_format(stream, "%s", bString); break; } @@ -468,10 +471,10 @@ CPU_DISASSEMBLE( dsp16a ) // if CON [goto/call/return] const uint8_t CON = (op & 0x001f); std::string conString = disasmCONField(CON); - sprintf(buffer, "if %s:", conString.c_str()); + util::stream_format(stream, "if %s:", conString); // TODO: Test for invalid ops // icall - if (op == 0xd40e) sprintf(buffer, "icall"); + if (op == 0xd40e) util::stream_format(stream, "icall"); break; } @@ -482,7 +485,7 @@ CPU_DISASSEMBLE( dsp16a ) const uint8_t R = (op & 0x03f0) >> 4; const uint8_t S = (op & 0x1000) >> 12; std::string rString = disasmRField(R); - sprintf(buffer, "%s = %s", rString.c_str(), (S ? "a1" : "a0")); + util::stream_format(stream, "%s = %s", rString, (S ? "a1" : "a0")); break; } case 0x08: @@ -491,7 +494,7 @@ CPU_DISASSEMBLE( dsp16a ) const uint8_t R = (op & 0x03f0) >> 4; const uint8_t aT = (op & 0x0400) >> 10; std::string rString = disasmRField(R); - sprintf(buffer, "%s = %s", (aT ? "a0" : "a1"), rString.c_str()); + util::stream_format(stream, "%s = %s", (aT ? "a0" : "a1"), rString); break; } case 0x0f: @@ -501,7 +504,7 @@ CPU_DISASSEMBLE( dsp16a ) const uint8_t R = (op & 0x03f0) >> 4; std::string yString = disasmYField(Y); std::string rString = disasmRField(R); - sprintf(buffer, "%s = %s", rString.c_str(), yString.c_str()); + util::stream_format(stream, "%s = %s", rString, yString); // TODO: Special case the R == [y, y1, or x] case break; } @@ -513,7 +516,7 @@ CPU_DISASSEMBLE( dsp16a ) std::string yString = disasmYField(Y); std::string rString = disasmRField(R); // TODO: page 3-31 "special function encoding" - sprintf(buffer, "%s = %s", yString.c_str(), rString.c_str()); + util::stream_format(stream, "%s = %s", yString, rString); break; } case 0x0d: @@ -523,7 +526,7 @@ CPU_DISASSEMBLE( dsp16a ) const uint8_t R = (op & 0x03f0) >> 4; std::string zString = disasmZField(Z); std::string rString = disasmRField(R); - sprintf(buffer, "%s <=> %s", zString.c_str(), rString.c_str()); + util::stream_format(stream, "%s <=> %s", zString, rString); break; } @@ -533,7 +536,7 @@ CPU_DISASSEMBLE( dsp16a ) // R = N const uint8_t R = (op & 0x03f0) >> 4; std::string rString = disasmRField(R); - sprintf(buffer, "%s = 0x%04x", rString.c_str(), op2); + util::stream_format(stream, "%s = 0x%04x", rString, op2); opSize = 2; break; } @@ -545,7 +548,7 @@ CPU_DISASSEMBLE( dsp16a ) const uint16_t M = (op & 0x01ff); const uint8_t R = (op & 0x0e00) >> 9; std::string rString = disasmRImmediateField(R); - sprintf(buffer, "%s = 0x%04x", rString.c_str(), M); + util::stream_format(stream, "%s = 0x%04x", rString, M); break; } @@ -555,27 +558,39 @@ CPU_DISASSEMBLE( dsp16a ) // do|redo K const uint8_t K = (op & 0x007f); const uint8_t NI = (op & 0x0780) >> 7; - sprintf(buffer, "do (next %d inst) %d times", NI, K); + // TODO: Limits on K & NI if (NI == 0x00) - sprintf(buffer, "redo %d", K); + util::stream_format(stream, "redo %d", K); + else + util::stream_format(stream, "do (next %d inst) %d times", NI, K); break; } // RESERVED case 0x1e: { - sprintf(buffer, "RESERVED"); + util::stream_format(stream, "RESERVED"); break; } // UNKNOWN default: { - sprintf(buffer, "UNKNOWN"); + util::stream_format(stream, "UNKNOWN"); break; } } return opSize | dasmflags | DASMFLAG_SUPPORTED; } + + +CPU_DISASSEMBLE(dsp16a) +{ + std::ostringstream stream; + offs_t result = internal_disasm_dsp16a(device, stream, pc, oprom, opram, options); + std::string stream_str = stream.str(); + strcpy(buffer, stream_str.c_str()); + return result; +}