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