Merge pull request #1669 from npwoods/dasmstream_dsp16a

Changed the dsp16a disassembler to use 'std::ostream &' internally
This commit is contained in:
Vas Crabb 2016-11-12 18:03:30 +11:00 committed by GitHub
commit 2d0410877d

View File

@ -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; uint8_t opSize = 1;
uint32_t dasmflags = 0; uint32_t dasmflags = 0;
@ -270,7 +270,7 @@ CPU_DISASSEMBLE( dsp16a )
const uint8_t F1 = (op & 0x01e0) >> 5; const uint8_t F1 = (op & 0x01e0) >> 5;
std::string yString = disasmYField(Y); std::string yString = disasmYField(Y);
std::string fString = disasmF1Field(F1, D, S); 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; break;
} }
case 0x04: case 0x1c: case 0x04: case 0x1c:
@ -285,7 +285,7 @@ CPU_DISASSEMBLE( dsp16a )
std::string fString = disasmF1Field(F1, D, S); std::string fString = disasmF1Field(F1, D, S);
std::string aString = (opcode == 0x1c) ? "a0" : "a1"; std::string aString = (opcode == 0x1c) ? "a0" : "a1";
std::string xString = (X) ? "" : "l"; 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; break;
} }
case 0x16: case 0x16:
@ -297,7 +297,7 @@ CPU_DISASSEMBLE( dsp16a )
const uint8_t F1 = (op & 0x01e0) >> 5; const uint8_t F1 = (op & 0x01e0) >> 5;
std::string yString = disasmYField(Y); std::string yString = disasmYField(Y);
std::string fString = disasmF1Field(F1, D, S); 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; break;
} }
case 0x17: case 0x17:
@ -311,7 +311,7 @@ CPU_DISASSEMBLE( dsp16a )
std::string yString = disasmYField(Y); std::string yString = disasmYField(Y);
std::string fString = disasmF1Field(F1, D, S); std::string fString = disasmF1Field(F1, D, S);
std::string xString = (X ? "y" : "y1"); 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; break;
} }
case 0x1f: case 0x1f:
@ -325,7 +325,7 @@ CPU_DISASSEMBLE( dsp16a )
std::string yString = disasmYField(Y); std::string yString = disasmYField(Y);
std::string fString = disasmF1Field(F1, D, S); std::string fString = disasmF1Field(F1, D, S);
std::string xString = (X ? "*pt++i" : "*pt++"); 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; break;
} }
case 0x19: case 0x1b: case 0x19: case 0x1b:
@ -339,8 +339,11 @@ CPU_DISASSEMBLE( dsp16a )
std::string fString = disasmF1Field(F1, D, S); std::string fString = disasmF1Field(F1, D, S);
std::string xString = (X ? "*pt++i" : "*pt++"); std::string xString = (X ? "*pt++i" : "*pt++");
std::string aString = (opcode == 0x19) ? "a0" : "a1"; 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; break;
} }
case 0x14: case 0x14:
@ -354,7 +357,7 @@ CPU_DISASSEMBLE( dsp16a )
std::string yString = disasmYField(Y); std::string yString = disasmYField(Y);
std::string xString = (X ? "y" : "y1"); std::string xString = (X ? "y" : "y1");
std::string fString = disasmF1Field(F1, D, S); 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; break;
} }
@ -369,7 +372,7 @@ CPU_DISASSEMBLE( dsp16a )
std::string yString = disasmYField(Y); std::string yString = disasmYField(Y);
std::string atString = (aT ? "a0" : "a1"); std::string atString = (aT ? "a0" : "a1");
std::string fString = disasmF1Field(F1, aT, S); 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; break;
} }
@ -385,7 +388,7 @@ CPU_DISASSEMBLE( dsp16a )
std::string zString = disasmZField(Z); std::string zString = disasmZField(Z);
std::string xString = (X ? "y" : "y1"); std::string xString = (X ? "y" : "y1");
std::string fString = disasmF1Field(F1, D, S); 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; break;
} }
case 0x1d: case 0x1d:
@ -399,7 +402,7 @@ CPU_DISASSEMBLE( dsp16a )
std::string zString = disasmZField(Z); std::string zString = disasmZField(Z);
std::string xString = (X ? "*pt++i" : "*pt++"); std::string xString = (X ? "*pt++i" : "*pt++");
std::string fString = disasmF1Field(F1, D, S); 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; break;
} }
@ -416,7 +419,7 @@ CPU_DISASSEMBLE( dsp16a )
std::string atString = (aT ? "a0" : "a1"); std::string atString = (aT ? "a0" : "a1");
atString += X ? "" : "1"; // TODO: Figure out unclear wording. atString += X ? "" : "1"; // TODO: Figure out unclear wording.
std::string fString = disasmF1Field(F1, aT, S); 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; break;
} }
@ -431,8 +434,8 @@ CPU_DISASSEMBLE( dsp16a )
const uint8_t F2 = (op & 0x01e0) >> 5; const uint8_t F2 = (op & 0x01e0) >> 5;
std::string fString = disasmF2Field(F2, D, S); std::string fString = disasmF2Field(F2, D, S);
std::string conString = disasmCONField(CON); std::string conString = disasmCONField(CON);
if (op & 0x0800) sprintf(buffer, "if %s : %s", conString.c_str(), fString.c_str()); if (op & 0x0800) util::stream_format(stream, "if %s : %s", conString, fString);
else sprintf(buffer, "ifc %s : %s", conString.c_str(), fString.c_str()); else util::stream_format(stream, "ifc %s : %s", conString, fString);
break; break;
} }
@ -441,14 +444,14 @@ CPU_DISASSEMBLE( dsp16a )
{ {
// goto JA // goto JA
const uint16_t JA = (op & 0x0fff) | (pc & 0xf000); const uint16_t JA = (op & 0x0fff) | (pc & 0xf000);
sprintf(buffer, "goto 0x%04x", JA); util::stream_format(stream, "goto 0x%04x", JA);
break; break;
} }
case 0x10: case 0x11: case 0x10: case 0x11:
{ {
// call JA // call JA
const uint16_t JA = (op & 0x0fff) | (pc & 0xf000); const uint16_t JA = (op & 0x0fff) | (pc & 0xf000);
sprintf(buffer, "call 0x%04x", JA); util::stream_format(stream, "call 0x%04x", JA);
break; break;
} }
@ -458,7 +461,7 @@ CPU_DISASSEMBLE( dsp16a )
// goto B // goto B
const uint8_t B = (op & 0x0700) >> 8; const uint8_t B = (op & 0x0700) >> 8;
std::string bString = disasmBField(B); std::string bString = disasmBField(B);
sprintf(buffer, "%s", bString.c_str()); util::stream_format(stream, "%s", bString);
break; break;
} }
@ -468,10 +471,10 @@ CPU_DISASSEMBLE( dsp16a )
// if CON [goto/call/return] // if CON [goto/call/return]
const uint8_t CON = (op & 0x001f); const uint8_t CON = (op & 0x001f);
std::string conString = disasmCONField(CON); std::string conString = disasmCONField(CON);
sprintf(buffer, "if %s:", conString.c_str()); util::stream_format(stream, "if %s:", conString);
// TODO: Test for invalid ops // TODO: Test for invalid ops
// icall // icall
if (op == 0xd40e) sprintf(buffer, "icall"); if (op == 0xd40e) util::stream_format(stream, "icall");
break; break;
} }
@ -482,7 +485,7 @@ CPU_DISASSEMBLE( dsp16a )
const uint8_t R = (op & 0x03f0) >> 4; const uint8_t R = (op & 0x03f0) >> 4;
const uint8_t S = (op & 0x1000) >> 12; const uint8_t S = (op & 0x1000) >> 12;
std::string rString = disasmRField(R); 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; break;
} }
case 0x08: case 0x08:
@ -491,7 +494,7 @@ CPU_DISASSEMBLE( dsp16a )
const uint8_t R = (op & 0x03f0) >> 4; const uint8_t R = (op & 0x03f0) >> 4;
const uint8_t aT = (op & 0x0400) >> 10; const uint8_t aT = (op & 0x0400) >> 10;
std::string rString = disasmRField(R); 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; break;
} }
case 0x0f: case 0x0f:
@ -501,7 +504,7 @@ CPU_DISASSEMBLE( dsp16a )
const uint8_t R = (op & 0x03f0) >> 4; const uint8_t R = (op & 0x03f0) >> 4;
std::string yString = disasmYField(Y); std::string yString = disasmYField(Y);
std::string rString = disasmRField(R); 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 // TODO: Special case the R == [y, y1, or x] case
break; break;
} }
@ -513,7 +516,7 @@ CPU_DISASSEMBLE( dsp16a )
std::string yString = disasmYField(Y); std::string yString = disasmYField(Y);
std::string rString = disasmRField(R); std::string rString = disasmRField(R);
// TODO: page 3-31 "special function encoding" // 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; break;
} }
case 0x0d: case 0x0d:
@ -523,7 +526,7 @@ CPU_DISASSEMBLE( dsp16a )
const uint8_t R = (op & 0x03f0) >> 4; const uint8_t R = (op & 0x03f0) >> 4;
std::string zString = disasmZField(Z); std::string zString = disasmZField(Z);
std::string rString = disasmRField(R); std::string rString = disasmRField(R);
sprintf(buffer, "%s <=> %s", zString.c_str(), rString.c_str()); util::stream_format(stream, "%s <=> %s", zString, rString);
break; break;
} }
@ -533,7 +536,7 @@ CPU_DISASSEMBLE( dsp16a )
// R = N // R = N
const uint8_t R = (op & 0x03f0) >> 4; const uint8_t R = (op & 0x03f0) >> 4;
std::string rString = disasmRField(R); 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; opSize = 2;
break; break;
} }
@ -545,7 +548,7 @@ CPU_DISASSEMBLE( dsp16a )
const uint16_t M = (op & 0x01ff); const uint16_t M = (op & 0x01ff);
const uint8_t R = (op & 0x0e00) >> 9; const uint8_t R = (op & 0x0e00) >> 9;
std::string rString = disasmRImmediateField(R); std::string rString = disasmRImmediateField(R);
sprintf(buffer, "%s = 0x%04x", rString.c_str(), M); util::stream_format(stream, "%s = 0x%04x", rString, M);
break; break;
} }
@ -555,27 +558,39 @@ CPU_DISASSEMBLE( dsp16a )
// do|redo K // do|redo K
const uint8_t K = (op & 0x007f); const uint8_t K = (op & 0x007f);
const uint8_t NI = (op & 0x0780) >> 7; const uint8_t NI = (op & 0x0780) >> 7;
sprintf(buffer, "do (next %d inst) %d times", NI, K);
// TODO: Limits on K & NI // TODO: Limits on K & NI
if (NI == 0x00) 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; break;
} }
// RESERVED // RESERVED
case 0x1e: case 0x1e:
{ {
sprintf(buffer, "RESERVED"); util::stream_format(stream, "RESERVED");
break; break;
} }
// UNKNOWN // UNKNOWN
default: default:
{ {
sprintf(buffer, "UNKNOWN"); util::stream_format(stream, "UNKNOWN");
break; break;
} }
} }
return opSize | dasmflags | DASMFLAG_SUPPORTED; 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;
}