|
|
1.1 root 1: //
2: // nono
1.1.1.2 root 3: // Copyright (C) 2020 nono project
4: // Licensed under nono-license.txt
1.1 root 5: //
6:
7: #include "m88100disasm.h"
1.1.1.2 root 8: #include "m88100acc.h"
1.1 root 9: #include "bus.h"
10:
11: #define OP_DEF(name) void __CONCAT(m88100disasm::op_,name)()
12: #define OP_FUNC(name) __CONCAT(op_,name)()
13:
14: // コンストラクタ
1.1.1.4 root 15: m88100disasm::m88100disasm(DebuggerMemoryStream& mem_)
16: : inherited(mem_)
1.1 root 17: {
18: }
19:
20: // デストラクタ
21: m88100disasm::~m88100disasm()
22: {
23: }
24:
25: // 逆アセンブルを実行
26: bool
1.1.1.4 root 27: m88100disasm::Exec()
1.1 root 28: {
29: ExecInit();
30:
31: opX = 0;
32: name.clear();
33: arg0.clear();
34: arg1.clear();
35: arg2.clear();
36:
1.1.1.4 root 37: xip = (uint32)mem.laddr;
1.1 root 38:
1.1.1.4 root 39: opX = mem.FetchInst();
40: uint32 op12 = m88kcpu::op32_to_12(opX);
1.1 root 41: switch (op12) {
42: #include "m88100switch.inc"
43: default:
1.1.1.2 root 44: name = "illegal";
45: break;
46: //OP_FUNC(illegal);
1.1 root 47: }
48:
49: // 出力文字列(ダンプ)
50: dump = string_format("%08x ", opX);
51:
52: // 出力文字列(命令)
53: text = name;
54: if (!arg0.empty() || !arg1.empty() || !arg2.empty()) {
55: // オペランドがどれかでもあればインデントする
56: int len = text.length();
57: if (len < 8) {
58: text += std::string(8 - len, ' ');
59: } else {
60: text += ' ';
61: }
62:
63: // arg0,1,2 の空でないやつを追加
64: std::string args;
65: if (!arg0.empty()) {
66: args += arg0;
67: }
68: if (!arg1.empty()) {
69: if (!args.empty()) {
70: args += ",";
1.1.1.6 ! root 71: while (args.length() % 4 != 0)
1.1 root 72: args += " ";
73: }
74: args += arg1;
75: }
76: if (!arg2.empty()) {
77: if (!args.empty()) {
78: args += ",";
1.1.1.6 ! root 79: while (args.length() % 4 != 0)
1.1 root 80: args += " ";
81: }
82: args += arg2;
83: }
84:
85: text += args;
86: }
87:
88: // 出力バイナリ列
89: // bin は vector<uint8>。
90: bin.push_back( opX >> 24);
91: bin.push_back((opX >> 16) & 0xff);
92: bin.push_back((opX >> 8) & 0xff);
93: bin.push_back( opX & 0xff);
94:
95: return true;
96: }
97:
98: // フィールド部品
99: #define B5 ((opX >> 21) & 0x1f)
100: #define M5 ((opX >> 21) & 0x1f)
101: #define W5 ((opX >> 5) & 0x1f)
102: #define O5 ((opX ) & 0x1f)
103: #define VEC9 (opX & 0x000001ffU)
104: #define D16 (((int32)(int16)opX) << 2)
105: #define D26 (((int32)(opX << 6)) >> 4)
106:
107: std::string
108: m88100disasm::rd()
109: {
110: return string_format("r%d", (opX >> 21) & 0x1f);
111: }
112:
113: std::string
114: m88100disasm::rs1()
115: {
116: return string_format("r%d", (opX >> 16) & 0x1f);
117: }
118:
119: std::string
120: m88100disasm::rs2()
121: {
122: return string_format("r%d", (opX ) & 0x1f);
123: }
124:
125: std::string
126: m88100disasm::imm16()
127: {
128: return string_format("#0x%04x", (opX & 0x0000ffff));
129: }
130:
131: std::string
132: m88100disasm::d16()
133: {
134: return string_format("0x%08x", xip + D16);
135: }
136:
1.1.1.6 ! root 137: std::string
! 138: m88100disasm::d26()
! 139: {
! 140: return string_format("0x%08x", xip + D26);
! 141: }
! 142:
1.1 root 143: // 制御レジスタ名
144: std::string
145: m88100disasm::crs()
146: {
1.1.1.2 root 147: // CRS フィールドは 6 bit。ただし CR20 までしか存在しない
1.1 root 148: uint32 cr = (opX >> 5) & 0x3f;
149: static const char *crnames[] = {
150: "pid", "psr", "epsr", "ssbr", // cr0..3
151: "sxip", "snip", "sfip", "vbr", // cr4..7
152: "dmt0", "dmd0", "dma0", // cr8..10
153: "dmt1", "dmd1", "dma1", // cr11..13
154: "dmt2", "dmd2", "dma2", // cr14..16
1.1.1.2 root 155: "sr0", "sr1", "sr2", "sr3", // cr17..20
1.1 root 156: };
157:
158: if (cr < countof(crnames)) {
159: return std::string(crnames[cr]);
160: } else {
161: return string_format("cr%d", cr); // こうなのか?
162: }
163: }
164:
165: // FPU 制御レジスタ名
166: std::string
167: m88100disasm::fcrs()
168: {
169: uint32 cr = (opX >> 5) & 0x3f;
170: static const char *fcrnames[] = {
171: "fpecr", // fcr0
172: "fphs1", // fcr1
173: "fpls1", // fcr2
174: "fphs2", // fcr3
175: "fpls2", // fcr4
176: "fppt", // fcr5
177: "fprh", // fcr6
178: "fprl", // fcr7
179: "fpit", // fcr8
180: };
181: if (cr < countof(fcrnames)) {
182: return std::string(fcrnames[cr]);
183: } else if (cr == 62) {
184: return "fpsr";
185: } else if (cr == 63) {
186: return "fpcr";
187: } else {
188: return string_format("fcr%d", cr);
189: }
190: }
191:
192: #define TD (5)
193: #define T1 (9)
194: #define T2 (7)
195:
196: // FPU サイズサフィックス t は TD、T1、T2
197: std::string
198: m88100disasm::fsize(uint32 t)
199: {
200: uint32 sz = (opX >> t) & 3;
201: return sz == 1 ? "d" : "s";
202: }
203:
204: // FPU サイズサフィックス (全部入り)
205: std::string
206: m88100disasm::fsize()
207: {
208: return fsize(TD) + fsize(T1) + fsize(T2);
209: }
210:
211: // "Width<Offset>"
212: std::string
213: m88100disasm::wo5()
214: {
215: uint32 w5 = W5 ?: 32;
216: uint32 o5 = O5;
217: return string_format("%d<%d>", w5, o5);
218: }
219:
220: // キャリーサフィックス
221: std::string
222: m88100disasm::cio()
223: {
224: uint32 c = (opX >> 8) & 3;
225: static const char *carrystr[] = {
226: "",
227: ".co",
1.1.1.2 root 228: ".ci",
1.1 root 229: ".cio",
230: };
231: return std::string(carrystr[c]);
232: }
233:
234: std::string
235: m88100disasm::b5()
236: {
237: return string_format("#%d", B5);
238: }
239:
240: std::string
241: m88100disasm::m5()
242: {
243: uint32 m = M5;
244: switch (m) {
245: case 0x02: return "eq0";
246: case 0x0d: return "ne0";
247: case 0x01: return "gt0";
248: case 0x0c: return "lt0";
249: case 0x03: return "ge0";
250: case 0x0e: return "le0";
251: default:
252: break;
253: }
254: return string_format("0x%02x", m); // ?
255: }
256:
257: std::string
258: m88100disasm::vec9()
259: {
260: return string_format("#0x%03x", VEC9);
261: }
262:
263: // エミュレータ的未実装 (最終的にはなくなる)
264: void
265: m88100disasm::op_unimpl()
266: {
267: name = "unimplemented";
268: }
269:
1.1.1.6 ! root 270: // ld_imm, st_imm, xmem_imm の共通部
! 271: // namebase にはサイズプレフィックスを含む。
! 272: void
! 273: m88100disasm::ops_ldst_imm(const std::string& namebase)
1.1 root 274: {
1.1.1.6 ! root 275: name = namebase;
1.1 root 276: arg0 = rd();
277: arg1 = rs1();
278: arg2 = imm16();
279: }
280:
1.1.1.6 ! root 281: // 000000_DDDDDSSSSS_nnnnnn_nnnnnnnnnn
! 282: OP_DEF(xmem_bu_imm)
! 283: {
! 284: ops_ldst_imm("xmem.bu");
! 285: }
! 286:
1.1 root 287: // 000001_DDDDDSSSSS_nnnnnn_nnnnnnnnnn
288: OP_DEF(xmem_w_imm)
289: {
1.1.1.6 ! root 290: ops_ldst_imm("xmem");
1.1 root 291: }
292:
293: // 000010_DDDDDSSSSS_nnnnnn_nnnnnnnnnn
294: OP_DEF(ld_hu_imm)
295: {
1.1.1.6 ! root 296: ops_ldst_imm("ld.hu");
1.1 root 297: }
298:
299: // 000011_DDDDDSSSSS_nnnnnn_nnnnnnnnnn
300: OP_DEF(ld_bu_imm)
301: {
1.1.1.6 ! root 302: ops_ldst_imm("ld.bu");
1.1 root 303: }
304:
305: // 000100_DDDDDSSSSS_nnnnnn_nnnnnnnnnn
306: OP_DEF(ld_d_imm)
307: {
1.1.1.6 ! root 308: ops_ldst_imm("ld.d");
1.1 root 309: }
310:
311: // 000101_DDDDDSSSSS_nnnnnn_nnnnnnnnnn
312: OP_DEF(ld_w_imm)
313: {
1.1.1.6 ! root 314: ops_ldst_imm("ld");
1.1 root 315: }
316:
317: // 000110_DDDDDSSSSS_nnnnnn_nnnnnnnnnn
318: OP_DEF(ld_h_imm)
319: {
1.1.1.6 ! root 320: ops_ldst_imm("ld.h");
1.1 root 321: }
322:
323: // 000111_DDDDDSSSSS_nnnnnn_nnnnnnnnnn
324: OP_DEF(ld_b_imm)
325: {
1.1.1.6 ! root 326: ops_ldst_imm("ld.b");
1.1 root 327: }
328:
329: // 001000_DDDDDSSSSS_nnnnnn_nnnnnnnnnn
330: OP_DEF(st_d_imm)
331: {
1.1.1.6 ! root 332: ops_ldst_imm("st.d");
1.1 root 333: }
334:
335: // 001001_DDDDDSSSSS_nnnnnn_nnnnnnnnnn
336: OP_DEF(st_w_imm)
337: {
1.1.1.6 ! root 338: ops_ldst_imm("st");
1.1 root 339: }
340:
341: // 001010_DDDDDSSSSS_nnnnnn_nnnnnnnnnn
342: OP_DEF(st_h_imm)
343: {
1.1.1.6 ! root 344: ops_ldst_imm("st.h");
1.1 root 345: }
346:
347: // 001011_DDDDDSSSSS_nnnnnn_nnnnnnnnnn
348: OP_DEF(st_b_imm)
349: {
1.1.1.6 ! root 350: ops_ldst_imm("st.b");
1.1 root 351: }
352:
353: // 001100_DDDDDSSSSS_nnnnnn_nnnnnnnnnn
354: OP_DEF(lda_d_imm)
355: {
1.1.1.6 ! root 356: ops_ldst_imm("lda.d");
1.1 root 357: }
358:
359: // 001101_DDDDDSSSSS_nnnnnn_nnnnnnnnnn
360: OP_DEF(lda_w_imm)
361: {
1.1.1.6 ! root 362: ops_ldst_imm("lda");
1.1 root 363: }
364:
365: // 001110_DDDDDSSSSS_nnnnnn_nnnnnnnnnn
366: OP_DEF(lda_h_imm)
367: {
1.1.1.6 ! root 368: ops_ldst_imm("lda.h");
1.1 root 369: }
370:
371: // 001111_DDDDDSSSSS_nnnnnn_nnnnnnnnnn
372: OP_DEF(lda_b_imm)
373: {
1.1.1.6 ! root 374: ops_ldst_imm("lda.b");
1.1 root 375: }
376:
377: // 010000_DDDDDSSSSS_nnnnnn_nnnnnnnnnn
378: OP_DEF(and_imm)
379: {
380: name = "and";
381: arg0 = rd();
382: arg1 = rs1();
383: arg2 = imm16();
384: }
385:
386: // 010001_DDDDDSSSSS_nnnnnn_nnnnnnnnnn
387: OP_DEF(and_u_imm)
388: {
389: name = "and.u";
390: arg0 = rd();
391: arg1 = rs1();
392: arg2 = imm16();
393: }
394:
395: // 010010_DDDDDSSSSS_nnnnnn_nnnnnnnnnn
396: OP_DEF(mask_imm)
397: {
398: name = "mask";
399: arg0 = rd();
400: arg1 = rs1();
401: arg2 = imm16();
402: }
403:
404: // 010011_DDDDDSSSSS_nnnnnn_nnnnnnnnnn
405: OP_DEF(mask_u_imm)
406: {
407: name = "mask.u";
408: arg0 = rd();
409: arg1 = rs1();
410: arg2 = imm16();
411: }
412:
413: // 010100_DDDDDSSSSS_nnnnnn_nnnnnnnnnn
414: OP_DEF(xor_imm)
415: {
416: name = "xor";
417: arg0 = rd();
418: arg1 = rs1();
419: arg2 = imm16();
420: }
421:
422: // 010101_DDDDDSSSSS_nnnnnn_nnnnnnnnnn
423: OP_DEF(xor_u_imm)
424: {
425: name = "xor.u";
426: arg0 = rd();
427: arg1 = rs1();
428: arg2 = imm16();
429: }
430:
431: // 010110_DDDDDSSSSS_nnnnnn_nnnnnnnnnn
432: OP_DEF(or_imm)
433: {
434: name = "or";
435: arg0 = rd();
436: arg1 = rs1();
437: arg2 = imm16();
438: }
439:
440: // 010111_DDDDDSSSSS_nnnnnn_nnnnnnnnnn
441: OP_DEF(or_u_imm)
442: {
443: name = "or.u";
444: arg0 = rd();
445: arg1 = rs1();
446: arg2 = imm16();
447: }
448:
449: // 011000_DDDDDSSSSS_nnnnnn_nnnnnnnnnn
450: OP_DEF(addu_imm)
451: {
452: name = "addu";
453: arg0 = rd();
454: arg1 = rs1();
455: arg2 = imm16();
456: }
457:
458: // 011001_DDDDDSSSSS_nnnnnn_nnnnnnnnnn
459: OP_DEF(subu_imm)
460: {
461: name = "subu";
462: arg0 = rd();
463: arg1 = rs1();
464: arg2 = imm16();
465: }
466:
467: // 011010_DDDDDSSSSS_nnnnnn_nnnnnnnnnn
468: OP_DEF(divu_imm)
469: {
470: name = "divu";
471: arg0 = rd();
472: arg1 = rs1();
473: arg2 = imm16();
474: }
475:
476: // 011011_DDDDDSSSSS_nnnnnn_nnnnnnnnnn
477: OP_DEF(mul_imm)
478: {
479: name = "mul";
480: arg0 = rd();
481: arg1 = rs1();
482: arg2 = imm16();
483: }
484:
485: // 011100_DDDDDSSSSS_nnnnnn_nnnnnnnnnn
486: OP_DEF(add_imm)
487: {
488: name = "add";
489: arg0 = rd();
490: arg1 = rs1();
491: arg2 = imm16();
492: }
493:
494: // 011101_DDDDDSSSSS_nnnnnn_nnnnnnnnnn
495: OP_DEF(sub_imm)
496: {
497: name = "sub";
498: arg0 = rd();
499: arg1 = rs1();
500: arg2 = imm16();
501: }
502:
503: // 011110_DDDDDSSSSS_nnnnnn_nnnnnnnnnn
504: OP_DEF(div_imm)
505: {
506: name = "div";
507: arg0 = rd();
508: arg1 = rs1();
509: arg2 = imm16();
510: }
511:
512: // 011111_DDDDDSSSSS_nnnnnn_nnnnnnnnnn
513: OP_DEF(cmp_imm)
514: {
515: name = "cmp";
516: arg0 = rd();
517: arg1 = rs1();
518: arg2 = imm16();
519: }
520:
521: // 100000_DDDDDzzzzz_01000n_nnnnnzzzzz
522: OP_DEF(ldcr)
523: {
524: name = "ldcr";
525: arg0 = rd();
526: arg1 = crs();
527: }
528:
529: // 100000_DDDDDzzzzz_01001n_nnnnnzzzzz
530: OP_DEF(fldcr)
531: {
532: name = "fldcr";
533: arg0 = rd();
534: arg1 = fcrs();
535: }
536:
537: // 100000_zzzzzSSSSS_10000n_nnnnnsssss
538: OP_DEF(stcr)
539: {
540: uint32 s1 = (opX >> 16) & 0x1f;
541: uint32 s2 = (opX ) & 0x1f;
542: if (s1 == s2) {
543: name = "stcr";
544: arg1 = rs1();
545: arg2 = crs();
546: } else {
547: // どうすべ
548: OP_FUNC(unimpl);
549: }
550: }
551:
552: // 100000_zzzzzSSSSS_10001n_nnnnnsssss
553: OP_DEF(fstcr)
554: {
555: uint32 s1 = (opX >> 16) & 0x1f;
556: uint32 s2 = (opX ) & 0x1f;
557: if (s1 == s2) {
558: name = "fstcr";
559: arg1 = rs1();
560: arg2 = fcrs();
561: } else {
562: // どうすべ
563: OP_FUNC(unimpl);
564: }
565: }
566:
567: // 100000_DDDDDSSSSS_11000n_nnnnnsssss
568: OP_DEF(xcr)
569: {
570: uint32 s1 = (opX >> 16) & 0x1f;
571: uint32 s2 = (opX ) & 0x1f;
572: if (s1 == s2) {
573: name = "xcr";
574: arg0 = rd();
575: arg1 = rs1();
1.1.1.2 root 576: arg2 = crs();
1.1 root 577: } else {
578: // どうすべ
579: OP_FUNC(unimpl);
580: }
581: }
582:
583: // 100000_DDDDDSSSSS_11001n_nnnnnsssss
584: OP_DEF(fxcr)
585: {
586: uint32 s1 = (opX >> 16) & 0x1f;
587: uint32 s2 = (opX ) & 0x1f;
588: if (s1 == s2) {
589: name = "fxcr";
590: arg0 = rd();
591: arg1 = rs1();
592: arg2 = fcrs();
593: } else {
594: // どうすべ
595: OP_FUNC(unimpl);
596: }
597: }
598:
599: // 100001_DDDDDSSSSS_00000n_nnnnnsssss
600: OP_DEF(fmul)
601: {
602: name = "fmul." + fsize();
603: arg0 = rd();
604: arg1 = rs1();
605: arg2 = rs2();
606: }
607:
608: // 100001_DDDDD00000_001000_000nnsssss
609: OP_DEF(flt)
610: {
611: name = "flt." + fsize(TD) + "s";
612: arg0 = rd();
613: arg2 = rs2();
614: }
615:
616: // 100001_DDDDDSSSSS_00101n_nnnnnsssss
617: OP_DEF(fadd)
618: {
619: name = "fadd." + fsize();
620: arg0 = rd();
621: arg1 = rs1();
622: arg2 = rs2();
623: }
624:
625: // 100001_DDDDDSSSSS_00110n_nnnnnsssss
626: OP_DEF(fsub)
627: {
628: name = "fsub." + fsize();
629: arg0 = rd();
630: arg1 = rs1();
631: arg2 = rs2();
632: }
633:
634: // 100001_DDDDDSSSSS_00111n_nnnnnsssss
635: OP_DEF(fcmp)
636: {
637: name = "fcmp.s" + fsize(T1) + fsize(T2);
638: arg0 = rd();
639: arg1 = rs1();
640: arg2 = rs2();
641: }
642:
643: // 100001_DDDDD00000_010010_0nn00sssss
644: OP_DEF(int)
645: {
646: name = "int.s" + fsize(T2);
647: arg0 = rd();
648: arg1 = rs2();
649: }
650:
651: // 100001_DDDDD00000_010100_0nn00sssss
652: OP_DEF(nint)
653: {
654: name = "nint.s" + fsize(T2);
655: arg0 = rd();
656: arg1 = rs2();
657: }
658:
659: // 100001_DDDDD00000_010110_0nn00sssss
660: OP_DEF(trnc)
661: {
662: name = "trnc.s" + fsize(T2);
663: arg0 = rd();
664: arg2 = rs2();
665: }
666:
667: // 100001_DDDDDSSSSS_01110n_nnnnnsssss
668: OP_DEF(fdiv)
669: {
670: name = "fdiv." + fsize();
671: arg0 = rd();
672: arg1 = rs1();
673: arg2 = rs2();
674: }
675:
676: // 110000_nnnnnnnnnn_nnnnnn_nnnnnnnnnn
677: OP_DEF(br)
678: {
679: name = "br";
1.1.1.6 ! root 680: arg0 = d26();
1.1 root 681: }
682:
683: // 110001_nnnnnnnnnn_nnnnnn_nnnnnnnnnn
684: OP_DEF(br_n)
685: {
686: name = "br.n";
1.1.1.6 ! root 687: arg0 = d26();
1.1 root 688: }
689:
690: // 110010_nnnnnnnnnn_nnnnnn_nnnnnnnnnn
691: OP_DEF(bsr)
692: {
693: name = "bsr";
1.1.1.6 ! root 694: arg0 = d26();
1.1 root 695: }
696:
697: // 110011_nnnnnnnnnn_nnnnnn_nnnnnnnnnn
698: OP_DEF(bsr_n)
699: {
700: name = "bsr.n";
1.1.1.6 ! root 701: arg0 = d26();
1.1 root 702: }
703:
704: // bb の共通部
705: void
706: m88100disasm::ops_bb(std::string namebase)
707: {
708: name = namebase;
709: arg0 = b5();
710: arg1 = rs1();
711: arg2 = d16();
712: }
713:
714: // 110100_nnnnnSSSSS_nnnnnn_nnnnnnnnnn
715: OP_DEF(bb0)
716: {
717: ops_bb("bb0");
718: }
719:
720: // 110101_nnnnnSSSSS_nnnnnn_nnnnnnnnnn
721: OP_DEF(bb0_n)
722: {
723: ops_bb("bb0.n");
724: }
725:
726: // 110110_nnnnnSSSSS_nnnnnn_nnnnnnnnnn
727: OP_DEF(bb1)
728: {
729: ops_bb("bb1");
730: }
731:
732: // 110111_nnnnnSSSSS_nnnnnn_nnnnnnnnnn
733: OP_DEF(bb1_n)
734: {
735: ops_bb("bb1.n");
736: }
737:
738: void
739: m88100disasm::ops_bcnd(std::string namebase)
740: {
741: name = namebase;
742: arg0 = m5();
743: arg1 = rs1();
744: arg2 = d16();
745: }
746:
747: // 111010_MMMMMSSSSS_nnnnnn_nnnnnnnnnn
748: OP_DEF(bcnd)
749: {
750: ops_bcnd("bcnd");
751: }
752:
753: // 111011_MMMMMSSSSS_nnnnnn_nnnnnnnnnn
754: OP_DEF(bcnd_n)
755: {
756: ops_bcnd("bcnd.n");
757: }
758:
759: // 111100_DDDDDSSSSS_100000_wwwwwooooo
760: OP_DEF(clr_1)
761: {
762: name = "clr";
763: arg0 = rd();
764: arg1 = rs1();
765: arg2 = wo5();
766: }
767:
768: // 111100_DDDDDSSSSS_100010_wwwwwooooo
769: OP_DEF(set_1)
770: {
771: name = "set";
772: arg0 = rd();
773: arg1 = rs1();
774: arg2 = wo5();
775: }
776:
777: // 111100_DDDDDSSSSS_100100_wwwwwooooo
778: OP_DEF(ext_1)
779: {
780: name = "ext";
781: arg0 = rd();
782: arg1 = rs1();
783: arg2 = wo5();
784: }
785:
786: // 111100_DDDDDSSSSS_100110_wwwwwooooo
787: OP_DEF(extu_1)
788: {
789: name = "extu";
790: arg0 = rd();
791: arg1 = rs1();
792: arg2 = wo5();
793: }
794:
795: // 111100_DDDDDSSSSS_101000_wwwwwooooo
796: OP_DEF(mak_1)
797: {
798: name = "mak";
799: arg0 = rd();
800: arg1 = rs1();
801: arg2 = wo5();
802: }
803:
804: // 111100_DDDDDSSSSS_101010_zzzzzooooo
805: OP_DEF(rot_1)
806: {
807: name = "rot";
808: arg0 = rd();
809: arg1 = rs1();
810: arg2 = string_format("<%d>", O5);
811: }
812:
813: void
814: m88100disasm::ops_tb(std::string namebase)
815: {
816: name = namebase;
817: arg0 = b5();
818: arg1 = rs1();
819: arg2 = vec9();
820: }
821:
822: // 111100_bbbbbSSSSS_110100_0vvvvvvvvv
823: OP_DEF(tb0)
824: {
825: ops_tb("tb0");
826: }
827:
828: // 111100_bbbbbSSSSS_110110_0vvvvvvvvv
829: OP_DEF(tb1)
830: {
1.1.1.2 root 831: if (opt_alias && m88100opf_S1(opX) == 0) {
832: // tb1 *,r0,* はパイプライン同期を目的として使われる。
833: // この形式はトラップは発生しない。
834: if (VEC9 < 128) {
835: name = "ssync";
836: } else {
837: name = "usync";
838: }
839: } else {
840: ops_tb("tb1");
841: }
1.1 root 842: }
843:
844: // 111100_MMMMMSSSSS_111010_0vvvvvvvvv
845: OP_DEF(tcnd)
846: {
847: name = "tcnd";
848: arg0 = m5();
849: arg1 = rs1();
850: arg2 = vec9();
851: }
852:
853: // ld_reg, st_reg, xmem_reg の共通部
854: void
855: m88100disasm::ops_ldst_reg(std::string namebase)
856: {
857: uint32 u = (opX >> 8) & 1;
858: uint32 scaled = (opX >> 9) & 1;
859:
860: name = namebase;
861: if (u) {
862: name += ".usr";
863: }
864: arg0 = rd();
865: arg1 = rs1();
866: if (scaled == 0) {
867: arg2 = rs2();
868: } else {
869: arg1 += "[" + rs2() + "]";
870: }
871: }
872:
873: // 111101_DDDDDSSSSS_000000_xU000sssss
874: OP_DEF(xmem_bu)
875: {
876: ops_ldst_reg("xmem.bu");
877: }
878:
879: // 111101_DDDDDSSSSS_000001_xU000sssss
880: OP_DEF(xmem_w)
881: {
882: ops_ldst_reg("xmem");
883: }
884:
885: // 111101_DDDDDSSSSS_000010_xU000sssss
886: OP_DEF(ld_hu)
887: {
888: ops_ldst_reg("ld.hu");
889: }
890:
891: // 111101_DDDDDSSSSS_000011_xU000sssss
892: OP_DEF(ld_bu)
893: {
894: ops_ldst_reg("ld.bu");
895: }
896:
897: // 111101_DDDDDSSSSS_000100_xU000sssss
898: OP_DEF(ld_d)
899: {
900: ops_ldst_reg("ld.d");
901: }
902:
903: // 111101_DDDDDSSSSS_000101_xU000sssss
904: OP_DEF(ld_w)
905: {
906: ops_ldst_reg("ld");
907: }
908:
909: // 111101_DDDDDSSSSS_000110_xU000sssss
910: OP_DEF(ld_h)
911: {
912: ops_ldst_reg("ld.h");
913: }
914:
915: // 111101_DDDDDSSSSS_000111_xU000sssss
916: OP_DEF(ld_b)
917: {
918: ops_ldst_reg("ld.b");
919: }
920:
921: // 111101_DDDDDSSSSS_001000_xU000sssss
922: OP_DEF(st_d)
923: {
924: ops_ldst_reg("st.d");
925: }
926:
927: // 111101_DDDDDSSSSS_001001_xU000sssss
928: OP_DEF(st_w)
929: {
930: ops_ldst_reg("st");
931: }
932:
933: // 111101_DDDDDSSSSS_001010_xU000sssss
934: OP_DEF(st_h)
935: {
936: ops_ldst_reg("st.h");
937: }
938:
939: // 111101_DDDDDSSSSS_001011_xU000sssss
940: OP_DEF(st_b)
941: {
942: ops_ldst_reg("st.b");
943: }
944:
945: // 111101_DDDDDSSSSS_001100_xU000sssss
946: OP_DEF(lda_d)
947: {
948: // XXX bit8 が 1 だとどうなるのか
949: ops_ldst_reg("lda.d");
950: }
951:
952: // 111101_DDDDDSSSSS_001101_xU000sssss
953: OP_DEF(lda_w)
954: {
955: // XXX bit8 が 1 だとどうなるのか
956: ops_ldst_reg("lda");
957: }
958:
959: // 111101_DDDDDSSSSS_001110_xU000sssss
960: OP_DEF(lda_h)
961: {
962: // XXX bit8 が 1 だとどうなるのか
963: ops_ldst_reg("lda.h");
964: }
965:
966: // 111101_DDDDDSSSSS_001111_xU000sssss
967: OP_DEF(lda_b)
968: {
969: // XXX bit8 が 1 だとどうなるのか
970: ops_ldst_reg("lda.b");
971: }
972:
973: // 111101_DDDDDSSSSS_010000_00000sssss
974: OP_DEF(and)
975: {
976: name = "and";
977: arg0 = rd();
978: arg1 = rs1();
979: arg2 = rs2();
980: }
981:
982: // 111101_DDDDDSSSSS_010001_00000sssss
983: OP_DEF(and_c)
984: {
985: name = "and.c";
986: arg0 = rd();
987: arg1 = rs1();
988: arg2 = rs2();
989: }
990:
991: // 111101_DDDDDSSSSS_010100_00000sssss
992: OP_DEF(xor)
993: {
994: name = "xor";
995: arg0 = rd();
996: arg1 = rs1();
997: arg2 = rs2();
998: }
999:
1000: // 111101_DDDDDSSSSS_010101_00000sssss
1001: OP_DEF(xor_c)
1002: {
1003: name = "xor.c";
1004: arg0 = rd();
1005: arg1 = rs1();
1006: arg2 = rs2();
1007: }
1008:
1009: // 111101_DDDDDSSSSS_010110_00000sssss
1010: OP_DEF(or)
1011: {
1.1.1.2 root 1012: if (opt_alias && m88100opf_D(opX) == 0) {
1013: // or r0,*,* は nop とする
1014: // and とかも nop だが motolora が サンプルコードで
1015: // or r0,r0,r0 を nop として使っているため、or が一般的なようだ。
1016: name = "nop";
1017: } else {
1018: name = "or";
1019: arg0 = rd();
1020: arg1 = rs1();
1021: arg2 = rs2();
1022: }
1.1 root 1023: }
1024:
1025: // 111101_DDDDDSSSSS_010111_00000sssss
1026: OP_DEF(or_c)
1027: {
1028: name = "or.c";
1029: arg0 = rd();
1030: arg1 = rs1();
1031: arg2 = rs2();
1032: }
1033:
1034: // 111101_DDDDDSSSSS_011000_nn000sssss
1035: OP_DEF(addu)
1036: {
1037: name = "addu" + cio();
1038: arg0 = rd();
1039: arg1 = rs1();
1040: arg2 = rs2();
1041: }
1042:
1043: // 111101_DDDDDSSSSS_011001_nn000sssss
1044: OP_DEF(subu)
1045: {
1046: name = "subu" + cio();
1047: arg0 = rd();
1048: arg1 = rs1();
1049: arg2 = rs2();
1050: }
1051:
1052: // 111101_DDDDDSSSSS_011010_zz000sssss
1053: OP_DEF(divu)
1054: {
1055: name = "divu";
1056: arg0 = rd();
1057: arg1 = rs1();
1058: arg2 = rs2();
1059: }
1060:
1061: // 111101_DDDDDSSSSS_011011_zz000sssss
1062: OP_DEF(mul)
1063: {
1064: name = "mul";
1065: arg0 = rd();
1066: arg1 = rs1();
1067: arg2 = rs2();
1068: }
1069:
1070: // 111101_DDDDDSSSSS_011100_nn000sssss
1071: OP_DEF(add)
1072: {
1073: name = "add" + cio();
1074: arg0 = rd();
1075: arg1 = rs1();
1076: arg2 = rs2();
1077: }
1078:
1079: // 111101_DDDDDSSSSS_011101_nn000sssss
1080: OP_DEF(sub)
1081: {
1082: name = "sub" + cio();
1083: arg0 = rd();
1084: arg1 = rs1();
1085: arg2 = rs2();
1086: }
1087:
1088: // 111101_DDDDDSSSSS_011110_zz000sssss
1089: OP_DEF(div)
1090: {
1091: name = "div";
1092: arg0 = rd();
1093: arg1 = rs1();
1094: arg2 = rs2();
1095: }
1096:
1097: // 111101_DDDDDSSSSS_011111_zz000sssss
1098: OP_DEF(cmp)
1099: {
1100: name = "cmp";
1101: arg0 = rd();
1102: arg1 = rs1();
1103: arg2 = rs2();
1104: }
1105:
1106: // 111101_DDDDDSSSSS_100000_00000sssss
1107: OP_DEF(clr_2)
1108: {
1109: name = "clr";
1110: arg0 = rd();
1111: arg1 = rs1();
1112: arg2 = rs2();
1113: }
1114:
1115: // 111101_DDDDDSSSSS_100010_00000sssss
1116: OP_DEF(set_2)
1117: {
1118: name = "set";
1119: arg0 = rd();
1120: arg1 = rs1();
1121: arg2 = rs2();
1122: }
1123:
1124: // 111101_DDDDDSSSSS_100100_00000sssss
1125: OP_DEF(ext_2)
1126: {
1127: name = "ext";
1128: arg0 = rd();
1129: arg1 = rs1();
1130: arg2 = rs2();
1131: }
1132:
1133: // 111101_DDDDDSSSSS_100110_00000sssss
1134: OP_DEF(extu_2)
1135: {
1136: name = "extu";
1137: arg0 = rd();
1138: arg1 = rs1();
1139: arg2 = rs2();
1140: }
1141:
1142: // 111101_DDDDDSSSSS_101000_00000sssss
1143: OP_DEF(mak_2)
1144: {
1145: name = "mak";
1146: arg0 = rd();
1147: arg1 = rs1();
1148: arg2 = rs2();
1149: }
1150:
1151: // 111101_DDDDDSSSSS_101010_00000sssss
1152: OP_DEF(rot_2)
1153: {
1154: name = "rot";
1155: arg0 = rd();
1156: arg1 = rs1();
1157: arg2 = rs2();
1158: }
1159:
1160: // 111101_zzzzzzzzzz_110000_00000sssss
1161: OP_DEF(jmp)
1162: {
1163: name = "jmp";
1164: arg0 = rs2();
1165: }
1166:
1167: // 111101_zzzzzzzzzz_110001_00000sssss
1168: OP_DEF(jmp_n)
1169: {
1170: name = "jmp.n";
1171: arg0 = rs2();
1172: }
1173:
1174: // 111101_zzzzzzzzzz_110010_00000sssss
1175: OP_DEF(jsr)
1176: {
1177: name = "jsr";
1178: arg0 = rs2();
1179: }
1180:
1181: // 111101_zzzzzzzzzz_110011_00000sssss
1182: OP_DEF(jsr_n)
1183: {
1184: name = "jsr.n";
1185: arg0 = rs2();
1186: }
1187:
1.1.1.2 root 1188: // 111101_DDDDDzzzzz_111010_00000sssss
1189: OP_DEF(ff1)
1190: {
1191: name = "ff1";
1192: arg0 = rd();
1193: arg1 = rs2();
1194: }
1195:
1196: // 111101_DDDDDzzzzz_111011_00000sssss
1197: OP_DEF(ff0)
1198: {
1199: name = "ff0";
1200: arg0 = rd();
1201: arg1 = rs2();
1202: }
1203:
1.1 root 1204: // 111101_zzzzzzzzzz_111111_0000000000
1205: OP_DEF(rte)
1206: {
1207: name = "rte";
1208: }
1209:
1210: // 111101_zzzzzSSSSS_111110_00000SSSSS
1211: OP_DEF(tbnd_1)
1212: {
1213: name = "tbnd";
1214: arg1 = rs1();
1215: arg2 = rs2();
1216: }
1217:
1218: // 111110_zzzzzSSSSS_nnnnnn_nnnnnnnnnn
1219: OP_DEF(tbnd_2)
1220: {
1221: name = "tbnd";
1222: arg1 = rs1();
1223: arg2 = imm16();
1224: }
1225:
1226: // 111111_zzzzzzzzzz_000011_zzzzzzzzzz
1227: OP_DEF(getc)
1228: {
1229: name = "getc-emulator";
1230: }
1231:
1232: // 111111_zzzzzzzzzz_000100_zzzzzzzzzz
1233: OP_DEF(putc)
1234: {
1235: name = "putc-emulator";
1236: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.