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