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

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>
                     27: 
                     28: #include "dsp_core.h"
1.1       root       29: #include "dsp_cpu.h"
                     30: #include "dsp_disasm.h"
                     31: 
1.1.1.2   root       32: #define DEBUG 0
1.1       root       33: 
                     34: /* More disasm infos, if wanted */
                     35: #define DSP_DISASM_REG_PC 0
                     36: 
                     37: /**********************************
                     38:  *     Defines
                     39:  **********************************/
                     40: 
                     41: #define BITMASK(x)     ((1<<(x))-1)
                     42: 
                     43: /**********************************
                     44:  *     Variables
                     45:  **********************************/
                     46: 
                     47: /* Current instruction */
1.1.1.3 ! root       48: static char str_instr[50];
1.1.1.2   root       49: static Uint32 cur_inst;
1.1.1.3 ! root       50: static Uint32 disasm_cur_inst_len;
        !            51: 
        !            52: /* Previous instruction */
        !            53: static Uint32 prev_inst_pc = 0x10000;  /* Init to an invalid value */
1.1.1.2   root       54: 
                     55: static dsp_core_t *dsp_core;
                     56: 
                     57: void dsp56k_disasm_init(dsp_core_t *my_dsp_core)
                     58: {
                     59:        dsp_core = my_dsp_core;
                     60: }
1.1       root       61: 
                     62: /**********************************
                     63:  *     Register change
                     64:  **********************************/
                     65: 
1.1.1.2   root       66: static Uint32 registers_save[64];
                     67: static Uint32 registers_changed[64];
1.1       root       68: #if DSP_DISASM_REG_PC
1.1.1.2   root       69: static Uint32 pc_save;
1.1       root       70: #endif
                     71: 
                     72: static const char *registers_name[64]={
                     73:        "","","","",
                     74:        "x0","x1","y0","y1",
                     75:        "a0","b0","a2","b2",
                     76:        "a1","b1","a","b",
                     77:        
                     78:        "r0","r1","r2","r3",
                     79:        "r4","r5","r6","r7",
                     80:        "n0","n1","n2","n3",
                     81:        "n4","n5","n6","n7",
                     82: 
                     83:        "m0","m1","m2","m3",
                     84:        "m4","m5","m6","m7",
                     85:        "","","","",
                     86:        "","","","",
                     87: 
                     88:        "","","","",
                     89:        "","","","",
                     90:        "","sr","omr","sp",
                     91:        "ssh","ssl","la","lc"
                     92: };
                     93: 
                     94: void dsp56k_disasm_reg_read(void)
                     95: {
1.1.1.2   root       96:        memcpy(registers_save, dsp_core->registers , sizeof(registers_save));
1.1       root       97:        memset(registers_changed, 0, sizeof(registers_changed));
                     98: #if DSP_DISASM_REG_PC
1.1.1.2   root       99:        pc_save = dsp_core->pc;
1.1       root      100: #endif
                    101: }
                    102: 
                    103: void dsp56k_disasm_reg_compare(void)
                    104: {
                    105:        int i;
                    106:        
                    107:        for (i=0;i<64;i++) {
                    108:                if (!registers_changed[i]) {
                    109:                        continue;
                    110:                }
                    111: 
                    112:                switch(i) {
                    113:                        case DSP_REG_X0:
                    114:                        case DSP_REG_X1:
                    115:                        case DSP_REG_Y0:
                    116:                        case DSP_REG_Y1:
                    117:                        case DSP_REG_A0:
                    118:                        case DSP_REG_A1:
                    119:                        case DSP_REG_B0:
                    120:                        case DSP_REG_B1:
1.1.1.3 ! root      121:                                fprintf(stderr," Reg: %s: 0x%06x -> 0x%06x\n", registers_name[i], registers_save[i] & BITMASK(24), dsp_core->registers[i]  & BITMASK(24));
1.1       root      122:                                break;
                    123:                        case DSP_REG_R0:
                    124:                        case DSP_REG_R1:
                    125:                        case DSP_REG_R2:
                    126:                        case DSP_REG_R3:
                    127:                        case DSP_REG_R4:
                    128:                        case DSP_REG_R5:
                    129:                        case DSP_REG_R6:
                    130:                        case DSP_REG_R7:
                    131:                        case DSP_REG_M0:
                    132:                        case DSP_REG_M1:
                    133:                        case DSP_REG_M2:
                    134:                        case DSP_REG_M3:
                    135:                        case DSP_REG_M4:
                    136:                        case DSP_REG_M5:
                    137:                        case DSP_REG_M6:
                    138:                        case DSP_REG_M7:
                    139:                        case DSP_REG_N0:
                    140:                        case DSP_REG_N1:
                    141:                        case DSP_REG_N2:
                    142:                        case DSP_REG_N3:
                    143:                        case DSP_REG_N4:
                    144:                        case DSP_REG_N5:
                    145:                        case DSP_REG_N6:
                    146:                        case DSP_REG_N7:
                    147:                        case DSP_REG_SR:
                    148:                        case DSP_REG_LA:
                    149:                        case DSP_REG_LC:
1.1.1.3 ! root      150:                                fprintf(stderr," Reg: %s: 0x%04x -> 0x%04x\n", registers_name[i], registers_save[i] & BITMASK(16), dsp_core->registers[i]  & BITMASK(16));
1.1       root      151:                                break;
                    152:                        case DSP_REG_A2:
                    153:                        case DSP_REG_B2:
                    154:                        case DSP_REG_OMR:
                    155:                        case DSP_REG_SP:
                    156:                        case DSP_REG_SSH:
                    157:                        case DSP_REG_SSL:
1.1.1.3 ! root      158:                                fprintf(stderr," Reg: %s: 0x%02x -> 0x%02x\n", registers_name[i], registers_save[i] & BITMASK(8), dsp_core->registers[i]  & BITMASK(8));
1.1       root      159:                                break;
                    160:                        case DSP_REG_A:
                    161:                        case DSP_REG_B:
                    162:                                {
1.1.1.3 ! root      163:                                        fprintf(stderr," Reg: %s: 0x%02x:%06x:%06x -> 0x%02x:%06x:%06x\n",
1.1       root      164:                                                registers_name[i],
                    165:                                                registers_save[DSP_REG_A2+(i & 1)] & BITMASK(8),
                    166:                                                registers_save[DSP_REG_A1+(i & 1)] & BITMASK(24),
                    167:                                                registers_save[DSP_REG_A0+(i & 1)] & BITMASK(24),
1.1.1.2   root      168:                                                dsp_core->registers[DSP_REG_A2+(i & 1)]  & BITMASK(8),
                    169:                                                dsp_core->registers[DSP_REG_A1+(i & 1)]  & BITMASK(24),
                    170:                                                dsp_core->registers[DSP_REG_A0+(i & 1)]  & BITMASK(24)
1.1       root      171:                                        );
                    172:                                }
                    173:                                break;
                    174:                }
                    175:        }
                    176: #if DSP_DISASM_REG_PC
1.1.1.2   root      177:        if (pc_save != dsp_core->pc) {
1.1.1.3 ! root      178:                fprintf(stderr," Reg: pc: 0x%04x -> 0x%04x\n", pc_save, dsp_core->pc);
1.1       root      179:        }
                    180: #endif
                    181: }
                    182: 
                    183: /**********************************
                    184:  *     Opcode disassembler
                    185:  **********************************/
                    186: 
1.1.1.2   root      187: static Uint32 read_memory(Uint32 currPc);
                    188: 
1.1       root      189: typedef void (*dsp_emul_t)(void);
                    190: 
                    191: static void opcode8h_0(void);
                    192: 
1.1.1.2   root      193: static int dsp_calc_ea(Uint32 ea_mode, char *dest);
                    194: static void dsp_calc_cc(Uint32 cc_mode, char *dest);
1.1       root      195: static void dsp_undefined(void);
                    196: 
                    197: /* Instructions without parallel moves */
                    198: static void dsp_andi(void);
1.1.1.3 ! root      199: static void dsp_bchg_aa(void);
        !           200: static void dsp_bchg_ea(void);
        !           201: static void dsp_bchg_pp(void);
        !           202: static void dsp_bchg_reg(void);
        !           203: static void dsp_bclr_aa(void);
        !           204: static void dsp_bclr_ea(void);
        !           205: static void dsp_bclr_pp(void);
        !           206: static void dsp_bclr_reg(void);
        !           207: static void dsp_bset_aa(void);
        !           208: static void dsp_bset_ea(void);
        !           209: static void dsp_bset_pp(void);
        !           210: static void dsp_bset_reg(void);
        !           211: static void dsp_btst_aa(void);
        !           212: static void dsp_btst_ea(void);
        !           213: static void dsp_btst_pp(void);
        !           214: static void dsp_btst_reg(void);
1.1       root      215: static void dsp_div(void);
                    216: static void dsp_enddo(void);
                    217: static void dsp_illegal(void);
1.1.1.3 ! root      218: static void dsp_jcc_imm(void);
        !           219: static void dsp_jcc_ea(void);
        !           220: static void dsp_jclr_aa(void);
        !           221: static void dsp_jclr_ea(void);
        !           222: static void dsp_jclr_pp(void);
        !           223: static void dsp_jclr_reg(void);
        !           224: static void dsp_jmp_ea(void);
        !           225: static void dsp_jmp_imm(void);
        !           226: static void dsp_jscc_ea(void);
        !           227: static void dsp_jscc_imm(void);
        !           228: static void dsp_jsclr_aa(void);
        !           229: static void dsp_jsclr_ea(void);
        !           230: static void dsp_jsclr_pp(void);
        !           231: static void dsp_jsclr_reg(void);
        !           232: static void dsp_jset_aa(void);
        !           233: static void dsp_jset_ea(void);
        !           234: static void dsp_jset_pp(void);
        !           235: static void dsp_jset_reg(void);
        !           236: static void dsp_jsr_ea(void);
        !           237: static void dsp_jsr_imm(void);
        !           238: static void dsp_jsset_aa(void);
        !           239: static void dsp_jsset_ea(void);
        !           240: static void dsp_jsset_pp(void);
        !           241: static void dsp_jsset_reg(void);
1.1       root      242: static void dsp_lua(void);
1.1.1.3 ! root      243: static void dsp_movem_ea(void);
        !           244: static void dsp_movem_aa(void);
1.1       root      245: static void dsp_nop(void);
                    246: static void dsp_norm(void);
                    247: static void dsp_ori(void);
                    248: static void dsp_reset(void);
                    249: static void dsp_rti(void);
                    250: static void dsp_rts(void);
                    251: static void dsp_stop(void);
                    252: static void dsp_swi(void);
                    253: static void dsp_tcc(void);
                    254: static void dsp_wait(void);
1.1.1.3 ! root      255: static void dsp_do_ea(void);
        !           256: static void dsp_do_aa(void);
        !           257: static void dsp_do_imm(void);
        !           258: static void dsp_do_reg(void);
        !           259: static void dsp_rep_aa(void);
        !           260: static void dsp_rep_ea(void);
        !           261: static void dsp_rep_imm(void);
        !           262: static void dsp_rep_reg(void);
        !           263: static void dsp_movec_aa(void);
        !           264: static void dsp_movec_ea(void);
        !           265: static void dsp_movec_imm(void);
        !           266: static void dsp_movec_reg(void);
1.1       root      267: static void dsp_movep_0(void);
                    268: static void dsp_movep_1(void);
1.1.1.3 ! root      269: static void dsp_movep_23(void);
1.1       root      270: 
                    271: /* Parallel moves */
1.1.1.3 ! root      272: static void dsp_pm_class2(void);
1.1       root      273: static void dsp_pm(void);
                    274: static void dsp_pm_0(void);
                    275: static void dsp_pm_1(void);
                    276: static void dsp_pm_2(void);
                    277: static void dsp_pm_4(void);
                    278: static void dsp_pm_8(void);
                    279: 
                    280: /* Instructions with parallel moves */
                    281: static void dsp_abs(void);
                    282: static void dsp_adc(void);
                    283: static void dsp_add(void);
                    284: static void dsp_addl(void);
                    285: static void dsp_addr(void);
                    286: static void dsp_and(void);
                    287: static void dsp_asl(void);
                    288: static void dsp_asr(void);
                    289: static void dsp_clr(void);
                    290: static void dsp_cmp(void);
                    291: static void dsp_cmpm(void);
                    292: static void dsp_eor(void);
                    293: static void dsp_lsl(void);
                    294: static void dsp_lsr(void);
                    295: static void dsp_mac(void);
                    296: static void dsp_macr(void);
                    297: static void dsp_move(void);
                    298: static void dsp_mpy(void);
                    299: static void dsp_mpyr(void);
                    300: static void dsp_neg(void);
                    301: static void dsp_not(void);
                    302: static void dsp_or(void);
                    303: static void dsp_rnd(void);
                    304: static void dsp_rol(void);
                    305: static void dsp_ror(void);
                    306: static void dsp_sbc(void);
                    307: static void dsp_sub(void);
                    308: static void dsp_subl(void);
                    309: static void dsp_subr(void);
                    310: static void dsp_tfr(void);
                    311: static void dsp_tst(void);
                    312: 
1.1.1.3 ! root      313: static dsp_emul_t opcodes8h[512]={
        !           314:        /* 0x00 - 0x3f */
        !           315:        opcode8h_0, dsp_undefined, dsp_undefined, dsp_undefined, opcode8h_0, dsp_andi, dsp_undefined, dsp_ori,
        !           316:        dsp_undefined, dsp_undefined, dsp_undefined, dsp_undefined, dsp_undefined, dsp_andi, dsp_undefined, dsp_ori,
        !           317:        dsp_undefined, dsp_undefined, dsp_undefined, dsp_undefined, dsp_undefined, dsp_andi, dsp_undefined, dsp_ori,
        !           318:        dsp_undefined, dsp_undefined, dsp_undefined, dsp_undefined, dsp_undefined, dsp_andi, dsp_undefined, dsp_ori,
        !           319:        dsp_undefined, dsp_undefined, dsp_undefined, dsp_undefined, dsp_undefined, dsp_undefined, dsp_undefined, dsp_undefined,
        !           320:        dsp_undefined, dsp_undefined, dsp_undefined, dsp_undefined, dsp_undefined, dsp_undefined, dsp_undefined, dsp_undefined,
        !           321:        dsp_undefined, dsp_undefined, dsp_div, dsp_div, dsp_undefined, dsp_undefined, dsp_undefined, dsp_undefined,
        !           322:        dsp_norm, dsp_undefined, dsp_undefined, dsp_undefined, dsp_undefined, dsp_undefined, dsp_undefined, dsp_undefined,
        !           323:        
        !           324:        /* 0x40 - 0x7f */
        !           325:        dsp_tcc, dsp_tcc, dsp_tcc, dsp_tcc, dsp_undefined, dsp_undefined, dsp_undefined, dsp_undefined,
        !           326:        dsp_tcc, dsp_tcc, dsp_tcc, dsp_tcc, dsp_undefined, dsp_undefined, dsp_undefined, dsp_undefined,
        !           327:        dsp_tcc, dsp_tcc, dsp_tcc, dsp_tcc, dsp_undefined, dsp_undefined, dsp_undefined, dsp_undefined,
        !           328:        dsp_tcc, dsp_tcc, dsp_tcc, dsp_tcc, dsp_undefined, dsp_undefined, dsp_undefined, dsp_undefined,
        !           329:        dsp_tcc, dsp_tcc, dsp_tcc, dsp_tcc, dsp_undefined, dsp_undefined, dsp_undefined, dsp_undefined,
        !           330:        dsp_tcc, dsp_tcc, dsp_tcc, dsp_tcc, dsp_undefined, dsp_undefined, dsp_undefined, dsp_undefined,
        !           331:        dsp_tcc, dsp_tcc, dsp_tcc, dsp_tcc, dsp_undefined, dsp_undefined, dsp_undefined, dsp_undefined,
        !           332:        dsp_tcc, dsp_tcc, dsp_tcc, dsp_tcc, dsp_undefined, dsp_undefined, dsp_undefined, dsp_undefined,
        !           333: 
        !           334:        /* 0x80 - 0xbf */
        !           335:        dsp_undefined, dsp_undefined, dsp_undefined, dsp_undefined, dsp_undefined, dsp_undefined, dsp_undefined, dsp_undefined,
        !           336:        dsp_lua, dsp_undefined, dsp_undefined, dsp_undefined, dsp_undefined, dsp_movec_reg, dsp_undefined, dsp_undefined, 
        !           337:        dsp_undefined, dsp_undefined, dsp_undefined, dsp_undefined, dsp_undefined, dsp_undefined, dsp_undefined, dsp_undefined,
        !           338:        dsp_undefined, dsp_undefined, dsp_undefined, dsp_undefined, dsp_undefined, dsp_movec_reg, dsp_undefined, dsp_undefined, 
        !           339:        dsp_undefined, dsp_movec_aa, dsp_undefined, dsp_movec_aa, dsp_undefined, dsp_movec_imm, dsp_undefined, dsp_undefined,
        !           340:        dsp_undefined, dsp_movec_ea, dsp_undefined, dsp_movec_ea, dsp_undefined, dsp_movec_imm, dsp_undefined, dsp_undefined,
        !           341:        dsp_undefined, dsp_movec_aa, dsp_undefined, dsp_movec_aa, dsp_undefined, dsp_movec_imm, dsp_undefined, dsp_undefined,
        !           342:        dsp_undefined, dsp_movec_ea, dsp_undefined, dsp_movec_ea, dsp_undefined, dsp_movec_imm, dsp_undefined, dsp_undefined,
        !           343:        
        !           344:        /* 0xc0 - 0xff */
        !           345:        dsp_do_aa, dsp_rep_aa, dsp_do_aa, dsp_rep_aa, dsp_do_imm, dsp_rep_imm, dsp_undefined, dsp_undefined, 
        !           346:        dsp_do_ea, dsp_rep_ea, dsp_do_ea, dsp_rep_ea, dsp_do_imm, dsp_rep_imm, dsp_undefined, dsp_undefined, 
        !           347:        dsp_undefined, dsp_undefined, dsp_undefined, dsp_undefined, dsp_do_imm, dsp_rep_imm, dsp_undefined, dsp_undefined, 
        !           348:        dsp_do_reg, dsp_rep_reg, dsp_undefined, dsp_undefined, dsp_do_imm, dsp_rep_imm, dsp_undefined, dsp_undefined, 
        !           349:        dsp_movem_aa, dsp_movem_aa, dsp_undefined, dsp_undefined, dsp_undefined, dsp_undefined, dsp_undefined, dsp_undefined, 
        !           350:        dsp_undefined, dsp_undefined, dsp_undefined, dsp_undefined, dsp_movem_ea, dsp_movem_ea, dsp_undefined, dsp_undefined, 
        !           351:        dsp_movem_aa, dsp_movem_aa, dsp_undefined, dsp_undefined, dsp_undefined, dsp_undefined, dsp_undefined, dsp_undefined, 
        !           352:        dsp_undefined, dsp_undefined, dsp_undefined, dsp_undefined, dsp_movem_ea, dsp_movem_ea, dsp_undefined, dsp_undefined, 
        !           353: 
        !           354:        /* 0x100 - 0x13f */
        !           355:        dsp_pm_class2, dsp_pm_class2, dsp_pm_class2, dsp_pm_class2, dsp_pm_class2, dsp_pm_class2, dsp_pm_class2, dsp_pm_class2,
        !           356:        dsp_movep_0, dsp_movep_0, dsp_movep_1, dsp_movep_1, dsp_movep_23, dsp_movep_23, dsp_movep_23, dsp_movep_23,
        !           357:        dsp_pm_class2, dsp_pm_class2, dsp_pm_class2, dsp_pm_class2, dsp_pm_class2, dsp_pm_class2, dsp_pm_class2, dsp_pm_class2,
        !           358:        dsp_movep_0, dsp_movep_0, dsp_movep_1, dsp_movep_1, dsp_movep_23, dsp_movep_23, dsp_movep_23, dsp_movep_23,
        !           359:        dsp_pm_class2, dsp_pm_class2, dsp_pm_class2, dsp_pm_class2, dsp_pm_class2, dsp_pm_class2, dsp_pm_class2, dsp_pm_class2,
        !           360:        dsp_movep_0, dsp_movep_0, dsp_movep_1, dsp_movep_1, dsp_movep_23, dsp_movep_23, dsp_movep_23, dsp_movep_23,
        !           361:        dsp_pm_class2, dsp_pm_class2, dsp_pm_class2, dsp_pm_class2, dsp_pm_class2, dsp_pm_class2, dsp_pm_class2, dsp_pm_class2,
        !           362:        dsp_movep_0, dsp_movep_0, dsp_movep_1, dsp_movep_1, dsp_movep_23, dsp_movep_23, dsp_movep_23, dsp_movep_23,
        !           363: 
        !           364:        /* 0x140 - 0x17f */
        !           365:        dsp_bclr_aa, dsp_bset_aa, dsp_bclr_aa, dsp_bset_aa, dsp_jclr_aa, dsp_jset_aa, dsp_jclr_aa, dsp_jset_aa,
        !           366:        dsp_bclr_ea, dsp_bset_ea, dsp_bclr_ea, dsp_bset_ea, dsp_jclr_ea, dsp_jset_ea, dsp_jclr_ea, dsp_jset_ea,
        !           367:        dsp_bclr_pp, dsp_bset_pp, dsp_bclr_pp, dsp_bset_pp, dsp_jclr_pp, dsp_jset_pp, dsp_jclr_pp, dsp_jset_pp,
        !           368:        dsp_jclr_reg, dsp_jset_reg, dsp_bclr_reg, dsp_bset_reg, dsp_jmp_ea, dsp_jcc_ea, dsp_undefined, dsp_undefined,
        !           369:        dsp_bchg_aa, dsp_btst_aa, dsp_bchg_aa, dsp_btst_aa, dsp_jsclr_aa, dsp_jsset_aa, dsp_jsclr_aa, dsp_jsset_aa,
        !           370:        dsp_bchg_ea, dsp_btst_ea, dsp_bchg_ea, dsp_btst_ea, dsp_jsclr_ea, dsp_jsset_ea, dsp_jsclr_ea, dsp_jsset_ea,
        !           371:        dsp_bchg_pp, dsp_btst_pp, dsp_bchg_pp, dsp_btst_pp, dsp_jsclr_pp, dsp_jsset_pp, dsp_jsclr_pp, dsp_jsset_pp,
        !           372:        dsp_jsclr_reg, dsp_jsset_reg, dsp_bchg_reg, dsp_btst_reg, dsp_jsr_ea, dsp_jscc_ea, dsp_undefined, dsp_undefined,
        !           373: 
        !           374:        /* 0x180 - 0x1bf */
        !           375:        dsp_jmp_imm, dsp_jmp_imm, dsp_jmp_imm, dsp_jmp_imm, dsp_jmp_imm, dsp_jmp_imm, dsp_jmp_imm, dsp_jmp_imm,
        !           376:        dsp_undefined, dsp_undefined, dsp_undefined, dsp_undefined, dsp_undefined, dsp_undefined, dsp_undefined, dsp_undefined, 
        !           377:        dsp_undefined, dsp_undefined, dsp_undefined, dsp_undefined, dsp_undefined, dsp_undefined, dsp_undefined, dsp_undefined, 
        !           378:        dsp_undefined, dsp_undefined, dsp_undefined, dsp_undefined, dsp_undefined, dsp_undefined, dsp_undefined, dsp_undefined, 
        !           379:        dsp_jsr_imm, dsp_jsr_imm, dsp_jsr_imm, dsp_jsr_imm, dsp_jsr_imm, dsp_jsr_imm, dsp_jsr_imm, dsp_jsr_imm, 
        !           380:        dsp_undefined, dsp_undefined, dsp_undefined, dsp_undefined, dsp_undefined, dsp_undefined, dsp_undefined, dsp_undefined, 
        !           381:        dsp_undefined, dsp_undefined, dsp_undefined, dsp_undefined, dsp_undefined, dsp_undefined, dsp_undefined, dsp_undefined, 
        !           382:        dsp_undefined, dsp_undefined, dsp_undefined, dsp_undefined, dsp_undefined, dsp_undefined, dsp_undefined, dsp_undefined, 
        !           383: 
        !           384:        /* 0x1c0 - 0x1ff */
        !           385:        dsp_jcc_imm, dsp_jcc_imm, dsp_jcc_imm, dsp_jcc_imm, dsp_jcc_imm, dsp_jcc_imm, dsp_jcc_imm, dsp_jcc_imm, 
        !           386:        dsp_jcc_imm, dsp_jcc_imm, dsp_jcc_imm, dsp_jcc_imm, dsp_jcc_imm, dsp_jcc_imm, dsp_jcc_imm, dsp_jcc_imm, 
        !           387:        dsp_jcc_imm, dsp_jcc_imm, dsp_jcc_imm, dsp_jcc_imm, dsp_jcc_imm, dsp_jcc_imm, dsp_jcc_imm, dsp_jcc_imm, 
        !           388:        dsp_jcc_imm, dsp_jcc_imm, dsp_jcc_imm, dsp_jcc_imm, dsp_jcc_imm, dsp_jcc_imm, dsp_jcc_imm, dsp_jcc_imm, 
        !           389:        dsp_jscc_imm, dsp_jscc_imm, dsp_jscc_imm, dsp_jscc_imm, dsp_jscc_imm, dsp_jscc_imm, dsp_jscc_imm, dsp_jscc_imm, 
        !           390:        dsp_jscc_imm, dsp_jscc_imm, dsp_jscc_imm, dsp_jscc_imm, dsp_jscc_imm, dsp_jscc_imm, dsp_jscc_imm, dsp_jscc_imm, 
        !           391:        dsp_jscc_imm, dsp_jscc_imm, dsp_jscc_imm, dsp_jscc_imm, dsp_jscc_imm, dsp_jscc_imm, dsp_jscc_imm, dsp_jscc_imm, 
        !           392:        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      393: };
                    394: 
