summaryrefslogtreecommitdiffstatshomepage
path: root/src/devices/cpu/tms9900
diff options
context:
space:
mode:
author Nathan Woods <npwoods@mess.org>2016-11-18 08:02:24 -0500
committer Nathan Woods <npwoods@mess.org>2016-11-18 08:02:24 -0500
commit059d44e1b43e626ec390d7607ef8972cf6f0d5f0 (patch)
treefc97c0978bdea8fa95775cf669f8e558f9d40f1f /src/devices/cpu/tms9900
parentbb99eba11dadfa37acb2a796f4f8e2b0a7330e44 (diff)
Changed the tms99xx disassembler to use 'std::ostream &' internally
Diffstat (limited to 'src/devices/cpu/tms9900')
-rw-r--r--src/devices/cpu/tms9900/9900dasm.cpp159
1 files changed, 85 insertions, 74 deletions
diff --git a/src/devices/cpu/tms9900/9900dasm.cpp b/src/devices/cpu/tms9900/9900dasm.cpp
index bd4b0215d32..e0842d3acc8 100644
--- a/src/devices/cpu/tms9900/9900dasm.cpp
+++ b/src/devices/cpu/tms9900/9900dasm.cpp
@@ -306,34 +306,36 @@ static inline uint16_t readop_arg(const uint8_t *opram, unsigned pc)
return result | opram[PC++ - pc];
}
-static int print_arg (char *dest, int mode, int arg, const uint8_t *opram, unsigned pc)
+static void print_arg (std::ostream &stream, int mode, int arg, const uint8_t *opram, unsigned pc)
{
int base;
switch (mode)
{
case 0x0: /* workspace register */
- return sprintf (dest, "R%d", arg);
+ util::stream_format(stream, "R%d", arg);
+ break;
case 0x1: /* workspace register indirect */
- return sprintf (dest, "*R%d", arg);
+ util::stream_format(stream, "*R%d", arg);
+ break;
case 0x2: /* symbolic|indexed */
base = readop_arg(opram, pc);
if (arg) /* indexed */
- return sprintf (dest, "@>%04x(R%d)", base, arg);
+ util::stream_format(stream, "@>%04x(R%d)", base, arg);
else /* symbolic (direct) */
- return sprintf (dest, "@>%04x", base);
+ util::stream_format(stream, "@>%04x", base);
+ break;
case 0x3: /* workspace register indirect auto increment */
- return sprintf (dest, "*R%d+", arg);
+ util::stream_format(stream, "*R%d+", arg);
+ break;
}
-
- return 0;
}
/*****************************************************************************
* Disassemble a single command and return the number of bytes it uses.
*****************************************************************************/
-unsigned Dasm9900 (char *buffer, unsigned pc, int model_id, const uint8_t *oprom, const uint8_t *opram)
+static unsigned Dasm9900 (std::ostream &stream, unsigned pc, int model_id, const uint8_t *oprom, const uint8_t *opram)
{
int OP, OP2, opc;
int sarg, darg, smode, dmode;
@@ -485,20 +487,20 @@ unsigned Dasm9900 (char *buffer, unsigned pc, int model_id, const uint8_t *oprom
dmode = BITS(OP,4,5);
darg = BITS(OP,6,9);
- buffer += sprintf (buffer, "%-4s ", mnemonic);
- buffer += print_arg (buffer, smode, sarg, opram, pc);
- buffer += sprintf (buffer, ",");
- buffer += print_arg (buffer, dmode, darg, opram, pc);
+ util::stream_format(stream, "%-4s ", mnemonic);
+ print_arg(stream, smode, sarg, opram, pc);
+ util::stream_format(stream, ",");
+ print_arg(stream, dmode, darg, opram, pc);
break;
case format_2a: /* jump instructions */
displacement = (signed char)BITS(OP,8,15);
- sprintf (buffer, "%-4s >%04x", mnemonic, 0xffff & (PC + displacement * 2));
+ util::stream_format(stream, "%-4s >%04x", mnemonic, 0xffff & (PC + displacement * 2));
break;
case format_2b: /* bit I/O instructions */
displacement = (signed char)BITS(OP,8,15);
- sprintf (buffer, "%-4s >%04x", mnemonic, 0xffff & displacement);
+ util::stream_format(stream, "%-4s >%04x", mnemonic, 0xffff & displacement);
break;
case format_3_9: /* logical, multiply, and divide instructions */
@@ -513,15 +515,15 @@ unsigned Dasm9900 (char *buffer, unsigned pc, int model_id, const uint8_t *oprom
if (format == format_3_9)
{
- buffer += sprintf (buffer, "%-4s ", mnemonic);
- buffer += print_arg (buffer, smode, sarg, opram, pc);
- buffer += sprintf (buffer, ",R%d", darg);
+ util::stream_format(stream, "%-4s ", mnemonic);
+ print_arg(stream, smode, sarg, opram, pc);
+ util::stream_format(stream, ",R%d", darg);
}
else
{
- buffer += sprintf (buffer, "%-4s ", mnemonic);
- buffer += print_arg (buffer, smode, sarg, opram, pc);
- buffer += sprintf (buffer, ",%d", darg);
+ util::stream_format(stream, "%-4s ", mnemonic);
+ print_arg(stream, smode, sarg, opram, pc);
+ util::stream_format(stream, ",%d", darg);
}
break;
@@ -529,39 +531,39 @@ unsigned Dasm9900 (char *buffer, unsigned pc, int model_id, const uint8_t *oprom
sarg = BITS(OP,12,15);
darg = BITS(OP,8,11);
- sprintf (buffer, darg ? "%-4s R%d,%d" : "%-4s R%d,R%d", mnemonic, sarg, darg);
+ util::stream_format(stream, darg ? "%-4s R%d,%d" : "%-4s R%d,R%d", mnemonic, sarg, darg);
break;
case format_6: /* single address instructions */
smode = BITS(OP,10,11);
sarg = BITS(OP,12,15);
- buffer += sprintf (buffer, "%-4s ", mnemonic);
- buffer += print_arg (buffer, smode, sarg, opram, pc);
+ util::stream_format(stream, "%-4s ", mnemonic);
+ print_arg(stream, smode, sarg, opram, pc);
break;
case format_7: /* instructions without operands */
- sprintf (buffer, "%s", mnemonic);
+ util::stream_format(stream, "%s", mnemonic);
break;
case format_8a: /* immediate instructions (destination register) */
darg = BITS(OP,12,15);
sarg = readop_arg(opram, pc);
- sprintf (buffer, "%-4s R%d,>%04x", mnemonic, darg, sarg);
+ util::stream_format(stream, "%-4s R%d,>%04x", mnemonic, darg, sarg);
break;
case format_8b: /* immediate instructions (no destination register) */
sarg = readop_arg(opram, pc);
- sprintf (buffer, "%-4s >%04x", mnemonic, sarg);
+ util::stream_format(stream, "%-4s >%04x", mnemonic, sarg);
break;
case format_10: /* memory map file instruction */
sarg = BITS(OP,12,15);
darg = BITS(OP,11,11);
- sprintf (buffer, "%-4s R%d,%d", mnemonic, sarg, darg);
+ util::stream_format(stream, "%-4s R%d,%d", mnemonic, sarg, darg);
break;
case format_11: /* multiple precision instructions */
@@ -573,11 +575,11 @@ unsigned Dasm9900 (char *buffer, unsigned pc, int model_id, const uint8_t *oprom
darg = BITS(OP2,6,9);
byte_count = BITS(OP2,0,3);
- buffer += sprintf (buffer, "%-4s ", mnemonic);
- buffer += print_arg (buffer, smode, sarg, opram, pc);
- buffer += sprintf (buffer, ",");
- buffer += print_arg (buffer, dmode, darg, opram, pc);
- buffer += sprintf (buffer, byte_count ? ",%d" : ",R%d", byte_count);
+ util::stream_format(stream, "%-4s ", mnemonic);
+ print_arg(stream, smode, sarg, opram, pc);
+ util::stream_format(stream, ",");
+ print_arg(stream, dmode, darg, opram, pc);
+ util::stream_format(stream, byte_count ? ",%d" : ",R%d", byte_count);
break;
case format_12: /* string instructions */
@@ -590,11 +592,11 @@ unsigned Dasm9900 (char *buffer, unsigned pc, int model_id, const uint8_t *oprom
byte_count = BITS(OP2,0,3);
checkpoint = BITS(OP,12,15);
- buffer += sprintf (buffer, "%-4s ", mnemonic);
- buffer += print_arg (buffer, smode, sarg, opram, pc);
- buffer += sprintf (buffer, ",");
- buffer += print_arg (buffer, dmode, darg, opram, pc);
- buffer += sprintf (buffer, byte_count ? ",%d,R%d" : ",R%d,R%d", byte_count, checkpoint);
+ util::stream_format(stream, "%-4s ", mnemonic);
+ print_arg(stream, smode, sarg, opram, pc);
+ util::stream_format(stream, ",");
+ print_arg(stream, dmode, darg, opram, pc);
+ util::stream_format(stream, byte_count ? ",%d,R%d" : ",R%d,R%d", byte_count, checkpoint);
break;
case format_13: /* multiple precision shift instructions */
@@ -605,10 +607,10 @@ unsigned Dasm9900 (char *buffer, unsigned pc, int model_id, const uint8_t *oprom
darg = BITS(OP2,6,9);
byte_count = BITS(OP2,0,3);
- buffer += sprintf (buffer, "%-4s ", mnemonic);
- buffer += print_arg (buffer, smode, sarg, opram, pc);
- buffer += sprintf (buffer, byte_count ? ",%d" : ",R%d", byte_count);
- buffer += sprintf (buffer, darg ? ",%d" : ",R%d", darg);
+ util::stream_format(stream, "%-4s ", mnemonic);
+ print_arg(stream, smode, sarg, opram, pc);
+ util::stream_format(stream, byte_count ? ",%d" : ",R%d", byte_count);
+ util::stream_format(stream, darg ? ",%d" : ",R%d", darg);
break;
case format_14: /* bit testing instructions */
@@ -618,12 +620,12 @@ unsigned Dasm9900 (char *buffer, unsigned pc, int model_id, const uint8_t *oprom
sarg = BITS(OP2,12,15);
darg = BITS(OP2,0,9);
- buffer += sprintf (buffer, "%-4s ", mnemonic);
- buffer += print_arg (buffer, smode, sarg, opram, pc);
+ util::stream_format(stream, "%-4s ", mnemonic);
+ print_arg(stream, smode, sarg, opram, pc);
if (darg == 0x3ff)
- buffer += sprintf (buffer, ",R0");
+ util::stream_format(stream, ",R0");
else
- buffer += sprintf (buffer, ",%d", darg);
+ util::stream_format(stream, ",%d", darg);
break;
case format_15: /* invert order of field instruction */
@@ -634,10 +636,10 @@ unsigned Dasm9900 (char *buffer, unsigned pc, int model_id, const uint8_t *oprom
bit_position = BITS(OP2,0,3);
bit_width = BITS(OP,12,15);
- buffer += sprintf (buffer, "%-4s ", mnemonic);
- buffer += print_arg (buffer, smode, sarg, opram, pc);
- buffer += sprintf (buffer, bit_position ? ",(%d," : ",(R%d,", bit_position);
- buffer += sprintf (buffer, bit_width ? "%d)" : "R%d)", bit_width);
+ util::stream_format(stream, "%-4s ", mnemonic);
+ print_arg(stream, smode, sarg, opram, pc);
+ util::stream_format(stream, bit_position ? ",(%d," : ",(R%d,", bit_position);
+ util::stream_format(stream, bit_width ? "%d)" : "R%d)", bit_width);
break;
case format_16: /* field instructions */
@@ -650,12 +652,12 @@ unsigned Dasm9900 (char *buffer, unsigned pc, int model_id, const uint8_t *oprom
bit_position = BITS(OP2,0,3);
bit_width = BITS(OP,12,15);
- buffer += sprintf (buffer, "%-4s ", mnemonic);
- buffer += print_arg (buffer, smode, sarg, opram, pc);
- buffer += sprintf (buffer, ",");
- buffer += print_arg (buffer, dmode, darg, opram, pc);
- buffer += sprintf (buffer, bit_position ? ",(%d," : ",(%d,", bit_position);
- buffer += sprintf (buffer, bit_width ? "%d)" : "R%d)", bit_width);
+ util::stream_format(stream, "%-4s ", mnemonic);
+ print_arg(stream, smode, sarg, opram, pc);
+ util::stream_format(stream, ",");
+ print_arg(stream, dmode, darg, opram, pc);
+ util::stream_format(stream, bit_position ? ",(%d," : ",(%d,", bit_position);
+ util::stream_format(stream, bit_width ? "%d)" : "R%d)", bit_width);
break;
case format_17: /* alter register and jump instructions */
@@ -665,20 +667,20 @@ unsigned Dasm9900 (char *buffer, unsigned pc, int model_id, const uint8_t *oprom
sarg = BITS(OP2,4,7);
darg = BITS(OP2,0,3);
if (darg)
- sprintf (buffer, darg ? "%-4s >%04x,%d,R%d" : "%-4s >%04x,R%d,R%d",
+ util::stream_format(stream, darg ? "%-4s >%04x,%d,R%d" : "%-4s >%04x,R%d,R%d",
mnemonic, 0xffff & (PC + displacement * 2), sarg, darg);
break;
case format_18: /* single register operand instructions */
sarg = BITS(OP,12,15);
- sprintf (buffer, "%-4s R%d", mnemonic, sarg);
+ util::stream_format(stream, "%-4s R%d", mnemonic, sarg);
break;
case format_liim: /* liim instruction */
sarg = BITS(OP,14,15);
- sprintf (buffer, "%-4s %d", mnemonic, sarg);
+ util::stream_format(stream, "%-4s %d", mnemonic, sarg);
break;
case format_19: /* move address instruction */
@@ -689,10 +691,10 @@ unsigned Dasm9900 (char *buffer, unsigned pc, int model_id, const uint8_t *oprom
dmode = BITS(OP2,4,5);
darg = BITS(OP2,6,9);
- buffer += sprintf (buffer, "%-4s ", mnemonic);
- buffer += print_arg (buffer, smode, sarg, opram, pc);
- buffer += sprintf (buffer, ",");
- buffer += print_arg (buffer, dmode, darg, opram, pc);
+ util::stream_format(stream, "%-4s ", mnemonic);
+ print_arg(stream, smode, sarg, opram, pc);
+ util::stream_format(stream, ",");
+ print_arg(stream, dmode, darg, opram, pc);
break;
case format_20: /* list search instructions */
@@ -743,10 +745,10 @@ unsigned Dasm9900 (char *buffer, unsigned pc, int model_id, const uint8_t *oprom
break;
}
- buffer += sprintf (buffer, "%-4s %s,", mnemonic, condition_code);
- buffer += print_arg (buffer, smode, sarg, opram, pc);
- buffer += sprintf (buffer, ",");
- buffer += print_arg (buffer, dmode, darg, opram, pc);
+ util::stream_format(stream, "%-4s %s,", mnemonic, condition_code);
+ print_arg(stream, smode, sarg, opram, pc);
+ util::stream_format(stream, ",");
+ print_arg(stream, dmode, darg, opram, pc);
break;
}
@@ -763,25 +765,34 @@ unsigned Dasm9900 (char *buffer, unsigned pc, int model_id, const uint8_t *oprom
byte_count = BITS(OP2,0,3);
dest_byte_count = BITS(OP,12,15);
- buffer += sprintf (buffer, "%-4s ", mnemonic);
- buffer += print_arg (buffer, smode, sarg, opram, pc);
- buffer += sprintf (buffer, ",");
- buffer += print_arg (buffer, dmode, darg, opram, pc);
- buffer += sprintf (buffer, byte_count ? ",%d" : ",R%d", byte_count);
- buffer += sprintf (buffer, dest_byte_count ? ",%d" : ",R%d", dest_byte_count);
+ util::stream_format(stream, "%-4s ", mnemonic);
+ print_arg(stream, smode, sarg, opram, pc);
+ util::stream_format(stream, ",");
+ print_arg(stream, dmode, darg, opram, pc);
+ util::stream_format(stream, byte_count ? ",%d" : ",R%d", byte_count);
+ util::stream_format(stream, dest_byte_count ? ",%d" : ",R%d", dest_byte_count);
break;
}
default:
osd_printf_error("debbugger internal error, file %s, line %d\n", __FILE__, __LINE__);
case illegal:
- sprintf (buffer, "data >%04x", OP);
+ util::stream_format(stream, "data >%04x", OP);
break;
}
return (PC - pc) | DASMFLAG_SUPPORTED | dasmflags;
}
+static unsigned Dasm9900(char *buffer, unsigned pc, int model_id, const uint8_t *oprom, const uint8_t *opram)
+{
+ std::ostringstream stream;
+ unsigned result = Dasm9900(stream, pc, model_id, oprom, opram);
+ std::string stream_str = stream.str();
+ strcpy(buffer, stream_str.c_str());
+ return result;
+}
+
CPU_DISASSEMBLE( tms9900 )
{
return Dasm9900(buffer, pc, TMS9900_ID, oprom, opram);