OpenCores
URL https://opencores.org/ocsvn/thor/thor/trunk

Subversion Repositories thor

[/] [thor/] [trunk/] [software/] [emuThor/] [source/] [clsDisassem.cpp] - Blame information for rev 32

Go to most recent revision | Details | Compare with Previous | View Log

Line No. Rev Author Line
1 30 robfinch
#include "stdafx.h"
2
#include "insn.h"
3
#include "clsDisassem.h"
4
 
5
extern clsSystem system1;
6
 
7
std::string clsDisassem::SprName(int rg)
8
{
9
        char buf[100];
10
 
11
        buf[0] = '\0';
12
        if (rg < 16)
13
                sprintf(buf, "p%d", rg);
14
        else if (rg < 32)
15
                sprintf(buf, "c%d", rg-16);
16 32 robfinch
        else if (rg < 64) {
17 30 robfinch
                switch(rg) {
18
                case 32:        sprintf(buf, "zs"); break;
19
                case 33:        sprintf(buf, "ds"); break;
20
                case 34:        sprintf(buf, "es"); break;
21
                case 35:        sprintf(buf, "fs"); break;
22
                case 36:        sprintf(buf, "gs"); break;
23
                case 37:        sprintf(buf, "hs"); break;
24
                case 38:        sprintf(buf, "ss"); break;
25
                case 39:        sprintf(buf, "cs"); break;
26
                case 40:        sprintf(buf, "zs.lmt"); break;
27
                case 41:        sprintf(buf, "ds.lmt"); break;
28
                case 42:        sprintf(buf, "es.lmt"); break;
29
                case 43:        sprintf(buf, "fs.lmt"); break;
30
                case 44:        sprintf(buf, "gs.lmt"); break;
31
                case 45:        sprintf(buf, "hs.lmt"); break;
32
                case 46:        sprintf(buf, "ss.lmt"); break;
33
                case 47:        sprintf(buf, "cs.lmt"); break;
34 32 robfinch
                case 50:        sprintf(buf, "tick"); break;
35
                case 51:        sprintf(buf, "lc"); break;
36
                case 52:        sprintf(buf, "pregs"); break;
37
                case 60:        sprintf(buf, "bir"); break;
38
                default:        sprintf(buf, "???"); break;
39 30 robfinch
                }
40
        }
41
        return std::string(buf);
42
}
43
 
44
std::string clsDisassem::PredCond(int cnd)
45
{
46
        switch(cnd) {
47
        case PF: return "PF  ";
48
        case PT: return "PT  ";
49
        case PEQ: return "PEQ ";
50
        case PNE: return "PNE ";
51
        case PLE: return "PLE ";
52
        case PGT: return "PGT ";
53
        case PGE: return "PGE ";
54
        case PLT: return "PLT ";
55
        case PLEU: return "PLEU";
56
        case PGTU: return "PGTU";
57
        case PGEU: return "PGEU";
58
        case PLTU: return "PLTU";
59
        default: return "????";
60
        }
61
}
62
 
63 32 robfinch
int clsDisassem::DefaultSeg(int rg)
64
{
65
        switch(rg) {
66
        case 27:
67
        case 28:
68
        case 29:
69
        case 30:
70
        case 31:        return 6;
71
        default:        return 1;
72
        }
73
}
74
 
75
std::string clsDisassem::SegName(int sg)
76
{
77
        switch(sg) {
78
        case 0:  return "zs";
79
        case 1: return "ds";
80
        case 2: return "es";
81
        case 3: return "fs";
82
        case 4: return "gs";
83
        case 5: return "hs";
84
        case 6: return "ss";
85
        case 7: return "cs";
86
        default: return "<err>";
87
        }
88
}
89
 
90
std::string clsDisassem::TLBRegName(int rg)
91
{
92
        switch(rg) {
93
        case 0:  return "Wired";
94
        case 1: return "Index";
95
        case 2: return "Random";
96
        case 3: return "PageSize";
97
        case 4: return "VirtPage";
98
        case 5: return "PhysPage";
99
        case 6: return "ASID";
100
        case 7: return "DMA";
101
        case 8: return "IMA";
102
        case 9: return "PTA";
103
        case 10: return "PTC";
104
        default: return "???";
105
        }
106
}
107
 
108 30 robfinch
// Compute d[Rn] address info
109
std::string clsDisassem::dRn(int b1, int b2, int b3, int *Ra, int *Sg, __int64 *disp)
110
{
111
        char buf[100];
112
 
113
        if (!Ra || !disp || !Sg)
114
                return "<error>";
115
        *Ra = b1 & 0x3f;
116
        *Sg = (b3 >> 5) & 7;
117
        *disp = ((b2 >> 4) & 0xF) | ((b3 & 0x1f) << 4);
118
        if (*disp & 0x100)
119
                *disp |= 0xFFFFFFFFFFFFFE00LL;
120
        if (imm_prefix) {
121
                *disp &= 0xFF;
122
                *disp |= imm;
123
        }
124 32 robfinch
        if (*Sg != DefaultSeg(*Ra))
125
                sprintf(buf, "%s:$%I64X[r%d]", SegName(*Sg).c_str(), *disp, *Ra);
126
        else
127
                sprintf(buf, "$%I64X[r%d]", *disp, *Ra);
128 30 robfinch
        return std::string(buf);
129
}
130
 
131 32 robfinch
// Compute d[Rn] address info
132
std::string clsDisassem::ndx(int b1, int b2, int b3, int *Ra, int *Rb, int *Rt, int *Sg, int *Sc)
133
{
134
        char buf[100];
135
 
136
        if (!Ra || !Rb || !Rt || !Sg)
137
                return "<error>";
138
        *Ra = b1 & 0x3f;
139
        *Rb = (b1 >> 6) | ((b2 & 0x0f) << 2);
140
        *Rt = ((b2 & 0xF0) >> 4) | ((b3 & 3) << 4);
141
        *Sg = (b3 >> 5) & 7;
142
        *Sc = (b3 >> 2) & 3;
143
        if (*Sg != DefaultSeg(*Ra))
144
                sprintf(buf, "%s:[r%d+r%d", SegName(*Sg).c_str(), *Ra, *Rb);
145
        else
146
                sprintf(buf, "[r%d+r%d", *Ra, *Rb);
147
        if (*Sc != 1)
148
                sprintf(&buf[strlen(buf)], "*%d]", (1 << *Sc));
149
        else
150
                sprintf(&buf[strlen(buf)], "]");
151
        return std::string(buf);
152
}
153
 
154
std::string clsDisassem::mem(std::string mne, int ad, int *nb)
155
{
156
        int b1, b2, b3;
157
        int Ra,Rt,Sg;
158
        __int64 disp;
159
        std::string str;
160
        char buf[100];
161
 
162
        buf[0] = '\0';
163
        b1 = ReadByte(ad);
164
        ad++;
165
        b2 = ReadByte(ad);
166
        ad++;
167
        b3 = ReadByte(ad);
168
        ad++;
169
        Rt = ((b2 & 0xF) << 2) | (( b1 >> 6) & 3);
170
        str = dRn(b1,b2,b3,&Ra,&Sg,&disp);
171
        sprintf(&buf[strlen(buf)]," %s r%d,%s", mne.c_str(), Rt, str.c_str());
172
        if (nb) *nb = 5;
173
        imm_prefix = false;
174
        return std::string(buf);
175
}
176
 