1.1.1.3 ! root      395: static dsp_emul_t opcodes_alu[256]={
        !           396:        /* 0x00 - 0x3f */
        !           397:        dsp_move, dsp_tfr, dsp_addr, dsp_tst, dsp_undefined, dsp_cmp, dsp_subr, dsp_cmpm,
        !           398:        dsp_undefined, dsp_tfr, dsp_addr, dsp_tst, dsp_undefined, dsp_cmp, dsp_subr, dsp_cmpm,
        !           399:        dsp_add, dsp_rnd, dsp_addl, dsp_clr, dsp_sub, dsp_undefined, dsp_subl, dsp_not,
        !           400:        dsp_add, dsp_rnd, dsp_addl, dsp_clr, dsp_sub, dsp_undefined, dsp_subl, dsp_not,
        !           401:        dsp_add, dsp_adc, dsp_asr, dsp_lsr, dsp_sub, dsp_sbc, dsp_abs, dsp_ror,
        !           402:        dsp_add, dsp_adc, dsp_asr, dsp_lsr, dsp_sub, dsp_sbc, dsp_abs, dsp_ror,
        !           403:        dsp_add, dsp_adc, dsp_asl, dsp_lsl, dsp_sub, dsp_sbc, dsp_neg, dsp_rol,
        !           404:        dsp_add, dsp_adc, dsp_asl, dsp_lsl, dsp_sub, dsp_sbc, dsp_neg, dsp_rol,
        !           405:        
        !           406:        /* 0x40 - 0x7f */
        !           407:        dsp_add, dsp_tfr, dsp_or, dsp_eor, dsp_sub, dsp_cmp, dsp_and, dsp_cmpm,
        !           408:        dsp_add, dsp_tfr, dsp_or, dsp_eor, dsp_sub, dsp_cmp, dsp_and, dsp_cmpm,
        !           409:        dsp_add, dsp_tfr, dsp_or, dsp_eor, dsp_sub, dsp_cmp, dsp_and, dsp_cmpm,
        !           410:        dsp_add, dsp_tfr, dsp_or, dsp_eor, dsp_sub, dsp_cmp, dsp_and, dsp_cmpm,
        !           411:        dsp_add, dsp_tfr, dsp_or, dsp_eor, dsp_sub, dsp_cmp, dsp_and, dsp_cmpm,
        !           412:        dsp_add, dsp_tfr, dsp_or, dsp_eor, dsp_sub, dsp_cmp, dsp_and, dsp_cmpm,
        !           413:        dsp_add, dsp_tfr, dsp_or, dsp_eor, dsp_sub, dsp_cmp, dsp_and, dsp_cmpm,
        !           414:        dsp_add, dsp_tfr, dsp_or, dsp_eor, dsp_sub, dsp_cmp, dsp_and, dsp_cmpm,
        !           415: 
        !           416:        /* 0x80 - 0xbf */
        !           417:        dsp_mpy, dsp_mpyr, dsp_mac, dsp_macr, dsp_mpy, dsp_mpyr, dsp_mac, dsp_macr,
        !           418:        dsp_mpy, dsp_mpyr, dsp_mac, dsp_macr, dsp_mpy, dsp_mpyr, dsp_mac, dsp_macr,
        !           419:        dsp_mpy, dsp_mpyr, dsp_mac, dsp_macr, dsp_mpy, dsp_mpyr, dsp_mac, dsp_macr,
        !           420:        dsp_mpy, dsp_mpyr, dsp_mac, dsp_macr, dsp_mpy, dsp_mpyr, dsp_mac, dsp_macr,
        !           421:        dsp_mpy, dsp_mpyr, dsp_mac, dsp_macr, dsp_mpy, dsp_mpyr, dsp_mac, dsp_macr,
        !           422:        dsp_mpy, dsp_mpyr, dsp_mac, dsp_macr, dsp_mpy, dsp_mpyr, dsp_mac, dsp_macr,
        !           423:        dsp_mpy, dsp_mpyr, dsp_mac, dsp_macr, dsp_mpy, dsp_mpyr, dsp_mac, dsp_macr,
        !           424:        dsp_mpy, dsp_mpyr, dsp_mac, dsp_macr, dsp_mpy, dsp_mpyr, dsp_mac, dsp_macr,
        !           425: 
        !           426:        /* 0xc0 - 0xff */
        !           427:        dsp_mpy, dsp_mpyr, dsp_mac, dsp_macr, dsp_mpy, dsp_mpyr, dsp_mac, dsp_macr,
        !           428:        dsp_mpy, dsp_mpyr, dsp_mac, dsp_macr, dsp_mpy, dsp_mpyr, dsp_mac, dsp_macr,
        !           429:        dsp_mpy, dsp_mpyr, dsp_mac, dsp_macr, dsp_mpy, dsp_mpyr, dsp_mac, dsp_macr,
        !           430:        dsp_mpy, dsp_mpyr, dsp_mac, dsp_macr, dsp_mpy, dsp_mpyr, dsp_mac, dsp_macr,
        !           431:        dsp_mpy, dsp_mpyr, dsp_mac, dsp_macr, dsp_mpy, dsp_mpyr, dsp_mac, dsp_macr,
        !           432:        dsp_mpy, dsp_mpyr, dsp_mac, dsp_macr, dsp_mpy, dsp_mpyr, dsp_mac, dsp_macr,
        !           433:        dsp_mpy, dsp_mpyr, dsp_mac, dsp_macr, dsp_mpy, dsp_mpyr, dsp_mac, dsp_macr,
        !           434:        dsp_mpy, dsp_mpyr, dsp_mac, dsp_macr, dsp_mpy, dsp_mpyr, dsp_mac, dsp_macr
1.1       root      435: };
                    436: 
                    437: 
                    438: static dsp_emul_t opcodes_parmove[16]={
                    439:        dsp_pm_0,
                    440:        dsp_pm_1,
                    441:        dsp_pm_2,
                    442:        dsp_pm_2,
                    443:        dsp_pm_4,
                    444:        dsp_pm_4,
                    445:        dsp_pm_4,
                    446:        dsp_pm_4,
                    447: 
                    448:        dsp_pm_8,
                    449:        dsp_pm_8,
                    450:        dsp_pm_8,
                    451:        dsp_pm_8,
                    452:        dsp_pm_8,
                    453:        dsp_pm_8,
                    454:        dsp_pm_8,
                    455:        dsp_pm_8
                    456: };
                    457: 
                    458: static int registers_tcc[16][2]={
                    459:        {DSP_REG_B,DSP_REG_A},
                    460:        {DSP_REG_A,DSP_REG_B},
                    461:        {DSP_REG_NULL,DSP_REG_NULL},
                    462:        {DSP_REG_NULL,DSP_REG_NULL},
                    463: 
                    464:        {DSP_REG_NULL,DSP_REG_NULL},
                    465:        {DSP_REG_NULL,DSP_REG_NULL},
                    466:        {DSP_REG_NULL,DSP_REG_NULL},
                    467:        {DSP_REG_NULL,DSP_REG_NULL},
                    468: 
                    469:        {DSP_REG_X0,DSP_REG_A},
                    470:        {DSP_REG_X0,DSP_REG_B},
                    471:        {DSP_REG_Y0,DSP_REG_A},
                    472:        {DSP_REG_Y0,DSP_REG_B},
1.1.1.2   root      473: 
                    474:        {DSP_REG_X1,DSP_REG_A},
                    475:        {DSP_REG_X1,DSP_REG_B},
1.1       root      476:        {DSP_REG_Y1,DSP_REG_A},
                    477:        {DSP_REG_Y1,DSP_REG_B}
                    478: };
                    479: 
                    480: static const char *registers_lmove[8]={
                    481:        "a10",
                    482:        "b10",
                    483:        "x",
                    484:        "y",
                    485:        "a",
                    486:        "b",
                    487:        "ab",
                    488:        "ba"
                    489: };
                    490: 
1.1.1.3 ! root      491: static int disasm_registers_lmove[8][2]={
        !           492:        {DSP_REG_A1,DSP_REG_A0},        /* A10 */
        !           493:        {DSP_REG_B1,DSP_REG_B0},        /* B10 */
        !           494:        {DSP_REG_X1,DSP_REG_X0},        /* X */
        !           495:        {DSP_REG_Y1,DSP_REG_Y0},        /* Y */
        !           496:        {DSP_REG_A,DSP_REG_A},          /* A */
        !           497:        {DSP_REG_B,DSP_REG_B},          /* B */
        !           498:        {DSP_REG_A,DSP_REG_B},          /* AB */
        !           499:        {DSP_REG_B,DSP_REG_A}           /* BA */
        !           500: };
        !           501: 
1.1       root      502: static const char *ea_names[9]={
                    503:        "(r%d)-n%d",    /* 000xxx */
                    504:        "(r%d)+n%d",    /* 001xxx */
                    505:        "(r%d)-",               /* 010xxx */
                    506:        "(r%d)+",               /* 011xxx */
                    507:        "(r%d)",                /* 100xxx */
                    508:        "(r%d+n%d)",    /* 101xxx */
                    509:        "0x%04x",               /* 110000 */
                    510:        "-(r%d)",               /* 111xxx */
                    511:        "0x%06x"                /* 110100 */
                    512: };
                    513: 
                    514: static const char *cc_name[16]={
                    515:        "cc",
                    516:        "ge",
                    517:        "ne",
                    518:        "pl",
                    519:        "nn",
                    520:        "ec",
                    521:        "lc",
                    522:        "gt",
                    523:        
                    524:        "cs",
                    525:        "lt",
                    526:        "eq",
                    527:        "mi",
                    528:        "nr",
                    529:        "es",
                    530:        "ls",
                    531:        "le"
                    532: };
                    533: 
                    534: static char parallelmove_name[64];
                    535: 
1.1.1.3 ! root      536: Uint16 dsp56k_disasm(void)
1.1       root      537: {
1.1.1.2   root      538:        Uint32 value;
1.1       root      539: 
1.1.1.3 ! root      540:        if (prev_inst_pc == dsp_core->pc){
        !           541:                return 0;
        !           542:        }
        !           543:        prev_inst_pc = dsp_core->pc;
        !           544: 
1.1.1.2   root      545:        cur_inst = read_memory(dsp_core->pc);
1.1.1.3 ! root      546:        disasm_cur_inst_len = 1;
1.1       root      547: 
                    548:        strcpy(parallelmove_name, "");
                    549: 
1.1.1.3 ! root      550:        if (cur_inst < 0x100000) {
        !           551:                value = (cur_inst >> 11) & (BITMASK(6) << 3);
        !           552:                value += (cur_inst >> 5) & BITMASK(3);
1.1       root      553:                opcodes8h[value]();
                    554:        } else {
                    555:                dsp_pm();
                    556:                value = cur_inst & BITMASK(8);
1.1.1.3 ! root      557:                opcodes_alu[value]();
        !           558:        }
        !           559: 
        !           560:        if (disasm_cur_inst_len == 1) {
        !           561:                fprintf(stderr, "%04x: %06x        %s", dsp_core->pc, cur_inst, str_instr);
        !           562:        } else {
        !           563:                fprintf(stderr, "%04x: %06x %06x %s", dsp_core->pc, cur_inst, read_memory(dsp_core->pc + 1), str_instr);
1.1       root      564:        }
1.1.1.3 ! root      565:        return disasm_cur_inst_len;
1.1       root      566: }
                    567: 
1.1.1.3 ! root      568: static void dsp_pm_class2(void) {
        !           569:        Uint32 value;
        !           570: 
        !           571:        dsp_pm();
        !           572:        value = cur_inst & BITMASK(8);
        !           573:        opcodes_alu[value]();
        !           574: } 
        !           575: 
1.1.1.2   root      576: void dsp56k_disasm_force_reg_changed(int num_dsp_reg)
                    577: {
                    578:        registers_changed[num_dsp_reg]=1;
                    579: }
                    580: 
                    581: static Uint32 read_memory(Uint32 currPc)
                    582: {
                    583:        Uint32 value;
                    584: 
                    585:        if (currPc<0x200) {
                    586:                value = dsp_core->ramint[DSP_SPACE_P][currPc];
                    587:        } else {
1.1.1.3 ! root      588:                value = dsp_core->ramext[currPc & (DSP_RAMSIZE-1)];
1.1.1.2   root      589:        }
                    590: 
                    591:        return value & BITMASK(24);
                    592: }
                    593: 
1.1       root      594: /**********************************
                    595:  *     Conditions code calculation
                    596:  **********************************/
                    597: 
1.1.1.2   root      598: static void dsp_calc_cc(Uint32 cc_mode, char *dest)
1.1       root      599: {
                    600:        strcpy(dest, cc_name[cc_mode & BITMASK(4)]);
                    601: }
                    602: 
                    603: /**********************************
                    604:  *     Effective address calculation
                    605:  **********************************/
                    606: 
