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