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