Annotation of hatari/src/falcon/dsp_disasm.c, revision 1.1.1.7

1.1       root        1: /*
1.1.1.2   root        2:        DSP M56001 emulation
                      3:        Disassembler
                      4: 
                      5:        (C) 2003-2008 ARAnyM developer team
                      6: 
                      7:        This program is free software; you can redistribute it and/or modify
                      8:        it under the terms of the GNU General Public License as published by
                      9:        the Free Software Foundation; either version 2 of the License, or
                     10:        (at your option) any later version.
                     11: 
                     12:        This program is distributed in the hope that it will be useful,
                     13:        but WITHOUT ANY WARRANTY; without even the implied warranty of
                     14:        MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
                     15:        GNU General Public License for more details.
                     16: 
                     17:        You should have received a copy of the GNU General Public License
                     18:        along with this program; if not, write to the Free Software
                     19:        Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
                     20: */
                     21: 
                     22: #ifdef HAVE_CONFIG_H
                     23: #include "config.h"
                     24: #endif
                     25: 
                     26: #include <string.h>
1.1.1.7 ! root       27: #include <inttypes.h>
1.1.1.5   root       28: #include <stdbool.h>
1.1.1.2   root       29: 
                     30: #include "dsp_core.h"
1.1       root       31: #include "dsp_cpu.h"
                     32: #include "dsp_disasm.h"
1.1.1.6   root       33: #include "profile.h"
1.1       root       34: 
                     35: 
                     36: /* More disasm infos, if wanted */
                     37: #define DSP_DISASM_REG_PC 0
                     38: 
                     39: /**********************************
                     40:  *     Defines
                     41:  **********************************/
                     42: 
                     43: /**********************************
                     44:  *     Variables
                     45:  **********************************/
                     46: 
                     47: /* Current instruction */
1.1.1.2   root       48: static Uint32 cur_inst;
1.1.1.6   root       49: static Uint16 disasm_cur_inst_len;
1.1.1.4   root       50: static char str_instr[50];
1.1.1.6   root       51: static char str_instr2[120];
1.1.1.4   root       52: static char parallelmove_name[64];
1.1.1.3   root       53: 
                     54: /* Previous instruction */
1.1.1.5   root       55: static Uint32 prev_inst_pc;
                     56: static bool isLooping;
1.1.1.2   root       57: 
1.1.1.5   root       58: /* Used to display dc instead of unknown instruction for illegal opcodes */
                     59: static bool isInDisasmMode;
1.1.1.2   root       60: 
1.1.1.5   root       61: void dsp56k_disasm_init(void)
1.1.1.2   root       62: {
1.1.1.5   root       63:        prev_inst_pc = 0x10000;         /* Init to an invalid value */
                     64:        isLooping = false;
                     65:        isInDisasmMode = false;
1.1.1.2   root       66: }
1.1       root       67: 
                     68: /**********************************
                     69:  *     Register change
                     70:  **********************************/
                     71: 
1.1.1.2   root       72: static Uint32 registers_save[64];
1.1       root       73: #if DSP_DISASM_REG_PC
1.1.1.2   root       74: static Uint32 pc_save;
1.1       root       75: #endif
                     76: 
                     77: static const char *registers_name[64]={
                     78:        "","","","",
                     79:        "x0","x1","y0","y1",
                     80:        "a0","b0","a2","b2",
                     81:        "a1","b1","a","b",
                     82:        
                     83:        "r0","r1","r2","r3",
                     84:        "r4","r5","r6","r7",
                     85:        "n0","n1","n2","n3",
                     86:        "n4","n5","n6","n7",
                     87: 
                     88:        "m0","m1","m2","m3",
                     89:        "m4","m5","m6","m7",
                     90:        "","","","",
                     91:        "","","","",
                     92: 
                     93:        "","","","",
                     94:        "","","","",
                     95:        "","sr","omr","sp",
                     96:        "ssh","ssl","la","lc"
                     97: };
                     98: 
                     99: /**********************************
                    100:  *     Opcode disassembler
                    101:  **********************************/
                    102: 
1.1.1.2   root      103: static Uint32 read_memory(Uint32 currPc);
                    104: 
1.1       root      105: typedef void (*dsp_emul_t)(void);
                    106: 
                    107: static void opcode8h_0(void);
                    108: 
1.1.1.2   root      109: static int dsp_calc_ea(Uint32 ea_mode, char *dest);
                    110: static void dsp_calc_cc(Uint32 cc_mode, char *dest);
1.1       root      111: static void dsp_undefined(void);
                    112: 
                    113: /* Instructions without parallel moves */
                    114: static void dsp_andi(void);
1.1.1.3   root      115: static void dsp_bchg_aa(void);
                    116: static void dsp_bchg_ea(void);
                    117: static void dsp_bchg_pp(void);
                    118: static void dsp_bchg_reg(void);
                    119: static void dsp_bclr_aa(void);
                    120: static void dsp_bclr_ea(void);
                    121: static void dsp_bclr_pp(void);
                    122: static void dsp_bclr_reg(void);
                    123: static void dsp_bset_aa(void);
                    124: static void dsp_bset_ea(void);
                    125: static void dsp_bset_pp(void);
                    126: static void dsp_bset_reg(void);
                    127: static void dsp_btst_aa(void);
                    128: static void dsp_btst_ea(void);
                    129: static void dsp_btst_pp(void);
                    130: static void dsp_btst_reg(void);
1.1       root      131: static void dsp_div(void);
                    132: static void dsp_enddo(void);
                    133: static void dsp_illegal(void);
1.1.1.3   root      134: static void dsp_jcc_imm(void);
                    135: static void dsp_jcc_ea(void);
                    136: static void dsp_jclr_aa(void);
                    137: static void dsp_jclr_ea(void);
                    138: static void dsp_jclr_pp(void);
                    139: static void dsp_jclr_reg(void);
                    140: static void dsp_jmp_ea(void);
                    141: static void dsp_jmp_imm(void);
                    142: static void dsp_jscc_ea(void);
                    143: static void dsp_jscc_imm(void);
                    144: static void dsp_jsclr_aa(void);
                    145: static void dsp_jsclr_ea(void);
                    146: static void dsp_jsclr_pp(void);
                    147: static void dsp_jsclr_reg(void);
                    148: static void dsp_jset_aa(void);
                    149: static void dsp_jset_ea(void);
                    150: static void dsp_jset_pp(void);
                    151: static void dsp_jset_reg(void);
                    152: static void dsp_jsr_ea(void);
                    153: static void dsp_jsr_imm(void);
                    154: static void dsp_jsset_aa(void);
                    155: static void dsp_jsset_ea(void);
                    156: static void dsp_jsset_pp(void);
                    157: static void dsp_jsset_reg(void);
1.1       root      158: static void dsp_lua(void);
1.1.1.3   root      159: static void dsp_movem_ea(void);
                    160: static void dsp_movem_aa(void);
1.1       root      161: static void dsp_nop(void);
                    162: static void dsp_norm(void);
                    163: static void dsp_ori(void);
                    164: static void dsp_reset(void);
                    165: static void dsp_rti(void);
                    166: static void dsp_rts(void);
                    167: static void dsp_stop(void);
                    168: static void dsp_swi(void);
                    169: static void dsp_tcc(void);
                    170: static void dsp_wait(void);
1.1.1.3   root      171: static void dsp_do_ea(void);
                    172: static void dsp_do_aa(void);
                    173: static void dsp_do_imm(void);
                    174: static void dsp_do_reg(void);
                    175: static void dsp_rep_aa(void);
                    176: static void dsp_rep_ea(void);
                    177: static void dsp_rep_imm(void);
                    178: static void dsp_rep_reg(void);
                    179: static void dsp_movec_aa(void);
                    180: static void dsp_movec_ea(void);
                    181: static void dsp_movec_imm(void);
                    182: static void dsp_movec_reg(void);
1.1       root      183: static void dsp_movep_0(void);
                    184: static void dsp_movep_1(void);
1.1.1.3   root      185: static void dsp_movep_23(void);
1.1       root      186: 
                    187: /* Parallel moves */
1.1.1.3   root      188: static void dsp_pm_class2(void);
1.1       root      189: static void dsp_pm(void);
                    190: static void dsp_pm_0(void);
                    191: static void dsp_pm_1(void);
                    192: static void dsp_pm_2(void);
                    193: static void dsp_pm_4(void);
                    194: static void dsp_pm_8(void);
                    195: 
                    196: 
1.1.1.5   root      197: static const dsp_emul_t opcodes8h[512] = {
1.1.1.3   root      198:        /* 0x00 - 0x3f */
                    199:        opcode8h_0, dsp_undefined, dsp_undefined, dsp_undefined, opcode8h_0, dsp_andi, dsp_undefined, dsp_ori,
                    200:        dsp_undefined, dsp_undefined, dsp_undefined, dsp_undefined, dsp_undefined, dsp_andi, dsp_undefined, dsp_ori,
                    201:        dsp_undefined, dsp_undefined, dsp_undefined, dsp_undefined, dsp_undefined, dsp_andi, dsp_undefined, dsp_ori,
                    202:        dsp_undefined, dsp_undefined, dsp_undefined, dsp_undefined, dsp_undefined, dsp_andi, dsp_undefined, dsp_ori,
                    203:        dsp_undefined, dsp_undefined, dsp_undefined, dsp_undefined, dsp_undefined, dsp_undefined, dsp_undefined, dsp_undefined,
                    204:        dsp_undefined, dsp_undefined, dsp_undefined, dsp_undefined, dsp_undefined, dsp_undefined, dsp_undefined, dsp_undefined,
                    205:        dsp_undefined, dsp_undefined, dsp_div, dsp_div, dsp_undefined, dsp_undefined, dsp_undefined, dsp_undefined,
                    206:        dsp_norm, dsp_undefined, dsp_undefined, dsp_undefined, dsp_undefined, dsp_undefined, dsp_undefined, dsp_undefined,
                    207:        
                    208:        /* 0x40 - 0x7f */
                    209:        dsp_tcc, dsp_tcc, dsp_tcc, dsp_tcc, dsp_undefined, dsp_undefined, dsp_undefined, dsp_undefined,
                    210:        dsp_tcc, dsp_tcc, dsp_tcc, dsp_tcc, dsp_undefined, dsp_undefined, dsp_undefined, dsp_undefined,
                    211:        dsp_tcc, dsp_tcc, dsp_tcc, dsp_tcc, dsp_undefined, dsp_undefined, dsp_undefined, dsp_undefined,
                    212:        dsp_tcc, dsp_tcc, dsp_tcc, dsp_tcc, dsp_undefined, dsp_undefined, dsp_undefined, dsp_undefined,
                    213:        dsp_tcc, dsp_tcc, dsp_tcc, dsp_tcc, dsp_undefined, dsp_undefined, dsp_undefined, dsp_undefined,
                    214:        dsp_tcc, dsp_tcc, dsp_tcc, dsp_tcc, dsp_undefined, dsp_undefined, dsp_undefined, dsp_undefined,
                    215:        dsp_tcc, dsp_tcc, dsp_tcc, dsp_tcc, dsp_undefined, dsp_undefined, dsp_undefined, dsp_undefined,
                    216:        dsp_tcc, dsp_tcc, dsp_tcc, dsp_tcc, dsp_undefined, dsp_undefined, dsp_undefined, dsp_undefined,
                    217: 
                    218:        /* 0x80 - 0xbf */
                    219:        dsp_undefined, dsp_undefined, dsp_undefined, dsp_undefined, dsp_undefined, dsp_undefined, dsp_undefined, dsp_undefined,
                    220:        dsp_lua, dsp_undefined, dsp_undefined, dsp_undefined, dsp_undefined, dsp_movec_reg, dsp_undefined, dsp_undefined, 
                    221:        dsp_undefined, dsp_undefined, dsp_undefined, dsp_undefined, dsp_undefined, dsp_undefined, dsp_undefined, dsp_undefined,
                    222:        dsp_undefined, dsp_undefined, dsp_undefined, dsp_undefined, dsp_undefined, dsp_movec_reg, dsp_undefined, dsp_undefined, 
                    223:        dsp_undefined, dsp_movec_aa, dsp_undefined, dsp_movec_aa, dsp_undefined, dsp_movec_imm, dsp_undefined, dsp_undefined,
                    224:        dsp_undefined, dsp_movec_ea, dsp_undefined, dsp_movec_ea, dsp_undefined, dsp_movec_imm, dsp_undefined, dsp_undefined,
                    225:        dsp_undefined, dsp_movec_aa, dsp_undefined, dsp_movec_aa, dsp_undefined, dsp_movec_imm, dsp_undefined, dsp_undefined,
                    226:        dsp_undefined, dsp_movec_ea, dsp_undefined, dsp_movec_ea, dsp_undefined, dsp_movec_imm, dsp_undefined, dsp_undefined,
                    227:        
                    228:        /* 0xc0 - 0xff */
                    229:        dsp_do_aa, dsp_rep_aa, dsp_do_aa, dsp_rep_aa, dsp_do_imm, dsp_rep_imm, dsp_undefined, dsp_undefined, 
                    230:        dsp_do_ea, dsp_rep_ea, dsp_do_ea, dsp_rep_ea, dsp_do_imm, dsp_rep_imm, dsp_undefined, dsp_undefined, 
                    231:        dsp_undefined, dsp_undefined, dsp_undefined, dsp_undefined, dsp_do_imm, dsp_rep_imm, dsp_undefined, dsp_undefined, 
                    232:        dsp_do_reg, dsp_rep_reg, dsp_undefined, dsp_undefined, dsp_do_imm, dsp_rep_imm, dsp_undefined, dsp_undefined, 
                    233:        dsp_movem_aa, dsp_movem_aa, dsp_undefined, dsp_undefined, dsp_undefined, dsp_undefined, dsp_undefined, dsp_undefined, 
                    234:        dsp_undefined, dsp_undefined, dsp_undefined, dsp_undefined, dsp_movem_ea, dsp_movem_ea, dsp_undefined, dsp_undefined, 
                    235:        dsp_movem_aa, dsp_movem_aa, dsp_undefined, dsp_undefined, dsp_undefined, dsp_undefined, dsp_undefined, dsp_undefined, 
                    236:        dsp_undefined, dsp_undefined, dsp_undefined, dsp_undefined, dsp_movem_ea, dsp_movem_ea, dsp_undefined, dsp_undefined, 
                    237: 
                    238:        /* 0x100 - 0x13f */
                    239:        dsp_pm_class2, dsp_pm_class2, dsp_pm_class2, dsp_pm_class2, dsp_pm_class2, dsp_pm_class2, dsp_pm_class2, dsp_pm_class2,
                    240:        dsp_movep_0, dsp_movep_0, dsp_movep_1, dsp_movep_1, dsp_movep_23, dsp_movep_23, dsp_movep_23, dsp_movep_23,
                    241:        dsp_pm_class2, dsp_pm_class2, dsp_pm_class2, dsp_pm_class2, dsp_pm_class2, dsp_pm_class2, dsp_pm_class2, dsp_pm_class2,
                    242:        dsp_movep_0, dsp_movep_0, dsp_movep_1, dsp_movep_1, dsp_movep_23, dsp_movep_23, dsp_movep_23, dsp_movep_23,
                    243:        dsp_pm_class2, dsp_pm_class2, dsp_pm_class2, dsp_pm_class2, dsp_pm_class2, dsp_pm_class2, dsp_pm_class2, dsp_pm_class2,
                    244:        dsp_movep_0, dsp_movep_0, dsp_movep_1, dsp_movep_1, dsp_movep_23, dsp_movep_23, dsp_movep_23, dsp_movep_23,
                    245:        dsp_pm_class2, dsp_pm_class2, dsp_pm_class2, dsp_pm_class2, dsp_pm_class2, dsp_pm_class2, dsp_pm_class2, dsp_pm_class2,
                    246:        dsp_movep_0, dsp_movep_0, dsp_movep_1, dsp_movep_1, dsp_movep_23, dsp_movep_23, dsp_movep_23, dsp_movep_23,
                    247: 
                    248:        /* 0x140 - 0x17f */
                    249:        dsp_bclr_aa, dsp_bset_aa, dsp_bclr_aa, dsp_bset_aa, dsp_jclr_aa, dsp_jset_aa, dsp_jclr_aa, dsp_jset_aa,
                    250:        dsp_bclr_ea, dsp_bset_ea, dsp_bclr_ea, dsp_bset_ea, dsp_jclr_ea, dsp_jset_ea, dsp_jclr_ea, dsp_jset_ea,
                    251:        dsp_bclr_pp, dsp_bset_pp, dsp_bclr_pp, dsp_bset_pp, dsp_jclr_pp, dsp_jset_pp, dsp_jclr_pp, dsp_jset_pp,
                    252:        dsp_jclr_reg, dsp_jset_reg, dsp_bclr_reg, dsp_bset_reg, dsp_jmp_ea, dsp_jcc_ea, dsp_undefined, dsp_undefined,
                    253:        dsp_bchg_aa, dsp_btst_aa, dsp_bchg_aa, dsp_btst_aa, dsp_jsclr_aa, dsp_jsset_aa, dsp_jsclr_aa, dsp_jsset_aa,
                    254:        dsp_bchg_ea, dsp_btst_ea, dsp_bchg_ea, dsp_btst_ea, dsp_jsclr_ea, dsp_jsset_ea, dsp_jsclr_ea, dsp_jsset_ea,
                    255:        dsp_bchg_pp, dsp_btst_pp, dsp_bchg_pp, dsp_btst_pp, dsp_jsclr_pp, dsp_jsset_pp, dsp_jsclr_pp, dsp_jsset_pp,
                    256:        dsp_jsclr_reg, dsp_jsset_reg, dsp_bchg_reg, dsp_btst_reg, dsp_jsr_ea, dsp_jscc_ea, dsp_undefined, dsp_undefined,
                    257: 
                    258:        /* 0x180 - 0x1bf */
                    259:        dsp_jmp_imm, dsp_jmp_imm, dsp_jmp_imm, dsp_jmp_imm, dsp_jmp_imm, dsp_jmp_imm, dsp_jmp_imm, dsp_jmp_imm,
                    260:        dsp_undefined, dsp_undefined, dsp_undefined, dsp_undefined, dsp_undefined, dsp_undefined, dsp_undefined, dsp_undefined, 
                    261:        dsp_undefined, dsp_undefined, dsp_undefined, dsp_undefined, dsp_undefined, dsp_undefined, dsp_undefined, dsp_undefined, 
                    262:        dsp_undefined, dsp_undefined, dsp_undefined, dsp_undefined, dsp_undefined, dsp_undefined, dsp_undefined, dsp_undefined, 
                    263:        dsp_jsr_imm, dsp_jsr_imm, dsp_jsr_imm, dsp_jsr_imm, dsp_jsr_imm, dsp_jsr_imm, dsp_jsr_imm, dsp_jsr_imm, 
                    264:        dsp_undefined, dsp_undefined, dsp_undefined, dsp_undefined, dsp_undefined, dsp_undefined, dsp_undefined, dsp_undefined, 
                    265:        dsp_undefined, dsp_undefined, dsp_undefined, dsp_undefined, dsp_undefined, dsp_undefined, dsp_undefined, dsp_undefined, 
                    266:        dsp_undefined, dsp_undefined, dsp_undefined, dsp_undefined, dsp_undefined, dsp_undefined, dsp_undefined, dsp_undefined, 
                    267: 
                    268:        /* 0x1c0 - 0x1ff */
                    269:        dsp_jcc_imm, dsp_jcc_imm, dsp_jcc_imm, dsp_jcc_imm, dsp_jcc_imm, dsp_jcc_imm, dsp_jcc_imm, dsp_jcc_imm, 
                    270:        dsp_jcc_imm, dsp_jcc_imm, dsp_jcc_imm, dsp_jcc_imm, dsp_jcc_imm, dsp_jcc_imm, dsp_jcc_imm, dsp_jcc_imm, 
                    271:        dsp_jcc_imm, dsp_jcc_imm, dsp_jcc_imm, dsp_jcc_imm, dsp_jcc_imm, dsp_jcc_imm, dsp_jcc_imm, dsp_jcc_imm, 
                    272:        dsp_jcc_imm, dsp_jcc_imm, dsp_jcc_imm, dsp_jcc_imm, dsp_jcc_imm, dsp_jcc_imm, dsp_jcc_imm, dsp_jcc_imm, 
                    273:        dsp_jscc_imm, dsp_jscc_imm, dsp_jscc_imm, dsp_jscc_imm, dsp_jscc_imm, dsp_jscc_imm, dsp_jscc_imm, dsp_jscc_imm, 
                    274:        dsp_jscc_imm, dsp_jscc_imm, dsp_jscc_imm, dsp_jscc_imm, dsp_jscc_imm, dsp_jscc_imm, dsp_jscc_imm, dsp_jscc_imm, 
                    275:        dsp_jscc_imm, dsp_jscc_imm, dsp_jscc_imm, dsp_jscc_imm, dsp_jscc_imm, dsp_jscc_imm, dsp_jscc_imm, dsp_jscc_imm, 
                    276:        dsp_jscc_imm, dsp_jscc_imm, dsp_jscc_imm, dsp_jscc_imm, dsp_jscc_imm, dsp_jscc_imm, dsp_jscc_imm, dsp_jscc_imm, 
1.1       root      277: };
                    278: 
