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