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

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

unix.superglobalmegacorp.com

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