1.1.1.2   root      607: static int dsp_calc_ea(Uint32 ea_mode, char *dest)
1.1       root      608: {
                    609:        int value, retour, numreg;
                    610: 
                    611:        value = (ea_mode >> 3) & BITMASK(3);
                    612:        numreg = ea_mode & BITMASK(3);
                    613:        retour = 0;
                    614:        switch (value) {
                    615:                case 0:
                    616:                        /* (Rx)-Nx */
                    617:                        sprintf(dest, ea_names[value], numreg, numreg);
                    618:                        registers_changed[DSP_REG_R0+numreg]=1;
                    619:                        break;
                    620:                case 1:
                    621:                        /* (Rx)+Nx */
                    622:                        sprintf(dest, ea_names[value], numreg, numreg);
                    623:                        registers_changed[DSP_REG_R0+numreg]=1;
                    624:                        break;
                    625:                case 5:
                    626:                        /* (Rx+Nx) */
                    627:                        sprintf(dest, ea_names[value], numreg, numreg);
                    628:                        break;
                    629:                case 2:
                    630:                        /* (Rx)- */
                    631:                        sprintf(dest, ea_names[value], numreg);
                    632:                        registers_changed[DSP_REG_R0+numreg]=1;
                    633:                        break;
                    634:                case 3:
                    635:                        /* (Rx)+ */
                    636:                        sprintf(dest, ea_names[value], numreg);
                    637:                        registers_changed[DSP_REG_R0+numreg]=1;
                    638:                        break;
                    639:                case 4:
                    640:                        /* (Rx) */
                    641:                        sprintf(dest, ea_names[value], numreg);
                    642:                        break;
                    643:                case 7:
                    644:                        /* -(Rx) */
                    645:                        sprintf(dest, ea_names[value], numreg);
                    646:                        registers_changed[DSP_REG_R0+numreg]=1;
                    647:                        break;
                    648:                case 6:
1.1.1.3 ! root      649:                        disasm_cur_inst_len++;
1.1       root      650:                        switch ((ea_mode >> 2) & 1) {
                    651:                                case 0:
                    652:                                        /* Absolute address */
1.1.1.2   root      653:                                        sprintf(dest, ea_names[value], read_memory(dsp_core->pc+1));
1.1       root      654:                                        break;
                    655:                                case 1:
                    656:                                        /* Immediate value */
1.1.1.2   root      657:                                        sprintf(dest, ea_names[8], read_memory(dsp_core->pc+1));
1.1       root      658:                                        retour = 1;
                    659:                                        break;
                    660:                        }
                    661:                        break;
                    662:        }
                    663:        return retour;
                    664: }
                    665: 
                    666: static void opcode8h_0(void)
                    667: {
1.1.1.3 ! root      668:        switch(cur_inst) {
        !           669:                case 0x000000:
        !           670:                        dsp_nop();
1.1       root      671:                        break;
1.1.1.3 ! root      672:                case 0x000004:
        !           673:                        dsp_rti();
1.1       root      674:                        break;
1.1.1.3 ! root      675:                case 0x000005:
        !           676:                        dsp_illegal();
1.1       root      677:                        break;
1.1.1.3 ! root      678:                case 0x000006:
        !           679:                        dsp_swi();
        !           680:                        break;
        !           681:                case 0x00000c:
        !           682:                        dsp_rts();
        !           683:                        break;
        !           684:                case 0x000084:
        !           685:                        dsp_reset();
        !           686:                        break;
        !           687:                case 0x000086:
        !           688:                        dsp_wait();
        !           689:                        break;
        !           690:                case 0x000087:
        !           691:                        dsp_stop();
        !           692:                        break;
        !           693:                case 0x00008c:
        !           694:                        dsp_enddo();
1.1       root      695:                        break;
                    696:        }
                    697: }
                    698: 
                    699: /**********************************
                    700:  *     Non-parallel moves instructions
                    701:  **********************************/
                    702: 
                    703: static void dsp_undefined(void)
                    704: {
1.1.1.3 ! root      705:        sprintf(str_instr," 0x%06x unknown instruction\n", cur_inst);
1.1       root      706: }
                    707: 
                    708: static void dsp_andi(void)
                    709: {
                    710:        const char *regname;
                    711: 
                    712:        switch(cur_inst & BITMASK(2)) {
                    713:                case 0:
                    714:                        regname="mr";
                    715:                        registers_changed[DSP_REG_SR]=1;
                    716:                        break;
                    717:                case 1:
                    718:                        regname="ccr";
                    719:                        registers_changed[DSP_REG_SR]=1;
                    720:                        break;
                    721:                case 2:
                    722:                        regname="omr";
                    723:                        registers_changed[DSP_REG_OMR]=1;
                    724:                        break;
                    725:                default:
                    726:                        regname="";
                    727:                        break;
                    728:        }
                    729: 
1.1.1.2   root      730:        registers_changed[DSP_REG_SR]=1;
                    731: 
1.1.1.3 ! root      732:        sprintf(str_instr," andi #0x%02x,%s\n",
1.1       root      733:                (cur_inst>>8) & BITMASK(8),
                    734:                regname
                    735:        );
                    736: }
                    737: 
1.1.1.3 ! root      738: static void dsp_bchg_aa(void)
        !           739: {
        !           740:        /* bchg #n,x:aa */
        !           741:        /* bchg #n,y:aa */
        !           742:        char name[16];
        !           743:        Uint32 memspace, value, numbit;
        !           744:        
        !           745:        memspace = (cur_inst>>6) & 1;
        !           746:        value = (cur_inst>>8) & BITMASK(6);
        !           747:        numbit = cur_inst & BITMASK(5);
        !           748: 
        !           749:        if (memspace) {
        !           750:                sprintf(name,"y:0x%04x",value);
        !           751:        } else {
        !           752:                sprintf(name,"x:0x%04x",value);
        !           753:        }
        !           754:        registers_changed[DSP_REG_SR]=1;
        !           755: 
        !           756:        sprintf(str_instr," bchg #%d,%s\n", numbit, name);
        !           757: }
        !           758: 
        !           759: static void dsp_bchg_ea(void)
1.1       root      760: {
1.1.1.3 ! root      761:        /* bchg #n,x:ea */
        !           762:        /* bchg #n,y:ea */
1.1       root      763:        char name[16], addr_name[16];
1.1.1.2   root      764:        Uint32 memspace, value, numbit;
1.1       root      765:        
                    766:        memspace = (cur_inst>>6) & 1;
                    767:        value = (cur_inst>>8) & BITMASK(6);
                    768:        numbit = cur_inst & BITMASK(5);
                    769: 
1.1.1.3 ! root      770:        dsp_calc_ea(value, addr_name);
        !           771:        if (memspace) {
        !           772:                sprintf(name,"y:%s",addr_name);
        !           773:        } else {
        !           774:                sprintf(name,"x:%s",addr_name);
        !           775:        }
        !           776:        registers_changed[DSP_REG_SR]=1;
        !           777: 
        !           778:        sprintf(str_instr," bchg #%d,%s\n", numbit, name);
        !           779: }
        !           780: 
        !           781: static void dsp_bchg_pp(void)
        !           782: {
        !           783:        /* bchg #n,x:pp */
        !           784:        /* bchg #n,y:pp */
        !           785:        char name[16];
        !           786:        Uint32 memspace, value, numbit;
        !           787:        
        !           788:        memspace = (cur_inst>>6) & 1;
        !           789:        value = (cur_inst>>8) & BITMASK(6);
        !           790:        numbit = cur_inst & BITMASK(5);
        !           791: 
        !           792:        if (memspace) {
        !           793:                sprintf(name,"y:0x%04x",value+0xffc0);
        !           794:        } else {
        !           795:                sprintf(name,"x:0x%04x",value+0xffc0);
1.1       root      796:        }
1.1.1.3 ! root      797:        registers_changed[DSP_REG_SR]=1;
        !           798: 
        !           799:        sprintf(str_instr," bchg #%d,%s\n", numbit, name);
        !           800: }
        !           801: 
        !           802: static void dsp_bchg_reg(void)
        !           803: {
        !           804:        /* bchg #n,R */
        !           805:        char name[16];
        !           806:        Uint32 memspace, value, numbit;
        !           807:        
        !           808:        memspace = (cur_inst>>6) & 1;
        !           809:        value = (cur_inst>>8) & BITMASK(6);
        !           810:        numbit = cur_inst & BITMASK(5);
1.1       root      811: 
1.1.1.3 ! root      812:        sprintf(name,"%s",registers_name[value]);
        !           813:        registers_changed[value]=1;
1.1.1.2   root      814:        registers_changed[DSP_REG_SR]=1;
                    815: 
1.1.1.3 ! root      816:        sprintf(str_instr," bchg #%d,%s\n", numbit, name);
1.1       root      817: }
                    818: 
1.1.1.3 ! root      819: static void dsp_bclr_aa(void)
1.1       root      820: {
1.1.1.3 ! root      821:        /* bclr #n,x:aa */
        !           822:        /* bclr #n,y:aa */
        !           823:        char name[16];
1.1.1.2   root      824:        Uint32 memspace, value, numbit;
1.1       root      825:        
                    826:        memspace = (cur_inst>>6) & 1;
                    827:        value = (cur_inst>>8) & BITMASK(6);
                    828:        numbit = cur_inst & BITMASK(5);
                    829: 
1.1.1.3 ! root      830:        if (memspace) {
        !           831:                sprintf(name,"y:0x%04x",value);
        !           832:        } else {
        !           833:                sprintf(name,"x:0x%04x",value);
1.1       root      834:        }
                    835: 
1.1.1.2   root      836:        registers_changed[DSP_REG_SR]=1;
                    837: 
1.1.1.3 ! root      838:        sprintf(str_instr," bclr #%d,%s\n", numbit, name);
1.1       root      839: }
                    840: 
1.1.1.3 ! root      841: static void dsp_bclr_ea(void)
1.1       root      842: {
1.1.1.3 ! root      843:        /* bclr #n,x:ea */
        !           844:        /* bclr #n,y:ea */
1.1       root      845:        char name[16], addr_name[16];
1.1.1.2   root      846:        Uint32 memspace, value, numbit;
1.1       root      847:        
                    848:        memspace = (cur_inst>>6) & 1;
                    849:        value = (cur_inst>>8) & BITMASK(6);
                    850:        numbit = cur_inst & BITMASK(5);
                    851: 
1.1.1.3 ! root      852:        dsp_calc_ea(value, addr_name);
        !           853:        if (memspace) {
        !           854:                sprintf(name,"y:%s",addr_name);
        !           855:        } else {
        !           856:                sprintf(name,"x:%s",addr_name);
1.1       root      857:        }
                    858: 
1.1.1.2   root      859:        registers_changed[DSP_REG_SR]=1;
                    860: 
1.1.1.3 ! root      861:        sprintf(str_instr," bclr #%d,%s\n", numbit, name);
1.1       root      862: }
                    863: 
1.1.1.3 ! root      864: static void dsp_bclr_pp(void)
1.1       root      865: {
1.1.1.3 ! root      866:        /* bclr #n,x:pp */
        !           867:        /* bclr #n,y:pp */
        !           868:        char name[16];
1.1.1.2   root      869:        Uint32 memspace, value, numbit;
1.1       root      870:        
                    871:        memspace = (cur_inst>>6) & 1;
                    872:        value = (cur_inst>>8) & BITMASK(6);
                    873:        numbit = cur_inst & BITMASK(5);
                    874: 
1.1.1.3 ! root      875:        if (memspace) {
        !           876:                sprintf(name,"y:0x%04x",value+0xffc0);
        !           877:        } else {
        !           878:                sprintf(name,"x:0x%04x",value+0xffc0);
1.1       root      879:        }
                    880: 
1.1.1.2   root      881:        registers_changed[DSP_REG_SR]=1;
                    882: 
1.1.1.3 ! root      883:        sprintf(str_instr," bclr #%d,%s\n", numbit, name);
1.1       root      884: }
                    885: 
