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