1.1.1.5   root      279: static const char* opcodes_alu[256] = {
1.1.1.3   root      280:        /* 0x00 - 0x3f */
1.1.1.5   root      281:        "move"     , "tfr b,a", "addr b,a", "tst a", "undefined", "cmp b,a"  , "subr b,a", "cmpm b,a",
                    282:        "undefined", "tfr a,b", "addr a,b", "tst b", "undefined", "cmp a,b"  , "subr a,b", "cmpm a,b",
                    283:        "add b,a"  , "rnd a"  , "addl b,a", "clr a", "sub b,a"  , "undefined", "subl b,a", "not a",
                    284:        "add a,b"  , "rnd b"  , "addl a,b", "clr b", "sub a,b"  , "undefined", "subl a,b", "not b",
                    285:        "add x,a"  , "adc x,a", "asr a" , "lsr a", "sub x,a"  , "sbc x,a"  , "abs a" , "ror a",
                    286:        "add x,b"  , "adc x,b", "asr b" , "lsr b", "sub x,b"  , "sbc x,b"  , "abs b" , "ror b",
                    287:        "add y,a"  , "adc y,a", "asl a" , "lsl a", "sub y,a"  , "sbc y,a"  , "neg a" , "rol a",
                    288:        "add y,b"  , "adc y,b", "asl b" , "lsl b", "sub y,b"  , "sbc y,b"  , "neg b" , "rol b",
1.1.1.3   root      289:        
                    290:        /* 0x40 - 0x7f */
1.1.1.5   root      291:        "add x0,a", "tfr x0,a", "or x0,a", "eor x0,a", "sub x0,a", "cmp x0,a", "and x0,a", "cmpm x0,a",
                    292:        "add x0,b", "tfr x0,b", "or x0,b", "eor x0,b", "sub x0,b", "cmp x0,b", "and x0,b", "cmpm x0,b",
                    293:        "add y0,a", "tfr y0,a", "or y0,a", "eor y0,a", "sub y0,a", "cmp y0,a", "and y0,a", "cmpm y0,a",
                    294:        "add y0,b", "tfr y0,b", "or y0,b", "eor y0,b", "sub y0,b", "cmp y0,b", "and y0,b", "cmpm y0,b",
                    295:        "add x1,a", "tfr x1,a", "or x1,a", "eor x1,a", "sub x1,a", "cmp x1,a", "and x1,a", "cmpm x1,a",
                    296:        "add x1,b", "tfr x1,b", "or x1,b", "eor x1,b", "sub x1,b", "cmp x1,b", "and x1,b", "cmpm x1,b",
                    297:        "add y1,a", "tfr y1,a", "or y1,a", "eor y1,a", "sub y1,a", "cmp y1,a", "and y1,a", "cmpm y1,a",
                    298:        "add y1,b", "tfr y1,b", "or y1,b", "eor y1,b", "sub y1,b", "cmp y1,b", "and y1,b", "cmpm y1,b",
1.1.1.3   root      299: 
                    300:        /* 0x80 - 0xbf */
1.1.1.5   root      301:        "mpy +x0,x0,a", "mpyr +x0,x0,a", "mac +x0,x0,a", "macr +x0,x0,a", "mpy -x0,x0,a", "mpyr -x0,x0,a", "mac -x0,x0,a", "macr -x0,x0,a",
                    302:        "mpy +x0,x0,b", "mpyr +x0,x0,b", "mac +x0,x0,b", "macr +x0,x0,b", "mpy -x0,x0,b", "mpyr -x0,x0,b", "mac -x0,x0,b", "macr -x0,x0,b",
                    303:        "mpy +y0,y0,a", "mpyr +y0,y0,a", "mac +y0,y0,a", "macr +y0,y0,a", "mpy -y0,y0,a", "mpyr -y0,y0,a", "mac -y0,y0,a", "macr -y0,y0,a",
                    304:        "mpy +y0,y0,b", "mpyr +y0,y0,b", "mac +y0,y0,b", "macr +y0,y0,b", "mpy -y0,y0,b", "mpyr -y0,y0,b", "mac -y0,y0,b", "macr -y0,y0,b",
                    305:        "mpy +x1,x0,a", "mpyr +x1,x0,a", "mac +x1,x0,a", "macr +x1,x0,a", "mpy -x1,x0,a", "mpyr -x1,x0,a", "mac -x1,x0,a", "macr -x1,x0,a",
                    306:        "mpy +x1,x0,b", "mpyr +x1,x0,b", "mac +x1,x0,b", "macr +x1,x0,b", "mpy -x1,x0,b", "mpyr -x1,x0,b", "mac -x1,x0,b", "macr -x1,x0,b",
                    307:        "mpy +y1,y0,a", "mpyr +y1,y0,a", "mac +y1,y0,a", "macr +y1,y0,a", "mpy -y1,y0,a", "mpyr -y1,y0,a", "mac -y1,y0,a", "macr -y1,y0,a",
                    308:        "mpy +y1,y0,b", "mpyr +y1,y0,b", "mac +y1,y0,b", "macr +y1,y0,b", "mpy -y1,y0,b", "mpyr -y1,y0,b", "mac -y1,y0,b", "macr -y1,y0,b",
1.1.1.3   root      309: 
                    310:        /* 0xc0 - 0xff */
1.1.1.5   root      311:        "mpy +x0,y1,a", "mpyr +x0,y1,a", "mac +x0,y1,a", "macr +x0,y1,a", "mpy -x0,y1,a", "mpyr -x0,y1,a", "mac -x0,y1,a", "macr -x0,y1,a",
                    312:        "mpy +x0,y1,b", "mpyr +x0,y1,b", "mac +x0,y1,b", "macr +x0,y1,b", "mpy -x0,y1,b", "mpyr -x0,y1,b", "mac -x0,y1,b", "macr -x0,y1,b",
                    313:        "mpy +y0,x0,a", "mpyr +y0,x0,a", "mac +y0,x0,a", "macr +y0,x0,a", "mpy -y0,x0,a", "mpyr -y0,x0,a", "mac -y0,x0,a", "macr -y0,x0,a",
                    314:        "mpy +y0,x0,b", "mpyr +y0,x0,b", "mac +y0,x0,b", "macr +y0,x0,b", "mpy -y0,x0,b", "mpyr -y0,x0,b", "mac -y0,x0,b", "macr -y0,x0,b",
                    315:        "mpy +x1,y0,a", "mpyr +x1,y0,a", "mac +x1,y0,a", "macr +x1,y0,a", "mpy -x1,y0,a", "mpyr -x1,y0,a", "mac -x1,y0,a", "macr -x1,y0,a",
                    316:        "mpy +x1,y0,b", "mpyr +x1,y0,b", "mac +x1,y0,b", "macr +x1,y0,b", "mpy -x1,y0,b", "mpyr -x1,y0,b", "mac -x1,y0,b", "macr -x1,y0,b",
                    317:        "mpy +y1,x1,a", "mpyr +y1,x1,a", "mac +y1,x1,a", "macr +y1,x1,a", "mpy -y1,x1,a", "mpyr -y1,x1,a", "mac -y1,x1,a", "macr -y1,x1,a",
                    318:        "mpy +y1,x1,b", "mpyr +y1,x1,b", "mac +y1,x1,b", "macr +y1,x1,b", "mpy -y1,x1,b", "mpyr -y1,x1,b", "mac -y1,x1,b", "macr -y1,x1,b"
1.1       root      319: };
                    320: 
                    321: 
1.1.1.5   root      322: 
                    323: static const dsp_emul_t opcodes_parmove[16] = {
1.1       root      324:        dsp_pm_0,
                    325:        dsp_pm_1,
                    326:        dsp_pm_2,
                    327:        dsp_pm_2,
                    328:        dsp_pm_4,
                    329:        dsp_pm_4,
                    330:        dsp_pm_4,
                    331:        dsp_pm_4,
                    332: 
                    333:        dsp_pm_8,
                    334:        dsp_pm_8,
                    335:        dsp_pm_8,
                    336:        dsp_pm_8,
                    337:        dsp_pm_8,
                    338:        dsp_pm_8,
                    339:        dsp_pm_8,
                    340:        dsp_pm_8
                    341: };
                    342: 
1.1.1.5   root      343: static const int registers_tcc[16][2] = {
1.1       root      344:        {DSP_REG_B,DSP_REG_A},
                    345:        {DSP_REG_A,DSP_REG_B},
                    346:        {DSP_REG_NULL,DSP_REG_NULL},
                    347:        {DSP_REG_NULL,DSP_REG_NULL},
                    348: 
                    349:        {DSP_REG_NULL,DSP_REG_NULL},
                    350:        {DSP_REG_NULL,DSP_REG_NULL},
                    351:        {DSP_REG_NULL,DSP_REG_NULL},
                    352:        {DSP_REG_NULL,DSP_REG_NULL},
                    353: 
                    354:        {DSP_REG_X0,DSP_REG_A},
                    355:        {DSP_REG_X0,DSP_REG_B},
                    356:        {DSP_REG_Y0,DSP_REG_A},
                    357:        {DSP_REG_Y0,DSP_REG_B},
1.1.1.2   root      358: 
                    359:        {DSP_REG_X1,DSP_REG_A},
                    360:        {DSP_REG_X1,DSP_REG_B},
1.1       root      361:        {DSP_REG_Y1,DSP_REG_A},
                    362:        {DSP_REG_Y1,DSP_REG_B}
                    363: };
                    364: 
