Changed the dsp16a disassembler to use 'std::ostream &' internally

This commit is contained in:
Nathan Woods 2016-11-11 16:45:15 -05:00
parent dbd07cef38
commit e725caeae9

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;
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;
}