|
|
1.1 root 1: /*
1.1.1.2 root 2: DSP M56001 emulation
3: Disassembler
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: #ifdef HAVE_CONFIG_H
23: #include "config.h"
24: #endif
25:
26: #include <string.h>
1.1.1.5 ! root 27: #include <stdbool.h>
1.1.1.2 root 28:
29: #include "dsp_core.h"
1.1 root 30: #include "dsp_cpu.h"
31: #include "dsp_disasm.h"
32:
33:
34: /* More disasm infos, if wanted */
35: #define DSP_DISASM_REG_PC 0
36:
37: /**********************************
38: * Defines
39: **********************************/
40:
41: /**********************************
42: * Variables
43: **********************************/
44:
45: /* Current instruction */
1.1.1.2 root 46: static Uint32 cur_inst;
1.1.1.3 root 47: static Uint32 disasm_cur_inst_len;
1.1.1.4 root 48: static char str_instr[50];
49: static char str_instr2[100];
50: static char parallelmove_name[64];
1.1.1.3 root 51:
52: /* Previous instruction */
1.1.1.5 ! root 53: static Uint32 prev_inst_pc;
! 54: static bool isLooping;
1.1.1.2 root 55:
1.1.1.5 ! root 56: /* Used to display dc instead of unknown instruction for illegal opcodes */
! 57: static bool isInDisasmMode;
1.1.1.2 root 58:
1.1.1.5 ! root 59: void dsp56k_disasm_init(void)
1.1.1.2 root 60: {
1.1.1.5 ! root 61: prev_inst_pc = 0x10000; /* Init to an invalid value */
! 62: isLooping = false;
! 63: isInDisasmMode = false;
1.1.1.2 root 64: }
1.1 root 65:
66: /**********************************
67: * Register change
68: **********************************/
69:
1.1.1.2 root 70: static Uint32 registers_save[64];
1.1 root 71: #if DSP_DISASM_REG_PC
1.1.1.2 root 72: static Uint32 pc_save;
1.1 root 73: #endif
74:
75: static const char *registers_name[64]={
76: "","","","",
77: "x0","x1","y0","y1",
78: "a0","b0","a2","b2",
79: "a1","b1","a","b",
80:
81: "r0","r1","r2","r3",
82: "r4","r5","r6","r7",
83: "n0","n1","n2","n3",
84: "n4","n5","n6","n7",
85:
86: "m0","m1","m2","m3",
87: "m4","m5","m6","m7",
88: "","","","",
89: "","","","",
90:
91: "","","","",
92: "","","","",
93: "","sr","omr","sp",
94: "ssh","ssl","la","lc"
95: };
96:
97: /**********************************
98: * Opcode disassembler
99: **********************************/
100:
1.1.1.2 root 101: static Uint32 read_memory(Uint32 currPc);
102:
1.1 root 103: typedef void (*dsp_emul_t)(void);
104:
105: static void opcode8h_0(void);
106:
1.1.1.2 root 107: static int dsp_calc_ea(Uint32 ea_mode, char *dest);
108: static void dsp_calc_cc(Uint32 cc_mode, char *dest);
1.1 root 109: static void dsp_undefined(void);
110:
111: /* Instructions without parallel moves */
112: static void dsp_andi(void);
1.1.1.3 root 113: static void dsp_bchg_aa(void);
114: static void dsp_bchg_ea(void);
115: static void dsp_bchg_pp(void);
116: static void dsp_bchg_reg(void);
117: static void dsp_bclr_aa(void);
118: static void dsp_bclr_ea(void);
119: static void dsp_bclr_pp(void);
120: static void dsp_bclr_reg(void);
121: static void dsp_bset_aa(void);
122: static void dsp_bset_ea(void);
123: static void dsp_bset_pp(void);
124: static void dsp_bset_reg(void);
125: static void dsp_btst_aa(void);
126: static void dsp_btst_ea(void);
127: static void dsp_btst_pp(void);
128: static void dsp_btst_reg(void);
1.1 root 129: static void dsp_div(void);
130: static void dsp_enddo(void);
131: static void dsp_illegal(void);
1.1.1.3 root 132: static void dsp_jcc_imm(void);
133: static void dsp_jcc_ea(void);
134: static void dsp_jclr_aa(void);
135: static void dsp_jclr_ea(void);
136: static void dsp_jclr_pp(void);
137: static void dsp_jclr_reg(void);
138: static void dsp_jmp_ea(void);
139: static void dsp_jmp_imm(void);
140: static void dsp_jscc_ea(void);
141: static void dsp_jscc_imm(void);
142: static void dsp_jsclr_aa(void);
143: static void dsp_jsclr_ea(void);
144: static void dsp_jsclr_pp(void);
145: static void dsp_jsclr_reg(void);
146: static void dsp_jset_aa(void);
147: static void dsp_jset_ea(void);
148: static void dsp_jset_pp(void);
149: static void dsp_jset_reg(void);
150: static void dsp_jsr_ea(void);
151: static void dsp_jsr_imm(void);
152: static void dsp_jsset_aa(void);
153: static void dsp_jsset_ea(void);
154: static void dsp_jsset_pp(void);
155: static void dsp_jsset_reg(void);
1.1 root 156: static void dsp_lua(void);
1.1.1.3 root 157: static void dsp_movem_ea(void);
158: static void dsp_movem_aa(void);
1.1 root 159: static void dsp_nop(void);
160: static void dsp_norm(void);
161: static void dsp_ori(void);
162: static void dsp_reset(void);
163: static void dsp_rti(void);
164: static void dsp_rts(void);
165: static void dsp_stop(void);
166: static void dsp_swi(void);
167: static void dsp_tcc(void);
168: static void dsp_wait(void);
1.1.1.3 root 169: static void dsp_do_ea(void);
170: static void dsp_do_aa(void);
171: static void dsp_do_imm(void);
172: static void dsp_do_reg(void);
173: static void dsp_rep_aa(void);
174: static void dsp_rep_ea(void);
175: static void dsp_rep_imm(void);
176: static void dsp_rep_reg(void);
177: static void dsp_movec_aa(void);
178: static void dsp_movec_ea(void);
179: static void dsp_movec_imm(void);
180: static void dsp_movec_reg(void);
1.1 root 181: static void dsp_movep_0(void);
182: static void dsp_movep_1(void);
1.1.1.3 root 183: static void dsp_movep_23(void);
1.1 root 184:
185: /* Parallel moves */
1.1.1.3 root 186: static void dsp_pm_class2(void);
1.1 root 187: static void dsp_pm(void);
188: static void dsp_pm_0(void);
189: static void dsp_pm_1(void);
190: static void dsp_pm_2(void);
191: static void dsp_pm_4(void);
192: static void dsp_pm_8(void);
193:
194:
1.1.1.5 ! root 195: static const dsp_emul_t opcodes8h[512] = {
1.1.1.3 root 196: /* 0x00 - 0x3f */
197: opcode8h_0, dsp_undefined, dsp_undefined, dsp_undefined, opcode8h_0, dsp_andi, dsp_undefined, dsp_ori,
198: dsp_undefined, dsp_undefined, dsp_undefined, dsp_undefined, dsp_undefined, dsp_andi, dsp_undefined, dsp_ori,
199: dsp_undefined, dsp_undefined, dsp_undefined, dsp_undefined, dsp_undefined, dsp_andi, dsp_undefined, dsp_ori,
200: dsp_undefined, dsp_undefined, dsp_undefined, dsp_undefined, dsp_undefined, dsp_andi, dsp_undefined, dsp_ori,
201: dsp_undefined, dsp_undefined, dsp_undefined, dsp_undefined, dsp_undefined, dsp_undefined, dsp_undefined, dsp_undefined,
202: dsp_undefined, dsp_undefined, dsp_undefined, dsp_undefined, dsp_undefined, dsp_undefined, dsp_undefined, dsp_undefined,
203: dsp_undefined, dsp_undefined, dsp_div, dsp_div, dsp_undefined, dsp_undefined, dsp_undefined, dsp_undefined,
204: dsp_norm, dsp_undefined, dsp_undefined, dsp_undefined, dsp_undefined, dsp_undefined, dsp_undefined, dsp_undefined,
205:
206: /* 0x40 - 0x7f */
207: dsp_tcc, dsp_tcc, dsp_tcc, dsp_tcc, dsp_undefined, dsp_undefined, dsp_undefined, dsp_undefined,
208: dsp_tcc, dsp_tcc, dsp_tcc, dsp_tcc, dsp_undefined, dsp_undefined, dsp_undefined, dsp_undefined,
209: dsp_tcc, dsp_tcc, dsp_tcc, dsp_tcc, dsp_undefined, dsp_undefined, dsp_undefined, dsp_undefined,
210: dsp_tcc, dsp_tcc, dsp_tcc, dsp_tcc, dsp_undefined, dsp_undefined, dsp_undefined, dsp_undefined,
211: dsp_tcc, dsp_tcc, dsp_tcc, dsp_tcc, dsp_undefined, dsp_undefined, dsp_undefined, dsp_undefined,
212: dsp_tcc, dsp_tcc, dsp_tcc, dsp_tcc, dsp_undefined, dsp_undefined, dsp_undefined, dsp_undefined,
213: dsp_tcc, dsp_tcc, dsp_tcc, dsp_tcc, dsp_undefined, dsp_undefined, dsp_undefined, dsp_undefined,
214: dsp_tcc, dsp_tcc, dsp_tcc, dsp_tcc, dsp_undefined, dsp_undefined, dsp_undefined, dsp_undefined,
215:
216: /* 0x80 - 0xbf */
217: dsp_undefined, dsp_undefined, dsp_undefined, dsp_undefined, dsp_undefined, dsp_undefined, dsp_undefined, dsp_undefined,
218: dsp_lua, dsp_undefined, dsp_undefined, dsp_undefined, dsp_undefined, dsp_movec_reg, dsp_undefined, dsp_undefined,
219: dsp_undefined, dsp_undefined, dsp_undefined, dsp_undefined, dsp_undefined, dsp_undefined, dsp_undefined, dsp_undefined,
220: dsp_undefined, dsp_undefined, dsp_undefined, dsp_undefined, dsp_undefined, dsp_movec_reg, dsp_undefined, dsp_undefined,
221: dsp_undefined, dsp_movec_aa, dsp_undefined, dsp_movec_aa, dsp_undefined, dsp_movec_imm, dsp_undefined, dsp_undefined,
222: dsp_undefined, dsp_movec_ea, dsp_undefined, dsp_movec_ea, dsp_undefined, dsp_movec_imm, dsp_undefined, dsp_undefined,
223: dsp_undefined, dsp_movec_aa, dsp_undefined, dsp_movec_aa, dsp_undefined, dsp_movec_imm, dsp_undefined, dsp_undefined,
224: dsp_undefined, dsp_movec_ea, dsp_undefined, dsp_movec_ea, dsp_undefined, dsp_movec_imm, dsp_undefined, dsp_undefined,
225:
226: /* 0xc0 - 0xff */
227: dsp_do_aa, dsp_rep_aa, dsp_do_aa, dsp_rep_aa, dsp_do_imm, dsp_rep_imm, dsp_undefined, dsp_undefined,
228: dsp_do_ea, dsp_rep_ea, dsp_do_ea, dsp_rep_ea, dsp_do_imm, dsp_rep_imm, dsp_undefined, dsp_undefined,
229: dsp_undefined, dsp_undefined, dsp_undefined, dsp_undefined, dsp_do_imm, dsp_rep_imm, dsp_undefined, dsp_undefined,
230: dsp_do_reg, dsp_rep_reg, dsp_undefined, dsp_undefined, dsp_do_imm, dsp_rep_imm, dsp_undefined, dsp_undefined,
231: dsp_movem_aa, dsp_movem_aa, dsp_undefined, dsp_undefined, dsp_undefined, dsp_undefined, dsp_undefined, dsp_undefined,
232: dsp_undefined, dsp_undefined, dsp_undefined, dsp_undefined, dsp_movem_ea, dsp_movem_ea, dsp_undefined, dsp_undefined,
233: dsp_movem_aa, dsp_movem_aa, dsp_undefined, dsp_undefined, dsp_undefined, dsp_undefined, dsp_undefined, dsp_undefined,
234: dsp_undefined, dsp_undefined, dsp_undefined, dsp_undefined, dsp_movem_ea, dsp_movem_ea, dsp_undefined, dsp_undefined,
235:
236: /* 0x100 - 0x13f */
237: dsp_pm_class2, dsp_pm_class2, dsp_pm_class2, dsp_pm_class2, dsp_pm_class2, dsp_pm_class2, dsp_pm_class2, dsp_pm_class2,
238: dsp_movep_0, dsp_movep_0, dsp_movep_1, dsp_movep_1, dsp_movep_23, dsp_movep_23, dsp_movep_23, dsp_movep_23,
239: dsp_pm_class2, dsp_pm_class2, dsp_pm_class2, dsp_pm_class2, dsp_pm_class2, dsp_pm_class2, dsp_pm_class2, dsp_pm_class2,
240: dsp_movep_0, dsp_movep_0, dsp_movep_1, dsp_movep_1, dsp_movep_23, dsp_movep_23, dsp_movep_23, dsp_movep_23,
241: dsp_pm_class2, dsp_pm_class2, dsp_pm_class2, dsp_pm_class2, dsp_pm_class2, dsp_pm_class2, dsp_pm_class2, dsp_pm_class2,
242: dsp_movep_0, dsp_movep_0, dsp_movep_1, dsp_movep_1, dsp_movep_23, dsp_movep_23, dsp_movep_23, dsp_movep_23,
243: dsp_pm_class2, dsp_pm_class2, dsp_pm_class2, dsp_pm_class2, dsp_pm_class2, dsp_pm_class2, dsp_pm_class2, dsp_pm_class2,
244: dsp_movep_0, dsp_movep_0, dsp_movep_1, dsp_movep_1, dsp_movep_23, dsp_movep_23, dsp_movep_23, dsp_movep_23,
245:
246: /* 0x140 - 0x17f */
247: dsp_bclr_aa, dsp_bset_aa, dsp_bclr_aa, dsp_bset_aa, dsp_jclr_aa, dsp_jset_aa, dsp_jclr_aa, dsp_jset_aa,
248: dsp_bclr_ea, dsp_bset_ea, dsp_bclr_ea, dsp_bset_ea, dsp_jclr_ea, dsp_jset_ea, dsp_jclr_ea, dsp_jset_ea,
249: dsp_bclr_pp, dsp_bset_pp, dsp_bclr_pp, dsp_bset_pp, dsp_jclr_pp, dsp_jset_pp, dsp_jclr_pp, dsp_jset_pp,
250: dsp_jclr_reg, dsp_jset_reg, dsp_bclr_reg, dsp_bset_reg, dsp_jmp_ea, dsp_jcc_ea, dsp_undefined, dsp_undefined,
251: dsp_bchg_aa, dsp_btst_aa, dsp_bchg_aa, dsp_btst_aa, dsp_jsclr_aa, dsp_jsset_aa, dsp_jsclr_aa, dsp_jsset_aa,
252: dsp_bchg_ea, dsp_btst_ea, dsp_bchg_ea, dsp_btst_ea, dsp_jsclr_ea, dsp_jsset_ea, dsp_jsclr_ea, dsp_jsset_ea,
253: dsp_bchg_pp, dsp_btst_pp, dsp_bchg_pp, dsp_btst_pp, dsp_jsclr_pp, dsp_jsset_pp, dsp_jsclr_pp, dsp_jsset_pp,
254: dsp_jsclr_reg, dsp_jsset_reg, dsp_bchg_reg, dsp_btst_reg, dsp_jsr_ea, dsp_jscc_ea, dsp_undefined, dsp_undefined,
255:
256: /* 0x180 - 0x1bf */
257: dsp_jmp_imm, dsp_jmp_imm, dsp_jmp_imm, dsp_jmp_imm, dsp_jmp_imm, dsp_jmp_imm, dsp_jmp_imm, dsp_jmp_imm,
258: dsp_undefined, dsp_undefined, dsp_undefined, dsp_undefined, dsp_undefined, dsp_undefined, dsp_undefined, dsp_undefined,
259: dsp_undefined, dsp_undefined, dsp_undefined, dsp_undefined, dsp_undefined, dsp_undefined, dsp_undefined, dsp_undefined,
260: dsp_undefined, dsp_undefined, dsp_undefined, dsp_undefined, dsp_undefined, dsp_undefined, dsp_undefined, dsp_undefined,
261: dsp_jsr_imm, dsp_jsr_imm, dsp_jsr_imm, dsp_jsr_imm, dsp_jsr_imm, dsp_jsr_imm, dsp_jsr_imm, dsp_jsr_imm,
262: dsp_undefined, dsp_undefined, dsp_undefined, dsp_undefined, dsp_undefined, dsp_undefined, dsp_undefined, dsp_undefined,
263: dsp_undefined, dsp_undefined, dsp_undefined, dsp_undefined, dsp_undefined, dsp_undefined, dsp_undefined, dsp_undefined,
264: dsp_undefined, dsp_undefined, dsp_undefined, dsp_undefined, dsp_undefined, dsp_undefined, dsp_undefined, dsp_undefined,
265:
266: /* 0x1c0 - 0x1ff */
267: dsp_jcc_imm, dsp_jcc_imm, dsp_jcc_imm, dsp_jcc_imm, dsp_jcc_imm, dsp_jcc_imm, dsp_jcc_imm, dsp_jcc_imm,
268: dsp_jcc_imm, dsp_jcc_imm, dsp_jcc_imm, dsp_jcc_imm, dsp_jcc_imm, dsp_jcc_imm, dsp_jcc_imm, dsp_jcc_imm,
269: dsp_jcc_imm, dsp_jcc_imm, dsp_jcc_imm, dsp_jcc_imm, dsp_jcc_imm, dsp_jcc_imm, dsp_jcc_imm, dsp_jcc_imm,
270: dsp_jcc_imm, dsp_jcc_imm, dsp_jcc_imm, dsp_jcc_imm, dsp_jcc_imm, dsp_jcc_imm, dsp_jcc_imm, dsp_jcc_imm,
271: dsp_jscc_imm, dsp_jscc_imm, dsp_jscc_imm, dsp_jscc_imm, dsp_jscc_imm, dsp_jscc_imm, dsp_jscc_imm, dsp_jscc_imm,
272: dsp_jscc_imm, dsp_jscc_imm, dsp_jscc_imm, dsp_jscc_imm, dsp_jscc_imm, dsp_jscc_imm, dsp_jscc_imm, dsp_jscc_imm,
273: dsp_jscc_imm, dsp_jscc_imm, dsp_jscc_imm, dsp_jscc_imm, dsp_jscc_imm, dsp_jscc_imm, dsp_jscc_imm, dsp_jscc_imm,
274: dsp_jscc_imm, dsp_jscc_imm, dsp_jscc_imm, dsp_jscc_imm, dsp_jscc_imm, dsp_jscc_imm, dsp_jscc_imm, dsp_jscc_imm,
1.1 root 275: };
276:
1.1.1.5 ! root 277: static const char* opcodes_alu[256] = {
1.1.1.3 root 278: /* 0x00 - 0x3f */
1.1.1.5 ! root 279: "move" , "tfr b,a", "addr b,a", "tst a", "undefined", "cmp b,a" , "subr b,a", "cmpm b,a",
! 280: "undefined", "tfr a,b", "addr a,b", "tst b", "undefined", "cmp a,b" , "subr a,b", "cmpm a,b",
! 281: "add b,a" , "rnd a" , "addl b,a", "clr a", "sub b,a" , "undefined", "subl b,a", "not a",
! 282: "add a,b" , "rnd b" , "addl a,b", "clr b", "sub a,b" , "undefined", "subl a,b", "not b",
! 283: "add x,a" , "adc x,a", "asr a" , "lsr a", "sub x,a" , "sbc x,a" , "abs a" , "ror a",
! 284: "add x,b" , "adc x,b", "asr b" , "lsr b", "sub x,b" , "sbc x,b" , "abs b" , "ror b",
! 285: "add y,a" , "adc y,a", "asl a" , "lsl a", "sub y,a" , "sbc y,a" , "neg a" , "rol a",
! 286: "add y,b" , "adc y,b", "asl b" , "lsl b", "sub y,b" , "sbc y,b" , "neg b" , "rol b",
1.1.1.3 root 287:
288: /* 0x40 - 0x7f */
1.1.1.5 ! root 289: "add x0,a", "tfr x0,a", "or x0,a", "eor x0,a", "sub x0,a", "cmp x0,a", "and x0,a", "cmpm x0,a",
! 290: "add x0,b", "tfr x0,b", "or x0,b", "eor x0,b", "sub x0,b", "cmp x0,b", "and x0,b", "cmpm x0,b",
! 291: "add y0,a", "tfr y0,a", "or y0,a", "eor y0,a", "sub y0,a", "cmp y0,a", "and y0,a", "cmpm y0,a",
! 292: "add y0,b", "tfr y0,b", "or y0,b", "eor y0,b", "sub y0,b", "cmp y0,b", "and y0,b", "cmpm y0,b",
! 293: "add x1,a", "tfr x1,a", "or x1,a", "eor x1,a", "sub x1,a", "cmp x1,a", "and x1,a", "cmpm x1,a",
! 294: "add x1,b", "tfr x1,b", "or x1,b", "eor x1,b", "sub x1,b", "cmp x1,b", "and x1,b", "cmpm x1,b",
! 295: "add y1,a", "tfr y1,a", "or y1,a", "eor y1,a", "sub y1,a", "cmp y1,a", "and y1,a", "cmpm y1,a",
! 296: "add y1,b", "tfr y1,b", "or y1,b", "eor y1,b", "sub y1,b", "cmp y1,b", "and y1,b", "cmpm y1,b",
1.1.1.3 root 297:
298: /* 0x80 - 0xbf */
1.1.1.5 ! root 299: "mpy +x0,x0,a", "mpyr +x0,x0,a", "mac +x0,x0,a", "macr +x0,x0,a", "mpy -x0,x0,a", "mpyr -x0,x0,a", "mac -x0,x0,a", "macr -x0,x0,a",
! 300: "mpy +x0,x0,b", "mpyr +x0,x0,b", "mac +x0,x0,b", "macr +x0,x0,b", "mpy -x0,x0,b", "mpyr -x0,x0,b", "mac -x0,x0,b", "macr -x0,x0,b",
! 301: "mpy +y0,y0,a", "mpyr +y0,y0,a", "mac +y0,y0,a", "macr +y0,y0,a", "mpy -y0,y0,a", "mpyr -y0,y0,a", "mac -y0,y0,a", "macr -y0,y0,a",
! 302: "mpy +y0,y0,b", "mpyr +y0,y0,b", "mac +y0,y0,b", "macr +y0,y0,b", "mpy -y0,y0,b", "mpyr -y0,y0,b", "mac -y0,y0,b", "macr -y0,y0,b",
! 303: "mpy +x1,x0,a", "mpyr +x1,x0,a", "mac +x1,x0,a", "macr +x1,x0,a", "mpy -x1,x0,a", "mpyr -x1,x0,a", "mac -x1,x0,a", "macr -x1,x0,a",
! 304: "mpy +x1,x0,b", "mpyr +x1,x0,b", "mac +x1,x0,b", "macr +x1,x0,b", "mpy -x1,x0,b", "mpyr -x1,x0,b", "mac -x1,x0,b", "macr -x1,x0,b",
! 305: "mpy +y1,y0,a", "mpyr +y1,y0,a", "mac +y1,y0,a", "macr +y1,y0,a", "mpy -y1,y0,a", "mpyr -y1,y0,a", "mac -y1,y0,a", "macr -y1,y0,a",
! 306: "mpy +y1,y0,b", "mpyr +y1,y0,b", "mac +y1,y0,b", "macr +y1,y0,b", "mpy -y1,y0,b", "mpyr -y1,y0,b", "mac -y1,y0,b", "macr -y1,y0,b",
1.1.1.3 root 307:
308: /* 0xc0 - 0xff */
1.1.1.5 ! root 309: "mpy +x0,y1,a", "mpyr +x0,y1,a", "mac +x0,y1,a", "macr +x0,y1,a", "mpy -x0,y1,a", "mpyr -x0,y1,a", "mac -x0,y1,a", "macr -x0,y1,a",
! 310: "mpy +x0,y1,b", "mpyr +x0,y1,b", "mac +x0,y1,b", "macr +x0,y1,b", "mpy -x0,y1,b", "mpyr -x0,y1,b", "mac -x0,y1,b", "macr -x0,y1,b",
! 311: "mpy +y0,x0,a", "mpyr +y0,x0,a", "mac +y0,x0,a", "macr +y0,x0,a", "mpy -y0,x0,a", "mpyr -y0,x0,a", "mac -y0,x0,a", "macr -y0,x0,a",
! 312: "mpy +y0,x0,b", "mpyr +y0,x0,b", "mac +y0,x0,b", "macr +y0,x0,b", "mpy -y0,x0,b", "mpyr -y0,x0,b", "mac -y0,x0,b", "macr -y0,x0,b",
! 313: "mpy +x1,y0,a", "mpyr +x1,y0,a", "mac +x1,y0,a", "macr +x1,y0,a", "mpy -x1,y0,a", "mpyr -x1,y0,a", "mac -x1,y0,a", "macr -x1,y0,a",
! 314: "mpy +x1,y0,b", "mpyr +x1,y0,b", "mac +x1,y0,b", "macr +x1,y0,b", "mpy -x1,y0,b", "mpyr -x1,y0,b", "mac -x1,y0,b", "macr -x1,y0,b",
! 315: "mpy +y1,x1,a", "mpyr +y1,x1,a", "mac +y1,x1,a", "macr +y1,x1,a", "mpy -y1,x1,a", "mpyr -y1,x1,a", "mac -y1,x1,a", "macr -y1,x1,a",
! 316: "mpy +y1,x1,b", "mpyr +y1,x1,b", "mac +y1,x1,b", "macr +y1,x1,b", "mpy -y1,x1,b", "mpyr -y1,x1,b", "mac -y1,x1,b", "macr -y1,x1,b"
1.1 root 317: };
318:
319:
1.1.1.5 ! root 320:
! 321: static const dsp_emul_t opcodes_parmove[16] = {
1.1 root 322: dsp_pm_0,
323: dsp_pm_1,
324: dsp_pm_2,
325: dsp_pm_2,
326: dsp_pm_4,
327: dsp_pm_4,
328: dsp_pm_4,
329: dsp_pm_4,
330:
331: dsp_pm_8,
332: dsp_pm_8,
333: dsp_pm_8,
334: dsp_pm_8,
335: dsp_pm_8,
336: dsp_pm_8,
337: dsp_pm_8,
338: dsp_pm_8
339: };
340:
1.1.1.5 ! root 341: static const int registers_tcc[16][2] = {
1.1 root 342: {DSP_REG_B,DSP_REG_A},
343: {DSP_REG_A,DSP_REG_B},
344: {DSP_REG_NULL,DSP_REG_NULL},
345: {DSP_REG_NULL,DSP_REG_NULL},
346:
347: {DSP_REG_NULL,DSP_REG_NULL},
348: {DSP_REG_NULL,DSP_REG_NULL},
349: {DSP_REG_NULL,DSP_REG_NULL},
350: {DSP_REG_NULL,DSP_REG_NULL},
351:
352: {DSP_REG_X0,DSP_REG_A},
353: {DSP_REG_X0,DSP_REG_B},
354: {DSP_REG_Y0,DSP_REG_A},
355: {DSP_REG_Y0,DSP_REG_B},
1.1.1.2 root 356:
357: {DSP_REG_X1,DSP_REG_A},
358: {DSP_REG_X1,DSP_REG_B},
1.1 root 359: {DSP_REG_Y1,DSP_REG_A},
360: {DSP_REG_Y1,DSP_REG_B}
361: };
362:
1.1.1.5 ! root 363: static const char *registers_lmove[8] = {
1.1 root 364: "a10",
365: "b10",
366: "x",
367: "y",
368: "a",
369: "b",
370: "ab",
371: "ba"
372: };
373:
1.1.1.5 ! root 374: static const char *ea_names[9] = {
1.1 root 375: "(r%d)-n%d", /* 000xxx */
376: "(r%d)+n%d", /* 001xxx */
377: "(r%d)-", /* 010xxx */
378: "(r%d)+", /* 011xxx */
379: "(r%d)", /* 100xxx */
380: "(r%d+n%d)", /* 101xxx */
1.1.1.5 ! root 381: "$%04x", /* 110000 */
1.1 root 382: "-(r%d)", /* 111xxx */
1.1.1.5 ! root 383: "$%06x" /* 110100 */
1.1 root 384: };
385:
1.1.1.5 ! root 386: static const char *cc_name[16] = {
1.1 root 387: "cc",
388: "ge",
389: "ne",
390: "pl",
391: "nn",
392: "ec",
393: "lc",
394: "gt",
395:
396: "cs",
397: "lt",
398: "eq",
399: "mi",
400: "nr",
401: "es",
402: "ls",
403: "le"
404: };
405:
1.1.1.4 root 406: void dsp56k_disasm_reg_save(void)
407: {
1.1.1.5 ! root 408: memcpy(registers_save, dsp_core.registers , sizeof(registers_save));
1.1.1.4 root 409: #if DSP_DISASM_REG_PC
1.1.1.5 ! root 410: pc_save = dsp_core.pc;
1.1.1.4 root 411: #endif
412: }
413:
414: void dsp56k_disasm_reg_compare(void)
415: {
416: int i;
1.1.1.5 ! root 417: bool bRegA = false;
! 418: bool bRegB = false;
1.1.1.4 root 419:
1.1.1.5 ! root 420: for (i=4; i<64; i++) {
! 421: if (registers_save[i] == dsp_core.registers[i]) {
1.1.1.4 root 422: continue;
423: }
424:
425: switch(i) {
426: case DSP_REG_X0:
427: case DSP_REG_X1:
428: case DSP_REG_Y0:
429: case DSP_REG_Y1:
1.1.1.5 ! root 430: fprintf(stderr,"\tReg: %s $%06x -> $%06x\n", registers_name[i], registers_save[i], dsp_core.registers[i]);
1.1.1.4 root 431: break;
432: case DSP_REG_R0:
433: case DSP_REG_R1:
434: case DSP_REG_R2:
435: case DSP_REG_R3:
436: case DSP_REG_R4:
437: case DSP_REG_R5:
438: case DSP_REG_R6:
439: case DSP_REG_R7:
440: case DSP_REG_M0:
441: case DSP_REG_M1:
442: case DSP_REG_M2:
443: case DSP_REG_M3:
444: case DSP_REG_M4:
445: case DSP_REG_M5:
446: case DSP_REG_M6:
447: case DSP_REG_M7:
448: case DSP_REG_N0:
449: case DSP_REG_N1:
450: case DSP_REG_N2:
451: case DSP_REG_N3:
452: case DSP_REG_N4:
453: case DSP_REG_N5:
454: case DSP_REG_N6:
455: case DSP_REG_N7:
456: case DSP_REG_SR:
457: case DSP_REG_LA:
458: case DSP_REG_LC:
1.1.1.5 ! root 459: fprintf(stderr,"\tReg: %s $%04x -> $%04x\n", registers_name[i], registers_save[i], dsp_core.registers[i]);
1.1.1.4 root 460: break;
461: case DSP_REG_OMR:
462: case DSP_REG_SP:
463: case DSP_REG_SSH:
464: case DSP_REG_SSL:
1.1.1.5 ! root 465: fprintf(stderr,"\tReg: %s $%02x -> $%02x\n", registers_name[i], registers_save[i], dsp_core.registers[i]);
1.1.1.4 root 466: break;
1.1.1.5 ! root 467: case DSP_REG_A0:
! 468: case DSP_REG_A1:
! 469: case DSP_REG_A2:
! 470: if (bRegA == false) {
! 471: fprintf(stderr,"\tReg: a $%02x:%06x:%06x -> $%02x:%06x:%06x\n",
! 472: registers_save[DSP_REG_A2], registers_save[DSP_REG_A1], registers_save[DSP_REG_A0],
! 473: dsp_core.registers[DSP_REG_A2], dsp_core.registers[DSP_REG_A1], dsp_core.registers[DSP_REG_A0]
1.1.1.4 root 474: );
1.1.1.5 ! root 475: bRegA = true;
! 476: }
! 477: break;
! 478: case DSP_REG_B0:
! 479: case DSP_REG_B1:
! 480: case DSP_REG_B2:
! 481: if (bRegB == false) {
! 482: fprintf(stderr,"\tReg: b $%02x:%06x:%06x -> $%02x:%06x:%06x\n",
! 483: registers_save[DSP_REG_B2], registers_save[DSP_REG_B1], registers_save[DSP_REG_B0],
! 484: dsp_core.registers[DSP_REG_B2], dsp_core.registers[DSP_REG_B1], dsp_core.registers[DSP_REG_B0]
! 485: );
! 486: bRegB = true;
1.1.1.4 root 487: }
488: break;
489: }
490: }
491:
492: #if DSP_DISASM_REG_PC
1.1.1.5 ! root 493: if (pc_save != dsp_core.pc) {
! 494: fprintf(stderr,"\tReg: pc $%04x -> $%04x\n", pc_save, dsp_core.pc);
1.1.1.4 root 495: }
496: #endif
497: }
1.1 root 498:
1.1.1.5 ! root 499: Uint16 dsp56k_disasm(dsp_trace_disasm_t mode)
1.1 root 500: {
1.1.1.2 root 501: Uint32 value;
1.1 root 502:
1.1.1.5 ! root 503: if (mode == DSP_TRACE_MODE) {
! 504: isInDisasmMode = false;
! 505: if (prev_inst_pc == dsp_core.pc) {
! 506: if (!isLooping) {
! 507: fprintf(stderr, "Looping on DSP instruction at PC = $%04x\n", prev_inst_pc);
! 508: isLooping = true;
! 509: }
! 510: return 0;
! 511: }
! 512: }
! 513: else {
! 514: isInDisasmMode = true;
1.1.1.3 root 515: }
516:
1.1.1.5 ! root 517: prev_inst_pc = dsp_core.pc;
! 518: isLooping = false;
! 519:
! 520: cur_inst = read_memory(dsp_core.pc);
1.1.1.3 root 521: disasm_cur_inst_len = 1;
1.1 root 522:
523: strcpy(parallelmove_name, "");
524:
1.1.1.3 root 525: if (cur_inst < 0x100000) {
526: value = (cur_inst >> 11) & (BITMASK(6) << 3);
527: value += (cur_inst >> 5) & BITMASK(3);
1.1 root 528: opcodes8h[value]();
529: } else {
530: dsp_pm();
1.1.1.5 ! root 531: sprintf(str_instr, "%s %s", opcodes_alu[cur_inst & BITMASK(8)], parallelmove_name);
1.1.1.3 root 532: }
533: return disasm_cur_inst_len;
1.1 root 534: }
535:
1.1.1.4 root 536: /**
537: * dsp56k_getInstrText : return the disasembled instructions
538: */
1.1.1.5 ! root 539: const char* dsp56k_getInstructionText(void)
1.1.1.4 root 540: {
541: if (isLooping) {
542: *str_instr2 = 0;
543: }
544: else if (disasm_cur_inst_len == 1) {
1.1.1.5 ! root 545: sprintf(str_instr2, "p:%04x %06x (%02d cyc) %s\n", prev_inst_pc, cur_inst, dsp_core.instr_cycle, str_instr);
1.1.1.4 root 546: }
547: else {
1.1.1.5 ! root 548: sprintf(str_instr2, "p:%04x %06x %06x (%02d cyc) %s\n", prev_inst_pc, cur_inst, read_memory(prev_inst_pc + 1), dsp_core.instr_cycle, str_instr);
1.1.1.4 root 549: }
550:
551: return str_instr2;
552: }
553:
1.1.1.3 root 554: static void dsp_pm_class2(void) {
555: dsp_pm();
1.1.1.5 ! root 556: sprintf(str_instr, "%s %s", opcodes_alu[cur_inst & BITMASK(8)], parallelmove_name);
1.1.1.3 root 557: }
558:
1.1.1.2 root 559: static Uint32 read_memory(Uint32 currPc)
560: {
561: Uint32 value;
562:
563: if (currPc<0x200) {
1.1.1.5 ! root 564: value = dsp_core.ramint[DSP_SPACE_P][currPc];
1.1.1.2 root 565: } else {
1.1.1.5 ! root 566: value = dsp_core.ramext[currPc & (DSP_RAMSIZE-1)];
1.1.1.2 root 567: }
568:
569: return value & BITMASK(24);
570: }
571:
1.1 root 572: /**********************************
573: * Conditions code calculation
574: **********************************/
575:
1.1.1.2 root 576: static void dsp_calc_cc(Uint32 cc_mode, char *dest)
1.1 root 577: {
578: strcpy(dest, cc_name[cc_mode & BITMASK(4)]);
579: }
580:
581: /**********************************
582: * Effective address calculation
583: **********************************/
584:
1.1.1.2 root 585: static int dsp_calc_ea(Uint32 ea_mode, char *dest)
1.1 root 586: {
587: int value, retour, numreg;
588:
589: value = (ea_mode >> 3) & BITMASK(3);
590: numreg = ea_mode & BITMASK(3);
591: retour = 0;
592: switch (value) {
593: case 0:
594: /* (Rx)-Nx */
595: sprintf(dest, ea_names[value], numreg, numreg);
596: break;
597: case 1:
598: /* (Rx)+Nx */
599: sprintf(dest, ea_names[value], numreg, numreg);
600: break;
601: case 5:
602: /* (Rx+Nx) */
603: sprintf(dest, ea_names[value], numreg, numreg);
604: break;
605: case 2:
606: /* (Rx)- */
607: sprintf(dest, ea_names[value], numreg);
608: break;
609: case 3:
610: /* (Rx)+ */
611: sprintf(dest, ea_names[value], numreg);
612: break;
613: case 4:
614: /* (Rx) */
615: sprintf(dest, ea_names[value], numreg);
616: break;
617: case 7:
618: /* -(Rx) */
619: sprintf(dest, ea_names[value], numreg);
620: break;
621: case 6:
1.1.1.3 root 622: disasm_cur_inst_len++;
1.1 root 623: switch ((ea_mode >> 2) & 1) {
624: case 0:
625: /* Absolute address */
1.1.1.5 ! root 626: sprintf(dest, ea_names[value], read_memory(dsp_core.pc+1));
1.1 root 627: break;
628: case 1:
629: /* Immediate value */
1.1.1.5 ! root 630: sprintf(dest, ea_names[8], read_memory(dsp_core.pc+1));
1.1 root 631: retour = 1;
632: break;
633: }
634: break;
635: }
636: return retour;
637: }
638:
639: static void opcode8h_0(void)
640: {
1.1.1.3 root 641: switch(cur_inst) {
642: case 0x000000:
643: dsp_nop();
1.1 root 644: break;
1.1.1.3 root 645: case 0x000004:
646: dsp_rti();
1.1 root 647: break;
1.1.1.3 root 648: case 0x000005:
649: dsp_illegal();
1.1 root 650: break;
1.1.1.3 root 651: case 0x000006:
652: dsp_swi();
653: break;
654: case 0x00000c:
655: dsp_rts();
656: break;
657: case 0x000084:
658: dsp_reset();
659: break;
660: case 0x000086:
661: dsp_wait();
662: break;
663: case 0x000087:
664: dsp_stop();
665: break;
666: case 0x00008c:
667: dsp_enddo();
1.1 root 668: break;
669: }
670: }
671:
672: /**********************************
673: * Non-parallel moves instructions
674: **********************************/
675:
676: static void dsp_undefined(void)
677: {
1.1.1.5 ! root 678: /* In Disasm mode, display dc instruction_opcode */
! 679: if (isInDisasmMode)
! 680: sprintf(str_instr, "dc $%06x", cur_inst);
! 681: /* In trace mode, display unknown instruction */
! 682: else
! 683: sprintf(str_instr, "$%06x unknown instruction", cur_inst);
1.1 root 684: }
685:
686: static void dsp_andi(void)
687: {
688: switch(cur_inst & BITMASK(2)) {
689: case 0:
1.1.1.5 ! root 690: sprintf(str_instr, "andi #$%02x,mr", (cur_inst>>8) & BITMASK(8));
1.1 root 691: break;
692: case 1:
1.1.1.5 ! root 693: sprintf(str_instr, "andi #$%02x,ccr", (cur_inst>>8) & BITMASK(8));
1.1 root 694: break;
695: case 2:
1.1.1.5 ! root 696: sprintf(str_instr, "andi #$%02x,omr", (cur_inst>>8) & BITMASK(8));
1.1 root 697: break;
698: default:
699: break;
700: }
701: }
702:
1.1.1.3 root 703: static void dsp_bchg_aa(void)
704: {
705: /* bchg #n,x:aa */
706: /* bchg #n,y:aa */
707: char name[16];
708: Uint32 memspace, value, numbit;
709:
710: memspace = (cur_inst>>6) & 1;
711: value = (cur_inst>>8) & BITMASK(6);
712: numbit = cur_inst & BITMASK(5);
713:
714: if (memspace) {
1.1.1.5 ! root 715: sprintf(name,"y:$%04x",value);
1.1.1.3 root 716: } else {
1.1.1.5 ! root 717: sprintf(name,"x:$%04x",value);
1.1.1.3 root 718: }
719:
1.1.1.4 root 720: sprintf(str_instr,"bchg #%d,%s", numbit, name);
1.1.1.3 root 721: }
722:
723: static void dsp_bchg_ea(void)
1.1 root 724: {
1.1.1.3 root 725: /* bchg #n,x:ea */
726: /* bchg #n,y:ea */
1.1 root 727: char name[16], addr_name[16];
1.1.1.2 root 728: Uint32 memspace, value, numbit;
1.1 root 729:
730: memspace = (cur_inst>>6) & 1;
731: value = (cur_inst>>8) & BITMASK(6);
732: numbit = cur_inst & BITMASK(5);
733:
1.1.1.3 root 734: dsp_calc_ea(value, addr_name);
735: if (memspace) {
736: sprintf(name,"y:%s",addr_name);
737: } else {
738: sprintf(name,"x:%s",addr_name);
739: }
740:
1.1.1.4 root 741: sprintf(str_instr,"bchg #%d,%s", numbit, name);
1.1.1.3 root 742: }
743:
744: static void dsp_bchg_pp(void)
745: {
746: /* bchg #n,x:pp */
747: /* bchg #n,y:pp */
748: char name[16];
749: Uint32 memspace, value, numbit;
750:
751: memspace = (cur_inst>>6) & 1;
752: value = (cur_inst>>8) & BITMASK(6);
753: numbit = cur_inst & BITMASK(5);
754:
755: if (memspace) {
1.1.1.5 ! root 756: sprintf(name,"y:$%04x",value+0xffc0);
1.1.1.3 root 757: } else {
1.1.1.5 ! root 758: sprintf(name,"x:$%04x",value+0xffc0);
1.1 root 759: }
1.1.1.3 root 760:
1.1.1.4 root 761: sprintf(str_instr,"bchg #%d,%s", numbit, name);
1.1.1.3 root 762: }
763:
764: static void dsp_bchg_reg(void)
765: {
766: /* bchg #n,R */
1.1.1.4 root 767: Uint32 value, numbit;
1.1.1.3 root 768:
769: value = (cur_inst>>8) & BITMASK(6);
770: numbit = cur_inst & BITMASK(5);
1.1 root 771:
1.1.1.4 root 772: sprintf(str_instr,"bchg #%d,%s", numbit, registers_name[value]);
1.1 root 773: }
774:
1.1.1.3 root 775: static void dsp_bclr_aa(void)
1.1 root 776: {
1.1.1.3 root 777: /* bclr #n,x:aa */
778: /* bclr #n,y:aa */
779: char name[16];
1.1.1.2 root 780: Uint32 memspace, value, numbit;
1.1 root 781:
782: memspace = (cur_inst>>6) & 1;
783: value = (cur_inst>>8) & BITMASK(6);
784: numbit = cur_inst & BITMASK(5);
785:
1.1.1.3 root 786: if (memspace) {
1.1.1.5 ! root 787: sprintf(name,"y:$%04x",value);
1.1.1.3 root 788: } else {
1.1.1.5 ! root 789: sprintf(name,"x:$%04x",value);
1.1 root 790: }
791:
1.1.1.4 root 792: sprintf(str_instr,"bclr #%d,%s", numbit, name);
1.1 root 793: }
794:
1.1.1.3 root 795: static void dsp_bclr_ea(void)
1.1 root 796: {
1.1.1.3 root 797: /* bclr #n,x:ea */
798: /* bclr #n,y:ea */
1.1 root 799: char name[16], addr_name[16];
1.1.1.2 root 800: Uint32 memspace, value, numbit;
1.1 root 801:
802: memspace = (cur_inst>>6) & 1;
803: value = (cur_inst>>8) & BITMASK(6);
804: numbit = cur_inst & BITMASK(5);
805:
1.1.1.3 root 806: dsp_calc_ea(value, addr_name);
807: if (memspace) {
808: sprintf(name,"y:%s",addr_name);
809: } else {
810: sprintf(name,"x:%s",addr_name);
1.1 root 811: }
812:
1.1.1.4 root 813: sprintf(str_instr,"bclr #%d,%s", numbit, name);
1.1 root 814: }
815:
1.1.1.3 root 816: static void dsp_bclr_pp(void)
1.1 root 817: {
1.1.1.3 root 818: /* bclr #n,x:pp */
819: /* bclr #n,y:pp */
820: char name[16];
1.1.1.2 root 821: Uint32 memspace, value, numbit;
1.1 root 822:
823: memspace = (cur_inst>>6) & 1;
824: value = (cur_inst>>8) & BITMASK(6);
825: numbit = cur_inst & BITMASK(5);
826:
1.1.1.3 root 827: if (memspace) {
1.1.1.5 ! root 828: sprintf(name,"y:$%04x",value+0xffc0);
1.1.1.3 root 829: } else {
1.1.1.5 ! root 830: sprintf(name,"x:$%04x",value+0xffc0);
1.1 root 831: }
832:
1.1.1.4 root 833: sprintf(str_instr,"bclr #%d,%s", numbit, name);
1.1 root 834: }
835:
1.1.1.3 root 836: static void dsp_bclr_reg(void)
1.1 root 837: {
1.1.1.3 root 838: /* bclr #n,R */
1.1.1.4 root 839: Uint32 value, numbit;
1.1 root 840:
1.1.1.3 root 841: value = (cur_inst>>8) & BITMASK(6);
842: numbit = cur_inst & BITMASK(5);
843:
1.1.1.4 root 844: sprintf(str_instr,"bclr #%d,%s", numbit, registers_name[value]);
1.1.1.3 root 845: }
846:
847: static void dsp_bset_aa(void)
848: {
849: /* bset #n,x:aa */
850: /* bset #n,y:aa */
851: char name[16];
852: Uint32 memspace, value, numbit;
853:
854: memspace = (cur_inst>>6) & 1;
855: value = (cur_inst>>8) & BITMASK(6);
856: numbit = cur_inst & BITMASK(5);
857:
858: if (memspace) {
1.1.1.5 ! root 859: sprintf(name,"y:$%04x",value);
1.1.1.3 root 860: } else {
1.1.1.5 ! root 861: sprintf(name,"x:$%04x",value);
1.1 root 862: }
1.1.1.3 root 863:
1.1.1.4 root 864: sprintf(str_instr,"bset #%d,%s", numbit, name);
1.1.1.3 root 865: }
866:
867: static void dsp_bset_ea(void)
868: {
869: /* bset #n,x:ea */
870: /* bset #n,y:ea */
871: char name[16], addr_name[16];
872: Uint32 memspace, value, numbit;
873:
874: memspace = (cur_inst>>6) & 1;
875: value = (cur_inst>>8) & BITMASK(6);
876: numbit = cur_inst & BITMASK(5);
877:
878: dsp_calc_ea(value, addr_name);
879: if (memspace) {
880: sprintf(name,"y:%s",addr_name);
881: } else {
882: sprintf(name,"x:%s",addr_name);
883: }
884:
1.1.1.4 root 885: sprintf(str_instr,"bset #%d,%s", numbit, name);
1.1.1.3 root 886: }
887:
888: static void dsp_bset_pp(void)
889: {
890: /* bset #n,x:pp */
891: /* bset #n,y:pp */
892: char name[16];
893: Uint32 memspace, value, numbit;
894:
895: memspace = (cur_inst>>6) & 1;
896: value = (cur_inst>>8) & BITMASK(6);
897: numbit = cur_inst & BITMASK(5);
898:
899: if (memspace) {
1.1.1.5 ! root 900: sprintf(name,"y:$%04x",value+0xffc0);
1.1.1.3 root 901: } else {
1.1.1.5 ! root 902: sprintf(name,"x:$%04x",value+0xffc0);
1.1.1.3 root 903: }
904:
1.1.1.4 root 905: sprintf(str_instr,"bset #%d,%s", numbit, name);
1.1.1.3 root 906: }
907:
908: static void dsp_bset_reg(void)
909: {
910: /* bset #n,R */
1.1.1.4 root 911: Uint32 value, numbit;
1.1.1.3 root 912:
913: value = (cur_inst>>8) & BITMASK(6);
914: numbit = cur_inst & BITMASK(5);
915:
1.1.1.4 root 916: sprintf(str_instr,"bset #%d,%s", numbit, registers_name[value]);
1.1.1.3 root 917: }
918:
919: static void dsp_btst_aa(void)
920: {
921: /* btst #n,x:aa */
922: /* btst #n,y:aa */
923: char name[16];
924: Uint32 memspace, value, numbit;
925:
926: memspace = (cur_inst>>6) & 1;
927: value = (cur_inst>>8) & BITMASK(6);
928: numbit = cur_inst & BITMASK(5);
929:
930: if (memspace) {
1.1.1.5 ! root 931: sprintf(name,"y:$%04x",value);
1.1.1.3 root 932: } else {
1.1.1.5 ! root 933: sprintf(name,"x:$%04x",value);
1.1.1.3 root 934: }
935:
1.1.1.4 root 936: sprintf(str_instr,"btst #%d,%s", numbit, name);
1.1.1.3 root 937: }
938:
939: static void dsp_btst_ea(void)
940: {
941: /* btst #n,x:ea */
942: /* btst #n,y:ea */
943: char name[16], addr_name[16];
944: Uint32 memspace, value, numbit;
945:
946: memspace = (cur_inst>>6) & 1;
947: value = (cur_inst>>8) & BITMASK(6);
948: numbit = cur_inst & BITMASK(5);
949:
950: dsp_calc_ea(value, addr_name);
951: if (memspace) {
952: sprintf(name,"y:%s",addr_name);
953: } else {
954: sprintf(name,"x:%s",addr_name);
955: }
956:
1.1.1.4 root 957: sprintf(str_instr,"btst #%d,%s", numbit, name);
1.1.1.3 root 958: }
959:
960: static void dsp_btst_pp(void)
961: {
962: /* btst #n,x:pp */
963: /* btst #n,y:pp */
964: char name[16];
965: Uint32 memspace, value, numbit;
966:
967: memspace = (cur_inst>>6) & 1;
968: value = (cur_inst>>8) & BITMASK(6);
969: numbit = cur_inst & BITMASK(5);
970:
971: if (memspace) {
1.1.1.5 ! root 972: sprintf(name,"y:$%04x",value+0xffc0);
1.1.1.3 root 973: } else {
1.1.1.5 ! root 974: sprintf(name,"x:$%04x",value+0xffc0);
1.1.1.3 root 975: }
976:
1.1.1.4 root 977: sprintf(str_instr,"btst #%d,%s", numbit, name);
1.1.1.3 root 978: }
979:
980: static void dsp_btst_reg(void)
981: {
982: /* btst #n,R */
1.1.1.4 root 983: Uint32 value, numbit;
1.1.1.3 root 984:
985: value = (cur_inst>>8) & BITMASK(6);
986: numbit = cur_inst & BITMASK(5);
987:
1.1.1.4 root 988: sprintf(str_instr,"btst #%d,%s", numbit, registers_name[value]);
1.1.1.3 root 989: }
990:
991: static void dsp_div(void)
992: {
993: Uint32 srcreg=DSP_REG_NULL, destreg;
994:
995: switch((cur_inst>>4) & BITMASK(2)) {
996: case 0:
997: srcreg = DSP_REG_X0;
998: break;
999: case 1:
1000: srcreg = DSP_REG_Y0;
1001: break;
1002: case 2:
1003: srcreg = DSP_REG_X1;
1004: break;
1005: case 3:
1006: srcreg = DSP_REG_Y1;
1007: break;
1008: }
1009: destreg = DSP_REG_A+((cur_inst>>3) & 1);
1010:
1.1.1.4 root 1011: sprintf(str_instr,"div %s,%s", registers_name[srcreg],registers_name[destreg]);
1.1.1.3 root 1012: }
1013:
1014: static void dsp_do_aa(void)
1015: {
1016: char name[16];
1017:
1018: disasm_cur_inst_len++;
1019:
1020: if (cur_inst & (1<<6)) {
1.1.1.5 ! root 1021: sprintf(name, "y:$%04x", (cur_inst>>8) & BITMASK(6));
1.1.1.3 root 1022: } else {
1.1.1.5 ! root 1023: sprintf(name, "x:$%04x", (cur_inst>>8) & BITMASK(6));
1.1.1.3 root 1024: }
1025:
1.1.1.5 ! root 1026: sprintf(str_instr,"do %s,p:$%04x",
1.1.1.3 root 1027: name,
1.1.1.5 ! root 1028: read_memory(dsp_core.pc+1)
1.1.1.3 root 1029: );
1.1.1.4 root 1030: }
1.1.1.3 root 1031:
1032: static void dsp_do_imm(void)
1033: {
1034: disasm_cur_inst_len++;
1035:
1.1.1.5 ! root 1036: sprintf(str_instr,"do #$%04x,p:$%04x",
1.1.1.3 root 1037: ((cur_inst>>8) & BITMASK(8))|((cur_inst & BITMASK(4))<<8),
1.1.1.5 ! root 1038: read_memory(dsp_core.pc+1)
1.1.1.3 root 1039: );
1.1.1.4 root 1040: }
1.1.1.3 root 1041:
1042: static void dsp_do_ea(void)
1043: {
1044: char addr_name[16], name[16];
1045: Uint32 ea_mode;
1046:
1047: disasm_cur_inst_len++;
1048:
1049: ea_mode = (cur_inst>>8) & BITMASK(6);
1050: dsp_calc_ea(ea_mode, addr_name);
1051:
1052: if (cur_inst & (1<<6)) {
1053: sprintf(name, "y:%s", addr_name);
1054: } else {
1055: sprintf(name, "x:%s", addr_name);
1056: }
1057:
1.1.1.5 ! root 1058: sprintf(str_instr,"do %s,p:$%04x",
1.1.1.3 root 1059: name,
1.1.1.5 ! root 1060: read_memory(dsp_core.pc+1)
1.1.1.3 root 1061: );
1.1.1.4 root 1062: }
1.1.1.3 root 1063:
1064: static void dsp_do_reg(void)
1065: {
1066: disasm_cur_inst_len++;
1067:
1.1.1.5 ! root 1068: sprintf(str_instr,"do %s,p:$%04x",
1.1.1.3 root 1069: registers_name[(cur_inst>>8) & BITMASK(6)],
1.1.1.5 ! root 1070: read_memory(dsp_core.pc+1)
1.1.1.3 root 1071: );
1.1.1.4 root 1072: }
1.1.1.3 root 1073:
1074: static void dsp_enddo(void)
1075: {
1.1.1.4 root 1076: sprintf(str_instr,"enddo");
1.1.1.3 root 1077: }
1078:
1079: static void dsp_illegal(void)
1080: {
1.1.1.4 root 1081: sprintf(str_instr,"illegal");
1.1.1.3 root 1082: }
1083:
1084: static void dsp_jcc_ea(void)
1085: {
1086: char cond_name[16], addr_name[16];
1087: Uint32 cc_code=0;
1088:
1089: dsp_calc_ea((cur_inst >>8) & BITMASK(6), addr_name);
1090: cc_code=cur_inst & BITMASK(4);
1091: dsp_calc_cc(cc_code, cond_name);
1092:
1.1.1.4 root 1093: sprintf(str_instr,"j%s p:%s", cond_name, addr_name);
1.1.1.3 root 1094: }
1095:
1096: static void dsp_jcc_imm(void)
1097: {
1098: char cond_name[16], addr_name[16];
1099: Uint32 cc_code=0;
1100:
1.1.1.5 ! root 1101: sprintf(addr_name, "$%04x", cur_inst & BITMASK(12));
1.1.1.3 root 1102: cc_code=(cur_inst>>12) & BITMASK(4);
1103: dsp_calc_cc(cc_code, cond_name);
1104:
1.1.1.4 root 1105: sprintf(str_instr,"j%s p:%s", cond_name, addr_name);
1.1.1.3 root 1106: }
1107:
1108: static void dsp_jclr_aa(void)
1109: {
1110: /* jclr #n,x:aa,p:xx */
1111: /* jclr #n,y:aa,p:xx */
1112: char srcname[16];
1113: Uint32 memspace, value, numbit;
1114:
1115: disasm_cur_inst_len++;
1116:
1117: memspace = (cur_inst>>6) & 1;
1118: value = (cur_inst>>8) & BITMASK(6);
1119: numbit = cur_inst & BITMASK(5);
1120:
1121: if (memspace) {
1.1.1.5 ! root 1122: sprintf(srcname, "y:$%04x", value);
1.1.1.3 root 1123: } else {
1.1.1.5 ! root 1124: sprintf(srcname, "x:$%04x", value);
1.1.1.3 root 1125: }
1126:
1.1.1.5 ! root 1127: sprintf(str_instr,"jclr #%d,%s,p:$%04x",
1.1.1.3 root 1128: numbit,
1129: srcname,
1.1.1.5 ! root 1130: read_memory(dsp_core.pc+1)
1.1.1.3 root 1131: );
1132: }
1133:
1134: static void dsp_jclr_ea(void)
1135: {
1136: /* jclr #n,x:ea,p:xx */
1137: /* jclr #n,y:ea,p:xx */
1138: char srcname[16], addr_name[16];
1139: Uint32 memspace, value, numbit;
1140:
1141: disasm_cur_inst_len++;
1142:
1143: memspace = (cur_inst>>6) & 1;
1144: value = (cur_inst>>8) & BITMASK(6);
1145: numbit = cur_inst & BITMASK(5);
1146:
1147: dsp_calc_ea(value, addr_name);
1148: if (memspace) {
1149: sprintf(srcname, "y:%s", addr_name);
1150: } else {
1151: sprintf(srcname, "x:%s", addr_name);
1152: }
1153:
1.1.1.5 ! root 1154: sprintf(str_instr,"jclr #%d,%s,p:$%04x",
1.1.1.3 root 1155: numbit,
1156: srcname,
1.1.1.5 ! root 1157: read_memory(dsp_core.pc+1)
1.1.1.3 root 1158: );
1159: }
1160:
1161: static void dsp_jclr_pp(void)
1162: {
1163: /* jclr #n,x:pp,p:xx */
1164: /* jclr #n,y:pp,p:xx */
1165: char srcname[16];
1166: Uint32 memspace, value, numbit;
1167:
1168: disasm_cur_inst_len++;
1169:
1170: memspace = (cur_inst>>6) & 1;
1171: value = (cur_inst>>8) & BITMASK(6);
1172: numbit = cur_inst & BITMASK(5);
1173:
1174: value += 0xffc0;
1175: if (memspace) {
1.1.1.5 ! root 1176: sprintf(srcname, "y:$%04x", value);
1.1.1.3 root 1177: } else {
1.1.1.5 ! root 1178: sprintf(srcname, "x:$%04x", value);
1.1.1.3 root 1179: }
1180:
1.1.1.5 ! root 1181: sprintf(str_instr,"jclr #%d,%s,p:$%04x",
1.1.1.3 root 1182: numbit,
1183: srcname,
1.1.1.5 ! root 1184: read_memory(dsp_core.pc+1)
1.1.1.3 root 1185: );
1186: }
1187:
1188: static void dsp_jclr_reg(void)
1189: {
1190: /* jclr #n,R,p:xx */
1.1.1.4 root 1191: Uint32 value, numbit;
1.1.1.3 root 1192:
1193: disasm_cur_inst_len++;
1194:
1195: value = (cur_inst>>8) & BITMASK(6);
1196: numbit = cur_inst & BITMASK(5);
1197:
1.1.1.5 ! root 1198: sprintf(str_instr,"jclr #%d,%s,p:$%04x",
1.1.1.3 root 1199: numbit,
1.1.1.4 root 1200: registers_name[value],
1.1.1.5 ! root 1201: read_memory(dsp_core.pc+1)
1.1.1.3 root 1202: );
1203: }
1204:
1205: static void dsp_jmp_imm(void)
1206: {
1.1.1.5 ! root 1207: sprintf(str_instr,"jmp p:$%04x", cur_inst & BITMASK(12));
1.1.1.3 root 1208: }
1209:
1210: static void dsp_jmp_ea(void)
1211: {
1212: char dstname[16];
1213:
1214: dsp_calc_ea((cur_inst >>8) & BITMASK(6), dstname);
1215:
1.1.1.4 root 1216: sprintf(str_instr,"jmp p:%s", dstname);
1.1.1.3 root 1217: }
1218:
1219: static void dsp_jscc_ea(void)
1220: {
1221: char cond_name[16], addr_name[16];
1222: Uint32 cc_code=0;
1223:
1224: dsp_calc_ea((cur_inst>>8) & BITMASK(6), addr_name);
1225: cc_code=cur_inst & BITMASK(4);
1226: dsp_calc_cc(cc_code, cond_name);
1227:
1.1.1.4 root 1228: sprintf(str_instr,"js%s p:%s", cond_name, addr_name);
1.1.1.3 root 1229: }
1230:
1231: static void dsp_jscc_imm(void)
1232: {
1233: char cond_name[16], addr_name[16];
1234: Uint32 cc_code=0;
1235:
1.1.1.5 ! root 1236: sprintf(addr_name, "$%04x", cur_inst & BITMASK(12));
1.1.1.3 root 1237: cc_code=(cur_inst>>12) & BITMASK(4);
1238: dsp_calc_cc(cc_code, cond_name);
1239:
1.1.1.4 root 1240: sprintf(str_instr,"js%s p:%s", cond_name, addr_name);
1.1.1.3 root 1241: }
1242:
1243: static void dsp_jsclr_aa(void)
1244: {
1245: /* jsclr #n,x:aa,p:xx */
1246: /* jsclr #n,y:aa,p:xx */
1247: char srcname[16];
1248: Uint32 memspace, value, numbit;
1249:
1250: disasm_cur_inst_len++;
1251:
1252: memspace = (cur_inst>>6) & 1;
1253: value = (cur_inst>>8) & BITMASK(6);
1254: numbit = cur_inst & BITMASK(5);
1255:
1256: if (memspace) {
1.1.1.5 ! root 1257: sprintf(srcname, "y:$%04x", value);
1.1.1.3 root 1258: } else {
1.1.1.5 ! root 1259: sprintf(srcname, "x:$%04x", value);
1.1.1.3 root 1260: }
1261:
1.1.1.5 ! root 1262: sprintf(str_instr,"jsclr #%d,%s,p:$%04x",
1.1.1.3 root 1263: numbit,
1264: srcname,
1.1.1.5 ! root 1265: read_memory(dsp_core.pc+1)
1.1.1.3 root 1266: );
1267: }
1268:
1269: static void dsp_jsclr_ea(void)
1270: {
1271: /* jsclr #n,x:ea,p:xx */
1272: /* jsclr #n,y:ea,p:xx */
1273: char srcname[16], addr_name[16];
1274: Uint32 memspace, value, numbit;
1275:
1276: disasm_cur_inst_len++;
1277:
1278: memspace = (cur_inst>>6) & 1;
1279: value = (cur_inst>>8) & BITMASK(6);
1280: numbit = cur_inst & BITMASK(5);
1281:
1282: dsp_calc_ea(value, addr_name);
1283: if (memspace) {
1284: sprintf(srcname, "y:%s", addr_name);
1285: } else {
1286: sprintf(srcname, "x:%s", addr_name);
1287: }
1288:
1.1.1.5 ! root 1289: sprintf(str_instr,"jsclr #%d,%s,p:$%04x",
1.1.1.3 root 1290: numbit,
1291: srcname,
1.1.1.5 ! root 1292: read_memory(dsp_core.pc+1)
1.1.1.3 root 1293: );
1.1 root 1294: }
1295:
1.1.1.3 root 1296: static void dsp_jsclr_pp(void)
1.1 root 1297: {
1.1.1.3 root 1298: /* jsclr #n,x:pp,p:xx */
1299: /* jsclr #n,y:pp,p:xx */
1300: char srcname[16];
1301: Uint32 memspace, value, numbit;
1.1 root 1302:
1.1.1.3 root 1303: disasm_cur_inst_len++;
1.1 root 1304:
1.1.1.3 root 1305: memspace = (cur_inst>>6) & 1;
1306: value = (cur_inst>>8) & BITMASK(6);
1307: numbit = cur_inst & BITMASK(5);
1.1 root 1308:
1.1.1.3 root 1309: value += 0xffc0;
1310: if (memspace) {
1.1.1.5 ! root 1311: sprintf(srcname, "y:$%04x", value);
1.1 root 1312: } else {
1.1.1.5 ! root 1313: sprintf(srcname, "x:$%04x", value);
1.1 root 1314: }
1315:
1.1.1.5 ! root 1316: sprintf(str_instr,"jsclr #%d,%s,p:$%04x",
1.1.1.3 root 1317: numbit,
1318: srcname,
1.1.1.5 ! root 1319: read_memory(dsp_core.pc+1)
1.1 root 1320: );
1321: }
1322:
1.1.1.3 root 1323: static void dsp_jsclr_reg(void)
1.1 root 1324: {
1.1.1.3 root 1325: /* jsclr #n,R,p:xx */
1.1.1.4 root 1326: Uint32 value, numbit;
1.1.1.3 root 1327:
1328: disasm_cur_inst_len++;
1329:
1330: value = (cur_inst>>8) & BITMASK(6);
1331: numbit = cur_inst & BITMASK(5);
1332:
1.1.1.5 ! root 1333: sprintf(str_instr,"jsclr #%d,%s,p:$%04x",
1.1.1.3 root 1334: numbit,
1.1.1.4 root 1335: registers_name[value],
1.1.1.5 ! root 1336: read_memory(dsp_core.pc+1)
1.1 root 1337: );
1338: }
1339:
1.1.1.3 root 1340: static void dsp_jset_aa(void)
1.1 root 1341: {
1.1.1.3 root 1342: /* jset #n,x:aa,p:xx */
1343: /* jset #n,y:aa,p:xx */
1344: char srcname[16];
1345: Uint32 memspace, value, numbit;
1.1 root 1346:
1.1.1.3 root 1347: disasm_cur_inst_len++;
1.1 root 1348:
1.1.1.3 root 1349: memspace = (cur_inst>>6) & 1;
1350: value = (cur_inst>>8) & BITMASK(6);
1351: numbit = cur_inst & BITMASK(5);
1352:
1353: if (memspace) {
1.1.1.5 ! root 1354: sprintf(srcname, "y:$%04x", value);
1.1 root 1355: } else {
1.1.1.5 ! root 1356: sprintf(srcname, "x:$%04x", value);
1.1 root 1357: }
1358:
1.1.1.5 ! root 1359: sprintf(str_instr,"jset #%d,%s,p:$%04x",
1.1.1.3 root 1360: numbit,
1361: srcname,
1.1.1.5 ! root 1362: read_memory(dsp_core.pc+1)
1.1 root 1363: );
1364: }
1365:
1.1.1.3 root 1366: static void dsp_jset_ea(void)
1.1 root 1367: {
1.1.1.3 root 1368: /* jset #n,x:ea,p:xx */
1369: /* jset #n,y:ea,p:xx */
1370: char srcname[16], addr_name[16];
1371: Uint32 memspace, value, numbit;
1372:
1373: disasm_cur_inst_len++;
1374:
1375: memspace = (cur_inst>>6) & 1;
1376: value = (cur_inst>>8) & BITMASK(6);
1377: numbit = cur_inst & BITMASK(5);
1378:
1379: dsp_calc_ea(value, addr_name);
1380: if (memspace) {
1381: sprintf(srcname, "y:%s", addr_name);
1382: } else {
1383: sprintf(srcname, "x:%s", addr_name);
1384: }
1385:
1.1.1.5 ! root 1386: sprintf(str_instr,"jset #%d,%s,p:$%04x",
1.1.1.3 root 1387: numbit,
1388: srcname,
1.1.1.5 ! root 1389: read_memory(dsp_core.pc+1)
1.1 root 1390: );
1391: }
1392:
1.1.1.3 root 1393: static void dsp_jset_pp(void)
1.1 root 1394: {
1.1.1.3 root 1395: /* jset #n,x:pp,p:xx */
1396: /* jset #n,y:pp,p:xx */
1397: char srcname[16];
1398: Uint32 memspace, value, numbit;
1399:
1400: disasm_cur_inst_len++;
1.1 root 1401:
1.1.1.3 root 1402: memspace = (cur_inst>>6) & 1;
1403: value = (cur_inst>>8) & BITMASK(6);
1404: numbit = cur_inst & BITMASK(5);
1.1 root 1405:
1.1.1.3 root 1406: value += 0xffc0;
1407: if (memspace) {
1.1.1.5 ! root 1408: sprintf(srcname, "y:$%04x", value);
1.1.1.3 root 1409: } else {
1.1.1.5 ! root 1410: sprintf(srcname, "x:$%04x", value);
1.1 root 1411: }
1412:
1.1.1.5 ! root 1413: sprintf(str_instr,"jset #%d,%s,p:$%04x",
1.1.1.3 root 1414: numbit,
1415: srcname,
1.1.1.5 ! root 1416: read_memory(dsp_core.pc+1)
1.1.1.3 root 1417: );
1.1 root 1418: }
1419:
1.1.1.3 root 1420: static void dsp_jset_reg(void)
1.1 root 1421: {
1.1.1.3 root 1422: /* jset #n,R,p:xx */
1.1.1.4 root 1423: Uint32 value, numbit;
1.1 root 1424:
1.1.1.3 root 1425: disasm_cur_inst_len++;
1426:
1.1 root 1427: value = (cur_inst>>8) & BITMASK(6);
1428: numbit = cur_inst & BITMASK(5);
1429:
1.1.1.5 ! root 1430: sprintf(str_instr,"jset #%d,%s,p:$%04x",
1.1 root 1431: numbit,
1.1.1.4 root 1432: registers_name[value],
1.1.1.5 ! root 1433: read_memory(dsp_core.pc+1)
1.1 root 1434: );
1435: }
1436:
1.1.1.3 root 1437: static void dsp_jsr_imm(void)
1.1 root 1438: {
1.1.1.5 ! root 1439: sprintf(str_instr,"jsr p:$%04x", cur_inst & BITMASK(12));
1.1 root 1440: }
1441:
1.1.1.3 root 1442: static void dsp_jsr_ea(void)
1.1 root 1443: {
1.1.1.3 root 1444: char dstname[16];
1.1 root 1445:
1.1.1.3 root 1446: dsp_calc_ea((cur_inst>>8) & BITMASK(6),dstname);
1447:
1.1.1.4 root 1448: sprintf(str_instr,"jsr p:%s", dstname);
1.1 root 1449: }
1.1.1.3 root 1450:
1451: static void dsp_jsset_aa(void)
1.1 root 1452: {
1.1.1.3 root 1453: /* jsset #n,x:aa,p:xx */
1454: /* jsset #n,y:aa,p:xx */
1455: char srcname[16];
1.1.1.2 root 1456: Uint32 memspace, value, numbit;
1.1 root 1457:
1.1.1.3 root 1458: disasm_cur_inst_len++;
1459:
1.1 root 1460: memspace = (cur_inst>>6) & 1;
1461: value = (cur_inst>>8) & BITMASK(6);
1462: numbit = cur_inst & BITMASK(5);
1463:
1.1.1.3 root 1464: if (memspace) {
1.1.1.5 ! root 1465: sprintf(srcname, "y:$%04x", value);
1.1.1.3 root 1466: } else {
1.1.1.5 ! root 1467: sprintf(srcname, "x:$%04x", value);
1.1 root 1468: }
1469:
1.1.1.5 ! root 1470: sprintf(str_instr,"jsset #%d,%s,p:$%04x",
1.1 root 1471: numbit,
1472: srcname,
1.1.1.5 ! root 1473: read_memory(dsp_core.pc+1)
1.1 root 1474: );
1475: }
1476:
1.1.1.3 root 1477: static void dsp_jsset_ea(void)
1.1 root 1478: {
1.1.1.3 root 1479: /* jsset #n,x:ea,p:xx */
1480: /* jsset #n,y:ea,p:xx */
1.1 root 1481: char srcname[16], addr_name[16];
1.1.1.2 root 1482: Uint32 memspace, value, numbit;
1.1 root 1483:
1.1.1.3 root 1484: disasm_cur_inst_len++;
1485:
1.1 root 1486: memspace = (cur_inst>>6) & 1;
1487: value = (cur_inst>>8) & BITMASK(6);
1488: numbit = cur_inst & BITMASK(5);
1489:
1.1.1.3 root 1490: dsp_calc_ea(value, addr_name);
1491: if (memspace) {
1492: sprintf(srcname, "y:%s", addr_name);
1493: } else {
1494: sprintf(srcname, "x:%s", addr_name);
1.1 root 1495: }
1496:
1.1.1.5 ! root 1497: sprintf(str_instr,"jsset #%d,%s,p:$%04x",
1.1 root 1498: numbit,
1499: srcname,
1.1.1.5 ! root 1500: read_memory(dsp_core.pc+1)
1.1 root 1501: );
1502: }
1503:
1.1.1.3 root 1504: static void dsp_jsset_pp(void)
1.1 root 1505: {
1.1.1.3 root 1506: /* jsset #n,x:pp,p:xx */
1507: /* jsset #n,y:pp,p:xx */
1508: char srcname[16];
1509: Uint32 memspace, value, numbit;
1510:
1511: disasm_cur_inst_len++;
1512:
1513: memspace = (cur_inst>>6) & 1;
1514: value = (cur_inst>>8) & BITMASK(6);
1515: numbit = cur_inst & BITMASK(5);
1.1 root 1516:
1.1.1.3 root 1517: value += 0xffc0;
1518: if (memspace) {
1.1.1.5 ! root 1519: sprintf(srcname, "y:$%04x", value);
1.1 root 1520: } else {
1.1.1.5 ! root 1521: sprintf(srcname, "x:$%04x", value);
1.1 root 1522: }
1523:
1.1.1.5 ! root 1524: sprintf(str_instr,"jsset #%d,%s,p:$%04x",
1.1.1.3 root 1525: numbit,
1526: srcname,
1.1.1.5 ! root 1527: read_memory(dsp_core.pc+1)
1.1.1.3 root 1528: );
1.1 root 1529: }
1530:
1.1.1.3 root 1531: static void dsp_jsset_reg(void)
1.1 root 1532: {
1.1.1.3 root 1533: /* jsset #n,r,p:xx */
1.1.1.4 root 1534: Uint32 value, numbit;
1.1 root 1535:
1.1.1.3 root 1536: disasm_cur_inst_len++;
1537:
1.1 root 1538: value = (cur_inst>>8) & BITMASK(6);
1539: numbit = cur_inst & BITMASK(5);
1540:
1.1.1.5 ! root 1541: sprintf(str_instr,"jsset #%d,%s,p:$%04x",
1.1 root 1542: numbit,
1.1.1.4 root 1543: registers_name[value],
1.1.1.5 ! root 1544: read_memory(dsp_core.pc+1)
1.1 root 1545: );
1546: }
1547:
1548: static void dsp_lua(void)
1549: {
1550: char addr_name[16], numreg;
1551:
1552: dsp_calc_ea((cur_inst>>8) & BITMASK(5), addr_name);
1553: numreg = cur_inst & BITMASK(3);
1554:
1.1.1.5 ! root 1555: if (cur_inst & (1<<3))
! 1556: sprintf(str_instr,"lua %s,n%d", addr_name, numreg);
! 1557: else
! 1558: sprintf(str_instr,"lua %s,r%d", addr_name, numreg);
1.1 root 1559: }
1560:
1.1.1.3 root 1561: static void dsp_movec_reg(void)
1.1 root 1562: {
1.1.1.2 root 1563: Uint32 numreg1, numreg2;
1.1 root 1564:
1565: /* S1,D2 */
1566: /* S2,D1 */
1567:
1568: numreg2 = (cur_inst>>8) & BITMASK(6);
1.1.1.3 root 1569: numreg1 = cur_inst & BITMASK(6);
1.1 root 1570:
1571: if (cur_inst & (1<<15)) {
1572: /* Write D1 */
1.1.1.4 root 1573: sprintf(str_instr,"movec %s,%s", registers_name[numreg2], registers_name[numreg1]);
1.1 root 1574: } else {
1575: /* Read S1 */
1.1.1.4 root 1576: sprintf(str_instr,"movec %s,%s", registers_name[numreg1], registers_name[numreg2]);
1.1 root 1577: }
1578: }
1579:
1.1.1.3 root 1580: static void dsp_movec_aa(void)
1.1 root 1581: {
1582: const char *spacename;
1583: char srcname[16],dstname[16];
1.1.1.2 root 1584: Uint32 numreg, addr;
1.1 root 1585:
1586: /* x:aa,D1 */
1587: /* S1,x:aa */
1588: /* y:aa,D1 */
1589: /* S1,y:aa */
1590:
1.1.1.3 root 1591: numreg = cur_inst & BITMASK(6);
1.1 root 1592: addr = (cur_inst>>8) & BITMASK(6);
1593:
1594: if (cur_inst & (1<<6)) {
1595: spacename="y";
1596: } else {
1597: spacename="x";
1598: }
1599:
1600: if (cur_inst & (1<<15)) {
1601: /* Write D1 */
1.1.1.5 ! root 1602: sprintf(srcname, "%s:$%04x", spacename, addr);
1.1 root 1603: strcpy(dstname, registers_name[numreg]);
1604: } else {
1605: /* Read S1 */
1606: strcpy(srcname, registers_name[numreg]);
1.1.1.5 ! root 1607: sprintf(dstname, "%s:$%04x", spacename, addr);
1.1 root 1608: }
1609:
1.1.1.4 root 1610: sprintf(str_instr,"movec %s,%s", srcname, dstname);
1.1 root 1611: }
1612:
1.1.1.3 root 1613: static void dsp_movec_imm(void)
1.1 root 1614: {
1.1.1.2 root 1615: Uint32 numreg;
1.1 root 1616:
1617: /* #xx,D1 */
1618:
1.1.1.3 root 1619: numreg = cur_inst & BITMASK(6);
1.1 root 1620:
1.1.1.5 ! root 1621: sprintf(str_instr,"movec #$%02x,%s", (cur_inst>>8) & BITMASK(8), registers_name[numreg]);
1.1 root 1622: }
1623:
1.1.1.3 root 1624: static void dsp_movec_ea(void)
1.1 root 1625: {
1626: const char *spacename;
1627: char srcname[16], dstname[16], addr_name[16];
1.1.1.2 root 1628: Uint32 numreg, ea_mode;
1.1 root 1629: int retour;
1630:
1631: /* x:ea,D1 */
1632: /* S1,x:ea */
1633: /* y:ea,D1 */
1634: /* S1,y:ea */
1635: /* #xxxx,D1 */
1636:
1.1.1.3 root 1637: numreg = cur_inst & BITMASK(6);
1.1 root 1638: ea_mode = (cur_inst>>8) & BITMASK(6);
1639: retour = dsp_calc_ea(ea_mode, addr_name);
1640:
1641: if (cur_inst & (1<<6)) {
1642: spacename="y";
1643: } else {
1644: spacename="x";
1645: }
1646:
1647: if (cur_inst & (1<<15)) {
1648: /* Write D1 */
1649: if (retour) {
1650: sprintf(srcname, "#%s", addr_name);
1651: } else {
1652: sprintf(srcname, "%s:%s", spacename, addr_name);
1653: }
1654: strcpy(dstname, registers_name[numreg]);
1655: } else {
1656: /* Read S1 */
1657: strcpy(srcname, registers_name[numreg]);
1658: sprintf(dstname, "%s:%s", spacename, addr_name);
1659: }
1660:
1.1.1.4 root 1661: sprintf(str_instr,"movec %s,%s", srcname, dstname);
1.1 root 1662: }
1663:
1.1.1.3 root 1664: static void dsp_movem_aa(void)
1.1 root 1665: {
1.1.1.3 root 1666: /* S,p:aa */
1667: /* p:aa,D */
1.1 root 1668: char addr_name[16], srcname[16], dstname[16];
1.1.1.3 root 1669: Uint32 numreg;
1.1 root 1670:
1.1.1.5 ! root 1671: sprintf(addr_name, "$%04x",(cur_inst>>8) & BITMASK(6));
1.1 root 1672: numreg = cur_inst & BITMASK(6);
1673: if (cur_inst & (1<<15)) {
1674: /* Write D */
1675: sprintf(srcname, "p:%s", addr_name);
1676: strcpy(dstname, registers_name[numreg]);
1677: } else {
1678: /* Read S */
1679: strcpy(srcname, registers_name[numreg]);
1680: sprintf(dstname, "p:%s", addr_name);
1681: }
1.1.1.2 root 1682:
1.1.1.4 root 1683: sprintf(str_instr,"movem %s,%s", srcname, dstname);
1.1 root 1684: }
1685:
1.1.1.3 root 1686: static void dsp_movem_ea(void)
1.1 root 1687: {
1.1.1.3 root 1688: /* S,p:ea */
1689: /* p:ea,D */
1690: char addr_name[16], srcname[16], dstname[16];
1691: Uint32 ea_mode, numreg;
1.1 root 1692:
1.1.1.3 root 1693: ea_mode = (cur_inst>>8) & BITMASK(6);
1694: dsp_calc_ea(ea_mode, addr_name);
1695: numreg = cur_inst & BITMASK(6);
1696: if (cur_inst & (1<<15)) {
1697: /* Write D */
1698: sprintf(srcname, "p:%s", addr_name);
1699: strcpy(dstname, registers_name[numreg]);
1700: } else {
1701: /* Read S */
1702: strcpy(srcname, registers_name[numreg]);
1703: sprintf(dstname, "p:%s", addr_name);
1704: }
1705:
1.1.1.4 root 1706: sprintf(str_instr,"movem %s,%s", srcname, dstname);
1.1 root 1707: }
1708:
1709: static void dsp_movep_0(void)
1710: {
1711: char srcname[16]="",dstname[16]="";
1.1.1.2 root 1712: Uint32 addr, memspace, numreg;
1.1 root 1713:
1714: /* S,x:pp */
1715: /* x:pp,D */
1716: /* S,y:pp */
1717: /* y:pp,D */
1718:
1719: addr = 0xffc0 + (cur_inst & BITMASK(6));
1720: memspace = (cur_inst>>16) & 1;
1721: numreg = (cur_inst>>8) & BITMASK(6);
1722:
1723: if (cur_inst & (1<<15)) {
1724: /* Write pp */
1725:
1726: strcpy(srcname, registers_name[numreg]);
1727:
1728: if (memspace) {
1.1.1.5 ! root 1729: sprintf(dstname, "y:$%04x", addr);
1.1 root 1730: } else {
1.1.1.5 ! root 1731: sprintf(dstname, "x:$%04x", addr);
1.1 root 1732: }
1733: } else {
1734: /* Read pp */
1735:
1736: if (memspace) {
1.1.1.5 ! root 1737: sprintf(srcname, "y:$%04x", addr);
1.1 root 1738: } else {
1.1.1.5 ! root 1739: sprintf(srcname, "x:$%04x", addr);
1.1 root 1740: }
1741:
1742: strcpy(dstname, registers_name[numreg]);
1743: }
1744:
1.1.1.4 root 1745: sprintf(str_instr,"movep %s,%s", srcname, dstname);
1.1 root 1746: }
1747:
1748: static void dsp_movep_1(void)
1749: {
1750: char srcname[16]="",dstname[16]="",name[16]="";
1.1.1.2 root 1751: Uint32 addr, memspace;
1.1 root 1752:
1753: /* p:ea,x:pp */
1754: /* x:pp,p:ea */
1755: /* p:ea,y:pp */
1756: /* y:pp,p:ea */
1757:
1758: addr = 0xffc0 + (cur_inst & BITMASK(6));
1759: dsp_calc_ea((cur_inst>>8) & BITMASK(6), name);
1760: memspace = (cur_inst>>16) & 1;
1761:
1762: if (cur_inst & (1<<15)) {
1763: /* Write pp */
1764:
1765: sprintf(srcname, "p:%s", name);
1766:
1767: if (memspace) {
1.1.1.5 ! root 1768: sprintf(dstname, "y:$%04x", addr);
1.1 root 1769: } else {
1.1.1.5 ! root 1770: sprintf(dstname, "x:$%04x", addr);
1.1 root 1771: }
1772: } else {
1773: /* Read pp */
1774:
1775: if (memspace) {
1.1.1.5 ! root 1776: sprintf(srcname, "y:$%04x", addr);
1.1 root 1777: } else {
1.1.1.5 ! root 1778: sprintf(srcname, "x:$%04x", addr);
1.1 root 1779: }
1780:
1781: sprintf(dstname, "p:%s", name);
1782: }
1783:
1.1.1.4 root 1784: sprintf(str_instr,"movep %s,%s", srcname, dstname);
1.1 root 1785: }
1786:
1.1.1.3 root 1787: static void dsp_movep_23(void)
1.1 root 1788: {
1789: char srcname[16]="",dstname[16]="",name[16]="";
1.1.1.2 root 1790: Uint32 addr, memspace, easpace, retour;
1.1 root 1791:
1792: /* x:ea,x:pp */
1793: /* y:ea,x:pp */
1794: /* #xxxxxx,x:pp */
1795: /* x:pp,x:ea */
1796: /* x:pp,y:ea */
1797:
1798: /* x:ea,y:pp */
1799: /* y:ea,y:pp */
1800: /* #xxxxxx,y:pp */
1801: /* y:pp,y:ea */
1802: /* y:pp,x:ea */
1803:
1804: addr = 0xffc0 + (cur_inst & BITMASK(6));
1805: retour = dsp_calc_ea((cur_inst>>8) & BITMASK(6), name);
1806: memspace = (cur_inst>>16) & 1;
1807: easpace = (cur_inst>>6) & 1;
1808:
1809: if (cur_inst & (1<<15)) {
1810: /* Write pp */
1811:
1812: if (retour) {
1813: sprintf(srcname, "#%s", name);
1814: } else {
1815: if (easpace) {
1816: sprintf(srcname, "y:%s", name);
1817: } else {
1818: sprintf(srcname, "x:%s", name);
1819: }
1820: }
1821:
1822: if (memspace) {
1.1.1.5 ! root 1823: sprintf(dstname, "y:$%04x", addr);
1.1 root 1824: } else {
1.1.1.5 ! root 1825: sprintf(dstname, "x:$%04x", addr);
1.1 root 1826: }
1827: } else {
1828: /* Read pp */
1829:
1830: if (memspace) {
1.1.1.5 ! root 1831: sprintf(srcname, "y:$%04x", addr);
1.1 root 1832: } else {
1.1.1.5 ! root 1833: sprintf(srcname, "x:$%04x", addr);
1.1 root 1834: }
1835:
1836: if (easpace) {
1837: sprintf(dstname, "y:%s", name);
1838: } else {
1839: sprintf(dstname, "x:%s", name);
1840: }
1841: }
1842:
1.1.1.4 root 1843: sprintf(str_instr,"movep %s,%s", srcname, dstname);
1.1 root 1844: }
1845:
1846: static void dsp_nop(void)
1847: {
1.1.1.4 root 1848: sprintf(str_instr,"nop");
1.1 root 1849: }
1850:
1851: static void dsp_norm(void)
1852: {
1.1.1.2 root 1853: Uint32 srcreg, destreg;
1.1 root 1854:
1855: srcreg = DSP_REG_R0+((cur_inst>>8) & BITMASK(3));
1856: destreg = DSP_REG_A+((cur_inst>>3) & 1);
1857:
1.1.1.4 root 1858: sprintf(str_instr,"norm %s,%s", registers_name[srcreg], registers_name[destreg]);
1.1 root 1859: }
1860:
1861: static void dsp_ori(void)
1862: {
1863: switch(cur_inst & BITMASK(2)) {
1864: case 0:
1.1.1.5 ! root 1865: sprintf(str_instr,"ori #$%02x,mr", (cur_inst>>8) & BITMASK(8));
1.1 root 1866: break;
1867: case 1:
1.1.1.5 ! root 1868: sprintf(str_instr,"ori #$%02x,ccr", (cur_inst>>8) & BITMASK(8));
1.1 root 1869: break;
1870: case 2:
1.1.1.5 ! root 1871: sprintf(str_instr,"ori #$%02x,omr", (cur_inst>>8) & BITMASK(8));
1.1 root 1872: break;
1873: default:
1874: break;
1875: }
1876:
1877: }
1878:
1.1.1.3 root 1879: static void dsp_rep_aa(void)
1.1 root 1880: {
1881: char name[16];
1882:
1883: /* x:aa */
1884: /* y:aa */
1885:
1886: if (cur_inst & (1<<6)) {
1.1.1.5 ! root 1887: sprintf(name, "y:$%04x",(cur_inst>>8) & BITMASK(6));
1.1 root 1888: } else {
1.1.1.5 ! root 1889: sprintf(name, "x:$%04x",(cur_inst>>8) & BITMASK(6));
1.1 root 1890: }
1891:
1.1.1.4 root 1892: sprintf(str_instr,"rep %s", name);
1.1 root 1893: }
1894:
1.1.1.3 root 1895: static void dsp_rep_imm(void)
1.1 root 1896: {
1897: /* #xxx */
1.1.1.5 ! root 1898: sprintf(str_instr,"rep #$%02x", ((cur_inst>>8) & BITMASK(8))
1.1.1.3 root 1899: + ((cur_inst & BITMASK(4))<<8));
1.1 root 1900: }
1901:
1.1.1.3 root 1902: static void dsp_rep_ea(void)
1.1 root 1903: {
1904: char name[16],addr_name[16];
1905:
1906: /* x:ea */
1907: /* y:ea */
1908:
1909: dsp_calc_ea((cur_inst>>8) & BITMASK(6), addr_name);
1910: if (cur_inst & (1<<6)) {
1911: sprintf(name, "y:%s",addr_name);
1912: } else {
1913: sprintf(name, "x:%s",addr_name);
1914: }
1915:
1.1.1.4 root 1916: sprintf(str_instr,"rep %s", name);
1.1 root 1917: }
1918:
1.1.1.3 root 1919: static void dsp_rep_reg(void)
1.1 root 1920: {
1921: /* R */
1922:
1.1.1.4 root 1923: sprintf(str_instr,"rep %s", registers_name[(cur_inst>>8) & BITMASK(6)]);
1.1 root 1924: }
1925:
1926: static void dsp_reset(void)
1927: {
1.1.1.4 root 1928: sprintf(str_instr,"reset");
1.1 root 1929: }
1930:
1931: static void dsp_rti(void)
1932: {
1.1.1.4 root 1933: sprintf(str_instr,"rti");
1.1 root 1934: }
1935:
1936: static void dsp_rts(void)
1937: {
1.1.1.4 root 1938: sprintf(str_instr,"rts");
1.1 root 1939: }
1940:
1941: static void dsp_stop(void)
1942: {
1.1.1.4 root 1943: sprintf(str_instr,"stop");
1.1 root 1944: }
1945:
1946: static void dsp_swi(void)
1947: {
1.1.1.4 root 1948: sprintf(str_instr,"swi");
1.1 root 1949: }
1950:
1951: static void dsp_tcc(void)
1952: {
1953: char ccname[16];
1.1.1.2 root 1954: Uint32 src1reg, dst1reg, src2reg, dst2reg;
1.1 root 1955:
1956: dsp_calc_cc((cur_inst>>12) & BITMASK(4), ccname);
1957: src1reg = registers_tcc[(cur_inst>>3) & BITMASK(4)][0];
1.1.1.2 root 1958: dst1reg = registers_tcc[(cur_inst>>3) & BITMASK(4)][1];
1.1 root 1959:
1960: if (cur_inst & (1<<16)) {
1.1.1.5 ! root 1961: src2reg = DSP_REG_R0+((cur_inst>>8) & BITMASK(3));
! 1962: dst2reg = DSP_REG_R0+(cur_inst & BITMASK(3));
1.1 root 1963:
1.1.1.4 root 1964: sprintf(str_instr,"t%s %s,%s %s,%s",
1.1 root 1965: ccname,
1966: registers_name[src1reg],
1967: registers_name[dst1reg],
1968: registers_name[src2reg],
1969: registers_name[dst2reg]
1970: );
1971: } else {
1.1.1.4 root 1972: sprintf(str_instr,"t%s %s,%s",
1.1 root 1973: ccname,
1974: registers_name[src1reg],
1975: registers_name[dst1reg]
1976: );
1977: }
1978: }
1979:
1980: static void dsp_wait(void)
1981: {
1.1.1.4 root 1982: sprintf(str_instr,"wait");
1.1 root 1983: }
1984:
1985: /**********************************
1986: * Parallel moves
1987: **********************************/
1988:
1989: static void dsp_pm(void)
1990: {
1.1.1.2 root 1991: Uint32 value;
1.1 root 1992:
1993: value = (cur_inst >> 20) & BITMASK(4);
1994: opcodes_parmove[value]();
1995: }
1996:
1997: static void dsp_pm_0(void)
1998: {
1999: char space_name[16], addr_name[16];
1.1.1.2 root 2000: Uint32 memspace, numreg1, numreg2;
1.1 root 2001: /*
2002: 0000 100d 00mm mrrr S,x:ea x0,D
2003: 0000 100d 10mm mrrr S,y:ea y0,D
2004: */
2005: memspace = (cur_inst>>15) & 1;
2006: numreg1 = DSP_REG_A+((cur_inst>>16) & 1);
2007: dsp_calc_ea((cur_inst>>8) & BITMASK(6), addr_name);
2008:
2009: if (memspace) {
2010: strcpy(space_name,"y");
2011: numreg2 = DSP_REG_Y0;
2012: } else {
2013: strcpy(space_name,"x");
2014: numreg2 = DSP_REG_X0;
2015: }
2016:
2017: sprintf(parallelmove_name,
2018: "%s,%s:%s %s,%s",
2019: registers_name[numreg1],
2020: space_name,
2021: addr_name,
2022: registers_name[numreg2],
2023: registers_name[numreg1]
2024: );
2025: }
2026:
2027: static void dsp_pm_1(void)
2028: {
2029: /*
2030: 0001 ffdf w0mm mrrr x:ea,D1 S2,D2
2031: S1,x:ea S2,D2
2032: #xxxxxx,D1 S2,D2
2033: 0001 deff w1mm mrrr S1,D1 y:ea,D2
2034: S1,D1 S2,y:ea
2035: S1,D1 #xxxxxx,D2
2036: */
2037:
2038: char addr_name[16];
1.1.1.2 root 2039: Uint32 memspace, write_flag, retour, s1reg, s2reg, d1reg, d2reg;
1.1 root 2040:
2041: memspace = (cur_inst>>14) & 1;
2042: write_flag = (cur_inst>>15) & 1;
2043: retour = dsp_calc_ea((cur_inst>>8) & BITMASK(6), addr_name);
2044:
2045: if (memspace==DSP_SPACE_Y) {
2046: s2reg = d2reg = DSP_REG_Y0;
2047: switch((cur_inst>>16) & BITMASK(2)) {
2048: case 0: s2reg = d2reg = DSP_REG_Y0; break;
2049: case 1: s2reg = d2reg = DSP_REG_Y1; break;
2050: case 2: s2reg = d2reg = DSP_REG_A; break;
2051: case 3: s2reg = d2reg = DSP_REG_B; break;
2052: }
2053:
2054: s1reg = DSP_REG_A+((cur_inst>>19) & 1);
2055: d1reg = DSP_REG_X0+((cur_inst>>18) & 1);
2056:
2057: if (write_flag) {
2058: /* Write D2 */
2059:
2060: if (retour) {
2061: sprintf(parallelmove_name,"%s,%s #%s,%s",
2062: registers_name[s1reg],
2063: registers_name[d1reg],
2064: addr_name,
2065: registers_name[d2reg]
2066: );
2067: } else {
2068: sprintf(parallelmove_name,"%s,%s y:%s,%s",
2069: registers_name[s1reg],
2070: registers_name[d1reg],
2071: addr_name,
2072: registers_name[d2reg]
2073: );
2074: }
2075: } else {
2076: /* Read S2 */
2077: sprintf(parallelmove_name,"%s,%s %s,y:%s",
2078: registers_name[s1reg],
2079: registers_name[d1reg],
2080: registers_name[s2reg],
2081: addr_name
2082: );
2083: }
2084:
2085: } else {
2086: s1reg = d1reg = DSP_REG_X0;
2087: switch((cur_inst>>18) & BITMASK(2)) {
2088: case 0: s1reg = d1reg = DSP_REG_X0; break;
2089: case 1: s1reg = d1reg = DSP_REG_X1; break;
2090: case 2: s1reg = d1reg = DSP_REG_A; break;
2091: case 3: s1reg = d1reg = DSP_REG_B; break;
2092: }
2093:
2094: s2reg = DSP_REG_A+((cur_inst>>17) & 1);
2095: d2reg = DSP_REG_Y0+((cur_inst>>16) & 1);
2096:
2097: if (write_flag) {
2098: /* Write D1 */
2099:
2100: if (retour) {
2101: sprintf(parallelmove_name,"#%s,%s %s,%s",
2102: addr_name,
2103: registers_name[d1reg],
2104: registers_name[s2reg],
2105: registers_name[d2reg]
2106: );
2107: } else {
2108: sprintf(parallelmove_name,"x:%s,%s %s,%s",
2109: addr_name,
2110: registers_name[d1reg],
2111: registers_name[s2reg],
2112: registers_name[d2reg]
2113: );
2114: }
2115: } else {
2116: /* Read S1 */
2117: sprintf(parallelmove_name,"%s,x:%s %s,%s",
2118: registers_name[s1reg],
2119: addr_name,
2120: registers_name[s2reg],
2121: registers_name[d2reg]
2122: );
2123: }
2124:
2125: }
2126: }
2127:
2128: static void dsp_pm_2(void)
2129: {
2130: char addr_name[16];
1.1.1.2 root 2131: Uint32 numreg1, numreg2;
1.1 root 2132: /*
2133: 0010 0000 0000 0000 nop
2134: 0010 0000 010m mrrr R update
2135: 0010 00ee eeed dddd S,D
2136: 001d dddd iiii iiii #xx,D
2137: */
2138: if (((cur_inst >> 8) & 0xffff) == 0x2000) {
2139: return;
2140: }
2141:
2142: if (((cur_inst >> 8) & 0xffe0) == 0x2040) {
2143: dsp_calc_ea((cur_inst>>8) & BITMASK(5), addr_name);
2144: sprintf(parallelmove_name, "%s,r%d",addr_name, (cur_inst>>8) & BITMASK(3));
2145: return;
2146: }
2147:
2148: if (((cur_inst >> 8) & 0xfc00) == 0x2000) {
2149: numreg1 = (cur_inst>>13) & BITMASK(5);
2150: numreg2 = (cur_inst>>8) & BITMASK(5);
2151: sprintf(parallelmove_name, "%s,%s", registers_name[numreg1], registers_name[numreg2]);
2152: return;
2153: }
2154:
2155: numreg1 = (cur_inst>>16) & BITMASK(5);
1.1.1.5 ! root 2156: sprintf(parallelmove_name, "#$%02x,%s", (cur_inst >> 8) & BITMASK(8), registers_name[numreg1]);
1.1 root 2157: }
2158:
2159: static void dsp_pm_4(void)
2160: {
2161: char addr_name[16];
1.1.1.2 root 2162: Uint32 value, retour, ea_mode, memspace;
1.1 root 2163: /*
2164: 0100 l0ll w0aa aaaa l:aa,D
2165: S,l:aa
2166: 0100 l0ll w1mm mrrr l:ea,D
2167: S,l:ea
2168: 01dd 0ddd w0aa aaaa x:aa,D
2169: S,x:aa
2170: 01dd 0ddd w1mm mrrr x:ea,D
2171: S,x:ea
2172: #xxxxxx,D
2173: 01dd 1ddd w0aa aaaa y:aa,D
2174: S,y:aa
2175: 01dd 1ddd w1mm mrrr y:ea,D
2176: S,y:ea
2177: #xxxxxx,D
2178: */
2179: value = (cur_inst>>16) & BITMASK(3);
2180: value |= (cur_inst>>17) & (BITMASK(2)<<3);
2181:
2182: ea_mode = (cur_inst>>8) & BITMASK(6);
2183:
2184: if ((value>>2)==0) {
2185: /* L: memory move */
2186: if (cur_inst & (1<<14)) {
2187: retour = dsp_calc_ea(ea_mode, addr_name);
2188: } else {
1.1.1.5 ! root 2189: sprintf(addr_name,"$%04x", ea_mode);
1.1 root 2190: retour = 0;
2191: }
2192:
2193: value = (cur_inst>>16) & BITMASK(2);
2194: value |= (cur_inst>>17) & (1<<2);
2195:
2196: if (cur_inst & (1<<15)) {
2197: /* Write D */
2198:
2199: if (retour) {
2200: sprintf(parallelmove_name, "#%s,%s", addr_name, registers_lmove[value]);
2201: } else {
2202: sprintf(parallelmove_name, "l:%s,%s", addr_name, registers_lmove[value]);
2203: }
2204: } else {
2205: /* Read S */
2206: sprintf(parallelmove_name, "%s,l:%s", registers_lmove[value], addr_name);
2207: }
2208:
2209: return;
2210: }
2211:
2212: memspace = (cur_inst>>19) & 1;
2213: if (cur_inst & (1<<14)) {
2214: retour = dsp_calc_ea(ea_mode, addr_name);
2215: } else {
1.1.1.5 ! root 2216: sprintf(addr_name,"$%04x", ea_mode);
1.1 root 2217: retour = 0;
2218: }
2219:
2220: if (memspace) {
2221: /* Y: */
2222:
2223: if (cur_inst & (1<<15)) {
2224: /* Write D */
2225:
2226: if (retour) {
2227: sprintf(parallelmove_name, "#%s,%s", addr_name, registers_name[value]);
2228: } else {
2229: sprintf(parallelmove_name, "y:%s,%s", addr_name, registers_name[value]);
2230: }
2231:
2232: } else {
2233: /* Read S */
2234: sprintf(parallelmove_name, "%s,y:%s", registers_name[value], addr_name);
2235: }
2236: } else {
2237: /* X: */
2238:
2239: if (cur_inst & (1<<15)) {
2240: /* Write D */
2241:
2242: if (retour) {
2243: sprintf(parallelmove_name, "#%s,%s", addr_name, registers_name[value]);
2244: } else {
2245: sprintf(parallelmove_name, "x:%s,%s", addr_name, registers_name[value]);
2246: }
2247: } else {
2248: /* Read S */
2249: sprintf(parallelmove_name, "%s,x:%s", registers_name[value], addr_name);
2250: }
2251: }
2252: }
2253:
2254: static void dsp_pm_8(void)
2255: {
2256: char addr1_name[16], addr2_name[16];
1.1.1.2 root 2257: Uint32 ea_mode1, ea_mode2, numreg1, numreg2;
1.1 root 2258: /*
2259: 1wmm eeff WrrM MRRR x:ea,D1 y:ea,D2
2260: x:ea,D1 S2,y:ea
2261: S1,x:ea y:ea,D2
2262: S1,x:ea S2,y:ea
2263: */
2264: numreg1 = DSP_REG_X0;
2265: switch((cur_inst>>18) & BITMASK(2)) {
2266: case 0: numreg1 = DSP_REG_X0; break;
2267: case 1: numreg1 = DSP_REG_X1; break;
2268: case 2: numreg1 = DSP_REG_A; break;
2269: case 3: numreg1 = DSP_REG_B; break;
2270: }
2271:
2272: numreg2 = DSP_REG_Y0;
2273: switch((cur_inst>>16) & BITMASK(2)) {
2274: case 0: numreg2 = DSP_REG_Y0; break;
2275: case 1: numreg2 = DSP_REG_Y1; break;
2276: case 2: numreg2 = DSP_REG_A; break;
2277: case 3: numreg2 = DSP_REG_B; break;
2278: }
2279:
2280: ea_mode1 = (cur_inst>>8) & BITMASK(5);
2281: if ((ea_mode1>>3) == 0) {
2282: ea_mode1 |= (1<<5);
2283: }
2284: ea_mode2 = (cur_inst>>13) & BITMASK(2);
2285: ea_mode2 |= ((cur_inst>>20) & BITMASK(2))<<3;
2286: if ((ea_mode1 & (1<<2))==0) {
2287: ea_mode2 |= 1<<2;
2288: }
2289: if ((ea_mode2>>3) == 0) {
2290: ea_mode2 |= (1<<5);
2291: }
2292:
2293: dsp_calc_ea(ea_mode1, addr1_name);
2294: dsp_calc_ea(ea_mode2, addr2_name);
2295:
2296: if (cur_inst & (1<<15)) {
2297: if (cur_inst & (1<<22)) {
2298: sprintf(parallelmove_name, "x:%s,%s y:%s,%s",
2299: addr1_name,
2300: registers_name[numreg1],
2301: addr2_name,
2302: registers_name[numreg2]
2303: );
2304: } else {
2305: sprintf(parallelmove_name, "x:%s,%s %s,y:%s",
2306: addr1_name,
2307: registers_name[numreg1],
2308: registers_name[numreg2],
2309: addr2_name
2310: );
2311: }
2312: } else {
2313: if (cur_inst & (1<<22)) {
2314: sprintf(parallelmove_name, "%s,x:%s y:%s,%s",
2315: registers_name[numreg1],
2316: addr1_name,
2317: addr2_name,
2318: registers_name[numreg2]
2319: );
2320: } else {
2321: sprintf(parallelmove_name, "%s,x:%s %s,y:%s",
2322: registers_name[numreg1],
2323: addr1_name,
2324: registers_name[numreg2],
2325: addr2_name
2326: );
2327: }
2328: }
2329: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.