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