1.1.1.5   root      365: static const char *registers_lmove[8] = {
1.1       root      366:        "a10",
                    367:        "b10",
                    368:        "x",
                    369:        "y",
                    370:        "a",
                    371:        "b",
                    372:        "ab",
                    373:        "ba"
                    374: };
                    375: 
1.1.1.5   root      376: static const char *ea_names[9] = {
1.1       root      377:        "(r%d)-n%d",    /* 000xxx */
                    378:        "(r%d)+n%d",    /* 001xxx */
                    379:        "(r%d)-",               /* 010xxx */
                    380:        "(r%d)+",               /* 011xxx */
                    381:        "(r%d)",                /* 100xxx */
                    382:        "(r%d+n%d)",    /* 101xxx */
1.1.1.5   root      383:        "$%04x",                /* 110000 */
1.1       root      384:        "-(r%d)",               /* 111xxx */
1.1.1.5   root      385:        "$%06x"         /* 110100 */
1.1       root      386: };
                    387: 
1.1.1.5   root      388: static const char *cc_name[16] = {
1.1       root      389:        "cc",
                    390:        "ge",
                    391:        "ne",
                    392:        "pl",
                    393:        "nn",
                    394:        "ec",
                    395:        "lc",
                    396:        "gt",
                    397:        
                    398:        "cs",
                    399:        "lt",
                    400:        "eq",
                    401:        "mi",
                    402:        "nr",
                    403:        "es",
                    404:        "ls",
                    405:        "le"
                    406: };
                    407: 
1.1.1.4   root      408: void dsp56k_disasm_reg_save(void)
                    409: {
1.1.1.5   root      410:        memcpy(registers_save, dsp_core.registers , sizeof(registers_save));
1.1.1.4   root      411: #if DSP_DISASM_REG_PC
1.1.1.5   root      412:        pc_save = dsp_core.pc;
1.1.1.4   root      413: #endif
                    414: }
                    415: 
                    416: void dsp56k_disasm_reg_compare(void)
                    417: {
                    418:        int i;
1.1.1.5   root      419:        bool bRegA = false;
                    420:        bool bRegB = false;
1.1.1.4   root      421:        
1.1.1.5   root      422:        for (i=4; i<64; i++) {
                    423:                if (registers_save[i] == dsp_core.registers[i]) {
1.1.1.4   root      424:                        continue;
                    425:                }
                    426: 
                    427:                switch(i) {
                    428:                        case DSP_REG_X0:
                    429:                        case DSP_REG_X1:
                    430:                        case DSP_REG_Y0:
                    431:                        case DSP_REG_Y1:
1.1.1.5   root      432:                                fprintf(stderr,"\tReg: %s  $%06x -> $%06x\n", registers_name[i], registers_save[i], dsp_core.registers[i]);
1.1.1.4   root      433:                                break;
                    434:                        case DSP_REG_R0:
                    435:                        case DSP_REG_R1:
                    436:                        case DSP_REG_R2:
                    437:                        case DSP_REG_R3:
                    438:                        case DSP_REG_R4:
                    439:                        case DSP_REG_R5:
                    440:                        case DSP_REG_R6:
                    441:                        case DSP_REG_R7:
                    442:                        case DSP_REG_M0:
                    443:                        case DSP_REG_M1:
                    444:                        case DSP_REG_M2:
                    445:                        case DSP_REG_M3:
                    446:                        case DSP_REG_M4:
                    447:                        case DSP_REG_M5:
                    448:                        case DSP_REG_M6:
                    449:                        case DSP_REG_M7:
                    450:                        case DSP_REG_N0:
                    451:                        case DSP_REG_N1:
                    452:                        case DSP_REG_N2:
                    453:                        case DSP_REG_N3:
                    454:                        case DSP_REG_N4:
                    455:                        case DSP_REG_N5:
                    456:                        case DSP_REG_N6:
                    457:                        case DSP_REG_N7:
                    458:                        case DSP_REG_SR:
                    459:                        case DSP_REG_LA:
                    460:                        case DSP_REG_LC:
1.1.1.5   root      461:                                fprintf(stderr,"\tReg: %s  $%04x -> $%04x\n", registers_name[i], registers_save[i], dsp_core.registers[i]);
1.1.1.4   root      462:                                break;
                    463:                        case DSP_REG_OMR:
                    464:                        case DSP_REG_SP:
                    465:                        case DSP_REG_SSH:
                    466:                        case DSP_REG_SSL:
1.1.1.5   root      467:                                fprintf(stderr,"\tReg: %s  $%02x -> $%02x\n", registers_name[i], registers_save[i], dsp_core.registers[i]);
1.1.1.4   root      468:                                break;
1.1.1.5   root      469:                        case DSP_REG_A0:
                    470:                        case DSP_REG_A1:
                    471:                        case DSP_REG_A2:
                    472:                                if (bRegA == false) {
                    473:                                        fprintf(stderr,"\tReg: a   $%02x:%06x:%06x -> $%02x:%06x:%06x\n",
                    474:                                                registers_save[DSP_REG_A2],     registers_save[DSP_REG_A1],     registers_save[DSP_REG_A0],
                    475:                                                dsp_core.registers[DSP_REG_A2], dsp_core.registers[DSP_REG_A1], dsp_core.registers[DSP_REG_A0]
1.1.1.4   root      476:                                        );
1.1.1.5   root      477:                                        bRegA = true;
                    478:                                }
                    479:                                break;
                    480:                        case DSP_REG_B0:
                    481:                        case DSP_REG_B1:
                    482:                        case DSP_REG_B2:
                    483:                                if (bRegB == false) {
                    484:                                        fprintf(stderr,"\tReg: b   $%02x:%06x:%06x -> $%02x:%06x:%06x\n",
                    485:                                                registers_save[DSP_REG_B2],     registers_save[DSP_REG_B1],     registers_save[DSP_REG_B0],
                    486:                                                dsp_core.registers[DSP_REG_B2], dsp_core.registers[DSP_REG_B1], dsp_core.registers[DSP_REG_B0]
                    487:                                        );
                    488:                                        bRegB = true;
1.1.1.4   root      489:                                }
                    490:                                break;
                    491:                }
                    492:        }
                    493: 
                    494: #if DSP_DISASM_REG_PC
1.1.1.5   root      495:        if (pc_save != dsp_core.pc) {
                    496:                fprintf(stderr,"\tReg: pc  $%04x -> $%04x\n", pc_save, dsp_core.pc);
1.1.1.4   root      497:        }
                    498: #endif
                    499: }
1.1       root      500: 
1.1.1.5   root      501: Uint16 dsp56k_disasm(dsp_trace_disasm_t mode)
1.1       root      502: {
1.1.1.2   root      503:        Uint32 value;
1.1       root      504: 
1.1.1.5   root      505:        if (mode == DSP_TRACE_MODE) {
                    506:                isInDisasmMode = false;
                    507:                if (prev_inst_pc == dsp_core.pc) {
                    508:                        if (!isLooping) {
                    509:                                fprintf(stderr, "Looping on DSP instruction at PC = $%04x\n", prev_inst_pc);
                    510:                                isLooping = true;
                    511:                        }
                    512:                        return 0;
                    513:                }
                    514:        }
                    515:        else {
                    516:                isInDisasmMode = true;
1.1.1.3   root      517:        }
                    518: 
1.1.1.5   root      519:        prev_inst_pc = dsp_core.pc;
                    520:        isLooping = false;
                    521: 
                    522:        cur_inst = read_memory(dsp_core.pc);
1.1.1.3   root      523:        disasm_cur_inst_len = 1;
1.1       root      524: 
                    525:        strcpy(parallelmove_name, "");
                    526: 
1.1.1.3   root      527:        if (cur_inst < 0x100000) {
                    528:                value = (cur_inst >> 11) & (BITMASK(6) << 3);
                    529:                value += (cur_inst >> 5) & BITMASK(3);
1.1       root      530:                opcodes8h[value]();
                    531:        } else {
                    532:                dsp_pm();
1.1.1.5   root      533:                sprintf(str_instr, "%s %s", opcodes_alu[cur_inst & BITMASK(8)], parallelmove_name);
1.1.1.3   root      534:        }
                    535:        return disasm_cur_inst_len;
1.1       root      536: }
                    537: 
1.1.1.4   root      538: /**
                    539:  * dsp56k_getInstrText : return the disasembled instructions
                    540:  */
1.1.1.5   root      541: const char* dsp56k_getInstructionText(void)
1.1.1.4   root      542: {
1.1.1.6   root      543:        const int len = sizeof(str_instr);
1.1.1.7 ! root      544:        Uint64 count, cycles;
        !           545:        Uint16 cycle_diff;
        !           546:        float percentage;
1.1.1.6   root      547:        int offset;
                    548: 
1.1.1.4   root      549:        if (isLooping) {
                    550:                *str_instr2 = 0;
                    551:        }
1.1.1.6   root      552:        if (disasm_cur_inst_len == 1) {
                    553:                offset = sprintf(str_instr2, "p:%04x  %06x         (%02d cyc)  %-*s\n", prev_inst_pc, cur_inst, dsp_core.instr_cycle, len, str_instr);
                    554:        } else {
                    555:                offset = sprintf(str_instr2, "p:%04x  %06x %06x  (%02d cyc)  %-*s\n", prev_inst_pc, cur_inst, read_memory(prev_inst_pc + 1), dsp_core.instr_cycle, len, str_instr);
                    556:        }
1.1.1.7 ! root      557:        if (offset > 2 && Profile_DspAddressData(prev_inst_pc, &percentage, &count, &cycles, &cycle_diff)) {
1.1.1.6   root      558:                offset -= 2;
1.1.1.7 ! root      559:                sprintf(str_instr2+offset, "%5.2f%% (%"PRId64", %"PRId64", %d)\n",
        !           560:                        percentage, count, cycles, cycle_diff);
1.1.1.4   root      561:        }
                    562:        return str_instr2;
                    563: } 
                    564: 
1.1.1.3   root      565: static void dsp_pm_class2(void) {
                    566:        dsp_pm();
1.1.1.5   root      567:        sprintf(str_instr, "%s %s", opcodes_alu[cur_inst & BITMASK(8)], parallelmove_name);
1.1.1.3   root      568: } 
                    569: 
1.1.1.2   root      570: static Uint32 read_memory(Uint32 currPc)
                    571: {
                    572:        Uint32 value;
                    573: 
                    574:        if (currPc<0x200) {
1.1.1.5   root      575:                value = dsp_core.ramint[DSP_SPACE_P][currPc];
1.1.1.2   root      576:        } else {
1.1.1.5   root      577:                value = dsp_core.ramext[currPc & (DSP_RAMSIZE-1)];
1.1.1.2   root      578:        }
                    579: 
                    580:        return value & BITMASK(24);
                    581: }
                    582: 
1.1       root      583: /**********************************
                    584:  *     Conditions code calculation
                    585:  **********************************/
                    586: 
1.1.1.2   root      587: static void dsp_calc_cc(Uint32 cc_mode, char *dest)
1.1       root      588: {
                    589:        strcpy(dest, cc_name[cc_mode & BITMASK(4)]);
                    590: }
                    591: 
                    592: /**********************************
                    593:  *     Effective address calculation
                    594:  **********************************/
                    595: 
1.1.1.2   root      596: static int dsp_calc_ea(Uint32 ea_mode, char *dest)
1.1       root      597: {
                    598:        int value, retour, numreg;
                    599: 
                    600:        value = (ea_mode >> 3) & BITMASK(3);
                    601:        numreg = ea_mode & BITMASK(3);
                    602:        retour = 0;
                    603:        switch (value) {
                    604:                case 0:
                    605:                        /* (Rx)-Nx */
                    606:                        sprintf(dest, ea_names[value], numreg, numreg);
                    607:                        break;
                    608:                case 1:
                    609:                        /* (Rx)+Nx */
                    610:                        sprintf(dest, ea_names[value], numreg, numreg);
                    611:                        break;
                    612:                case 5:
                    613:                        /* (Rx+Nx) */
                    614:                        sprintf(dest, ea_names[value], numreg, numreg);
                    615:                        break;
                    616:                case 2:
                    617:                        /* (Rx)- */
                    618:                        sprintf(dest, ea_names[value], numreg);
                    619:                        break;
                    620:                case 3:
                    621:                        /* (Rx)+ */
                    622:                        sprintf(dest, ea_names[value], numreg);
                    623:                        break;
                    624:                case 4:
                    625:                        /* (Rx) */
                    626:                        sprintf(dest, ea_names[value], numreg);
                    627:                        break;
                    628:                case 7:
                    629:                        /* -(Rx) */
                    630:                        sprintf(dest, ea_names[value], numreg);
                    631:                        break;
                    632:                case 6:
1.1.1.3   root      633:                        disasm_cur_inst_len++;
1.1       root      634:                        switch ((ea_mode >> 2) & 1) {
                    635:                                case 0:
                    636:                                        /* Absolute address */
1.1.1.5   root      637:                                        sprintf(dest, ea_names[value], read_memory(dsp_core.pc+1));
1.1       root      638:                                        break;
                    639:                                case 1:
                    640:                                        /* Immediate value */
1.1.1.5   root      641:                                        sprintf(dest, ea_names[8], read_memory(dsp_core.pc+1));
1.1       root      642:                                        retour = 1;
                    643:                                        break;
                    644:                        }
                    645:                        break;
                    646:        }
                    647:        return retour;
                    648: }
                    649: 
                    650: static void opcode8h_0(void)
                    651: {
1.1.1.3   root      652:        switch(cur_inst) {
                    653:                case 0x000000:
                    654:                        dsp_nop();
1.1       root      655:                        break;
1.1.1.3   root      656:                case 0x000004:
                    657:                        dsp_rti();
1.1       root      658:                        break;
1.1.1.3   root      659:                case 0x000005:
                    660:                        dsp_illegal();
1.1       root      661:                        break;
1.1.1.3   root      662:                case 0x000006:
                    663:                        dsp_swi();
                    664:                        break;
                    665:                case 0x00000c:
                    666:                        dsp_rts();
                    667:                        break;
                    668:                case 0x000084:
                    669:                        dsp_reset();
                    670:                        break;
                    671:                case 0x000086:
                    672:                        dsp_wait();
                    673:                        break;
                    674:                case 0x000087:
                    675:                        dsp_stop();
                    676:                        break;
                    677:                case 0x00008c:
                    678:                        dsp_enddo();
1.1       root      679:                        break;
                    680:        }
                    681: }
                    682: 
                    683: /**********************************
                    684:  *     Non-parallel moves instructions
                    685:  **********************************/
                    686: 
                    687: static void dsp_undefined(void)
                    688: {
1.1.1.5   root      689:        /* In Disasm mode, display dc instruction_opcode */
                    690:        if (isInDisasmMode)
                    691:                sprintf(str_instr, "dc $%06x", cur_inst);
                    692:        /* In trace mode, display unknown instruction */
                    693:        else
                    694:                sprintf(str_instr, "$%06x unknown instruction", cur_inst);
1.1       root      695: }
                    696: 
                    697: static void dsp_andi(void)
                    698: {
                    699:        switch(cur_inst & BITMASK(2)) {
                    700:                case 0:
1.1.1.5   root      701:                        sprintf(str_instr, "andi #$%02x,mr", (cur_inst>>8) & BITMASK(8));
1.1       root      702:                        break;
                    703:                case 1:
1.1.1.5   root      704:                        sprintf(str_instr, "andi #$%02x,ccr", (cur_inst>>8) & BITMASK(8));
1.1       root      705:                        break;
                    706:                case 2:
1.1.1.5   root      707:                        sprintf(str_instr, "andi #$%02x,omr", (cur_inst>>8) & BITMASK(8));
1.1       root      708:                        break;
                    709:                default:
                    710:                        break;
                    711:        }
                    712: }
                    713: 
