summaryrefslogtreecommitdiffstatshomepage
path: root/trunk/src/emu/cpu/i860/i860dasm.c
diff options
context:
space:
mode:
Diffstat (limited to 'trunk/src/emu/cpu/i860/i860dasm.c')
-rw-r--r--trunk/src/emu/cpu/i860/i860dasm.c377
1 files changed, 377 insertions, 0 deletions
diff --git a/trunk/src/emu/cpu/i860/i860dasm.c b/trunk/src/emu/cpu/i860/i860dasm.c
new file mode 100644
index 00000000000..3440236c822
--- /dev/null
+++ b/trunk/src/emu/cpu/i860/i860dasm.c
@@ -0,0 +1,377 @@
+#include "i860.h"
+
+/* Sub-group decoders */
+static void i860_dasm_core_dasm(const UINT32 op, char* buffer);
+static void i860_dasm_floating_point_dasm(const UINT32 op, char* buffer);
+static void i860_dasm_CTRL_dasm(const UINT32 op, char* buffer);
+
+/* REG-Format Opcodes*/
+static void i860_dasm_ldx(const UINT32 op, char* buffer);
+static void i860_dasm_stx(const UINT32 op, char* buffer);
+static void i860_dasm_ixfr(const UINT32 op, char* buffer);
+static void i860_dasm_fid_fst(const UINT32 op, char* buffer);
+static void i860_dasm_flush(const UINT32 op, char* buffer);
+static void i860_dasm_pstd(const UINT32 op, char* buffer);
+static void i860_dasm_ldc_sdc(const UINT32 op, char* buffer);
+static void i860_dasm_bri(const UINT32 op, char* buffer);
+static void i860_dasm_trap(const UINT32 op, char* buffer);
+static void i860_dasm_bte_btne(const UINT32 op, char* buffer);
+static void i860_dasm_pfidy(const UINT32 op, char* buffer);
+static void i860_dasm_addu_subu(const UINT32 op, char* buffer);
+static void i860_dasm_shl_shr(const UINT32 op, char* buffer);
+static void i860_dasm_shrd(const UINT32 op, char* buffer);
+static void i860_dasm_bla(const UINT32 op, char* buffer);
+static void i860_dasm_shra(const UINT32 op, char* buffer);
+static void i860_dasm_and_andh(const UINT32 op, char* buffer);
+static void i860_dasm_andnot_andnoth(const UINT32 op, char* buffer);
+static void i860_dasm_or_orh(const UINT32 op, char* buffer);
+static void i860_dasm_xor_xorh(const UINT32 op, char* buffer);
+
+/* CORE Escape Opcodes */
+static void i860_dasm_CORE_lock(const UINT32 op, char* buffer);
+static void i860_dasm_CORE_calli(const UINT32 op, char* buffer);
+static void i860_dasm_CORE_intovr(const UINT32 op, char* buffer);
+static void i860_dasm_CORE_unlock(const UINT32 op, char* buffer);
+
+/* CTRL-Format Opcodes */
+static void i860_dasm_CTRL_br(const UINT32 op, char* buffer);
+static void i860_dasm_CTRL_call(const UINT32 op, char* buffer);
+static void i860_dasm_CTRL_bc_bct(const UINT32 op, char* buffer);
+static void i860_dasm_CTRL_bnc_bnct(const UINT32 op, char* buffer);
+
+/* Floating-Point Instructions */
+
+
+CPU_DISASSEMBLE( i860 )
+{
+ char tempB[1024] = "";
+
+ /* Little Endian */
+ const UINT32 op = (oprom[3] << 24) | (oprom[2] << 16) | (oprom[1] << 8) | (oprom[0] << 0);
+ //const UINT32 op = (oprom[2] << 24) | (oprom[3] << 16) | (oprom[0] << 8) | (oprom[1] << 0); /* Mixed Endian */
+ //const UINT32 op = (oprom[0] << 24) | (oprom[1] << 16) | (oprom[2] << 8) | (oprom[3] << 0); /* Big Endian */
+ //const UINT32 op = (oprom[1] << 24) | (oprom[0] << 16) | (oprom[3] << 8) | (oprom[2] << 0); /* Mixed Endian */
+
+ /* The opcode is the top 6 bits */
+ UINT8 opcode = (op >> 26) & 0x3f;
+
+ /* DEBUG - print this out if you feel things are going a bit wonky */
+ // sprintf(buffer, "%08x : oo %02x", op, opcode);
+
+ /* Main decode */
+ switch (opcode)
+ {
+ case 0x00:
+ case 0x01:
+ case 0x04:
+ case 0x05: i860_dasm_ldx(op, tempB); break;
+
+ case 0x03:
+ case 0x07: i860_dasm_stx(op, tempB); break;
+
+ case 0x02: i860_dasm_ixfr(op, tempB); break;
+
+ case 0x06: sprintf(tempB, "(reserved)"); break;
+
+ case 0x08:
+ case 0x09:
+ case 0x0a:
+ case 0x0b: i860_dasm_fid_fst(op, tempB); break;
+
+ case 0x0d: i860_dasm_flush(op, tempB); break;
+
+ case 0x0f: i860_dasm_pstd(op, tempB); break;
+
+ case 0x0c:
+ case 0x0e: i860_dasm_ldc_sdc(op, tempB); break;
+
+ case 0x10: i860_dasm_bri(op, tempB); break;
+
+ case 0x11: i860_dasm_trap(op, tempB); break;
+
+ case 0x12: i860_dasm_floating_point_dasm(op, tempB); break; /* Floating point operation sub-group */
+
+ case 0x13: i860_dasm_core_dasm(op, tempB); break; /* Core operation sub-group */
+
+ case 0x14:
+ case 0x15:
+ case 0x16:
+ case 0x17: i860_dasm_bte_btne(op, tempB); break;
+
+ case 0x18:
+ case 0x19: i860_dasm_pfidy(op, tempB); break;
+
+ case 0x1a:
+ case 0x1b:
+ case 0x1c:
+ case 0x1d:
+ case 0x1e:
+ case 0x1f: i860_dasm_CTRL_dasm(op, tempB); break; /* CTRL operation sub-group */
+
+ case 0x20:
+ case 0x21:
+ case 0x22:
+ case 0x23:
+ case 0x24:
+ case 0x25:
+ case 0x26:
+ case 0x27: i860_dasm_addu_subu(op, tempB); break;
+
+ case 0x28:
+ case 0x29:
+ case 0x2a:
+ case 0x2b: i860_dasm_shl_shr(op, tempB); break;
+
+ case 0x2c: i860_dasm_shrd(op, tempB); break;
+
+ case 0x2d: i860_dasm_bla(op, tempB); break;
+
+ case 0x2e:
+ case 0x2f: i860_dasm_shra(op, tempB); break;
+
+ case 0x30:
+ case 0x31:
+ case 0x32:
+ case 0x33: i860_dasm_and_andh(op, tempB); break;
+
+ case 0x34:
+ case 0x35:
+ case 0x36:
+ case 0x37: i860_dasm_andnot_andnoth(op, tempB); break;
+
+ case 0x38:
+ case 0x39:
+ case 0x3a:
+ case 0x3b: i860_dasm_or_orh(op, tempB); break;
+
+ case 0x3c:
+ case 0x3d:
+ case 0x3e:
+ case 0x3f: i860_dasm_xor_xorh(op, tempB); break;
+
+ default: sprintf(tempB, "(reserved)"); break;
+ }
+
+ /* More Debug */
+ //strcat(buffer, " : ");
+ //strcat(buffer, tempB);
+ sprintf(buffer, "%s", tempB);
+
+ /* All opcodes are 32 bits */
+ return (4 | DASMFLAG_SUPPORTED);
+}
+
+
+// BIT HELPER
+// 31 27 23 19 15 11 7 3
+// 0000 0011 1111 1111 0000 0111 1110 0000
+
+
+/**********************/
+/* Sub-group decoders */
+/**********************/
+static void i860_dasm_core_dasm(const UINT32 op, char* buffer)
+{
+ //UINT8 src1 = (op >> 11) & 0x0000001f;
+
+ /* Reserved bits must be set to 0 */
+ if ( (op & 0x000007e0) || (op & 0x03ff0000) )
+ {
+ //logerror("[i860] Reserved CORE bits must be set to 0.");
+ printf("CORE baddie\n");
+ }
+
+ switch(op & 0x0000001f)
+ {
+ case 0x01: i860_dasm_CORE_lock(op, buffer); break;
+ case 0x02: i860_dasm_CORE_calli(op, buffer); break;
+ case 0x04: i860_dasm_CORE_intovr(op, buffer); break;
+ case 0x07: i860_dasm_CORE_unlock(op, buffer); break;
+
+ default: sprintf(buffer, "(reserved)"); break;
+ }
+}
+
+static void i860_dasm_floating_point_dasm(const UINT32 op, char* buffer)
+{
+ sprintf(buffer, "[[F-P unit]]");
+}
+
+static void i860_dasm_CTRL_dasm(const UINT32 op, char* buffer)
+{
+ UINT8 opc = (op >> 26) & 0x07;
+
+ switch(opc)
+ {
+ case 0x02: i860_dasm_CTRL_br(op, buffer); break;
+ case 0x03: i860_dasm_CTRL_call(op, buffer); break;
+ case 0x04: case 0x05: i860_dasm_CTRL_bc_bct(op, buffer); break;
+ case 0x06: case 0x07: i860_dasm_CTRL_bnc_bnct(op, buffer); break;
+
+ default: sprintf(buffer, "(reserved)"); break;
+ }
+}
+
+
+/*********************/
+/* REG-Format Opcodes*/
+/*********************/
+static void i860_dasm_ldx(const UINT32 op, char* buffer)
+{
+ sprintf(buffer, "ldx");
+}
+
+static void i860_dasm_stx(const UINT32 op, char* buffer)
+{
+ sprintf(buffer, "stx");
+}
+
+static void i860_dasm_ixfr(const UINT32 op, char* buffer)
+{
+// UINT16 val = op & 0x7ff;
+// UINT8 opc = (op >> 26) & 0x3f;
+// UINT8 src2 = (op >> 21) & 0x1f;
+// UINT8 dest = (op >> 16) & 0x1f;
+// UINT8 src1 = (op >> 11) & 0x1f;
+
+ sprintf(buffer, "ixfr");
+}
+
+static void i860_dasm_fid_fst(const UINT32 op, char* buffer)
+{
+ sprintf(buffer, "fst");
+}
+
+static void i860_dasm_flush(const UINT32 op, char* buffer)
+{
+ sprintf(buffer, "flush");
+}
+
+static void i860_dasm_pstd(const UINT32 op, char* buffer)
+{
+ sprintf(buffer, "pstd");
+}
+
+static void i860_dasm_ldc_sdc(const UINT32 op, char* buffer)
+{
+ sprintf(buffer, "ldc, sdc");
+}
+
+static void i860_dasm_bri(const UINT32 op, char* buffer)
+{
+ sprintf(buffer, "bri");
+}
+
+static void i860_dasm_trap(const UINT32 op, char* buffer)
+{
+ sprintf(buffer, "trap");
+}
+
+static void i860_dasm_bte_btne(const UINT32 op, char* buffer)
+{
+ sprintf(buffer, "bte, btne");
+}
+
+static void i860_dasm_pfidy(const UINT32 op, char* buffer)
+{
+ sprintf(buffer, "pfidy");
+}
+
+static void i860_dasm_addu_subu(const UINT32 op, char* buffer)
+{
+ sprintf(buffer, "addu, subu");
+}
+
+static void i860_dasm_shl_shr(const UINT32 op, char* buffer)
+{
+ sprintf(buffer, "shl, shr");
+}
+
+static void i860_dasm_shrd(const UINT32 op, char* buffer)
+{
+ sprintf(buffer, "shrd");
+}
+
+static void i860_dasm_bla(const UINT32 op, char* buffer)
+{
+ sprintf(buffer, "bla");
+}
+
+static void i860_dasm_shra(const UINT32 op, char* buffer)
+{
+ sprintf(buffer, "shra");
+}
+
+static void i860_dasm_and_andh(const UINT32 op, char* buffer)
+{
+ sprintf(buffer, "and, andh");
+}
+
+static void i860_dasm_andnot_andnoth(const UINT32 op, char* buffer)
+{
+ sprintf(buffer, "andnot, andnoth");
+}
+
+static void i860_dasm_or_orh(const UINT32 op, char* buffer)
+{
+ sprintf(buffer, "or, orh");
+}
+
+static void i860_dasm_xor_xorh(const UINT32 op, char* buffer)
+{
+ sprintf(buffer, "xor, xorh");
+}
+
+
+/***********************/
+/* CORE Escape Opcodes */
+/***********************/
+static void i860_dasm_CORE_lock(const UINT32 op, char* buffer)
+{
+ sprintf(buffer, "lock");
+}
+
+static void i860_dasm_CORE_calli(const UINT32 op, char* buffer)
+{
+ sprintf(buffer, "calli");
+}
+
+static void i860_dasm_CORE_intovr(const UINT32 op, char* buffer)
+{
+ sprintf(buffer, "intovr");
+}
+
+static void i860_dasm_CORE_unlock(const UINT32 op, char* buffer)
+{
+ sprintf(buffer, "unlock");
+}
+
+
+/***********************/
+/* CTRL-Format Opcodes */
+/***********************/
+static void i860_dasm_CTRL_br(const UINT32 op, char* buffer)
+{
+ sprintf(buffer, "br");
+}
+
+static void i860_dasm_CTRL_call(const UINT32 op, char* buffer)
+{
+ sprintf(buffer, "call");
+}
+
+static void i860_dasm_CTRL_bc_bct(const UINT32 op, char* buffer)
+{
+ sprintf(buffer, "bct");
+}
+
+static void i860_dasm_CTRL_bnc_bnct(const UINT32 op, char* buffer)
+{
+ sprintf(buffer, "bnct");
+}
+
+
+/*******************************/
+/* Floating-Point Instructions */
+/*******************************/
+