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