Previous 199869 Revisions Next

r24542 Saturday 27th July, 2013 at 17:03:58 UTC by Ville Linde
tms32082: split MP and PP disassembler (nw)
[src/emu/cpu]cpu.mak
[src/emu/cpu/tms32082]dis32082.c dis_mp.c* dis_pp.c* tms32082.c

trunk/src/emu/cpu/cpu.mak
r24541r24542
19871987ifneq ($(filter TMS32082,$(CPUS)),)
19881988OBJDIRS += $(CPUOBJ)/tms32082
19891989CPUOBJS += $(CPUOBJ)/tms32082/tms32082.o $(CPUOBJ)/tms32082/mp_ops.o
1990DASMOBJS += $(CPUOBJ)/tms32082/dis32082.o
1990DASMOBJS += $(CPUOBJ)/tms32082/dis_mp.o $(CPUOBJ)/tms32082/dis_pp.o
19911991endif
19921992
19931993$(CPUOBJ)/tms32082/tms32082.o:  $(CPUSRC)/tms32082/tms32082.c \
trunk/src/emu/cpu/tms32082/dis32082.c
r24541r24542
1// TMS32082 MP/PP Disassembler
2
3#include "emu.h"
4
5
6// Master Processor
7
8#define SIMM15(v) (INT32)((v & 0x4000) ? (v | 0xffffe000) : (v))
9#define UIMM15(v) (v)
10
11static const char *BCND_CONDITION[32] =
12{
13   "nev.b",    "gt0.b",    "eq0.b",    "ge0.b",    "lt0.b",    "ne0.b",    "le0.b",    "alw.b",
14   "nev.h",    "gt0.h",    "eq0.h",    "ge0.h",    "lt0.h",    "ne0.h",    "le0.h",    "alw.h",
15   "nev.w",    "gt0.w",    "eq0.w",    "ge0.w",    "lt0.w",    "ne0.w",    "le0.w",    "alw.w",
16   "nev.d",    "gt0.d",    "eq0.d",    "ge0.d",    "lt0.d",    "ne0.d",    "le0.d",    "alw.d",
17};
18
19static const char *BITNUM_CONDITION[32] =
20{
21   "eq.b",      "ne.b",      "gt.b",      "le.b",      "lt.b",      "ge.b",      "hi.b",      "ls.b",
22   "lo.b",      "hs.b",      "eq.h",      "ne.h",      "gt.h",      "le.h",      "lt.h",      "ge.h",
23   "hi.h",      "ls.h",      "lo.h",      "hs.h",      "eq.w",      "ne.w",      "gt.w",      "le.w",
24   "lt.w",      "ge.w",      "hi.w",      "ls.w",      "lo.w",      "hs.w",      "?",      "?",
25};
26
27static const char *MEMOP_S[2] =
28{
29   ":s", ""
30};
31
32static const char *MEMOP_M[2] =
33{
34   ":m", ""
35};
36
37static const char *FLOATOP_PRECISION[4] =
38{
39   "s", "d", "i", "u"
40};
41
42static const char *ACC_SEL[4] =
43{
44   "A0", "A1", "A2", "A3"
45};
46
47static const char *FLOATOP_ROUND[4] =
48{
49   "n", "z", "p", "m"
50};
51
52static char *output;
53static const UINT8 *opdata;
54static int opbytes;
55
56static void ATTR_PRINTF(1,2) print(const char *fmt, ...)
57{
58   va_list vl;
59
60   va_start(vl, fmt);
61   output += vsprintf(output, fmt, vl);
62   va_end(vl);
63}
64
65static UINT32 fetch(void)
66{
67   UINT32 d = ((UINT32)(opdata[0]) << 24) | ((UINT32)(opdata[1]) << 16) | ((UINT32)(opdata[2]) << 8) | opdata[3];
68   opdata += 4;
69   opbytes += 4;
70   return d;
71}
72
73static char* get_creg_name(UINT32 reg)
74{
75   static char buffer[64];
76
77   switch (reg)
78   {
79      case 0x0000:    sprintf(buffer, "EPC"); break;
80      case 0x0001:    sprintf(buffer, "EIP"); break;
81      case 0x0002:    sprintf(buffer, "CONFIG"); break;
82      case 0x0004:    sprintf(buffer, "INTPEN"); break;
83      case 0x0006:    sprintf(buffer, "IE"); break;
84      case 0x0008:    sprintf(buffer, "FPST"); break;
85      case 0x000a:    sprintf(buffer, "PPERROR"); break;
86      case 0x000d:    sprintf(buffer, "PKTREQ"); break;
87      case 0x000e:    sprintf(buffer, "TCOUNT"); break;
88      case 0x000f:    sprintf(buffer, "TSCALE"); break;
89      case 0x0010:    sprintf(buffer, "FLTOP"); break;
90      case 0x0011:    sprintf(buffer, "FLTADR"); break;
91      case 0x0012:    sprintf(buffer, "FLTTAG"); break;
92      case 0x0013:    sprintf(buffer, "FLTDTL"); break;
93      case 0x0014:    sprintf(buffer, "FLTDTH"); break;
94      case 0x0020:    sprintf(buffer, "SYSSTK"); break;
95      case 0x0021:    sprintf(buffer, "SYSTMP"); break;
96      case 0x0030:    sprintf(buffer, "MPC"); break;
97      case 0x0031:    sprintf(buffer, "MIP"); break;
98      case 0x0033:    sprintf(buffer, "ECOMCNTL"); break;
99      case 0x0034:    sprintf(buffer, "ANASTAT"); break;
100      case 0x0039:    sprintf(buffer, "BRK1"); break;
101      case 0x003a:    sprintf(buffer, "BRK2"); break;
102      case 0x4000:    sprintf(buffer, "IN0P"); break;
103      case 0x4001:    sprintf(buffer, "IN1P"); break;
104      case 0x4002:    sprintf(buffer, "OUTP"); break;
105      default:        sprintf(buffer, "CR %04X", reg);
106   }
107
108   return buffer;
109}
110
111static char* format_vector_op(UINT32 op, UINT32 imm32)
112{
113   static char buffer[256];
114   static char dest[64];
115   char *b = buffer;
116
117   int rd = (op >> 27) & 0x1f;
118   int rs = (op >> 22) & 0x1f;
119   int src1 = (op & 0x1f);
120   int subop = (op >> 12) & 0xff;
121   int vector_ls_bits = (((op >> 9) & 0x3) << 1) | ((op >> 6) & 1);
122
123   int p1 = (op >> 5) & 1;
124   int pd2 = (op >> 7) & 1;
125   int pd4 = (op >> 7) & 3;
126
127   int z = op & (1 << 8);
128
129   int acc = (((op >> 16) << 1) & 2) | ((op >> 11) & 1);
130   bool regdest = (op & (1 << 10)) == 0 && (op & (1 << 6)) == 0;
131
132   // accumulator or register destination
133   if (regdest)
134      sprintf(dest, "R%d", rd);
135   else
136      sprintf(dest, "A%d", acc);
137
138   // base op
139   switch (subop)
140   {
141      case 0xc0:  b += sprintf(b, "vadd.%s%s     R%d, R%d, R%d", FLOATOP_PRECISION[p1], FLOATOP_PRECISION[pd2], src1, rs, rs); break;
142      case 0xc1:  b += sprintf(b, "vadd.%s%s     0x%08X, R%d, R%d", FLOATOP_PRECISION[p1], FLOATOP_PRECISION[pd2], imm32, rs, rs); break;
143      case 0xc2:  b += sprintf(b, "vsub.%s%s     R%d, R%d, R%d", FLOATOP_PRECISION[p1], FLOATOP_PRECISION[pd2], rs, src1, rs); break;
144      case 0xc3:  b += sprintf(b, "vsub.%s%s     R%d, 0x%08X, R%d", FLOATOP_PRECISION[p1], FLOATOP_PRECISION[pd2], rs, imm32, rs); break;
145      case 0xc4:  b += sprintf(b, "vmpy.%s%s     R%d, R%d, R%d", FLOATOP_PRECISION[p1], FLOATOP_PRECISION[pd2], src1, rs, rs); break;
146      case 0xc5:  b += sprintf(b, "vmpy.%s%s     0x%08X, R%d, R%d", FLOATOP_PRECISION[p1], FLOATOP_PRECISION[pd2], imm32, rs, rs); break;
147
148      case 0xd6: case 0xc6:
149               b += sprintf(b, "vmsub.s%s    R%d, %s, R%d", FLOATOP_PRECISION[pd2], src1, z ? "0" : ACC_SEL[acc], rs);
150               break;
151      case 0xd7: case 0xc7:
152               b += sprintf(b, "vmsub.s%s    0x%08X, %s, R%d", FLOATOP_PRECISION[pd2], imm32, z ? "0" : ACC_SEL[acc], rs);
153               break;
154      case 0xd8: case 0xc8:
155               b += sprintf(b, "vrnd.%s%s     R%d, R%d", FLOATOP_PRECISION[p1], FLOATOP_PRECISION[pd4], src1, rs);
156               break;
157      case 0xd9: case 0xc9:
158               b += sprintf(b, "vrnd.%s%s     0x%08X, R%d", FLOATOP_PRECISION[p1], FLOATOP_PRECISION[pd4], imm32, rs);
159               break;
160
161      case 0xca:   b += sprintf(b, "vrnd.%s%s     R%d, R%d", FLOATOP_PRECISION[2 + p1], FLOATOP_PRECISION[pd2],src1, rs); break;
162      case 0xcb:   b += sprintf(b, "vrnd.%s%s     0x%08X, R%d", FLOATOP_PRECISION[2 + p1], FLOATOP_PRECISION[pd2], imm32, rs); break;
163
164      case 0xcc: case 0xdc:
165               b += sprintf(b, "vmac.ss%s    R%d, R%d, %s, %s", FLOATOP_PRECISION[(op >> 9) & 1], src1, rs, z ? "0" : ACC_SEL[acc], (regdest && rd == 0) ? ACC_SEL[acc] : dest);
166               break;
167      case 0xcd: case 0xdd:
168               b += sprintf(b, "vmac.ss%s    0x%08X, R%d, %s, %s", FLOATOP_PRECISION[(op >> 9) & 1], imm32, rs, z ? "0" : ACC_SEL[acc], (regdest && rd == 0) ? ACC_SEL[acc] : dest);
169               break;
170      case 0xce: case 0xde:
171               b += sprintf(b, "vmsc.ss%s    R%d, R%d, %s, %s", FLOATOP_PRECISION[(op >> 9) & 1], src1, rs, z ? "0" : ACC_SEL[acc], (regdest && rd == 0) ? ACC_SEL[acc] : dest);
172               break;
173      case 0xcf: case 0xdf:
174               b += sprintf(b, "vmsc.ss%s    0x%08X, R%d, %s, %s", FLOATOP_PRECISION[(op >> 9) & 1], imm32, rs, z ? "0" : ACC_SEL[acc], (regdest && rd == 0) ? ACC_SEL[acc] : dest);
175               break;
176
177      default:   b += sprintf(b, "?"); break;
178   }
179
180   // align the line end
181   int len = strlen(buffer);
182   if (len < 30)
183   {
184      for (int i=0; i < (30-len); i++)
185      {
186         b += sprintf(b, " ");
187      }
188   }   
189
190   // optional load/store op
191   switch (vector_ls_bits)
192   {
193      case 0x01:      b += sprintf(b, "|| vst.s   R%d", rd); break;
194      case 0x03:      b += sprintf(b, "|| vst.d   R%d", rd); break;
195      case 0x04:      b += sprintf(b, "|| vld0.s  R%d", rd); break;
196      case 0x05:      b += sprintf(b, "|| vld1.s  R%d", rd); break;
197      case 0x06:      b += sprintf(b, "|| vld0.d  R%d", rd); break;
198      case 0x07:      b += sprintf(b, "|| vld1.d  R%d", rd); break;
199   }
200
201   return buffer;
202}
203
204static offs_t tms32082_disasm_mp(char *buffer, offs_t pc, const UINT8 *oprom)
205{
206   output = buffer;
207   opdata = oprom;
208   opbytes = 0;
209   UINT32 flags = 0;
210
211   UINT32 op = fetch();
212
213   int rd = (op >> 27) & 0x1f;
214   int link = rd;
215   int bitnum = rd ^ 0x1f;
216   int rs = (op >> 22) & 0x1f;
217   int endmask = (op >> 5) & 0x1f;
218   int rotate = (op & 0x1f);
219   int src1 = rotate;
220   UINT32 uimm15 = op & 0x7fff;
221
222   switch ((op >> 20) & 3)
223   {
224      case 0: case 1: case 2:     // Short immediate
225      {
226         int subop = (op >> 15) & 0x7f;
227         int m = op & (1 << 17) ? 0 : 1;
228
229         switch (subop)
230         {
231            case 0x00:   print("illop0      "); break;
232            case 0x01:   print("trap        %d", UIMM15(uimm15)); break;
233            case 0x02:   print("cmnd        0x%04X", UIMM15(uimm15)); break;
234            case 0x04:   print("rdcr        %s, R%d", get_creg_name(UIMM15(uimm15)), rd); break;
235            case 0x05:   print("swcr        R%d, %s, R%d", rd, get_creg_name(UIMM15(uimm15)), rs); break;
236            case 0x06:   print("brcr        %s", get_creg_name(UIMM15(uimm15))); break;
237            case 0x08:   print("shift%s.dz   %d, %d, R%d, R%d", (op & (1 << 10)) ? "r" : "l", rotate, endmask, rs, rd); break;
238            case 0x09:   print("shift%s.dm   %d, %d, R%d, R%d", (op & (1 << 10)) ? "r" : "l", rotate, endmask, rs, rd); break;
239            case 0x0a:   print("shift%s.ds   %d, %d, R%d, R%d", (op & (1 << 10)) ? "r" : "l", rotate, endmask, rs, rd); break;
240            case 0x0b:   print("shift%s.ez   %d, %d, R%d, R%d", (op & (1 << 10)) ? "r" : "l", rotate, endmask, rs, rd); break;
241            case 0x0c:   print("shift%s.em   %d, %d, R%d, R%d", (op & (1 << 10)) ? "r" : "l", rotate, endmask, rs, rd); break;
242            case 0x0d:   print("shift%s.es   %d, %d, R%d, R%d", (op & (1 << 10)) ? "r" : "l", rotate, endmask, rs, rd); break;
243            case 0x0e:   print("shift%s.iz   %d, %d, R%d, R%d", (op & (1 << 10)) ? "r" : "l", rotate, endmask, rs, rd); break;
244            case 0x0f:   print("shift%s.im   %d, %d, R%d, R%d", (op & (1 << 10)) ? "r" : "l", rotate, endmask, rs, rd); break;
245            case 0x11:   print("and         0x%04X, R%d, R%d", UIMM15(uimm15), rs, rd); break;
246            case 0x12:   print("and.tf      0x%04X, R%d, R%d", UIMM15(uimm15), rs, rd); break;
247            case 0x14:   print("and.ft      0x%04X, R%d, R%d", UIMM15(uimm15), rs, rd); break;
248            case 0x16:   print("xor         0x%04X, R%d, R%d", UIMM15(uimm15), rs, rd); break;
249            case 0x17:   print("or          0x%04X, R%d, R%d", UIMM15(uimm15), rs, rd); break;
250            case 0x18:   print("and.ff      0x%04X, R%d, R%d", UIMM15(uimm15), rs, rd); break;
251            case 0x19:   print("xnor        0x%04X, R%d, R%d", UIMM15(uimm15), rs, rd); break;
252            case 0x1b:   print("or.tf       0x%04X, R%d, R%d", UIMM15(uimm15), rs, rd); break;
253            case 0x1d:   print("or.ft       0x%04X, R%d, R%d", UIMM15(uimm15), rs, rd); break;
254            case 0x1e:   print("or.ff       0x%04X, R%d, R%d", UIMM15(uimm15), rs, rd); break;
255
256            case 0x24: case 0x20:
257                     print("ld.b        0x%04X(R%d%s), R%d", UIMM15(uimm15), rs, MEMOP_M[m], rd);
258                     break;
259            case 0x25: case 0x21:
260                     print("ld.h        0x%04X(R%d%s), R%d", UIMM15(uimm15), rs, MEMOP_M[m], rd);
261                     break;
262            case 0x26: case 0x22:
263                     print("ld          0x%04X(R%d%s), R%d", UIMM15(uimm15), rs, MEMOP_M[m], rd);
264                     break;
265            case 0x27: case 0x23:
266                     print("ld.d        0x%04X(R%d%s), R%d", UIMM15(uimm15), rs, MEMOP_M[m], rd);
267                     break;
268            case 0x2c: case 0x28:
269                     print("ld.ub       0x%04X(R%d%s), R%d", UIMM15(uimm15), rs, MEMOP_M[m], rd);
270                     break;
271            case 0x2d: case 0x29:
272                     print("ld.uh       0x%04X(R%d%s), R%d", UIMM15(uimm15), rs, MEMOP_M[m], rd);
273                     break;
274
275            case 0x34: case 0x30:
276                     print("st.b        R%d, 0x%04X(R%d%s)", rd, UIMM15(uimm15), rs, MEMOP_M[m]);
277                     break;
278            case 0x35: case 0x31:
279                     print("st.h        R%d, 0x%04X(R%d%s)", rd, UIMM15(uimm15), rs, MEMOP_M[m]);
280                     break;
281            case 0x36: case 0x32:
282                     print("st          R%d, 0x%04X(R%d%s)", rd, UIMM15(uimm15), rs, MEMOP_M[m]);
283                     break;
284            case 0x37: case 0x33:
285                     print("st.d        R%d, 0x%04X(R%d%s)", rd, UIMM15(uimm15), rs, MEMOP_M[m]);
286                     break;
287
288            case 0x40:   print("bsr         0x%08X, R%d", pc + (SIMM15(uimm15) * 4), link); break;
289            case 0x41:   print("bsr.a       0x%08X, R%d", pc + (SIMM15(uimm15) * 4), link); break;
290            case 0x44:   print("jsr         0x%04X(R%d), R%d", SIMM15(uimm15), rs, link); break;
291            case 0x45:   print("jsr.a       0x%04X(R%d), R%d", SIMM15(uimm15), rs, link); break;
292            case 0x48:   print("bbz         0x%08X, R%d, %s (%d)", pc + (SIMM15(uimm15) * 4), rs, BITNUM_CONDITION[bitnum], bitnum); break;
293            case 0x49:   print("bbz.a       0x%08X, R%d, %s (%d)", pc + (SIMM15(uimm15) * 4), rs, BITNUM_CONDITION[bitnum], bitnum); break;
294            case 0x4a:   print("bbo         0x%08X, R%d, %s (%d)", pc + (SIMM15(uimm15) * 4), rs, BITNUM_CONDITION[bitnum], bitnum); break;
295            case 0x4b:   print("bbo.a       0x%08X, R%d, %s (%d)", pc + (SIMM15(uimm15) * 4), rs, BITNUM_CONDITION[bitnum], bitnum); break;
296            case 0x4c:   print("bcnd        0x%08X, R%d, %s", pc + (SIMM15(uimm15) * 4), rs, BCND_CONDITION[rd]); break;
297            case 0x4d:   print("bcnd.a      0x%08X, R%d, %s", pc + (SIMM15(uimm15) * 4), rs, BCND_CONDITION[rd]); break;
298            case 0x50:   print("cmp         0x%08X, R%d, R%d", SIMM15(uimm15), rs, rd); break;
299            case 0x58:   print("add         0x%08X, R%d, R%d", SIMM15(uimm15), rs, rd); break;
300            case 0x59:   print("addu        0x%08X, R%d, R%d", SIMM15(uimm15), rs, rd); break;
301            case 0x5a:   print("sub         0x%08X, R%d, R%d", SIMM15(uimm15), rs, rd); break;
302            case 0x5b:   print("subu        0x%08X, R%d, R%d", SIMM15(uimm15), rs, rd); break;
303
304            default:   print("?"); break;
305         }
306         break;
307      }
308
309      case 3:                     // Register / Long immediate
310      {
311         int subop = (op >> 12) & 0xff;
312
313         UINT32 imm32 = 0;
314         if (op & (1 << 12))     // fetch 32-bit immediate if needed
315            imm32 = fetch();
316
317         int m = op & (1 << 15) ? 0 : 1;
318         int s = op & (1 << 11) ? 0 : 1;
319
320         int p1 = (op >> 5) & 3;
321         int p2 = (op >> 7) & 3;
322         int pd = (op >> 9) & 3;
323
324         int rndmode = (op >> 7) & 3;
325
326
327         switch (subop)
328         {
329            case 0x02:   print("trap        %d", src1); break;
330            case 0x03:   print("trap        %d", imm32); break;
331            case 0x04:   print("cmnd        R%d", src1); break;
332            case 0x05:   print("cmnd        0x%08X", imm32); break;
333            case 0x08:   print("rdcr        R%d, R%d,", src1, rd); break;
334            case 0x09:   print("rdcr        %s, R%d", get_creg_name(imm32), rd); break;
335            case 0x0a:   print("swcr        R%d, R%d, R%d", rd, src1, rs); break;
336            case 0x0b:   print("swcr        R%d, %s, R%d", rd, get_creg_name(imm32), rs); break;
337            case 0x0c:   print("brcr        R%d", src1); break;
338            case 0x0d:   print("brcr        %s", get_creg_name(imm32)); break;
339
340            case 0x10:  print("shift%s.dz   %d, %d, R%d, R%d", (op & (1 << 10)) ? "r" : "l", rotate, endmask, rs, rd); break;
341            case 0x12:  print("shift%s.dm   %d, %d, R%d, R%d", (op & (1 << 10)) ? "r" : "l", rotate, endmask, rs, rd); break;
342            case 0x14:  print("shift%s.ds   %d, %d, R%d, R%d", (op & (1 << 10)) ? "r" : "l", rotate, endmask, rs, rd); break;
343            case 0x16:  print("shift%s.ez   %d, %d, R%d, R%d", (op & (1 << 10)) ? "r" : "l", rotate, endmask, rs, rd); break;
344            case 0x18:  print("shift%s.em   %d, %d, R%d, R%d", (op & (1 << 10)) ? "r" : "l", rotate, endmask, rs, rd); break;
345            case 0x1a:  print("shift%s.es   %d, %d, R%d, R%d", (op & (1 << 10)) ? "r" : "l", rotate, endmask, rs, rd); break;
346            case 0x1c:  print("shift%s.iz   %d, %d, R%d, R%d", (op & (1 << 10)) ? "r" : "l", rotate, endmask, rs, rd); break;
347            case 0x1e:  print("shift%s.im   %d, %d, R%d, R%d", (op & (1 << 10)) ? "r" : "l", rotate, endmask, rs, rd); break;
348
349            case 0x22:  print("and         R%d, R%d, R%d", src1, rs, rd); break;
350            case 0x23:  print("and         0x%08X, R%d, R%d", imm32, rs, rd); break;
351            case 0x24:  print("and.tf      R%d, R%d, R%d", src1, rs, rd); break;
352            case 0x25:  print("and.tf      0x%08X, R%d, R%d", imm32, rs, rd); break;
353            case 0x28:  print("and.ft      R%d, R%d, R%d", src1, rs, rd); break;
354            case 0x29:  print("and.ft      0x%08X, R%d, R%d", imm32, rs, rd); break;
355            case 0x2c:  print("xor         R%d, R%d, R%d", src1, rs, rd); break;
356            case 0x2d:  print("xor         0x%08X, R%d, R%d", imm32, rs, rd); break;
357            case 0x2e:  print("or          R%d, R%d, R%d", src1, rs, rd); break;
358            case 0x2f:  print("or          0x%08X, R%d, R%d", imm32, rs, rd); break;
359            case 0x30:  print("and.ff      R%d, R%d, R%d", src1, rs, rd); break;
360            case 0x31:  print("and.ff      0x%08X, R%d, R%d", imm32, rs, rd); break;
361            case 0x32:  print("xnor        R%d, R%d, R%d", src1, rs, rd); break;
362            case 0x33:  print("xnor        0x%08X, R%d, R%d", imm32, rs, rd); break;
363            case 0x36:  print("or.tf       R%d, R%d, R%d", src1, rs, rd); break;
364            case 0x37:  print("or.tf       0x%08X, R%d, R%d", imm32, rs, rd); break;
365            case 0x3a:  print("or.ft       R%d, R%d, R%d", src1, rs, rd); break;
366            case 0x3b:  print("or.ft       0x%08X, R%d, R%d", imm32, rs, rd); break;
367            case 0x3c:  print("or.ff       R%d, R%d, R%d", src1, rs, rd); break;
368            case 0x3d:  print("or.ff       0x%08X, R%d, R%d", imm32, rs, rd); break;
369
370            case 0x48: case 0x40:
371                     print("ld.b        R%d%s(R%d%s), R%d", src1, MEMOP_S[s], rs, MEMOP_M[m], rd);
372                     break;
373            case 0x49: case 0x41:
374                     print("ld.b        0x%08X%s(R%d%s), R%d", imm32, MEMOP_S[s], rs, MEMOP_M[m], rd);
375                     break;
376            case 0x4a: case 0x42:
377                     print("ld.h        R%d%s(R%d%s), R%d", src1, MEMOP_S[s], rs, MEMOP_M[m], rd);
378                     break;
379            case 0x4b: case 0x43:
380                     print("ld.h        0x%08X%s(R%d%s), R%d", imm32, MEMOP_S[s], rs, MEMOP_M[m], rd);
381                     break;
382            case 0x4c: case 0x44:
383                     print("ld          R%d%s(R%d%s), R%d", src1, MEMOP_S[s], rs, MEMOP_M[m], rd);
384                     break;
385            case 0x4d: case 0x45:
386                     print("ld          0x%08X%s(R%d%s), R%d", imm32, MEMOP_S[s], rs,MEMOP_M[m], rd);
387                     break;
388            case 0x4e: case 0x46:
389                     print("ld.d        R%d%s(R%d%s), R%d", src1, MEMOP_S[s], rs, MEMOP_M[m], rd);
390                     break;
391            case 0x4f: case 0x47:
392                     print("ld.d        0x%08X%s(R%d%s), R%d", imm32, MEMOP_S[s], rs, MEMOP_M[m], rd);
393                     break;
394            case 0x58: case 0x50:
395                     print("ld.ub       R%d%s(R%d%s), R%d", src1, MEMOP_S[s], rs, MEMOP_M[m], rd);
396                     break;
397            case 0x59: case 0x51:
398                     print("ld.ub       0x%08X%s(R%d%s), R%d", imm32, MEMOP_S[s], rs, MEMOP_M[m], rd);
399                     break;
400            case 0x5a: case 0x52:
401                     print("ld.uh       R%d%s(R%d%s), R%d", src1, MEMOP_S[s], rs, MEMOP_M[m], rd);
402                     break;
403            case 0x5b: case 0x53:
404                     print("ld.uh       0x%08X%s(R%d%s), R%d", imm32, MEMOP_S[s], rs, MEMOP_M[m], rd);
405                     break;
406
407            case 0x68: case 0x60:
408                     print("st.b        R%d, R%d%s(R%d%s)", rd, src1, MEMOP_S[s], rs, MEMOP_M[m]);
409                     break;
410            case 0x69: case 0x61:
411                     print("st.b        R%d, 0x%08X%s(R%d%s)", rd, imm32, MEMOP_S[s], rs, MEMOP_M[m]);
412                     break;
413            case 0x6a: case 0x62:
414                     print("st.h        R%d, R%d%s(R%d%s)", rd, src1, MEMOP_S[s], rs, MEMOP_M[m]);
415                     break;
416            case 0x6b: case 0x63:
417                     print("st.h        R%d, 0x%08X%s(R%d%s)", rd, imm32, MEMOP_S[s], rs, MEMOP_M[m]);
418                     break;
419            case 0x6c: case 0x64:
420                     print("st          R%d, R%d%s(R%d%s)", rd, src1, MEMOP_S[s], rs, MEMOP_M[m]);
421                     break;
422            case 0x6d: case 0x65:
423                     print("st          R%d, 0x%08X%s(R%d%s)", rd, imm32, MEMOP_S[s], rs, MEMOP_M[m]);
424                     break;
425            case 0x6e: case 0x66:
426                     print("st.d        R%d, R%d%s(R%d%s)", rd, src1, MEMOP_S[s], rs, MEMOP_M[m]);
427                     break;
428            case 0x6f: case 0x67:
429                     print("st.d        R%d, 0x%08X%s(R%d%s)", rd, imm32, MEMOP_S[s], rs, MEMOP_M[m]);
430                     break;
431
432            case 0x78: case 0x70:
433                     print("dcache      R%d(R%d)", src1, rs);
434                     break;
435            case 0x79: case 0x71:
436                     print("dcache      0x%08X(R%d)", imm32, rs);
437                     break;
438
439            case 0x80:   print("bsr         R%d, R%d", src1, link); break;
440            case 0x81:   print("bsr         0x%08X, R%d", imm32, link); break;
441            case 0x82:   print("bsr.a       R%d, R%d", src1, rd); break;
442            case 0x83:   print("bsr.a       0x%08X, R%d", imm32, link); break;
443            case 0x88:   print("jsr         R%d, R%d", src1, link); break;
444            case 0x89:   print("jsr         0x%08X, R%d", imm32, link); break;
445            case 0x8a:   print("jsr.a       R%d, R%d", src1, link); break;
446            case 0x8b:   print("jsr.a       0x%08X, R%d", imm32, link); break;
447            case 0x90:   print("bbz         R%d, R%d, %s (%d)", src1, rs, BITNUM_CONDITION[bitnum], bitnum); break;
448            case 0x91:   print("bbz         0x%08X, R%d, %s (%d)", imm32, rs, BITNUM_CONDITION[bitnum], bitnum); break;
449            case 0x92:   print("bbz.a       R%d, R%d, %s (%d)", src1, rs, BITNUM_CONDITION[bitnum], bitnum); break;
450            case 0x93:   print("bbz.a       0x%08X, R%d, %s (%d)", imm32, rs, BITNUM_CONDITION[bitnum], bitnum); break;
451            case 0x94:   print("bbo         R%d, R%d, %s (%d)", src1, rs, BITNUM_CONDITION[bitnum], bitnum); break;
452            case 0x95:   print("bbo         0x%08X, R%d, %s (%d)", imm32, rs, BITNUM_CONDITION[bitnum], bitnum); break;
453            case 0x96:   print("bbo.a       R%d, R%d, %s (%d)", src1, rs, BITNUM_CONDITION[bitnum], bitnum); break;
454            case 0x97:   print("bbo.a       0x%08X, R%d, %s (%d)", imm32, rs, BITNUM_CONDITION[bitnum], bitnum); break;
455            case 0x98:   print("bcnd        R%d, R%d, %s", src1, rs, BCND_CONDITION[rd]); break;
456            case 0x99:   print("bcnd        0x%08X, R%d, %s", imm32, rs, BCND_CONDITION[rd]); break;
457            case 0x9a:   print("bcnd.a      R%d, R%d, %s", src1, rs, BCND_CONDITION[rd]); break;
458            case 0x9b:   print("bcnd.a      0x%08X, R%d, %s", imm32, rs, BCND_CONDITION[rd]); break;
459            case 0xa0:   print("cmp         R%d, R%d, R%d", src1, rs, rd); break;
460            case 0xa1:   print("cmp         0x%08X, R%d, R%d", imm32, rs, rd); break;
461            case 0xb0:   print("add         R%d, R%d, R%d", src1, rs, rd); break;
462            case 0xb1:   print("add         0x%08X, R%d, R%d", imm32, rs, rd); break;
463            case 0xb2:   print("addu        R%d, R%d, R%d", src1, rs, rd); break;
464            case 0xb3:   print("addu        0x%08X, R%d, R%d", imm32, rs, rd); break;
465            case 0xb4:   print("sub         R%d, R%d, R%d", src1, rs, rd); break;
466            case 0xb5:   print("sub         0x%08X, R%d, R%d", imm32, rs, rd); break;
467            case 0xb6:   print("subu        R%d, R%d, R%d", src1, rs, rd); break;
468            case 0xb7:   print("subu        0x%08X, R%d, R%d", imm32, rs, rd); break;
469
470            case 0xc0: case 0xc1: case 0xc2: case 0xc3: case 0xc4: case 0xc5:
471            case 0xc6: case 0xd6: case 0xc7: case 0xd7: case 0xc8: case 0xd8: case 0xc9: case 0xd9:
472            case 0xca: case 0xcb: case 0xcc: case 0xdc: case 0xcd: case 0xdd: case 0xce: case 0xde:
473            case 0xcf: case 0xdf:
474            {
475               print("%s", format_vector_op(op, imm32));
476               break;
477            }
478
479            case 0xe0:   print("fadd.%s%s%s    R%d, R%d, R%d", FLOATOP_PRECISION[p1], FLOATOP_PRECISION[p2], FLOATOP_PRECISION[pd], src1, rs, rd); break;
480            case 0xe1:   print("fadd.%s%s%s    0x%08X, R%d, R%d", FLOATOP_PRECISION[p1], FLOATOP_PRECISION[p2], FLOATOP_PRECISION[pd], imm32, rs, rd); break;
481            case 0xe2:   print("fsub.%s%s%s    R%d, R%d, R%d", FLOATOP_PRECISION[p1], FLOATOP_PRECISION[p2], FLOATOP_PRECISION[pd], src1, rs, rd); break;
482            case 0xe3:   print("fsub.%s%s%s    0x%08X, R%d, R%d", FLOATOP_PRECISION[p1], FLOATOP_PRECISION[p2], FLOATOP_PRECISION[pd], imm32, rs, rd); break;
483            case 0xe4:   print("fmpy.%s%s%s    R%d, R%d, R%d", FLOATOP_PRECISION[p1], FLOATOP_PRECISION[p2], FLOATOP_PRECISION[pd], src1, rs, rd); break;
484            case 0xe5:   print("fmpy.%s%s%s    0x%08X, R%d, R%d", FLOATOP_PRECISION[p1], FLOATOP_PRECISION[p2], FLOATOP_PRECISION[pd], imm32, rs, rd); break;
485            case 0xe6:   print("fdiv.%s%s%s    R%d, R%d, R%d", FLOATOP_PRECISION[p1], FLOATOP_PRECISION[p2], FLOATOP_PRECISION[pd], src1, rs, rd); break;
486            case 0xe7:   print("fdiv.%s%s%s    0x%08X, R%d, R%d", FLOATOP_PRECISION[p1], FLOATOP_PRECISION[p2], FLOATOP_PRECISION[pd], imm32, rs, rd); break;
487            case 0xe8:   print("frnd%s.%s%s    R%d, R%d", FLOATOP_ROUND[rndmode], FLOATOP_PRECISION[p1], FLOATOP_PRECISION[pd], src1, rd); break;
488            case 0xe9:   print("frnd%s.%s%s    0x%08X, R%d", FLOATOP_ROUND[rndmode], FLOATOP_PRECISION[p1], FLOATOP_PRECISION[pd], imm32, rd); break;
489            case 0xea:   print("fcmp        R%d, R%d, R%d", src1, rs, rd); break;
490            case 0xeb:   print("fcmp        0x%08X, R%d, R%d", imm32, rs, rd); break;
491            case 0xee:   print("fsqrt       R%d, R%d", src1, rd); break;
492            case 0xef:   print("fsqrt       0x%08X, R%d", imm32, rd); break;
493            case 0xf0:   print("lmo         R%d, R%d", rs, rd); break;
494            case 0xf2:   print("rmo         R%d, R%d", rs, rd); break;
495            case 0xfc:   print("estop       "); break;
496           
497            case 0xfe: case 0xff:
498                     print("illopF      ");
499                     break;
500
501            default:   print("?"); break;
502         }
503         break;
504      }
505   }
506
507   return opbytes | flags | DASMFLAG_SUPPORTED;
508}
509
510CPU_DISASSEMBLE(tms32082_mp)
511{
512   return tms32082_disasm_mp(buffer, pc, oprom);
513}
514
515
516
517// Parallel Processor
518
519static offs_t tms32082_disasm_pp(char *buffer, offs_t pc, const UINT8 *oprom)
520{
521   output = buffer;
522   UINT32 flags = 0;
523
524   print("???");
525
526   return opbytes | flags | DASMFLAG_SUPPORTED;
527}
528
529
530CPU_DISASSEMBLE(tms32082_pp)
531{
532   return tms32082_disasm_pp(buffer, pc, oprom);
533}
No newline at end of file
trunk/src/emu/cpu/tms32082/dis_mp.c
r0r24542
1// TMS32082 MP Disassembler
2
3#include "emu.h"
4
5
6#define SIMM15(v) (INT32)((v & 0x4000) ? (v | 0xffffe000) : (v))
7#define UIMM15(v) (v)
8
9static const char *BCND_CONDITION[32] =
10{
11   "nev.b",    "gt0.b",    "eq0.b",    "ge0.b",    "lt0.b",    "ne0.b",    "le0.b",    "alw.b",
12   "nev.h",    "gt0.h",    "eq0.h",    "ge0.h",    "lt0.h",    "ne0.h",    "le0.h",    "alw.h",
13   "nev.w",    "gt0.w",    "eq0.w",    "ge0.w",    "lt0.w",    "ne0.w",    "le0.w",    "alw.w",
14   "nev.d",    "gt0.d",    "eq0.d",    "ge0.d",    "lt0.d",    "ne0.d",    "le0.d",    "alw.d",
15};
16
17static const char *BITNUM_CONDITION[32] =
18{
19   "eq.b",      "ne.b",      "gt.b",      "le.b",      "lt.b",      "ge.b",      "hi.b",      "ls.b",
20   "lo.b",      "hs.b",      "eq.h",      "ne.h",      "gt.h",      "le.h",      "lt.h",      "ge.h",
21   "hi.h",      "ls.h",      "lo.h",      "hs.h",      "eq.w",      "ne.w",      "gt.w",      "le.w",
22   "lt.w",      "ge.w",      "hi.w",      "ls.w",      "lo.w",      "hs.w",      "?",      "?",
23};
24
25static const char *MEMOP_S[2] =
26{
27   ":s", ""
28};
29
30static const char *MEMOP_M[2] =
31{
32   ":m", ""
33};
34
35static const char *FLOATOP_PRECISION[4] =
36{
37   "s", "d", "i", "u"
38};
39
40static const char *ACC_SEL[4] =
41{
42   "A0", "A1", "A2", "A3"
43};
44
45static const char *FLOATOP_ROUND[4] =
46{
47   "n", "z", "p", "m"
48};
49
50static char *output;
51static const UINT8 *opdata;
52static int opbytes;
53
54static void ATTR_PRINTF(1,2) print(const char *fmt, ...)
55{
56   va_list vl;
57
58   va_start(vl, fmt);
59   output += vsprintf(output, fmt, vl);
60   va_end(vl);
61}
62
63static UINT32 fetch(void)
64{
65   UINT32 d = ((UINT32)(opdata[0]) << 24) | ((UINT32)(opdata[1]) << 16) | ((UINT32)(opdata[2]) << 8) | opdata[3];
66   opdata += 4;
67   opbytes += 4;
68   return d;
69}
70
71static char* get_creg_name(UINT32 reg)
72{
73   static char buffer[64];
74
75   switch (reg)
76   {
77      case 0x0000:    sprintf(buffer, "EPC"); break;
78      case 0x0001:    sprintf(buffer, "EIP"); break;
79      case 0x0002:    sprintf(buffer, "CONFIG"); break;
80      case 0x0004:    sprintf(buffer, "INTPEN"); break;
81      case 0x0006:    sprintf(buffer, "IE"); break;
82      case 0x0008:    sprintf(buffer, "FPST"); break;
83      case 0x000a:    sprintf(buffer, "PPERROR"); break;
84      case 0x000d:    sprintf(buffer, "PKTREQ"); break;
85      case 0x000e:    sprintf(buffer, "TCOUNT"); break;
86      case 0x000f:    sprintf(buffer, "TSCALE"); break;
87      case 0x0010:    sprintf(buffer, "FLTOP"); break;
88      case 0x0011:    sprintf(buffer, "FLTADR"); break;
89      case 0x0012:    sprintf(buffer, "FLTTAG"); break;
90      case 0x0013:    sprintf(buffer, "FLTDTL"); break;
91      case 0x0014:    sprintf(buffer, "FLTDTH"); break;
92      case 0x0020:    sprintf(buffer, "SYSSTK"); break;
93      case 0x0021:    sprintf(buffer, "SYSTMP"); break;
94      case 0x0030:    sprintf(buffer, "MPC"); break;
95      case 0x0031:    sprintf(buffer, "MIP"); break;
96      case 0x0033:    sprintf(buffer, "ECOMCNTL"); break;
97      case 0x0034:    sprintf(buffer, "ANASTAT"); break;
98      case 0x0039:    sprintf(buffer, "BRK1"); break;
99      case 0x003a:    sprintf(buffer, "BRK2"); break;
100      case 0x4000:    sprintf(buffer, "IN0P"); break;
101      case 0x4001:    sprintf(buffer, "IN1P"); break;
102      case 0x4002:    sprintf(buffer, "OUTP"); break;
103      default:        sprintf(buffer, "CR %04X", reg);
104   }
105
106   return buffer;
107}
108
109static char* format_vector_op(UINT32 op, UINT32 imm32)
110{
111   static char buffer[256];
112   static char dest[64];
113   char *b = buffer;
114
115   int rd = (op >> 27) & 0x1f;
116   int rs = (op >> 22) & 0x1f;
117   int src1 = (op & 0x1f);
118   int subop = (op >> 12) & 0xff;
119   int vector_ls_bits = (((op >> 9) & 0x3) << 1) | ((op >> 6) & 1);
120
121   int p1 = (op >> 5) & 1;
122   int pd2 = (op >> 7) & 1;
123   int pd4 = (op >> 7) & 3;
124
125   int z = op & (1 << 8);
126
127   int acc = (((op >> 16) << 1) & 2) | ((op >> 11) & 1);
128   bool regdest = (op & (1 << 10)) == 0 && (op & (1 << 6)) == 0;
129
130   // accumulator or register destination
131   if (regdest)
132      sprintf(dest, "R%d", rd);
133   else
134      sprintf(dest, "A%d", acc);
135
136   // base op
137   switch (subop)
138   {
139      case 0xc0:  b += sprintf(b, "vadd.%s%s     R%d, R%d, R%d", FLOATOP_PRECISION[p1], FLOATOP_PRECISION[pd2], src1, rs, rs); break;
140      case 0xc1:  b += sprintf(b, "vadd.%s%s     0x%08X, R%d, R%d", FLOATOP_PRECISION[p1], FLOATOP_PRECISION[pd2], imm32, rs, rs); break;
141      case 0xc2:  b += sprintf(b, "vsub.%s%s     R%d, R%d, R%d", FLOATOP_PRECISION[p1], FLOATOP_PRECISION[pd2], rs, src1, rs); break;
142      case 0xc3:  b += sprintf(b, "vsub.%s%s     R%d, 0x%08X, R%d", FLOATOP_PRECISION[p1], FLOATOP_PRECISION[pd2], rs, imm32, rs); break;
143      case 0xc4:  b += sprintf(b, "vmpy.%s%s     R%d, R%d, R%d", FLOATOP_PRECISION[p1], FLOATOP_PRECISION[pd2], src1, rs, rs); break;
144      case 0xc5:  b += sprintf(b, "vmpy.%s%s     0x%08X, R%d, R%d", FLOATOP_PRECISION[p1], FLOATOP_PRECISION[pd2], imm32, rs, rs); break;
145
146      case 0xd6: case 0xc6:
147               b += sprintf(b, "vmsub.s%s    R%d, %s, R%d", FLOATOP_PRECISION[pd2], src1, z ? "0" : ACC_SEL[acc], rs);
148               break;
149      case 0xd7: case 0xc7:
150               b += sprintf(b, "vmsub.s%s    0x%08X, %s, R%d", FLOATOP_PRECISION[pd2], imm32, z ? "0" : ACC_SEL[acc], rs);
151               break;
152      case 0xd8: case 0xc8:
153               b += sprintf(b, "vrnd.%s%s     R%d, R%d", FLOATOP_PRECISION[p1], FLOATOP_PRECISION[pd4], src1, rs);
154               break;
155      case 0xd9: case 0xc9:
156               b += sprintf(b, "vrnd.%s%s     0x%08X, R%d", FLOATOP_PRECISION[p1], FLOATOP_PRECISION[pd4], imm32, rs);
157               break;
158
159      case 0xca:   b += sprintf(b, "vrnd.%s%s     R%d, R%d", FLOATOP_PRECISION[2 + p1], FLOATOP_PRECISION[pd2],src1, rs); break;
160      case 0xcb:   b += sprintf(b, "vrnd.%s%s     0x%08X, R%d", FLOATOP_PRECISION[2 + p1], FLOATOP_PRECISION[pd2], imm32, rs); break;
161
162      case 0xcc: case 0xdc:
163               b += sprintf(b, "vmac.ss%s    R%d, R%d, %s, %s", FLOATOP_PRECISION[(op >> 9) & 1], src1, rs, z ? "0" : ACC_SEL[acc], (regdest && rd == 0) ? ACC_SEL[acc] : dest);
164               break;
165      case 0xcd: case 0xdd:
166               b += sprintf(b, "vmac.ss%s    0x%08X, R%d, %s, %s", FLOATOP_PRECISION[(op >> 9) & 1], imm32, rs, z ? "0" : ACC_SEL[acc], (regdest && rd == 0) ? ACC_SEL[acc] : dest);
167               break;
168      case 0xce: case 0xde:
169               b += sprintf(b, "vmsc.ss%s    R%d, R%d, %s, %s", FLOATOP_PRECISION[(op >> 9) & 1], src1, rs, z ? "0" : ACC_SEL[acc], (regdest && rd == 0) ? ACC_SEL[acc] : dest);
170               break;
171      case 0xcf: case 0xdf:
172               b += sprintf(b, "vmsc.ss%s    0x%08X, R%d, %s, %s", FLOATOP_PRECISION[(op >> 9) & 1], imm32, rs, z ? "0" : ACC_SEL[acc], (regdest && rd == 0) ? ACC_SEL[acc] : dest);
173               break;
174
175      default:   b += sprintf(b, "?"); break;
176   }
177
178   // align the line end
179   int len = strlen(buffer);
180   if (len < 30)
181   {
182      for (int i=0; i < (30-len); i++)
183      {
184         b += sprintf(b, " ");
185      }
186   }   
187
188   // optional load/store op
189   switch (vector_ls_bits)
190   {
191      case 0x01:      b += sprintf(b, "|| vst.s   R%d", rd); break;
192      case 0x03:      b += sprintf(b, "|| vst.d   R%d", rd); break;
193      case 0x04:      b += sprintf(b, "|| vld0.s  R%d", rd); break;
194      case 0x05:      b += sprintf(b, "|| vld1.s  R%d", rd); break;
195      case 0x06:      b += sprintf(b, "|| vld0.d  R%d", rd); break;
196      case 0x07:      b += sprintf(b, "|| vld1.d  R%d", rd); break;
197   }
198
199   return buffer;
200}
201
202static offs_t tms32082_disasm_mp(char *buffer, offs_t pc, const UINT8 *oprom)
203{
204   output = buffer;
205   opdata = oprom;
206   opbytes = 0;
207   UINT32 flags = 0;
208
209   UINT32 op = fetch();
210
211   int rd = (op >> 27) & 0x1f;
212   int link = rd;
213   int bitnum = rd ^ 0x1f;
214   int rs = (op >> 22) & 0x1f;
215   int endmask = (op >> 5) & 0x1f;
216   int rotate = (op & 0x1f);
217   int src1 = rotate;
218   UINT32 uimm15 = op & 0x7fff;
219
220   switch ((op >> 20) & 3)
221   {
222      case 0: case 1: case 2:     // Short immediate
223      {
224         int subop = (op >> 15) & 0x7f;
225         int m = op & (1 << 17) ? 0 : 1;
226
227         switch (subop)
228         {
229            case 0x00:   print("illop0      "); break;
230            case 0x01:   print("trap        %d", UIMM15(uimm15)); break;
231            case 0x02:   print("cmnd        0x%04X", UIMM15(uimm15)); break;
232            case 0x04:   print("rdcr        %s, R%d", get_creg_name(UIMM15(uimm15)), rd); break;
233            case 0x05:   print("swcr        R%d, %s, R%d", rd, get_creg_name(UIMM15(uimm15)), rs); break;
234            case 0x06:   print("brcr        %s", get_creg_name(UIMM15(uimm15))); break;
235            case 0x08:   print("shift%s.dz   %d, %d, R%d, R%d", (op & (1 << 10)) ? "r" : "l", rotate, endmask, rs, rd); break;
236            case 0x09:   print("shift%s.dm   %d, %d, R%d, R%d", (op & (1 << 10)) ? "r" : "l", rotate, endmask, rs, rd); break;
237            case 0x0a:   print("shift%s.ds   %d, %d, R%d, R%d", (op & (1 << 10)) ? "r" : "l", rotate, endmask, rs, rd); break;
238            case 0x0b:   print("shift%s.ez   %d, %d, R%d, R%d", (op & (1 << 10)) ? "r" : "l", rotate, endmask, rs, rd); break;
239            case 0x0c:   print("shift%s.em   %d, %d, R%d, R%d", (op & (1 << 10)) ? "r" : "l", rotate, endmask, rs, rd); break;
240            case 0x0d:   print("shift%s.es   %d, %d, R%d, R%d", (op & (1 << 10)) ? "r" : "l", rotate, endmask, rs, rd); break;
241            case 0x0e:   print("shift%s.iz   %d, %d, R%d, R%d", (op & (1 << 10)) ? "r" : "l", rotate, endmask, rs, rd); break;
242            case 0x0f:   print("shift%s.im   %d, %d, R%d, R%d", (op & (1 << 10)) ? "r" : "l", rotate, endmask, rs, rd); break;
243            case 0x11:   print("and         0x%04X, R%d, R%d", UIMM15(uimm15), rs, rd); break;
244            case 0x12:   print("and.tf      0x%04X, R%d, R%d", UIMM15(uimm15), rs, rd); break;
245            case 0x14:   print("and.ft      0x%04X, R%d, R%d", UIMM15(uimm15), rs, rd); break;
246            case 0x16:   print("xor         0x%04X, R%d, R%d", UIMM15(uimm15), rs, rd); break;
247            case 0x17:   print("or          0x%04X, R%d, R%d", UIMM15(uimm15), rs, rd); break;
248            case 0x18:   print("and.ff      0x%04X, R%d, R%d", UIMM15(uimm15), rs, rd); break;
249            case 0x19:   print("xnor        0x%04X, R%d, R%d", UIMM15(uimm15), rs, rd); break;
250            case 0x1b:   print("or.tf       0x%04X, R%d, R%d", UIMM15(uimm15), rs, rd); break;
251            case 0x1d:   print("or.ft       0x%04X, R%d, R%d", UIMM15(uimm15), rs, rd); break;
252            case 0x1e:   print("or.ff       0x%04X, R%d, R%d", UIMM15(uimm15), rs, rd); break;
253
254            case 0x24: case 0x20:
255                     print("ld.b        0x%04X(R%d%s), R%d", UIMM15(uimm15), rs, MEMOP_M[m], rd);
256                     break;
257            case 0x25: case 0x21:
258                     print("ld.h        0x%04X(R%d%s), R%d", UIMM15(uimm15), rs, MEMOP_M[m], rd);
259                     break;
260            case 0x26: case 0x22:
261                     print("ld          0x%04X(R%d%s), R%d", UIMM15(uimm15), rs, MEMOP_M[m], rd);
262                     break;
263            case 0x27: case 0x23:
264                     print("ld.d        0x%04X(R%d%s), R%d", UIMM15(uimm15), rs, MEMOP_M[m], rd);
265                     break;
266            case 0x2c: case 0x28:
267                     print("ld.ub       0x%04X(R%d%s), R%d", UIMM15(uimm15), rs, MEMOP_M[m], rd);
268                     break;
269            case 0x2d: case 0x29:
270                     print("ld.uh       0x%04X(R%d%s), R%d", UIMM15(uimm15), rs, MEMOP_M[m], rd);
271                     break;
272
273            case 0x34: case 0x30:
274                     print("st.b        R%d, 0x%04X(R%d%s)", rd, UIMM15(uimm15), rs, MEMOP_M[m]);
275                     break;
276            case 0x35: case 0x31:
277                     print("st.h        R%d, 0x%04X(R%d%s)", rd, UIMM15(uimm15), rs, MEMOP_M[m]);
278                     break;
279            case 0x36: case 0x32:
280                     print("st          R%d, 0x%04X(R%d%s)", rd, UIMM15(uimm15), rs, MEMOP_M[m]);
281                     break;
282            case 0x37: case 0x33:
283                     print("st.d        R%d, 0x%04X(R%d%s)", rd, UIMM15(uimm15), rs, MEMOP_M[m]);
284                     break;
285
286            case 0x40:   print("bsr         0x%08X, R%d", pc + (SIMM15(uimm15) * 4), link); break;
287            case 0x41:   print("bsr.a       0x%08X, R%d", pc + (SIMM15(uimm15) * 4), link); break;
288            case 0x44:   print("jsr         0x%04X(R%d), R%d", SIMM15(uimm15), rs, link); break;
289            case 0x45:   print("jsr.a       0x%04X(R%d), R%d", SIMM15(uimm15), rs, link); break;
290            case 0x48:   print("bbz         0x%08X, R%d, %s (%d)", pc + (SIMM15(uimm15) * 4), rs, BITNUM_CONDITION[bitnum], bitnum); break;
291            case 0x49:   print("bbz.a       0x%08X, R%d, %s (%d)", pc + (SIMM15(uimm15) * 4), rs, BITNUM_CONDITION[bitnum], bitnum); break;
292            case 0x4a:   print("bbo         0x%08X, R%d, %s (%d)", pc + (SIMM15(uimm15) * 4), rs, BITNUM_CONDITION[bitnum], bitnum); break;
293            case 0x4b:   print("bbo.a       0x%08X, R%d, %s (%d)", pc + (SIMM15(uimm15) * 4), rs, BITNUM_CONDITION[bitnum], bitnum); break;
294            case 0x4c:   print("bcnd        0x%08X, R%d, %s", pc + (SIMM15(uimm15) * 4), rs, BCND_CONDITION[rd]); break;
295            case 0x4d:   print("bcnd.a      0x%08X, R%d, %s", pc + (SIMM15(uimm15) * 4), rs, BCND_CONDITION[rd]); break;
296            case 0x50:   print("cmp         0x%08X, R%d, R%d", SIMM15(uimm15), rs, rd); break;
297            case 0x58:   print("add         0x%08X, R%d, R%d", SIMM15(uimm15), rs, rd); break;
298            case 0x59:   print("addu        0x%08X, R%d, R%d", SIMM15(uimm15), rs, rd); break;
299            case 0x5a:   print("sub         0x%08X, R%d, R%d", SIMM15(uimm15), rs, rd); break;
300            case 0x5b:   print("subu        0x%08X, R%d, R%d", SIMM15(uimm15), rs, rd); break;
301
302            default:   print("?"); break;
303         }
304         break;
305      }
306
307      case 3:                     // Register / Long immediate
308      {
309         int subop = (op >> 12) & 0xff;
310
311         UINT32 imm32 = 0;
312         if (op & (1 << 12))     // fetch 32-bit immediate if needed
313            imm32 = fetch();
314
315         int m = op & (1 << 15) ? 0 : 1;
316         int s = op & (1 << 11) ? 0 : 1;
317
318         int p1 = (op >> 5) & 3;
319         int p2 = (op >> 7) & 3;
320         int pd = (op >> 9) & 3;
321
322         int rndmode = (op >> 7) & 3;
323
324
325         switch (subop)
326         {
327            case 0x02:   print("trap        %d", src1); break;
328            case 0x03:   print("trap        %d", imm32); break;
329            case 0x04:   print("cmnd        R%d", src1); break;
330            case 0x05:   print("cmnd        0x%08X", imm32); break;
331            case 0x08:   print("rdcr        R%d, R%d,", src1, rd); break;
332            case 0x09:   print("rdcr        %s, R%d", get_creg_name(imm32), rd); break;
333            case 0x0a:   print("swcr        R%d, R%d, R%d", rd, src1, rs); break;
334            case 0x0b:   print("swcr        R%d, %s, R%d", rd, get_creg_name(imm32), rs); break;
335            case 0x0c:   print("brcr        R%d", src1); break;
336            case 0x0d:   print("brcr        %s", get_creg_name(imm32)); break;
337
338            case 0x10:  print("shift%s.dz   %d, %d, R%d, R%d", (op & (1 << 10)) ? "r" : "l", rotate, endmask, rs, rd); break;
339            case 0x12:  print("shift%s.dm   %d, %d, R%d, R%d", (op & (1 << 10)) ? "r" : "l", rotate, endmask, rs, rd); break;
340            case 0x14:  print("shift%s.ds   %d, %d, R%d, R%d", (op & (1 << 10)) ? "r" : "l", rotate, endmask, rs, rd); break;
341            case 0x16:  print("shift%s.ez   %d, %d, R%d, R%d", (op & (1 << 10)) ? "r" : "l", rotate, endmask, rs, rd); break;
342            case 0x18:  print("shift%s.em   %d, %d, R%d, R%d", (op & (1 << 10)) ? "r" : "l", rotate, endmask, rs, rd); break;
343            case 0x1a:  print("shift%s.es   %d, %d, R%d, R%d", (op & (1 << 10)) ? "r" : "l", rotate, endmask, rs, rd); break;
344            case 0x1c:  print("shift%s.iz   %d, %d, R%d, R%d", (op & (1 << 10)) ? "r" : "l", rotate, endmask, rs, rd); break;
345            case 0x1e:  print("shift%s.im   %d, %d, R%d, R%d", (op & (1 << 10)) ? "r" : "l", rotate, endmask, rs, rd); break;
346
347            case 0x22:  print("and         R%d, R%d, R%d", src1, rs, rd); break;
348            case 0x23:  print("and         0x%08X, R%d, R%d", imm32, rs, rd); break;
349            case 0x24:  print("and.tf      R%d, R%d, R%d", src1, rs, rd); break;
350            case 0x25:  print("and.tf      0x%08X, R%d, R%d", imm32, rs, rd); break;
351            case 0x28:  print("and.ft      R%d, R%d, R%d", src1, rs, rd); break;
352            case 0x29:  print("and.ft      0x%08X, R%d, R%d", imm32, rs, rd); break;
353            case 0x2c:  print("xor         R%d, R%d, R%d", src1, rs, rd); break;
354            case 0x2d:  print("xor         0x%08X, R%d, R%d", imm32, rs, rd); break;
355            case 0x2e:  print("or          R%d, R%d, R%d", src1, rs, rd); break;
356            case 0x2f:  print("or          0x%08X, R%d, R%d", imm32, rs, rd); break;
357            case 0x30:  print("and.ff      R%d, R%d, R%d", src1, rs, rd); break;
358            case 0x31:  print("and.ff      0x%08X, R%d, R%d", imm32, rs, rd); break;
359            case 0x32:  print("xnor        R%d, R%d, R%d", src1, rs, rd); break;
360            case 0x33:  print("xnor        0x%08X, R%d, R%d", imm32, rs, rd); break;
361            case 0x36:  print("or.tf       R%d, R%d, R%d", src1, rs, rd); break;
362            case 0x37:  print("or.tf       0x%08X, R%d, R%d", imm32, rs, rd); break;
363            case 0x3a:  print("or.ft       R%d, R%d, R%d", src1, rs, rd); break;
364            case 0x3b:  print("or.ft       0x%08X, R%d, R%d", imm32, rs, rd); break;
365            case 0x3c:  print("or.ff       R%d, R%d, R%d", src1, rs, rd); break;
366            case 0x3d:  print("or.ff       0x%08X, R%d, R%d", imm32, rs, rd); break;
367
368            case 0x48: case 0x40:
369                     print("ld.b        R%d%s(R%d%s), R%d", src1, MEMOP_S[s], rs, MEMOP_M[m], rd);
370                     break;
371            case 0x49: case 0x41:
372                     print("ld.b        0x%08X%s(R%d%s), R%d", imm32, MEMOP_S[s], rs, MEMOP_M[m], rd);
373                     break;
374            case 0x4a: case 0x42:
375                     print("ld.h        R%d%s(R%d%s), R%d", src1, MEMOP_S[s], rs, MEMOP_M[m], rd);
376                     break;
377            case 0x4b: case 0x43:
378                     print("ld.h        0x%08X%s(R%d%s), R%d", imm32, MEMOP_S[s], rs, MEMOP_M[m], rd);
379                     break;
380            case 0x4c: case 0x44:
381                     print("ld          R%d%s(R%d%s), R%d", src1, MEMOP_S[s], rs, MEMOP_M[m], rd);
382                     break;
383            case 0x4d: case 0x45:
384                     print("ld          0x%08X%s(R%d%s), R%d", imm32, MEMOP_S[s], rs,MEMOP_M[m], rd);
385                     break;
386            case 0x4e: case 0x46:
387                     print("ld.d        R%d%s(R%d%s), R%d", src1, MEMOP_S[s], rs, MEMOP_M[m], rd);
388                     break;
389            case 0x4f: case 0x47:
390                     print("ld.d        0x%08X%s(R%d%s), R%d", imm32, MEMOP_S[s], rs, MEMOP_M[m], rd);
391                     break;
392            case 0x58: case 0x50:
393                     print("ld.ub       R%d%s(R%d%s), R%d", src1, MEMOP_S[s], rs, MEMOP_M[m], rd);
394                     break;
395            case 0x59: case 0x51:
396                     print("ld.ub       0x%08X%s(R%d%s), R%d", imm32, MEMOP_S[s], rs, MEMOP_M[m], rd);
397                     break;
398            case 0x5a: case 0x52:
399                     print("ld.uh       R%d%s(R%d%s), R%d", src1, MEMOP_S[s], rs, MEMOP_M[m], rd);
400                     break;
401            case 0x5b: case 0x53:
402                     print("ld.uh       0x%08X%s(R%d%s), R%d", imm32, MEMOP_S[s], rs, MEMOP_M[m], rd);
403                     break;
404
405            case 0x68: case 0x60:
406                     print("st.b        R%d, R%d%s(R%d%s)", rd, src1, MEMOP_S[s], rs, MEMOP_M[m]);
407                     break;
408            case 0x69: case 0x61:
409                     print("st.b        R%d, 0x%08X%s(R%d%s)", rd, imm32, MEMOP_S[s], rs, MEMOP_M[m]);
410                     break;
411            case 0x6a: case 0x62:
412                     print("st.h        R%d, R%d%s(R%d%s)", rd, src1, MEMOP_S[s], rs, MEMOP_M[m]);
413                     break;
414            case 0x6b: case 0x63:
415                     print("st.h        R%d, 0x%08X%s(R%d%s)", rd, imm32, MEMOP_S[s], rs, MEMOP_M[m]);
416                     break;
417            case 0x6c: case 0x64:
418                     print("st          R%d, R%d%s(R%d%s)", rd, src1, MEMOP_S[s], rs, MEMOP_M[m]);
419                     break;
420            case 0x6d: case 0x65:
421                     print("st          R%d, 0x%08X%s(R%d%s)", rd, imm32, MEMOP_S[s], rs, MEMOP_M[m]);
422                     break;
423            case 0x6e: case 0x66:
424                     print("st.d        R%d, R%d%s(R%d%s)", rd, src1, MEMOP_S[s], rs, MEMOP_M[m]);
425                     break;
426            case 0x6f: case 0x67:
427                     print("st.d        R%d, 0x%08X%s(R%d%s)", rd, imm32, MEMOP_S[s], rs, MEMOP_M[m]);
428                     break;
429
430            case 0x78: case 0x70:
431                     print("dcache      R%d(R%d)", src1, rs);
432                     break;
433            case 0x79: case 0x71:
434                     print("dcache      0x%08X(R%d)", imm32, rs);
435                     break;
436
437            case 0x80:   print("bsr         R%d, R%d", src1, link); break;
438            case 0x81:   print("bsr         0x%08X, R%d", imm32, link); break;
439            case 0x82:   print("bsr.a       R%d, R%d", src1, rd); break;
440            case 0x83:   print("bsr.a       0x%08X, R%d", imm32, link); break;
441            case 0x88:   print("jsr         R%d, R%d", src1, link); break;
442            case 0x89:   print("jsr         0x%08X, R%d", imm32, link); break;
443            case 0x8a:   print("jsr.a       R%d, R%d", src1, link); break;
444            case 0x8b:   print("jsr.a       0x%08X, R%d", imm32, link); break;
445            case 0x90:   print("bbz         R%d, R%d, %s (%d)", src1, rs, BITNUM_CONDITION[bitnum], bitnum); break;
446            case 0x91:   print("bbz         0x%08X, R%d, %s (%d)", imm32, rs, BITNUM_CONDITION[bitnum], bitnum); break;
447            case 0x92:   print("bbz.a       R%d, R%d, %s (%d)", src1, rs, BITNUM_CONDITION[bitnum], bitnum); break;
448            case 0x93:   print("bbz.a       0x%08X, R%d, %s (%d)", imm32, rs, BITNUM_CONDITION[bitnum], bitnum); break;
449            case 0x94:   print("bbo         R%d, R%d, %s (%d)", src1, rs, BITNUM_CONDITION[bitnum], bitnum); break;
450            case 0x95:   print("bbo         0x%08X, R%d, %s (%d)", imm32, rs, BITNUM_CONDITION[bitnum], bitnum); break;
451            case 0x96:   print("bbo.a       R%d, R%d, %s (%d)", src1, rs, BITNUM_CONDITION[bitnum], bitnum); break;
452            case 0x97:   print("bbo.a       0x%08X, R%d, %s (%d)", imm32, rs, BITNUM_CONDITION[bitnum], bitnum); break;
453            case 0x98:   print("bcnd        R%d, R%d, %s", src1, rs, BCND_CONDITION[rd]); break;
454            case 0x99:   print("bcnd        0x%08X, R%d, %s", imm32, rs, BCND_CONDITION[rd]); break;
455            case 0x9a:   print("bcnd.a      R%d, R%d, %s", src1, rs, BCND_CONDITION[rd]); break;
456            case 0x9b:   print("bcnd.a      0x%08X, R%d, %s", imm32, rs, BCND_CONDITION[rd]); break;
457            case 0xa0:   print("cmp         R%d, R%d, R%d", src1, rs, rd); break;
458            case 0xa1:   print("cmp         0x%08X, R%d, R%d", imm32, rs, rd); break;
459            case 0xb0:   print("add         R%d, R%d, R%d", src1, rs, rd); break;
460            case 0xb1:   print("add         0x%08X, R%d, R%d", imm32, rs, rd); break;
461            case 0xb2:   print("addu        R%d, R%d, R%d", src1, rs, rd); break;
462            case 0xb3:   print("addu        0x%08X, R%d, R%d", imm32, rs, rd); break;
463            case 0xb4:   print("sub         R%d, R%d, R%d", src1, rs, rd); break;
464            case 0xb5:   print("sub         0x%08X, R%d, R%d", imm32, rs, rd); break;
465            case 0xb6:   print("subu        R%d, R%d, R%d", src1, rs, rd); break;
466            case 0xb7:   print("subu        0x%08X, R%d, R%d", imm32, rs, rd); break;
467
468            case 0xc0: case 0xc1: case 0xc2: case 0xc3: case 0xc4: case 0xc5:
469            case 0xc6: case 0xd6: case 0xc7: case 0xd7: case 0xc8: case 0xd8: case 0xc9: case 0xd9:
470            case 0xca: case 0xcb: case 0xcc: case 0xdc: case 0xcd: case 0xdd: case 0xce: case 0xde:
471            case 0xcf: case 0xdf:
472            {
473               print("%s", format_vector_op(op, imm32));
474               break;
475            }
476
477            case 0xe0:   print("fadd.%s%s%s    R%d, R%d, R%d", FLOATOP_PRECISION[p1], FLOATOP_PRECISION[p2], FLOATOP_PRECISION[pd], src1, rs, rd); break;
478            case 0xe1:   print("fadd.%s%s%s    0x%08X, R%d, R%d", FLOATOP_PRECISION[p1], FLOATOP_PRECISION[p2], FLOATOP_PRECISION[pd], imm32, rs, rd); break;
479            case 0xe2:   print("fsub.%s%s%s    R%d, R%d, R%d", FLOATOP_PRECISION[p1], FLOATOP_PRECISION[p2], FLOATOP_PRECISION[pd], src1, rs, rd); break;
480            case 0xe3:   print("fsub.%s%s%s    0x%08X, R%d, R%d", FLOATOP_PRECISION[p1], FLOATOP_PRECISION[p2], FLOATOP_PRECISION[pd], imm32, rs, rd); break;
481            case 0xe4:   print("fmpy.%s%s%s    R%d, R%d, R%d", FLOATOP_PRECISION[p1], FLOATOP_PRECISION[p2], FLOATOP_PRECISION[pd], src1, rs, rd); break;
482            case 0xe5:   print("fmpy.%s%s%s    0x%08X, R%d, R%d", FLOATOP_PRECISION[p1], FLOATOP_PRECISION[p2], FLOATOP_PRECISION[pd], imm32, rs, rd); break;
483            case 0xe6:   print("fdiv.%s%s%s    R%d, R%d, R%d", FLOATOP_PRECISION[p1], FLOATOP_PRECISION[p2], FLOATOP_PRECISION[pd], src1, rs, rd); break;
484            case 0xe7:   print("fdiv.%s%s%s    0x%08X, R%d, R%d", FLOATOP_PRECISION[p1], FLOATOP_PRECISION[p2], FLOATOP_PRECISION[pd], imm32, rs, rd); break;
485            case 0xe8:   print("frnd%s.%s%s    R%d, R%d", FLOATOP_ROUND[rndmode], FLOATOP_PRECISION[p1], FLOATOP_PRECISION[pd], src1, rd); break;
486            case 0xe9:   print("frnd%s.%s%s    0x%08X, R%d", FLOATOP_ROUND[rndmode], FLOATOP_PRECISION[p1], FLOATOP_PRECISION[pd], imm32, rd); break;
487            case 0xea:   print("fcmp        R%d, R%d, R%d", src1, rs, rd); break;
488            case 0xeb:   print("fcmp        0x%08X, R%d, R%d", imm32, rs, rd); break;
489            case 0xee:   print("fsqrt       R%d, R%d", src1, rd); break;
490            case 0xef:   print("fsqrt       0x%08X, R%d", imm32, rd); break;
491            case 0xf0:   print("lmo         R%d, R%d", rs, rd); break;
492            case 0xf2:   print("rmo         R%d, R%d", rs, rd); break;
493            case 0xfc:   print("estop       "); break;
494           
495            case 0xfe: case 0xff:
496                     print("illopF      ");
497                     break;
498
499            default:   print("?"); break;
500         }
501         break;
502      }
503   }
504
505   return opbytes | flags | DASMFLAG_SUPPORTED;
506}
507
508CPU_DISASSEMBLE(tms32082_mp)
509{
510   return tms32082_disasm_mp(buffer, pc, oprom);
511}
Property changes on: trunk/src/emu/cpu/tms32082/dis_mp.c
Added: svn:mime-type
   + text/plain
