diff options
Diffstat (limited to 'trunk/src/emu/cpu/tms34010/34010dsm.c')
-rw-r--r-- | trunk/src/emu/cpu/tms34010/34010dsm.c | 1760 |
1 files changed, 1760 insertions, 0 deletions
diff --git a/trunk/src/emu/cpu/tms34010/34010dsm.c b/trunk/src/emu/cpu/tms34010/34010dsm.c new file mode 100644 index 00000000000..af9f3683fda --- /dev/null +++ b/trunk/src/emu/cpu/tms34010/34010dsm.c @@ -0,0 +1,1760 @@ +/* + * A TMS34010 disassembler + * + * This code written by Zsolt Vasvari for the MAME project + * + */ + +#include "emu.h" + +#ifdef STANDALONE +#define PC __pc + (offset << 3) +#define OP_WORD(v) { v = filebuf[_pc>>3]; _pc += 8; v = v | (filebuf[_pc>>3] << 8); _pc += 8;} +#define PARAM_WORD(v) { v = filebuf[_pc>>3]; _pc += 8; v = v | (filebuf[_pc>>3] << 8); _pc += 8;} +#define PARAM_LONG(v) { int v1, v2; PARAM_WORD(v1); PARAM_WORD(v2); v = v1 | (v2 << 16); } +#else +#define PC __pc +#define OP_WORD(v) { v = rombase[(__pc - pcbase) >> 3] | (rombase[(__pc + 8 - pcbase) >> 3] << 8); _pc += 16; } +#define PARAM_WORD(v) { v = rambase[(__pc + 16 - pcbase) >> 3] | (rambase[(__pc + 24 - pcbase) >> 3] << 8); _pc += 16; } +#define PARAM_LONG(v) { v = rambase[(__pc + 16 - pcbase) >> 3] | (rambase[(__pc + 24 - pcbase) >> 3] << 8) | (rambase[(__pc + 32 - pcbase) >> 3] << 16) | (rambase[(__pc + 40 - pcbase) >> 3] << 24); _pc += 32; } +#endif + +static UINT8 rf; +static UINT32 __pc, _pc; +static UINT16 op,rs,rd; + +static char *buffer; +static char temp[20]; + +static const UINT8 *rombase; +static const UINT8 *rambase; +static offs_t pcbase; + + +static void print_reg(UINT8 reg) +{ + if (reg != 0x0f) + { + sprintf(temp, "%c%d", rf, reg); + strcat(buffer, temp); + } + else + { + strcat(buffer, "SP"); + } +} + +static void print_src_reg(void) +{ + print_reg(rs); +} + +static void print_des_reg(void) +{ + print_reg(rd); +} + +static void print_src_des_reg(void) +{ + print_src_reg(); + strcat(buffer, ","); + print_des_reg(); +} + +static void print_word_parm(void) +{ + UINT16 w; + + PARAM_WORD(w); + + sprintf(temp, "%Xh", w); + strcat(buffer, temp); +} + +static void print_word_parm_1s_comp(void) +{ + UINT16 w; + + PARAM_WORD(w); + w = ~w; + sprintf(temp, "%Xh", w); + strcat(buffer, temp); +} + +static void print_long_parm(void) +{ + UINT32 l; + + PARAM_LONG(l); + sprintf(temp, "%Xh", l); + strcat(buffer, temp); +} + +static void print_long_parm_1s_comp(void) +{ + UINT32 l; + + PARAM_LONG(l); + sprintf(temp, "%Xh", ~l); + strcat(buffer, temp); +} + +static void print_constant(void) +{ + UINT8 constant = (op >> 5) & 0x1f; + + sprintf(temp, "%Xh", constant); + strcat(buffer, temp); +} + +static void print_constant_1_32(void) +{ + UINT8 constant = (op >> 5) & 0x1f; + if (!constant) constant = 0x20; + + sprintf(temp, "%Xh", constant); + strcat(buffer, temp); +} + +static void print_constant_1s_comp(void) +{ + UINT8 constant = (~op >> 5) & 0x1f; + + sprintf(temp, "%Xh", constant); + strcat(buffer, temp); +} + +static void print_constant_2s_comp(void) +{ + UINT8 constant = 32 - ((op >> 5) & 0x1f); + + sprintf(temp, "%Xh", constant); + strcat(buffer, temp); +} + +static void print_relative(void) +{ + UINT16 l; + INT16 ls; + + PARAM_WORD(l); + ls = (INT16)l; + + sprintf(temp, "%Xh", PC + 32 + (ls << 4)); + strcat(buffer, temp); +} + +static void print_relative_8bit(void) +{ + INT8 ls = (INT8)op; + + sprintf(temp, "%Xh", PC + 16 + (ls << 4)); + strcat(buffer, temp); +} + +static void print_relative_5bit(void) +{ + INT8 ls = (INT8)((op >> 5) & 0x1f); + if (op & 0x0400) ls = -ls; + + sprintf(temp, "%Xh", PC + 16 + (ls << 4)); + strcat(buffer, temp); +} + +static void print_field(void) +{ + sprintf(temp, "%c", (op & 0x200) ? '1' : '0'); + strcat(buffer, temp); +} + +static void print_condition_code(void) +{ + switch (op & 0x0f00) + { + case 0x0000: strcat(buffer, " "); break; /* This is really UC (Unconditional) */ + case 0x0100: strcat(buffer, "P "); break; + case 0x0200: strcat(buffer, "LS"); break; + case 0x0300: strcat(buffer, "HI"); break; + case 0x0400: strcat(buffer, "LT"); break; + case 0x0500: strcat(buffer, "GE"); break; + case 0x0600: strcat(buffer, "LE"); break; + case 0x0700: strcat(buffer, "GT"); break; + case 0x0800: strcat(buffer, "C "); break; + case 0x0900: strcat(buffer, "NC"); break; + case 0x0a00: strcat(buffer, "EQ"); break; + case 0x0b00: strcat(buffer, "NE"); break; + case 0x0c00: strcat(buffer, "V "); break; + case 0x0d00: strcat(buffer, "NV"); break; + case 0x0e00: strcat(buffer, "N "); break; + case 0x0f00: strcat(buffer, "NN"); break; + } +} + +static void print_reg_list_range(INT8 first, INT8 last) +{ + if ((first != -1 ) && (first != last)) + { + if ((last - first) == 1) + strcat(buffer, ","); + else + strcat(buffer, "-"); + print_reg(last); + } +} + +static void print_reg_list(UINT16 rev) +{ + UINT16 l; + UINT8 i; + INT8 first = -1, last = 0; + + PARAM_WORD(l); + + for (i = 0; i < 16; i++) + { + int moved; + + if (rev) + { + moved = l & 0x8000; + l <<= 1; + } + else + { + moved = l & 0x01; + l >>= 1; + } + + if (moved) + { + if (first == -1) + { + strcat(buffer, ","); + print_reg(i); + first = i; + } + last = i; + } + else + { + print_reg_list_range(first, last); + first = -1; + } + } + + print_reg_list_range(first, last); +} + + +static unsigned Dasm340x0(char *buff, UINT32 pc, int is_34020) +{ + int flags = 0; + UINT8 bad = 0; + UINT16 subop; + + __pc = _pc = pc; + buffer = buff; + + OP_WORD(op); + + subop = (op & 0x01e0); + rs = (op >> 5) & 0x0f; /* Source register */ + rd = op & 0x0f; /* Destination register */ + rf = ((op & 0x10) ? 'B' : 'A'); /* Register file */ + + switch (op & 0xfe00) + { + case 0x0000: + switch (subop) + { + case 0x0020: + sprintf (buffer, "REV "); + print_des_reg(); + break; + + case 0x0040: + if (is_34020) + sprintf (buffer, "IDLE "); + else + bad = 1; + break; + + case 0x0080: + if (is_34020) + sprintf (buffer, "MWAIT "); + else + bad = 1; + break; + + case 0x00e0: + if (is_34020) + sprintf (buffer, "BLMOVE %d,%d", (op >> 1) & 1, op & 1); + else + bad = 1; + break; + + case 0x0100: + sprintf (buffer, "EMU "); + break; + + case 0x0120: + sprintf (buffer, "EXGPC "); + print_des_reg(); + break; + + case 0x0140: + sprintf (buffer, "GETPC "); + print_des_reg(); + break; + + case 0x0160: + sprintf (buffer, "JUMP "); + print_des_reg(); + break; + + case 0x0180: + sprintf (buffer, "GETST "); + print_des_reg(); + break; + + case 0x01a0: + sprintf (buffer, "PUTST "); + print_des_reg(); + break; + + case 0x01c0: + sprintf (buffer, "POPST "); + break; + + case 0x01e0: + sprintf (buffer, "PUSHST "); + break; + + default: + bad = 1; + } + break; + + + case 0x0200: + switch (subop) + { + case 0x0040: + if (is_34020) + sprintf (buffer, "SETCSP "); + else + bad = 1; + break; + + case 0x0060: + if (is_34020) + sprintf (buffer, "SETCDP "); + else + bad = 1; + break; + + case 0x0080: + if (is_34020) + { + sprintf (buffer, "RPIX "); + print_des_reg(); + } + else + bad = 1; + break; + + case 0x00a0: + if (is_34020) + { + sprintf (buffer, "EXGPS "); + print_des_reg(); + } + else + bad = 1; + break; + + case 0x00c0: + if (is_34020) + { + sprintf (buffer, "GETPS "); + print_des_reg(); + } + else + bad = 1; + break; + + case 0x00e0: + if (is_34020) + sprintf (buffer, "SETCMP "); + else + bad = 1; + break; + + case 0x0100: + sprintf (buffer, "NOP "); + break; + + case 0x0120: + sprintf (buffer, "CLRC "); + break; + + case 0x0140: + sprintf (buffer, "MOVB @"); + print_long_parm(); + strcat(buffer, ",@"); + print_long_parm(); + break; + + case 0x0160: + sprintf (buffer, "DINT "); + break; + + case 0x0180: + sprintf (buffer, "ABS "); + print_des_reg(); + break; + + case 0x01a0: + sprintf (buffer, "NEG "); + print_des_reg(); + break; + + case 0x01c0: + sprintf (buffer, "NEGB "); + print_des_reg(); + break; + + case 0x01e0: + sprintf (buffer, "NOT "); + print_des_reg(); + break; + + default: + bad = 1; + } + break; + + + case 0x0400: + case 0x0600: + switch (subop) + { + case 0x0000: + if (is_34020 && (op & 0xfe00) == 0x0600) + { + UINT32 x; + PARAM_LONG(x); + sprintf(buffer, "CEXEC %d,%06X,%d", (x >> 7) & 1, (x >> 8) & 0x1fffff, (x >> 29) & 7); + } + else + bad = 1; + break; + + case 0x0020: + if (is_34020 && (op & 0xfe00) == 0x0600) + { + UINT32 x; + PARAM_LONG(x); + sprintf(buffer, "CMOVGC "); + print_des_reg(); + sprintf(temp, ",%06X,%d", (x >> 8) & 0x1fffff, (x >> 29) & 7); + strcat(buffer, temp); + } + else + bad = 1; + break; + + case 0x0040: + if (is_34020 && (op & 0xfe00) == 0x0600) + { + UINT32 x; + PARAM_LONG(x); + sprintf(buffer, "CMOVGC "); + print_des_reg(); + strcat(buffer, ","); + rf = (x & 0x10) ? 'B' : 'A'; + print_reg(x & 0x0f); + sprintf(temp, ",%d,%06X,%d", (x >> 7) & 1, (x >> 8) & 0x1fffff, (x >> 29) & 7); + strcat(buffer, temp); + } + else + bad = 1; + break; + + case 0x0060: + if (is_34020 && (op & 0xfe00) == 0x0600) + { + UINT32 x; + PARAM_LONG(x); + + if (op == 0x0660 && (x & 0xff) == 0x01) + { + sprintf(buffer, "CMOVCS "); + sprintf(temp, ",%06X,%d", (x >> 8) & 0x1fffff, (x >> 29) & 7); + strcat(buffer, temp); + } + else + { + sprintf(buffer, "CMOVCG "); + print_des_reg(); + strcat(buffer, ","); + rf = (x & 0x10) ? 'B' : 'A'; + print_reg(x & 0x0f); + sprintf(temp, ",%d,%06X,%d", (x >> 7) & 1, (x >> 8) & 0x1fffff, (x >> 29) & 7); + strcat(buffer, temp); + } + } + else + bad = 1; + break; + + case 0x0080: + if (is_34020 && (op & 0xfe00) == 0x0600) + { + UINT32 x; + PARAM_LONG(x); + sprintf(buffer, "CMOVMC *"); + rf = (x & 0x10) ? 'B' : 'A'; + print_reg(x & 0x0f); + sprintf(temp, "+,%d,%d,%06X,%d", op & 0x1f, (x >> 7) & 1, (x >> 8) & 0x1fffff, (x >> 29) & 7); + strcat(buffer, temp); + } + else + bad = 1; + break; + + case 0x00a0: + if (is_34020 && (op & 0xfe00) == 0x0600) + { + UINT32 x; + PARAM_LONG(x); + sprintf(buffer, "CMOVCM *"); + print_des_reg(); + sprintf(temp, "+,%d,%d,%06X,%d", x & 0x1f, (x >> 7) & 1, (x >> 8) & 0x1fffff, (x >> 29) & 7); + strcat(buffer, temp); + } + else + bad = 1; + break; + + case 0x00c0: + if (is_34020 && (op & 0xfe00) == 0x0600) + { + UINT32 x; + PARAM_LONG(x); + sprintf(buffer, "CMOVCM *-"); + print_des_reg(); + sprintf(temp, ",%d,%d,%06X,%d", x & 0x1f, (x >> 7) & 1, (x >> 8) & 0x1fffff, (x >> 29) & 7); + strcat(buffer, temp); + } + else + bad = 1; + break; + + case 0x00e0: + if (is_34020 && (op & 0xfe00) == 0x0600) + { + UINT32 x; + PARAM_LONG(x); + sprintf(buffer, "CMOVMC *"); + rf = (x & 0x10) ? 'B' : 'A'; + print_reg(x & 0x0f); + strcat(buffer, "+,"); + rf = (op & 0x10) ? 'B' : 'A'; + print_reg(op & 0x0f); + sprintf(temp, ",%d,%06X,%d", (x >> 7) & 1, (x >> 8) & 0x1fffff, (x >> 29) & 7); + strcat(buffer, temp); + } + else + bad = 1; + break; + + case 0x0100: + sprintf (buffer, "SEXT "); + print_des_reg(); + strcat(buffer, ","); + print_field(); + break; + + case 0x0120: + sprintf (buffer, "ZEXT "); + print_des_reg(); + strcat(buffer, ","); + print_field(); + break; + + case 0x0140: + case 0x0160: + sprintf (buffer, "SETF %Xh,%X,", + (op & 0x1f) ? op & 0x1f : 0x20, + (op >> 5) & 1); + print_field(); + break; + + case 0x0180: + sprintf (buffer, "MOVE "); + print_des_reg(); + strcat(buffer, ",@"); + print_long_parm(); + strcat(buffer, ","); + print_field(); + break; + + case 0x01a0: + sprintf (buffer, "MOVE @"); + print_long_parm(); + strcat(buffer, ","); + print_des_reg(); + strcat(buffer, ","); + print_field(); + break; + + case 0x01c0: + sprintf (buffer, "MOVE @"); + print_long_parm(); + strcat(buffer, ",@"); + print_long_parm(); + strcat(buffer, ","); + print_field(); + break; + + case 0x01e0: + if (op & 0x200) + { + sprintf (buffer, "MOVE @"); + print_long_parm(); + strcat(buffer, ","); + print_des_reg(); + } + else + { + sprintf (buffer, "MOVB "); + print_des_reg(); + strcat(buffer, ",@"); + print_long_parm(); + } + break; + + default: + bad = 1; + } + break; + + + case 0x0800: + switch (subop) + { + case 0x0000: + if (is_34020) + { + sprintf (buffer, "TRAPL "); + flags = DASMFLAG_STEP_OVER; + } + else + bad = 1; + break; + + case 0x0020: + if (is_34020) + { + UINT32 x; + PARAM_LONG(x); + sprintf(buffer, "CMOVMC *-"); + rf = (x & 0x10) ? 'B' : 'A'; + print_reg(x & 0x0f); + sprintf(temp, ",%d,%d,%06X,%d", op & 0x1f, (x >> 7) & 1, (x >> 8) & 0x1fffff, (x >> 29) & 7); + strcat(buffer, temp); + } + else + bad = 1; + break; + + case 0x0040: + if (is_34020) + sprintf (buffer, "VBLT B,L"); + else + bad = 1; + break; + + case 0x0060: + if (is_34020) + { + sprintf(buffer, "RETM "); + flags = DASMFLAG_STEP_OUT; + } + else + bad = 1; + break; + + case 0x00e0: + if (is_34020) + sprintf (buffer, "CLIP "); + else + bad = 1; + break; + + case 0x0100: + sprintf (buffer, "TRAP %Xh", op & 0x1f); + flags = DASMFLAG_STEP_OVER; + break; + + case 0x0120: + sprintf (buffer, "CALL "); + print_des_reg(); + flags = DASMFLAG_STEP_OVER; + break; + + case 0x0140: + sprintf (buffer, "RETI "); + flags = DASMFLAG_STEP_OUT; + break; + + case 0x0160: + sprintf (buffer, "RETS "); + flags = DASMFLAG_STEP_OUT; + if (op & 0x1f) + { + sprintf(temp, "%Xh", op & 0x1f); + strcat(buffer, temp); + } + break; + + case 0x0180: + sprintf (buffer, "MMTM "); + print_des_reg(); + print_reg_list(1); + break; + + case 0x01a0: + sprintf (buffer, "MMFM "); + print_des_reg(); + print_reg_list(0); + break; + + case 0x01c0: + sprintf (buffer, "MOVI "); + print_word_parm(); + strcat(buffer, ","); + print_des_reg(); + break; + + case 0x01e0: + sprintf (buffer, "MOVI "); + print_long_parm(); + strcat(buffer, ","); + print_des_reg(); + break; + + default: + bad = 1; + } + break; + + + case 0x0a00: + switch (subop) + { + case 0x0000: + if (is_34020) + sprintf (buffer, "VLCOL "); + else + bad = 1; + break; + + case 0x0020: + if (is_34020) + sprintf (buffer, "PFILL XY"); + else + bad = 1; + break; + + case 0x0040: + if (is_34020) + sprintf (buffer, "VFILL L"); + else + bad = 1; + break; + + case 0x0060: + if (is_34020) + { + sprintf (buffer, "CVMXYL "); + print_des_reg(); + } + else + bad = 1; + break; + + case 0x0080: + if (is_34020) + { + sprintf (buffer, "CVDXYL "); + print_des_reg(); + } + else + bad = 1; + break; + + case 0x00a0: + if (is_34020) + sprintf (buffer, "FPIXEQ "); + else + bad = 1; + break; + + case 0x00c0: + if (is_34020) + sprintf (buffer, "FPIXNE "); + else + bad = 1; + break; + + case 0x0100: + sprintf (buffer, "ADDI "); + print_word_parm(); + strcat(buffer, ","); + print_des_reg(); + break; + + case 0x0120: + sprintf (buffer, "ADDI "); + print_long_parm(); + strcat(buffer, ","); + print_des_reg(); + break; + + case 0x0140: + sprintf (buffer, "CMPI "); + print_word_parm_1s_comp(); + strcat(buffer, ","); + print_des_reg(); + break; + + case 0x0160: + sprintf (buffer, "CMPI "); + print_long_parm_1s_comp(); + strcat(buffer, ","); + print_des_reg(); + break; + + case 0x0180: + sprintf (buffer, "ANDI "); + print_long_parm_1s_comp(); + strcat(buffer, ","); + print_des_reg(); + break; + + case 0x01a0: + sprintf (buffer, "ORI "); + print_long_parm(); + strcat(buffer, ","); + print_des_reg(); + break; + + case 0x01c0: + sprintf (buffer, "XORI "); + print_long_parm(); + strcat(buffer, ","); + print_des_reg(); + break; + + case 0x01e0: + sprintf (buffer, "SUBI "); + print_word_parm_1s_comp(); + strcat(buffer, ","); + print_des_reg(); + break; + + default: + bad = 1; + } + break; + + + case 0x0c00: + switch (subop) + { + case 0x0000: + if (is_34020) + { + sprintf (buffer, "ADDXYI "); + print_long_parm(); + strcat(buffer, ","); + print_des_reg(); + } + else + bad = 1; + break; + + case 0x0040: + if (is_34020) + sprintf (buffer, "LINIT "); + else + bad = 1; + break; + + case 0x0100: + sprintf (buffer, "SUBI "); + print_long_parm_1s_comp(); + strcat(buffer, ","); + print_des_reg(); + break; + + case 0x0120: + sprintf (buffer, "CALLR "); + print_relative(); + flags = DASMFLAG_STEP_OVER; + break; + + case 0x0140: + sprintf (buffer, "CALLA "); + print_long_parm(); + flags = DASMFLAG_STEP_OVER; + break; + + case 0x0160: + sprintf (buffer, "EINT "); + break; + + case 0x0180: + sprintf (buffer, "DSJ "); + print_des_reg(); + strcat(buffer, ","); + print_relative(); + flags = DASMFLAG_STEP_OVER; + break; + + case 0x01a0: + sprintf (buffer, "DSJEQ "); + print_des_reg(); + strcat(buffer, ","); + print_relative(); + flags = DASMFLAG_STEP_OVER; + break; + + case 0x01c0: + sprintf (buffer, "DSJNE "); + print_des_reg(); + strcat(buffer, ","); + print_relative(); + flags = DASMFLAG_STEP_OVER; + break; + + case 0x01e0: + sprintf (buffer, "SETC "); + break; + + default: + bad = 1; + } + break; + + + case 0x0e00: + flags = DASMFLAG_STEP_OVER; + switch (subop) + { + case 0x0000: + if (is_34020) + sprintf (buffer, "PIXBLT L,M,L"); + else + bad = 1; + break; + + case 0x00e0: + if (is_34020) + sprintf (buffer, "TFILL XY"); + else + bad = 1; + break; + + case 0x0100: + sprintf (buffer, "PIXBLT L,L"); + break; + + case 0x0120: + sprintf (buffer, "PIXBLT L,XY"); + break; + + case 0x0140: + sprintf (buffer, "PIXBLT XY,L"); + break; + + case 0x0160: + sprintf (buffer, "PIXBLT XY,XY"); + break; + + case 0x0180: + sprintf (buffer, "PIXBLT B,L"); + break; + + case 0x01a0: + sprintf (buffer, "PIXBLT B,XY"); + break; + + case 0x01c0: + sprintf (buffer, "FILL L"); + break; + + case 0x01e0: + sprintf (buffer, "FILL XY"); + break; + + default: + bad = 1; + } + break; + + + case 0x1000: + case 0x1200: + if ((op & 0x03e0) != 0x0020) + { + sprintf (buffer, "ADDK "); + print_constant_1_32(); + strcat(buffer, ","); + } + else + { + sprintf (buffer, "INC "); + } + print_des_reg(); + + break; + + + case 0x1400: + case 0x1600: + if ((op & 0x03e0) != 0x0020) + { + sprintf (buffer, "SUBK "); + print_constant_1_32(); + strcat(buffer, ","); + } + else + { + sprintf (buffer, "DEC "); + } + print_des_reg(); + + break; + + + case 0x1800: + case 0x1a00: + sprintf (buffer, "MOVK "); + print_constant_1_32(); + strcat(buffer, ","); + print_des_reg(); + break; + + + case 0x1c00: + case 0x1e00: + sprintf (buffer, "BTST "); + print_constant_1s_comp(); + strcat(buffer, ","); + print_des_reg(); + break; + + + case 0x2000: + case 0x2200: + sprintf (buffer, "SLA "); + print_constant(); + strcat(buffer, ","); + print_des_reg(); + break; + + + case 0x2400: + case 0x2600: + sprintf (buffer, "SLL "); + print_constant(); + strcat(buffer, ","); + print_des_reg(); + break; + + + case 0x2800: + case 0x2a00: + sprintf (buffer, "SRA "); + print_constant_2s_comp(); + strcat(buffer, ","); + print_des_reg(); + break; + + + case 0x2c00: + case 0x2e00: + sprintf (buffer, "SRL "); + print_constant_2s_comp(); + strcat(buffer, ","); + print_des_reg(); + break; + + + case 0x3000: + case 0x3200: + sprintf (buffer, "RL "); + print_constant(); + strcat(buffer, ","); + print_des_reg(); + break; + + case 0x3400: + case 0x3600: + if (is_34020) + { + sprintf (buffer, "CMPK "); + print_constant_1_32(); + strcat(buffer, ","); + print_des_reg(); + } + else + bad = 1; + break; + + case 0x3800: + case 0x3a00: + case 0x3c00: + case 0x3e00: + sprintf (buffer, "DSJS "); + print_des_reg(); + strcat(buffer, ","); + print_relative_5bit(); + flags = DASMFLAG_STEP_OVER; + break; + + + case 0x4000: + sprintf (buffer, "ADD "); + print_src_des_reg(); + break; + + + case 0x4200: + sprintf (buffer, "ADDC "); + print_src_des_reg(); + break; + + + case 0x4400: + sprintf (buffer, "SUB "); + print_src_des_reg(); + break; + + + case 0x4600: + sprintf (buffer, "SUBB "); + print_src_des_reg(); + break; + + + case 0x4800: + sprintf (buffer, "CMP "); + print_src_des_reg(); + break; + + + case 0x4a00: + sprintf (buffer, "BTST "); + print_src_des_reg(); + break; + + + case 0x4c00: + case 0x4e00: + sprintf (buffer, "MOVE "); + + if (!(op & 0x0200)) + { + print_src_des_reg(); + } + else + { + print_src_reg(); + strcat(buffer, ","); + + if (rf == 'A') + { + rf = 'B'; + } + else + { + rf = 'A'; + } + + print_des_reg(); + } + break; + + + case 0x5000: + sprintf (buffer, "AND "); + print_src_des_reg(); + break; + + + case 0x5200: + sprintf (buffer, "ANDN "); + print_src_des_reg(); + break; + + + case 0x5400: + sprintf (buffer, "OR "); + print_src_des_reg(); + break; + + + case 0x5600: + if (rs != rd) + { + sprintf (buffer, "XOR "); + print_src_des_reg(); + } + else + { + sprintf (buffer, "CLR "); + print_des_reg(); + } + break; + + + case 0x5800: + sprintf (buffer, "DIVS "); + print_src_des_reg(); + break; + + + case 0x5a00: + sprintf (buffer, "DIVU "); + print_src_des_reg(); + break; + + + case 0x5c00: + sprintf (buffer, "MPYS "); + print_src_des_reg(); + break; + + + case 0x5e00: + sprintf (buffer, "MPYU "); + print_src_des_reg(); + break; + + + case 0x6000: + sprintf (buffer, "SLA "); + print_src_des_reg(); + break; + + + case 0x6200: + sprintf (buffer, "SLL "); + print_src_des_reg(); + break; + + + case 0x6400: + sprintf (buffer, "SRA "); + print_src_des_reg(); + break; + + + case 0x6600: + sprintf (buffer, "SRL "); + print_src_des_reg(); + break; + + + case 0x6800: + sprintf (buffer, "RL "); + print_src_des_reg(); + break; + + + case 0x6a00: + sprintf (buffer, "LMO "); + print_src_des_reg(); + break; + + + case 0x6c00: + sprintf (buffer, "MODS "); + print_src_des_reg(); + break; + + + case 0x6e00: + sprintf (buffer, "MODU "); + print_src_des_reg(); + break; + + + case 0x7a00: + if (is_34020) + { + sprintf (buffer, "RMO "); + print_src_des_reg(); + } + else + bad = 1; + break; + + case 0x7e00: + if (is_34020) + { + sprintf (buffer, "SWAPF *"); + print_src_des_reg(); + strcat(buffer, ",0"); + } + else + bad = 1; + break; + + + case 0x8000: + case 0x8200: + sprintf (buffer, "MOVE "); + print_src_reg(); + strcat(buffer, ",*"); + print_des_reg(); + strcat(buffer, ","); + print_field(); + break; + + + case 0x8400: + case 0x8600: + sprintf (buffer, "MOVE *"); + print_src_des_reg(); + strcat(buffer, ","); + print_field(); + break; + + + case 0x8800: + case 0x8a00: + sprintf (buffer, "MOVE *"); + print_src_reg(); + strcat(buffer, ",*"); + print_des_reg(); + strcat(buffer, ","); + print_field(); + break; + + + case 0x8c00: + sprintf (buffer, "MOVB "); + print_src_reg(); + strcat(buffer, ",*"); + print_des_reg(); + break; + + + case 0x8e00: + sprintf (buffer, "MOVB *"); + print_src_des_reg(); + break; + + + case 0x9000: + case 0x9200: + sprintf (buffer, "MOVE "); + print_src_reg(); + strcat(buffer, ",*"); + print_des_reg(); + strcat(buffer, "+,"); + print_field(); + break; + + + case 0x9400: + case 0x9600: + sprintf (buffer, "MOVE *"); + print_src_reg(); + strcat(buffer, "+,"); + print_des_reg(); + strcat(buffer, ","); + print_field(); + break; + + + case 0x9800: + case 0x9a00: + sprintf (buffer, "MOVE *"); + print_src_reg(); + strcat(buffer, "+,*"); + print_des_reg(); + strcat(buffer, "+,"); + print_field(); + break; + + + case 0x9c00: + sprintf (buffer, "MOVB *"); + print_src_reg(); + strcat(buffer, ",*"); + print_des_reg(); + break; + + + case 0xa000: + case 0xa200: + sprintf (buffer, "MOVE "); + print_src_reg(); + strcat(buffer, ",-*"); + print_des_reg(); + strcat(buffer, ","); + print_field(); + break; + + + case 0xa400: + case 0xa600: + sprintf (buffer, "MOVE -*"); + print_src_des_reg(); + strcat(buffer, ","); + print_field(); + break; + + + case 0xa800: + case 0xaa00: + sprintf (buffer, "MOVE -*"); + print_src_reg(); + strcat(buffer, ",-*"); + print_des_reg(); + strcat(buffer, ","); + print_field(); + break; + + + case 0xac00: + sprintf (buffer, "MOVB "); + print_src_reg(); + strcat(buffer, ",*"); + print_des_reg(); + strcat(buffer, "("); + print_word_parm(); + strcat(buffer, ")"); + break; + + + case 0xae00: + sprintf (buffer, "MOVB *"); + print_src_reg(); + strcat(buffer, "("); + print_word_parm(); + strcat(buffer, "),"); + print_des_reg(); + break; + + + case 0xb000: + case 0xb200: + sprintf (buffer, "MOVE "); + print_src_reg(); + strcat(buffer, ",*"); + print_des_reg(); + strcat(buffer, "("); + print_word_parm(); + strcat(buffer, "),"); + print_field(); + break; + + + case 0xb400: + case 0xb600: + sprintf (buffer, "MOVE *"); + print_src_reg(); + strcat(buffer, "("); + print_word_parm(); + strcat(buffer, "),"); + print_des_reg(); + strcat(buffer, ","); + print_field(); + break; + + + case 0xb800: + case 0xba00: + sprintf (buffer, "MOVE *"); + print_src_reg(); + strcat(buffer, "("); + print_word_parm(); + strcat(buffer, "),*"); + print_des_reg(); + strcat(buffer, "("); + print_word_parm(); + strcat(buffer, "),"); + print_field(); + break; + + + case 0xbc00: + sprintf (buffer, "MOVB *"); + print_src_reg(); + strcat(buffer, "("); + print_word_parm(); + strcat(buffer, "),*"); + print_des_reg(); + strcat(buffer, "("); + print_word_parm(); + strcat(buffer, ")"); + break; + + + case 0xc000: + case 0xc200: + case 0xc400: + case 0xc600: + case 0xc800: + case 0xca00: + case 0xcc00: + case 0xce00: + if ((op & 0x00ff) == 0x80) + { + sprintf (buffer, "JA"); + } + else + { + sprintf (buffer, "JR"); + } + + print_condition_code(); + strcat (buffer, " "); + + switch (op & 0x00ff) + { + case 0x00: + print_relative(); + break; + + case 0x80: + print_long_parm(); + break; + + default: + print_relative_8bit(); + } + break; + + + case 0xd000: + case 0xd200: + sprintf (buffer, "MOVE *"); + print_src_reg(); + strcat(buffer, "("); + print_word_parm(); + strcat(buffer, "),*"); + print_des_reg(); + strcat(buffer, "+,"); + print_field(); + break; + + + case 0xd400: + case 0xd600: + switch (subop) + { + case 0x0000: + sprintf (buffer, "MOVE @"); + print_long_parm(); + strcat(buffer, ",*"); + print_des_reg(); + strcat(buffer, "+,"); + print_field(); + break; + + case 0x0100: + sprintf (buffer, "EXGF "); + print_des_reg(); + strcat(buffer, ","); + print_field(); + break; + + default: + bad = 1; + } + break; + + case 0xd800: + if (is_34020) + { + UINT32 x; + PARAM_WORD(x); + sprintf(buffer, "CEXEC %d,%06X,%d", op & 1, ((x << 5) & 0x1fffe0) | ((op >> 1) & 0x1f), (x >> 13) & 7); + } + else + bad = 1; + break; + + + case 0xde00: + switch (subop) + { + case 0x0000: + if (is_34020) + sprintf (buffer, "FLINE 0"); + else + bad = 1; + break; + + case 0x0080: + if (is_34020) + sprintf (buffer, "FLINE 1"); + else + bad = 1; + break; + + case 0x0100: + sprintf (buffer, "LINE 0"); + break; + + case 0x0180: + sprintf (buffer, "LINE 1"); + break; + + default: + bad = 1; + } + break; + + case 0xe000: + sprintf (buffer, "ADDXY "); + print_src_des_reg(); + break; + + + case 0xe200: + sprintf (buffer, "SUBXY "); + print_src_des_reg(); + break; + + + case 0xe400: + sprintf (buffer, "CMPXY "); + print_src_des_reg(); + break; + + + case 0xe600: + sprintf (buffer, "CPW "); + print_src_des_reg(); + break; + + + case 0xe800: + sprintf (buffer, "CVXYL "); + print_src_des_reg(); + break; + + + case 0xea00: + if (is_34020) + { + sprintf (buffer, "CVSXYL "); + print_src_des_reg(); + } + else + bad = 1; + break; + + + case 0xec00: + sprintf (buffer, "MOVX "); + print_src_des_reg(); + break; + + + case 0xee00: + sprintf (buffer, "MOVY "); + print_src_des_reg(); + break; + + + case 0xf000: + sprintf (buffer, "PIXT "); + print_src_reg(); + strcat(buffer, ",*"); + print_des_reg(); + strcat(buffer, ",XY"); + break; + + + case 0xf200: + sprintf (buffer, "PIXT *"); + print_src_reg(); + strcat(buffer, ",XY,"); + print_des_reg(); + break; + + + case 0xf400: + sprintf (buffer, "PIXT *"); + print_src_reg(); + strcat(buffer, ",XY,*"); + print_des_reg(); + strcat(buffer, ",XY"); + break; + + + case 0xf600: + sprintf (buffer, "DRAV "); + print_src_des_reg(); + break; + + + case 0xf800: + sprintf (buffer, "PIXT "); + print_src_reg(); + strcat(buffer, ",*"); + print_des_reg(); + break; + + + case 0xfa00: + sprintf (buffer, "PIXT *"); + print_src_des_reg(); + break; + + + case 0xfc00: + sprintf (buffer, "PIXT *"); + print_src_reg(); + strcat(buffer, ",*"); + print_des_reg(); + break; + + default: + bad = 1; + } + + if (bad) + { + sprintf (buffer, "DW %04Xh", op & 0xffff); + } + + return (_pc - __pc) | flags | DASMFLAG_SUPPORTED; +} + +CPU_DISASSEMBLE( tms34010 ) +{ + rombase = oprom; + rambase = opram; + pcbase = pc; + return Dasm340x0(buffer, pc, 0); +} + +CPU_DISASSEMBLE( tms34020 ) +{ + rombase = oprom; + rambase = opram; + pcbase = pc; + return Dasm340x0(buffer, pc, 1); +} + |