diff options
Diffstat (limited to 'src/devices/cpu/pdp1/pdp1dasm.c')
-rw-r--r-- | src/devices/cpu/pdp1/pdp1dasm.c | 294 |
1 files changed, 294 insertions, 0 deletions
diff --git a/src/devices/cpu/pdp1/pdp1dasm.c b/src/devices/cpu/pdp1/pdp1dasm.c new file mode 100644 index 00000000000..c8682ca1491 --- /dev/null +++ b/src/devices/cpu/pdp1/pdp1dasm.c @@ -0,0 +1,294 @@ +// license:BSD-3-Clause +// copyright-holders:Raphael Nabet +#include "emu.h" +#include "cpu/pdp1/pdp1.h" + +/* PDP1 registers */ +static int ib; +static int y; + +INLINE void ea (void) +{ +/* while (1) + { + if (ib == 0) + return; + ib = (READ_PDP_18BIT (y) >> 12) & 1; + y = READ_PDP_18BIT (y) & 07777; + }*/ +} + +#define IN if (ib) sprintf(buffer+strlen(buffer)," i") + +CPU_DISASSEMBLE( pdp1 ) +{ + int md; + //int etime = 0; + + md = oprom[0] << 24 | oprom[1] << 16 | oprom[2] << 8 | oprom[3]; + + y = md & 07777; + ib = (md >> 12) & 1; /* */ + switch (md >> 13) + { + case AND: + ea (); + sprintf (buffer, "AND (0%06o)", y); + IN; + //etime = 10; + break; + case IOR: + ea (); + sprintf (buffer, "IOR (0%06o)", y); + IN; + //etime = 10; + break; + case XOR: + ea (); + sprintf (buffer, "XOR (0%06o)", y); + IN; + //etime = 10; + break; + case XCT: + ea (); + sprintf (buffer, "XCT (0%06o)", y); + IN; + //etime = 5; + break; + case CALJDA: + { + if (ib == 1) + sprintf (buffer, "JDA 0%06o ", y); + if (ib == 0) + sprintf (buffer, "CAL "); + //etime = 10; + break; + } + case LAC: + ea (); + sprintf (buffer, "LAC (0%06o)", y); + IN; + //etime = 10; + break; + case LIO: + ea (); + sprintf (buffer, "LIO (0%06o)", y); + IN; + //etime = 10; + break; + case DAC: + ea (); + sprintf (buffer, "DAC 0%06o ", y); + IN; + //etime = 10; + break; + case DAP: + ea (); + sprintf (buffer, "DAP 0%06o ", y); + IN; + //etime = 10; + break; + case DIP: + ea (); + sprintf (buffer, "DIP 0%06o ", y); + IN; + //etime = 10; + break; + case DIO: + ea (); + sprintf (buffer, "DIO 0%06o ", y); + IN; + //etime = 10; + break; + case DZM: + ea (); + sprintf (buffer, "DZM 0%06o ", y); + IN; + //etime = 10; + break; + case ADD: + ea (); + sprintf (buffer, "ADD (0%06o)", y); + IN; + //etime = 10; + break; + case SUB: + ea (); + sprintf (buffer, "SUB (0%06o)", y); + IN; + //etime = 10; + break; + case IDX: + ea (); + sprintf (buffer, "IDX (0%06o)", y); + IN; + //etime = 10; + break; + case ISP: + ea (); + sprintf (buffer, "ISP (0%06o)", y); + IN; + //etime = 10; + break; + case SAD: + ea (); + sprintf (buffer, "SAD (0%06o)", y); + IN; + //etime = 10; + break; + case SAS: + ea (); + sprintf (buffer, "SAS (0%06o)", y); + IN; + //etime = 10; + break; + case MUS_MUL: + ea (); + sprintf (buffer, "MUS (0%06o)", y); + IN; + //etime = 10; + break; + case DIS_DIV: + ea (); + sprintf (buffer, "DIS (0%06o)", y); + IN; + //etime = 10; + break; + case JMP: + ea (); + sprintf (buffer, "JMP 0%06o ", y); + IN; + //etime = 5; + break; + case JSP: + ea (); + sprintf (buffer, "JSP 0%06o ", y); + IN; + //etime = 5; + break; + case SKP: + { + buffer[0] = 0; + if ((y & 0100) == 0100) + sprintf (buffer, "SZA "); + if ((y & 0200) == 0200) + sprintf (buffer + strlen (buffer), "SPA "); + if ((y & 0400) == 0400) + sprintf (buffer + strlen (buffer), "SMA "); + if ((y & 01000) == 01000) + sprintf (buffer + strlen (buffer), "SZO "); + if ((y & 02000) == 02000) + sprintf (buffer + strlen (buffer), "SPI "); + if (y & 070) + sprintf (buffer + strlen (buffer), "SZS 0%01o ", (y & 070)); + if (y & 7) + sprintf (buffer + strlen (buffer), "SZF 0%01o ", (y & 7)); + IN; + //etime = 5; + break; + } + case SFT: + { + int nshift = 0; + int mask = md & 0777; + + while (mask != 0) + { + nshift += mask & 1; + mask = mask >> 1; + } + switch ((md >> 9) & 017) + { + case 1: + sprintf (buffer, "RAL 0%02o", nshift); + //etime = 5; + break; + case 2: + sprintf (buffer, "RIL 0%02o", nshift); + //etime = 5; + break; + case 3: + sprintf (buffer, "RCL 0%02o", nshift); + //etime = 5; + break; + case 5: + sprintf (buffer, "SAL 0%02o", nshift); + //etime = 5; + break; + case 6: + sprintf (buffer, "SIL 0%02o", nshift); + //etime = 5; + break; + case 7: + sprintf (buffer, "SCL 0%02o", nshift); + //etime = 5; + break; + case 9: + sprintf (buffer, "RAR 0%02o", nshift); + //etime = 5; + break; + case 10: + sprintf (buffer, "RIR 0%02o", nshift); + //etime = 5; + break; + case 11: + sprintf (buffer, "RCR 0%02o", nshift); + //etime = 5; + break; + case 13: + sprintf (buffer, "SAR 0%02o", nshift); + //etime = 5; + break; + case 14: + sprintf (buffer, "SIR 0%02o", nshift); + //etime = 5; + break; + case 15: + sprintf (buffer, "SCR 0%02o", nshift); + //etime = 5; + break; + default: + sprintf (buffer, "SKP ???"); + //etime = 5; + break; + } + break; + } + case LAW: + sprintf (buffer, "LAW 0%06o", y); + IN; + //etime = 5; + break; + case IOT: + sprintf (buffer, "IOT 0%06o", md); + //etime = 10; + break; + case OPR: + { + buffer[0] = 0; + if ((y & 04000) == 04000) + sprintf (buffer + strlen (buffer), "CLI "); + if ((y & 02000) == 02000) + sprintf (buffer + strlen (buffer), "LAT "); + if ((y & 01000) == 01000) + sprintf (buffer + strlen (buffer), "CMA "); + if ((y & 0400) == 0400) + sprintf (buffer + strlen (buffer), "HLT "); + if ((y & 0100) == 0100) + sprintf (buffer + strlen (buffer), "LAP "); + if ((y & 010) && (y & 7)) + sprintf (buffer + strlen (buffer), "STF 0%01o ", (y & 7)); + if ((!(y & 010)) && (y & 7)) + sprintf (buffer + strlen (buffer), "CLF 0%01o ", (y & 7)); + if (!(y)) + sprintf (buffer + strlen (buffer), "NOP "); + //etime = 5; + break; + } + default: + sprintf (buffer, "ILLEGAL"); + //etime = 5; + break; + } + return 4; +} |