1.1.1.3   root      714: static void dsp_bchg_aa(void)
                    715: {
                    716:        /* bchg #n,x:aa */
                    717:        /* bchg #n,y:aa */
                    718:        char name[16];
                    719:        Uint32 memspace, value, numbit;
                    720:        
                    721:        memspace = (cur_inst>>6) & 1;
                    722:        value = (cur_inst>>8) & BITMASK(6);
                    723:        numbit = cur_inst & BITMASK(5);
                    724: 
                    725:        if (memspace) {
1.1.1.5   root      726:                sprintf(name,"y:$%04x",value);
1.1.1.3   root      727:        } else {
1.1.1.5   root      728:                sprintf(name,"x:$%04x",value);
1.1.1.3   root      729:        }
                    730: 
1.1.1.4   root      731:        sprintf(str_instr,"bchg #%d,%s", numbit, name);
1.1.1.3   root      732: }
                    733: 
                    734: static void dsp_bchg_ea(void)
1.1       root      735: {
1.1.1.3   root      736:        /* bchg #n,x:ea */
                    737:        /* bchg #n,y:ea */
1.1       root      738:        char name[16], addr_name[16];
1.1.1.2   root      739:        Uint32 memspace, value, numbit;
1.1       root      740:        
                    741:        memspace = (cur_inst>>6) & 1;
                    742:        value = (cur_inst>>8) & BITMASK(6);
                    743:        numbit = cur_inst & BITMASK(5);
                    744: 
1.1.1.3   root      745:        dsp_calc_ea(value, addr_name);
                    746:        if (memspace) {
                    747:                sprintf(name,"y:%s",addr_name);
                    748:        } else {
                    749:                sprintf(name,"x:%s",addr_name);
                    750:        }
                    751: 
1.1.1.4   root      752:        sprintf(str_instr,"bchg #%d,%s", numbit, name);
1.1.1.3   root      753: }
                    754: 
                    755: static void dsp_bchg_pp(void)
                    756: {
                    757:        /* bchg #n,x:pp */
                    758:        /* bchg #n,y:pp */
                    759:        char name[16];
                    760:        Uint32 memspace, value, numbit;
                    761:        
                    762:        memspace = (cur_inst>>6) & 1;
                    763:        value = (cur_inst>>8) & BITMASK(6);
                    764:        numbit = cur_inst & BITMASK(5);
                    765: 
                    766:        if (memspace) {
1.1.1.5   root      767:                sprintf(name,"y:$%04x",value+0xffc0);
1.1.1.3   root      768:        } else {
1.1.1.5   root      769:                sprintf(name,"x:$%04x",value+0xffc0);
1.1       root      770:        }
1.1.1.3   root      771: 
1.1.1.4   root      772:        sprintf(str_instr,"bchg #%d,%s", numbit, name);
1.1.1.3   root      773: }
                    774: 
                    775: static void dsp_bchg_reg(void)
                    776: {
                    777:        /* bchg #n,R */
1.1.1.4   root      778:        Uint32 value, numbit;
1.1.1.3   root      779:        
                    780:        value = (cur_inst>>8) & BITMASK(6);
                    781:        numbit = cur_inst & BITMASK(5);
1.1       root      782: 
1.1.1.4   root      783:        sprintf(str_instr,"bchg #%d,%s", numbit, registers_name[value]);
1.1       root      784: }
                    785: 
1.1.1.3   root      786: static void dsp_bclr_aa(void)
1.1       root      787: {
1.1.1.3   root      788:        /* bclr #n,x:aa */
                    789:        /* bclr #n,y:aa */
                    790:        char name[16];
1.1.1.2   root      791:        Uint32 memspace, value, numbit;
1.1       root      792:        
                    793:        memspace = (cur_inst>>6) & 1;
                    794:        value = (cur_inst>>8) & BITMASK(6);
                    795:        numbit = cur_inst & BITMASK(5);
                    796: 
1.1.1.3   root      797:        if (memspace) {
1.1.1.5   root      798:                sprintf(name,"y:$%04x",value);
1.1.1.3   root      799:        } else {
1.1.1.5   root      800:                sprintf(name,"x:$%04x",value);
1.1       root      801:        }
                    802: 
1.1.1.4   root      803:        sprintf(str_instr,"bclr #%d,%s", numbit, name);
1.1       root      804: }
                    805: 
1.1.1.3   root      806: static void dsp_bclr_ea(void)
1.1       root      807: {
1.1.1.3   root      808:        /* bclr #n,x:ea */
                    809:        /* bclr #n,y:ea */
1.1       root      810:        char name[16], addr_name[16];
1.1.1.2   root      811:        Uint32 memspace, value, numbit;
1.1       root      812:        
                    813:        memspace = (cur_inst>>6) & 1;
                    814:        value = (cur_inst>>8) & BITMASK(6);
                    815:        numbit = cur_inst & BITMASK(5);
                    816: 
1.1.1.3   root      817:        dsp_calc_ea(value, addr_name);
                    818:        if (memspace) {
                    819:                sprintf(name,"y:%s",addr_name);
                    820:        } else {
                    821:                sprintf(name,"x:%s",addr_name);
1.1       root      822:        }
                    823: 
1.1.1.4   root      824:        sprintf(str_instr,"bclr #%d,%s", numbit, name);
1.1       root      825: }
                    826: 
1.1.1.3   root      827: static void dsp_bclr_pp(void)
1.1       root      828: {
1.1.1.3   root      829:        /* bclr #n,x:pp */
                    830:        /* bclr #n,y:pp */
                    831:        char name[16];
1.1.1.2   root      832:        Uint32 memspace, value, numbit;
1.1       root      833:        
                    834:        memspace = (cur_inst>>6) & 1;
                    835:        value = (cur_inst>>8) & BITMASK(6);
                    836:        numbit = cur_inst & BITMASK(5);
                    837: 
1.1.1.3   root      838:        if (memspace) {
1.1.1.5   root      839:                sprintf(name,"y:$%04x",value+0xffc0);
1.1.1.3   root      840:        } else {
1.1.1.5   root      841:                sprintf(name,"x:$%04x",value+0xffc0);
1.1       root      842:        }
                    843: 
1.1.1.4   root      844:        sprintf(str_instr,"bclr #%d,%s", numbit, name);
1.1       root      845: }
                    846: 
