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

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

unix.superglobalmegacorp.com

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