Annotation of hatari/src/falcon/dsp_cpu.c, revision 1.1.1.14

1.1       root        1: /*
1.1.1.2   root        2:        DSP M56001 emulation
1.1.1.4   root        3:        Instructions interpreter
1.1.1.2   root        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
1.1.1.13  root       18:        along with this program; if not, write to the Free Software Foundation,
                     19:        51 Franklin Street, Fifth Floor, Boston, MA 02110-1335 USA
1.1.1.2   root       20: */
                     21: 
1.1.1.7   root       22: /*
                     23:        DSP memory mapping
                     24:        ------------------
1.1.1.11  root       25: 
1.1.1.7   root       26:        The memory map is configured as follows :
                     27:        Program space P is one contiguous block of 32K dsp Words
1.1.1.11  root       28:        X and Y data space are each separate 16K dsp Word blocks.
1.1.1.7   root       29:        Both X and Y can be accessed as blocks starting at 0 or 16K.
                     30:        Program space physically overlaps both X and Y data spaces.
                     31:        Y: memory is mapped at address $0 in P memory
1.1.1.11  root       32:        X: memory is mapped at address $4000 in P memory
1.1.1.7   root       33: 
                     34:        The DSP external RAM is zero waitstate, but there is a penalty for
1.1.1.11  root       35:        accessing it twice or more in a single instruction, because there is only
1.1.1.9   root       36:        one external data bus. The extra access costs 2 cycles penalty.
                     37: 
1.1.1.7   root       38:        The internal buses are all separate (0 waitstate)
                     39: 
                     40: 
                     41:                      X:             Y:             P:
                     42:        $ffff  |--------------+--------------+--------------|
                     43:               |   Int. I/O   |   Ext. I/O   |              |
                     44:        $ffc0  |--------------+--------------+              |
                     45:               |              |              |              |
                     46:               |   Reserved   |   Reserved   |   Reserved   |
                     47:               |              |              |              |
                     48:               |              |              |              |
                     49:               |              |              |              |
                     50:        $8000  |--------------+--------------+--------------|
                     51:               |              |              |              |
                     52:               |  16k Shadow  |  16k Shadow  |              |
                     53:               |              |              |      32K     |
                     54:        $4000  |--------------+--------------|    Program   |
                     55:               |     16K      |     16K      |      RAM     |
                     56:               |   External   |   External   |              |
                     57:               |     RAM      |     RAM      |              |
                     58:        $0200  |--------------+--------------+--------------|
                     59:               | Log table or | Sin table or |              |
                     60:               | external mem | external mem |   Internal   |
                     61:        $0100  |--------------+--------------+    program   |
                     62:               |  Internal X  |  Internal Y  |    memory    |
                     63:               |    memory    |    memory    |              |
                     64:        $0000  |--------------+--------------+--------------|
                     65: 
                     66: 
                     67:        Special Note : As the Falcon DSP is a 0 waitstate access memory, I've simplified a little the cycle counting.
                     68:        If this DSP emulator code is used in another project, one should take into account the bus control register (BCR) waitstates.
                     69: */
                     70: 
1.1.1.2   root       71: #ifdef HAVE_CONFIG_H
                     72: #include "config.h"
                     73: #endif
                     74: 
1.1.1.6   root       75: #include <stdbool.h>
                     76: 
1.1.1.10  root       77: #include "main.h"
1.1.1.2   root       78: #include "dsp_core.h"
1.1       root       79: #include "dsp_cpu.h"
                     80: #include "dsp_disasm.h"
1.1.1.6   root       81: #include "log.h"
1.1.1.9   root       82: #include "debugui.h"
1.1       root       83: 
1.1.1.2   root       84: #define DSP_COUNT_IPS 0                /* Count instruction per seconds */
                     85: 
1.1.1.14! root       86: #if DSP_COUNT_IPS
        !            87: /* For counting instructions per second */
        !            88: #include <SDL_timer.h>
        !            89: static Uint32 start_time;
        !            90: static Uint32 num_inst;
        !            91: #endif
1.1       root       92: 
                     93: /**********************************
                     94:  *     Defines
                     95:  **********************************/
                     96: 
1.1.1.6   root       97: #define SIGN_PLUS  0
                     98: #define SIGN_MINUS 1
1.1.1.4   root       99: 
1.1.1.9   root      100: /* Defines some bits values for access to external memory (X, Y, P) */
                    101: /* These values will set/unset the corresponding bits in the variable access_to_ext_memory */
                    102: /* to detect how many access to the external memory were done for a single instruction */
                    103: #define EXT_X_MEMORY 0
                    104: #define EXT_Y_MEMORY 1
                    105: #define EXT_P_MEMORY 2
                    106: 
                    107: 
1.1       root      108: /**********************************
                    109:  *     Variables
                    110:  **********************************/
                    111: 
                    112: /* Length of current instruction */
1.1.1.2   root      113: static Uint32 cur_inst_len;    /* =0:jump, >0:increment */
1.1       root      114: 
                    115: /* Current instruction */
1.1.1.4   root      116: static Uint32 cur_inst;
1.1       root      117: 
1.1.1.7   root      118: /* Counts the number of access to the external memory for one instruction */
1.1.1.9   root      119: static Uint16 access_to_ext_memory;
1.1.1.7   root      120: 
1.1.1.6   root      121: /* DSP is in disasm mode ? */
                    122: /* If yes, stack overflow, underflow and illegal instructions messages are not displayed */
                    123: static bool isDsp_in_disasm_mode;
1.1       root      124: 
1.1.1.7   root      125: static char   str_disasm_memory[2][50];        /* Buffer for memory change text in disasm mode */
1.1.1.5   root      126: static Uint16 disasm_memory_ptr;               /* Pointer for memory change in disasm mode */
1.1       root      127: 
                    128: /**********************************
                    129:  *     Functions
                    130:  **********************************/
                    131: 
                    132: typedef void (*dsp_emul_t)(void);
                    133: 
                    134: static void dsp_postexecute_update_pc(void);
                    135: static void dsp_postexecute_interrupts(void);
                    136: 
1.1.1.5   root      137: static void dsp_setInterruptIPL(Uint32 value);
                    138: 
1.1.1.6   root      139: static void dsp_ccr_update_e_u_n_z(Uint32 reg0, Uint32 reg1, Uint32 reg2);
1.1.1.2   root      140: 
                    141: static Uint32 read_memory(int space, Uint16 address);
1.1.1.6   root      142: static inline Uint32 read_memory_p(Uint16 address);
1.1.1.2   root      143: static Uint32 read_memory_disasm(int space, Uint16 address);
1.1.1.6   root      144: 
                    145: static inline void write_memory(int space, Uint16 address, Uint32 value);
                    146: static void write_memory_raw(int space, Uint16 address, Uint32 value);
1.1.1.4   root      147: static void write_memory_disasm(int space, Uint16 address, Uint32 value);
1.1.1.6   root      148: 
1.1.1.11  root      149: static void dsp_write_reg(Uint32 numreg, Uint32 value);
1.1       root      150: 
1.1.1.4   root      151: static void dsp_stack_push(Uint32 curpc, Uint32 cursr, Uint16 sshOnly);
1.1.1.2   root      152: static void dsp_stack_pop(Uint32 *curpc, Uint32 *cursr);
1.1.1.4   root      153: static void dsp_compute_ssh_ssl(void);
1.1       root      154: 
                    155: static void opcode8h_0(void);
                    156: 
1.1.1.2   root      157: static void dsp_update_rn(Uint32 numreg, Sint16 modifier);
                    158: static void dsp_update_rn_bitreverse(Uint32 numreg);
                    159: static void dsp_update_rn_modulo(Uint32 numreg, Sint16 modifier);
                    160: static int dsp_calc_ea(Uint32 ea_mode, Uint32 *dst_addr);
                    161: static int dsp_calc_cc(Uint32 cc_code);
1.1       root      162: 
                    163: static void dsp_undefined(void);
                    164: 
                    165: /* Instructions without parallel moves */
                    166: static void dsp_andi(void);
1.1.1.4   root      167: static void dsp_bchg_aa(void);
                    168: static void dsp_bchg_ea(void);
                    169: static void dsp_bchg_pp(void);
                    170: static void dsp_bchg_reg(void);
                    171: static void dsp_bclr_aa(void);
                    172: static void dsp_bclr_ea(void);
                    173: static void dsp_bclr_pp(void);
                    174: static void dsp_bclr_reg(void);
                    175: static void dsp_bset_aa(void);
                    176: static void dsp_bset_ea(void);
                    177: static void dsp_bset_pp(void);
                    178: static void dsp_bset_reg(void);
                    179: static void dsp_btst_aa(void);
                    180: static void dsp_btst_ea(void);
                    181: static void dsp_btst_pp(void);
                    182: static void dsp_btst_reg(void);
1.1       root      183: static void dsp_div(void);
                    184: static void dsp_enddo(void);
                    185: static void dsp_illegal(void);
1.1.1.4   root      186: static void dsp_jcc_imm(void);
                    187: static void dsp_jcc_ea(void);
                    188: static void dsp_jclr_aa(void);
                    189: static void dsp_jclr_ea(void);
                    190: static void dsp_jclr_pp(void);
                    191: static void dsp_jclr_reg(void);
                    192: static void dsp_jmp_ea(void);
                    193: static void dsp_jmp_imm(void);
                    194: static void dsp_jscc_ea(void);
                    195: static void dsp_jscc_imm(void);
                    196: static void dsp_jsclr_aa(void);
                    197: static void dsp_jsclr_ea(void);
                    198: static void dsp_jsclr_pp(void);
                    199: static void dsp_jsclr_reg(void);
                    200: static void dsp_jset_aa(void);
                    201: static void dsp_jset_ea(void);
                    202: static void dsp_jset_pp(void);
                    203: static void dsp_jset_reg(void);
                    204: static void dsp_jsr_ea(void);
                    205: static void dsp_jsr_imm(void);
                    206: static void dsp_jsset_aa(void);
                    207: static void dsp_jsset_ea(void);
                    208: static void dsp_jsset_pp(void);
                    209: static void dsp_jsset_reg(void);
1.1       root      210: static void dsp_lua(void);
1.1.1.4   root      211: static void dsp_movem_ea(void);
                    212: static void dsp_movem_aa(void);
1.1       root      213: static void dsp_nop(void);
                    214: static void dsp_norm(void);
                    215: static void dsp_ori(void);
                    216: static void dsp_reset(void);
                    217: static void dsp_rti(void);
                    218: static void dsp_rts(void);
                    219: static void dsp_stop(void);
                    220: static void dsp_swi(void);
                    221: static void dsp_tcc(void);
                    222: static void dsp_wait(void);
                    223: 
1.1.1.3   root      224: static void dsp_do_ea(void);
                    225: static void dsp_do_aa(void);
                    226: static void dsp_do_imm(void);
                    227: static void dsp_do_reg(void);
                    228: static void dsp_rep_aa(void);
                    229: static void dsp_rep_ea(void);
                    230: static void dsp_rep_imm(void);
                    231: static void dsp_rep_reg(void);
                    232: static void dsp_movec_aa(void);
                    233: static void dsp_movec_ea(void);
                    234: static void dsp_movec_imm(void);
                    235: static void dsp_movec_reg(void);
1.1       root      236: static void dsp_movep_0(void);
                    237: static void dsp_movep_1(void);
1.1.1.4   root      238: static void dsp_movep_23(void);
1.1       root      239: 
                    240: /* Parallel move analyzer */
1.1.1.2   root      241: static int dsp_pm_read_accu24(int numreg, Uint32 *dest);
1.1       root      242: static void dsp_pm_0(void);
                    243: static void dsp_pm_1(void);
                    244: static void dsp_pm_2(void);
                    245: static void dsp_pm_2_2(void);
                    246: static void dsp_pm_3(void);
                    247: static void dsp_pm_4(void);
1.1.1.4   root      248: static void dsp_pm_4x(void);
1.1       root      249: static void dsp_pm_5(void);
                    250: static void dsp_pm_8(void);
                    251: 
                    252: /* 56bits arithmetic */
1.1.1.2   root      253: static Uint16 dsp_abs56(Uint32 *dest);
                    254: static Uint16 dsp_asl56(Uint32 *dest);
                    255: static Uint16 dsp_asr56(Uint32 *dest);
                    256: static Uint16 dsp_add56(Uint32 *source, Uint32 *dest);
                    257: static Uint16 dsp_sub56(Uint32 *source, Uint32 *dest);
1.1.1.5   root      258: static void dsp_mul56(Uint32 source1, Uint32 source2, Uint32 *dest, Uint8 signe);
1.1.1.2   root      259: static void dsp_rnd56(Uint32 *dest);
1.1       root      260: 
                    261: /* Instructions with parallel moves */
1.1.1.6   root      262: static void dsp_abs_a(void);
                    263: static void dsp_abs_b(void);
                    264: static void dsp_adc_x_a(void);
                    265: static void dsp_adc_x_b(void);
                    266: static void dsp_adc_y_a(void);
                    267: static void dsp_adc_y_b(void);
                    268: static void dsp_add_b_a(void);
                    269: static void dsp_add_a_b(void);
                    270: static void dsp_add_x_a(void);
                    271: static void dsp_add_x_b(void);
                    272: static void dsp_add_y_a(void);
                    273: static void dsp_add_y_b(void);
                    274: static void dsp_add_x0_a(void);
                    275: static void dsp_add_x0_b(void);
                    276: static void dsp_add_y0_a(void);
                    277: static void dsp_add_y0_b(void);
                    278: static void dsp_add_x1_a(void);
                    279: static void dsp_add_x1_b(void);
                    280: static void dsp_add_y1_a(void);
                    281: static void dsp_add_y1_b(void);
                    282: static void dsp_addl_b_a(void);
                    283: static void dsp_addl_a_b(void);
                    284: static void dsp_addr_b_a(void);
                    285: static void dsp_addr_a_b(void);
                    286: static void dsp_and_x0_a(void);
                    287: static void dsp_and_x0_b(void);
                    288: static void dsp_and_y0_a(void);
                    289: static void dsp_and_y0_b(void);
                    290: static void dsp_and_x1_a(void);
                    291: static void dsp_and_x1_b(void);
                    292: static void dsp_and_y1_a(void);
                    293: static void dsp_and_y1_b(void);
1.1.1.7   root      294: static void dsp_asl_a(void);
                    295: static void dsp_asl_b(void);
                    296: static void dsp_asr_a(void);
                    297: static void dsp_asr_b(void);
1.1.1.6   root      298: static void dsp_clr_a(void);
                    299: static void dsp_clr_b(void);
                    300: static void dsp_cmp_b_a(void);
                    301: static void dsp_cmp_a_b(void);
                    302: static void dsp_cmp_x0_a(void);
                    303: static void dsp_cmp_x0_b(void);
                    304: static void dsp_cmp_y0_a(void);
                    305: static void dsp_cmp_y0_b(void);
                    306: static void dsp_cmp_x1_a(void);
                    307: static void dsp_cmp_x1_b(void);
                    308: static void dsp_cmp_y1_a(void);
                    309: static void dsp_cmp_y1_b(void);
                    310: static void dsp_cmpm_b_a(void);
                    311: static void dsp_cmpm_a_b(void);
                    312: static void dsp_cmpm_x0_a(void);
                    313: static void dsp_cmpm_x0_b(void);
                    314: static void dsp_cmpm_y0_a(void);
                    315: static void dsp_cmpm_y0_b(void);
                    316: static void dsp_cmpm_x1_a(void);
                    317: static void dsp_cmpm_x1_b(void);
                    318: static void dsp_cmpm_y1_a(void);
                    319: static void dsp_cmpm_y1_b(void);
                    320: static void dsp_eor_x0_a(void);
                    321: static void dsp_eor_x0_b(void);
                    322: static void dsp_eor_y0_a(void);
                    323: static void dsp_eor_y0_b(void);
                    324: static void dsp_eor_x1_a(void);
                    325: static void dsp_eor_x1_b(void);
                    326: static void dsp_eor_y1_a(void);
                    327: static void dsp_eor_y1_b(void);
                    328: static void dsp_lsl_a(void);
                    329: static void dsp_lsl_b(void);
                    330: static void dsp_lsr_a(void);
                    331: static void dsp_lsr_b(void);
                    332: static void dsp_mac_p_x0_x0_a(void);
                    333: static void dsp_mac_m_x0_x0_a(void);
                    334: static void dsp_mac_p_x0_x0_b(void);
                    335: static void dsp_mac_m_x0_x0_b(void);
                    336: static void dsp_mac_p_y0_y0_a(void);
                    337: static void dsp_mac_m_y0_y0_a(void);
                    338: static void dsp_mac_p_y0_y0_b(void);
                    339: static void dsp_mac_m_y0_y0_b(void);
                    340: static void dsp_mac_p_x1_x0_a(void);
                    341: static void dsp_mac_m_x1_x0_a(void);
                    342: static void dsp_mac_p_x1_x0_b(void);
                    343: static void dsp_mac_m_x1_x0_b(void);
                    344: static void dsp_mac_p_y1_y0_a(void);
                    345: static void dsp_mac_m_y1_y0_a(void);
                    346: static void dsp_mac_p_y1_y0_b(void);
                    347: static void dsp_mac_m_y1_y0_b(void);
                    348: static void dsp_mac_p_x0_y1_a(void);
                    349: static void dsp_mac_m_x0_y1_a(void);
                    350: static void dsp_mac_p_x0_y1_b(void);
                    351: static void dsp_mac_m_x0_y1_b(void);
                    352: static void dsp_mac_p_y0_x0_a(void);
                    353: static void dsp_mac_m_y0_x0_a(void);
                    354: static void dsp_mac_p_y0_x0_b(void);
                    355: static void dsp_mac_m_y0_x0_b(void);
                    356: static void dsp_mac_p_x1_y0_a(void);
                    357: static void dsp_mac_m_x1_y0_a(void);
                    358: static void dsp_mac_p_x1_y0_b(void);
                    359: static void dsp_mac_m_x1_y0_b(void);
                    360: static void dsp_mac_p_y1_x1_a(void);
                    361: static void dsp_mac_m_y1_x1_a(void);
                    362: static void dsp_mac_p_y1_x1_b(void);
                    363: static void dsp_mac_m_y1_x1_b(void);
                    364: static void dsp_macr_p_x0_x0_a(void);
                    365: static void dsp_macr_m_x0_x0_a(void);
                    366: static void dsp_macr_p_x0_x0_b(void);
                    367: static void dsp_macr_m_x0_x0_b(void);
                    368: static void dsp_macr_p_y0_y0_a(void);
                    369: static void dsp_macr_m_y0_y0_a(void);
                    370: static void dsp_macr_p_y0_y0_b(void);
                    371: static void dsp_macr_m_y0_y0_b(void);
                    372: static void dsp_macr_p_x1_x0_a(void);
                    373: static void dsp_macr_m_x1_x0_a(void);
                    374: static void dsp_macr_p_x1_x0_b(void);
                    375: static void dsp_macr_m_x1_x0_b(void);
                    376: static void dsp_macr_p_y1_y0_a(void);
                    377: static void dsp_macr_m_y1_y0_a(void);
                    378: static void dsp_macr_p_y1_y0_b(void);
                    379: static void dsp_macr_m_y1_y0_b(void);
                    380: static void dsp_macr_p_x0_y1_a(void);
                    381: static void dsp_macr_m_x0_y1_a(void);
                    382: static void dsp_macr_p_x0_y1_b(void);
                    383: static void dsp_macr_m_x0_y1_b(void);
                    384: static void dsp_macr_p_y0_x0_a(void);
                    385: static void dsp_macr_m_y0_x0_a(void);
                    386: static void dsp_macr_p_y0_x0_b(void);
                    387: static void dsp_macr_m_y0_x0_b(void);
                    388: static void dsp_macr_p_x1_y0_a(void);
                    389: static void dsp_macr_m_x1_y0_a(void);
                    390: static void dsp_macr_p_x1_y0_b(void);
                    391: static void dsp_macr_m_x1_y0_b(void);
                    392: static void dsp_macr_p_y1_x1_a(void);
                    393: static void dsp_macr_m_y1_x1_a(void);
                    394: static void dsp_macr_p_y1_x1_b(void);
                    395: static void dsp_macr_m_y1_x1_b(void);
1.1       root      396: static void dsp_move(void);
1.1.1.6   root      397: static void dsp_mpy_p_x0_x0_a(void);
                    398: static void dsp_mpy_m_x0_x0_a(void);
                    399: static void dsp_mpy_p_x0_x0_b(void);
                    400: static void dsp_mpy_m_x0_x0_b(void);
                    401: static void dsp_mpy_p_y0_y0_a(void);
                    402: static void dsp_mpy_m_y0_y0_a(void);
                    403: static void dsp_mpy_p_y0_y0_b(void);
                    404: static void dsp_mpy_m_y0_y0_b(void);
                    405: static void dsp_mpy_p_x1_x0_a(void);
                    406: static void dsp_mpy_m_x1_x0_a(void);
                    407: static void dsp_mpy_p_x1_x0_b(void);
                    408: static void dsp_mpy_m_x1_x0_b(void);
                    409: static void dsp_mpy_p_y1_y0_a(void);
                    410: static void dsp_mpy_m_y1_y0_a(void);
                    411: static void dsp_mpy_p_y1_y0_b(void);
                    412: static void dsp_mpy_m_y1_y0_b(void);
                    413: static void dsp_mpy_p_x0_y1_a(void);
                    414: static void dsp_mpy_m_x0_y1_a(void);
                    415: static void dsp_mpy_p_x0_y1_b(void);
                    416: static void dsp_mpy_m_x0_y1_b(void);
                    417: static void dsp_mpy_p_y0_x0_a(void);
                    418: static void dsp_mpy_m_y0_x0_a(void);
                    419: static void dsp_mpy_p_y0_x0_b(void);
                    420: static void dsp_mpy_m_y0_x0_b(void);
                    421: static void dsp_mpy_p_x1_y0_a(void);
                    422: static void dsp_mpy_m_x1_y0_a(void);
                    423: static void dsp_mpy_p_x1_y0_b(void);
                    424: static void dsp_mpy_m_x1_y0_b(void);
                    425: static void dsp_mpy_p_y1_x1_a(void);
                    426: static void dsp_mpy_m_y1_x1_a(void);
                    427: static void dsp_mpy_p_y1_x1_b(void);
                    428: static void dsp_mpy_m_y1_x1_b(void);
                    429: static void dsp_mpyr_p_x0_x0_a(void);
                    430: static void dsp_mpyr_m_x0_x0_a(void);
                    431: static void dsp_mpyr_p_x0_x0_b(void);
                    432: static void dsp_mpyr_m_x0_x0_b(void);
                    433: static void dsp_mpyr_p_y0_y0_a(void);
                    434: static void dsp_mpyr_m_y0_y0_a(void);
                    435: static void dsp_mpyr_p_y0_y0_b(void);
                    436: static void dsp_mpyr_m_y0_y0_b(void);
                    437: static void dsp_mpyr_p_x1_x0_a(void);
                    438: static void dsp_mpyr_m_x1_x0_a(void);
                    439: static void dsp_mpyr_p_x1_x0_b(void);
                    440: static void dsp_mpyr_m_x1_x0_b(void);
                    441: static void dsp_mpyr_p_y1_y0_a(void);
                    442: static void dsp_mpyr_m_y1_y0_a(void);
                    443: static void dsp_mpyr_p_y1_y0_b(void);
                    444: static void dsp_mpyr_m_y1_y0_b(void);
                    445: static void dsp_mpyr_p_x0_y1_a(void);
                    446: static void dsp_mpyr_m_x0_y1_a(void);
                    447: static void dsp_mpyr_p_x0_y1_b(void);
                    448: static void dsp_mpyr_m_x0_y1_b(void);
                    449: static void dsp_mpyr_p_y0_x0_a(void);
                    450: static void dsp_mpyr_m_y0_x0_a(void);
                    451: static void dsp_mpyr_p_y0_x0_b(void);
                    452: static void dsp_mpyr_m_y0_x0_b(void);
                    453: static void dsp_mpyr_p_x1_y0_a(void);
                    454: static void dsp_mpyr_m_x1_y0_a(void);
                    455: static void dsp_mpyr_p_x1_y0_b(void);
                    456: static void dsp_mpyr_m_x1_y0_b(void);
                    457: static void dsp_mpyr_p_y1_x1_a(void);
                    458: static void dsp_mpyr_m_y1_x1_a(void);
                    459: static void dsp_mpyr_p_y1_x1_b(void);
                    460: static void dsp_mpyr_m_y1_x1_b(void);
                    461: static void dsp_neg_a(void);
                    462: static void dsp_neg_b(void);
                    463: static void dsp_not_a(void);
                    464: static void dsp_not_b(void);
                    465: static void dsp_or_x0_a(void);
                    466: static void dsp_or_x0_b(void);
                    467: static void dsp_or_y0_a(void);
                    468: static void dsp_or_y0_b(void);
                    469: static void dsp_or_x1_a(void);
                    470: static void dsp_or_x1_b(void);
                    471: static void dsp_or_y1_a(void);
                    472: static void dsp_or_y1_b(void);
                    473: static void dsp_rnd_a(void);
                    474: static void dsp_rnd_b(void);
                    475: static void dsp_rol_a(void);
                    476: static void dsp_rol_b(void);
                    477: static void dsp_ror_a(void);
                    478: static void dsp_ror_b(void);
                    479: static void dsp_sbc_x_a(void);
                    480: static void dsp_sbc_x_b(void);
                    481: static void dsp_sbc_y_a(void);
                    482: static void dsp_sbc_y_b(void);
                    483: static void dsp_sub_b_a(void);
                    484: static void dsp_sub_a_b(void);
                    485: static void dsp_sub_x_a(void);
                    486: static void dsp_sub_x_b(void);
                    487: static void dsp_sub_y_a(void);
                    488: static void dsp_sub_y_b(void);
                    489: static void dsp_sub_x0_a(void);
                    490: static void dsp_sub_x0_b(void);
                    491: static void dsp_sub_y0_a(void);
                    492: static void dsp_sub_y0_b(void);
                    493: static void dsp_sub_x1_a(void);
                    494: static void dsp_sub_x1_b(void);
                    495: static void dsp_sub_y1_a(void);
                    496: static void dsp_sub_y1_b(void);
                    497: static void dsp_subl_a(void);
                    498: static void dsp_subl_b(void);
                    499: static void dsp_subr_a(void);
                    500: static void dsp_subr_b(void);
                    501: static void dsp_tfr_b_a(void);
                    502: static void dsp_tfr_a_b(void);
                    503: static void dsp_tfr_x0_a(void);
                    504: static void dsp_tfr_x0_b(void);
                    505: static void dsp_tfr_y0_a(void);
                    506: static void dsp_tfr_y0_b(void);
                    507: static void dsp_tfr_x1_a(void);
                    508: static void dsp_tfr_x1_b(void);
                    509: static void dsp_tfr_y1_a(void);
                    510: static void dsp_tfr_y1_b(void);
                    511: static void dsp_tst_a(void);
                    512: static void dsp_tst_b(void);
1.1       root      513: 
1.1.1.6   root      514: static const dsp_emul_t opcodes8h[512] = {
1.1.1.4   root      515:        /* 0x00 - 0x3f */
                    516:        opcode8h_0, dsp_undefined, dsp_undefined, dsp_undefined, opcode8h_0, dsp_andi, dsp_undefined, dsp_ori,
                    517:        dsp_undefined, dsp_undefined, dsp_undefined, dsp_undefined, dsp_undefined, dsp_andi, dsp_undefined, dsp_ori,
                    518:        dsp_undefined, dsp_undefined, dsp_undefined, dsp_undefined, dsp_undefined, dsp_andi, dsp_undefined, dsp_ori,
                    519:        dsp_undefined, dsp_undefined, dsp_undefined, dsp_undefined, dsp_undefined, dsp_andi, dsp_undefined, dsp_ori,
                    520:        dsp_undefined, dsp_undefined, dsp_undefined, dsp_undefined, dsp_undefined, dsp_undefined, dsp_undefined, dsp_undefined,
                    521:        dsp_undefined, dsp_undefined, dsp_undefined, dsp_undefined, dsp_undefined, dsp_undefined, dsp_undefined, dsp_undefined,
                    522:        dsp_undefined, dsp_undefined, dsp_div, dsp_div, dsp_undefined, dsp_undefined, dsp_undefined, dsp_undefined,
                    523:        dsp_norm, dsp_undefined, dsp_undefined, dsp_undefined, dsp_undefined, dsp_undefined, dsp_undefined, dsp_undefined,
1.1.1.11  root      524: 
1.1.1.4   root      525:        /* 0x40 - 0x7f */
                    526:        dsp_tcc, dsp_tcc, dsp_tcc, dsp_tcc, dsp_undefined, dsp_undefined, dsp_undefined, dsp_undefined,
                    527:        dsp_tcc, dsp_tcc, dsp_tcc, dsp_tcc, dsp_undefined, dsp_undefined, dsp_undefined, dsp_undefined,
                    528:        dsp_tcc, dsp_tcc, dsp_tcc, dsp_tcc, dsp_undefined, dsp_undefined, dsp_undefined, dsp_undefined,
                    529:        dsp_tcc, dsp_tcc, dsp_tcc, dsp_tcc, dsp_undefined, dsp_undefined, dsp_undefined, dsp_undefined,
                    530:        dsp_tcc, dsp_tcc, dsp_tcc, dsp_tcc, dsp_undefined, dsp_undefined, dsp_undefined, dsp_undefined,
                    531:        dsp_tcc, dsp_tcc, dsp_tcc, dsp_tcc, dsp_undefined, dsp_undefined, dsp_undefined, dsp_undefined,
                    532:        dsp_tcc, dsp_tcc, dsp_tcc, dsp_tcc, dsp_undefined, dsp_undefined, dsp_undefined, dsp_undefined,
                    533:        dsp_tcc, dsp_tcc, dsp_tcc, dsp_tcc, dsp_undefined, dsp_undefined, dsp_undefined, dsp_undefined,
                    534: 
                    535:        /* 0x80 - 0xbf */
                    536:        dsp_undefined, dsp_undefined, dsp_undefined, dsp_undefined, dsp_undefined, dsp_undefined, dsp_undefined, dsp_undefined,
1.1.1.11  root      537:        dsp_lua, dsp_undefined, dsp_undefined, dsp_undefined, dsp_undefined, dsp_movec_reg, dsp_undefined, dsp_undefined,
1.1.1.4   root      538:        dsp_undefined, dsp_undefined, dsp_undefined, dsp_undefined, dsp_undefined, dsp_undefined, dsp_undefined, dsp_undefined,
1.1.1.11  root      539:        dsp_undefined, dsp_undefined, dsp_undefined, dsp_undefined, dsp_undefined, dsp_movec_reg, dsp_undefined, dsp_undefined,
1.1.1.4   root      540:        dsp_undefined, dsp_movec_aa, dsp_undefined, dsp_movec_aa, dsp_undefined, dsp_movec_imm, dsp_undefined, dsp_undefined,
                    541:        dsp_undefined, dsp_movec_ea, dsp_undefined, dsp_movec_ea, dsp_undefined, dsp_movec_imm, dsp_undefined, dsp_undefined,
                    542:        dsp_undefined, dsp_movec_aa, dsp_undefined, dsp_movec_aa, dsp_undefined, dsp_movec_imm, dsp_undefined, dsp_undefined,
                    543:        dsp_undefined, dsp_movec_ea, dsp_undefined, dsp_movec_ea, dsp_undefined, dsp_movec_imm, dsp_undefined, dsp_undefined,
1.1.1.11  root      544: 
1.1.1.4   root      545:        /* 0xc0 - 0xff */
1.1.1.11  root      546:        dsp_do_aa, dsp_rep_aa, dsp_do_aa, dsp_rep_aa, dsp_do_imm, dsp_rep_imm, dsp_undefined, dsp_undefined,
                    547:        dsp_do_ea, dsp_rep_ea, dsp_do_ea, dsp_rep_ea, dsp_do_imm, dsp_rep_imm, dsp_undefined, dsp_undefined,
                    548:        dsp_undefined, dsp_undefined, dsp_undefined, dsp_undefined, dsp_do_imm, dsp_rep_imm, dsp_undefined, dsp_undefined,
                    549:        dsp_do_reg, dsp_rep_reg, dsp_undefined, dsp_undefined, dsp_do_imm, dsp_rep_imm, dsp_undefined, dsp_undefined,
                    550:        dsp_movem_aa, dsp_movem_aa, dsp_undefined, dsp_undefined, dsp_undefined, dsp_undefined, dsp_undefined, dsp_undefined,
                    551:        dsp_undefined, dsp_undefined, dsp_undefined, dsp_undefined, dsp_movem_ea, dsp_movem_ea, dsp_undefined, dsp_undefined,
                    552:        dsp_movem_aa, dsp_movem_aa, dsp_undefined, dsp_undefined, dsp_undefined, dsp_undefined, dsp_undefined, dsp_undefined,
                    553:        dsp_undefined, dsp_undefined, dsp_undefined, dsp_undefined, dsp_movem_ea, dsp_movem_ea, dsp_undefined, dsp_undefined,
1.1.1.4   root      554: 
                    555:        /* 0x100 - 0x13f */
1.1.1.6   root      556:        dsp_pm_0, dsp_pm_0, dsp_pm_0, dsp_pm_0, dsp_pm_0, dsp_pm_0, dsp_pm_0, dsp_pm_0,
1.1.1.4   root      557:        dsp_movep_0, dsp_movep_0, dsp_movep_1, dsp_movep_1, dsp_movep_23, dsp_movep_23, dsp_movep_23, dsp_movep_23,
1.1.1.6   root      558:        dsp_pm_0, dsp_pm_0, dsp_pm_0, dsp_pm_0, dsp_pm_0, dsp_pm_0, dsp_pm_0, dsp_pm_0,
1.1.1.4   root      559:        dsp_movep_0, dsp_movep_0, dsp_movep_1, dsp_movep_1, dsp_movep_23, dsp_movep_23, dsp_movep_23, dsp_movep_23,
1.1.1.6   root      560:        dsp_pm_0, dsp_pm_0, dsp_pm_0, dsp_pm_0, dsp_pm_0, dsp_pm_0, dsp_pm_0, dsp_pm_0,
1.1.1.4   root      561:        dsp_movep_0, dsp_movep_0, dsp_movep_1, dsp_movep_1, dsp_movep_23, dsp_movep_23, dsp_movep_23, dsp_movep_23,
1.1.1.6   root      562:        dsp_pm_0, dsp_pm_0, dsp_pm_0, dsp_pm_0, dsp_pm_0, dsp_pm_0, dsp_pm_0, dsp_pm_0,
1.1.1.4   root      563:        dsp_movep_0, dsp_movep_0, dsp_movep_1, dsp_movep_1, dsp_movep_23, dsp_movep_23, dsp_movep_23, dsp_movep_23,
                    564: 
                    565:        /* 0x140 - 0x17f */
                    566:        dsp_bclr_aa, dsp_bset_aa, dsp_bclr_aa, dsp_bset_aa, dsp_jclr_aa, dsp_jset_aa, dsp_jclr_aa, dsp_jset_aa,
                    567:        dsp_bclr_ea, dsp_bset_ea, dsp_bclr_ea, dsp_bset_ea, dsp_jclr_ea, dsp_jset_ea, dsp_jclr_ea, dsp_jset_ea,
                    568:        dsp_bclr_pp, dsp_bset_pp, dsp_bclr_pp, dsp_bset_pp, dsp_jclr_pp, dsp_jset_pp, dsp_jclr_pp, dsp_jset_pp,
                    569:        dsp_jclr_reg, dsp_jset_reg, dsp_bclr_reg, dsp_bset_reg, dsp_jmp_ea, dsp_jcc_ea, dsp_undefined, dsp_undefined,
                    570:        dsp_bchg_aa, dsp_btst_aa, dsp_bchg_aa, dsp_btst_aa, dsp_jsclr_aa, dsp_jsset_aa, dsp_jsclr_aa, dsp_jsset_aa,
                    571:        dsp_bchg_ea, dsp_btst_ea, dsp_bchg_ea, dsp_btst_ea, dsp_jsclr_ea, dsp_jsset_ea, dsp_jsclr_ea, dsp_jsset_ea,
                    572:        dsp_bchg_pp, dsp_btst_pp, dsp_bchg_pp, dsp_btst_pp, dsp_jsclr_pp, dsp_jsset_pp, dsp_jsclr_pp, dsp_jsset_pp,
                    573:        dsp_jsclr_reg, dsp_jsset_reg, dsp_bchg_reg, dsp_btst_reg, dsp_jsr_ea, dsp_jscc_ea, dsp_undefined, dsp_undefined,
                    574: 
                    575:        /* 0x180 - 0x1bf */
                    576:        dsp_jmp_imm, dsp_jmp_imm, dsp_jmp_imm, dsp_jmp_imm, dsp_jmp_imm, dsp_jmp_imm, dsp_jmp_imm, dsp_jmp_imm,
1.1.1.11  root      577:        dsp_undefined, dsp_undefined, dsp_undefined, dsp_undefined, dsp_undefined, dsp_undefined, dsp_undefined, dsp_undefined,
                    578:        dsp_undefined, dsp_undefined, dsp_undefined, dsp_undefined, dsp_undefined, dsp_undefined, dsp_undefined, dsp_undefined,
                    579:        dsp_undefined, dsp_undefined, dsp_undefined, dsp_undefined, dsp_undefined, dsp_undefined, dsp_undefined, dsp_undefined,
                    580:        dsp_jsr_imm, dsp_jsr_imm, dsp_jsr_imm, dsp_jsr_imm, dsp_jsr_imm, dsp_jsr_imm, dsp_jsr_imm, dsp_jsr_imm,
                    581:        dsp_undefined, dsp_undefined, dsp_undefined, dsp_undefined, dsp_undefined, dsp_undefined, dsp_undefined, dsp_undefined,
                    582:        dsp_undefined, dsp_undefined, dsp_undefined, dsp_undefined, dsp_undefined, dsp_undefined, dsp_undefined, dsp_undefined,
                    583:        dsp_undefined, dsp_undefined, dsp_undefined, dsp_undefined, dsp_undefined, dsp_undefined, dsp_undefined, dsp_undefined,
1.1.1.4   root      584: 
                    585:        /* 0x1c0 - 0x1ff */
1.1.1.11  root      586:        dsp_jcc_imm, dsp_jcc_imm, dsp_jcc_imm, dsp_jcc_imm, dsp_jcc_imm, dsp_jcc_imm, dsp_jcc_imm, dsp_jcc_imm,
                    587:        dsp_jcc_imm, dsp_jcc_imm, dsp_jcc_imm, dsp_jcc_imm, dsp_jcc_imm, dsp_jcc_imm, dsp_jcc_imm, dsp_jcc_imm,
                    588:        dsp_jcc_imm, dsp_jcc_imm, dsp_jcc_imm, dsp_jcc_imm, dsp_jcc_imm, dsp_jcc_imm, dsp_jcc_imm, dsp_jcc_imm,
                    589:        dsp_jcc_imm, dsp_jcc_imm, dsp_jcc_imm, dsp_jcc_imm, dsp_jcc_imm, dsp_jcc_imm, dsp_jcc_imm, dsp_jcc_imm,
                    590:        dsp_jscc_imm, dsp_jscc_imm, dsp_jscc_imm, dsp_jscc_imm, dsp_jscc_imm, dsp_jscc_imm, dsp_jscc_imm, dsp_jscc_imm,
                    591:        dsp_jscc_imm, dsp_jscc_imm, dsp_jscc_imm, dsp_jscc_imm, dsp_jscc_imm, dsp_jscc_imm, dsp_jscc_imm, dsp_jscc_imm,
                    592:        dsp_jscc_imm, dsp_jscc_imm, dsp_jscc_imm, dsp_jscc_imm, dsp_jscc_imm, dsp_jscc_imm, dsp_jscc_imm, dsp_jscc_imm,
                    593:        dsp_jscc_imm, dsp_jscc_imm, dsp_jscc_imm, dsp_jscc_imm, dsp_jscc_imm, dsp_jscc_imm, dsp_jscc_imm, dsp_jscc_imm,
1.1       root      594: };
                    595: 
1.1.1.6   root      596: static const dsp_emul_t opcodes_parmove[16] = {
                    597:        dsp_pm_0, dsp_pm_1, dsp_pm_2, dsp_pm_3, dsp_pm_4, dsp_pm_5, dsp_pm_5, dsp_pm_5,
                    598:        dsp_pm_8, dsp_pm_8, dsp_pm_8, dsp_pm_8, dsp_pm_8, dsp_pm_8, dsp_pm_8, dsp_pm_8
1.1       root      599: };
                    600: 
1.1.1.6   root      601: static const dsp_emul_t opcodes_alu[256] = {
1.1.1.4   root      602:        /* 0x00 - 0x3f */
1.1.1.6   root      603:        dsp_move     , dsp_tfr_b_a, dsp_addr_b_a, dsp_tst_a, dsp_undefined, dsp_cmp_b_a, dsp_subr_a, dsp_cmpm_b_a,
                    604:        dsp_undefined, dsp_tfr_a_b, dsp_addr_a_b, dsp_tst_b, dsp_undefined, dsp_cmp_a_b, dsp_subr_b, dsp_cmpm_a_b,
                    605:        dsp_add_b_a, dsp_rnd_a, dsp_addl_b_a, dsp_clr_a, dsp_sub_b_a, dsp_undefined, dsp_subl_a, dsp_not_a,
                    606:        dsp_add_a_b, dsp_rnd_b, dsp_addl_a_b, dsp_clr_b, dsp_sub_a_b, dsp_undefined, dsp_subl_b, dsp_not_b,
1.1.1.7   root      607:        dsp_add_x_a, dsp_adc_x_a, dsp_asr_a, dsp_lsr_a, dsp_sub_x_a, dsp_sbc_x_a, dsp_abs_a, dsp_ror_a,
                    608:        dsp_add_x_b, dsp_adc_x_b, dsp_asr_b, dsp_lsr_b, dsp_sub_x_b, dsp_sbc_x_b, dsp_abs_b, dsp_ror_b,
                    609:        dsp_add_y_a, dsp_adc_y_a, dsp_asl_a, dsp_lsl_a, dsp_sub_y_a, dsp_sbc_y_a, dsp_neg_a, dsp_rol_a,
                    610:        dsp_add_y_b, dsp_adc_y_b, dsp_asl_b, dsp_lsl_b, dsp_sub_y_b, dsp_sbc_y_b, dsp_neg_b, dsp_rol_b,
1.1.1.11  root      611: 
1.1.1.4   root      612:        /* 0x40 - 0x7f */
1.1.1.6   root      613:        dsp_add_x0_a, dsp_tfr_x0_a, dsp_or_x0_a, dsp_eor_x0_a, dsp_sub_x0_a, dsp_cmp_x0_a, dsp_and_x0_a, dsp_cmpm_x0_a,
                    614:        dsp_add_x0_b, dsp_tfr_x0_b, dsp_or_x0_b, dsp_eor_x0_b, dsp_sub_x0_b, dsp_cmp_x0_b, dsp_and_x0_b, dsp_cmpm_x0_b,
                    615:        dsp_add_y0_a, dsp_tfr_y0_a, dsp_or_y0_a, dsp_eor_y0_a, dsp_sub_y0_a, dsp_cmp_y0_a, dsp_and_y0_a, dsp_cmpm_y0_a,
                    616:        dsp_add_y0_b, dsp_tfr_y0_b, dsp_or_y0_b, dsp_eor_y0_b, dsp_sub_y0_b, dsp_cmp_y0_b, dsp_and_y0_b, dsp_cmpm_y0_b,
                    617:        dsp_add_x1_a, dsp_tfr_x1_a, dsp_or_x1_a, dsp_eor_x1_a, dsp_sub_x1_a, dsp_cmp_x1_a, dsp_and_x1_a, dsp_cmpm_x1_a,
                    618:        dsp_add_x1_b, dsp_tfr_x1_b, dsp_or_x1_b, dsp_eor_x1_b, dsp_sub_x1_b, dsp_cmp_x1_b, dsp_and_x1_b, dsp_cmpm_x1_b,
                    619:        dsp_add_y1_a, dsp_tfr_y1_a, dsp_or_y1_a, dsp_eor_y1_a, dsp_sub_y1_a, dsp_cmp_y1_a, dsp_and_y1_a, dsp_cmpm_y1_a,
                    620:        dsp_add_y1_b, dsp_tfr_y1_b, dsp_or_y1_b, dsp_eor_y1_b, dsp_sub_y1_b, dsp_cmp_y1_b, dsp_and_y1_b, dsp_cmpm_y1_b,
1.1.1.4   root      621: 
                    622:        /* 0x80 - 0xbf */
1.1.1.6   root      623:        dsp_mpy_p_x0_x0_a, dsp_mpyr_p_x0_x0_a, dsp_mac_p_x0_x0_a, dsp_macr_p_x0_x0_a, dsp_mpy_m_x0_x0_a, dsp_mpyr_m_x0_x0_a, dsp_mac_m_x0_x0_a, dsp_macr_m_x0_x0_a,
                    624:        dsp_mpy_p_x0_x0_b, dsp_mpyr_p_x0_x0_b, dsp_mac_p_x0_x0_b, dsp_macr_p_x0_x0_b, dsp_mpy_m_x0_x0_b, dsp_mpyr_m_x0_x0_b, dsp_mac_m_x0_x0_b, dsp_macr_m_x0_x0_b,
                    625:        dsp_mpy_p_y0_y0_a, dsp_mpyr_p_y0_y0_a, dsp_mac_p_y0_y0_a, dsp_macr_p_y0_y0_a, dsp_mpy_m_y0_y0_a, dsp_mpyr_m_y0_y0_a, dsp_mac_m_y0_y0_a, dsp_macr_m_y0_y0_a,
                    626:        dsp_mpy_p_y0_y0_b, dsp_mpyr_p_y0_y0_b, dsp_mac_p_y0_y0_b, dsp_macr_p_y0_y0_b, dsp_mpy_m_y0_y0_b, dsp_mpyr_m_y0_y0_b, dsp_mac_m_y0_y0_b, dsp_macr_m_y0_y0_b,
                    627:        dsp_mpy_p_x1_x0_a, dsp_mpyr_p_x1_x0_a, dsp_mac_p_x1_x0_a, dsp_macr_p_x1_x0_a, dsp_mpy_m_x1_x0_a, dsp_mpyr_m_x1_x0_a, dsp_mac_m_x1_x0_a, dsp_macr_m_x1_x0_a,
                    628:        dsp_mpy_p_x1_x0_b, dsp_mpyr_p_x1_x0_b, dsp_mac_p_x1_x0_b, dsp_macr_p_x1_x0_b, dsp_mpy_m_x1_x0_b, dsp_mpyr_m_x1_x0_b, dsp_mac_m_x1_x0_b, dsp_macr_m_x1_x0_b,
                    629:        dsp_mpy_p_y1_y0_a, dsp_mpyr_p_y1_y0_a, dsp_mac_p_y1_y0_a, dsp_macr_p_y1_y0_a, dsp_mpy_m_y1_y0_a, dsp_mpyr_m_y1_y0_a, dsp_mac_m_y1_y0_a, dsp_macr_m_y1_y0_a,
                    630:        dsp_mpy_p_y1_y0_b, dsp_mpyr_p_y1_y0_b, dsp_mac_p_y1_y0_b, dsp_macr_p_y1_y0_b, dsp_mpy_m_y1_y0_b, dsp_mpyr_m_y1_y0_b, dsp_mac_m_y1_y0_b, dsp_macr_m_y1_y0_b,
                    631: 
                    632:        /* 0xc0_m_ 0xff */
                    633:        dsp_mpy_p_x0_y1_a, dsp_mpyr_p_x0_y1_a, dsp_mac_p_x0_y1_a, dsp_macr_p_x0_y1_a, dsp_mpy_m_x0_y1_a, dsp_mpyr_m_x0_y1_a, dsp_mac_m_x0_y1_a, dsp_macr_m_x0_y1_a,
                    634:        dsp_mpy_p_x0_y1_b, dsp_mpyr_p_x0_y1_b, dsp_mac_p_x0_y1_b, dsp_macr_p_x0_y1_b, dsp_mpy_m_x0_y1_b, dsp_mpyr_m_x0_y1_b, dsp_mac_m_x0_y1_b, dsp_macr_m_x0_y1_b,
                    635:        dsp_mpy_p_y0_x0_a, dsp_mpyr_p_y0_x0_a, dsp_mac_p_y0_x0_a, dsp_macr_p_y0_x0_a, dsp_mpy_m_y0_x0_a, dsp_mpyr_m_y0_x0_a, dsp_mac_m_y0_x0_a, dsp_macr_m_y0_x0_a,
                    636:        dsp_mpy_p_y0_x0_b, dsp_mpyr_p_y0_x0_b, dsp_mac_p_y0_x0_b, dsp_macr_p_y0_x0_b, dsp_mpy_m_y0_x0_b, dsp_mpyr_m_y0_x0_b, dsp_mac_m_y0_x0_b, dsp_macr_m_y0_x0_b,
                    637:        dsp_mpy_p_x1_y0_a, dsp_mpyr_p_x1_y0_a, dsp_mac_p_x1_y0_a, dsp_macr_p_x1_y0_a, dsp_mpy_m_x1_y0_a, dsp_mpyr_m_x1_y0_a, dsp_mac_m_x1_y0_a, dsp_macr_m_x1_y0_a,
                    638:        dsp_mpy_p_x1_y0_b, dsp_mpyr_p_x1_y0_b, dsp_mac_p_x1_y0_b, dsp_macr_p_x1_y0_b, dsp_mpy_m_x1_y0_b, dsp_mpyr_m_x1_y0_b, dsp_mac_m_x1_y0_b, dsp_macr_m_x1_y0_b,
                    639:        dsp_mpy_p_y1_x1_a, dsp_mpyr_p_y1_x1_a, dsp_mac_p_y1_x1_a, dsp_macr_p_y1_x1_a, dsp_mpy_m_y1_x1_a, dsp_mpyr_m_y1_x1_a, dsp_mac_m_y1_x1_a, dsp_macr_m_y1_x1_a,
                    640:        dsp_mpy_p_y1_x1_b, dsp_mpyr_p_y1_x1_b, dsp_mac_p_y1_x1_b, dsp_macr_p_y1_x1_b, dsp_mpy_m_y1_x1_b, dsp_mpyr_m_y1_x1_b, dsp_mac_m_y1_x1_b, dsp_macr_m_y1_x1_b
1.1       root      641: };
                    642: 
1.1.1.6   root      643: static const int registers_tcc[16][2] = {
1.1       root      644:        {DSP_REG_B,DSP_REG_A},
                    645:        {DSP_REG_A,DSP_REG_B},
                    646:        {DSP_REG_NULL,DSP_REG_NULL},
                    647:        {DSP_REG_NULL,DSP_REG_NULL},
                    648: 
                    649:        {DSP_REG_NULL,DSP_REG_NULL},
                    650:        {DSP_REG_NULL,DSP_REG_NULL},
                    651:        {DSP_REG_NULL,DSP_REG_NULL},
                    652:        {DSP_REG_NULL,DSP_REG_NULL},
                    653: 
                    654:        {DSP_REG_X0,DSP_REG_A},
                    655:        {DSP_REG_X0,DSP_REG_B},
                    656:        {DSP_REG_Y0,DSP_REG_A},
                    657:        {DSP_REG_Y0,DSP_REG_B},
1.1.1.2   root      658: 
                    659:        {DSP_REG_X1,DSP_REG_A},
                    660:        {DSP_REG_X1,DSP_REG_B},
1.1       root      661:        {DSP_REG_Y1,DSP_REG_A},
                    662:        {DSP_REG_Y1,DSP_REG_B}
                    663: };
                    664: 
1.1.1.6   root      665: static const int registers_mask[64] = {
1.1       root      666:        0, 0, 0, 0,
                    667:        24, 24, 24, 24,
                    668:        24, 24, 8, 8,
                    669:        24, 24, 24, 24,
1.1.1.11  root      670: 
1.1       root      671:        16, 16, 16, 16,
                    672:        16, 16, 16, 16,
                    673:        16, 16, 16, 16,
                    674:        16, 16, 16, 16,
1.1.1.11  root      675: 
1.1       root      676:        16, 16, 16, 16,
                    677:        16, 16, 16, 16,
                    678:        0, 0, 0, 0,
                    679:        0, 0, 0, 0,
                    680: 
                    681:        0, 0, 0, 0,
                    682:        0, 0, 0, 0,
                    683:        0, 16, 8, 6,
1.1.1.4   root      684:        16, 16, 16, 16
                    685: };
                    686: 
1.1.1.6   root      687: static const dsp_interrupt_t dsp_interrupt[12] = {
1.1.1.5   root      688:        {DSP_INTER_RESET        ,       0x00, 0, "Reset"},
                    689:        {DSP_INTER_ILLEGAL      ,       0x3e, 0, "Illegal"},
                    690:        {DSP_INTER_STACK_ERROR  ,       0x02, 0, "Stack Error"},
                    691:        {DSP_INTER_TRACE        ,       0x04, 0, "Trace"},
                    692:        {DSP_INTER_SWI          ,       0x06, 0, "Swi"},
                    693:        {DSP_INTER_HOST_COMMAND ,       0xff, 1, "Host Command"},
                    694:        {DSP_INTER_HOST_RCV_DATA,       0x20, 1, "Host receive"},
                    695:        {DSP_INTER_HOST_TRX_DATA,       0x22, 1, "Host transmit"},
                    696:        {DSP_INTER_SSI_RCV_DATA_E,      0x0e, 2, "SSI receive with exception"},
                    697:        {DSP_INTER_SSI_RCV_DATA ,       0x0c, 2, "SSI receive"},
                    698:        {DSP_INTER_SSI_TRX_DATA_E,      0x12, 2, "SSI transmit with exception"},
                    699:        {DSP_INTER_SSI_TRX_DATA ,       0x10, 2, "SSI tramsmit"}
1.1.1.4   root      700: };
                    701: 
1.1.1.13  root      702: static struct {
                    703:        int limit;
                    704:        int count;
                    705:        Uint32 inst;
                    706:        Uint16 pc;
                    707: } dsp_error;
                    708: 
1.1       root      709: 
                    710: /**********************************
                    711:  *     Emulator kernel
                    712:  **********************************/
                    713: 
1.1.1.6   root      714: void dsp56k_init_cpu(void)
1.1       root      715: {
1.1.1.6   root      716:        dsp56k_disasm_init();
                    717:        isDsp_in_disasm_mode = false;
1.1.1.13  root      718:        memset(&dsp_error, 0, sizeof(dsp_error));
                    719:        dsp_error.limit = 1;
1.1.1.14! root      720: #if DSP_COUNT_IPS
        !           721:        start_time = SDL_GetTicks();
1.1.1.2   root      722:        num_inst = 0;
1.1.1.14! root      723: #endif
1.1       root      724: }
                    725: 
1.1.1.6   root      726: /**
                    727:  * Execute one instruction in trace mode at a given PC address.
                    728:  * */
1.1.1.9   root      729: Uint16 dsp56k_execute_one_disasm_instruction(FILE *out, Uint16 pc)
1.1.1.6   root      730: {
                    731:        dsp_core_t *ptr1, *ptr2;
                    732:        static dsp_core_t dsp_core_save;
1.1.1.8   root      733:        Uint16 instruction_length;
1.1.1.6   root      734: 
                    735:        ptr1 = &dsp_core;
                    736:        ptr2 = &dsp_core_save;
                    737: 
                    738:        /* Set DSP in disasm mode */
                    739:        isDsp_in_disasm_mode = true;
                    740: 
                    741:        /* Save DSP context before executing instruction */
                    742:        memcpy(ptr2, ptr1, sizeof(dsp_core));
                    743: 
                    744:        /* execute and disasm instruction */
                    745:        dsp_core.pc = pc;
                    746: 
                    747:        /* Disasm instruction */
1.1.1.12  root      748:        instruction_length = dsp56k_disasm(DSP_DISASM_MODE, out) - 1;
1.1.1.6   root      749: 
                    750:        /* Execute instruction at address given in parameter to get the number of cycles it takes */
                    751:        dsp56k_execute_instruction();
                    752: 
1.1.1.9   root      753:        fprintf(out, "%s", dsp56k_getInstructionText());
1.1.1.6   root      754: 
                    755:        /* Restore DSP context after executing instruction */
                    756:        memcpy(ptr1, ptr2, sizeof(dsp_core));
1.1.1.11  root      757: 
1.1.1.6   root      758:        /* Unset DSP in disasm mode */
                    759:        isDsp_in_disasm_mode = false;
                    760: 
                    761:        return instruction_length;
                    762: }
                    763: 
1.1.1.4   root      764: void dsp56k_execute_instruction(void)
1.1       root      765: {
1.1.1.2   root      766:        Uint32 value;
1.1.1.6   root      767:        Uint32 disasm_return = 0;
1.1.1.5   root      768:        disasm_memory_ptr = 0;
                    769: 
1.1.1.7   root      770:        /* Initialise the number of access to the external memory for this instruction */
1.1.1.9   root      771:        access_to_ext_memory = 0;
1.1.1.11  root      772: 
                    773:        /* Init the indirect AGU move instruction flag */
                    774:        dsp_core.agu_move_indirect_instr = 0;
                    775: 
1.1       root      776:        /* Decode and execute current instruction */
1.1.1.6   root      777:        cur_inst = read_memory_p(dsp_core.pc);
1.1.1.11  root      778: 
1.1.1.7   root      779:        /* Initialize instruction size and cycle counter */
                    780:        cur_inst_len = 1;
1.1.1.6   root      781:        dsp_core.instr_cycle = 2;
1.1       root      782: 
1.1.1.6   root      783:        /* Disasm current instruction ? (trace mode only) */
1.1.1.11  root      784:        if (LOG_TRACE_LEVEL(TRACE_DSP_DISASM)) {
1.1.1.6   root      785:                /* Call dsp56k_disasm only when DSP is called in trace mode */
                    786:                if (isDsp_in_disasm_mode == false) {
1.1.1.12  root      787:                        disasm_return = dsp56k_disasm(DSP_TRACE_MODE, TraceFile);
1.1.1.11  root      788: 
1.1.1.6   root      789:                        if (disasm_return != 0 && LOG_TRACE_LEVEL(TRACE_DSP_DISASM_REG)) {
                    790:                                /* DSP regs trace enabled only if DSP DISASM is enabled */
                    791:                                dsp56k_disasm_reg_save();
                    792:                        }
                    793:                }
                    794:        }
1.1.1.11  root      795: 
1.1.1.4   root      796:        if (cur_inst < 0x100000) {
                    797:                value = (cur_inst >> 11) & (BITMASK(6) << 3);
                    798:                value += (cur_inst >> 5) & BITMASK(3);
1.1       root      799:                opcodes8h[value]();
                    800:        } else {
1.1.1.6   root      801:                /* Do parallel move read */
                    802:                opcodes_parmove[(cur_inst>>20) & BITMASK(4)]();
                    803:        }
                    804: 
1.1.1.7   root      805:        /* Add the waitstate due to external memory access */
1.1.1.9   root      806:        /* (2 extra cycles per extra access to the external memory after the first one */
                    807:        if (access_to_ext_memory != 0) {
                    808:                value = access_to_ext_memory & 1;
                    809:                value += (access_to_ext_memory & 2) >> 1;
                    810:                value += (access_to_ext_memory & 4) >> 2;
1.1.1.11  root      811: 
1.1.1.9   root      812:                if (value > 1)
                    813:                        dsp_core.instr_cycle += (value - 1) * 2;
                    814:        }
                    815: 
1.1.1.6   root      816:        /* Disasm current instruction ? (trace mode only) */
                    817:        if (LOG_TRACE_LEVEL(TRACE_DSP_DISASM)) {
                    818:                /* Display only when DSP is called in trace mode */
                    819:                if (isDsp_in_disasm_mode == false) {
                    820:                        if (disasm_return != 0) {
1.1.1.12  root      821:                                fprintf(TraceFile, "%s", dsp56k_getInstructionText());
1.1.1.11  root      822: 
1.1.1.6   root      823:                                /* DSP regs trace enabled only if DSP DISASM is enabled */
                    824:                                if (LOG_TRACE_LEVEL(TRACE_DSP_DISASM_REG))
1.1.1.12  root      825:                                        dsp56k_disasm_reg_compare(TraceFile);
1.1.1.6   root      826: 
                    827:                                if (LOG_TRACE_LEVEL(TRACE_DSP_DISASM_MEM)) {
                    828:                                        /* 1 memory change to display ? */
                    829:                                        if (disasm_memory_ptr == 1)
1.1.1.12  root      830:                                                fprintf(TraceFile, "\t%s\n", str_disasm_memory[0]);
1.1.1.6   root      831:                                        /* 2 memory changes to display ? */
                    832:                                        else if (disasm_memory_ptr == 2) {
1.1.1.12  root      833:                                                fprintf(TraceFile, "\t%s\n", str_disasm_memory[0]);
                    834:                                                fprintf(TraceFile, "\t%s\n", str_disasm_memory[1]);
1.1.1.6   root      835:                                        }
                    836:                                }
                    837:                        }
                    838:                }
1.1       root      839:        }
                    840: 
1.1.1.4   root      841:        /* Process the PC */
                    842:        dsp_postexecute_update_pc();
1.1       root      843: 
1.1.1.4   root      844:        /* Process Interrupts */
1.1       root      845:        dsp_postexecute_interrupts();
                    846: 
1.1.1.4   root      847: #if DSP_COUNT_IPS
                    848:        ++num_inst;
                    849:        if ((num_inst & 63) == 0) {
                    850:                /* Evaluate time after <N> instructions have been executed to avoid asking too frequently */
                    851:                Uint32 cur_time = SDL_GetTicks();
                    852:                if (cur_time-start_time>1000) {
                    853:                        fprintf(stderr, "Dsp: %d i/s\n", (num_inst*1000)/(cur_time-start_time));
                    854:                        start_time=cur_time;
                    855:                        num_inst=0;
                    856:                }
                    857:        }
                    858: #endif
1.1       root      859: }
                    860: 
                    861: /**********************************
                    862:  *     Update the PC
                    863: **********************************/
                    864: 
                    865: static void dsp_postexecute_update_pc(void)
                    866: {
                    867:        /* When running a REP, PC must stay on the current instruction */
1.1.1.6   root      868:        if (dsp_core.loop_rep) {
1.1.1.11  root      869:                /* Is PC on the instruction to repeat ? */
1.1.1.6   root      870:                if (dsp_core.pc_on_rep==0) {
                    871:                        --dsp_core.registers[DSP_REG_LC];
                    872:                        dsp_core.registers[DSP_REG_LC] &= BITMASK(16);
1.1       root      873: 
1.1.1.6   root      874:                        if (dsp_core.registers[DSP_REG_LC] > 0) {
1.1.1.7   root      875:                                cur_inst_len = 0;       /* Stay on this instruction */
1.1       root      876:                        } else {
1.1.1.6   root      877:                                dsp_core.loop_rep = 0;
                    878:                                dsp_core.registers[DSP_REG_LC] = dsp_core.registers[DSP_REG_LCSAVE];
1.1       root      879:                        }
                    880:                } else {
                    881:                        /* Init LC at right value */
1.1.1.6   root      882:                        if (dsp_core.registers[DSP_REG_LC] == 0) {
                    883:                                dsp_core.registers[DSP_REG_LC] = 0x010000;
1.1       root      884:                        }
1.1.1.6   root      885:                        dsp_core.pc_on_rep = 0;
1.1       root      886:                }
                    887:        }
                    888: 
                    889:        /* Normal execution, go to next instruction */
1.1.1.6   root      890:        dsp_core.pc += cur_inst_len;
1.1       root      891: 
                    892:        /* When running a DO loop, we test the end of loop with the */
                    893:        /* updated PC, pointing to last instruction of the loop */
1.1.1.6   root      894:        if (dsp_core.registers[DSP_REG_SR] & (1<<DSP_SR_LF)) {
1.1       root      895: 
                    896:                /* Did we execute the last instruction in loop ? */
1.1.1.11  root      897:                if (dsp_core.pc == dsp_core.registers[DSP_REG_LA] + 1) {
                    898:                        if (dsp_core.registers[DSP_REG_LC] == 1) {
                    899:                                /* end of the loop */
1.1.1.4   root      900:                                Uint32 saved_pc, saved_sr;
                    901: 
                    902:                                dsp_stack_pop(&saved_pc, &saved_sr);
1.1.1.10  root      903:                                dsp_core.registers[DSP_REG_SR] &= 0x7fff;
1.1.1.6   root      904:                                dsp_core.registers[DSP_REG_SR] |= saved_sr & (1<<DSP_SR_LF);
                    905:                                dsp_stack_pop(&dsp_core.registers[DSP_REG_LA], &dsp_core.registers[DSP_REG_LC]);
1.1       root      906:                        } else {
                    907:                                /* Loop one more time */
1.1.1.11  root      908:                                --dsp_core.registers[DSP_REG_LC];
                    909:                                dsp_core.registers[DSP_REG_LC] &= BITMASK(16);
1.1.1.6   root      910:                                dsp_core.pc = dsp_core.registers[DSP_REG_SSH];
1.1       root      911:                        }
                    912:                }
                    913:        }
                    914: }
                    915: 
                    916: /**********************************
                    917:  *     Interrupts
                    918: **********************************/
                    919: 
1.1.1.5   root      920: /* Post a new interrupt to the interrupt table */
                    921: void dsp_add_interrupt(Uint16 inter)
                    922: {
                    923:        /* detect if this interrupt is used or not */
1.1.1.6   root      924:        if (dsp_core.interrupt_ipl[inter] == -1)
1.1.1.5   root      925:                return;
                    926: 
                    927:        /* add this interrupt to the pending interrupts table */
1.1.1.11  root      928:        if (dsp_core.interrupt_isPending[inter] == 0) {
1.1.1.6   root      929:                dsp_core.interrupt_isPending[inter] = 1;
                    930:                dsp_core.interrupt_counter ++;
1.1.1.5   root      931:        }
                    932: }
                    933: 
                    934: static void dsp_setInterruptIPL(Uint32 value)
                    935: {
                    936:        Uint32 ipl_ssi, ipl_hi, i;
                    937: 
                    938:        ipl_ssi = ((value >> 12) & 3) - 1;
                    939:        ipl_hi  = ((value >> 10) & 3) - 1;
                    940: 
                    941:        /* set IPL_HI */
1.1.1.7   root      942:        for (i=5; i<8; i++) {
1.1.1.6   root      943:                dsp_core.interrupt_ipl[i] = ipl_hi;
1.1.1.5   root      944:        }
                    945: 
                    946:        /* set IPL_SSI */
1.1.1.7   root      947:        for (i=8; i<12; i++) {
1.1.1.6   root      948:                dsp_core.interrupt_ipl[i] = ipl_ssi;
1.1.1.5   root      949:        }
                    950: }
                    951: 
1.1       root      952: static void dsp_postexecute_interrupts(void)
                    953: {
1.1.1.5   root      954:        Uint32 index, instr, i;
                    955:        Sint32 ipl_to_raise, ipl_sr;
1.1.1.4   root      956: 
                    957:        /* REP is not interruptible */
1.1.1.6   root      958:        if (dsp_core.loop_rep) {
1.1.1.4   root      959:                return;
                    960:        }
                    961: 
                    962:        /* A fast interrupt can not be interrupted. */
1.1.1.6   root      963:        if (dsp_core.interrupt_state == DSP_INTERRUPT_DISABLED) {
1.1.1.5   root      964: 
1.1.1.6   root      965:                switch (dsp_core.interrupt_pipeline_count) {
1.1.1.5   root      966:                        case 5:
1.1.1.6   root      967:                                dsp_core.interrupt_pipeline_count --;
1.1.1.5   root      968:                                return;
                    969:                        case 4:
                    970:                                /* Prefetch interrupt instruction 1 */
1.1.1.6   root      971:                                dsp_core.interrupt_save_pc = dsp_core.pc;
                    972:                                dsp_core.pc = dsp_core.interrupt_instr_fetch;
1.1.1.5   root      973: 
                    974:                                /* is it a LONG interrupt ? */
1.1.1.6   root      975:                                instr = read_memory_p(dsp_core.interrupt_instr_fetch);
1.1.1.5   root      976:                                if ( ((instr & 0xfff000) == 0x0d0000) || ((instr & 0xffc0ff) == 0x0bc080) ) {
1.1.1.6   root      977:                                        dsp_core.interrupt_state = DSP_INTERRUPT_LONG;
1.1.1.11  root      978:                                        dsp_stack_push(dsp_core.interrupt_save_pc, dsp_core.registers[DSP_REG_SR], 0);
1.1.1.6   root      979:                                        dsp_core.registers[DSP_REG_SR] &= BITMASK(16)-((1<<DSP_SR_LF)|(1<<DSP_SR_T)  |
1.1.1.5   root      980:                                                                                        (1<<DSP_SR_S1)|(1<<DSP_SR_S0) |
                    981:                                                                                        (1<<DSP_SR_I0)|(1<<DSP_SR_I1));
1.1.1.6   root      982:                                        dsp_core.registers[DSP_REG_SR] |= dsp_core.interrupt_IplToRaise<<DSP_SR_I0;
1.1.1.5   root      983:                                }
1.1.1.6   root      984:                                dsp_core.interrupt_pipeline_count --;
1.1.1.5   root      985:                                return;
                    986:                        case 3:
1.1.1.11  root      987:                                /* Prefetch interrupt instruction 2, if first one was single word */
1.1.1.6   root      988:                                if (dsp_core.pc == dsp_core.interrupt_instr_fetch+1) {
                    989:                                        instr = read_memory_p(dsp_core.pc);
1.1.1.5   root      990:                                        if ( ((instr & 0xfff000) == 0x0d0000) || ((instr & 0xffc0ff) == 0x0bc080) ) {
1.1.1.6   root      991:                                                dsp_core.interrupt_state = DSP_INTERRUPT_LONG;
1.1.1.11  root      992:                                                dsp_stack_push(dsp_core.interrupt_save_pc, dsp_core.registers[DSP_REG_SR], 0);
1.1.1.6   root      993:                                                dsp_core.registers[DSP_REG_SR] &= BITMASK(16)-((1<<DSP_SR_LF)|(1<<DSP_SR_T)  |
1.1.1.5   root      994:                                                                                                (1<<DSP_SR_S1)|(1<<DSP_SR_S0) |
                    995:                                                                                                (1<<DSP_SR_I0)|(1<<DSP_SR_I1));
1.1.1.6   root      996:                                                dsp_core.registers[DSP_REG_SR] |= dsp_core.interrupt_IplToRaise<<DSP_SR_I0;
1.1.1.5   root      997:                                        }
1.1.1.11  root      998:                                        dsp_core.interrupt_pipeline_count --;
                    999:                                        return;
                   1000:                                }
                   1001:                                dsp_core.interrupt_pipeline_count --;
                   1002:                                /* First instruction was 2 word. Fall through */
1.1.1.5   root     1003:                        case 2:
                   1004:                                /* 1 instruction executed after interrupt */
                   1005:                                /* before re enable interrupts */
                   1006:                                /* Was it a FAST interrupt ? */
1.1.1.6   root     1007:                                if (dsp_core.pc == dsp_core.interrupt_instr_fetch+2) {
                   1008:                                        dsp_core.pc = dsp_core.interrupt_save_pc;
1.1.1.5   root     1009:                                }
1.1.1.6   root     1010:                                dsp_core.interrupt_pipeline_count --;
1.1.1.5   root     1011:                                return;
                   1012:                        case 1:
                   1013:                                /* Last instruction executed after interrupt */
                   1014:                                /* before re enable interrupts */
1.1.1.6   root     1015:                                dsp_core.interrupt_pipeline_count --;
1.1.1.5   root     1016:                                return;
                   1017:                        case 0:
                   1018:                                /* Re enable interrupts */
1.1.1.6   root     1019:                                /* All 6 instruction are done, Interrupts can be enabled again */
                   1020:                                dsp_core.interrupt_save_pc = -1;
                   1021:                                dsp_core.interrupt_instr_fetch = -1;
                   1022:                                dsp_core.interrupt_state = DSP_INTERRUPT_NONE;
                   1023:                                break;
1.1.1.4   root     1024:                }
                   1025:        }
1.1       root     1026: 
1.1.1.4   root     1027:        /* Trace Interrupt ? */
1.1.1.6   root     1028:        if (dsp_core.registers[DSP_REG_SR] & (1<<DSP_SR_T)) {
1.1.1.5   root     1029:                dsp_add_interrupt(DSP_INTER_TRACE);
1.1.1.4   root     1030:        }
                   1031: 
                   1032:        /* No interrupt to execute */
1.1.1.6   root     1033:        if (dsp_core.interrupt_counter == 0) {
1.1.1.4   root     1034:                return;
1.1       root     1035:        }
                   1036: 
1.1.1.5   root     1037:        /* search for an interrupt */
1.1.1.6   root     1038:        ipl_sr = (dsp_core.registers[DSP_REG_SR]>>DSP_SR_I0) & BITMASK(2);
1.1.1.5   root     1039:        index = 0xffff;
                   1040:        ipl_to_raise = -1;
                   1041: 
                   1042:        /* Arbitrate between all pending interrupts */
                   1043:        for (i=0; i<12; i++) {
1.1.1.6   root     1044:                if (dsp_core.interrupt_isPending[i] == 1) {
1.1.1.5   root     1045: 
                   1046:                        /* level 3 interrupt ? */
1.1.1.6   root     1047:                        if (dsp_core.interrupt_ipl[i] == 3) {
1.1.1.5   root     1048:                                index = i;
                   1049:                                break;
                   1050:                        }
1.1       root     1051: 
1.1.1.5   root     1052:                        /* level 0, 1 ,2 interrupt ? */
                   1053:                        /* if interrupt is masked in SR, don't process it */
1.1.1.6   root     1054:                        if (dsp_core.interrupt_ipl[i] < ipl_sr)
1.1.1.5   root     1055:                                continue;
1.1       root     1056: 
1.1.1.5   root     1057:                        /* if interrupt is lower or equal than current arbitrated interrupt */
1.1.1.6   root     1058:                        if (dsp_core.interrupt_ipl[i] <= ipl_to_raise)
1.1.1.5   root     1059:                                continue;
                   1060: 
                   1061:                        /* save current arbitrated interrupt */
                   1062:                        index = i;
1.1.1.6   root     1063:                        ipl_to_raise = dsp_core.interrupt_ipl[i];
1.1       root     1064:                }
                   1065:        }
1.1.1.4   root     1066: 
1.1.1.5   root     1067:        /* If there's no interrupt to process, return */
                   1068:        if (index == 0xffff) {
1.1.1.4   root     1069:                return;
                   1070:        }
                   1071: 
1.1.1.5   root     1072:        /* remove this interrupt from the pending interrupts table */
1.1.1.6   root     1073:        dsp_core.interrupt_isPending[index] = 0;
                   1074:        dsp_core.interrupt_counter --;
1.1.1.5   root     1075: 
                   1076:        /* process arbritrated interrupt */
1.1.1.6   root     1077:        ipl_to_raise = dsp_core.interrupt_ipl[index] + 1;
1.1.1.5   root     1078:        if (ipl_to_raise > 3) {
                   1079:                ipl_to_raise = 3;
                   1080:        }
                   1081: 
1.1.1.6   root     1082:        dsp_core.interrupt_instr_fetch = dsp_interrupt[index].vectorAddr;
                   1083:        dsp_core.interrupt_pipeline_count = 5;
                   1084:        dsp_core.interrupt_state = DSP_INTERRUPT_DISABLED;
                   1085:        dsp_core.interrupt_IplToRaise = ipl_to_raise;
                   1086: 
                   1087:        LOG_TRACE(TRACE_DSP_INTERRUPT, "Dsp interrupt: %s\n", dsp_interrupt[index].name);
1.1.1.5   root     1088: 
                   1089:        /* SSI receive data with exception ? */
1.1.1.6   root     1090:        if (dsp_core.interrupt_instr_fetch == 0xe) {
                   1091:                dsp_core.periph[DSP_SPACE_X][DSP_SSI_SR] &= 0xff-(1<<DSP_SSI_SR_ROE);
1.1.1.4   root     1092:        }
                   1093: 
1.1.1.5   root     1094:        /* SSI transmit data with exception ? */
1.1.1.6   root     1095:        else if (dsp_core.interrupt_instr_fetch == 0x12) {
                   1096:                dsp_core.periph[DSP_SPACE_X][DSP_SSI_SR] &= 0xff-(1<<DSP_SSI_SR_TUE);
1.1.1.4   root     1097:        }
                   1098: 
                   1099:        /* host command ? */
1.1.1.6   root     1100:        else if (dsp_core.interrupt_instr_fetch == 0xff) {
1.1.1.4   root     1101:                /* Clear HC and HCP interrupt */
1.1.1.6   root     1102:                dsp_core.periph[DSP_SPACE_X][DSP_HOST_HSR] &= 0xff - (1<<DSP_HOST_HSR_HCP);
1.1.1.11  root     1103:                dsp_core.hostport[CPU_HOST_CVR] &= 0xff - (1<<CPU_HOST_CVR_HC);
1.1.1.4   root     1104: 
1.1.1.6   root     1105:                dsp_core.interrupt_instr_fetch = dsp_core.hostport[CPU_HOST_CVR] & BITMASK(5);
1.1.1.11  root     1106:                dsp_core.interrupt_instr_fetch *= 2;
1.1.1.4   root     1107:        }
1.1       root     1108: }
                   1109: 
                   1110: /**********************************
                   1111:  *     Set/clear ccr bits
                   1112:  **********************************/
                   1113: 
                   1114: /* reg0 has bits 55..48 */
                   1115: /* reg1 has bits 47..24 */
                   1116: /* reg2 has bits 23..0 */
                   1117: 
1.1.1.11  root     1118: static void dsp_ccr_update_e_u_n_z(Uint32 reg0, Uint32 reg1, Uint32 reg2)
1.1.1.6   root     1119: {
                   1120:        Uint32 scaling, value_e, value_u;
1.1.1.4   root     1121: 
1.1.1.6   root     1122:        /* Initialize SR register */
                   1123:        dsp_core.registers[DSP_REG_SR] &= BITMASK(16)-((1<<DSP_SR_E) | (1<<DSP_SR_U) | (1<<DSP_SR_N) | (1<<DSP_SR_Z));
1.1.1.4   root     1124: 
1.1.1.6   root     1125:        scaling = (dsp_core.registers[DSP_REG_SR]>>DSP_SR_S0) & BITMASK(2);
1.1       root     1126:        switch(scaling) {
                   1127:                case 0:
1.1.1.6   root     1128:                        /* Extension Bit (E) */
                   1129:                        value_e = (reg0<<1) + (reg1>>23);
                   1130:                        if ((value_e != 0) && (value_e != BITMASK(9)))
                   1131:                                dsp_core.registers[DSP_REG_SR] |= 1 << DSP_SR_E;
                   1132: 
                   1133:                        /* Unnormalized bit (U) */
1.1.1.11  root     1134:                        if ((reg1 & 0xc00000) == 0 || (reg1 & 0xc00000) == 0xc00000)
1.1.1.6   root     1135:                                dsp_core.registers[DSP_REG_SR] |= 1 << DSP_SR_U;
1.1       root     1136:                        break;
                   1137:                case 1:
1.1.1.6   root     1138:                        /* Extension Bit (E) */
                   1139:                        if ((reg0 != 0) && (reg0 != BITMASK(8)))
                   1140:                                dsp_core.registers[DSP_REG_SR] |= 1 << DSP_SR_E;
                   1141: 
                   1142:                        /* Unnormalized bit (U) */
                   1143:                        value_u = ((reg0<<1) + (reg1>>23)) & 3;
1.1.1.11  root     1144:                        if (value_u == 0 || value_u == 3)
1.1.1.6   root     1145:                                dsp_core.registers[DSP_REG_SR] |= 1 << DSP_SR_U;
1.1       root     1146:                        break;
                   1147:                case 2:
1.1.1.6   root     1148:                        /* Extension Bit (E) */
                   1149:                        value_e = (reg0<<2) + (reg1>>22);
                   1150:                        if ((value_e != 0) && (value_e != BITMASK(10)))
                   1151:                                dsp_core.registers[DSP_REG_SR] |= 1 << DSP_SR_E;
                   1152: 
                   1153:                        /* Unnormalized bit (U) */
1.1.1.11  root     1154:                        if ((reg1 & 0x600000) == 0 || (reg1 & 0x600000) == 0x600000)
1.1.1.6   root     1155:                                dsp_core.registers[DSP_REG_SR] |= 1 << DSP_SR_U;
1.1       root     1156:                        break;
                   1157:                default:
                   1158:                        return;
                   1159:                        break;
                   1160:        }
                   1161: 
1.1.1.6   root     1162:        /* Zero Flag (Z) */
                   1163:        if ((reg1 == 0) && (reg2 == 0) && (reg0 == 0))
                   1164:                dsp_core.registers[DSP_REG_SR] |= 1 << DSP_SR_Z;
1.1.1.4   root     1165: 
1.1.1.6   root     1166:        /* Negative Flag (N) */
                   1167:        dsp_core.registers[DSP_REG_SR] |= (reg0>>4) & 0x8;
1.1       root     1168: }
                   1169: 
                   1170: /**********************************
                   1171:  *     Read/Write memory functions
                   1172:  **********************************/
                   1173: 
1.1.1.2   root     1174: static Uint32 read_memory_disasm(int space, Uint16 address)
1.1       root     1175: {
1.1.1.4   root     1176:        /* Internal RAM ? */
                   1177:        if (address<0x100) {
1.1.1.6   root     1178:                return dsp_core.ramint[space][address] & BITMASK(24);
1.1.1.4   root     1179:        }
1.1       root     1180: 
1.1.1.4   root     1181:        if (space==DSP_SPACE_P) {
                   1182:                return read_memory_p(address);
1.1       root     1183:        }
                   1184: 
1.1.1.4   root     1185:        /* Internal ROM? */
1.1.1.6   root     1186:        if ((dsp_core.registers[DSP_REG_OMR] & (1<<DSP_OMR_DE)) &&
1.1.1.4   root     1187:                (address<0x200)) {
1.1.1.6   root     1188:                return dsp_core.rom[space][address] & BITMASK(24);
1.1.1.4   root     1189:        }
                   1190: 
                   1191:        /* Peripheral address ? */
                   1192:        if (address >= 0xffc0) {
1.1.1.6   root     1193:                if ((space==DSP_SPACE_X) && (address==0xffc0+DSP_HOST_HTX)) {
                   1194:                        return dsp_core.dsp_host_htx;
1.1.1.4   root     1195:                }
                   1196:                if ((space==DSP_SPACE_X) && (address==0xffc0+DSP_SSI_TX)) {
1.1.1.6   root     1197:                        return dsp_core.ssi.transmit_value;
1.1.1.4   root     1198:                }
1.1.1.6   root     1199:                return dsp_core.periph[space][address-0xffc0] & BITMASK(24);
1.1.1.4   root     1200:        }
                   1201: 
                   1202:        /* Falcon: External RAM, map X to upper 16K of matching space in Y,P */
                   1203:        address &= (DSP_RAMSIZE>>1) - 1;
                   1204:        if (space == DSP_SPACE_X) {
                   1205:                address += DSP_RAMSIZE>>1;
                   1206:        }
                   1207: 
                   1208:        /* Falcon: External RAM, finally map X,Y to P */
1.1.1.6   root     1209:        return dsp_core.ramext[address & (DSP_RAMSIZE-1)] & BITMASK(24);
1.1       root     1210: }
                   1211: 
1.1.1.4   root     1212: static inline Uint32 read_memory_p(Uint16 address)
                   1213: {
                   1214:        /* Internal RAM ? */
1.1.1.7   root     1215:        if (address < 0x200) {
1.1.1.6   root     1216:                return dsp_core.ramint[DSP_SPACE_P][address] & BITMASK(24);
1.1.1.4   root     1217:        }
                   1218: 
1.1.1.9   root     1219:        /* Access to the external P memory */
                   1220:        access_to_ext_memory |= 1 << EXT_P_MEMORY;
1.1.1.7   root     1221: 
1.1.1.4   root     1222:        /* External RAM, mask address to available ram size */
1.1.1.6   root     1223:        return dsp_core.ramext[address & (DSP_RAMSIZE-1)] & BITMASK(24);
1.1.1.4   root     1224: }
                   1225: 
1.1.1.2   root     1226: static Uint32 read_memory(int space, Uint16 address)
1.1       root     1227: {
1.1.1.4   root     1228:        Uint32 value;
1.1       root     1229: 
1.1.1.4   root     1230:                /* Internal RAM ? */
                   1231:        if (address < 0x100) {
1.1.1.6   root     1232:                return dsp_core.ramint[space][address] & BITMASK(24);
1.1.1.4   root     1233:        }
1.1       root     1234: 
1.1.1.4   root     1235:        if (space == DSP_SPACE_P) {
                   1236:                return read_memory_p(address);
                   1237:        }
                   1238: 
                   1239:        /* Internal ROM ? */
                   1240:        if (address < 0x200) {
1.1.1.6   root     1241:                if (dsp_core.registers[DSP_REG_OMR] & (1<<DSP_OMR_DE)) {
                   1242:                        return dsp_core.rom[space][address] & BITMASK(24);
1.1.1.4   root     1243:                }
                   1244:        }
                   1245: 
                   1246:        /* Peripheral address ? */
                   1247:        if (address >= 0xffc0) {
1.1.1.6   root     1248:                value = dsp_core.periph[space][address-0xffc0] & BITMASK(24);
1.1.1.4   root     1249:                if (space == DSP_SPACE_X) {
                   1250:                        if (address == 0xffc0+DSP_HOST_HRX) {
1.1.1.6   root     1251:                                value = dsp_core.dsp_host_rtx;
                   1252:                                dsp_core_hostport_dspread();
1.1.1.11  root     1253:                        }
1.1.1.4   root     1254:                        else if (address == 0xffc0+DSP_SSI_RX) {
1.1.1.6   root     1255:                                value = dsp_core_ssi_readRX();
1.1       root     1256:                        }
1.1.1.4   root     1257:                }
                   1258:                return value;
1.1       root     1259:        }
                   1260: 
1.1.1.9   root     1261:        /* Falcon: External X or Y RAM access */
1.1.1.4   root     1262:        address &= (DSP_RAMSIZE>>1) - 1;
                   1263: 
                   1264:        if (space == DSP_SPACE_X) {
1.1.1.9   root     1265:                /* Map X to upper 16K of matching space in Y,P */
1.1.1.4   root     1266:                address += DSP_RAMSIZE>>1;
1.1.1.9   root     1267: 
                   1268:                /* Set one access to the X external memory */
                   1269:                access_to_ext_memory |= 1 << EXT_X_MEMORY;
                   1270:        }
                   1271:        else {
                   1272:                /* Access to the Y external memory */
                   1273:                access_to_ext_memory |= 1 << EXT_Y_MEMORY;
1.1.1.4   root     1274:        }
                   1275: 
1.1.1.9   root     1276: 
1.1.1.4   root     1277:        /* Falcon: External RAM, finally map X,Y to P */
1.1.1.6   root     1278:        return dsp_core.ramext[address & (DSP_RAMSIZE-1)] & BITMASK(24);
                   1279: }
                   1280: 
                   1281: static inline void write_memory(int space, Uint16 address, Uint32 value)
                   1282: {
1.1.1.12  root     1283:        if (LOG_TRACE_LEVEL(TRACE_DSP_DISASM_MEM))
1.1.1.6   root     1284:                write_memory_disasm(space, address, value);
1.1.1.11  root     1285:        else
1.1.1.6   root     1286:                write_memory_raw(space, address, value);
1.1       root     1287: }
                   1288: 
1.1.1.4   root     1289: static void write_memory_raw(int space, Uint16 address, Uint32 value)
1.1       root     1290: {
                   1291:        value &= BITMASK(24);
                   1292: 
1.1.1.4   root     1293:        /* Peripheral address ? */
                   1294:        if (address >= 0xffc0) {
                   1295:                if (space == DSP_SPACE_X) {
                   1296:                        switch(address-0xffc0) {
                   1297:                                case DSP_HOST_HTX:
1.1.1.6   root     1298:                                        dsp_core.dsp_host_htx = value;
                   1299:                                        dsp_core_hostport_dspwrite();
1.1.1.4   root     1300:                                        break;
                   1301:                                case DSP_HOST_HCR:
1.1.1.13  root     1302:                                        dsp_core.periph[DSP_SPACE_X][DSP_HOST_HCR] = value & 0x1f;
1.1.1.4   root     1303:                                        /* Set HF3 and HF2 accordingly on the host side */
1.1.1.6   root     1304:                                        dsp_core.hostport[CPU_HOST_ISR] &=
1.1.1.4   root     1305:                                                BITMASK(8)-((1<<CPU_HOST_ISR_HF3)|(1<<CPU_HOST_ISR_HF2));
1.1.1.6   root     1306:                                        dsp_core.hostport[CPU_HOST_ISR] |=
                   1307:                                                dsp_core.periph[DSP_SPACE_X][DSP_HOST_HCR] & ((1<<CPU_HOST_ISR_HF3)|(1<<CPU_HOST_ISR_HF2));
1.1.1.4   root     1308:                                        break;
                   1309:                                case DSP_HOST_HSR:
                   1310:                                        /* Read only */
                   1311:                                        break;
                   1312:                                case DSP_SSI_CRA:
                   1313:                                case DSP_SSI_CRB:
1.1.1.6   root     1314:                                        dsp_core.periph[DSP_SPACE_X][address-0xffc0] = value;
                   1315:                                        dsp_core_ssi_configure(address-0xffc0, value);
1.1.1.4   root     1316:                                        break;
                   1317:                                case DSP_SSI_TSR:
1.1.1.6   root     1318:                                        dsp_core_ssi_writeTSR();
1.1.1.4   root     1319:                                        break;
                   1320:                                case DSP_SSI_TX:
1.1.1.6   root     1321:                                        dsp_core_ssi_writeTX(value);
1.1.1.4   root     1322:                                        break;
1.1.1.5   root     1323:                                case DSP_IPR:
1.1.1.6   root     1324:                                        dsp_core.periph[DSP_SPACE_X][DSP_IPR] = value;
1.1.1.5   root     1325:                                        dsp_setInterruptIPL(value);
                   1326:                                        break;
                   1327:                                case DSP_PCD:
1.1.1.6   root     1328:                                        dsp_core.periph[DSP_SPACE_X][DSP_PCD] = value;
                   1329:                                        dsp_core_setPortCDataRegister(value);
1.1.1.5   root     1330:                                        break;
1.1.1.4   root     1331:                                default:
1.1.1.6   root     1332:                                        dsp_core.periph[DSP_SPACE_X][address-0xffc0] = value;
1.1.1.4   root     1333:                                        break;
1.1       root     1334:                        }
1.1.1.4   root     1335:                        return;
1.1.1.11  root     1336:                }
1.1.1.4   root     1337:                else if (space == DSP_SPACE_Y) {
1.1.1.6   root     1338:                        dsp_core.periph[DSP_SPACE_Y][address-0xffc0] = value;
1.1.1.4   root     1339:                        return;
                   1340:                }
                   1341:        }
1.1.1.11  root     1342: 
1.1.1.4   root     1343:        /* Internal RAM ? */
                   1344:        if (address < 0x100) {
1.1.1.6   root     1345:                dsp_core.ramint[space][address] = value;
1.1.1.4   root     1346:                return;
                   1347:        }
1.1.1.2   root     1348: 
1.1.1.4   root     1349:        /* Internal ROM ? */
                   1350:        if (address < 0x200) {
                   1351:                if (space != DSP_SPACE_P) {
1.1.1.6   root     1352:                        if (dsp_core.registers[DSP_REG_OMR] & (1<<DSP_OMR_DE)) {
1.1.1.2   root     1353:                                /* Can not write to ROM space */
1.1       root     1354:                                return;
                   1355:                        }
1.1.1.4   root     1356:                }
                   1357:                else {
                   1358:                        /* Space P RAM */
1.1.1.6   root     1359:                        dsp_core.ramint[DSP_SPACE_P][address] = value;
1.1.1.4   root     1360:                        return;
                   1361:                }
1.1       root     1362:        }
                   1363: 
1.1.1.9   root     1364:        /* Access to X, Y or P external RAM */
1.1.1.4   root     1365: 
1.1.1.9   root     1366:        if (space == DSP_SPACE_P) {
                   1367:                /* Access to the P external RAM */
                   1368:                access_to_ext_memory |= 1 << EXT_P_MEMORY;
                   1369:        }
                   1370:        else {
1.1.1.4   root     1371:                address &= (DSP_RAMSIZE>>1) - 1;
                   1372: 
1.1.1.9   root     1373:                if (space == DSP_SPACE_X) {
                   1374:                        /* Access to the X external RAM */
                   1375:                        /* map X to upper 16K of matching space in Y,P */
                   1376:                        address += DSP_RAMSIZE>>1;
                   1377:                        access_to_ext_memory |= 1;
                   1378:                }
                   1379:                else {
                   1380:                        /* Access to the Y external RAM */
                   1381:                        access_to_ext_memory |= 1 << EXT_Y_MEMORY;
                   1382:                }
1.1.1.4   root     1383:        }
                   1384: 
                   1385:        /* Falcon: External RAM, map X,Y to P */
1.1.1.6   root     1386:        dsp_core.ramext[address & (DSP_RAMSIZE-1)] = value;
1.1.1.2   root     1387: }
                   1388: 
1.1.1.4   root     1389: static void write_memory_disasm(int space, Uint16 address, Uint32 value)
1.1.1.2   root     1390: {
1.1.1.4   root     1391:        Uint32 oldvalue, curvalue;
                   1392:        Uint8 space_c = 'p';
                   1393: 
1.1.1.2   root     1394:        value &= BITMASK(24);
1.1.1.6   root     1395:        oldvalue = read_memory_disasm(space, address);
1.1.1.2   root     1396: 
                   1397:        write_memory_raw(space,address,value);
                   1398: 
1.1       root     1399:        switch(space) {
                   1400:                case DSP_SPACE_X:
1.1.1.4   root     1401:                        space_c = 'x';
1.1       root     1402:                        break;
                   1403:                case DSP_SPACE_Y:
1.1.1.4   root     1404:                        space_c = 'y';
                   1405:                        break;
                   1406:                default:
1.1       root     1407:                        break;
                   1408:        }
1.1.1.4   root     1409: 
1.1.1.6   root     1410:        curvalue = read_memory_disasm(space, address);
1.1.1.5   root     1411:        sprintf(str_disasm_memory[disasm_memory_ptr],"Mem: %c:0x%04x  0x%06x -> 0x%06x", space_c, address, oldvalue, curvalue);
                   1412:        disasm_memory_ptr ++;
1.1       root     1413: }
                   1414: 
1.1.1.4   root     1415: static void dsp_write_reg(Uint32 numreg, Uint32 value)
                   1416: {
1.1.1.5   root     1417:        Uint32 stack_error;
1.1.1.4   root     1418: 
1.1.1.7   root     1419:        switch (numreg) {
                   1420:                case DSP_REG_A:
                   1421:                        dsp_core.registers[DSP_REG_A0] = 0;
1.1.1.11  root     1422:                        dsp_core.registers[DSP_REG_A1] = value & BITMASK(24);
1.1.1.7   root     1423:                        dsp_core.registers[DSP_REG_A2] = value & (1<<23) ? 0xff : 0x0;
                   1424:                        break;
                   1425:                case DSP_REG_B:
                   1426:                        dsp_core.registers[DSP_REG_B0] = 0;
1.1.1.11  root     1427:                        dsp_core.registers[DSP_REG_B1] = value & BITMASK(24);
1.1.1.7   root     1428:                        dsp_core.registers[DSP_REG_B2] = value & (1<<23) ? 0xff : 0x0;
                   1429:                        break;
1.1.1.11  root     1430:                case DSP_REG_R0:
                   1431:                case DSP_REG_R1:
                   1432:                case DSP_REG_R2:
                   1433:                case DSP_REG_R3:
                   1434:                case DSP_REG_R4:
                   1435:                case DSP_REG_R5:
                   1436:                case DSP_REG_R6:
                   1437:                case DSP_REG_R7:
                   1438:                case DSP_REG_N0:
                   1439:                case DSP_REG_N1:
                   1440:                case DSP_REG_N2:
                   1441:                case DSP_REG_N3:
                   1442:                case DSP_REG_N4:
                   1443:                case DSP_REG_N5:
                   1444:                case DSP_REG_N6:
                   1445:                case DSP_REG_N7:
                   1446:                case DSP_REG_M0:
                   1447:                case DSP_REG_M1:
                   1448:                case DSP_REG_M2:
                   1449:                case DSP_REG_M3:
                   1450:                case DSP_REG_M4:
                   1451:                case DSP_REG_M5:
                   1452:                case DSP_REG_M6:
                   1453:                case DSP_REG_M7:
                   1454:                        dsp_core.registers[numreg] = value & BITMASK(16);
                   1455:                        break;
1.1.1.7   root     1456:                case DSP_REG_OMR:
                   1457:                        dsp_core.registers[DSP_REG_OMR] = value & 0xc7;
                   1458:                        break;
                   1459:                case DSP_REG_SR:
                   1460:                        dsp_core.registers[DSP_REG_SR] = value & 0xaf7f;
                   1461:                        break;
                   1462:                case DSP_REG_SP:
1.1.1.8   root     1463:                        stack_error = dsp_core.registers[DSP_REG_SP] & (3<<DSP_SP_SE);
                   1464:                        if ((stack_error==0) && (value & (3<<DSP_SP_SE))) {
                   1465:                                /* Stack underflow or overflow detected, raise interrupt */
1.1.1.7   root     1466:                                dsp_add_interrupt(DSP_INTER_STACK_ERROR);
1.1.1.9   root     1467:                                dsp_core.registers[DSP_REG_SP] = value & (3<<DSP_SP_SE);
1.1.1.7   root     1468:                                if (!isDsp_in_disasm_mode)
1.1.1.8   root     1469:                                        fprintf(stderr,"Dsp: Stack Overflow or Underflow\n");
1.1.1.10  root     1470:                                if (ExceptionDebugMask & EXCEPT_DSP)
1.1.1.9   root     1471:                                        DebugUI(REASON_DSP_EXCEPTION);
1.1.1.7   root     1472:                        }
1.1.1.8   root     1473:                        else
1.1.1.11  root     1474:                                dsp_core.registers[DSP_REG_SP] = value & BITMASK(6);
1.1.1.7   root     1475:                        dsp_compute_ssh_ssl();
                   1476:                        break;
                   1477:                case DSP_REG_SSH:
                   1478:                        dsp_stack_push(value, 0, 1);
                   1479:                        break;
                   1480:                case DSP_REG_SSL:
                   1481:                        numreg = dsp_core.registers[DSP_REG_SP] & BITMASK(4);
                   1482:                        if (numreg == 0) {
                   1483:                                value = 0;
                   1484:                        }
                   1485:                        dsp_core.stack[1][numreg] = value & BITMASK(16);
                   1486:                        dsp_core.registers[DSP_REG_SSL] = value & BITMASK(16);
                   1487:                        break;
                   1488:                default:
1.1.1.11  root     1489:                        dsp_core.registers[numreg] = value;
1.1.1.7   root     1490:                        dsp_core.registers[numreg] &= BITMASK(registers_mask[numreg]);
                   1491:                        break;
1.1.1.4   root     1492:        }
                   1493: }
                   1494: 
1.1       root     1495: /**********************************
                   1496:  *     Stack push/pop
                   1497:  **********************************/
                   1498: 
1.1.1.4   root     1499: static void dsp_stack_push(Uint32 curpc, Uint32 cursr, Uint16 sshOnly)
1.1       root     1500: {
1.1.1.4   root     1501:        Uint32 stack_error, underflow, stack;
                   1502: 
1.1.1.6   root     1503:        stack_error = dsp_core.registers[DSP_REG_SP] & (1<<DSP_SP_SE);
                   1504:        underflow = dsp_core.registers[DSP_REG_SP] & (1<<DSP_SP_UF);
                   1505:        stack = (dsp_core.registers[DSP_REG_SP] & BITMASK(4)) + 1;
1.1.1.4   root     1506: 
                   1507: 
                   1508:        if ((stack_error==0) && (stack & (1<<DSP_SP_SE))) {
1.1       root     1509:                /* Stack full, raise interrupt */
1.1.1.5   root     1510:                dsp_add_interrupt(DSP_INTER_STACK_ERROR);
1.1.1.6   root     1511:                if (!isDsp_in_disasm_mode)
                   1512:                        fprintf(stderr,"Dsp: Stack Overflow\n");
1.1.1.10  root     1513:                if (ExceptionDebugMask & EXCEPT_DSP)
1.1.1.9   root     1514:                        DebugUI(REASON_DSP_EXCEPTION);
1.1       root     1515:        }
1.1.1.11  root     1516: 
1.1.1.6   root     1517:        dsp_core.registers[DSP_REG_SP] = (underflow | stack_error | stack) & BITMASK(6);
1.1.1.4   root     1518:        stack &= BITMASK(4);
1.1       root     1519: 
1.1.1.4   root     1520:        if (stack) {
                   1521:                /* SSH part */
1.1.1.6   root     1522:                dsp_core.stack[0][stack] = curpc & BITMASK(16);
1.1.1.4   root     1523:                /* SSL part, if instruction is not like "MOVEC xx, SSH"  */
                   1524:                if (sshOnly == 0) {
1.1.1.6   root     1525:                        dsp_core.stack[1][stack] = cursr & BITMASK(16);
1.1.1.4   root     1526:                }
                   1527:        } else {
1.1.1.6   root     1528:                dsp_core.stack[0][0] = 0;
                   1529:                dsp_core.stack[1][0] = 0;
1.1.1.4   root     1530:        }
1.1       root     1531: 
1.1.1.4   root     1532:        /* Update SSH and SSL registers */
1.1.1.6   root     1533:        dsp_core.registers[DSP_REG_SSH] = dsp_core.stack[0][stack];
                   1534:        dsp_core.registers[DSP_REG_SSL] = dsp_core.stack[1][stack];
1.1       root     1535: }
                   1536: 
1.1.1.2   root     1537: static void dsp_stack_pop(Uint32 *newpc, Uint32 *newsr)
1.1       root     1538: {
1.1.1.4   root     1539:        Uint32 stack_error, underflow, stack;
                   1540: 
1.1.1.6   root     1541:        stack_error = dsp_core.registers[DSP_REG_SP] & (1<<DSP_SP_SE);
                   1542:        underflow = dsp_core.registers[DSP_REG_SP] & (1<<DSP_SP_UF);
                   1543:        stack = (dsp_core.registers[DSP_REG_SP] & BITMASK(4)) - 1;
1.1.1.4   root     1544: 
                   1545:        if ((stack_error==0) && (stack & (1<<DSP_SP_SE))) {
                   1546:                /* Stack empty*/
1.1.1.5   root     1547:                dsp_add_interrupt(DSP_INTER_STACK_ERROR);
1.1.1.6   root     1548:                if (!isDsp_in_disasm_mode)
                   1549:                        fprintf(stderr,"Dsp: Stack underflow\n");
1.1.1.10  root     1550:                if (ExceptionDebugMask & EXCEPT_DSP)
1.1.1.9   root     1551:                        DebugUI(REASON_DSP_EXCEPTION);
1.1       root     1552:        }
                   1553: 
1.1.1.6   root     1554:        dsp_core.registers[DSP_REG_SP] = (underflow | stack_error | stack) & BITMASK(6);
1.1.1.4   root     1555:        stack &= BITMASK(4);
1.1.1.6   root     1556:        *newpc = dsp_core.registers[DSP_REG_SSH];
                   1557:        *newsr = dsp_core.registers[DSP_REG_SSL];
1.1.1.4   root     1558: 
1.1.1.6   root     1559:        dsp_core.registers[DSP_REG_SSH] = dsp_core.stack[0][stack];
                   1560:        dsp_core.registers[DSP_REG_SSL] = dsp_core.stack[1][stack];
1.1.1.4   root     1561: }
                   1562: 
                   1563: static void dsp_compute_ssh_ssl(void)
                   1564: {
                   1565:        Uint32 stack;
1.1       root     1566: 
1.1.1.6   root     1567:        stack = dsp_core.registers[DSP_REG_SP];
1.1.1.4   root     1568:        stack &= BITMASK(4);
1.1.1.6   root     1569:        dsp_core.registers[DSP_REG_SSH] = dsp_core.stack[0][stack];
                   1570:        dsp_core.registers[DSP_REG_SSL] = dsp_core.stack[1][stack];
1.1       root     1571: }
                   1572: 
                   1573: /**********************************
                   1574:  *     Effective address calculation
                   1575:  **********************************/
                   1576: 
1.1.1.2   root     1577: static void dsp_update_rn(Uint32 numreg, Sint16 modifier)
1.1       root     1578: {
1.1.1.12  root     1579:        Uint32 value;
1.1.1.2   root     1580:        Uint16 m_reg;
1.1       root     1581: 
1.1.1.6   root     1582:        m_reg = (Uint16) dsp_core.registers[DSP_REG_M0+numreg];
1.1.1.7   root     1583:        if (m_reg == 65535) {
                   1584:                /* Linear addressing mode */
1.1.1.12  root     1585:                value = dsp_core.registers[DSP_REG_R0+numreg]|0x10000;
1.1.1.7   root     1586:                value += modifier;
1.1.1.12  root     1587:                dsp_core.registers[DSP_REG_R0+numreg] = value & BITMASK(16);
1.1.1.7   root     1588:        } else if (m_reg == 0) {
1.1       root     1589:                /* Bit reversed carry update */
                   1590:                dsp_update_rn_bitreverse(numreg);
1.1.1.4   root     1591:        } else if (m_reg<=32767) {
1.1       root     1592:                /* Modulo update */
                   1593:                dsp_update_rn_modulo(numreg, modifier);
                   1594:        } else {
                   1595:                /* Undefined */
                   1596:        }
                   1597: }
                   1598: 
1.1.1.2   root     1599: static void dsp_update_rn_bitreverse(Uint32 numreg)
1.1       root     1600: {
                   1601:        int revbits, i;
1.1.1.2   root     1602:        Uint32 value, r_reg;
1.1       root     1603: 
                   1604:        /* Check how many bits to reverse */
1.1.1.6   root     1605:        value = dsp_core.registers[DSP_REG_N0+numreg];
1.1       root     1606:        for (revbits=0;revbits<16;revbits++) {
                   1607:                if (value & (1<<revbits)) {
                   1608:                        break;
                   1609:                }
1.1.1.11  root     1610:        }
1.1       root     1611:        revbits++;
1.1.1.11  root     1612: 
1.1       root     1613:        /* Reverse Rn bits */
1.1.1.6   root     1614:        r_reg = dsp_core.registers[DSP_REG_R0+numreg];
1.1       root     1615:        value = r_reg & (BITMASK(16)-BITMASK(revbits));
                   1616:        for (i=0;i<revbits;i++) {
                   1617:                if (r_reg & (1<<i)) {
                   1618:                        value |= 1<<(revbits-i-1);
                   1619:                }
                   1620:        }
                   1621: 
                   1622:        /* Increment */
                   1623:        value++;
                   1624:        value &= BITMASK(revbits);
                   1625: 
                   1626:        /* Reverse Rn bits */
                   1627:        r_reg &= (BITMASK(16)-BITMASK(revbits));
                   1628:        r_reg |= value;
                   1629: 
                   1630:        value = r_reg & (BITMASK(16)-BITMASK(revbits));
                   1631:        for (i=0;i<revbits;i++) {
                   1632:                if (r_reg & (1<<i)) {
                   1633:                        value |= 1<<(revbits-i-1);
                   1634:                }
                   1635:        }
                   1636: 
1.1.1.6   root     1637:        dsp_core.registers[DSP_REG_R0+numreg] = value;
1.1       root     1638: }
                   1639: 
1.1.1.2   root     1640: static void dsp_update_rn_modulo(Uint32 numreg, Sint16 modifier)
1.1       root     1641: {
1.1.1.12  root     1642:        Uint16 bufsize, bufmask, modulo, abs_modifier;
                   1643:        Uint32 r_reg, lobound, hibound;
1.1       root     1644: 
1.1.1.12  root     1645:        r_reg = dsp_core.registers[DSP_REG_R0+numreg]|0x10000;
1.1.1.6   root     1646:        modulo = dsp_core.registers[DSP_REG_M0+numreg]+1;
1.1.1.12  root     1647: 
                   1648: 
1.1       root     1649:        bufsize = 1;
                   1650:        while (bufsize < modulo) {
                   1651:                bufsize <<= 1;
                   1652:        }
1.1.1.12  root     1653:        bufmask = bufsize - 1;
1.1.1.11  root     1654: 
1.1.1.12  root     1655: 
                   1656:        lobound = r_reg - (r_reg&bufmask);
1.1.1.2   root     1657:        hibound = lobound + modulo - 1;
1.1       root     1658: 
1.1.1.4   root     1659: 
1.1.1.12  root     1660:        if (modifier<0) {
                   1661:                abs_modifier = -modifier;
                   1662:        } else {
                   1663:                abs_modifier = modifier;
1.1.1.2   root     1664:        }
1.1.1.4   root     1665: 
                   1666: 
1.1.1.12  root     1667:        if (abs_modifier>modulo) {
                   1668:                if (abs_modifier&bufmask) {
                   1669:                        fprintf(stderr,"Dsp: Modulo addressing result unpredictable\n");
                   1670:                } else {
                   1671:                        r_reg += modifier;
                   1672:                }
                   1673:        } else {
                   1674:                r_reg += modifier;
                   1675: 
                   1676: 
1.1.1.4   root     1677:                if (r_reg>hibound) {
                   1678:                        r_reg -= modulo;
                   1679:                } else if (r_reg<lobound) {
                   1680:                        r_reg += modulo;
1.1.1.11  root     1681:                }
1.1       root     1682:        }
                   1683: 
1.1.1.12  root     1684:        dsp_core.registers[DSP_REG_R0+numreg] = r_reg & BITMASK(16);
1.1       root     1685: }
                   1686: 
1.1.1.2   root     1687: static int dsp_calc_ea(Uint32 ea_mode, Uint32 *dst_addr)
1.1       root     1688: {
1.1.1.2   root     1689:        Uint32 value, numreg, curreg;
1.1       root     1690: 
                   1691:        value = (ea_mode >> 3) & BITMASK(3);
                   1692:        numreg = ea_mode & BITMASK(3);
                   1693:        switch (value) {
                   1694:                case 0:
                   1695:                        /* (Rx)-Nx */
1.1.1.6   root     1696:                        *dst_addr = dsp_core.registers[DSP_REG_R0+numreg];
                   1697:                        dsp_update_rn(numreg, -dsp_core.registers[DSP_REG_N0+numreg]);
1.1       root     1698:                        break;
                   1699:                case 1:
                   1700:                        /* (Rx)+Nx */
1.1.1.6   root     1701:                        *dst_addr = dsp_core.registers[DSP_REG_R0+numreg];
                   1702:                        dsp_update_rn(numreg, dsp_core.registers[DSP_REG_N0+numreg]);
1.1       root     1703:                        break;
                   1704:                case 2:
                   1705:                        /* (Rx)- */
1.1.1.6   root     1706:                        *dst_addr = dsp_core.registers[DSP_REG_R0+numreg];
1.1       root     1707:                        dsp_update_rn(numreg, -1);
                   1708:                        break;
                   1709:                case 3:
                   1710:                        /* (Rx)+ */
1.1.1.6   root     1711:                        *dst_addr = dsp_core.registers[DSP_REG_R0+numreg];
1.1.1.12  root     1712:                        dsp_update_rn(numreg, 1);
1.1       root     1713:                        break;
                   1714:                case 4:
                   1715:                        /* (Rx) */
1.1.1.6   root     1716:                        *dst_addr = dsp_core.registers[DSP_REG_R0+numreg];
1.1       root     1717:                        break;
                   1718:                case 5:
                   1719:                        /* (Rx+Nx) */
1.1.1.6   root     1720:                        dsp_core.instr_cycle += 2;
                   1721:                        curreg = dsp_core.registers[DSP_REG_R0+numreg];
                   1722:                        dsp_update_rn(numreg, dsp_core.registers[DSP_REG_N0+numreg]);
                   1723:                        *dst_addr = dsp_core.registers[DSP_REG_R0+numreg];
                   1724:                        dsp_core.registers[DSP_REG_R0+numreg] = curreg;
1.1       root     1725:                        break;
                   1726:                case 6:
                   1727:                        /* aa */
1.1.1.6   root     1728:                        dsp_core.instr_cycle += 2;
                   1729:                        *dst_addr = read_memory_p(dsp_core.pc+1);
1.1       root     1730:                        cur_inst_len++;
                   1731:                        if (numreg != 0) {
                   1732:                                return 1; /* immediate value */
                   1733:                        }
                   1734:                        break;
                   1735:                case 7:
                   1736:                        /* -(Rx) */
1.1.1.6   root     1737:                        dsp_core.instr_cycle += 2;
1.1       root     1738:                        dsp_update_rn(numreg, -1);
1.1.1.6   root     1739:                        *dst_addr = dsp_core.registers[DSP_REG_R0+numreg];
1.1       root     1740:                        break;
                   1741:        }
                   1742:        /* address */
                   1743:        return 0;
                   1744: }
                   1745: 
                   1746: /**********************************
                   1747:  *     Condition code test
                   1748:  **********************************/
                   1749: 
1.1.1.2   root     1750: static int dsp_calc_cc(Uint32 cc_code)
1.1       root     1751: {
1.1.1.4   root     1752:        Uint16 value1, value2, value3;
1.1       root     1753: 
1.1.1.4   root     1754:        switch (cc_code) {
                   1755:                case 0:  /* CC (HS) */
1.1.1.6   root     1756:                        value1 = dsp_core.registers[DSP_REG_SR] & (1<<DSP_SR_C);
1.1.1.4   root     1757:                        return (value1==0);
                   1758:                case 1: /* GE */
1.1.1.6   root     1759:                        value1 = (dsp_core.registers[DSP_REG_SR] >> DSP_SR_N) & 1;
                   1760:                        value2 = (dsp_core.registers[DSP_REG_SR] >> DSP_SR_V) & 1;
1.1.1.4   root     1761:                        return ((value1 ^ value2) == 0);
                   1762:                case 2: /* NE */
1.1.1.6   root     1763:                        value1 = dsp_core.registers[DSP_REG_SR] & (1<<DSP_SR_Z);
1.1.1.4   root     1764:                        return (value1==0);
                   1765:                case 3: /* PL */
1.1.1.6   root     1766:                        value1 = dsp_core.registers[DSP_REG_SR] & (1<<DSP_SR_N);
1.1.1.4   root     1767:                        return (value1==0);
                   1768:                case 4: /* NN */
1.1.1.6   root     1769:                        value1 = (dsp_core.registers[DSP_REG_SR] >> DSP_SR_Z) & 1;
                   1770:                        value2 = (~(dsp_core.registers[DSP_REG_SR] >> DSP_SR_U)) & 1;
                   1771:                        value3 = (~(dsp_core.registers[DSP_REG_SR] >> DSP_SR_E)) & 1;
1.1.1.4   root     1772:                        return ((value1 | (value2 & value3)) == 0);
                   1773:                case 5: /* EC */
1.1.1.6   root     1774:                        value1 = dsp_core.registers[DSP_REG_SR] & (1<<DSP_SR_E);
1.1.1.4   root     1775:                        return (value1==0);
                   1776:                case 6: /* LC */
1.1.1.6   root     1777:                        value1 = dsp_core.registers[DSP_REG_SR] & (1<<DSP_SR_L);
1.1.1.4   root     1778:                        return (value1==0);
1.1.1.11  root     1779:                case 7: /* GT */
1.1.1.6   root     1780:                        value1 = (dsp_core.registers[DSP_REG_SR] >> DSP_SR_N) & 1;
                   1781:                        value2 = (dsp_core.registers[DSP_REG_SR] >> DSP_SR_V) & 1;
                   1782:                        value3 = (dsp_core.registers[DSP_REG_SR] >> DSP_SR_Z) & 1;
1.1.1.4   root     1783:                        return ((value3 | (value1 ^ value2)) == 0);
                   1784:                case 8: /* CS (LO) */
1.1.1.6   root     1785:                        value1 = dsp_core.registers[DSP_REG_SR] & (1<<DSP_SR_C);
1.1.1.4   root     1786:                        return (value1==1);
                   1787:                case 9: /* LT */
1.1.1.6   root     1788:                        value1 = (dsp_core.registers[DSP_REG_SR] >> DSP_SR_N) & 1;
                   1789:                        value2 = (dsp_core.registers[DSP_REG_SR] >> DSP_SR_V) & 1;
1.1.1.4   root     1790:                        return ((value1 ^ value2) == 1);
                   1791:                case 10: /* EQ */
1.1.1.6   root     1792:                        value1 = (dsp_core.registers[DSP_REG_SR] >> DSP_SR_Z) & 1;
1.1.1.4   root     1793:                        return (value1==1);
                   1794:                case 11: /* MI */
1.1.1.6   root     1795:                        value1 = (dsp_core.registers[DSP_REG_SR] >> DSP_SR_N) & 1;
1.1.1.4   root     1796:                        return (value1==1);
                   1797:                case 12: /* NR */
1.1.1.6   root     1798:                        value1 = (dsp_core.registers[DSP_REG_SR] >> DSP_SR_Z) & 1;
                   1799:                        value2 = (~(dsp_core.registers[DSP_REG_SR] >> DSP_SR_U)) & 1;
                   1800:                        value3 = (~(dsp_core.registers[DSP_REG_SR] >> DSP_SR_E)) & 1;
1.1.1.4   root     1801:                        return ((value1 | (value2 & value3)) == 1);
                   1802:                case 13: /* ES */
1.1.1.6   root     1803:                        value1 = (dsp_core.registers[DSP_REG_SR] >> DSP_SR_E) & 1;
1.1.1.4   root     1804:                        return (value1==1);
                   1805:                case 14: /* LS */
1.1.1.6   root     1806:                        value1 = (dsp_core.registers[DSP_REG_SR] >> DSP_SR_L) & 1;
1.1.1.4   root     1807:                        return (value1==1);
                   1808:                case 15: /* LE */
1.1.1.6   root     1809:                        value1 = (dsp_core.registers[DSP_REG_SR] >> DSP_SR_N) & 1;
                   1810:                        value2 = (dsp_core.registers[DSP_REG_SR] >> DSP_SR_V) & 1;
                   1811:                        value3 = (dsp_core.registers[DSP_REG_SR] >> DSP_SR_Z) & 1;
1.1.1.4   root     1812:                        return ((value3 | (value1 ^ value2)) == 1);
                   1813:        }
                   1814:        return 0;
1.1       root     1815: }
                   1816: 
                   1817: /**********************************
                   1818:  *     Highbyte opcodes dispatchers
                   1819:  **********************************/
                   1820: 
                   1821: static void opcode8h_0(void)
                   1822: {
1.1.1.4   root     1823:        switch(cur_inst) {
                   1824:                case 0x000000:
                   1825:                        dsp_nop();
1.1       root     1826:                        break;
1.1.1.4   root     1827:                case 0x000004:
                   1828:                        dsp_rti();
1.1       root     1829:                        break;
1.1.1.4   root     1830:                case 0x000005:
                   1831:                        dsp_illegal();
1.1       root     1832:                        break;
1.1.1.4   root     1833:                case 0x000006:
                   1834:                        dsp_swi();
                   1835:                        break;
                   1836:                case 0x00000c:
                   1837:                        dsp_rts();
                   1838:                        break;
                   1839:                case 0x000084:
                   1840:                        dsp_reset();
                   1841:                        break;
                   1842:                case 0x000086:
                   1843:                        dsp_wait();
                   1844:                        break;
                   1845:                case 0x000087:
                   1846:                        dsp_stop();
                   1847:                        break;
                   1848:                case 0x00008c:
                   1849:                        dsp_enddo();
1.1       root     1850:                        break;
1.1.1.10  root     1851:                default:
                   1852:                        dsp_undefined();
                   1853:                        break;
1.1       root     1854:        }
                   1855: }
                   1856: 
                   1857: /**********************************
                   1858:  *     Non-parallel moves instructions
                   1859:  **********************************/
                   1860: 
                   1861: static void dsp_undefined(void)
                   1862: {
1.1.1.6   root     1863:        if (isDsp_in_disasm_mode == false) {
                   1864:                cur_inst_len = 0;
1.1.1.7   root     1865:                /* Add some artificial CPU cycles to avoid being stuck in an infinite loop */
1.1.1.6   root     1866:                dsp_core.instr_cycle += 100;
1.1.1.13  root     1867: 
                   1868:                /* Rate limit identical messages. Required to make
                   1869:                 * "Terrorize your soul" demo run at usable speed
                   1870:                 */
                   1871:                dsp_error.count++;
                   1872:                if (cur_inst != dsp_error.inst || dsp_core.pc != dsp_error.pc ||
                   1873:                    dsp_error.count >= dsp_error.limit) {
                   1874:                        dsp_error.inst = cur_inst;
                   1875:                        dsp_error.pc = dsp_core.pc;
                   1876:                        fprintf(stderr, "Dsp: 0x%04hx: 0x%06x Illegal instruction (%dx times)\n",
                   1877:                                dsp_error.pc, dsp_error.inst, dsp_error.count);
                   1878:                        if (dsp_error.count >= dsp_error.limit) {
                   1879:                                /* next message after 2x more hits */
                   1880:                                dsp_error.limit *= 2;
                   1881:                        } else {
                   1882:                                dsp_error.limit = 1;
                   1883:                        }
                   1884:                        dsp_error.count = 0;
                   1885:                }
                   1886:        } else {
1.1.1.6   root     1887:                cur_inst_len = 1;
                   1888:                dsp_core.instr_cycle = 0;
                   1889:        }
1.1.1.10  root     1890:        if (ExceptionDebugMask & EXCEPT_DSP) {
1.1.1.9   root     1891:                DebugUI(REASON_DSP_EXCEPTION);
                   1892:        }
1.1       root     1893: }
                   1894: 
                   1895: static void dsp_andi(void)
                   1896: {
1.1.1.2   root     1897:        Uint32 regnum, value;
1.1       root     1898: 
                   1899:        value = (cur_inst >> 8) & BITMASK(8);
                   1900:        regnum = cur_inst & BITMASK(2);
                   1901:        switch(regnum) {
                   1902:                case 0:
                   1903:                        /* mr */
1.1.1.6   root     1904:                        dsp_core.registers[DSP_REG_SR] &= (value<<8)|BITMASK(8);
1.1       root     1905:                        break;
                   1906:                case 1:
                   1907:                        /* ccr */
1.1.1.6   root     1908:                        dsp_core.registers[DSP_REG_SR] &= (BITMASK(8)<<8)|value;
1.1       root     1909:                        break;
                   1910:                case 2:
                   1911:                        /* omr */
1.1.1.6   root     1912:                        dsp_core.registers[DSP_REG_OMR] &= value;
1.1       root     1913:                        break;
                   1914:        }
                   1915: }
                   1916: 
1.1.1.4   root     1917: static void dsp_bchg_aa(void)
1.1       root     1918: {
1.1.1.4   root     1919:        Uint32 memspace, addr, value, newcarry, numbit;
1.1.1.11  root     1920: 
1.1       root     1921:        memspace = (cur_inst>>6) & 1;
                   1922:        value = (cur_inst>>8) & BITMASK(6);
                   1923:        numbit = cur_inst & BITMASK(5);
                   1924: 
1.1.1.4   root     1925:        addr = value;
                   1926:        value = read_memory(memspace, addr);
                   1927:        newcarry = (value>>numbit) & 1;
                   1928:        if (newcarry) {
                   1929:                value -= (1<<numbit);
                   1930:        } else {
                   1931:                value += (1<<numbit);
1.1       root     1932:        }
1.1.1.4   root     1933:        write_memory(memspace, addr, value);
1.1       root     1934: 
                   1935:        /* Set carry */
1.1.1.6   root     1936:        dsp_core.registers[DSP_REG_SR] &= BITMASK(16)-(1<<DSP_SR_C);
                   1937:        dsp_core.registers[DSP_REG_SR] |= newcarry<<DSP_SR_C;
1.1.1.4   root     1938: 
1.1.1.6   root     1939:        dsp_core.instr_cycle += 2;
1.1       root     1940: }
                   1941: 
1.1.1.4   root     1942: static void dsp_bchg_ea(void)
1.1       root     1943: {
1.1.1.4   root     1944:        Uint32 memspace, addr, value, newcarry, numbit;
1.1.1.11  root     1945: 
1.1       root     1946:        memspace = (cur_inst>>6) & 1;
                   1947:        value = (cur_inst>>8) & BITMASK(6);
                   1948:        numbit = cur_inst & BITMASK(5);
                   1949: 
1.1.1.4   root     1950:        dsp_calc_ea(value, &addr);
                   1951:        value = read_memory(memspace, addr);
                   1952:        newcarry = (value>>numbit) & 1;
                   1953:        if (newcarry) {
                   1954:                value -= (1<<numbit);
                   1955:        } else {
                   1956:                value += (1<<numbit);
1.1       root     1957:        }
1.1.1.4   root     1958:        write_memory(memspace, addr, value);
1.1       root     1959: 
                   1960:        /* Set carry */
1.1.1.6   root     1961:        dsp_core.registers[DSP_REG_SR] &= BITMASK(16)-(1<<DSP_SR_C);
                   1962:        dsp_core.registers[DSP_REG_SR] |= newcarry<<DSP_SR_C;
1.1.1.4   root     1963: 
1.1.1.6   root     1964:        dsp_core.instr_cycle += 2;
1.1       root     1965: }
                   1966: 
1.1.1.4   root     1967: static void dsp_bchg_pp(void)
1.1       root     1968: {
1.1.1.4   root     1969:        Uint32 memspace, addr, value, newcarry, numbit;
1.1.1.11  root     1970: 
1.1       root     1971:        memspace = (cur_inst>>6) & 1;
                   1972:        value = (cur_inst>>8) & BITMASK(6);
                   1973:        numbit = cur_inst & BITMASK(5);
                   1974: 
1.1.1.4   root     1975:        addr = 0xffc0 + value;
                   1976:        value = read_memory(memspace, addr);
                   1977:        newcarry = (value>>numbit) & 1;
                   1978:        if (newcarry) {
                   1979:                value -= (1<<numbit);
                   1980:        } else {
                   1981:                value += (1<<numbit);
1.1       root     1982:        }
1.1.1.4   root     1983:        write_memory(memspace, addr, value);
1.1       root     1984: 
                   1985:        /* Set carry */
1.1.1.6   root     1986:        dsp_core.registers[DSP_REG_SR] &= BITMASK(16)-(1<<DSP_SR_C);
                   1987:        dsp_core.registers[DSP_REG_SR] |= newcarry<<DSP_SR_C;
1.1.1.4   root     1988: 
1.1.1.6   root     1989:        dsp_core.instr_cycle += 2;
1.1       root     1990: }
                   1991: 
1.1.1.4   root     1992: static void dsp_bchg_reg(void)
1.1       root     1993: {
1.1.1.4   root     1994:        Uint32 value, numreg, newcarry, numbit;
1.1.1.11  root     1995: 
1.1.1.4   root     1996:        numreg = (cur_inst>>8) & BITMASK(6);
1.1       root     1997:        numbit = cur_inst & BITMASK(5);
                   1998: 
1.1.1.4   root     1999:        if ((numreg==DSP_REG_A) || (numreg==DSP_REG_B)) {
                   2000:                dsp_pm_read_accu24(numreg, &value);
                   2001:        } else {
1.1.1.6   root     2002:                value = dsp_core.registers[numreg];
1.1       root     2003:        }
                   2004: 
1.1.1.4   root     2005:        newcarry = (value>>numbit) & 1;
                   2006:        if (newcarry) {
                   2007:                value -= (1<<numbit);
                   2008:        } else {
                   2009:                value += (1<<numbit);
                   2010:        }
                   2011: 
                   2012:        dsp_write_reg(numreg, value);
                   2013: 
1.1       root     2014:        /* Set carry */
1.1.1.6   root     2015:        dsp_core.registers[DSP_REG_SR] &= BITMASK(16)-(1<<DSP_SR_C);
                   2016:        dsp_core.registers[DSP_REG_SR] |= newcarry<<DSP_SR_C;
1.1.1.4   root     2017: 
1.1.1.6   root     2018:        dsp_core.instr_cycle += 2;
1.1       root     2019: }
                   2020: 
1.1.1.4   root     2021: static void dsp_bclr_aa(void)
1.1       root     2022: {
1.1.1.4   root     2023:        Uint32 memspace, addr, value, newcarry, numbit;
1.1.1.11  root     2024: 
1.1.1.4   root     2025:        memspace = (cur_inst>>6) & 1;
                   2026:        addr = (cur_inst>>8) & BITMASK(6);
                   2027:        numbit = cur_inst & BITMASK(5);
1.1       root     2028: 
1.1.1.4   root     2029:        value = read_memory(memspace, addr);
                   2030:        newcarry = (value>>numbit) & 1;
                   2031:        value &= 0xffffffff-(1<<numbit);
                   2032:        write_memory(memspace, addr, value);
1.1.1.2   root     2033: 
1.1.1.4   root     2034:        /* Set carry */
1.1.1.6   root     2035:        dsp_core.registers[DSP_REG_SR] &= BITMASK(16)-(1<<DSP_SR_C);
                   2036:        dsp_core.registers[DSP_REG_SR] |= newcarry<<DSP_SR_C;
1.1       root     2037: 
1.1.1.6   root     2038:        dsp_core.instr_cycle += 2;
1.1.1.4   root     2039: }
1.1       root     2040: 
1.1.1.4   root     2041: static void dsp_bclr_ea(void)
                   2042: {
                   2043:        Uint32 memspace, addr, value, newcarry, numbit;
1.1.1.11  root     2044: 
1.1.1.4   root     2045:        memspace = (cur_inst>>6) & 1;
                   2046:        value = (cur_inst>>8) & BITMASK(6);
                   2047:        numbit = cur_inst & BITMASK(5);
1.1       root     2048: 
1.1.1.4   root     2049:        dsp_calc_ea(value, &addr);
                   2050:        value = read_memory(memspace, addr);
                   2051:        newcarry = (value>>numbit) & 1;
                   2052:        value &= 0xffffffff-(1<<numbit);
                   2053:        write_memory(memspace, addr, value);
1.1.1.2   root     2054: 
1.1.1.4   root     2055:        /* Set carry */
1.1.1.6   root     2056:        dsp_core.registers[DSP_REG_SR] &= BITMASK(16)-(1<<DSP_SR_C);
                   2057:        dsp_core.registers[DSP_REG_SR] |= newcarry<<DSP_SR_C;
1.1.1.4   root     2058: 
1.1.1.6   root     2059:        dsp_core.instr_cycle += 2;
1.1       root     2060: }
                   2061: 
1.1.1.4   root     2062: static void dsp_bclr_pp(void)
                   2063: {
                   2064:        Uint32 memspace, addr, value, newcarry, numbit;
1.1.1.11  root     2065: 
1.1.1.4   root     2066:        memspace = (cur_inst>>6) & 1;
                   2067:        value = (cur_inst>>8) & BITMASK(6);
                   2068:        numbit = cur_inst & BITMASK(5);
1.1.1.3   root     2069: 
1.1.1.4   root     2070:        addr = 0xffc0 + value;
                   2071:        value = read_memory(memspace, addr);
                   2072:        newcarry = (value>>numbit) & 1;
                   2073:        value &= 0xffffffff-(1<<numbit);
                   2074:        write_memory(memspace, addr, value);
1.1.1.3   root     2075: 
1.1.1.4   root     2076:        /* Set carry */
1.1.1.6   root     2077:        dsp_core.registers[DSP_REG_SR] &= BITMASK(16)-(1<<DSP_SR_C);
                   2078:        dsp_core.registers[DSP_REG_SR] |= newcarry<<DSP_SR_C;
1.1       root     2079: 
1.1.1.6   root     2080:        dsp_core.instr_cycle += 2;
1.1.1.4   root     2081: }
1.1       root     2082: 
1.1.1.4   root     2083: static void dsp_bclr_reg(void)
                   2084: {
                   2085:        Uint32 value, numreg, newcarry, numbit;
1.1.1.11  root     2086: 
1.1.1.4   root     2087:        numreg = (cur_inst>>8) & BITMASK(6);
                   2088:        numbit = cur_inst & BITMASK(5);
1.1       root     2089: 
1.1.1.4   root     2090:        if ((numreg==DSP_REG_A) || (numreg==DSP_REG_B)) {
                   2091:                dsp_pm_read_accu24(numreg, &value);
                   2092:        } else {
1.1.1.6   root     2093:                value = dsp_core.registers[numreg];
1.1.1.4   root     2094:        }
1.1       root     2095: 
1.1.1.4   root     2096:        newcarry = (value>>numbit) & 1;
                   2097:        value &= 0xffffffff-(1<<numbit);
1.1       root     2098: 
1.1.1.4   root     2099:        dsp_write_reg(numreg, value);
                   2100: 
                   2101:        /* Set carry */
1.1.1.6   root     2102:        dsp_core.registers[DSP_REG_SR] &= BITMASK(16)-(1<<DSP_SR_C);
                   2103:        dsp_core.registers[DSP_REG_SR] |= newcarry<<DSP_SR_C;
1.1       root     2104: 
1.1.1.6   root     2105:        dsp_core.instr_cycle += 2;
1.1       root     2106: }
                   2107: 
1.1.1.4   root     2108: static void dsp_bset_aa(void)
1.1       root     2109: {
1.1.1.4   root     2110:        Uint32 memspace, addr, value, newcarry, numbit;
1.1.1.11  root     2111: 
1.1.1.4   root     2112:        memspace = (cur_inst>>6) & 1;
                   2113:        value = (cur_inst>>8) & BITMASK(6);
                   2114:        numbit = cur_inst & BITMASK(5);
1.1       root     2115: 
1.1.1.4   root     2116:        addr = value;
                   2117:        value = read_memory(memspace, addr);
                   2118:        newcarry = (value>>numbit) & 1;
                   2119:        value |= (1<<numbit);
                   2120:        write_memory(memspace, addr, value);
                   2121: 
                   2122:        /* Set carry */
1.1.1.6   root     2123:        dsp_core.registers[DSP_REG_SR] &= BITMASK(16)-(1<<DSP_SR_C);
                   2124:        dsp_core.registers[DSP_REG_SR] |= newcarry<<DSP_SR_C;
1.1.1.4   root     2125: 
1.1.1.6   root     2126:        dsp_core.instr_cycle += 2;
1.1.1.4   root     2127: }
                   2128: 
                   2129: static void dsp_bset_ea(void)
                   2130: {
                   2131:        Uint32 memspace, addr, value, newcarry, numbit;
1.1.1.11  root     2132: 
1.1.1.4   root     2133:        memspace = (cur_inst>>6) & 1;
                   2134:        value = (cur_inst>>8) & BITMASK(6);
                   2135:        numbit = cur_inst & BITMASK(5);
                   2136: 
                   2137:        dsp_calc_ea(value, &addr);
                   2138:        value = read_memory(memspace, addr);
                   2139:        newcarry = (value>>numbit) & 1;
                   2140:        value |= (1<<numbit);
                   2141:        write_memory(memspace, addr, value);
                   2142: 
                   2143:        /* Set carry */
1.1.1.6   root     2144:        dsp_core.registers[DSP_REG_SR] &= BITMASK(16)-(1<<DSP_SR_C);
                   2145:        dsp_core.registers[DSP_REG_SR] |= newcarry<<DSP_SR_C;
1.1.1.4   root     2146: 
1.1.1.6   root     2147:        dsp_core.instr_cycle += 2;
1.1.1.4   root     2148: }
                   2149: 
                   2150: static void dsp_bset_pp(void)
                   2151: {
                   2152:        Uint32 memspace, addr, value, newcarry, numbit;
1.1.1.11  root     2153: 
1.1.1.4   root     2154:        memspace = (cur_inst>>6) & 1;
                   2155:        value = (cur_inst>>8) & BITMASK(6);
                   2156:        numbit = cur_inst & BITMASK(5);
                   2157:        addr = 0xffc0 + value;
                   2158:        value = read_memory(memspace, addr);
                   2159:        newcarry = (value>>numbit) & 1;
                   2160:        value |= (1<<numbit);
                   2161:        write_memory(memspace, addr, value);
                   2162: 
                   2163:        /* Set carry */
1.1.1.6   root     2164:        dsp_core.registers[DSP_REG_SR] &= BITMASK(16)-(1<<DSP_SR_C);
                   2165:        dsp_core.registers[DSP_REG_SR] |= newcarry<<DSP_SR_C;
1.1.1.4   root     2166: 
1.1.1.6   root     2167:        dsp_core.instr_cycle += 2;
1.1.1.4   root     2168: }
                   2169: 
                   2170: static void dsp_bset_reg(void)
                   2171: {
                   2172:        Uint32 value, numreg, newcarry, numbit;
1.1.1.11  root     2173: 
1.1.1.4   root     2174:        numreg = (cur_inst>>8) & BITMASK(6);
                   2175:        numbit = cur_inst & BITMASK(5);
                   2176: 
                   2177:        if ((numreg==DSP_REG_A) || (numreg==DSP_REG_B)) {
                   2178:                dsp_pm_read_accu24(numreg, &value);
                   2179:        } else {
1.1.1.6   root     2180:                value = dsp_core.registers[numreg];
1.1.1.4   root     2181:        }
                   2182: 
                   2183:        newcarry = (value>>numbit) & 1;
                   2184:        value |= (1<<numbit);
                   2185: 
                   2186:        dsp_write_reg(numreg, value);
                   2187: 
                   2188:        /* Set carry */
1.1.1.6   root     2189:        dsp_core.registers[DSP_REG_SR] &= BITMASK(16)-(1<<DSP_SR_C);
                   2190:        dsp_core.registers[DSP_REG_SR] |= newcarry<<DSP_SR_C;
1.1.1.4   root     2191: 
1.1.1.6   root     2192:        dsp_core.instr_cycle += 2;
1.1.1.4   root     2193: }
                   2194: 
                   2195: static void dsp_btst_aa(void)
                   2196: {
                   2197:        Uint32 memspace, addr, value, newcarry, numbit;
1.1.1.11  root     2198: 
1.1.1.4   root     2199:        memspace = (cur_inst>>6) & 1;
                   2200:        value = (cur_inst>>8) & BITMASK(6);
                   2201:        numbit = cur_inst & BITMASK(5);
                   2202: 
                   2203:        addr = value;
                   2204:        value = read_memory(memspace, addr);
                   2205:        newcarry = (value>>numbit) & 1;
                   2206: 
                   2207:        /* Set carry */
1.1.1.6   root     2208:        dsp_core.registers[DSP_REG_SR] &= BITMASK(16)-(1<<DSP_SR_C);
                   2209:        dsp_core.registers[DSP_REG_SR] |= newcarry<<DSP_SR_C;
1.1.1.4   root     2210: 
1.1.1.6   root     2211:        dsp_core.instr_cycle += 2;
1.1.1.4   root     2212: }
                   2213: 
                   2214: static void dsp_btst_ea(void)
                   2215: {
                   2216:        Uint32 memspace, addr, value, newcarry, numbit;
1.1.1.11  root     2217: 
1.1.1.4   root     2218:        memspace = (cur_inst>>6) & 1;
                   2219:        value = (cur_inst>>8) & BITMASK(6);
                   2220:        numbit = cur_inst & BITMASK(5);
                   2221: 
                   2222:        dsp_calc_ea(value, &addr);
                   2223:        value = read_memory(memspace, addr);
                   2224:        newcarry = (value>>numbit) & 1;
                   2225: 
                   2226:        /* Set carry */
1.1.1.6   root     2227:        dsp_core.registers[DSP_REG_SR] &= BITMASK(16)-(1<<DSP_SR_C);
                   2228:        dsp_core.registers[DSP_REG_SR] |= newcarry<<DSP_SR_C;
1.1.1.4   root     2229: 
1.1.1.6   root     2230:        dsp_core.instr_cycle += 2;
1.1.1.4   root     2231: }
                   2232: 
                   2233: static void dsp_btst_pp(void)
                   2234: {
                   2235:        Uint32 memspace, addr, value, newcarry, numbit;
1.1.1.11  root     2236: 
1.1.1.4   root     2237:        memspace = (cur_inst>>6) & 1;
                   2238:        value = (cur_inst>>8) & BITMASK(6);
                   2239:        numbit = cur_inst & BITMASK(5);
                   2240: 
                   2241:        addr = 0xffc0 + value;
                   2242:        value = read_memory(memspace, addr);
                   2243:        newcarry = (value>>numbit) & 1;
                   2244: 
                   2245:        /* Set carry */
1.1.1.6   root     2246:        dsp_core.registers[DSP_REG_SR] &= BITMASK(16)-(1<<DSP_SR_C);
                   2247:        dsp_core.registers[DSP_REG_SR] |= newcarry<<DSP_SR_C;
1.1.1.4   root     2248: 
1.1.1.6   root     2249:        dsp_core.instr_cycle += 2;
1.1.1.4   root     2250: }
                   2251: 
                   2252: static void dsp_btst_reg(void)
                   2253: {
                   2254:        Uint32 value, numreg, newcarry, numbit;
1.1.1.11  root     2255: 
1.1.1.4   root     2256:        numreg = (cur_inst>>8) & BITMASK(6);
                   2257:        numbit = cur_inst & BITMASK(5);
                   2258: 
                   2259:        if ((numreg==DSP_REG_A) || (numreg==DSP_REG_B)) {
                   2260:                dsp_pm_read_accu24(numreg, &value);
                   2261:        } else {
1.1.1.6   root     2262:                value = dsp_core.registers[numreg];
1.1.1.4   root     2263:        }
                   2264: 
                   2265:        newcarry = (value>>numbit) & 1;
                   2266: 
                   2267:        /* Set carry */
1.1.1.6   root     2268:        dsp_core.registers[DSP_REG_SR] &= BITMASK(16)-(1<<DSP_SR_C);
                   2269:        dsp_core.registers[DSP_REG_SR] |= newcarry<<DSP_SR_C;
1.1.1.4   root     2270: 
1.1.1.6   root     2271:        dsp_core.instr_cycle += 2;
1.1.1.4   root     2272: }
                   2273: 
                   2274: static void dsp_div(void)
                   2275: {
                   2276:        Uint32 srcreg, destreg, source[3], dest[3];
                   2277:        Uint16 newsr;
                   2278: 
                   2279:        srcreg = DSP_REG_NULL;
                   2280:        switch((cur_inst>>4) & BITMASK(2)) {
                   2281:                case 0: srcreg = DSP_REG_X0;    break;
                   2282:                case 1: srcreg = DSP_REG_Y0;    break;
                   2283:                case 2: srcreg = DSP_REG_X1;    break;
                   2284:                case 3: srcreg = DSP_REG_Y1;    break;
                   2285:        }
1.1.1.7   root     2286:        source[2] = 0;
                   2287:        source[1] = dsp_core.registers[srcreg];
                   2288:        source[0] = source[1] & (1<<23) ? 0xff : 0x0;
1.1.1.4   root     2289: 
1.1.1.7   root     2290:        destreg = DSP_REG_A + ((cur_inst>>3) & 1);
                   2291:        if (destreg == DSP_REG_A) {
                   2292:                dest[0] = dsp_core.registers[DSP_REG_A2];
                   2293:                dest[1] = dsp_core.registers[DSP_REG_A1];
                   2294:                dest[2] = dsp_core.registers[DSP_REG_A0];
                   2295:        }
                   2296:        else {
                   2297:                dest[0] = dsp_core.registers[DSP_REG_B2];
                   2298:                dest[1] = dsp_core.registers[DSP_REG_B1];
                   2299:                dest[2] = dsp_core.registers[DSP_REG_B0];
                   2300:        }
1.1.1.4   root     2301: 
                   2302:        if (((dest[0]>>7) & 1) ^ ((source[1]>>23) & 1)) {
                   2303:                /* D += S */
                   2304:                newsr = dsp_asl56(dest);
                   2305:                dsp_add56(source, dest);
                   2306:        } else {
                   2307:                /* D -= S */
                   2308:                newsr = dsp_asl56(dest);
                   2309:                dsp_sub56(source, dest);
                   2310:        }
                   2311: 
1.1.1.6   root     2312:        dest[2] |= (dsp_core.registers[DSP_REG_SR]>>DSP_SR_C) & 1;
1.1.1.4   root     2313: 
1.1.1.7   root     2314:        if (destreg == DSP_REG_A) {
                   2315:                dsp_core.registers[DSP_REG_A2] = dest[0];
                   2316:                dsp_core.registers[DSP_REG_A1] = dest[1];
                   2317:                dsp_core.registers[DSP_REG_A0] = dest[2];
                   2318:        }
                   2319:        else {
                   2320:                dsp_core.registers[DSP_REG_B2] = dest[0];
                   2321:                dsp_core.registers[DSP_REG_B1] = dest[1];
                   2322:                dsp_core.registers[DSP_REG_B0] = dest[2];
                   2323:        }
1.1.1.11  root     2324: 
1.1.1.6   root     2325:        dsp_core.registers[DSP_REG_SR] &= BITMASK(16)-((1<<DSP_SR_C)|(1<<DSP_SR_V));
                   2326:        dsp_core.registers[DSP_REG_SR] |= (1-((dest[0]>>7) & 1))<<DSP_SR_C;
                   2327:        dsp_core.registers[DSP_REG_SR] |= newsr & (1<<DSP_SR_L);
                   2328:        dsp_core.registers[DSP_REG_SR] |= newsr & (1<<DSP_SR_V);
1.1.1.4   root     2329: }
                   2330: 
                   2331: /*
                   2332:        DO instruction parameter encoding
                   2333: 
                   2334:        xxxxxxxx 00xxxxxx 0xxxxxxx      aa
                   2335:        xxxxxxxx 01xxxxxx 0xxxxxxx      ea
                   2336:        xxxxxxxx YYxxxxxx 1xxxxxxx      imm
                   2337:        xxxxxxxx 11xxxxxx 0xxxxxxx      reg
                   2338: */
                   2339: 
                   2340: static void dsp_do_aa(void)
                   2341: {
                   2342:        Uint32 memspace, addr;
                   2343: 
                   2344:        /* x:aa */
                   2345:        /* y:aa */
                   2346: 
1.1.1.6   root     2347:        dsp_stack_push(dsp_core.registers[DSP_REG_LA], dsp_core.registers[DSP_REG_LC], 0);
                   2348:        dsp_core.registers[DSP_REG_LA] = read_memory_p(dsp_core.pc+1) & BITMASK(16);
1.1.1.4   root     2349:        cur_inst_len++;
1.1.1.6   root     2350:        dsp_stack_push(dsp_core.pc+cur_inst_len, dsp_core.registers[DSP_REG_SR], 0);
                   2351:        dsp_core.registers[DSP_REG_SR] |= (1<<DSP_SR_LF);
1.1       root     2352: 
                   2353:        memspace = (cur_inst>>6) & 1;
                   2354:        addr = (cur_inst>>8) & BITMASK(6);
1.1.1.6   root     2355:        dsp_core.registers[DSP_REG_LC] = read_memory(memspace, addr) & BITMASK(16);
1.1.1.4   root     2356: 
1.1.1.6   root     2357:        dsp_core.instr_cycle += 4;
1.1       root     2358: }
                   2359: 
1.1.1.3   root     2360: static void dsp_do_imm(void)
1.1       root     2361: {
                   2362:        /* #xx */
1.1.1.3   root     2363: 
1.1.1.6   root     2364:        dsp_stack_push(dsp_core.registers[DSP_REG_LA], dsp_core.registers[DSP_REG_LC], 0);
                   2365:        dsp_core.registers[DSP_REG_LA] = read_memory_p(dsp_core.pc+1) & BITMASK(16);
1.1.1.4   root     2366:        cur_inst_len++;
1.1.1.6   root     2367:        dsp_stack_push(dsp_core.pc+cur_inst_len, dsp_core.registers[DSP_REG_SR], 0);
                   2368:        dsp_core.registers[DSP_REG_SR] |= (1<<DSP_SR_LF);
1.1.1.4   root     2369: 
1.1.1.6   root     2370:        dsp_core.registers[DSP_REG_LC] = ((cur_inst>>8) & BITMASK(8))
1.1.1.3   root     2371:                + ((cur_inst & BITMASK(4))<<8);
1.1.1.4   root     2372: 
1.1.1.6   root     2373:        dsp_core.instr_cycle += 4;
1.1       root     2374: }
                   2375: 
1.1.1.3   root     2376: static void dsp_do_ea(void)
1.1       root     2377: {
1.1.1.2   root     2378:        Uint32 memspace, ea_mode, addr;
1.1       root     2379: 
                   2380:        /* x:ea */
                   2381:        /* y:ea */
                   2382: 
1.1.1.6   root     2383:        dsp_stack_push(dsp_core.registers[DSP_REG_LA], dsp_core.registers[DSP_REG_LC], 0);
                   2384:        dsp_core.registers[DSP_REG_LA] = read_memory_p(dsp_core.pc+1) & BITMASK(16);
1.1.1.4   root     2385:        cur_inst_len++;
1.1.1.6   root     2386:        dsp_stack_push(dsp_core.pc+cur_inst_len, dsp_core.registers[DSP_REG_SR], 0);
                   2387:        dsp_core.registers[DSP_REG_SR] |= (1<<DSP_SR_LF);
1.1.1.4   root     2388: 
1.1       root     2389:        memspace = (cur_inst>>6) & 1;
                   2390:        ea_mode = (cur_inst>>8) & BITMASK(6);
                   2391:        dsp_calc_ea(ea_mode, &addr);
1.1.1.6   root     2392:        dsp_core.registers[DSP_REG_LC] = read_memory(memspace, addr) & BITMASK(16);
1.1.1.4   root     2393: 
1.1.1.6   root     2394:        dsp_core.instr_cycle += 4;
1.1       root     2395: }
                   2396: 
1.1.1.3   root     2397: static void dsp_do_reg(void)
1.1       root     2398: {
1.1.1.2   root     2399:        Uint32 numreg;
1.1       root     2400: 
                   2401:        /* S */
                   2402: 
1.1.1.6   root     2403:        dsp_stack_push(dsp_core.registers[DSP_REG_LA], dsp_core.registers[DSP_REG_LC], 0);
                   2404:        dsp_core.registers[DSP_REG_LA] = read_memory_p(dsp_core.pc+1) & BITMASK(16);
1.1.1.4   root     2405:        cur_inst_len++;
                   2406: 
1.1       root     2407:        numreg = (cur_inst>>8) & BITMASK(6);
                   2408:        if ((numreg == DSP_REG_A) || (numreg == DSP_REG_B)) {
1.1.1.11  root     2409:                dsp_pm_read_accu24(numreg, &dsp_core.registers[DSP_REG_LC]);
1.1       root     2410:        } else {
1.1.1.6   root     2411:                dsp_core.registers[DSP_REG_LC] = dsp_core.registers[numreg];
1.1       root     2412:        }
1.1.1.6   root     2413:        dsp_core.registers[DSP_REG_LC] &= BITMASK(16);
1.1.1.4   root     2414: 
1.1.1.6   root     2415:        dsp_stack_push(dsp_core.pc+cur_inst_len, dsp_core.registers[DSP_REG_SR], 0);
                   2416:        dsp_core.registers[DSP_REG_SR] |= (1<<DSP_SR_LF);
1.1.1.4   root     2417: 
1.1.1.6   root     2418:        dsp_core.instr_cycle += 4;
1.1       root     2419: }
                   2420: 
                   2421: static void dsp_enddo(void)
                   2422: {
1.1.1.4   root     2423:        Uint32 saved_pc, saved_sr;
1.1       root     2424: 
1.1.1.4   root     2425:        dsp_stack_pop(&saved_pc, &saved_sr);
1.1.1.6   root     2426:        dsp_core.registers[DSP_REG_SR] &= 0x7f;
                   2427:        dsp_core.registers[DSP_REG_SR] |= saved_sr & (1<<DSP_SR_LF);
                   2428:        dsp_stack_pop(&dsp_core.registers[DSP_REG_LA], &dsp_core.registers[DSP_REG_LC]);
1.1       root     2429: }
                   2430: 
                   2431: static void dsp_illegal(void)
                   2432: {
                   2433:        /* Raise interrupt p:0x003e */
1.1.1.5   root     2434:        dsp_add_interrupt(DSP_INTER_ILLEGAL);
1.1.1.10  root     2435:        if (ExceptionDebugMask & EXCEPT_DSP) {
1.1.1.9   root     2436:                DebugUI(REASON_DSP_EXCEPTION);
                   2437:        }
1.1       root     2438: }
                   2439: 
1.1.1.4   root     2440: static void dsp_jcc_imm(void)
1.1       root     2441: {
1.1.1.4   root     2442:        Uint32 cc_code, newpc;
1.1       root     2443: 
1.1.1.4   root     2444:        newpc = cur_inst & BITMASK(12);
                   2445:        cc_code=(cur_inst>>12) & BITMASK(4);
                   2446:        if (dsp_calc_cc(cc_code)) {
1.1.1.6   root     2447:                dsp_core.pc = newpc;
1.1.1.4   root     2448:                cur_inst_len = 0;
                   2449:        }
                   2450: 
1.1.1.6   root     2451:        dsp_core.instr_cycle += 2;
1.1.1.4   root     2452: }
                   2453: 
                   2454: static void dsp_jcc_ea(void)
                   2455: {
                   2456:        Uint32 newpc, cc_code;
                   2457: 
                   2458:        dsp_calc_ea((cur_inst >>8) & BITMASK(6), &newpc);
                   2459:        cc_code=cur_inst & BITMASK(4);
1.1       root     2460: 
                   2461:        if (dsp_calc_cc(cc_code)) {
1.1.1.6   root     2462:                dsp_core.pc = newpc;
1.1       root     2463:                cur_inst_len = 0;
                   2464:        }
1.1.1.4   root     2465: 
1.1.1.6   root     2466:        dsp_core.instr_cycle += 2;
1.1       root     2467: }
                   2468: 
1.1.1.4   root     2469: static void dsp_jclr_aa(void)
1.1       root     2470: {
1.1.1.4   root     2471:        Uint32 memspace, addr, value, numbit, newaddr;
1.1.1.11  root     2472: 
1.1       root     2473:        memspace = (cur_inst>>6) & 1;
1.1.1.4   root     2474:        addr = (cur_inst>>8) & BITMASK(6);
1.1       root     2475:        numbit = cur_inst & BITMASK(5);
1.1.1.4   root     2476:        value = read_memory(memspace, addr);
1.1.1.6   root     2477:        newaddr = read_memory_p(dsp_core.pc+1);
1.1       root     2478: 
1.1.1.6   root     2479:        dsp_core.instr_cycle += 4;
1.1       root     2480: 
1.1.1.4   root     2481:        if ((value & (1<<numbit))==0) {
1.1.1.6   root     2482:                dsp_core.pc = newaddr;
1.1.1.4   root     2483:                cur_inst_len = 0;
                   2484:                return;
1.1.1.11  root     2485:        }
1.1.1.2   root     2486:        ++cur_inst_len;
1.1.1.4   root     2487: }
                   2488: 
                   2489: static void dsp_jclr_ea(void)
                   2490: {
                   2491:        Uint32 memspace, addr, value, numbit, newaddr;
1.1.1.11  root     2492: 
1.1.1.4   root     2493:        memspace = (cur_inst>>6) & 1;
                   2494:        value = (cur_inst>>8) & BITMASK(6);
                   2495:        numbit = cur_inst & BITMASK(5);
1.1.1.6   root     2496:        newaddr = read_memory_p(dsp_core.pc+1);
1.1.1.11  root     2497: 
1.1.1.4   root     2498:        dsp_calc_ea(value, &addr);
                   2499:        value = read_memory(memspace, addr);
                   2500: 
1.1.1.6   root     2501:        dsp_core.instr_cycle += 4;
1.1       root     2502: 
                   2503:        if ((value & (1<<numbit))==0) {
1.1.1.6   root     2504:                dsp_core.pc = newaddr;
1.1.1.4   root     2505:                cur_inst_len = 0;
                   2506:                return;
1.1.1.11  root     2507:        }
1.1.1.4   root     2508:        ++cur_inst_len;
                   2509: }
1.1       root     2510: 
1.1.1.4   root     2511: static void dsp_jclr_pp(void)
                   2512: {
                   2513:        Uint32 memspace, addr, value, numbit, newaddr;
1.1.1.11  root     2514: 
1.1.1.4   root     2515:        memspace = (cur_inst>>6) & 1;
                   2516:        value = (cur_inst>>8) & BITMASK(6);
                   2517:        numbit = cur_inst & BITMASK(5);
                   2518:        addr = 0xffc0 + value;
                   2519:        value = read_memory(memspace, addr);
1.1.1.6   root     2520:        newaddr = read_memory_p(dsp_core.pc+1);
1.1.1.4   root     2521: 
1.1.1.6   root     2522:        dsp_core.instr_cycle += 4;
1.1       root     2523: 
1.1.1.4   root     2524:        if ((value & (1<<numbit))==0) {
1.1.1.6   root     2525:                dsp_core.pc = newaddr;
1.1.1.4   root     2526:                cur_inst_len = 0;
                   2527:                return;
1.1.1.11  root     2528:        }
1.1.1.4   root     2529:        ++cur_inst_len;
                   2530: }
1.1.1.2   root     2531: 
1.1.1.4   root     2532: static void dsp_jclr_reg(void)
                   2533: {
                   2534:        Uint32 value, numreg, numbit, newaddr;
1.1.1.11  root     2535: 
1.1.1.4   root     2536:        numreg = (cur_inst>>8) & BITMASK(6);
                   2537:        numbit = cur_inst & BITMASK(5);
1.1.1.6   root     2538:        newaddr = read_memory_p(dsp_core.pc+1);
1.1       root     2539: 
1.1.1.4   root     2540:        if ((numreg==DSP_REG_A) || (numreg==DSP_REG_B)) {
                   2541:                dsp_pm_read_accu24(numreg, &value);
                   2542:        } else {
1.1.1.6   root     2543:                value = dsp_core.registers[numreg];
1.1.1.4   root     2544:        }
1.1       root     2545: 
1.1.1.6   root     2546:        dsp_core.instr_cycle += 4;
1.1.1.4   root     2547: 
                   2548:        if ((value & (1<<numbit))==0) {
1.1.1.6   root     2549:                dsp_core.pc = newaddr;
1.1       root     2550:                cur_inst_len = 0;
                   2551:                return;
1.1.1.11  root     2552:        }
1.1.1.4   root     2553:        ++cur_inst_len;
1.1       root     2554: }
                   2555: 
1.1.1.4   root     2556: static void dsp_jmp_ea(void)
1.1       root     2557: {
1.1.1.2   root     2558:        Uint32 newpc;
1.1       root     2559: 
1.1.1.4   root     2560:        dsp_calc_ea((cur_inst>>8) & BITMASK(6), &newpc);
1.1       root     2561:        cur_inst_len = 0;
1.1.1.6   root     2562:        dsp_core.pc = newpc;
1.1       root     2563: 
1.1.1.6   root     2564:        dsp_core.instr_cycle += 2;
1.1.1.4   root     2565: }
                   2566: 
                   2567: static void dsp_jmp_imm(void)
                   2568: {
                   2569:        Uint32 newpc;
1.1       root     2570: 
1.1.1.4   root     2571:        newpc = cur_inst & BITMASK(12);
                   2572:        cur_inst_len = 0;
1.1.1.6   root     2573:        dsp_core.pc = newpc;
1.1.1.4   root     2574: 
1.1.1.6   root     2575:        dsp_core.instr_cycle += 2;
1.1       root     2576: }
                   2577: 
1.1.1.4   root     2578: static void dsp_jscc_ea(void)
1.1       root     2579: {
1.1.1.2   root     2580:        Uint32 newpc, cc_code;
1.1       root     2581: 
1.1.1.4   root     2582:        dsp_calc_ea((cur_inst >>8) & BITMASK(6), &newpc);
                   2583:        cc_code=cur_inst & BITMASK(4);
                   2584: 
                   2585:        if (dsp_calc_cc(cc_code)) {
1.1.1.6   root     2586:                dsp_stack_push(dsp_core.pc+cur_inst_len, dsp_core.registers[DSP_REG_SR], 0);
                   2587:                dsp_core.pc = newpc;
1.1.1.4   root     2588:                cur_inst_len = 0;
1.1.1.11  root     2589:        }
1.1.1.4   root     2590: 
1.1.1.6   root     2591:        dsp_core.instr_cycle += 2;
1.1.1.4   root     2592: }
1.1       root     2593: 
1.1.1.4   root     2594: static void dsp_jscc_imm(void)
                   2595: {
                   2596:        Uint32 cc_code, newpc;
                   2597: 
                   2598:        newpc = cur_inst & BITMASK(12);
                   2599:        cc_code=(cur_inst>>12) & BITMASK(4);
1.1       root     2600:        if (dsp_calc_cc(cc_code)) {
1.1.1.6   root     2601:                dsp_stack_push(dsp_core.pc+cur_inst_len, dsp_core.registers[DSP_REG_SR], 0);
                   2602:                dsp_core.pc = newpc;
1.1.1.4   root     2603:                cur_inst_len = 0;
1.1.1.11  root     2604:        }
1.1.1.4   root     2605: 
1.1.1.6   root     2606:        dsp_core.instr_cycle += 2;
1.1.1.4   root     2607: }
1.1       root     2608: 
1.1.1.4   root     2609: static void dsp_jsclr_aa(void)
                   2610: {
                   2611:        Uint32 memspace, addr, value, newpc, numbit, newaddr;
1.1.1.11  root     2612: 
1.1.1.4   root     2613:        memspace = (cur_inst>>6) & 1;
                   2614:        addr = (cur_inst>>8) & BITMASK(6);
                   2615:        numbit = cur_inst & BITMASK(5);
                   2616:        value = read_memory(memspace, addr);
1.1.1.6   root     2617:        newaddr = read_memory_p(dsp_core.pc+1);
1.1.1.11  root     2618: 
1.1.1.6   root     2619:        dsp_core.instr_cycle += 4;
1.1.1.11  root     2620: 
1.1.1.4   root     2621:        if ((value & (1<<numbit))==0) {
1.1.1.6   root     2622:                dsp_stack_push(dsp_core.pc+2, dsp_core.registers[DSP_REG_SR], 0);
1.1.1.4   root     2623:                newpc = newaddr;
1.1.1.6   root     2624:                dsp_core.pc = newpc;
1.1       root     2625:                cur_inst_len = 0;
1.1.1.4   root     2626:                return;
1.1.1.11  root     2627:        }
1.1.1.4   root     2628:        ++cur_inst_len;
1.1       root     2629: }
                   2630: 
1.1.1.4   root     2631: static void dsp_jsclr_ea(void)
1.1       root     2632: {
1.1.1.4   root     2633:        Uint32 memspace, addr, value, newpc, numbit, newaddr;
1.1.1.11  root     2634: 
1.1       root     2635:        memspace = (cur_inst>>6) & 1;
                   2636:        value = (cur_inst>>8) & BITMASK(6);
                   2637:        numbit = cur_inst & BITMASK(5);
1.1.1.4   root     2638:        dsp_calc_ea(value, &addr);
                   2639:        value = read_memory(memspace, addr);
1.1.1.6   root     2640:        newaddr = read_memory_p(dsp_core.pc+1);
1.1.1.4   root     2641: 
1.1.1.6   root     2642:        dsp_core.instr_cycle += 4;
1.1.1.11  root     2643: 
1.1.1.4   root     2644:        if ((value & (1<<numbit))==0) {
1.1.1.6   root     2645:                dsp_stack_push(dsp_core.pc+2, dsp_core.registers[DSP_REG_SR], 0);
1.1.1.4   root     2646:                newpc = newaddr;
1.1.1.6   root     2647:                dsp_core.pc = newpc;
1.1.1.4   root     2648:                cur_inst_len = 0;
                   2649:                return;
1.1.1.11  root     2650:        }
1.1.1.2   root     2651:        ++cur_inst_len;
1.1.1.4   root     2652: }
                   2653: 
                   2654: static void dsp_jsclr_pp(void)
                   2655: {
                   2656:        Uint32 memspace, addr, value, newpc, numbit, newaddr;
1.1.1.11  root     2657: 
1.1.1.4   root     2658:        memspace = (cur_inst>>6) & 1;
                   2659:        value = (cur_inst>>8) & BITMASK(6);
                   2660:        numbit = cur_inst & BITMASK(5);
                   2661:        addr = 0xffc0 + value;
                   2662:        value = read_memory(memspace, addr);
1.1.1.6   root     2663:        newaddr = read_memory_p(dsp_core.pc+1);
1.1.1.4   root     2664: 
1.1.1.6   root     2665:        dsp_core.instr_cycle += 4;
1.1.1.11  root     2666: 
1.1       root     2667:        if ((value & (1<<numbit))==0) {
1.1.1.6   root     2668:                dsp_stack_push(dsp_core.pc+2, dsp_core.registers[DSP_REG_SR], 0);
1.1.1.4   root     2669:                newpc = newaddr;
1.1.1.6   root     2670:                dsp_core.pc = newpc;
1.1.1.4   root     2671:                cur_inst_len = 0;
                   2672:                return;
1.1.1.11  root     2673:        }
1.1.1.4   root     2674:        ++cur_inst_len;
                   2675: }
                   2676: 
                   2677: static void dsp_jsclr_reg(void)
                   2678: {
                   2679:        Uint32 value, numreg, newpc, numbit, newaddr;
1.1.1.11  root     2680: 
1.1.1.4   root     2681:        numreg = (cur_inst>>8) & BITMASK(6);
                   2682:        numbit = cur_inst & BITMASK(5);
1.1.1.6   root     2683:        newaddr = read_memory_p(dsp_core.pc+1);
1.1       root     2684: 
1.1.1.4   root     2685:        if ((numreg==DSP_REG_A) || (numreg==DSP_REG_B)) {
                   2686:                dsp_pm_read_accu24(numreg, &value);
                   2687:        } else {
1.1.1.6   root     2688:                value = dsp_core.registers[numreg];
1.1.1.4   root     2689:        }
                   2690: 
1.1.1.6   root     2691:        dsp_core.instr_cycle += 4;
1.1.1.11  root     2692: 
1.1.1.4   root     2693:        if ((value & (1<<numbit))==0) {
1.1.1.6   root     2694:                dsp_stack_push(dsp_core.pc+2, dsp_core.registers[DSP_REG_SR], 0);
1.1.1.4   root     2695:                newpc = newaddr;
1.1.1.6   root     2696:                dsp_core.pc = newpc;
1.1       root     2697:                cur_inst_len = 0;
1.1.1.4   root     2698:                return;
1.1.1.11  root     2699:        }
1.1.1.4   root     2700:        ++cur_inst_len;
1.1       root     2701: }
                   2702: 
1.1.1.4   root     2703: static void dsp_jset_aa(void)
1.1       root     2704: {
1.1.1.4   root     2705:        Uint32 memspace, addr, value, numbit, newpc, newaddr;
1.1.1.11  root     2706: 
1.1.1.4   root     2707:        memspace = (cur_inst>>6) & 1;
                   2708:        addr = (cur_inst>>8) & BITMASK(6);
                   2709:        numbit = cur_inst & BITMASK(5);
                   2710:        value = read_memory(memspace, addr);
1.1.1.6   root     2711:        newaddr = read_memory_p(dsp_core.pc+1);
1.1.1.4   root     2712: 
1.1.1.6   root     2713:        dsp_core.instr_cycle += 4;
1.1.1.11  root     2714: 
1.1.1.4   root     2715:        if (value & (1<<numbit)) {
                   2716:                newpc = newaddr;
1.1.1.6   root     2717:                dsp_core.pc = newpc;
1.1.1.4   root     2718:                cur_inst_len=0;
                   2719:                return;
1.1.1.11  root     2720:        }
1.1.1.4   root     2721:        ++cur_inst_len;
                   2722: }
                   2723: 
                   2724: static void dsp_jset_ea(void)
                   2725: {
                   2726:        Uint32 memspace, addr, value, numbit, newpc, newaddr;
1.1.1.11  root     2727: 
1.1       root     2728:        memspace = (cur_inst>>6) & 1;
                   2729:        value = (cur_inst>>8) & BITMASK(6);
                   2730:        numbit = cur_inst & BITMASK(5);
1.1.1.4   root     2731:        dsp_calc_ea(value, &addr);
                   2732:        value = read_memory(memspace, addr);
1.1.1.6   root     2733:        newaddr = read_memory_p(dsp_core.pc+1);
1.1.1.4   root     2734: 
1.1.1.6   root     2735:        dsp_core.instr_cycle += 4;
1.1.1.7   root     2736: 
1.1.1.4   root     2737:        if (value & (1<<numbit)) {
                   2738:                newpc = newaddr;
1.1.1.6   root     2739:                dsp_core.pc = newpc;
1.1.1.4   root     2740:                cur_inst_len=0;
                   2741:                return;
1.1.1.11  root     2742:        }
1.1.1.4   root     2743:        ++cur_inst_len;
                   2744: }
1.1       root     2745: 
1.1.1.4   root     2746: static void dsp_jset_pp(void)
                   2747: {
                   2748:        Uint32 memspace, addr, value, numbit, newpc, newaddr;
1.1.1.11  root     2749: 
1.1.1.4   root     2750:        memspace = (cur_inst>>6) & 1;
                   2751:        value = (cur_inst>>8) & BITMASK(6);
                   2752:        numbit = cur_inst & BITMASK(5);
                   2753:        addr = 0xffc0 + value;
                   2754:        value = read_memory(memspace, addr);
1.1.1.6   root     2755:        newaddr = read_memory_p(dsp_core.pc+1);
1.1.1.4   root     2756: 
1.1.1.6   root     2757:        dsp_core.instr_cycle += 4;
1.1.1.11  root     2758: 
1.1.1.4   root     2759:        if (value & (1<<numbit)) {
                   2760:                newpc = newaddr;
1.1.1.6   root     2761:                dsp_core.pc = newpc;
1.1.1.4   root     2762:                cur_inst_len=0;
                   2763:                return;
1.1.1.11  root     2764:        }
1.1.1.4   root     2765:        ++cur_inst_len;
                   2766: }
                   2767: 
                   2768: static void dsp_jset_reg(void)
                   2769: {
                   2770:        Uint32 value, numreg, numbit, newpc, newaddr;
1.1.1.11  root     2771: 
1.1.1.4   root     2772:        numreg = (cur_inst>>8) & BITMASK(6);
                   2773:        numbit = cur_inst & BITMASK(5);
1.1.1.6   root     2774:        newaddr = read_memory_p(dsp_core.pc+1);
1.1.1.11  root     2775: 
1.1.1.4   root     2776:        if ((numreg==DSP_REG_A) || (numreg==DSP_REG_B)) {
                   2777:                dsp_pm_read_accu24(numreg, &value);
                   2778:        } else {
1.1.1.6   root     2779:                value = dsp_core.registers[numreg];
1.1.1.4   root     2780:        }
                   2781: 
1.1.1.6   root     2782:        dsp_core.instr_cycle += 4;
1.1.1.11  root     2783: 
1.1.1.4   root     2784:        if (value & (1<<numbit)) {
                   2785:                newpc = newaddr;
1.1.1.6   root     2786:                dsp_core.pc = newpc;
1.1.1.4   root     2787:                cur_inst_len=0;
                   2788:                return;
1.1.1.11  root     2789:        }
1.1.1.4   root     2790:        ++cur_inst_len;
                   2791: }
                   2792: 
                   2793: static void dsp_jsr_imm(void)
                   2794: {
                   2795:        Uint32 newpc;
                   2796: 
                   2797:        newpc = cur_inst & BITMASK(12);
                   2798: 
1.1.1.6   root     2799:        if (dsp_core.interrupt_state != DSP_INTERRUPT_LONG){
                   2800:                dsp_stack_push(dsp_core.pc+cur_inst_len, dsp_core.registers[DSP_REG_SR], 0);
1.1.1.4   root     2801:        }
                   2802:        else {
1.1.1.6   root     2803:                dsp_core.interrupt_state = DSP_INTERRUPT_DISABLED;
1.1.1.4   root     2804:        }
                   2805: 
1.1.1.6   root     2806:        dsp_core.pc = newpc;
1.1.1.4   root     2807:        cur_inst_len = 0;
                   2808: 
1.1.1.6   root     2809:        dsp_core.instr_cycle += 2;
1.1.1.4   root     2810: }
                   2811: 
                   2812: static void dsp_jsr_ea(void)
                   2813: {
                   2814:        Uint32 newpc;
                   2815: 
                   2816:        dsp_calc_ea((cur_inst>>8) & BITMASK(6),&newpc);
                   2817: 
1.1.1.6   root     2818:        if (dsp_core.interrupt_state != DSP_INTERRUPT_LONG){
                   2819:                dsp_stack_push(dsp_core.pc+cur_inst_len, dsp_core.registers[DSP_REG_SR], 0);
1.1.1.4   root     2820:        }
                   2821:        else {
1.1.1.6   root     2822:                dsp_core.interrupt_state = DSP_INTERRUPT_DISABLED;
1.1.1.4   root     2823:        }
                   2824: 
1.1.1.6   root     2825:        dsp_core.pc = newpc;
1.1.1.4   root     2826:        cur_inst_len = 0;
                   2827: 
1.1.1.6   root     2828:        dsp_core.instr_cycle += 2;
1.1.1.4   root     2829: }
                   2830: 
                   2831: static void dsp_jsset_aa(void)
                   2832: {
                   2833:        Uint32 memspace, addr, value, newpc, numbit, newaddr;
1.1.1.11  root     2834: 
1.1.1.4   root     2835:        memspace = (cur_inst>>6) & 1;
                   2836:        addr = (cur_inst>>8) & BITMASK(6);
                   2837:        numbit = cur_inst & BITMASK(5);
                   2838:        value = read_memory(memspace, addr);
1.1.1.6   root     2839:        newaddr = read_memory_p(dsp_core.pc+1);
1.1.1.11  root     2840: 
1.1.1.6   root     2841:        dsp_core.instr_cycle += 4;
1.1.1.4   root     2842: 
                   2843:        if (value & (1<<numbit)) {
1.1.1.6   root     2844:                dsp_stack_push(dsp_core.pc+2, dsp_core.registers[DSP_REG_SR], 0);
1.1.1.4   root     2845:                newpc = newaddr;
1.1.1.6   root     2846:                dsp_core.pc = newpc;
1.1.1.4   root     2847:                cur_inst_len = 0;
                   2848:                return;
1.1.1.11  root     2849:        }
1.1.1.4   root     2850:        ++cur_inst_len;
                   2851: }
                   2852: 
                   2853: static void dsp_jsset_ea(void)
                   2854: {
                   2855:        Uint32 memspace, addr, value, newpc, numbit, newaddr;
1.1.1.11  root     2856: 
1.1.1.4   root     2857:        memspace = (cur_inst>>6) & 1;
                   2858:        value = (cur_inst>>8) & BITMASK(6);
                   2859:        numbit = cur_inst & BITMASK(5);
                   2860:        dsp_calc_ea(value, &addr);
                   2861:        value = read_memory(memspace, addr);
1.1.1.6   root     2862:        newaddr = read_memory_p(dsp_core.pc+1);
1.1.1.11  root     2863: 
1.1.1.6   root     2864:        dsp_core.instr_cycle += 4;
1.1       root     2865: 
                   2866:        if (value & (1<<numbit)) {
1.1.1.6   root     2867:                dsp_stack_push(dsp_core.pc+2, dsp_core.registers[DSP_REG_SR], 0);
1.1.1.4   root     2868:                newpc = newaddr;
1.1.1.6   root     2869:                dsp_core.pc = newpc;
1.1.1.4   root     2870:                cur_inst_len = 0;
                   2871:                return;
1.1.1.11  root     2872:        }
1.1.1.4   root     2873:        ++cur_inst_len;
1.1       root     2874: }
                   2875: 
1.1.1.4   root     2876: static void dsp_jsset_pp(void)
1.1       root     2877: {
1.1.1.4   root     2878:        Uint32 memspace, addr, value, newpc, numbit, newaddr;
1.1.1.11  root     2879: 
1.1.1.4   root     2880:        memspace = (cur_inst>>6) & 1;
                   2881:        value = (cur_inst>>8) & BITMASK(6);
                   2882:        numbit = cur_inst & BITMASK(5);
                   2883:        addr = 0xffc0 + value;
                   2884:        value = read_memory(memspace, addr);
1.1.1.6   root     2885:        newaddr = read_memory_p(dsp_core.pc+1);
1.1.1.4   root     2886: 
1.1.1.6   root     2887:        dsp_core.instr_cycle += 4;
1.1       root     2888: 
1.1.1.4   root     2889:        if (value & (1<<numbit)) {
1.1.1.6   root     2890:                dsp_stack_push(dsp_core.pc+2, dsp_core.registers[DSP_REG_SR], 0);
1.1.1.4   root     2891:                newpc = newaddr;
1.1.1.6   root     2892:                dsp_core.pc = newpc;
1.1.1.4   root     2893:                cur_inst_len = 0;
                   2894:                return;
1.1.1.11  root     2895:        }
1.1.1.4   root     2896:        ++cur_inst_len;
1.1       root     2897: }
                   2898: 
1.1.1.4   root     2899: static void dsp_jsset_reg(void)
1.1       root     2900: {
1.1.1.4   root     2901:        Uint32 value, numreg, newpc, numbit, newaddr;
1.1.1.11  root     2902: 
1.1.1.4   root     2903:        numreg = (cur_inst>>8) & BITMASK(6);
1.1       root     2904:        numbit = cur_inst & BITMASK(5);
1.1.1.6   root     2905:        newaddr = read_memory_p(dsp_core.pc+1);
1.1.1.11  root     2906: 
1.1.1.4   root     2907:        if ((numreg==DSP_REG_A) || (numreg==DSP_REG_B)) {
                   2908:                dsp_pm_read_accu24(numreg, &value);
                   2909:        } else {
1.1.1.6   root     2910:                value = dsp_core.registers[numreg];
1.1.1.4   root     2911:        }
1.1       root     2912: 
1.1.1.6   root     2913:        dsp_core.instr_cycle += 4;
1.1       root     2914: 
                   2915:        if (value & (1<<numbit)) {
1.1.1.6   root     2916:                dsp_stack_push(dsp_core.pc+2, dsp_core.registers[DSP_REG_SR], 0);
1.1.1.4   root     2917:                newpc = newaddr;
1.1.1.6   root     2918:                dsp_core.pc = newpc;
1.1       root     2919:                cur_inst_len = 0;
1.1.1.4   root     2920:                return;
1.1.1.11  root     2921:        }
1.1.1.4   root     2922:        ++cur_inst_len;
1.1       root     2923: }
                   2924: 
                   2925: static void dsp_lua(void)
                   2926: {
1.1.1.2   root     2927:        Uint32 value, srcreg, dstreg, srcsave, srcnew;
                   2928: 
1.1       root     2929:        srcreg = (cur_inst>>8) & BITMASK(3);
1.1.1.2   root     2930: 
1.1.1.6   root     2931:        srcsave = dsp_core.registers[DSP_REG_R0+srcreg];
1.1.1.2   root     2932:        dsp_calc_ea((cur_inst>>8) & BITMASK(5), &value);
1.1.1.6   root     2933:        srcnew = dsp_core.registers[DSP_REG_R0+srcreg];
                   2934:        dsp_core.registers[DSP_REG_R0+srcreg] = srcsave;
1.1.1.2   root     2935: 
1.1.1.11  root     2936:        if (cur_inst & (1<<3))
                   2937:                dstreg = DSP_REG_N0 + (cur_inst & BITMASK(3));
                   2938:        else
                   2939:                dstreg = DSP_REG_R0 + (cur_inst & BITMASK(3));
1.1       root     2940: 
1.1.1.11  root     2941:        dsp_core.agu_move_indirect_instr = 1;
                   2942:        dsp_write_reg(dstreg, srcnew);
1.1.1.6   root     2943:        dsp_core.instr_cycle += 2;
1.1       root     2944: }
                   2945: 
1.1.1.3   root     2946: static void dsp_movec_reg(void)
1.1       root     2947: {
1.1.1.4   root     2948:        Uint32 numreg1, numreg2, value, dummy;
1.1       root     2949: 
                   2950:        /* S1,D2 */
                   2951:        /* S2,D1 */
                   2952: 
                   2953:        numreg2 = (cur_inst>>8) & BITMASK(6);
1.1.1.4   root     2954:        numreg1 = cur_inst & BITMASK(6);
1.1       root     2955: 
1.1.1.11  root     2956:        dsp_core.agu_move_indirect_instr = 1;
                   2957: 
1.1       root     2958:        if (cur_inst & (1<<15)) {
                   2959:                /* Write D1 */
                   2960: 
                   2961:                if ((numreg2 == DSP_REG_A) || (numreg2 == DSP_REG_B)) {
1.1.1.11  root     2962:                        dsp_pm_read_accu24(numreg2, &value);
1.1       root     2963:                } else {
1.1.1.6   root     2964:                        value = dsp_core.registers[numreg2];
1.1       root     2965:                }
1.1.1.4   root     2966:                dsp_write_reg(numreg1, value);
1.1       root     2967:        } else {
                   2968:                /* Read S1 */
1.1.1.4   root     2969:                if (numreg1 == DSP_REG_SSH) {
                   2970:                        dsp_stack_pop(&value, &dummy);
1.1.1.11  root     2971:                }
1.1.1.4   root     2972:                else {
1.1.1.6   root     2973:                        value = dsp_core.registers[numreg1];
1.1.1.4   root     2974:                }
1.1       root     2975: 
1.1.1.11  root     2976:                dsp_write_reg(numreg2, value);
1.1       root     2977:        }
                   2978: }
                   2979: 
1.1.1.3   root     2980: static void dsp_movec_aa(void)
1.1       root     2981: {
1.1.1.4   root     2982:        Uint32 numreg, addr, memspace, value, dummy;
1.1       root     2983: 
                   2984:        /* x:aa,D1 */
                   2985:        /* S1,x:aa */
                   2986:        /* y:aa,D1 */
                   2987:        /* S1,y:aa */
                   2988: 
1.1.1.4   root     2989:        numreg = cur_inst & BITMASK(6);
1.1       root     2990:        addr = (cur_inst>>8) & BITMASK(6);
                   2991:        memspace = (cur_inst>>6) & 1;
                   2992: 
                   2993:        if (cur_inst & (1<<15)) {
                   2994:                /* Write D1 */
1.1.1.4   root     2995:                value = read_memory(memspace, addr);
1.1.1.11  root     2996:                dsp_core.agu_move_indirect_instr = 1;
1.1.1.4   root     2997:                dsp_write_reg(numreg, value);
1.1       root     2998:        } else {
                   2999:                /* Read S1 */
1.1.1.4   root     3000:                if (numreg == DSP_REG_SSH) {
                   3001:                        dsp_stack_pop(&value, &dummy);
1.1.1.11  root     3002:                }
1.1.1.4   root     3003:                else {
1.1.1.6   root     3004:                        value = dsp_core.registers[numreg];
1.1.1.4   root     3005:                }
                   3006:                write_memory(memspace, addr, value);
1.1       root     3007:        }
                   3008: }
                   3009: 
1.1.1.3   root     3010: static void dsp_movec_imm(void)
1.1       root     3011: {
1.1.1.4   root     3012:        Uint32 numreg, value;
1.1       root     3013: 
                   3014:        /* #xx,D1 */
1.1.1.4   root     3015:        numreg = cur_inst & BITMASK(6);
                   3016:        value = (cur_inst>>8) & BITMASK(8);
1.1.1.11  root     3017:        dsp_core.agu_move_indirect_instr = 1;
1.1.1.4   root     3018:        dsp_write_reg(numreg, value);
1.1       root     3019: }
                   3020: 
1.1.1.3   root     3021: static void dsp_movec_ea(void)
1.1       root     3022: {
1.1.1.4   root     3023:        Uint32 numreg, addr, memspace, ea_mode, value, dummy;
1.1       root     3024:        int retour;
                   3025: 
                   3026:        /* x:ea,D1 */
                   3027:        /* S1,x:ea */
                   3028:        /* y:ea,D1 */
                   3029:        /* S1,y:ea */
                   3030:        /* #xxxx,D1 */
                   3031: 
1.1.1.4   root     3032:        numreg = cur_inst & BITMASK(6);
1.1       root     3033:        ea_mode = (cur_inst>>8) & BITMASK(6);
                   3034:        memspace = (cur_inst>>6) & 1;
                   3035: 
                   3036:        if (cur_inst & (1<<15)) {
                   3037:                /* Write D1 */
                   3038:                retour = dsp_calc_ea(ea_mode, &addr);
                   3039:                if (retour) {
1.1.1.4   root     3040:                        value = addr;
1.1       root     3041:                } else {
1.1.1.4   root     3042:                        value = read_memory(memspace, addr);
1.1       root     3043:                }
1.1.1.11  root     3044:                dsp_core.agu_move_indirect_instr = 1;
1.1.1.4   root     3045:                dsp_write_reg(numreg, value);
1.1       root     3046:        } else {
                   3047:                /* Read S1 */
1.1.1.4   root     3048:                dsp_calc_ea(ea_mode, &addr);
                   3049:                if (numreg == DSP_REG_SSH) {
                   3050:                        dsp_stack_pop(&value, &dummy);
1.1.1.11  root     3051:                }
1.1.1.4   root     3052:                else {
1.1.1.6   root     3053:                        value = dsp_core.registers[numreg];
1.1.1.4   root     3054:                }
                   3055:                write_memory(memspace, addr, value);
1.1       root     3056:        }
                   3057: }
                   3058: 
1.1.1.4   root     3059: static void dsp_movem_aa(void)
1.1       root     3060: {
1.1.1.4   root     3061:        Uint32 numreg, addr, value, dummy;
1.1       root     3062: 
                   3063:        numreg = cur_inst & BITMASK(6);
1.1.1.4   root     3064:        addr = (cur_inst>>8) & BITMASK(6);
1.1       root     3065: 
1.1.1.4   root     3066:        if  (cur_inst & (1<<15)) {
                   3067:                /* Write D */
                   3068:                value = read_memory_p(addr);
1.1.1.11  root     3069:                dsp_core.agu_move_indirect_instr = 1;
1.1.1.4   root     3070:                dsp_write_reg(numreg, value);
1.1       root     3071:        } else {
1.1.1.4   root     3072:                /* Read S */
                   3073:                if (numreg == DSP_REG_SSH) {
                   3074:                        dsp_stack_pop(&value, &dummy);
1.1.1.11  root     3075:                }
1.1.1.4   root     3076:                else if ((numreg == DSP_REG_A) || (numreg == DSP_REG_B)) {
1.1.1.11  root     3077:                        dsp_pm_read_accu24(numreg, &value);
                   3078:                }
1.1.1.4   root     3079:                else {
1.1.1.6   root     3080:                        value = dsp_core.registers[numreg];
1.1.1.4   root     3081:                }
                   3082:                write_memory(DSP_SPACE_P, addr, value);
                   3083:        }
1.1       root     3084: 
1.1.1.6   root     3085:        dsp_core.instr_cycle += 4;
1.1.1.4   root     3086: }
                   3087: 
                   3088: static void dsp_movem_ea(void)
                   3089: {
                   3090:        Uint32 numreg, addr, ea_mode, value, dummy;
                   3091: 
                   3092:        numreg = cur_inst & BITMASK(6);
                   3093:        ea_mode = (cur_inst>>8) & BITMASK(6);
                   3094:        dsp_calc_ea(ea_mode, &addr);
1.1       root     3095: 
                   3096:        if  (cur_inst & (1<<15)) {
                   3097:                /* Write D */
1.1.1.4   root     3098:                value = read_memory_p(addr);
1.1.1.11  root     3099:                dsp_core.agu_move_indirect_instr = 1;
1.1.1.4   root     3100:                dsp_write_reg(numreg, value);
1.1       root     3101:        } else {
                   3102:                /* Read S */
1.1.1.4   root     3103:                if (numreg == DSP_REG_SSH) {
                   3104:                        dsp_stack_pop(&value, &dummy);
1.1.1.11  root     3105:                }
1.1.1.4   root     3106:                else if ((numreg == DSP_REG_A) || (numreg == DSP_REG_B)) {
1.1.1.11  root     3107:                        dsp_pm_read_accu24(numreg, &value);
                   3108:                }
1.1.1.4   root     3109:                else {
1.1.1.6   root     3110:                        value = dsp_core.registers[numreg];
1.1       root     3111:                }
                   3112:                write_memory(DSP_SPACE_P, addr, value);
                   3113:        }
                   3114: 
1.1.1.6   root     3115:        dsp_core.instr_cycle += 4;
1.1       root     3116: }
                   3117: 
                   3118: static void dsp_movep_0(void)
                   3119: {
                   3120:        /* S,x:pp */
                   3121:        /* x:pp,D */
                   3122:        /* S,y:pp */
                   3123:        /* y:pp,D */
1.1.1.11  root     3124: 
1.1.1.4   root     3125:        Uint32 addr, memspace, numreg, value, dummy;
1.1       root     3126: 
                   3127:        addr = 0xffc0 + (cur_inst & BITMASK(6));
                   3128:        memspace = (cur_inst>>16) & 1;
                   3129:        numreg = (cur_inst>>8) & BITMASK(6);
                   3130: 
                   3131:        if  (cur_inst & (1<<15)) {
                   3132:                /* Write pp */
                   3133:                if ((numreg == DSP_REG_A) || (numreg == DSP_REG_B)) {
1.1.1.11  root     3134:                        dsp_pm_read_accu24(numreg, &value);
1.1.1.4   root     3135:                }
                   3136:                else if (numreg == DSP_REG_SSH) {
                   3137:                        dsp_stack_pop(&value, &dummy);
                   3138:                }
                   3139:                else {
1.1.1.6   root     3140:                        value = dsp_core.registers[numreg];
1.1       root     3141:                }
                   3142:                write_memory(memspace, addr, value);
                   3143:        } else {
                   3144:                /* Read pp */
                   3145:                value = read_memory(memspace, addr);
1.1.1.11  root     3146:                dsp_core.agu_move_indirect_instr = 1;
1.1.1.4   root     3147:                dsp_write_reg(numreg, value);
1.1       root     3148:        }
1.1.1.4   root     3149: 
1.1.1.6   root     3150:        dsp_core.instr_cycle += 2;
1.1       root     3151: }
                   3152: 
                   3153: static void dsp_movep_1(void)
                   3154: {
                   3155:        /* p:ea,x:pp */
                   3156:        /* x:pp,p:ea */
                   3157:        /* p:ea,y:pp */
                   3158:        /* y:pp,p:ea */
                   3159: 
1.1.1.2   root     3160:        Uint32 xyaddr, memspace, paddr;
1.1       root     3161: 
                   3162:        xyaddr = 0xffc0 + (cur_inst & BITMASK(6));
                   3163:        dsp_calc_ea((cur_inst>>8) & BITMASK(6), &paddr);
                   3164:        memspace = (cur_inst>>16) & 1;
                   3165: 
                   3166:        if (cur_inst & (1<<15)) {
                   3167:                /* Write pp */
1.1.1.4   root     3168:                write_memory(memspace, xyaddr, read_memory_p(paddr));
1.1       root     3169:        } else {
                   3170:                /* Read pp */
                   3171:                write_memory(DSP_SPACE_P, paddr, read_memory(memspace, xyaddr));
                   3172:        }
1.1.1.4   root     3173: 
1.1.1.7   root     3174:        /* Movep is 4 cycles, but according to the motorola doc, */
                   3175:        /* movep from p memory to x or y peripheral memory takes */
                   3176:        /* 2 more cycles, so +4 cycles at total */
                   3177:        dsp_core.instr_cycle += 4;
1.1       root     3178: }
                   3179: 
1.1.1.4   root     3180: static void dsp_movep_23(void)
1.1       root     3181: {
                   3182:        /* x:ea,x:pp */
                   3183:        /* y:ea,x:pp */
                   3184:        /* #xxxxxx,x:pp */
                   3185:        /* x:pp,x:ea */
                   3186:        /* x:pp,y:pp */
                   3187:        /* x:ea,y:pp */
                   3188:        /* y:ea,y:pp */
                   3189:        /* #xxxxxx,y:pp */
                   3190:        /* y:pp,y:ea */
                   3191:        /* y:pp,x:ea */
                   3192: 
1.1.1.2   root     3193:        Uint32 addr, peraddr, easpace, perspace, ea_mode;
1.1       root     3194:        int retour;
                   3195: 
                   3196:        peraddr = 0xffc0 + (cur_inst & BITMASK(6));
                   3197:        perspace = (cur_inst>>16) & 1;
1.1.1.11  root     3198: 
1.1       root     3199:        ea_mode = (cur_inst>>8) & BITMASK(6);
                   3200:        easpace = (cur_inst>>6) & 1;
                   3201:        retour = dsp_calc_ea(ea_mode, &addr);
                   3202: 
                   3203:        if (cur_inst & (1<<15)) {
                   3204:                /* Write pp */
1.1.1.11  root     3205: 
1.1       root     3206:                if (retour) {
                   3207:                        write_memory(perspace, peraddr, addr);
                   3208:                } else {
                   3209:                        write_memory(perspace, peraddr, read_memory(easpace, addr));
                   3210:                }
                   3211:        } else {
                   3212:                /* Read pp */
                   3213:                write_memory(easpace, addr, read_memory(perspace, peraddr));
                   3214:        }
1.1.1.4   root     3215: 
1.1.1.6   root     3216:        dsp_core.instr_cycle += 2;
1.1       root     3217: }
                   3218: 
                   3219: static void dsp_norm(void)
                   3220: {
1.1.1.2   root     3221:        Uint32 cursr,cur_e, cur_euz, dest[3], numreg, rreg;
                   3222:        Uint16 newsr;
1.1       root     3223: 
1.1.1.6   root     3224:        cursr = dsp_core.registers[DSP_REG_SR];
1.1       root     3225:        cur_e = (cursr>>DSP_SR_E) & 1;  /* E */
                   3226:        cur_euz = ~cur_e;                       /* (not E) and U and (not Z) */
                   3227:        cur_euz &= (cursr>>DSP_SR_U) & 1;
                   3228:        cur_euz &= ~((cursr>>DSP_SR_Z) & 1);
                   3229:        cur_euz &= 1;
                   3230: 
                   3231:        numreg = (cur_inst>>3) & 1;
1.1.1.6   root     3232:        dest[0] = dsp_core.registers[DSP_REG_A2+numreg];
                   3233:        dest[1] = dsp_core.registers[DSP_REG_A1+numreg];
                   3234:        dest[2] = dsp_core.registers[DSP_REG_A0+numreg];
1.1       root     3235:        rreg = DSP_REG_R0+((cur_inst>>8) & BITMASK(3));
                   3236: 
                   3237:        if (cur_euz) {
                   3238:                newsr = dsp_asl56(dest);
1.1.1.6   root     3239:                --dsp_core.registers[rreg];
                   3240:                dsp_core.registers[rreg] &= BITMASK(16);
1.1       root     3241:        } else if (cur_e) {
                   3242:                newsr = dsp_asr56(dest);
1.1.1.6   root     3243:                ++dsp_core.registers[rreg];
                   3244:                dsp_core.registers[rreg] &= BITMASK(16);
1.1       root     3245:        } else {
                   3246:                newsr = 0;
                   3247:        }
                   3248: 
1.1.1.6   root     3249:        dsp_core.registers[DSP_REG_A2+numreg] = dest[0];
                   3250:        dsp_core.registers[DSP_REG_A1+numreg] = dest[1];
                   3251:        dsp_core.registers[DSP_REG_A0+numreg] = dest[2];
1.1.1.2   root     3252: 
1.1.1.6   root     3253:        dsp_ccr_update_e_u_n_z(dest[0], dest[1], dest[2]);
1.1       root     3254: 
1.1.1.6   root     3255:        dsp_core.registers[DSP_REG_SR] &= BITMASK(16)-((1<<DSP_SR_V)|(1<<DSP_SR_C));
                   3256:        dsp_core.registers[DSP_REG_SR] |= newsr;
1.1       root     3257: }
                   3258: 
                   3259: static void dsp_ori(void)
                   3260: {
1.1.1.2   root     3261:        Uint32 regnum, value;
1.1       root     3262: 
                   3263:        value = (cur_inst >> 8) & BITMASK(8);
                   3264:        regnum = cur_inst & BITMASK(2);
                   3265:        switch(regnum) {
                   3266:                case 0:
                   3267:                        /* mr */
1.1.1.6   root     3268:                        dsp_core.registers[DSP_REG_SR] |= value<<8;
1.1       root     3269:                        break;
                   3270:                case 1:
                   3271:                        /* ccr */
1.1.1.6   root     3272:                        dsp_core.registers[DSP_REG_SR] |= value;
1.1       root     3273:                        break;
                   3274:                case 2:
                   3275:                        /* omr */
1.1.1.6   root     3276:                        dsp_core.registers[DSP_REG_OMR] |= value;
1.1       root     3277:                        break;
                   3278:        }
                   3279: }
                   3280: 
1.1.1.3   root     3281: /*
                   3282:        REP instruction parameter encoding
                   3283: 
                   3284:        xxxxxxxx 00xxxxxx 0xxxxxxx      aa
                   3285:        xxxxxxxx 01xxxxxx 0xxxxxxx      ea
                   3286:        xxxxxxxx YYxxxxxx 1xxxxxxx      imm
                   3287:        xxxxxxxx 11xxxxxx 0xxxxxxx      reg
                   3288: */
                   3289: 
                   3290: static void dsp_rep_aa(void)
1.1       root     3291: {
                   3292:        /* x:aa */
                   3293:        /* y:aa */
1.1.1.6   root     3294:        dsp_core.registers[DSP_REG_LCSAVE] = dsp_core.registers[DSP_REG_LC];
                   3295:        dsp_core.pc_on_rep = 1; /* Not decrement LC at first time */
                   3296:        dsp_core.loop_rep = 1;  /* We are now running rep */
1.1       root     3297: 
1.1.1.6   root     3298:        dsp_core.registers[DSP_REG_LC]=read_memory((cur_inst>>6) & 1,(cur_inst>>8) & BITMASK(6));
1.1.1.4   root     3299: 
1.1.1.6   root     3300:        dsp_core.instr_cycle += 2;
1.1       root     3301: }
                   3302: 
1.1.1.3   root     3303: static void dsp_rep_imm(void)
1.1       root     3304: {
                   3305:        /* #xxx */
                   3306: 
1.1.1.6   root     3307:        dsp_core.registers[DSP_REG_LCSAVE] = dsp_core.registers[DSP_REG_LC];
                   3308:        dsp_core.pc_on_rep = 1; /* Not decrement LC at first time */
                   3309:        dsp_core.loop_rep = 1;  /* We are now running rep */
1.1.1.4   root     3310: 
1.1.1.6   root     3311:        dsp_core.registers[DSP_REG_LC] = ((cur_inst>>8) & BITMASK(8))
1.1.1.3   root     3312:                + ((cur_inst & BITMASK(4))<<8);
1.1.1.4   root     3313: 
1.1.1.6   root     3314:        dsp_core.instr_cycle += 2;
1.1       root     3315: }
                   3316: 
1.1.1.3   root     3317: static void dsp_rep_ea(void)
1.1       root     3318: {
1.1.1.2   root     3319:        Uint32 value;
1.1       root     3320: 
                   3321:        /* x:ea */
                   3322:        /* y:ea */
                   3323: 
1.1.1.6   root     3324:        dsp_core.registers[DSP_REG_LCSAVE] = dsp_core.registers[DSP_REG_LC];
                   3325:        dsp_core.pc_on_rep = 1; /* Not decrement LC at first time */
                   3326:        dsp_core.loop_rep = 1;  /* We are now running rep */
1.1.1.4   root     3327: 
1.1       root     3328:        dsp_calc_ea((cur_inst>>8) & BITMASK(6),&value);
1.1.1.6   root     3329:        dsp_core.registers[DSP_REG_LC]= read_memory((cur_inst>>6) & 1, value);
1.1.1.4   root     3330: 
1.1.1.6   root     3331:        dsp_core.instr_cycle += 2;
1.1       root     3332: }
                   3333: 
1.1.1.3   root     3334: static void dsp_rep_reg(void)
1.1       root     3335: {
1.1.1.2   root     3336:        Uint32 numreg;
1.1       root     3337: 
                   3338:        /* R */
                   3339: 
1.1.1.6   root     3340:        dsp_core.registers[DSP_REG_LCSAVE] = dsp_core.registers[DSP_REG_LC];
                   3341:        dsp_core.pc_on_rep = 1; /* Not decrement LC at first time */
                   3342:        dsp_core.loop_rep = 1;  /* We are now running rep */
1.1.1.4   root     3343: 
1.1       root     3344:        numreg = (cur_inst>>8) & BITMASK(6);
                   3345:        if ((numreg == DSP_REG_A) || (numreg == DSP_REG_B)) {
1.1.1.11  root     3346:                dsp_pm_read_accu24(numreg, &dsp_core.registers[DSP_REG_LC]);
1.1       root     3347:        } else {
1.1.1.6   root     3348:                dsp_core.registers[DSP_REG_LC] = dsp_core.registers[numreg];
1.1       root     3349:        }
1.1.1.6   root     3350:        dsp_core.registers[DSP_REG_LC] &= BITMASK(16);
1.1.1.4   root     3351: 
1.1.1.6   root     3352:        dsp_core.instr_cycle += 2;
1.1       root     3353: }
                   3354: 
                   3355: static void dsp_reset(void)
                   3356: {
1.1.1.13  root     3357:        /* Clear the IPR register */
                   3358:        write_memory(DSP_SPACE_X, 0xffc0 + DSP_IPR, 0);
                   3359: 
                   3360:        /* Software reset all on-chip peripherals */
                   3361: 
                   3362:        /* HOST_HCR x:$FFE8 : clear the full register */
                   3363:        write_memory(DSP_SPACE_X, 0xffc0 + DSP_HOST_HCR, 0);
                   3364: 
                   3365:        /* HOST_ICR $0 : clear the full register */
                   3366:        dsp_core_write_host(CPU_HOST_ICR, 0);
                   3367: 
                   3368:        /* HOST_CVR $1 : set the register to $12 */
                   3369:        dsp_core_write_host(CPU_HOST_CVR, 0x12);
                   3370: 
                   3371:        /* HOST_ISR $2 : set the bits TRDY and TXDE 1, other bits to 0 */
                   3372:        dsp_core.hostport[CPU_HOST_ISR] = (1<<CPU_HOST_ISR_TRDY)|(1<<CPU_HOST_ISR_TXDE);
                   3373: 
                   3374:        /* HOST_IVR $3 : set the register to $0f */
                   3375:        dsp_core_write_host(CPU_HOST_IVR, 0x0f);
                   3376: 
                   3377:        /* SSI_CRA x:$FFEC : clear the full register */
                   3378:        write_memory(DSP_SPACE_X, 0xffc0 + DSP_SSI_CRA, 0);
                   3379: 
                   3380:        /* SSI_CRB x:$FFED : clear the full register */
                   3381:        write_memory(DSP_SPACE_X, 0xffc0 + DSP_SSI_CRB, 0);
                   3382: 
                   3383:        /* SSI_SR x:$FFEE : set the register to $40 */
                   3384:        write_memory(DSP_SPACE_X, 0xffc0 + DSP_SSI_SR, 1<<DSP_SSI_SR_TDE);
                   3385: 
                   3386:        /* SCI_SCR x:$FFF0 : clear the full register (not used in the Falcon) */
                   3387:        write_memory(DSP_SPACE_X, 0xffc0 + DSP_SCI_SCR, 0);
                   3388: 
                   3389:        /* SCI_SSR x:$FFF1 : clear the register to $3 (not used in the Falcon) */
                   3390:        write_memory(DSP_SPACE_X, 0xffc0 + DSP_SCI_SSR, 3);
                   3391: 
                   3392:        /* SCI_SCCR x:$FFF2 : clear the full register (not used in the Falcon) */
                   3393:        write_memory(DSP_SPACE_X, 0xffc0 + DSP_SCI_SCCR, 0);
                   3394: 
1.1.1.6   root     3395:        dsp_core.instr_cycle += 2;
1.1       root     3396: }
                   3397: 
                   3398: static void dsp_rti(void)
                   3399: {
1.1.1.2   root     3400:        Uint32 newpc = 0, newsr = 0;
1.1       root     3401: 
                   3402:        dsp_stack_pop(&newpc, &newsr);
1.1.1.6   root     3403:        dsp_core.pc = newpc;
                   3404:        dsp_core.registers[DSP_REG_SR] = newsr;
1.1       root     3405:        cur_inst_len = 0;
1.1.1.4   root     3406: 
1.1.1.6   root     3407:        dsp_core.instr_cycle += 2;
1.1       root     3408: }
                   3409: 
                   3410: static void dsp_rts(void)
                   3411: {
1.1.1.2   root     3412:        Uint32 newpc = 0, newsr;
1.1       root     3413: 
                   3414:        dsp_stack_pop(&newpc, &newsr);
1.1.1.6   root     3415:        dsp_core.pc = newpc;
1.1       root     3416:        cur_inst_len = 0;
1.1.1.4   root     3417: 
1.1.1.6   root     3418:        dsp_core.instr_cycle += 2;
1.1       root     3419: }
                   3420: 
                   3421: static void dsp_stop(void)
                   3422: {
1.1.1.6   root     3423:        LOG_TRACE(TRACE_DSP_STATE, "Dsp: STOP instruction\n");
1.1       root     3424: }
                   3425: 
                   3426: static void dsp_swi(void)
                   3427: {
                   3428:        /* Raise interrupt p:0x0006 */
1.1.1.6   root     3429:        dsp_core.instr_cycle += 6;
1.1       root     3430: }
                   3431: 
                   3432: static void dsp_tcc(void)
                   3433: {
1.1.1.6   root     3434:        Uint32 cc_code, regsrc1, regdest1;
1.1.1.2   root     3435:        Uint32 regsrc2, regdest2;
1.1.1.6   root     3436:        Uint32 val0, val1, val2;
1.1.1.11  root     3437: 
1.1       root     3438:        cc_code = (cur_inst>>12) & BITMASK(4);
                   3439: 
                   3440:        if (dsp_calc_cc(cc_code)) {
                   3441:                regsrc1 = registers_tcc[(cur_inst>>3) & BITMASK(4)][0];
1.1.1.2   root     3442:                regdest1 = registers_tcc[(cur_inst>>3) & BITMASK(4)][1];
1.1       root     3443: 
                   3444:                /* Read S1 */
1.1.1.7   root     3445:                if (regsrc1 == DSP_REG_A) {
                   3446:                        val0 = dsp_core.registers[DSP_REG_A0];
                   3447:                        val1 = dsp_core.registers[DSP_REG_A1];
                   3448:                        val2 = dsp_core.registers[DSP_REG_A2];
                   3449:                }
                   3450:                else if (regsrc1 == DSP_REG_B) {
                   3451:                        val0 = dsp_core.registers[DSP_REG_B0];
                   3452:                        val1 = dsp_core.registers[DSP_REG_B1];
                   3453:                        val2 = dsp_core.registers[DSP_REG_B2];
                   3454:                }
                   3455:                else {
1.1.1.6   root     3456:                        val0 = 0;
                   3457:                        val1 = dsp_core.registers[regsrc1];
1.1.1.7   root     3458:                        val2 = val1 & (1<<23) ? 0xff : 0x0;
1.1       root     3459:                }
1.1.1.11  root     3460: 
1.1       root     3461:                /* Write D1 */
1.1.1.7   root     3462:                if (regdest1 == DSP_REG_A) {
                   3463:                        dsp_core.registers[DSP_REG_A2] = val2;
                   3464:                        dsp_core.registers[DSP_REG_A1] = val1;
                   3465:                        dsp_core.registers[DSP_REG_A0] = val0;
                   3466:                }
                   3467:                else {
                   3468:                        dsp_core.registers[DSP_REG_B2] = val2;
                   3469:                        dsp_core.registers[DSP_REG_B1] = val1;
                   3470:                        dsp_core.registers[DSP_REG_B0] = val0;
                   3471:                }
1.1       root     3472: 
                   3473:                /* S2,D2 transfer */
                   3474:                if (cur_inst & (1<<16)) {
1.1.1.2   root     3475:                        regsrc2 = DSP_REG_R0+((cur_inst>>8) & BITMASK(3));
                   3476:                        regdest2 = DSP_REG_R0+(cur_inst & BITMASK(3));
1.1       root     3477: 
1.1.1.11  root     3478:                        dsp_core.agu_move_indirect_instr = 1;
                   3479:                        dsp_write_reg(regdest2, dsp_core.registers[regsrc2]);
1.1       root     3480:                }
                   3481:        }
                   3482: }
                   3483: 
                   3484: static void dsp_wait(void)
                   3485: {
1.1.1.6   root     3486:        LOG_TRACE(TRACE_DSP_STATE, "Dsp: WAIT instruction\n");
1.1       root     3487: }
                   3488: 
1.1.1.2   root     3489: static int dsp_pm_read_accu24(int numreg, Uint32 *dest)
1.1       root     3490: {
1.1.1.4   root     3491:        Uint32 scaling, value, reg;
1.1.1.7   root     3492:        int got_limited = 0;
1.1       root     3493: 
                   3494:        /* Read an accumulator, stores it limited */
                   3495: 
1.1.1.6   root     3496:        scaling = (dsp_core.registers[DSP_REG_SR]>>DSP_SR_S0) & BITMASK(2);
1.1.1.4   root     3497:        reg = numreg & 1;
1.1       root     3498: 
1.1.1.6   root     3499:        value = (dsp_core.registers[DSP_REG_A2+reg]) << 24;
                   3500:        value += dsp_core.registers[DSP_REG_A1+reg];
1.1       root     3501: 
                   3502:        switch(scaling) {
                   3503:                case 0:
1.1.1.4   root     3504:                        /* No scaling */
                   3505:                        break;
                   3506:                case 1:
                   3507:                        /* scaling down */
                   3508:                        value >>= 1;
1.1       root     3509:                        break;
                   3510:                case 2:
1.1.1.4   root     3511:                        /* scaling up */
                   3512:                        value <<= 1;
1.1.1.6   root     3513:                        value |= (dsp_core.registers[DSP_REG_A0+reg]>>23) & 1;
1.1       root     3514:                        break;
1.1.1.4   root     3515:                /* indeterminate */
1.1.1.11  root     3516:                case 3:
1.1.1.4   root     3517:                        break;
                   3518:        }
                   3519: 
                   3520:        /* limiting ? */
                   3521:        value &= BITMASK(24);
                   3522: 
1.1.1.6   root     3523:        if (dsp_core.registers[DSP_REG_A2+reg] == 0) {
1.1.1.4   root     3524:                if (value <= 0x007fffff) {
                   3525:                        /* No limiting */
                   3526:                        *dest=value;
                   3527:                        return 0;
1.1.1.11  root     3528:                }
1.1.1.4   root     3529:        }
                   3530: 
1.1.1.6   root     3531:        if (dsp_core.registers[DSP_REG_A2+reg] == 0xff) {
1.1.1.4   root     3532:                if (value >= 0x00800000) {
                   3533:                        /* No limiting */
                   3534:                        *dest=value;
                   3535:                        return 0;
1.1.1.11  root     3536:                }
1.1       root     3537:        }
                   3538: 
1.1.1.6   root     3539:        if (dsp_core.registers[DSP_REG_A2+reg] & (1<<7)) {
1.1       root     3540:                /* Limited to maximum negative value */
                   3541:                *dest=0x00800000;
1.1.1.6   root     3542:                dsp_core.registers[DSP_REG_SR] |= (1<<DSP_SR_L);
1.1.1.2   root     3543:                got_limited=1;
1.1       root     3544:        } else {
                   3545:                /* Limited to maximal positive value */
                   3546:                *dest=0x007fffff;
1.1.1.6   root     3547:                dsp_core.registers[DSP_REG_SR] |= (1<<DSP_SR_L);
1.1.1.2   root     3548:                got_limited=1;
1.1.1.11  root     3549:        }
1.1.1.2   root     3550: 
                   3551:        return got_limited;
1.1       root     3552: }
                   3553: 
                   3554: static void dsp_pm_0(void)
                   3555: {
1.1.1.6   root     3556:        Uint32 memspace, numreg, addr, save_accu, save_xy0;
1.1       root     3557: /*
                   3558:        0000 100d 00mm mrrr S,x:ea      x0,D
                   3559:        0000 100d 10mm mrrr S,y:ea      y0,D
                   3560: */
                   3561:        memspace = (cur_inst>>15) & 1;
                   3562:        numreg = (cur_inst>>16) & 1;
1.1.1.6   root     3563:        dsp_calc_ea((cur_inst>>8) & BITMASK(6), &addr);
                   3564: 
1.1.1.11  root     3565:        /* Save A or B */
1.1.1.6   root     3566:        dsp_pm_read_accu24(numreg, &save_accu);
1.1       root     3567: 
1.1.1.6   root     3568:        /* Save X0 or Y0 */
                   3569:        save_xy0 = dsp_core.registers[DSP_REG_X0+(memspace<<1)];
                   3570: 
                   3571:        /* Execute parallel instruction */
                   3572:        opcodes_alu[cur_inst & BITMASK(8)]();
                   3573: 
1.1.1.11  root     3574:        /* Move [A|B] to [x|y]:ea */
1.1.1.6   root     3575:        write_memory(memspace, addr, save_accu);
                   3576: 
                   3577:        /* Move [x|y]0 to [A|B] */
                   3578:        dsp_core.registers[DSP_REG_A0+numreg] = 0;
                   3579:        dsp_core.registers[DSP_REG_A1+numreg] = save_xy0;
1.1.1.7   root     3580:        dsp_core.registers[DSP_REG_A2+numreg] = save_xy0 & (1<<23) ? 0xff : 0x0;
1.1       root     3581: }
                   3582: 
                   3583: static void dsp_pm_1(void)
                   3584: {
1.1.1.6   root     3585:        Uint32 memspace, numreg1, numreg2, value, xy_addr, retour, save_1, save_2;
1.1       root     3586: /*
1.1.1.11  root     3587:        0001 ffdf w0mm mrrr                     x:ea,D1         S2,D2
1.1       root     3588:                                                S1,x:ea         S2,D2
                   3589:                                                #xxxxxx,D1      S2,D2
1.1.1.11  root     3590:        0001 deff w1mm mrrr                     S1,D1           y:ea,D2
1.1       root     3591:                                                S1,D1           S2,y:ea
                   3592:                                                S1,D1           #xxxxxx,D2
                   3593: */
                   3594:        value = (cur_inst>>8) & BITMASK(6);
1.1.1.11  root     3595:        retour = dsp_calc_ea(value, &xy_addr);
1.1       root     3596:        memspace = (cur_inst>>14) & 1;
1.1.1.6   root     3597:        numreg1 = numreg2 = DSP_REG_NULL;
1.1       root     3598: 
                   3599:        if (memspace) {
                   3600:                /* Y: */
                   3601:                switch((cur_inst>>16) & BITMASK(2)) {
1.1.1.6   root     3602:                        case 0: numreg1 = DSP_REG_Y0;   break;
                   3603:                        case 1: numreg1 = DSP_REG_Y1;   break;
                   3604:                        case 2: numreg1 = DSP_REG_A;    break;
                   3605:                        case 3: numreg1 = DSP_REG_B;    break;
1.1       root     3606:                }
                   3607:        } else {
                   3608:                /* X: */
                   3609:                switch((cur_inst>>18) & BITMASK(2)) {
1.1.1.6   root     3610:                        case 0: numreg1 = DSP_REG_X0;   break;
                   3611:                        case 1: numreg1 = DSP_REG_X1;   break;
                   3612:                        case 2: numreg1 = DSP_REG_A;    break;
                   3613:                        case 3: numreg1 = DSP_REG_B;    break;
1.1       root     3614:                }
                   3615:        }
                   3616: 
                   3617:        if (cur_inst & (1<<15)) {
                   3618:                /* Write D1 */
1.1.1.6   root     3619:                if (retour)
                   3620:                        save_1 = xy_addr;
                   3621:                else
                   3622:                        save_1 = read_memory(memspace, xy_addr);
1.1       root     3623:        } else {
                   3624:                /* Read S1 */
1.1.1.6   root     3625:                if ((numreg1==DSP_REG_A) || (numreg1==DSP_REG_B))
                   3626:                        dsp_pm_read_accu24(numreg1, &save_1);
                   3627:                else
                   3628:                        save_1 = dsp_core.registers[numreg1];
1.1       root     3629:        }
1.1.1.11  root     3630: 
1.1       root     3631:        /* S2 */
                   3632:        if (memspace) {
                   3633:                /* Y: */
1.1.1.6   root     3634:                numreg2 = DSP_REG_A + ((cur_inst>>19) & 1);
1.1       root     3635:        } else {
                   3636:                /* X: */
1.1.1.6   root     3637:                numreg2 = DSP_REG_A + ((cur_inst>>17) & 1);
1.1.1.11  root     3638:        }
1.1.1.6   root     3639:        dsp_pm_read_accu24(numreg2, &save_2);
1.1.1.11  root     3640: 
1.1.1.6   root     3641: 
                   3642:        /* Execute parallel instruction */
                   3643:        opcodes_alu[cur_inst & BITMASK(8)]();
                   3644: 
                   3645: 
                   3646:        /* Write parallel move values */
                   3647:        if (cur_inst & (1<<15)) {
                   3648:                /* Write D1 */
1.1.1.11  root     3649:                dsp_write_reg(numreg1, save_1);
1.1.1.6   root     3650:        } else {
                   3651:                /* Read S1 */
                   3652:                write_memory(memspace, xy_addr, save_1);
                   3653:        }
                   3654: 
                   3655:        /* S2 -> D2 */
1.1       root     3656:        if (memspace) {
                   3657:                /* Y: */
1.1.1.6   root     3658:                numreg2 = DSP_REG_X0 + ((cur_inst>>18) & 1);
1.1       root     3659:        } else {
                   3660:                /* X: */
1.1.1.6   root     3661:                numreg2 = DSP_REG_Y0 + ((cur_inst>>16) & 1);
1.1.1.11  root     3662:        }
1.1.1.6   root     3663:        dsp_core.registers[numreg2] = save_2;
1.1       root     3664: }
                   3665: 
                   3666: static void dsp_pm_2(void)
                   3667: {
1.1.1.2   root     3668:        Uint32 dummy;
1.1       root     3669: /*
                   3670:        0010 0000 0000 0000 nop
                   3671:        0010 0000 010m mrrr R update
                   3672:        0010 00ee eeed dddd S,D
                   3673:        001d dddd iiii iiii #xx,D
                   3674: */
1.1.1.4   root     3675:        if ((cur_inst & 0xffff00) == 0x200000) {
1.1.1.6   root     3676:                /* Execute parallel instruction */
                   3677:                opcodes_alu[cur_inst & BITMASK(8)]();
1.1       root     3678:                return;
                   3679:        }
                   3680: 
1.1.1.4   root     3681:        if ((cur_inst & 0xffe000) == 0x204000) {
1.1       root     3682:                dsp_calc_ea((cur_inst>>8) & BITMASK(5), &dummy);
1.1.1.6   root     3683:                /* Execute parallel instruction */
                   3684:                opcodes_alu[cur_inst & BITMASK(8)]();
1.1       root     3685:                return;
                   3686:        }
                   3687: 
1.1.1.4   root     3688:        if ((cur_inst & 0xfc0000) == 0x200000) {
1.1       root     3689:                dsp_pm_2_2();
                   3690:                return;
                   3691:        }
                   3692: 
                   3693:        dsp_pm_3();
                   3694: }
                   3695: 
                   3696: static void dsp_pm_2_2(void)
                   3697: {
                   3698: /*
                   3699:        0010 00ee eeed dddd S,D
                   3700: */
1.1.1.6   root     3701:        Uint32 srcreg, dstreg, save_reg;
1.1.1.11  root     3702: 
1.1       root     3703:        srcreg = (cur_inst >> 13) & BITMASK(5);
                   3704:        dstreg = (cur_inst >> 8) & BITMASK(5);
                   3705: 
1.1.1.6   root     3706:        if ((srcreg == DSP_REG_A) || (srcreg == DSP_REG_B))
                   3707:                /* Accu to register: limited 24 bits */
                   3708:                dsp_pm_read_accu24(srcreg, &save_reg);
                   3709:        else
                   3710:                save_reg = dsp_core.registers[srcreg];
                   3711: 
                   3712:        /* Execute parallel instruction */
                   3713:        opcodes_alu[cur_inst & BITMASK(8)]();
                   3714: 
                   3715:        /* Write reg */
1.1.1.11  root     3716:        dsp_core.agu_move_indirect_instr = 1;
                   3717:        dsp_write_reg(dstreg, save_reg);
1.1       root     3718: }
                   3719: 
                   3720: static void dsp_pm_3(void)
                   3721: {
1.1.1.6   root     3722:        Uint32 dstreg, srcvalue;
1.1       root     3723: /*
                   3724:        001d dddd iiii iiii #xx,R
                   3725: */
1.1.1.6   root     3726: 
                   3727:        /* Execute parallel instruction */
                   3728:        opcodes_alu[cur_inst & BITMASK(8)]();
                   3729: 
                   3730:        /* Write reg */
                   3731:        dstreg = (cur_inst >> 16) & BITMASK(5);
1.1       root     3732:        srcvalue = (cur_inst >> 8) & BITMASK(8);
                   3733: 
1.1.1.6   root     3734:        switch(dstreg) {
1.1       root     3735:                case DSP_REG_X0:
                   3736:                case DSP_REG_X1:
                   3737:                case DSP_REG_Y0:
                   3738:                case DSP_REG_Y1:
                   3739:                case DSP_REG_A:
                   3740:                case DSP_REG_B:
                   3741:                        srcvalue <<= 16;
                   3742:                        break;
                   3743:        }
                   3744: 
1.1.1.11  root     3745:        dsp_core.agu_move_indirect_instr = 1;
                   3746:        dsp_write_reg(dstreg, srcvalue);
1.1       root     3747: }
                   3748: 
                   3749: static void dsp_pm_4(void)
                   3750: {
                   3751: /*
1.1.1.4   root     3752:        0100 l0ll w0aa aaaa                     l:aa,D
1.1       root     3753:                                                S,l:aa
1.1.1.4   root     3754:        0100 l0ll w1mm mrrr                     l:ea,D
1.1       root     3755:                                                S,l:ea
1.1.1.4   root     3756:        01dd 0ddd w0aa aaaa                     x:aa,D
1.1       root     3757:                                                S,x:aa
1.1.1.4   root     3758:        01dd 0ddd w1mm mrrr                     x:ea,D
1.1       root     3759:                                                S,x:ea
                   3760:                                                #xxxxxx,D
1.1.1.4   root     3761:        01dd 1ddd w0aa aaaa                     y:aa,D
1.1       root     3762:                                                S,y:aa
1.1.1.4   root     3763:        01dd 1ddd w1mm mrrr                     y:ea,D
1.1       root     3764:                                                S,y:ea
                   3765:                                                #xxxxxx,D
                   3766: */
1.1.1.4   root     3767:        if ((cur_inst & 0xf40000)==0x400000) {
                   3768:                dsp_pm_4x();
1.1       root     3769:                return;
                   3770:        }
                   3771: 
                   3772:        dsp_pm_5();
                   3773: }
                   3774: 
1.1.1.4   root     3775: static void dsp_pm_4x(void)
1.1       root     3776: {
1.1.1.6   root     3777:        Uint32 value, numreg, l_addr, save_lx, save_ly;
1.1       root     3778: /*
1.1.1.4   root     3779:        0100 l0ll w0aa aaaa             l:aa,D
                   3780:                                        S,l:aa
                   3781:        0100 l0ll w1mm mrrr             l:ea,D
                   3782:                                        S,l:ea
1.1       root     3783: */
1.1.1.4   root     3784:        value = (cur_inst>>8) & BITMASK(6);
                   3785:        if (cur_inst & (1<<14)) {
1.1.1.11  root     3786:                dsp_calc_ea(value, &l_addr);
1.1.1.4   root     3787:        } else {
                   3788:                l_addr = value;
                   3789:        }
                   3790: 
1.1       root     3791:        numreg = (cur_inst>>16) & BITMASK(2);
                   3792:        numreg |= (cur_inst>>17) & (1<<2);
                   3793: 
                   3794:        if (cur_inst & (1<<15)) {
                   3795:                /* Write D */
1.1.1.6   root     3796:                save_lx = read_memory(DSP_SPACE_X,l_addr);
                   3797:                save_ly = read_memory(DSP_SPACE_Y,l_addr);
                   3798:        }
                   3799:        else {
                   3800:                /* Read S */
1.1.1.4   root     3801:                switch(numreg) {
                   3802:                        case 0:
                   3803:                                /* A10 */
1.1.1.6   root     3804:                                save_lx = dsp_core.registers[DSP_REG_A1];
                   3805:                                save_ly = dsp_core.registers[DSP_REG_A0];
1.1.1.4   root     3806:                                break;
                   3807:                        case 1:
                   3808:                                /* B10 */
1.1.1.6   root     3809:                                save_lx = dsp_core.registers[DSP_REG_B1];
                   3810:                                save_ly = dsp_core.registers[DSP_REG_B0];
1.1.1.4   root     3811:                                break;
                   3812:                        case 2:
                   3813:                                /* X */
1.1.1.6   root     3814:                                save_lx = dsp_core.registers[DSP_REG_X1];
                   3815:                                save_ly = dsp_core.registers[DSP_REG_X0];
1.1.1.4   root     3816:                                break;
                   3817:                        case 3:
                   3818:                                /* Y */
1.1.1.6   root     3819:                                save_lx = dsp_core.registers[DSP_REG_Y1];
                   3820:                                save_ly = dsp_core.registers[DSP_REG_Y0];
1.1.1.4   root     3821:                                break;
                   3822:                        case 4:
                   3823:                                /* A */
1.1.1.6   root     3824:                                if (dsp_pm_read_accu24(DSP_REG_A, &save_lx)) {
                   3825:                                        /* Was limited, set lower part */
                   3826:                                        save_ly = (save_lx & (1<<23) ? 0 : 0xffffff);
                   3827:                                } else {
                   3828:                                        /* Not limited */
                   3829:                                        save_ly = dsp_core.registers[DSP_REG_A0];
                   3830:                                }
1.1.1.4   root     3831:                                break;
                   3832:                        case 5:
                   3833:                                /* B */
1.1.1.6   root     3834:                                if (dsp_pm_read_accu24(DSP_REG_B, &save_lx)) {
                   3835:                                        /* Was limited, set lower part */
                   3836:                                        save_ly = (save_lx & (1<<23) ? 0 : 0xffffff);
                   3837:                                } else {
                   3838:                                        /* Not limited */
                   3839:                                        save_ly = dsp_core.registers[DSP_REG_B0];
                   3840:                                }
1.1.1.4   root     3841:                                break;
                   3842:                        case 6:
                   3843:                                /* AB */
1.1.1.11  root     3844:                                dsp_pm_read_accu24(DSP_REG_A, &save_lx);
                   3845:                                dsp_pm_read_accu24(DSP_REG_B, &save_ly);
1.1.1.4   root     3846:                                break;
                   3847:                        case 7:
                   3848:                                /* BA */
1.1.1.11  root     3849:                                dsp_pm_read_accu24(DSP_REG_B, &save_lx);
                   3850:                                dsp_pm_read_accu24(DSP_REG_A, &save_ly);
1.1.1.4   root     3851:                                break;
1.1       root     3852:                }
1.1.1.6   root     3853:        }
1.1       root     3854: 
1.1.1.6   root     3855:        /* Execute parallel instruction */
                   3856:        opcodes_alu[cur_inst & BITMASK(8)]();
1.1       root     3857: 
1.1.1.6   root     3858: 
                   3859:        if (cur_inst & (1<<15)) {
                   3860:                /* Write D */
1.1.1.4   root     3861:                switch(numreg) {
1.1.1.6   root     3862:                        case 0: /* A10 */
                   3863:                                dsp_core.registers[DSP_REG_A1] = save_lx;
                   3864:                                dsp_core.registers[DSP_REG_A0] = save_ly;
1.1.1.4   root     3865:                                break;
1.1.1.6   root     3866:                        case 1: /* B10 */
                   3867:                                dsp_core.registers[DSP_REG_B1] = save_lx;
                   3868:                                dsp_core.registers[DSP_REG_B0] = save_ly;
1.1.1.4   root     3869:                                break;
1.1.1.6   root     3870:                        case 2: /* X */
                   3871:                                dsp_core.registers[DSP_REG_X1] = save_lx;
                   3872:                                dsp_core.registers[DSP_REG_X0] = save_ly;
1.1.1.4   root     3873:                                break;
1.1.1.6   root     3874:                        case 3: /* Y */
                   3875:                                dsp_core.registers[DSP_REG_Y1] = save_lx;
                   3876:                                dsp_core.registers[DSP_REG_Y0] = save_ly;
1.1.1.4   root     3877:                                break;
1.1.1.6   root     3878:                        case 4: /* A */
                   3879:                                dsp_core.registers[DSP_REG_A0] = save_ly;
                   3880:                                dsp_core.registers[DSP_REG_A1] = save_lx;
                   3881:                                dsp_core.registers[DSP_REG_A2] = save_lx & (1<<23) ? 0xff : 0;
1.1.1.4   root     3882:                                break;
1.1.1.6   root     3883:                        case 5: /* B */
                   3884:                                dsp_core.registers[DSP_REG_B0] = save_ly;
                   3885:                                dsp_core.registers[DSP_REG_B1] = save_lx;
                   3886:                                dsp_core.registers[DSP_REG_B2] = save_lx & (1<<23) ? 0xff : 0;
1.1.1.4   root     3887:                                break;
1.1.1.6   root     3888:                        case 6: /* AB */
                   3889:                                dsp_core.registers[DSP_REG_A0] = 0;
                   3890:                                dsp_core.registers[DSP_REG_A1] = save_lx;
                   3891:                                dsp_core.registers[DSP_REG_A2] = save_lx & (1<<23) ? 0xff : 0;
                   3892:                                dsp_core.registers[DSP_REG_B0] = 0;
                   3893:                                dsp_core.registers[DSP_REG_B1] = save_ly;
                   3894:                                dsp_core.registers[DSP_REG_B2] = save_ly & (1<<23) ? 0xff : 0;
1.1.1.4   root     3895:                                break;
1.1.1.6   root     3896:                        case 7: /* BA */
                   3897:                                dsp_core.registers[DSP_REG_B0] = 0;
                   3898:                                dsp_core.registers[DSP_REG_B1] = save_lx;
                   3899:                                dsp_core.registers[DSP_REG_B2] = save_lx & (1<<23) ? 0xff : 0;
                   3900:                                dsp_core.registers[DSP_REG_A0] = 0;
                   3901:                                dsp_core.registers[DSP_REG_A1] = save_ly;
                   3902:                                dsp_core.registers[DSP_REG_A2] = save_ly & (1<<23) ? 0xff : 0;
1.1.1.4   root     3903:                                break;
1.1       root     3904:                }
1.1.1.6   root     3905:        }
                   3906:        else {
                   3907:                /* Read S */
                   3908:                write_memory(DSP_SPACE_X, l_addr, save_lx);
                   3909:                write_memory(DSP_SPACE_Y, l_addr, save_ly);
1.1       root     3910:        }
                   3911: }
                   3912: 
                   3913: static void dsp_pm_5(void)
                   3914: {
1.1.1.2   root     3915:        Uint32 memspace, numreg, value, xy_addr, retour;
1.1       root     3916: /*
1.1.1.4   root     3917:        01dd 0ddd w0aa aaaa                     x:aa,D
1.1       root     3918:                                                S,x:aa
1.1.1.4   root     3919:        01dd 0ddd w1mm mrrr                     x:ea,D
1.1       root     3920:                                                S,x:ea
                   3921:                                                #xxxxxx,D
1.1.1.4   root     3922:        01dd 1ddd w0aa aaaa                     y:aa,D
1.1       root     3923:                                                S,y:aa
1.1.1.4   root     3924:        01dd 1ddd w1mm mrrr                     y:ea,D
1.1       root     3925:                                                S,y:ea
                   3926:                                                #xxxxxx,D
                   3927: */
                   3928: 
                   3929:        value = (cur_inst>>8) & BITMASK(6);
                   3930: 
                   3931:        if (cur_inst & (1<<14)) {
1.1.1.11  root     3932:                retour = dsp_calc_ea(value, &xy_addr);
1.1       root     3933:        } else {
                   3934:                xy_addr = value;
                   3935:                retour = 0;
                   3936:        }
                   3937: 
                   3938:        memspace = (cur_inst>>19) & 1;
                   3939:        numreg = (cur_inst>>16) & BITMASK(3);
                   3940:        numreg |= (cur_inst>>17) & (BITMASK(2)<<3);
                   3941: 
                   3942:        if (cur_inst & (1<<15)) {
                   3943:                /* Write D */
1.1.1.6   root     3944:                if (retour)
1.1       root     3945:                        value = xy_addr;
1.1.1.6   root     3946:                else
1.1       root     3947:                        value = read_memory(memspace, xy_addr);
1.1.1.6   root     3948:        }
                   3949:        else {
1.1       root     3950:                /* Read S */
1.1.1.6   root     3951:                if ((numreg==DSP_REG_A) || (numreg==DSP_REG_B))
                   3952:                        dsp_pm_read_accu24(numreg, &value);
                   3953:                else
                   3954:                        value = dsp_core.registers[numreg];
                   3955:        }
1.1       root     3956: 
                   3957: 
1.1.1.6   root     3958:        /* Execute parallel instruction */
                   3959:        opcodes_alu[cur_inst & BITMASK(8)]();
1.1       root     3960: 
1.1.1.6   root     3961:        if (cur_inst & (1<<15)) {
                   3962:                /* Write D */
1.1.1.11  root     3963:                dsp_core.agu_move_indirect_instr = 1;
                   3964:                dsp_write_reg(numreg, value);
1.1.1.6   root     3965:        }
                   3966:        else {
1.1.1.7   root     3967:                /* Read S */
1.1.1.6   root     3968:                write_memory(memspace, xy_addr, value);
1.1       root     3969:        }
                   3970: }
                   3971: 
                   3972: static void dsp_pm_8(void)
                   3973: {
1.1.1.2   root     3974:        Uint32 ea1, ea2;
                   3975:        Uint32 numreg1, numreg2;
1.1.1.6   root     3976:        Uint32 save_reg1, save_reg2, x_addr, y_addr;
1.1       root     3977: /*
1.1.1.11  root     3978:        1wmm eeff WrrM MRRR                     x:ea,D1         y:ea,D2
1.1       root     3979:                                                x:ea,D1         S2,y:ea
                   3980:                                                S1,x:ea         y:ea,D2
                   3981:                                                S1,x:ea         S2,y:ea
                   3982: */
                   3983:        numreg1 = numreg2 = DSP_REG_NULL;
                   3984: 
                   3985:        ea1 = (cur_inst>>8) & BITMASK(5);
                   3986:        if ((ea1>>3) == 0) {
                   3987:                ea1 |= (1<<5);
                   3988:        }
                   3989:        ea2 = (cur_inst>>13) & BITMASK(2);
                   3990:        ea2 |= (cur_inst>>17) & (BITMASK(2)<<3);
                   3991:        if ((ea1 & (1<<2))==0) {
                   3992:                ea2 |= 1<<2;
                   3993:        }
                   3994:        if ((ea2>>3) == 0) {
                   3995:                ea2 |= (1<<5);
                   3996:        }
                   3997: 
1.1.1.4   root     3998:        dsp_calc_ea(ea1, &x_addr);
                   3999:        dsp_calc_ea(ea2, &y_addr);
                   4000: 
1.1       root     4001:        switch((cur_inst>>18) & BITMASK(2)) {
                   4002:                case 0: numreg1=DSP_REG_X0;     break;
                   4003:                case 1: numreg1=DSP_REG_X1;     break;
                   4004:                case 2: numreg1=DSP_REG_A;      break;
                   4005:                case 3: numreg1=DSP_REG_B;      break;
                   4006:        }
                   4007:        switch((cur_inst>>16) & BITMASK(2)) {
                   4008:                case 0: numreg2=DSP_REG_Y0;     break;
                   4009:                case 1: numreg2=DSP_REG_Y1;     break;
                   4010:                case 2: numreg2=DSP_REG_A;      break;
                   4011:                case 3: numreg2=DSP_REG_B;      break;
                   4012:        }
1.1.1.11  root     4013: 
1.1       root     4014:        if (cur_inst & (1<<15)) {
                   4015:                /* Write D1 */
1.1.1.6   root     4016:                save_reg1 = read_memory(DSP_SPACE_X, x_addr);
1.1       root     4017:        } else {
                   4018:                /* Read S1 */
1.1.1.6   root     4019:                if ((numreg1==DSP_REG_A) || (numreg1==DSP_REG_B))
                   4020:                        dsp_pm_read_accu24(numreg1, &save_reg1);
                   4021:                else
                   4022:                        save_reg1 = dsp_core.registers[numreg1];
1.1       root     4023:        }
                   4024: 
                   4025:        if (cur_inst & (1<<22)) {
                   4026:                /* Write D2 */
1.1.1.6   root     4027:                save_reg2 = read_memory(DSP_SPACE_Y, y_addr);
1.1       root     4028:        } else {
                   4029:                /* Read S2 */
1.1.1.6   root     4030:                if ((numreg2==DSP_REG_A) || (numreg2==DSP_REG_B))
                   4031:                        dsp_pm_read_accu24(numreg2, &save_reg2);
                   4032:                else
                   4033:                        save_reg2 = dsp_core.registers[numreg2];
1.1       root     4034:        }
                   4035: 
                   4036: 
1.1.1.6   root     4037:        /* Execute parallel instruction */
                   4038:        opcodes_alu[cur_inst & BITMASK(8)]();
1.1       root     4039: 
1.1.1.6   root     4040:        /* Write first parallel move */
                   4041:        if (cur_inst & (1<<15)) {
                   4042:                /* Write D1 */
                   4043:                if (numreg1 == DSP_REG_A) {
                   4044:                        dsp_core.registers[DSP_REG_A0] = 0x0;
                   4045:                        dsp_core.registers[DSP_REG_A1] = save_reg1;
                   4046:                        dsp_core.registers[DSP_REG_A2] = save_reg1 & (1<<23) ? 0xff : 0x0;
                   4047:                }
                   4048:                else if (numreg1 == DSP_REG_B) {
                   4049:                        dsp_core.registers[DSP_REG_B0] = 0x0;
                   4050:                        dsp_core.registers[DSP_REG_B1] = save_reg1;
                   4051:                        dsp_core.registers[DSP_REG_B2] = save_reg1 & (1<<23) ? 0xff : 0x0;
                   4052:                }
                   4053:                else {
                   4054:                        dsp_core.registers[numreg1] = save_reg1;
                   4055:                }
                   4056:        } else {
                   4057:                /* Read S1 */
                   4058:                write_memory(DSP_SPACE_X, x_addr, save_reg1);
                   4059:        }
                   4060: 
                   4061:        /* Write second parallel move */
                   4062:        if (cur_inst & (1<<22)) {
                   4063:                /* Write D2 */
                   4064:                if (numreg2 == DSP_REG_A) {
                   4065:                        dsp_core.registers[DSP_REG_A0] = 0x0;
                   4066:                        dsp_core.registers[DSP_REG_A1] = save_reg2;
                   4067:                        dsp_core.registers[DSP_REG_A2] = save_reg2 & (1<<23) ? 0xff : 0x0;
                   4068:                }
                   4069:                else if (numreg2 == DSP_REG_B) {
                   4070:                        dsp_core.registers[DSP_REG_B0] = 0x0;
                   4071:                        dsp_core.registers[DSP_REG_B1] = save_reg2;
                   4072:                        dsp_core.registers[DSP_REG_B2] = save_reg2 & (1<<23) ? 0xff : 0x0;
                   4073:                }
                   4074:                else {
                   4075:                        dsp_core.registers[numreg2] = save_reg2;
                   4076:                }
                   4077:        } else {
                   4078:                /* Read S2 */
                   4079:                write_memory(DSP_SPACE_Y, y_addr, save_reg2);
                   4080:        }
                   4081: }
                   4082: 
                   4083: /**********************************
                   4084:  *     56bit arithmetic
                   4085:  **********************************/
                   4086: 
                   4087: /* source,dest[0] is 55:48 */
                   4088: /* source,dest[1] is 47:24 */
                   4089: /* source,dest[2] is 23:00 */
                   4090: 
                   4091: static Uint16 dsp_abs56(Uint32 *dest)
1.1       root     4092: {
1.1.1.2   root     4093:        Uint32 zerodest[3];
                   4094:        Uint16 newsr;
1.1       root     4095: 
                   4096:        /* D=|D| */
                   4097: 
                   4098:        if (dest[0] & (1<<7)) {
                   4099:                zerodest[0] = zerodest[1] = zerodest[2] = 0;
                   4100: 
                   4101:                newsr = dsp_sub56(dest, zerodest);
                   4102: 
                   4103:                dest[0] = zerodest[0];
                   4104:                dest[1] = zerodest[1];
                   4105:                dest[2] = zerodest[2];
                   4106:        } else {
                   4107:                newsr = 0;
                   4108:        }
                   4109: 
                   4110:        return newsr;
                   4111: }
                   4112: 
1.1.1.2   root     4113: static Uint16 dsp_asl56(Uint32 *dest)
1.1       root     4114: {
1.1.1.2   root     4115:        Uint16 overflow, carry;
1.1       root     4116: 
                   4117:        /* Shift left dest 1 bit: D<<=1 */
                   4118: 
                   4119:        carry = (dest[0]>>7) & 1;
                   4120: 
                   4121:        dest[0] <<= 1;
                   4122:        dest[0] |= (dest[1]>>23) & 1;
                   4123:        dest[0] &= BITMASK(8);
                   4124: 
                   4125:        dest[1] <<= 1;
                   4126:        dest[1] |= (dest[2]>>23) & 1;
                   4127:        dest[1] &= BITMASK(24);
1.1.1.11  root     4128: 
1.1       root     4129:        dest[2] <<= 1;
                   4130:        dest[2] &= BITMASK(24);
                   4131: 
                   4132:        overflow = (carry != ((dest[0]>>7) & 1));
                   4133: 
                   4134:        return (overflow<<DSP_SR_L)|(overflow<<DSP_SR_V)|(carry<<DSP_SR_C);
                   4135: }
                   4136: 
1.1.1.2   root     4137: static Uint16 dsp_asr56(Uint32 *dest)
1.1       root     4138: {
1.1.1.2   root     4139:        Uint16 carry;
1.1       root     4140: 
                   4141:        /* Shift right dest 1 bit: D>>=1 */
                   4142: 
                   4143:        carry = dest[2] & 1;
                   4144: 
                   4145:        dest[2] >>= 1;
                   4146:        dest[2] |= (dest[1] & 1)<<23;
                   4147: 
                   4148:        dest[1] >>= 1;
                   4149:        dest[1] |= (dest[0] & 1)<<23;
                   4150: 
                   4151:        dest[0] >>= 1;
                   4152:        dest[0] |= (dest[0] & (1<<6))<<1;
                   4153: 
                   4154:        return (carry<<DSP_SR_C);
                   4155: }
                   4156: 
1.1.1.2   root     4157: static Uint16 dsp_add56(Uint32 *source, Uint32 *dest)
1.1       root     4158: {
1.1.1.4   root     4159:        Uint16 overflow, carry, flg_s, flg_d, flg_r;
                   4160: 
                   4161:        flg_s = (source[0]>>7) & 1;
                   4162:        flg_d = (dest[0]>>7) & 1;
                   4163: 
1.1       root     4164:        /* Add source to dest: D = D+S */
1.1.1.2   root     4165:        dest[2] += source[2];
                   4166:        dest[1] += source[1]+((dest[2]>>24) & 1);
                   4167:        dest[0] += source[0]+((dest[1]>>24) & 1);
1.1       root     4168: 
1.1.1.5   root     4169:        carry = (dest[0]>>8) & 1;
                   4170: 
1.1       root     4171:        dest[2] &= BITMASK(24);
                   4172:        dest[1] &= BITMASK(24);
                   4173:        dest[0] &= BITMASK(8);
                   4174: 
1.1.1.4   root     4175:        flg_r = (dest[0]>>7) & 1;
                   4176: 
                   4177:        /*set overflow*/
                   4178:        overflow = (flg_s ^ flg_r) & (flg_d ^ flg_r);
                   4179: 
1.1       root     4180:        return (overflow<<DSP_SR_L)|(overflow<<DSP_SR_V)|(carry<<DSP_SR_C);
                   4181: }
                   4182: 
1.1.1.2   root     4183: static Uint16 dsp_sub56(Uint32 *source, Uint32 *dest)
1.1       root     4184: {
1.1.1.5   root     4185:        Uint16 overflow, carry, flg_s, flg_d, flg_r, dest_save;
1.1.1.4   root     4186: 
1.1.1.5   root     4187:        dest_save = dest[0];
1.1       root     4188: 
1.1.1.9   root     4189:        /* Subtract source from dest: D = D-S */
1.1.1.2   root     4190:        dest[2] -= source[2];
                   4191:        dest[1] -= source[1]+((dest[2]>>24) & 1);
                   4192:        dest[0] -= source[0]+((dest[1]>>24) & 1);
1.1       root     4193: 
1.1.1.5   root     4194:        carry = (dest[0]>>8) & 1;
                   4195: 
1.1       root     4196:        dest[2] &= BITMASK(24);
                   4197:        dest[1] &= BITMASK(24);
                   4198:        dest[0] &= BITMASK(8);
                   4199: 
1.1.1.4   root     4200:        flg_s = (source[0]>>7) & 1;
1.1.1.5   root     4201:        flg_d = (dest_save>>7) & 1;
1.1.1.4   root     4202:        flg_r = (dest[0]>>7) & 1;
                   4203: 
                   4204:        /* set overflow */
                   4205:        overflow = (flg_s ^ flg_d) & (flg_r ^ flg_d);
                   4206: 
1.1       root     4207:        return (overflow<<DSP_SR_L)|(overflow<<DSP_SR_V)|(carry<<DSP_SR_C);
                   4208: }
                   4209: 
1.1.1.5   root     4210: static void dsp_mul56(Uint32 source1, Uint32 source2, Uint32 *dest, Uint8 signe)
1.1       root     4211: {
1.1.1.2   root     4212:        Uint32 part[4], zerodest[3], value;
1.1       root     4213: 
                   4214:        /* Multiply: D = S1*S2 */
                   4215:        if (source1 & (1<<23)) {
1.1.1.5   root     4216:                signe ^= 1;
1.1.1.6   root     4217:                source1 = (1<<24) - source1;
1.1       root     4218:        }
                   4219:        if (source2 & (1<<23)) {
1.1.1.5   root     4220:                signe ^= 1;
1.1.1.6   root     4221:                source2 = (1<<24) - source2;
1.1       root     4222:        }
                   4223: 
                   4224:        /* bits 0-11 * bits 0-11 */
                   4225:        part[0]=(source1 & BITMASK(12))*(source2 & BITMASK(12));
                   4226:        /* bits 12-23 * bits 0-11 */
                   4227:        part[1]=((source1>>12) & BITMASK(12))*(source2 & BITMASK(12));
                   4228:        /* bits 0-11 * bits 12-23 */
                   4229:        part[2]=(source1 & BITMASK(12))*((source2>>12)  & BITMASK(12));
                   4230:        /* bits 12-23 * bits 12-23 */
                   4231:        part[3]=((source1>>12) & BITMASK(12))*((source2>>12) & BITMASK(12));
                   4232: 
                   4233:        /* Calc dest 2 */
                   4234:        dest[2] = part[0];
                   4235:        dest[2] += (part[1] & BITMASK(12)) << 12;
                   4236:        dest[2] += (part[2] & BITMASK(12)) << 12;
                   4237: 
                   4238:        /* Calc dest 1 */
                   4239:        dest[1] = (part[1]>>12) & BITMASK(12);
                   4240:        dest[1] += (part[2]>>12) & BITMASK(12);
                   4241:        dest[1] += part[3];
                   4242: 
                   4243:        /* Calc dest 0 */
                   4244:        dest[0] = 0;
                   4245: 
                   4246:        /* Add carries */
                   4247:        value = (dest[2]>>24) & BITMASK(8);
                   4248:        if (value) {
                   4249:                dest[1] += value;
                   4250:                dest[2] &= BITMASK(24);
                   4251:        }
                   4252:        value = (dest[1]>>24) & BITMASK(8);
                   4253:        if (value) {
                   4254:                dest[0] += value;
                   4255:                dest[1] &= BITMASK(24);
                   4256:        }
                   4257: 
                   4258:        /* Get rid of extra sign bit */
                   4259:        dsp_asl56(dest);
                   4260: 
1.1.1.5   root     4261:        if (signe) {
1.1       root     4262:                zerodest[0] = zerodest[1] = zerodest[2] = 0;
                   4263: 
                   4264:                dsp_sub56(dest, zerodest);
                   4265: 
                   4266:                dest[0] = zerodest[0];
                   4267:                dest[1] = zerodest[1];
                   4268:                dest[2] = zerodest[2];
                   4269:        }
                   4270: }
                   4271: 
1.1.1.2   root     4272: static void dsp_rnd56(Uint32 *dest)
1.1       root     4273: {
1.1.1.4   root     4274:        Uint32 rnd_const[3];
1.1       root     4275: 
1.1.1.4   root     4276:        rnd_const[0] = 0;
1.1       root     4277: 
1.1.1.4   root     4278:        /* Scaling mode S0 */
1.1.1.6   root     4279:        if (dsp_core.registers[DSP_REG_SR] & (1<<DSP_SR_S0)) {
1.1.1.4   root     4280:                rnd_const[1] = 1;
                   4281:                rnd_const[2] = 0;
                   4282:                dsp_add56(rnd_const, dest);
                   4283: 
                   4284:                if ((dest[2]==0) && ((dest[1] & 1) == 0)) {
                   4285:                        dest[1] &= (0xffffff - 0x3);
                   4286:                }
                   4287:                dest[1] &= 0xfffffe;
                   4288:                dest[2]=0;
                   4289:        }
                   4290:        /* Scaling mode S1 */
1.1.1.6   root     4291:        else if (dsp_core.registers[DSP_REG_SR] & (1<<DSP_SR_S1)) {
1.1.1.4   root     4292:                rnd_const[1] = 0;
                   4293:                rnd_const[2] = (1<<22);
                   4294:                dsp_add56(rnd_const, dest);
1.1.1.11  root     4295: 
1.1.1.4   root     4296:                if ((dest[2] & 0x7fffff) == 0){
                   4297:                        dest[2] = 0;
                   4298:                }
                   4299:                dest[2] &= 0x800000;
                   4300:        }
                   4301:        /* No Scaling */
                   4302:        else {
                   4303:                rnd_const[1] = 0;
                   4304:                rnd_const[2] = (1<<23);
                   4305:                dsp_add56(rnd_const, dest);
                   4306: 
                   4307:                if (dest[2] == 0) {
                   4308:                        dest[1] &= 0xfffffe;
1.1       root     4309:                }
1.1.1.4   root     4310:                dest[2]=0;
1.1       root     4311:        }
                   4312: }
                   4313: 
                   4314: /**********************************
                   4315:  *     Parallel moves instructions
                   4316:  **********************************/
                   4317: 
1.1.1.6   root     4318: static void dsp_abs_a(void)
1.1       root     4319: {
1.1.1.6   root     4320:        Uint32 dest[3], overflowed;
1.1       root     4321: 
1.1.1.6   root     4322:        dest[0] = dsp_core.registers[DSP_REG_A2];
                   4323:        dest[1] = dsp_core.registers[DSP_REG_A1];
                   4324:        dest[2] = dsp_core.registers[DSP_REG_A0];
                   4325: 
                   4326:        overflowed = ((dest[2]==0) && (dest[1]==0) && (dest[0]==0x80));
                   4327: 
                   4328:        dsp_abs56(dest);
                   4329: 
                   4330:        dsp_core.registers[DSP_REG_A2] = dest[0];
                   4331:        dsp_core.registers[DSP_REG_A1] = dest[1];
                   4332:        dsp_core.registers[DSP_REG_A0] = dest[2];
                   4333: 
                   4334:        dsp_core.registers[DSP_REG_SR] &= BITMASK(16)-(1<<DSP_SR_V);
                   4335:        dsp_core.registers[DSP_REG_SR] |= (overflowed<<DSP_SR_L)|(overflowed<<DSP_SR_V);
                   4336: 
                   4337:        dsp_ccr_update_e_u_n_z(dest[0], dest[1], dest[2]);
                   4338: }
                   4339: 
                   4340: static void dsp_abs_b(void)
                   4341: {
                   4342:        Uint32 dest[3], overflowed;
1.1       root     4343: 
1.1.1.6   root     4344:        dest[0] = dsp_core.registers[DSP_REG_B2];
                   4345:        dest[1] = dsp_core.registers[DSP_REG_B1];
                   4346:        dest[2] = dsp_core.registers[DSP_REG_B0];
1.1       root     4347: 
                   4348:        overflowed = ((dest[2]==0) && (dest[1]==0) && (dest[0]==0x80));
                   4349: 
                   4350:        dsp_abs56(dest);
                   4351: 
1.1.1.6   root     4352:        dsp_core.registers[DSP_REG_B2] = dest[0];
                   4353:        dsp_core.registers[DSP_REG_B1] = dest[1];
                   4354:        dsp_core.registers[DSP_REG_B0] = dest[2];
1.1.1.2   root     4355: 
1.1.1.6   root     4356:        dsp_core.registers[DSP_REG_SR] &= BITMASK(16)-(1<<DSP_SR_V);
                   4357:        dsp_core.registers[DSP_REG_SR] |= (overflowed<<DSP_SR_L)|(overflowed<<DSP_SR_V);
1.1.1.2   root     4358: 
1.1.1.6   root     4359:        dsp_ccr_update_e_u_n_z(dest[0], dest[1], dest[2]);
1.1       root     4360: }
                   4361: 
1.1.1.6   root     4362: static void dsp_adc_x_a(void)
1.1       root     4363: {
1.1.1.6   root     4364:        Uint32 source[3], dest[3], curcarry;
1.1.1.2   root     4365:        Uint16 newsr;
1.1       root     4366: 
1.1.1.6   root     4367:        curcarry = (dsp_core.registers[DSP_REG_SR]>>DSP_SR_C) & 1;
1.1       root     4368: 
1.1.1.6   root     4369:        dest[0] = dsp_core.registers[DSP_REG_A2];
                   4370:        dest[1] = dsp_core.registers[DSP_REG_A1];
                   4371:        dest[2] = dsp_core.registers[DSP_REG_A0];
                   4372: 
                   4373:        source[2] = dsp_core.registers[DSP_REG_X0];
                   4374:        source[1] = dsp_core.registers[DSP_REG_X1];
1.1.1.7   root     4375:        source[0] = source[1] & (1<<23) ? 0xff : 0x0;
1.1       root     4376: 
                   4377:        newsr = dsp_add56(source, dest);
1.1.1.11  root     4378: 
1.1       root     4379:        if (curcarry) {
1.1.1.6   root     4380:                source[0]=0; source[1]=0; source[2]=1;
1.1       root     4381:                newsr |= dsp_add56(source, dest);
                   4382:        }
                   4383: 
1.1.1.6   root     4384:        dsp_core.registers[DSP_REG_A2] = dest[0];
                   4385:        dsp_core.registers[DSP_REG_A1] = dest[1];
                   4386:        dsp_core.registers[DSP_REG_A0] = dest[2];
1.1.1.2   root     4387: 
1.1.1.6   root     4388:        dsp_ccr_update_e_u_n_z(dest[0], dest[1], dest[2]);
1.1       root     4389: 
1.1.1.6   root     4390:        dsp_core.registers[DSP_REG_SR] &= BITMASK(16)-((1<<DSP_SR_V)|(1<<DSP_SR_C));
                   4391:        dsp_core.registers[DSP_REG_SR] |= newsr;
1.1       root     4392: }
                   4393: 
1.1.1.6   root     4394: static void dsp_adc_x_b(void)
1.1       root     4395: {
1.1.1.6   root     4396:        Uint32 source[3], dest[3], curcarry;
1.1.1.2   root     4397:        Uint16 newsr;
1.1       root     4398: 
1.1.1.6   root     4399:        curcarry = (dsp_core.registers[DSP_REG_SR]>>DSP_SR_C) & 1;
                   4400: 
                   4401:        dest[0] = dsp_core.registers[DSP_REG_B2];
                   4402:        dest[1] = dsp_core.registers[DSP_REG_B1];
                   4403:        dest[2] = dsp_core.registers[DSP_REG_B0];
                   4404: 
                   4405:        source[2] = dsp_core.registers[DSP_REG_X0];
                   4406:        source[1] = dsp_core.registers[DSP_REG_X1];
1.1.1.7   root     4407:        source[0] = source[1] & (1<<23) ? 0xff : 0x0;
1.1       root     4408: 
                   4409:        newsr = dsp_add56(source, dest);
1.1.1.11  root     4410: 
1.1.1.6   root     4411:        if (curcarry) {
                   4412:                source[0]=0; source[1]=0; source[2]=1;
                   4413:                newsr |= dsp_add56(source, dest);
                   4414:        }
1.1       root     4415: 
1.1.1.6   root     4416:        dsp_core.registers[DSP_REG_B2] = dest[0];
                   4417:        dsp_core.registers[DSP_REG_B1] = dest[1];
                   4418:        dsp_core.registers[DSP_REG_B0] = dest[2];
1.1.1.2   root     4419: 
1.1.1.6   root     4420:        dsp_ccr_update_e_u_n_z(dest[0], dest[1], dest[2]);
1.1       root     4421: 
1.1.1.6   root     4422:        dsp_core.registers[DSP_REG_SR] &= BITMASK(16)-((1<<DSP_SR_V)|(1<<DSP_SR_C));
                   4423:        dsp_core.registers[DSP_REG_SR] |= newsr;
1.1       root     4424: }
                   4425: 
1.1.1.6   root     4426: static void dsp_adc_y_a(void)
1.1       root     4427: {
1.1.1.6   root     4428:        Uint32 source[3], dest[3], curcarry;
1.1.1.2   root     4429:        Uint16 newsr;
1.1       root     4430: 
1.1.1.6   root     4431:        curcarry = (dsp_core.registers[DSP_REG_SR]>>DSP_SR_C) & 1;
1.1       root     4432: 
1.1.1.6   root     4433:        dest[0] = dsp_core.registers[DSP_REG_A2];
                   4434:        dest[1] = dsp_core.registers[DSP_REG_A1];
                   4435:        dest[2] = dsp_core.registers[DSP_REG_A0];
                   4436: 
                   4437:        source[2] = dsp_core.registers[DSP_REG_Y0];
                   4438:        source[1] = dsp_core.registers[DSP_REG_Y1];
1.1.1.7   root     4439:        source[0] = source[1] & (1<<23) ? 0xff : 0x0;
1.1       root     4440: 
1.1.1.6   root     4441:        newsr = dsp_add56(source, dest);
1.1.1.11  root     4442: 
1.1.1.6   root     4443:        if (curcarry) {
                   4444:                source[0]=0; source[1]=0; source[2]=1;
                   4445:                newsr |= dsp_add56(source, dest);
                   4446:        }
1.1       root     4447: 
1.1.1.6   root     4448:        dsp_core.registers[DSP_REG_A2] = dest[0];
                   4449:        dsp_core.registers[DSP_REG_A1] = dest[1];
                   4450:        dsp_core.registers[DSP_REG_A0] = dest[2];
1.1.1.2   root     4451: 
1.1.1.6   root     4452:        dsp_ccr_update_e_u_n_z(dest[0], dest[1], dest[2]);
1.1       root     4453: 
1.1.1.6   root     4454:        dsp_core.registers[DSP_REG_SR] &= BITMASK(16)-((1<<DSP_SR_V)|(1<<DSP_SR_C));
                   4455:        dsp_core.registers[DSP_REG_SR] |= newsr;
1.1       root     4456: }
                   4457: 
1.1.1.6   root     4458: static void dsp_adc_y_b(void)
1.1       root     4459: {
1.1.1.6   root     4460:        Uint32 source[3], dest[3], curcarry;
1.1.1.2   root     4461:        Uint16 newsr;
1.1       root     4462: 
1.1.1.6   root     4463:        curcarry = (dsp_core.registers[DSP_REG_SR]>>DSP_SR_C) & 1;
1.1       root     4464: 
1.1.1.6   root     4465:        dest[0] = dsp_core.registers[DSP_REG_B2];
                   4466:        dest[1] = dsp_core.registers[DSP_REG_B1];
                   4467:        dest[2] = dsp_core.registers[DSP_REG_B0];
                   4468: 
                   4469:        source[2] = dsp_core.registers[DSP_REG_Y0];
                   4470:        source[1] = dsp_core.registers[DSP_REG_Y1];
1.1.1.7   root     4471:        source[0] = source[1] & (1<<23) ? 0xff : 0x0;
1.1       root     4472: 
1.1.1.6   root     4473:        newsr = dsp_add56(source, dest);
1.1.1.11  root     4474: 
1.1.1.6   root     4475:        if (curcarry) {
                   4476:                source[0]=0; source[1]=0; source[2]=1;
                   4477:                newsr |= dsp_add56(source, dest);
                   4478:        }
1.1       root     4479: 
1.1.1.6   root     4480:        dsp_core.registers[DSP_REG_B2] = dest[0];
                   4481:        dsp_core.registers[DSP_REG_B1] = dest[1];
                   4482:        dsp_core.registers[DSP_REG_B0] = dest[2];
1.1.1.2   root     4483: 
1.1.1.6   root     4484:        dsp_ccr_update_e_u_n_z(dest[0], dest[1], dest[2]);
1.1       root     4485: 
1.1.1.6   root     4486:        dsp_core.registers[DSP_REG_SR] &= BITMASK(16)-((1<<DSP_SR_V)|(1<<DSP_SR_C));
                   4487:        dsp_core.registers[DSP_REG_SR] |= newsr;
1.1       root     4488: }
                   4489: 
1.1.1.6   root     4490: static void dsp_add_b_a(void)
1.1       root     4491: {
1.1.1.6   root     4492:        Uint32 source[3], dest[3];
                   4493:        Uint16 newsr;
1.1       root     4494: 
1.1.1.6   root     4495:        dest[0] = dsp_core.registers[DSP_REG_A2];
                   4496:        dest[1] = dsp_core.registers[DSP_REG_A1];
                   4497:        dest[2] = dsp_core.registers[DSP_REG_A0];
                   4498: 
                   4499:        source[0] = dsp_core.registers[DSP_REG_B2];
                   4500:        source[1] = dsp_core.registers[DSP_REG_B1];
                   4501:        source[2] = dsp_core.registers[DSP_REG_B0];
                   4502: 
                   4503:        newsr = dsp_add56(source, dest);
                   4504: 
                   4505:        dsp_core.registers[DSP_REG_A2] = dest[0];
                   4506:        dsp_core.registers[DSP_REG_A1] = dest[1];
                   4507:        dsp_core.registers[DSP_REG_A0] = dest[2];
1.1       root     4508: 
1.1.1.6   root     4509:        dsp_ccr_update_e_u_n_z(dest[0], dest[1], dest[2]);
1.1       root     4510: 
1.1.1.6   root     4511:        dsp_core.registers[DSP_REG_SR] &= BITMASK(16)-((1<<DSP_SR_V)|(1<<DSP_SR_C));
                   4512:        dsp_core.registers[DSP_REG_SR] |= newsr;
1.1       root     4513: }
                   4514: 
1.1.1.6   root     4515: static void dsp_add_a_b(void)
1.1       root     4516: {
1.1.1.6   root     4517:        Uint32 source[3], dest[3];
1.1.1.2   root     4518:        Uint16 newsr;
1.1       root     4519: 
1.1.1.6   root     4520:        dest[0] = dsp_core.registers[DSP_REG_B2];
                   4521:        dest[1] = dsp_core.registers[DSP_REG_B1];
                   4522:        dest[2] = dsp_core.registers[DSP_REG_B0];
                   4523: 
                   4524:        source[0] = dsp_core.registers[DSP_REG_A2];
                   4525:        source[1] = dsp_core.registers[DSP_REG_A1];
                   4526:        source[2] = dsp_core.registers[DSP_REG_A0];
1.1       root     4527: 
1.1.1.6   root     4528:        newsr = dsp_add56(source, dest);
1.1       root     4529: 
1.1.1.6   root     4530:        dsp_core.registers[DSP_REG_B2] = dest[0];
                   4531:        dsp_core.registers[DSP_REG_B1] = dest[1];
                   4532:        dsp_core.registers[DSP_REG_B0] = dest[2];
1.1.1.2   root     4533: 
1.1.1.6   root     4534:        dsp_ccr_update_e_u_n_z(dest[0], dest[1], dest[2]);
1.1.1.2   root     4535: 
1.1.1.6   root     4536:        dsp_core.registers[DSP_REG_SR] &= BITMASK(16)-((1<<DSP_SR_V)|(1<<DSP_SR_C));
                   4537:        dsp_core.registers[DSP_REG_SR] |= newsr;
1.1       root     4538: }
                   4539: 
1.1.1.6   root     4540: static void dsp_add_x_a(void)
1.1       root     4541: {
1.1.1.6   root     4542:        Uint32 source[3], dest[3];
                   4543:        Uint16 newsr;
1.1       root     4544: 
1.1.1.6   root     4545:        dest[0] = dsp_core.registers[DSP_REG_A2];
                   4546:        dest[1] = dsp_core.registers[DSP_REG_A1];
                   4547:        dest[2] = dsp_core.registers[DSP_REG_A0];
                   4548: 
                   4549:        source[1] = dsp_core.registers[DSP_REG_X1];
                   4550:        source[2] = dsp_core.registers[DSP_REG_X0];
1.1.1.7   root     4551:        source[0] = source[1] & (1<<23) ? 0xff : 0x0;
1.1       root     4552: 
1.1.1.6   root     4553:        newsr = dsp_add56(source, dest);
1.1       root     4554: 
1.1.1.6   root     4555:        dsp_core.registers[DSP_REG_A2] = dest[0];
                   4556:        dsp_core.registers[DSP_REG_A1] = dest[1];
                   4557:        dsp_core.registers[DSP_REG_A0] = dest[2];
1.1.1.2   root     4558: 
1.1.1.6   root     4559:        dsp_ccr_update_e_u_n_z(dest[0], dest[1], dest[2]);
1.1.1.2   root     4560: 
1.1.1.6   root     4561:        dsp_core.registers[DSP_REG_SR] &= BITMASK(16)-((1<<DSP_SR_V)|(1<<DSP_SR_C));
                   4562:        dsp_core.registers[DSP_REG_SR] |= newsr;
1.1       root     4563: }
                   4564: 
1.1.1.6   root     4565: static void dsp_add_x_b(void)
1.1       root     4566: {
1.1.1.6   root     4567:        Uint32 source[3], dest[3];
                   4568:        Uint16 newsr;
1.1       root     4569: 
1.1.1.6   root     4570:        dest[0] = dsp_core.registers[DSP_REG_B2];
                   4571:        dest[1] = dsp_core.registers[DSP_REG_B1];
                   4572:        dest[2] = dsp_core.registers[DSP_REG_B0];
                   4573: 
                   4574:        source[1] = dsp_core.registers[DSP_REG_X1];
                   4575:        source[2] = dsp_core.registers[DSP_REG_X0];
1.1.1.7   root     4576:        source[0] = source[1] & (1<<23) ? 0xff : 0x0;
1.1.1.6   root     4577: 
                   4578:        newsr = dsp_add56(source, dest);
1.1       root     4579: 
1.1.1.6   root     4580:        dsp_core.registers[DSP_REG_B2] = dest[0];
                   4581:        dsp_core.registers[DSP_REG_B1] = dest[1];
                   4582:        dsp_core.registers[DSP_REG_B0] = dest[2];
1.1       root     4583: 
1.1.1.6   root     4584:        dsp_ccr_update_e_u_n_z(dest[0], dest[1], dest[2]);
                   4585: 
                   4586:        dsp_core.registers[DSP_REG_SR] &= BITMASK(16)-((1<<DSP_SR_V)|(1<<DSP_SR_C));
                   4587:        dsp_core.registers[DSP_REG_SR] |= newsr;
1.1       root     4588: }
                   4589: 
1.1.1.6   root     4590: static void dsp_add_y_a(void)
1.1       root     4591: {
1.1.1.6   root     4592:        Uint32 source[3], dest[3];
1.1.1.2   root     4593:        Uint16 newsr;
1.1       root     4594: 
1.1.1.6   root     4595:        dest[0] = dsp_core.registers[DSP_REG_A2];
                   4596:        dest[1] = dsp_core.registers[DSP_REG_A1];
                   4597:        dest[2] = dsp_core.registers[DSP_REG_A0];
                   4598: 
                   4599:        source[1] = dsp_core.registers[DSP_REG_Y1];
                   4600:        source[2] = dsp_core.registers[DSP_REG_Y0];
1.1.1.7   root     4601:        source[0] = source[1] & (1<<23) ? 0xff : 0x0;
1.1       root     4602: 
1.1.1.6   root     4603:        newsr = dsp_add56(source, dest);
1.1       root     4604: 
1.1.1.6   root     4605:        dsp_core.registers[DSP_REG_A2] = dest[0];
                   4606:        dsp_core.registers[DSP_REG_A1] = dest[1];
                   4607:        dsp_core.registers[DSP_REG_A0] = dest[2];
1.1       root     4608: 
1.1.1.6   root     4609:        dsp_ccr_update_e_u_n_z(dest[0], dest[1], dest[2]);
                   4610: 
                   4611:        dsp_core.registers[DSP_REG_SR] &= BITMASK(16)-((1<<DSP_SR_V)|(1<<DSP_SR_C));
                   4612:        dsp_core.registers[DSP_REG_SR] |= newsr;
1.1       root     4613: }
                   4614: 
1.1.1.6   root     4615: static void dsp_add_y_b(void)
1.1       root     4616: {
1.1.1.6   root     4617:        Uint32 source[3], dest[3];
1.1.1.2   root     4618:        Uint16 newsr;
1.1       root     4619: 
1.1.1.6   root     4620:        dest[0] = dsp_core.registers[DSP_REG_B2];
                   4621:        dest[1] = dsp_core.registers[DSP_REG_B1];
                   4622:        dest[2] = dsp_core.registers[DSP_REG_B0];
                   4623: 
                   4624:        source[1] = dsp_core.registers[DSP_REG_Y1];
                   4625:        source[2] = dsp_core.registers[DSP_REG_Y0];
1.1.1.7   root     4626:        source[0] = source[1] & (1<<23) ? 0xff : 0x0;
1.1       root     4627: 
1.1.1.6   root     4628:        newsr = dsp_add56(source, dest);
1.1       root     4629: 
1.1.1.6   root     4630:        dsp_core.registers[DSP_REG_B2] = dest[0];
                   4631:        dsp_core.registers[DSP_REG_B1] = dest[1];
                   4632:        dsp_core.registers[DSP_REG_B0] = dest[2];
1.1       root     4633: 
1.1.1.6   root     4634:        dsp_ccr_update_e_u_n_z(dest[0], dest[1], dest[2]);
1.1       root     4635: 
1.1.1.6   root     4636:        dsp_core.registers[DSP_REG_SR] &= BITMASK(16)-((1<<DSP_SR_V)|(1<<DSP_SR_C));
                   4637:        dsp_core.registers[DSP_REG_SR] |= newsr;
1.1       root     4638: }
                   4639: 
1.1.1.6   root     4640: static void dsp_add_x0_a(void)
1.1       root     4641: {
1.1.1.6   root     4642:        Uint32 source[3], dest[3];
                   4643:        Uint16 newsr;
1.1       root     4644: 
1.1.1.6   root     4645:        dest[0] = dsp_core.registers[DSP_REG_A2];
                   4646:        dest[1] = dsp_core.registers[DSP_REG_A1];
                   4647:        dest[2] = dsp_core.registers[DSP_REG_A0];
                   4648: 
                   4649:        source[2] = 0;
                   4650:        source[1] = dsp_core.registers[DSP_REG_X0];
1.1.1.7   root     4651:        source[0] = source[1] & (1<<23) ? 0xff : 0x0;
1.1.1.6   root     4652: 
                   4653:        newsr = dsp_add56(source, dest);
                   4654: 
                   4655:        dsp_core.registers[DSP_REG_A2] = dest[0];
                   4656:        dsp_core.registers[DSP_REG_A1] = dest[1];
                   4657:        dsp_core.registers[DSP_REG_A0] = dest[2];
1.1       root     4658: 
1.1.1.6   root     4659:        dsp_ccr_update_e_u_n_z(dest[0], dest[1], dest[2]);
1.1       root     4660: 
1.1.1.6   root     4661:        dsp_core.registers[DSP_REG_SR] &= BITMASK(16)-((1<<DSP_SR_V)|(1<<DSP_SR_C));
                   4662:        dsp_core.registers[DSP_REG_SR] |= newsr;
1.1       root     4663: }
                   4664: 
1.1.1.6   root     4665: static void dsp_add_x0_b(void)
1.1       root     4666: {
1.1.1.6   root     4667:        Uint32 source[3], dest[3];
                   4668:        Uint16 newsr;
                   4669: 
                   4670:        dest[0] = dsp_core.registers[DSP_REG_B2];
                   4671:        dest[1] = dsp_core.registers[DSP_REG_B1];
                   4672:        dest[2] = dsp_core.registers[DSP_REG_B0];
                   4673: 
                   4674:        source[2] = 0;
                   4675:        source[1] = dsp_core.registers[DSP_REG_X0];
1.1.1.7   root     4676:        source[0] = source[1] & (1<<23) ? 0xff : 0x0;
1.1       root     4677: 
1.1.1.6   root     4678:        newsr = dsp_add56(source, dest);
1.1       root     4679: 
1.1.1.6   root     4680:        dsp_core.registers[DSP_REG_B2] = dest[0];
                   4681:        dsp_core.registers[DSP_REG_B1] = dest[1];
                   4682:        dsp_core.registers[DSP_REG_B0] = dest[2];
1.1       root     4683: 
1.1.1.6   root     4684:        dsp_ccr_update_e_u_n_z(dest[0], dest[1], dest[2]);
1.1       root     4685: 
1.1.1.6   root     4686:        dsp_core.registers[DSP_REG_SR] &= BITMASK(16)-((1<<DSP_SR_V)|(1<<DSP_SR_C));
                   4687:        dsp_core.registers[DSP_REG_SR] |= newsr;
1.1       root     4688: }
                   4689: 
1.1.1.6   root     4690: static void dsp_add_y0_a(void)
1.1       root     4691: {
1.1.1.6   root     4692:        Uint32 source[3], dest[3];
                   4693:        Uint16 newsr;
1.1       root     4694: 
1.1.1.6   root     4695:        dest[0] = dsp_core.registers[DSP_REG_A2];
                   4696:        dest[1] = dsp_core.registers[DSP_REG_A1];
                   4697:        dest[2] = dsp_core.registers[DSP_REG_A0];
                   4698: 
                   4699:        source[2] = 0;
                   4700:        source[1] = dsp_core.registers[DSP_REG_Y0];
1.1.1.7   root     4701:        source[0] = source[1] & (1<<23) ? 0xff : 0x0;
1.1       root     4702: 
1.1.1.6   root     4703:        newsr = dsp_add56(source, dest);
                   4704: 
                   4705:        dsp_core.registers[DSP_REG_A2] = dest[0];
                   4706:        dsp_core.registers[DSP_REG_A1] = dest[1];
                   4707:        dsp_core.registers[DSP_REG_A0] = dest[2];
1.1       root     4708: 
1.1.1.6   root     4709:        dsp_ccr_update_e_u_n_z(dest[0], dest[1], dest[2]);
1.1       root     4710: 
1.1.1.6   root     4711:        dsp_core.registers[DSP_REG_SR] &= BITMASK(16)-((1<<DSP_SR_V)|(1<<DSP_SR_C));
                   4712:        dsp_core.registers[DSP_REG_SR] |= newsr;
1.1       root     4713: }
                   4714: 
1.1.1.6   root     4715: static void dsp_add_y0_b(void)
1.1       root     4716: {
1.1.1.6   root     4717:        Uint32 source[3], dest[3];
1.1.1.2   root     4718:        Uint16 newsr;
1.1       root     4719: 
1.1.1.6   root     4720:        dest[0] = dsp_core.registers[DSP_REG_B2];
                   4721:        dest[1] = dsp_core.registers[DSP_REG_B1];
                   4722:        dest[2] = dsp_core.registers[DSP_REG_B0];
                   4723: 
                   4724:        source[2] = 0;
                   4725:        source[1] = dsp_core.registers[DSP_REG_Y0];
1.1.1.7   root     4726:        source[0] = source[1] & (1<<23) ? 0xff : 0x0;
1.1       root     4727: 
                   4728:        newsr = dsp_add56(source, dest);
                   4729: 
1.1.1.6   root     4730:        dsp_core.registers[DSP_REG_B2] = dest[0];
                   4731:        dsp_core.registers[DSP_REG_B1] = dest[1];
                   4732:        dsp_core.registers[DSP_REG_B0] = dest[2];
1.1.1.2   root     4733: 
1.1.1.6   root     4734:        dsp_ccr_update_e_u_n_z(dest[0], dest[1], dest[2]);
1.1       root     4735: 
1.1.1.6   root     4736:        dsp_core.registers[DSP_REG_SR] &= BITMASK(16)-((1<<DSP_SR_V)|(1<<DSP_SR_C));
                   4737:        dsp_core.registers[DSP_REG_SR] |= newsr;
1.1       root     4738: }
                   4739: 
1.1.1.6   root     4740: static void dsp_add_x1_a(void)
1.1       root     4741: {
1.1.1.6   root     4742:        Uint32 source[3], dest[3];
1.1.1.2   root     4743:        Uint16 newsr;
1.1       root     4744: 
1.1.1.6   root     4745:        dest[0] = dsp_core.registers[DSP_REG_A2];
                   4746:        dest[1] = dsp_core.registers[DSP_REG_A1];
                   4747:        dest[2] = dsp_core.registers[DSP_REG_A0];
                   4748: 
                   4749:        source[2] = 0;
                   4750:        source[1] = dsp_core.registers[DSP_REG_X1];
1.1.1.7   root     4751:        source[0] = source[1] & (1<<23) ? 0xff : 0x0;
1.1       root     4752: 
                   4753:        newsr = dsp_add56(source, dest);
                   4754: 
1.1.1.6   root     4755:        dsp_core.registers[DSP_REG_A2] = dest[0];
                   4756:        dsp_core.registers[DSP_REG_A1] = dest[1];
                   4757:        dsp_core.registers[DSP_REG_A0] = dest[2];
1.1.1.2   root     4758: 
1.1.1.6   root     4759:        dsp_ccr_update_e_u_n_z(dest[0], dest[1], dest[2]);
1.1       root     4760: 
1.1.1.6   root     4761:        dsp_core.registers[DSP_REG_SR] &= BITMASK(16)-((1<<DSP_SR_V)|(1<<DSP_SR_C));
                   4762:        dsp_core.registers[DSP_REG_SR] |= newsr;
1.1       root     4763: }
                   4764: 
1.1.1.6   root     4765: static void dsp_add_x1_b(void)
1.1       root     4766: {
1.1.1.6   root     4767:        Uint32 source[3], dest[3];
                   4768:        Uint16 newsr;
                   4769: 
                   4770:        dest[0] = dsp_core.registers[DSP_REG_B2];
                   4771:        dest[1] = dsp_core.registers[DSP_REG_B1];
                   4772:        dest[2] = dsp_core.registers[DSP_REG_B0];
                   4773: 
                   4774:        source[2] = 0;
                   4775:        source[1] = dsp_core.registers[DSP_REG_X1];
1.1.1.7   root     4776:        source[0] = source[1] & (1<<23) ? 0xff : 0x0;
1.1.1.6   root     4777: 
                   4778:        newsr = dsp_add56(source, dest);
                   4779: 
                   4780:        dsp_core.registers[DSP_REG_B2] = dest[0];
                   4781:        dsp_core.registers[DSP_REG_B1] = dest[1];
                   4782:        dsp_core.registers[DSP_REG_B0] = dest[2];
                   4783: 
                   4784:        dsp_ccr_update_e_u_n_z(dest[0], dest[1], dest[2]);
                   4785: 
                   4786:        dsp_core.registers[DSP_REG_SR] &= BITMASK(16)-((1<<DSP_SR_V)|(1<<DSP_SR_C));
                   4787:        dsp_core.registers[DSP_REG_SR] |= newsr;
1.1       root     4788: }
                   4789: 
1.1.1.6   root     4790: static void dsp_add_y1_a(void)
1.1       root     4791: {
1.1.1.6   root     4792:        Uint32 source[3], dest[3];
                   4793:        Uint16 newsr;
1.1       root     4794: 
1.1.1.6   root     4795:        dest[0] = dsp_core.registers[DSP_REG_A2];
                   4796:        dest[1] = dsp_core.registers[DSP_REG_A1];
                   4797:        dest[2] = dsp_core.registers[DSP_REG_A0];
                   4798: 
                   4799:        source[2] = 0;
                   4800:        source[1] = dsp_core.registers[DSP_REG_Y1];
1.1.1.7   root     4801:        source[0] = source[1] & (1<<23) ? 0xff : 0x0;
1.1       root     4802: 
1.1.1.6   root     4803:        newsr = dsp_add56(source, dest);
1.1       root     4804: 
1.1.1.6   root     4805:        dsp_core.registers[DSP_REG_A2] = dest[0];
                   4806:        dsp_core.registers[DSP_REG_A1] = dest[1];
                   4807:        dsp_core.registers[DSP_REG_A0] = dest[2];
1.1       root     4808: 
1.1.1.6   root     4809:        dsp_ccr_update_e_u_n_z(dest[0], dest[1], dest[2]);
1.1       root     4810: 
1.1.1.6   root     4811:        dsp_core.registers[DSP_REG_SR] &= BITMASK(16)-((1<<DSP_SR_V)|(1<<DSP_SR_C));
                   4812:        dsp_core.registers[DSP_REG_SR] |= newsr;
1.1       root     4813: }
                   4814: 
1.1.1.6   root     4815: static void dsp_add_y1_b(void)
1.1       root     4816: {
1.1.1.6   root     4817:        Uint32 source[3], dest[3];
                   4818:        Uint16 newsr;
1.1       root     4819: 
1.1.1.6   root     4820:        dest[0] = dsp_core.registers[DSP_REG_B2];
                   4821:        dest[1] = dsp_core.registers[DSP_REG_B1];
                   4822:        dest[2] = dsp_core.registers[DSP_REG_B0];
                   4823: 
                   4824:        source[2] = 0;
                   4825:        source[1] = dsp_core.registers[DSP_REG_Y1];
1.1.1.7   root     4826:        source[0] = source[1] & (1<<23) ? 0xff : 0x0;
1.1       root     4827: 
1.1.1.6   root     4828:        newsr = dsp_add56(source, dest);
1.1       root     4829: 
1.1.1.6   root     4830:        dsp_core.registers[DSP_REG_B2] = dest[0];
                   4831:        dsp_core.registers[DSP_REG_B1] = dest[1];
                   4832:        dsp_core.registers[DSP_REG_B0] = dest[2];
1.1       root     4833: 
1.1.1.6   root     4834:        dsp_ccr_update_e_u_n_z(dest[0], dest[1], dest[2]);
1.1       root     4835: 
1.1.1.6   root     4836:        dsp_core.registers[DSP_REG_SR] &= BITMASK(16)-((1<<DSP_SR_V)|(1<<DSP_SR_C));
                   4837:        dsp_core.registers[DSP_REG_SR] |= newsr;
                   4838: }
1.1       root     4839: 
1.1.1.6   root     4840: static void dsp_addl_b_a(void)
                   4841: {
                   4842:        Uint32 source[3], dest[3];
                   4843:        Uint16 newsr;
1.1.1.2   root     4844: 
1.1.1.6   root     4845:        dest[0] = dsp_core.registers[DSP_REG_A2];
                   4846:        dest[1] = dsp_core.registers[DSP_REG_A1];
                   4847:        dest[2] = dsp_core.registers[DSP_REG_A0];
                   4848:        newsr = dsp_asl56(dest);
1.1       root     4849: 
1.1.1.6   root     4850:        source[0] = dsp_core.registers[DSP_REG_B2];
                   4851:        source[1] = dsp_core.registers[DSP_REG_B1];
                   4852:        source[2] = dsp_core.registers[DSP_REG_B0];
                   4853:        newsr |= dsp_add56(source, dest);
1.1       root     4854: 
1.1.1.6   root     4855:        dsp_core.registers[DSP_REG_A2] = dest[0];
                   4856:        dsp_core.registers[DSP_REG_A1] = dest[1];
                   4857:        dsp_core.registers[DSP_REG_A0] = dest[2];
1.1       root     4858: 
1.1.1.6   root     4859:        dsp_ccr_update_e_u_n_z(dest[0], dest[1], dest[2]);
1.1       root     4860: 
1.1.1.6   root     4861:        dsp_core.registers[DSP_REG_SR] &= BITMASK(16)-((1<<DSP_SR_V)|(1<<DSP_SR_C));
                   4862:        dsp_core.registers[DSP_REG_SR] |= newsr;
                   4863: }
1.1       root     4864: 
1.1.1.6   root     4865: static void dsp_addl_a_b(void)
                   4866: {
                   4867:        Uint32 source[3], dest[3];
                   4868:        Uint16 newsr;
1.1       root     4869: 
1.1.1.6   root     4870:        dest[0] = dsp_core.registers[DSP_REG_B2];
                   4871:        dest[1] = dsp_core.registers[DSP_REG_B1];
                   4872:        dest[2] = dsp_core.registers[DSP_REG_B0];
                   4873:        newsr = dsp_asl56(dest);
1.1       root     4874: 
1.1.1.6   root     4875:        source[0] = dsp_core.registers[DSP_REG_A2];
                   4876:        source[1] = dsp_core.registers[DSP_REG_A1];
                   4877:        source[2] = dsp_core.registers[DSP_REG_A0];
                   4878:        newsr |= dsp_add56(source, dest);
                   4879: 
                   4880:        dsp_core.registers[DSP_REG_B2] = dest[0];
                   4881:        dsp_core.registers[DSP_REG_B1] = dest[1];
                   4882:        dsp_core.registers[DSP_REG_B0] = dest[2];
1.1.1.2   root     4883: 
1.1.1.6   root     4884:        dsp_ccr_update_e_u_n_z(dest[0], dest[1], dest[2]);
1.1.1.2   root     4885: 
1.1.1.6   root     4886:        dsp_core.registers[DSP_REG_SR] &= BITMASK(16)-((1<<DSP_SR_V)|(1<<DSP_SR_C));
                   4887:        dsp_core.registers[DSP_REG_SR] |= newsr;
1.1       root     4888: }
                   4889: 
1.1.1.6   root     4890: static void dsp_addr_b_a(void)
1.1       root     4891: {
1.1.1.6   root     4892:        Uint32 source[3], dest[3];
                   4893:        Uint16 newsr;
                   4894: 
                   4895:        dest[0] = dsp_core.registers[DSP_REG_A2];
                   4896:        dest[1] = dsp_core.registers[DSP_REG_A1];
                   4897:        dest[2] = dsp_core.registers[DSP_REG_A0];
                   4898:        newsr = dsp_asr56(dest);
                   4899: 
                   4900:        source[0] = dsp_core.registers[DSP_REG_B2];
                   4901:        source[1] = dsp_core.registers[DSP_REG_B1];
                   4902:        source[2] = dsp_core.registers[DSP_REG_B0];
                   4903:        newsr |= dsp_add56(source, dest);
                   4904: 
                   4905:        dsp_core.registers[DSP_REG_A2] = dest[0];
                   4906:        dsp_core.registers[DSP_REG_A1] = dest[1];
                   4907:        dsp_core.registers[DSP_REG_A0] = dest[2];
                   4908: 
                   4909:        dsp_ccr_update_e_u_n_z(dest[0], dest[1], dest[2]);
                   4910: 
                   4911:        dsp_core.registers[DSP_REG_SR] &= BITMASK(16)-((1<<DSP_SR_V)|(1<<DSP_SR_C));
                   4912:        dsp_core.registers[DSP_REG_SR] |= newsr;
1.1       root     4913: }
                   4914: 
1.1.1.6   root     4915: static void dsp_addr_a_b(void)
1.1       root     4916: {
1.1.1.6   root     4917:        Uint32 source[3], dest[3];
                   4918:        Uint16 newsr;
                   4919: 
                   4920:        dest[0] = dsp_core.registers[DSP_REG_B2];
                   4921:        dest[1] = dsp_core.registers[DSP_REG_B1];
                   4922:        dest[2] = dsp_core.registers[DSP_REG_B0];
                   4923:        newsr = dsp_asr56(dest);
                   4924: 
                   4925:        source[0] = dsp_core.registers[DSP_REG_A2];
                   4926:        source[1] = dsp_core.registers[DSP_REG_A1];
                   4927:        source[2] = dsp_core.registers[DSP_REG_A0];
                   4928:        newsr |= dsp_add56(source, dest);
1.1       root     4929: 
1.1.1.6   root     4930:        dsp_core.registers[DSP_REG_B2] = dest[0];
                   4931:        dsp_core.registers[DSP_REG_B1] = dest[1];
                   4932:        dsp_core.registers[DSP_REG_B0] = dest[2];
1.1       root     4933: 
1.1.1.6   root     4934:        dsp_ccr_update_e_u_n_z(dest[0], dest[1], dest[2]);
1.1       root     4935: 
1.1.1.6   root     4936:        dsp_core.registers[DSP_REG_SR] &= BITMASK(16)-((1<<DSP_SR_V)|(1<<DSP_SR_C));
                   4937:        dsp_core.registers[DSP_REG_SR] |= newsr;
1.1       root     4938: }
                   4939: 
1.1.1.6   root     4940: static void dsp_and_x0_a(void)
1.1       root     4941: {
1.1.1.6   root     4942:        dsp_core.registers[DSP_REG_A1] &= dsp_core.registers[DSP_REG_X0];
1.1       root     4943: 
1.1.1.6   root     4944:        dsp_core.registers[DSP_REG_SR] &= BITMASK(16)-((1<<DSP_SR_N)|(1<<DSP_SR_Z)|(1<<DSP_SR_V));
                   4945:        dsp_core.registers[DSP_REG_SR] |= ((dsp_core.registers[DSP_REG_A1]>>23) & 1)<<DSP_SR_N;
                   4946:        dsp_core.registers[DSP_REG_SR] |= (dsp_core.registers[DSP_REG_A1]==0)<<DSP_SR_Z;
                   4947: }
1.1       root     4948: 
1.1.1.6   root     4949: static void dsp_and_x0_b(void)
                   4950: {
                   4951:        dsp_core.registers[DSP_REG_B1] &= dsp_core.registers[DSP_REG_X0];
1.1       root     4952: 
1.1.1.6   root     4953:        dsp_core.registers[DSP_REG_SR] &= BITMASK(16)-((1<<DSP_SR_N)|(1<<DSP_SR_Z)|(1<<DSP_SR_V));
                   4954:        dsp_core.registers[DSP_REG_SR] |= ((dsp_core.registers[DSP_REG_B1]>>23) & 1)<<DSP_SR_N;
                   4955:        dsp_core.registers[DSP_REG_SR] |= (dsp_core.registers[DSP_REG_B1]==0)<<DSP_SR_Z;
1.1       root     4956: }
                   4957: 
1.1.1.6   root     4958: static void dsp_and_y0_a(void)
1.1       root     4959: {
1.1.1.6   root     4960:        dsp_core.registers[DSP_REG_A1] &= dsp_core.registers[DSP_REG_Y0];
1.1       root     4961: 
1.1.1.6   root     4962:        dsp_core.registers[DSP_REG_SR] &= BITMASK(16)-((1<<DSP_SR_N)|(1<<DSP_SR_Z)|(1<<DSP_SR_V));
                   4963:        dsp_core.registers[DSP_REG_SR] |= ((dsp_core.registers[DSP_REG_A1]>>23) & 1)<<DSP_SR_N;
                   4964:        dsp_core.registers[DSP_REG_SR] |= (dsp_core.registers[DSP_REG_A1]==0)<<DSP_SR_Z;
                   4965: }
1.1       root     4966: 
1.1.1.6   root     4967: static void dsp_and_y0_b(void)
                   4968: {
                   4969:        dsp_core.registers[DSP_REG_B1] &= dsp_core.registers[DSP_REG_Y0];
1.1       root     4970: 
1.1.1.6   root     4971:        dsp_core.registers[DSP_REG_SR] &= BITMASK(16)-((1<<DSP_SR_N)|(1<<DSP_SR_Z)|(1<<DSP_SR_V));
                   4972:        dsp_core.registers[DSP_REG_SR] |= ((dsp_core.registers[DSP_REG_B1]>>23) & 1)<<DSP_SR_N;
                   4973:        dsp_core.registers[DSP_REG_SR] |= (dsp_core.registers[DSP_REG_B1]==0)<<DSP_SR_Z;
                   4974: }
1.1       root     4975: 
1.1.1.6   root     4976: static void dsp_and_x1_a(void)
                   4977: {
                   4978:        dsp_core.registers[DSP_REG_A1] &= dsp_core.registers[DSP_REG_X1];
1.1.1.2   root     4979: 
1.1.1.6   root     4980:        dsp_core.registers[DSP_REG_SR] &= BITMASK(16)-((1<<DSP_SR_N)|(1<<DSP_SR_Z)|(1<<DSP_SR_V));
                   4981:        dsp_core.registers[DSP_REG_SR] |= ((dsp_core.registers[DSP_REG_A1]>>23) & 1)<<DSP_SR_N;
                   4982:        dsp_core.registers[DSP_REG_SR] |= (dsp_core.registers[DSP_REG_A1]==0)<<DSP_SR_Z;
1.1       root     4983: }
                   4984: 
1.1.1.6   root     4985: static void dsp_and_x1_b(void)
1.1       root     4986: {
1.1.1.6   root     4987:        dsp_core.registers[DSP_REG_B1] &= dsp_core.registers[DSP_REG_X1];
                   4988: 
                   4989:        dsp_core.registers[DSP_REG_SR] &= BITMASK(16)-((1<<DSP_SR_N)|(1<<DSP_SR_Z)|(1<<DSP_SR_V));
                   4990:        dsp_core.registers[DSP_REG_SR] |= ((dsp_core.registers[DSP_REG_B1]>>23) & 1)<<DSP_SR_N;
                   4991:        dsp_core.registers[DSP_REG_SR] |= (dsp_core.registers[DSP_REG_B1]==0)<<DSP_SR_Z;
                   4992: }
1.1       root     4993: 
1.1.1.6   root     4994: static void dsp_and_y1_a(void)
                   4995: {
                   4996:        dsp_core.registers[DSP_REG_A1] &= dsp_core.registers[DSP_REG_Y1];
1.1       root     4997: 
1.1.1.6   root     4998:        dsp_core.registers[DSP_REG_SR] &= BITMASK(16)-((1<<DSP_SR_N)|(1<<DSP_SR_Z)|(1<<DSP_SR_V));
                   4999:        dsp_core.registers[DSP_REG_SR] |= ((dsp_core.registers[DSP_REG_A1]>>23) & 1)<<DSP_SR_N;
                   5000:        dsp_core.registers[DSP_REG_SR] |= (dsp_core.registers[DSP_REG_A1]==0)<<DSP_SR_Z;
                   5001: }
1.1       root     5002: 
1.1.1.6   root     5003: static void dsp_and_y1_b(void)
                   5004: {
                   5005:        dsp_core.registers[DSP_REG_B1] &= dsp_core.registers[DSP_REG_Y1];
1.1.1.2   root     5006: 
1.1.1.6   root     5007:        dsp_core.registers[DSP_REG_SR] &= BITMASK(16)-((1<<DSP_SR_N)|(1<<DSP_SR_Z)|(1<<DSP_SR_V));
                   5008:        dsp_core.registers[DSP_REG_SR] |= ((dsp_core.registers[DSP_REG_B1]>>23) & 1)<<DSP_SR_N;
                   5009:        dsp_core.registers[DSP_REG_SR] |= (dsp_core.registers[DSP_REG_B1]==0)<<DSP_SR_Z;
1.1       root     5010: }
                   5011: 
1.1.1.7   root     5012: static void dsp_asl_a(void)
1.1       root     5013: {
1.1.1.6   root     5014:        Uint32 dest[3];
                   5015:        Uint16 newsr;
1.1       root     5016: 
1.1.1.6   root     5017:        dest[0] = dsp_core.registers[DSP_REG_A2];
                   5018:        dest[1] = dsp_core.registers[DSP_REG_A1];
                   5019:        dest[2] = dsp_core.registers[DSP_REG_A0];
1.1       root     5020: 
1.1.1.6   root     5021:        newsr = dsp_asl56(dest);
                   5022: 
                   5023:        dsp_core.registers[DSP_REG_A2] = dest[0];
                   5024:        dsp_core.registers[DSP_REG_A1] = dest[1];
                   5025:        dsp_core.registers[DSP_REG_A0] = dest[2];
1.1       root     5026: 
1.1.1.6   root     5027:        dsp_core.registers[DSP_REG_SR] &= BITMASK(16)-((1<<DSP_SR_C)|(1<<DSP_SR_V));
                   5028:        dsp_core.registers[DSP_REG_SR] |= newsr;
1.1.1.2   root     5029: 
1.1.1.6   root     5030:        dsp_ccr_update_e_u_n_z(dest[0], dest[1], dest[2]);
1.1       root     5031: }
                   5032: 
1.1.1.7   root     5033: static void dsp_asl_b(void)
1.1       root     5034: {
1.1.1.6   root     5035:        Uint32 dest[3];
1.1.1.2   root     5036:        Uint16 newsr;
1.1       root     5037: 
1.1.1.6   root     5038:        dest[0] = dsp_core.registers[DSP_REG_B2];
                   5039:        dest[1] = dsp_core.registers[DSP_REG_B1];
                   5040:        dest[2] = dsp_core.registers[DSP_REG_B0];
1.1       root     5041: 
1.1.1.6   root     5042:        newsr = dsp_asl56(dest);
1.1       root     5043: 
1.1.1.6   root     5044:        dsp_core.registers[DSP_REG_B2] = dest[0];
                   5045:        dsp_core.registers[DSP_REG_B1] = dest[1];
                   5046:        dsp_core.registers[DSP_REG_B0] = dest[2];
1.1.1.2   root     5047: 
1.1.1.6   root     5048:        dsp_core.registers[DSP_REG_SR] &= BITMASK(16)-((1<<DSP_SR_C)|(1<<DSP_SR_V));
                   5049:        dsp_core.registers[DSP_REG_SR] |= newsr;
1.1       root     5050: 
1.1.1.6   root     5051:        dsp_ccr_update_e_u_n_z(dest[0], dest[1], dest[2]);
1.1       root     5052: }
                   5053: 
1.1.1.7   root     5054: static void dsp_asr_a(void)
1.1       root     5055: {
1.1.1.6   root     5056:        Uint32 dest[3];
                   5057:        Uint16 newsr;
                   5058: 
                   5059:        dest[0] = dsp_core.registers[DSP_REG_A2];
                   5060:        dest[1] = dsp_core.registers[DSP_REG_A1];
                   5061:        dest[2] = dsp_core.registers[DSP_REG_A0];
                   5062: 
                   5063:        newsr = dsp_asr56(dest);
                   5064: 
                   5065:        dsp_core.registers[DSP_REG_A2] = dest[0];
                   5066:        dsp_core.registers[DSP_REG_A1] = dest[1];
                   5067:        dsp_core.registers[DSP_REG_A0] = dest[2];
                   5068: 
                   5069:        dsp_core.registers[DSP_REG_SR] &= BITMASK(16)-((1<<DSP_SR_C)|(1<<DSP_SR_V));
                   5070:        dsp_core.registers[DSP_REG_SR] |= newsr;
                   5071: 
                   5072:        dsp_ccr_update_e_u_n_z(dest[0], dest[1], dest[2]);
                   5073: }
                   5074: 
1.1.1.7   root     5075: static void dsp_asr_b(void)
1.1.1.6   root     5076: {
                   5077:        Uint32 dest[3];
                   5078:        Uint16 newsr;
                   5079: 
                   5080:        dest[0] = dsp_core.registers[DSP_REG_B2];
                   5081:        dest[1] = dsp_core.registers[DSP_REG_B1];
                   5082:        dest[2] = dsp_core.registers[DSP_REG_B0];
                   5083: 
                   5084:        newsr = dsp_asr56(dest);
                   5085: 
                   5086:        dsp_core.registers[DSP_REG_B2] = dest[0];
                   5087:        dsp_core.registers[DSP_REG_B1] = dest[1];
                   5088:        dsp_core.registers[DSP_REG_B0] = dest[2];
                   5089: 
                   5090:        dsp_core.registers[DSP_REG_SR] &= BITMASK(16)-((1<<DSP_SR_C)|(1<<DSP_SR_V));
                   5091:        dsp_core.registers[DSP_REG_SR] |= newsr;
                   5092: 
                   5093:        dsp_ccr_update_e_u_n_z(dest[0], dest[1], dest[2]);
                   5094: }
                   5095: 
                   5096: static void dsp_clr_a(void)
                   5097: {
1.1.1.7   root     5098:        dsp_core.registers[DSP_REG_A2] = 0;
                   5099:        dsp_core.registers[DSP_REG_A1] = 0;
                   5100:        dsp_core.registers[DSP_REG_A0] = 0;
1.1.1.6   root     5101: 
                   5102:        dsp_core.registers[DSP_REG_SR] &= BITMASK(16)-((1<<DSP_SR_E)|(1<<DSP_SR_N)|(1<<DSP_SR_V));
                   5103:        dsp_core.registers[DSP_REG_SR] |= (1<<DSP_SR_U)|(1<<DSP_SR_Z);
                   5104: }
                   5105: 
                   5106: static void dsp_clr_b(void)
                   5107: {
1.1.1.7   root     5108:        dsp_core.registers[DSP_REG_B2] = 0;
                   5109:        dsp_core.registers[DSP_REG_B1] = 0;
                   5110:        dsp_core.registers[DSP_REG_B0] = 0;
1.1.1.6   root     5111: 
                   5112:        dsp_core.registers[DSP_REG_SR] &= BITMASK(16)-((1<<DSP_SR_E)|(1<<DSP_SR_N)|(1<<DSP_SR_V));
                   5113:        dsp_core.registers[DSP_REG_SR] |= (1<<DSP_SR_U)|(1<<DSP_SR_Z);
                   5114: }
                   5115: 
                   5116: static void dsp_cmp_b_a(void)
                   5117: {
                   5118:        Uint32 source[3], dest[3];
                   5119:        Uint16 newsr;
                   5120: 
                   5121:        dest[0] = dsp_core.registers[DSP_REG_A2];
                   5122:        dest[1] = dsp_core.registers[DSP_REG_A1];
                   5123:        dest[2] = dsp_core.registers[DSP_REG_A0];
                   5124: 
                   5125:        source[0] = dsp_core.registers[DSP_REG_B2];
                   5126:        source[1] = dsp_core.registers[DSP_REG_B1];
                   5127:        source[2] = dsp_core.registers[DSP_REG_B0];
                   5128: 
                   5129:        newsr = dsp_sub56(source, dest);
                   5130: 
                   5131:        dsp_ccr_update_e_u_n_z(dest[0], dest[1], dest[2]);
                   5132: 
                   5133:        dsp_core.registers[DSP_REG_SR] &= BITMASK(16)-((1<<DSP_SR_V)|(1<<DSP_SR_C));
                   5134:        dsp_core.registers[DSP_REG_SR] |= newsr;
                   5135: }
                   5136: 
                   5137: static void dsp_cmp_a_b(void)
                   5138: {
                   5139:        Uint32 source[3], dest[3];
                   5140:        Uint16 newsr;
                   5141: 
                   5142:        dest[0] = dsp_core.registers[DSP_REG_B2];
                   5143:        dest[1] = dsp_core.registers[DSP_REG_B1];
                   5144:        dest[2] = dsp_core.registers[DSP_REG_B0];
                   5145: 
                   5146:        source[0] = dsp_core.registers[DSP_REG_A2];
                   5147:        source[1] = dsp_core.registers[DSP_REG_A1];
                   5148:        source[2] = dsp_core.registers[DSP_REG_A0];
                   5149: 
                   5150:        newsr = dsp_sub56(source, dest);
                   5151: 
                   5152:        dsp_ccr_update_e_u_n_z(dest[0], dest[1], dest[2]);
                   5153: 
                   5154:        dsp_core.registers[DSP_REG_SR] &= BITMASK(16)-((1<<DSP_SR_V)|(1<<DSP_SR_C));
                   5155:        dsp_core.registers[DSP_REG_SR] |= newsr;
                   5156: }
                   5157: 
                   5158: static void dsp_cmp_x0_a(void)
                   5159: {
                   5160:        Uint32 source[3], dest[3];
                   5161:        Uint16 newsr;
                   5162: 
                   5163:        dest[2] = dsp_core.registers[DSP_REG_A0];
                   5164:        dest[1] = dsp_core.registers[DSP_REG_A1];
                   5165:        dest[0] = dsp_core.registers[DSP_REG_A2];
                   5166: 
                   5167:        source[2] = 0;
                   5168:        source[1] = dsp_core.registers[DSP_REG_X0];
1.1.1.7   root     5169:        source[0] = source[1] & (1<<23) ? 0xff : 0x0;
1.1.1.6   root     5170: 
                   5171:        newsr = dsp_sub56(source, dest);
                   5172: 
                   5173:        dsp_ccr_update_e_u_n_z(dest[0], dest[1], dest[2]);
                   5174: 
                   5175:        dsp_core.registers[DSP_REG_SR] &= BITMASK(16)-((1<<DSP_SR_V)|(1<<DSP_SR_C));
                   5176:        dsp_core.registers[DSP_REG_SR] |= newsr;
                   5177: }
                   5178: 
                   5179: static void dsp_cmp_x0_b(void)
                   5180: {
                   5181:        Uint32 source[3], dest[3];
                   5182:        Uint16 newsr;
                   5183: 
                   5184:        dest[0] = dsp_core.registers[DSP_REG_B2];
                   5185:        dest[1] = dsp_core.registers[DSP_REG_B1];
                   5186:        dest[2] = dsp_core.registers[DSP_REG_B0];
                   5187: 
                   5188:        source[2] = 0;
                   5189:        source[1] = dsp_core.registers[DSP_REG_X0];
1.1.1.7   root     5190:        source[0] = source[1] & (1<<23) ? 0xff : 0x0;
1.1.1.6   root     5191: 
                   5192:        newsr = dsp_sub56(source, dest);
                   5193: 
                   5194:        dsp_ccr_update_e_u_n_z(dest[0], dest[1], dest[2]);
                   5195: 
                   5196:        dsp_core.registers[DSP_REG_SR] &= BITMASK(16)-((1<<DSP_SR_V)|(1<<DSP_SR_C));
                   5197:        dsp_core.registers[DSP_REG_SR] |= newsr;
                   5198: }
                   5199: 
                   5200: static void dsp_cmp_y0_a(void)
                   5201: {
                   5202:        Uint32 source[3], dest[3];
                   5203:        Uint16 newsr;
                   5204: 
                   5205:        dest[2] = dsp_core.registers[DSP_REG_A0];
                   5206:        dest[1] = dsp_core.registers[DSP_REG_A1];
                   5207:        dest[0] = dsp_core.registers[DSP_REG_A2];
                   5208: 
                   5209:        source[2] = 0;
                   5210:        source[1] = dsp_core.registers[DSP_REG_Y0];
1.1.1.7   root     5211:        source[0] = source[1] & (1<<23) ? 0xff : 0x0;
1.1.1.6   root     5212: 
                   5213:        newsr = dsp_sub56(source, dest);
                   5214: 
                   5215:        dsp_ccr_update_e_u_n_z(dest[0], dest[1], dest[2]);
                   5216: 
                   5217:        dsp_core.registers[DSP_REG_SR] &= BITMASK(16)-((1<<DSP_SR_V)|(1<<DSP_SR_C));
                   5218:        dsp_core.registers[DSP_REG_SR] |= newsr;
                   5219: }
                   5220: 
                   5221: static void dsp_cmp_y0_b(void)
                   5222: {
                   5223:        Uint32 source[3], dest[3];
                   5224:        Uint16 newsr;
                   5225: 
                   5226:        dest[0] = dsp_core.registers[DSP_REG_B2];
                   5227:        dest[1] = dsp_core.registers[DSP_REG_B1];
                   5228:        dest[2] = dsp_core.registers[DSP_REG_B0];
                   5229: 
                   5230:        source[2] = 0;
                   5231:        source[1] = dsp_core.registers[DSP_REG_Y0];
1.1.1.7   root     5232:        source[0] = source[1] & (1<<23) ? 0xff : 0x0;
1.1.1.6   root     5233: 
                   5234:        newsr = dsp_sub56(source, dest);
                   5235: 
                   5236:        dsp_ccr_update_e_u_n_z(dest[0], dest[1], dest[2]);
                   5237: 
                   5238:        dsp_core.registers[DSP_REG_SR] &= BITMASK(16)-((1<<DSP_SR_V)|(1<<DSP_SR_C));
                   5239:        dsp_core.registers[DSP_REG_SR] |= newsr;
                   5240: }
                   5241: static void dsp_cmp_x1_a(void)
                   5242: {
                   5243:        Uint32 source[3], dest[3];
                   5244:        Uint16 newsr;
                   5245: 
                   5246:        dest[2] = dsp_core.registers[DSP_REG_A0];
                   5247:        dest[1] = dsp_core.registers[DSP_REG_A1];
                   5248:        dest[0] = dsp_core.registers[DSP_REG_A2];
                   5249: 
                   5250:        source[2] = 0;
                   5251:        source[1] = dsp_core.registers[DSP_REG_X1];
1.1.1.7   root     5252:        source[0] = source[1] & (1<<23) ? 0xff : 0x0;
1.1.1.6   root     5253: 
                   5254:        newsr = dsp_sub56(source, dest);
                   5255: 
                   5256:        dsp_ccr_update_e_u_n_z(dest[0], dest[1], dest[2]);
                   5257: 
                   5258:        dsp_core.registers[DSP_REG_SR] &= BITMASK(16)-((1<<DSP_SR_V)|(1<<DSP_SR_C));
                   5259:        dsp_core.registers[DSP_REG_SR] |= newsr;
                   5260: }
                   5261: 
                   5262: static void dsp_cmp_x1_b(void)
                   5263: {
                   5264:        Uint32 source[3], dest[3];
                   5265:        Uint16 newsr;
                   5266: 
                   5267:        dest[0] = dsp_core.registers[DSP_REG_B2];
                   5268:        dest[1] = dsp_core.registers[DSP_REG_B1];
                   5269:        dest[2] = dsp_core.registers[DSP_REG_B0];
                   5270: 
                   5271:        source[2] = 0;
                   5272:        source[1] = dsp_core.registers[DSP_REG_X1];
1.1.1.7   root     5273:        source[0] = source[1] & (1<<23) ? 0xff : 0x0;
1.1.1.6   root     5274: 
                   5275:        newsr = dsp_sub56(source, dest);
                   5276: 
                   5277:        dsp_ccr_update_e_u_n_z(dest[0], dest[1], dest[2]);
                   5278: 
                   5279:        dsp_core.registers[DSP_REG_SR] &= BITMASK(16)-((1<<DSP_SR_V)|(1<<DSP_SR_C));
                   5280:        dsp_core.registers[DSP_REG_SR] |= newsr;
                   5281: }
                   5282: 
                   5283: static void dsp_cmp_y1_a(void)
                   5284: {
                   5285:        Uint32 source[3], dest[3];
                   5286:        Uint16 newsr;
                   5287: 
                   5288:        dest[2] = dsp_core.registers[DSP_REG_A0];
                   5289:        dest[1] = dsp_core.registers[DSP_REG_A1];
                   5290:        dest[0] = dsp_core.registers[DSP_REG_A2];
                   5291: 
                   5292:        source[2] = 0;
                   5293:        source[1] = dsp_core.registers[DSP_REG_Y1];
1.1.1.7   root     5294:        source[0] = source[1] & (1<<23) ? 0xff : 0x0;
1.1.1.6   root     5295: 
                   5296:        newsr = dsp_sub56(source, dest);
                   5297: 
                   5298:        dsp_ccr_update_e_u_n_z(dest[0], dest[1], dest[2]);
                   5299: 
                   5300:        dsp_core.registers[DSP_REG_SR] &= BITMASK(16)-((1<<DSP_SR_V)|(1<<DSP_SR_C));
                   5301:        dsp_core.registers[DSP_REG_SR] |= newsr;
                   5302: }
                   5303: 
                   5304: static void dsp_cmp_y1_b(void)
                   5305: {
                   5306:        Uint32 source[3], dest[3];
                   5307:        Uint16 newsr;
                   5308: 
                   5309:        dest[0] = dsp_core.registers[DSP_REG_B2];
                   5310:        dest[1] = dsp_core.registers[DSP_REG_B1];
                   5311:        dest[2] = dsp_core.registers[DSP_REG_B0];
                   5312: 
                   5313:        source[2] = 0;
                   5314:        source[1] = dsp_core.registers[DSP_REG_Y1];
1.1.1.7   root     5315:        source[0] = source[1] & (1<<23) ? 0xff : 0x0;
1.1.1.6   root     5316: 
                   5317:        newsr = dsp_sub56(source, dest);
                   5318: 
                   5319:        dsp_ccr_update_e_u_n_z(dest[0], dest[1], dest[2]);
                   5320: 
                   5321:        dsp_core.registers[DSP_REG_SR] &= BITMASK(16)-((1<<DSP_SR_V)|(1<<DSP_SR_C));
                   5322:        dsp_core.registers[DSP_REG_SR] |= newsr;
                   5323: }
                   5324: 
                   5325: static void dsp_cmpm_b_a(void)
                   5326: {
                   5327:        Uint32 source[3], dest[3];
                   5328:        Uint16 newsr;
                   5329: 
                   5330:        dest[0] = dsp_core.registers[DSP_REG_A2];
                   5331:        dest[1] = dsp_core.registers[DSP_REG_A1];
                   5332:        dest[2] = dsp_core.registers[DSP_REG_A0];
                   5333:        dsp_abs56(dest);
                   5334: 
                   5335:        source[0] = dsp_core.registers[DSP_REG_B2];
                   5336:        source[1] = dsp_core.registers[DSP_REG_B1];
                   5337:        source[2] = dsp_core.registers[DSP_REG_B0];
                   5338:        dsp_abs56(source);
                   5339: 
                   5340:        newsr = dsp_sub56(source, dest);
                   5341: 
                   5342:        dsp_ccr_update_e_u_n_z(dest[0], dest[1], dest[2]);
                   5343: 
                   5344:        dsp_core.registers[DSP_REG_SR] &= BITMASK(16)-((1<<DSP_SR_V)|(1<<DSP_SR_C));
                   5345:        dsp_core.registers[DSP_REG_SR] |= newsr;
                   5346: }
                   5347: 
                   5348: static void dsp_cmpm_a_b(void)
                   5349: {
                   5350:        Uint32 source[3], dest[3];
                   5351:        Uint16 newsr;
                   5352: 
                   5353:        dest[0] = dsp_core.registers[DSP_REG_B2];
                   5354:        dest[1] = dsp_core.registers[DSP_REG_B1];
                   5355:        dest[2] = dsp_core.registers[DSP_REG_B0];
                   5356:        dsp_abs56(dest);
                   5357: 
                   5358:        source[0] = dsp_core.registers[DSP_REG_A2];
                   5359:        source[1] = dsp_core.registers[DSP_REG_A1];
                   5360:        source[2] = dsp_core.registers[DSP_REG_A0];
                   5361:        dsp_abs56(source);
                   5362: 
                   5363:        newsr = dsp_sub56(source, dest);
                   5364: 
                   5365:        dsp_ccr_update_e_u_n_z(dest[0], dest[1], dest[2]);
                   5366: 
                   5367:        dsp_core.registers[DSP_REG_SR] &= BITMASK(16)-((1<<DSP_SR_V)|(1<<DSP_SR_C));
                   5368:        dsp_core.registers[DSP_REG_SR] |= newsr;
                   5369: }
                   5370: 
                   5371: static void dsp_cmpm_x0_a(void)
                   5372: {
                   5373:        Uint32 source[3], dest[3];
                   5374:        Uint16 newsr;
                   5375: 
                   5376:        dest[2] = dsp_core.registers[DSP_REG_A0];
                   5377:        dest[1] = dsp_core.registers[DSP_REG_A1];
                   5378:        dest[0] = dsp_core.registers[DSP_REG_A2];
                   5379:        dsp_abs56(dest);
                   5380: 
                   5381:        source[2] = 0;
                   5382:        source[1] = dsp_core.registers[DSP_REG_X0];
1.1.1.7   root     5383:        source[0] = source[1] & (1<<23) ? 0xff : 0x0;
1.1.1.6   root     5384:        dsp_abs56(source);
                   5385: 
                   5386:        newsr = dsp_sub56(source, dest);
                   5387: 
                   5388:        dsp_ccr_update_e_u_n_z(dest[0], dest[1], dest[2]);
                   5389: 
                   5390:        dsp_core.registers[DSP_REG_SR] &= BITMASK(16)-((1<<DSP_SR_V)|(1<<DSP_SR_C));
                   5391:        dsp_core.registers[DSP_REG_SR] |= newsr;
                   5392: }
                   5393: 
                   5394: static void dsp_cmpm_x0_b(void)
                   5395: {
                   5396:        Uint32 source[3], dest[3];
                   5397:        Uint16 newsr;
                   5398: 
                   5399:        dest[0] = dsp_core.registers[DSP_REG_B2];
                   5400:        dest[1] = dsp_core.registers[DSP_REG_B1];
                   5401:        dest[2] = dsp_core.registers[DSP_REG_B0];
                   5402:        dsp_abs56(dest);
                   5403: 
                   5404:        source[2] = 0;
                   5405:        source[1] = dsp_core.registers[DSP_REG_X0];
1.1.1.7   root     5406:        source[0] = source[1] & (1<<23) ? 0xff : 0x0;
1.1.1.6   root     5407:        dsp_abs56(source);
                   5408: 
                   5409:        newsr = dsp_sub56(source, dest);
                   5410: 
                   5411:        dsp_ccr_update_e_u_n_z(dest[0], dest[1], dest[2]);
                   5412: 
                   5413:        dsp_core.registers[DSP_REG_SR] &= BITMASK(16)-((1<<DSP_SR_V)|(1<<DSP_SR_C));
                   5414:        dsp_core.registers[DSP_REG_SR] |= newsr;
                   5415: }
                   5416: 
                   5417: static void dsp_cmpm_y0_a(void)
                   5418: {
                   5419:        Uint32 source[3], dest[3];
                   5420:        Uint16 newsr;
                   5421: 
                   5422:        dest[2] = dsp_core.registers[DSP_REG_A0];
                   5423:        dest[1] = dsp_core.registers[DSP_REG_A1];
                   5424:        dest[0] = dsp_core.registers[DSP_REG_A2];
                   5425:        dsp_abs56(dest);
                   5426: 
                   5427:        source[2] = 0;
                   5428:        source[1] = dsp_core.registers[DSP_REG_Y0];
1.1.1.7   root     5429:        source[0] = source[1] & (1<<23) ? 0xff : 0x0;
1.1.1.6   root     5430:        dsp_abs56(source);
                   5431: 
                   5432:        newsr = dsp_sub56(source, dest);
                   5433: 
                   5434:        dsp_ccr_update_e_u_n_z(dest[0], dest[1], dest[2]);
                   5435: 
                   5436:        dsp_core.registers[DSP_REG_SR] &= BITMASK(16)-((1<<DSP_SR_V)|(1<<DSP_SR_C));
                   5437:        dsp_core.registers[DSP_REG_SR] |= newsr;
                   5438: }
                   5439: 
                   5440: static void dsp_cmpm_y0_b(void)
                   5441: {
                   5442:        Uint32 source[3], dest[3];
                   5443:        Uint16 newsr;
                   5444: 
                   5445:        dest[0] = dsp_core.registers[DSP_REG_B2];
                   5446:        dest[1] = dsp_core.registers[DSP_REG_B1];
                   5447:        dest[2] = dsp_core.registers[DSP_REG_B0];
                   5448:        dsp_abs56(dest);
                   5449: 
                   5450:        source[2] = 0;
                   5451:        source[1] = dsp_core.registers[DSP_REG_Y0];
1.1.1.7   root     5452:        source[0] = source[1] & (1<<23) ? 0xff : 0x0;
1.1.1.6   root     5453:        dsp_abs56(source);
                   5454: 
                   5455:        newsr = dsp_sub56(source, dest);
                   5456: 
                   5457:        dsp_ccr_update_e_u_n_z(dest[0], dest[1], dest[2]);
                   5458: 
                   5459:        dsp_core.registers[DSP_REG_SR] &= BITMASK(16)-((1<<DSP_SR_V)|(1<<DSP_SR_C));
                   5460:        dsp_core.registers[DSP_REG_SR] |= newsr;
                   5461: }
                   5462: 
                   5463: static void dsp_cmpm_x1_a(void)
                   5464: {
                   5465:        Uint32 source[3], dest[3];
                   5466:        Uint16 newsr;
                   5467: 
                   5468:        dest[2] = dsp_core.registers[DSP_REG_A0];
                   5469:        dest[1] = dsp_core.registers[DSP_REG_A1];
                   5470:        dest[0] = dsp_core.registers[DSP_REG_A2];
                   5471:        dsp_abs56(dest);
                   5472: 
                   5473:        source[2] = 0;
                   5474:        source[1] = dsp_core.registers[DSP_REG_X1];
1.1.1.7   root     5475:        source[0] = source[1] & (1<<23) ? 0xff : 0x0;
1.1.1.6   root     5476:        dsp_abs56(source);
                   5477: 
                   5478:        newsr = dsp_sub56(source, dest);
                   5479: 
                   5480:        dsp_ccr_update_e_u_n_z(dest[0], dest[1], dest[2]);
                   5481: 
                   5482:        dsp_core.registers[DSP_REG_SR] &= BITMASK(16)-((1<<DSP_SR_V)|(1<<DSP_SR_C));
                   5483:        dsp_core.registers[DSP_REG_SR] |= newsr;
                   5484: }
                   5485: 
                   5486: static void dsp_cmpm_x1_b(void)
                   5487: {
                   5488:        Uint32 source[3], dest[3];
                   5489:        Uint16 newsr;
                   5490: 
                   5491:        dest[0] = dsp_core.registers[DSP_REG_B2];
                   5492:        dest[1] = dsp_core.registers[DSP_REG_B1];
                   5493:        dest[2] = dsp_core.registers[DSP_REG_B0];
                   5494:        dsp_abs56(dest);
                   5495: 
                   5496:        source[2] = 0;
                   5497:        source[1] = dsp_core.registers[DSP_REG_X1];
1.1.1.7   root     5498:        source[0] = source[1] & (1<<23) ? 0xff : 0x0;
1.1.1.6   root     5499:        dsp_abs56(source);
                   5500: 
                   5501:        newsr = dsp_sub56(source, dest);
                   5502: 
                   5503:        dsp_ccr_update_e_u_n_z(dest[0], dest[1], dest[2]);
                   5504: 
                   5505:        dsp_core.registers[DSP_REG_SR] &= BITMASK(16)-((1<<DSP_SR_V)|(1<<DSP_SR_C));
                   5506:        dsp_core.registers[DSP_REG_SR] |= newsr;
                   5507: }
                   5508: 
                   5509: static void dsp_cmpm_y1_a(void)
                   5510: {
                   5511:        Uint32 source[3], dest[3];
                   5512:        Uint16 newsr;
                   5513: 
                   5514:        dest[2] = dsp_core.registers[DSP_REG_A0];
                   5515:        dest[1] = dsp_core.registers[DSP_REG_A1];
                   5516:        dest[0] = dsp_core.registers[DSP_REG_A2];
                   5517:        dsp_abs56(dest);
                   5518: 
                   5519:        source[2] = 0;
                   5520:        source[1] = dsp_core.registers[DSP_REG_Y1];
1.1.1.7   root     5521:        source[0] = source[1] & (1<<23) ? 0xff : 0x0;
1.1.1.6   root     5522:        dsp_abs56(source);
                   5523: 
                   5524:        newsr = dsp_sub56(source, dest);
                   5525: 
                   5526:        dsp_ccr_update_e_u_n_z(dest[0], dest[1], dest[2]);
                   5527: 
                   5528:        dsp_core.registers[DSP_REG_SR] &= BITMASK(16)-((1<<DSP_SR_V)|(1<<DSP_SR_C));
                   5529:        dsp_core.registers[DSP_REG_SR] |= newsr;
                   5530: }
                   5531: 
                   5532: static void dsp_cmpm_y1_b(void)
                   5533: {
                   5534:        Uint32 source[3], dest[3];
                   5535:        Uint16 newsr;
                   5536: 
                   5537:        dest[0] = dsp_core.registers[DSP_REG_B2];
                   5538:        dest[1] = dsp_core.registers[DSP_REG_B1];
                   5539:        dest[2] = dsp_core.registers[DSP_REG_B0];
                   5540:        dsp_abs56(dest);
                   5541: 
                   5542:        source[2] = 0;
                   5543:        source[1] = dsp_core.registers[DSP_REG_Y1];
1.1.1.7   root     5544:        source[0] = source[1] & (1<<23) ? 0xff : 0x0;
1.1.1.6   root     5545:        dsp_abs56(source);
                   5546: 
                   5547:        newsr = dsp_sub56(source, dest);
                   5548: 
                   5549:        dsp_ccr_update_e_u_n_z(dest[0], dest[1], dest[2]);
                   5550: 
                   5551:        dsp_core.registers[DSP_REG_SR] &= BITMASK(16)-((1<<DSP_SR_V)|(1<<DSP_SR_C));
                   5552:        dsp_core.registers[DSP_REG_SR] |= newsr;
                   5553: }
                   5554: 
                   5555: static void dsp_eor_x0_a(void)
                   5556: {
                   5557:        dsp_core.registers[DSP_REG_A1] ^= dsp_core.registers[DSP_REG_X0];
                   5558:        dsp_core.registers[DSP_REG_A1] &= BITMASK(24); /* FIXME: useless ? */
                   5559: 
                   5560:        dsp_core.registers[DSP_REG_SR] &= BITMASK(16)-((1<<DSP_SR_N)|(1<<DSP_SR_Z)|(1<<DSP_SR_V));
                   5561:        dsp_core.registers[DSP_REG_SR] |= ((dsp_core.registers[DSP_REG_A1]>>23) & 1)<<DSP_SR_N;
                   5562:        dsp_core.registers[DSP_REG_SR] |= (dsp_core.registers[DSP_REG_A1]==0)<<DSP_SR_Z;
                   5563: }
                   5564: 
                   5565: static void dsp_eor_x0_b(void)
                   5566: {
                   5567:        dsp_core.registers[DSP_REG_B1] ^= dsp_core.registers[DSP_REG_X0];
                   5568:        dsp_core.registers[DSP_REG_B1] &= BITMASK(24); /* FIXME: useless ? */
                   5569: 
                   5570:        dsp_core.registers[DSP_REG_SR] &= BITMASK(16)-((1<<DSP_SR_N)|(1<<DSP_SR_Z)|(1<<DSP_SR_V));
                   5571:        dsp_core.registers[DSP_REG_SR] |= ((dsp_core.registers[DSP_REG_B1]>>23) & 1)<<DSP_SR_N;
                   5572:        dsp_core.registers[DSP_REG_SR] |= (dsp_core.registers[DSP_REG_B1]==0)<<DSP_SR_Z;
                   5573: }
                   5574: 
                   5575: static void dsp_eor_y0_a(void)
                   5576: {
                   5577:        dsp_core.registers[DSP_REG_A1] ^= dsp_core.registers[DSP_REG_Y0];
                   5578:        dsp_core.registers[DSP_REG_A1] &= BITMASK(24); /* FIXME: useless ? */
                   5579: 
                   5580:        dsp_core.registers[DSP_REG_SR] &= BITMASK(16)-((1<<DSP_SR_N)|(1<<DSP_SR_Z)|(1<<DSP_SR_V));
                   5581:        dsp_core.registers[DSP_REG_SR] |= ((dsp_core.registers[DSP_REG_A1]>>23) & 1)<<DSP_SR_N;
                   5582:        dsp_core.registers[DSP_REG_SR] |= (dsp_core.registers[DSP_REG_A1]==0)<<DSP_SR_Z;
                   5583: }
                   5584: 
                   5585: static void dsp_eor_y0_b(void)
                   5586: {
                   5587:        dsp_core.registers[DSP_REG_B1] ^= dsp_core.registers[DSP_REG_Y0];
                   5588:        dsp_core.registers[DSP_REG_B1] &= BITMASK(24); /* FIXME: useless ? */
                   5589: 
                   5590:        dsp_core.registers[DSP_REG_SR] &= BITMASK(16)-((1<<DSP_SR_N)|(1<<DSP_SR_Z)|(1<<DSP_SR_V));
                   5591:        dsp_core.registers[DSP_REG_SR] |= ((dsp_core.registers[DSP_REG_B1]>>23) & 1)<<DSP_SR_N;
                   5592:        dsp_core.registers[DSP_REG_SR] |= (dsp_core.registers[DSP_REG_B1]==0)<<DSP_SR_Z;
                   5593: }
                   5594: 
                   5595: static void dsp_eor_x1_a(void)
                   5596: {
                   5597:        dsp_core.registers[DSP_REG_A1] ^= dsp_core.registers[DSP_REG_X1];
                   5598:        dsp_core.registers[DSP_REG_A1] &= BITMASK(24); /* FIXME: useless ? */
                   5599: 
                   5600:        dsp_core.registers[DSP_REG_SR] &= BITMASK(16)-((1<<DSP_SR_N)|(1<<DSP_SR_Z)|(1<<DSP_SR_V));
                   5601:        dsp_core.registers[DSP_REG_SR] |= ((dsp_core.registers[DSP_REG_A1]>>23) & 1)<<DSP_SR_N;
                   5602:        dsp_core.registers[DSP_REG_SR] |= (dsp_core.registers[DSP_REG_A1]==0)<<DSP_SR_Z;
                   5603: }
                   5604: 
                   5605: static void dsp_eor_x1_b(void)
                   5606: {
                   5607:        dsp_core.registers[DSP_REG_B1] ^= dsp_core.registers[DSP_REG_X1];
                   5608:        dsp_core.registers[DSP_REG_B1] &= BITMASK(24); /* FIXME: useless ? */
                   5609: 
                   5610:        dsp_core.registers[DSP_REG_SR] &= BITMASK(16)-((1<<DSP_SR_N)|(1<<DSP_SR_Z)|(1<<DSP_SR_V));
                   5611:        dsp_core.registers[DSP_REG_SR] |= ((dsp_core.registers[DSP_REG_B1]>>23) & 1)<<DSP_SR_N;
                   5612:        dsp_core.registers[DSP_REG_SR] |= (dsp_core.registers[DSP_REG_B1]==0)<<DSP_SR_Z;
                   5613: }
                   5614: 
                   5615: static void dsp_eor_y1_a(void)
                   5616: {
                   5617:        dsp_core.registers[DSP_REG_A1] ^= dsp_core.registers[DSP_REG_Y1];
                   5618:        dsp_core.registers[DSP_REG_A1] &= BITMASK(24); /* FIXME: useless ? */
                   5619: 
                   5620:        dsp_core.registers[DSP_REG_SR] &= BITMASK(16)-((1<<DSP_SR_N)|(1<<DSP_SR_Z)|(1<<DSP_SR_V));
                   5621:        dsp_core.registers[DSP_REG_SR] |= ((dsp_core.registers[DSP_REG_A1]>>23) & 1)<<DSP_SR_N;
                   5622:        dsp_core.registers[DSP_REG_SR] |= (dsp_core.registers[DSP_REG_A1]==0)<<DSP_SR_Z;
                   5623: }
                   5624: 
                   5625: static void dsp_eor_y1_b(void)
                   5626: {
                   5627:        dsp_core.registers[DSP_REG_B1] ^= dsp_core.registers[DSP_REG_Y1];
                   5628:        dsp_core.registers[DSP_REG_B1] &= BITMASK(24); /* FIXME: useless ? */
                   5629: 
                   5630:        dsp_core.registers[DSP_REG_SR] &= BITMASK(16)-((1<<DSP_SR_N)|(1<<DSP_SR_Z)|(1<<DSP_SR_V));
                   5631:        dsp_core.registers[DSP_REG_SR] |= ((dsp_core.registers[DSP_REG_B1]>>23) & 1)<<DSP_SR_N;
                   5632:        dsp_core.registers[DSP_REG_SR] |= (dsp_core.registers[DSP_REG_B1]==0)<<DSP_SR_Z;
                   5633: }
                   5634: 
                   5635: static void dsp_lsl_a(void)
                   5636: {
                   5637:        Uint32 newcarry = (dsp_core.registers[DSP_REG_A1]>>23) & 1;
                   5638: 
                   5639:        dsp_core.registers[DSP_REG_A1] <<= 1;
                   5640:        dsp_core.registers[DSP_REG_A1] &= BITMASK(24);
                   5641: 
                   5642:        dsp_core.registers[DSP_REG_SR] &= BITMASK(16)-((1<<DSP_SR_C)|(1<<DSP_SR_N)|(1<<DSP_SR_Z)|(1<<DSP_SR_V));
                   5643:        dsp_core.registers[DSP_REG_SR] |= newcarry;
                   5644:        dsp_core.registers[DSP_REG_SR] |= ((dsp_core.registers[DSP_REG_A1]>>23) & 1)<<DSP_SR_N;
                   5645:        dsp_core.registers[DSP_REG_SR] |= (dsp_core.registers[DSP_REG_A1]==0)<<DSP_SR_Z;
                   5646: }
                   5647: 
                   5648: static void dsp_lsl_b(void)
                   5649: {
                   5650:        Uint32 newcarry = (dsp_core.registers[DSP_REG_B1]>>23) & 1;
                   5651: 
                   5652:        dsp_core.registers[DSP_REG_B1] <<= 1;
                   5653:        dsp_core.registers[DSP_REG_B1] &= BITMASK(24);
                   5654: 
                   5655:        dsp_core.registers[DSP_REG_SR] &= BITMASK(16)-((1<<DSP_SR_C)|(1<<DSP_SR_N)|(1<<DSP_SR_Z)|(1<<DSP_SR_V));
                   5656:        dsp_core.registers[DSP_REG_SR] |= newcarry;
                   5657:        dsp_core.registers[DSP_REG_SR] |= ((dsp_core.registers[DSP_REG_B1]>>23) & 1)<<DSP_SR_N;
                   5658:        dsp_core.registers[DSP_REG_SR] |= (dsp_core.registers[DSP_REG_B1]==0)<<DSP_SR_Z;
                   5659: }
                   5660: 
                   5661: static void dsp_lsr_a(void)
                   5662: {
                   5663:        Uint32 newcarry = dsp_core.registers[DSP_REG_A1] & 1;
                   5664:        dsp_core.registers[DSP_REG_A1] >>= 1;
                   5665: 
                   5666:        dsp_core.registers[DSP_REG_SR] &= BITMASK(16)-((1<<DSP_SR_C)|(1<<DSP_SR_N)|(1<<DSP_SR_Z)|(1<<DSP_SR_V));
                   5667:        dsp_core.registers[DSP_REG_SR] |= newcarry;
                   5668:        dsp_core.registers[DSP_REG_SR] |= (dsp_core.registers[DSP_REG_A1]==0)<<DSP_SR_Z;
                   5669: }
                   5670: 
                   5671: static void dsp_lsr_b(void)
                   5672: {
                   5673:        Uint32 newcarry = dsp_core.registers[DSP_REG_B1] & 1;
                   5674:        dsp_core.registers[DSP_REG_B1] >>= 1;
                   5675: 
                   5676:        dsp_core.registers[DSP_REG_SR] &= BITMASK(16)-((1<<DSP_SR_C)|(1<<DSP_SR_N)|(1<<DSP_SR_Z)|(1<<DSP_SR_V));
                   5677:        dsp_core.registers[DSP_REG_SR] |= newcarry;
                   5678:        dsp_core.registers[DSP_REG_SR] |= (dsp_core.registers[DSP_REG_B1]==0)<<DSP_SR_Z;
                   5679: }
                   5680: 
                   5681: static void dsp_mac_p_x0_x0_a(void)
                   5682: {
                   5683:        Uint32 source[3], dest[3];
                   5684:        Uint16 newsr;
                   5685: 
                   5686:        dsp_mul56(dsp_core.registers[DSP_REG_X0], dsp_core.registers[DSP_REG_X0], source, SIGN_PLUS);
                   5687: 
                   5688:        dest[0] = dsp_core.registers[DSP_REG_A2];
                   5689:        dest[1] = dsp_core.registers[DSP_REG_A1];
                   5690:        dest[2] = dsp_core.registers[DSP_REG_A0];
                   5691:        newsr = dsp_add56(source, dest);
                   5692: 
                   5693:        dsp_core.registers[DSP_REG_A2] = dest[0];
                   5694:        dsp_core.registers[DSP_REG_A1] = dest[1];
                   5695:        dsp_core.registers[DSP_REG_A0] = dest[2];
                   5696: 
                   5697:        dsp_ccr_update_e_u_n_z(dest[0], dest[1], dest[2]);
                   5698: 
                   5699:        dsp_core.registers[DSP_REG_SR] &= BITMASK(16)-(1<<DSP_SR_V);
                   5700:        dsp_core.registers[DSP_REG_SR] |= newsr & 0xfe;
                   5701: }
                   5702: 
                   5703: static void dsp_mac_m_x0_x0_a(void)
                   5704: {
                   5705:        Uint32 source[3], dest[3];
                   5706:        Uint16 newsr;
                   5707: 
                   5708:        dsp_mul56(dsp_core.registers[DSP_REG_X0], dsp_core.registers[DSP_REG_X0], source, SIGN_MINUS);
                   5709: 
                   5710:        dest[0] = dsp_core.registers[DSP_REG_A2];
                   5711:        dest[1] = dsp_core.registers[DSP_REG_A1];
                   5712:        dest[2] = dsp_core.registers[DSP_REG_A0];
                   5713:        newsr = dsp_add56(source, dest);
                   5714: 
                   5715:        dsp_core.registers[DSP_REG_A2] = dest[0];
                   5716:        dsp_core.registers[DSP_REG_A1] = dest[1];
                   5717:        dsp_core.registers[DSP_REG_A0] = dest[2];
                   5718: 
                   5719:        dsp_ccr_update_e_u_n_z(dest[0], dest[1], dest[2]);
                   5720: 
                   5721:        dsp_core.registers[DSP_REG_SR] &= BITMASK(16)-(1<<DSP_SR_V);
                   5722:        dsp_core.registers[DSP_REG_SR] |= newsr & 0xfe;
                   5723: }
                   5724: static void dsp_mac_p_x0_x0_b(void)
                   5725: {
                   5726:        Uint32 source[3], dest[3];
                   5727:        Uint16 newsr;
                   5728: 
                   5729:        dsp_mul56(dsp_core.registers[DSP_REG_X0], dsp_core.registers[DSP_REG_X0], source, SIGN_PLUS);
                   5730: 
                   5731:        dest[0] = dsp_core.registers[DSP_REG_B2];
                   5732:        dest[1] = dsp_core.registers[DSP_REG_B1];
                   5733:        dest[2] = dsp_core.registers[DSP_REG_B0];
                   5734:        newsr = dsp_add56(source, dest);
                   5735: 
                   5736:        dsp_core.registers[DSP_REG_B2] = dest[0];
                   5737:        dsp_core.registers[DSP_REG_B1] = dest[1];
                   5738:        dsp_core.registers[DSP_REG_B0] = dest[2];
                   5739: 
                   5740:        dsp_ccr_update_e_u_n_z(dest[0], dest[1], dest[2]);
                   5741: 
                   5742:        dsp_core.registers[DSP_REG_SR] &= BITMASK(16)-(1<<DSP_SR_V);
                   5743:        dsp_core.registers[DSP_REG_SR] |= newsr & 0xfe;
                   5744: }
                   5745: 
                   5746: static void dsp_mac_m_x0_x0_b(void)
                   5747: {
                   5748:        Uint32 source[3], dest[3];
                   5749:        Uint16 newsr;
                   5750: 
                   5751:        dsp_mul56(dsp_core.registers[DSP_REG_X0], dsp_core.registers[DSP_REG_X0], source, SIGN_MINUS);
                   5752: 
                   5753:        dest[0] = dsp_core.registers[DSP_REG_B2];
                   5754:        dest[1] = dsp_core.registers[DSP_REG_B1];
                   5755:        dest[2] = dsp_core.registers[DSP_REG_B0];
                   5756:        newsr = dsp_add56(source, dest);
                   5757: 
                   5758:        dsp_core.registers[DSP_REG_B2] = dest[0];
                   5759:        dsp_core.registers[DSP_REG_B1] = dest[1];
                   5760:        dsp_core.registers[DSP_REG_B0] = dest[2];
                   5761: 
                   5762:        dsp_ccr_update_e_u_n_z(dest[0], dest[1], dest[2]);
                   5763: 
                   5764:        dsp_core.registers[DSP_REG_SR] &= BITMASK(16)-(1<<DSP_SR_V);
                   5765:        dsp_core.registers[DSP_REG_SR] |= newsr & 0xfe;
                   5766: }
                   5767: 
                   5768: static void dsp_mac_p_y0_y0_a(void)
                   5769: {
                   5770:        Uint32 source[3], dest[3];
                   5771:        Uint16 newsr;
                   5772: 
                   5773:        dsp_mul56(dsp_core.registers[DSP_REG_Y0], dsp_core.registers[DSP_REG_Y0], source, SIGN_PLUS);
                   5774: 
                   5775:        dest[0] = dsp_core.registers[DSP_REG_A2];
                   5776:        dest[1] = dsp_core.registers[DSP_REG_A1];
                   5777:        dest[2] = dsp_core.registers[DSP_REG_A0];
                   5778:        newsr = dsp_add56(source, dest);
                   5779: 
                   5780:        dsp_core.registers[DSP_REG_A2] = dest[0];
                   5781:        dsp_core.registers[DSP_REG_A1] = dest[1];
                   5782:        dsp_core.registers[DSP_REG_A0] = dest[2];
                   5783: 
                   5784:        dsp_ccr_update_e_u_n_z(dest[0], dest[1], dest[2]);
                   5785: 
                   5786:        dsp_core.registers[DSP_REG_SR] &= BITMASK(16)-(1<<DSP_SR_V);
                   5787:        dsp_core.registers[DSP_REG_SR] |= newsr & 0xfe;
                   5788: }
                   5789: 
                   5790: static void dsp_mac_m_y0_y0_a(void)
                   5791: {
                   5792:        Uint32 source[3], dest[3];
                   5793:        Uint16 newsr;
                   5794: 
                   5795:        dsp_mul56(dsp_core.registers[DSP_REG_Y0], dsp_core.registers[DSP_REG_Y0], source, SIGN_MINUS);
                   5796: 
                   5797:        dest[0] = dsp_core.registers[DSP_REG_A2];
                   5798:        dest[1] = dsp_core.registers[DSP_REG_A1];
                   5799:        dest[2] = dsp_core.registers[DSP_REG_A0];
                   5800:        newsr = dsp_add56(source, dest);
                   5801: 
                   5802:        dsp_core.registers[DSP_REG_A2] = dest[0];
                   5803:        dsp_core.registers[DSP_REG_A1] = dest[1];
                   5804:        dsp_core.registers[DSP_REG_A0] = dest[2];
                   5805: 
                   5806:        dsp_ccr_update_e_u_n_z(dest[0], dest[1], dest[2]);
                   5807: 
                   5808:        dsp_core.registers[DSP_REG_SR] &= BITMASK(16)-(1<<DSP_SR_V);
                   5809:        dsp_core.registers[DSP_REG_SR] |= newsr & 0xfe;
                   5810: }
                   5811: static void dsp_mac_p_y0_y0_b(void)
                   5812: {
                   5813:        Uint32 source[3], dest[3];
                   5814:        Uint16 newsr;
                   5815: 
                   5816:        dsp_mul56(dsp_core.registers[DSP_REG_Y0], dsp_core.registers[DSP_REG_Y0], source, SIGN_PLUS);
                   5817: 
                   5818:        dest[0] = dsp_core.registers[DSP_REG_B2];
                   5819:        dest[1] = dsp_core.registers[DSP_REG_B1];
                   5820:        dest[2] = dsp_core.registers[DSP_REG_B0];
                   5821:        newsr = dsp_add56(source, dest);
                   5822: 
                   5823:        dsp_core.registers[DSP_REG_B2] = dest[0];
                   5824:        dsp_core.registers[DSP_REG_B1] = dest[1];
                   5825:        dsp_core.registers[DSP_REG_B0] = dest[2];
                   5826: 
                   5827:        dsp_ccr_update_e_u_n_z(dest[0], dest[1], dest[2]);
                   5828: 
                   5829:        dsp_core.registers[DSP_REG_SR] &= BITMASK(16)-(1<<DSP_SR_V);
                   5830:        dsp_core.registers[DSP_REG_SR] |= newsr & 0xfe;
                   5831: }
                   5832: 
                   5833: static void dsp_mac_m_y0_y0_b(void)
                   5834: {
                   5835:        Uint32 source[3], dest[3];
                   5836:        Uint16 newsr;
                   5837: 
                   5838:        dsp_mul56(dsp_core.registers[DSP_REG_Y0], dsp_core.registers[DSP_REG_Y0], source, SIGN_MINUS);
                   5839: 
                   5840:        dest[0] = dsp_core.registers[DSP_REG_B2];
                   5841:        dest[1] = dsp_core.registers[DSP_REG_B1];
                   5842:        dest[2] = dsp_core.registers[DSP_REG_B0];
                   5843:        newsr = dsp_add56(source, dest);
                   5844: 
                   5845:        dsp_core.registers[DSP_REG_B2] = dest[0];
                   5846:        dsp_core.registers[DSP_REG_B1] = dest[1];
                   5847:        dsp_core.registers[DSP_REG_B0] = dest[2];
                   5848: 
                   5849:        dsp_ccr_update_e_u_n_z(dest[0], dest[1], dest[2]);
                   5850: 
                   5851:        dsp_core.registers[DSP_REG_SR] &= BITMASK(16)-(1<<DSP_SR_V);
                   5852:        dsp_core.registers[DSP_REG_SR] |= newsr & 0xfe;
                   5853: }
                   5854: 
                   5855: static void dsp_mac_p_x1_x0_a(void)
                   5856: {
                   5857:        Uint32 source[3], dest[3];
                   5858:        Uint16 newsr;
                   5859: 
                   5860:        dsp_mul56(dsp_core.registers[DSP_REG_X1], dsp_core.registers[DSP_REG_X0], source, SIGN_PLUS);
                   5861: 
                   5862:        dest[0] = dsp_core.registers[DSP_REG_A2];
                   5863:        dest[1] = dsp_core.registers[DSP_REG_A1];
                   5864:        dest[2] = dsp_core.registers[DSP_REG_A0];
                   5865:        newsr = dsp_add56(source, dest);
                   5866: 
                   5867:        dsp_core.registers[DSP_REG_A2] = dest[0];
                   5868:        dsp_core.registers[DSP_REG_A1] = dest[1];
                   5869:        dsp_core.registers[DSP_REG_A0] = dest[2];
                   5870: 
                   5871:        dsp_ccr_update_e_u_n_z(dest[0], dest[1], dest[2]);
                   5872: 
                   5873:        dsp_core.registers[DSP_REG_SR] &= BITMASK(16)-(1<<DSP_SR_V);
                   5874:        dsp_core.registers[DSP_REG_SR] |= newsr & 0xfe;
                   5875: }
                   5876: 
                   5877: static void dsp_mac_m_x1_x0_a(void)
                   5878: {
                   5879:        Uint32 source[3], dest[3];
                   5880:        Uint16 newsr;
                   5881: 
                   5882:        dsp_mul56(dsp_core.registers[DSP_REG_X1], dsp_core.registers[DSP_REG_X0], source, SIGN_MINUS);
                   5883: 
                   5884:        dest[0] = dsp_core.registers[DSP_REG_A2];
                   5885:        dest[1] = dsp_core.registers[DSP_REG_A1];
                   5886:        dest[2] = dsp_core.registers[DSP_REG_A0];
                   5887:        newsr = dsp_add56(source, dest);
                   5888: 
                   5889:        dsp_core.registers[DSP_REG_A2] = dest[0];
                   5890:        dsp_core.registers[DSP_REG_A1] = dest[1];
                   5891:        dsp_core.registers[DSP_REG_A0] = dest[2];
                   5892: 
                   5893:        dsp_ccr_update_e_u_n_z(dest[0], dest[1], dest[2]);
                   5894: 
                   5895:        dsp_core.registers[DSP_REG_SR] &= BITMASK(16)-(1<<DSP_SR_V);
                   5896:        dsp_core.registers[DSP_REG_SR] |= newsr & 0xfe;
                   5897: }
                   5898: 
                   5899: static void dsp_mac_p_x1_x0_b(void)
                   5900: {
                   5901:        Uint32 source[3], dest[3];
                   5902:        Uint16 newsr;
                   5903: 
                   5904:        dsp_mul56(dsp_core.registers[DSP_REG_X1], dsp_core.registers[DSP_REG_X0], source, SIGN_PLUS);
                   5905: 
                   5906:        dest[0] = dsp_core.registers[DSP_REG_B2];
                   5907:        dest[1] = dsp_core.registers[DSP_REG_B1];
                   5908:        dest[2] = dsp_core.registers[DSP_REG_B0];
                   5909:        newsr = dsp_add56(source, dest);
                   5910: 
                   5911:        dsp_core.registers[DSP_REG_B2] = dest[0];
                   5912:        dsp_core.registers[DSP_REG_B1] = dest[1];
                   5913:        dsp_core.registers[DSP_REG_B0] = dest[2];
                   5914: 
                   5915:        dsp_ccr_update_e_u_n_z(dest[0], dest[1], dest[2]);
                   5916: 
                   5917:        dsp_core.registers[DSP_REG_SR] &= BITMASK(16)-(1<<DSP_SR_V);
                   5918:        dsp_core.registers[DSP_REG_SR] |= newsr & 0xfe;
                   5919: }
                   5920: 
                   5921: static void dsp_mac_m_x1_x0_b(void)
                   5922: {
                   5923:        Uint32 source[3], dest[3];
                   5924:        Uint16 newsr;
                   5925: 
                   5926:        dsp_mul56(dsp_core.registers[DSP_REG_X1], dsp_core.registers[DSP_REG_X0], source, SIGN_MINUS);
                   5927: 
                   5928:        dest[0] = dsp_core.registers[DSP_REG_B2];
                   5929:        dest[1] = dsp_core.registers[DSP_REG_B1];
                   5930:        dest[2] = dsp_core.registers[DSP_REG_B0];
                   5931:        newsr = dsp_add56(source, dest);
                   5932: 
                   5933:        dsp_core.registers[DSP_REG_B2] = dest[0];
                   5934:        dsp_core.registers[DSP_REG_B1] = dest[1];
                   5935:        dsp_core.registers[DSP_REG_B0] = dest[2];
                   5936: 
                   5937:        dsp_ccr_update_e_u_n_z(dest[0], dest[1], dest[2]);
                   5938: 
                   5939:        dsp_core.registers[DSP_REG_SR] &= BITMASK(16)-(1<<DSP_SR_V);
                   5940:        dsp_core.registers[DSP_REG_SR] |= newsr & 0xfe;
                   5941: }
                   5942: 
                   5943: static void dsp_mac_p_y1_y0_a(void)
                   5944: {
                   5945:        Uint32 source[3], dest[3];
                   5946:        Uint16 newsr;
                   5947: 
                   5948:        dsp_mul56(dsp_core.registers[DSP_REG_Y1], dsp_core.registers[DSP_REG_Y0], source, SIGN_PLUS);
                   5949: 
                   5950:        dest[0] = dsp_core.registers[DSP_REG_A2];
                   5951:        dest[1] = dsp_core.registers[DSP_REG_A1];
                   5952:        dest[2] = dsp_core.registers[DSP_REG_A0];
                   5953:        newsr = dsp_add56(source, dest);
                   5954: 
                   5955:        dsp_core.registers[DSP_REG_A2] = dest[0];
                   5956:        dsp_core.registers[DSP_REG_A1] = dest[1];
                   5957:        dsp_core.registers[DSP_REG_A0] = dest[2];
                   5958: 
                   5959:        dsp_ccr_update_e_u_n_z(dest[0], dest[1], dest[2]);
                   5960: 
                   5961:        dsp_core.registers[DSP_REG_SR] &= BITMASK(16)-(1<<DSP_SR_V);
                   5962:        dsp_core.registers[DSP_REG_SR] |= newsr & 0xfe;
                   5963: }
                   5964: 
                   5965: static void dsp_mac_m_y1_y0_a(void)
                   5966: {
                   5967:        Uint32 source[3], dest[3];
                   5968:        Uint16 newsr;
                   5969: 
                   5970:        dsp_mul56(dsp_core.registers[DSP_REG_Y1], dsp_core.registers[DSP_REG_Y0], source, SIGN_MINUS);
                   5971: 
                   5972:        dest[0] = dsp_core.registers[DSP_REG_A2];
                   5973:        dest[1] = dsp_core.registers[DSP_REG_A1];
                   5974:        dest[2] = dsp_core.registers[DSP_REG_A0];
                   5975:        newsr = dsp_add56(source, dest);
                   5976: 
                   5977:        dsp_core.registers[DSP_REG_A2] = dest[0];
                   5978:        dsp_core.registers[DSP_REG_A1] = dest[1];
                   5979:        dsp_core.registers[DSP_REG_A0] = dest[2];
                   5980: 
                   5981:        dsp_ccr_update_e_u_n_z(dest[0], dest[1], dest[2]);
                   5982: 
                   5983:        dsp_core.registers[DSP_REG_SR] &= BITMASK(16)-(1<<DSP_SR_V);
                   5984:        dsp_core.registers[DSP_REG_SR] |= newsr & 0xfe;
                   5985: }
                   5986: 
                   5987: static void dsp_mac_p_y1_y0_b(void)
                   5988: {
                   5989:        Uint32 source[3], dest[3];
                   5990:        Uint16 newsr;
                   5991: 
                   5992:        dsp_mul56(dsp_core.registers[DSP_REG_Y1], dsp_core.registers[DSP_REG_Y0], source, SIGN_PLUS);
                   5993: 
                   5994:        dest[0] = dsp_core.registers[DSP_REG_B2];
                   5995:        dest[1] = dsp_core.registers[DSP_REG_B1];
                   5996:        dest[2] = dsp_core.registers[DSP_REG_B0];
                   5997:        newsr = dsp_add56(source, dest);
                   5998: 
                   5999:        dsp_core.registers[DSP_REG_B2] = dest[0];
                   6000:        dsp_core.registers[DSP_REG_B1] = dest[1];
                   6001:        dsp_core.registers[DSP_REG_B0] = dest[2];
                   6002: 
                   6003:        dsp_ccr_update_e_u_n_z(dest[0], dest[1], dest[2]);
                   6004: 
                   6005:        dsp_core.registers[DSP_REG_SR] &= BITMASK(16)-(1<<DSP_SR_V);
                   6006:        dsp_core.registers[DSP_REG_SR] |= newsr & 0xfe;
                   6007: }
                   6008: 
                   6009: static void dsp_mac_m_y1_y0_b(void)
                   6010: {
                   6011:        Uint32 source[3], dest[3];
                   6012:        Uint16 newsr;
                   6013: 
                   6014:        dsp_mul56(dsp_core.registers[DSP_REG_Y1], dsp_core.registers[DSP_REG_Y0], source, SIGN_MINUS);
                   6015: 
                   6016:        dest[0] = dsp_core.registers[DSP_REG_B2];
                   6017:        dest[1] = dsp_core.registers[DSP_REG_B1];
                   6018:        dest[2] = dsp_core.registers[DSP_REG_B0];
                   6019:        newsr = dsp_add56(source, dest);
                   6020: 
                   6021:        dsp_core.registers[DSP_REG_B2] = dest[0];
                   6022:        dsp_core.registers[DSP_REG_B1] = dest[1];
                   6023:        dsp_core.registers[DSP_REG_B0] = dest[2];
                   6024: 
                   6025:        dsp_ccr_update_e_u_n_z(dest[0], dest[1], dest[2]);
                   6026: 
                   6027:        dsp_core.registers[DSP_REG_SR] &= BITMASK(16)-(1<<DSP_SR_V);
                   6028:        dsp_core.registers[DSP_REG_SR] |= newsr & 0xfe;
                   6029: }
                   6030: 
                   6031: static void dsp_mac_p_x0_y1_a(void)
                   6032: {
                   6033:        Uint32 source[3], dest[3];
                   6034:        Uint16 newsr;
                   6035: 
                   6036:        dsp_mul56(dsp_core.registers[DSP_REG_X0], dsp_core.registers[DSP_REG_Y1], source, SIGN_PLUS);
                   6037: 
                   6038:        dest[0] = dsp_core.registers[DSP_REG_A2];
                   6039:        dest[1] = dsp_core.registers[DSP_REG_A1];
                   6040:        dest[2] = dsp_core.registers[DSP_REG_A0];
                   6041:        newsr = dsp_add56(source, dest);
                   6042: 
                   6043:        dsp_core.registers[DSP_REG_A2] = dest[0];
                   6044:        dsp_core.registers[DSP_REG_A1] = dest[1];
                   6045:        dsp_core.registers[DSP_REG_A0] = dest[2];
                   6046: 
                   6047:        dsp_ccr_update_e_u_n_z(dest[0], dest[1], dest[2]);
                   6048: 
                   6049:        dsp_core.registers[DSP_REG_SR] &= BITMASK(16)-(1<<DSP_SR_V);
                   6050:        dsp_core.registers[DSP_REG_SR] |= newsr & 0xfe;
                   6051: }
                   6052: 
                   6053: static void dsp_mac_m_x0_y1_a(void)
                   6054: {
                   6055:        Uint32 source[3], dest[3];
                   6056:        Uint16 newsr;
                   6057: 
                   6058:        dsp_mul56(dsp_core.registers[DSP_REG_X0], dsp_core.registers[DSP_REG_Y1], source, SIGN_MINUS);
                   6059: 
                   6060:        dest[0] = dsp_core.registers[DSP_REG_A2];
                   6061:        dest[1] = dsp_core.registers[DSP_REG_A1];
                   6062:        dest[2] = dsp_core.registers[DSP_REG_A0];
                   6063:        newsr = dsp_add56(source, dest);
                   6064: 
                   6065:        dsp_core.registers[DSP_REG_A2] = dest[0];
                   6066:        dsp_core.registers[DSP_REG_A1] = dest[1];
                   6067:        dsp_core.registers[DSP_REG_A0] = dest[2];
                   6068: 
                   6069:        dsp_ccr_update_e_u_n_z(dest[0], dest[1], dest[2]);
                   6070: 
                   6071:        dsp_core.registers[DSP_REG_SR] &= BITMASK(16)-(1<<DSP_SR_V);
                   6072:        dsp_core.registers[DSP_REG_SR] |= newsr & 0xfe;
                   6073: }
                   6074: 
                   6075: static void dsp_mac_p_x0_y1_b(void)
                   6076: {
                   6077:        Uint32 source[3], dest[3];
                   6078:        Uint16 newsr;
                   6079: 
                   6080:        dsp_mul56(dsp_core.registers[DSP_REG_X0], dsp_core.registers[DSP_REG_Y1], source, SIGN_PLUS);
                   6081: 
                   6082:        dest[0] = dsp_core.registers[DSP_REG_B2];
                   6083:        dest[1] = dsp_core.registers[DSP_REG_B1];
                   6084:        dest[2] = dsp_core.registers[DSP_REG_B0];
                   6085:        newsr = dsp_add56(source, dest);
                   6086: 
                   6087:        dsp_core.registers[DSP_REG_B2] = dest[0];
                   6088:        dsp_core.registers[DSP_REG_B1] = dest[1];
                   6089:        dsp_core.registers[DSP_REG_B0] = dest[2];
                   6090: 
                   6091:        dsp_ccr_update_e_u_n_z(dest[0], dest[1], dest[2]);
                   6092: 
                   6093:        dsp_core.registers[DSP_REG_SR] &= BITMASK(16)-(1<<DSP_SR_V);
                   6094:        dsp_core.registers[DSP_REG_SR] |= newsr & 0xfe;
                   6095: }
                   6096: 
                   6097: static void dsp_mac_m_x0_y1_b(void)
                   6098: {
                   6099:        Uint32 source[3], dest[3];
                   6100:        Uint16 newsr;
                   6101: 
                   6102:        dsp_mul56(dsp_core.registers[DSP_REG_X0], dsp_core.registers[DSP_REG_Y1], source, SIGN_MINUS);
                   6103: 
                   6104:        dest[0] = dsp_core.registers[DSP_REG_B2];
                   6105:        dest[1] = dsp_core.registers[DSP_REG_B1];
                   6106:        dest[2] = dsp_core.registers[DSP_REG_B0];
                   6107:        newsr = dsp_add56(source, dest);
                   6108: 
                   6109:        dsp_core.registers[DSP_REG_B2] = dest[0];
                   6110:        dsp_core.registers[DSP_REG_B1] = dest[1];
                   6111:        dsp_core.registers[DSP_REG_B0] = dest[2];
                   6112: 
                   6113:        dsp_ccr_update_e_u_n_z(dest[0], dest[1], dest[2]);
                   6114: 
                   6115:        dsp_core.registers[DSP_REG_SR] &= BITMASK(16)-(1<<DSP_SR_V);
                   6116:        dsp_core.registers[DSP_REG_SR] |= newsr & 0xfe;
                   6117: }
                   6118: 
                   6119: static void dsp_mac_p_y0_x0_a(void)
                   6120: {
                   6121:        Uint32 source[3], dest[3];
                   6122:        Uint16 newsr;
                   6123: 
                   6124:        dsp_mul56(dsp_core.registers[DSP_REG_Y0], dsp_core.registers[DSP_REG_X0], source, SIGN_PLUS);
                   6125: 
                   6126:        dest[0] = dsp_core.registers[DSP_REG_A2];
                   6127:        dest[1] = dsp_core.registers[DSP_REG_A1];
                   6128:        dest[2] = dsp_core.registers[DSP_REG_A0];
                   6129:        newsr = dsp_add56(source, dest);
                   6130: 
                   6131:        dsp_core.registers[DSP_REG_A2] = dest[0];
                   6132:        dsp_core.registers[DSP_REG_A1] = dest[1];
                   6133:        dsp_core.registers[DSP_REG_A0] = dest[2];
                   6134: 
                   6135:        dsp_ccr_update_e_u_n_z(dest[0], dest[1], dest[2]);
                   6136: 
                   6137:        dsp_core.registers[DSP_REG_SR] &= BITMASK(16)-(1<<DSP_SR_V);
                   6138:        dsp_core.registers[DSP_REG_SR] |= newsr & 0xfe;
                   6139: }
                   6140: 
                   6141: static void dsp_mac_m_y0_x0_a(void)
                   6142: {
                   6143:        Uint32 source[3], dest[3];
                   6144:        Uint16 newsr;
                   6145: 
                   6146:        dsp_mul56(dsp_core.registers[DSP_REG_Y0], dsp_core.registers[DSP_REG_X0], source, SIGN_MINUS);
                   6147: 
                   6148:        dest[0] = dsp_core.registers[DSP_REG_A2];
                   6149:        dest[1] = dsp_core.registers[DSP_REG_A1];
                   6150:        dest[2] = dsp_core.registers[DSP_REG_A0];
                   6151:        newsr = dsp_add56(source, dest);
                   6152: 
                   6153:        dsp_core.registers[DSP_REG_A2] = dest[0];
                   6154:        dsp_core.registers[DSP_REG_A1] = dest[1];
                   6155:        dsp_core.registers[DSP_REG_A0] = dest[2];
                   6156: 
                   6157:        dsp_ccr_update_e_u_n_z(dest[0], dest[1], dest[2]);
                   6158: 
                   6159:        dsp_core.registers[DSP_REG_SR] &= BITMASK(16)-(1<<DSP_SR_V);
                   6160:        dsp_core.registers[DSP_REG_SR] |= newsr & 0xfe;
                   6161: }
                   6162: 
                   6163: static void dsp_mac_p_y0_x0_b(void)
                   6164: {
                   6165:        Uint32 source[3], dest[3];
                   6166:        Uint16 newsr;
                   6167: 
                   6168:        dsp_mul56(dsp_core.registers[DSP_REG_Y0], dsp_core.registers[DSP_REG_X0], source, SIGN_PLUS);
                   6169: 
                   6170:        dest[0] = dsp_core.registers[DSP_REG_B2];
                   6171:        dest[1] = dsp_core.registers[DSP_REG_B1];
                   6172:        dest[2] = dsp_core.registers[DSP_REG_B0];
                   6173:        newsr = dsp_add56(source, dest);
                   6174: 
                   6175:        dsp_core.registers[DSP_REG_B2] = dest[0];
                   6176:        dsp_core.registers[DSP_REG_B1] = dest[1];
                   6177:        dsp_core.registers[DSP_REG_B0] = dest[2];
                   6178: 
                   6179:        dsp_ccr_update_e_u_n_z(dest[0], dest[1], dest[2]);
                   6180: 
                   6181:        dsp_core.registers[DSP_REG_SR] &= BITMASK(16)-(1<<DSP_SR_V);
                   6182:        dsp_core.registers[DSP_REG_SR] |= newsr & 0xfe;
                   6183: }
                   6184: 
                   6185: static void dsp_mac_m_y0_x0_b(void)
                   6186: {
                   6187:        Uint32 source[3], dest[3];
                   6188:        Uint16 newsr;
                   6189: 
                   6190:        dsp_mul56(dsp_core.registers[DSP_REG_Y0], dsp_core.registers[DSP_REG_X0], source, SIGN_MINUS);
                   6191: 
                   6192:        dest[0] = dsp_core.registers[DSP_REG_B2];
                   6193:        dest[1] = dsp_core.registers[DSP_REG_B1];
                   6194:        dest[2] = dsp_core.registers[DSP_REG_B0];
                   6195:        newsr = dsp_add56(source, dest);
                   6196: 
                   6197:        dsp_core.registers[DSP_REG_B2] = dest[0];
                   6198:        dsp_core.registers[DSP_REG_B1] = dest[1];
                   6199:        dsp_core.registers[DSP_REG_B0] = dest[2];
                   6200: 
                   6201:        dsp_ccr_update_e_u_n_z(dest[0], dest[1], dest[2]);
                   6202: 
                   6203:        dsp_core.registers[DSP_REG_SR] &= BITMASK(16)-(1<<DSP_SR_V);
                   6204:        dsp_core.registers[DSP_REG_SR] |= newsr & 0xfe;
                   6205: }
                   6206: 
                   6207: static void dsp_mac_p_x1_y0_a(void)
                   6208: {
                   6209:        Uint32 source[3], dest[3];
                   6210:        Uint16 newsr;
                   6211: 
                   6212:        dsp_mul56(dsp_core.registers[DSP_REG_X1], dsp_core.registers[DSP_REG_Y0], source, SIGN_PLUS);
                   6213: 
                   6214:        dest[0] = dsp_core.registers[DSP_REG_A2];
                   6215:        dest[1] = dsp_core.registers[DSP_REG_A1];
                   6216:        dest[2] = dsp_core.registers[DSP_REG_A0];
                   6217:        newsr = dsp_add56(source, dest);
                   6218: 
                   6219:        dsp_core.registers[DSP_REG_A2] = dest[0];
                   6220:        dsp_core.registers[DSP_REG_A1] = dest[1];
                   6221:        dsp_core.registers[DSP_REG_A0] = dest[2];
                   6222: 
                   6223:        dsp_ccr_update_e_u_n_z(dest[0], dest[1], dest[2]);
                   6224: 
                   6225:        dsp_core.registers[DSP_REG_SR] &= BITMASK(16)-(1<<DSP_SR_V);
                   6226:        dsp_core.registers[DSP_REG_SR] |= newsr & 0xfe;
                   6227: }
                   6228: 
                   6229: static void dsp_mac_m_x1_y0_a(void)
                   6230: {
                   6231:        Uint32 source[3], dest[3];
                   6232:        Uint16 newsr;
                   6233: 
                   6234:        dsp_mul56(dsp_core.registers[DSP_REG_X1], dsp_core.registers[DSP_REG_Y0], source, SIGN_MINUS);
                   6235: 
                   6236:        dest[0] = dsp_core.registers[DSP_REG_A2];
                   6237:        dest[1] = dsp_core.registers[DSP_REG_A1];
                   6238:        dest[2] = dsp_core.registers[DSP_REG_A0];
                   6239:        newsr = dsp_add56(source, dest);
                   6240: 
                   6241:        dsp_core.registers[DSP_REG_A2] = dest[0];
                   6242:        dsp_core.registers[DSP_REG_A1] = dest[1];
                   6243:        dsp_core.registers[DSP_REG_A0] = dest[2];
                   6244: 
                   6245:        dsp_ccr_update_e_u_n_z(dest[0], dest[1], dest[2]);
                   6246: 
                   6247:        dsp_core.registers[DSP_REG_SR] &= BITMASK(16)-(1<<DSP_SR_V);
                   6248:        dsp_core.registers[DSP_REG_SR] |= newsr & 0xfe;
                   6249: }
                   6250: 
                   6251: static void dsp_mac_p_x1_y0_b(void)
                   6252: {
                   6253:        Uint32 source[3], dest[3];
                   6254:        Uint16 newsr;
                   6255: 
                   6256:        dsp_mul56(dsp_core.registers[DSP_REG_X1], dsp_core.registers[DSP_REG_Y0], source, SIGN_PLUS);
                   6257: 
                   6258:        dest[0] = dsp_core.registers[DSP_REG_B2];
                   6259:        dest[1] = dsp_core.registers[DSP_REG_B1];
                   6260:        dest[2] = dsp_core.registers[DSP_REG_B0];
                   6261:        newsr = dsp_add56(source, dest);
                   6262: 
                   6263:        dsp_core.registers[DSP_REG_B2] = dest[0];
                   6264:        dsp_core.registers[DSP_REG_B1] = dest[1];
                   6265:        dsp_core.registers[DSP_REG_B0] = dest[2];
                   6266: 
                   6267:        dsp_ccr_update_e_u_n_z(dest[0], dest[1], dest[2]);
                   6268: 
                   6269:        dsp_core.registers[DSP_REG_SR] &= BITMASK(16)-(1<<DSP_SR_V);
                   6270:        dsp_core.registers[DSP_REG_SR] |= newsr & 0xfe;
                   6271: }
                   6272: 
                   6273: static void dsp_mac_m_x1_y0_b(void)
                   6274: {
                   6275:        Uint32 source[3], dest[3];
                   6276:        Uint16 newsr;
                   6277: 
                   6278:        dsp_mul56(dsp_core.registers[DSP_REG_X1], dsp_core.registers[DSP_REG_Y0], source, SIGN_MINUS);
                   6279: 
                   6280:        dest[0] = dsp_core.registers[DSP_REG_B2];
                   6281:        dest[1] = dsp_core.registers[DSP_REG_B1];
                   6282:        dest[2] = dsp_core.registers[DSP_REG_B0];
                   6283:        newsr = dsp_add56(source, dest);
                   6284: 
                   6285:        dsp_core.registers[DSP_REG_B2] = dest[0];
                   6286:        dsp_core.registers[DSP_REG_B1] = dest[1];
                   6287:        dsp_core.registers[DSP_REG_B0] = dest[2];
                   6288: 
                   6289:        dsp_ccr_update_e_u_n_z(dest[0], dest[1], dest[2]);
                   6290: 
                   6291:        dsp_core.registers[DSP_REG_SR] &= BITMASK(16)-(1<<DSP_SR_V);
                   6292:        dsp_core.registers[DSP_REG_SR] |= newsr & 0xfe;
                   6293: }
                   6294: 
                   6295: static void dsp_mac_p_y1_x1_a(void)
                   6296: {
                   6297:        Uint32 source[3], dest[3];
                   6298:        Uint16 newsr;
                   6299: 
                   6300:        dsp_mul56(dsp_core.registers[DSP_REG_Y1], dsp_core.registers[DSP_REG_X1], source, SIGN_PLUS);
                   6301: 
                   6302:        dest[0] = dsp_core.registers[DSP_REG_A2];
                   6303:        dest[1] = dsp_core.registers[DSP_REG_A1];
                   6304:        dest[2] = dsp_core.registers[DSP_REG_A0];
                   6305:        newsr = dsp_add56(source, dest);
                   6306: 
                   6307:        dsp_core.registers[DSP_REG_A2] = dest[0];
                   6308:        dsp_core.registers[DSP_REG_A1] = dest[1];
                   6309:        dsp_core.registers[DSP_REG_A0] = dest[2];
                   6310: 
                   6311:        dsp_ccr_update_e_u_n_z(dest[0], dest[1], dest[2]);
                   6312: 
                   6313:        dsp_core.registers[DSP_REG_SR] &= BITMASK(16)-(1<<DSP_SR_V);
                   6314:        dsp_core.registers[DSP_REG_SR] |= newsr & 0xfe;
                   6315: }
                   6316: 
                   6317: static void dsp_mac_m_y1_x1_a(void)
                   6318: {
                   6319:        Uint32 source[3], dest[3];
                   6320:        Uint16 newsr;
                   6321: 
                   6322:        dsp_mul56(dsp_core.registers[DSP_REG_Y1], dsp_core.registers[DSP_REG_X1], source, SIGN_MINUS);
                   6323: 
                   6324:        dest[0] = dsp_core.registers[DSP_REG_A2];
                   6325:        dest[1] = dsp_core.registers[DSP_REG_A1];
                   6326:        dest[2] = dsp_core.registers[DSP_REG_A0];
                   6327:        newsr = dsp_add56(source, dest);
                   6328: 
                   6329:        dsp_core.registers[DSP_REG_A2] = dest[0];
                   6330:        dsp_core.registers[DSP_REG_A1] = dest[1];
                   6331:        dsp_core.registers[DSP_REG_A0] = dest[2];
                   6332: 
                   6333:        dsp_ccr_update_e_u_n_z(dest[0], dest[1], dest[2]);
                   6334: 
                   6335:        dsp_core.registers[DSP_REG_SR] &= BITMASK(16)-(1<<DSP_SR_V);
                   6336:        dsp_core.registers[DSP_REG_SR] |= newsr & 0xfe;
                   6337: }
                   6338: 
                   6339: static void dsp_mac_p_y1_x1_b(void)
                   6340: {
                   6341:        Uint32 source[3], dest[3];
                   6342:        Uint16 newsr;
                   6343: 
                   6344:        dsp_mul56(dsp_core.registers[DSP_REG_Y1], dsp_core.registers[DSP_REG_X1], source, SIGN_PLUS);
                   6345: 
                   6346:        dest[0] = dsp_core.registers[DSP_REG_B2];
                   6347:        dest[1] = dsp_core.registers[DSP_REG_B1];
                   6348:        dest[2] = dsp_core.registers[DSP_REG_B0];
                   6349:        newsr = dsp_add56(source, dest);
                   6350: 
                   6351:        dsp_core.registers[DSP_REG_B2] = dest[0];
                   6352:        dsp_core.registers[DSP_REG_B1] = dest[1];
                   6353:        dsp_core.registers[DSP_REG_B0] = dest[2];
                   6354: 
                   6355:        dsp_ccr_update_e_u_n_z(dest[0], dest[1], dest[2]);
                   6356: 
                   6357:        dsp_core.registers[DSP_REG_SR] &= BITMASK(16)-(1<<DSP_SR_V);
                   6358:        dsp_core.registers[DSP_REG_SR] |= newsr & 0xfe;
                   6359: }
                   6360: 
                   6361: static void dsp_mac_m_y1_x1_b(void)
                   6362: {
                   6363:        Uint32 source[3], dest[3];
                   6364:        Uint16 newsr;
                   6365: 
                   6366:        dsp_mul56(dsp_core.registers[DSP_REG_Y1], dsp_core.registers[DSP_REG_X1], source, SIGN_MINUS);
                   6367: 
                   6368:        dest[0] = dsp_core.registers[DSP_REG_B2];
                   6369:        dest[1] = dsp_core.registers[DSP_REG_B1];
                   6370:        dest[2] = dsp_core.registers[DSP_REG_B0];
                   6371:        newsr = dsp_add56(source, dest);
                   6372: 
                   6373:        dsp_core.registers[DSP_REG_B2] = dest[0];
                   6374:        dsp_core.registers[DSP_REG_B1] = dest[1];
                   6375:        dsp_core.registers[DSP_REG_B0] = dest[2];
                   6376: 
                   6377:        dsp_ccr_update_e_u_n_z(dest[0], dest[1], dest[2]);
                   6378: 
                   6379:        dsp_core.registers[DSP_REG_SR] &= BITMASK(16)-(1<<DSP_SR_V);
                   6380:        dsp_core.registers[DSP_REG_SR] |= newsr & 0xfe;
                   6381: }
                   6382: 
                   6383: static void dsp_macr_p_x0_x0_a(void)
                   6384: {
                   6385:        Uint32 source[3], dest[3];
                   6386:        Uint16 newsr;
                   6387: 
                   6388:        dsp_mul56(dsp_core.registers[DSP_REG_X0], dsp_core.registers[DSP_REG_X0], source, SIGN_PLUS);
                   6389: 
                   6390:        dest[0] = dsp_core.registers[DSP_REG_A2];
                   6391:        dest[1] = dsp_core.registers[DSP_REG_A1];
                   6392:        dest[2] = dsp_core.registers[DSP_REG_A0];
                   6393:        newsr = dsp_add56(source, dest);
                   6394: 
                   6395:        dsp_rnd56(dest);
                   6396: 
                   6397:        dsp_core.registers[DSP_REG_A2] = dest[0];
                   6398:        dsp_core.registers[DSP_REG_A1] = dest[1];
                   6399:        dsp_core.registers[DSP_REG_A0] = dest[2];
                   6400: 
                   6401:        dsp_ccr_update_e_u_n_z(dest[0], dest[1], dest[2]);
                   6402: 
                   6403:        dsp_core.registers[DSP_REG_SR] &= BITMASK(16)-(1<<DSP_SR_V);
                   6404:        dsp_core.registers[DSP_REG_SR] |= newsr & 0xfe;
                   6405: }
                   6406: 
                   6407: static void dsp_macr_m_x0_x0_a(void)
                   6408: {
                   6409:        Uint32 source[3], dest[3];
                   6410:        Uint16 newsr;
                   6411: 
                   6412:        dsp_mul56(dsp_core.registers[DSP_REG_X0], dsp_core.registers[DSP_REG_X0], source, SIGN_MINUS);
                   6413: 
                   6414:        dest[0] = dsp_core.registers[DSP_REG_A2];
                   6415:        dest[1] = dsp_core.registers[DSP_REG_A1];
                   6416:        dest[2] = dsp_core.registers[DSP_REG_A0];
                   6417:        newsr = dsp_add56(source, dest);
                   6418: 
                   6419:        dsp_rnd56(dest);
                   6420: 
                   6421:        dsp_core.registers[DSP_REG_A2] = dest[0];
                   6422:        dsp_core.registers[DSP_REG_A1] = dest[1];
                   6423:        dsp_core.registers[DSP_REG_A0] = dest[2];
                   6424: 
                   6425:        dsp_ccr_update_e_u_n_z(dest[0], dest[1], dest[2]);
                   6426: 
                   6427:        dsp_core.registers[DSP_REG_SR] &= BITMASK(16)-(1<<DSP_SR_V);
                   6428:        dsp_core.registers[DSP_REG_SR] |= newsr & 0xfe;
                   6429: }
                   6430: static void dsp_macr_p_x0_x0_b(void)
                   6431: {
                   6432:        Uint32 source[3], dest[3];
                   6433:        Uint16 newsr;
                   6434: 
                   6435:        dsp_mul56(dsp_core.registers[DSP_REG_X0], dsp_core.registers[DSP_REG_X0], source, SIGN_PLUS);
                   6436: 
                   6437:        dest[0] = dsp_core.registers[DSP_REG_B2];
                   6438:        dest[1] = dsp_core.registers[DSP_REG_B1];
                   6439:        dest[2] = dsp_core.registers[DSP_REG_B0];
                   6440:        newsr = dsp_add56(source, dest);
                   6441: 
                   6442:        dsp_rnd56(dest);
                   6443: 
                   6444:        dsp_core.registers[DSP_REG_B2] = dest[0];
                   6445:        dsp_core.registers[DSP_REG_B1] = dest[1];
                   6446:        dsp_core.registers[DSP_REG_B0] = dest[2];
                   6447: 
                   6448:        dsp_ccr_update_e_u_n_z(dest[0], dest[1], dest[2]);
                   6449: 
                   6450:        dsp_core.registers[DSP_REG_SR] &= BITMASK(16)-(1<<DSP_SR_V);
                   6451:        dsp_core.registers[DSP_REG_SR] |= newsr & 0xfe;
                   6452: }
                   6453: 
                   6454: static void dsp_macr_m_x0_x0_b(void)
                   6455: {
                   6456:        Uint32 source[3], dest[3];
                   6457:        Uint16 newsr;
                   6458: 
                   6459:        dsp_mul56(dsp_core.registers[DSP_REG_X0], dsp_core.registers[DSP_REG_X0], source, SIGN_MINUS);
                   6460: 
                   6461:        dest[0] = dsp_core.registers[DSP_REG_B2];
                   6462:        dest[1] = dsp_core.registers[DSP_REG_B1];
                   6463:        dest[2] = dsp_core.registers[DSP_REG_B0];
                   6464:        newsr = dsp_add56(source, dest);
                   6465: 
                   6466:        dsp_rnd56(dest);
                   6467: 
                   6468:        dsp_core.registers[DSP_REG_B2] = dest[0];
                   6469:        dsp_core.registers[DSP_REG_B1] = dest[1];
                   6470:        dsp_core.registers[DSP_REG_B0] = dest[2];
                   6471: 
                   6472:        dsp_ccr_update_e_u_n_z(dest[0], dest[1], dest[2]);
                   6473: 
                   6474:        dsp_core.registers[DSP_REG_SR] &= BITMASK(16)-(1<<DSP_SR_V);
                   6475:        dsp_core.registers[DSP_REG_SR] |= newsr & 0xfe;
                   6476: }
                   6477: 
                   6478: static void dsp_macr_p_y0_y0_a(void)
                   6479: {
                   6480:        Uint32 source[3], dest[3];
                   6481:        Uint16 newsr;
                   6482: 
                   6483:        dsp_mul56(dsp_core.registers[DSP_REG_Y0], dsp_core.registers[DSP_REG_Y0], source, SIGN_PLUS);
                   6484: 
                   6485:        dest[0] = dsp_core.registers[DSP_REG_A2];
                   6486:        dest[1] = dsp_core.registers[DSP_REG_A1];
                   6487:        dest[2] = dsp_core.registers[DSP_REG_A0];
                   6488:        newsr = dsp_add56(source, dest);
                   6489: 
                   6490:        dsp_rnd56(dest);
                   6491: 
                   6492:        dsp_core.registers[DSP_REG_A2] = dest[0];
                   6493:        dsp_core.registers[DSP_REG_A1] = dest[1];
                   6494:        dsp_core.registers[DSP_REG_A0] = dest[2];
                   6495: 
                   6496:        dsp_ccr_update_e_u_n_z(dest[0], dest[1], dest[2]);
                   6497: 
                   6498:        dsp_core.registers[DSP_REG_SR] &= BITMASK(16)-(1<<DSP_SR_V);
                   6499:        dsp_core.registers[DSP_REG_SR] |= newsr & 0xfe;
                   6500: }
                   6501: 
                   6502: static void dsp_macr_m_y0_y0_a(void)
                   6503: {
                   6504:        Uint32 source[3], dest[3];
                   6505:        Uint16 newsr;
                   6506: 
                   6507:        dsp_mul56(dsp_core.registers[DSP_REG_Y0], dsp_core.registers[DSP_REG_Y0], source, SIGN_MINUS);
                   6508: 
                   6509:        dest[0] = dsp_core.registers[DSP_REG_A2];
                   6510:        dest[1] = dsp_core.registers[DSP_REG_A1];
                   6511:        dest[2] = dsp_core.registers[DSP_REG_A0];
                   6512:        newsr = dsp_add56(source, dest);
                   6513: 
                   6514:        dsp_rnd56(dest);
                   6515: 
                   6516:        dsp_core.registers[DSP_REG_A2] = dest[0];
                   6517:        dsp_core.registers[DSP_REG_A1] = dest[1];
                   6518:        dsp_core.registers[DSP_REG_A0] = dest[2];
                   6519: 
                   6520:        dsp_ccr_update_e_u_n_z(dest[0], dest[1], dest[2]);
                   6521: 
                   6522:        dsp_core.registers[DSP_REG_SR] &= BITMASK(16)-(1<<DSP_SR_V);
                   6523:        dsp_core.registers[DSP_REG_SR] |= newsr & 0xfe;
                   6524: }
                   6525: static void dsp_macr_p_y0_y0_b(void)
                   6526: {
                   6527:        Uint32 source[3], dest[3];
                   6528:        Uint16 newsr;
                   6529: 
                   6530:        dsp_mul56(dsp_core.registers[DSP_REG_Y0], dsp_core.registers[DSP_REG_Y0], source, SIGN_PLUS);
                   6531: 
                   6532:        dest[0] = dsp_core.registers[DSP_REG_B2];
                   6533:        dest[1] = dsp_core.registers[DSP_REG_B1];
                   6534:        dest[2] = dsp_core.registers[DSP_REG_B0];
                   6535:        newsr = dsp_add56(source, dest);
                   6536: 
                   6537:        dsp_rnd56(dest);
                   6538: 
                   6539:        dsp_core.registers[DSP_REG_B2] = dest[0];
                   6540:        dsp_core.registers[DSP_REG_B1] = dest[1];
                   6541:        dsp_core.registers[DSP_REG_B0] = dest[2];
                   6542: 
                   6543:        dsp_ccr_update_e_u_n_z(dest[0], dest[1], dest[2]);
                   6544: 
                   6545:        dsp_core.registers[DSP_REG_SR] &= BITMASK(16)-(1<<DSP_SR_V);
                   6546:        dsp_core.registers[DSP_REG_SR] |= newsr & 0xfe;
                   6547: }
                   6548: 
                   6549: static void dsp_macr_m_y0_y0_b(void)
                   6550: {
                   6551:        Uint32 source[3], dest[3];
                   6552:        Uint16 newsr;
                   6553: 
                   6554:        dsp_mul56(dsp_core.registers[DSP_REG_Y0], dsp_core.registers[DSP_REG_Y0], source, SIGN_MINUS);
                   6555: 
                   6556:        dest[0] = dsp_core.registers[DSP_REG_B2];
                   6557:        dest[1] = dsp_core.registers[DSP_REG_B1];
                   6558:        dest[2] = dsp_core.registers[DSP_REG_B0];
                   6559:        newsr = dsp_add56(source, dest);
                   6560: 
                   6561:        dsp_rnd56(dest);
                   6562: 
                   6563:        dsp_core.registers[DSP_REG_B2] = dest[0];
                   6564:        dsp_core.registers[DSP_REG_B1] = dest[1];
                   6565:        dsp_core.registers[DSP_REG_B0] = dest[2];
                   6566: 
                   6567:        dsp_ccr_update_e_u_n_z(dest[0], dest[1], dest[2]);
                   6568: 
                   6569:        dsp_core.registers[DSP_REG_SR] &= BITMASK(16)-(1<<DSP_SR_V);
                   6570:        dsp_core.registers[DSP_REG_SR] |= newsr & 0xfe;
                   6571: }
                   6572: 
                   6573: static void dsp_macr_p_x1_x0_a(void)
                   6574: {
                   6575:        Uint32 source[3], dest[3];
                   6576:        Uint16 newsr;
                   6577: 
                   6578:        dsp_mul56(dsp_core.registers[DSP_REG_X1], dsp_core.registers[DSP_REG_X0], source, SIGN_PLUS);
                   6579: 
                   6580:        dest[0] = dsp_core.registers[DSP_REG_A2];
                   6581:        dest[1] = dsp_core.registers[DSP_REG_A1];
                   6582:        dest[2] = dsp_core.registers[DSP_REG_A0];
                   6583:        newsr = dsp_add56(source, dest);
                   6584: 
                   6585:        dsp_rnd56(dest);
                   6586: 
                   6587:        dsp_core.registers[DSP_REG_A2] = dest[0];
                   6588:        dsp_core.registers[DSP_REG_A1] = dest[1];
                   6589:        dsp_core.registers[DSP_REG_A0] = dest[2];
                   6590: 
                   6591:        dsp_ccr_update_e_u_n_z(dest[0], dest[1], dest[2]);
                   6592: 
                   6593:        dsp_core.registers[DSP_REG_SR] &= BITMASK(16)-(1<<DSP_SR_V);
                   6594:        dsp_core.registers[DSP_REG_SR] |= newsr & 0xfe;
                   6595: }
                   6596: 
                   6597: static void dsp_macr_m_x1_x0_a(void)
                   6598: {
                   6599:        Uint32 source[3], dest[3];
                   6600:        Uint16 newsr;
                   6601: 
                   6602:        dsp_mul56(dsp_core.registers[DSP_REG_X1], dsp_core.registers[DSP_REG_X0], source, SIGN_MINUS);
                   6603: 
                   6604:        dest[0] = dsp_core.registers[DSP_REG_A2];
                   6605:        dest[1] = dsp_core.registers[DSP_REG_A1];
                   6606:        dest[2] = dsp_core.registers[DSP_REG_A0];
                   6607:        newsr = dsp_add56(source, dest);
                   6608: 
                   6609:        dsp_rnd56(dest);
                   6610: 
                   6611:        dsp_core.registers[DSP_REG_A2] = dest[0];
                   6612:        dsp_core.registers[DSP_REG_A1] = dest[1];
                   6613:        dsp_core.registers[DSP_REG_A0] = dest[2];
                   6614: 
                   6615:        dsp_ccr_update_e_u_n_z(dest[0], dest[1], dest[2]);
                   6616: 
                   6617:        dsp_core.registers[DSP_REG_SR] &= BITMASK(16)-(1<<DSP_SR_V);
                   6618:        dsp_core.registers[DSP_REG_SR] |= newsr & 0xfe;
                   6619: }
                   6620: 
                   6621: static void dsp_macr_p_x1_x0_b(void)
                   6622: {
                   6623:        Uint32 source[3], dest[3];
                   6624:        Uint16 newsr;
                   6625: 
                   6626:        dsp_mul56(dsp_core.registers[DSP_REG_X1], dsp_core.registers[DSP_REG_X0], source, SIGN_PLUS);
                   6627: 
                   6628:        dest[0] = dsp_core.registers[DSP_REG_B2];
                   6629:        dest[1] = dsp_core.registers[DSP_REG_B1];
                   6630:        dest[2] = dsp_core.registers[DSP_REG_B0];
                   6631:        newsr = dsp_add56(source, dest);
                   6632: 
                   6633:        dsp_rnd56(dest);
                   6634: 
                   6635:        dsp_core.registers[DSP_REG_B2] = dest[0];
                   6636:        dsp_core.registers[DSP_REG_B1] = dest[1];
                   6637:        dsp_core.registers[DSP_REG_B0] = dest[2];
                   6638: 
                   6639:        dsp_ccr_update_e_u_n_z(dest[0], dest[1], dest[2]);
                   6640: 
                   6641:        dsp_core.registers[DSP_REG_SR] &= BITMASK(16)-(1<<DSP_SR_V);
                   6642:        dsp_core.registers[DSP_REG_SR] |= newsr & 0xfe;
                   6643: }
                   6644: 
                   6645: static void dsp_macr_m_x1_x0_b(void)
                   6646: {
                   6647:        Uint32 source[3], dest[3];
                   6648:        Uint16 newsr;
                   6649: 
                   6650:        dsp_mul56(dsp_core.registers[DSP_REG_X1], dsp_core.registers[DSP_REG_X0], source, SIGN_MINUS);
                   6651: 
                   6652:        dest[0] = dsp_core.registers[DSP_REG_B2];
                   6653:        dest[1] = dsp_core.registers[DSP_REG_B1];
                   6654:        dest[2] = dsp_core.registers[DSP_REG_B0];
                   6655:        newsr = dsp_add56(source, dest);
                   6656: 
                   6657:        dsp_rnd56(dest);
                   6658: 
                   6659:        dsp_core.registers[DSP_REG_B2] = dest[0];
                   6660:        dsp_core.registers[DSP_REG_B1] = dest[1];
                   6661:        dsp_core.registers[DSP_REG_B0] = dest[2];
                   6662: 
                   6663:        dsp_ccr_update_e_u_n_z(dest[0], dest[1], dest[2]);
                   6664: 
                   6665:        dsp_core.registers[DSP_REG_SR] &= BITMASK(16)-(1<<DSP_SR_V);
                   6666:        dsp_core.registers[DSP_REG_SR] |= newsr & 0xfe;
                   6667: }
                   6668: 
                   6669: static void dsp_macr_p_y1_y0_a(void)
                   6670: {
                   6671:        Uint32 source[3], dest[3];
                   6672:        Uint16 newsr;
                   6673: 
                   6674:        dsp_mul56(dsp_core.registers[DSP_REG_Y1], dsp_core.registers[DSP_REG_Y0], source, SIGN_PLUS);
                   6675: 
                   6676:        dest[0] = dsp_core.registers[DSP_REG_A2];
                   6677:        dest[1] = dsp_core.registers[DSP_REG_A1];
                   6678:        dest[2] = dsp_core.registers[DSP_REG_A0];
                   6679:        newsr = dsp_add56(source, dest);
                   6680: 
                   6681:        dsp_rnd56(dest);
                   6682: 
                   6683:        dsp_core.registers[DSP_REG_A2] = dest[0];
                   6684:        dsp_core.registers[DSP_REG_A1] = dest[1];
                   6685:        dsp_core.registers[DSP_REG_A0] = dest[2];
                   6686: 
                   6687:        dsp_ccr_update_e_u_n_z(dest[0], dest[1], dest[2]);
                   6688: 
                   6689:        dsp_core.registers[DSP_REG_SR] &= BITMASK(16)-(1<<DSP_SR_V);
                   6690:        dsp_core.registers[DSP_REG_SR] |= newsr & 0xfe;
                   6691: }
                   6692: 
                   6693: static void dsp_macr_m_y1_y0_a(void)
                   6694: {
                   6695:        Uint32 source[3], dest[3];
                   6696:        Uint16 newsr;
                   6697: 
                   6698:        dsp_mul56(dsp_core.registers[DSP_REG_Y1], dsp_core.registers[DSP_REG_Y0], source, SIGN_MINUS);
                   6699: 
                   6700:        dest[0] = dsp_core.registers[DSP_REG_A2];
                   6701:        dest[1] = dsp_core.registers[DSP_REG_A1];
                   6702:        dest[2] = dsp_core.registers[DSP_REG_A0];
                   6703:        newsr = dsp_add56(source, dest);
                   6704: 
                   6705:        dsp_rnd56(dest);
                   6706: 
                   6707:        dsp_core.registers[DSP_REG_A2] = dest[0];
                   6708:        dsp_core.registers[DSP_REG_A1] = dest[1];
                   6709:        dsp_core.registers[DSP_REG_A0] = dest[2];
                   6710: 
                   6711:        dsp_ccr_update_e_u_n_z(dest[0], dest[1], dest[2]);
                   6712: 
                   6713:        dsp_core.registers[DSP_REG_SR] &= BITMASK(16)-(1<<DSP_SR_V);
                   6714:        dsp_core.registers[DSP_REG_SR] |= newsr & 0xfe;
                   6715: }
                   6716: 
                   6717: static void dsp_macr_p_y1_y0_b(void)
                   6718: {
                   6719:        Uint32 source[3], dest[3];
                   6720:        Uint16 newsr;
                   6721: 
                   6722:        dsp_mul56(dsp_core.registers[DSP_REG_Y1], dsp_core.registers[DSP_REG_Y0], source, SIGN_PLUS);
                   6723: 
                   6724:        dest[0] = dsp_core.registers[DSP_REG_B2];
                   6725:        dest[1] = dsp_core.registers[DSP_REG_B1];
                   6726:        dest[2] = dsp_core.registers[DSP_REG_B0];
                   6727:        newsr = dsp_add56(source, dest);
                   6728: 
                   6729:        dsp_rnd56(dest);
                   6730: 
                   6731:        dsp_core.registers[DSP_REG_B2] = dest[0];
                   6732:        dsp_core.registers[DSP_REG_B1] = dest[1];
                   6733:        dsp_core.registers[DSP_REG_B0] = dest[2];
                   6734: 
                   6735:        dsp_ccr_update_e_u_n_z(dest[0], dest[1], dest[2]);
                   6736: 
                   6737:        dsp_core.registers[DSP_REG_SR] &= BITMASK(16)-(1<<DSP_SR_V);
                   6738:        dsp_core.registers[DSP_REG_SR] |= newsr & 0xfe;
                   6739: }
                   6740: 
                   6741: static void dsp_macr_m_y1_y0_b(void)
                   6742: {
                   6743:        Uint32 source[3], dest[3];
                   6744:        Uint16 newsr;
                   6745: 
                   6746:        dsp_mul56(dsp_core.registers[DSP_REG_Y1], dsp_core.registers[DSP_REG_Y0], source, SIGN_MINUS);
                   6747: 
                   6748:        dest[0] = dsp_core.registers[DSP_REG_B2];
                   6749:        dest[1] = dsp_core.registers[DSP_REG_B1];
                   6750:        dest[2] = dsp_core.registers[DSP_REG_B0];
                   6751:        newsr = dsp_add56(source, dest);
                   6752: 
                   6753:        dsp_rnd56(dest);
                   6754: 
                   6755:        dsp_core.registers[DSP_REG_B2] = dest[0];
                   6756:        dsp_core.registers[DSP_REG_B1] = dest[1];
                   6757:        dsp_core.registers[DSP_REG_B0] = dest[2];
                   6758: 
                   6759:        dsp_ccr_update_e_u_n_z(dest[0], dest[1], dest[2]);
                   6760: 
                   6761:        dsp_core.registers[DSP_REG_SR] &= BITMASK(16)-(1<<DSP_SR_V);
                   6762:        dsp_core.registers[DSP_REG_SR] |= newsr & 0xfe;
                   6763: }
                   6764: 
                   6765: static void dsp_macr_p_x0_y1_a(void)
                   6766: {
                   6767:        Uint32 source[3], dest[3];
                   6768:        Uint16 newsr;
                   6769: 
                   6770:        dsp_mul56(dsp_core.registers[DSP_REG_X0], dsp_core.registers[DSP_REG_Y1], source, SIGN_PLUS);
                   6771: 
                   6772:        dest[0] = dsp_core.registers[DSP_REG_A2];
                   6773:        dest[1] = dsp_core.registers[DSP_REG_A1];
                   6774:        dest[2] = dsp_core.registers[DSP_REG_A0];
                   6775:        newsr = dsp_add56(source, dest);
                   6776: 
                   6777:        dsp_rnd56(dest);
                   6778: 
                   6779:        dsp_core.registers[DSP_REG_A2] = dest[0];
                   6780:        dsp_core.registers[DSP_REG_A1] = dest[1];
                   6781:        dsp_core.registers[DSP_REG_A0] = dest[2];
                   6782: 
                   6783:        dsp_ccr_update_e_u_n_z(dest[0], dest[1], dest[2]);
                   6784: 
                   6785:        dsp_core.registers[DSP_REG_SR] &= BITMASK(16)-(1<<DSP_SR_V);
                   6786:        dsp_core.registers[DSP_REG_SR] |= newsr & 0xfe;
                   6787: }
                   6788: 
                   6789: static void dsp_macr_m_x0_y1_a(void)
                   6790: {
                   6791:        Uint32 source[3], dest[3];
                   6792:        Uint16 newsr;
                   6793: 
                   6794:        dsp_mul56(dsp_core.registers[DSP_REG_X0], dsp_core.registers[DSP_REG_Y1], source, SIGN_MINUS);
                   6795: 
                   6796:        dest[0] = dsp_core.registers[DSP_REG_A2];
                   6797:        dest[1] = dsp_core.registers[DSP_REG_A1];
                   6798:        dest[2] = dsp_core.registers[DSP_REG_A0];
                   6799:        newsr = dsp_add56(source, dest);
                   6800: 
                   6801:        dsp_rnd56(dest);
                   6802: 
                   6803:        dsp_core.registers[DSP_REG_A2] = dest[0];
                   6804:        dsp_core.registers[DSP_REG_A1] = dest[1];
                   6805:        dsp_core.registers[DSP_REG_A0] = dest[2];
                   6806: 
                   6807:        dsp_ccr_update_e_u_n_z(dest[0], dest[1], dest[2]);
                   6808: 
                   6809:        dsp_core.registers[DSP_REG_SR] &= BITMASK(16)-(1<<DSP_SR_V);
                   6810:        dsp_core.registers[DSP_REG_SR] |= newsr & 0xfe;
                   6811: }
                   6812: 
                   6813: static void dsp_macr_p_x0_y1_b(void)
                   6814: {
                   6815:        Uint32 source[3], dest[3];
                   6816:        Uint16 newsr;
                   6817: 
                   6818:        dsp_mul56(dsp_core.registers[DSP_REG_X0], dsp_core.registers[DSP_REG_Y1], source, SIGN_PLUS);
                   6819: 
                   6820:        dest[0] = dsp_core.registers[DSP_REG_B2];
                   6821:        dest[1] = dsp_core.registers[DSP_REG_B1];
                   6822:        dest[2] = dsp_core.registers[DSP_REG_B0];
                   6823:        newsr = dsp_add56(source, dest);
                   6824: 
                   6825:        dsp_rnd56(dest);
                   6826: 
                   6827:        dsp_core.registers[DSP_REG_B2] = dest[0];
                   6828:        dsp_core.registers[DSP_REG_B1] = dest[1];
                   6829:        dsp_core.registers[DSP_REG_B0] = dest[2];
                   6830: 
                   6831:        dsp_ccr_update_e_u_n_z(dest[0], dest[1], dest[2]);
                   6832: 
                   6833:        dsp_core.registers[DSP_REG_SR] &= BITMASK(16)-(1<<DSP_SR_V);
                   6834:        dsp_core.registers[DSP_REG_SR] |= newsr & 0xfe;
                   6835: }
                   6836: 
                   6837: static void dsp_macr_m_x0_y1_b(void)
                   6838: {
                   6839:        Uint32 source[3], dest[3];
                   6840:        Uint16 newsr;
                   6841: 
                   6842:        dsp_mul56(dsp_core.registers[DSP_REG_X0], dsp_core.registers[DSP_REG_Y1], source, SIGN_MINUS);
                   6843: 
                   6844:        dest[0] = dsp_core.registers[DSP_REG_B2];
                   6845:        dest[1] = dsp_core.registers[DSP_REG_B1];
                   6846:        dest[2] = dsp_core.registers[DSP_REG_B0];
                   6847:        newsr = dsp_add56(source, dest);
                   6848: 
                   6849:        dsp_rnd56(dest);
                   6850: 
                   6851:        dsp_core.registers[DSP_REG_B2] = dest[0];
                   6852:        dsp_core.registers[DSP_REG_B1] = dest[1];
                   6853:        dsp_core.registers[DSP_REG_B0] = dest[2];
                   6854: 
                   6855:        dsp_ccr_update_e_u_n_z(dest[0], dest[1], dest[2]);
                   6856: 
                   6857:        dsp_core.registers[DSP_REG_SR] &= BITMASK(16)-(1<<DSP_SR_V);
                   6858:        dsp_core.registers[DSP_REG_SR] |= newsr & 0xfe;
                   6859: }
                   6860: 
                   6861: static void dsp_macr_p_y0_x0_a(void)
                   6862: {
                   6863:        Uint32 source[3], dest[3];
                   6864:        Uint16 newsr;
                   6865: 
                   6866:        dsp_mul56(dsp_core.registers[DSP_REG_Y0], dsp_core.registers[DSP_REG_X0], source, SIGN_PLUS);
                   6867: 
                   6868:        dest[0] = dsp_core.registers[DSP_REG_A2];
                   6869:        dest[1] = dsp_core.registers[DSP_REG_A1];
                   6870:        dest[2] = dsp_core.registers[DSP_REG_A0];
                   6871:        newsr = dsp_add56(source, dest);
                   6872: 
                   6873:        dsp_rnd56(dest);
                   6874: 
                   6875:        dsp_core.registers[DSP_REG_A2] = dest[0];
                   6876:        dsp_core.registers[DSP_REG_A1] = dest[1];
                   6877:        dsp_core.registers[DSP_REG_A0] = dest[2];
                   6878: 
                   6879:        dsp_ccr_update_e_u_n_z(dest[0], dest[1], dest[2]);
                   6880: 
                   6881:        dsp_core.registers[DSP_REG_SR] &= BITMASK(16)-(1<<DSP_SR_V);
                   6882:        dsp_core.registers[DSP_REG_SR] |= newsr & 0xfe;
                   6883: }
                   6884: 
                   6885: static void dsp_macr_m_y0_x0_a(void)
                   6886: {
                   6887:        Uint32 source[3], dest[3];
                   6888:        Uint16 newsr;
                   6889: 
                   6890:        dsp_mul56(dsp_core.registers[DSP_REG_Y0], dsp_core.registers[DSP_REG_X0], source, SIGN_MINUS);
                   6891: 
                   6892:        dest[0] = dsp_core.registers[DSP_REG_A2];
                   6893:        dest[1] = dsp_core.registers[DSP_REG_A1];
                   6894:        dest[2] = dsp_core.registers[DSP_REG_A0];
                   6895:        newsr = dsp_add56(source, dest);
                   6896: 
                   6897:        dsp_rnd56(dest);
                   6898: 
                   6899:        dsp_core.registers[DSP_REG_A2] = dest[0];
                   6900:        dsp_core.registers[DSP_REG_A1] = dest[1];
                   6901:        dsp_core.registers[DSP_REG_A0] = dest[2];
                   6902: 
                   6903:        dsp_ccr_update_e_u_n_z(dest[0], dest[1], dest[2]);
                   6904: 
                   6905:        dsp_core.registers[DSP_REG_SR] &= BITMASK(16)-(1<<DSP_SR_V);
                   6906:        dsp_core.registers[DSP_REG_SR] |= newsr & 0xfe;
                   6907: }
                   6908: 
                   6909: static void dsp_macr_p_y0_x0_b(void)
                   6910: {
                   6911:        Uint32 source[3], dest[3];
                   6912:        Uint16 newsr;
                   6913: 
                   6914:        dsp_mul56(dsp_core.registers[DSP_REG_Y0], dsp_core.registers[DSP_REG_X0], source, SIGN_PLUS);
                   6915: 
                   6916:        dest[0] = dsp_core.registers[DSP_REG_B2];
                   6917:        dest[1] = dsp_core.registers[DSP_REG_B1];
                   6918:        dest[2] = dsp_core.registers[DSP_REG_B0];
                   6919:        newsr = dsp_add56(source, dest);
                   6920: 
                   6921:        dsp_rnd56(dest);
                   6922: 
                   6923:        dsp_core.registers[DSP_REG_B2] = dest[0];
                   6924:        dsp_core.registers[DSP_REG_B1] = dest[1];
                   6925:        dsp_core.registers[DSP_REG_B0] = dest[2];
                   6926: 
                   6927:        dsp_ccr_update_e_u_n_z(dest[0], dest[1], dest[2]);
                   6928: 
                   6929:        dsp_core.registers[DSP_REG_SR] &= BITMASK(16)-(1<<DSP_SR_V);
                   6930:        dsp_core.registers[DSP_REG_SR] |= newsr & 0xfe;
                   6931: }
                   6932: 
                   6933: static void dsp_macr_m_y0_x0_b(void)
                   6934: {
                   6935:        Uint32 source[3], dest[3];
                   6936:        Uint16 newsr;
                   6937: 
                   6938:        dsp_mul56(dsp_core.registers[DSP_REG_Y0], dsp_core.registers[DSP_REG_X0], source, SIGN_MINUS);
                   6939: 
                   6940:        dest[0] = dsp_core.registers[DSP_REG_B2];
                   6941:        dest[1] = dsp_core.registers[DSP_REG_B1];
                   6942:        dest[2] = dsp_core.registers[DSP_REG_B0];
                   6943:        newsr = dsp_add56(source, dest);
                   6944: 
                   6945:        dsp_rnd56(dest);
                   6946: 
                   6947:        dsp_core.registers[DSP_REG_B2] = dest[0];
                   6948:        dsp_core.registers[DSP_REG_B1] = dest[1];
                   6949:        dsp_core.registers[DSP_REG_B0] = dest[2];
                   6950: 
                   6951:        dsp_ccr_update_e_u_n_z(dest[0], dest[1], dest[2]);
                   6952: 
                   6953:        dsp_core.registers[DSP_REG_SR] &= BITMASK(16)-(1<<DSP_SR_V);
                   6954:        dsp_core.registers[DSP_REG_SR] |= newsr & 0xfe;
                   6955: }
                   6956: 
                   6957: static void dsp_macr_p_x1_y0_a(void)
                   6958: {
                   6959:        Uint32 source[3], dest[3];
                   6960:        Uint16 newsr;
                   6961: 
                   6962:        dsp_mul56(dsp_core.registers[DSP_REG_X1], dsp_core.registers[DSP_REG_Y0], source, SIGN_PLUS);
                   6963: 
                   6964:        dest[0] = dsp_core.registers[DSP_REG_A2];
                   6965:        dest[1] = dsp_core.registers[DSP_REG_A1];
                   6966:        dest[2] = dsp_core.registers[DSP_REG_A0];
                   6967:        newsr = dsp_add56(source, dest);
                   6968: 
                   6969:        dsp_rnd56(dest);
                   6970: 
                   6971:        dsp_core.registers[DSP_REG_A2] = dest[0];
                   6972:        dsp_core.registers[DSP_REG_A1] = dest[1];
                   6973:        dsp_core.registers[DSP_REG_A0] = dest[2];
                   6974: 
                   6975:        dsp_ccr_update_e_u_n_z(dest[0], dest[1], dest[2]);
                   6976: 
                   6977:        dsp_core.registers[DSP_REG_SR] &= BITMASK(16)-(1<<DSP_SR_V);
                   6978:        dsp_core.registers[DSP_REG_SR] |= newsr & 0xfe;
                   6979: }
                   6980: 
                   6981: static void dsp_macr_m_x1_y0_a(void)
                   6982: {
                   6983:        Uint32 source[3], dest[3];
                   6984:        Uint16 newsr;
                   6985: 
                   6986:        dsp_mul56(dsp_core.registers[DSP_REG_X1], dsp_core.registers[DSP_REG_Y0], source, SIGN_MINUS);
                   6987: 
                   6988:        dest[0] = dsp_core.registers[DSP_REG_A2];
                   6989:        dest[1] = dsp_core.registers[DSP_REG_A1];
                   6990:        dest[2] = dsp_core.registers[DSP_REG_A0];
                   6991:        newsr = dsp_add56(source, dest);
                   6992: 
                   6993:        dsp_rnd56(dest);
                   6994: 
                   6995:        dsp_core.registers[DSP_REG_A2] = dest[0];
                   6996:        dsp_core.registers[DSP_REG_A1] = dest[1];
                   6997:        dsp_core.registers[DSP_REG_A0] = dest[2];
                   6998: 
                   6999:        dsp_ccr_update_e_u_n_z(dest[0], dest[1], dest[2]);
                   7000: 
                   7001:        dsp_core.registers[DSP_REG_SR] &= BITMASK(16)-(1<<DSP_SR_V);
                   7002:        dsp_core.registers[DSP_REG_SR] |= newsr & 0xfe;
                   7003: }
                   7004: 
                   7005: static void dsp_macr_p_x1_y0_b(void)
                   7006: {
                   7007:        Uint32 source[3], dest[3];
                   7008:        Uint16 newsr;
                   7009: 
                   7010:        dsp_mul56(dsp_core.registers[DSP_REG_X1], dsp_core.registers[DSP_REG_Y0], source, SIGN_PLUS);
                   7011: 
                   7012:        dest[0] = dsp_core.registers[DSP_REG_B2];
                   7013:        dest[1] = dsp_core.registers[DSP_REG_B1];
                   7014:        dest[2] = dsp_core.registers[DSP_REG_B0];
                   7015:        newsr = dsp_add56(source, dest);
                   7016: 
1.1.1.10  root     7017:        dsp_rnd56(dest);
                   7018: 
1.1.1.6   root     7019:        dsp_core.registers[DSP_REG_B2] = dest[0];
                   7020:        dsp_core.registers[DSP_REG_B1] = dest[1];
                   7021:        dsp_core.registers[DSP_REG_B0] = dest[2];
                   7022: 
                   7023:        dsp_ccr_update_e_u_n_z(dest[0], dest[1], dest[2]);
                   7024: 
                   7025:        dsp_core.registers[DSP_REG_SR] &= BITMASK(16)-(1<<DSP_SR_V);
                   7026:        dsp_core.registers[DSP_REG_SR] |= newsr & 0xfe;
                   7027: }
                   7028: 
                   7029: static void dsp_macr_m_x1_y0_b(void)
                   7030: {
                   7031:        Uint32 source[3], dest[3];
                   7032:        Uint16 newsr;
                   7033: 
                   7034:        dsp_mul56(dsp_core.registers[DSP_REG_X1], dsp_core.registers[DSP_REG_Y0], source, SIGN_MINUS);
                   7035: 
                   7036:        dest[0] = dsp_core.registers[DSP_REG_B2];
                   7037:        dest[1] = dsp_core.registers[DSP_REG_B1];
                   7038:        dest[2] = dsp_core.registers[DSP_REG_B0];
                   7039:        newsr = dsp_add56(source, dest);
                   7040: 
                   7041:        dsp_rnd56(dest);
                   7042: 
                   7043:        dsp_core.registers[DSP_REG_B2] = dest[0];
                   7044:        dsp_core.registers[DSP_REG_B1] = dest[1];
                   7045:        dsp_core.registers[DSP_REG_B0] = dest[2];
                   7046: 
                   7047:        dsp_ccr_update_e_u_n_z(dest[0], dest[1], dest[2]);
                   7048: 
                   7049:        dsp_core.registers[DSP_REG_SR] &= BITMASK(16)-(1<<DSP_SR_V);
                   7050:        dsp_core.registers[DSP_REG_SR] |= newsr & 0xfe;
                   7051: }
                   7052: 
                   7053: static void dsp_macr_p_y1_x1_a(void)
                   7054: {
                   7055:        Uint32 source[3], dest[3];
                   7056:        Uint16 newsr;
                   7057: 
                   7058:        dsp_mul56(dsp_core.registers[DSP_REG_Y1], dsp_core.registers[DSP_REG_X1], source, SIGN_PLUS);
                   7059: 
                   7060:        dest[0] = dsp_core.registers[DSP_REG_A2];
                   7061:        dest[1] = dsp_core.registers[DSP_REG_A1];
                   7062:        dest[2] = dsp_core.registers[DSP_REG_A0];
                   7063:        newsr = dsp_add56(source, dest);
                   7064: 
                   7065:        dsp_rnd56(dest);
                   7066: 
                   7067:        dsp_core.registers[DSP_REG_A2] = dest[0];
                   7068:        dsp_core.registers[DSP_REG_A1] = dest[1];
                   7069:        dsp_core.registers[DSP_REG_A0] = dest[2];
                   7070: 
                   7071:        dsp_ccr_update_e_u_n_z(dest[0], dest[1], dest[2]);
                   7072: 
                   7073:        dsp_core.registers[DSP_REG_SR] &= BITMASK(16)-(1<<DSP_SR_V);
                   7074:        dsp_core.registers[DSP_REG_SR] |= newsr & 0xfe;
                   7075: }
                   7076: 
                   7077: static void dsp_macr_m_y1_x1_a(void)
                   7078: {
                   7079:        Uint32 source[3], dest[3];
                   7080:        Uint16 newsr;
                   7081: 
                   7082:        dsp_mul56(dsp_core.registers[DSP_REG_Y1], dsp_core.registers[DSP_REG_X1], source, SIGN_MINUS);
                   7083: 
                   7084:        dest[0] = dsp_core.registers[DSP_REG_A2];
                   7085:        dest[1] = dsp_core.registers[DSP_REG_A1];
                   7086:        dest[2] = dsp_core.registers[DSP_REG_A0];
                   7087:        newsr = dsp_add56(source, dest);
                   7088: 
                   7089:        dsp_rnd56(dest);
                   7090: 
                   7091:        dsp_core.registers[DSP_REG_A2] = dest[0];
                   7092:        dsp_core.registers[DSP_REG_A1] = dest[1];
                   7093:        dsp_core.registers[DSP_REG_A0] = dest[2];
                   7094: 
                   7095:        dsp_ccr_update_e_u_n_z(dest[0], dest[1], dest[2]);
                   7096: 
                   7097:        dsp_core.registers[DSP_REG_SR] &= BITMASK(16)-(1<<DSP_SR_V);
                   7098:        dsp_core.registers[DSP_REG_SR] |= newsr & 0xfe;
                   7099: }
                   7100: 
                   7101: static void dsp_macr_p_y1_x1_b(void)
                   7102: {
                   7103:        Uint32 source[3], dest[3];
                   7104:        Uint16 newsr;
                   7105: 
                   7106:        dsp_mul56(dsp_core.registers[DSP_REG_Y1], dsp_core.registers[DSP_REG_X1], source, SIGN_PLUS);
                   7107: 
                   7108:        dest[0] = dsp_core.registers[DSP_REG_B2];
                   7109:        dest[1] = dsp_core.registers[DSP_REG_B1];
                   7110:        dest[2] = dsp_core.registers[DSP_REG_B0];
                   7111:        newsr = dsp_add56(source, dest);
                   7112: 
                   7113:        dsp_rnd56(dest);
                   7114: 
                   7115:        dsp_core.registers[DSP_REG_B2] = dest[0];
                   7116:        dsp_core.registers[DSP_REG_B1] = dest[1];
                   7117:        dsp_core.registers[DSP_REG_B0] = dest[2];
                   7118: 
                   7119:        dsp_ccr_update_e_u_n_z(dest[0], dest[1], dest[2]);
                   7120: 
                   7121:        dsp_core.registers[DSP_REG_SR] &= BITMASK(16)-(1<<DSP_SR_V);
                   7122:        dsp_core.registers[DSP_REG_SR] |= newsr & 0xfe;
                   7123: }
                   7124: 
                   7125: static void dsp_macr_m_y1_x1_b(void)
                   7126: {
                   7127:        Uint32 source[3], dest[3];
                   7128:        Uint16 newsr;
                   7129: 
                   7130:        dsp_mul56(dsp_core.registers[DSP_REG_Y1], dsp_core.registers[DSP_REG_X1], source, SIGN_MINUS);
                   7131: 
                   7132:        dest[0] = dsp_core.registers[DSP_REG_B2];
                   7133:        dest[1] = dsp_core.registers[DSP_REG_B1];
                   7134:        dest[2] = dsp_core.registers[DSP_REG_B0];
                   7135:        newsr = dsp_add56(source, dest);
                   7136: 
                   7137:        dsp_rnd56(dest);
                   7138: 
                   7139:        dsp_core.registers[DSP_REG_B2] = dest[0];
                   7140:        dsp_core.registers[DSP_REG_B1] = dest[1];
                   7141:        dsp_core.registers[DSP_REG_B0] = dest[2];
                   7142: 
                   7143:        dsp_ccr_update_e_u_n_z(dest[0], dest[1], dest[2]);
                   7144: 
                   7145:        dsp_core.registers[DSP_REG_SR] &= BITMASK(16)-(1<<DSP_SR_V);
                   7146:        dsp_core.registers[DSP_REG_SR] |= newsr & 0xfe;
                   7147: }
                   7148: 
                   7149: 
                   7150: static void dsp_move(void)
                   7151: {
                   7152:        /*      move instruction inside alu opcodes
                   7153:                taken care of by parallel move dispatcher */
                   7154: }
                   7155: 
                   7156: static void dsp_mpy_p_x0_x0_a(void)
                   7157: {
                   7158:        Uint32 source[3];
                   7159: 
                   7160:        dsp_mul56(dsp_core.registers[DSP_REG_X0], dsp_core.registers[DSP_REG_X0], source, SIGN_PLUS);
                   7161: 
                   7162:        dsp_core.registers[DSP_REG_A2] = source[0];
                   7163:        dsp_core.registers[DSP_REG_A1] = source[1];
                   7164:        dsp_core.registers[DSP_REG_A0] = source[2];
                   7165: 
                   7166:        dsp_ccr_update_e_u_n_z(source[0], source[1], source[2]);
                   7167:        dsp_core.registers[DSP_REG_SR] &= BITMASK(16)-(1<<DSP_SR_V);
                   7168: }
                   7169: 
                   7170: static void dsp_mpy_m_x0_x0_a(void)
                   7171: {
                   7172:        Uint32 source[3];
                   7173: 
                   7174:        dsp_mul56(dsp_core.registers[DSP_REG_X0], dsp_core.registers[DSP_REG_X0], source, SIGN_MINUS);
                   7175: 
                   7176:        dsp_core.registers[DSP_REG_A2] = source[0];
                   7177:        dsp_core.registers[DSP_REG_A1] = source[1];
                   7178:        dsp_core.registers[DSP_REG_A0] = source[2];
                   7179: 
                   7180:        dsp_ccr_update_e_u_n_z(source[0], source[1], source[2]);
                   7181:        dsp_core.registers[DSP_REG_SR] &= BITMASK(16)-(1<<DSP_SR_V);
                   7182: }
                   7183: 
                   7184: static void dsp_mpy_p_x0_x0_b(void)
                   7185: {
                   7186:        Uint32 source[3];
                   7187: 
                   7188:        dsp_mul56(dsp_core.registers[DSP_REG_X0], dsp_core.registers[DSP_REG_X0], source, SIGN_PLUS);
                   7189: 
                   7190:        dsp_core.registers[DSP_REG_B2] = source[0];
                   7191:        dsp_core.registers[DSP_REG_B1] = source[1];
                   7192:        dsp_core.registers[DSP_REG_B0] = source[2];
                   7193: 
                   7194:        dsp_ccr_update_e_u_n_z(source[0], source[1], source[2]);
                   7195:        dsp_core.registers[DSP_REG_SR] &= BITMASK(16)-(1<<DSP_SR_V);
                   7196: }
                   7197: 
                   7198: static void dsp_mpy_m_x0_x0_b(void)
                   7199: {
                   7200:        Uint32 source[3];
                   7201: 
                   7202: 
                   7203:        dsp_mul56(dsp_core.registers[DSP_REG_X0], dsp_core.registers[DSP_REG_X0], source, SIGN_MINUS);
                   7204: 
                   7205:        dsp_core.registers[DSP_REG_B2] = source[0];
                   7206:        dsp_core.registers[DSP_REG_B1] = source[1];
                   7207:        dsp_core.registers[DSP_REG_B0] = source[2];
                   7208: 
                   7209:        dsp_ccr_update_e_u_n_z(source[0], source[1], source[2]);
                   7210:        dsp_core.registers[DSP_REG_SR] &= BITMASK(16)-(1<<DSP_SR_V);
                   7211: }
                   7212: 
                   7213: static void dsp_mpy_p_y0_y0_a(void)
                   7214: {
                   7215:        Uint32 source[3];
                   7216: 
                   7217:        dsp_mul56(dsp_core.registers[DSP_REG_Y0], dsp_core.registers[DSP_REG_Y0], source, SIGN_PLUS);
                   7218: 
                   7219:        dsp_core.registers[DSP_REG_A2] = source[0];
                   7220:        dsp_core.registers[DSP_REG_A1] = source[1];
                   7221:        dsp_core.registers[DSP_REG_A0] = source[2];
                   7222: 
                   7223:        dsp_ccr_update_e_u_n_z(source[0], source[1], source[2]);
                   7224:        dsp_core.registers[DSP_REG_SR] &= BITMASK(16)-(1<<DSP_SR_V);
                   7225: }
                   7226: 
                   7227: static void dsp_mpy_m_y0_y0_a(void)
                   7228: {
                   7229:        Uint32 source[3];
                   7230: 
                   7231:        dsp_mul56(dsp_core.registers[DSP_REG_Y0], dsp_core.registers[DSP_REG_Y0], source, SIGN_MINUS);
                   7232: 
                   7233:        dsp_core.registers[DSP_REG_A2] = source[0];
                   7234:        dsp_core.registers[DSP_REG_A1] = source[1];
                   7235:        dsp_core.registers[DSP_REG_A0] = source[2];
                   7236: 
                   7237:        dsp_ccr_update_e_u_n_z(source[0], source[1], source[2]);
                   7238:        dsp_core.registers[DSP_REG_SR] &= BITMASK(16)-(1<<DSP_SR_V);
                   7239: }
                   7240: 
                   7241: static void dsp_mpy_p_y0_y0_b(void)
                   7242: {
                   7243:        Uint32 source[3];
                   7244: 
                   7245:        dsp_mul56(dsp_core.registers[DSP_REG_Y0], dsp_core.registers[DSP_REG_Y0], source, SIGN_PLUS);
                   7246: 
                   7247:        dsp_core.registers[DSP_REG_B2] = source[0];
                   7248:        dsp_core.registers[DSP_REG_B1] = source[1];
                   7249:        dsp_core.registers[DSP_REG_B0] = source[2];
                   7250: 
                   7251:        dsp_ccr_update_e_u_n_z(source[0], source[1], source[2]);
                   7252:        dsp_core.registers[DSP_REG_SR] &= BITMASK(16)-(1<<DSP_SR_V);
                   7253: }
                   7254: 
                   7255: static void dsp_mpy_m_y0_y0_b(void)
                   7256: {
                   7257:        Uint32 source[3];
                   7258: 
                   7259:        dsp_mul56(dsp_core.registers[DSP_REG_Y0], dsp_core.registers[DSP_REG_Y0], source, SIGN_MINUS);
                   7260: 
                   7261:        dsp_core.registers[DSP_REG_B2] = source[0];
                   7262:        dsp_core.registers[DSP_REG_B1] = source[1];
                   7263:        dsp_core.registers[DSP_REG_B0] = source[2];
                   7264: 
                   7265:        dsp_ccr_update_e_u_n_z(source[0], source[1], source[2]);
                   7266:        dsp_core.registers[DSP_REG_SR] &= BITMASK(16)-(1<<DSP_SR_V);
                   7267: }
                   7268: 
                   7269: static void dsp_mpy_p_x1_x0_a(void)
                   7270: {
                   7271:        Uint32 source[3];
                   7272: 
                   7273:        dsp_mul56(dsp_core.registers[DSP_REG_X1], dsp_core.registers[DSP_REG_X0], source, SIGN_PLUS);
                   7274: 
                   7275:        dsp_core.registers[DSP_REG_A2] = source[0];
                   7276:        dsp_core.registers[DSP_REG_A1] = source[1];
                   7277:        dsp_core.registers[DSP_REG_A0] = source[2];
                   7278: 
                   7279:        dsp_ccr_update_e_u_n_z(source[0], source[1], source[2]);
                   7280:        dsp_core.registers[DSP_REG_SR] &= BITMASK(16)-(1<<DSP_SR_V);
                   7281: }
                   7282: 
                   7283: static void dsp_mpy_m_x1_x0_a(void)
                   7284: {
                   7285:        Uint32 source[3];
                   7286: 
                   7287:        dsp_mul56(dsp_core.registers[DSP_REG_X1], dsp_core.registers[DSP_REG_X0], source, SIGN_MINUS);
                   7288: 
                   7289:        dsp_core.registers[DSP_REG_A2] = source[0];
                   7290:        dsp_core.registers[DSP_REG_A1] = source[1];
                   7291:        dsp_core.registers[DSP_REG_A0] = source[2];
                   7292: 
                   7293:        dsp_ccr_update_e_u_n_z(source[0], source[1], source[2]);
                   7294:        dsp_core.registers[DSP_REG_SR] &= BITMASK(16)-(1<<DSP_SR_V);
                   7295: }
                   7296: 
                   7297: static void dsp_mpy_p_x1_x0_b(void)
                   7298: {
                   7299:        Uint32 source[3];
                   7300: 
                   7301:        dsp_mul56(dsp_core.registers[DSP_REG_X1], dsp_core.registers[DSP_REG_X0], source, SIGN_PLUS);
                   7302: 
                   7303:        dsp_core.registers[DSP_REG_B2] = source[0];
                   7304:        dsp_core.registers[DSP_REG_B1] = source[1];
                   7305:        dsp_core.registers[DSP_REG_B0] = source[2];
                   7306: 
                   7307:        dsp_ccr_update_e_u_n_z(source[0], source[1], source[2]);
                   7308:        dsp_core.registers[DSP_REG_SR] &= BITMASK(16)-(1<<DSP_SR_V);
                   7309: }
                   7310: 
                   7311: static void dsp_mpy_m_x1_x0_b(void)
                   7312: {
                   7313:        Uint32 source[3];
                   7314: 
                   7315:        dsp_mul56(dsp_core.registers[DSP_REG_X1], dsp_core.registers[DSP_REG_X0], source, SIGN_MINUS);
                   7316: 
                   7317:        dsp_core.registers[DSP_REG_B2] = source[0];
                   7318:        dsp_core.registers[DSP_REG_B1] = source[1];
                   7319:        dsp_core.registers[DSP_REG_B0] = source[2];
                   7320: 
                   7321:        dsp_ccr_update_e_u_n_z(source[0], source[1], source[2]);
                   7322:        dsp_core.registers[DSP_REG_SR] &= BITMASK(16)-(1<<DSP_SR_V);
                   7323: }
                   7324: 
                   7325: static void dsp_mpy_p_y1_y0_a(void)
                   7326: {
                   7327:        Uint32 source[3];
                   7328: 
                   7329:        dsp_mul56(dsp_core.registers[DSP_REG_Y1], dsp_core.registers[DSP_REG_Y0], source, SIGN_PLUS);
                   7330: 
                   7331:        dsp_core.registers[DSP_REG_A2] = source[0];
                   7332:        dsp_core.registers[DSP_REG_A1] = source[1];
                   7333:        dsp_core.registers[DSP_REG_A0] = source[2];
                   7334: 
                   7335:        dsp_ccr_update_e_u_n_z(source[0], source[1], source[2]);
                   7336:        dsp_core.registers[DSP_REG_SR] &= BITMASK(16)-(1<<DSP_SR_V);
                   7337: }
                   7338: 
                   7339: static void dsp_mpy_m_y1_y0_a(void)
                   7340: {
                   7341:        Uint32 source[3];
                   7342: 
                   7343:        dsp_mul56(dsp_core.registers[DSP_REG_Y1], dsp_core.registers[DSP_REG_Y0], source, SIGN_MINUS);
                   7344: 
                   7345:        dsp_core.registers[DSP_REG_A2] = source[0];
                   7346:        dsp_core.registers[DSP_REG_A1] = source[1];
                   7347:        dsp_core.registers[DSP_REG_A0] = source[2];
                   7348: 
                   7349:        dsp_ccr_update_e_u_n_z(source[0], source[1], source[2]);
                   7350:        dsp_core.registers[DSP_REG_SR] &= BITMASK(16)-(1<<DSP_SR_V);
                   7351: }
                   7352: 
                   7353: static void dsp_mpy_p_y1_y0_b(void)
                   7354: {
                   7355:        Uint32 source[3];
                   7356: 
                   7357:        dsp_mul56(dsp_core.registers[DSP_REG_Y1], dsp_core.registers[DSP_REG_Y0], source, SIGN_PLUS);
                   7358: 
                   7359:        dsp_core.registers[DSP_REG_B2] = source[0];
                   7360:        dsp_core.registers[DSP_REG_B1] = source[1];
                   7361:        dsp_core.registers[DSP_REG_B0] = source[2];
                   7362: 
                   7363:        dsp_ccr_update_e_u_n_z(source[0], source[1], source[2]);
                   7364:        dsp_core.registers[DSP_REG_SR] &= BITMASK(16)-(1<<DSP_SR_V);
                   7365: }
                   7366: 
                   7367: static void dsp_mpy_m_y1_y0_b(void)
                   7368: {
                   7369:        Uint32 source[3];
                   7370: 
                   7371:        dsp_mul56(dsp_core.registers[DSP_REG_Y1], dsp_core.registers[DSP_REG_Y0], source, SIGN_MINUS);
                   7372: 
                   7373:        dsp_core.registers[DSP_REG_B2] = source[0];
                   7374:        dsp_core.registers[DSP_REG_B1] = source[1];
                   7375:        dsp_core.registers[DSP_REG_B0] = source[2];
                   7376: 
                   7377:        dsp_ccr_update_e_u_n_z(source[0], source[1], source[2]);
                   7378:        dsp_core.registers[DSP_REG_SR] &= BITMASK(16)-(1<<DSP_SR_V);
                   7379: }
                   7380: 
                   7381: static void dsp_mpy_p_x0_y1_a(void)
                   7382: {
                   7383:        Uint32 source[3];
                   7384: 
                   7385:        dsp_mul56(dsp_core.registers[DSP_REG_X0], dsp_core.registers[DSP_REG_Y1], source, SIGN_PLUS);
                   7386: 
                   7387:        dsp_core.registers[DSP_REG_A2] = source[0];
                   7388:        dsp_core.registers[DSP_REG_A1] = source[1];
                   7389:        dsp_core.registers[DSP_REG_A0] = source[2];
                   7390: 
                   7391:        dsp_ccr_update_e_u_n_z(source[0], source[1], source[2]);
                   7392:        dsp_core.registers[DSP_REG_SR] &= BITMASK(16)-(1<<DSP_SR_V);
                   7393: }
                   7394: 
                   7395: static void dsp_mpy_m_x0_y1_a(void)
                   7396: {
                   7397:        Uint32 source[3];
                   7398: 
                   7399:        dsp_mul56(dsp_core.registers[DSP_REG_X0], dsp_core.registers[DSP_REG_Y1], source, SIGN_MINUS);
                   7400: 
                   7401:        dsp_core.registers[DSP_REG_A2] = source[0];
                   7402:        dsp_core.registers[DSP_REG_A1] = source[1];
                   7403:        dsp_core.registers[DSP_REG_A0] = source[2];
                   7404: 
                   7405:        dsp_ccr_update_e_u_n_z(source[0], source[1], source[2]);
                   7406:        dsp_core.registers[DSP_REG_SR] &= BITMASK(16)-(1<<DSP_SR_V);
                   7407: }
                   7408: 
                   7409: static void dsp_mpy_p_x0_y1_b(void)
                   7410: {
                   7411:        Uint32 source[3];
                   7412: 
                   7413:        dsp_mul56(dsp_core.registers[DSP_REG_X0], dsp_core.registers[DSP_REG_Y1], source, SIGN_PLUS);
                   7414: 
                   7415:        dsp_core.registers[DSP_REG_B2] = source[0];
                   7416:        dsp_core.registers[DSP_REG_B1] = source[1];
                   7417:        dsp_core.registers[DSP_REG_B0] = source[2];
                   7418: 
                   7419:        dsp_ccr_update_e_u_n_z(source[0], source[1], source[2]);
                   7420:        dsp_core.registers[DSP_REG_SR] &= BITMASK(16)-(1<<DSP_SR_V);
                   7421: }
                   7422: 
                   7423: static void dsp_mpy_m_x0_y1_b(void)
                   7424: {
                   7425:        Uint32 source[3];
                   7426: 
                   7427:        dsp_mul56(dsp_core.registers[DSP_REG_X0], dsp_core.registers[DSP_REG_Y1], source, SIGN_MINUS);
                   7428: 
                   7429:        dsp_core.registers[DSP_REG_B2] = source[0];
                   7430:        dsp_core.registers[DSP_REG_B1] = source[1];
                   7431:        dsp_core.registers[DSP_REG_B0] = source[2];
                   7432: 
                   7433:        dsp_ccr_update_e_u_n_z(source[0], source[1], source[2]);
                   7434:        dsp_core.registers[DSP_REG_SR] &= BITMASK(16)-(1<<DSP_SR_V);
                   7435: }
                   7436: 
                   7437: static void dsp_mpy_p_y0_x0_a(void)
                   7438: {
                   7439:        Uint32 source[3];
                   7440: 
                   7441:        dsp_mul56(dsp_core.registers[DSP_REG_Y0], dsp_core.registers[DSP_REG_X0], source, SIGN_PLUS);
                   7442: 
                   7443:        dsp_core.registers[DSP_REG_A2] = source[0];
                   7444:        dsp_core.registers[DSP_REG_A1] = source[1];
                   7445:        dsp_core.registers[DSP_REG_A0] = source[2];
                   7446: 
                   7447:        dsp_ccr_update_e_u_n_z(source[0], source[1], source[2]);
                   7448:        dsp_core.registers[DSP_REG_SR] &= BITMASK(16)-(1<<DSP_SR_V);
                   7449: }
                   7450: 
                   7451: static void dsp_mpy_m_y0_x0_a(void)
                   7452: {
                   7453:        Uint32 source[3];
                   7454: 
                   7455:        dsp_mul56(dsp_core.registers[DSP_REG_Y0], dsp_core.registers[DSP_REG_X0], source, SIGN_MINUS);
                   7456: 
                   7457:        dsp_core.registers[DSP_REG_A2] = source[0];
                   7458:        dsp_core.registers[DSP_REG_A1] = source[1];
                   7459:        dsp_core.registers[DSP_REG_A0] = source[2];
                   7460: 
                   7461:        dsp_ccr_update_e_u_n_z(source[0], source[1], source[2]);
                   7462:        dsp_core.registers[DSP_REG_SR] &= BITMASK(16)-(1<<DSP_SR_V);
                   7463: }
                   7464: 
                   7465: static void dsp_mpy_p_y0_x0_b(void)
                   7466: {
                   7467:        Uint32 source[3];
                   7468: 
                   7469:        dsp_mul56(dsp_core.registers[DSP_REG_Y0], dsp_core.registers[DSP_REG_X0], source, SIGN_PLUS);
                   7470: 
                   7471:        dsp_core.registers[DSP_REG_B2] = source[0];
                   7472:        dsp_core.registers[DSP_REG_B1] = source[1];
                   7473:        dsp_core.registers[DSP_REG_B0] = source[2];
                   7474: 
                   7475:        dsp_ccr_update_e_u_n_z(source[0], source[1], source[2]);
                   7476:        dsp_core.registers[DSP_REG_SR] &= BITMASK(16)-(1<<DSP_SR_V);
                   7477: }
                   7478: 
                   7479: static void dsp_mpy_m_y0_x0_b(void)
                   7480: {
                   7481:        Uint32 source[3];
                   7482: 
                   7483:        dsp_mul56(dsp_core.registers[DSP_REG_Y0], dsp_core.registers[DSP_REG_X0], source, SIGN_MINUS);
                   7484: 
                   7485:        dsp_core.registers[DSP_REG_B2] = source[0];
                   7486:        dsp_core.registers[DSP_REG_B1] = source[1];
                   7487:        dsp_core.registers[DSP_REG_B0] = source[2];
                   7488: 
                   7489:        dsp_ccr_update_e_u_n_z(source[0], source[1], source[2]);
                   7490:        dsp_core.registers[DSP_REG_SR] &= BITMASK(16)-(1<<DSP_SR_V);
                   7491: }
                   7492: 
                   7493: static void dsp_mpy_p_x1_y0_a(void)
                   7494: {
                   7495:        Uint32 source[3];
                   7496: 
                   7497:        dsp_mul56(dsp_core.registers[DSP_REG_X1], dsp_core.registers[DSP_REG_Y0], source, SIGN_PLUS);
                   7498: 
                   7499:        dsp_core.registers[DSP_REG_A2] = source[0];
                   7500:        dsp_core.registers[DSP_REG_A1] = source[1];
                   7501:        dsp_core.registers[DSP_REG_A0] = source[2];
                   7502: 
                   7503:        dsp_ccr_update_e_u_n_z(source[0], source[1], source[2]);
                   7504:        dsp_core.registers[DSP_REG_SR] &= BITMASK(16)-(1<<DSP_SR_V);
                   7505: }
                   7506: 
                   7507: static void dsp_mpy_m_x1_y0_a(void)
                   7508: {
                   7509:        Uint32 source[3];
                   7510: 
                   7511:        dsp_mul56(dsp_core.registers[DSP_REG_X1], dsp_core.registers[DSP_REG_Y0], source, SIGN_MINUS);
                   7512: 
                   7513:        dsp_core.registers[DSP_REG_A2] = source[0];
                   7514:        dsp_core.registers[DSP_REG_A1] = source[1];
                   7515:        dsp_core.registers[DSP_REG_A0] = source[2];
                   7516: 
                   7517:        dsp_ccr_update_e_u_n_z(source[0], source[1], source[2]);
                   7518:        dsp_core.registers[DSP_REG_SR] &= BITMASK(16)-(1<<DSP_SR_V);
                   7519: }
                   7520: 
                   7521: static void dsp_mpy_p_x1_y0_b(void)
                   7522: {
                   7523:        Uint32 source[3];
                   7524: 
                   7525:        dsp_mul56(dsp_core.registers[DSP_REG_X1], dsp_core.registers[DSP_REG_Y0], source, SIGN_PLUS);
                   7526: 
                   7527:        dsp_core.registers[DSP_REG_B2] = source[0];
                   7528:        dsp_core.registers[DSP_REG_B1] = source[1];
                   7529:        dsp_core.registers[DSP_REG_B0] = source[2];
                   7530: 
                   7531:        dsp_ccr_update_e_u_n_z(source[0], source[1], source[2]);
                   7532:        dsp_core.registers[DSP_REG_SR] &= BITMASK(16)-(1<<DSP_SR_V);
                   7533: }
                   7534: 
                   7535: static void dsp_mpy_m_x1_y0_b(void)
                   7536: {
                   7537:        Uint32 source[3];
                   7538: 
                   7539:        dsp_mul56(dsp_core.registers[DSP_REG_X1], dsp_core.registers[DSP_REG_Y0], source, SIGN_MINUS);
                   7540: 
                   7541:        dsp_core.registers[DSP_REG_B2] = source[0];
                   7542:        dsp_core.registers[DSP_REG_B1] = source[1];
                   7543:        dsp_core.registers[DSP_REG_B0] = source[2];
                   7544: 
                   7545:        dsp_ccr_update_e_u_n_z(source[0], source[1], source[2]);
                   7546:        dsp_core.registers[DSP_REG_SR] &= BITMASK(16)-(1<<DSP_SR_V);
                   7547: }
                   7548: 
                   7549: static void dsp_mpy_p_y1_x1_a(void)
                   7550: {
                   7551:        Uint32 source[3];
                   7552: 
                   7553:        dsp_mul56(dsp_core.registers[DSP_REG_Y1], dsp_core.registers[DSP_REG_X1], source, SIGN_PLUS);
                   7554: 
                   7555:        dsp_core.registers[DSP_REG_A2] = source[0];
                   7556:        dsp_core.registers[DSP_REG_A1] = source[1];
                   7557:        dsp_core.registers[DSP_REG_A0] = source[2];
                   7558: 
                   7559:        dsp_ccr_update_e_u_n_z(source[0], source[1], source[2]);
                   7560:        dsp_core.registers[DSP_REG_SR] &= BITMASK(16)-(1<<DSP_SR_V);
                   7561: }
                   7562: 
                   7563: static void dsp_mpy_m_y1_x1_a(void)
                   7564: {
                   7565:        Uint32 source[3];
                   7566: 
                   7567:        dsp_mul56(dsp_core.registers[DSP_REG_Y1], dsp_core.registers[DSP_REG_X1], source, SIGN_MINUS);
                   7568: 
                   7569:        dsp_core.registers[DSP_REG_A2] = source[0];
                   7570:        dsp_core.registers[DSP_REG_A1] = source[1];
                   7571:        dsp_core.registers[DSP_REG_A0] = source[2];
                   7572: 
                   7573:        dsp_ccr_update_e_u_n_z(source[0], source[1], source[2]);
                   7574:        dsp_core.registers[DSP_REG_SR] &= BITMASK(16)-(1<<DSP_SR_V);
                   7575: }
                   7576: 
                   7577: static void dsp_mpy_p_y1_x1_b(void)
                   7578: {
                   7579:        Uint32 source[3];
                   7580: 
                   7581:        dsp_mul56(dsp_core.registers[DSP_REG_Y1], dsp_core.registers[DSP_REG_X1], source, SIGN_PLUS);
                   7582: 
                   7583:        dsp_core.registers[DSP_REG_B2] = source[0];
                   7584:        dsp_core.registers[DSP_REG_B1] = source[1];
                   7585:        dsp_core.registers[DSP_REG_B0] = source[2];
                   7586: 
                   7587:        dsp_ccr_update_e_u_n_z(source[0], source[1], source[2]);
                   7588:        dsp_core.registers[DSP_REG_SR] &= BITMASK(16)-(1<<DSP_SR_V);
                   7589: }
                   7590: 
                   7591: static void dsp_mpy_m_y1_x1_b(void)
                   7592: {
                   7593:        Uint32 source[3];
                   7594: 
                   7595:        dsp_mul56(dsp_core.registers[DSP_REG_Y1], dsp_core.registers[DSP_REG_X1], source, SIGN_MINUS);
                   7596: 
                   7597:        dsp_core.registers[DSP_REG_B2] = source[0];
                   7598:        dsp_core.registers[DSP_REG_B1] = source[1];
                   7599:        dsp_core.registers[DSP_REG_B0] = source[2];
                   7600: 
                   7601:        dsp_ccr_update_e_u_n_z(source[0], source[1], source[2]);
                   7602:        dsp_core.registers[DSP_REG_SR] &= BITMASK(16)-(1<<DSP_SR_V);
                   7603: }
                   7604: 
                   7605: static void dsp_mpyr_p_x0_x0_a(void)
                   7606: {
                   7607:        Uint32 source[3];
                   7608: 
                   7609:        dsp_mul56(dsp_core.registers[DSP_REG_X0], dsp_core.registers[DSP_REG_X0], source, SIGN_PLUS);
                   7610:        dsp_rnd56(source);
                   7611: 
                   7612:        dsp_core.registers[DSP_REG_A2] = source[0];
                   7613:        dsp_core.registers[DSP_REG_A1] = source[1];
                   7614:        dsp_core.registers[DSP_REG_A0] = source[2];
                   7615: 
                   7616:        dsp_ccr_update_e_u_n_z(source[0], source[1], source[2]);
                   7617:        dsp_core.registers[DSP_REG_SR] &= BITMASK(16)-(1<<DSP_SR_V);
                   7618: }
                   7619: 
                   7620: static void dsp_mpyr_m_x0_x0_a(void)
                   7621: {
                   7622:        Uint32 source[3];
                   7623: 
                   7624:        dsp_mul56(dsp_core.registers[DSP_REG_X0], dsp_core.registers[DSP_REG_X0], source, SIGN_MINUS);
                   7625:        dsp_rnd56(source);
                   7626: 
                   7627:        dsp_core.registers[DSP_REG_A2] = source[0];
                   7628:        dsp_core.registers[DSP_REG_A1] = source[1];
                   7629:        dsp_core.registers[DSP_REG_A0] = source[2];
                   7630: 
                   7631:        dsp_ccr_update_e_u_n_z(source[0], source[1], source[2]);
                   7632:        dsp_core.registers[DSP_REG_SR] &= BITMASK(16)-(1<<DSP_SR_V);
                   7633: }
                   7634: 
                   7635: static void dsp_mpyr_p_x0_x0_b(void)
                   7636: {
                   7637:        Uint32 source[3];
                   7638: 
                   7639:        dsp_mul56(dsp_core.registers[DSP_REG_X0], dsp_core.registers[DSP_REG_X0], source, SIGN_PLUS);
                   7640:        dsp_rnd56(source);
                   7641: 
                   7642:        dsp_core.registers[DSP_REG_B2] = source[0];
                   7643:        dsp_core.registers[DSP_REG_B1] = source[1];
                   7644:        dsp_core.registers[DSP_REG_B0] = source[2];
                   7645: 
                   7646:        dsp_ccr_update_e_u_n_z(source[0], source[1], source[2]);
                   7647:        dsp_core.registers[DSP_REG_SR] &= BITMASK(16)-(1<<DSP_SR_V);
                   7648: }
                   7649: 
                   7650: static void dsp_mpyr_m_x0_x0_b(void)
                   7651: {
                   7652:        Uint32 source[3];
                   7653: 
                   7654: 
                   7655:        dsp_mul56(dsp_core.registers[DSP_REG_X0], dsp_core.registers[DSP_REG_X0], source, SIGN_MINUS);
                   7656:        dsp_rnd56(source);
                   7657: 
                   7658:        dsp_core.registers[DSP_REG_B2] = source[0];
                   7659:        dsp_core.registers[DSP_REG_B1] = source[1];
                   7660:        dsp_core.registers[DSP_REG_B0] = source[2];
                   7661: 
                   7662:        dsp_ccr_update_e_u_n_z(source[0], source[1], source[2]);
                   7663:        dsp_core.registers[DSP_REG_SR] &= BITMASK(16)-(1<<DSP_SR_V);
                   7664: }
                   7665: 
                   7666: static void dsp_mpyr_p_y0_y0_a(void)
                   7667: {
                   7668:        Uint32 source[3];
                   7669: 
                   7670:        dsp_mul56(dsp_core.registers[DSP_REG_Y0], dsp_core.registers[DSP_REG_Y0], source, SIGN_PLUS);
                   7671:        dsp_rnd56(source);
                   7672: 
                   7673:        dsp_core.registers[DSP_REG_A2] = source[0];
                   7674:        dsp_core.registers[DSP_REG_A1] = source[1];
                   7675:        dsp_core.registers[DSP_REG_A0] = source[2];
                   7676: 
                   7677:        dsp_ccr_update_e_u_n_z(source[0], source[1], source[2]);
                   7678:        dsp_core.registers[DSP_REG_SR] &= BITMASK(16)-(1<<DSP_SR_V);
                   7679: }
                   7680: 
                   7681: static void dsp_mpyr_m_y0_y0_a(void)
                   7682: {
                   7683:        Uint32 source[3];
                   7684: 
                   7685:        dsp_mul56(dsp_core.registers[DSP_REG_Y0], dsp_core.registers[DSP_REG_Y0], source, SIGN_MINUS);
                   7686:        dsp_rnd56(source);
                   7687: 
                   7688:        dsp_core.registers[DSP_REG_A2] = source[0];
                   7689:        dsp_core.registers[DSP_REG_A1] = source[1];
                   7690:        dsp_core.registers[DSP_REG_A0] = source[2];
                   7691: 
                   7692:        dsp_ccr_update_e_u_n_z(source[0], source[1], source[2]);
                   7693:        dsp_core.registers[DSP_REG_SR] &= BITMASK(16)-(1<<DSP_SR_V);
                   7694: }
                   7695: 
                   7696: static void dsp_mpyr_p_y0_y0_b(void)
                   7697: {
                   7698:        Uint32 source[3];
                   7699: 
                   7700:        dsp_mul56(dsp_core.registers[DSP_REG_Y0], dsp_core.registers[DSP_REG_Y0], source, SIGN_PLUS);
                   7701:        dsp_rnd56(source);
                   7702: 
                   7703:        dsp_core.registers[DSP_REG_B2] = source[0];
                   7704:        dsp_core.registers[DSP_REG_B1] = source[1];
                   7705:        dsp_core.registers[DSP_REG_B0] = source[2];
                   7706: 
                   7707:        dsp_ccr_update_e_u_n_z(source[0], source[1], source[2]);
                   7708:        dsp_core.registers[DSP_REG_SR] &= BITMASK(16)-(1<<DSP_SR_V);
                   7709: }
                   7710: 
                   7711: static void dsp_mpyr_m_y0_y0_b(void)
                   7712: {
                   7713:        Uint32 source[3];
                   7714: 
                   7715:        dsp_mul56(dsp_core.registers[DSP_REG_Y0], dsp_core.registers[DSP_REG_Y0], source, SIGN_MINUS);
                   7716:        dsp_rnd56(source);
                   7717: 
                   7718:        dsp_core.registers[DSP_REG_B2] = source[0];
                   7719:        dsp_core.registers[DSP_REG_B1] = source[1];
                   7720:        dsp_core.registers[DSP_REG_B0] = source[2];
                   7721: 
                   7722:        dsp_ccr_update_e_u_n_z(source[0], source[1], source[2]);
                   7723:        dsp_core.registers[DSP_REG_SR] &= BITMASK(16)-(1<<DSP_SR_V);
                   7724: }
                   7725: 
                   7726: static void dsp_mpyr_p_x1_x0_a(void)
                   7727: {
                   7728:        Uint32 source[3];
                   7729: 
                   7730:        dsp_mul56(dsp_core.registers[DSP_REG_X1], dsp_core.registers[DSP_REG_X0], source, SIGN_PLUS);
                   7731:        dsp_rnd56(source);
                   7732: 
                   7733:        dsp_core.registers[DSP_REG_A2] = source[0];
                   7734:        dsp_core.registers[DSP_REG_A1] = source[1];
                   7735:        dsp_core.registers[DSP_REG_A0] = source[2];
                   7736: 
                   7737:        dsp_ccr_update_e_u_n_z(source[0], source[1], source[2]);
                   7738:        dsp_core.registers[DSP_REG_SR] &= BITMASK(16)-(1<<DSP_SR_V);
                   7739: }
                   7740: 
                   7741: static void dsp_mpyr_m_x1_x0_a(void)
                   7742: {
                   7743:        Uint32 source[3];
                   7744: 
                   7745:        dsp_mul56(dsp_core.registers[DSP_REG_X1], dsp_core.registers[DSP_REG_X0], source, SIGN_MINUS);
                   7746:        dsp_rnd56(source);
                   7747: 
                   7748:        dsp_core.registers[DSP_REG_A2] = source[0];
                   7749:        dsp_core.registers[DSP_REG_A1] = source[1];
                   7750:        dsp_core.registers[DSP_REG_A0] = source[2];
                   7751: 
                   7752:        dsp_ccr_update_e_u_n_z(source[0], source[1], source[2]);
                   7753:        dsp_core.registers[DSP_REG_SR] &= BITMASK(16)-(1<<DSP_SR_V);
                   7754: }
                   7755: 
                   7756: static void dsp_mpyr_p_x1_x0_b(void)
                   7757: {
                   7758:        Uint32 source[3];
                   7759: 
                   7760:        dsp_mul56(dsp_core.registers[DSP_REG_X1], dsp_core.registers[DSP_REG_X0], source, SIGN_PLUS);
                   7761:        dsp_rnd56(source);
                   7762: 
                   7763:        dsp_core.registers[DSP_REG_B2] = source[0];
                   7764:        dsp_core.registers[DSP_REG_B1] = source[1];
                   7765:        dsp_core.registers[DSP_REG_B0] = source[2];
                   7766: 
                   7767:        dsp_ccr_update_e_u_n_z(source[0], source[1], source[2]);
                   7768:        dsp_core.registers[DSP_REG_SR] &= BITMASK(16)-(1<<DSP_SR_V);
                   7769: }
                   7770: 
                   7771: static void dsp_mpyr_m_x1_x0_b(void)
                   7772: {
                   7773:        Uint32 source[3];
                   7774: 
                   7775:        dsp_mul56(dsp_core.registers[DSP_REG_X1], dsp_core.registers[DSP_REG_X0], source, SIGN_MINUS);
                   7776:        dsp_rnd56(source);
                   7777: 
                   7778:        dsp_core.registers[DSP_REG_B2] = source[0];
                   7779:        dsp_core.registers[DSP_REG_B1] = source[1];
                   7780:        dsp_core.registers[DSP_REG_B0] = source[2];
                   7781: 
                   7782:        dsp_ccr_update_e_u_n_z(source[0], source[1], source[2]);
                   7783:        dsp_core.registers[DSP_REG_SR] &= BITMASK(16)-(1<<DSP_SR_V);
                   7784: }
                   7785: 
                   7786: static void dsp_mpyr_p_y1_y0_a(void)
                   7787: {
                   7788:        Uint32 source[3];
                   7789: 
                   7790:        dsp_mul56(dsp_core.registers[DSP_REG_Y1], dsp_core.registers[DSP_REG_Y0], source, SIGN_PLUS);
                   7791:        dsp_rnd56(source);
                   7792: 
                   7793:        dsp_core.registers[DSP_REG_A2] = source[0];
                   7794:        dsp_core.registers[DSP_REG_A1] = source[1];
                   7795:        dsp_core.registers[DSP_REG_A0] = source[2];
                   7796: 
                   7797:        dsp_ccr_update_e_u_n_z(source[0], source[1], source[2]);
                   7798:        dsp_core.registers[DSP_REG_SR] &= BITMASK(16)-(1<<DSP_SR_V);
                   7799: }
                   7800: 
                   7801: static void dsp_mpyr_m_y1_y0_a(void)
                   7802: {
                   7803:        Uint32 source[3];
                   7804: 
                   7805:        dsp_mul56(dsp_core.registers[DSP_REG_Y1], dsp_core.registers[DSP_REG_Y0], source, SIGN_MINUS);
                   7806:        dsp_rnd56(source);
                   7807: 
                   7808:        dsp_core.registers[DSP_REG_A2] = source[0];
                   7809:        dsp_core.registers[DSP_REG_A1] = source[1];
                   7810:        dsp_core.registers[DSP_REG_A0] = source[2];
                   7811: 
                   7812:        dsp_ccr_update_e_u_n_z(source[0], source[1], source[2]);
                   7813:        dsp_core.registers[DSP_REG_SR] &= BITMASK(16)-(1<<DSP_SR_V);
                   7814: }
                   7815: 
                   7816: static void dsp_mpyr_p_y1_y0_b(void)
                   7817: {
                   7818:        Uint32 source[3];
                   7819: 
                   7820:        dsp_mul56(dsp_core.registers[DSP_REG_Y1], dsp_core.registers[DSP_REG_Y0], source, SIGN_PLUS);
                   7821:        dsp_rnd56(source);
                   7822: 
                   7823:        dsp_core.registers[DSP_REG_B2] = source[0];
                   7824:        dsp_core.registers[DSP_REG_B1] = source[1];
                   7825:        dsp_core.registers[DSP_REG_B0] = source[2];
                   7826: 
                   7827:        dsp_ccr_update_e_u_n_z(source[0], source[1], source[2]);
                   7828:        dsp_core.registers[DSP_REG_SR] &= BITMASK(16)-(1<<DSP_SR_V);
                   7829: }
                   7830: 
                   7831: static void dsp_mpyr_m_y1_y0_b(void)
                   7832: {
                   7833:        Uint32 source[3];
                   7834: 
                   7835:        dsp_mul56(dsp_core.registers[DSP_REG_Y1], dsp_core.registers[DSP_REG_Y0], source, SIGN_MINUS);
                   7836:        dsp_rnd56(source);
                   7837: 
                   7838:        dsp_core.registers[DSP_REG_B2] = source[0];
                   7839:        dsp_core.registers[DSP_REG_B1] = source[1];
                   7840:        dsp_core.registers[DSP_REG_B0] = source[2];
                   7841: 
                   7842:        dsp_ccr_update_e_u_n_z(source[0], source[1], source[2]);
                   7843:        dsp_core.registers[DSP_REG_SR] &= BITMASK(16)-(1<<DSP_SR_V);
                   7844: }
                   7845: 
                   7846: static void dsp_mpyr_p_x0_y1_a(void)
                   7847: {
                   7848:        Uint32 source[3];
                   7849: 
                   7850:        dsp_mul56(dsp_core.registers[DSP_REG_X0], dsp_core.registers[DSP_REG_Y1], source, SIGN_PLUS);
                   7851:        dsp_rnd56(source);
                   7852: 
                   7853:        dsp_core.registers[DSP_REG_A2] = source[0];
                   7854:        dsp_core.registers[DSP_REG_A1] = source[1];
                   7855:        dsp_core.registers[DSP_REG_A0] = source[2];
                   7856: 
                   7857:        dsp_ccr_update_e_u_n_z(source[0], source[1], source[2]);
                   7858:        dsp_core.registers[DSP_REG_SR] &= BITMASK(16)-(1<<DSP_SR_V);
                   7859: }
                   7860: 
                   7861: static void dsp_mpyr_m_x0_y1_a(void)
                   7862: {
                   7863:        Uint32 source[3];
                   7864: 
                   7865:        dsp_mul56(dsp_core.registers[DSP_REG_X0], dsp_core.registers[DSP_REG_Y1], source, SIGN_MINUS);
                   7866:        dsp_rnd56(source);
                   7867: 
                   7868:        dsp_core.registers[DSP_REG_A2] = source[0];
                   7869:        dsp_core.registers[DSP_REG_A1] = source[1];
                   7870:        dsp_core.registers[DSP_REG_A0] = source[2];
                   7871: 
                   7872:        dsp_ccr_update_e_u_n_z(source[0], source[1], source[2]);
                   7873:        dsp_core.registers[DSP_REG_SR] &= BITMASK(16)-(1<<DSP_SR_V);
                   7874: }
                   7875: 
                   7876: static void dsp_mpyr_p_x0_y1_b(void)
                   7877: {
                   7878:        Uint32 source[3];
                   7879: 
                   7880:        dsp_mul56(dsp_core.registers[DSP_REG_X0], dsp_core.registers[DSP_REG_Y1], source, SIGN_PLUS);
                   7881:        dsp_rnd56(source);
                   7882: 
                   7883:        dsp_core.registers[DSP_REG_B2] = source[0];
                   7884:        dsp_core.registers[DSP_REG_B1] = source[1];
                   7885:        dsp_core.registers[DSP_REG_B0] = source[2];
                   7886: 
                   7887:        dsp_ccr_update_e_u_n_z(source[0], source[1], source[2]);
                   7888:        dsp_core.registers[DSP_REG_SR] &= BITMASK(16)-(1<<DSP_SR_V);
                   7889: }
                   7890: 
                   7891: static void dsp_mpyr_m_x0_y1_b(void)
                   7892: {
                   7893:        Uint32 source[3];
                   7894: 
                   7895:        dsp_mul56(dsp_core.registers[DSP_REG_X0], dsp_core.registers[DSP_REG_Y1], source, SIGN_MINUS);
                   7896:        dsp_rnd56(source);
                   7897: 
                   7898:        dsp_core.registers[DSP_REG_B2] = source[0];
                   7899:        dsp_core.registers[DSP_REG_B1] = source[1];
                   7900:        dsp_core.registers[DSP_REG_B0] = source[2];
                   7901: 
                   7902:        dsp_ccr_update_e_u_n_z(source[0], source[1], source[2]);
                   7903:        dsp_core.registers[DSP_REG_SR] &= BITMASK(16)-(1<<DSP_SR_V);
                   7904: }
                   7905: 
                   7906: static void dsp_mpyr_p_y0_x0_a(void)
                   7907: {
                   7908:        Uint32 source[3];
                   7909: 
                   7910:        dsp_mul56(dsp_core.registers[DSP_REG_Y0], dsp_core.registers[DSP_REG_X0], source, SIGN_PLUS);
                   7911:        dsp_rnd56(source);
                   7912: 
                   7913:        dsp_core.registers[DSP_REG_A2] = source[0];
                   7914:        dsp_core.registers[DSP_REG_A1] = source[1];
                   7915:        dsp_core.registers[DSP_REG_A0] = source[2];
                   7916: 
                   7917:        dsp_ccr_update_e_u_n_z(source[0], source[1], source[2]);
                   7918:        dsp_core.registers[DSP_REG_SR] &= BITMASK(16)-(1<<DSP_SR_V);
                   7919: }
                   7920: 
                   7921: static void dsp_mpyr_m_y0_x0_a(void)
                   7922: {
                   7923:        Uint32 source[3];
                   7924: 
                   7925:        dsp_mul56(dsp_core.registers[DSP_REG_Y0], dsp_core.registers[DSP_REG_X0], source, SIGN_MINUS);
                   7926:        dsp_rnd56(source);
                   7927: 
                   7928:        dsp_core.registers[DSP_REG_A2] = source[0];
                   7929:        dsp_core.registers[DSP_REG_A1] = source[1];
                   7930:        dsp_core.registers[DSP_REG_A0] = source[2];
                   7931: 
                   7932:        dsp_ccr_update_e_u_n_z(source[0], source[1], source[2]);
                   7933:        dsp_core.registers[DSP_REG_SR] &= BITMASK(16)-(1<<DSP_SR_V);
                   7934: }
                   7935: 
                   7936: static void dsp_mpyr_p_y0_x0_b(void)
                   7937: {
                   7938:        Uint32 source[3];
                   7939: 
                   7940:        dsp_mul56(dsp_core.registers[DSP_REG_Y0], dsp_core.registers[DSP_REG_X0], source, SIGN_PLUS);
                   7941:        dsp_rnd56(source);
                   7942: 
                   7943:        dsp_core.registers[DSP_REG_B2] = source[0];
                   7944:        dsp_core.registers[DSP_REG_B1] = source[1];
                   7945:        dsp_core.registers[DSP_REG_B0] = source[2];
                   7946: 
                   7947:        dsp_ccr_update_e_u_n_z(source[0], source[1], source[2]);
                   7948:        dsp_core.registers[DSP_REG_SR] &= BITMASK(16)-(1<<DSP_SR_V);
                   7949: }
                   7950: 
                   7951: static void dsp_mpyr_m_y0_x0_b(void)
                   7952: {
                   7953:        Uint32 source[3];
                   7954: 
                   7955:        dsp_mul56(dsp_core.registers[DSP_REG_Y0], dsp_core.registers[DSP_REG_X0], source, SIGN_MINUS);
                   7956:        dsp_rnd56(source);
                   7957: 
                   7958:        dsp_core.registers[DSP_REG_B2] = source[0];
                   7959:        dsp_core.registers[DSP_REG_B1] = source[1];
                   7960:        dsp_core.registers[DSP_REG_B0] = source[2];
                   7961: 
                   7962:        dsp_ccr_update_e_u_n_z(source[0], source[1], source[2]);
                   7963:        dsp_core.registers[DSP_REG_SR] &= BITMASK(16)-(1<<DSP_SR_V);
                   7964: }
                   7965: 
                   7966: static void dsp_mpyr_p_x1_y0_a(void)
                   7967: {
                   7968:        Uint32 source[3];
                   7969: 
                   7970:        dsp_mul56(dsp_core.registers[DSP_REG_X1], dsp_core.registers[DSP_REG_Y0], source, SIGN_PLUS);
                   7971:        dsp_rnd56(source);
                   7972: 
                   7973:        dsp_core.registers[DSP_REG_A2] = source[0];
                   7974:        dsp_core.registers[DSP_REG_A1] = source[1];
                   7975:        dsp_core.registers[DSP_REG_A0] = source[2];
                   7976: 
                   7977:        dsp_ccr_update_e_u_n_z(source[0], source[1], source[2]);
                   7978:        dsp_core.registers[DSP_REG_SR] &= BITMASK(16)-(1<<DSP_SR_V);
                   7979: }
                   7980: 
                   7981: static void dsp_mpyr_m_x1_y0_a(void)
                   7982: {
                   7983:        Uint32 source[3];
                   7984: 
                   7985:        dsp_mul56(dsp_core.registers[DSP_REG_X1], dsp_core.registers[DSP_REG_Y0], source, SIGN_MINUS);
                   7986:        dsp_rnd56(source);
                   7987: 
                   7988:        dsp_core.registers[DSP_REG_A2] = source[0];
                   7989:        dsp_core.registers[DSP_REG_A1] = source[1];
                   7990:        dsp_core.registers[DSP_REG_A0] = source[2];
                   7991: 
                   7992:        dsp_ccr_update_e_u_n_z(source[0], source[1], source[2]);
                   7993:        dsp_core.registers[DSP_REG_SR] &= BITMASK(16)-(1<<DSP_SR_V);
                   7994: }
                   7995: 
                   7996: static void dsp_mpyr_p_x1_y0_b(void)
                   7997: {
                   7998:        Uint32 source[3];
                   7999: 
                   8000:        dsp_mul56(dsp_core.registers[DSP_REG_X1], dsp_core.registers[DSP_REG_Y0], source, SIGN_PLUS);
                   8001:        dsp_rnd56(source);
                   8002: 
                   8003:        dsp_core.registers[DSP_REG_B2] = source[0];
                   8004:        dsp_core.registers[DSP_REG_B1] = source[1];
                   8005:        dsp_core.registers[DSP_REG_B0] = source[2];
                   8006: 
                   8007:        dsp_ccr_update_e_u_n_z(source[0], source[1], source[2]);
                   8008:        dsp_core.registers[DSP_REG_SR] &= BITMASK(16)-(1<<DSP_SR_V);
                   8009: }
                   8010: 
                   8011: static void dsp_mpyr_m_x1_y0_b(void)
                   8012: {
                   8013:        Uint32 source[3];
                   8014: 
                   8015:        dsp_mul56(dsp_core.registers[DSP_REG_X1], dsp_core.registers[DSP_REG_Y0], source, SIGN_MINUS);
                   8016:        dsp_rnd56(source);
                   8017: 
                   8018:        dsp_core.registers[DSP_REG_B2] = source[0];
                   8019:        dsp_core.registers[DSP_REG_B1] = source[1];
                   8020:        dsp_core.registers[DSP_REG_B0] = source[2];
                   8021: 
                   8022:        dsp_ccr_update_e_u_n_z(source[0], source[1], source[2]);
                   8023:        dsp_core.registers[DSP_REG_SR] &= BITMASK(16)-(1<<DSP_SR_V);
                   8024: }
                   8025: 
                   8026: static void dsp_mpyr_p_y1_x1_a(void)
                   8027: {
                   8028:        Uint32 source[3];
                   8029: 
                   8030:        dsp_mul56(dsp_core.registers[DSP_REG_Y1], dsp_core.registers[DSP_REG_X1], source, SIGN_PLUS);
                   8031:        dsp_rnd56(source);
                   8032: 
                   8033:        dsp_core.registers[DSP_REG_A2] = source[0];
                   8034:        dsp_core.registers[DSP_REG_A1] = source[1];
                   8035:        dsp_core.registers[DSP_REG_A0] = source[2];
                   8036: 
                   8037:        dsp_ccr_update_e_u_n_z(source[0], source[1], source[2]);
                   8038:        dsp_core.registers[DSP_REG_SR] &= BITMASK(16)-(1<<DSP_SR_V);
                   8039: }
                   8040: 
                   8041: static void dsp_mpyr_m_y1_x1_a(void)
                   8042: {
                   8043:        Uint32 source[3];
                   8044: 
                   8045:        dsp_mul56(dsp_core.registers[DSP_REG_Y1], dsp_core.registers[DSP_REG_X1], source, SIGN_MINUS);
                   8046:        dsp_rnd56(source);
                   8047: 
                   8048:        dsp_core.registers[DSP_REG_A2] = source[0];
                   8049:        dsp_core.registers[DSP_REG_A1] = source[1];
                   8050:        dsp_core.registers[DSP_REG_A0] = source[2];
                   8051: 
                   8052:        dsp_ccr_update_e_u_n_z(source[0], source[1], source[2]);
                   8053:        dsp_core.registers[DSP_REG_SR] &= BITMASK(16)-(1<<DSP_SR_V);
                   8054: }
                   8055: 
                   8056: static void dsp_mpyr_p_y1_x1_b(void)
                   8057: {
                   8058:        Uint32 source[3];
                   8059: 
                   8060:        dsp_mul56(dsp_core.registers[DSP_REG_Y1], dsp_core.registers[DSP_REG_X1], source, SIGN_PLUS);
                   8061:        dsp_rnd56(source);
                   8062: 
                   8063:        dsp_core.registers[DSP_REG_B2] = source[0];
                   8064:        dsp_core.registers[DSP_REG_B1] = source[1];
                   8065:        dsp_core.registers[DSP_REG_B0] = source[2];
                   8066: 
                   8067:        dsp_ccr_update_e_u_n_z(source[0], source[1], source[2]);
                   8068:        dsp_core.registers[DSP_REG_SR] &= BITMASK(16)-(1<<DSP_SR_V);
                   8069: }
                   8070: 
                   8071: static void dsp_mpyr_m_y1_x1_b(void)
                   8072: {
                   8073:        Uint32 source[3];
                   8074: 
                   8075:        dsp_mul56(dsp_core.registers[DSP_REG_Y1], dsp_core.registers[DSP_REG_X1], source, SIGN_MINUS);
                   8076:        dsp_rnd56(source);
                   8077: 
                   8078:        dsp_core.registers[DSP_REG_B2] = source[0];
                   8079:        dsp_core.registers[DSP_REG_B1] = source[1];
                   8080:        dsp_core.registers[DSP_REG_B0] = source[2];
                   8081: 
                   8082:        dsp_ccr_update_e_u_n_z(source[0], source[1], source[2]);
                   8083:        dsp_core.registers[DSP_REG_SR] &= BITMASK(16)-(1<<DSP_SR_V);
                   8084: }
                   8085: 
                   8086: static void dsp_neg_a(void)
                   8087: {
                   8088:        Uint32 source[3], dest[3], overflowed;
                   8089: 
                   8090:        source[0] = dsp_core.registers[DSP_REG_A2];
                   8091:        source[1] = dsp_core.registers[DSP_REG_A1];
                   8092:        source[2] = dsp_core.registers[DSP_REG_A0];
                   8093: 
                   8094:        overflowed = ((source[2]==0) && (source[1]==0) && (source[0]==0x80));
                   8095: 
                   8096:        dest[0] = dest[1] = dest[2] = 0;
                   8097: 
                   8098:        dsp_sub56(source, dest);
                   8099: 
                   8100:        dsp_core.registers[DSP_REG_A2] = dest[0];
                   8101:        dsp_core.registers[DSP_REG_A1] = dest[1];
                   8102:        dsp_core.registers[DSP_REG_A0] = dest[2];
                   8103: 
                   8104:        dsp_core.registers[DSP_REG_SR] &= BITMASK(16)-(1<<DSP_SR_V);
                   8105:        dsp_core.registers[DSP_REG_SR] |= (overflowed<<DSP_SR_L)|(overflowed<<DSP_SR_V);
                   8106: 
                   8107:        dsp_ccr_update_e_u_n_z(dest[0], dest[1], dest[2]);
                   8108: }
                   8109: 
                   8110: static void dsp_neg_b(void)
                   8111: {
                   8112:        Uint32 source[3], dest[3], overflowed;
                   8113: 
                   8114:        source[0] = dsp_core.registers[DSP_REG_B2];
                   8115:        source[1] = dsp_core.registers[DSP_REG_B1];
                   8116:        source[2] = dsp_core.registers[DSP_REG_B0];
                   8117: 
                   8118:        overflowed = ((source[2]==0) && (source[1]==0) && (source[0]==0x80));
                   8119: 
                   8120:        dest[0] = dest[1] = dest[2] = 0;
                   8121: 
                   8122:        dsp_sub56(source, dest);
                   8123: 
                   8124:        dsp_core.registers[DSP_REG_B2] = dest[0];
                   8125:        dsp_core.registers[DSP_REG_B1] = dest[1];
                   8126:        dsp_core.registers[DSP_REG_B0] = dest[2];
                   8127: 
                   8128:        dsp_core.registers[DSP_REG_SR] &= BITMASK(16)-(1<<DSP_SR_V);
                   8129:        dsp_core.registers[DSP_REG_SR] |= (overflowed<<DSP_SR_L)|(overflowed<<DSP_SR_V);
                   8130: 
                   8131:        dsp_ccr_update_e_u_n_z(dest[0], dest[1], dest[2]);
                   8132: }
                   8133: 
                   8134: static void dsp_nop(void)
                   8135: {
                   8136: }
                   8137: 
                   8138: static void dsp_not_a(void)
                   8139: {
                   8140:        dsp_core.registers[DSP_REG_A1] = ~dsp_core.registers[DSP_REG_A1];
                   8141:        dsp_core.registers[DSP_REG_A1] &= BITMASK(24); /* FIXME: useless ? */
                   8142: 
                   8143:        dsp_core.registers[DSP_REG_SR] &= BITMASK(16)-((1<<DSP_SR_N)|(1<<DSP_SR_Z)|(1<<DSP_SR_V));
                   8144:        dsp_core.registers[DSP_REG_SR] |= ((dsp_core.registers[DSP_REG_A1]>>23) & 1)<<DSP_SR_N;
                   8145:        dsp_core.registers[DSP_REG_SR] |= (dsp_core.registers[DSP_REG_A1]==0)<<DSP_SR_Z;
                   8146: }
                   8147: 
                   8148: static void dsp_not_b(void)
                   8149: {
                   8150:        dsp_core.registers[DSP_REG_B1] = ~dsp_core.registers[DSP_REG_B1];
                   8151:        dsp_core.registers[DSP_REG_B1] &= BITMASK(24); /* FIXME: useless ? */
                   8152: 
                   8153:        dsp_core.registers[DSP_REG_SR] &= BITMASK(16)-((1<<DSP_SR_N)|(1<<DSP_SR_Z)|(1<<DSP_SR_V));
                   8154:        dsp_core.registers[DSP_REG_SR] |= ((dsp_core.registers[DSP_REG_B1]>>23) & 1)<<DSP_SR_N;
                   8155:        dsp_core.registers[DSP_REG_SR] |= (dsp_core.registers[DSP_REG_B1]==0)<<DSP_SR_Z;
                   8156: }
                   8157: 
                   8158: static void dsp_or_x0_a(void)
                   8159: {
                   8160:        dsp_core.registers[DSP_REG_A1] |= dsp_core.registers[DSP_REG_X0];
                   8161:        dsp_core.registers[DSP_REG_A1] &= BITMASK(24); /* FIXME: useless ? */
                   8162: 
                   8163:        dsp_core.registers[DSP_REG_SR] &= BITMASK(16)-((1<<DSP_SR_N)|(1<<DSP_SR_Z)|(1<<DSP_SR_V));
                   8164:        dsp_core.registers[DSP_REG_SR] |= ((dsp_core.registers[DSP_REG_A1]>>23) & 1)<<DSP_SR_N;
                   8165:        dsp_core.registers[DSP_REG_SR] |= (dsp_core.registers[DSP_REG_A1]==0)<<DSP_SR_Z;
                   8166: }
                   8167: 
                   8168: static void dsp_or_x0_b(void)
                   8169: {
                   8170:        dsp_core.registers[DSP_REG_B1] |= dsp_core.registers[DSP_REG_X0];
                   8171:        dsp_core.registers[DSP_REG_B1] &= BITMASK(24); /* FIXME: useless ? */
                   8172: 
                   8173:        dsp_core.registers[DSP_REG_SR] &= BITMASK(16)-((1<<DSP_SR_N)|(1<<DSP_SR_Z)|(1<<DSP_SR_V));
                   8174:        dsp_core.registers[DSP_REG_SR] |= ((dsp_core.registers[DSP_REG_B1]>>23) & 1)<<DSP_SR_N;
                   8175:        dsp_core.registers[DSP_REG_SR] |= (dsp_core.registers[DSP_REG_B1]==0)<<DSP_SR_Z;
                   8176: }
                   8177: 
                   8178: static void dsp_or_y0_a(void)
                   8179: {
                   8180:        dsp_core.registers[DSP_REG_A1] |= dsp_core.registers[DSP_REG_Y0];
                   8181:        dsp_core.registers[DSP_REG_A1] &= BITMASK(24); /* FIXME: useless ? */
                   8182: 
                   8183:        dsp_core.registers[DSP_REG_SR] &= BITMASK(16)-((1<<DSP_SR_N)|(1<<DSP_SR_Z)|(1<<DSP_SR_V));
                   8184:        dsp_core.registers[DSP_REG_SR] |= ((dsp_core.registers[DSP_REG_A1]>>23) & 1)<<DSP_SR_N;
                   8185:        dsp_core.registers[DSP_REG_SR] |= (dsp_core.registers[DSP_REG_A1]==0)<<DSP_SR_Z;
                   8186: }
                   8187: 
                   8188: static void dsp_or_y0_b(void)
                   8189: {
                   8190:        dsp_core.registers[DSP_REG_B1] |= dsp_core.registers[DSP_REG_Y0];
                   8191:        dsp_core.registers[DSP_REG_B1] &= BITMASK(24); /* FIXME: useless ? */
                   8192: 
                   8193:        dsp_core.registers[DSP_REG_SR] &= BITMASK(16)-((1<<DSP_SR_N)|(1<<DSP_SR_Z)|(1<<DSP_SR_V));
                   8194:        dsp_core.registers[DSP_REG_SR] |= ((dsp_core.registers[DSP_REG_B1]>>23) & 1)<<DSP_SR_N;
                   8195:        dsp_core.registers[DSP_REG_SR] |= (dsp_core.registers[DSP_REG_B1]==0)<<DSP_SR_Z;
                   8196: }
                   8197: 
                   8198: static void dsp_or_x1_a(void)
                   8199: {
                   8200:        dsp_core.registers[DSP_REG_A1] |= dsp_core.registers[DSP_REG_X1];
                   8201:        dsp_core.registers[DSP_REG_A1] &= BITMASK(24); /* FIXME: useless ? */
                   8202: 
                   8203:        dsp_core.registers[DSP_REG_SR] &= BITMASK(16)-((1<<DSP_SR_N)|(1<<DSP_SR_Z)|(1<<DSP_SR_V));
                   8204:        dsp_core.registers[DSP_REG_SR] |= ((dsp_core.registers[DSP_REG_A1]>>23) & 1)<<DSP_SR_N;
                   8205:        dsp_core.registers[DSP_REG_SR] |= (dsp_core.registers[DSP_REG_A1]==0)<<DSP_SR_Z;
                   8206: }
                   8207: 
                   8208: static void dsp_or_x1_b(void)
                   8209: {
                   8210:        dsp_core.registers[DSP_REG_B1] |= dsp_core.registers[DSP_REG_X1];
                   8211:        dsp_core.registers[DSP_REG_B1] &= BITMASK(24); /* FIXME: useless ? */
                   8212: 
                   8213:        dsp_core.registers[DSP_REG_SR] &= BITMASK(16)-((1<<DSP_SR_N)|(1<<DSP_SR_Z)|(1<<DSP_SR_V));
                   8214:        dsp_core.registers[DSP_REG_SR] |= ((dsp_core.registers[DSP_REG_B1]>>23) & 1)<<DSP_SR_N;
                   8215:        dsp_core.registers[DSP_REG_SR] |= (dsp_core.registers[DSP_REG_B1]==0)<<DSP_SR_Z;
                   8216: }
                   8217: 
                   8218: static void dsp_or_y1_a(void)
                   8219: {
                   8220:        dsp_core.registers[DSP_REG_A1] |= dsp_core.registers[DSP_REG_Y1];
                   8221:        dsp_core.registers[DSP_REG_A1] &= BITMASK(24); /* FIXME: useless ? */
                   8222: 
                   8223:        dsp_core.registers[DSP_REG_SR] &= BITMASK(16)-((1<<DSP_SR_N)|(1<<DSP_SR_Z)|(1<<DSP_SR_V));
                   8224:        dsp_core.registers[DSP_REG_SR] |= ((dsp_core.registers[DSP_REG_A1]>>23) & 1)<<DSP_SR_N;
                   8225:        dsp_core.registers[DSP_REG_SR] |= (dsp_core.registers[DSP_REG_A1]==0)<<DSP_SR_Z;
                   8226: }
                   8227: 
                   8228: static void dsp_or_y1_b(void)
                   8229: {
                   8230:        dsp_core.registers[DSP_REG_B1] |= dsp_core.registers[DSP_REG_Y1];
                   8231:        dsp_core.registers[DSP_REG_B1] &= BITMASK(24); /* FIXME: useless ? */
                   8232: 
                   8233:        dsp_core.registers[DSP_REG_SR] &= BITMASK(16)-((1<<DSP_SR_N)|(1<<DSP_SR_Z)|(1<<DSP_SR_V));
                   8234:        dsp_core.registers[DSP_REG_SR] |= ((dsp_core.registers[DSP_REG_B1]>>23) & 1)<<DSP_SR_N;
                   8235:        dsp_core.registers[DSP_REG_SR] |= (dsp_core.registers[DSP_REG_B1]==0)<<DSP_SR_Z;
                   8236: }
                   8237: 
                   8238: static void dsp_rnd_a(void)
                   8239: {
                   8240:        Uint32 dest[3];
                   8241: 
                   8242:        dest[0] = dsp_core.registers[DSP_REG_A2];
                   8243:        dest[1] = dsp_core.registers[DSP_REG_A1];
                   8244:        dest[2] = dsp_core.registers[DSP_REG_A0];
                   8245: 
                   8246:        dsp_rnd56(dest);
                   8247: 
                   8248:        dsp_core.registers[DSP_REG_A2] = dest[0];
                   8249:        dsp_core.registers[DSP_REG_A1] = dest[1];
                   8250:        dsp_core.registers[DSP_REG_A0] = dest[2];
                   8251: 
                   8252:        dsp_ccr_update_e_u_n_z(dest[0], dest[1], dest[2]);
                   8253: }
                   8254: 
                   8255: static void dsp_rnd_b(void)
                   8256: {
                   8257:        Uint32 dest[3];
                   8258: 
                   8259:        dest[0] = dsp_core.registers[DSP_REG_B2];
                   8260:        dest[1] = dsp_core.registers[DSP_REG_B1];
                   8261:        dest[2] = dsp_core.registers[DSP_REG_B0];
                   8262: 
                   8263:        dsp_rnd56(dest);
                   8264: 
                   8265:        dsp_core.registers[DSP_REG_B2] = dest[0];
                   8266:        dsp_core.registers[DSP_REG_B1] = dest[1];
                   8267:        dsp_core.registers[DSP_REG_B0] = dest[2];
                   8268: 
                   8269:        dsp_ccr_update_e_u_n_z(dest[0], dest[1], dest[2]);
                   8270: }
                   8271: 
                   8272: static void dsp_rol_a(void)
                   8273: {
                   8274:        Uint32 newcarry;
                   8275: 
                   8276:        newcarry = (dsp_core.registers[DSP_REG_A1]>>23) & 1;
                   8277: 
                   8278:        dsp_core.registers[DSP_REG_A1] <<= 1;
1.1.1.14! root     8279:        dsp_core.registers[DSP_REG_A1] |= dsp_core.registers[DSP_REG_SR] & 1;
1.1.1.6   root     8280:        dsp_core.registers[DSP_REG_A1] &= BITMASK(24);
                   8281: 
                   8282:        dsp_core.registers[DSP_REG_SR] &= BITMASK(16)-((1<<DSP_SR_C)|(1<<DSP_SR_N)|(1<<DSP_SR_Z)|(1<<DSP_SR_V));
                   8283:        dsp_core.registers[DSP_REG_SR] |= newcarry;
                   8284:        dsp_core.registers[DSP_REG_SR] |= ((dsp_core.registers[DSP_REG_A1]>>23) & 1)<<DSP_SR_N;
                   8285:        dsp_core.registers[DSP_REG_SR] |= (dsp_core.registers[DSP_REG_A1]==0)<<DSP_SR_Z;
                   8286: }
                   8287: 
                   8288: static void dsp_rol_b(void)
                   8289: {
                   8290:        Uint32 newcarry;
                   8291: 
                   8292:        newcarry = (dsp_core.registers[DSP_REG_B1]>>23) & 1;
                   8293: 
                   8294:        dsp_core.registers[DSP_REG_B1] <<= 1;
1.1.1.14! root     8295:        dsp_core.registers[DSP_REG_B1] |= dsp_core.registers[DSP_REG_SR] & 1;
1.1.1.6   root     8296:        dsp_core.registers[DSP_REG_B1] &= BITMASK(24);
                   8297: 
                   8298:        dsp_core.registers[DSP_REG_SR] &= BITMASK(16)-((1<<DSP_SR_C)|(1<<DSP_SR_N)|(1<<DSP_SR_Z)|(1<<DSP_SR_V));
                   8299:        dsp_core.registers[DSP_REG_SR] |= newcarry;
                   8300:        dsp_core.registers[DSP_REG_SR] |= ((dsp_core.registers[DSP_REG_B1]>>23) & 1)<<DSP_SR_N;
                   8301:        dsp_core.registers[DSP_REG_SR] |= (dsp_core.registers[DSP_REG_B1]==0)<<DSP_SR_Z;
                   8302: }
                   8303: 
                   8304: static void dsp_ror_a(void)
                   8305: {
                   8306:        Uint32 newcarry;
                   8307: 
                   8308:        newcarry = dsp_core.registers[DSP_REG_A1] & 1;
                   8309: 
                   8310:        dsp_core.registers[DSP_REG_A1] >>= 1;
1.1.1.14! root     8311:        dsp_core.registers[DSP_REG_A1] |= (dsp_core.registers[DSP_REG_SR] & 1)<<23;
1.1.1.6   root     8312: 
                   8313:        dsp_core.registers[DSP_REG_SR] &= BITMASK(16)-((1<<DSP_SR_C)|(1<<DSP_SR_N)|(1<<DSP_SR_Z)|(1<<DSP_SR_V));
                   8314:        dsp_core.registers[DSP_REG_SR] |= newcarry;
                   8315:        dsp_core.registers[DSP_REG_SR] |= newcarry<<DSP_SR_N;
                   8316:        dsp_core.registers[DSP_REG_SR] |= (dsp_core.registers[DSP_REG_A1]==0)<<DSP_SR_Z;
                   8317: }
                   8318: 
                   8319: static void dsp_ror_b(void)
                   8320: {
                   8321:        Uint32 newcarry;
                   8322: 
                   8323:        newcarry = dsp_core.registers[DSP_REG_B1] & 1;
                   8324: 
                   8325:        dsp_core.registers[DSP_REG_B1] >>= 1;
1.1.1.14! root     8326:        dsp_core.registers[DSP_REG_B1] |= (dsp_core.registers[DSP_REG_SR] & 1)<<23;
1.1.1.6   root     8327: 
                   8328:        dsp_core.registers[DSP_REG_SR] &= BITMASK(16)-((1<<DSP_SR_C)|(1<<DSP_SR_N)|(1<<DSP_SR_Z)|(1<<DSP_SR_V));
                   8329:        dsp_core.registers[DSP_REG_SR] |= newcarry;
                   8330:        dsp_core.registers[DSP_REG_SR] |= newcarry<<DSP_SR_N;
                   8331:        dsp_core.registers[DSP_REG_SR] |= (dsp_core.registers[DSP_REG_B1]==0)<<DSP_SR_Z;
                   8332: }
                   8333: 
                   8334: static void dsp_sbc_x_a(void)
                   8335: {
                   8336:        Uint32 source[3], dest[3], curcarry;
                   8337:        Uint16 newsr;
                   8338: 
                   8339:        curcarry = (dsp_core.registers[DSP_REG_SR]>>(DSP_SR_C)) & 1;
                   8340: 
                   8341:        dest[2] = dsp_core.registers[DSP_REG_A0];
                   8342:        dest[1] = dsp_core.registers[DSP_REG_A1];
                   8343:        dest[0] = dsp_core.registers[DSP_REG_A2];
                   8344: 
                   8345:        source[2] = dsp_core.registers[DSP_REG_X0];
                   8346:        source[1] = dsp_core.registers[DSP_REG_X1];
1.1.1.7   root     8347:        source[0] = source[1] & (1<<23) ? 0xff : 0x0;
1.1.1.6   root     8348: 
                   8349:        newsr = dsp_sub56(source, dest);
1.1.1.11  root     8350: 
1.1.1.6   root     8351:        if (curcarry) {
                   8352:                source[0]=0; source[1]=0; source[2]=1;
                   8353:                newsr |= dsp_sub56(source, dest);
                   8354:        }
                   8355: 
                   8356:        dsp_core.registers[DSP_REG_A2] = dest[0];
                   8357:        dsp_core.registers[DSP_REG_A1] = dest[1];
                   8358:        dsp_core.registers[DSP_REG_A0] = dest[2];
                   8359: 
                   8360:        dsp_ccr_update_e_u_n_z(dest[0], dest[1], dest[2]);
                   8361: 
                   8362:        dsp_core.registers[DSP_REG_SR] &= BITMASK(16)-((1<<DSP_SR_V)|(1<<DSP_SR_C));
                   8363:        dsp_core.registers[DSP_REG_SR] |= newsr;
                   8364: }
                   8365: 
                   8366: static void dsp_sbc_x_b(void)
                   8367: {
                   8368:        Uint32 source[3], dest[3], curcarry;
                   8369:        Uint16 newsr;
                   8370: 
                   8371:        curcarry = (dsp_core.registers[DSP_REG_SR]>>(DSP_SR_C)) & 1;
                   8372: 
                   8373:        dest[2] = dsp_core.registers[DSP_REG_B0];
                   8374:        dest[1] = dsp_core.registers[DSP_REG_B1];
                   8375:        dest[0] = dsp_core.registers[DSP_REG_B2];
                   8376: 
                   8377:        source[2] = dsp_core.registers[DSP_REG_X0];
                   8378:        source[1] = dsp_core.registers[DSP_REG_X1];
1.1.1.7   root     8379:        source[0] = source[1] & (1<<23) ? 0xff : 0x0;
1.1.1.6   root     8380: 
                   8381:        newsr = dsp_sub56(source, dest);
1.1.1.11  root     8382: 
1.1.1.6   root     8383:        if (curcarry) {
                   8384:                source[0]=0; source[1]=0; source[2]=1;
                   8385:                newsr |= dsp_sub56(source, dest);
                   8386:        }
                   8387: 
                   8388:        dsp_core.registers[DSP_REG_B2] = dest[0];
                   8389:        dsp_core.registers[DSP_REG_B1] = dest[1];
                   8390:        dsp_core.registers[DSP_REG_B0] = dest[2];
                   8391: 
                   8392:        dsp_ccr_update_e_u_n_z(dest[0], dest[1], dest[2]);
                   8393: 
                   8394:        dsp_core.registers[DSP_REG_SR] &= BITMASK(16)-((1<<DSP_SR_V)|(1<<DSP_SR_C));
                   8395:        dsp_core.registers[DSP_REG_SR] |= newsr;
                   8396: }
                   8397: 
                   8398: static void dsp_sbc_y_a(void)
                   8399: {
                   8400:        Uint32 source[3], dest[3], curcarry;
1.1.1.2   root     8401:        Uint16 newsr;
1.1       root     8402: 
1.1.1.6   root     8403:        curcarry = (dsp_core.registers[DSP_REG_SR]>>(DSP_SR_C)) & 1;
                   8404: 
                   8405:        dest[2] = dsp_core.registers[DSP_REG_A0];
                   8406:        dest[1] = dsp_core.registers[DSP_REG_A1];
                   8407:        dest[0] = dsp_core.registers[DSP_REG_A2];
                   8408: 
                   8409:        source[2] = dsp_core.registers[DSP_REG_Y0];
                   8410:        source[1] = dsp_core.registers[DSP_REG_Y1];
1.1.1.7   root     8411:        source[0] = source[1] & (1<<23) ? 0xff : 0x0;
1.1.1.6   root     8412: 
                   8413:        newsr = dsp_sub56(source, dest);
1.1.1.11  root     8414: 
1.1.1.6   root     8415:        if (curcarry) {
                   8416:                source[0]=0; source[1]=0; source[2]=1;
                   8417:                newsr |= dsp_sub56(source, dest);
                   8418:        }
                   8419: 
                   8420:        dsp_core.registers[DSP_REG_A2] = dest[0];
                   8421:        dsp_core.registers[DSP_REG_A1] = dest[1];
                   8422:        dsp_core.registers[DSP_REG_A0] = dest[2];
                   8423: 
                   8424:        dsp_ccr_update_e_u_n_z(dest[0], dest[1], dest[2]);
                   8425: 
                   8426:        dsp_core.registers[DSP_REG_SR] &= BITMASK(16)-((1<<DSP_SR_V)|(1<<DSP_SR_C));
                   8427:        dsp_core.registers[DSP_REG_SR] |= newsr;
                   8428: }
                   8429: 
                   8430: static void dsp_sbc_y_b(void)
                   8431: {
                   8432:        Uint32 source[3], dest[3], curcarry;
                   8433:        Uint16 newsr;
                   8434: 
                   8435:        curcarry = (dsp_core.registers[DSP_REG_SR]>>(DSP_SR_C)) & 1;
                   8436: 
                   8437:        dest[2] = dsp_core.registers[DSP_REG_B0];
                   8438:        dest[1] = dsp_core.registers[DSP_REG_B1];
                   8439:        dest[0] = dsp_core.registers[DSP_REG_B2];
                   8440: 
                   8441:        source[2] = dsp_core.registers[DSP_REG_Y0];
                   8442:        source[1] = dsp_core.registers[DSP_REG_Y1];
1.1.1.7   root     8443:        source[0] = source[1] & (1<<23) ? 0xff : 0x0;
1.1.1.6   root     8444: 
                   8445:        newsr = dsp_sub56(source, dest);
1.1.1.11  root     8446: 
1.1.1.6   root     8447:        if (curcarry) {
                   8448:                source[0]=0; source[1]=0; source[2]=1;
                   8449:                newsr |= dsp_sub56(source, dest);
1.1       root     8450:        }
                   8451: 
1.1.1.6   root     8452:        dsp_core.registers[DSP_REG_B2] = dest[0];
                   8453:        dsp_core.registers[DSP_REG_B1] = dest[1];
                   8454:        dsp_core.registers[DSP_REG_B0] = dest[2];
                   8455: 
                   8456:        dsp_ccr_update_e_u_n_z(dest[0], dest[1], dest[2]);
                   8457: 
                   8458:        dsp_core.registers[DSP_REG_SR] &= BITMASK(16)-((1<<DSP_SR_V)|(1<<DSP_SR_C));
                   8459:        dsp_core.registers[DSP_REG_SR] |= newsr;
                   8460: }
                   8461: 
                   8462: static void dsp_sub_b_a(void)
                   8463: {
                   8464:        Uint32 source[3], dest[3];
                   8465:        Uint16 newsr;
                   8466: 
                   8467:        dest[2] = dsp_core.registers[DSP_REG_A0];
                   8468:        dest[1] = dsp_core.registers[DSP_REG_A1];
                   8469:        dest[0] = dsp_core.registers[DSP_REG_A2];
                   8470: 
                   8471:        source[2] = dsp_core.registers[DSP_REG_B0];
                   8472:        source[1] = dsp_core.registers[DSP_REG_B1];
                   8473:        source[0] = dsp_core.registers[DSP_REG_B2];
                   8474: 
1.1       root     8475:        newsr = dsp_sub56(source, dest);
                   8476: 
1.1.1.6   root     8477:        dsp_core.registers[DSP_REG_A2] = dest[0];
                   8478:        dsp_core.registers[DSP_REG_A1] = dest[1];
                   8479:        dsp_core.registers[DSP_REG_A0] = dest[2];
1.1.1.2   root     8480: 
1.1.1.6   root     8481:        dsp_ccr_update_e_u_n_z(dest[0], dest[1], dest[2]);
1.1       root     8482: 
1.1.1.6   root     8483:        dsp_core.registers[DSP_REG_SR] &= BITMASK(16)-((1<<DSP_SR_V)|(1<<DSP_SR_C));
                   8484:        dsp_core.registers[DSP_REG_SR] |= newsr;
1.1       root     8485: }
                   8486: 
1.1.1.6   root     8487: static void dsp_sub_a_b(void)
1.1       root     8488: {
1.1.1.6   root     8489:        Uint32 source[3], dest[3];
1.1.1.2   root     8490:        Uint16 newsr;
1.1       root     8491: 
1.1.1.6   root     8492:        dest[2] = dsp_core.registers[DSP_REG_B0];
                   8493:        dest[1] = dsp_core.registers[DSP_REG_B1];
                   8494:        dest[0] = dsp_core.registers[DSP_REG_B2];
                   8495: 
                   8496:        source[2] = dsp_core.registers[DSP_REG_A0];
                   8497:        source[1] = dsp_core.registers[DSP_REG_A1];
                   8498:        source[0] = dsp_core.registers[DSP_REG_A2];
                   8499: 
                   8500:        newsr = dsp_sub56(source, dest);
                   8501: 
                   8502:        dsp_core.registers[DSP_REG_B2] = dest[0];
                   8503:        dsp_core.registers[DSP_REG_B1] = dest[1];
                   8504:        dsp_core.registers[DSP_REG_B0] = dest[2];
                   8505: 
                   8506:        dsp_ccr_update_e_u_n_z(dest[0], dest[1], dest[2]);
                   8507: 
                   8508:        dsp_core.registers[DSP_REG_SR] &= BITMASK(16)-((1<<DSP_SR_V)|(1<<DSP_SR_C));
                   8509:        dsp_core.registers[DSP_REG_SR] |= newsr;
                   8510: }
                   8511: 
                   8512: static void dsp_sub_x_a(void)
                   8513: {
                   8514:        Uint32 source[3], dest[3];
                   8515:        Uint16 newsr;
                   8516: 
                   8517:        dest[2] = dsp_core.registers[DSP_REG_A0];
                   8518:        dest[1] = dsp_core.registers[DSP_REG_A1];
                   8519:        dest[0] = dsp_core.registers[DSP_REG_A2];
                   8520: 
                   8521:        source[2] = dsp_core.registers[DSP_REG_X0];
                   8522:        source[1] = dsp_core.registers[DSP_REG_X1];
1.1.1.7   root     8523:        source[0] = source[1] & (1<<23) ? 0xff : 0x0;
1.1.1.6   root     8524: 
                   8525:        newsr = dsp_sub56(source, dest);
                   8526: 
                   8527:        dsp_core.registers[DSP_REG_A2] = dest[0];
                   8528:        dsp_core.registers[DSP_REG_A1] = dest[1];
                   8529:        dsp_core.registers[DSP_REG_A0] = dest[2];
                   8530: 
                   8531:        dsp_ccr_update_e_u_n_z(dest[0], dest[1], dest[2]);
                   8532: 
                   8533:        dsp_core.registers[DSP_REG_SR] &= BITMASK(16)-((1<<DSP_SR_V)|(1<<DSP_SR_C));
                   8534:        dsp_core.registers[DSP_REG_SR] |= newsr;
                   8535: }
                   8536: 
                   8537: static void dsp_sub_x_b(void)
                   8538: {
                   8539:        Uint32 source[3], dest[3];
                   8540:        Uint16 newsr;
                   8541: 
                   8542:        dest[2] = dsp_core.registers[DSP_REG_B0];
                   8543:        dest[1] = dsp_core.registers[DSP_REG_B1];
                   8544:        dest[0] = dsp_core.registers[DSP_REG_B2];
                   8545: 
                   8546:        source[2] = dsp_core.registers[DSP_REG_X0];
                   8547:        source[1] = dsp_core.registers[DSP_REG_X1];
1.1.1.7   root     8548:        source[0] = source[1] & (1<<23) ? 0xff : 0x0;
1.1.1.6   root     8549: 
                   8550:        newsr = dsp_sub56(source, dest);
                   8551: 
                   8552:        dsp_core.registers[DSP_REG_B2] = dest[0];
                   8553:        dsp_core.registers[DSP_REG_B1] = dest[1];
                   8554:        dsp_core.registers[DSP_REG_B0] = dest[2];
                   8555: 
                   8556:        dsp_ccr_update_e_u_n_z(dest[0], dest[1], dest[2]);
                   8557: 
                   8558:        dsp_core.registers[DSP_REG_SR] &= BITMASK(16)-((1<<DSP_SR_V)|(1<<DSP_SR_C));
                   8559:        dsp_core.registers[DSP_REG_SR] |= newsr;
                   8560: }
                   8561: 
                   8562: static void dsp_sub_y_a(void)
                   8563: {
                   8564:        Uint32 source[3], dest[3];
                   8565:        Uint16 newsr;
                   8566: 
                   8567:        dest[2] = dsp_core.registers[DSP_REG_A0];
                   8568:        dest[1] = dsp_core.registers[DSP_REG_A1];
                   8569:        dest[0] = dsp_core.registers[DSP_REG_A2];
                   8570: 
                   8571:        source[2] = dsp_core.registers[DSP_REG_Y0];
                   8572:        source[1] = dsp_core.registers[DSP_REG_Y1];
1.1.1.7   root     8573:        source[0] = source[1] & (1<<23) ? 0xff : 0x0;
1.1.1.6   root     8574: 
                   8575:        newsr = dsp_sub56(source, dest);
                   8576: 
                   8577:        dsp_core.registers[DSP_REG_A2] = dest[0];
                   8578:        dsp_core.registers[DSP_REG_A1] = dest[1];
                   8579:        dsp_core.registers[DSP_REG_A0] = dest[2];
                   8580: 
                   8581:        dsp_ccr_update_e_u_n_z(dest[0], dest[1], dest[2]);
                   8582: 
                   8583:        dsp_core.registers[DSP_REG_SR] &= BITMASK(16)-((1<<DSP_SR_V)|(1<<DSP_SR_C));
                   8584:        dsp_core.registers[DSP_REG_SR] |= newsr;
                   8585: }
                   8586: 
                   8587: static void dsp_sub_y_b(void)
                   8588: {
                   8589:        Uint32 source[3], dest[3];
                   8590:        Uint16 newsr;
                   8591: 
                   8592:        dest[2] = dsp_core.registers[DSP_REG_B0];
                   8593:        dest[1] = dsp_core.registers[DSP_REG_B1];
                   8594:        dest[0] = dsp_core.registers[DSP_REG_B2];
                   8595: 
                   8596:        source[2] = dsp_core.registers[DSP_REG_Y0];
                   8597:        source[1] = dsp_core.registers[DSP_REG_Y1];
1.1.1.7   root     8598:        source[0] = source[1] & (1<<23) ? 0xff : 0x0;
1.1.1.6   root     8599: 
                   8600:        newsr = dsp_sub56(source, dest);
                   8601: 
                   8602:        dsp_core.registers[DSP_REG_B2] = dest[0];
                   8603:        dsp_core.registers[DSP_REG_B1] = dest[1];
                   8604:        dsp_core.registers[DSP_REG_B0] = dest[2];
                   8605: 
                   8606:        dsp_ccr_update_e_u_n_z(dest[0], dest[1], dest[2]);
                   8607: 
                   8608:        dsp_core.registers[DSP_REG_SR] &= BITMASK(16)-((1<<DSP_SR_V)|(1<<DSP_SR_C));
                   8609:        dsp_core.registers[DSP_REG_SR] |= newsr;
                   8610: }
                   8611: 
                   8612: static void dsp_sub_x0_a(void)
                   8613: {
                   8614:        Uint32 source[3], dest[3];
                   8615:        Uint16 newsr;
                   8616: 
                   8617:        dest[2] = dsp_core.registers[DSP_REG_A0];
                   8618:        dest[1] = dsp_core.registers[DSP_REG_A1];
                   8619:        dest[0] = dsp_core.registers[DSP_REG_A2];
                   8620: 
                   8621:        source[2] = 0;
                   8622:        source[1] = dsp_core.registers[DSP_REG_X0];
1.1.1.7   root     8623:        source[0] = source[1] & (1<<23) ? 0xff : 0x0;
1.1.1.6   root     8624: 
                   8625:        newsr = dsp_sub56(source, dest);
                   8626: 
                   8627:        dsp_core.registers[DSP_REG_A2] = dest[0];
                   8628:        dsp_core.registers[DSP_REG_A1] = dest[1];
                   8629:        dsp_core.registers[DSP_REG_A0] = dest[2];
                   8630: 
                   8631:        dsp_ccr_update_e_u_n_z(dest[0], dest[1], dest[2]);
                   8632: 
                   8633:        dsp_core.registers[DSP_REG_SR] &= BITMASK(16)-((1<<DSP_SR_V)|(1<<DSP_SR_C));
                   8634:        dsp_core.registers[DSP_REG_SR] |= newsr;
                   8635: }
                   8636: 
                   8637: static void dsp_sub_x0_b(void)
                   8638: {
                   8639:        Uint32 source[3], dest[3];
                   8640:        Uint16 newsr;
                   8641: 
                   8642:        dest[2] = dsp_core.registers[DSP_REG_B0];
                   8643:        dest[1] = dsp_core.registers[DSP_REG_B1];
                   8644:        dest[0] = dsp_core.registers[DSP_REG_B2];
                   8645: 
                   8646:        source[2] = 0;
                   8647:        source[1] = dsp_core.registers[DSP_REG_X0];
1.1.1.7   root     8648:        source[0] = source[1] & (1<<23) ? 0xff : 0x0;
1.1.1.6   root     8649: 
                   8650:        newsr = dsp_sub56(source, dest);
                   8651: 
                   8652:        dsp_core.registers[DSP_REG_B2] = dest[0];
                   8653:        dsp_core.registers[DSP_REG_B1] = dest[1];
                   8654:        dsp_core.registers[DSP_REG_B0] = dest[2];
                   8655: 
                   8656:        dsp_ccr_update_e_u_n_z(dest[0], dest[1], dest[2]);
                   8657: 
                   8658:        dsp_core.registers[DSP_REG_SR] &= BITMASK(16)-((1<<DSP_SR_V)|(1<<DSP_SR_C));
                   8659:        dsp_core.registers[DSP_REG_SR] |= newsr;
                   8660: }
                   8661: 
                   8662: static void dsp_sub_y0_a(void)
                   8663: {
                   8664:        Uint32 source[3], dest[3];
                   8665:        Uint16 newsr;
                   8666: 
                   8667:        dest[2] = dsp_core.registers[DSP_REG_A0];
                   8668:        dest[1] = dsp_core.registers[DSP_REG_A1];
                   8669:        dest[0] = dsp_core.registers[DSP_REG_A2];
                   8670: 
                   8671:        source[2] = 0;
                   8672:        source[1] = dsp_core.registers[DSP_REG_Y0];
1.1.1.7   root     8673:        source[0] = source[1] & (1<<23) ? 0xff : 0x0;
1.1.1.6   root     8674: 
                   8675:        newsr = dsp_sub56(source, dest);
1.1       root     8676: 
1.1.1.6   root     8677:        dsp_core.registers[DSP_REG_A2] = dest[0];
                   8678:        dsp_core.registers[DSP_REG_A1] = dest[1];
                   8679:        dsp_core.registers[DSP_REG_A0] = dest[2];
                   8680: 
                   8681:        dsp_ccr_update_e_u_n_z(dest[0], dest[1], dest[2]);
                   8682: 
                   8683:        dsp_core.registers[DSP_REG_SR] &= BITMASK(16)-((1<<DSP_SR_V)|(1<<DSP_SR_C));
                   8684:        dsp_core.registers[DSP_REG_SR] |= newsr;
                   8685: }
                   8686: 
                   8687: static void dsp_sub_y0_b(void)
                   8688: {
                   8689:        Uint32 source[3], dest[3];
                   8690:        Uint16 newsr;
                   8691: 
                   8692:        dest[2] = dsp_core.registers[DSP_REG_B0];
                   8693:        dest[1] = dsp_core.registers[DSP_REG_B1];
                   8694:        dest[0] = dsp_core.registers[DSP_REG_B2];
                   8695: 
                   8696:        source[2] = 0;
                   8697:        source[1] = dsp_core.registers[DSP_REG_Y0];
1.1.1.7   root     8698:        source[0] = source[1] & (1<<23) ? 0xff : 0x0;
1.1.1.6   root     8699: 
                   8700:        newsr = dsp_sub56(source, dest);
                   8701: 
                   8702:        dsp_core.registers[DSP_REG_B2] = dest[0];
                   8703:        dsp_core.registers[DSP_REG_B1] = dest[1];
                   8704:        dsp_core.registers[DSP_REG_B0] = dest[2];
                   8705: 
                   8706:        dsp_ccr_update_e_u_n_z(dest[0], dest[1], dest[2]);
                   8707: 
                   8708:        dsp_core.registers[DSP_REG_SR] &= BITMASK(16)-((1<<DSP_SR_V)|(1<<DSP_SR_C));
                   8709:        dsp_core.registers[DSP_REG_SR] |= newsr;
                   8710: }
                   8711: 
                   8712: static void dsp_sub_x1_a(void)
                   8713: {
                   8714:        Uint32 source[3], dest[3];
                   8715:        Uint16 newsr;
                   8716: 
                   8717:        dest[2] = dsp_core.registers[DSP_REG_A0];
                   8718:        dest[1] = dsp_core.registers[DSP_REG_A1];
                   8719:        dest[0] = dsp_core.registers[DSP_REG_A2];
                   8720: 
                   8721:        source[2] = 0;
                   8722:        source[1] = dsp_core.registers[DSP_REG_X1];
1.1.1.7   root     8723:        source[0] = source[1] & (1<<23) ? 0xff : 0x0;
1.1.1.6   root     8724: 
                   8725:        newsr = dsp_sub56(source, dest);
                   8726: 
                   8727:        dsp_core.registers[DSP_REG_A2] = dest[0];
                   8728:        dsp_core.registers[DSP_REG_A1] = dest[1];
                   8729:        dsp_core.registers[DSP_REG_A0] = dest[2];
                   8730: 
                   8731:        dsp_ccr_update_e_u_n_z(dest[0], dest[1], dest[2]);
                   8732: 
                   8733:        dsp_core.registers[DSP_REG_SR] &= BITMASK(16)-((1<<DSP_SR_V)|(1<<DSP_SR_C));
                   8734:        dsp_core.registers[DSP_REG_SR] |= newsr;
                   8735: }
                   8736: 
                   8737: static void dsp_sub_x1_b(void)
                   8738: {
                   8739:        Uint32 source[3], dest[3];
                   8740:        Uint16 newsr;
                   8741: 
                   8742:        dest[2] = dsp_core.registers[DSP_REG_B0];
                   8743:        dest[1] = dsp_core.registers[DSP_REG_B1];
                   8744:        dest[0] = dsp_core.registers[DSP_REG_B2];
                   8745: 
                   8746:        source[2] = 0;
                   8747:        source[1] = dsp_core.registers[DSP_REG_X1];
1.1.1.7   root     8748:        source[0] = source[1] & (1<<23) ? 0xff : 0x0;
1.1.1.6   root     8749: 
                   8750:        newsr = dsp_sub56(source, dest);
                   8751: 
                   8752:        dsp_core.registers[DSP_REG_B2] = dest[0];
                   8753:        dsp_core.registers[DSP_REG_B1] = dest[1];
                   8754:        dsp_core.registers[DSP_REG_B0] = dest[2];
                   8755: 
                   8756:        dsp_ccr_update_e_u_n_z(dest[0], dest[1], dest[2]);
                   8757: 
                   8758:        dsp_core.registers[DSP_REG_SR] &= BITMASK(16)-((1<<DSP_SR_V)|(1<<DSP_SR_C));
                   8759:        dsp_core.registers[DSP_REG_SR] |= newsr;
                   8760: }
                   8761: 
                   8762: static void dsp_sub_y1_a(void)
                   8763: {
                   8764:        Uint32 source[3], dest[3];
                   8765:        Uint16 newsr;
                   8766: 
                   8767:        dest[2] = dsp_core.registers[DSP_REG_A0];
                   8768:        dest[1] = dsp_core.registers[DSP_REG_A1];
                   8769:        dest[0] = dsp_core.registers[DSP_REG_A2];
                   8770: 
                   8771:        source[2] = 0;
                   8772:        source[1] = dsp_core.registers[DSP_REG_Y1];
1.1.1.7   root     8773:        source[0] = source[1] & (1<<23) ? 0xff : 0x0;
1.1.1.6   root     8774: 
                   8775:        newsr = dsp_sub56(source, dest);
                   8776: 
                   8777:        dsp_core.registers[DSP_REG_A2] = dest[0];
                   8778:        dsp_core.registers[DSP_REG_A1] = dest[1];
                   8779:        dsp_core.registers[DSP_REG_A0] = dest[2];
                   8780: 
                   8781:        dsp_ccr_update_e_u_n_z(dest[0], dest[1], dest[2]);
                   8782: 
                   8783:        dsp_core.registers[DSP_REG_SR] &= BITMASK(16)-((1<<DSP_SR_V)|(1<<DSP_SR_C));
                   8784:        dsp_core.registers[DSP_REG_SR] |= newsr;
                   8785: }
                   8786: 
                   8787: static void dsp_sub_y1_b(void)
                   8788: {
                   8789:        Uint32 source[3], dest[3];
                   8790:        Uint16 newsr;
                   8791: 
                   8792:        dest[2] = dsp_core.registers[DSP_REG_B0];
                   8793:        dest[1] = dsp_core.registers[DSP_REG_B1];
                   8794:        dest[0] = dsp_core.registers[DSP_REG_B2];
                   8795: 
                   8796:        source[2] = 0;
                   8797:        source[1] = dsp_core.registers[DSP_REG_Y1];
1.1.1.7   root     8798:        source[0] = source[1] & (1<<23) ? 0xff : 0x0;
1.1.1.6   root     8799: 
                   8800:        newsr = dsp_sub56(source, dest);
                   8801: 
                   8802:        dsp_core.registers[DSP_REG_B2] = dest[0];
                   8803:        dsp_core.registers[DSP_REG_B1] = dest[1];
                   8804:        dsp_core.registers[DSP_REG_B0] = dest[2];
                   8805: 
                   8806:        dsp_ccr_update_e_u_n_z(dest[0], dest[1], dest[2]);
                   8807: 
                   8808:        dsp_core.registers[DSP_REG_SR] &= BITMASK(16)-((1<<DSP_SR_V)|(1<<DSP_SR_C));
                   8809:        dsp_core.registers[DSP_REG_SR] |= newsr;
                   8810: }
                   8811: 
                   8812: static void dsp_subl_a(void)
                   8813: {
                   8814:        Uint32 source[3], dest[3];
                   8815:        Uint16 newsr;
                   8816: 
                   8817:        dest[0] = dsp_core.registers[DSP_REG_A2];
                   8818:        dest[1] = dsp_core.registers[DSP_REG_A1];
                   8819:        dest[2] = dsp_core.registers[DSP_REG_A0];
1.1       root     8820:        newsr = dsp_asl56(dest);
                   8821: 
1.1.1.6   root     8822:        source[0] = dsp_core.registers[DSP_REG_B2];
                   8823:        source[1] = dsp_core.registers[DSP_REG_B1];
                   8824:        source[2] = dsp_core.registers[DSP_REG_B0];
1.1       root     8825:        newsr |= dsp_sub56(source, dest);
                   8826: 
1.1.1.6   root     8827:        dsp_core.registers[DSP_REG_A2] = dest[0];
                   8828:        dsp_core.registers[DSP_REG_A1] = dest[1];
                   8829:        dsp_core.registers[DSP_REG_A0] = dest[2];
1.1.1.2   root     8830: 
1.1.1.6   root     8831:        dsp_ccr_update_e_u_n_z(dest[0], dest[1], dest[2]);
1.1       root     8832: 
1.1.1.6   root     8833:        dsp_core.registers[DSP_REG_SR] &= BITMASK(16)-((1<<DSP_SR_V)|(1<<DSP_SR_C));
                   8834:        dsp_core.registers[DSP_REG_SR] |= newsr;
1.1       root     8835: }
                   8836: 
1.1.1.6   root     8837: static void dsp_subl_b(void)
1.1       root     8838: {
1.1.1.6   root     8839:        Uint32 source[3], dest[3];
1.1.1.2   root     8840:        Uint16 newsr;
1.1       root     8841: 
1.1.1.6   root     8842:        dest[0] = dsp_core.registers[DSP_REG_B2];
                   8843:        dest[1] = dsp_core.registers[DSP_REG_B1];
                   8844:        dest[2] = dsp_core.registers[DSP_REG_B0];
                   8845:        newsr = dsp_asl56(dest);
1.1       root     8846: 
1.1.1.6   root     8847:        source[0] = dsp_core.registers[DSP_REG_A2];
                   8848:        source[1] = dsp_core.registers[DSP_REG_A1];
                   8849:        source[2] = dsp_core.registers[DSP_REG_A0];
                   8850:        newsr |= dsp_sub56(source, dest);
                   8851: 
                   8852:        dsp_core.registers[DSP_REG_B2] = dest[0];
                   8853:        dsp_core.registers[DSP_REG_B1] = dest[1];
                   8854:        dsp_core.registers[DSP_REG_B0] = dest[2];
                   8855: 
                   8856:        dsp_ccr_update_e_u_n_z(dest[0], dest[1], dest[2]);
                   8857: 
                   8858:        dsp_core.registers[DSP_REG_SR] &= BITMASK(16)-((1<<DSP_SR_V)|(1<<DSP_SR_C));
                   8859:        dsp_core.registers[DSP_REG_SR] |= newsr;
                   8860: }
                   8861: 
                   8862: static void dsp_subr_a(void)
                   8863: {
                   8864:        Uint32 source[3], dest[3];
                   8865:        Uint16 newsr;
                   8866: 
                   8867:        dest[0] = dsp_core.registers[DSP_REG_A2];
                   8868:        dest[1] = dsp_core.registers[DSP_REG_A1];
                   8869:        dest[2] = dsp_core.registers[DSP_REG_A0];
1.1.1.11  root     8870: 
1.1       root     8871:        newsr = dsp_asr56(dest);
                   8872: 
1.1.1.6   root     8873:        source[0] = dsp_core.registers[DSP_REG_B2];
                   8874:        source[1] = dsp_core.registers[DSP_REG_B1];
                   8875:        source[2] = dsp_core.registers[DSP_REG_B0];
1.1.1.11  root     8876: 
1.1       root     8877:        newsr |= dsp_sub56(source, dest);
                   8878: 
1.1.1.6   root     8879:        dsp_core.registers[DSP_REG_A2] = dest[0];
                   8880:        dsp_core.registers[DSP_REG_A1] = dest[1];
                   8881:        dsp_core.registers[DSP_REG_A0] = dest[2];
1.1.1.2   root     8882: 
1.1.1.6   root     8883:        dsp_ccr_update_e_u_n_z(dest[0], dest[1], dest[2]);
1.1       root     8884: 
1.1.1.6   root     8885:        dsp_core.registers[DSP_REG_SR] &= BITMASK(16)-((1<<DSP_SR_V)|(1<<DSP_SR_C));
                   8886:        dsp_core.registers[DSP_REG_SR] |= newsr;
1.1       root     8887: }
                   8888: 
1.1.1.6   root     8889: static void dsp_subr_b(void)
1.1       root     8890: {
1.1.1.6   root     8891:        Uint32 source[3], dest[3];
                   8892:        Uint16 newsr;
1.1       root     8893: 
1.1.1.6   root     8894:        dest[0] = dsp_core.registers[DSP_REG_B2];
                   8895:        dest[1] = dsp_core.registers[DSP_REG_B1];
                   8896:        dest[2] = dsp_core.registers[DSP_REG_B0];
1.1.1.11  root     8897: 
1.1.1.6   root     8898:        newsr = dsp_asr56(dest);
1.1       root     8899: 
1.1.1.6   root     8900:        source[0] = dsp_core.registers[DSP_REG_A2];
                   8901:        source[1] = dsp_core.registers[DSP_REG_A1];
                   8902:        source[2] = dsp_core.registers[DSP_REG_A0];
1.1.1.11  root     8903: 
1.1.1.6   root     8904:        newsr |= dsp_sub56(source, dest);
1.1       root     8905: 
1.1.1.6   root     8906:        dsp_core.registers[DSP_REG_B2] = dest[0];
                   8907:        dsp_core.registers[DSP_REG_B1] = dest[1];
                   8908:        dsp_core.registers[DSP_REG_B0] = dest[2];
                   8909: 
                   8910:        dsp_ccr_update_e_u_n_z(dest[0], dest[1], dest[2]);
                   8911: 
                   8912:        dsp_core.registers[DSP_REG_SR] &= BITMASK(16)-((1<<DSP_SR_V)|(1<<DSP_SR_C));
                   8913:        dsp_core.registers[DSP_REG_SR] |= newsr;
1.1       root     8914: }
                   8915: 
1.1.1.6   root     8916: static void dsp_tfr_b_a(void)
1.1       root     8917: {
1.1.1.6   root     8918:        dsp_core.registers[DSP_REG_A0] = dsp_core.registers[DSP_REG_B0];
                   8919:        dsp_core.registers[DSP_REG_A1] = dsp_core.registers[DSP_REG_B1];
                   8920:        dsp_core.registers[DSP_REG_A2] = dsp_core.registers[DSP_REG_B2];
                   8921: }
1.1       root     8922: 
1.1.1.6   root     8923: static void dsp_tfr_a_b(void)
                   8924: {
                   8925:        dsp_core.registers[DSP_REG_B0] = dsp_core.registers[DSP_REG_A0];
                   8926:        dsp_core.registers[DSP_REG_B1] = dsp_core.registers[DSP_REG_A1];
                   8927:        dsp_core.registers[DSP_REG_B2] = dsp_core.registers[DSP_REG_A2];
                   8928: }
                   8929: 
                   8930: static void dsp_tfr_x0_a(void)
                   8931: {
1.1.1.11  root     8932:        dsp_write_reg(DSP_REG_A, dsp_core.registers[DSP_REG_X0]);
1.1.1.6   root     8933: }
                   8934: 
                   8935: static void dsp_tfr_x0_b(void)
                   8936: {
1.1.1.11  root     8937:        dsp_write_reg(DSP_REG_B, dsp_core.registers[DSP_REG_X0]);
1.1.1.6   root     8938: }
                   8939: 
                   8940: static void dsp_tfr_y0_a(void)
                   8941: {
1.1.1.11  root     8942:        dsp_write_reg(DSP_REG_A, dsp_core.registers[DSP_REG_Y0]);
1.1.1.6   root     8943: }
                   8944: 
                   8945: static void dsp_tfr_y0_b(void)
                   8946: {
1.1.1.11  root     8947:        dsp_write_reg(DSP_REG_B, dsp_core.registers[DSP_REG_Y0]);
1.1.1.6   root     8948: }
                   8949: 
                   8950: static void dsp_tfr_x1_a(void)
                   8951: {
1.1.1.11  root     8952:        dsp_write_reg(DSP_REG_A, dsp_core.registers[DSP_REG_X1]);
1.1.1.6   root     8953: }
                   8954: 
                   8955: static void dsp_tfr_x1_b(void)
                   8956: {
1.1.1.11  root     8957:        dsp_write_reg(DSP_REG_B, dsp_core.registers[DSP_REG_X1]);
1.1.1.6   root     8958: }
                   8959: 
                   8960: static void dsp_tfr_y1_a(void)
                   8961: {
1.1.1.11  root     8962:        dsp_write_reg(DSP_REG_A, dsp_core.registers[DSP_REG_Y1]);
1.1.1.6   root     8963: }
                   8964: 
                   8965: static void dsp_tfr_y1_b(void)
                   8966: {
1.1.1.11  root     8967:        dsp_write_reg(DSP_REG_B, dsp_core.registers[DSP_REG_Y1]);
1.1.1.6   root     8968: }
                   8969: 
                   8970: static void dsp_tst_a(void)
                   8971: {
                   8972:        dsp_ccr_update_e_u_n_z( dsp_core.registers[DSP_REG_A2],
1.1.1.7   root     8973:                                dsp_core.registers[DSP_REG_A1],
                   8974:                                dsp_core.registers[DSP_REG_A0]);
1.1.1.6   root     8975: 
                   8976:        dsp_core.registers[DSP_REG_SR] &= BITMASK(16)-(1<<DSP_SR_V);
                   8977: }
                   8978: 
                   8979: static void dsp_tst_b(void)
                   8980: {
                   8981:        dsp_ccr_update_e_u_n_z( dsp_core.registers[DSP_REG_B2],
1.1.1.7   root     8982:                                dsp_core.registers[DSP_REG_B1],
                   8983:                                dsp_core.registers[DSP_REG_B0]);
1.1       root     8984: 
1.1.1.6   root     8985:        dsp_core.registers[DSP_REG_SR] &= BITMASK(16)-(1<<DSP_SR_V);
1.1       root     8986: }
                   8987: 
1.1.1.2   root     8988: /*
                   8989: vim:ts=4:sw=4:
                   8990: */

unix.superglobalmegacorp.com

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