1.1.1.3   root      847: static void dsp_bclr_reg(void)
1.1       root      848: {
1.1.1.3   root      849:        /* bclr #n,R */
1.1.1.4   root      850:        Uint32 value, numbit;
1.1       root      851:        
1.1.1.3   root      852:        value = (cur_inst>>8) & BITMASK(6);
                    853:        numbit = cur_inst & BITMASK(5);
                    854: 
1.1.1.4   root      855:        sprintf(str_instr,"bclr #%d,%s", numbit, registers_name[value]);
1.1.1.3   root      856: }
                    857: 
                    858: static void dsp_bset_aa(void)
                    859: {
                    860:        /* bset #n,x:aa */
                    861:        /* bset #n,y:aa */
                    862:        char name[16];
                    863:        Uint32 memspace, value, numbit;
                    864:        
                    865:        memspace = (cur_inst>>6) & 1;
                    866:        value = (cur_inst>>8) & BITMASK(6);
                    867:        numbit = cur_inst & BITMASK(5);
                    868: 
                    869:        if (memspace) {
1.1.1.5   root      870:                sprintf(name,"y:$%04x",value);
1.1.1.3   root      871:        } else {
1.1.1.5   root      872:                sprintf(name,"x:$%04x",value);
1.1       root      873:        }
1.1.1.3   root      874: 
1.1.1.4   root      875:        sprintf(str_instr,"bset #%d,%s", numbit, name);
1.1.1.3   root      876: }
                    877: 
                    878: static void dsp_bset_ea(void)
                    879: {
                    880:        /* bset #n,x:ea */
                    881:        /* bset #n,y:ea */
                    882:        char name[16], addr_name[16];
                    883:        Uint32 memspace, value, numbit;
                    884:        
                    885:        memspace = (cur_inst>>6) & 1;
                    886:        value = (cur_inst>>8) & BITMASK(6);
                    887:        numbit = cur_inst & BITMASK(5);
                    888: 
                    889:        dsp_calc_ea(value, addr_name);
                    890:        if (memspace) {
                    891:                sprintf(name,"y:%s",addr_name);
                    892:        } else {
                    893:                sprintf(name,"x:%s",addr_name);
                    894:        }
                    895: 
1.1.1.4   root      896:        sprintf(str_instr,"bset #%d,%s", numbit, name);
1.1.1.3   root      897: }
                    898: 
                    899: static void dsp_bset_pp(void)
                    900: {
                    901:        /* bset #n,x:pp */
                    902:        /* bset #n,y:pp */
                    903:        char name[16];
                    904:        Uint32 memspace, value, numbit;
                    905:        
                    906:        memspace = (cur_inst>>6) & 1;
                    907:        value = (cur_inst>>8) & BITMASK(6);
                    908:        numbit = cur_inst & BITMASK(5);
                    909: 
                    910:        if (memspace) {
1.1.1.5   root      911:                sprintf(name,"y:$%04x",value+0xffc0);
1.1.1.3   root      912:        } else {
1.1.1.5   root      913:                sprintf(name,"x:$%04x",value+0xffc0);
1.1.1.3   root      914:        }
                    915: 
1.1.1.4   root      916:        sprintf(str_instr,"bset #%d,%s", numbit, name);
1.1.1.3   root      917: }
                    918: 
                    919: static void dsp_bset_reg(void)
                    920: {
                    921:        /* bset #n,R */
1.1.1.4   root      922:        Uint32 value, numbit;
1.1.1.3   root      923:        
                    924:        value = (cur_inst>>8) & BITMASK(6);
                    925:        numbit = cur_inst & BITMASK(5);
                    926: 
1.1.1.4   root      927:        sprintf(str_instr,"bset #%d,%s", numbit, registers_name[value]);
1.1.1.3   root      928: }
                    929: 
                    930: static void dsp_btst_aa(void)
                    931: {
                    932:        /* btst #n,x:aa */
                    933:        /* btst #n,y:aa */
                    934:        char name[16];
                    935:        Uint32 memspace, value, numbit;
                    936:        
                    937:        memspace = (cur_inst>>6) & 1;
                    938:        value = (cur_inst>>8) & BITMASK(6);
                    939:        numbit = cur_inst & BITMASK(5);
                    940: 
                    941:        if (memspace) {
1.1.1.5   root      942:                sprintf(name,"y:$%04x",value);
1.1.1.3   root      943:        } else {
1.1.1.5   root      944:                sprintf(name,"x:$%04x",value);
1.1.1.3   root      945:        }
                    946: 
1.1.1.4   root      947:        sprintf(str_instr,"btst #%d,%s", numbit, name);
1.1.1.3   root      948: }
                    949: 
                    950: static void dsp_btst_ea(void)
                    951: {
                    952:        /* btst #n,x:ea */
                    953:        /* btst #n,y:ea */
                    954:        char name[16], addr_name[16];
                    955:        Uint32 memspace, value, numbit;
                    956:        
                    957:        memspace = (cur_inst>>6) & 1;
                    958:        value = (cur_inst>>8) & BITMASK(6);
                    959:        numbit = cur_inst & BITMASK(5);
                    960: 
                    961:        dsp_calc_ea(value, addr_name);
                    962:        if (memspace) {
                    963:                sprintf(name,"y:%s",addr_name);
                    964:        } else {
                    965:                sprintf(name,"x:%s",addr_name);
                    966:        }
                    967: 
1.1.1.4   root      968:        sprintf(str_instr,"btst #%d,%s", numbit, name);
1.1.1.3   root      969: }
                    970: 
                    971: static void dsp_btst_pp(void)
                    972: {
                    973:        /* btst #n,x:pp */
                    974:        /* btst #n,y:pp */
                    975:        char name[16];
                    976:        Uint32 memspace, value, numbit;
                    977:        
                    978:        memspace = (cur_inst>>6) & 1;
                    979:        value = (cur_inst>>8) & BITMASK(6);
                    980:        numbit = cur_inst & BITMASK(5);
                    981: 
                    982:        if (memspace) {
1.1.1.5   root      983:                sprintf(name,"y:$%04x",value+0xffc0);
1.1.1.3   root      984:        } else {
1.1.1.5   root      985:                sprintf(name,"x:$%04x",value+0xffc0);
1.1.1.3   root      986:        }
                    987: 
1.1.1.4   root      988:        sprintf(str_instr,"btst #%d,%s", numbit, name);
1.1.1.3   root      989: }
                    990: 
                    991: static void dsp_btst_reg(void)
                    992: {
                    993:        /* btst #n,R */
1.1.1.4   root      994:        Uint32 value, numbit;
1.1.1.3   root      995:        
                    996:        value = (cur_inst>>8) & BITMASK(6);
                    997:        numbit = cur_inst & BITMASK(5);
                    998: 
1.1.1.4   root      999:        sprintf(str_instr,"btst #%d,%s", numbit, registers_name[value]);
1.1.1.3   root     1000: }
                   1001: 
                   1002: static void dsp_div(void)
                   1003: {
                   1004:        Uint32 srcreg=DSP_REG_NULL, destreg;
                   1005:        
                   1006:        switch((cur_inst>>4) & BITMASK(2)) {
                   1007:                case 0:
                   1008:                        srcreg = DSP_REG_X0;
                   1009:                                break;
                   1010:                case 1:
                   1011:                        srcreg = DSP_REG_Y0;
                   1012:                                break;
                   1013:                case 2:
                   1014:                        srcreg = DSP_REG_X1;
                   1015:                                break;
                   1016:                case 3:
                   1017:                        srcreg = DSP_REG_Y1;
                   1018:                                break;
                   1019:        }
                   1020:        destreg = DSP_REG_A+((cur_inst>>3) & 1);
                   1021: 
1.1.1.4   root     1022:        sprintf(str_instr,"div %s,%s", registers_name[srcreg],registers_name[destreg]);
1.1.1.3   root     1023: }
                   1024: 
                   1025: static void dsp_do_aa(void)
                   1026: {
                   1027:        char name[16];
                   1028: 
                   1029:        disasm_cur_inst_len++;
                   1030: 
                   1031:        if (cur_inst & (1<<6)) {
1.1.1.5   root     1032:                sprintf(name, "y:$%04x", (cur_inst>>8) & BITMASK(6));
1.1.1.3   root     1033:        } else {
1.1.1.5   root     1034:                sprintf(name, "x:$%04x", (cur_inst>>8) & BITMASK(6));
1.1.1.3   root     1035:        }
                   1036: 
1.1.1.5   root     1037:        sprintf(str_instr,"do %s,p:$%04x",
1.1.1.3   root     1038:                name,
1.1.1.5   root     1039:                read_memory(dsp_core.pc+1)
1.1.1.3   root     1040:        );
1.1.1.4   root     1041: }
1.1.1.3   root     1042: 
                   1043: static void dsp_do_imm(void)
                   1044: {
                   1045:        disasm_cur_inst_len++;
                   1046: 
1.1.1.5   root     1047:        sprintf(str_instr,"do #$%04x,p:$%04x",
1.1.1.3   root     1048:                ((cur_inst>>8) & BITMASK(8))|((cur_inst & BITMASK(4))<<8),
1.1.1.5   root     1049:                read_memory(dsp_core.pc+1)
1.1.1.3   root     1050:        );
1.1.1.4   root     1051: }
1.1.1.3   root     1052: 
                   1053: static void dsp_do_ea(void)
                   1054: {
                   1055:        char addr_name[16], name[16];
                   1056:        Uint32 ea_mode;
                   1057:        
                   1058:        disasm_cur_inst_len++;
                   1059: 
                   1060:        ea_mode = (cur_inst>>8) & BITMASK(6);
                   1061:        dsp_calc_ea(ea_mode, addr_name);
                   1062: 
                   1063:        if (cur_inst & (1<<6)) {
                   1064:                sprintf(name, "y:%s", addr_name);
                   1065:        } else {
                   1066:                sprintf(name, "x:%s", addr_name);
                   1067:        }
                   1068: 
1.1.1.5   root     1069:        sprintf(str_instr,"do %s,p:$%04x", 
1.1.1.3   root     1070:                name,
1.1.1.5   root     1071:                read_memory(dsp_core.pc+1)
1.1.1.3   root     1072:        );
1.1.1.4   root     1073: }
1.1.1.3   root     1074: 
                   1075: static void dsp_do_reg(void)
                   1076: {
                   1077:        disasm_cur_inst_len++;
                   1078: 
1.1.1.5   root     1079:        sprintf(str_instr,"do %s,p:$%04x",
1.1.1.3   root     1080:                registers_name[(cur_inst>>8) & BITMASK(6)],
1.1.1.5   root     1081:                read_memory(dsp_core.pc+1)
1.1.1.3   root     1082:        );
1.1.1.4   root     1083: }
1.1.1.3   root     1084: 
                   1085: static void dsp_enddo(void)
                   1086: {
1.1.1.4   root     1087:        sprintf(str_instr,"enddo");
1.1.1.3   root     1088: }
                   1089: 
                   1090: static void dsp_illegal(void)
                   1091: {
1.1.1.4   root     1092:        sprintf(str_instr,"illegal");
1.1.1.3   root     1093: }
                   1094: 
                   1095: static void dsp_jcc_ea(void)
                   1096: {
                   1097:        char cond_name[16], addr_name[16];
                   1098:        Uint32 cc_code=0;
                   1099:        
                   1100:        dsp_calc_ea((cur_inst >>8) & BITMASK(6), addr_name);
                   1101:        cc_code=cur_inst & BITMASK(4);
                   1102:        dsp_calc_cc(cc_code, cond_name);        
                   1103: 
1.1.1.4   root     1104:        sprintf(str_instr,"j%s p:%s", cond_name, addr_name);
1.1.1.3   root     1105: }
                   1106: 
                   1107: static void dsp_jcc_imm(void)
                   1108: {
                   1109:        char cond_name[16], addr_name[16];
                   1110:        Uint32 cc_code=0;
                   1111:        
1.1.1.5   root     1112:        sprintf(addr_name, "$%04x", cur_inst & BITMASK(12));
1.1.1.3   root     1113:        cc_code=(cur_inst>>12) & BITMASK(4);
                   1114:        dsp_calc_cc(cc_code, cond_name);        
                   1115: 
1.1.1.4   root     1116:        sprintf(str_instr,"j%s p:%s", cond_name, addr_name);
1.1.1.3   root     1117: }
                   1118: 
                   1119: static void dsp_jclr_aa(void)
                   1120: {
                   1121:        /* jclr #n,x:aa,p:xx */
                   1122:        /* jclr #n,y:aa,p:xx */
                   1123:        char srcname[16];
                   1124:        Uint32 memspace, value, numbit;
                   1125:        
                   1126:        disasm_cur_inst_len++;
                   1127: 
                   1128:        memspace = (cur_inst>>6) & 1;
                   1129:        value = (cur_inst>>8) & BITMASK(6);
                   1130:        numbit = cur_inst & BITMASK(5);
                   1131: 
                   1132:        if (memspace) {
1.1.1.5   root     1133:                sprintf(srcname, "y:$%04x", value);
1.1.1.3   root     1134:        } else {
1.1.1.5   root     1135:                sprintf(srcname, "x:$%04x", value);
1.1.1.3   root     1136:        }
                   1137: 
1.1.1.5   root     1138:        sprintf(str_instr,"jclr #%d,%s,p:$%04x",
1.1.1.3   root     1139:                numbit,
                   1140:                srcname,
1.1.1.5   root     1141:                read_memory(dsp_core.pc+1)
1.1.1.3   root     1142:        );
                   1143: }
                   1144: 
                   1145: static void dsp_jclr_ea(void)
                   1146: {
                   1147:        /* jclr #n,x:ea,p:xx */
                   1148:        /* jclr #n,y:ea,p:xx */
                   1149:        char srcname[16], addr_name[16];
                   1150:        Uint32 memspace, value, numbit;
                   1151:        
                   1152:        disasm_cur_inst_len++;
                   1153: 
                   1154:        memspace = (cur_inst>>6) & 1;
                   1155:        value = (cur_inst>>8) & BITMASK(6);
                   1156:        numbit = cur_inst & BITMASK(5);
                   1157: 
                   1158:        dsp_calc_ea(value, addr_name);
                   1159:        if (memspace) {
                   1160:                sprintf(srcname, "y:%s", addr_name);
                   1161:        } else {
                   1162:                sprintf(srcname, "x:%s", addr_name);
                   1163:        }
                   1164: 
1.1.1.5   root     1165:        sprintf(str_instr,"jclr #%d,%s,p:$%04x",
1.1.1.3   root     1166:                numbit,
                   1167:                srcname,
1.1.1.5   root     1168:                read_memory(dsp_core.pc+1)
1.1.1.3   root     1169:        );
                   1170: }
                   1171: 
                   1172: static void dsp_jclr_pp(void)
                   1173: {
                   1174:        /* jclr #n,x:pp,p:xx */
                   1175:        /* jclr #n,y:pp,p:xx */
                   1176:        char srcname[16];
                   1177:        Uint32 memspace, value, numbit;
                   1178:        
                   1179:        disasm_cur_inst_len++;
                   1180: 
                   1181:        memspace = (cur_inst>>6) & 1;
                   1182:        value = (cur_inst>>8) & BITMASK(6);
                   1183:        numbit = cur_inst & BITMASK(5);
                   1184: 
                   1185:        value += 0xffc0;
                   1186:        if (memspace) {
1.1.1.5   root     1187:                sprintf(srcname, "y:$%04x", value);
1.1.1.3   root     1188:        } else {
1.1.1.5   root     1189:                sprintf(srcname, "x:$%04x", value);
1.1.1.3   root     1190:        }
                   1191: 
1.1.1.5   root     1192:        sprintf(str_instr,"jclr #%d,%s,p:$%04x",
1.1.1.3   root     1193:                numbit,
                   1194:                srcname,
1.1.1.5   root     1195:                read_memory(dsp_core.pc+1)
1.1.1.3   root     1196:        );
                   1197: }
                   1198: 
                   1199: static void dsp_jclr_reg(void)
                   1200: {
                   1201:        /* jclr #n,R,p:xx */
1.1.1.4   root     1202:        Uint32 value, numbit;
1.1.1.3   root     1203:        
                   1204:        disasm_cur_inst_len++;
                   1205: 
                   1206:        value = (cur_inst>>8) & BITMASK(6);
                   1207:        numbit = cur_inst & BITMASK(5);
                   1208: 
1.1.1.5   root     1209:        sprintf(str_instr,"jclr #%d,%s,p:$%04x",
1.1.1.3   root     1210:                numbit,
1.1.1.4   root     1211:                registers_name[value],
1.1.1.5   root     1212:                read_memory(dsp_core.pc+1)
1.1.1.3   root     1213:        );
                   1214: }
                   1215: 
                   1216: static void dsp_jmp_imm(void)
                   1217: {
1.1.1.5   root     1218:        sprintf(str_instr,"jmp p:$%04x", cur_inst & BITMASK(12));
1.1.1.3   root     1219: }
                   1220: 
                   1221: static void dsp_jmp_ea(void)
                   1222: {
                   1223:        char dstname[16];
                   1224: 
                   1225:        dsp_calc_ea((cur_inst >>8) & BITMASK(6), dstname);
                   1226: 
1.1.1.4   root     1227:        sprintf(str_instr,"jmp p:%s", dstname);
1.1.1.3   root     1228: }
                   1229: 
                   1230: static void dsp_jscc_ea(void)
                   1231: {
                   1232:        char cond_name[16], addr_name[16];
                   1233:        Uint32 cc_code=0;
                   1234:        
                   1235:        dsp_calc_ea((cur_inst>>8) & BITMASK(6), addr_name);
                   1236:        cc_code=cur_inst & BITMASK(4);
                   1237:        dsp_calc_cc(cc_code, cond_name);        
                   1238: 
1.1.1.4   root     1239:        sprintf(str_instr,"js%s p:%s", cond_name, addr_name);
1.1.1.3   root     1240: }
                   1241:        
                   1242: static void dsp_jscc_imm(void)
                   1243: {
                   1244:        char cond_name[16], addr_name[16];
                   1245:        Uint32 cc_code=0;
                   1246:        
1.1.1.5   root     1247:        sprintf(addr_name, "$%04x", cur_inst & BITMASK(12));
1.1.1.3   root     1248:        cc_code=(cur_inst>>12) & BITMASK(4);
                   1249:        dsp_calc_cc(cc_code, cond_name);        
                   1250: 
1.1.1.4   root     1251:        sprintf(str_instr,"js%s p:%s", cond_name, addr_name);
1.1.1.3   root     1252: }
                   1253: 
                   1254: static void dsp_jsclr_aa(void)
                   1255: {
                   1256:        /* jsclr #n,x:aa,p:xx */
                   1257:        /* jsclr #n,y:aa,p:xx */
                   1258:        char srcname[16];
                   1259:        Uint32 memspace, value, numbit;
                   1260:        
                   1261:        disasm_cur_inst_len++;
                   1262: 
                   1263:        memspace = (cur_inst>>6) & 1;
                   1264:        value = (cur_inst>>8) & BITMASK(6);
                   1265:        numbit = cur_inst & BITMASK(5);
                   1266: 
                   1267:        if (memspace) {
1.1.1.5   root     1268:                sprintf(srcname, "y:$%04x", value);
1.1.1.3   root     1269:        } else {
1.1.1.5   root     1270:                sprintf(srcname, "x:$%04x", value);
1.1.1.3   root     1271:        }
                   1272: 
1.1.1.5   root     1273:        sprintf(str_instr,"jsclr #%d,%s,p:$%04x",
1.1.1.3   root     1274:                numbit,
                   1275:                srcname,
1.1.1.5   root     1276:                read_memory(dsp_core.pc+1)
1.1.1.3   root     1277:        );
                   1278: }
                   1279: 
                   1280: static void dsp_jsclr_ea(void)
                   1281: {
                   1282:        /* jsclr #n,x:ea,p:xx */
                   1283:        /* jsclr #n,y:ea,p:xx */
                   1284:        char srcname[16], addr_name[16];
                   1285:        Uint32 memspace, value, numbit;
                   1286:        
                   1287:        disasm_cur_inst_len++;
                   1288: 
                   1289:        memspace = (cur_inst>>6) & 1;
                   1290:        value = (cur_inst>>8) & BITMASK(6);
                   1291:        numbit = cur_inst & BITMASK(5);
                   1292: 
                   1293:        dsp_calc_ea(value, addr_name);
                   1294:        if (memspace) {
                   1295:                sprintf(srcname, "y:%s", addr_name);
                   1296:        } else {
                   1297:                sprintf(srcname, "x:%s", addr_name);
                   1298:        }
                   1299: 
1.1.1.5   root     1300:        sprintf(str_instr,"jsclr #%d,%s,p:$%04x",
1.1.1.3   root     1301:                numbit,
                   1302:                srcname,
1.1.1.5   root     1303:                read_memory(dsp_core.pc+1)
1.1.1.3   root     1304:        );
1.1       root     1305: }
                   1306: 
1.1.1.3   root     1307: static void dsp_jsclr_pp(void)
1.1       root     1308: {
1.1.1.3   root     1309:        /* jsclr #n,x:pp,p:xx */
                   1310:        /* jsclr #n,y:pp,p:xx */
                   1311:        char srcname[16];
                   1312:        Uint32 memspace, value, numbit;
1.1       root     1313:        
1.1.1.3   root     1314:        disasm_cur_inst_len++;
1.1       root     1315: 
1.1.1.3   root     1316:        memspace = (cur_inst>>6) & 1;
                   1317:        value = (cur_inst>>8) & BITMASK(6);
                   1318:        numbit = cur_inst & BITMASK(5);
1.1       root     1319: 
1.1.1.3   root     1320:        value += 0xffc0;
                   1321:        if (memspace) {
1.1.1.5   root     1322:                sprintf(srcname, "y:$%04x", value);
1.1       root     1323:        } else {
1.1.1.5   root     1324:                sprintf(srcname, "x:$%04x", value);
1.1       root     1325:        }
                   1326: 
1.1.1.5   root     1327:        sprintf(str_instr,"jsclr #%d,%s,p:$%04x",
1.1.1.3   root     1328:                numbit,
                   1329:                srcname,
1.1.1.5   root     1330:                read_memory(dsp_core.pc+1)
1.1       root     1331:        );
                   1332: }
                   1333: 
1.1.1.3   root     1334: static void dsp_jsclr_reg(void)
1.1       root     1335: {
1.1.1.3   root     1336:        /* jsclr #n,R,p:xx */
1.1.1.4   root     1337:        Uint32 value, numbit;
1.1.1.3   root     1338:        
                   1339:        disasm_cur_inst_len++;
                   1340: 
                   1341:        value = (cur_inst>>8) & BITMASK(6);
                   1342:        numbit = cur_inst & BITMASK(5);
                   1343: 
1.1.1.5   root     1344:        sprintf(str_instr,"jsclr #%d,%s,p:$%04x",
1.1.1.3   root     1345:                numbit,
1.1.1.4   root     1346:                registers_name[value],
1.1.1.5   root     1347:                read_memory(dsp_core.pc+1)
1.1       root     1348:        );
                   1349: }
                   1350: 
