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

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

unix.superglobalmegacorp.com

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