Added: svn:eol-style
   + native
trunk/src/emu/cpu/tms32082/dis_pp.c
r0r24542
1// TMS32082 PP Disassembler
2
3#include "emu.h"
4
5
6static char *output;
7static const UINT8 *opdata;
8static int opbytes;
9
10static void ATTR_PRINTF(1,2) print(const char *fmt, ...)
11{
12   va_list vl;
13
14   va_start(vl, fmt);
15   output += vsprintf(output, fmt, vl);
16   va_end(vl);
17}
18
19static offs_t tms32082_disasm_pp(char *buffer, offs_t pc, const UINT8 *oprom)
20{
21   output = buffer;
22   UINT32 flags = 0;
23   opdata = oprom;
24   opbytes = 8;
25
26   print("???");
27
28   return opbytes | flags | DASMFLAG_SUPPORTED;
29}
30
31
32CPU_DISASSEMBLE(tms32082_pp)
33{
34   return tms32082_disasm_pp(buffer, pc, oprom);
35}
No newline at end of file
Property changes on: trunk/src/emu/cpu/tms32082/dis_pp.c
Added: svn:mime-type
   + text/plain
Added: svn:eol-style
   + native
trunk/src/emu/cpu/tms32082/tms32082.c
r24541r24542
300300// Parallel Processor
301301
302302// internal memory map
303static ADDRESS_MAP_START(pp_internal_map, AS_PROGRAM, 32, tms32082_mp_device)
303static ADDRESS_MAP_START(pp_internal_map, AS_PROGRAM, 32, tms32082_pp_device)
304304ADDRESS_MAP_END
305305
306306tms32082_pp_device::tms32082_pp_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock)

Previous 199869 Revisions Next


© 1997-2024 The MAME Team