1.1.1.3   root     1351: static void dsp_jset_aa(void)
1.1       root     1352: {
1.1.1.3   root     1353:        /* jset #n,x:aa,p:xx */
                   1354:        /* jset #n,y:aa,p:xx */
                   1355:        char srcname[16];
                   1356:        Uint32 memspace, value, numbit;
1.1       root     1357:        
1.1.1.3   root     1358:        disasm_cur_inst_len++;
1.1       root     1359: 
1.1.1.3   root     1360:        memspace = (cur_inst>>6) & 1;
                   1361:        value = (cur_inst>>8) & BITMASK(6);
                   1362:        numbit = cur_inst & BITMASK(5);
                   1363: 
                   1364:        if (memspace) {
1.1.1.5   root     1365:                sprintf(srcname, "y:$%04x", value);
1.1       root     1366:        } else {
1.1.1.5   root     1367:                sprintf(srcname, "x:$%04x", value);
1.1       root     1368:        }
                   1369: 
1.1.1.5   root     1370:        sprintf(str_instr,"jset #%d,%s,p:$%04x",
1.1.1.3   root     1371:                numbit,
                   1372:                srcname,
1.1.1.5   root     1373:                read_memory(dsp_core.pc+1)
1.1       root     1374:        );
                   1375: }
                   1376: 
1.1.1.3   root     1377: static void dsp_jset_ea(void)
1.1       root     1378: {
1.1.1.3   root     1379:        /* jset #n,x:ea,p:xx */
                   1380:        /* jset #n,y:ea,p:xx */
                   1381:        char srcname[16], addr_name[16];
                   1382:        Uint32 memspace, value, numbit;
                   1383:        
                   1384:        disasm_cur_inst_len++;
                   1385: 
                   1386:        memspace = (cur_inst>>6) & 1;
                   1387:        value = (cur_inst>>8) & BITMASK(6);
                   1388:        numbit = cur_inst & BITMASK(5);
                   1389: 
                   1390:        dsp_calc_ea(value, addr_name);
                   1391:        if (memspace) {
                   1392:                sprintf(srcname, "y:%s", addr_name);
                   1393:        } else {
                   1394:                sprintf(srcname, "x:%s", addr_name);
                   1395:        }
                   1396: 
1.1.1.5   root     1397:        sprintf(str_instr,"jset #%d,%s,p:$%04x",
1.1.1.3   root     1398:                numbit,
                   1399:                srcname,
1.1.1.5   root     1400:                read_memory(dsp_core.pc+1)
1.1       root     1401:        );
                   1402: }
                   1403: 
1.1.1.3   root     1404: static void dsp_jset_pp(void)
1.1       root     1405: {
1.1.1.3   root     1406:        /* jset #n,x:pp,p:xx */
                   1407:        /* jset #n,y:pp,p:xx */
                   1408:        char srcname[16];
                   1409:        Uint32 memspace, value, numbit;
                   1410:        
                   1411:        disasm_cur_inst_len++;
1.1       root     1412: 
1.1.1.3   root     1413:        memspace = (cur_inst>>6) & 1;
                   1414:        value = (cur_inst>>8) & BITMASK(6);
                   1415:        numbit = cur_inst & BITMASK(5);
1.1       root     1416: 
1.1.1.3   root     1417:        value += 0xffc0;
                   1418:        if (memspace) {
1.1.1.5   root     1419:                sprintf(srcname, "y:$%04x", value);
1.1.1.3   root     1420:        } else {
1.1.1.5   root     1421:                sprintf(srcname, "x:$%04x", value);
1.1       root     1422:        }
                   1423: 
1.1.1.5   root     1424:        sprintf(str_instr,"jset #%d,%s,p:$%04x",
1.1.1.3   root     1425:                numbit,
                   1426:                srcname,
1.1.1.5   root     1427:                read_memory(dsp_core.pc+1)
1.1.1.3   root     1428:        );
1.1       root     1429: }
                   1430: 
1.1.1.3   root     1431: static void dsp_jset_reg(void)
1.1       root     1432: {
1.1.1.3   root     1433:        /* jset #n,R,p:xx */
1.1.1.4   root     1434:        Uint32 value, numbit;
1.1       root     1435:        
1.1.1.3   root     1436:        disasm_cur_inst_len++;
                   1437: 
1.1       root     1438:        value = (cur_inst>>8) & BITMASK(6);
                   1439:        numbit = cur_inst & BITMASK(5);
                   1440: 
1.1.1.5   root     1441:        sprintf(str_instr,"jset #%d,%s,p:$%04x",
1.1       root     1442:                numbit,
1.1.1.4   root     1443:                registers_name[value],
1.1.1.5   root     1444:                read_memory(dsp_core.pc+1)
1.1       root     1445:        );
                   1446: }
                   1447: 
1.1.1.3   root     1448: static void dsp_jsr_imm(void)
1.1       root     1449: {
1.1.1.5   root     1450:        sprintf(str_instr,"jsr p:$%04x", cur_inst & BITMASK(12));
1.1       root     1451: }
                   1452: 
1.1.1.3   root     1453: static void dsp_jsr_ea(void)
1.1       root     1454: {
1.1.1.3   root     1455:        char dstname[16];
1.1       root     1456: 
1.1.1.3   root     1457:        dsp_calc_ea((cur_inst>>8) & BITMASK(6),dstname);
                   1458: 
1.1.1.4   root     1459:        sprintf(str_instr,"jsr p:%s", dstname);
1.1       root     1460: }
1.1.1.3   root     1461: 
                   1462: static void dsp_jsset_aa(void)
1.1       root     1463: {
1.1.1.3   root     1464:        /* jsset #n,x:aa,p:xx */
                   1465:        /* jsset #n,y:aa,p:xx */
                   1466:        char srcname[16];
1.1.1.2   root     1467:        Uint32 memspace, value, numbit;
1.1       root     1468:        
1.1.1.3   root     1469:        disasm_cur_inst_len++;
                   1470: 
1.1       root     1471:        memspace = (cur_inst>>6) & 1;
                   1472:        value = (cur_inst>>8) & BITMASK(6);
                   1473:        numbit = cur_inst & BITMASK(5);
                   1474: 
1.1.1.3   root     1475:        if (memspace) {
1.1.1.5   root     1476:                sprintf(srcname, "y:$%04x", value);
1.1.1.3   root     1477:        } else {
1.1.1.5   root     1478:                sprintf(srcname, "x:$%04x", value);
1.1       root     1479:        }
                   1480: 
1.1.1.5   root     1481:        sprintf(str_instr,"jsset #%d,%s,p:$%04x",
1.1       root     1482:                numbit,
                   1483:                srcname,
1.1.1.5   root     1484:                read_memory(dsp_core.pc+1)
1.1       root     1485:        );
                   1486: }
                   1487: 
1.1.1.3   root     1488: static void dsp_jsset_ea(void)
1.1       root     1489: {
1.1.1.3   root     1490:        /* jsset #n,x:ea,p:xx */
                   1491:        /* jsset #n,y:ea,p:xx */
1.1       root     1492:        char srcname[16], addr_name[16];
1.1.1.2   root     1493:        Uint32 memspace, value, numbit;
1.1       root     1494:        
1.1.1.3   root     1495:        disasm_cur_inst_len++;
                   1496: 
1.1       root     1497:        memspace = (cur_inst>>6) & 1;
                   1498:        value = (cur_inst>>8) & BITMASK(6);
                   1499:        numbit = cur_inst & BITMASK(5);
                   1500: 
1.1.1.3   root     1501:        dsp_calc_ea(value, addr_name);
                   1502:        if (memspace) {
                   1503:                sprintf(srcname, "y:%s", addr_name);
                   1504:        } else {
                   1505:                sprintf(srcname, "x:%s", addr_name);
1.1       root     1506:        }
                   1507: 
1.1.1.5   root     1508:        sprintf(str_instr,"jsset #%d,%s,p:$%04x",
1.1       root     1509:                numbit,
                   1510:                srcname,
1.1.1.5   root     1511:                read_memory(dsp_core.pc+1)
1.1       root     1512:        );
                   1513: }
                   1514: 
1.1.1.3   root     1515: static void dsp_jsset_pp(void)
1.1       root     1516: {
1.1.1.3   root     1517:        /* jsset #n,x:pp,p:xx */
                   1518:        /* jsset #n,y:pp,p:xx */
                   1519:        char srcname[16];
                   1520:        Uint32 memspace, value, numbit;
                   1521:        
                   1522:        disasm_cur_inst_len++;
                   1523: 
                   1524:        memspace = (cur_inst>>6) & 1;
                   1525:        value = (cur_inst>>8) & BITMASK(6);
                   1526:        numbit = cur_inst & BITMASK(5);
1.1       root     1527: 
1.1.1.3   root     1528:        value += 0xffc0;
                   1529:        if (memspace) {
1.1.1.5   root     1530:                sprintf(srcname, "y:$%04x", value);
1.1       root     1531:        } else {
1.1.1.5   root     1532:                sprintf(srcname, "x:$%04x", value);
1.1       root     1533:        }
                   1534: 
1.1.1.5   root     1535:        sprintf(str_instr,"jsset #%d,%s,p:$%04x",
1.1.1.3   root     1536:                numbit,
                   1537:                srcname,
1.1.1.5   root     1538:                read_memory(dsp_core.pc+1)
1.1.1.3   root     1539:        );
1.1       root     1540: }
                   1541: 
1.1.1.3   root     1542: static void dsp_jsset_reg(void)
1.1       root     1543: {
1.1.1.3   root     1544:        /* jsset #n,r,p:xx */
1.1.1.4   root     1545:        Uint32 value, numbit;
1.1       root     1546:        
1.1.1.3   root     1547:        disasm_cur_inst_len++;
                   1548: 
1.1       root     1549:        value = (cur_inst>>8) & BITMASK(6);
                   1550:        numbit = cur_inst & BITMASK(5);
                   1551: 
1.1.1.5   root     1552:        sprintf(str_instr,"jsset #%d,%s,p:$%04x",
1.1       root     1553:                numbit,
1.1.1.4   root     1554:                registers_name[value],
1.1.1.5   root     1555:                read_memory(dsp_core.pc+1)
1.1       root     1556:        );
                   1557: }
                   1558: 
                   1559: static void dsp_lua(void)
                   1560: {
                   1561:        char addr_name[16], numreg;
                   1562: 
                   1563:        dsp_calc_ea((cur_inst>>8) & BITMASK(5), addr_name);
                   1564:        numreg = cur_inst & BITMASK(3);
                   1565:        
1.1.1.5   root     1566:        if (cur_inst & (1<<3))
                   1567:                sprintf(str_instr,"lua %s,n%d", addr_name, numreg);
                   1568:        else
                   1569:                sprintf(str_instr,"lua %s,r%d", addr_name, numreg);
1.1       root     1570: }
                   1571: 
1.1.1.3   root     1572: static void dsp_movec_reg(void)
1.1       root     1573: {
1.1.1.2   root     1574:        Uint32 numreg1, numreg2;
1.1       root     1575: 
                   1576:        /* S1,D2 */
                   1577:        /* S2,D1 */
                   1578: 
                   1579:        numreg2 = (cur_inst>>8) & BITMASK(6);
1.1.1.3   root     1580:        numreg1 = cur_inst & BITMASK(6);
1.1       root     1581: 
                   1582:        if (cur_inst & (1<<15)) {
                   1583:                /* Write D1 */
1.1.1.4   root     1584:                sprintf(str_instr,"movec %s,%s", registers_name[numreg2], registers_name[numreg1]);
1.1       root     1585:        } else {
                   1586:                /* Read S1 */
1.1.1.4   root     1587:                sprintf(str_instr,"movec %s,%s", registers_name[numreg1], registers_name[numreg2]);
1.1       root     1588:        }
                   1589: }
                   1590: 
1.1.1.3   root     1591: static void dsp_movec_aa(void)
1.1       root     1592: {
                   1593:        const char *spacename;
                   1594:        char srcname[16],dstname[16];
1.1.1.2   root     1595:        Uint32 numreg, addr;
1.1       root     1596: 
                   1597:        /* x:aa,D1 */
                   1598:        /* S1,x:aa */
                   1599:        /* y:aa,D1 */
                   1600:        /* S1,y:aa */
                   1601: 
1.1.1.3   root     1602:        numreg = cur_inst & BITMASK(6);
1.1       root     1603:        addr = (cur_inst>>8) & BITMASK(6);
                   1604: 
                   1605:        if (cur_inst & (1<<6)) {
                   1606:                spacename="y";
                   1607:        } else {
                   1608:                spacename="x";
                   1609:        }
                   1610: 
                   1611:        if (cur_inst & (1<<15)) {
                   1612:                /* Write D1 */
1.1.1.5   root     1613:                sprintf(srcname, "%s:$%04x", spacename, addr);
1.1       root     1614:                strcpy(dstname, registers_name[numreg]);
                   1615:        } else {
                   1616:                /* Read S1 */
                   1617:                strcpy(srcname, registers_name[numreg]);
1.1.1.5   root     1618:                sprintf(dstname, "%s:$%04x", spacename, addr);
1.1       root     1619:        }
                   1620: 
1.1.1.4   root     1621:        sprintf(str_instr,"movec %s,%s", srcname, dstname);
1.1       root     1622: }
                   1623: 
1.1.1.3   root     1624: static void dsp_movec_imm(void)
1.1       root     1625: {
1.1.1.2   root     1626:        Uint32 numreg;
1.1       root     1627: 
                   1628:        /* #xx,D1 */
                   1629: 
1.1.1.3   root     1630:        numreg = cur_inst & BITMASK(6);
1.1       root     1631: 
1.1.1.5   root     1632:        sprintf(str_instr,"movec #$%02x,%s", (cur_inst>>8) & BITMASK(8), registers_name[numreg]);
1.1       root     1633: }
                   1634: 
1.1.1.3   root     1635: static void dsp_movec_ea(void)
1.1       root     1636: {
                   1637:        const char *spacename;
                   1638:        char srcname[16], dstname[16], addr_name[16];
1.1.1.2   root     1639:        Uint32 numreg, ea_mode;
1.1       root     1640:        int retour;
                   1641: 
                   1642:        /* x:ea,D1 */
                   1643:        /* S1,x:ea */
                   1644:        /* y:ea,D1 */
                   1645:        /* S1,y:ea */
                   1646:        /* #xxxx,D1 */
                   1647: 
1.1.1.3   root     1648:        numreg = cur_inst & BITMASK(6);
1.1       root     1649:        ea_mode = (cur_inst>>8) & BITMASK(6);
                   1650:        retour = dsp_calc_ea(ea_mode, addr_name);
                   1651: 
                   1652:        if (cur_inst & (1<<6)) {
                   1653:                spacename="y";
                   1654:        } else {
                   1655:                spacename="x";
                   1656:        }
                   1657: 
                   1658:        if (cur_inst & (1<<15)) {
                   1659:                /* Write D1 */
                   1660:                if (retour) {
                   1661:                        sprintf(srcname, "#%s", addr_name);
                   1662:                } else {
                   1663:                        sprintf(srcname, "%s:%s", spacename, addr_name);
                   1664:                }
                   1665:                strcpy(dstname, registers_name[numreg]);
                   1666:        } else {
                   1667:                /* Read S1 */
                   1668:                strcpy(srcname, registers_name[numreg]);
                   1669:                sprintf(dstname, "%s:%s", spacename, addr_name);
                   1670:        }
                   1671: 
1.1.1.4   root     1672:        sprintf(str_instr,"movec %s,%s", srcname, dstname);
1.1       root     1673: }
                   1674: 