1.1.1.3 ! root      886: static void dsp_bclr_reg(void)
1.1       root      887: {
1.1.1.3 ! root      888:        /* bclr #n,R */
        !           889:        char name[16];
        !           890:        Uint32 memspace, value, numbit;
1.1       root      891:        
1.1.1.3 ! root      892:        memspace = (cur_inst>>6) & 1;
        !           893:        value = (cur_inst>>8) & BITMASK(6);
        !           894:        numbit = cur_inst & BITMASK(5);
        !           895: 
        !           896:        sprintf(name,"%s",registers_name[value]);
        !           897:        registers_changed[value]=1;
        !           898: 
        !           899:        registers_changed[DSP_REG_SR]=1;
        !           900: 
        !           901:        sprintf(str_instr," bclr #%d,%s\n", numbit, name);
        !           902: }
        !           903: 
        !           904: static void dsp_bset_aa(void)
        !           905: {
        !           906:        /* bset #n,x:aa */
        !           907:        /* bset #n,y:aa */
        !           908:        char name[16];
        !           909:        Uint32 memspace, value, numbit;
        !           910:        
        !           911:        memspace = (cur_inst>>6) & 1;
        !           912:        value = (cur_inst>>8) & BITMASK(6);
        !           913:        numbit = cur_inst & BITMASK(5);
        !           914: 
        !           915:        if (memspace) {
        !           916:                sprintf(name,"y:0x%04x",value);
        !           917:        } else {
        !           918:                sprintf(name,"x:0x%04x",value);
1.1       root      919:        }
1.1.1.3 ! root      920: 
        !           921:        registers_changed[DSP_REG_SR]=1;
        !           922: 
        !           923:        sprintf(str_instr," bset #%d,%s\n", numbit, name);
        !           924: }
        !           925: 
        !           926: static void dsp_bset_ea(void)
        !           927: {
        !           928:        /* bset #n,x:ea */
        !           929:        /* bset #n,y:ea */
        !           930:        char name[16], addr_name[16];
        !           931:        Uint32 memspace, value, numbit;
        !           932:        
        !           933:        memspace = (cur_inst>>6) & 1;
        !           934:        value = (cur_inst>>8) & BITMASK(6);
        !           935:        numbit = cur_inst & BITMASK(5);
        !           936: 
        !           937:        dsp_calc_ea(value, addr_name);
        !           938:        if (memspace) {
        !           939:                sprintf(name,"y:%s",addr_name);
        !           940:        } else {
        !           941:                sprintf(name,"x:%s",addr_name);
        !           942:        }
        !           943: 
1.1.1.2   root      944:        registers_changed[DSP_REG_SR]=1;
1.1       root      945: 
1.1.1.3 ! root      946:        sprintf(str_instr," bset #%d,%s\n", numbit, name);
        !           947: }
        !           948: 
        !           949: static void dsp_bset_pp(void)
        !           950: {
        !           951:        /* bset #n,x:pp */
        !           952:        /* bset #n,y:pp */
        !           953:        char name[16];
        !           954:        Uint32 memspace, value, numbit;
        !           955:        
        !           956:        memspace = (cur_inst>>6) & 1;
        !           957:        value = (cur_inst>>8) & BITMASK(6);
        !           958:        numbit = cur_inst & BITMASK(5);
        !           959: 
        !           960:        if (memspace) {
        !           961:                sprintf(name,"y:0x%04x",value+0xffc0);
        !           962:        } else {
        !           963:                sprintf(name,"x:0x%04x",value+0xffc0);
        !           964:        }
        !           965: 
        !           966:        registers_changed[DSP_REG_SR]=1;
        !           967: 
        !           968:        sprintf(str_instr," bset #%d,%s\n", numbit, name);
        !           969: }
        !           970: 
        !           971: static void dsp_bset_reg(void)
        !           972: {
        !           973:        /* bset #n,R */
        !           974:        char name[16];
        !           975:        Uint32 memspace, value, numbit;
        !           976:        
        !           977:        memspace = (cur_inst>>6) & 1;
        !           978:        value = (cur_inst>>8) & BITMASK(6);
        !           979:        numbit = cur_inst & BITMASK(5);
        !           980: 
        !           981:        sprintf(name,"%s",registers_name[value]);
        !           982:        registers_changed[value]=1;
        !           983: 
        !           984:        registers_changed[DSP_REG_SR]=1;
        !           985: 
        !           986:        sprintf(str_instr," bset #%d,%s\n", numbit, name);
        !           987: }
        !           988: 
        !           989: static void dsp_btst_aa(void)
        !           990: {
        !           991:        /* btst #n,x:aa */
        !           992:        /* btst #n,y:aa */
        !           993:        char name[16];
        !           994:        Uint32 memspace, value, numbit;
        !           995:        
        !           996:        memspace = (cur_inst>>6) & 1;
        !           997:        value = (cur_inst>>8) & BITMASK(6);
        !           998:        numbit = cur_inst & BITMASK(5);
        !           999: 
        !          1000:        if (memspace) {
        !          1001:                sprintf(name,"y:0x%04x",value);
        !          1002:        } else {
        !          1003:                sprintf(name,"x:0x%04x",value);
        !          1004:        }
        !          1005: 
        !          1006:        registers_changed[DSP_REG_SR]=1;
        !          1007: 
        !          1008:        sprintf(str_instr," btst #%d,%s\n", numbit, name);
        !          1009: }
        !          1010: 
        !          1011: static void dsp_btst_ea(void)
        !          1012: {
        !          1013:        /* btst #n,x:ea */
        !          1014:        /* btst #n,y:ea */
        !          1015:        char name[16], addr_name[16];
        !          1016:        Uint32 memspace, value, numbit;
        !          1017:        
        !          1018:        memspace = (cur_inst>>6) & 1;
        !          1019:        value = (cur_inst>>8) & BITMASK(6);
        !          1020:        numbit = cur_inst & BITMASK(5);
        !          1021: 
        !          1022:        dsp_calc_ea(value, addr_name);
        !          1023:        if (memspace) {
        !          1024:                sprintf(name,"y:%s",addr_name);
        !          1025:        } else {
        !          1026:                sprintf(name,"x:%s",addr_name);
        !          1027:        }
        !          1028: 
        !          1029:        registers_changed[DSP_REG_SR]=1;
        !          1030: 
        !          1031:        sprintf(str_instr," btst #%d,%s\n", numbit, name);
        !          1032: }
        !          1033: 
        !          1034: static void dsp_btst_pp(void)
        !          1035: {
        !          1036:        /* btst #n,x:pp */
        !          1037:        /* btst #n,y:pp */
        !          1038:        char name[16];
        !          1039:        Uint32 memspace, value, numbit;
        !          1040:        
        !          1041:        memspace = (cur_inst>>6) & 1;
        !          1042:        value = (cur_inst>>8) & BITMASK(6);
        !          1043:        numbit = cur_inst & BITMASK(5);
        !          1044: 
        !          1045:        if (memspace) {
        !          1046:                sprintf(name,"y:0x%04x",value+0xffc0);
        !          1047:        } else {
        !          1048:                sprintf(name,"x:0x%04x",value+0xffc0);
        !          1049:        }
        !          1050: 
        !          1051:        registers_changed[DSP_REG_SR]=1;
        !          1052: 
        !          1053:        sprintf(str_instr," btst #%d,%s\n", numbit, name);
        !          1054: }
        !          1055: 
        !          1056: static void dsp_btst_reg(void)
        !          1057: {
        !          1058:        /* btst #n,R */
        !          1059:        char name[16];
        !          1060:        Uint32 memspace, value, numbit;
        !          1061:        
        !          1062:        memspace = (cur_inst>>6) & 1;
        !          1063:        value = (cur_inst>>8) & BITMASK(6);
        !          1064:        numbit = cur_inst & BITMASK(5);
        !          1065: 
        !          1066:        sprintf(name,"%s",registers_name[value]);
        !          1067:        registers_changed[value]=1;
        !          1068: 
        !          1069:        registers_changed[DSP_REG_SR]=1;
        !          1070: 
        !          1071:        sprintf(str_instr," btst #%d,%s\n", numbit, name);
        !          1072: }
        !          1073: 
        !          1074: static void dsp_div(void)
        !          1075: {
        !          1076:        Uint32 srcreg=DSP_REG_NULL, destreg;
        !          1077:        
        !          1078:        switch((cur_inst>>4) & BITMASK(2)) {
        !          1079:                case 0:
        !          1080:                        srcreg = DSP_REG_X0;
        !          1081:                                break;
        !          1082:                case 1:
        !          1083:                        srcreg = DSP_REG_Y0;
        !          1084:                                break;
        !          1085:                case 2:
        !          1086:                        srcreg = DSP_REG_X1;
        !          1087:                                break;
        !          1088:                case 3:
        !          1089:                        srcreg = DSP_REG_Y1;
        !          1090:                                break;
        !          1091:        }
        !          1092:        destreg = DSP_REG_A+((cur_inst>>3) & 1);
        !          1093:        registers_changed[destreg]=1;
        !          1094:        registers_changed[DSP_REG_SR]=1;
        !          1095: 
        !          1096:        sprintf(str_instr," div %s,%s\n", registers_name[srcreg],registers_name[destreg]);
        !          1097: }
        !          1098: 
        !          1099: static void dsp_do_aa(void)
        !          1100: {
        !          1101:        char name[16];
        !          1102: 
        !          1103:        disasm_cur_inst_len++;
        !          1104: 
        !          1105:        if (cur_inst & (1<<6)) {
        !          1106:                sprintf(name, "y:0x%04x", (cur_inst>>8) & BITMASK(6));
        !          1107:        } else {
        !          1108:                sprintf(name, "x:0x%04x", (cur_inst>>8) & BITMASK(6));
        !          1109:        }
        !          1110: 
        !          1111:        sprintf(str_instr," do %s,p:0x%04x\n",
        !          1112:                name,
        !          1113:                read_memory(dsp_core->pc+1)
        !          1114:        );
        !          1115:        registers_changed[DSP_REG_LA]=1;
        !          1116:        registers_changed[DSP_REG_LC]=1;
        !          1117:        registers_changed[DSP_REG_SR]=1;}
        !          1118: 
        !          1119: static void dsp_do_imm(void)
        !          1120: {
        !          1121:        disasm_cur_inst_len++;
        !          1122: 
        !          1123:        sprintf(str_instr," do #0x%04x,p:0x%04x\n",
        !          1124:                ((cur_inst>>8) & BITMASK(8))|((cur_inst & BITMASK(4))<<8),
        !          1125:                read_memory(dsp_core->pc+1)
        !          1126:        );
        !          1127:        registers_changed[DSP_REG_LA]=1;
        !          1128:        registers_changed[DSP_REG_LC]=1;
        !          1129:        registers_changed[DSP_REG_SR]=1;}
        !          1130: 
        !          1131: static void dsp_do_ea(void)
        !          1132: {
        !          1133:        char addr_name[16], name[16];
        !          1134:        Uint32 ea_mode;
        !          1135:        
        !          1136:        disasm_cur_inst_len++;
        !          1137: 
        !          1138:        ea_mode = (cur_inst>>8) & BITMASK(6);
        !          1139:        dsp_calc_ea(ea_mode, addr_name);
        !          1140: 
        !          1141:        if (cur_inst & (1<<6)) {
        !          1142:                sprintf(name, "y:%s", addr_name);
        !          1143:        } else {
        !          1144:                sprintf(name, "x:%s", addr_name);
        !          1145:        }
        !          1146: 
        !          1147:        sprintf(str_instr," do %s,p:0x%04x\n", 
        !          1148:                name,
        !          1149:                read_memory(dsp_core->pc+1)
        !          1150:        );
        !          1151:        registers_changed[DSP_REG_LA]=1;
        !          1152:        registers_changed[DSP_REG_LC]=1;
        !          1153:        registers_changed[DSP_REG_SR]=1;}
        !          1154: 
        !          1155: static void dsp_do_reg(void)
        !          1156: {
        !          1157:        disasm_cur_inst_len++;
        !          1158: 
        !          1159:        sprintf(str_instr," do %s,p:0x%04x\n",
        !          1160:                registers_name[(cur_inst>>8) & BITMASK(6)],
        !          1161:                read_memory(dsp_core->pc+1)
        !          1162:        );
        !          1163:        registers_changed[DSP_REG_LA]=1;
        !          1164:        registers_changed[DSP_REG_LC]=1;
        !          1165:        registers_changed[DSP_REG_SR]=1;}
        !          1166: 
        !          1167: static void dsp_enddo(void)
        !          1168: {
        !          1169:        sprintf(str_instr," enddo\n");
        !          1170: }
        !          1171: 
        !          1172: static void dsp_illegal(void)
        !          1173: {
        !          1174:        sprintf(str_instr," illegal\n");
        !          1175: }
        !          1176: 
        !          1177: static void dsp_jcc_ea(void)
        !          1178: {
        !          1179:        char cond_name[16], addr_name[16];
        !          1180:        Uint32 cc_code=0;
        !          1181:        
        !          1182:        dsp_calc_ea((cur_inst >>8) & BITMASK(6), addr_name);
        !          1183:        cc_code=cur_inst & BITMASK(4);
        !          1184:        dsp_calc_cc(cc_code, cond_name);        
        !          1185: 
        !          1186:        sprintf(str_instr," j%s p:%s\n", cond_name, addr_name);
        !          1187: }
        !          1188: 
        !          1189: static void dsp_jcc_imm(void)
        !          1190: {
        !          1191:        char cond_name[16], addr_name[16];
        !          1192:        Uint32 cc_code=0;
        !          1193:        
        !          1194:        sprintf(addr_name, "0x%04x", cur_inst & BITMASK(12));
        !          1195:        cc_code=(cur_inst>>12) & BITMASK(4);
        !          1196:        dsp_calc_cc(cc_code, cond_name);        
        !          1197: 
        !          1198:        sprintf(str_instr," j%s p:%s\n", cond_name, addr_name);
        !          1199: }
        !          1200: 
        !          1201: static void dsp_jclr_aa(void)
        !          1202: {
        !          1203:        /* jclr #n,x:aa,p:xx */
        !          1204:        /* jclr #n,y:aa,p:xx */
        !          1205:        char srcname[16];
        !          1206:        Uint32 memspace, value, numbit;
        !          1207:        
        !          1208:        disasm_cur_inst_len++;
        !          1209: 
        !          1210:        memspace = (cur_inst>>6) & 1;
        !          1211:        value = (cur_inst>>8) & BITMASK(6);
        !          1212:        numbit = cur_inst & BITMASK(5);
        !          1213: 
        !          1214:        if (memspace) {
        !          1215:                sprintf(srcname, "y:0x%04x", value);
        !          1216:        } else {
        !          1217:                sprintf(srcname, "x:0x%04x", value);
        !          1218:        }
        !          1219: 
        !          1220:        sprintf(str_instr," jclr #%d,%s,p:0x%04x\n",
        !          1221:                numbit,
        !          1222:                srcname,
        !          1223:                read_memory(dsp_core->pc+1)
        !          1224:        );
        !          1225: }
        !          1226: 
        !          1227: static void dsp_jclr_ea(void)
        !          1228: {
        !          1229:        /* jclr #n,x:ea,p:xx */
        !          1230:        /* jclr #n,y:ea,p:xx */
        !          1231:        char srcname[16], addr_name[16];
        !          1232:        Uint32 memspace, value, numbit;
        !          1233:        
        !          1234:        disasm_cur_inst_len++;
        !          1235: 
        !          1236:        memspace = (cur_inst>>6) & 1;
        !          1237:        value = (cur_inst>>8) & BITMASK(6);
        !          1238:        numbit = cur_inst & BITMASK(5);
        !          1239: 
        !          1240:        dsp_calc_ea(value, addr_name);
        !          1241:        if (memspace) {
        !          1242:                sprintf(srcname, "y:%s", addr_name);
        !          1243:        } else {
        !          1244:                sprintf(srcname, "x:%s", addr_name);
        !          1245:        }
        !          1246: 
        !          1247:        sprintf(str_instr," jclr #%d,%s,p:0x%04x\n",
        !          1248:                numbit,
        !          1249:                srcname,
        !          1250:                read_memory(dsp_core->pc+1)
        !          1251:        );
        !          1252: }
        !          1253: 
        !          1254: static void dsp_jclr_pp(void)
        !          1255: {
        !          1256:        /* jclr #n,x:pp,p:xx */
        !          1257:        /* jclr #n,y:pp,p:xx */
        !          1258:        char srcname[16];
        !          1259:        Uint32 memspace, value, numbit;
        !          1260:        
        !          1261:        disasm_cur_inst_len++;
        !          1262: 
        !          1263:        memspace = (cur_inst>>6) & 1;
        !          1264:        value = (cur_inst>>8) & BITMASK(6);
        !          1265:        numbit = cur_inst & BITMASK(5);
        !          1266: 
        !          1267:        value += 0xffc0;
        !          1268:        if (memspace) {
        !          1269:                sprintf(srcname, "y:0x%04x", value);
        !          1270:        } else {
        !          1271:                sprintf(srcname, "x:0x%04x", value);
        !          1272:        }
        !          1273: 
        !          1274:        sprintf(str_instr," jclr #%d,%s,p:0x%04x\n",
        !          1275:                numbit,
        !          1276:                srcname,
        !          1277:                read_memory(dsp_core->pc+1)
        !          1278:        );
        !          1279: }
        !          1280: 
        !          1281: static void dsp_jclr_reg(void)
        !          1282: {
        !          1283:        /* jclr #n,R,p:xx */
        !          1284:        char srcname[16];
        !          1285:        Uint32 memspace, value, numbit;
        !          1286:        
        !          1287:        disasm_cur_inst_len++;
        !          1288: 
        !          1289:        memspace = (cur_inst>>6) & 1;
        !          1290:        value = (cur_inst>>8) & BITMASK(6);
        !          1291:        numbit = cur_inst & BITMASK(5);
        !          1292: 
        !          1293:        strcpy(srcname, registers_name[value]);
        !          1294: 
        !          1295:        sprintf(str_instr," jclr #%d,%s,p:0x%04x\n",
        !          1296:                numbit,
        !          1297:                srcname,
        !          1298:                read_memory(dsp_core->pc+1)
        !          1299:        );
        !          1300: }
        !          1301: 
        !          1302: static void dsp_jmp_imm(void)
        !          1303: {
        !          1304:        char dstname[16];
        !          1305: 
        !          1306:        sprintf(dstname, "0x%04x", cur_inst & BITMASK(12));
        !          1307: 
        !          1308:        sprintf(str_instr," jmp p:%s\n", dstname);
        !          1309: }
        !          1310: 
        !          1311: static void dsp_jmp_ea(void)
        !          1312: {
        !          1313:        char dstname[16];
        !          1314: 
        !          1315:        dsp_calc_ea((cur_inst >>8) & BITMASK(6), dstname);
        !          1316: 
        !          1317:        sprintf(str_instr," jmp p:%s\n", dstname);
        !          1318: }
        !          1319: 
        !          1320: static void dsp_jscc_ea(void)
        !          1321: {
        !          1322:        char cond_name[16], addr_name[16];
        !          1323:        Uint32 cc_code=0;
        !          1324:        
        !          1325:        dsp_calc_ea((cur_inst>>8) & BITMASK(6), addr_name);
        !          1326:        cc_code=cur_inst & BITMASK(4);
        !          1327:        dsp_calc_cc(cc_code, cond_name);        
        !          1328: 
        !          1329:        sprintf(str_instr," js%s p:%s\n", cond_name, addr_name);
        !          1330: }
        !          1331:        
        !          1332: static void dsp_jscc_imm(void)
        !          1333: {
        !          1334:        char cond_name[16], addr_name[16];
        !          1335:        Uint32 cc_code=0;
        !          1336:        
        !          1337:        sprintf(addr_name, "0x%04x", cur_inst & BITMASK(12));
        !          1338:        cc_code=(cur_inst>>12) & BITMASK(4);
        !          1339:        dsp_calc_cc(cc_code, cond_name);        
        !          1340: 
        !          1341:        sprintf(str_instr," js%s p:%s\n", cond_name, addr_name);
        !          1342: }
        !          1343: 
        !          1344: static void dsp_jsclr_aa(void)
        !          1345: {
        !          1346:        /* jsclr #n,x:aa,p:xx */
        !          1347:        /* jsclr #n,y:aa,p:xx */
        !          1348:        char srcname[16];
        !          1349:        Uint32 memspace, value, numbit;
        !          1350:        
        !          1351:        disasm_cur_inst_len++;
        !          1352: 
        !          1353:        memspace = (cur_inst>>6) & 1;
        !          1354:        value = (cur_inst>>8) & BITMASK(6);
        !          1355:        numbit = cur_inst & BITMASK(5);
        !          1356: 
        !          1357:        if (memspace) {
        !          1358:                sprintf(srcname, "y:0x%04x", value);
        !          1359:        } else {
        !          1360:                sprintf(srcname, "x:0x%04x", value);
        !          1361:        }
        !          1362: 
        !          1363:        sprintf(str_instr," jsclr #%d,%s,p:0x%04x\n",
        !          1364:                numbit,
        !          1365:                srcname,
        !          1366:                read_memory(dsp_core->pc+1)
        !          1367:        );
        !          1368: }
        !          1369: 
        !          1370: static void dsp_jsclr_ea(void)
        !          1371: {
        !          1372:        /* jsclr #n,x:ea,p:xx */
        !          1373:        /* jsclr #n,y:ea,p:xx */
        !          1374:        char srcname[16], addr_name[16];
        !          1375:        Uint32 memspace, value, numbit;
        !          1376:        
        !          1377:        disasm_cur_inst_len++;
        !          1378: 
        !          1379:        memspace = (cur_inst>>6) & 1;
        !          1380:        value = (cur_inst>>8) & BITMASK(6);
        !          1381:        numbit = cur_inst & BITMASK(5);
        !          1382: 
        !          1383:        dsp_calc_ea(value, addr_name);
        !          1384:        if (memspace) {
        !          1385:                sprintf(srcname, "y:%s", addr_name);
        !          1386:        } else {
        !          1387:                sprintf(srcname, "x:%s", addr_name);
        !          1388:        }
        !          1389: 
        !          1390:        sprintf(str_instr," jsclr #%d,%s,p:0x%04x\n",
        !          1391:                numbit,
        !          1392:                srcname,
        !          1393:                read_memory(dsp_core->pc+1)
        !          1394:        );
1.1       root     1395: }
                   1396: 
1.1.1.3 ! root     1397: static void dsp_jsclr_pp(void)
1.1       root     1398: {
1.1.1.3 ! root     1399:        /* jsclr #n,x:pp,p:xx */
        !          1400:        /* jsclr #n,y:pp,p:xx */
        !          1401:        char srcname[16];
        !          1402:        Uint32 memspace, value, numbit;
1.1       root     1403:        
1.1.1.3 ! root     1404:        disasm_cur_inst_len++;
1.1       root     1405: 
1.1.1.3 ! root     1406:        memspace = (cur_inst>>6) & 1;
        !          1407:        value = (cur_inst>>8) & BITMASK(6);
        !          1408:        numbit = cur_inst & BITMASK(5);
1.1       root     1409: 
1.1.1.3 ! root     1410:        value += 0xffc0;
        !          1411:        if (memspace) {
        !          1412:                sprintf(srcname, "y:0x%04x", value);
1.1       root     1413:        } else {
1.1.1.3 ! root     1414:                sprintf(srcname, "x:0x%04x", value);
1.1       root     1415:        }
                   1416: 
1.1.1.3 ! root     1417:        sprintf(str_instr," jsclr #%d,%s,p:0x%04x\n",
        !          1418:                numbit,
        !          1419:                srcname,
1.1.1.2   root     1420:                read_memory(dsp_core->pc+1)
1.1       root     1421:        );
                   1422: }
                   1423: 
1.1.1.3 ! root     1424: static void dsp_jsclr_reg(void)
1.1       root     1425: {
1.1.1.3 ! root     1426:        /* jsclr #n,R,p:xx */
        !          1427:        char srcname[16];
        !          1428:        Uint32 memspace, value, numbit;
        !          1429:        
        !          1430:        disasm_cur_inst_len++;
        !          1431: 
        !          1432:        memspace = (cur_inst>>6) & 1;
        !          1433:        value = (cur_inst>>8) & BITMASK(6);
        !          1434:        numbit = cur_inst & BITMASK(5);
        !          1435: 
        !          1436:        strcpy(srcname, registers_name[value]);
        !          1437: 
        !          1438:        sprintf(str_instr," jsclr #%d,%s,p:0x%04x\n",
        !          1439:                numbit,
        !          1440:                srcname,
1.1.1.2   root     1441:                read_memory(dsp_core->pc+1)
1.1       root     1442:        );
                   1443: }
                   1444: 
1.1.1.3 ! root     1445: static void dsp_jset_aa(void)
1.1       root     1446: {
1.1.1.3 ! root     1447:        /* jset #n,x:aa,p:xx */
        !          1448:        /* jset #n,y:aa,p:xx */
        !          1449:        char srcname[16];
        !          1450:        Uint32 memspace, value, numbit;
1.1       root     1451:        
1.1.1.3 ! root     1452:        disasm_cur_inst_len++;
1.1       root     1453: 
1.1.1.3 ! root     1454:        memspace = (cur_inst>>6) & 1;
        !          1455:        value = (cur_inst>>8) & BITMASK(6);
        !          1456:        numbit = cur_inst & BITMASK(5);
        !          1457: 
        !          1458:        if (memspace) {
        !          1459:                sprintf(srcname, "y:0x%04x", value);
1.1       root     1460:        } else {
1.1.1.3 ! root     1461:                sprintf(srcname, "x:0x%04x", value);
1.1       root     1462:        }
                   1463: 
1.1.1.3 ! root     1464:        sprintf(str_instr," jset #%d,%s,p:0x%04x\n",
        !          1465:                numbit,
        !          1466:                srcname,
1.1.1.2   root     1467:                read_memory(dsp_core->pc+1)
1.1       root     1468:        );
                   1469: }
                   1470: 
1.1.1.3 ! root     1471: static void dsp_jset_ea(void)
1.1       root     1472: {
1.1.1.3 ! root     1473:        /* jset #n,x:ea,p:xx */
        !          1474:        /* jset #n,y:ea,p:xx */
        !          1475:        char srcname[16], addr_name[16];
        !          1476:        Uint32 memspace, value, numbit;
        !          1477:        
        !          1478:        disasm_cur_inst_len++;
        !          1479: 
        !          1480:        memspace = (cur_inst>>6) & 1;
        !          1481:        value = (cur_inst>>8) & BITMASK(6);
        !          1482:        numbit = cur_inst & BITMASK(5);
        !          1483: 
        !          1484:        dsp_calc_ea(value, addr_name);
        !          1485:        if (memspace) {
        !          1486:                sprintf(srcname, "y:%s", addr_name);
        !          1487:        } else {
        !          1488:                sprintf(srcname, "x:%s", addr_name);
        !          1489:        }
        !          1490: 
        !          1491:        sprintf(str_instr," jset #%d,%s,p:0x%04x\n",
        !          1492:                numbit,
        !          1493:                srcname,
1.1.1.2   root     1494:                read_memory(dsp_core->pc+1)
1.1       root     1495:        );
                   1496: }
                   1497: 
1.1.1.3 ! root     1498: static void dsp_jset_pp(void)
1.1       root     1499: {
1.1.1.3 ! root     1500:        /* jset #n,x:pp,p:xx */
        !          1501:        /* jset #n,y:pp,p:xx */
        !          1502:        char srcname[16];
        !          1503:        Uint32 memspace, value, numbit;
        !          1504:        
        !          1505:        disasm_cur_inst_len++;
1.1       root     1506: 
1.1.1.3 ! root     1507:        memspace = (cur_inst>>6) & 1;
        !          1508:        value = (cur_inst>>8) & BITMASK(6);
        !          1509:        numbit = cur_inst & BITMASK(5);
1.1       root     1510: 
1.1.1.3 ! root     1511:        value += 0xffc0;
        !          1512:        if (memspace) {
        !          1513:                sprintf(srcname, "y:0x%04x", value);
        !          1514:        } else {
        !          1515:                sprintf(srcname, "x:0x%04x", value);
1.1       root     1516:        }
                   1517: 
1.1.1.3 ! root     1518:        sprintf(str_instr," jset #%d,%s,p:0x%04x\n",
        !          1519:                numbit,
        !          1520:                srcname,
        !          1521:                read_memory(dsp_core->pc+1)
        !          1522:        );
1.1       root     1523: }
                   1524: 
