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