|
|
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>
27:
28: #include "dsp_core.h"
1.1 root 29: #include "dsp_cpu.h"
30: #include "dsp_disasm.h"
31:
1.1.1.2 root 32: #define DEBUG 0
1.1 root 33:
34: /* More disasm infos, if wanted */
35: #define DSP_DISASM_REG_PC 0
36:
37: /**********************************
38: * Defines
39: **********************************/
40:
41: #define BITMASK(x) ((1<<(x))-1)
42:
43: /**********************************
44: * Variables
45: **********************************/
46:
47: /* Current instruction */
1.1.1.3 ! root 48: static char str_instr[50];
1.1.1.2 root 49: static Uint32 cur_inst;
1.1.1.3 ! root 50: static Uint32 disasm_cur_inst_len;
! 51:
! 52: /* Previous instruction */
! 53: static Uint32 prev_inst_pc = 0x10000; /* Init to an invalid value */
1.1.1.2 root 54:
55: static dsp_core_t *dsp_core;
56:
57: void dsp56k_disasm_init(dsp_core_t *my_dsp_core)
58: {
59: dsp_core = my_dsp_core;
60: }
1.1 root 61:
62: /**********************************
63: * Register change
64: **********************************/
65:
1.1.1.2 root 66: static Uint32 registers_save[64];
67: static Uint32 registers_changed[64];
1.1 root 68: #if DSP_DISASM_REG_PC
1.1.1.2 root 69: static Uint32 pc_save;
1.1 root 70: #endif
71:
72: static const char *registers_name[64]={
73: "","","","",
74: "x0","x1","y0","y1",
75: "a0","b0","a2","b2",
76: "a1","b1","a","b",
77:
78: "r0","r1","r2","r3",
79: "r4","r5","r6","r7",
80: "n0","n1","n2","n3",
81: "n4","n5","n6","n7",
82:
83: "m0","m1","m2","m3",
84: "m4","m5","m6","m7",
85: "","","","",
86: "","","","",
87:
88: "","","","",
89: "","","","",
90: "","sr","omr","sp",
91: "ssh","ssl","la","lc"
92: };
93:
94: void dsp56k_disasm_reg_read(void)
95: {
1.1.1.2 root 96: memcpy(registers_save, dsp_core->registers , sizeof(registers_save));
1.1 root 97: memset(registers_changed, 0, sizeof(registers_changed));
98: #if DSP_DISASM_REG_PC
1.1.1.2 root 99: pc_save = dsp_core->pc;
1.1 root 100: #endif
101: }
102:
103: void dsp56k_disasm_reg_compare(void)
104: {
105: int i;
106:
107: for (i=0;i<64;i++) {
108: if (!registers_changed[i]) {
109: continue;
110: }
111:
112: switch(i) {
113: case DSP_REG_X0:
114: case DSP_REG_X1:
115: case DSP_REG_Y0:
116: case DSP_REG_Y1:
117: case DSP_REG_A0:
118: case DSP_REG_A1:
119: case DSP_REG_B0:
120: case DSP_REG_B1:
1.1.1.3 ! root 121: fprintf(stderr," Reg: %s: 0x%06x -> 0x%06x\n", registers_name[i], registers_save[i] & BITMASK(24), dsp_core->registers[i] & BITMASK(24));
1.1 root 122: break;
123: case DSP_REG_R0:
124: case DSP_REG_R1:
125: case DSP_REG_R2:
126: case DSP_REG_R3:
127: case DSP_REG_R4:
128: case DSP_REG_R5:
129: case DSP_REG_R6:
130: case DSP_REG_R7:
131: case DSP_REG_M0:
132: case DSP_REG_M1:
133: case DSP_REG_M2:
134: case DSP_REG_M3:
135: case DSP_REG_M4:
136: case DSP_REG_M5:
137: case DSP_REG_M6:
138: case DSP_REG_M7:
139: case DSP_REG_N0:
140: case DSP_REG_N1:
141: case DSP_REG_N2:
142: case DSP_REG_N3:
143: case DSP_REG_N4:
144: case DSP_REG_N5:
145: case DSP_REG_N6:
146: case DSP_REG_N7:
147: case DSP_REG_SR:
148: case DSP_REG_LA:
149: case DSP_REG_LC:
1.1.1.3 ! root 150: fprintf(stderr," Reg: %s: 0x%04x -> 0x%04x\n", registers_name[i], registers_save[i] & BITMASK(16), dsp_core->registers[i] & BITMASK(16));
1.1 root 151: break;
152: case DSP_REG_A2:
153: case DSP_REG_B2:
154: case DSP_REG_OMR:
155: case DSP_REG_SP:
156: case DSP_REG_SSH:
157: case DSP_REG_SSL:
1.1.1.3 ! root 158: fprintf(stderr," Reg: %s: 0x%02x -> 0x%02x\n", registers_name[i], registers_save[i] & BITMASK(8), dsp_core->registers[i] & BITMASK(8));
1.1 root 159: break;
160: case DSP_REG_A:
161: case DSP_REG_B:
162: {
1.1.1.3 ! root 163: fprintf(stderr," Reg: %s: 0x%02x:%06x:%06x -> 0x%02x:%06x:%06x\n",
1.1 root 164: registers_name[i],
165: registers_save[DSP_REG_A2+(i & 1)] & BITMASK(8),
166: registers_save[DSP_REG_A1+(i & 1)] & BITMASK(24),
167: registers_save[DSP_REG_A0+(i & 1)] & BITMASK(24),
1.1.1.2 root 168: dsp_core->registers[DSP_REG_A2+(i & 1)] & BITMASK(8),
169: dsp_core->registers[DSP_REG_A1+(i & 1)] & BITMASK(24),
170: dsp_core->registers[DSP_REG_A0+(i & 1)] & BITMASK(24)
1.1 root 171: );
172: }
173: break;
174: }
175: }
176: #if DSP_DISASM_REG_PC
1.1.1.2 root 177: if (pc_save != dsp_core->pc) {
1.1.1.3 ! root 178: fprintf(stderr," Reg: pc: 0x%04x -> 0x%04x\n", pc_save, dsp_core->pc);
1.1 root 179: }
180: #endif
181: }
182:
183: /**********************************
184: * Opcode disassembler
185: **********************************/
186:
1.1.1.2 root 187: static Uint32 read_memory(Uint32 currPc);
188:
1.1 root 189: typedef void (*dsp_emul_t)(void);
190:
191: static void opcode8h_0(void);
192:
1.1.1.2 root 193: static int dsp_calc_ea(Uint32 ea_mode, char *dest);
194: static void dsp_calc_cc(Uint32 cc_mode, char *dest);
1.1 root 195: static void dsp_undefined(void);
196:
197: /* Instructions without parallel moves */
198: static void dsp_andi(void);
1.1.1.3 ! root 199: static void dsp_bchg_aa(void);
! 200: static void dsp_bchg_ea(void);
! 201: static void dsp_bchg_pp(void);
! 202: static void dsp_bchg_reg(void);
! 203: static void dsp_bclr_aa(void);
! 204: static void dsp_bclr_ea(void);
! 205: static void dsp_bclr_pp(void);
! 206: static void dsp_bclr_reg(void);
! 207: static void dsp_bset_aa(void);
! 208: static void dsp_bset_ea(void);
! 209: static void dsp_bset_pp(void);
! 210: static void dsp_bset_reg(void);
! 211: static void dsp_btst_aa(void);
! 212: static void dsp_btst_ea(void);
! 213: static void dsp_btst_pp(void);
! 214: static void dsp_btst_reg(void);
1.1 root 215: static void dsp_div(void);
216: static void dsp_enddo(void);
217: static void dsp_illegal(void);
1.1.1.3 ! root 218: static void dsp_jcc_imm(void);
! 219: static void dsp_jcc_ea(void);
! 220: static void dsp_jclr_aa(void);
! 221: static void dsp_jclr_ea(void);
! 222: static void dsp_jclr_pp(void);
! 223: static void dsp_jclr_reg(void);
! 224: static void dsp_jmp_ea(void);
! 225: static void dsp_jmp_imm(void);
! 226: static void dsp_jscc_ea(void);
! 227: static void dsp_jscc_imm(void);
! 228: static void dsp_jsclr_aa(void);
! 229: static void dsp_jsclr_ea(void);
! 230: static void dsp_jsclr_pp(void);
! 231: static void dsp_jsclr_reg(void);
! 232: static void dsp_jset_aa(void);
! 233: static void dsp_jset_ea(void);
! 234: static void dsp_jset_pp(void);
! 235: static void dsp_jset_reg(void);
! 236: static void dsp_jsr_ea(void);
! 237: static void dsp_jsr_imm(void);
! 238: static void dsp_jsset_aa(void);
! 239: static void dsp_jsset_ea(void);
! 240: static void dsp_jsset_pp(void);
! 241: static void dsp_jsset_reg(void);
1.1 root 242: static void dsp_lua(void);
1.1.1.3 ! root 243: static void dsp_movem_ea(void);
! 244: static void dsp_movem_aa(void);
1.1 root 245: static void dsp_nop(void);
246: static void dsp_norm(void);
247: static void dsp_ori(void);
248: static void dsp_reset(void);
249: static void dsp_rti(void);
250: static void dsp_rts(void);
251: static void dsp_stop(void);
252: static void dsp_swi(void);
253: static void dsp_tcc(void);
254: static void dsp_wait(void);
1.1.1.3 ! root 255: static void dsp_do_ea(void);
! 256: static void dsp_do_aa(void);
! 257: static void dsp_do_imm(void);
! 258: static void dsp_do_reg(void);
! 259: static void dsp_rep_aa(void);
! 260: static void dsp_rep_ea(void);
! 261: static void dsp_rep_imm(void);
! 262: static void dsp_rep_reg(void);
! 263: static void dsp_movec_aa(void);
! 264: static void dsp_movec_ea(void);
! 265: static void dsp_movec_imm(void);
! 266: static void dsp_movec_reg(void);
1.1 root 267: static void dsp_movep_0(void);
268: static void dsp_movep_1(void);
1.1.1.3 ! root 269: static void dsp_movep_23(void);
1.1 root 270:
271: /* Parallel moves */
1.1.1.3 ! root 272: static void dsp_pm_class2(void);
1.1 root 273: static void dsp_pm(void);
274: static void dsp_pm_0(void);
275: static void dsp_pm_1(void);
276: static void dsp_pm_2(void);
277: static void dsp_pm_4(void);
278: static void dsp_pm_8(void);
279:
280: /* Instructions with parallel moves */
281: static void dsp_abs(void);
282: static void dsp_adc(void);
283: static void dsp_add(void);
284: static void dsp_addl(void);
285: static void dsp_addr(void);
286: static void dsp_and(void);
287: static void dsp_asl(void);
288: static void dsp_asr(void);
289: static void dsp_clr(void);
290: static void dsp_cmp(void);
291: static void dsp_cmpm(void);
292: static void dsp_eor(void);
293: static void dsp_lsl(void);
294: static void dsp_lsr(void);
295: static void dsp_mac(void);
296: static void dsp_macr(void);
297: static void dsp_move(void);
298: static void dsp_mpy(void);
299: static void dsp_mpyr(void);
300: static void dsp_neg(void);
301: static void dsp_not(void);
302: static void dsp_or(void);
303: static void dsp_rnd(void);
304: static void dsp_rol(void);
305: static void dsp_ror(void);
306: static void dsp_sbc(void);
307: static void dsp_sub(void);
308: static void dsp_subl(void);
309: static void dsp_subr(void);
310: static void dsp_tfr(void);
311: static void dsp_tst(void);
312:
1.1.1.3 ! root 313: static dsp_emul_t opcodes8h[512]={
! 314: /* 0x00 - 0x3f */
! 315: opcode8h_0, dsp_undefined, dsp_undefined, dsp_undefined, opcode8h_0, dsp_andi, dsp_undefined, dsp_ori,
! 316: dsp_undefined, dsp_undefined, dsp_undefined, dsp_undefined, dsp_undefined, dsp_andi, dsp_undefined, dsp_ori,
! 317: dsp_undefined, dsp_undefined, dsp_undefined, dsp_undefined, dsp_undefined, dsp_andi, dsp_undefined, dsp_ori,
! 318: dsp_undefined, dsp_undefined, dsp_undefined, dsp_undefined, dsp_undefined, dsp_andi, dsp_undefined, dsp_ori,
! 319: dsp_undefined, dsp_undefined, dsp_undefined, dsp_undefined, dsp_undefined, dsp_undefined, dsp_undefined, dsp_undefined,
! 320: dsp_undefined, dsp_undefined, dsp_undefined, dsp_undefined, dsp_undefined, dsp_undefined, dsp_undefined, dsp_undefined,
! 321: dsp_undefined, dsp_undefined, dsp_div, dsp_div, dsp_undefined, dsp_undefined, dsp_undefined, dsp_undefined,
! 322: dsp_norm, dsp_undefined, dsp_undefined, dsp_undefined, dsp_undefined, dsp_undefined, dsp_undefined, dsp_undefined,
! 323:
! 324: /* 0x40 - 0x7f */
! 325: dsp_tcc, dsp_tcc, dsp_tcc, dsp_tcc, dsp_undefined, dsp_undefined, dsp_undefined, dsp_undefined,
! 326: dsp_tcc, dsp_tcc, dsp_tcc, dsp_tcc, dsp_undefined, dsp_undefined, dsp_undefined, dsp_undefined,
! 327: dsp_tcc, dsp_tcc, dsp_tcc, dsp_tcc, dsp_undefined, dsp_undefined, dsp_undefined, dsp_undefined,
! 328: dsp_tcc, dsp_tcc, dsp_tcc, dsp_tcc, dsp_undefined, dsp_undefined, dsp_undefined, dsp_undefined,
! 329: dsp_tcc, dsp_tcc, dsp_tcc, dsp_tcc, dsp_undefined, dsp_undefined, dsp_undefined, dsp_undefined,
! 330: dsp_tcc, dsp_tcc, dsp_tcc, dsp_tcc, dsp_undefined, dsp_undefined, dsp_undefined, dsp_undefined,
! 331: dsp_tcc, dsp_tcc, dsp_tcc, dsp_tcc, dsp_undefined, dsp_undefined, dsp_undefined, dsp_undefined,
! 332: dsp_tcc, dsp_tcc, dsp_tcc, dsp_tcc, dsp_undefined, dsp_undefined, dsp_undefined, dsp_undefined,
! 333:
! 334: /* 0x80 - 0xbf */
! 335: dsp_undefined, dsp_undefined, dsp_undefined, dsp_undefined, dsp_undefined, dsp_undefined, dsp_undefined, dsp_undefined,
! 336: dsp_lua, dsp_undefined, dsp_undefined, dsp_undefined, dsp_undefined, dsp_movec_reg, dsp_undefined, dsp_undefined,
! 337: dsp_undefined, dsp_undefined, dsp_undefined, dsp_undefined, dsp_undefined, dsp_undefined, dsp_undefined, dsp_undefined,
! 338: dsp_undefined, dsp_undefined, dsp_undefined, dsp_undefined, dsp_undefined, dsp_movec_reg, dsp_undefined, dsp_undefined,
! 339: dsp_undefined, dsp_movec_aa, dsp_undefined, dsp_movec_aa, dsp_undefined, dsp_movec_imm, dsp_undefined, dsp_undefined,
! 340: dsp_undefined, dsp_movec_ea, dsp_undefined, dsp_movec_ea, dsp_undefined, dsp_movec_imm, dsp_undefined, dsp_undefined,
! 341: dsp_undefined, dsp_movec_aa, dsp_undefined, dsp_movec_aa, dsp_undefined, dsp_movec_imm, dsp_undefined, dsp_undefined,
! 342: dsp_undefined, dsp_movec_ea, dsp_undefined, dsp_movec_ea, dsp_undefined, dsp_movec_imm, dsp_undefined, dsp_undefined,
! 343:
! 344: /* 0xc0 - 0xff */
! 345: dsp_do_aa, dsp_rep_aa, dsp_do_aa, dsp_rep_aa, dsp_do_imm, dsp_rep_imm, dsp_undefined, dsp_undefined,
! 346: dsp_do_ea, dsp_rep_ea, dsp_do_ea, dsp_rep_ea, dsp_do_imm, dsp_rep_imm, dsp_undefined, dsp_undefined,
! 347: dsp_undefined, dsp_undefined, dsp_undefined, dsp_undefined, dsp_do_imm, dsp_rep_imm, dsp_undefined, dsp_undefined,
! 348: dsp_do_reg, dsp_rep_reg, dsp_undefined, dsp_undefined, dsp_do_imm, dsp_rep_imm, dsp_undefined, dsp_undefined,
! 349: dsp_movem_aa, dsp_movem_aa, dsp_undefined, dsp_undefined, dsp_undefined, dsp_undefined, dsp_undefined, dsp_undefined,
! 350: dsp_undefined, dsp_undefined, dsp_undefined, dsp_undefined, dsp_movem_ea, dsp_movem_ea, dsp_undefined, dsp_undefined,
! 351: dsp_movem_aa, dsp_movem_aa, dsp_undefined, dsp_undefined, dsp_undefined, dsp_undefined, dsp_undefined, dsp_undefined,
! 352: dsp_undefined, dsp_undefined, dsp_undefined, dsp_undefined, dsp_movem_ea, dsp_movem_ea, dsp_undefined, dsp_undefined,
! 353:
! 354: /* 0x100 - 0x13f */
! 355: dsp_pm_class2, dsp_pm_class2, dsp_pm_class2, dsp_pm_class2, dsp_pm_class2, dsp_pm_class2, dsp_pm_class2, dsp_pm_class2,
! 356: dsp_movep_0, dsp_movep_0, dsp_movep_1, dsp_movep_1, dsp_movep_23, dsp_movep_23, dsp_movep_23, dsp_movep_23,
! 357: dsp_pm_class2, dsp_pm_class2, dsp_pm_class2, dsp_pm_class2, dsp_pm_class2, dsp_pm_class2, dsp_pm_class2, dsp_pm_class2,
! 358: dsp_movep_0, dsp_movep_0, dsp_movep_1, dsp_movep_1, dsp_movep_23, dsp_movep_23, dsp_movep_23, dsp_movep_23,
! 359: dsp_pm_class2, dsp_pm_class2, dsp_pm_class2, dsp_pm_class2, dsp_pm_class2, dsp_pm_class2, dsp_pm_class2, dsp_pm_class2,
! 360: dsp_movep_0, dsp_movep_0, dsp_movep_1, dsp_movep_1, dsp_movep_23, dsp_movep_23, dsp_movep_23, dsp_movep_23,
! 361: dsp_pm_class2, dsp_pm_class2, dsp_pm_class2, dsp_pm_class2, dsp_pm_class2, dsp_pm_class2, dsp_pm_class2, dsp_pm_class2,
! 362: dsp_movep_0, dsp_movep_0, dsp_movep_1, dsp_movep_1, dsp_movep_23, dsp_movep_23, dsp_movep_23, dsp_movep_23,
! 363:
! 364: /* 0x140 - 0x17f */
! 365: dsp_bclr_aa, dsp_bset_aa, dsp_bclr_aa, dsp_bset_aa, dsp_jclr_aa, dsp_jset_aa, dsp_jclr_aa, dsp_jset_aa,
! 366: dsp_bclr_ea, dsp_bset_ea, dsp_bclr_ea, dsp_bset_ea, dsp_jclr_ea, dsp_jset_ea, dsp_jclr_ea, dsp_jset_ea,
! 367: dsp_bclr_pp, dsp_bset_pp, dsp_bclr_pp, dsp_bset_pp, dsp_jclr_pp, dsp_jset_pp, dsp_jclr_pp, dsp_jset_pp,
! 368: dsp_jclr_reg, dsp_jset_reg, dsp_bclr_reg, dsp_bset_reg, dsp_jmp_ea, dsp_jcc_ea, dsp_undefined, dsp_undefined,
! 369: dsp_bchg_aa, dsp_btst_aa, dsp_bchg_aa, dsp_btst_aa, dsp_jsclr_aa, dsp_jsset_aa, dsp_jsclr_aa, dsp_jsset_aa,
! 370: dsp_bchg_ea, dsp_btst_ea, dsp_bchg_ea, dsp_btst_ea, dsp_jsclr_ea, dsp_jsset_ea, dsp_jsclr_ea, dsp_jsset_ea,
! 371: dsp_bchg_pp, dsp_btst_pp, dsp_bchg_pp, dsp_btst_pp, dsp_jsclr_pp, dsp_jsset_pp, dsp_jsclr_pp, dsp_jsset_pp,
! 372: dsp_jsclr_reg, dsp_jsset_reg, dsp_bchg_reg, dsp_btst_reg, dsp_jsr_ea, dsp_jscc_ea, dsp_undefined, dsp_undefined,
! 373:
! 374: /* 0x180 - 0x1bf */
! 375: dsp_jmp_imm, dsp_jmp_imm, dsp_jmp_imm, dsp_jmp_imm, dsp_jmp_imm, dsp_jmp_imm, dsp_jmp_imm, dsp_jmp_imm,
! 376: dsp_undefined, dsp_undefined, dsp_undefined, dsp_undefined, dsp_undefined, dsp_undefined, dsp_undefined, dsp_undefined,
! 377: dsp_undefined, dsp_undefined, dsp_undefined, dsp_undefined, dsp_undefined, dsp_undefined, dsp_undefined, dsp_undefined,
! 378: dsp_undefined, dsp_undefined, dsp_undefined, dsp_undefined, dsp_undefined, dsp_undefined, dsp_undefined, dsp_undefined,
! 379: dsp_jsr_imm, dsp_jsr_imm, dsp_jsr_imm, dsp_jsr_imm, dsp_jsr_imm, dsp_jsr_imm, dsp_jsr_imm, dsp_jsr_imm,
! 380: dsp_undefined, dsp_undefined, dsp_undefined, dsp_undefined, dsp_undefined, dsp_undefined, dsp_undefined, dsp_undefined,
! 381: dsp_undefined, dsp_undefined, dsp_undefined, dsp_undefined, dsp_undefined, dsp_undefined, dsp_undefined, dsp_undefined,
! 382: dsp_undefined, dsp_undefined, dsp_undefined, dsp_undefined, dsp_undefined, dsp_undefined, dsp_undefined, dsp_undefined,
! 383:
! 384: /* 0x1c0 - 0x1ff */
! 385: dsp_jcc_imm, dsp_jcc_imm, dsp_jcc_imm, dsp_jcc_imm, dsp_jcc_imm, dsp_jcc_imm, dsp_jcc_imm, dsp_jcc_imm,
! 386: dsp_jcc_imm, dsp_jcc_imm, dsp_jcc_imm, dsp_jcc_imm, dsp_jcc_imm, dsp_jcc_imm, dsp_jcc_imm, dsp_jcc_imm,
! 387: dsp_jcc_imm, dsp_jcc_imm, dsp_jcc_imm, dsp_jcc_imm, dsp_jcc_imm, dsp_jcc_imm, dsp_jcc_imm, dsp_jcc_imm,
! 388: dsp_jcc_imm, dsp_jcc_imm, dsp_jcc_imm, dsp_jcc_imm, dsp_jcc_imm, dsp_jcc_imm, dsp_jcc_imm, dsp_jcc_imm,
! 389: dsp_jscc_imm, dsp_jscc_imm, dsp_jscc_imm, dsp_jscc_imm, dsp_jscc_imm, dsp_jscc_imm, dsp_jscc_imm, dsp_jscc_imm,
! 390: dsp_jscc_imm, dsp_jscc_imm, dsp_jscc_imm, dsp_jscc_imm, dsp_jscc_imm, dsp_jscc_imm, dsp_jscc_imm, dsp_jscc_imm,
! 391: dsp_jscc_imm, dsp_jscc_imm, dsp_jscc_imm, dsp_jscc_imm, dsp_jscc_imm, dsp_jscc_imm, dsp_jscc_imm, dsp_jscc_imm,
! 392: 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 393: };
394:
1.1.1.3 ! root 395: static dsp_emul_t opcodes_alu[256]={
! 396: /* 0x00 - 0x3f */
! 397: dsp_move, dsp_tfr, dsp_addr, dsp_tst, dsp_undefined, dsp_cmp, dsp_subr, dsp_cmpm,
! 398: dsp_undefined, dsp_tfr, dsp_addr, dsp_tst, dsp_undefined, dsp_cmp, dsp_subr, dsp_cmpm,
! 399: dsp_add, dsp_rnd, dsp_addl, dsp_clr, dsp_sub, dsp_undefined, dsp_subl, dsp_not,
! 400: dsp_add, dsp_rnd, dsp_addl, dsp_clr, dsp_sub, dsp_undefined, dsp_subl, dsp_not,
! 401: dsp_add, dsp_adc, dsp_asr, dsp_lsr, dsp_sub, dsp_sbc, dsp_abs, dsp_ror,
! 402: dsp_add, dsp_adc, dsp_asr, dsp_lsr, dsp_sub, dsp_sbc, dsp_abs, dsp_ror,
! 403: dsp_add, dsp_adc, dsp_asl, dsp_lsl, dsp_sub, dsp_sbc, dsp_neg, dsp_rol,
! 404: dsp_add, dsp_adc, dsp_asl, dsp_lsl, dsp_sub, dsp_sbc, dsp_neg, dsp_rol,
! 405:
! 406: /* 0x40 - 0x7f */
! 407: dsp_add, dsp_tfr, dsp_or, dsp_eor, dsp_sub, dsp_cmp, dsp_and, dsp_cmpm,
! 408: dsp_add, dsp_tfr, dsp_or, dsp_eor, dsp_sub, dsp_cmp, dsp_and, dsp_cmpm,
! 409: dsp_add, dsp_tfr, dsp_or, dsp_eor, dsp_sub, dsp_cmp, dsp_and, dsp_cmpm,
! 410: dsp_add, dsp_tfr, dsp_or, dsp_eor, dsp_sub, dsp_cmp, dsp_and, dsp_cmpm,
! 411: dsp_add, dsp_tfr, dsp_or, dsp_eor, dsp_sub, dsp_cmp, dsp_and, dsp_cmpm,
! 412: dsp_add, dsp_tfr, dsp_or, dsp_eor, dsp_sub, dsp_cmp, dsp_and, dsp_cmpm,
! 413: dsp_add, dsp_tfr, dsp_or, dsp_eor, dsp_sub, dsp_cmp, dsp_and, dsp_cmpm,
! 414: dsp_add, dsp_tfr, dsp_or, dsp_eor, dsp_sub, dsp_cmp, dsp_and, dsp_cmpm,
! 415:
! 416: /* 0x80 - 0xbf */
! 417: dsp_mpy, dsp_mpyr, dsp_mac, dsp_macr, dsp_mpy, dsp_mpyr, dsp_mac, dsp_macr,
! 418: dsp_mpy, dsp_mpyr, dsp_mac, dsp_macr, dsp_mpy, dsp_mpyr, dsp_mac, dsp_macr,
! 419: dsp_mpy, dsp_mpyr, dsp_mac, dsp_macr, dsp_mpy, dsp_mpyr, dsp_mac, dsp_macr,
! 420: dsp_mpy, dsp_mpyr, dsp_mac, dsp_macr, dsp_mpy, dsp_mpyr, dsp_mac, dsp_macr,
! 421: dsp_mpy, dsp_mpyr, dsp_mac, dsp_macr, dsp_mpy, dsp_mpyr, dsp_mac, dsp_macr,
! 422: dsp_mpy, dsp_mpyr, dsp_mac, dsp_macr, dsp_mpy, dsp_mpyr, dsp_mac, dsp_macr,
! 423: dsp_mpy, dsp_mpyr, dsp_mac, dsp_macr, dsp_mpy, dsp_mpyr, dsp_mac, dsp_macr,
! 424: dsp_mpy, dsp_mpyr, dsp_mac, dsp_macr, dsp_mpy, dsp_mpyr, dsp_mac, dsp_macr,
! 425:
! 426: /* 0xc0 - 0xff */
! 427: dsp_mpy, dsp_mpyr, dsp_mac, dsp_macr, dsp_mpy, dsp_mpyr, dsp_mac, dsp_macr,
! 428: dsp_mpy, dsp_mpyr, dsp_mac, dsp_macr, dsp_mpy, dsp_mpyr, dsp_mac, dsp_macr,
! 429: dsp_mpy, dsp_mpyr, dsp_mac, dsp_macr, dsp_mpy, dsp_mpyr, dsp_mac, dsp_macr,
! 430: dsp_mpy, dsp_mpyr, dsp_mac, dsp_macr, dsp_mpy, dsp_mpyr, dsp_mac, dsp_macr,
! 431: dsp_mpy, dsp_mpyr, dsp_mac, dsp_macr, dsp_mpy, dsp_mpyr, dsp_mac, dsp_macr,
! 432: dsp_mpy, dsp_mpyr, dsp_mac, dsp_macr, dsp_mpy, dsp_mpyr, dsp_mac, dsp_macr,
! 433: dsp_mpy, dsp_mpyr, dsp_mac, dsp_macr, dsp_mpy, dsp_mpyr, dsp_mac, dsp_macr,
! 434: dsp_mpy, dsp_mpyr, dsp_mac, dsp_macr, dsp_mpy, dsp_mpyr, dsp_mac, dsp_macr
1.1 root 435: };
436:
437:
438: static dsp_emul_t opcodes_parmove[16]={
439: dsp_pm_0,
440: dsp_pm_1,
441: dsp_pm_2,
442: dsp_pm_2,
443: dsp_pm_4,
444: dsp_pm_4,
445: dsp_pm_4,
446: dsp_pm_4,
447:
448: dsp_pm_8,
449: dsp_pm_8,
450: dsp_pm_8,
451: dsp_pm_8,
452: dsp_pm_8,
453: dsp_pm_8,
454: dsp_pm_8,
455: dsp_pm_8
456: };
457:
458: static int registers_tcc[16][2]={
459: {DSP_REG_B,DSP_REG_A},
460: {DSP_REG_A,DSP_REG_B},
461: {DSP_REG_NULL,DSP_REG_NULL},
462: {DSP_REG_NULL,DSP_REG_NULL},
463:
464: {DSP_REG_NULL,DSP_REG_NULL},
465: {DSP_REG_NULL,DSP_REG_NULL},
466: {DSP_REG_NULL,DSP_REG_NULL},
467: {DSP_REG_NULL,DSP_REG_NULL},
468:
469: {DSP_REG_X0,DSP_REG_A},
470: {DSP_REG_X0,DSP_REG_B},
471: {DSP_REG_Y0,DSP_REG_A},
472: {DSP_REG_Y0,DSP_REG_B},
1.1.1.2 root 473:
474: {DSP_REG_X1,DSP_REG_A},
475: {DSP_REG_X1,DSP_REG_B},
1.1 root 476: {DSP_REG_Y1,DSP_REG_A},
477: {DSP_REG_Y1,DSP_REG_B}
478: };
479:
480: static const char *registers_lmove[8]={
481: "a10",
482: "b10",
483: "x",
484: "y",
485: "a",
486: "b",
487: "ab",
488: "ba"
489: };
490:
1.1.1.3 ! root 491: static int disasm_registers_lmove[8][2]={
! 492: {DSP_REG_A1,DSP_REG_A0}, /* A10 */
! 493: {DSP_REG_B1,DSP_REG_B0}, /* B10 */
! 494: {DSP_REG_X1,DSP_REG_X0}, /* X */
! 495: {DSP_REG_Y1,DSP_REG_Y0}, /* Y */
! 496: {DSP_REG_A,DSP_REG_A}, /* A */
! 497: {DSP_REG_B,DSP_REG_B}, /* B */
! 498: {DSP_REG_A,DSP_REG_B}, /* AB */
! 499: {DSP_REG_B,DSP_REG_A} /* BA */
! 500: };
! 501:
1.1 root 502: static const char *ea_names[9]={
503: "(r%d)-n%d", /* 000xxx */
504: "(r%d)+n%d", /* 001xxx */
505: "(r%d)-", /* 010xxx */
506: "(r%d)+", /* 011xxx */
507: "(r%d)", /* 100xxx */
508: "(r%d+n%d)", /* 101xxx */
509: "0x%04x", /* 110000 */
510: "-(r%d)", /* 111xxx */
511: "0x%06x" /* 110100 */
512: };
513:
514: static const char *cc_name[16]={
515: "cc",
516: "ge",
517: "ne",
518: "pl",
519: "nn",
520: "ec",
521: "lc",
522: "gt",
523:
524: "cs",
525: "lt",
526: "eq",
527: "mi",
528: "nr",
529: "es",
530: "ls",
531: "le"
532: };
533:
534: static char parallelmove_name[64];
535:
1.1.1.3 ! root 536: Uint16 dsp56k_disasm(void)
1.1 root 537: {
1.1.1.2 root 538: Uint32 value;
1.1 root 539:
1.1.1.3 ! root 540: if (prev_inst_pc == dsp_core->pc){
! 541: return 0;
! 542: }
! 543: prev_inst_pc = dsp_core->pc;
! 544:
1.1.1.2 root 545: cur_inst = read_memory(dsp_core->pc);
1.1.1.3 ! root 546: disasm_cur_inst_len = 1;
1.1 root 547:
548: strcpy(parallelmove_name, "");
549:
1.1.1.3 ! root 550: if (cur_inst < 0x100000) {
! 551: value = (cur_inst >> 11) & (BITMASK(6) << 3);
! 552: value += (cur_inst >> 5) & BITMASK(3);
1.1 root 553: opcodes8h[value]();
554: } else {
555: dsp_pm();
556: value = cur_inst & BITMASK(8);
1.1.1.3 ! root 557: opcodes_alu[value]();
! 558: }
! 559:
! 560: if (disasm_cur_inst_len == 1) {
! 561: fprintf(stderr, "%04x: %06x %s", dsp_core->pc, cur_inst, str_instr);
! 562: } else {
! 563: fprintf(stderr, "%04x: %06x %06x %s", dsp_core->pc, cur_inst, read_memory(dsp_core->pc + 1), str_instr);
1.1 root 564: }
1.1.1.3 ! root 565: return disasm_cur_inst_len;
1.1 root 566: }
567:
1.1.1.3 ! root 568: static void dsp_pm_class2(void) {
! 569: Uint32 value;
! 570:
! 571: dsp_pm();
! 572: value = cur_inst & BITMASK(8);
! 573: opcodes_alu[value]();
! 574: }
! 575:
1.1.1.2 root 576: void dsp56k_disasm_force_reg_changed(int num_dsp_reg)
577: {
578: registers_changed[num_dsp_reg]=1;
579: }
580:
581: static Uint32 read_memory(Uint32 currPc)
582: {
583: Uint32 value;
584:
585: if (currPc<0x200) {
586: value = dsp_core->ramint[DSP_SPACE_P][currPc];
587: } else {
1.1.1.3 ! root 588: value = dsp_core->ramext[currPc & (DSP_RAMSIZE-1)];
1.1.1.2 root 589: }
590:
591: return value & BITMASK(24);
592: }
593:
1.1 root 594: /**********************************
595: * Conditions code calculation
596: **********************************/
597:
1.1.1.2 root 598: static void dsp_calc_cc(Uint32 cc_mode, char *dest)
1.1 root 599: {
600: strcpy(dest, cc_name[cc_mode & BITMASK(4)]);
601: }
602:
603: /**********************************
604: * Effective address calculation
605: **********************************/
606:
1.1.1.2 root 607: static int dsp_calc_ea(Uint32 ea_mode, char *dest)
1.1 root 608: {
609: int value, retour, numreg;
610:
611: value = (ea_mode >> 3) & BITMASK(3);
612: numreg = ea_mode & BITMASK(3);
613: retour = 0;
614: switch (value) {
615: case 0:
616: /* (Rx)-Nx */
617: sprintf(dest, ea_names[value], numreg, numreg);
618: registers_changed[DSP_REG_R0+numreg]=1;
619: break;
620: case 1:
621: /* (Rx)+Nx */
622: sprintf(dest, ea_names[value], numreg, numreg);
623: registers_changed[DSP_REG_R0+numreg]=1;
624: break;
625: case 5:
626: /* (Rx+Nx) */
627: sprintf(dest, ea_names[value], numreg, numreg);
628: break;
629: case 2:
630: /* (Rx)- */
631: sprintf(dest, ea_names[value], numreg);
632: registers_changed[DSP_REG_R0+numreg]=1;
633: break;
634: case 3:
635: /* (Rx)+ */
636: sprintf(dest, ea_names[value], numreg);
637: registers_changed[DSP_REG_R0+numreg]=1;
638: break;
639: case 4:
640: /* (Rx) */
641: sprintf(dest, ea_names[value], numreg);
642: break;
643: case 7:
644: /* -(Rx) */
645: sprintf(dest, ea_names[value], numreg);
646: registers_changed[DSP_REG_R0+numreg]=1;
647: break;
648: case 6:
1.1.1.3 ! root 649: disasm_cur_inst_len++;
1.1 root 650: switch ((ea_mode >> 2) & 1) {
651: case 0:
652: /* Absolute address */
1.1.1.2 root 653: sprintf(dest, ea_names[value], read_memory(dsp_core->pc+1));
1.1 root 654: break;
655: case 1:
656: /* Immediate value */
1.1.1.2 root 657: sprintf(dest, ea_names[8], read_memory(dsp_core->pc+1));
1.1 root 658: retour = 1;
659: break;
660: }
661: break;
662: }
663: return retour;
664: }
665:
666: static void opcode8h_0(void)
667: {
1.1.1.3 ! root 668: switch(cur_inst) {
! 669: case 0x000000:
! 670: dsp_nop();
1.1 root 671: break;
1.1.1.3 ! root 672: case 0x000004:
! 673: dsp_rti();
1.1 root 674: break;
1.1.1.3 ! root 675: case 0x000005:
! 676: dsp_illegal();
1.1 root 677: break;
1.1.1.3 ! root 678: case 0x000006:
! 679: dsp_swi();
! 680: break;
! 681: case 0x00000c:
! 682: dsp_rts();
! 683: break;
! 684: case 0x000084:
! 685: dsp_reset();
! 686: break;
! 687: case 0x000086:
! 688: dsp_wait();
! 689: break;
! 690: case 0x000087:
! 691: dsp_stop();
! 692: break;
! 693: case 0x00008c:
! 694: dsp_enddo();
1.1 root 695: break;
696: }
697: }
698:
699: /**********************************
700: * Non-parallel moves instructions
701: **********************************/
702:
703: static void dsp_undefined(void)
704: {
1.1.1.3 ! root 705: sprintf(str_instr," 0x%06x unknown instruction\n", cur_inst);
1.1 root 706: }
707:
708: static void dsp_andi(void)
709: {
710: const char *regname;
711:
712: switch(cur_inst & BITMASK(2)) {
713: case 0:
714: regname="mr";
715: registers_changed[DSP_REG_SR]=1;
716: break;
717: case 1:
718: regname="ccr";
719: registers_changed[DSP_REG_SR]=1;
720: break;
721: case 2:
722: regname="omr";
723: registers_changed[DSP_REG_OMR]=1;
724: break;
725: default:
726: regname="";
727: break;
728: }
729:
1.1.1.2 root 730: registers_changed[DSP_REG_SR]=1;
731:
1.1.1.3 ! root 732: sprintf(str_instr," andi #0x%02x,%s\n",
1.1 root 733: (cur_inst>>8) & BITMASK(8),
734: regname
735: );
736: }
737:
1.1.1.3 ! root 738: static void dsp_bchg_aa(void)
! 739: {
! 740: /* bchg #n,x:aa */
! 741: /* bchg #n,y:aa */
! 742: char name[16];
! 743: Uint32 memspace, value, numbit;
! 744:
! 745: memspace = (cur_inst>>6) & 1;
! 746: value = (cur_inst>>8) & BITMASK(6);
! 747: numbit = cur_inst & BITMASK(5);
! 748:
! 749: if (memspace) {
! 750: sprintf(name,"y:0x%04x",value);
! 751: } else {
! 752: sprintf(name,"x:0x%04x",value);
! 753: }
! 754: registers_changed[DSP_REG_SR]=1;
! 755:
! 756: sprintf(str_instr," bchg #%d,%s\n", numbit, name);
! 757: }
! 758:
! 759: static void dsp_bchg_ea(void)
1.1 root 760: {
1.1.1.3 ! root 761: /* bchg #n,x:ea */
! 762: /* bchg #n,y:ea */
1.1 root 763: char name[16], addr_name[16];
1.1.1.2 root 764: Uint32 memspace, value, numbit;
1.1 root 765:
766: memspace = (cur_inst>>6) & 1;
767: value = (cur_inst>>8) & BITMASK(6);
768: numbit = cur_inst & BITMASK(5);
769:
1.1.1.3 ! root 770: dsp_calc_ea(value, addr_name);
! 771: if (memspace) {
! 772: sprintf(name,"y:%s",addr_name);
! 773: } else {
! 774: sprintf(name,"x:%s",addr_name);
! 775: }
! 776: registers_changed[DSP_REG_SR]=1;
! 777:
! 778: sprintf(str_instr," bchg #%d,%s\n", numbit, name);
! 779: }
! 780:
! 781: static void dsp_bchg_pp(void)
! 782: {
! 783: /* bchg #n,x:pp */
! 784: /* bchg #n,y:pp */
! 785: char name[16];
! 786: Uint32 memspace, value, numbit;
! 787:
! 788: memspace = (cur_inst>>6) & 1;
! 789: value = (cur_inst>>8) & BITMASK(6);
! 790: numbit = cur_inst & BITMASK(5);
! 791:
! 792: if (memspace) {
! 793: sprintf(name,"y:0x%04x",value+0xffc0);
! 794: } else {
! 795: sprintf(name,"x:0x%04x",value+0xffc0);
1.1 root 796: }
1.1.1.3 ! root 797: registers_changed[DSP_REG_SR]=1;
! 798:
! 799: sprintf(str_instr," bchg #%d,%s\n", numbit, name);
! 800: }
! 801:
! 802: static void dsp_bchg_reg(void)
! 803: {
! 804: /* bchg #n,R */
! 805: char name[16];
! 806: Uint32 memspace, value, numbit;
! 807:
! 808: memspace = (cur_inst>>6) & 1;
! 809: value = (cur_inst>>8) & BITMASK(6);
! 810: numbit = cur_inst & BITMASK(5);
1.1 root 811:
1.1.1.3 ! root 812: sprintf(name,"%s",registers_name[value]);
! 813: registers_changed[value]=1;
1.1.1.2 root 814: registers_changed[DSP_REG_SR]=1;
815:
1.1.1.3 ! root 816: sprintf(str_instr," bchg #%d,%s\n", numbit, name);
1.1 root 817: }
818:
1.1.1.3 ! root 819: static void dsp_bclr_aa(void)
1.1 root 820: {
1.1.1.3 ! root 821: /* bclr #n,x:aa */
! 822: /* bclr #n,y:aa */
! 823: char name[16];
1.1.1.2 root 824: Uint32 memspace, value, numbit;
1.1 root 825:
826: memspace = (cur_inst>>6) & 1;
827: value = (cur_inst>>8) & BITMASK(6);
828: numbit = cur_inst & BITMASK(5);
829:
1.1.1.3 ! root 830: if (memspace) {
! 831: sprintf(name,"y:0x%04x",value);
! 832: } else {
! 833: sprintf(name,"x:0x%04x",value);
1.1 root 834: }
835:
1.1.1.2 root 836: registers_changed[DSP_REG_SR]=1;
837:
1.1.1.3 ! root 838: sprintf(str_instr," bclr #%d,%s\n", numbit, name);
1.1 root 839: }
840:
1.1.1.3 ! root 841: static void dsp_bclr_ea(void)
1.1 root 842: {
1.1.1.3 ! root 843: /* bclr #n,x:ea */
! 844: /* bclr #n,y:ea */
1.1 root 845: char name[16], addr_name[16];
1.1.1.2 root 846: Uint32 memspace, value, numbit;
1.1 root 847:
848: memspace = (cur_inst>>6) & 1;
849: value = (cur_inst>>8) & BITMASK(6);
850: numbit = cur_inst & BITMASK(5);
851:
1.1.1.3 ! root 852: dsp_calc_ea(value, addr_name);
! 853: if (memspace) {
! 854: sprintf(name,"y:%s",addr_name);
! 855: } else {
! 856: sprintf(name,"x:%s",addr_name);
1.1 root 857: }
858:
1.1.1.2 root 859: registers_changed[DSP_REG_SR]=1;
860:
1.1.1.3 ! root 861: sprintf(str_instr," bclr #%d,%s\n", numbit, name);
1.1 root 862: }
863:
1.1.1.3 ! root 864: static void dsp_bclr_pp(void)
1.1 root 865: {
1.1.1.3 ! root 866: /* bclr #n,x:pp */
! 867: /* bclr #n,y:pp */
! 868: char name[16];
1.1.1.2 root 869: Uint32 memspace, value, numbit;
1.1 root 870:
871: memspace = (cur_inst>>6) & 1;
872: value = (cur_inst>>8) & BITMASK(6);
873: numbit = cur_inst & BITMASK(5);
874:
1.1.1.3 ! root 875: if (memspace) {
! 876: sprintf(name,"y:0x%04x",value+0xffc0);
! 877: } else {
! 878: sprintf(name,"x:0x%04x",value+0xffc0);
1.1 root 879: }
880:
1.1.1.2 root 881: registers_changed[DSP_REG_SR]=1;
882:
1.1.1.3 ! root 883: sprintf(str_instr," bclr #%d,%s\n", numbit, name);
1.1 root 884: }
885:
1.1.1.3 ! root 886: static void dsp_bclr_reg(void)
1.1 root 887: {
1.1.1.3 ! root 888: /* bclr #n,R */
! 889: char name[16];
! 890: Uint32 memspace, value, numbit;
1.1 root 891:
1.1.1.3 ! root 892: memspace = (cur_inst>>6) & 1;
! 893: value = (cur_inst>>8) & BITMASK(6);
! 894: numbit = cur_inst & BITMASK(5);
! 895:
! 896: sprintf(name,"%s",registers_name[value]);
! 897: registers_changed[value]=1;
! 898:
! 899: registers_changed[DSP_REG_SR]=1;
! 900:
! 901: sprintf(str_instr," bclr #%d,%s\n", numbit, name);
! 902: }
! 903:
! 904: static void dsp_bset_aa(void)
! 905: {
! 906: /* bset #n,x:aa */
! 907: /* bset #n,y:aa */
! 908: char name[16];
! 909: Uint32 memspace, value, numbit;
! 910:
! 911: memspace = (cur_inst>>6) & 1;
! 912: value = (cur_inst>>8) & BITMASK(6);
! 913: numbit = cur_inst & BITMASK(5);
! 914:
! 915: if (memspace) {
! 916: sprintf(name,"y:0x%04x",value);
! 917: } else {
! 918: sprintf(name,"x:0x%04x",value);
1.1 root 919: }
1.1.1.3 ! root 920:
! 921: registers_changed[DSP_REG_SR]=1;
! 922:
! 923: sprintf(str_instr," bset #%d,%s\n", numbit, name);
! 924: }
! 925:
! 926: static void dsp_bset_ea(void)
! 927: {
! 928: /* bset #n,x:ea */
! 929: /* bset #n,y:ea */
! 930: char name[16], addr_name[16];
! 931: Uint32 memspace, value, numbit;
! 932:
! 933: memspace = (cur_inst>>6) & 1;
! 934: value = (cur_inst>>8) & BITMASK(6);
! 935: numbit = cur_inst & BITMASK(5);
! 936:
! 937: dsp_calc_ea(value, addr_name);
! 938: if (memspace) {
! 939: sprintf(name,"y:%s",addr_name);
! 940: } else {
! 941: sprintf(name,"x:%s",addr_name);
! 942: }
! 943:
1.1.1.2 root 944: registers_changed[DSP_REG_SR]=1;
1.1 root 945:
1.1.1.3 ! root 946: sprintf(str_instr," bset #%d,%s\n", numbit, name);
! 947: }
! 948:
! 949: static void dsp_bset_pp(void)
! 950: {
! 951: /* bset #n,x:pp */
! 952: /* bset #n,y:pp */
! 953: char name[16];
! 954: Uint32 memspace, value, numbit;
! 955:
! 956: memspace = (cur_inst>>6) & 1;
! 957: value = (cur_inst>>8) & BITMASK(6);
! 958: numbit = cur_inst & BITMASK(5);
! 959:
! 960: if (memspace) {
! 961: sprintf(name,"y:0x%04x",value+0xffc0);
! 962: } else {
! 963: sprintf(name,"x:0x%04x",value+0xffc0);
! 964: }
! 965:
! 966: registers_changed[DSP_REG_SR]=1;
! 967:
! 968: sprintf(str_instr," bset #%d,%s\n", numbit, name);
! 969: }
! 970:
! 971: static void dsp_bset_reg(void)
! 972: {
! 973: /* bset #n,R */
! 974: char name[16];
! 975: Uint32 memspace, value, numbit;
! 976:
! 977: memspace = (cur_inst>>6) & 1;
! 978: value = (cur_inst>>8) & BITMASK(6);
! 979: numbit = cur_inst & BITMASK(5);
! 980:
! 981: sprintf(name,"%s",registers_name[value]);
! 982: registers_changed[value]=1;
! 983:
! 984: registers_changed[DSP_REG_SR]=1;
! 985:
! 986: sprintf(str_instr," bset #%d,%s\n", numbit, name);
! 987: }
! 988:
! 989: static void dsp_btst_aa(void)
! 990: {
! 991: /* btst #n,x:aa */
! 992: /* btst #n,y:aa */
! 993: char name[16];
! 994: Uint32 memspace, value, numbit;
! 995:
! 996: memspace = (cur_inst>>6) & 1;
! 997: value = (cur_inst>>8) & BITMASK(6);
! 998: numbit = cur_inst & BITMASK(5);
! 999:
! 1000: if (memspace) {
! 1001: sprintf(name,"y:0x%04x",value);
! 1002: } else {
! 1003: sprintf(name,"x:0x%04x",value);
! 1004: }
! 1005:
! 1006: registers_changed[DSP_REG_SR]=1;
! 1007:
! 1008: sprintf(str_instr," btst #%d,%s\n", numbit, name);
! 1009: }
! 1010:
! 1011: static void dsp_btst_ea(void)
! 1012: {
! 1013: /* btst #n,x:ea */
! 1014: /* btst #n,y:ea */
! 1015: char name[16], addr_name[16];
! 1016: Uint32 memspace, value, numbit;
! 1017:
! 1018: memspace = (cur_inst>>6) & 1;
! 1019: value = (cur_inst>>8) & BITMASK(6);
! 1020: numbit = cur_inst & BITMASK(5);
! 1021:
! 1022: dsp_calc_ea(value, addr_name);
! 1023: if (memspace) {
! 1024: sprintf(name,"y:%s",addr_name);
! 1025: } else {
! 1026: sprintf(name,"x:%s",addr_name);
! 1027: }
! 1028:
! 1029: registers_changed[DSP_REG_SR]=1;
! 1030:
! 1031: sprintf(str_instr," btst #%d,%s\n", numbit, name);
! 1032: }
! 1033:
! 1034: static void dsp_btst_pp(void)
! 1035: {
! 1036: /* btst #n,x:pp */
! 1037: /* btst #n,y:pp */
! 1038: char name[16];
! 1039: Uint32 memspace, value, numbit;
! 1040:
! 1041: memspace = (cur_inst>>6) & 1;
! 1042: value = (cur_inst>>8) & BITMASK(6);
! 1043: numbit = cur_inst & BITMASK(5);
! 1044:
! 1045: if (memspace) {
! 1046: sprintf(name,"y:0x%04x",value+0xffc0);
! 1047: } else {
! 1048: sprintf(name,"x:0x%04x",value+0xffc0);
! 1049: }
! 1050:
! 1051: registers_changed[DSP_REG_SR]=1;
! 1052:
! 1053: sprintf(str_instr," btst #%d,%s\n", numbit, name);
! 1054: }
! 1055:
! 1056: static void dsp_btst_reg(void)
! 1057: {
! 1058: /* btst #n,R */
! 1059: char name[16];
! 1060: Uint32 memspace, value, numbit;
! 1061:
! 1062: memspace = (cur_inst>>6) & 1;
! 1063: value = (cur_inst>>8) & BITMASK(6);
! 1064: numbit = cur_inst & BITMASK(5);
! 1065:
! 1066: sprintf(name,"%s",registers_name[value]);
! 1067: registers_changed[value]=1;
! 1068:
! 1069: registers_changed[DSP_REG_SR]=1;
! 1070:
! 1071: sprintf(str_instr," btst #%d,%s\n", numbit, name);
! 1072: }
! 1073:
! 1074: static void dsp_div(void)
! 1075: {
! 1076: Uint32 srcreg=DSP_REG_NULL, destreg;
! 1077:
! 1078: switch((cur_inst>>4) & BITMASK(2)) {
! 1079: case 0:
! 1080: srcreg = DSP_REG_X0;
! 1081: break;
! 1082: case 1:
! 1083: srcreg = DSP_REG_Y0;
! 1084: break;
! 1085: case 2:
! 1086: srcreg = DSP_REG_X1;
! 1087: break;
! 1088: case 3:
! 1089: srcreg = DSP_REG_Y1;
! 1090: break;
! 1091: }
! 1092: destreg = DSP_REG_A+((cur_inst>>3) & 1);
! 1093: registers_changed[destreg]=1;
! 1094: registers_changed[DSP_REG_SR]=1;
! 1095:
! 1096: sprintf(str_instr," div %s,%s\n", registers_name[srcreg],registers_name[destreg]);
! 1097: }
! 1098:
! 1099: static void dsp_do_aa(void)
! 1100: {
! 1101: char name[16];
! 1102:
! 1103: disasm_cur_inst_len++;
! 1104:
! 1105: if (cur_inst & (1<<6)) {
! 1106: sprintf(name, "y:0x%04x", (cur_inst>>8) & BITMASK(6));
! 1107: } else {
! 1108: sprintf(name, "x:0x%04x", (cur_inst>>8) & BITMASK(6));
! 1109: }
! 1110:
! 1111: sprintf(str_instr," do %s,p:0x%04x\n",
! 1112: name,
! 1113: read_memory(dsp_core->pc+1)
! 1114: );
! 1115: registers_changed[DSP_REG_LA]=1;
! 1116: registers_changed[DSP_REG_LC]=1;
! 1117: registers_changed[DSP_REG_SR]=1;}
! 1118:
! 1119: static void dsp_do_imm(void)
! 1120: {
! 1121: disasm_cur_inst_len++;
! 1122:
! 1123: sprintf(str_instr," do #0x%04x,p:0x%04x\n",
! 1124: ((cur_inst>>8) & BITMASK(8))|((cur_inst & BITMASK(4))<<8),
! 1125: read_memory(dsp_core->pc+1)
! 1126: );
! 1127: registers_changed[DSP_REG_LA]=1;
! 1128: registers_changed[DSP_REG_LC]=1;
! 1129: registers_changed[DSP_REG_SR]=1;}
! 1130:
! 1131: static void dsp_do_ea(void)
! 1132: {
! 1133: char addr_name[16], name[16];
! 1134: Uint32 ea_mode;
! 1135:
! 1136: disasm_cur_inst_len++;
! 1137:
! 1138: ea_mode = (cur_inst>>8) & BITMASK(6);
! 1139: dsp_calc_ea(ea_mode, addr_name);
! 1140:
! 1141: if (cur_inst & (1<<6)) {
! 1142: sprintf(name, "y:%s", addr_name);
! 1143: } else {
! 1144: sprintf(name, "x:%s", addr_name);
! 1145: }
! 1146:
! 1147: sprintf(str_instr," do %s,p:0x%04x\n",
! 1148: name,
! 1149: read_memory(dsp_core->pc+1)
! 1150: );
! 1151: registers_changed[DSP_REG_LA]=1;
! 1152: registers_changed[DSP_REG_LC]=1;
! 1153: registers_changed[DSP_REG_SR]=1;}
! 1154:
! 1155: static void dsp_do_reg(void)
! 1156: {
! 1157: disasm_cur_inst_len++;
! 1158:
! 1159: sprintf(str_instr," do %s,p:0x%04x\n",
! 1160: registers_name[(cur_inst>>8) & BITMASK(6)],
! 1161: read_memory(dsp_core->pc+1)
! 1162: );
! 1163: registers_changed[DSP_REG_LA]=1;
! 1164: registers_changed[DSP_REG_LC]=1;
! 1165: registers_changed[DSP_REG_SR]=1;}
! 1166:
! 1167: static void dsp_enddo(void)
! 1168: {
! 1169: sprintf(str_instr," enddo\n");
! 1170: }
! 1171:
! 1172: static void dsp_illegal(void)
! 1173: {
! 1174: sprintf(str_instr," illegal\n");
! 1175: }
! 1176:
! 1177: static void dsp_jcc_ea(void)
! 1178: {
! 1179: char cond_name[16], addr_name[16];
! 1180: Uint32 cc_code=0;
! 1181:
! 1182: dsp_calc_ea((cur_inst >>8) & BITMASK(6), addr_name);
! 1183: cc_code=cur_inst & BITMASK(4);
! 1184: dsp_calc_cc(cc_code, cond_name);
! 1185:
! 1186: sprintf(str_instr," j%s p:%s\n", cond_name, addr_name);
! 1187: }
! 1188:
! 1189: static void dsp_jcc_imm(void)
! 1190: {
! 1191: char cond_name[16], addr_name[16];
! 1192: Uint32 cc_code=0;
! 1193:
! 1194: sprintf(addr_name, "0x%04x", cur_inst & BITMASK(12));
! 1195: cc_code=(cur_inst>>12) & BITMASK(4);
! 1196: dsp_calc_cc(cc_code, cond_name);
! 1197:
! 1198: sprintf(str_instr," j%s p:%s\n", cond_name, addr_name);
! 1199: }
! 1200:
! 1201: static void dsp_jclr_aa(void)
! 1202: {
! 1203: /* jclr #n,x:aa,p:xx */
! 1204: /* jclr #n,y:aa,p:xx */
! 1205: char srcname[16];
! 1206: Uint32 memspace, value, numbit;
! 1207:
! 1208: disasm_cur_inst_len++;
! 1209:
! 1210: memspace = (cur_inst>>6) & 1;
! 1211: value = (cur_inst>>8) & BITMASK(6);
! 1212: numbit = cur_inst & BITMASK(5);
! 1213:
! 1214: if (memspace) {
! 1215: sprintf(srcname, "y:0x%04x", value);
! 1216: } else {
! 1217: sprintf(srcname, "x:0x%04x", value);
! 1218: }
! 1219:
! 1220: sprintf(str_instr," jclr #%d,%s,p:0x%04x\n",
! 1221: numbit,
! 1222: srcname,
! 1223: read_memory(dsp_core->pc+1)
! 1224: );
! 1225: }
! 1226:
! 1227: static void dsp_jclr_ea(void)
! 1228: {
! 1229: /* jclr #n,x:ea,p:xx */
! 1230: /* jclr #n,y:ea,p:xx */
! 1231: char srcname[16], addr_name[16];
! 1232: Uint32 memspace, value, numbit;
! 1233:
! 1234: disasm_cur_inst_len++;
! 1235:
! 1236: memspace = (cur_inst>>6) & 1;
! 1237: value = (cur_inst>>8) & BITMASK(6);
! 1238: numbit = cur_inst & BITMASK(5);
! 1239:
! 1240: dsp_calc_ea(value, addr_name);
! 1241: if (memspace) {
! 1242: sprintf(srcname, "y:%s", addr_name);
! 1243: } else {
! 1244: sprintf(srcname, "x:%s", addr_name);
! 1245: }
! 1246:
! 1247: sprintf(str_instr," jclr #%d,%s,p:0x%04x\n",
! 1248: numbit,
! 1249: srcname,
! 1250: read_memory(dsp_core->pc+1)
! 1251: );
! 1252: }
! 1253:
! 1254: static void dsp_jclr_pp(void)
! 1255: {
! 1256: /* jclr #n,x:pp,p:xx */
! 1257: /* jclr #n,y:pp,p:xx */
! 1258: char srcname[16];
! 1259: Uint32 memspace, value, numbit;
! 1260:
! 1261: disasm_cur_inst_len++;
! 1262:
! 1263: memspace = (cur_inst>>6) & 1;
! 1264: value = (cur_inst>>8) & BITMASK(6);
! 1265: numbit = cur_inst & BITMASK(5);
! 1266:
! 1267: value += 0xffc0;
! 1268: if (memspace) {
! 1269: sprintf(srcname, "y:0x%04x", value);
! 1270: } else {
! 1271: sprintf(srcname, "x:0x%04x", value);
! 1272: }
! 1273:
! 1274: sprintf(str_instr," jclr #%d,%s,p:0x%04x\n",
! 1275: numbit,
! 1276: srcname,
! 1277: read_memory(dsp_core->pc+1)
! 1278: );
! 1279: }
! 1280:
! 1281: static void dsp_jclr_reg(void)
! 1282: {
! 1283: /* jclr #n,R,p:xx */
! 1284: char srcname[16];
! 1285: Uint32 memspace, value, numbit;
! 1286:
! 1287: disasm_cur_inst_len++;
! 1288:
! 1289: memspace = (cur_inst>>6) & 1;
! 1290: value = (cur_inst>>8) & BITMASK(6);
! 1291: numbit = cur_inst & BITMASK(5);
! 1292:
! 1293: strcpy(srcname, registers_name[value]);
! 1294:
! 1295: sprintf(str_instr," jclr #%d,%s,p:0x%04x\n",
! 1296: numbit,
! 1297: srcname,
! 1298: read_memory(dsp_core->pc+1)
! 1299: );
! 1300: }
! 1301:
! 1302: static void dsp_jmp_imm(void)
! 1303: {
! 1304: char dstname[16];
! 1305:
! 1306: sprintf(dstname, "0x%04x", cur_inst & BITMASK(12));
! 1307:
! 1308: sprintf(str_instr," jmp p:%s\n", dstname);
! 1309: }
! 1310:
! 1311: static void dsp_jmp_ea(void)
! 1312: {
! 1313: char dstname[16];
! 1314:
! 1315: dsp_calc_ea((cur_inst >>8) & BITMASK(6), dstname);
! 1316:
! 1317: sprintf(str_instr," jmp p:%s\n", dstname);
! 1318: }
! 1319:
! 1320: static void dsp_jscc_ea(void)
! 1321: {
! 1322: char cond_name[16], addr_name[16];
! 1323: Uint32 cc_code=0;
! 1324:
! 1325: dsp_calc_ea((cur_inst>>8) & BITMASK(6), addr_name);
! 1326: cc_code=cur_inst & BITMASK(4);
! 1327: dsp_calc_cc(cc_code, cond_name);
! 1328:
! 1329: sprintf(str_instr," js%s p:%s\n", cond_name, addr_name);
! 1330: }
! 1331:
! 1332: static void dsp_jscc_imm(void)
! 1333: {
! 1334: char cond_name[16], addr_name[16];
! 1335: Uint32 cc_code=0;
! 1336:
! 1337: sprintf(addr_name, "0x%04x", cur_inst & BITMASK(12));
! 1338: cc_code=(cur_inst>>12) & BITMASK(4);
! 1339: dsp_calc_cc(cc_code, cond_name);
! 1340:
! 1341: sprintf(str_instr," js%s p:%s\n", cond_name, addr_name);
! 1342: }
! 1343:
! 1344: static void dsp_jsclr_aa(void)
! 1345: {
! 1346: /* jsclr #n,x:aa,p:xx */
! 1347: /* jsclr #n,y:aa,p:xx */
! 1348: char srcname[16];
! 1349: Uint32 memspace, value, numbit;
! 1350:
! 1351: disasm_cur_inst_len++;
! 1352:
! 1353: memspace = (cur_inst>>6) & 1;
! 1354: value = (cur_inst>>8) & BITMASK(6);
! 1355: numbit = cur_inst & BITMASK(5);
! 1356:
! 1357: if (memspace) {
! 1358: sprintf(srcname, "y:0x%04x", value);
! 1359: } else {
! 1360: sprintf(srcname, "x:0x%04x", value);
! 1361: }
! 1362:
! 1363: sprintf(str_instr," jsclr #%d,%s,p:0x%04x\n",
! 1364: numbit,
! 1365: srcname,
! 1366: read_memory(dsp_core->pc+1)
! 1367: );
! 1368: }
! 1369:
! 1370: static void dsp_jsclr_ea(void)
! 1371: {
! 1372: /* jsclr #n,x:ea,p:xx */
! 1373: /* jsclr #n,y:ea,p:xx */
! 1374: char srcname[16], addr_name[16];
! 1375: Uint32 memspace, value, numbit;
! 1376:
! 1377: disasm_cur_inst_len++;
! 1378:
! 1379: memspace = (cur_inst>>6) & 1;
! 1380: value = (cur_inst>>8) & BITMASK(6);
! 1381: numbit = cur_inst & BITMASK(5);
! 1382:
! 1383: dsp_calc_ea(value, addr_name);
! 1384: if (memspace) {
! 1385: sprintf(srcname, "y:%s", addr_name);
! 1386: } else {
! 1387: sprintf(srcname, "x:%s", addr_name);
! 1388: }
! 1389:
! 1390: sprintf(str_instr," jsclr #%d,%s,p:0x%04x\n",
! 1391: numbit,
! 1392: srcname,
! 1393: read_memory(dsp_core->pc+1)
! 1394: );
1.1 root 1395: }
1396:
1.1.1.3 ! root 1397: static void dsp_jsclr_pp(void)
1.1 root 1398: {
1.1.1.3 ! root 1399: /* jsclr #n,x:pp,p:xx */
! 1400: /* jsclr #n,y:pp,p:xx */
! 1401: char srcname[16];
! 1402: Uint32 memspace, value, numbit;
1.1 root 1403:
1.1.1.3 ! root 1404: disasm_cur_inst_len++;
1.1 root 1405:
1.1.1.3 ! root 1406: memspace = (cur_inst>>6) & 1;
! 1407: value = (cur_inst>>8) & BITMASK(6);
! 1408: numbit = cur_inst & BITMASK(5);
1.1 root 1409:
1.1.1.3 ! root 1410: value += 0xffc0;
! 1411: if (memspace) {
! 1412: sprintf(srcname, "y:0x%04x", value);
1.1 root 1413: } else {
1.1.1.3 ! root 1414: sprintf(srcname, "x:0x%04x", value);
1.1 root 1415: }
1416:
1.1.1.3 ! root 1417: sprintf(str_instr," jsclr #%d,%s,p:0x%04x\n",
! 1418: numbit,
! 1419: srcname,
1.1.1.2 root 1420: read_memory(dsp_core->pc+1)
1.1 root 1421: );
1422: }
1423:
1.1.1.3 ! root 1424: static void dsp_jsclr_reg(void)
1.1 root 1425: {
1.1.1.3 ! root 1426: /* jsclr #n,R,p:xx */
! 1427: char srcname[16];
! 1428: Uint32 memspace, value, numbit;
! 1429:
! 1430: disasm_cur_inst_len++;
! 1431:
! 1432: memspace = (cur_inst>>6) & 1;
! 1433: value = (cur_inst>>8) & BITMASK(6);
! 1434: numbit = cur_inst & BITMASK(5);
! 1435:
! 1436: strcpy(srcname, registers_name[value]);
! 1437:
! 1438: sprintf(str_instr," jsclr #%d,%s,p:0x%04x\n",
! 1439: numbit,
! 1440: srcname,
1.1.1.2 root 1441: read_memory(dsp_core->pc+1)
1.1 root 1442: );
1443: }
1444:
1.1.1.3 ! root 1445: static void dsp_jset_aa(void)
1.1 root 1446: {
1.1.1.3 ! root 1447: /* jset #n,x:aa,p:xx */
! 1448: /* jset #n,y:aa,p:xx */
! 1449: char srcname[16];
! 1450: Uint32 memspace, value, numbit;
1.1 root 1451:
1.1.1.3 ! root 1452: disasm_cur_inst_len++;
1.1 root 1453:
1.1.1.3 ! root 1454: memspace = (cur_inst>>6) & 1;
! 1455: value = (cur_inst>>8) & BITMASK(6);
! 1456: numbit = cur_inst & BITMASK(5);
! 1457:
! 1458: if (memspace) {
! 1459: sprintf(srcname, "y:0x%04x", value);
1.1 root 1460: } else {
1.1.1.3 ! root 1461: sprintf(srcname, "x:0x%04x", value);
1.1 root 1462: }
1463:
1.1.1.3 ! root 1464: sprintf(str_instr," jset #%d,%s,p:0x%04x\n",
! 1465: numbit,
! 1466: srcname,
1.1.1.2 root 1467: read_memory(dsp_core->pc+1)
1.1 root 1468: );
1469: }
1470:
1.1.1.3 ! root 1471: static void dsp_jset_ea(void)
1.1 root 1472: {
1.1.1.3 ! root 1473: /* jset #n,x:ea,p:xx */
! 1474: /* jset #n,y:ea,p:xx */
! 1475: char srcname[16], addr_name[16];
! 1476: Uint32 memspace, value, numbit;
! 1477:
! 1478: disasm_cur_inst_len++;
! 1479:
! 1480: memspace = (cur_inst>>6) & 1;
! 1481: value = (cur_inst>>8) & BITMASK(6);
! 1482: numbit = cur_inst & BITMASK(5);
! 1483:
! 1484: dsp_calc_ea(value, addr_name);
! 1485: if (memspace) {
! 1486: sprintf(srcname, "y:%s", addr_name);
! 1487: } else {
! 1488: sprintf(srcname, "x:%s", addr_name);
! 1489: }
! 1490:
! 1491: sprintf(str_instr," jset #%d,%s,p:0x%04x\n",
! 1492: numbit,
! 1493: srcname,
1.1.1.2 root 1494: read_memory(dsp_core->pc+1)
1.1 root 1495: );
1496: }
1497:
1.1.1.3 ! root 1498: static void dsp_jset_pp(void)
1.1 root 1499: {
1.1.1.3 ! root 1500: /* jset #n,x:pp,p:xx */
! 1501: /* jset #n,y:pp,p:xx */
! 1502: char srcname[16];
! 1503: Uint32 memspace, value, numbit;
! 1504:
! 1505: disasm_cur_inst_len++;
1.1 root 1506:
1.1.1.3 ! root 1507: memspace = (cur_inst>>6) & 1;
! 1508: value = (cur_inst>>8) & BITMASK(6);
! 1509: numbit = cur_inst & BITMASK(5);
1.1 root 1510:
1.1.1.3 ! root 1511: value += 0xffc0;
! 1512: if (memspace) {
! 1513: sprintf(srcname, "y:0x%04x", value);
! 1514: } else {
! 1515: sprintf(srcname, "x:0x%04x", value);
1.1 root 1516: }
1517:
1.1.1.3 ! root 1518: sprintf(str_instr," jset #%d,%s,p:0x%04x\n",
! 1519: numbit,
! 1520: srcname,
! 1521: read_memory(dsp_core->pc+1)
! 1522: );
1.1 root 1523: }
1524:
1.1.1.3 ! root 1525: static void dsp_jset_reg(void)
1.1 root 1526: {
1.1.1.3 ! root 1527: /* jset #n,R,p:xx */
! 1528: char srcname[16];
1.1.1.2 root 1529: Uint32 memspace, value, numbit;
1.1 root 1530:
1.1.1.3 ! root 1531: disasm_cur_inst_len++;
! 1532:
1.1 root 1533: memspace = (cur_inst>>6) & 1;
1534: value = (cur_inst>>8) & BITMASK(6);
1535: numbit = cur_inst & BITMASK(5);
1536:
1.1.1.3 ! root 1537: strcpy(srcname, registers_name[value]);
1.1 root 1538:
1.1.1.3 ! root 1539: sprintf(str_instr," jset #%d,%s,p:0x%04x\n",
1.1 root 1540: numbit,
1541: srcname,
1.1.1.2 root 1542: read_memory(dsp_core->pc+1)
1.1 root 1543: );
1544: }
1545:
1.1.1.3 ! root 1546: static void dsp_jsr_imm(void)
1.1 root 1547: {
1548: char dstname[16];
1549:
1.1.1.3 ! root 1550: sprintf(dstname, "0x%04x", cur_inst & BITMASK(12));
1.1 root 1551:
1.1.1.3 ! root 1552: sprintf(str_instr," jsr p:%s\n", dstname);
1.1 root 1553: }
1554:
1.1.1.3 ! root 1555: static void dsp_jsr_ea(void)
1.1 root 1556: {
1.1.1.3 ! root 1557: char dstname[16];
1.1 root 1558:
1.1.1.3 ! root 1559: dsp_calc_ea((cur_inst>>8) & BITMASK(6),dstname);
! 1560:
! 1561: sprintf(str_instr," jsr p:%s\n", dstname);
1.1 root 1562: }
1.1.1.3 ! root 1563:
! 1564: static void dsp_jsset_aa(void)
1.1 root 1565: {
1.1.1.3 ! root 1566: /* jsset #n,x:aa,p:xx */
! 1567: /* jsset #n,y:aa,p:xx */
! 1568: char srcname[16];
1.1.1.2 root 1569: Uint32 memspace, value, numbit;
1.1 root 1570:
1.1.1.3 ! root 1571: disasm_cur_inst_len++;
! 1572:
1.1 root 1573: memspace = (cur_inst>>6) & 1;
1574: value = (cur_inst>>8) & BITMASK(6);
1575: numbit = cur_inst & BITMASK(5);
1576:
1.1.1.3 ! root 1577: if (memspace) {
! 1578: sprintf(srcname, "y:0x%04x", value);
! 1579: } else {
! 1580: sprintf(srcname, "x:0x%04x", value);
1.1 root 1581: }
1582:
1.1.1.3 ! root 1583: sprintf(str_instr," jsset #%d,%s,p:0x%04x\n",
1.1 root 1584: numbit,
1585: srcname,
1.1.1.2 root 1586: read_memory(dsp_core->pc+1)
1.1 root 1587: );
1588: }
1589:
1.1.1.3 ! root 1590: static void dsp_jsset_ea(void)
1.1 root 1591: {
1.1.1.3 ! root 1592: /* jsset #n,x:ea,p:xx */
! 1593: /* jsset #n,y:ea,p:xx */
1.1 root 1594: char srcname[16], addr_name[16];
1.1.1.2 root 1595: Uint32 memspace, value, numbit;
1.1 root 1596:
1.1.1.3 ! root 1597: disasm_cur_inst_len++;
! 1598:
1.1 root 1599: memspace = (cur_inst>>6) & 1;
1600: value = (cur_inst>>8) & BITMASK(6);
1601: numbit = cur_inst & BITMASK(5);
1602:
1.1.1.3 ! root 1603: dsp_calc_ea(value, addr_name);
! 1604: if (memspace) {
! 1605: sprintf(srcname, "y:%s", addr_name);
! 1606: } else {
! 1607: sprintf(srcname, "x:%s", addr_name);
1.1 root 1608: }
1609:
1.1.1.3 ! root 1610: sprintf(str_instr," jsset #%d,%s,p:0x%04x\n",
1.1 root 1611: numbit,
1612: srcname,
1.1.1.2 root 1613: read_memory(dsp_core->pc+1)
1.1 root 1614: );
1615: }
1616:
1.1.1.3 ! root 1617: static void dsp_jsset_pp(void)
1.1 root 1618: {
1.1.1.3 ! root 1619: /* jsset #n,x:pp,p:xx */
! 1620: /* jsset #n,y:pp,p:xx */
! 1621: char srcname[16];
! 1622: Uint32 memspace, value, numbit;
! 1623:
! 1624: disasm_cur_inst_len++;
! 1625:
! 1626: memspace = (cur_inst>>6) & 1;
! 1627: value = (cur_inst>>8) & BITMASK(6);
! 1628: numbit = cur_inst & BITMASK(5);
1.1 root 1629:
1.1.1.3 ! root 1630: value += 0xffc0;
! 1631: if (memspace) {
! 1632: sprintf(srcname, "y:0x%04x", value);
1.1 root 1633: } else {
1.1.1.3 ! root 1634: sprintf(srcname, "x:0x%04x", value);
1.1 root 1635: }
1636:
1.1.1.3 ! root 1637: sprintf(str_instr," jsset #%d,%s,p:0x%04x\n",
! 1638: numbit,
! 1639: srcname,
! 1640: read_memory(dsp_core->pc+1)
! 1641: );
1.1 root 1642: }
1643:
1.1.1.3 ! root 1644: static void dsp_jsset_reg(void)
1.1 root 1645: {
1.1.1.3 ! root 1646: /* jsset #n,r,p:xx */
! 1647: char srcname[16];
1.1.1.2 root 1648: Uint32 memspace, value, numbit;
1.1 root 1649:
1.1.1.3 ! root 1650: disasm_cur_inst_len++;
! 1651:
1.1 root 1652: memspace = (cur_inst>>6) & 1;
1653: value = (cur_inst>>8) & BITMASK(6);
1654: numbit = cur_inst & BITMASK(5);
1655:
1.1.1.3 ! root 1656: strcpy(srcname, registers_name[value]);
1.1 root 1657:
1.1.1.3 ! root 1658: sprintf(str_instr," jsset #%d,%s,p:0x%04x\n",
1.1 root 1659: numbit,
1660: srcname,
1.1.1.2 root 1661: read_memory(dsp_core->pc+1)
1.1 root 1662: );
1663: }
1664:
1665: static void dsp_lua(void)
1666: {
1667: char addr_name[16], numreg;
1668:
1669: dsp_calc_ea((cur_inst>>8) & BITMASK(5), addr_name);
1670: numreg = cur_inst & BITMASK(3);
1671: registers_changed[DSP_REG_R0+numreg]=1;
1672:
1.1.1.3 ! root 1673: sprintf(str_instr," lua %s,r%d\n", addr_name, numreg);
1.1 root 1674: }
1675:
1.1.1.3 ! root 1676: static void dsp_movec_reg(void)
1.1 root 1677: {
1.1.1.2 root 1678: Uint32 numreg1, numreg2;
1.1 root 1679:
1680: /* S1,D2 */
1681: /* S2,D1 */
1682:
1683: numreg2 = (cur_inst>>8) & BITMASK(6);
1.1.1.3 ! root 1684: numreg1 = cur_inst & BITMASK(6);
1.1 root 1685:
1686: if (cur_inst & (1<<15)) {
1687: /* Write D1 */
1.1.1.3 ! root 1688: sprintf(str_instr," movec %s,%s\n", registers_name[numreg2], registers_name[numreg1]);
1.1 root 1689: registers_changed[numreg1]=1;
1690: } else {
1691: /* Read S1 */
1.1.1.3 ! root 1692: sprintf(str_instr," movec %s,%s\n", registers_name[numreg1], registers_name[numreg2]);
1.1 root 1693: registers_changed[numreg2]=1;
1694: }
1.1.1.3 ! root 1695: registers_changed[DSP_REG_SR]=1;
1.1 root 1696: }
1697:
1.1.1.3 ! root 1698: static void dsp_movec_aa(void)
1.1 root 1699: {
1700: const char *spacename;
1701: char srcname[16],dstname[16];
1.1.1.2 root 1702: Uint32 numreg, addr;
1.1 root 1703:
1704: /* x:aa,D1 */
1705: /* S1,x:aa */
1706: /* y:aa,D1 */
1707: /* S1,y:aa */
1708:
1.1.1.3 ! root 1709: numreg = cur_inst & BITMASK(6);
1.1 root 1710: addr = (cur_inst>>8) & BITMASK(6);
1711:
1712: if (cur_inst & (1<<6)) {
1713: spacename="y";
1714: } else {
1715: spacename="x";
1716: }
1717:
1718: if (cur_inst & (1<<15)) {
1719: /* Write D1 */
1720: sprintf(srcname, "%s:0x%04x", spacename, addr);
1721: strcpy(dstname, registers_name[numreg]);
1722: } else {
1723: /* Read S1 */
1724: strcpy(srcname, registers_name[numreg]);
1725: sprintf(dstname, "%s:0x%04x", spacename, addr);
1726: }
1727:
1.1.1.3 ! root 1728: sprintf(str_instr," movec %s,%s\n", srcname, dstname);
! 1729: registers_changed[DSP_REG_SR]=1;
1.1 root 1730: }
1731:
1.1.1.3 ! root 1732: static void dsp_movec_imm(void)
1.1 root 1733: {
1.1.1.2 root 1734: Uint32 numreg;
1.1 root 1735:
1736: /* #xx,D1 */
1737:
1.1.1.3 ! root 1738: numreg = cur_inst & BITMASK(6);
1.1 root 1739:
1740: registers_changed[numreg]=1;
1.1.1.3 ! root 1741: sprintf(str_instr," movec #0x%02x,%s\n", (cur_inst>>8) & BITMASK(8), registers_name[numreg]);
! 1742: registers_changed[DSP_REG_SR]=1;
1.1 root 1743: }
1744:
1.1.1.3 ! root 1745: static void dsp_movec_ea(void)
1.1 root 1746: {
1747: const char *spacename;
1748: char srcname[16], dstname[16], addr_name[16];
1.1.1.2 root 1749: Uint32 numreg, ea_mode;
1.1 root 1750: int retour;
1751:
1752: /* x:ea,D1 */
1753: /* S1,x:ea */
1754: /* y:ea,D1 */
1755: /* S1,y:ea */
1756: /* #xxxx,D1 */
1757:
1.1.1.3 ! root 1758: numreg = cur_inst & BITMASK(6);
1.1 root 1759: ea_mode = (cur_inst>>8) & BITMASK(6);
1760: retour = dsp_calc_ea(ea_mode, addr_name);
1761:
1762: if (cur_inst & (1<<6)) {
1763: spacename="y";
1764: } else {
1765: spacename="x";
1766: }
1767:
1768: if (cur_inst & (1<<15)) {
1769: /* Write D1 */
1770: if (retour) {
1771: sprintf(srcname, "#%s", addr_name);
1772: } else {
1773: sprintf(srcname, "%s:%s", spacename, addr_name);
1774: }
1775: registers_changed[numreg]=1;
1776: strcpy(dstname, registers_name[numreg]);
1777: } else {
1778: /* Read S1 */
1779: strcpy(srcname, registers_name[numreg]);
1780: sprintf(dstname, "%s:%s", spacename, addr_name);
1781: }
1782:
1.1.1.3 ! root 1783: sprintf(str_instr," movec %s,%s\n", srcname, dstname);
! 1784: registers_changed[DSP_REG_SR]=1;
1.1 root 1785: }
1786:
1.1.1.3 ! root 1787: static void dsp_movem_aa(void)
1.1 root 1788: {
1.1.1.3 ! root 1789: /* S,p:aa */
! 1790: /* p:aa,D */
1.1 root 1791: char addr_name[16], srcname[16], dstname[16];
1.1.1.3 ! root 1792: Uint32 numreg;
1.1 root 1793:
1.1.1.3 ! root 1794: sprintf(addr_name, "0x%04x",(cur_inst>>8) & BITMASK(6));
1.1 root 1795: numreg = cur_inst & BITMASK(6);
1796: if (cur_inst & (1<<15)) {
1797: /* Write D */
1798: registers_changed[numreg]=1;
1799: sprintf(srcname, "p:%s", addr_name);
1800: strcpy(dstname, registers_name[numreg]);
1801: } else {
1802: /* Read S */
1803: strcpy(srcname, registers_name[numreg]);
1804: sprintf(dstname, "p:%s", addr_name);
1805: }
1.1.1.2 root 1806: registers_changed[DSP_REG_SR]=1;
1807:
1.1.1.3 ! root 1808: sprintf(str_instr," movem %s,%s\n", srcname, dstname);
1.1 root 1809: }
1810:
1.1.1.3 ! root 1811: static void dsp_movem_ea(void)
1.1 root 1812: {
1.1.1.3 ! root 1813: /* S,p:ea */
! 1814: /* p:ea,D */
! 1815: char addr_name[16], srcname[16], dstname[16];
! 1816: Uint32 ea_mode, numreg;
1.1 root 1817:
1.1.1.3 ! root 1818: ea_mode = (cur_inst>>8) & BITMASK(6);
! 1819: dsp_calc_ea(ea_mode, addr_name);
! 1820: numreg = cur_inst & BITMASK(6);
! 1821: if (cur_inst & (1<<15)) {
! 1822: /* Write D */
! 1823: registers_changed[numreg]=1;
! 1824: sprintf(srcname, "p:%s", addr_name);
! 1825: strcpy(dstname, registers_name[numreg]);
! 1826: } else {
! 1827: /* Read S */
! 1828: strcpy(srcname, registers_name[numreg]);
! 1829: sprintf(dstname, "p:%s", addr_name);
! 1830: }
1.1.1.2 root 1831: registers_changed[DSP_REG_SR]=1;
1.1.1.3 ! root 1832:
! 1833: sprintf(str_instr," movem %s,%s\n", srcname, dstname);
1.1 root 1834: }
1835:
1836: static void dsp_movep_0(void)
1837: {
1838: char srcname[16]="",dstname[16]="";
1.1.1.2 root 1839: Uint32 addr, memspace, numreg;
1.1 root 1840:
1841: /* S,x:pp */
1842: /* x:pp,D */
1843: /* S,y:pp */
1844: /* y:pp,D */
1845:
1846: addr = 0xffc0 + (cur_inst & BITMASK(6));
1847: memspace = (cur_inst>>16) & 1;
1848: numreg = (cur_inst>>8) & BITMASK(6);
1849:
1850: if (cur_inst & (1<<15)) {
1851: /* Write pp */
1852:
1853: strcpy(srcname, registers_name[numreg]);
1854:
1855: if (memspace) {
1856: sprintf(dstname, "y:0x%04x", addr);
1857: } else {
1858: sprintf(dstname, "x:0x%04x", addr);
1859: }
1860: } else {
1861: /* Read pp */
1862:
1863: if (memspace) {
1864: sprintf(srcname, "y:0x%04x", addr);
1865: } else {
1866: sprintf(srcname, "x:0x%04x", addr);
1867: }
1868:
1869: registers_changed[numreg]=1;
1870: strcpy(dstname, registers_name[numreg]);
1871: }
1872:
1.1.1.3 ! root 1873: sprintf(str_instr," movep %s,%s\n", srcname, dstname);
! 1874: registers_changed[DSP_REG_SR]=1;
1.1 root 1875: }
1876:
1877: static void dsp_movep_1(void)
1878: {
1879: char srcname[16]="",dstname[16]="",name[16]="";
1.1.1.2 root 1880: Uint32 addr, memspace;
1.1 root 1881:
1882: /* p:ea,x:pp */
1883: /* x:pp,p:ea */
1884: /* p:ea,y:pp */
1885: /* y:pp,p:ea */
1886:
1887: addr = 0xffc0 + (cur_inst & BITMASK(6));
1888: dsp_calc_ea((cur_inst>>8) & BITMASK(6), name);
1889: memspace = (cur_inst>>16) & 1;
1890:
1891: if (cur_inst & (1<<15)) {
1892: /* Write pp */
1893:
1894: sprintf(srcname, "p:%s", name);
1895:
1896: if (memspace) {
1897: sprintf(dstname, "y:0x%04x", addr);
1898: } else {
1899: sprintf(dstname, "x:0x%04x", addr);
1900: }
1901: } else {
1902: /* Read pp */
1903:
1904: if (memspace) {
1905: sprintf(srcname, "y:0x%04x", addr);
1906: } else {
1907: sprintf(srcname, "x:0x%04x", addr);
1908: }
1909:
1910: sprintf(dstname, "p:%s", name);
1911: }
1912:
1.1.1.3 ! root 1913: sprintf(str_instr," movep %s,%s\n", srcname, dstname);
! 1914: registers_changed[DSP_REG_SR]=1;
1.1 root 1915: }
1916:
1.1.1.3 ! root 1917: static void dsp_movep_23(void)
1.1 root 1918: {
1919: char srcname[16]="",dstname[16]="",name[16]="";
1.1.1.2 root 1920: Uint32 addr, memspace, easpace, retour;
1.1 root 1921:
1922: /* x:ea,x:pp */
1923: /* y:ea,x:pp */
1924: /* #xxxxxx,x:pp */
1925: /* x:pp,x:ea */
1926: /* x:pp,y:ea */
1927:
1928: /* x:ea,y:pp */
1929: /* y:ea,y:pp */
1930: /* #xxxxxx,y:pp */
1931: /* y:pp,y:ea */
1932: /* y:pp,x:ea */
1933:
1934: addr = 0xffc0 + (cur_inst & BITMASK(6));
1935: retour = dsp_calc_ea((cur_inst>>8) & BITMASK(6), name);
1936: memspace = (cur_inst>>16) & 1;
1937: easpace = (cur_inst>>6) & 1;
1938:
1939: if (cur_inst & (1<<15)) {
1940: /* Write pp */
1941:
1942: if (retour) {
1943: sprintf(srcname, "#%s", name);
1944: } else {
1945: if (easpace) {
1946: sprintf(srcname, "y:%s", name);
1947: } else {
1948: sprintf(srcname, "x:%s", name);
1949: }
1950: }
1951:
1952: if (memspace) {
1953: sprintf(dstname, "y:0x%04x", addr);
1954: } else {
1955: sprintf(dstname, "x:0x%04x", addr);
1956: }
1957: } else {
1958: /* Read pp */
1959:
1960: if (memspace) {
1961: sprintf(srcname, "y:0x%04x", addr);
1962: } else {
1963: sprintf(srcname, "x:0x%04x", addr);
1964: }
1965:
1966: if (easpace) {
1967: sprintf(dstname, "y:%s", name);
1968: } else {
1969: sprintf(dstname, "x:%s", name);
1970: }
1971: }
1972:
1.1.1.3 ! root 1973: sprintf(str_instr," movep %s,%s\n", srcname, dstname);
! 1974: registers_changed[DSP_REG_SR]=1;
1.1 root 1975: }
1976:
1977: static void dsp_nop(void)
1978: {
1.1.1.3 ! root 1979: sprintf(str_instr," nop\n");
1.1 root 1980: }
1981:
1982: static void dsp_norm(void)
1983: {
1.1.1.2 root 1984: Uint32 srcreg, destreg;
1.1 root 1985:
1986: srcreg = DSP_REG_R0+((cur_inst>>8) & BITMASK(3));
1987: destreg = DSP_REG_A+((cur_inst>>3) & 1);
1988:
1989: registers_changed[srcreg]=1;
1990: registers_changed[destreg]=1;
1.1.1.2 root 1991: registers_changed[DSP_REG_SR]=1;
1.1 root 1992:
1.1.1.3 ! root 1993: sprintf(str_instr," norm %s,%s\n", registers_name[srcreg], registers_name[destreg]);
1.1 root 1994: }
1995:
1996: static void dsp_ori(void)
1997: {
1998: const char *regname;
1999:
2000: switch(cur_inst & BITMASK(2)) {
2001: case 0:
2002: regname="mr";
2003: registers_changed[DSP_REG_SR]=1;
2004: break;
2005: case 1:
2006: regname="ccr";
2007: registers_changed[DSP_REG_SR]=1;
2008: break;
2009: case 2:
2010: regname="omr";
2011: registers_changed[DSP_REG_OMR]=1;
2012: break;
2013: default:
2014: regname="";
2015: break;
2016: }
2017:
1.1.1.2 root 2018: registers_changed[DSP_REG_SR]=1;
2019:
1.1.1.3 ! root 2020: sprintf(str_instr," ori #0x%02x,%s\n", (cur_inst>>8) & BITMASK(8), regname);
1.1 root 2021: }
2022:
1.1.1.3 ! root 2023: static void dsp_rep_aa(void)
1.1 root 2024: {
2025: char name[16];
2026:
2027: /* x:aa */
2028: /* y:aa */
2029:
2030: if (cur_inst & (1<<6)) {
2031: sprintf(name, "y:0x%04x",(cur_inst>>8) & BITMASK(6));
2032: } else {
2033: sprintf(name, "x:0x%04x",(cur_inst>>8) & BITMASK(6));
2034: }
2035:
1.1.1.3 ! root 2036: sprintf(str_instr," rep %s\n", name);
! 2037: registers_changed[DSP_REG_LC]=1;
! 2038: registers_changed[DSP_REG_SR]=1;
1.1 root 2039: }
2040:
1.1.1.3 ! root 2041: static void dsp_rep_imm(void)
1.1 root 2042: {
2043: /* #xxx */
1.1.1.3 ! root 2044: sprintf(str_instr," rep #0x%02x\n", ((cur_inst>>8) & BITMASK(8))
! 2045: + ((cur_inst & BITMASK(4))<<8));
! 2046: registers_changed[DSP_REG_LC]=1;
! 2047: registers_changed[DSP_REG_SR]=1;
1.1 root 2048: }
2049:
1.1.1.3 ! root 2050: static void dsp_rep_ea(void)
1.1 root 2051: {
2052: char name[16],addr_name[16];
2053:
2054: /* x:ea */
2055: /* y:ea */
2056:
2057: dsp_calc_ea((cur_inst>>8) & BITMASK(6), addr_name);
2058: if (cur_inst & (1<<6)) {
2059: sprintf(name, "y:%s",addr_name);
2060: } else {
2061: sprintf(name, "x:%s",addr_name);
2062: }
2063:
1.1.1.3 ! root 2064: sprintf(str_instr," rep %s\n", name);
! 2065: registers_changed[DSP_REG_LC]=1;
! 2066: registers_changed[DSP_REG_SR]=1;
1.1 root 2067: }
2068:
1.1.1.3 ! root 2069: static void dsp_rep_reg(void)
1.1 root 2070: {
2071: /* R */
2072:
1.1.1.3 ! root 2073: sprintf(str_instr," rep %s\n", registers_name[(cur_inst>>8) & BITMASK(6)]);
! 2074: registers_changed[DSP_REG_LC]=1;
! 2075: registers_changed[DSP_REG_SR]=1;
1.1 root 2076: }
2077:
2078: static void dsp_reset(void)
2079: {
1.1.1.3 ! root 2080: sprintf(str_instr," reset\n");
1.1 root 2081: }
2082:
2083: static void dsp_rti(void)
2084: {
1.1.1.2 root 2085: registers_changed[DSP_REG_SR]=1;
1.1.1.3 ! root 2086: sprintf(str_instr," rti\n");
1.1 root 2087: }
2088:
2089: static void dsp_rts(void)
2090: {
1.1.1.2 root 2091: registers_changed[DSP_REG_SR]=1;
1.1.1.3 ! root 2092: sprintf(str_instr," rts\n");
1.1 root 2093: }
2094:
2095: static void dsp_stop(void)
2096: {
1.1.1.3 ! root 2097: sprintf(str_instr," stop\n");
1.1 root 2098: }
2099:
2100: static void dsp_swi(void)
2101: {
1.1.1.3 ! root 2102: sprintf(str_instr," swi\n");
1.1 root 2103: }
2104:
2105: static void dsp_tcc(void)
2106: {
2107: char ccname[16];
1.1.1.2 root 2108: Uint32 src1reg, dst1reg, src2reg, dst2reg;
1.1 root 2109:
2110: dsp_calc_cc((cur_inst>>12) & BITMASK(4), ccname);
2111: src1reg = registers_tcc[(cur_inst>>3) & BITMASK(4)][0];
1.1.1.2 root 2112: dst1reg = registers_tcc[(cur_inst>>3) & BITMASK(4)][1];
1.1 root 2113:
2114: registers_changed[dst1reg]=1;
2115: if (cur_inst & (1<<16)) {
2116: src2reg = DSP_REG_R0+(cur_inst & BITMASK(3));
2117: dst2reg = DSP_REG_R0+((cur_inst>>8) & BITMASK(3));
2118:
2119: registers_changed[dst2reg]=1;
1.1.1.3 ! root 2120: sprintf(str_instr," t%s %s,%s %s,%s\n",
1.1 root 2121: ccname,
2122: registers_name[src1reg],
2123: registers_name[dst1reg],
2124: registers_name[src2reg],
2125: registers_name[dst2reg]
2126: );
2127: } else {
1.1.1.3 ! root 2128: sprintf(str_instr," t%s %s,%s\n",
1.1 root 2129: ccname,
2130: registers_name[src1reg],
2131: registers_name[dst1reg]
2132: );
2133: }
2134: }
2135:
2136: static void dsp_wait(void)
2137: {
1.1.1.3 ! root 2138: sprintf(str_instr," wait\n");
1.1 root 2139: }
2140:
2141: /**********************************
2142: * Parallel moves
2143: **********************************/
2144:
2145: static void dsp_pm(void)
2146: {
1.1.1.2 root 2147: Uint32 value;
1.1 root 2148:
2149: value = (cur_inst >> 20) & BITMASK(4);
2150:
2151: opcodes_parmove[value]();
2152: }
2153:
2154: static void dsp_pm_0(void)
2155: {
2156: char space_name[16], addr_name[16];
1.1.1.2 root 2157: Uint32 memspace, numreg1, numreg2;
1.1 root 2158: /*
2159: 0000 100d 00mm mrrr S,x:ea x0,D
2160: 0000 100d 10mm mrrr S,y:ea y0,D
2161: */
2162: memspace = (cur_inst>>15) & 1;
2163: numreg1 = DSP_REG_A+((cur_inst>>16) & 1);
2164: dsp_calc_ea((cur_inst>>8) & BITMASK(6), addr_name);
2165:
2166: if (memspace) {
2167: strcpy(space_name,"y");
2168: numreg2 = DSP_REG_Y0;
2169: } else {
2170: strcpy(space_name,"x");
2171: numreg2 = DSP_REG_X0;
2172: }
2173:
2174: registers_changed[numreg1]=1;
2175:
2176: sprintf(parallelmove_name,
2177: "%s,%s:%s %s,%s",
2178: registers_name[numreg1],
2179: space_name,
2180: addr_name,
2181: registers_name[numreg2],
2182: registers_name[numreg1]
2183: );
2184: }
2185:
2186: static void dsp_pm_1(void)
2187: {
2188: /*
2189: 0001 ffdf w0mm mrrr x:ea,D1 S2,D2
2190: S1,x:ea S2,D2
2191: #xxxxxx,D1 S2,D2
2192: 0001 deff w1mm mrrr S1,D1 y:ea,D2
2193: S1,D1 S2,y:ea
2194: S1,D1 #xxxxxx,D2
2195: */
2196:
2197: char addr_name[16];
1.1.1.2 root 2198: Uint32 memspace, write_flag, retour, s1reg, s2reg, d1reg, d2reg;
1.1 root 2199:
2200: memspace = (cur_inst>>14) & 1;
2201: write_flag = (cur_inst>>15) & 1;
2202: retour = dsp_calc_ea((cur_inst>>8) & BITMASK(6), addr_name);
2203:
2204: if (memspace==DSP_SPACE_Y) {
2205: s2reg = d2reg = DSP_REG_Y0;
2206: switch((cur_inst>>16) & BITMASK(2)) {
2207: case 0: s2reg = d2reg = DSP_REG_Y0; break;
2208: case 1: s2reg = d2reg = DSP_REG_Y1; break;
2209: case 2: s2reg = d2reg = DSP_REG_A; break;
2210: case 3: s2reg = d2reg = DSP_REG_B; break;
2211: }
2212:
2213: s1reg = DSP_REG_A+((cur_inst>>19) & 1);
2214: d1reg = DSP_REG_X0+((cur_inst>>18) & 1);
2215:
2216: registers_changed[d1reg]=1;
2217:
2218: if (write_flag) {
2219: /* Write D2 */
2220:
2221: registers_changed[d2reg]=1;
2222:
2223: if (retour) {
2224: sprintf(parallelmove_name,"%s,%s #%s,%s",
2225: registers_name[s1reg],
2226: registers_name[d1reg],
2227: addr_name,
2228: registers_name[d2reg]
2229: );
2230: } else {
2231: sprintf(parallelmove_name,"%s,%s y:%s,%s",
2232: registers_name[s1reg],
2233: registers_name[d1reg],
2234: addr_name,
2235: registers_name[d2reg]
2236: );
2237: }
2238: } else {
2239: /* Read S2 */
2240: sprintf(parallelmove_name,"%s,%s %s,y:%s",
2241: registers_name[s1reg],
2242: registers_name[d1reg],
2243: registers_name[s2reg],
2244: addr_name
2245: );
2246: }
2247:
2248: } else {
2249: s1reg = d1reg = DSP_REG_X0;
2250: switch((cur_inst>>18) & BITMASK(2)) {
2251: case 0: s1reg = d1reg = DSP_REG_X0; break;
2252: case 1: s1reg = d1reg = DSP_REG_X1; break;
2253: case 2: s1reg = d1reg = DSP_REG_A; break;
2254: case 3: s1reg = d1reg = DSP_REG_B; break;
2255: }
2256:
2257: s2reg = DSP_REG_A+((cur_inst>>17) & 1);
2258: d2reg = DSP_REG_Y0+((cur_inst>>16) & 1);
2259:
2260: registers_changed[d2reg]=1;
2261:
2262: if (write_flag) {
2263: /* Write D1 */
2264:
2265: registers_changed[d1reg]=1;
2266:
2267: if (retour) {
2268: sprintf(parallelmove_name,"#%s,%s %s,%s",
2269: addr_name,
2270: registers_name[d1reg],
2271: registers_name[s2reg],
2272: registers_name[d2reg]
2273: );
2274: } else {
2275: sprintf(parallelmove_name,"x:%s,%s %s,%s",
2276: addr_name,
2277: registers_name[d1reg],
2278: registers_name[s2reg],
2279: registers_name[d2reg]
2280: );
2281: }
2282: } else {
2283: /* Read S1 */
2284: sprintf(parallelmove_name,"%s,x:%s %s,%s",
2285: registers_name[s1reg],
2286: addr_name,
2287: registers_name[s2reg],
2288: registers_name[d2reg]
2289: );
2290: }
2291:
2292: }
2293: }
2294:
2295: static void dsp_pm_2(void)
2296: {
2297: char addr_name[16];
1.1.1.2 root 2298: Uint32 numreg1, numreg2;
1.1 root 2299: /*
2300: 0010 0000 0000 0000 nop
2301: 0010 0000 010m mrrr R update
2302: 0010 00ee eeed dddd S,D
2303: 001d dddd iiii iiii #xx,D
2304: */
2305: if (((cur_inst >> 8) & 0xffff) == 0x2000) {
2306: return;
2307: }
2308:
2309: if (((cur_inst >> 8) & 0xffe0) == 0x2040) {
2310: dsp_calc_ea((cur_inst>>8) & BITMASK(5), addr_name);
2311: registers_changed[DSP_REG_R0+((cur_inst>>8) & BITMASK(3))]=1;
2312: sprintf(parallelmove_name, "%s,r%d",addr_name, (cur_inst>>8) & BITMASK(3));
2313: return;
2314: }
2315:
2316: if (((cur_inst >> 8) & 0xfc00) == 0x2000) {
2317: numreg1 = (cur_inst>>13) & BITMASK(5);
2318: numreg2 = (cur_inst>>8) & BITMASK(5);
2319: registers_changed[numreg2]=1;
2320: sprintf(parallelmove_name, "%s,%s", registers_name[numreg1], registers_name[numreg2]);
2321: return;
2322: }
2323:
2324: numreg1 = (cur_inst>>16) & BITMASK(5);
2325: registers_changed[numreg1]=1;
2326: sprintf(parallelmove_name, "#0x%02x,%s", (cur_inst >> 8) & BITMASK(8), registers_name[numreg1]);
2327: }
2328:
2329: static void dsp_pm_4(void)
2330: {
2331: char addr_name[16];
1.1.1.2 root 2332: Uint32 value, retour, ea_mode, memspace;
1.1 root 2333: /*
2334: 0100 l0ll w0aa aaaa l:aa,D
2335: S,l:aa
2336: 0100 l0ll w1mm mrrr l:ea,D
2337: S,l:ea
2338: 01dd 0ddd w0aa aaaa x:aa,D
2339: S,x:aa
2340: 01dd 0ddd w1mm mrrr x:ea,D
2341: S,x:ea
2342: #xxxxxx,D
2343: 01dd 1ddd w0aa aaaa y:aa,D
2344: S,y:aa
2345: 01dd 1ddd w1mm mrrr y:ea,D
2346: S,y:ea
2347: #xxxxxx,D
2348: */
2349: value = (cur_inst>>16) & BITMASK(3);
2350: value |= (cur_inst>>17) & (BITMASK(2)<<3);
2351:
2352: ea_mode = (cur_inst>>8) & BITMASK(6);
2353:
2354: if ((value>>2)==0) {
2355: /* L: memory move */
2356: if (cur_inst & (1<<14)) {
2357: retour = dsp_calc_ea(ea_mode, addr_name);
2358: } else {
1.1.1.2 root 2359: sprintf(addr_name,"0x%04x", ea_mode);
1.1 root 2360: retour = 0;
2361: }
2362:
2363: value = (cur_inst>>16) & BITMASK(2);
2364: value |= (cur_inst>>17) & (1<<2);
2365:
2366: if (cur_inst & (1<<15)) {
2367: /* Write D */
2368:
1.1.1.3 ! root 2369: registers_changed[disasm_registers_lmove[value][0]]=1;
! 2370: registers_changed[disasm_registers_lmove[value][1]]=1;
1.1 root 2371: if (retour) {
2372: sprintf(parallelmove_name, "#%s,%s", addr_name, registers_lmove[value]);
2373: } else {
2374: sprintf(parallelmove_name, "l:%s,%s", addr_name, registers_lmove[value]);
2375: }
2376: } else {
2377: /* Read S */
2378: sprintf(parallelmove_name, "%s,l:%s", registers_lmove[value], addr_name);
2379: }
2380:
2381: return;
2382: }
2383:
2384: memspace = (cur_inst>>19) & 1;
2385: if (cur_inst & (1<<14)) {
2386: retour = dsp_calc_ea(ea_mode, addr_name);
2387: } else {
2388: sprintf(addr_name,"0x%04x", ea_mode);
2389: retour = 0;
2390: }
2391:
2392: if (memspace) {
2393: /* Y: */
2394:
2395: if (cur_inst & (1<<15)) {
2396: /* Write D */
2397:
2398: registers_changed[value]=1;
2399: if (retour) {
2400: sprintf(parallelmove_name, "#%s,%s", addr_name, registers_name[value]);
2401: } else {
2402: sprintf(parallelmove_name, "y:%s,%s", addr_name, registers_name[value]);
2403: }
2404:
2405: } else {
2406: /* Read S */
2407: sprintf(parallelmove_name, "%s,y:%s", registers_name[value], addr_name);
2408: }
2409: } else {
2410: /* X: */
2411:
2412: if (cur_inst & (1<<15)) {
2413: /* Write D */
2414:
2415: registers_changed[value]=1;
2416:
2417: if (retour) {
2418: sprintf(parallelmove_name, "#%s,%s", addr_name, registers_name[value]);
2419: } else {
2420: sprintf(parallelmove_name, "x:%s,%s", addr_name, registers_name[value]);
2421: }
2422: } else {
2423: /* Read S */
2424: sprintf(parallelmove_name, "%s,x:%s", registers_name[value], addr_name);
2425: }
2426: }
2427: }
2428:
2429: static void dsp_pm_8(void)
2430: {
2431: char addr1_name[16], addr2_name[16];
1.1.1.2 root 2432: Uint32 ea_mode1, ea_mode2, numreg1, numreg2;
1.1 root 2433: /*
2434: 1wmm eeff WrrM MRRR x:ea,D1 y:ea,D2
2435: x:ea,D1 S2,y:ea
2436: S1,x:ea y:ea,D2
2437: S1,x:ea S2,y:ea
2438: */
2439: numreg1 = DSP_REG_X0;
2440: switch((cur_inst>>18) & BITMASK(2)) {
2441: case 0: numreg1 = DSP_REG_X0; break;
2442: case 1: numreg1 = DSP_REG_X1; break;
2443: case 2: numreg1 = DSP_REG_A; break;
2444: case 3: numreg1 = DSP_REG_B; break;
2445: }
2446:
2447: numreg2 = DSP_REG_Y0;
2448: switch((cur_inst>>16) & BITMASK(2)) {
2449: case 0: numreg2 = DSP_REG_Y0; break;
2450: case 1: numreg2 = DSP_REG_Y1; break;
2451: case 2: numreg2 = DSP_REG_A; break;
2452: case 3: numreg2 = DSP_REG_B; break;
2453: }
2454:
2455: ea_mode1 = (cur_inst>>8) & BITMASK(5);
2456: if ((ea_mode1>>3) == 0) {
2457: ea_mode1 |= (1<<5);
2458: }
2459: ea_mode2 = (cur_inst>>13) & BITMASK(2);
2460: ea_mode2 |= ((cur_inst>>20) & BITMASK(2))<<3;
2461: if ((ea_mode1 & (1<<2))==0) {
2462: ea_mode2 |= 1<<2;
2463: }
2464: if ((ea_mode2>>3) == 0) {
2465: ea_mode2 |= (1<<5);
2466: }
2467:
2468: dsp_calc_ea(ea_mode1, addr1_name);
2469: dsp_calc_ea(ea_mode2, addr2_name);
2470:
2471: if (cur_inst & (1<<15)) {
2472: registers_changed[numreg1]=1;
2473: if (cur_inst & (1<<22)) {
2474: registers_changed[numreg2]=1;
2475: sprintf(parallelmove_name, "x:%s,%s y:%s,%s",
2476: addr1_name,
2477: registers_name[numreg1],
2478: addr2_name,
2479: registers_name[numreg2]
2480: );
2481: } else {
2482: sprintf(parallelmove_name, "x:%s,%s %s,y:%s",
2483: addr1_name,
2484: registers_name[numreg1],
2485: registers_name[numreg2],
2486: addr2_name
2487: );
2488: }
2489: } else {
2490: if (cur_inst & (1<<22)) {
2491: registers_changed[numreg2]=1;
2492: sprintf(parallelmove_name, "%s,x:%s y:%s,%s",
2493: registers_name[numreg1],
2494: addr1_name,
2495: addr2_name,
2496: registers_name[numreg2]
2497: );
2498: } else {
2499: sprintf(parallelmove_name, "%s,x:%s %s,y:%s",
2500: registers_name[numreg1],
2501: addr1_name,
2502: registers_name[numreg2],
2503: addr2_name
2504: );
2505: }
2506: }
2507: }
2508:
2509:
2510: /**********************************
2511: * Parallel moves ALU instructions
2512: **********************************/
2513:
2514: static void dsp_abs(void)
2515: {
1.1.1.2 root 2516: Uint32 numreg;
1.1 root 2517:
2518: numreg = DSP_REG_A+((cur_inst>>3) & 1);
2519:
2520: registers_changed[numreg]=1;
1.1.1.2 root 2521: registers_changed[DSP_REG_SR]=1;
2522:
1.1.1.3 ! root 2523: sprintf(str_instr," abs %s %s\n", registers_name[numreg], parallelmove_name);
1.1 root 2524: }
2525:
2526: static void dsp_adc(void)
2527: {
2528: const char *srcname;
1.1.1.2 root 2529: Uint32 numreg;
1.1 root 2530:
2531: if (cur_inst & (1<<4)) {
2532: srcname="y";
2533: } else {
2534: srcname="x";
2535: }
2536:
2537: numreg=DSP_REG_A+((cur_inst>>3) & 1);
2538: registers_changed[numreg]=1;
1.1.1.2 root 2539: registers_changed[DSP_REG_SR]=1;
1.1 root 2540:
1.1.1.3 ! root 2541: sprintf(str_instr," adc %s,%s %s\n",
1.1 root 2542: srcname,
2543: registers_name[numreg],
2544: parallelmove_name
2545: );
2546: }
2547:
2548: static void dsp_add(void)
2549: {
2550: const char *srcname;
1.1.1.2 root 2551: Uint32 srcreg, dstreg;
1.1 root 2552:
2553: srcreg = (cur_inst>>4) & BITMASK(3);
2554: dstreg = (cur_inst>>3) & 1;
2555:
2556: switch(srcreg) {
2557: case 1:
2558: srcreg = dstreg ^ 1;
2559: srcname = registers_name[DSP_REG_A+srcreg];
2560: break;
2561: case 2:
2562: srcname="x";
2563: break;
2564: case 3:
2565: srcname="y";
2566: break;
1.1.1.2 root 2567: case 4:
2568: srcname=registers_name[DSP_REG_X0];
2569: break;
2570: case 5:
2571: srcname=registers_name[DSP_REG_Y0];
2572: break;
2573: case 6:
2574: srcname=registers_name[DSP_REG_X1];
2575: break;
2576: case 7:
2577: srcname=registers_name[DSP_REG_Y1];
1.1 root 2578: break;
2579: default:
2580: srcname="";
2581: break;
2582: }
2583:
2584: registers_changed[DSP_REG_A+dstreg]=1;
1.1.1.2 root 2585: registers_changed[DSP_REG_SR]=1;
2586:
1.1.1.3 ! root 2587: sprintf(str_instr," add %s,%s %s\n",
1.1 root 2588: srcname,
2589: registers_name[DSP_REG_A+dstreg],
2590: parallelmove_name
2591: );
2592: }
2593:
2594: static void dsp_addl(void)
2595: {
1.1.1.2 root 2596: Uint32 numreg;
1.1 root 2597:
2598: numreg = (cur_inst>>3) & 1;
2599:
2600: registers_changed[DSP_REG_A+numreg]=1;
1.1.1.2 root 2601: registers_changed[DSP_REG_SR]=1;
2602:
1.1.1.3 ! root 2603: sprintf(str_instr," addl %s,%s %s\n",
1.1 root 2604: registers_name[DSP_REG_A+(numreg ^ 1)],
2605: registers_name[DSP_REG_A+numreg],
2606: parallelmove_name
2607: );
2608: }
2609:
2610: static void dsp_addr(void)
2611: {
1.1.1.2 root 2612: Uint32 numreg;
1.1 root 2613:
2614: numreg = (cur_inst>>3) & 1;
2615:
2616: registers_changed[DSP_REG_A+numreg]=1;
1.1.1.2 root 2617: registers_changed[DSP_REG_SR]=1;
2618:
1.1.1.3 ! root 2619: sprintf(str_instr," addr %s,%s %s\n",
1.1 root 2620: registers_name[DSP_REG_A+(numreg ^ 1)],
2621: registers_name[DSP_REG_A+numreg],
2622: parallelmove_name
2623: );
2624: }
2625:
2626: static void dsp_and(void)
2627: {
1.1.1.2 root 2628: Uint32 srcreg,dstreg;
1.1 root 2629:
1.1.1.2 root 2630: switch((cur_inst>>4) & BITMASK(2)) {
2631: case 1:
2632: srcreg=DSP_REG_Y0;
2633: break;
2634: case 2:
2635: srcreg=DSP_REG_X1;
2636: break;
2637: case 3:
2638: srcreg=DSP_REG_Y1;
2639: break;
2640: case 0:
2641: default:
2642: srcreg=DSP_REG_X0;
2643: }
2644: dstreg = DSP_REG_A+((cur_inst>>3) & 1);
1.1 root 2645:
1.1.1.2 root 2646: registers_changed[dstreg]=1;
2647: registers_changed[DSP_REG_SR]=1;
1.1 root 2648:
1.1.1.3 ! root 2649: sprintf(str_instr," and %s,%s %s\n",
1.1.1.2 root 2650: registers_name[srcreg],
2651: registers_name[dstreg],
1.1 root 2652: parallelmove_name
2653: );
2654: }
2655:
2656: static void dsp_asl(void)
2657: {
1.1.1.2 root 2658: Uint32 numreg;
1.1 root 2659:
2660: numreg = DSP_REG_A+((cur_inst>>3) & 1);
2661:
2662: registers_changed[numreg]=1;
1.1.1.2 root 2663: registers_changed[DSP_REG_SR]=1;
1.1 root 2664:
1.1.1.3 ! root 2665: sprintf(str_instr," asl %s %s\n",
1.1 root 2666: registers_name[numreg],
2667: parallelmove_name
2668: );
2669: }
2670:
2671: static void dsp_asr(void)
2672: {
1.1.1.2 root 2673: Uint32 numreg;
1.1 root 2674:
2675: numreg = DSP_REG_A+((cur_inst>>3) & 1);
2676:
2677: registers_changed[numreg]=1;
1.1.1.2 root 2678: registers_changed[DSP_REG_SR]=1;
1.1 root 2679:
1.1.1.3 ! root 2680: sprintf(str_instr," asr %s %s\n",
1.1 root 2681: registers_name[numreg],
2682: parallelmove_name
2683: );
2684: }
2685:
2686: static void dsp_clr(void)
2687: {
1.1.1.2 root 2688: Uint32 numreg;
1.1 root 2689:
2690: numreg = DSP_REG_A+((cur_inst>>3) & 1);
2691:
2692: registers_changed[numreg]=1;
1.1.1.2 root 2693: registers_changed[DSP_REG_SR]=1;
1.1 root 2694:
1.1.1.3 ! root 2695: sprintf(str_instr," clr %s %s\n",
1.1 root 2696: registers_name[numreg],
2697: parallelmove_name
2698: );
2699: }
2700:
2701: static void dsp_cmp(void)
2702: {
1.1.1.2 root 2703: Uint32 srcreg, dstreg;
1.1 root 2704:
2705: srcreg = (cur_inst>>4) & BITMASK(3);
2706: dstreg = (cur_inst>>3) & 1;
2707:
2708: switch(srcreg) {
2709: case 0:
2710: srcreg = DSP_REG_A+(dstreg ^ 1);
2711: break;
2712: case 4:
2713: srcreg = DSP_REG_X0;
2714: break;
2715: case 5:
2716: srcreg = DSP_REG_Y0;
2717: break;
2718: case 6:
2719: srcreg = DSP_REG_X1;
2720: break;
2721: case 7:
2722: srcreg = DSP_REG_Y1;
2723: break;
2724: }
2725:
1.1.1.2 root 2726: registers_changed[DSP_REG_SR]=1;
2727:
1.1.1.3 ! root 2728: sprintf(str_instr," cmp %s,%s %s\n",
1.1 root 2729: registers_name[srcreg],
2730: registers_name[DSP_REG_A+dstreg],
2731: parallelmove_name
2732: );
2733: }
2734:
2735: static void dsp_cmpm(void)
2736: {
1.1.1.2 root 2737: Uint32 srcreg, dstreg;
1.1 root 2738:
2739: srcreg = (cur_inst>>4) & BITMASK(3);
2740: dstreg = (cur_inst>>3) & 1;
2741:
2742: switch(srcreg) {
2743: case 0:
2744: srcreg = DSP_REG_A+(dstreg ^ 1);
2745: break;
2746: case 4:
2747: srcreg = DSP_REG_X0;
2748: break;
2749: case 5:
2750: srcreg = DSP_REG_Y0;
2751: break;
2752: case 6:
2753: srcreg = DSP_REG_X1;
2754: break;
2755: case 7:
2756: srcreg = DSP_REG_Y1;
2757: break;
2758: }
2759:
1.1.1.2 root 2760: registers_changed[DSP_REG_SR]=1;
2761:
1.1.1.3 ! root 2762: sprintf(str_instr," cmpm %s,%s %s\n",
1.1 root 2763: registers_name[srcreg],
2764: registers_name[DSP_REG_A+dstreg],
2765: parallelmove_name
2766: );
2767: }
2768:
2769: static void dsp_eor(void)
2770: {
1.1.1.2 root 2771: Uint32 srcreg, dstreg;
1.1 root 2772:
1.1.1.2 root 2773: switch((cur_inst>>4) & BITMASK(2)) {
2774: case 1:
2775: srcreg=DSP_REG_Y0;
2776: break;
2777: case 2:
2778: srcreg=DSP_REG_X1;
2779: break;
2780: case 3:
2781: srcreg=DSP_REG_Y1;
2782: break;
2783: case 0:
2784: default:
2785: srcreg=DSP_REG_X0;
2786: }
2787: dstreg = DSP_REG_A+((cur_inst>>3) & 1);
1.1 root 2788:
1.1.1.2 root 2789: registers_changed[dstreg]=1;
2790: registers_changed[DSP_REG_SR]=1;
1.1 root 2791:
1.1.1.3 ! root 2792: sprintf(str_instr," eor %s,%s %s\n",
1.1.1.2 root 2793: registers_name[srcreg],
2794: registers_name[dstreg],
1.1 root 2795: parallelmove_name
2796: );
2797: }
2798:
2799: static void dsp_lsl(void)
2800: {
1.1.1.2 root 2801: Uint32 numreg;
1.1 root 2802:
2803: numreg = DSP_REG_A+((cur_inst>>3) & 1);
2804:
2805: registers_changed[numreg]=1;
1.1.1.2 root 2806: registers_changed[DSP_REG_SR]=1;
1.1 root 2807:
1.1.1.3 ! root 2808: sprintf(str_instr," lsl %s %s\n",
1.1 root 2809: registers_name[numreg],
2810: parallelmove_name
2811: );
2812: }
2813:
2814: static void dsp_lsr(void)
2815: {
1.1.1.2 root 2816: Uint32 numreg;
1.1 root 2817:
2818: numreg = DSP_REG_A+((cur_inst>>3) & 1);
2819:
2820: registers_changed[numreg]=1;
1.1.1.2 root 2821: registers_changed[DSP_REG_SR]=1;
1.1 root 2822:
1.1.1.3 ! root 2823: sprintf(str_instr," lsr %s %s\n",
1.1 root 2824: registers_name[numreg],
2825: parallelmove_name
2826: );
2827: }
2828:
2829: static void dsp_mac(void)
2830: {
2831: const char *sign_name;
1.1.1.2 root 2832: Uint32 src1reg=DSP_REG_NULL, src2reg=DSP_REG_NULL, dstreg;
1.1 root 2833:
2834: if (cur_inst & (1<<2)) {
2835: sign_name="-";
2836: } else {
2837: sign_name="";
2838: }
2839:
2840: switch((cur_inst>>4) & BITMASK(3)) {
2841: case 0:
2842: src1reg = DSP_REG_X0;
2843: src2reg = DSP_REG_X0;
2844: break;
2845: case 1:
2846: src1reg = DSP_REG_Y0;
2847: src2reg = DSP_REG_Y0;
2848: break;
2849: case 2:
2850: src1reg = DSP_REG_X1;
2851: src2reg = DSP_REG_X0;
2852: break;
2853: case 3:
2854: src1reg = DSP_REG_Y1;
2855: src2reg = DSP_REG_Y0;
2856: break;
2857: case 4:
2858: src1reg = DSP_REG_X0;
2859: src2reg = DSP_REG_Y1;
2860: break;
2861: case 5:
2862: src1reg = DSP_REG_Y0;
2863: src2reg = DSP_REG_X0;
2864: break;
2865: case 6:
2866: src1reg = DSP_REG_X1;
2867: src2reg = DSP_REG_Y0;
2868: break;
2869: case 7:
2870: src1reg = DSP_REG_Y1;
2871: src2reg = DSP_REG_X1;
2872: break;
2873: }
2874: dstreg = (cur_inst>>3) & 1;
2875:
2876: registers_changed[DSP_REG_A+dstreg]=1;
1.1.1.2 root 2877: registers_changed[DSP_REG_SR]=1;
2878:
1.1.1.3 ! root 2879: sprintf(str_instr," mac %s%s,%s,%s %s\n",
1.1 root 2880: sign_name,
2881: registers_name[src1reg],
2882: registers_name[src2reg],
2883: registers_name[DSP_REG_A+dstreg],
2884: parallelmove_name
2885: );
2886: }
2887:
2888: static void dsp_macr(void)
2889: {
2890: const char *sign_name;
1.1.1.2 root 2891: Uint32 src1reg=DSP_REG_NULL, src2reg=DSP_REG_NULL, dstreg;
1.1 root 2892:
2893: if (cur_inst & (1<<2)) {
2894: sign_name="-";
2895: } else {
2896: sign_name="";
2897: }
2898:
2899: switch((cur_inst>>4) & BITMASK(3)) {
2900: case 0:
2901: src1reg = DSP_REG_X0;
2902: src2reg = DSP_REG_X0;
2903: break;
2904: case 1:
2905: src1reg = DSP_REG_Y0;
2906: src2reg = DSP_REG_Y0;
2907: break;
2908: case 2:
2909: src1reg = DSP_REG_X1;
2910: src2reg = DSP_REG_X0;
2911: break;
2912: case 3:
2913: src1reg = DSP_REG_Y1;
2914: src2reg = DSP_REG_Y0;
2915: break;
2916: case 4:
2917: src1reg = DSP_REG_X0;
2918: src2reg = DSP_REG_Y1;
2919: break;
2920: case 5:
2921: src1reg = DSP_REG_Y0;
2922: src2reg = DSP_REG_X0;
2923: break;
2924: case 6:
2925: src1reg = DSP_REG_X1;
2926: src2reg = DSP_REG_Y0;
2927: break;
2928: case 7:
2929: src1reg = DSP_REG_Y1;
2930: src2reg = DSP_REG_X1;
2931: break;
2932: }
2933: dstreg = (cur_inst>>3) & 1;
2934:
2935: registers_changed[DSP_REG_A+dstreg]=1;
1.1.1.2 root 2936: registers_changed[DSP_REG_SR]=1;
2937:
1.1.1.3 ! root 2938: sprintf(str_instr," macr %s%s,%s,%s %s\n",
1.1 root 2939: sign_name,
2940: registers_name[src1reg],
2941: registers_name[src2reg],
2942: registers_name[DSP_REG_A+dstreg],
2943: parallelmove_name
2944: );
2945: }
2946:
2947: static void dsp_move(void)
2948: {
1.1.1.3 ! root 2949: sprintf(str_instr," move %s\n", parallelmove_name);
1.1 root 2950: }
2951:
2952: static void dsp_mpy(void)
2953: {
2954: const char *sign_name;
1.1.1.2 root 2955: Uint32 src1reg=DSP_REG_NULL, src2reg=DSP_REG_NULL, dstreg;
1.1 root 2956:
2957: if (cur_inst & (1<<2)) {
2958: sign_name="-";
2959: } else {
2960: sign_name="";
2961: }
2962:
2963: switch((cur_inst>>4) & BITMASK(3)) {
2964: case 0:
2965: src1reg = DSP_REG_X0;
2966: src2reg = DSP_REG_X0;
2967: break;
2968: case 1:
2969: src1reg = DSP_REG_Y0;
2970: src2reg = DSP_REG_Y0;
2971: break;
2972: case 2:
2973: src1reg = DSP_REG_X1;
2974: src2reg = DSP_REG_X0;
2975: break;
2976: case 3:
2977: src1reg = DSP_REG_Y1;
2978: src2reg = DSP_REG_Y0;
2979: break;
2980: case 4:
2981: src1reg = DSP_REG_X0;
2982: src2reg = DSP_REG_Y1;
2983: break;
2984: case 5:
2985: src1reg = DSP_REG_Y0;
2986: src2reg = DSP_REG_X0;
2987: break;
2988: case 6:
2989: src1reg = DSP_REG_X1;
2990: src2reg = DSP_REG_Y0;
2991: break;
2992: case 7:
2993: src1reg = DSP_REG_Y1;
2994: src2reg = DSP_REG_X1;
2995: break;
2996: }
2997: dstreg = (cur_inst>>3) & 1;
2998:
2999: registers_changed[DSP_REG_A+dstreg]=1;
1.1.1.2 root 3000: registers_changed[DSP_REG_SR]=1;
3001:
1.1.1.3 ! root 3002: sprintf(str_instr," mpy %s%s,%s,%s %s\n",
1.1 root 3003: sign_name,
3004: registers_name[src1reg],
3005: registers_name[src2reg],
3006: registers_name[DSP_REG_A+dstreg],
3007: parallelmove_name
3008: );
3009: }
3010:
3011: static void dsp_mpyr(void)
3012: {
3013: const char *sign_name;
1.1.1.2 root 3014: Uint32 src1reg=DSP_REG_NULL, src2reg=DSP_REG_NULL, dstreg;
1.1 root 3015:
3016: if (cur_inst & (1<<2)) {
3017: sign_name="-";
3018: } else {
3019: sign_name="";
3020: }
3021:
3022: switch((cur_inst>>4) & BITMASK(3)) {
3023: case 0:
3024: src1reg = DSP_REG_X0;
3025: src2reg = DSP_REG_X0;
3026: break;
3027: case 1:
3028: src1reg = DSP_REG_Y0;
3029: src2reg = DSP_REG_Y0;
3030: break;
3031: case 2:
3032: src1reg = DSP_REG_X1;
3033: src2reg = DSP_REG_X0;
3034: break;
3035: case 3:
3036: src1reg = DSP_REG_Y1;
3037: src2reg = DSP_REG_Y0;
3038: break;
3039: case 4:
3040: src1reg = DSP_REG_X0;
3041: src2reg = DSP_REG_Y1;
3042: break;
3043: case 5:
3044: src1reg = DSP_REG_Y0;
3045: src2reg = DSP_REG_X0;
3046: break;
3047: case 6:
3048: src1reg = DSP_REG_X1;
3049: src2reg = DSP_REG_Y0;
3050: break;
3051: case 7:
3052: src1reg = DSP_REG_Y1;
3053: src2reg = DSP_REG_X1;
3054: break;
3055: }
3056: dstreg = (cur_inst>>3) & 1;
3057:
3058: registers_changed[DSP_REG_A+dstreg]=1;
1.1.1.2 root 3059: registers_changed[DSP_REG_SR]=1;
3060:
1.1.1.3 ! root 3061: sprintf(str_instr," mpyr %s%s,%s,%s %s\n",
1.1 root 3062: sign_name,
3063: registers_name[src1reg],
3064: registers_name[src2reg],
3065: registers_name[DSP_REG_A+dstreg],
3066: parallelmove_name
3067: );
3068: }
3069:
3070: static void dsp_neg(void)
3071: {
1.1.1.2 root 3072: Uint32 numreg;
1.1 root 3073:
3074: numreg = DSP_REG_A+((cur_inst>>3) & 1);
3075:
3076: registers_changed[numreg]=1;
1.1.1.2 root 3077: registers_changed[DSP_REG_SR]=1;
1.1 root 3078:
1.1.1.3 ! root 3079: sprintf(str_instr," neg %s %s\n",
1.1 root 3080: registers_name[numreg],
3081: parallelmove_name
3082: );
3083: }
3084:
3085: static void dsp_not(void)
3086: {
1.1.1.2 root 3087: Uint32 numreg;
1.1 root 3088:
3089: numreg = DSP_REG_A+((cur_inst>>3) & 1);
3090:
3091: registers_changed[numreg]=1;
1.1.1.2 root 3092: registers_changed[DSP_REG_SR]=1;
1.1 root 3093:
1.1.1.3 ! root 3094: sprintf(str_instr," not %s %s\n",
1.1 root 3095: registers_name[numreg],
3096: parallelmove_name
3097: );
3098: }
3099:
3100: static void dsp_or(void)
3101: {
1.1.1.2 root 3102: Uint32 srcreg, dstreg;
1.1 root 3103:
1.1.1.2 root 3104: switch((cur_inst>>4) & BITMASK(2)) {
3105: case 1:
3106: srcreg=DSP_REG_Y0;
3107: break;
3108: case 2:
3109: srcreg=DSP_REG_X1;
3110: break;
3111: case 3:
3112: srcreg=DSP_REG_Y1;
3113: break;
3114: case 0:
3115: default:
3116: srcreg=DSP_REG_X0;
3117: }
3118: dstreg = DSP_REG_A+((cur_inst>>3) & 1);
1.1 root 3119:
1.1.1.2 root 3120: registers_changed[dstreg]=1;
3121: registers_changed[DSP_REG_SR]=1;
1.1 root 3122:
1.1.1.3 ! root 3123: sprintf(str_instr," or %s,%s %s\n",
1.1.1.2 root 3124: registers_name[srcreg],
3125: registers_name[dstreg],
1.1 root 3126: parallelmove_name
3127: );
3128: }
3129:
3130: static void dsp_rnd(void)
3131: {
1.1.1.2 root 3132: Uint32 numreg;
1.1 root 3133:
3134: numreg = DSP_REG_A+((cur_inst>>3) & 1);
3135:
3136: registers_changed[numreg]=1;
1.1.1.2 root 3137: registers_changed[DSP_REG_SR]=1;
1.1 root 3138:
1.1.1.3 ! root 3139: sprintf(str_instr," rnd %s %s\n",
1.1 root 3140: registers_name[numreg],
3141: parallelmove_name
3142: );
3143: }
3144:
3145: static void dsp_rol(void)
3146: {
1.1.1.2 root 3147: Uint32 numreg;
1.1 root 3148:
3149: numreg = DSP_REG_A+((cur_inst>>3) & 1);
3150:
3151: registers_changed[numreg]=1;
1.1.1.2 root 3152: registers_changed[DSP_REG_SR]=1;
1.1 root 3153:
1.1.1.3 ! root 3154: sprintf(str_instr," rol %s %s\n",
1.1 root 3155: registers_name[numreg],
3156: parallelmove_name
3157: );
3158: }
3159:
3160: static void dsp_ror(void)
3161: {
1.1.1.2 root 3162: Uint32 numreg;
1.1 root 3163:
3164: numreg = DSP_REG_A+((cur_inst>>3) & 1);
3165:
3166: registers_changed[numreg]=1;
1.1.1.2 root 3167: registers_changed[DSP_REG_SR]=1;
1.1 root 3168:
1.1.1.3 ! root 3169: sprintf(str_instr," ror %s %s\n",
1.1 root 3170: registers_name[numreg],
3171: parallelmove_name
3172: );
3173: }
3174:
3175: static void dsp_sbc(void)
3176: {
3177: const char *srcname;
1.1.1.2 root 3178: Uint32 numreg;
1.1 root 3179:
3180: if (cur_inst & (1<<4)) {
3181: srcname="y";
3182: } else {
3183: srcname="x";
3184: }
3185:
3186: numreg = DSP_REG_A+((cur_inst>>3) & 1);
3187:
3188: registers_changed[numreg]=1;
1.1.1.2 root 3189: registers_changed[DSP_REG_SR]=1;
1.1 root 3190:
1.1.1.3 ! root 3191: sprintf(str_instr," sbc %s,%s %s\n",
1.1 root 3192: srcname,
3193: registers_name[numreg],
3194: parallelmove_name
3195: );
3196: }
3197:
3198: static void dsp_sub(void)
3199: {
3200: const char *srcname;
1.1.1.2 root 3201: Uint32 srcreg, dstreg;
1.1 root 3202:
3203: srcreg = (cur_inst>>4) & BITMASK(3);
3204: dstreg = (cur_inst>>3) & 1;
3205:
3206: switch(srcreg) {
3207: case 1:
3208: srcreg = dstreg ^ 1;
3209: srcname = registers_name[DSP_REG_A+srcreg];
3210: break;
3211: case 2:
3212: srcname="x";
3213: break;
3214: case 3:
3215: srcname="y";
3216: break;
1.1.1.2 root 3217: case 4:
3218: srcname=registers_name[DSP_REG_X0];
3219: break;
3220: case 5:
3221: srcname=registers_name[DSP_REG_Y0];
3222: break;
3223: case 6:
3224: srcname=registers_name[DSP_REG_X1];
3225: break;
3226: case 7:
3227: srcname=registers_name[DSP_REG_Y1];
1.1 root 3228: break;
3229: default:
3230: srcname="";
3231: break;
3232: }
3233:
3234: registers_changed[DSP_REG_A+dstreg]=1;
1.1.1.2 root 3235: registers_changed[DSP_REG_SR]=1;
3236:
1.1.1.3 ! root 3237: sprintf(str_instr," sub %s,%s %s\n",
1.1 root 3238: srcname,
3239: registers_name[DSP_REG_A+dstreg],
3240: parallelmove_name
3241: );
3242: }
3243:
3244: static void dsp_subl(void)
3245: {
1.1.1.2 root 3246: Uint32 numreg;
1.1 root 3247:
3248: numreg = (cur_inst>>3) & 1;
3249:
3250: registers_changed[DSP_REG_A+numreg]=1;
1.1.1.2 root 3251: registers_changed[DSP_REG_SR]=1;
3252:
1.1.1.3 ! root 3253: sprintf(str_instr," subl %s,%s %s\n",
1.1 root 3254: registers_name[DSP_REG_A+(numreg ^ 1)],
3255: registers_name[DSP_REG_A+numreg],
3256: parallelmove_name
3257: );
3258: }
3259:
3260: static void dsp_subr(void)
3261: {
1.1.1.2 root 3262: Uint32 numreg;
1.1 root 3263:
3264: numreg = (cur_inst>>3) & 1;
3265:
3266: registers_changed[DSP_REG_A+numreg]=1;
1.1.1.2 root 3267: registers_changed[DSP_REG_SR]=1;
3268:
1.1.1.3 ! root 3269: sprintf(str_instr," subr %s,%s %s\n",
1.1 root 3270: registers_name[DSP_REG_A+(numreg ^ 1)],
3271: registers_name[DSP_REG_A+numreg],
3272: parallelmove_name
3273: );
3274: }
3275:
3276: static void dsp_tfr(void)
3277: {
1.1.1.2 root 3278: Uint32 srcreg, dstreg;
1.1 root 3279:
3280: srcreg = (cur_inst>>4) & BITMASK(3);
3281: dstreg = (cur_inst>>3) & 1;
3282:
1.1.1.2 root 3283: switch(srcreg) {
3284: case 4:
3285: srcreg = DSP_REG_X0;
3286: break;
3287: case 5:
3288: srcreg = DSP_REG_Y0;
3289: break;
3290: case 6:
3291: srcreg = DSP_REG_X1;
3292: break;
3293: case 7:
3294: srcreg = DSP_REG_Y1;
3295: break;
3296: case 0:
3297: default:
3298: srcreg = DSP_REG_A+(dstreg ^ 1);
3299: break;
1.1 root 3300: }
3301:
3302: registers_changed[DSP_REG_A+dstreg]=1;
1.1.1.2 root 3303: registers_changed[DSP_REG_SR]=1;
3304:
1.1.1.3 ! root 3305: sprintf(str_instr," tfr %s,%s %s\n",
1.1 root 3306: registers_name[srcreg],
3307: registers_name[DSP_REG_A+dstreg],
3308: parallelmove_name
3309: );
3310: }
3311:
3312: static void dsp_tst(void)
3313: {
1.1.1.2 root 3314: registers_changed[DSP_REG_SR]=1;
3315:
1.1.1.3 ! root 3316: sprintf(str_instr," tst %s %s\n",
1.1 root 3317: registers_name[DSP_REG_A+((cur_inst>>3) & 1)],
3318: parallelmove_name
3319: );
3320: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.