1.1.1.3 ! root     1525: static void dsp_jset_reg(void)
1.1       root     1526: {
1.1.1.3 ! root     1527:        /* jset #n,R,p:xx */
        !          1528:        char srcname[16];
1.1.1.2   root     1529:        Uint32 memspace, value, numbit;
1.1       root     1530:        
1.1.1.3 ! root     1531:        disasm_cur_inst_len++;
        !          1532: 
1.1       root     1533:        memspace = (cur_inst>>6) & 1;
                   1534:        value = (cur_inst>>8) & BITMASK(6);
                   1535:        numbit = cur_inst & BITMASK(5);
                   1536: 
1.1.1.3 ! root     1537:        strcpy(srcname, registers_name[value]);
1.1       root     1538: 
1.1.1.3 ! root     1539:        sprintf(str_instr," jset #%d,%s,p:0x%04x\n",
1.1       root     1540:                numbit,
                   1541:                srcname,
1.1.1.2   root     1542:                read_memory(dsp_core->pc+1)
1.1       root     1543:        );
                   1544: }
                   1545: 
1.1.1.3 ! root     1546: static void dsp_jsr_imm(void)
1.1       root     1547: {
                   1548:        char dstname[16];
                   1549: 
1.1.1.3 ! root     1550:        sprintf(dstname, "0x%04x", cur_inst & BITMASK(12));
1.1       root     1551: 
1.1.1.3 ! root     1552:        sprintf(str_instr," jsr p:%s\n", dstname);
1.1       root     1553: }
                   1554: 
1.1.1.3 ! root     1555: static void dsp_jsr_ea(void)
1.1       root     1556: {
1.1.1.3 ! root     1557:        char dstname[16];
1.1       root     1558: 
1.1.1.3 ! root     1559:        dsp_calc_ea((cur_inst>>8) & BITMASK(6),dstname);
        !          1560: 
        !          1561:        sprintf(str_instr," jsr p:%s\n", dstname);
1.1       root     1562: }
1.1.1.3 ! root     1563: 
        !          1564: static void dsp_jsset_aa(void)
1.1       root     1565: {
1.1.1.3 ! root     1566:        /* jsset #n,x:aa,p:xx */
        !          1567:        /* jsset #n,y:aa,p:xx */
        !          1568:        char srcname[16];
1.1.1.2   root     1569:        Uint32 memspace, value, numbit;
1.1       root     1570:        
1.1.1.3 ! root     1571:        disasm_cur_inst_len++;
        !          1572: 
1.1       root     1573:        memspace = (cur_inst>>6) & 1;
                   1574:        value = (cur_inst>>8) & BITMASK(6);
                   1575:        numbit = cur_inst & BITMASK(5);
                   1576: 
1.1.1.3 ! root     1577:        if (memspace) {
        !          1578:                sprintf(srcname, "y:0x%04x", value);
        !          1579:        } else {
        !          1580:                sprintf(srcname, "x:0x%04x", value);
1.1       root     1581:        }
                   1582: 
1.1.1.3 ! root     1583:        sprintf(str_instr," jsset #%d,%s,p:0x%04x\n",
1.1       root     1584:                numbit,
                   1585:                srcname,
1.1.1.2   root     1586:                read_memory(dsp_core->pc+1)
1.1       root     1587:        );
                   1588: }
                   1589: 
1.1.1.3 ! root     1590: static void dsp_jsset_ea(void)
1.1       root     1591: {
1.1.1.3 ! root     1592:        /* jsset #n,x:ea,p:xx */
        !          1593:        /* jsset #n,y:ea,p:xx */
1.1       root     1594:        char srcname[16], addr_name[16];
1.1.1.2   root     1595:        Uint32 memspace, value, numbit;
1.1       root     1596:        
1.1.1.3 ! root     1597:        disasm_cur_inst_len++;
        !          1598: 
1.1       root     1599:        memspace = (cur_inst>>6) & 1;
                   1600:        value = (cur_inst>>8) & BITMASK(6);
                   1601:        numbit = cur_inst & BITMASK(5);
                   1602: 
1.1.1.3 ! root     1603:        dsp_calc_ea(value, addr_name);
        !          1604:        if (memspace) {
        !          1605:                sprintf(srcname, "y:%s", addr_name);
        !          1606:        } else {
        !          1607:                sprintf(srcname, "x:%s", addr_name);
1.1       root     1608:        }
                   1609: 
1.1.1.3 ! root     1610:        sprintf(str_instr," jsset #%d,%s,p:0x%04x\n",
1.1       root     1611:                numbit,
                   1612:                srcname,
1.1.1.2   root     1613:                read_memory(dsp_core->pc+1)
1.1       root     1614:        );
                   1615: }
                   1616: 
1.1.1.3 ! root     1617: static void dsp_jsset_pp(void)
1.1       root     1618: {
1.1.1.3 ! root     1619:        /* jsset #n,x:pp,p:xx */
        !          1620:        /* jsset #n,y:pp,p:xx */
        !          1621:        char srcname[16];
        !          1622:        Uint32 memspace, value, numbit;
        !          1623:        
        !          1624:        disasm_cur_inst_len++;
        !          1625: 
        !          1626:        memspace = (cur_inst>>6) & 1;
        !          1627:        value = (cur_inst>>8) & BITMASK(6);
        !          1628:        numbit = cur_inst & BITMASK(5);
1.1       root     1629: 
1.1.1.3 ! root     1630:        value += 0xffc0;
        !          1631:        if (memspace) {
        !          1632:                sprintf(srcname, "y:0x%04x", value);
1.1       root     1633:        } else {
1.1.1.3 ! root     1634:                sprintf(srcname, "x:0x%04x", value);
1.1       root     1635:        }
                   1636: 
1.1.1.3 ! root     1637:        sprintf(str_instr," jsset #%d,%s,p:0x%04x\n",
        !          1638:                numbit,
        !          1639:                srcname,
        !          1640:                read_memory(dsp_core->pc+1)
        !          1641:        );
1.1       root     1642: }
                   1643: 
1.1.1.3 ! root     1644: static void dsp_jsset_reg(void)
1.1       root     1645: {
1.1.1.3 ! root     1646:        /* jsset #n,r,p:xx */
        !          1647:        char srcname[16];
1.1.1.2   root     1648:        Uint32 memspace, value, numbit;
1.1       root     1649:        
1.1.1.3 ! root     1650:        disasm_cur_inst_len++;
        !          1651: 
1.1       root     1652:        memspace = (cur_inst>>6) & 1;
                   1653:        value = (cur_inst>>8) & BITMASK(6);
                   1654:        numbit = cur_inst & BITMASK(5);
                   1655: 
1.1.1.3 ! root     1656:        strcpy(srcname, registers_name[value]);
1.1       root     1657: 
1.1.1.3 ! root     1658:        sprintf(str_instr," jsset #%d,%s,p:0x%04x\n",
1.1       root     1659:                numbit,
                   1660:                srcname,
1.1.1.2   root     1661:                read_memory(dsp_core->pc+1)
1.1       root     1662:        );
                   1663: }
                   1664: 
                   1665: static void dsp_lua(void)
                   1666: {
                   1667:        char addr_name[16], numreg;
                   1668: 
                   1669:        dsp_calc_ea((cur_inst>>8) & BITMASK(5), addr_name);
                   1670:        numreg = cur_inst & BITMASK(3);
                   1671:        registers_changed[DSP_REG_R0+numreg]=1;
                   1672:        
1.1.1.3 ! root     1673:        sprintf(str_instr," lua %s,r%d\n", addr_name, numreg);
1.1       root     1674: }
                   1675: 
1.1.1.3 ! root     1676: static void dsp_movec_reg(void)
1.1       root     1677: {
1.1.1.2   root     1678:        Uint32 numreg1, numreg2;
1.1       root     1679: 
                   1680:        /* S1,D2 */
                   1681:        /* S2,D1 */
                   1682: 
                   1683:        numreg2 = (cur_inst>>8) & BITMASK(6);
1.1.1.3 ! root     1684:        numreg1 = cur_inst & BITMASK(6);
1.1       root     1685: 
                   1686:        if (cur_inst & (1<<15)) {
                   1687:                /* Write D1 */
1.1.1.3 ! root     1688:                sprintf(str_instr," movec %s,%s\n", registers_name[numreg2], registers_name[numreg1]);
1.1       root     1689:                registers_changed[numreg1]=1;
                   1690:        } else {
                   1691:                /* Read S1 */
1.1.1.3 ! root     1692:                sprintf(str_instr," movec %s,%s\n", registers_name[numreg1], registers_name[numreg2]);
1.1       root     1693:                registers_changed[numreg2]=1;
                   1694:        }
1.1.1.3 ! root     1695:        registers_changed[DSP_REG_SR]=1;
1.1       root     1696: }
                   1697: 
1.1.1.3 ! root     1698: static void dsp_movec_aa(void)
1.1       root     1699: {
                   1700:        const char *spacename;
                   1701:        char srcname[16],dstname[16];
1.1.1.2   root     1702:        Uint32 numreg, addr;
1.1       root     1703: 
                   1704:        /* x:aa,D1 */
                   1705:        /* S1,x:aa */
                   1706:        /* y:aa,D1 */
                   1707:        /* S1,y:aa */
                   1708: 
1.1.1.3 ! root     1709:        numreg = cur_inst & BITMASK(6);
1.1       root     1710:        addr = (cur_inst>>8) & BITMASK(6);
                   1711: 
                   1712:        if (cur_inst & (1<<6)) {
                   1713:                spacename="y";
                   1714:        } else {
                   1715:                spacename="x";
                   1716:        }
                   1717: 
                   1718:        if (cur_inst & (1<<15)) {
                   1719:                /* Write D1 */
                   1720:                sprintf(srcname, "%s:0x%04x", spacename, addr);
                   1721:                strcpy(dstname, registers_name[numreg]);
                   1722:        } else {
                   1723:                /* Read S1 */
                   1724:                strcpy(srcname, registers_name[numreg]);
                   1725:                sprintf(dstname, "%s:0x%04x", spacename, addr);
                   1726:        }
                   1727: 
1.1.1.3 ! root     1728:        sprintf(str_instr," movec %s,%s\n", srcname, dstname);
        !          1729:        registers_changed[DSP_REG_SR]=1;
1.1       root     1730: }
                   1731: 
1.1.1.3 ! root     1732: static void dsp_movec_imm(void)
1.1       root     1733: {
1.1.1.2   root     1734:        Uint32 numreg;
1.1       root     1735: 
                   1736:        /* #xx,D1 */
                   1737: 
1.1.1.3 ! root     1738:        numreg = cur_inst & BITMASK(6);
1.1       root     1739: 
                   1740:        registers_changed[numreg]=1;
1.1.1.3 ! root     1741:        sprintf(str_instr," movec #0x%02x,%s\n", (cur_inst>>8) & BITMASK(8), registers_name[numreg]);
        !          1742:        registers_changed[DSP_REG_SR]=1;
1.1       root     1743: }
                   1744: 
1.1.1.3 ! root     1745: static void dsp_movec_ea(void)
1.1       root     1746: {
                   1747:        const char *spacename;
                   1748:        char srcname[16], dstname[16], addr_name[16];
1.1.1.2   root     1749:        Uint32 numreg, ea_mode;
1.1       root     1750:        int retour;
                   1751: 
                   1752:        /* x:ea,D1 */
                   1753:        /* S1,x:ea */
                   1754:        /* y:ea,D1 */
                   1755:        /* S1,y:ea */
                   1756:        /* #xxxx,D1 */
                   1757: 
1.1.1.3 ! root     1758:        numreg = cur_inst & BITMASK(6);
1.1       root     1759:        ea_mode = (cur_inst>>8) & BITMASK(6);
                   1760:        retour = dsp_calc_ea(ea_mode, addr_name);
                   1761: 
                   1762:        if (cur_inst & (1<<6)) {
                   1763:                spacename="y";
                   1764:        } else {
                   1765:                spacename="x";
                   1766:        }
                   1767: 
                   1768:        if (cur_inst & (1<<15)) {
                   1769:                /* Write D1 */
                   1770:                if (retour) {
                   1771:                        sprintf(srcname, "#%s", addr_name);
                   1772:                } else {
                   1773:                        sprintf(srcname, "%s:%s", spacename, addr_name);
                   1774:                }
                   1775:                registers_changed[numreg]=1;
                   1776:                strcpy(dstname, registers_name[numreg]);
                   1777:        } else {
                   1778:                /* Read S1 */
                   1779:                strcpy(srcname, registers_name[numreg]);
                   1780:                sprintf(dstname, "%s:%s", spacename, addr_name);
                   1781:        }
                   1782: 
1.1.1.3 ! root     1783:        sprintf(str_instr," movec %s,%s\n", srcname, dstname);
        !          1784:        registers_changed[DSP_REG_SR]=1;
1.1       root     1785: }
                   1786: 
1.1.1.3 ! root     1787: static void dsp_movem_aa(void)
1.1       root     1788: {
1.1.1.3 ! root     1789:        /* S,p:aa */
        !          1790:        /* p:aa,D */
1.1       root     1791:        char addr_name[16], srcname[16], dstname[16];
1.1.1.3 ! root     1792:        Uint32 numreg;
1.1       root     1793: 
1.1.1.3 ! root     1794:        sprintf(addr_name, "0x%04x",(cur_inst>>8) & BITMASK(6));
1.1       root     1795:        numreg = cur_inst & BITMASK(6);
                   1796:        if  (cur_inst & (1<<15)) {
                   1797:                /* Write D */
                   1798:                registers_changed[numreg]=1;
                   1799:                sprintf(srcname, "p:%s", addr_name);
                   1800:                strcpy(dstname, registers_name[numreg]);
                   1801:        } else {
                   1802:                /* Read S */
                   1803:                strcpy(srcname, registers_name[numreg]);
                   1804:                sprintf(dstname, "p:%s", addr_name);
                   1805:        }
1.1.1.2   root     1806:        registers_changed[DSP_REG_SR]=1;
                   1807: 
1.1.1.3 ! root     1808:        sprintf(str_instr," movem %s,%s\n", srcname, dstname);
1.1       root     1809: }
                   1810: 
1.1.1.3 ! root     1811: static void dsp_movem_ea(void)
1.1       root     1812: {
1.1.1.3 ! root     1813:        /* S,p:ea */
        !          1814:        /* p:ea,D */
        !          1815:        char addr_name[16], srcname[16], dstname[16];
        !          1816:        Uint32 ea_mode, numreg;
1.1       root     1817: 
1.1.1.3 ! root     1818:        ea_mode = (cur_inst>>8) & BITMASK(6);
        !          1819:        dsp_calc_ea(ea_mode, addr_name);
        !          1820:        numreg = cur_inst & BITMASK(6);
        !          1821:        if  (cur_inst & (1<<15)) {
        !          1822:                /* Write D */
        !          1823:                registers_changed[numreg]=1;
        !          1824:                sprintf(srcname, "p:%s", addr_name);
        !          1825:                strcpy(dstname, registers_name[numreg]);
        !          1826:        } else {
        !          1827:                /* Read S */
        !          1828:                strcpy(srcname, registers_name[numreg]);
        !          1829:                sprintf(dstname, "p:%s", addr_name);
        !          1830:        }
1.1.1.2   root     1831:        registers_changed[DSP_REG_SR]=1;
1.1.1.3 ! root     1832: 
        !          1833:        sprintf(str_instr," movem %s,%s\n", srcname, dstname);
1.1       root     1834: }
                   1835: 
                   1836: static void dsp_movep_0(void)
                   1837: {
                   1838:        char srcname[16]="",dstname[16]="";
1.1.1.2   root     1839:        Uint32 addr, memspace, numreg;
1.1       root     1840: 
                   1841:        /* S,x:pp */
                   1842:        /* x:pp,D */
                   1843:        /* S,y:pp */
                   1844:        /* y:pp,D */
                   1845: 
                   1846:        addr = 0xffc0 + (cur_inst & BITMASK(6));
                   1847:        memspace = (cur_inst>>16) & 1;
                   1848:        numreg = (cur_inst>>8) & BITMASK(6);
                   1849: 
                   1850:        if (cur_inst & (1<<15)) {
                   1851:                /* Write pp */
                   1852: 
                   1853:                strcpy(srcname, registers_name[numreg]);
                   1854: 
                   1855:                if (memspace) {
                   1856:                        sprintf(dstname, "y:0x%04x", addr);
                   1857:                } else {
                   1858:                        sprintf(dstname, "x:0x%04x", addr);
                   1859:                }
                   1860:        } else {
                   1861:                /* Read pp */
                   1862: 
                   1863:                if (memspace) {
                   1864:                        sprintf(srcname, "y:0x%04x", addr);
                   1865:                } else {
                   1866:                        sprintf(srcname, "x:0x%04x", addr);
                   1867:                }
                   1868: 
                   1869:                registers_changed[numreg]=1;
                   1870:                strcpy(dstname, registers_name[numreg]);
                   1871:        }
                   1872: 
1.1.1.3 ! root     1873:        sprintf(str_instr," movep %s,%s\n", srcname, dstname);
        !          1874:        registers_changed[DSP_REG_SR]=1;
1.1       root     1875: }
                   1876: 
                   1877: static void dsp_movep_1(void)
                   1878: {
                   1879:        char srcname[16]="",dstname[16]="",name[16]="";
1.1.1.2   root     1880:        Uint32 addr, memspace; 
1.1       root     1881: 
                   1882:        /* p:ea,x:pp */
                   1883:        /* x:pp,p:ea */
                   1884:        /* p:ea,y:pp */
                   1885:        /* y:pp,p:ea */
                   1886: 
                   1887:        addr = 0xffc0 + (cur_inst & BITMASK(6));
                   1888:        dsp_calc_ea((cur_inst>>8) & BITMASK(6), name);
                   1889:        memspace = (cur_inst>>16) & 1;
                   1890: 
                   1891:        if (cur_inst & (1<<15)) {
                   1892:                /* Write pp */
                   1893: 
                   1894:                sprintf(srcname, "p:%s", name);
                   1895: 
                   1896:                if (memspace) {
                   1897:                        sprintf(dstname, "y:0x%04x", addr);
                   1898:                } else {
                   1899:                        sprintf(dstname, "x:0x%04x", addr);
                   1900:                }
                   1901:        } else {
                   1902:                /* Read pp */
                   1903: 
                   1904:                if (memspace) {
                   1905:                        sprintf(srcname, "y:0x%04x", addr);
                   1906:                } else {
                   1907:                        sprintf(srcname, "x:0x%04x", addr);
                   1908:                }
                   1909: 
                   1910:                sprintf(dstname, "p:%s", name);
                   1911:        }
                   1912: 
1.1.1.3 ! root     1913:        sprintf(str_instr," movep %s,%s\n", srcname, dstname);
        !          1914:        registers_changed[DSP_REG_SR]=1;
1.1       root     1915: }
                   1916: 
