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