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