1.1.1.3 ! root     1917: static void dsp_movep_23(void)
1.1       root     1918: {
                   1919:        char srcname[16]="",dstname[16]="",name[16]="";
1.1.1.2   root     1920:        Uint32 addr, memspace, easpace, retour; 
1.1       root     1921: 
                   1922:        /* x:ea,x:pp */
                   1923:        /* y:ea,x:pp */
                   1924:        /* #xxxxxx,x:pp */
                   1925:        /* x:pp,x:ea */
                   1926:        /* x:pp,y:ea */
                   1927: 
                   1928:        /* x:ea,y:pp */
                   1929:        /* y:ea,y:pp */
                   1930:        /* #xxxxxx,y:pp */
                   1931:        /* y:pp,y:ea */
                   1932:        /* y:pp,x:ea */
                   1933: 
                   1934:        addr = 0xffc0 + (cur_inst & BITMASK(6));
                   1935:        retour = dsp_calc_ea((cur_inst>>8) & BITMASK(6), name);
                   1936:        memspace = (cur_inst>>16) & 1;
                   1937:        easpace = (cur_inst>>6) & 1;
                   1938: 
                   1939:        if (cur_inst & (1<<15)) {
                   1940:                /* Write pp */
                   1941: 
                   1942:                if (retour) {
                   1943:                        sprintf(srcname, "#%s", name);
                   1944:                } else {
                   1945:                        if (easpace) {
                   1946:                                sprintf(srcname, "y:%s", name);
                   1947:                        } else {
                   1948:                                sprintf(srcname, "x:%s", name);
                   1949:                        }
                   1950:                }
                   1951: 
                   1952:                if (memspace) {
                   1953:                        sprintf(dstname, "y:0x%04x", addr);
                   1954:                } else {
                   1955:                        sprintf(dstname, "x:0x%04x", addr);
                   1956:                }
                   1957:        } else {
                   1958:                /* Read pp */
                   1959: 
                   1960:                if (memspace) {
                   1961:                        sprintf(srcname, "y:0x%04x", addr);
                   1962:                } else {
                   1963:                        sprintf(srcname, "x:0x%04x", addr);
                   1964:                }
                   1965: 
                   1966:                if (easpace) {
                   1967:                        sprintf(dstname, "y:%s", name);
                   1968:                } else {
                   1969:                        sprintf(dstname, "x:%s", name);
                   1970:                }
                   1971:        }
                   1972: 
1.1.1.3 ! root     1973:        sprintf(str_instr," movep %s,%s\n", srcname, dstname);
        !          1974:        registers_changed[DSP_REG_SR]=1;
1.1       root     1975: }
                   1976: 
                   1977: static void dsp_nop(void)
                   1978: {
1.1.1.3 ! root     1979:        sprintf(str_instr," nop\n");
1.1       root     1980: }
                   1981: 
                   1982: static void dsp_norm(void)
                   1983: {
1.1.1.2   root     1984:        Uint32 srcreg, destreg;
1.1       root     1985: 
                   1986:        srcreg = DSP_REG_R0+((cur_inst>>8) & BITMASK(3));
                   1987:        destreg = DSP_REG_A+((cur_inst>>3) & 1);
                   1988: 
                   1989:        registers_changed[srcreg]=1;
                   1990:        registers_changed[destreg]=1;
1.1.1.2   root     1991:        registers_changed[DSP_REG_SR]=1;
1.1       root     1992: 
1.1.1.3 ! root     1993:        sprintf(str_instr," norm %s,%s\n", registers_name[srcreg], registers_name[destreg]);
1.1       root     1994: }
                   1995: 
                   1996: static void dsp_ori(void)
                   1997: {
                   1998:        const char *regname;
                   1999: 
                   2000:        switch(cur_inst & BITMASK(2)) {
                   2001:                case 0:
                   2002:                        regname="mr";
                   2003:                        registers_changed[DSP_REG_SR]=1;
                   2004:                        break;
                   2005:                case 1:
                   2006:                        regname="ccr";
                   2007:                        registers_changed[DSP_REG_SR]=1;
                   2008:                        break;
                   2009:                case 2:
                   2010:                        regname="omr";
                   2011:                        registers_changed[DSP_REG_OMR]=1;
                   2012:                        break;
                   2013:                default:
                   2014:                        regname="";
                   2015:                        break;
                   2016:        }
                   2017: 
1.1.1.2   root     2018:        registers_changed[DSP_REG_SR]=1;
                   2019: 
1.1.1.3 ! root     2020:        sprintf(str_instr," ori #0x%02x,%s\n", (cur_inst>>8) & BITMASK(8), regname);
1.1       root     2021: }
                   2022: 
1.1.1.3 ! root     2023: static void dsp_rep_aa(void)
1.1       root     2024: {
                   2025:        char name[16];
                   2026: 
                   2027:        /* x:aa */
                   2028:        /* y:aa */
                   2029: 
                   2030:        if (cur_inst & (1<<6)) {
                   2031:                sprintf(name, "y:0x%04x",(cur_inst>>8) & BITMASK(6));
                   2032:        } else {
                   2033:                sprintf(name, "x:0x%04x",(cur_inst>>8) & BITMASK(6));
                   2034:        }
                   2035: 
1.1.1.3 ! root     2036:        sprintf(str_instr," rep %s\n", name);
        !          2037:        registers_changed[DSP_REG_LC]=1;
        !          2038:        registers_changed[DSP_REG_SR]=1;
1.1       root     2039: }
                   2040: 
1.1.1.3 ! root     2041: static void dsp_rep_imm(void)
1.1       root     2042: {
                   2043:        /* #xxx */
1.1.1.3 ! root     2044:        sprintf(str_instr," rep #0x%02x\n", ((cur_inst>>8) & BITMASK(8))
        !          2045:                + ((cur_inst & BITMASK(4))<<8));
        !          2046:        registers_changed[DSP_REG_LC]=1;
        !          2047:        registers_changed[DSP_REG_SR]=1;
1.1       root     2048: }
                   2049: 
1.1.1.3 ! root     2050: static void dsp_rep_ea(void)
1.1       root     2051: {
                   2052:        char name[16],addr_name[16];
                   2053: 
                   2054:        /* x:ea */
                   2055:        /* y:ea */
                   2056: 
                   2057:        dsp_calc_ea((cur_inst>>8) & BITMASK(6), addr_name);
                   2058:        if (cur_inst & (1<<6)) {
                   2059:                sprintf(name, "y:%s",addr_name);
                   2060:        } else {
                   2061:                sprintf(name, "x:%s",addr_name);
                   2062:        }
                   2063: 
1.1.1.3 ! root     2064:        sprintf(str_instr," rep %s\n", name);
        !          2065:        registers_changed[DSP_REG_LC]=1;
        !          2066:        registers_changed[DSP_REG_SR]=1;
1.1       root     2067: }
                   2068: 
