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