summaryrefslogtreecommitdiffstatshomepage
path: root/src/devices/cpu/cop400/cop424ds.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/devices/cpu/cop400/cop424ds.cpp')
-rw-r--r--src/devices/cpu/cop400/cop424ds.cpp401
1 files changed, 401 insertions, 0 deletions
diff --git a/src/devices/cpu/cop400/cop424ds.cpp b/src/devices/cpu/cop400/cop424ds.cpp
new file mode 100644
index 00000000000..fc8396f4903
--- /dev/null
+++ b/src/devices/cpu/cop400/cop424ds.cpp
@@ -0,0 +1,401 @@
+// license:BSD-3-Clause
+// copyright-holders:Curt Coder
+/***************************************************************************
+
+ cop424ds.c
+
+ National Semiconductor COP424C/COP444C Emulator.
+
+***************************************************************************/
+
+#include "emu.h"
+
+CPU_DISASSEMBLE(cop424)
+{
+ uint8_t opcode = oprom[0];
+ uint8_t next_opcode = oprom[1];
+ uint16_t address;
+ uint32_t flags = 0;
+ int bytes = 1;
+
+ if ((opcode >= 0x80 && opcode <= 0xBE) || (opcode >= 0xC0 && opcode <= 0xFE))
+ {
+ int page = pc >> 6;
+
+ if (page == 2 || page == 3) //JP pages 2,3
+ {
+ address = (uint16_t)((pc & 0x780) | (opcode & 0x7F));
+ util::stream_format(stream, "JP %03X", address);
+ }
+ else
+ {
+ if ((opcode & 0xC0) == 0xC0) //JP other pages
+ {
+ address = (uint16_t)((pc & 0x7C0) | (opcode & 0x3F));
+ util::stream_format(stream, "JP %03X", address);
+ }
+ else //JSRP
+ {
+ address = (uint16_t)(0x80 | (opcode & 0x3F));
+ util::stream_format(stream, "JSRP %03X", address);
+ flags = DASMFLAG_STEP_OVER;
+ }
+ }
+ }
+ else if (opcode >= 0x08 && opcode <= 0x0F)
+ {
+ util::stream_format(stream, "LBI 0,%u", ((opcode & 0xF) + 1) & 0xF);
+ }
+ else if (opcode >= 0x18 && opcode <= 0x1F)
+ {
+ util::stream_format(stream, "LBI 1,%u", ((opcode & 0xF) + 1) & 0xF);
+ }
+ else if (opcode >= 0x28 && opcode <= 0x2F)
+ {
+ util::stream_format(stream, "LBI 2,%u", ((opcode & 0xF) + 1) & 0xF);
+ }
+ else if (opcode >= 0x38 && opcode <= 0x3F)
+ {
+ util::stream_format(stream, "LBI 3,%u", ((opcode & 0xF) + 1) & 0xF);
+ }
+ else if (opcode >= 0x51 && opcode <= 0x5F)
+ {
+ util::stream_format(stream, "AISC %u", opcode & 0xF);
+ }
+ else if (opcode >= 0x60 && opcode <= 0x67)
+ {
+ address = ((opcode & 0x07) << 8) | next_opcode;
+ util::stream_format(stream, "JMP %03X", address);
+ bytes = 2;
+ }
+ else if (opcode >= 0x68 && opcode <= 0x6f)
+ {
+ address = ((opcode & 0x07) << 8) | next_opcode;
+ util::stream_format(stream, "JSR %03X", address);
+ flags = DASMFLAG_STEP_OVER;
+ bytes = 2;
+ }
+ else if (opcode >= 0x70 && opcode <= 0x7F)
+ {
+ util::stream_format(stream, "STII %u", opcode & 0xF);
+ }
+ else
+ {
+ switch (opcode)
+ {
+ case 0:
+ util::stream_format(stream, "CLRA");
+ break;
+
+ case 1:
+ util::stream_format(stream, "SKMBZ 0");
+ break;
+
+ case 2:
+ util::stream_format(stream, "XOR");
+ break;
+
+ case 3:
+ util::stream_format(stream, "SKMBZ 2");
+ break;
+
+ case 4:
+ util::stream_format(stream, "XIS 0");
+ break;
+
+ case 5:
+ util::stream_format(stream, "LD 0");
+ break;
+
+ case 6:
+ util::stream_format(stream, "X 0");
+ break;
+
+ case 7:
+ util::stream_format(stream, "XDS 0");
+ break;
+
+ case 0x10:
+ util::stream_format(stream, "CASC");
+ break;
+
+ case 0x11:
+ util::stream_format(stream, "SKMBZ 1");
+ break;
+
+ case 0x12:
+ util::stream_format(stream, "XABR");
+ break;
+
+ case 0x13:
+ util::stream_format(stream, "SKMBZ 3");
+ break;
+
+ case 0x14:
+ util::stream_format(stream, "XIS 1");
+ break;
+
+ case 0x15:
+ util::stream_format(stream, "LD 1");
+ break;
+
+ case 0x16:
+ util::stream_format(stream, "X 1");
+ break;
+
+ case 0x17:
+ util::stream_format(stream, "XDS 1");
+ break;
+
+ case 0x20:
+ util::stream_format(stream, "SKC");
+ break;
+
+ case 0x21:
+ util::stream_format(stream, "SKE");
+ break;
+
+ case 0x22:
+ util::stream_format(stream, "SC");
+ break;
+
+ case 0x23:
+ bytes = 2;
+
+ if (next_opcode <= 0x7f)
+ {
+ address = (uint16_t)(next_opcode & 0x7F);
+ util::stream_format(stream, "LDD %u,%u", address >> 4, address & 0x0F);
+ }
+ else if (next_opcode >= 0x80)
+ {
+ address = (uint16_t)(next_opcode & 0x7f);
+ util::stream_format(stream, "XAD %u,%u", address >> 4, address & 0x0F);
+ }
+ break;
+
+ case 0x24:
+ util::stream_format(stream, "XIS 2");
+ break;
+
+ case 0x25:
+ util::stream_format(stream, "LD 2");
+ break;
+
+ case 0x26:
+ util::stream_format(stream, "X 2");
+ break;
+
+ case 0x27:
+ util::stream_format(stream, "XDS 2");
+ break;
+
+ case 0x30:
+ util::stream_format(stream, "ASC");
+ break;
+
+ case 0x31:
+ util::stream_format(stream, "ADD");
+ break;
+
+ case 0x32:
+ util::stream_format(stream, "RC");
+ break;
+
+ case 0x33:
+ bytes = 2;
+
+ if (next_opcode >= 0x50 && next_opcode <= 0x5F)
+ {
+ util::stream_format(stream, "OGI %u", next_opcode & 0xF);
+ }
+ else if (next_opcode >= 0x60 && next_opcode <= 0x6F)
+ {
+ util::stream_format(stream, "LEI %u", next_opcode & 0xF);
+ }
+ else if (next_opcode >= 0x80)
+ {
+ util::stream_format(stream, "LBI %u,%u", (next_opcode >> 4) & 0x07, next_opcode & 0xF);
+ }
+ else
+ {
+ switch (next_opcode)
+ {
+ case 0x01:
+ util::stream_format(stream, "SKGBZ 0");
+ break;
+
+ case 0x03:
+ util::stream_format(stream, "SKGBZ 2");
+ break;
+
+ case 0x11:
+ util::stream_format(stream, "SKGBZ 1");
+ break;
+
+ case 0x13:
+ util::stream_format(stream, "SKGBZ 3");
+ break;
+
+ case 0x21:
+ util::stream_format(stream, "SKGZ");
+ break;
+
+ case 0x28:
+ util::stream_format(stream, "ININ");
+ break;
+
+ case 0x29:
+ util::stream_format(stream, "INIL");
+ break;
+
+ case 0x2A:
+ util::stream_format(stream, "ING");
+ break;
+
+ case 0x2C:
+ util::stream_format(stream, "CQMA");
+ break;
+
+ case 0x2E:
+ util::stream_format(stream, "INL");
+ break;
+
+ case 0x2F:
+ util::stream_format(stream, "CTMA");
+ break;
+
+ case 0x38:
+ util::stream_format(stream, "HALT");
+ break;
+
+ case 0x39:
+ util::stream_format(stream, "IT");
+ break;
+
+ case 0x3A:
+ util::stream_format(stream, "OMG");
+ break;
+
+ case 0x3C:
+ util::stream_format(stream, "CAMQ");
+ break;
+
+ case 0x3E:
+ util::stream_format(stream, "OBD");
+ break;
+
+ case 0x3F:
+ util::stream_format(stream, "CAMT");
+ break;
+
+
+ default:
+ util::stream_format(stream, "Invalid");
+ break;
+ }
+ }
+ break;
+
+ case 0x34:
+ util::stream_format(stream, "XIS 3");
+ break;
+
+ case 0x35:
+ util::stream_format(stream, "LD 3");
+ break;
+
+ case 0x36:
+ util::stream_format(stream, "X 3");
+ break;
+
+ case 0x37:
+ util::stream_format(stream, "XDS 3");
+ break;
+
+ case 0x40:
+ util::stream_format(stream, "COMP");
+ break;
+
+ case 0x41:
+ util::stream_format(stream, "SKT");
+ break;
+
+ case 0x42:
+ util::stream_format(stream, "RMB 2");
+ break;
+
+ case 0x43:
+ util::stream_format(stream, "RMB 3");
+ break;
+
+ case 0x44:
+ util::stream_format(stream, "NOP");
+ break;
+
+ case 0x45:
+ util::stream_format(stream, "RMB 1");
+ break;
+
+ case 0x46:
+ util::stream_format(stream, "SMB 2");
+ break;
+
+ case 0x47:
+ util::stream_format(stream, "SMB 1");
+ break;
+
+ case 0x48:
+ util::stream_format(stream, "RET");
+ flags = DASMFLAG_STEP_OUT;
+ break;
+
+ case 0x49:
+ util::stream_format(stream, "RETSK");
+ flags = DASMFLAG_STEP_OUT;
+ break;
+
+ case 0x4A:
+ util::stream_format(stream, "ADT");
+ break;
+
+ case 0x4B:
+ util::stream_format(stream, "SMB 3");
+ break;
+
+ case 0x4C:
+ util::stream_format(stream, "RMB 0");
+ break;
+
+ case 0x4D:
+ util::stream_format(stream, "SMB 0");
+ break;
+
+ case 0x4E:
+ util::stream_format(stream, "CBA");
+ break;
+
+ case 0x4F:
+ util::stream_format(stream, "XAS");
+ break;
+
+ case 0x50:
+ util::stream_format(stream, "CAB");
+ break;
+
+ case 0xBF:
+ util::stream_format(stream, "LQID");
+ break;
+
+ case 0xFF:
+ util::stream_format(stream, "JID");
+ break;
+
+ default:
+ util::stream_format(stream, "Invalid");
+ break;
+ }
+ }
+
+ return bytes | flags | DASMFLAG_SUPPORTED;
+}