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