1.1.1.3   root     1675: static void dsp_movem_aa(void)
1.1       root     1676: {
1.1.1.3   root     1677:        /* S,p:aa */
                   1678:        /* p:aa,D */
1.1       root     1679:        char addr_name[16], srcname[16], dstname[16];
1.1.1.3   root     1680:        Uint32 numreg;
1.1       root     1681: 
1.1.1.5   root     1682:        sprintf(addr_name, "$%04x",(cur_inst>>8) & BITMASK(6));
1.1       root     1683:        numreg = cur_inst & BITMASK(6);
                   1684:        if  (cur_inst & (1<<15)) {
                   1685:                /* Write D */
                   1686:                sprintf(srcname, "p:%s", addr_name);
                   1687:                strcpy(dstname, registers_name[numreg]);
                   1688:        } else {
                   1689:                /* Read S */
                   1690:                strcpy(srcname, registers_name[numreg]);
                   1691:                sprintf(dstname, "p:%s", addr_name);
                   1692:        }
1.1.1.2   root     1693: 
1.1.1.4   root     1694:        sprintf(str_instr,"movem %s,%s", srcname, dstname);
1.1       root     1695: }
                   1696: 
1.1.1.3   root     1697: static void dsp_movem_ea(void)
1.1       root     1698: {
1.1.1.3   root     1699:        /* S,p:ea */
                   1700:        /* p:ea,D */
                   1701:        char addr_name[16], srcname[16], dstname[16];
                   1702:        Uint32 ea_mode, numreg;
1.1       root     1703: 
1.1.1.3   root     1704:        ea_mode = (cur_inst>>8) & BITMASK(6);
                   1705:        dsp_calc_ea(ea_mode, addr_name);
                   1706:        numreg = cur_inst & BITMASK(6);
                   1707:        if  (cur_inst & (1<<15)) {
                   1708:                /* Write D */
                   1709:                sprintf(srcname, "p:%s", addr_name);
                   1710:                strcpy(dstname, registers_name[numreg]);
                   1711:        } else {
                   1712:                /* Read S */
                   1713:                strcpy(srcname, registers_name[numreg]);
                   1714:                sprintf(dstname, "p:%s", addr_name);
                   1715:        }
                   1716: 
1.1.1.4   root     1717:        sprintf(str_instr,"movem %s,%s", srcname, dstname);
1.1       root     1718: }
                   1719: 
                   1720: static void dsp_movep_0(void)
                   1721: {
                   1722:        char srcname[16]="",dstname[16]="";
1.1.1.2   root     1723:        Uint32 addr, memspace, numreg;
1.1       root     1724: 
                   1725:        /* S,x:pp */
                   1726:        /* x:pp,D */
                   1727:        /* S,y:pp */
                   1728:        /* y:pp,D */
                   1729: 
                   1730:        addr = 0xffc0 + (cur_inst & BITMASK(6));
                   1731:        memspace = (cur_inst>>16) & 1;
                   1732:        numreg = (cur_inst>>8) & BITMASK(6);
                   1733: 
                   1734:        if (cur_inst & (1<<15)) {
                   1735:                /* Write pp */
                   1736: 
                   1737:                strcpy(srcname, registers_name[numreg]);
                   1738: 
                   1739:                if (memspace) {
1.1.1.5   root     1740:                        sprintf(dstname, "y:$%04x", addr);
1.1       root     1741:                } else {
1.1.1.5   root     1742:                        sprintf(dstname, "x:$%04x", addr);
1.1       root     1743:                }
                   1744:        } else {
                   1745:                /* Read pp */
                   1746: 
                   1747:                if (memspace) {
1.1.1.5   root     1748:                        sprintf(srcname, "y:$%04x", addr);
1.1       root     1749:                } else {
1.1.1.5   root     1750:                        sprintf(srcname, "x:$%04x", addr);
1.1       root     1751:                }
                   1752: 
                   1753:                strcpy(dstname, registers_name[numreg]);
                   1754:        }
                   1755: 
1.1.1.4   root     1756:        sprintf(str_instr,"movep %s,%s", srcname, dstname);
1.1       root     1757: }
                   1758: 
                   1759: static void dsp_movep_1(void)
                   1760: {
                   1761:        char srcname[16]="",dstname[16]="",name[16]="";
1.1.1.2   root     1762:        Uint32 addr, memspace; 
1.1       root     1763: 
                   1764:        /* p:ea,x:pp */
                   1765:        /* x:pp,p:ea */
                   1766:        /* p:ea,y:pp */
                   1767:        /* y:pp,p:ea */
                   1768: 
                   1769:        addr = 0xffc0 + (cur_inst & BITMASK(6));
                   1770:        dsp_calc_ea((cur_inst>>8) & BITMASK(6), name);
                   1771:        memspace = (cur_inst>>16) & 1;
                   1772: 
                   1773:        if (cur_inst & (1<<15)) {
                   1774:                /* Write pp */
                   1775: 
                   1776:                sprintf(srcname, "p:%s", name);
                   1777: 
                   1778:                if (memspace) {
1.1.1.5   root     1779:                        sprintf(dstname, "y:$%04x", addr);
1.1       root     1780:                } else {
1.1.1.5   root     1781:                        sprintf(dstname, "x:$%04x", addr);
1.1       root     1782:                }
                   1783:        } else {
                   1784:                /* Read pp */
                   1785: 
                   1786:                if (memspace) {
1.1.1.5   root     1787:                        sprintf(srcname, "y:$%04x", addr);
1.1       root     1788:                } else {
1.1.1.5   root     1789:                        sprintf(srcname, "x:$%04x", addr);
1.1       root     1790:                }
                   1791: 
                   1792:                sprintf(dstname, "p:%s", name);
                   1793:        }
                   1794: 
1.1.1.4   root     1795:        sprintf(str_instr,"movep %s,%s", srcname, dstname);
1.1       root     1796: }
                   1797: 
1.1.1.3   root     1798: static void dsp_movep_23(void)
1.1       root     1799: {
                   1800:        char srcname[16]="",dstname[16]="",name[16]="";
1.1.1.2   root     1801:        Uint32 addr, memspace, easpace, retour; 
1.1       root     1802: 
                   1803:        /* x:ea,x:pp */
                   1804:        /* y:ea,x:pp */
                   1805:        /* #xxxxxx,x:pp */
                   1806:        /* x:pp,x:ea */
                   1807:        /* x:pp,y:ea */
                   1808: 
                   1809:        /* x:ea,y:pp */
                   1810:        /* y:ea,y:pp */
                   1811:        /* #xxxxxx,y:pp */
                   1812:        /* y:pp,y:ea */
                   1813:        /* y:pp,x:ea */
                   1814: 
                   1815:        addr = 0xffc0 + (cur_inst & BITMASK(6));
                   1816:        retour = dsp_calc_ea((cur_inst>>8) & BITMASK(6), name);
                   1817:        memspace = (cur_inst>>16) & 1;
                   1818:        easpace = (cur_inst>>6) & 1;
                   1819: 
                   1820:        if (cur_inst & (1<<15)) {
                   1821:                /* Write pp */
                   1822: 
                   1823:                if (retour) {
                   1824:                        sprintf(srcname, "#%s", name);
                   1825:                } else {
                   1826:                        if (easpace) {
                   1827:                                sprintf(srcname, "y:%s", name);
                   1828:                        } else {
                   1829:                                sprintf(srcname, "x:%s", name);
                   1830:                        }
                   1831:                }
                   1832: 
                   1833:                if (memspace) {
1.1.1.5   root     1834:                        sprintf(dstname, "y:$%04x", addr);
1.1       root     1835:                } else {
1.1.1.5   root     1836:                        sprintf(dstname, "x:$%04x", addr);
1.1       root     1837:                }
                   1838:        } else {
                   1839:                /* Read pp */
                   1840: 
                   1841:                if (memspace) {
1.1.1.5   root     1842:                        sprintf(srcname, "y:$%04x", addr);
1.1       root     1843:                } else {
1.1.1.5   root     1844:                        sprintf(srcname, "x:$%04x", addr);
1.1       root     1845:                }
                   1846: 
                   1847:                if (easpace) {
                   1848:                        sprintf(dstname, "y:%s", name);
                   1849:                } else {
                   1850:                        sprintf(dstname, "x:%s", name);
                   1851:                }
                   1852:        }
                   1853: 
1.1.1.4   root     1854:        sprintf(str_instr,"movep %s,%s", srcname, dstname);
1.1       root     1855: }
                   1856: 
                   1857: static void dsp_nop(void)
                   1858: {
1.1.1.4   root     1859:        sprintf(str_instr,"nop");
1.1       root     1860: }
                   1861: 
                   1862: static void dsp_norm(void)
                   1863: {
1.1.1.2   root     1864:        Uint32 srcreg, destreg;
1.1       root     1865: 
                   1866:        srcreg = DSP_REG_R0+((cur_inst>>8) & BITMASK(3));
                   1867:        destreg = DSP_REG_A+((cur_inst>>3) & 1);
                   1868: 
1.1.1.4   root     1869:        sprintf(str_instr,"norm %s,%s", registers_name[srcreg], registers_name[destreg]);
1.1       root     1870: }
                   1871: 
                   1872: static void dsp_ori(void)
                   1873: {
                   1874:        switch(cur_inst & BITMASK(2)) {
                   1875:                case 0:
1.1.1.5   root     1876:                        sprintf(str_instr,"ori #$%02x,mr", (cur_inst>>8) & BITMASK(8));
1.1       root     1877:                        break;
                   1878:                case 1:
1.1.1.5   root     1879:                        sprintf(str_instr,"ori #$%02x,ccr", (cur_inst>>8) & BITMASK(8));
1.1       root     1880:                        break;
                   1881:                case 2:
1.1.1.5   root     1882:                        sprintf(str_instr,"ori #$%02x,omr", (cur_inst>>8) & BITMASK(8));
1.1       root     1883:                        break;
                   1884:                default:
                   1885:                        break;
                   1886:        }
                   1887: 
                   1888: }
                   1889: 
1.1.1.3   root     1890: static void dsp_rep_aa(void)
1.1       root     1891: {
                   1892:        char name[16];
                   1893: 
                   1894:        /* x:aa */
                   1895:        /* y:aa */
                   1896: 
                   1897:        if (cur_inst & (1<<6)) {
1.1.1.5   root     1898:                sprintf(name, "y:$%04x",(cur_inst>>8) & BITMASK(6));
1.1       root     1899:        } else {
1.1.1.5   root     1900:                sprintf(name, "x:$%04x",(cur_inst>>8) & BITMASK(6));
1.1       root     1901:        }
                   1902: 
1.1.1.4   root     1903:        sprintf(str_instr,"rep %s", name);
1.1       root     1904: }
                   1905: 
1.1.1.3   root     1906: static void dsp_rep_imm(void)
1.1       root     1907: {
                   1908:        /* #xxx */
1.1.1.5   root     1909:        sprintf(str_instr,"rep #$%02x", ((cur_inst>>8) & BITMASK(8))
1.1.1.3   root     1910:                + ((cur_inst & BITMASK(4))<<8));
1.1       root     1911: }
                   1912: 
1.1.1.3   root     1913: static void dsp_rep_ea(void)
1.1       root     1914: {
                   1915:        char name[16],addr_name[16];
                   1916: 
                   1917:        /* x:ea */
                   1918:        /* y:ea */
                   1919: 
                   1920:        dsp_calc_ea((cur_inst>>8) & BITMASK(6), addr_name);
                   1921:        if (cur_inst & (1<<6)) {
                   1922:                sprintf(name, "y:%s",addr_name);
                   1923:        } else {
                   1924:                sprintf(name, "x:%s",addr_name);
                   1925:        }
                   1926: 
1.1.1.4   root     1927:        sprintf(str_instr,"rep %s", name);
1.1       root     1928: }
                   1929: 
