summaryrefslogtreecommitdiffstatshomepage
path: root/src/devices/cpu/alto2/alto2dsm.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/devices/cpu/alto2/alto2dsm.cpp')
-rw-r--r--src/devices/cpu/alto2/alto2dsm.cpp108
1 files changed, 61 insertions, 47 deletions
diff --git a/src/devices/cpu/alto2/alto2dsm.cpp b/src/devices/cpu/alto2/alto2dsm.cpp
index 791cafb56e7..09dfdb17c10 100644
--- a/src/devices/cpu/alto2/alto2dsm.cpp
+++ b/src/devices/cpu/alto2/alto2dsm.cpp
@@ -206,8 +206,9 @@ static const char *addrname(int a)
return dst;
}
-offs_t alto2_cpu_device::disasm_disassemble(char *buffer, offs_t pc, const uint8_t *oprom, const uint8_t *opram, uint32_t options)
+offs_t alto2_cpu_device::disasm_disassemble(std::ostream &main_stream, offs_t pc, const uint8_t *oprom, const uint8_t *opram, uint32_t options)
{
+ std::ostringstream stream;
size_t len = 128;
uint32_t mir = (static_cast<uint32_t>(oprom[0]) << 24) |
@@ -228,7 +229,6 @@ offs_t alto2_cpu_device::disasm_disassemble(char *buffer, offs_t pc, const uint8
(static_cast<uint32_t>(src[2]) << 8) |
(static_cast<uint32_t>(src[3]) << 0);
uint16_t prefetch = next2 & 1023;
- char *dst = buffer;
offs_t result = 1 | DASMFLAG_SUPPORTED;
uint8_t pa;
@@ -236,87 +236,87 @@ offs_t alto2_cpu_device::disasm_disassemble(char *buffer, offs_t pc, const uint8
result |= DASMFLAG_STEP_OUT;
if (t)
- dst += snprintf(dst, len - (size_t)(dst - buffer), "T<-%s ", t_bus_alu[aluf]);
+ util::stream_format(stream, "T<-%s ", t_bus_alu[aluf]);
if (l)
- dst += snprintf(dst, len - (size_t)(dst - buffer), "L<- ");
+ util::stream_format(stream, "L<- ");
if (bs == 1)
- dst += snprintf(dst, len - (size_t)(dst - buffer), "%s<- ", regname[rsel]);
+ util::stream_format(stream, "%s<- ", regname[rsel]);
switch (aluf) {
case 0: // T?: BUS
// this is somehow redundant and just wasting space
- // dst += snprintf(dst, len - (size_t)(dst - buffer), "ALUF(BUS) ");
+ // util::stream_format(stream, "ALUF(BUS) ");
break;
case 1: // : T
- dst += snprintf(dst, len - (size_t)(dst - buffer), "T ");
+ util::stream_format(stream, "T ");
break;
case 2: // T?: BUS OR T
- dst += snprintf(dst, len - (size_t)(dst - buffer), "BUS|T ");
+ util::stream_format(stream, "BUS|T ");
break;
case 3: // : BUS AND T
- dst += snprintf(dst, len - (size_t)(dst - buffer), "BUS&T ");
+ util::stream_format(stream, "BUS&T ");
break;
case 4: // : BUS XOR T
- dst += snprintf(dst, len - (size_t)(dst - buffer), "BUS^T ");
+ util::stream_format(stream, "BUS^T ");
break;
case 5: // T?: BUS + 1
- dst += snprintf(dst, len - (size_t)(dst - buffer), "BUS+1 ");
+ util::stream_format(stream, "BUS+1 ");
break;
case 6: // T?: BUS - 1
- dst += snprintf(dst, len - (size_t)(dst - buffer), "BUS-1 ");
+ util::stream_format(stream, "BUS-1 ");
break;
case 7: // : BUS + T
- dst += snprintf(dst, len - (size_t)(dst - buffer), "BUS+T ");
+ util::stream_format(stream, "BUS+T ");
break;
case 8: // : BUS - T
- dst += snprintf(dst, len - (size_t)(dst - buffer), "BUS-T ");
+ util::stream_format(stream, "BUS-T ");
break;
case 9: // : BUS - T - 1
- dst += snprintf(dst, len - (size_t)(dst - buffer), "BUS-T-1 ");
+ util::stream_format(stream, "BUS-T-1 ");
break;
case 10: // T?: BUS + T + 1
- dst += snprintf(dst, len - (size_t)(dst - buffer), "BUS+T+1 ");
+ util::stream_format(stream, "BUS+T+1 ");
break;
case 11: // T?: BUS + SKIP
- dst += snprintf(dst, len - (size_t)(dst - buffer), "BUS+SKIP ");
+ util::stream_format(stream, "BUS+SKIP ");
break;
case 12: // T?: BUS, T (AND)
- dst += snprintf(dst, len - (size_t)(dst - buffer), "BUS,T ");
+ util::stream_format(stream, "BUS,T ");
break;
case 13: // : BUS AND NOT T
- dst += snprintf(dst, len - (size_t)(dst - buffer), "BUS&~T ");
+ util::stream_format(stream, "BUS&~T ");
break;
case 14: // : undefined
- dst += snprintf(dst, len - (size_t)(dst - buffer), "*BUS ");
+ util::stream_format(stream, "*BUS ");
break;
case 15: // : undefined
- dst += snprintf(dst, len - (size_t)(dst - buffer), "*BUS ");
+ util::stream_format(stream, "*BUS ");
break;
}
switch (bs) {
case 0: // read R
- dst += snprintf(dst, len - (size_t)(dst - buffer), "BUS<-%s ", regname[rsel]);
+ util::stream_format(stream, "BUS<-%s ", regname[rsel]);
break;
case 1: // load R from shifter output
- // dst += snprintf(dst, len - (size_t)(dst - buffer), "; %s<-", regname[rsel]);
+ // util::stream_format(stream, "; %s<-", regname[rsel]);
break;
case 2: // enables no source to the BUS, leaving it all ones
- dst += snprintf(dst, len - (size_t)(dst - buffer), "BUS<-177777 ");
+ util::stream_format(stream, "BUS<-177777 ");
break;
case 3: // performs different functions in different tasks
- dst += snprintf(dst, len - (size_t)(dst - buffer), "BUS<-BS3 ");
+ util::stream_format(stream, "BUS<-BS3 ");
break;
case 4: // performs different functions in different tasks
- dst += snprintf(dst, len - (size_t)(dst - buffer), "BUS<-BS4 ");
+ util::stream_format(stream, "BUS<-BS4 ");
break;
case 5: // memory data
- dst += snprintf(dst, len - (size_t)(dst - buffer), "BUS<-MD ");
+ util::stream_format(stream, "BUS<-MD ");
break;
case 6: // BUS[3-0] <- MOUSE; BUS[15-4] <- -1
- dst += snprintf(dst, len - (size_t)(dst - buffer), "BUS<-MOUSE ");
+ util::stream_format(stream, "BUS<-MOUSE ");
break;
case 7: // IR[7-0], possibly sign extended
- dst += snprintf(dst, len - (size_t)(dst - buffer), "BUS<-DISP ");
+ util::stream_format(stream, "BUS<-DISP ");
break;
}
@@ -325,29 +325,29 @@ offs_t alto2_cpu_device::disasm_disassemble(char *buffer, offs_t pc, const uint8
case 0: // no operation
break;
case 1: // load MAR from ALU output; start main memory reference
- dst += snprintf(dst, len - (size_t)(dst - buffer), "MAR<-ALU ");
+ util::stream_format(stream, "MAR<-ALU ");
break;
case 2: // switch tasks if higher priority wakeup is pending
- dst += snprintf(dst, len - (size_t)(dst - buffer), "TASK ");
+ util::stream_format(stream, "TASK ");
break;
case 3: // disable the current task until re-enabled by a hardware-generated condition
- dst += snprintf(dst, len - (size_t)(dst - buffer), "BLOCK ");
+ util::stream_format(stream, "BLOCK ");
break;
case 4: // SHIFTER output will be L shifted left one place
- dst += snprintf(dst, len - (size_t)(dst - buffer), "SHIFTER<-L(LSH1) ");
+ util::stream_format(stream, "SHIFTER<-L(LSH1) ");
break;
case 5: // SHIFTER output will be L shifted right one place
- dst += snprintf(dst, len - (size_t)(dst - buffer), "SHIFTER<-L(RSH1) ");
+ util::stream_format(stream, "SHIFTER<-L(RSH1) ");
break;
case 6: // SHIFTER output will be L rotated left 8 places
- dst += snprintf(dst, len - (size_t)(dst - buffer), "SHIFTER<-L(LCY8) ");
+ util::stream_format(stream, "SHIFTER<-L(LCY8) ");
break;
case 7: // put the constant from PROM (RSELECT,BS) on the bus
pa = (rsel << 3) | bs;
- dst += snprintf(dst, len - (size_t)(dst - buffer), "BUS<-%05o ", const_prom[pa]);
+ util::stream_format(stream, "BUS<-%05o ", const_prom[pa]);
break;
default:
- dst += snprintf(dst, len - (size_t)(dst - buffer), "F1_%02o ", f1);
+ util::stream_format(stream, "F1_%02o ", f1);
break;
}
@@ -355,39 +355,53 @@ offs_t alto2_cpu_device::disasm_disassemble(char *buffer, offs_t pc, const uint8
case 0: // no operation
break;
case 1: // NEXT <- NEXT OR (BUS==0 ? 1 : 0)
- dst += snprintf(dst, len - (size_t)(dst - buffer), "[BUS==0 ? %s:%s] ",
+ util::stream_format(stream, "[BUS==0 ? %s:%s] ",
addrname((prefetch | 1) & MCODE_MASK), addrname(prefetch & MCODE_MASK));
break;
case 2: // NEXT <- NEXT OR (SHIFTER==0 ? 1 : 0)
- dst += snprintf(dst, len - (size_t)(dst - buffer), "[SH==0 ? %s:%s] ",
+ util::stream_format(stream, "[SH==0 ? %s:%s] ",
addrname((prefetch | 1) & MCODE_MASK), addrname(prefetch & MCODE_MASK));
break;
case 3: // NEXT <- NEXT OR (SHIFTER<0 ? 1 : 0)
- dst += snprintf(dst, len - (size_t)(dst - buffer), "[SH<0 ? %s:%s] ",
+ util::stream_format(stream, "[SH<0 ? %s:%s] ",
addrname((prefetch | 1) & MCODE_MASK), addrname(prefetch & MCODE_MASK));
break;
case 4: // NEXT <- NEXT OR BUS
- dst += snprintf(dst, len - (size_t)(dst - buffer), "NEXT<-BUS ");
+ util::stream_format(stream, "NEXT<-BUS ");
break;
case 5: // NEXT <- NEXT OR ALUC0. ALUC0 is the carry produced by last L loading microinstruction.
- dst += snprintf(dst, len - (size_t)(dst - buffer), "[ALUC0 ? %s:%s] ",
+ util::stream_format(stream, "[ALUC0 ? %s:%s] ",
addrname((prefetch | 1) & MCODE_MASK), addrname(prefetch & MCODE_MASK));
break;
case 6: // write BUS data to memory
- dst += snprintf(dst, len - (size_t)(dst - buffer), "MD<-BUS ");
+ util::stream_format(stream, "MD<-BUS ");
break;
case 7: // put the constant from PROM (RSELECT,BS) on the bus
if (f1 != 7) {
pa = 8 * rsel + bs;
- dst += snprintf(dst, len - (size_t)(dst - buffer), "BUS<-%05o", const_prom[pa]);
+ util::stream_format(stream, "BUS<-%05o", const_prom[pa]);
}
break;
default:
- dst += snprintf(dst, len - (size_t)(dst - buffer), "BUS<-F2_%02o ", f2);
+ util::stream_format(stream, "BUS<-F2_%02o ", f2);
break;
}
- if (dst > buffer && dst[-1] == ' ')
- *--dst = '\0';
+ // need to trim last space
+ std::string output = stream.str();
+ if (output.length() > 0 && output[output.length() - 1] == ' ')
+ output.resize(output.length() - 1);
+ main_stream << output;
+
+ return result;
+}
+
+
+offs_t alto2_cpu_device::disasm_disassemble(char *buffer, offs_t pc, const uint8_t *oprom, const uint8_t *opram, uint32_t options)
+{
+ std::ostringstream stream;
+ offs_t result = disasm_disassemble(stream, pc, oprom, opram, options);
+ std::string stream_str = stream.str();
+ strcpy(buffer, stream_str.c_str());
return result;
}