mame/src/emu/cpu/i860/i860dasm.c
2009-01-04 23:31:12 +00:00

378 lines
9.2 KiB
C

#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 */
/*******************************/