mirror of
https://github.com/holub/mame
synced 2025-04-22 00:11:58 +03:00
Changed the dsp16a disassembler to use 'std::ostream &' internally
This commit is contained in:
parent
dbd07cef38
commit
e725caeae9
@ -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;
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user