1.1.1.3   root     1930: static void dsp_rep_reg(void)
1.1       root     1931: {
                   1932:        /* R */
                   1933: 
1.1.1.4   root     1934:        sprintf(str_instr,"rep %s", registers_name[(cur_inst>>8) & BITMASK(6)]);
1.1       root     1935: }
                   1936: 
                   1937: static void dsp_reset(void)
                   1938: {
1.1.1.4   root     1939:        sprintf(str_instr,"reset");
1.1       root     1940: }
                   1941: 
                   1942: static void dsp_rti(void)
                   1943: {
1.1.1.4   root     1944:        sprintf(str_instr,"rti");
1.1       root     1945: }
                   1946: 
                   1947: static void dsp_rts(void)
                   1948: {
1.1.1.4   root     1949:        sprintf(str_instr,"rts");
1.1       root     1950: }
                   1951: 
                   1952: static void dsp_stop(void)
                   1953: {
1.1.1.4   root     1954:        sprintf(str_instr,"stop");
1.1       root     1955: }
                   1956:        
                   1957: static void dsp_swi(void)
                   1958: {
1.1.1.4   root     1959:        sprintf(str_instr,"swi");
1.1       root     1960: }
                   1961: 
                   1962: static void dsp_tcc(void)
                   1963: {
                   1964:        char ccname[16];
1.1.1.2   root     1965:        Uint32 src1reg, dst1reg, src2reg, dst2reg;
1.1       root     1966: 
                   1967:        dsp_calc_cc((cur_inst>>12) & BITMASK(4), ccname);
                   1968:        src1reg = registers_tcc[(cur_inst>>3) & BITMASK(4)][0];
1.1.1.2   root     1969:        dst1reg = registers_tcc[(cur_inst>>3) & BITMASK(4)][1];
1.1       root     1970: 
                   1971:        if (cur_inst & (1<<16)) {
1.1.1.5   root     1972:                src2reg = DSP_REG_R0+((cur_inst>>8) & BITMASK(3));
                   1973:                dst2reg = DSP_REG_R0+(cur_inst & BITMASK(3));
1.1       root     1974: 
1.1.1.4   root     1975:                sprintf(str_instr,"t%s %s,%s %s,%s",
1.1       root     1976:                        ccname,
                   1977:                        registers_name[src1reg],
                   1978:                        registers_name[dst1reg],
                   1979:                        registers_name[src2reg],
                   1980:                        registers_name[dst2reg]
                   1981:                );
                   1982:        } else {
1.1.1.4   root     1983:                sprintf(str_instr,"t%s %s,%s",
1.1       root     1984:                        ccname,
                   1985:                        registers_name[src1reg],
                   1986:                        registers_name[dst1reg]
                   1987:                );
                   1988:        }
                   1989: }
                   1990: 
                   1991: static void dsp_wait(void)
                   1992: {
1.1.1.4   root     1993:        sprintf(str_instr,"wait");
1.1       root     1994: }
                   1995: 
                   1996: /**********************************
                   1997:  *     Parallel moves
                   1998:  **********************************/
                   1999: 
                   2000: static void dsp_pm(void)
                   2001: {
1.1.1.2   root     2002:        Uint32 value;
1.1       root     2003: 
                   2004:        value = (cur_inst >> 20) & BITMASK(4);
                   2005:        opcodes_parmove[value]();
                   2006: }
                   2007: 
                   2008: static void dsp_pm_0(void)
                   2009: {
                   2010:        char space_name[16], addr_name[16];
1.1.1.2   root     2011:        Uint32 memspace, numreg1, numreg2;
1.1       root     2012: /*
                   2013:        0000 100d 00mm mrrr S,x:ea      x0,D
                   2014:        0000 100d 10mm mrrr S,y:ea      y0,D
                   2015: */
                   2016:        memspace = (cur_inst>>15) & 1;
                   2017:        numreg1 = DSP_REG_A+((cur_inst>>16) & 1);
                   2018:        dsp_calc_ea((cur_inst>>8) & BITMASK(6), addr_name);
                   2019: 
                   2020:        if (memspace) {
                   2021:                strcpy(space_name,"y");
                   2022:                numreg2 = DSP_REG_Y0;
                   2023:        } else {
                   2024:                strcpy(space_name,"x");
                   2025:                numreg2 = DSP_REG_X0;
                   2026:        }
                   2027: 
                   2028:        sprintf(parallelmove_name,
                   2029:                "%s,%s:%s %s,%s",
                   2030:                registers_name[numreg1],
                   2031:                space_name,
                   2032:                addr_name,
                   2033:                registers_name[numreg2],
                   2034:                registers_name[numreg1]
                   2035:        );
                   2036: }
                   2037: 
                   2038: static void dsp_pm_1(void)
                   2039: {
                   2040: /*
                   2041:        0001 ffdf w0mm mrrr x:ea,D1             S2,D2
                   2042:                                                S1,x:ea         S2,D2
                   2043:                                                #xxxxxx,D1      S2,D2
                   2044:        0001 deff w1mm mrrr S1,D1               y:ea,D2
                   2045:                                                S1,D1           S2,y:ea
                   2046:                                                S1,D1           #xxxxxx,D2
                   2047: */
                   2048: 
                   2049:        char addr_name[16];
1.1.1.2   root     2050:        Uint32 memspace, write_flag, retour, s1reg, s2reg, d1reg, d2reg;
1.1       root     2051: 
                   2052:        memspace = (cur_inst>>14) & 1;
                   2053:        write_flag = (cur_inst>>15) & 1;
                   2054:        retour = dsp_calc_ea((cur_inst>>8) & BITMASK(6), addr_name);
                   2055: 
                   2056:        if (memspace==DSP_SPACE_Y) {
                   2057:                s2reg = d2reg = DSP_REG_Y0;
                   2058:                switch((cur_inst>>16) & BITMASK(2)) {
                   2059:                        case 0: s2reg = d2reg = DSP_REG_Y0;     break;
                   2060:                        case 1: s2reg = d2reg = DSP_REG_Y1;     break;
                   2061:                        case 2: s2reg = d2reg = DSP_REG_A;      break;
                   2062:                        case 3: s2reg = d2reg = DSP_REG_B;      break;
                   2063:                }
                   2064: 
                   2065:                s1reg = DSP_REG_A+((cur_inst>>19) & 1);
                   2066:                d1reg = DSP_REG_X0+((cur_inst>>18) & 1);
                   2067: 
                   2068:                if (write_flag) {
                   2069:                        /* Write D2 */
                   2070: 
                   2071:                        if (retour) {
                   2072:                                sprintf(parallelmove_name,"%s,%s #%s,%s",
                   2073:                                        registers_name[s1reg],
                   2074:                                        registers_name[d1reg],
                   2075:                                        addr_name,
                   2076:                                        registers_name[d2reg]
                   2077:                                );
                   2078:                        } else {
                   2079:                                sprintf(parallelmove_name,"%s,%s y:%s,%s",
                   2080:                                        registers_name[s1reg],
                   2081:                                        registers_name[d1reg],
                   2082:                                        addr_name,
                   2083:                                        registers_name[d2reg]
                   2084:                                );
                   2085:                        }
                   2086:                } else {
                   2087:                        /* Read S2 */
                   2088:                        sprintf(parallelmove_name,"%s,%s %s,y:%s",
                   2089:                                registers_name[s1reg],
                   2090:                                registers_name[d1reg],
                   2091:                                registers_name[s2reg],
                   2092:                                addr_name
                   2093:                        );
                   2094:                }               
                   2095: 
                   2096:        } else {
                   2097:                s1reg = d1reg = DSP_REG_X0;
                   2098:                switch((cur_inst>>18) & BITMASK(2)) {
                   2099:                        case 0: s1reg = d1reg = DSP_REG_X0;     break;
                   2100:                        case 1: s1reg = d1reg = DSP_REG_X1;     break;
                   2101:                        case 2: s1reg = d1reg = DSP_REG_A;      break;
                   2102:                        case 3: s1reg = d1reg = DSP_REG_B;      break;
                   2103:                }
                   2104: 
                   2105:                s2reg = DSP_REG_A+((cur_inst>>17) & 1);
                   2106:                d2reg = DSP_REG_Y0+((cur_inst>>16) & 1);
                   2107: 
                   2108:                if (write_flag) {
                   2109:                        /* Write D1 */
                   2110: 
                   2111:                        if (retour) {
                   2112:                                sprintf(parallelmove_name,"#%s,%s %s,%s",
                   2113:                                        addr_name,
                   2114:                                        registers_name[d1reg],
                   2115:                                        registers_name[s2reg],
                   2116:                                        registers_name[d2reg]
                   2117:                                );
                   2118:                        } else {
                   2119:                                sprintf(parallelmove_name,"x:%s,%s %s,%s",
                   2120:                                        addr_name,
                   2121:                                        registers_name[d1reg],
                   2122:                                        registers_name[s2reg],
                   2123:                                        registers_name[d2reg]
                   2124:                                );
                   2125:                        }
                   2126:                } else {
                   2127:                        /* Read S1 */
                   2128:                        sprintf(parallelmove_name,"%s,x:%s %s,%s",
                   2129:                                registers_name[s1reg],
                   2130:                                addr_name,
                   2131:                                registers_name[s2reg],
                   2132:                                registers_name[d2reg]
                   2133:                        );
                   2134:                }               
                   2135:        
                   2136:        }
                   2137: }
                   2138: 
                   2139: static void dsp_pm_2(void)
                   2140: {
                   2141:        char addr_name[16];
1.1.1.2   root     2142:        Uint32 numreg1, numreg2;
1.1       root     2143: /*
                   2144:        0010 0000 0000 0000 nop
                   2145:        0010 0000 010m mrrr R update
                   2146:        0010 00ee eeed dddd S,D
                   2147:        001d dddd iiii iiii #xx,D
                   2148: */
                   2149:        if (((cur_inst >> 8) & 0xffff) == 0x2000) {
                   2150:                return;
                   2151:        }
                   2152: 
                   2153:        if (((cur_inst >> 8) & 0xffe0) == 0x2040) {
                   2154:                dsp_calc_ea((cur_inst>>8) & BITMASK(5), addr_name);
                   2155:                sprintf(parallelmove_name, "%s,r%d",addr_name, (cur_inst>>8) & BITMASK(3));
                   2156:                return;
                   2157:        }
                   2158: 
                   2159:        if (((cur_inst >> 8) & 0xfc00) == 0x2000) {
                   2160:                numreg1 = (cur_inst>>13) & BITMASK(5);
                   2161:                numreg2 = (cur_inst>>8) & BITMASK(5);
                   2162:                sprintf(parallelmove_name, "%s,%s", registers_name[numreg1], registers_name[numreg2]); 
                   2163:                return;
                   2164:        }
                   2165: 
                   2166:        numreg1 = (cur_inst>>16) & BITMASK(5);
1.1.1.5   root     2167:        sprintf(parallelmove_name, "#$%02x,%s", (cur_inst >> 8) & BITMASK(8), registers_name[numreg1]);
1.1       root     2168: }
                   2169: 
                   2170: static void dsp_pm_4(void)
                   2171: {
                   2172:        char addr_name[16];
1.1.1.2   root     2173:        Uint32 value, retour, ea_mode, memspace;
1.1       root     2174: /*
                   2175:        0100 l0ll w0aa aaaa l:aa,D
                   2176:                                                S,l:aa
                   2177:        0100 l0ll w1mm mrrr l:ea,D
                   2178:                                                S,l:ea
                   2179:        01dd 0ddd w0aa aaaa x:aa,D
                   2180:                                                S,x:aa
                   2181:        01dd 0ddd w1mm mrrr x:ea,D
                   2182:                                                S,x:ea
                   2183:                                                #xxxxxx,D
                   2184:        01dd 1ddd w0aa aaaa y:aa,D
                   2185:                                                S,y:aa
                   2186:        01dd 1ddd w1mm mrrr y:ea,D
                   2187:                                                S,y:ea
                   2188:                                                #xxxxxx,D
                   2189: */
                   2190:        value = (cur_inst>>16) & BITMASK(3);
                   2191:        value |= (cur_inst>>17) & (BITMASK(2)<<3);
                   2192: 
                   2193:        ea_mode = (cur_inst>>8) & BITMASK(6);
                   2194: 
                   2195:        if ((value>>2)==0) {
                   2196:                /* L: memory move */
                   2197:                if (cur_inst & (1<<14)) {
                   2198:                        retour = dsp_calc_ea(ea_mode, addr_name);       
                   2199:                } else {
1.1.1.5   root     2200:                        sprintf(addr_name,"$%04x", ea_mode);
1.1       root     2201:                        retour = 0;
                   2202:                }
                   2203: 
                   2204:                value = (cur_inst>>16) & BITMASK(2);
                   2205:                value |= (cur_inst>>17) & (1<<2);
                   2206: 
                   2207:                if (cur_inst & (1<<15)) {
                   2208:                        /* Write D */
                   2209: 
                   2210:                        if (retour) {
                   2211:                                sprintf(parallelmove_name, "#%s,%s", addr_name, registers_lmove[value]);
                   2212:                        } else {
                   2213:                                sprintf(parallelmove_name, "l:%s,%s", addr_name, registers_lmove[value]);
                   2214:                        }
                   2215:                } else {
                   2216:                        /* Read S */
                   2217:                        sprintf(parallelmove_name, "%s,l:%s", registers_lmove[value], addr_name);
                   2218:                }
                   2219: 
                   2220:                return;
                   2221:        }
                   2222: 
                   2223:        memspace = (cur_inst>>19) & 1;
                   2224:        if (cur_inst & (1<<14)) {
                   2225:                retour = dsp_calc_ea(ea_mode, addr_name);       
                   2226:        } else {
1.1.1.5   root     2227:                sprintf(addr_name,"$%04x", ea_mode);
1.1       root     2228:                retour = 0;
                   2229:        }
                   2230: 
                   2231:        if (memspace) {
                   2232:                /* Y: */
                   2233: 
                   2234:                if (cur_inst & (1<<15)) {
                   2235:                        /* Write D */
                   2236: 
                   2237:                        if (retour) {
                   2238:                                sprintf(parallelmove_name, "#%s,%s", addr_name, registers_name[value]);
                   2239:                        } else {
                   2240:                                sprintf(parallelmove_name, "y:%s,%s", addr_name, registers_name[value]);
                   2241:                        }
                   2242: 
                   2243:                } else {
                   2244:                        /* Read S */
                   2245:                        sprintf(parallelmove_name, "%s,y:%s", registers_name[value], addr_name);
                   2246:                }
                   2247:        } else {
                   2248:                /* X: */
                   2249: 
                   2250:                if (cur_inst & (1<<15)) {
                   2251:                        /* Write D */
                   2252: 
                   2253:                        if (retour) {
                   2254:                                sprintf(parallelmove_name, "#%s,%s", addr_name, registers_name[value]);
                   2255:                        } else {
                   2256:                                sprintf(parallelmove_name, "x:%s,%s", addr_name, registers_name[value]);
                   2257:                        }
                   2258:                } else {
                   2259:                        /* Read S */
                   2260:                        sprintf(parallelmove_name, "%s,x:%s", registers_name[value], addr_name);
                   2261:                }
                   2262:        }
                   2263: }
                   2264: 
                   2265: static void dsp_pm_8(void)
                   2266: {
                   2267:        char addr1_name[16], addr2_name[16];
1.1.1.2   root     2268:        Uint32 ea_mode1, ea_mode2, numreg1, numreg2;
1.1       root     2269: /*
                   2270:        1wmm eeff WrrM MRRR x:ea,D1             y:ea,D2 
                   2271:                                                x:ea,D1         S2,y:ea
                   2272:                                                S1,x:ea         y:ea,D2
                   2273:                                                S1,x:ea         S2,y:ea
                   2274: */
                   2275:        numreg1 = DSP_REG_X0;
                   2276:        switch((cur_inst>>18) & BITMASK(2)) {
                   2277:                case 0: numreg1 = DSP_REG_X0;   break;
                   2278:                case 1: numreg1 = DSP_REG_X1;   break;
                   2279:                case 2: numreg1 = DSP_REG_A;    break;
                   2280:                case 3: numreg1 = DSP_REG_B;    break;
                   2281:        }
                   2282: 
                   2283:        numreg2 = DSP_REG_Y0;
                   2284:        switch((cur_inst>>16) & BITMASK(2)) {
                   2285:                case 0: numreg2 = DSP_REG_Y0;   break;
                   2286:                case 1: numreg2 = DSP_REG_Y1;   break;
                   2287:                case 2: numreg2 = DSP_REG_A;    break;
                   2288:                case 3: numreg2 = DSP_REG_B;    break;
                   2289:        }
                   2290: 
                   2291:        ea_mode1 = (cur_inst>>8) & BITMASK(5);
                   2292:        if ((ea_mode1>>3) == 0) {
                   2293:                ea_mode1 |= (1<<5);
                   2294:        }
                   2295:        ea_mode2 = (cur_inst>>13) & BITMASK(2);
                   2296:        ea_mode2 |= ((cur_inst>>20) & BITMASK(2))<<3;
                   2297:        if ((ea_mode1 & (1<<2))==0) {
                   2298:                ea_mode2 |= 1<<2;
                   2299:        }
                   2300:        if ((ea_mode2>>3) == 0) {
                   2301:                ea_mode2 |= (1<<5);
                   2302:        }
                   2303: 
                   2304:        dsp_calc_ea(ea_mode1, addr1_name);
                   2305:        dsp_calc_ea(ea_mode2, addr2_name);
                   2306:        
                   2307:        if (cur_inst & (1<<15)) {
                   2308:                if (cur_inst & (1<<22)) {
                   2309:                        sprintf(parallelmove_name, "x:%s,%s y:%s,%s",
                   2310:                                addr1_name,
                   2311:                                registers_name[numreg1],
                   2312:                                addr2_name,
                   2313:                                registers_name[numreg2]
                   2314:                        );
                   2315:                } else {
                   2316:                        sprintf(parallelmove_name, "x:%s,%s %s,y:%s",
                   2317:                                addr1_name,
                   2318:                                registers_name[numreg1],
                   2319:                                registers_name[numreg2],
                   2320:                                addr2_name
                   2321:                        );
                   2322:                }
                   2323:        } else {
                   2324:                if (cur_inst & (1<<22)) {
                   2325:                        sprintf(parallelmove_name, "%s,x:%s y:%s,%s",
                   2326:                                registers_name[numreg1],
                   2327:                                addr1_name,
                   2328:                                addr2_name,
                   2329:                                registers_name[numreg2]
                   2330:                        );
                   2331:                } else {
                   2332:                        sprintf(parallelmove_name, "%s,x:%s %s,y:%s",
                   2333:                                registers_name[numreg1],
                   2334:                                addr1_name,
                   2335:                                registers_name[numreg2],
                   2336:                                addr2_name
                   2337:                        );
                   2338:                }
                   2339:        }       
                   2340: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.