diff options
Diffstat (limited to 'src/devices/cpu/i860/i860dasm.c')
-rw-r--r-- | src/devices/cpu/i860/i860dasm.c | 378 |
1 files changed, 378 insertions, 0 deletions
diff --git a/src/devices/cpu/i860/i860dasm.c b/src/devices/cpu/i860/i860dasm.c new file mode 100644 index 00000000000..60c83a5fec0 --- /dev/null +++ b/src/devices/cpu/i860/i860dasm.c @@ -0,0 +1,378 @@ +// license:BSD-3-Clause +// copyright-holders:Jason Eckhardt +#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 */ +/*******************************/ |