1.1.1.3 ! root     2069: static void dsp_rep_reg(void)
1.1       root     2070: {
                   2071:        /* R */
                   2072: 
1.1.1.3 ! root     2073:        sprintf(str_instr," rep %s\n", registers_name[(cur_inst>>8) & BITMASK(6)]);
        !          2074:        registers_changed[DSP_REG_LC]=1;
        !          2075:        registers_changed[DSP_REG_SR]=1;
1.1       root     2076: }
                   2077: 
                   2078: static void dsp_reset(void)
                   2079: {
1.1.1.3 ! root     2080:        sprintf(str_instr," reset\n");
1.1       root     2081: }
                   2082: 
                   2083: static void dsp_rti(void)
                   2084: {
1.1.1.2   root     2085:        registers_changed[DSP_REG_SR]=1;
1.1.1.3 ! root     2086:        sprintf(str_instr," rti\n");
1.1       root     2087: }
                   2088: 
                   2089: static void dsp_rts(void)
                   2090: {
1.1.1.2   root     2091:        registers_changed[DSP_REG_SR]=1;
1.1.1.3 ! root     2092:        sprintf(str_instr," rts\n");
1.1       root     2093: }
                   2094: 
                   2095: static void dsp_stop(void)
                   2096: {
1.1.1.3 ! root     2097:        sprintf(str_instr," stop\n");
1.1       root     2098: }
                   2099:        
                   2100: static void dsp_swi(void)
                   2101: {
1.1.1.3 ! root     2102:        sprintf(str_instr," swi\n");
1.1       root     2103: }
                   2104: 
                   2105: static void dsp_tcc(void)
                   2106: {
                   2107:        char ccname[16];
1.1.1.2   root     2108:        Uint32 src1reg, dst1reg, src2reg, dst2reg;
1.1       root     2109: 
                   2110:        dsp_calc_cc((cur_inst>>12) & BITMASK(4), ccname);
                   2111:        src1reg = registers_tcc[(cur_inst>>3) & BITMASK(4)][0];
1.1.1.2   root     2112:        dst1reg = registers_tcc[(cur_inst>>3) & BITMASK(4)][1];
1.1       root     2113: 
                   2114:        registers_changed[dst1reg]=1;
                   2115:        if (cur_inst & (1<<16)) {
                   2116:                src2reg = DSP_REG_R0+(cur_inst & BITMASK(3));
                   2117:                dst2reg = DSP_REG_R0+((cur_inst>>8) & BITMASK(3));
                   2118: 
                   2119:                registers_changed[dst2reg]=1;
1.1.1.3 ! root     2120:                sprintf(str_instr," t%s %s,%s %s,%s\n",
1.1       root     2121:                        ccname,
                   2122:                        registers_name[src1reg],
                   2123:                        registers_name[dst1reg],
                   2124:                        registers_name[src2reg],
                   2125:                        registers_name[dst2reg]
                   2126:                );
                   2127:        } else {
1.1.1.3 ! root     2128:                sprintf(str_instr," t%s %s,%s\n",
1.1       root     2129:                        ccname,
                   2130:                        registers_name[src1reg],
                   2131:                        registers_name[dst1reg]
                   2132:                );
                   2133:        }
                   2134: }
                   2135: 
                   2136: static void dsp_wait(void)
                   2137: {
1.1.1.3 ! root     2138:        sprintf(str_instr," wait\n");
1.1       root     2139: }
                   2140: 
                   2141: /**********************************
                   2142:  *     Parallel moves
                   2143:  **********************************/
                   2144: 
                   2145: static void dsp_pm(void)
                   2146: {
1.1.1.2   root     2147:        Uint32 value;
1.1       root     2148: 
                   2149:        value = (cur_inst >> 20) & BITMASK(4);
                   2150: 
                   2151:        opcodes_parmove[value]();
                   2152: }
                   2153: 
                   2154: static void dsp_pm_0(void)
                   2155: {
                   2156:        char space_name[16], addr_name[16];
1.1.1.2   root     2157:        Uint32 memspace, numreg1, numreg2;
1.1       root     2158: /*
                   2159:        0000 100d 00mm mrrr S,x:ea      x0,D
                   2160:        0000 100d 10mm mrrr S,y:ea      y0,D
                   2161: */
                   2162:        memspace = (cur_inst>>15) & 1;
                   2163:        numreg1 = DSP_REG_A+((cur_inst>>16) & 1);
                   2164:        dsp_calc_ea((cur_inst>>8) & BITMASK(6), addr_name);
                   2165: 
                   2166:        if (memspace) {
                   2167:                strcpy(space_name,"y");
                   2168:                numreg2 = DSP_REG_Y0;
                   2169:        } else {
                   2170:                strcpy(space_name,"x");
                   2171:                numreg2 = DSP_REG_X0;
                   2172:        }
                   2173: 
                   2174:        registers_changed[numreg1]=1;
                   2175: 
                   2176:        sprintf(parallelmove_name,
                   2177:                "%s,%s:%s %s,%s",
                   2178:                registers_name[numreg1],
                   2179:                space_name,
                   2180:                addr_name,
                   2181:                registers_name[numreg2],
                   2182:                registers_name[numreg1]
                   2183:        );
                   2184: }
                   2185: 
                   2186: static void dsp_pm_1(void)
                   2187: {
                   2188: /*
                   2189:        0001 ffdf w0mm mrrr x:ea,D1             S2,D2
                   2190:                                                S1,x:ea         S2,D2
                   2191:                                                #xxxxxx,D1      S2,D2
                   2192:        0001 deff w1mm mrrr S1,D1               y:ea,D2
                   2193:                                                S1,D1           S2,y:ea
                   2194:                                                S1,D1           #xxxxxx,D2
                   2195: */
                   2196: 
                   2197:        char addr_name[16];
1.1.1.2   root     2198:        Uint32 memspace, write_flag, retour, s1reg, s2reg, d1reg, d2reg;
1.1       root     2199: 
                   2200:        memspace = (cur_inst>>14) & 1;
                   2201:        write_flag = (cur_inst>>15) & 1;
                   2202:        retour = dsp_calc_ea((cur_inst>>8) & BITMASK(6), addr_name);
                   2203: 
                   2204:        if (memspace==DSP_SPACE_Y) {
                   2205:                s2reg = d2reg = DSP_REG_Y0;
                   2206:                switch((cur_inst>>16) & BITMASK(2)) {
                   2207:                        case 0: s2reg = d2reg = DSP_REG_Y0;     break;
                   2208:                        case 1: s2reg = d2reg = DSP_REG_Y1;     break;
                   2209:                        case 2: s2reg = d2reg = DSP_REG_A;      break;
                   2210:                        case 3: s2reg = d2reg = DSP_REG_B;      break;
                   2211:                }
                   2212: 
                   2213:                s1reg = DSP_REG_A+((cur_inst>>19) & 1);
                   2214:                d1reg = DSP_REG_X0+((cur_inst>>18) & 1);
                   2215: 
                   2216:                registers_changed[d1reg]=1;
                   2217: 
                   2218:                if (write_flag) {
                   2219:                        /* Write D2 */
                   2220: 
                   2221:                        registers_changed[d2reg]=1;
                   2222: 
                   2223:                        if (retour) {
                   2224:                                sprintf(parallelmove_name,"%s,%s #%s,%s",
                   2225:                                        registers_name[s1reg],
                   2226:                                        registers_name[d1reg],
                   2227:                                        addr_name,
                   2228:                                        registers_name[d2reg]
                   2229:                                );
                   2230:                        } else {
                   2231:                                sprintf(parallelmove_name,"%s,%s y:%s,%s",
                   2232:                                        registers_name[s1reg],
                   2233:                                        registers_name[d1reg],
                   2234:                                        addr_name,
                   2235:                                        registers_name[d2reg]
                   2236:                                );
                   2237:                        }
                   2238:                } else {
                   2239:                        /* Read S2 */
                   2240:                        sprintf(parallelmove_name,"%s,%s %s,y:%s",
                   2241:                                registers_name[s1reg],
                   2242:                                registers_name[d1reg],
                   2243:                                registers_name[s2reg],
                   2244:                                addr_name
                   2245:                        );
                   2246:                }               
                   2247: 
                   2248:        } else {
                   2249:                s1reg = d1reg = DSP_REG_X0;
                   2250:                switch((cur_inst>>18) & BITMASK(2)) {
                   2251:                        case 0: s1reg = d1reg = DSP_REG_X0;     break;
                   2252:                        case 1: s1reg = d1reg = DSP_REG_X1;     break;
                   2253:                        case 2: s1reg = d1reg = DSP_REG_A;      break;
                   2254:                        case 3: s1reg = d1reg = DSP_REG_B;      break;
                   2255:                }
                   2256: 
                   2257:                s2reg = DSP_REG_A+((cur_inst>>17) & 1);
                   2258:                d2reg = DSP_REG_Y0+((cur_inst>>16) & 1);
                   2259: 
                   2260:                registers_changed[d2reg]=1;
                   2261: 
                   2262:                if (write_flag) {
                   2263:                        /* Write D1 */
                   2264: 
                   2265:                        registers_changed[d1reg]=1;
                   2266: 
                   2267:                        if (retour) {
                   2268:                                sprintf(parallelmove_name,"#%s,%s %s,%s",
                   2269:                                        addr_name,
                   2270:                                        registers_name[d1reg],
                   2271:                                        registers_name[s2reg],
                   2272:                                        registers_name[d2reg]
                   2273:                                );
                   2274:                        } else {
                   2275:                                sprintf(parallelmove_name,"x:%s,%s %s,%s",
                   2276:                                        addr_name,
                   2277:                                        registers_name[d1reg],
                   2278:                                        registers_name[s2reg],
                   2279:                                        registers_name[d2reg]
                   2280:                                );
                   2281:                        }
                   2282:                } else {
                   2283:                        /* Read S1 */
                   2284:                        sprintf(parallelmove_name,"%s,x:%s %s,%s",
                   2285:                                registers_name[s1reg],
                   2286:                                addr_name,
                   2287:                                registers_name[s2reg],
                   2288:                                registers_name[d2reg]
                   2289:                        );
                   2290:                }               
                   2291:        
                   2292:        }
                   2293: }
                   2294: 
                   2295: static void dsp_pm_2(void)
                   2296: {
                   2297:        char addr_name[16];
1.1.1.2   root     2298:        Uint32 numreg1, numreg2;
1.1       root     2299: /*
                   2300:        0010 0000 0000 0000 nop
                   2301:        0010 0000 010m mrrr R update
                   2302:        0010 00ee eeed dddd S,D
                   2303:        001d dddd iiii iiii #xx,D
                   2304: */
                   2305:        if (((cur_inst >> 8) & 0xffff) == 0x2000) {
                   2306:                return;
                   2307:        }
                   2308: 
                   2309:        if (((cur_inst >> 8) & 0xffe0) == 0x2040) {
                   2310:                dsp_calc_ea((cur_inst>>8) & BITMASK(5), addr_name);
                   2311:                registers_changed[DSP_REG_R0+((cur_inst>>8) & BITMASK(3))]=1;
                   2312:                sprintf(parallelmove_name, "%s,r%d",addr_name, (cur_inst>>8) & BITMASK(3));
                   2313:                return;
                   2314:        }
                   2315: 
                   2316:        if (((cur_inst >> 8) & 0xfc00) == 0x2000) {
                   2317:                numreg1 = (cur_inst>>13) & BITMASK(5);
                   2318:                numreg2 = (cur_inst>>8) & BITMASK(5);
                   2319:                registers_changed[numreg2]=1;
                   2320:                sprintf(parallelmove_name, "%s,%s", registers_name[numreg1], registers_name[numreg2]); 
                   2321:                return;
                   2322:        }
                   2323: 
                   2324:        numreg1 = (cur_inst>>16) & BITMASK(5);
                   2325:        registers_changed[numreg1]=1;
                   2326:        sprintf(parallelmove_name, "#0x%02x,%s", (cur_inst >> 8) & BITMASK(8), registers_name[numreg1]);
                   2327: }
                   2328: 
                   2329: static void dsp_pm_4(void)
                   2330: {
                   2331:        char addr_name[16];
1.1.1.2   root     2332:        Uint32 value, retour, ea_mode, memspace;
1.1       root     2333: /*
                   2334:        0100 l0ll w0aa aaaa l:aa,D
                   2335:                                                S,l:aa
                   2336:        0100 l0ll w1mm mrrr l:ea,D
                   2337:                                                S,l:ea
                   2338:        01dd 0ddd w0aa aaaa x:aa,D
                   2339:                                                S,x:aa
                   2340:        01dd 0ddd w1mm mrrr x:ea,D
                   2341:                                                S,x:ea
                   2342:                                                #xxxxxx,D
                   2343:        01dd 1ddd w0aa aaaa y:aa,D
                   2344:                                                S,y:aa
                   2345:        01dd 1ddd w1mm mrrr y:ea,D
                   2346:                                                S,y:ea
                   2347:                                                #xxxxxx,D
                   2348: */
                   2349:        value = (cur_inst>>16) & BITMASK(3);
                   2350:        value |= (cur_inst>>17) & (BITMASK(2)<<3);
                   2351: 
                   2352:        ea_mode = (cur_inst>>8) & BITMASK(6);
                   2353: 
                   2354:        if ((value>>2)==0) {
                   2355:                /* L: memory move */
                   2356:                if (cur_inst & (1<<14)) {
                   2357:                        retour = dsp_calc_ea(ea_mode, addr_name);       
                   2358:                } else {
1.1.1.2   root     2359:                        sprintf(addr_name,"0x%04x", ea_mode);
1.1       root     2360:                        retour = 0;
                   2361:                }
                   2362: 
                   2363:                value = (cur_inst>>16) & BITMASK(2);
                   2364:                value |= (cur_inst>>17) & (1<<2);
                   2365: 
                   2366:                if (cur_inst & (1<<15)) {
                   2367:                        /* Write D */
                   2368: 
1.1.1.3 ! root     2369:                        registers_changed[disasm_registers_lmove[value][0]]=1;
        !          2370:                        registers_changed[disasm_registers_lmove[value][1]]=1;
1.1       root     2371:                        if (retour) {
                   2372:                                sprintf(parallelmove_name, "#%s,%s", addr_name, registers_lmove[value]);
                   2373:                        } else {
                   2374:                                sprintf(parallelmove_name, "l:%s,%s", addr_name, registers_lmove[value]);
                   2375:                        }
                   2376:                } else {
                   2377:                        /* Read S */
                   2378:                        sprintf(parallelmove_name, "%s,l:%s", registers_lmove[value], addr_name);
                   2379:                }
                   2380: 
                   2381:                return;
                   2382:        }
                   2383: 
                   2384:        memspace = (cur_inst>>19) & 1;
                   2385:        if (cur_inst & (1<<14)) {
                   2386:                retour = dsp_calc_ea(ea_mode, addr_name);       
                   2387:        } else {
                   2388:                sprintf(addr_name,"0x%04x", ea_mode);
                   2389:                retour = 0;
                   2390:        }
                   2391: 
                   2392:        if (memspace) {
                   2393:                /* Y: */
                   2394: 
                   2395:                if (cur_inst & (1<<15)) {
                   2396:                        /* Write D */
                   2397: 
                   2398:                        registers_changed[value]=1;
                   2399:                        if (retour) {
                   2400:                                sprintf(parallelmove_name, "#%s,%s", addr_name, registers_name[value]);
                   2401:                        } else {
                   2402:                                sprintf(parallelmove_name, "y:%s,%s", addr_name, registers_name[value]);
                   2403:                        }
                   2404: 
                   2405:                } else {
                   2406:                        /* Read S */
                   2407:                        sprintf(parallelmove_name, "%s,y:%s", registers_name[value], addr_name);
                   2408:                }
                   2409:        } else {
                   2410:                /* X: */
                   2411: 
                   2412:                if (cur_inst & (1<<15)) {
                   2413:                        /* Write D */
                   2414: 
                   2415:                        registers_changed[value]=1;
                   2416: 
                   2417:                        if (retour) {
                   2418:                                sprintf(parallelmove_name, "#%s,%s", addr_name, registers_name[value]);
                   2419:                        } else {
                   2420:                                sprintf(parallelmove_name, "x:%s,%s", addr_name, registers_name[value]);
                   2421:                        }
                   2422:                } else {
                   2423:                        /* Read S */
                   2424:                        sprintf(parallelmove_name, "%s,x:%s", registers_name[value], addr_name);
                   2425:                }
                   2426:        }
                   2427: }
                   2428: 
                   2429: static void dsp_pm_8(void)
                   2430: {
                   2431:        char addr1_name[16], addr2_name[16];
1.1.1.2   root     2432:        Uint32 ea_mode1, ea_mode2, numreg1, numreg2;
1.1       root     2433: /*
                   2434:        1wmm eeff WrrM MRRR x:ea,D1             y:ea,D2 
                   2435:                                                x:ea,D1         S2,y:ea
                   2436:                                                S1,x:ea         y:ea,D2
                   2437:                                                S1,x:ea         S2,y:ea
                   2438: */
                   2439:        numreg1 = DSP_REG_X0;
                   2440:        switch((cur_inst>>18) & BITMASK(2)) {
                   2441:                case 0: numreg1 = DSP_REG_X0;   break;
                   2442:                case 1: numreg1 = DSP_REG_X1;   break;
                   2443:                case 2: numreg1 = DSP_REG_A;    break;
                   2444:                case 3: numreg1 = DSP_REG_B;    break;
                   2445:        }
                   2446: 
                   2447:        numreg2 = DSP_REG_Y0;
                   2448:        switch((cur_inst>>16) & BITMASK(2)) {
                   2449:                case 0: numreg2 = DSP_REG_Y0;   break;
                   2450:                case 1: numreg2 = DSP_REG_Y1;   break;
                   2451:                case 2: numreg2 = DSP_REG_A;    break;
                   2452:                case 3: numreg2 = DSP_REG_B;    break;
                   2453:        }
                   2454: 
                   2455:        ea_mode1 = (cur_inst>>8) & BITMASK(5);
                   2456:        if ((ea_mode1>>3) == 0) {
                   2457:                ea_mode1 |= (1<<5);
                   2458:        }
                   2459:        ea_mode2 = (cur_inst>>13) & BITMASK(2);
                   2460:        ea_mode2 |= ((cur_inst>>20) & BITMASK(2))<<3;
                   2461:        if ((ea_mode1 & (1<<2))==0) {
                   2462:                ea_mode2 |= 1<<2;
                   2463:        }
                   2464:        if ((ea_mode2>>3) == 0) {
                   2465:                ea_mode2 |= (1<<5);
                   2466:        }
                   2467: 
                   2468:        dsp_calc_ea(ea_mode1, addr1_name);
                   2469:        dsp_calc_ea(ea_mode2, addr2_name);
                   2470:        
                   2471:        if (cur_inst & (1<<15)) {
                   2472:                registers_changed[numreg1]=1;
                   2473:                if (cur_inst & (1<<22)) {
                   2474:                        registers_changed[numreg2]=1;
                   2475:                        sprintf(parallelmove_name, "x:%s,%s y:%s,%s",
                   2476:                                addr1_name,
                   2477:                                registers_name[numreg1],
                   2478:                                addr2_name,
                   2479:                                registers_name[numreg2]
                   2480:                        );
                   2481:                } else {
                   2482:                        sprintf(parallelmove_name, "x:%s,%s %s,y:%s",
                   2483:                                addr1_name,
                   2484:                                registers_name[numreg1],
                   2485:                                registers_name[numreg2],
                   2486:                                addr2_name
                   2487:                        );
                   2488:                }
                   2489:        } else {
                   2490:                if (cur_inst & (1<<22)) {
                   2491:                        registers_changed[numreg2]=1;
                   2492:                        sprintf(parallelmove_name, "%s,x:%s y:%s,%s",
                   2493:                                registers_name[numreg1],
                   2494:                                addr1_name,
                   2495:                                addr2_name,
                   2496:                                registers_name[numreg2]
                   2497:                        );
                   2498:                } else {
                   2499:                        sprintf(parallelmove_name, "%s,x:%s %s,y:%s",
                   2500:                                registers_name[numreg1],
                   2501:                                addr1_name,
                   2502:                                registers_name[numreg2],
                   2503:                                addr2_name
                   2504:                        );
                   2505:                }
                   2506:        }       
                   2507: }
                   2508: 
                   2509: 
                   2510: /**********************************
                   2511:  *     Parallel moves ALU instructions
                   2512:  **********************************/
                   2513: 
                   2514: static void dsp_abs(void)
                   2515: {
1.1.1.2   root     2516:        Uint32 numreg;
1.1       root     2517:        
                   2518:        numreg = DSP_REG_A+((cur_inst>>3) & 1);
                   2519: 
                   2520:        registers_changed[numreg]=1;
1.1.1.2   root     2521:        registers_changed[DSP_REG_SR]=1;
                   2522: 
1.1.1.3 ! root     2523:        sprintf(str_instr," abs %s %s\n", registers_name[numreg], parallelmove_name);
1.1       root     2524: }
                   2525: 
                   2526: static void dsp_adc(void)
                   2527: {
                   2528:        const char *srcname;
1.1.1.2   root     2529:        Uint32 numreg;
1.1       root     2530: 
                   2531:        if (cur_inst & (1<<4)) {
                   2532:                srcname="y";
                   2533:        } else {
                   2534:                srcname="x";
                   2535:        }
                   2536: 
                   2537:        numreg=DSP_REG_A+((cur_inst>>3) & 1);
                   2538:        registers_changed[numreg]=1;
1.1.1.2   root     2539:        registers_changed[DSP_REG_SR]=1;
1.1       root     2540: 
1.1.1.3 ! root     2541:        sprintf(str_instr," adc %s,%s %s\n",
1.1       root     2542:                srcname,
                   2543:                registers_name[numreg],
                   2544:                parallelmove_name
                   2545:        );
                   2546: }
                   2547: 
                   2548: static void dsp_add(void)
                   2549: {
                   2550:        const char *srcname;
1.1.1.2   root     2551:        Uint32 srcreg, dstreg;
1.1       root     2552:        
                   2553:        srcreg = (cur_inst>>4) & BITMASK(3);
                   2554:        dstreg = (cur_inst>>3) & 1;
                   2555: 
                   2556:        switch(srcreg) {
                   2557:                case 1:
                   2558:                        srcreg = dstreg ^ 1;
                   2559:                        srcname = registers_name[DSP_REG_A+srcreg];
                   2560:                        break;
                   2561:                case 2:
                   2562:                        srcname="x";
                   2563:                        break;
                   2564:                case 3:
                   2565:                        srcname="y";
                   2566:                        break;
1.1.1.2   root     2567:                case 4:
                   2568:                        srcname=registers_name[DSP_REG_X0];
                   2569:                        break;
                   2570:                case 5:
                   2571:                        srcname=registers_name[DSP_REG_Y0];
                   2572:                        break;
                   2573:                case 6:
                   2574:                        srcname=registers_name[DSP_REG_X1];
                   2575:                        break;
                   2576:                case 7:
                   2577:                        srcname=registers_name[DSP_REG_Y1];
1.1       root     2578:                        break;
                   2579:                default:
                   2580:                        srcname="";
                   2581:                        break;
                   2582:        }
                   2583: 
                   2584:        registers_changed[DSP_REG_A+dstreg]=1;
1.1.1.2   root     2585:        registers_changed[DSP_REG_SR]=1;
                   2586: 
1.1.1.3 ! root     2587:        sprintf(str_instr," add %s,%s %s\n",
1.1       root     2588:                srcname,
                   2589:                registers_name[DSP_REG_A+dstreg],
                   2590:                parallelmove_name
                   2591:        );
                   2592: }
                   2593: 
                   2594: static void dsp_addl(void)
                   2595: {
1.1.1.2   root     2596:        Uint32 numreg;
1.1       root     2597: 
                   2598:        numreg = (cur_inst>>3) & 1;
                   2599: 
                   2600:        registers_changed[DSP_REG_A+numreg]=1;
1.1.1.2   root     2601:        registers_changed[DSP_REG_SR]=1;
                   2602: 
1.1.1.3 ! root     2603:        sprintf(str_instr," addl %s,%s %s\n",
1.1       root     2604:                registers_name[DSP_REG_A+(numreg ^ 1)],
                   2605:                registers_name[DSP_REG_A+numreg],
                   2606:                parallelmove_name
                   2607:        );
                   2608: }
                   2609: 
                   2610: static void dsp_addr(void)
                   2611: {
1.1.1.2   root     2612:        Uint32 numreg;
1.1       root     2613: 
                   2614:        numreg = (cur_inst>>3) & 1;
                   2615: 
                   2616:        registers_changed[DSP_REG_A+numreg]=1;
1.1.1.2   root     2617:        registers_changed[DSP_REG_SR]=1;
                   2618: 
1.1.1.3 ! root     2619:        sprintf(str_instr," addr %s,%s %s\n",
1.1       root     2620:                registers_name[DSP_REG_A+(numreg ^ 1)],
                   2621:                registers_name[DSP_REG_A+numreg],
                   2622:                parallelmove_name
                   2623:        );
                   2624: }
                   2625: 
                   2626: static void dsp_and(void)
                   2627: {
1.1.1.2   root     2628:        Uint32 srcreg,dstreg;
1.1       root     2629: 
1.1.1.2   root     2630:        switch((cur_inst>>4) & BITMASK(2)) {
                   2631:                case 1:
                   2632:                        srcreg=DSP_REG_Y0;
                   2633:                        break;
                   2634:                case 2:
                   2635:                        srcreg=DSP_REG_X1;
                   2636:                        break;
                   2637:                case 3:
                   2638:                        srcreg=DSP_REG_Y1;
                   2639:                        break;
                   2640:                case 0:
                   2641:                default:
                   2642:                        srcreg=DSP_REG_X0;
                   2643:        }
                   2644:        dstreg = DSP_REG_A+((cur_inst>>3) & 1);
1.1       root     2645: 
1.1.1.2   root     2646:        registers_changed[dstreg]=1;
                   2647:        registers_changed[DSP_REG_SR]=1;
1.1       root     2648: 
1.1.1.3 ! root     2649:        sprintf(str_instr," and %s,%s %s\n",
1.1.1.2   root     2650:                registers_name[srcreg],
                   2651:                registers_name[dstreg],
1.1       root     2652:                parallelmove_name
                   2653:        );
                   2654: }
                   2655: 
                   2656: static void dsp_asl(void)
                   2657: {
1.1.1.2   root     2658:        Uint32 numreg;
1.1       root     2659: 
                   2660:        numreg = DSP_REG_A+((cur_inst>>3) & 1);
                   2661: 
                   2662:        registers_changed[numreg]=1;
1.1.1.2   root     2663:        registers_changed[DSP_REG_SR]=1;
1.1       root     2664: 
1.1.1.3 ! root     2665:        sprintf(str_instr," asl %s %s\n",
1.1       root     2666:                registers_name[numreg],
                   2667:                parallelmove_name
                   2668:        );
                   2669: }
                   2670: 
                   2671: static void dsp_asr(void)
                   2672: {
1.1.1.2   root     2673:        Uint32 numreg;
1.1       root     2674: 
                   2675:        numreg = DSP_REG_A+((cur_inst>>3) & 1);
                   2676: 
                   2677:        registers_changed[numreg]=1;
1.1.1.2   root     2678:        registers_changed[DSP_REG_SR]=1;
1.1       root     2679: 
1.1.1.3 ! root     2680:        sprintf(str_instr," asr %s %s\n",
1.1       root     2681:                registers_name[numreg],
                   2682:                parallelmove_name
                   2683:        );
                   2684: }
                   2685: 
                   2686: static void dsp_clr(void)
                   2687: {
1.1.1.2   root     2688:        Uint32 numreg;
1.1       root     2689: 
                   2690:        numreg = DSP_REG_A+((cur_inst>>3) & 1);
                   2691: 
                   2692:        registers_changed[numreg]=1;
1.1.1.2   root     2693:        registers_changed[DSP_REG_SR]=1;
1.1       root     2694: 
1.1.1.3 ! root     2695:        sprintf(str_instr," clr %s %s\n",
1.1       root     2696:                registers_name[numreg],
                   2697:                parallelmove_name
                   2698:        );
                   2699: }
                   2700: 
                   2701: static void dsp_cmp(void)
                   2702: {
1.1.1.2   root     2703:        Uint32 srcreg, dstreg;
1.1       root     2704:        
                   2705:        srcreg = (cur_inst>>4) & BITMASK(3);
                   2706:        dstreg = (cur_inst>>3) & 1;
                   2707: 
                   2708:        switch(srcreg) {
                   2709:                case 0:
                   2710:                        srcreg = DSP_REG_A+(dstreg ^ 1);
                   2711:                        break;
                   2712:                case 4:
                   2713:                        srcreg = DSP_REG_X0;
                   2714:                        break;
                   2715:                case 5:
                   2716:                        srcreg = DSP_REG_Y0;
                   2717:                        break;
                   2718:                case 6:
                   2719:                        srcreg = DSP_REG_X1;
                   2720:                        break;
                   2721:                case 7:
                   2722:                        srcreg = DSP_REG_Y1;
                   2723:                        break;
                   2724:        }
                   2725: 
1.1.1.2   root     2726:        registers_changed[DSP_REG_SR]=1;
                   2727: 
1.1.1.3 ! root     2728:        sprintf(str_instr," cmp %s,%s %s\n",
1.1       root     2729:                registers_name[srcreg],
                   2730:                registers_name[DSP_REG_A+dstreg],
                   2731:                parallelmove_name
                   2732:        );
                   2733: }
                   2734: 
                   2735: static void dsp_cmpm(void)
                   2736: {
1.1.1.2   root     2737:        Uint32 srcreg, dstreg;
1.1       root     2738:        
                   2739:        srcreg = (cur_inst>>4) & BITMASK(3);
                   2740:        dstreg = (cur_inst>>3) & 1;
                   2741: 
                   2742:        switch(srcreg) {
                   2743:                case 0:
                   2744:                        srcreg = DSP_REG_A+(dstreg ^ 1);
                   2745:                        break;
                   2746:                case 4:
                   2747:                        srcreg = DSP_REG_X0;
                   2748:                        break;
                   2749:                case 5:
                   2750:                        srcreg = DSP_REG_Y0;
                   2751:                        break;
                   2752:                case 6:
                   2753:                        srcreg = DSP_REG_X1;
                   2754:                        break;
                   2755:                case 7:
                   2756:                        srcreg = DSP_REG_Y1;
                   2757:                        break;
                   2758:        }
                   2759: 
1.1.1.2   root     2760:        registers_changed[DSP_REG_SR]=1;
                   2761: 
1.1.1.3 ! root     2762:        sprintf(str_instr," cmpm %s,%s %s\n",
1.1       root     2763:                registers_name[srcreg],
                   2764:                registers_name[DSP_REG_A+dstreg],
                   2765:                parallelmove_name
                   2766:        );
                   2767: }
                   2768: 
                   2769: static void dsp_eor(void)
                   2770: {
1.1.1.2   root     2771:        Uint32 srcreg, dstreg;
1.1       root     2772: 
1.1.1.2   root     2773:        switch((cur_inst>>4) & BITMASK(2)) {
                   2774:                case 1:
                   2775:                        srcreg=DSP_REG_Y0;
                   2776:                        break;
                   2777:                case 2:
                   2778:                        srcreg=DSP_REG_X1;
                   2779:                        break;
                   2780:                case 3:
                   2781:                        srcreg=DSP_REG_Y1;
                   2782:                        break;
                   2783:                case 0:
                   2784:                default:
                   2785:                        srcreg=DSP_REG_X0;
                   2786:        }
                   2787:        dstreg = DSP_REG_A+((cur_inst>>3) & 1);
1.1       root     2788: 
1.1.1.2   root     2789:        registers_changed[dstreg]=1;
                   2790:        registers_changed[DSP_REG_SR]=1;
1.1       root     2791: 
1.1.1.3 ! root     2792:        sprintf(str_instr," eor %s,%s %s\n",
1.1.1.2   root     2793:                registers_name[srcreg],
                   2794:                registers_name[dstreg],
1.1       root     2795:                parallelmove_name
                   2796:        );
                   2797: }
                   2798: 
                   2799: static void dsp_lsl(void)
                   2800: {
1.1.1.2   root     2801:        Uint32 numreg;
1.1       root     2802: 
                   2803:        numreg = DSP_REG_A+((cur_inst>>3) & 1);
                   2804: 
                   2805:        registers_changed[numreg]=1;
1.1.1.2   root     2806:        registers_changed[DSP_REG_SR]=1;
1.1       root     2807: 
1.1.1.3 ! root     2808:        sprintf(str_instr," lsl %s %s\n",
1.1       root     2809:                registers_name[numreg],
                   2810:                parallelmove_name
                   2811:        );
                   2812: }
                   2813: 
                   2814: static void dsp_lsr(void)
                   2815: {
1.1.1.2   root     2816:        Uint32 numreg;
1.1       root     2817: 
                   2818:        numreg = DSP_REG_A+((cur_inst>>3) & 1);
                   2819: 
                   2820:        registers_changed[numreg]=1;
1.1.1.2   root     2821:        registers_changed[DSP_REG_SR]=1;
1.1       root     2822: 
1.1.1.3 ! root     2823:        sprintf(str_instr," lsr %s %s\n",
1.1       root     2824:                registers_name[numreg],
                   2825:                parallelmove_name
                   2826:        );
                   2827: }
                   2828: 
                   2829: static void dsp_mac(void)
                   2830: {
                   2831:        const char *sign_name;
1.1.1.2   root     2832:        Uint32 src1reg=DSP_REG_NULL, src2reg=DSP_REG_NULL, dstreg;
1.1       root     2833: 
                   2834:        if (cur_inst & (1<<2)) {
                   2835:                sign_name="-";
                   2836:        } else {
                   2837:                sign_name="";
                   2838:        }
                   2839:        
                   2840:        switch((cur_inst>>4) & BITMASK(3)) {
                   2841:                case 0:
                   2842:                        src1reg = DSP_REG_X0;
                   2843:                        src2reg = DSP_REG_X0;
                   2844:                        break;
                   2845:                case 1:
                   2846:                        src1reg = DSP_REG_Y0;
                   2847:                        src2reg = DSP_REG_Y0;
                   2848:                        break;
                   2849:                case 2:
                   2850:                        src1reg = DSP_REG_X1;
                   2851:                        src2reg = DSP_REG_X0;
                   2852:                        break;
                   2853:                case 3:
                   2854:                        src1reg = DSP_REG_Y1;
                   2855:                        src2reg = DSP_REG_Y0;
                   2856:                        break;
                   2857:                case 4:
                   2858:                        src1reg = DSP_REG_X0;
                   2859:                        src2reg = DSP_REG_Y1;
                   2860:                        break;
                   2861:                case 5:
                   2862:                        src1reg = DSP_REG_Y0;
                   2863:                        src2reg = DSP_REG_X0;
                   2864:                        break;
                   2865:                case 6:
                   2866:                        src1reg = DSP_REG_X1;
                   2867:                        src2reg = DSP_REG_Y0;
                   2868:                        break;
                   2869:                case 7:
                   2870:                        src1reg = DSP_REG_Y1;
                   2871:                        src2reg = DSP_REG_X1;
                   2872:                        break;
                   2873:        }
                   2874:        dstreg = (cur_inst>>3) & 1;
                   2875: 
                   2876:        registers_changed[DSP_REG_A+dstreg]=1;
1.1.1.2   root     2877:        registers_changed[DSP_REG_SR]=1;
                   2878: 
1.1.1.3 ! root     2879:        sprintf(str_instr," mac %s%s,%s,%s %s\n",
1.1       root     2880:                sign_name,
                   2881:                registers_name[src1reg],
                   2882:                registers_name[src2reg],
                   2883:                registers_name[DSP_REG_A+dstreg],
                   2884:                parallelmove_name
                   2885:        );
                   2886: }
                   2887: 
                   2888: static void dsp_macr(void)
                   2889: {
                   2890:        const char *sign_name;
1.1.1.2   root     2891:        Uint32 src1reg=DSP_REG_NULL, src2reg=DSP_REG_NULL, dstreg;
1.1       root     2892: 
                   2893:        if (cur_inst & (1<<2)) {
                   2894:                sign_name="-";
                   2895:        } else {
                   2896:                sign_name="";
                   2897:        }
                   2898:        
                   2899:        switch((cur_inst>>4) & BITMASK(3)) {
                   2900:                case 0:
                   2901:                        src1reg = DSP_REG_X0;
                   2902:                        src2reg = DSP_REG_X0;
                   2903:                        break;
                   2904:                case 1:
                   2905:                        src1reg = DSP_REG_Y0;
                   2906:                        src2reg = DSP_REG_Y0;
                   2907:                        break;
                   2908:                case 2:
                   2909:                        src1reg = DSP_REG_X1;
                   2910:                        src2reg = DSP_REG_X0;
                   2911:                        break;
                   2912:                case 3:
                   2913:                        src1reg = DSP_REG_Y1;
                   2914:                        src2reg = DSP_REG_Y0;
                   2915:                        break;
                   2916:                case 4:
                   2917:                        src1reg = DSP_REG_X0;
                   2918:                        src2reg = DSP_REG_Y1;
                   2919:                        break;
                   2920:                case 5:
                   2921:                        src1reg = DSP_REG_Y0;
                   2922:                        src2reg = DSP_REG_X0;
                   2923:                        break;
                   2924:                case 6:
                   2925:                        src1reg = DSP_REG_X1;
                   2926:                        src2reg = DSP_REG_Y0;
                   2927:                        break;
                   2928:                case 7:
                   2929:                        src1reg = DSP_REG_Y1;
                   2930:                        src2reg = DSP_REG_X1;
                   2931:                        break;
                   2932:        }
                   2933:        dstreg = (cur_inst>>3) & 1;
                   2934: 
                   2935:        registers_changed[DSP_REG_A+dstreg]=1;
1.1.1.2   root     2936:        registers_changed[DSP_REG_SR]=1;
                   2937: 
1.1.1.3 ! root     2938:        sprintf(str_instr," macr %s%s,%s,%s %s\n",
1.1       root     2939:                sign_name,
                   2940:                registers_name[src1reg],
                   2941:                registers_name[src2reg],
                   2942:                registers_name[DSP_REG_A+dstreg],
                   2943:                parallelmove_name
                   2944:        );
                   2945: }
                   2946: 
                   2947: static void dsp_move(void)
                   2948: {
1.1.1.3 ! root     2949:        sprintf(str_instr," move %s\n", parallelmove_name);
1.1       root     2950: }
                   2951: 
                   2952: static void dsp_mpy(void)
                   2953: {
                   2954:        const char *sign_name;
1.1.1.2   root     2955:        Uint32 src1reg=DSP_REG_NULL, src2reg=DSP_REG_NULL, dstreg;
1.1       root     2956: 
                   2957:        if (cur_inst & (1<<2)) {
                   2958:                sign_name="-";
                   2959:        } else {
                   2960:                sign_name="";
                   2961:        }
                   2962:        
                   2963:        switch((cur_inst>>4) & BITMASK(3)) {
                   2964:                case 0:
                   2965:                        src1reg = DSP_REG_X0;
                   2966:                        src2reg = DSP_REG_X0;
                   2967:                        break;
                   2968:                case 1:
                   2969:                        src1reg = DSP_REG_Y0;
                   2970:                        src2reg = DSP_REG_Y0;
                   2971:                        break;
                   2972:                case 2:
                   2973:                        src1reg = DSP_REG_X1;
                   2974:                        src2reg = DSP_REG_X0;
                   2975:                        break;
                   2976:                case 3:
                   2977:                        src1reg = DSP_REG_Y1;
                   2978:                        src2reg = DSP_REG_Y0;
                   2979:                        break;
                   2980:                case 4:
                   2981:                        src1reg = DSP_REG_X0;
                   2982:                        src2reg = DSP_REG_Y1;
                   2983:                        break;
                   2984:                case 5:
                   2985:                        src1reg = DSP_REG_Y0;
                   2986:                        src2reg = DSP_REG_X0;
                   2987:                        break;
                   2988:                case 6:
                   2989:                        src1reg = DSP_REG_X1;
                   2990:                        src2reg = DSP_REG_Y0;
                   2991:                        break;
                   2992:                case 7:
                   2993:                        src1reg = DSP_REG_Y1;
                   2994:                        src2reg = DSP_REG_X1;
                   2995:                        break;
                   2996:        }
                   2997:        dstreg = (cur_inst>>3) & 1;
                   2998: 
                   2999:        registers_changed[DSP_REG_A+dstreg]=1;
1.1.1.2   root     3000:        registers_changed[DSP_REG_SR]=1;
                   3001: 
1.1.1.3 ! root     3002:        sprintf(str_instr," mpy %s%s,%s,%s %s\n",
1.1       root     3003:                sign_name,
                   3004:                registers_name[src1reg],
                   3005:                registers_name[src2reg],
                   3006:                registers_name[DSP_REG_A+dstreg],
                   3007:                parallelmove_name
                   3008:        );
                   3009: }
                   3010: 
                   3011: static void dsp_mpyr(void)
                   3012: {
                   3013:        const char *sign_name;
1.1.1.2   root     3014:        Uint32 src1reg=DSP_REG_NULL, src2reg=DSP_REG_NULL, dstreg;
1.1       root     3015: 
                   3016:        if (cur_inst & (1<<2)) {
                   3017:                sign_name="-";
                   3018:        } else {
                   3019:                sign_name="";
                   3020:        }
                   3021:        
                   3022:        switch((cur_inst>>4) & BITMASK(3)) {
                   3023:                case 0:
                   3024:                        src1reg = DSP_REG_X0;
                   3025:                        src2reg = DSP_REG_X0;
                   3026:                        break;
                   3027:                case 1:
                   3028:                        src1reg = DSP_REG_Y0;
                   3029:                        src2reg = DSP_REG_Y0;
                   3030:                        break;
                   3031:                case 2:
                   3032:                        src1reg = DSP_REG_X1;
                   3033:                        src2reg = DSP_REG_X0;
                   3034:                        break;
                   3035:                case 3:
                   3036:                        src1reg = DSP_REG_Y1;
                   3037:                        src2reg = DSP_REG_Y0;
                   3038:                        break;
                   3039:                case 4:
                   3040:                        src1reg = DSP_REG_X0;
                   3041:                        src2reg = DSP_REG_Y1;
                   3042:                        break;
                   3043:                case 5:
                   3044:                        src1reg = DSP_REG_Y0;
                   3045:                        src2reg = DSP_REG_X0;
                   3046:                        break;
                   3047:                case 6:
                   3048:                        src1reg = DSP_REG_X1;
                   3049:                        src2reg = DSP_REG_Y0;
                   3050:                        break;
                   3051:                case 7:
                   3052:                        src1reg = DSP_REG_Y1;
                   3053:                        src2reg = DSP_REG_X1;
                   3054:                        break;
                   3055:        }
                   3056:        dstreg = (cur_inst>>3) & 1;
                   3057: 
                   3058:        registers_changed[DSP_REG_A+dstreg]=1;
1.1.1.2   root     3059:        registers_changed[DSP_REG_SR]=1;
                   3060: 
1.1.1.3 ! root     3061:        sprintf(str_instr," mpyr %s%s,%s,%s %s\n",
1.1       root     3062:                sign_name,
                   3063:                registers_name[src1reg],
                   3064:                registers_name[src2reg],
                   3065:                registers_name[DSP_REG_A+dstreg],
                   3066:                parallelmove_name
                   3067:        );
                   3068: }
                   3069: 
                   3070: static void dsp_neg(void)
                   3071: {
1.1.1.2   root     3072:        Uint32 numreg;
1.1       root     3073: 
                   3074:        numreg = DSP_REG_A+((cur_inst>>3) & 1);
                   3075: 
                   3076:        registers_changed[numreg]=1;
1.1.1.2   root     3077:        registers_changed[DSP_REG_SR]=1;
1.1       root     3078: 
1.1.1.3 ! root     3079:        sprintf(str_instr," neg %s %s\n",
1.1       root     3080:                registers_name[numreg],
                   3081:                parallelmove_name
                   3082:        );
                   3083: }
                   3084: 
                   3085: static void dsp_not(void)
                   3086: {
1.1.1.2   root     3087:        Uint32 numreg;
1.1       root     3088: 
                   3089:        numreg = DSP_REG_A+((cur_inst>>3) & 1);
                   3090: 
                   3091:        registers_changed[numreg]=1;
1.1.1.2   root     3092:        registers_changed[DSP_REG_SR]=1;
1.1       root     3093: 
1.1.1.3 ! root     3094:        sprintf(str_instr," not %s %s\n",
1.1       root     3095:                registers_name[numreg],
                   3096:                parallelmove_name
                   3097:        );
                   3098: }
                   3099: 
                   3100: static void dsp_or(void)
                   3101: {
1.1.1.2   root     3102:        Uint32 srcreg, dstreg;
1.1       root     3103: 
1.1.1.2   root     3104:        switch((cur_inst>>4) & BITMASK(2)) {
                   3105:                case 1:
                   3106:                        srcreg=DSP_REG_Y0;
                   3107:                        break;
                   3108:                case 2:
                   3109:                        srcreg=DSP_REG_X1;
                   3110:                        break;
                   3111:                case 3:
                   3112:                        srcreg=DSP_REG_Y1;
                   3113:                        break;
                   3114:                case 0:
                   3115:                default:
                   3116:                        srcreg=DSP_REG_X0;
                   3117:        }
                   3118:        dstreg = DSP_REG_A+((cur_inst>>3) & 1);
1.1       root     3119: 
1.1.1.2   root     3120:        registers_changed[dstreg]=1;
                   3121:        registers_changed[DSP_REG_SR]=1;
1.1       root     3122: 
1.1.1.3 ! root     3123:        sprintf(str_instr," or %s,%s %s\n",
1.1.1.2   root     3124:                registers_name[srcreg],
                   3125:                registers_name[dstreg],
1.1       root     3126:                parallelmove_name
                   3127:        );
                   3128: }
                   3129: 
                   3130: static void dsp_rnd(void)
                   3131: {
1.1.1.2   root     3132:        Uint32 numreg;
1.1       root     3133: 
                   3134:        numreg = DSP_REG_A+((cur_inst>>3) & 1);
                   3135: 
                   3136:        registers_changed[numreg]=1;
1.1.1.2   root     3137:        registers_changed[DSP_REG_SR]=1;
1.1       root     3138: 
1.1.1.3 ! root     3139:        sprintf(str_instr," rnd %s %s\n",
1.1       root     3140:                registers_name[numreg],
                   3141:                parallelmove_name
                   3142:        );
                   3143: }
                   3144: 
                   3145: static void dsp_rol(void)
                   3146: {
1.1.1.2   root     3147:        Uint32 numreg;
1.1       root     3148: 
                   3149:        numreg = DSP_REG_A+((cur_inst>>3) & 1);
                   3150: 
                   3151:        registers_changed[numreg]=1;
1.1.1.2   root     3152:        registers_changed[DSP_REG_SR]=1;
1.1       root     3153: 
1.1.1.3 ! root     3154:        sprintf(str_instr," rol %s %s\n",
1.1       root     3155:                registers_name[numreg],
                   3156:                parallelmove_name
                   3157:        );
                   3158: }
                   3159: 
                   3160: static void dsp_ror(void)
                   3161: {
1.1.1.2   root     3162:        Uint32 numreg;
1.1       root     3163: 
                   3164:        numreg = DSP_REG_A+((cur_inst>>3) & 1);
                   3165: 
                   3166:        registers_changed[numreg]=1;
1.1.1.2   root     3167:        registers_changed[DSP_REG_SR]=1;
1.1       root     3168: 
1.1.1.3 ! root     3169:        sprintf(str_instr," ror %s %s\n",
1.1       root     3170:                registers_name[numreg],
                   3171:                parallelmove_name
                   3172:        );
                   3173: }
                   3174: 
                   3175: static void dsp_sbc(void)
                   3176: {
                   3177:        const char *srcname;
1.1.1.2   root     3178:        Uint32 numreg;
1.1       root     3179: 
                   3180:        if (cur_inst & (1<<4)) {
                   3181:                srcname="y";
                   3182:        } else {
                   3183:                srcname="x";
                   3184:        }
                   3185: 
                   3186:        numreg = DSP_REG_A+((cur_inst>>3) & 1);
                   3187: 
                   3188:        registers_changed[numreg]=1;
1.1.1.2   root     3189:        registers_changed[DSP_REG_SR]=1;
1.1       root     3190: 
1.1.1.3 ! root     3191:        sprintf(str_instr," sbc %s,%s %s\n",
1.1       root     3192:                srcname,
                   3193:                registers_name[numreg],
                   3194:                parallelmove_name
                   3195:        );
                   3196: }
                   3197: 
                   3198: static void dsp_sub(void)
                   3199: {
                   3200:        const char *srcname;
1.1.1.2   root     3201:        Uint32 srcreg, dstreg;
1.1       root     3202:        
                   3203:        srcreg = (cur_inst>>4) & BITMASK(3);
                   3204:        dstreg = (cur_inst>>3) & 1;
                   3205: 
                   3206:        switch(srcreg) {
                   3207:                case 1:
                   3208:                        srcreg = dstreg ^ 1;
                   3209:                        srcname = registers_name[DSP_REG_A+srcreg];
                   3210:                        break;
                   3211:                case 2:
                   3212:                        srcname="x";
                   3213:                        break;
                   3214:                case 3:
                   3215:                        srcname="y";
                   3216:                        break;
1.1.1.2   root     3217:                case 4:
                   3218:                        srcname=registers_name[DSP_REG_X0];
                   3219:                        break;
                   3220:                case 5:
                   3221:                        srcname=registers_name[DSP_REG_Y0];
                   3222:                        break;
                   3223:                case 6:
                   3224:                        srcname=registers_name[DSP_REG_X1];
                   3225:                        break;
                   3226:                case 7:
                   3227:                        srcname=registers_name[DSP_REG_Y1];
1.1       root     3228:                        break;
                   3229:                default:
                   3230:                        srcname="";
                   3231:                        break;
                   3232:        }
                   3233: 
                   3234:        registers_changed[DSP_REG_A+dstreg]=1;
1.1.1.2   root     3235:        registers_changed[DSP_REG_SR]=1;
                   3236: 
1.1.1.3 ! root     3237:        sprintf(str_instr," sub %s,%s %s\n",
1.1       root     3238:                srcname,
                   3239:                registers_name[DSP_REG_A+dstreg],
                   3240:                parallelmove_name
                   3241:        );
                   3242: }
                   3243: 
                   3244: static void dsp_subl(void)
                   3245: {
1.1.1.2   root     3246:        Uint32 numreg;
1.1       root     3247: 
                   3248:        numreg = (cur_inst>>3) & 1;
                   3249: 
                   3250:        registers_changed[DSP_REG_A+numreg]=1;
1.1.1.2   root     3251:        registers_changed[DSP_REG_SR]=1;
                   3252: 
1.1.1.3 ! root     3253:        sprintf(str_instr," subl %s,%s %s\n",
1.1       root     3254:                registers_name[DSP_REG_A+(numreg ^ 1)],
                   3255:                registers_name[DSP_REG_A+numreg],
                   3256:                parallelmove_name
                   3257:        );
                   3258: }
                   3259: 
                   3260: static void dsp_subr(void)
                   3261: {
1.1.1.2   root     3262:        Uint32 numreg;
1.1       root     3263: 
                   3264:        numreg = (cur_inst>>3) & 1;
                   3265: 
                   3266:        registers_changed[DSP_REG_A+numreg]=1;
1.1.1.2   root     3267:        registers_changed[DSP_REG_SR]=1;
                   3268: 
1.1.1.3 ! root     3269:        sprintf(str_instr," subr %s,%s %s\n",
1.1       root     3270:                registers_name[DSP_REG_A+(numreg ^ 1)],
                   3271:                registers_name[DSP_REG_A+numreg],
                   3272:                parallelmove_name
                   3273:        );
                   3274: }
                   3275: 
                   3276: static void dsp_tfr(void)
                   3277: {
1.1.1.2   root     3278:        Uint32 srcreg, dstreg;
1.1       root     3279:        
                   3280:        srcreg = (cur_inst>>4) & BITMASK(3);
                   3281:        dstreg = (cur_inst>>3) & 1;
                   3282: 
1.1.1.2   root     3283:        switch(srcreg) {
                   3284:                case 4:
                   3285:                        srcreg = DSP_REG_X0;
                   3286:                        break;
                   3287:                case 5:
                   3288:                        srcreg = DSP_REG_Y0;
                   3289:                        break;
                   3290:                case 6:
                   3291:                        srcreg = DSP_REG_X1;
                   3292:                        break;
                   3293:                case 7:
                   3294:                        srcreg = DSP_REG_Y1;
                   3295:                        break;
                   3296:                case 0:
                   3297:                default:
                   3298:                        srcreg = DSP_REG_A+(dstreg ^ 1);
                   3299:                        break;
1.1       root     3300:        }
                   3301: 
                   3302:        registers_changed[DSP_REG_A+dstreg]=1;
1.1.1.2   root     3303:        registers_changed[DSP_REG_SR]=1;
                   3304: 
1.1.1.3 ! root     3305:        sprintf(str_instr," tfr %s,%s %s\n",
1.1       root     3306:                registers_name[srcreg],
                   3307:                registers_name[DSP_REG_A+dstreg],
                   3308:                parallelmove_name
                   3309:        );
                   3310: }
                   3311: 
                   3312: static void dsp_tst(void)
                   3313: {
1.1.1.2   root     3314:        registers_changed[DSP_REG_SR]=1;
                   3315: 
1.1.1.3 ! root     3316:        sprintf(str_instr," tst %s %s\n",
1.1       root     3317:                registers_name[DSP_REG_A+((cur_inst>>3) & 1)],
                   3318:                parallelmove_name
                   3319:        );
                   3320: }

unix.superglobalmegacorp.com

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