177
std::string clsDisassem::memndx(std::string mne, int ad, int *nb)
178
{
179
        int b1, b2, b3;
180
        int Ra,Rb,Rt,Sg,Sc;
181
        __int64 disp;
182
        std::string str;
183
        char buf[100];
184
 
185
        buf[0] = '\0';
186
        b1 = ReadByte(ad);
187
        ad++;
188
        b2 = ReadByte(ad);
189
        ad++;
190
        b3 = ReadByte(ad);
191
        ad++;
192
        str = ndx(b1,b2,b3,&Ra,&Rb,&Rt,&Sg,&Sc);
193
        sprintf(&buf[strlen(buf)]," %s r%d,%s", mne.c_str(), Rt, str.c_str());
194
        if (nb) *nb = 5;
195
        imm_prefix = false;
196
        return std::string(buf);
197
}
198
 
199 30 robfinch
std::string clsDisassem::Disassem(int ad, int *nb)
200
{
201
        int byt;
202
        int opcode, func;
203
        int n;
204
        __int64 val, disp;
205
        int rv;
206
        int b1, b2, b3, b4;
207 32 robfinch
        int Ra,Rb,Rc,Rt,Sprn,Sg,Sc,Sz;
208
        int Cr,Ct,Tn;
209 30 robfinch
        int Pn;
210
        char buf[100];
211
        std::string str;
212
 
213
        buf[0] = '\0';
214
        byt = system1.ReadByte(ad);
215
        ad++;
216
        if (byt==0x00) {
217
                if (nb) *nb = 1;
218
                return std::string("        BRK");
219
        }
220
        if (byt==0x10) {
221
                if (nb) *nb = 1;
222
                return std::string("        NOP");
223
        }
224
        if (byt==0x20) {
225
                val = system1.ReadByte(ad);
226
                ad++;
227
                if (val & 0x80LL)
228
                        val |= 0xFFFFFFFFFFFFFF00LL;
229
                sprintf(buf, "        IMM %02LLX",val);
230
                if (nb) *nb = 2;
231
                imm = val << 8;
232
                imm_prefix = true;
233
                return std::string(buf);
234
        }
235
        if (byt==0x30) {
236
                val = system1.ReadByte(ad);
237
                ad++;
238
                val += (system1.ReadByte(ad) << 8);
239
                ad++;
240
                if (val & 0x8000LL)
241
                        val |= 0xFFFFFFFFFFFF0000LL;
242
                sprintf(buf, "        IMM %04LLX",val);
243
                if (nb) *nb = 3;
244
                imm = val << 8;
245
                imm_prefix = true;
246
                return std::string(buf);
247
        }
248
        if (byt==0x40) {
249
                val = system1.ReadByte(ad);
250
                ad++;
251
                val += (system1.ReadByte(ad) << 8);
252
                ad++;
253
                val += (system1.ReadByte(ad) << 16);
254
                ad++;
255
                if (val & 0x800000LL)
256
                        val |= 0xFFFFFFFFFF000000LL;
257
                sprintf(buf, "        IMM %06LLX",val);
258
                imm = val << 8;
259
                if (nb) *nb = 4;
260
                imm_prefix = true;
261
                return std::string(buf);
262
        }
263
        if (byt==0x50) {
264
                val = system1.ReadByte(ad);
265
                ad++;
266
                val += (system1.ReadByte(ad) << 8);
267
                ad++;
268
                val += (system1.ReadByte(ad) << 16);
269
                ad++;
270
                val += (system1.ReadByte(ad) << 24);
271
                ad++;
272
                if (val & 0x80000000LL)
273
                        val |= 0xFFFFFFFF00000000LL;
274
                sprintf(buf, "        IMM %08LLX",val);
275
                if (nb) *nb = 5;
276
                imm = val << 8;
277
                imm_prefix = true;
278
                return std::string(buf);
279
        }
280
        if (byt==0x60) {
281
                val = system1.ReadByte(ad);
282
                ad++;
283
                val += (system1.ReadByte(ad) << 8);
284
                ad++;
285
                val += (system1.ReadByte(ad) << 16);
286
                ad++;
287
                val += (system1.ReadByte(ad) << 24);
288
                ad++;
289
                val += (system1.ReadByte(ad) << 32);
290
                ad++;
291
                if (val & 0x8000000000LL)
292
                        val |= 0xFFFFFF0000000000LL;
293
                sprintf(buf, "        IMM %010LLX",val);
294
                if (nb) *nb = 6;
295
                imm = val << 8;
296
                imm_prefix = true;
297
                return std::string(buf);
298
        }
299
        if (byt==0x70) {
300
                val = system1.ReadByte(ad);
301
                ad++;
302
                val += (system1.ReadByte(ad) << 8);
303
                ad++;
304
                val += (system1.ReadByte(ad) << 16);
305
                ad++;
306
                val += (system1.ReadByte(ad) << 24);
307
                ad++;
308
                val += (system1.ReadByte(ad) << 32);
309
                ad++;
310
                val += (system1.ReadByte(ad) << 40);
311
                ad++;
312
                if (val & 0x800000000000LL)
313
                        val |= 0xFFFF000000000000LL;
314
                sprintf(buf, "        IMM %012LLX",val);
315
                if (nb) *nb = 7;
316
                imm = val << 8;
317
                imm_prefix = true;
318
                return std::string(buf);
319
        }
320
        if (byt==0x80) {
321
                val = system1.ReadByte(ad);
322
                ad++;
323
                val += (system1.ReadByte(ad) << 8);
324
                ad++;
325
                val += (system1.ReadByte(ad) << 16);
326
                ad++;
327
                val += (system1.ReadByte(ad) << 24);
328
                ad++;
329
                val += (system1.ReadByte(ad) << 32);
330
                ad++;
331
                val += (system1.ReadByte(ad) << 40);
332
                ad++;
333
                val += (system1.ReadByte(ad) << 48);
334
                ad++;
335
                if (val & 0x80000000000000LL)
336
                        val |= 0xFF00000000000000LL;
337
                sprintf(buf, "        IMM %014LLX",val);
338
                if (nb) *nb = 8;
339
                imm = val << 8;
340
                imm_prefix = true;
341
                return std::string(buf);
342
        }
343
        if (byt != 0x01)
344
                sprintf(buf, "p%d.%s ", (byt & 0xF0) >> 4, PredCond(byt & 0xF).c_str());
345
        opcode = system1.ReadByte(ad);
346
        ad++;
347
        if ((opcode & 0xF0)==0x00) {
348
                b1 = system1.ReadByte(ad);
349
                ad++;
350
                Ra = b1 & 0x3f;
351
                Pn = opcode & 0x0f;
352
                sprintf(&buf[strlen(buf)], "TST p%d,r%d", Pn, Ra);
353
                if (nb) *nb = 3;
354
                imm_prefix = false;
355
                return std::string(buf);
356
        }
357 32 robfinch
        if ((opcode & 0xF0)==0x10) {
358
                b1 = system1.ReadByte(ad);
359
                ad++;
360
                b2 = system1.ReadByte(ad);
361
                ad++;
362
                Ra = b1 & 0x3f;
363
                Rb = ((b2 << 2) | (b1 >> 6)) & 0x3f;
364
                Pn = opcode & 0x0f;
365
                switch(b2 >> 4) {
366
                case 0:  sprintf(&buf[strlen(buf)], " CMP p%d,r%d,r%d", Pn, Ra, Rb); break;
367
                case 1: sprintf(&buf[strlen(buf)], " FCMP.S p%d,r%d,r%d", Pn, Ra, Rb); break;
368
                case 2: sprintf(&buf[strlen(buf)], " FCMP.D p%d,r%d,r%d", Pn, Ra, Rb); break;
369
                }
370
                if (nb) *nb = 4;
371
                imm_prefix = false;
372
                return std::string(buf);
373
        }
374 30 robfinch
        if ((opcode & 0xF0)==0x20) {
375
                b1 = system1.ReadByte(ad);
376
                ad++;
377
                b2 = system1.ReadByte(ad);
378
                ad++;
379
                Ra = b1 & 0x3f;
380
                Pn = opcode & 0x0f;
381
                val = (b2 << 2) | (b1 >> 6);
382
                if (imm_prefix)
383
                        val = imm | (val & 0xFF);
384
                else {
385
                        if (val & 0x200)
386
                                val |= 0xFFFFFFFFFFFFFE00LL;
387
                }
388
                sprintf(&buf[strlen(buf)], " CMPI p%d,r%d,#$%LLX", Pn, Ra, val);
389
                if (nb) *nb = 4;
390
                imm_prefix = false;
391
                return std::string(buf);
392
        }
393
        if ((opcode & 0xF0)==0x30) {
394
                b1 = system1.ReadByte(ad);
395
                ad++;
396
                disp = (b1 << 4) | (opcode & 0xF);
397
                if (disp & 0x800)
398
                        disp |= 0xFFFFFFFFFFFFF000LL;
399 32 robfinch
                sprintf(&buf[strlen(buf)], " BR $%LLX", disp + ad);
400 30 robfinch
                if (nb) *nb = 3;
401
                imm_prefix = false;
402
                return std::string(buf);
403
        }
404
 
405
        switch(opcode) {
406
 
407 32 robfinch
        case _2ADDUI:
408
                b1 = system1.ReadByte(ad);
409
                ad++;
410
                b2 = system1.ReadByte(ad);
411
                ad++;
412
                b3 = system1.ReadByte(ad);
413
                ad++;
414
                Ra = b1 & 0x3f;
415
                Rt = ((b2 & 0xf) << 2) | (b1 >> 6);
416
                val = (b3 << 4) | (b2 >> 4);
417
                sprintf(&buf[strlen(buf)], " _2ADDUI r%d,r%d,#$%I64X", Rt, Ra, val);
418
                if (nb) *nb = 5;
419
                imm_prefix = false;
420
                return std::string(buf);
421
 
422
        case _4ADDUI:
423
                b1 = system1.ReadByte(ad);
424
                ad++;
425
                b2 = system1.ReadByte(ad);
426
                ad++;
427
                b3 = system1.ReadByte(ad);
428
                ad++;
429
                Ra = b1 & 0x3f;
430
                Rt = ((b2 & 0xf) << 2) | (b1 >> 6);
431
                val = (b3 << 4) | (b2 >> 4);
432
                sprintf(&buf[strlen(buf)], " _4ADDUI r%d,r%d,#$%I64X", Rt, Ra, val);
433
                if (nb) *nb = 5;
434
                imm_prefix = false;
435
                return std::string(buf);
436
 
437
        case _8ADDUI:
438
                b1 = system1.ReadByte(ad);
439
                ad++;
440
                b2 = system1.ReadByte(ad);
441
                ad++;
442
                b3 = system1.ReadByte(ad);
443
                ad++;
444
                Ra = b1 & 0x3f;
445
                Rt = ((b2 & 0xf) << 2) | (b1 >> 6);
446
                val = (b3 << 4) | (b2 >> 4);
447
                sprintf(&buf[strlen(buf)], " _8ADDUI r%d,r%d,#$%I64X", Rt, Ra, val);
448
                if (nb) *nb = 5;
449
                imm_prefix = false;
450
                return std::string(buf);
451
 
452
        case _16ADDUI:
453
                b1 = system1.ReadByte(ad);
454
                ad++;
455
                b2 = system1.ReadByte(ad);
456
                ad++;
457
                b3 = system1.ReadByte(ad);
458
                ad++;
459
                Ra = b1 & 0x3f;
460
                Rt = ((b2 & 0xf) << 2) | (b1 >> 6);
461
                val = (b3 << 4) | (b2 >> 4);
462
                sprintf(&buf[strlen(buf)], " _16ADDUI r%d,r%d,#$%I64X", Rt, Ra, val);
463
                if (nb) *nb = 5;
464
                imm_prefix = false;
465
                return std::string(buf);
466
 
467 30 robfinch
        case ADDUI:
468
                b1 = system1.ReadByte(ad);
469
                ad++;
470
                b2 = system1.ReadByte(ad);
471
                ad++;
472
                b3 = system1.ReadByte(ad);
473
                ad++;
474
                Ra = b1 & 0x3f;
475
                Rt = ((b2 & 0xf) << 2) | (b1 >> 6);
476
                val = (b3 << 4) | (b2 >> 4);
477 32 robfinch
                sprintf(&buf[strlen(buf)], " ADDUI r%d,r%d,#$%I64X", Rt, Ra, val);
478 30 robfinch
                if (nb) *nb = 5;
479
                imm_prefix = false;
480
                return std::string(buf);
481
 
482
        case ADDUIS:
483
                b1 = system1.ReadByte(ad);
484
                ad++;
485
                b2 = system1.ReadByte(ad);
486
                ad++;
487
                Ra = b1 & 0x3f;
488
                Rt = Ra;
489
                val = (b2 << 2) | (b1 >> 6);
490 32 robfinch
                sprintf(&buf[strlen(buf)], " ADDUI r%d,r%d,#$%I64X", Rt, Ra, val);
491 30 robfinch
                if (nb) *nb = 4;
492
                imm_prefix = false;
493
                return std::string(buf);
494
 
495 32 robfinch
        case ANDI:
496
                b1 = system1.ReadByte(ad);
497
                ad++;
498
                b2 = system1.ReadByte(ad);
499
                ad++;
500
                b3 = system1.ReadByte(ad);
501
                ad++;
502
                Ra = b1 & 0x3f;
503
                Rt = ((b2 & 0xf) << 2) | (b1 >> 6);
504
                val = (b3 << 4) | (b2 >> 4);
505
                sprintf(&buf[strlen(buf)], " ANDI r%d,r%d,#$%I64X", Rt, Ra, val);
506
                if (nb) *nb = 5;
507
                imm_prefix = false;
508
                return std::string(buf);
509
 
510
        case BITI:
511
                b1 = system1.ReadByte(ad);
512
                ad++;
513
                b2 = system1.ReadByte(ad);
514
                ad++;
515
                b3 = system1.ReadByte(ad);
516
                ad++;
517
                Ra = b1 & 0x3f;
518
                Pn = ((b2 & 0x3) << 2) | (b1 >> 6);
519
                val = (b3 << 4) | (b2 >> 4);
520
                sprintf(&buf[strlen(buf)], " BITI p%d,r%d,#$%I64X", Pn, Ra, val);
521
                if (nb) *nb = 5;
522
                imm_prefix = false;
523
                return std::string(buf);
524
 
525
        case CLI:
526
                sprintf(&buf[strlen(buf)], " CLI");
527
                if (nb) *nb = 2;
528
                imm_prefix = false;
529
                return std::string(buf);
530
 
531
        case DIVI:
532
                b1 = system1.ReadByte(ad);
533
                ad++;
534
                b2 = system1.ReadByte(ad);
535
                ad++;
536
                b3 = system1.ReadByte(ad);
537
                ad++;
538
                Ra = b1 & 0x3f;
539
                Rt = ((b2 & 0xf) << 2) | (b1 >> 6);
540
                val = (b3 << 4) | (b2 >> 4);
541
                sprintf(&buf[strlen(buf)], " DIVI r%d,r%d,#$%I64X", Rt, Ra, val);
542
                if (nb) *nb = 5;
543
                imm_prefix = false;
544
                return std::string(buf);
545
 
546
        case DIVUI:
547
                b1 = system1.ReadByte(ad);
548
                ad++;
549
                b2 = system1.ReadByte(ad);
550
                ad++;
551
                b3 = system1.ReadByte(ad);
552
                ad++;
553
                Ra = b1 & 0x3f;
554
                Rt = ((b2 & 0xf) << 2) | (b1 >> 6);
555
                val = (b3 << 4) | (b2 >> 4);
556
                sprintf(&buf[strlen(buf)], " DIVUI r%d,r%d,#$%I64X", Rt, Ra, val);
557
                if (nb) *nb = 5;
558
                imm_prefix = false;
559
                return std::string(buf);
560
 
561
        case EORI:
562
                b1 = system1.ReadByte(ad);
563
                ad++;
564
                b2 = system1.ReadByte(ad);
565
                ad++;
566
                b3 = system1.ReadByte(ad);
567
                ad++;
568
                Ra = b1 & 0x3f;
569
                Rt = ((b2 & 0xf) << 2) | (b1 >> 6);
570
                val = (b3 << 4) | (b2 >> 4);
571
                sprintf(&buf[strlen(buf)], " EORI r%d,r%d,#$%I64X", Rt, Ra, val);
572
                if (nb) *nb = 5;
573
                imm_prefix = false;
574
                return std::string(buf);
575
 
576 30 robfinch
        case JSR:
577
                b1 = system1.ReadByte(ad);
578
                ad++;
579
                b2 = system1.ReadByte(ad);
580
                ad++;
581
                b3 = system1.ReadByte(ad);
582
                ad++;
583
                b4 = system1.ReadByte(ad);
584
                ad++;
585
                Cr = b1 >> 4;
586
                Ct = b1 & 0xF;
587
                if (imm_prefix)
588
                        disp = imm | b2;
589
                else {
590
                        disp = (b4 << 16) | (b3 << 8) | b2;
591
                        if (disp & 0x800000LL)
592
                                disp |= 0xFFFFFFFFFF000000LL;
593
                }
594
                if (nb) *nb = 6;
595
                imm_prefix = false;
596 32 robfinch
                sprintf(&buf[strlen(buf)], " JSR c%d,$%I64X[c%d]", Ct, disp, Cr);
597
                if (Cr==15)
598
                        sprintf(&buf[strlen(buf)], "  ($%I64X)", ad-6 + disp);
599 30 robfinch
                return std::string(buf);
600
 
601 32 robfinch
        case JSRI:
602
                b1 = system1.ReadByte(ad);
603
                ad++;
604
                b2 = system1.ReadByte(ad);
605
                ad++;
606
                b3 = system1.ReadByte(ad);
607
                ad++;
608
                Ra = b1 & 0x3f;
609
                Ct = (b1 >> 6) | (b2 << 2) & 0xc0;
610
                Sz = (b2 >> 2) & 3;
611
                Sg = b3 >> 5;
612
                disp = ((b3 & 0x1f) << 4) | (b2 >> 4);
613
                if (disp & 0x800LL)
614
                        disp |= 0xFFFFFFFFFFFFFE00LL;
615
                if (imm_prefix) {
616
                        disp &= 0xFFLL;
617
                        disp = imm | disp;
618
                }
619
                if (nb) *nb = 5;
620
                imm_prefix = false;
621
                switch(Sz) {
622
                case 1: sprintf(&buf[strlen(buf)], " JCI c%d,%s:$%I64X[r%d]", Ct, SegName(Sg).c_str(), disp, Ra); break;
623
                case 2: sprintf(&buf[strlen(buf)], " JHI c%d,%s:$%I64X[r%d]", Ct, SegName(Sg).c_str(), disp, Ra); break;
624
                case 3: sprintf(&buf[strlen(buf)], " JWI c%d,%s:$%I64X[r%d]", Ct, SegName(Sg).c_str(), disp, Ra); break;
625
                }
626
                return std::string(buf);
627
 
628 30 robfinch
        case JSRS:
629
                b1 = system1.ReadByte(ad);
630
                ad++;
631
                b2 = system1.ReadByte(ad);
632
                ad++;
633
                b3 = system1.ReadByte(ad);
634
                ad++;
635
                Cr = b1 >> 4;
636
                Ct = b1 & 0xF;
637
                if (imm_prefix)
638
                        disp = imm | b2;
639
                else {
640
                        disp = (b3 << 8) | b2;
641
                        if (disp & 0x8000LL)
642
                                disp |= 0xFFFFFFFFFFFF0000LL;
643
                }
644
                if (nb) *nb = 5;
645
                imm_prefix = false;
646
                sprintf(&buf[strlen(buf)], " JSR c%d,$%LLX", Ct, disp);
647
                if (Cr==15)
648 32 robfinch
                        sprintf(&buf[strlen(buf)], "[c%d]  ($%LLX)", Cr, ad-5 + disp);
649 30 robfinch
                else
650
                        sprintf(&buf[strlen(buf)], "[c%d]", Cr);
651
                return std::string(buf);
652
 
653 32 robfinch
        case JSRR:
654
                b1 = system1.ReadByte(ad);
655
                ad++;
656
                Cr = b1 >> 4;
657
                Ct = b1 & 0xF;
658
                if (nb) *nb = 3;
659
                imm_prefix = false;
660
                sprintf(&buf[strlen(buf)], " JSR c%d,[c%d]", Ct, Cr);
661
                return std::string(buf);
662
 
663 30 robfinch
        case LDI:
664
                b1 = system1.ReadByte(ad);
665
                ad++;
666
                b2 = system1.ReadByte(ad);
667
                ad++;
668
                Rt = b1 & 0x3f;
669
                val = (b2 << 2) | (b1 >> 6);
670
                if (imm_prefix)
671
                        val = imm | (val & 0xFF);
672
                else {
673
                        if (val & 0x200)
674
                                val |= 0xFFFFFFFFFFFFFE00LL;
675
                }
676
                sprintf(&buf[strlen(buf)], " LDI r%d,#$%08LLX", Rt, val);
677
                if (nb) *nb = 4;
678
                imm_prefix = false;
679
                return std::string(buf);
680
 
681
        case LDIS:
682
                b1 = system1.ReadByte(ad);
683
                ad++;
684
                b2 = system1.ReadByte(ad);
685
                ad++;
686
                Sprn = b1 & 0x3f;
687
                val = (b2 << 2) | (b1 >> 6);
688
                if (imm_prefix)
689
                        val = imm | (val & 0xFF);
690
                else {
691
                        if (val & 0x200)
692
                                val |= 0xFFFFFFFFFFFFFE00LL;
693
                }
694
                sprintf(&buf[strlen(buf)], " LDIS %s,#$%08LLX", SprName(Sprn).c_str(), val);
695
                if (nb) *nb = 4;
696
                imm_prefix = false;
697
                return std::string(buf);
698
 
699 32 robfinch
        case LB:        return mem("LB", ad, nb);
700
        case LBX:       return memndx("LBX", ad, nb);
701
        case LBUX:      return memndx("LBUX", ad, nb);
702
        case LVB:       return mem("LVB", ad, nb);
703
        case LBU:       return mem("LBU", ad, nb);
704
        case LC:        return mem("LC", ad, nb);
705
        case LCX:       return memndx("LCX", ad, nb);
706
        case LCUX:      return memndx("LCUX", ad, nb);
707
        case LVC:       return mem("LVC", ad, nb);
708
        case LCU:       return mem("LCU", ad, nb);
709
        case LH:        return mem("LH", ad, nb);
710
        case LHX:       return memndx("LHX", ad, nb);
711
        case LHUX:      return memndx("LHUX", ad, nb);
712
        case LVH:       return mem("LVH", ad, nb);
713
        case LHU:       return mem("LHU", ad, nb);
714
        case LW:        return mem("LW", ad, nb);
715
        case LWX:       return memndx("LWX", ad, nb);
716
        case LVW:       return mem("LVW", ad, nb);
717
        case LVWAR:     return mem("LVWAR", ad, nb);
718 30 robfinch
 
719
        case LLA:
720
                b1 = ReadByte(ad);
721
                ad++;
722
                b2 = ReadByte(ad);
723
                ad++;
724
                b3 = ReadByte(ad);
725
                ad++;
726
                Rt = ((b2 & 0xF) << 2) | (( b1 >> 6) & 3);
727
                str = dRn(b1,b2,b3,&Ra,&Sg,&disp);
728
                sprintf(&buf[strlen(buf)]," LLA r%d,%s", Rt, str.c_str());
729
                if (nb) *nb = 5;
730
                imm_prefix = false;
731
                return std::string(buf);
732
 
733
        case LOGIC:
734
                b1 = system1.ReadByte(ad);
735
                ad++;
736
                b2 = system1.ReadByte(ad);
737
                ad++;
738
                b3 = system1.ReadByte(ad);
739
                ad++;
740
                Ra = b1 & 0x3f;
741
                Rb = ((b2 & 0x0f) << 2) | (b1 >> 6);
742
                Rt = ((b3 & 3) << 4) | (b2 >> 4);
743
                func = b3 >> 2;
744
                switch(func) {
745 32 robfinch
                case AND:       sprintf(&buf[strlen(buf)], " AND r%d,r%d,r%d", Rt, Ra, Rb); break;
746
                case OR:        sprintf(&buf[strlen(buf)], " OR r%d,r%d,r%d", Rt, Ra, Rb); break;
747
                case EOR:       sprintf(&buf[strlen(buf)], " EOR r%d,r%d,r%d", Rt, Ra, Rb); break;
748
                case NAND:      sprintf(&buf[strlen(buf)], " NAND r%d,r%d,r%d", Rt, Ra, Rb); break;
749
                case NOR:       sprintf(&buf[strlen(buf)], " NOR r%d,r%d,r%d", Rt, Ra, Rb); break;
750
                case ENOR:      sprintf(&buf[strlen(buf)], " ENOR r%d,r%d,r%d", Rt, Ra, Rb); break;
751 30 robfinch
                }
752
                if (nb) *nb = 5;
753
                imm_prefix = false;
754
                return std::string(buf);
755
 
756
        case LOOP:
757
                disp = system1.ReadByte(ad);
758
                ad++;
759
                if (disp & 0x80LL)
760
                        disp |= 0xFFFFFFFFFFFFFF00LL;
761
                sprintf(&buf[strlen(buf)], " LOOP $%LLX", disp + ad);
762
                if (nb) *nb = 3;
763
                imm_prefix = false;
764
                return std::string(buf);
765
 
766 32 robfinch
        case LWS:
767
                b1 = ReadByte(ad);
768
                ad++;
769
                b2 = ReadByte(ad);
770
                ad++;
771
                b3 = ReadByte(ad);
772
                ad++;
773
                Rb = ((b2 & 0xF) << 2) | (( b1 >> 6) & 3);
774
                str = dRn(b1,b2,b3,&Ra,&Sg,&disp);
775
                sprintf(&buf[strlen(buf)]," LWS %s,%s", SprName(Rb).c_str(), str.c_str());
776
                if (nb) *nb = 5;
777
                imm_prefix = false;
778
                return std::string(buf);
779
 
780
        case MEMSB:
781
                sprintf(&buf[strlen(buf)], " MEMSB");
782
                if (nb) *nb = 2;
783
                imm_prefix = false;
784
                return std::string(buf);
785
 
786
        case MEMDB:
787
                sprintf(&buf[strlen(buf)], " MEMDB");
788
                if (nb) *nb = 2;
789
                imm_prefix = false;
790
                return std::string(buf);
791
 
792 30 robfinch
        case MFSPR:
793
                b1 = system1.ReadByte(ad);
794
                ad++;
795
                b2 = system1.ReadByte(ad);
796
                ad++;
797
                Sprn = b1 & 0x3f;
798
                Rt = ((b2 & 0x0f) << 2) | (b1 >> 6);
799
                sprintf(&buf[strlen(buf)], " MFSPR r%d,%s", Rt, SprName(Sprn).c_str());
800
                if (nb) *nb = 4;
801
                imm_prefix = false;
802
                return std::string(buf);
803
 
804 32 robfinch
        case MODI:
805
                b1 = system1.ReadByte(ad);
806
                ad++;
807
                b2 = system1.ReadByte(ad);
808
                ad++;
809
                b3 = system1.ReadByte(ad);
810
                ad++;
811
                Ra = b1 & 0x3f;
812
                Rt = ((b2 & 0xf) << 2) | (b1 >> 6);
813
                val = (b3 << 4) | (b2 >> 4);
814
                sprintf(&buf[strlen(buf)], " MODI r%d,r%d,#$%I64X", Rt, Ra, val);
815
                if (nb) *nb = 5;
816
                imm_prefix = false;
817
                return std::string(buf);
818
 
819
        case MODUI:
820
                b1 = system1.ReadByte(ad);
821
                ad++;
822
                b2 = system1.ReadByte(ad);
823
                ad++;
824
                b3 = system1.ReadByte(ad);
825
                ad++;
826
                Ra = b1 & 0x3f;
827
                Rt = ((b2 & 0xf) << 2) | (b1 >> 6);
828
                val = (b3 << 4) | (b2 >> 4);
829
                sprintf(&buf[strlen(buf)], " MODUI r%d,r%d,#$%I64X", Rt, Ra, val);
830
                if (nb) *nb = 5;
831
                imm_prefix = false;
832
                return std::string(buf);
833
 
834
        case GRPA7:
835 30 robfinch
                b1 = ReadByte(ad);
836
                ad++;
837
                b2 = ReadByte(ad);
838
                ad++;
839
                Ra = b1 & 0x3f;
840
                Rt = ((b2 & 0xF) << 2) | (b1 >> 6);
841 32 robfinch
                switch(b2>>4) {
842
                case MOV:       sprintf(&buf[strlen(buf)]," MOV r%d,r%d", Rt, Ra); break;
843
                case SXB:       sprintf(&buf[strlen(buf)]," SXB r%d,r%d", Rt, Ra); break;
844
                case SXC:       sprintf(&buf[strlen(buf)]," SXC r%d,r%d", Rt, Ra); break;
845
                case SXH:       sprintf(&buf[strlen(buf)]," SXH r%d,r%d", Rt, Ra); break;
846
                case ZXB:       sprintf(&buf[strlen(buf)]," ZXB r%d,r%d", Rt, Ra); break;
847
                case ZXC:       sprintf(&buf[strlen(buf)]," ZXC r%d,r%d", Rt, Ra); break;
848
                case ZXH:       sprintf(&buf[strlen(buf)]," ZXH r%d,r%d", Rt, Ra); break;
849
                }
850 30 robfinch
                if (nb) *nb = 4;
851
                imm_prefix = false;
852
                return std::string(buf);
853
 
854
        case MTSPR:
855
                b1 = system1.ReadByte(ad);
856
                ad++;
857
                b2 = system1.ReadByte(ad);
858
                ad++;
859
                Ra = b1 & 0x3f;
860
                Sprn = ((b2 & 0x0f) << 2) | (b1 >> 6);
861
                sprintf(&buf[strlen(buf)], " MTSPR %s,r%d", SprName(Sprn).c_str(), Ra);
862
                if (nb) *nb = 4;
863
                imm_prefix = false;
864
                return std::string(buf);
865
 
866 32 robfinch
        case MULI:
867
                b1 = system1.ReadByte(ad);
868
                ad++;
869
                b2 = system1.ReadByte(ad);
870
                ad++;
871
                b3 = system1.ReadByte(ad);
872
                ad++;
873
                Ra = b1 & 0x3f;
874
                Rt = ((b2 & 0xf) << 2) | (b1 >> 6);
875
                val = (b3 << 4) | (b2 >> 4);
876
                sprintf(&buf[strlen(buf)], " MULI r%d,r%d,#$%I64X", Rt, Ra, val);
877
                if (nb) *nb = 5;
878
                imm_prefix = false;
879
                return std::string(buf);
880
 
881
        case MULUI:
882
                b1 = system1.ReadByte(ad);
883
                ad++;
884
                b2 = system1.ReadByte(ad);
885
                ad++;
886
                b3 = system1.ReadByte(ad);
887
                ad++;
888
                Ra = b1 & 0x3f;
889
                Rt = ((b2 & 0xf) << 2) | (b1 >> 6);
890
                val = (b3 << 4) | (b2 >> 4);
891
                sprintf(&buf[strlen(buf)], " MULUI r%d,r%d,#$%I64X", Rt, Ra, val);
892
                if (nb) *nb = 5;
893
                imm_prefix = false;
894
                return std::string(buf);
895
 
896
        case ORI:
897
                b1 = system1.ReadByte(ad);
898
                ad++;
899
                b2 = system1.ReadByte(ad);
900
                ad++;
901
                b3 = system1.ReadByte(ad);
902
                ad++;
903
                Ra = b1 & 0x3f;
904
                Rt = ((b2 & 0xf) << 2) | (b1 >> 6);
905
                val = (b3 << 4) | (b2 >> 4);
906
                sprintf(&buf[strlen(buf)], " ORI r%d,r%d,#$%I64X", Rt, Ra, val);
907
                if (nb) *nb = 5;
908
                imm_prefix = false;
909
                return std::string(buf);
910
 
911 30 robfinch
        case RR:
912
                b1 = system1.ReadByte(ad);
913
                ad++;
914
                b2 = system1.ReadByte(ad);
915
                ad++;
916
                b3 = system1.ReadByte(ad);
917
                ad++;
918
                Ra = b1 & 0x3f;
919
                Rb = ((b2 & 0x0f) << 2) | (b1 >> 6);
920
                Rt = ((b3 & 3) << 4) | (b2 >> 4);
921
                func = b3 >> 2;
922
                switch(func) {
923 32 robfinch
                case ADD:
924
                        sprintf(&buf[strlen(buf)], " ADD r%d,r%d,r%d", Rt, Ra, Rb);
925
                        break;
926
                case ADDU:
927
                        sprintf(&buf[strlen(buf)], " ADDU r%d,r%d,r%d", Rt, Ra, Rb);
928
                        break;
929
                case DIV:
930
                        sprintf(&buf[strlen(buf)], " DIV r%d,r%d,r%d", Rt, Ra, Rb);
931
                        break;
932
                case DIVU:
933
                        sprintf(&buf[strlen(buf)], " DIVU r%d,r%d,r%d", Rt, Ra, Rb);
934
                        break;
935
                case MUL:
936
                        sprintf(&buf[strlen(buf)], " MUL r%d,r%d,r%d", Rt, Ra, Rb);
937
                        break;
938
                case MULU:
939
                        sprintf(&buf[strlen(buf)], " MULU r%d,r%d,r%d", Rt, Ra, Rb);
940
                        break;
941 30 robfinch
                case _2ADDU:
942
                        sprintf(&buf[strlen(buf)], " _2ADDU r%d,r%d,r%d", Rt, Ra, Rb);
943
                        break;
944
                case _4ADDU:
945
                        sprintf(&buf[strlen(buf)], " _4ADDU r%d,r%d,r%d", Rt, Ra, Rb);
946
                        break;
947
                case _8ADDU:
948
                        sprintf(&buf[strlen(buf)], " _8ADDU r%d,r%d,r%d", Rt, Ra, Rb);
949
                        break;
950
                case _16ADDU:
951
                        sprintf(&buf[strlen(buf)], " _16ADDU r%d,r%d,r%d", Rt, Ra, Rb);
952
                        break;
953 32 robfinch
                case MOD:
954
                        sprintf(&buf[strlen(buf)], " MOD r%d,r%d,r%d", Rt, Ra, Rb);
955
                        break;
956
                case MODU:
957
                        sprintf(&buf[strlen(buf)], " MODU r%d,r%d,r%d", Rt, Ra, Rb);
958
                        break;
959
                case SUB:
960
                        sprintf(&buf[strlen(buf)], " SUB r%d,r%d,r%d", Rt, Ra, Rb);
961
                        break;
962
                case SUBU:
963
                        sprintf(&buf[strlen(buf)], " SUBU r%d,r%d,r%d", Rt, Ra, Rb);
964
                        break;
965 30 robfinch
                }
966
                if (nb) *nb = 5;
967
                imm_prefix = false;
968
                return std::string(buf);
969
 
970 32 robfinch
        case RTD:
971
                sprintf(&buf[strlen(buf)], " RTD");
972
                if (nb) *nb = 2;
973
                imm_prefix = false;
974
                return std::string(buf);
975
 
976
        case RTE:
977
                sprintf(&buf[strlen(buf)], " RTE");
978
                if (nb) *nb = 2;
979
                imm_prefix = false;
980
                return std::string(buf);
981
 
982
        case RTI:
983
                sprintf(&buf[strlen(buf)], " RTI");
984
                if (nb) *nb = 2;
985
                imm_prefix = false;
986
                return std::string(buf);
987
 
988 30 robfinch
        case RTS:
989
                b1 = system1.ReadByte(ad);
990
                ad++;
991
                Cr = b1 >> 4;
992
                sprintf(&buf[strlen(buf)], " RTS $%X[c%d]", b1 & 0xF, Cr);
993
                if (nb) *nb = 3;
994
                imm_prefix = false;
995
                return std::string(buf);
996
 
997
        case RTSQ:
998
                sprintf(&buf[strlen(buf)], " RTS");
999
                if (nb) *nb = 2;
1000
                imm_prefix = false;
1001
                return std::string(buf);
1002
 
1003
        case SB:
1004
                b1 = ReadByte(ad);
1005
                ad++;
1006
                b2 = ReadByte(ad);
1007
                ad++;
1008
                b3 = ReadByte(ad);
1009
                ad++;
1010
                Rb = ((b2 & 0xF) << 2) | (( b1 >> 6) & 3);
1011
                str = dRn(b1,b2,b3,&Ra,&Sg,&disp);
1012
                sprintf(&buf[strlen(buf)]," SB r%d,%s", Rb, str.c_str());
1013
                if (nb) *nb = 5;
1014
                imm_prefix = false;
1015
                return std::string(buf);
1016
 
1017 32 robfinch
        case SBX:       return memndx("SBX", ad, nb);
1018
        case SCX:       return memndx("SCX", ad, nb);
1019
        case SHX:       return memndx("SHX", ad, nb);
1020
        case SWX:       return memndx("SWX", ad, nb);
1021
 
1022 30 robfinch
        case SC:
1023
                b1 = ReadByte(ad);
1024
                ad++;
1025
                b2 = ReadByte(ad);
1026
                ad++;
1027
                b3 = ReadByte(ad);
1028
                ad++;
1029
                Rb = ((b2 & 0xF) << 2) | (( b1 >> 6) & 3);
1030
                str = dRn(b1,b2,b3,&Ra,&Sg,&disp);
1031
                sprintf(&buf[strlen(buf)]," SC r%d,%s", Rb, str.c_str());
1032
                if (nb) *nb = 5;
1033
                imm_prefix = false;
1034
                return std::string(buf);
1035
 
1036
        case SH:
1037
                b1 = ReadByte(ad);
1038
                ad++;
1039
                b2 = ReadByte(ad);
1040
                ad++;
1041
                b3 = ReadByte(ad);
1042
                ad++;
1043
                Rb = ((b2 & 0xF) << 2) | (( b1 >> 6) & 3);
1044
                str = dRn(b1,b2,b3,&Ra,&Sg,&disp);
1045
                sprintf(&buf[strlen(buf)]," SH r%d,%s", Rb, str.c_str());
1046
                if (nb) *nb = 5;
1047
                imm_prefix = false;
1048
                return std::string(buf);
1049
 
1050
        case SHIFT:
1051
                b1 = system1.ReadByte(ad);
1052
                ad++;
1053
                b2 = system1.ReadByte(ad);
1054
                ad++;
1055
                b3 = system1.ReadByte(ad);
1056
                ad++;
1057
                Ra = b1 & 0x3f;
1058
                Rb = ((b2 & 0x0f) << 2) | (b1 >> 6);
1059
                Rt = ((b3 & 3) << 4) | (b2 >> 4);
1060
                func = b3 >> 2;
1061
                switch(func) {
1062
                case SHL:
1063
                        sprintf(&buf[strlen(buf)], " SHL r%d,r%d,r%d", Rt, Ra, Rb);
1064
                        break;
1065 32 robfinch
                case SHR:
1066
                        sprintf(&buf[strlen(buf)], " SHR r%d,r%d,r%d", Rt, Ra, Rb);
1067
                        break;
1068
                case SHLU:
1069
                        sprintf(&buf[strlen(buf)], " SHLU r%d,r%d,r%d", Rt, Ra, Rb);
1070
                        break;
1071
                case SHRU:
1072
                        sprintf(&buf[strlen(buf)], " SHRU r%d,r%d,r%d", Rt, Ra, Rb);
1073
                        break;
1074 30 robfinch
                case SHLI:
1075
                        sprintf(&buf[strlen(buf)], " SHLI r%d,r%d,#$%X", Rt, Ra, Rb);
1076
                        break;
1077 32 robfinch
                case SHRI:
1078
                        sprintf(&buf[strlen(buf)], " SHRI r%d,r%d,#$%X", Rt, Ra, Rb);
1079
                        break;
1080
                case SHLUI:
1081
                        sprintf(&buf[strlen(buf)], " SHLUI r%d,r%d,#$%X", Rt, Ra, Rb);
1082
                        break;
1083
                case SHRUI:
1084
                        sprintf(&buf[strlen(buf)], " SHRUI r%d,r%d,#$%X", Rt, Ra, Rb);
1085
                        break;
1086
                case ROL:
1087
                        sprintf(&buf[strlen(buf)], " ROL r%d,r%d,r%d", Rt, Ra, Rb);
1088
                        break;
1089
                case ROR:
1090
                        sprintf(&buf[strlen(buf)], " ROR r%d,r%d,r%d", Rt, Ra, Rb);
1091
                        break;
1092
                case ROLI:
1093
                        sprintf(&buf[strlen(buf)], " ROLI r%d,r%d,#$%X", Rt, Ra, Rb);
1094
                        break;
1095
                case RORI:
1096
                        sprintf(&buf[strlen(buf)], " RORI r%d,r%d,#$%X", Rt, Ra, Rb);
1097
                        break;
1098 30 robfinch
                }
1099
                if (nb) *nb = 5;
1100
                imm_prefix = false;
1101
                return std::string(buf);
1102
 
1103
        case STP:
1104
                b1 = ReadByte(ad);
1105
                ad++;
1106
                b2 = ReadByte(ad);
1107
                ad++;
1108
                sprintf(&buf[strlen(buf)]," STP #$%04X", (int)((b2<<8)|b1));
1109
                if (nb) *nb = 4;
1110
                imm_prefix = false;
1111
                return std::string(buf);
1112
 
1113 32 robfinch
        case STSET:
1114
                b1 = ReadByte(ad);
1115
                ad++;
1116
                b2 = ReadByte(ad);
1117
                ad++;
1118
                b3 = ReadByte(ad);
1119
                ad++;
1120
                Ra = b1 & 0x3f;
1121
                Rb = ((b2 & 0xF) << 2) | (( b1 >> 6) & 3);
1122
                Sg = b3 >> 5;
1123
                switch((b3 >> 2) & 7) {
1124
                case 0: sprintf(&buf[strlen(buf)]," STSET.BI r%d,%s:[r%d]", Rb, SegName(Sg).c_str(), Ra);
1125
                case 1: sprintf(&buf[strlen(buf)]," STSET.CI r%d,%s:[r%d]", Rb, SegName(Sg).c_str(), Ra);
1126
                case 2: sprintf(&buf[strlen(buf)]," STSET.HI r%d,%s:[r%d]", Rb, SegName(Sg).c_str(), Ra);
1127
                case 3: sprintf(&buf[strlen(buf)]," STSET.WI r%d,%s:[r%d]", Rb, SegName(Sg).c_str(), Ra);
1128
                case 4: sprintf(&buf[strlen(buf)]," STSET.BD r%d,%s:[r%d]", Rb, SegName(Sg).c_str(), Ra);
1129
                case 5: sprintf(&buf[strlen(buf)]," STSET.CD r%d,%s:[r%d]", Rb, SegName(Sg).c_str(), Ra);
1130
                case 6: sprintf(&buf[strlen(buf)]," STSET.HD r%d,%s:[r%d]", Rb, SegName(Sg).c_str(), Ra);
1131
                case 7: sprintf(&buf[strlen(buf)]," STSET.WD r%d,%s:[r%d]", Rb, SegName(Sg).c_str(), Ra);
1132
                }
1133
                if (nb) *nb = 5;
1134
                imm_prefix = false;
1135
                return std::string(buf);
1136
 
1137
        case SUBUI:
1138
                b1 = system1.ReadByte(ad);
1139
                ad++;
1140
                b2 = system1.ReadByte(ad);
1141
                ad++;
1142
                b3 = system1.ReadByte(ad);
1143
                ad++;
1144
                Ra = b1 & 0x3f;
1145
                Rt = ((b2 & 0xf) << 2) | (b1 >> 6);
1146
                val = (b3 << 4) | (b2 >> 4);
1147
                sprintf(&buf[strlen(buf)], " SUBUI r%d,r%d,#$%I64X", Rt, Ra, val);
1148
                if (nb) *nb = 5;
1149
                imm_prefix = false;
1150
                return std::string(buf);
1151
 
1152 30 robfinch
        case SW:
1153
                b1 = ReadByte(ad);
1154
                ad++;
1155
                b2 = ReadByte(ad);
1156
                ad++;
1157
                b3 = ReadByte(ad);
1158
                ad++;
1159
                Rb = ((b2 & 0xF) << 2) | (( b1 >> 6) & 3);
1160
                str = dRn(b1,b2,b3,&Ra,&Sg,&disp);
1161
                sprintf(&buf[strlen(buf)]," SW r%d,%s", Rb, str.c_str());
1162
                if (nb) *nb = 5;
1163
                imm_prefix = false;
1164
                return std::string(buf);
1165
 
1166 32 robfinch
        case SWCR:
1167
                b1 = ReadByte(ad);
1168
                ad++;
1169
                b2 = ReadByte(ad);
1170
                ad++;
1171
                b3 = ReadByte(ad);
1172
                ad++;
1173
                Rb = ((b2 & 0xF) << 2) | (( b1 >> 6) & 3);
1174
                str = dRn(b1,b2,b3,&Ra,&Sg,&disp);
1175
                sprintf(&buf[strlen(buf)]," SWCR r%d,%s", Rb, str.c_str());
1176
                if (nb) *nb = 5;
1177
                imm_prefix = false;
1178
                return std::string(buf);
1179
 
1180
        case SWS:
1181
                b1 = ReadByte(ad);
1182
                ad++;
1183
                b2 = ReadByte(ad);
1184
                ad++;
1185
                b3 = ReadByte(ad);
1186
                ad++;
1187
                Rb = ((b2 & 0xF) << 2) | (( b1 >> 6) & 3);
1188
                str = dRn(b1,b2,b3,&Ra,&Sg,&disp);
1189
                sprintf(&buf[strlen(buf)]," SWS %s,%s", SprName(Rb).c_str(), str.c_str());
1190
                if (nb) *nb = 5;
1191
                imm_prefix = false;
1192
                return std::string(buf);
1193
 
1194
        case SYNC:
1195
                sprintf(&buf[strlen(buf)], " SYNC");
1196
                if (nb) *nb = 2;
1197
                imm_prefix = false;
1198
                return std::string(buf);
1199
 
1200
        case SYS:
1201
                b1 = ReadByte(ad);
1202
                ad++;
1203
                b2 = ReadByte(ad);
1204
                ad++;
1205
                Cr = b1 >> 4;
1206
                Ct = b1 & 0xF;
1207
                sprintf(&buf[strlen(buf)], " SYS c%d,c%d,#%X", Ct, Cr, b2);
1208
                if (nb) *nb = 4;
1209
                imm_prefix = false;
1210
                return std::string(buf);
1211
 
1212
        case TLB:
1213
                b1 = ReadByte(ad);
1214
                ad++;
1215
                b2 = ReadByte(ad);
1216
                ad++;
1217
                Tn = b1 >> 4;
1218
                Rt = b2 & 0x3f;
1219
                Ra = Rt;
1220
                str = "TLB";
1221
                switch(b1 & 0xF) {
1222
                case 0:
1223
                        str += "NOP";
1224
                        sprintf(&buf[strlen(buf)]," %s", str.c_str());
1225
                        break;
1226
                case 1:
1227
                        str += "PB";
1228
                        sprintf(&buf[strlen(buf)]," %s r%d", str.c_str(), Ra);
1229
                        break;
1230
                case 2:
1231
                        str += "RD";
1232
                        sprintf(&buf[strlen(buf)]," %s r%d,%s", str.c_str(), Rt, TLBRegName(Tn));
1233
                        break;
1234
                case 3:
1235
                        str += "WR";
1236
                        sprintf(&buf[strlen(buf)]," %s %s,r%d", str.c_str(), TLBRegName(Tn), Rt);
1237
                        break;
1238
                case 4:
1239
                        str += "WI";
1240
                        sprintf(&buf[strlen(buf)]," %s %s,r%d", str.c_str(), TLBRegName(Tn), Rt);
1241
                        break;
1242
                case 5:
1243
                        str += "EN";
1244
                        sprintf(&buf[strlen(buf)]," %s", str.c_str());
1245
                        break;
1246
                case 6:
1247
                        str += "DIS";
1248
                        sprintf(&buf[strlen(buf)]," %s", str.c_str());
1249
                        break;
1250
                default:
1251
                        str += "???";
1252
                        sprintf(&buf[strlen(buf)]," %s", str.c_str());
1253
                        break;
1254
                }
1255
                if (nb) *nb = 4;
1256
                imm_prefix = false;
1257
                return std::string(buf);
1258
 
1259 30 robfinch
        }
1260
        *nb = 1;
1261
        return std::string("");
1262
}

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.