Merge pull request #1745 from npwoods/dasmstream_alto2

Changed the alto2 disassembler to use 'std::ostream &' internally
This commit is contained in:
Vas Crabb 2016-11-20 06:54:43 +11:00 committed by GitHub
commit ae1362639a
2 changed files with 63 additions and 48 deletions

View File

@ -913,6 +913,8 @@ private:
uint8_t m_ether_id; //!< configured Ethernet ID for this machine uint8_t m_ether_id; //!< configured Ethernet ID for this machine
offs_t disasm_disassemble(std::ostream &stream, offs_t pc, const uint8_t *oprom, const uint8_t *opram, uint32_t options);
//******************************************* //*******************************************
// inline the sub-devices // inline the sub-devices
//******************************************* //*******************************************

View File

@ -206,9 +206,9 @@ static const char *addrname(int a)
return dst; 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)
{ {
size_t len = 128; std::ostringstream stream;
uint32_t mir = (static_cast<uint32_t>(oprom[0]) << 24) | uint32_t mir = (static_cast<uint32_t>(oprom[0]) << 24) |
(static_cast<uint32_t>(oprom[1]) << 16) | (static_cast<uint32_t>(oprom[1]) << 16) |
@ -228,7 +228,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[2]) << 8) |
(static_cast<uint32_t>(src[3]) << 0); (static_cast<uint32_t>(src[3]) << 0);
uint16_t prefetch = next2 & 1023; uint16_t prefetch = next2 & 1023;
char *dst = buffer;
offs_t result = 1 | DASMFLAG_SUPPORTED; offs_t result = 1 | DASMFLAG_SUPPORTED;
uint8_t pa; uint8_t pa;
@ -236,87 +235,87 @@ offs_t alto2_cpu_device::disasm_disassemble(char *buffer, offs_t pc, const uint8
result |= DASMFLAG_STEP_OUT; result |= DASMFLAG_STEP_OUT;
if (t) 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) if (l)
dst += snprintf(dst, len - (size_t)(dst - buffer), "L<- "); util::stream_format(stream, "L<- ");
if (bs == 1) if (bs == 1)
dst += snprintf(dst, len - (size_t)(dst - buffer), "%s<- ", regname[rsel]); util::stream_format(stream, "%s<- ", regname[rsel]);
switch (aluf) { switch (aluf) {
case 0: // T?: BUS case 0: // T?: BUS
// this is somehow redundant and just wasting space // 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; break;
case 1: // : T case 1: // : T
dst += snprintf(dst, len - (size_t)(dst - buffer), "T "); util::stream_format(stream, "T ");
break; break;
case 2: // T?: BUS OR T case 2: // T?: BUS OR T
dst += snprintf(dst, len - (size_t)(dst - buffer), "BUS|T "); util::stream_format(stream, "BUS|T ");
break; break;
case 3: // : BUS AND T case 3: // : BUS AND T
dst += snprintf(dst, len - (size_t)(dst - buffer), "BUS&T "); util::stream_format(stream, "BUS&T ");
break; break;
case 4: // : BUS XOR T case 4: // : BUS XOR T
dst += snprintf(dst, len - (size_t)(dst - buffer), "BUS^T "); util::stream_format(stream, "BUS^T ");
break; break;
case 5: // T?: BUS + 1 case 5: // T?: BUS + 1
dst += snprintf(dst, len - (size_t)(dst - buffer), "BUS+1 "); util::stream_format(stream, "BUS+1 ");
break; break;
case 6: // T?: BUS - 1 case 6: // T?: BUS - 1
dst += snprintf(dst, len - (size_t)(dst - buffer), "BUS-1 "); util::stream_format(stream, "BUS-1 ");
break; break;
case 7: // : BUS + T case 7: // : BUS + T
dst += snprintf(dst, len - (size_t)(dst - buffer), "BUS+T "); util::stream_format(stream, "BUS+T ");
break; break;
case 8: // : BUS - T case 8: // : BUS - T
dst += snprintf(dst, len - (size_t)(dst - buffer), "BUS-T "); util::stream_format(stream, "BUS-T ");
break; break;
case 9: // : BUS - T - 1 case 9: // : BUS - T - 1
dst += snprintf(dst, len - (size_t)(dst - buffer), "BUS-T-1 "); util::stream_format(stream, "BUS-T-1 ");
break; break;
case 10: // T?: BUS + T + 1 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; break;
case 11: // T?: BUS + SKIP case 11: // T?: BUS + SKIP
dst += snprintf(dst, len - (size_t)(dst - buffer), "BUS+SKIP "); util::stream_format(stream, "BUS+SKIP ");
break; break;
case 12: // T?: BUS, T (AND) case 12: // T?: BUS, T (AND)
dst += snprintf(dst, len - (size_t)(dst - buffer), "BUS,T "); util::stream_format(stream, "BUS,T ");
break; break;
case 13: // : BUS AND NOT T case 13: // : BUS AND NOT T
dst += snprintf(dst, len - (size_t)(dst - buffer), "BUS&~T "); util::stream_format(stream, "BUS&~T ");
break; break;
case 14: // : undefined case 14: // : undefined
dst += snprintf(dst, len - (size_t)(dst - buffer), "*BUS "); util::stream_format(stream, "*BUS ");
break; break;
case 15: // : undefined case 15: // : undefined
dst += snprintf(dst, len - (size_t)(dst - buffer), "*BUS "); util::stream_format(stream, "*BUS ");
break; break;
} }
switch (bs) { switch (bs) {
case 0: // read R 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; break;
case 1: // load R from shifter output 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; break;
case 2: // enables no source to the BUS, leaving it all ones 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; break;
case 3: // performs different functions in different tasks 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; break;
case 4: // performs different functions in different tasks 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; break;
case 5: // memory data case 5: // memory data
dst += snprintf(dst, len - (size_t)(dst - buffer), "BUS<-MD "); util::stream_format(stream, "BUS<-MD ");
break; break;
case 6: // BUS[3-0] <- MOUSE; BUS[15-4] <- -1 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; break;
case 7: // IR[7-0], possibly sign extended 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; break;
} }
@ -325,29 +324,29 @@ offs_t alto2_cpu_device::disasm_disassemble(char *buffer, offs_t pc, const uint8
case 0: // no operation case 0: // no operation
break; break;
case 1: // load MAR from ALU output; start main memory reference 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; break;
case 2: // switch tasks if higher priority wakeup is pending 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; break;
case 3: // disable the current task until re-enabled by a hardware-generated condition 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; break;
case 4: // SHIFTER output will be L shifted left one place 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; break;
case 5: // SHIFTER output will be L shifted right one place 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; break;
case 6: // SHIFTER output will be L rotated left 8 places 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; break;
case 7: // put the constant from PROM (RSELECT,BS) on the bus case 7: // put the constant from PROM (RSELECT,BS) on the bus
pa = (rsel << 3) | bs; 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; break;
default: default:
dst += snprintf(dst, len - (size_t)(dst - buffer), "F1_%02o ", f1); util::stream_format(stream, "F1_%02o ", f1);
break; break;
} }
@ -355,39 +354,53 @@ offs_t alto2_cpu_device::disasm_disassemble(char *buffer, offs_t pc, const uint8
case 0: // no operation case 0: // no operation
break; break;
case 1: // NEXT <- NEXT OR (BUS==0 ? 1 : 0) 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)); addrname((prefetch | 1) & MCODE_MASK), addrname(prefetch & MCODE_MASK));
break; break;
case 2: // NEXT <- NEXT OR (SHIFTER==0 ? 1 : 0) 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)); addrname((prefetch | 1) & MCODE_MASK), addrname(prefetch & MCODE_MASK));
break; break;
case 3: // NEXT <- NEXT OR (SHIFTER<0 ? 1 : 0) 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)); addrname((prefetch | 1) & MCODE_MASK), addrname(prefetch & MCODE_MASK));
break; break;
case 4: // NEXT <- NEXT OR BUS case 4: // NEXT <- NEXT OR BUS
dst += snprintf(dst, len - (size_t)(dst - buffer), "NEXT<-BUS "); util::stream_format(stream, "NEXT<-BUS ");
break; break;
case 5: // NEXT <- NEXT OR ALUC0. ALUC0 is the carry produced by last L loading microinstruction. 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)); addrname((prefetch | 1) & MCODE_MASK), addrname(prefetch & MCODE_MASK));
break; break;
case 6: // write BUS data to memory case 6: // write BUS data to memory
dst += snprintf(dst, len - (size_t)(dst - buffer), "MD<-BUS "); util::stream_format(stream, "MD<-BUS ");
break; break;
case 7: // put the constant from PROM (RSELECT,BS) on the bus case 7: // put the constant from PROM (RSELECT,BS) on the bus
if (f1 != 7) { if (f1 != 7) {
pa = 8 * rsel + bs; 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; break;
default: default:
dst += snprintf(dst, len - (size_t)(dst - buffer), "BUS<-F2_%02o ", f2); util::stream_format(stream, "BUS<-F2_%02o ", f2);
break; 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; 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;
}