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

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

unix.superglobalmegacorp.com

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