summaryrefslogtreecommitdiffstatshomepage
path: root/src/devices/cpu/pdp8/pdp8dasm.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/devices/cpu/pdp8/pdp8dasm.c')
-rw-r--r--src/devices/cpu/pdp8/pdp8dasm.c174
1 files changed, 174 insertions, 0 deletions
diff --git a/src/devices/cpu/pdp8/pdp8dasm.c b/src/devices/cpu/pdp8/pdp8dasm.c
new file mode 100644
index 00000000000..18a7e3e769b
--- /dev/null
+++ b/src/devices/cpu/pdp8/pdp8dasm.c
@@ -0,0 +1,174 @@
+// license:BSD-3-Clause
+// copyright-holders:Ryan Holtz
+/*
+ First-gen DEC PDP-8 disassembler
+
+ Written by MooglyGuy
+*/
+
+#include "emu.h"
+
+static char *output;
+
+offs_t pdp8_dasm_one(char *buffer, offs_t pc, UINT16 op)
+{
+ UINT8 opcode = (op >> 011) & 07;
+ UINT16 current_page = pc & 07600;
+ UINT16 zero_addr = op & 0177;
+ UINT16 current_addr = current_page | zero_addr;
+ bool indirect = (op & 0400) ? true : false;
+ bool zero_page = (op & 0200) ? false : true;
+
+ output = buffer;
+
+ switch (opcode)
+ {
+ case 0:
+ output += sprintf(buffer, "AND %c %05o", indirect ? 'I' : ' ', zero_page ? zero_addr : current_addr);
+ break;
+ case 1:
+ output += sprintf(buffer, "TAD %c %05o", indirect ? 'I' : ' ', zero_page ? zero_addr : current_addr);
+ break;
+ case 2:
+ output += sprintf(buffer, "ISZ %c %05o", indirect ? 'I' : ' ', zero_page ? zero_addr : current_addr);
+ break;
+ case 3:
+ output += sprintf(buffer, "DCA %c %05o", indirect ? 'I' : ' ', zero_page ? zero_addr : current_addr);
+ break;
+ case 4:
+ output += sprintf(buffer, "JMS %c %05o", indirect ? 'I' : ' ', zero_page ? zero_addr : current_addr);
+ break;
+ case 5:
+ output += sprintf(buffer, "JMP %c %05o", indirect ? 'I' : ' ', zero_page ? zero_addr : current_addr);
+ break;
+ case 6:
+ output += sprintf(buffer, "IOT %03o %01o", (op >> 03) & 077, op & 07);
+ break;
+ case 7:
+ {
+ bool group2 = ((op & 0401) == 0400);
+ if (!group2)
+ {
+ if (!(op & 0377))
+ {
+ output += sprintf(buffer, "NOP ");
+ }
+ else
+ {
+ if (op & 0200)
+ {
+ output += sprintf(buffer, "CLA ");
+ }
+ if (op & 0100)
+ {
+ output += sprintf(buffer, "CLL ");
+ }
+ if (op & 040)
+ {
+ output += sprintf(buffer, "CMA ");
+ }
+ if (op & 020)
+ {
+ output += sprintf(buffer, "CML ");
+ }
+ if (op & 01)
+ {
+ output += sprintf(buffer, "IAC ");
+ }
+ if (op & 010)
+ {
+ if (op & 02)
+ {
+ output += sprintf(buffer, "RTR ");
+ }
+ else
+ {
+ output += sprintf(buffer, "RAR ");
+ }
+ }
+ if (op & 04)
+ {
+ if (op & 02)
+ {
+ output += sprintf(buffer, "RTL ");
+ }
+ else
+ {
+ output += sprintf(buffer, "RAL ");
+ }
+ }
+ }
+ }
+ else
+ {
+ if (!(op & 0377))
+ {
+ output += sprintf(buffer, "NOP ");
+ }
+ else
+ {
+ if (op & 010)
+ {
+ if (!(op & 0160))
+ {
+ output += sprintf(buffer, "SKP ");
+ }
+ else
+ {
+ if (op & 0100)
+ {
+ output += sprintf(buffer, "SPA ");
+ }
+ if (op & 040)
+ {
+ output += sprintf(buffer, "SNA ");
+ }
+ if (op & 020)
+ {
+ output += sprintf(buffer, "SZL ");
+ }
+ }
+ }
+ else
+ {
+ if (op & 0100)
+ {
+ output += sprintf(buffer, "SMA ");
+ }
+ if (op & 040)
+ {
+ output += sprintf(buffer, "SZA ");
+ }
+ if (op & 020)
+ {
+ output += sprintf(buffer, "SNL ");
+ }
+ }
+ if (op & 0200)
+ {
+ output += sprintf(buffer, "CLA ");
+ }
+ if (op & 04)
+ {
+ output += sprintf(buffer, "OSR ");
+ }
+ if (op & 02)
+ {
+ output += sprintf(buffer, "HLT ");
+ }
+ }
+ }
+ }
+ }
+
+ return 2 | DASMFLAG_SUPPORTED;
+}
+
+/*****************************************************************************/
+
+CPU_DISASSEMBLE( pdp8 )
+{
+ UINT16 op = (*(UINT8 *)(opram + 0) << 8) |
+ (*(UINT8 *)(opram + 1) << 0);
+ return pdp8_dasm_one(buffer, pc, op);
+}