|
|
1.1 root 1: //
2: // nono
3: // Copyright (C) 2017 [email protected]
4: //
5:
6: #include "header.h"
7: #include "m68030.h"
8: #include "disasm.h"
9: #include "bus.h"
10: #include "mystring.h"
11:
12: // コンストラクタ
13: Disasm::Disasm()
14: {
15: init();
16: }
17:
18: // デストラクタ
19: Disasm::~Disasm()
20: {
21: }
22:
23: // 逆アセンブル
24: std::string
25: Disasm::Disassemble(uint32 laddr, uint32 paddr)
26: {
27: init();
28:
29: pc = laddr;
30: pc0 = pc;
31: phys_pc = paddr;
32:
33: switch (fetch16() >> 6) {
34: #include "m68030switch.h"
35: default:
36: __unreachable();
37: }
38:
39: std::string s = name + size_str[size];
40:
41: if (!src.empty() || !dst.empty()) {
42: // オペランドが片方でもあればインデントする
43: int sl = s.length();
44: if (sl < 8) {
45: s += std::string(8 - sl, ' ');
46: } else {
47: s += ' ';
48: }
49:
50: // src があれば src を追加
51: if (!src.empty()) {
52: s += src;
53: }
54: // 両方あればカンマで区切る
55: if (!src.empty() && !dst.empty()) {
56: s += ",";
57: }
58: // dst があれば dst を追加
59: if (!dst.empty()) {
60: s += dst;
61: }
62: }
63:
64: return s;
65: }
66:
67: // 逆アセンブル + ダンプ
68: std::string
69: Disasm::DisassembleWithDump(uint32 laddr, uint32 paddr)
70: {
71: // 逆アセンブル
72: std::string s = Disassemble(laddr, paddr);
73:
74: // ダンプ
75: std::string dump;
76: for (const auto & i : ir) {
77: dump += string_format("%04x ", i);
78: }
79: if (ir.size() < 5) {
80: dump += std::string(25 - ir.size() * 5, ' ');
81: }
82:
83: return dump + s;
84: }
85:
86: // 1行逆アセンブル前の初期化
87: void
88: Disasm::init()
89: {
90: ir.clear();
91: name.clear();
92: size = Size::None;
93: src.clear();
94: dst.clear();
95: }
96:
97: // ワードピーク (PCを進めずワードを取得する)
98: uint32
99: Disasm::peek16()
100: {
101: // 物理空間から読み込む
102: uint16 data;
103: data = m68030_phys_peek_8(phys_pc) << 8;
104: data |= m68030_phys_peek_8(phys_pc + 1);
105: return data;
106: }
107:
108: // ワードフェッチ
109: uint32
110: Disasm::fetch16()
111: {
112: uint16 data = peek16();
113: // IR に入れて PC を進める
114: ir.push_back(data);
115: pc += 2;
116: phys_pc += 2;
117: return data;
118: }
119:
120: // ロングワードフェッチ
121: uint32
122: Disasm::fetch32()
123: {
124: uint32 data;
125: data = fetch16() << 16;
126: data |= fetch16();
127: return data;
128: }
129:
130: // 符号なし8ビット16進数を文字列にして返す
131: std::string
132: Disasm::hex8(uint32 val)
133: {
134: return string_format("$%02x", val);
135: }
136:
137: // 符号なし16ビット16進数を文字列にして返す
138: std::string
139: Disasm::hex16(uint32 val)
140: {
141: return string_format("$%04x", val);
142: }
143:
144: // 符号なし32ビット16進数を文字列にして返す
145: std::string
146: Disasm::hex32(uint32 val)
147: {
148: return string_format("$%08x", val);
149: }
150:
151: // 符号つき8ビット16進数を文字列にして返す
152: // 負数はマイナスを前置して表す。
153: std::string
154: Disasm::shex8(uint32 val)
155: {
156: if ((int8)val < 0) {
157: return string_format("-$%02x", -(int8)val);
158: } else {
159: return string_format("$%02x", val);
160: }
161: }
162:
163: // 符号つき16ビット16進数を文字列にして返す
164: // 負数はマイナスを前置して表す。
165: std::string
166: Disasm::shex16(uint32 val)
167: {
168: if ((int16)val < 0) {
169: return string_format("-$%04x", -(int16)val);
170: } else {
171: return string_format("$%04x", val);
172: }
173: }
174:
175: // 符号つき32ビット16進数を文字列にして返す
176: // 負数はマイナスを前置して表す。
177: std::string
178: Disasm::shex32(uint32 val)
179: {
180: if ((int32)val < 0) {
181: return string_format("-$%08x", (uint32)(-(int64)(int32)val));
182: } else {
183: return string_format("$%08x", val);
184: }
185: }
186:
187: // EA を示す文字列を返す。ir[0] の mmmrrr の部分固定。
188: std::string
189: Disasm::make_ea()
190: {
191: return make_ea(ir[0]);
192: }
193:
194: // mmrr に対して EA を示す文字列を返す。
195: std::string
196: Disasm::make_ea(uint mmrr)
197: {
198: std::string s;
199: uint rr;
200:
201: mmrr &= 0x3f;
202: rr = mmrr & 7;
203:
204: switch (mmrr) {
205: case 0x00 ... 0x07: // 0
206: s = make_dn(rr);
207: break;
208: case 0x08 ... 0x0f: // 1
209: s = make_an(rr);
210: break;
211: case 0x10 ... 0x17: // 2
212: s = make_anin(rr);
213: break;
214: case 0x18 ... 0x1f: // 3
215: s = make_anpi(rr);
216: break;
217: case 0x20 ... 0x27: // 4
218: s = make_anpd(rr);
219: break;
220: case 0x28 ... 0x2f: // 5
221: s = disp16() + make_anin(rr);
222: break;
223: case 0x30 ... 0x37: // 6
224: s = make_eaix(make_an(rr));
225: break;
226: case 0x38: // Abs.W
227: s = addr16();
228: break;
229: case 0x39: // Abs.L
230: s = addr32();
231: break;
232: case 0x3a: // d16(pc)
233: s = addr32(pc + (int32)(int16)fetch16()) +
234: "(" + make_reg(Reg::PC) + ")";
235: break;
236: case 0x3b: // d8(pc,IX)
237: s = make_eaix(make_reg(Reg::PC));
238: break;
239: case 0x3c: // imm
240: switch (size) {
241: case Size::B:
242: s = imm8();
243: break;
244: case Size::W:
245: s = imm16();
246: break;
247: case Size::L:
248: case Size::S:
249: s = imm32();
250: break;
251: case Size::D:
252: s = imm32();
253: s += string_format("_%08x", fetch32());
254: break;
255: case Size::X:
256: case Size::P:
257: s = imm32();
258: s += string_format("_%08x", fetch32());
259: s += string_format("_%08x", fetch32());
260: break;
261: default:
262: s = "(invalid ea size?)";
263: break;
264: }
265: break;
266: default:
267: s = "(invalid ea?)";
268: break;
269: }
270: return s;
271: }
272:
273: std::string
274: Disasm::make_eaix(std::string basereg)
275: {
276: static const char * const scalestr[] = {
277: "", "*2", "*4", "*8",
278: };
279: uint16 ext = fetch16();
280: bool full = (ext & 0x0100);
281: uint rn = (ext >> 12);
282: bool wl = (ext & 0x0800);
283: uint scale = (ext >> 9) & 3;
284: std::string idx;
285: std::string s;
286:
287: // インデックスレジスタ
288: Size sz = wl ? Size::L : Size::W;
289: idx = ",";
290: idx += make_rn(rn); // Rn
291: idx += size_str[sz]; // .[WL]
292: idx += scalestr[scale]; // *{2/4/8}
293:
294: if (full == false) {
295: // 短縮フォーマット
296: uint8 disp = ext & 0xff;
297: if (disp == 0) {
298: // $00 は省略する
299: } else {
300: s = shex8(disp);
301: }
302: s += '(';
303: s += basereg;
304: s += idx;
305: s += ')';
306: } else {
307: // フルフォーマット
308: bool bs = (ext & 0x0080);
309: bool is = (ext & 0x0040);
310: uint bdsize = (ext >> 4) & 3;
311: uint iis = (ext & 7);
312: std::string bd;
313: std::string od;
314:
315: // ベースレジスタ・サプレス
316: if (bs) {
317: basereg = "z" + basereg;
318: }
319:
320: // ベース・ディスプレースメント
321: switch (bdsize) {
322: case 0: // 予約
323: return "<invalid EA(bdsize 0)>";
324: case 1: // ベースはヌル
325: break;
326: case 2: // ベース.W
327: bd = disp16();
328: bd += ",";
329: break;
330: case 3: // ベース.L
331: bd = disp32();
332: bd += ",";
333: break;
334: }
335:
336: // アウター・ディスプレースメント
337: switch (iis & 3) {
338: case 0: // 不要?
339: case 1: // アウターはヌル
340: break;
341: case 2: // アウター.W
342: od = ",";
343: od += disp16();
344: break;
345: case 3: // アウター.L
346: od = ",";
347: od += disp32();
348: break;
349: }
350:
351: if (is == 0) {
352: switch (iis) {
353: case 0: // no memory indirection
354: // (bd,base,idx)
355: s = "(";
356: s += bd;
357: s += basereg;
358: s += idx;
359: s += ")";
360: break;
361: case 1: // indirect pre-index with null outer
362: // ([bd,base,idx])
363: case 2: // indirect pre-index with word outer
364: case 3: // indirect pre-index with long outer
365: // ([bd,base,idx],od)
366: s = "([";
367: s += bd;
368: s += basereg;
369: s += idx;
370: s += "]";
371: s += od;
372: s += ")";
373: break;
374:
375: case 4:
376: return "<invalid EA(iis=4)>";
377:
378: case 5: // indirect post-index with null outer
379: // ([bd,base],idx)
380: case 6: // indirect post-index with word outer
381: case 7: // indirect post-index with long outer
382: // ([bd,base],idx,od)
383: s = "([";
384: s += bd;
385: s += basereg;
386: s += "]";
387: s += idx;
388: s += od;
389: s += ")";
390: break;
391: default:
392: __unreachable();
393: }
394: } else {
395: switch (iis) {
396: case 0: // no memory indirection
397: // (bd,base)
398: s = "(";
399: s += bd;
400: s += basereg;
401: s += ")";
402: break;
403: case 1: // memory indirect with null outer
404: // ([bd,base])
405: case 2: // memory indirect with word outer
406: case 3: // memory indirect with long outer
407: // ([bd,base],od)
408: s += "([";
409: s += bd;
410: s += basereg;
411: s += "]";
412: s += od;
413: s += ")";
414: break;
415: default:
416: return string_format("<invalid EA(is=1,iis=%d)>", iis);
417: }
418: }
419: }
420:
421: return s;
422: }
423:
424: // addr をワードアドレスとした時の文字列を返す
425: std::string
426: Disasm::addr16(uint32 addr)
427: {
428: return hex16(addr & 0xffff);
429: }
430:
431: // addr をロングワードアドレスとした時の文字列を返す
432: std::string
433: Disasm::addr32(uint32 addr)
434: {
435: return hex32(addr);
436: }
437:
438: // フェッチした値をワードアドレスとして文字列を返す
439: std::string
440: Disasm::addr16()
441: {
442: return addr16(fetch16());
443: }
444:
445: // フェッチした値をロングワードアドレスとして文字列を返す
446: std::string
447: Disasm::addr32()
448: {
449: return addr32(fetch32());
450: }
451:
452: // フェッチした値をワードディスプレースメントとして文字列を返す
453: std::string
454: Disasm::disp16()
455: {
456: return shex16(fetch16());
457: }
458:
459: // フェッチした値をロングワードディスプレースメントとして文字列を返す
460: std::string
461: Disasm::disp32()
462: {
463: return shex32(fetch32());
464: }
465:
466: // バイト即値 imm を文字列にして返す
467: std::string
468: Disasm::imm8()
469: {
470: return "#" + hex8(fetch16() & 0xff);
471: }
472:
473: // ワード即値 imm を文字列にして返す
474: std::string
475: Disasm::imm16()
476: {
477: return "#" + hex16(fetch16());
478: }
479:
480: // ロングワード即値 imm を文字列にして返す
481: std::string
482: Disasm::imm32()
483: {
484: return "#" + hex32(fetch32());
485: }
486:
487: // Dn を文字列にして返す。n の上位ビットは無視する。
488: std::string
489: Disasm::make_dn(uint n)
490: {
491: n = (n & 7) + '0';
492: std::string s;
493: s = 'd';
494: s += n;
495: return s;
496: }
497:
498: // An を文字列にして返す。n の上位ビットは無視する。
499: std::string
500: Disasm::make_an(uint n)
501: {
502: n = (n & 7) + '0';
503: std::string s;
504: s = 'a';
505: s += n;
506: return s;
507: }
508:
509: // Rn (Dn/An) を文字列にして返す。n の上位ビットは無視する。
510: std::string
511: Disasm::make_rn(uint n)
512: {
513: n &= 0x0f;
514: if (n < 8) {
515: return make_dn(n);
516: } else {
517: return make_an(n - 8);
518: }
519: }
520:
521: // (An) を文字列にして返す。n の上位ビットは無視する。
522: std::string
523: Disasm::make_anin(uint n)
524: {
525: std::string s;
526: s = '(';
527: s += make_an(n);
528: s += ')';
529: return s;
530: }
531:
532: // (An)+ を文字列にして返す。n の上位ビットは無視する。
533: std::string
534: Disasm::make_anpi(uint n)
535: {
536: std::string s;
537: s = make_anin(n);
538: s += '+';
539: return s;
540: }
541:
542: // -(An) を文字列にして返す。n の上位ビットは無視する。
543: std::string
544: Disasm::make_anpd(uint n)
545: {
546: std::string s;
547: s = '-';
548: s += make_anin(n);
549: return s;
550: }
551:
552: // #qqq を文字列にして返す。ir[0] のいつものところにあると仮定する。
553: std::string
554: Disasm::make_q8()
555: {
556: uint q = (ir[0] >> 9) & 7;
557: if (q == 0) {
558: q = 8;
559: }
560: return string_format("#%d", q);
561: }
562:
563: // regno で示されるレジスタ名を返す
564: std::string
565: Disasm::make_reg(Reg reg)
566: {
567: return reg_names[reg];
568: }
569:
570: // MOVEM のレジスタリスト文字列を返す。
571: // 第2ワードのフェッチは呼び出し側で行っておくこと。
572: // プリデクリメントかどうかの判断はこちらで行う。
573: std::string
574: Disasm::make_reglist()
575: {
576: uint16 mask = ir[1];
577: uint mm = (ir[0] >> 3) & 7;
578: std::string s;
579:
580: // 制御モード・ポストインクリメントモードなら、ビット順を入れ替える。
581: if (mm != 4) {
582: //mask = bitrev16(mask);
583: mask = ((mask & 0x5555) << 1) | ((mask >> 1) & 0x5555);
584: mask = ((mask & 0x3333) << 2) | ((mask >> 2) & 0x3333);
585: mask = ((mask & 0x0f0f) << 4) | ((mask >> 4) & 0x0f0f);
586: mask = (mask >> 8) | (mask << 8);
587: }
588:
589: // これでどちらのモードでも 16ビット内に上から順に並んでいる。
590: // Bit: 15 14 ... 1 0
591: // Reg: D0 D1 ... A6 A7
592:
593: make_reglist_half(s, "d", mask & 0xff00);
594: make_reglist_half(s, "a", mask << 8);
595: if (s.empty()) {
596: s = "noregs";
597: }
598: return s;
599: }
600:
601: // データレジスタもしくはアドレスレジスタの8ビット分だけを処理する。
602: // FPn からも使うようになったので名前がいまいちか。
603: // mask は以下のように上位8ビットに上から下に向かって並ぶように渡すこと。
604: // ビット7 は番兵のため %0 にすること。
605: //
606: // 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
607: // R0 R1 R2 R3 R4 R5 R6 R7 <-------- %0 --------->
608: //
609: void
610: Disasm::make_reglist_half(std::string& s, const char *reg, uint16 mask)
611: {
612: int top = -1;
613:
614: // 番兵を含めてループするため1つ多く回る
615: for (int i = 0; i < 9; i++, mask <<= 1) {
616: if ((int16)mask < 0) {
617: // このビットは表示するレジスタ
618: if (top < 0) {
619: // 非表示中ならこのレジスタを出力する。
620: // 初回以外は区切りを先に出力する。
621: if (s.length() != 0) {
622: s += '/';
623: }
624: s += reg;
625: s += '0' + i;
626: top = i;
627: }
628: } else {
629: // このビットは表示しない
630: if (top >= 0) {
631: // 表示中ならこの一つ前のレジスタで終端
632: int last = i - 1;
633: if (top != last) {
634: // 表示が複数にまたがっていた
635: s += '-';
636: s += reg;
637: s += '0' + last;
638: }
639: top = -1;
640: }
641: }
642: }
643: }
644:
645: // ビットフィールド欄を文字列にして返す。
646: // 第2ワードのフェッチは呼び出し側で行っておくこと。
647: std::string
648: Disasm::make_bf()
649: {
650: uint16 ext = ir[1];
651: uint od = (ext & 0x0800);
652: uint offset = (ext >> 6) & 0x1f;
653: uint wd = (ext & 0x0020);
654: uint width = ext & 0x1f;
655: std::string s = "{";
656:
657: // offset
658: if (od) {
659: if (offset < 8) {
660: s += make_dn(offset);
661: } else {
662: s += string_format("<invalid regno %d>", offset);
663: }
664: } else {
665: // オフセットは 0..31
666: s += string_format("#%d", offset);
667: }
668:
669: s += ":";
670:
671: // width
672: if (wd) {
673: if (width < 8) {
674: s += make_dn(width);
675: } else {
676: s += string_format("<invalid regno %d>", width);
677: }
678: } else {
679: // 幅は 0 なら 32 を意味する
680: if (width == 0) {
681: width = 32;
682: }
683: s += string_format("#%d", width);
684: }
685:
686: s += "}";
687: return s;
688: }
689:
690: // ファンクションコードフィールドを文字列にして返す。
691: // MMU の拡張ワードは呼び出し側で取得済みのはず。
692: std::string
693: Disasm::make_fc()
694: {
695: uint fc = ir[1] & 0x1f;
696:
697: switch (fc) {
698: case 0:
699: return make_reg(Reg::SFC);
700: case 1:
701: return make_reg(Reg::DFC);
702: case 0x08 ... 0x0f:
703: return make_dn(fc);
704: case 0x10 ... 0x17:
705: return string_format("#%d", fc & 7);
706: default:
707: return string_format("<invalid fc %d>", fc);
708: }
709: }
710:
711: // MOVEC の制御レジスタを返す。
712: std::string
713: Disasm::make_movec()
714: {
715: uint n = ir[1] & 0x0fff;
716: Reg reg;
717:
718: switch (n) {
719: case 0x000: reg = Reg::SFC; break;
720: case 0x001: reg = Reg::DFC; break;
721: case 0x002: reg = Reg::CACR; break;
722: case 0x800: reg = Reg::USP; break;
723: case 0x801: reg = Reg::VBR; break;
724: case 0x802: reg = Reg::CAAR; break;
725: case 0x803: reg = Reg::MSP; break;
726: case 0x804: reg = Reg::ISP; break;
727:
728: // 040
729: // TC, MMUSR, SRP は名前が同じだが 030 MMU のではない
730: case 0x003: reg = Reg::TC; break;
731: case 0x004: reg = Reg::ITT0; break; // EC040 なら IACR0
732: case 0x005: reg = Reg::ITT1; break; // EC040 なら IACR1
733: case 0x006: reg = Reg::DTT0; break; // EC040 なら DACR0
734: case 0x007: reg = Reg::DTT1; break; // EC040 なら DACR1
735: case 0x805: reg = Reg::MMUSR; break;
736: case 0x806: reg = Reg::URP; break;
737: case 0x807: reg = Reg::SRP; break;
738:
739: default:
740: return string_format("<invalid ctrl reg %03x>", n);
741: }
742: return make_reg(reg);
743: }
744:
745: // FPgen 関数名を返す
746: // mode が適切でなければ "" を返す。
747: std::string
748: Disasm::make_fpgen()
749: {
750: uint mode = ir[1] & 0x7f;
751:
752: if (mode < countof(fpgen_names)) {
753: return fpgen_names[mode];
754: }
755: return "";
756: }
757:
758: // FPn を文字列にして返す。n の上位ビットは無視する。
759: std::string
760: Disasm::make_fpn(uint n)
761: {
762: n = (n & 7) + '0';
763: std::string s;
764: s = "fp";
765: s += n;
766: return s;
767: }
768:
769: // FPU の condition 文字列を返す。
770: // word には condition が入ったワードを指定すること。
771: // 不要な上位ビットはこちらでマスクする。
772: std::string
773: Disasm::make_fpcc(uint16 word)
774: {
775: uint cc = word & 0x3f;
776: if (cc > 0x1f) {
777: return string_format("<invalid fpcc $%x>", cc);
778: }
779: return fpconditions[cc];
780: }
781:
782: // FMOVEM 用の FPctls を文字列にして s に返す。
783: // 戻り値は指定された制御レジスタの個数。
784: uint
785: Disasm::make_fpctls(std::string& s)
786: {
787: uint n = 0;
788: uint list = ir[1] >> 10;
789:
790: s.clear();
791: if ((list & 4)) {
792: s += make_reg(Reg::FPCR);
793: n++;
794: }
795: if ((list & 2)) {
796: if (!s.empty()) {
797: s += "/";
798: }
799: s += make_reg(Reg::FPSR);
800: n++;
801: }
802: if ((list & 1)) {
803: if (!s.empty()) {
804: s += "/";
805: }
806: s += make_reg(Reg::FPIAR);
807: n++;
808: }
809:
810: if (n == 0)
811: s = "nofpc";
812:
813: return n;
814: }
815:
816: // FMOVEM のレジスタリスト文字列を返す。
817: // 第2ワードのフェッチはすでに行ってあるはず。
818: // プリデクリメントかどうかの判断はこちらで行う。
819: std::string
820: Disasm::make_fpnlist()
821: {
822: uint16 mask = ir[1] & 0x00ff;
823: std::string s;
824:
825: // プリデクリメントモードなら、ビット順を入れ替える。
826: // An/Dn の時とは逆なので注意。てかなんでだよ。
827: // <ea> のモードと食い違ってたらその時は知らん…。
828: if ((ir[1] & 0x0800)) {
829: //mask = bitrev8(mask);
830: mask = ((mask & 0x55) << 1) | ((mask >> 1) & 0x55);
831: mask = ((mask & 0x33) << 2) | ((mask >> 2) & 0x33);
832: mask = ((mask & 0x0f) << 4) | ((mask >> 4) & 0x0f);
833: }
834:
835: // これで、レジスタは常に上から順に並んでいる。
836: // 7 6 5 .. 1 0
837: // FP0 FP1 FP2 .. FP6 FP7
838:
839: make_reglist_half(s, "fp", mask << 8);
840: if (s.empty()) {
841: s = "nofpn";
842: }
843: return s;
844: }
845:
846: /*static*/ const char * const Disasm::reg_names[] = {
847: "ccr",
848: "sr",
849: "pc",
850: "usp",
851:
852: "msp",
853: "isp",
854: "vbr",
855: "sfc",
856: "dfc",
857: "cacr",
858: "caar",
859:
860: "tc",
861: "mmusr",
862: "srp",
863: "crp",
864: "tt0",
865: "tt1",
866:
867: "fpcr",
868: "fpsr",
869: "fpiar",
870: };
871:
872: /*static*/ const char * const Disasm::size_str[] = {
873: ".l",
874: ".s",
875: ".x",
876: ".p",
877: ".w",
878: ".d",
879: ".b",
880: ".p", // dynamic k-factor
881: ".q",
882: "", // None
883: };
884:
885: /*static*/ const char * const Disasm::conditions[] = {
886: "t", "f", "hi", "ls", "cc", "cs", "ne", "eq",
887: "vc", "vs", "pl", "mi", "ge", "lt", "gt", "le",
888: };
889:
890: /*static*/ const char * const Disasm::fpconditions[] = {
891: "f", // 000000
892: "eq", // 000001
893: "ogt", // 000010
894: "oge", // 000011
895: "olt", // 000100
896: "ole", // 000101
897: "ogl", // 000110
898: "or", // 000111
899: "un", // 001000
900: "ueq", // 001001
901: "ugt", // 001010
902: "uge", // 001011
903: "ult", // 001100
904: "ule", // 001101
905: "ne", // 001110
906: "?", // 001111
907:
908: "sf", // 010000
909: "seq", // 010001
910: "ge", // 010010
911: "ge", // 010011
912: "lt", // 010100
913: "le", // 010101
914: "gl", // 010110
915: "gle", // 010111
916: "ngle", // 011000
917: "ngl", // 011001
918: "nle", // 011010
919: "nlt", // 011011
920: "nge", // 011100
921: "ngt", // 011101
922: "sne", // 011110
923: "st", // 011111
924: };
925:
926: /*static*/ const char * const Disasm::btst_names[] = {
927: "btst",
928: "bchg",
929: "bclr",
930: "bset",
931: };
932:
933: /*static*/ const char * const Disasm::fpgen_names[] = {
934: "fmove", // $00
935: "fint", // $01
936: "fsinh", // $02
937: "fintrz", // $03
938: "fsqrt", // $04
939: "", // $05
940: "flognp1", // $06
941: "", // $07
942: "fetoxm1", // $08
943: "ftanh", // $09
944: "fatan", // $0a
945: "", // $0b
946: "fasin", // $0c
947: "fatanh", // $0d
948: "fsin", // $0e
949: "ftan", // $0f
950: "fetox", // $10
951: "ftwotox", // $11
952: "ftentox", // $12
953: "", // $13
954: "flogn", // $14
955: "flog10", // $15
956: "flog2", // $16
957: "", // $17
958: "fabs", // $18
959: "fcosh", // $19
960: "fneg", // $1a
961: "", // $1b
962: "facos", // $1c
963: "fcos", // $1d
964: "fgetexp", // $1e
965: "fgetman", // $1f
966: "fdiv", // $20
967: "fmod", // $21
968: "fadd", // $22
969: "fmul", // $23
970: "fsgldiv", // $24
971: "frem", // $25
972: "fscale", // $26
973: "fsglmul", // $27
974: "fsub", // $28
975: "", // $29
976: "", // $2a
977: "", // $2b
978: "", // $2c
979: "", // $2d
980: "", // $2e
981: "", // $2f
982: "", // $30 (fsincos)
983: "", // $31 (fsincos)
984: "", // $32 (fsincos)
985: "", // $33 (fsincos)
986: "", // $34 (fsincos)
987: "", // $35 (fsincos)
988: "", // $36 (fsincos)
989: "", // $37 (fsincos)
990: "fcmp", // $38
991: "", // $39
992: "ftst", // $3a
993: };
994:
995: /*static*/ const char * const Disasm::fmovecr_text[] = {
996: "<log10(2)>", // [0] $0b
997: "<e>", // [1] $0c
998: "<log2(e)>", // [2] $0d
999: "<log10(e)>", // [3] $0e
1000: "<0>", // [4] $0f
1001: "<ln(2)>", // $30
1002: "<ln(10)>", // $31
1003: "<1>", // $32
1004: "<10>", // $33
1005: "<1e2>", // $34
1006: "<1e4>", // $35
1007: "<1e8>", // $36
1008: "<1e16>", // $37
1009: "<1e32>", // $38
1010: "<1e64>", // $39
1011: "<1e128>", // $3a
1012: "<1e256>", // $3b
1013: "<1e512>", // $3c
1014: "<1e1024>", // $3d
1015: "<1e2048>", // $3e
1016: "<1e4096>", // $3f
1017: };
1018:
1019: /*static*/ const char *const Disasm::x68k_doscall[256] = {
1020: "_EXIT", // ff00
1021: "_GETCHAR", // ff01
1022: "_PUTCHAR", // ff02
1023: "_COMINP", // ff03
1024: "_COMOUT", // ff04
1025: "_PRNOUT", // ff05
1026: "_INPOUT", // ff06
1027: "_INKEY", // ff07
1028: "_GETC", // ff08
1029: "_PRINT", // ff09
1030: "_GETS", // ff0a
1031: "_KEYSNS", // ff0b
1032: "_KFLUSH", // ff0c
1033: "_FFLUSH", // ff0d
1034: "_CHGDRV", // ff0e
1035: "_DRVCTRL", // ff0f
1036:
1037: "_CONSNS", // ff10
1038: "_PRNSNS", // ff11
1039: "_CINSNS", // ff12
1040: "_COUTSNS", // ff13
1041: NULL, // ff14
1042: NULL, // ff15
1043: NULL, // ff16
1044: "_FATCHK", // ff17
1045: "_HENDSP", // ff18
1046: "_CURDRV", // ff19
1047: "_GETSS", // ff1a
1048: "_FGETC", // ff1b
1049: "_FGETS", // ff1c
1050: "_FPUTC", // ff1d
1051: "_FPUTS", // ff1e
1052: "_ALLCLOSE", // ff1f
1053:
1054: "_SUPER", // ff20
1055: "_FNCKEY", // ff21
1056: "_KNJCTRL", // ff22
1057: "_CONCTRL", // ff23
1058: "_KEYCTRL", // ff24
1059: "_INTVCS", // ff25
1060: "_PSPSET", // ff26
1061: "_GETTIM2", // ff27
1062: "_SETTIM2", // ff28
1063: "_NAMESTS", // ff29
1064: "_GETDATE", // ff2a
1065: "_SETDATE", // ff2b
1066: "_GETTIME", // ff2c
1067: "_SETTIME", // ff2d
1068: "_VERIFY", // ff2e
1069: "_DUP0", // ff2f
1070:
1071: "_VERNUM", // ff30
1072: "_KEEPPR", // ff31
1073: "_GETDPB", // ff32
1074: "_BREAKCK", // ff33
1075: "_DRVXCHG", // ff34
1076: "_INTVCG", // ff35
1077: "_DSKFRE", // ff36
1078: "_NAMECK", // ff37
1079: NULL, // ff38
1080: "_MKDIR", // ff39
1081: "_RMDIR", // ff3a
1082: "_CHDIR", // ff3b
1083: "_CREATE", // ff3c
1084: "_OPEN", // ff3d
1085: "_CLOSE", // ff3e
1086: "_READ", // ff3f
1087:
1088: "_WRITE", // ff40
1089: "_DELETE", // ff41
1090: "_SEEK", // ff42
1091: "_CHMOD", // ff43
1092: "_IOCTRL", // ff44
1093: "_DUP", // ff45
1094: "_DUP2", // ff46
1095: "_CURDIR", // ff47
1096: "_MALLOC", // ff48
1097: "_MFREE", // ff49
1098: "_SETBLOCK", // ff4a
1099: "_EXEC", // ff4b
1100: "_EXIT2", // ff4c
1101: "_WAIT", // ff4d
1102: "_FILES", // ff4e
1103: "_NFILES", // ff4f
1104:
1105: "_SETPDB", // ff50 (Human68k ver.2)
1106: "_GETPDB", // ff51 (Human68k ver.2)
1107: "_SETENV", // ff52 (Human68k ver.2)
1108: "_GETENV", // ff53 (Human68k ver.2)
1109: "_VERIFYG", // ff54 (Human68k ver.2)
1110: "_COMMON", // ff55 (Human68k ver.2)
1111: "_RENAME", // ff56 (Human68k ver.2)
1112: "_FILEDATE", // ff57 (Human68k ver.2)
1113: "_MALLOC2", // ff58 (Human68k ver.2)
1114: NULL, // ff59
1115: "_MAKETMP", // ff5a (Human68k ver.2)
1116: "_NEWFILE", // ff5b (Human68k ver.2)
1117: "_LOCK", // ff5c (Human68k ver.2)
1118: NULL, // ff5d
1119: NULL, // ff5e
1120: "_ASSIGN", // ff5f (Human68k ver.2)
1121:
1122: NULL, // ff60
1123: NULL, // ff61
1124: NULL, // ff62
1125: NULL, // ff63
1126: NULL, // ff64
1127: NULL, // ff65
1128: NULL, // ff66
1129: NULL, // ff67
1130: NULL, // ff68
1131: NULL, // ff69
1132: NULL, // ff6a
1133: NULL, // ff6b
1134: NULL, // ff6c
1135: NULL, // ff6d
1136: NULL, // ff6e
1137: NULL, // ff6f
1138:
1139: NULL, // ff70
1140: NULL, // ff71
1141: NULL, // ff72
1142: NULL, // ff73
1143: NULL, // ff74
1144: NULL, // ff75
1145: NULL, // ff76
1146: NULL, // ff77
1147: NULL, // ff78
1148: NULL, // ff79
1149: "_FFLUSH_SET", // ff7a (Human68k ver.2)
1150: "_OS_PATCH", // ff7b (Human68k ver.2)
1151: "_GETFCB", // ff7c (Human68k ver.2)
1152: "_S_MALLOC", // ff7d (Human68k ver.2)
1153: "_S_MFREE", // ff7e (Human68k ver.2)
1154: "_S_PROCESS", // ff7f (Human68k ver.2)
1155:
1156: "_SETPDB", // ff80
1157: "_GETPDB", // ff81
1158: "_SETENV", // ff82
1159: "_GETENV", // ff83
1160: "_VERIFYG", // ff84
1161: "_COMMON", // ff85
1162: "_RENAME", // ff86
1163: "_FILEDATE", // ff87
1164: "_MALLOC2", // ff88
1165: NULL, // ff89
1166: "_MAKETMP", // ff8a
1167: "_NEWFILE", // ff8b
1168: "_LOCK", // ff8c
1169: NULL, // ff8d
1170: NULL, // ff8e
1171: "_ASSIGN", // ff8f
1172:
1173: NULL, // ff90
1174: NULL, // ff91
1175: NULL, // ff92
1176: NULL, // ff93
1177: NULL, // ff94
1178: NULL, // ff95
1179: NULL, // ff96
1180: NULL, // ff97
1181: NULL, // ff98
1182: NULL, // ff99
1183: NULL, // ff9a
1184: NULL, // ff9b
1185: NULL, // ff9c
1186: NULL, // ff9d
1187: NULL, // ff9e
1188: NULL, // ff9f
1189:
1190: NULL, // ffa0
1191: NULL, // ffa1
1192: NULL, // ffa2
1193: NULL, // ffa3
1194: NULL, // ffa4
1195: NULL, // ffa5
1196: NULL, // ffa6
1197: NULL, // ffa7
1198: NULL, // ffa8
1199: NULL, // ffa9
1200: "_FFLUSH_SET", // ffaa
1201: "_OS_PATCH", // ffab
1202: "_GETFCB", // ffac
1203: "_S_MALLOC", // ffad
1204: "_S_MFREE", // ffae
1205: "_S_PROCESS", // ffaf
1206:
1207: NULL, // ffb0
1208: NULL, // ffb1
1209: NULL, // ffb2
1210: NULL, // ffb3
1211: NULL, // ffb4
1212: NULL, // ffb5
1213: NULL, // ffb6
1214: NULL, // ffb7
1215: NULL, // ffb8
1216: NULL, // ffb9
1217: NULL, // ffba
1218: NULL, // ffbb
1219: NULL, // ffbc
1220: NULL, // ffbd
1221: NULL, // ffbe
1222: NULL, // ffbf
1223:
1224: NULL, // ffc0
1225: NULL, // ffc1
1226: NULL, // ffc2
1227: NULL, // ffc3
1228: NULL, // ffc4
1229: NULL, // ffc5
1230: NULL, // ffc6
1231: NULL, // ffc7
1232: NULL, // ffc8
1233: NULL, // ffc9
1234: NULL, // ffca
1235: NULL, // ffcb
1236: NULL, // ffcc
1237: NULL, // ffcd
1238: NULL, // ffce
1239: NULL, // ffcf
1240:
1241: NULL, // ffd0
1242: NULL, // ffd1
1243: NULL, // ffd2
1244: NULL, // ffd3
1245: NULL, // ffd4
1246: NULL, // ffd5
1247: NULL, // ffd6
1248: NULL, // ffd7
1249: NULL, // ffd8
1250: NULL, // ffd9
1251: NULL, // ffda
1252: NULL, // ffdb
1253: NULL, // ffdc
1254: NULL, // ffdd
1255: NULL, // ffde
1256: NULL, // ffdf
1257:
1258: NULL, // ffe0
1259: NULL, // ffe1
1260: NULL, // ffe2
1261: NULL, // ffe3
1262: NULL, // ffe4
1263: NULL, // ffe5
1264: NULL, // ffe6
1265: NULL, // ffe7
1266: NULL, // ffe8
1267: NULL, // ffe9
1268: NULL, // ffea
1269: NULL, // ffeb
1270: NULL, // ffec
1271: NULL, // ffed
1272: NULL, // ffee
1273: NULL, // ffef
1274:
1275: "_EXITVC", // fff0
1276: "_CTRLVC", // fff1
1277: "_ERRJVC", // fff2
1278: "_DISKRED", // fff3
1279: "_DISKWRT", // fff4
1280: "_INDOSFLG", // fff5
1281: "_SUPER_JSR", // fff6
1282: "_BUS_ERR", // fff7
1283: "_OPEN_PR", // fff8
1284: "_KILL_PR", // fff9
1285: "_GET_PR", // fffa
1286: "_SUSPEND_PR", // fffb
1287: "_SLEEP_PR", // fffc
1288: "_SEND_PR", // fffd
1289: "_TIME_PR", // fffe
1290: "_CHANGE_PR", // ffff
1291: };
1292:
1293: /*static*/ const char * const Disasm::x68k_fpcall[256] = {
1294: "__LMUL", // fe00
1295: "__LDIV", // fe01
1296: "__LMOD", // fe02
1297: NULL, // fe03
1298: "__UMUL", // fe04
1299: "__UDIV", // fe05
1300: "__UMOD", // fe06
1301: NULL, // fe07
1302: "__IMUL", // fe08
1303: "__IDIV", // fe09
1304: NULL, // fe0a
1305: NULL, // fe0b
1306: "__RANDOMIZE", // fe0c
1307: "__SRAND", // fe0d
1308: "__RAND", // fe0e
1309: NULL, // fe0f
1310:
1311: "__STOL", // fe10
1312: "__LTOS", // fe11
1313: "__STOH", // fe12
1314: "__HTOS", // fe13
1315: "__STOO", // fe14
1316: "__OTOS", // fe15
1317: "__STOB", // fe16
1318: "__BTOS", // fe17
1319: "__IUSING", // fe18
1320: NULL, // fe19
1321: "__LTOD", // fe1a
1322: "__DTOL", // fe1b
1323: "__LTOF", // fe1c
1324: "__FTOL", // fe1d
1325: "__FTOD", // fe1e
1326: "__DTOF", // fe1f
1327:
1328: "__VAL", // fe20
1329: "__USING", // fe21
1330: "__STOD", // fe22
1331: "__DTOS", // fe23
1332: "__ECVT", // fe24
1333: "__FCVT", // fe25
1334: "__GCVT", // fe26
1335: NULL, // fe27
1336: "__DTST", // fe28
1337: "__DCMP", // fe29
1338: "__DNEG", // fe2a
1339: "__DADD", // fe2b
1340: "__DSUB", // fe2c
1341: "__DMUL", // fe2d
1342: "__DDIV", // fe2e
1343: "__DMOD", // fe2f
1344:
1345: "__DABS", // fe30
1346: "__DCEIL", // fe31
1347: "__DFIX", // fe32
1348: "__DFLOOR", // fe33
1349: "__DFRAC", // fe34
1350: "__DSGN", // fe35
1351: "__SIN", // fe36
1352: "__COS", // fe37
1353: "__TAN", // fe38
1354: "__ATAN", // fe39
1355: "__LOG", // fe3a
1356: "__EXP", // fe3b
1357: "__SQR", // fe3c
1358: "__PI", // fe3d
1359: "__NPI", // fe3e
1360: "__POWER", // fe3f
1361:
1362: "__RND", // fe40
1363: "__SINH", // fe41
1364: "__COSH", // fe42
1365: "__TANH", // fe43
1366: "__ATANH", // fe44
1367: "__ASIN", // fe45
1368: "__ACOS", // fe46
1369: "__LOG10", // fe47
1370: "__LOG2", // fe48
1371: "__DFREXP", // fe49
1372: "__DLDEXP", // fe4a
1373: "__DADDONE", // fe4b
1374: "__DSUBONE", // fe4c
1375: "__DDIVTWO", // fe4d
1376: "__DIEECNV", // fe4e
1377: "__IEEDCNV", // fe4f
1378:
1379: "__FVAL", // fe50
1380: "__FUSING", // fe51
1381: "__STOF", // fe52
1382: "__FTOS", // fe53
1383: "__FECVT", // fe54
1384: "__FFCVT", // fe55
1385: "__FGCVT", // fe56
1386: NULL, // fe57
1387: "__FTST", // fe58
1388: "__FCMP", // fe59
1389: "__FNEG", // fe5a
1390: "__FADD", // fe5b
1391: "__FSUB", // fe5c
1392: "__FMUL", // fe5d
1393: "__FDIV", // fe5e
1394: "__FMOD", // fe5f
1395:
1396: "__FABS", // fe60
1397: "__FCEIL", // fe61
1398: "__FFIX", // fe62
1399: "__FFLOOR", // fe63
1400: "__FFRAC", // fe64
1401: "__FSGN", // fe65
1402: "__FSIN", // fe66
1403: "__FCOS", // fe67
1404: "__FTAN", // fe68
1405: "__FATAN", // fe69
1406: "__FLOG", // fe6a
1407: "__FEXP", // fe6b
1408: "__FSQR", // fe6c
1409: "__FPI", // fe6d
1410: "__FNPI", // fe6e
1411: "__FPOWER", // fe6f
1412:
1413: "__FRND", // fe70
1414: "__FSINH", // fe71
1415: "__FCOSH", // fe72
1416: "__FTANH", // fe73
1417: "__FATANH", // fe74
1418: "__FASIN", // fe75
1419: "__FACOS", // fe76
1420: "__FLOG10", // fe77
1421: "__FLOG2", // fe78
1422: "__FFREXP", // fe79
1423: "__FLDEXP", // fe7a
1424: "__FADDONE", // fe7b
1425: "__FSUBONE", // fe7c
1426: "__FDIVTWO", // fe7d
1427: "__FIEECNV", // fe7e
1428: "__IEEFCNV", // fe7f
1429:
1430: NULL, // fe80
1431: NULL, // fe81
1432: NULL, // fe82
1433: NULL, // fe83
1434: NULL, // fe84
1435: NULL, // fe85
1436: NULL, // fe86
1437: NULL, // fe87
1438: NULL, // fe88
1439: NULL, // fe89
1440: NULL, // fe8a
1441: NULL, // fe8b
1442: NULL, // fe8c
1443: NULL, // fe8d
1444: NULL, // fe8e
1445: NULL, // fe8f
1446:
1447: NULL, // fe90
1448: NULL, // fe91
1449: NULL, // fe92
1450: NULL, // fe93
1451: NULL, // fe94
1452: NULL, // fe95
1453: NULL, // fe96
1454: NULL, // fe97
1455: NULL, // fe98
1456: NULL, // fe99
1457: NULL, // fe9a
1458: NULL, // fe9b
1459: NULL, // fe9c
1460: NULL, // fe9d
1461: NULL, // fe9e
1462: NULL, // fe9f
1463:
1464: NULL, // fea0
1465: NULL, // fea1
1466: NULL, // fea2
1467: NULL, // fea3
1468: NULL, // fea4
1469: NULL, // fea5
1470: NULL, // fea6
1471: NULL, // fea7
1472: NULL, // fea8
1473: NULL, // fea9
1474: NULL, // feaa
1475: NULL, // feab
1476: NULL, // feac
1477: NULL, // fead
1478: NULL, // feae
1479: NULL, // feaf
1480:
1481: NULL, // feb0
1482: NULL, // feb1
1483: NULL, // feb2
1484: NULL, // feb3
1485: NULL, // feb4
1486: NULL, // feb5
1487: NULL, // feb6
1488: NULL, // feb7
1489: NULL, // feb8
1490: NULL, // feb9
1491: NULL, // feba
1492: NULL, // febb
1493: NULL, // febc
1494: NULL, // febd
1495: NULL, // febe
1496: NULL, // febf
1497:
1498: NULL, // fec0
1499: NULL, // fec1
1500: NULL, // fec2
1501: NULL, // fec3
1502: NULL, // fec4
1503: NULL, // fec5
1504: NULL, // fec6
1505: NULL, // fec7
1506: NULL, // fec8
1507: NULL, // fec9
1508: NULL, // feca
1509: NULL, // fecb
1510: NULL, // fecc
1511: NULL, // fecd
1512: NULL, // fece
1513: NULL, // fecf
1514:
1515: NULL, // fed0
1516: NULL, // fed1
1517: NULL, // fed2
1518: NULL, // fed3
1519: NULL, // fed4
1520: NULL, // fed5
1521: NULL, // fed6
1522: NULL, // fed7
1523: NULL, // fed8
1524: NULL, // fed9
1525: NULL, // feda
1526: NULL, // fedb
1527: NULL, // fedc
1528: NULL, // fedd
1529: NULL, // fede
1530: NULL, // fedf
1531:
1532: "__CLMUL", // fee0
1533: "__CLDIV", // fee1
1534: "__CLMOD", // fee2
1535: "__CUMUL", // fee3
1536: "__CUDIV", // fee4
1537: "__CUMOD", // fee5
1538: "__CLTOD", // fee6
1539: "__CDTOL", // fee7
1540: "__CLTOF", // fee8
1541: "__CFTOL", // fee9
1542: "__CFTOD", // feea
1543: "__CDTOF", // feeb
1544: "__CDCMP", // feec
1545: "__CDADD", // feed
1546: "__CDSUB", // feee
1547: "__CDMUL", // feef
1548:
1549: "__CDDIV", // fef0
1550: "__CDMOD", // fef1
1551: "__CFCMP", // fef2
1552: "__CFADD", // fef3
1553: "__CFSUB", // fef4
1554: "__CFMUL", // fef5
1555: "__CFDIV", // fef6
1556: "__CFMOD", // fef7
1557: "__CDTST", // fef8
1558: "__CFTST", // fef9
1559: "__CDINC", // fefa
1560: "__CFINC", // fefb
1561: "__CDDEC", // fefc
1562: "__CFDEC", // fefd
1563: "__FEVARG", // fefe
1564: "__FEVECS", // feff
1565:
1566: };
1567:
1568: /*static*/ const char * const Disasm::x68k_iocscall[256] = {
1569: "_B_KEYINP", // 7000
1570: "_B_KEYSNS", // 7001
1571: "_B_SFTSNS", // 7002
1572: "_KEY_INIT", // 7003
1573: "_BITSNS", // 7004
1574: "_SKEYSET", // 7005
1575: "_LEDCTRL", // 7006
1576: "_LEDSET", // 7007
1577: "_KEYDLY", // 7008
1578: "_KEYREP", // 7009
1579: NULL, // 700a
1580: NULL, // 700b
1581: "_TVCTRL", // 700c
1582: "_LEDMOD", // 700d
1583: "_TGUSEMD", // 700e
1584: "_DEFCHR", // 700f
1585:
1586: "_CRTMOD", // 7010
1587: "_CONTRAST", // 7011
1588: "_HSVTORGB", // 7012
1589: "_TPALET", // 7013
1590: "_TPALET2", // 7014
1591: "_TCOLOR", // 7015
1592: "_FNTADR", // 7016
1593: "_VRAMGET", // 7017
1594: "_VRAMPUT", // 7018
1595: "_FNTGET", // 7019
1596: "_TEXTGET", // 701a
1597: "_TEXTPUT", // 701b
1598: "_CLIPPUT", // 701c
1599: "_SCROLL", // 701d
1600: "_B_CURON", // 701e
1601: "_B_CUROFF", // 701f
1602:
1603: "_B_PUTC", // 7020
1604: "_B_PRINT", // 7021
1605: "_B_COLOR", // 7022
1606: "_B_LOCATE", // 7023
1607: "_B_DOWN_S", // 7024
1608: "_B_UP_S", // 7025
1609: "_B_UP", // 7026
1610: "_B_DOWN", // 7027
1611: "_B_RIGHT", // 7028
1612: "_B_LEFT", // 7029
1613: "_B_CLR_ST", // 702a
1614: "_B_ERA_ST", // 702b
1615: "_B_INS", // 702c
1616: "_B_DEL", // 702d
1617: "_B_CONSOL", // 702e
1618: "_B_PUTMES", // 702f
1619:
1620: "_SET232C", // 7030
1621: "_LOF232C", // 7031
1622: "_INP232C", // 7032
1623: "_ISNS232C", // 7033
1624: "_OSNS232C", // 7034
1625: "_OUT232C", // 7035
1626: NULL, // 7036
1627: NULL, // 7037
1628: "_SETFNTADR", // 7038
1629: NULL, // 7039
1630: NULL, // 703a
1631: "_JOYGET", // 703b
1632: "_INIT_PRN", // 703c
1633: "_SNSPRN", // 703d
1634: "_OUTLPT", // 703e
1635: "_OUTPRN", // 703f
1636:
1637: "_B_SEEK", // 7040
1638: "_B_VERIFY", // 7041
1639: "_B_READDI", // 7042
1640: "_B_DSKINI", // 7043
1641: "_B_DRVSNS", // 7044
1642: "_B_WRITE", // 7045
1643: "_B_READ", // 7046
1644: "_B_RECALI", // 7047
1645: "_B_ASSIGN", // 7048
1646: "_B_WRITED", // 7049
1647: "_B_READID", // 704a
1648: "_B_BADFMT", // 704b
1649: "_B_READDL", // 704c
1650: "_B_FORMAT", // 704d
1651: "_B_DRVCHK", // 704e
1652: "_B_EJECT", // 704f
1653:
1654: "_DATEBCD", // 7050
1655: "_DATESET", // 7051
1656: "_TIMEBCD", // 7052
1657: "_TIMESET", // 7053
1658: "_DATEGET", // 7054
1659: "_DATEBIN", // 7055
1660: "_TIMEGET", // 7056
1661: "_TIMEBIN", // 7057
1662: "_DATECNV", // 7058
1663: "_TIMECNV", // 7059
1664: "_DATEASC", // 705a
1665: "_TIMEASC", // 705b
1666: "_DAYASC", // 705c
1667: "_ALARMMOD", // 705d
1668: "_ALARMSET", // 705e
1669: "_ALARMGET", // 705f
1670:
1671: "_ADPCMOUT", // 7060
1672: "_ADPCMINP", // 7061
1673: "_ADPCMAOT", // 7062
1674: "_ADPCMAIN", // 7063
1675: "_ADPCMLOT", // 7064
1676: "_ADPCMLIN", // 7065
1677: "_ADPCMSNS", // 7066
1678: "_ADPCMMOD", // 7067
1679: "_OPMSET", // 7068
1680: "_OPMSNS", // 7069
1681: "_OPMINTST", // 706a
1682: "_TIMERDST", // 706b
1683: "_VDISPST", // 706c
1684: "_CRTCRAS", // 706d
1685: "_HSYNCST", // 706e
1686: "_PRNINTST", // 706f
1687:
1688: "_MS_INIT", // 7070
1689: "_MS_CURON", // 7071
1690: "_MS_CUROF", // 7072
1691: "_MS_STAT", // 7073
1692: "_MS_GETDT", // 7074
1693: "_MS_CURGT", // 7075
1694: "_MS_CURST", // 7076
1695: "_MS_LIMIT", // 7077
1696: "_MS_OFFTM", // 7078
1697: "_MS_ONTM", // 7079
1698: "_MS_PATST", // 707a
1699: "_MS_SEL", // 707b
1700: "_MS_SEL2", // 707c
1701: "_SKEY_MOD", // 707d
1702: "_DENSNS", // 707e
1703: "_ONTIME", // 707f
1704:
1705: "_B_INTVCS", // 7080
1706: "_B_SUPER", // 7081
1707: "_B_BPEEK", // 7082
1708: "_B_WPEEK", // 7083
1709: "_B_LPEEK", // 7084
1710: "_B_MEMSTR", // 7085
1711: "_B_BPOKE", // 7086
1712: "_B_WPOKE", // 7087
1713: "_B_LPOKE", // 7088
1714: "_B_MEMSET", // 7089
1715: "_DMAMOVE", // 708a
1716: "_DMAMOV_A", // 708b
1717: "_DMAMOV_L", // 708c
1718: "_DMAMODE", // 708d
1719: "_BOOTINF", // 708e
1720: "_ROMVER", // 708f
1721:
1722: "_G_CLR_ON", // 7090
1723: NULL, // 7091
1724: NULL, // 7092
1725: NULL, // 7093
1726: "_GPALET", // 7094
1727: NULL, // 7095
1728: NULL, // 7096
1729: NULL, // 7097
1730: NULL, // 7098
1731: NULL, // 7099
1732: NULL, // 709a
1733: NULL, // 709b
1734: NULL, // 709c
1735: NULL, // 709d
1736: NULL, // 709e
1737: NULL, // 709f
1738:
1739: "_SFTJIS", // 70a0
1740: "_JISSFT", // 70a1
1741: "_AKCONV", // 70a2
1742: "_RMACNV", // 70a3
1743: "_DAKJOB", // 70a4
1744: "_HANJOB", // 70a5
1745: NULL, // 70a6
1746: NULL, // 70a7
1747: NULL, // 70a8
1748: NULL, // 70a9
1749: NULL, // 70aa
1750: NULL, // 70ab
1751: "_SYS_STAT", // 70ac
1752: "_B_CONMOD", // 70ad
1753: "_OS_CURON", // 70ae
1754: "_OS_CUROF", // 70af
1755:
1756: "_DRAWMODE", // 70b0
1757: "_APAGE", // 70b1
1758: "_VPAGE", // 70b2
1759: "_HOME", // 70b3
1760: "_WINDOW", // 70b4
1761: "_WIPE", // 70b5
1762: "_PSET", // 70b6
1763: "_POINT", // 70b7
1764: "_LINE", // 70b8
1765: "_BOX", // 70b9
1766: "_FILL", // 70ba
1767: "_CIRCLE", // 70bb
1768: "_PAINT", // 70bc
1769: "_SYMBOL", // 70bd
1770: "_GETGRM", // 70be
1771: "_PUTGRM", // 70bf
1772:
1773: "_SP_INIT", // 70c0
1774: "_SP_ON", // 70c1
1775: "_SP_OFF", // 70c2
1776: "_SP_CGCLR", // 70c3
1777: "_SP_DEFCG", // 70c4
1778: "_SP_GTPCG", // 70c5
1779: "_SP_REGST", // 70c6
1780: "_SP_REGGT", // 70c7
1781: "_BGSCRLST", // 70c8
1782: "_BGSCRLGT", // 70c9
1783: "_BGCTRLST", // 70ca
1784: "_BGCTRLGT", // 70cb
1785: "_BGTEXTCL", // 70cc
1786: "_BGTEXTST", // 70cd
1787: "_BGTEXTGT", // 70ce
1788: "_SPALET", // 70cf
1789:
1790: NULL, // 70d0
1791: NULL, // 70d1
1792: NULL, // 70d2
1793: "_TXXLINE", // 70d3
1794: "_TXYLINE", // 70d4
1795: "_TXLINE", // 70d5
1796: "_TXBOX", // 70d6
1797: "_TXFILL", // 70d7
1798: "_TXREV", // 70d8
1799: NULL, // 70d9
1800: NULL, // 70da
1801: NULL, // 70db
1802: NULL, // 70dc
1803: NULL, // 70dd
1804: NULL, // 70de
1805: "_TXRASCPY", // 70df
1806:
1807: NULL, // 70e0
1808: NULL, // 70e1
1809: NULL, // 70e2
1810: NULL, // 70e3
1811: NULL, // 70e4
1812: NULL, // 70e5
1813: NULL, // 70e6
1814: NULL, // 70e7
1815: NULL, // 70e8
1816: NULL, // 70e9
1817: NULL, // 70ea
1818: NULL, // 70eb
1819: NULL, // 70ec
1820: NULL, // 70ed
1821: NULL, // 70ee
1822: NULL, // 70ef
1823:
1824: "_OPMDRV", // 70f0
1825: "_RSDRV", // 70f1
1826: "_A_JOYGET", // 70f2
1827: "_MUSICDRV", // 70f3
1828: NULL, // 70f4
1829: "_SCSIDRV", // 70f5
1830: NULL, // 70f6
1831: NULL, // 70f7
1832: NULL, // 70f8
1833: NULL, // 70f9
1834: NULL, // 70fa
1835: NULL, // 70fb
1836: NULL, // 70fc
1837: "_ABORTRST", // 70fd
1838: "_IPLERR", // 70fe
1839: "_ABORTJOB", // 70ff
1840: };
1841:
1842: // ここから命令
1843:
1844: // %0000_000000_mmmrrr ORI.B #<imm>,<ea>
1845: // %0000_000000_111100 ORI.B #<imm>,CCR
1846: OP_DEF(ori_b)
1847: {
1848: name = "ori";
1849: size = Size::B;
1850: src = imm8();
1851: if ((ir[0] & 0x3f) == 0x3c) {
1852: dst = make_reg(Reg::CCR);
1853: } else {
1854: dst = make_ea();
1855: }
1856: }
1857:
1858: // %0000_000001_mmmrrr ORI.W #<imm>,<ea>
1859: // %0000_000001_111100 ORI.W #<imm>,SR
1860: OP_DEF(ori_w)
1861: {
1862: name = "ori";
1863: size = Size::W;
1864: src = imm16();
1865: if ((ir[0] & 0x3f) == 0x3c) {
1866: dst = make_reg(Reg::SR);
1867: } else {
1868: dst = make_ea();
1869: }
1870: }
1871:
1872: // %0000_000010_mmmrrr ORI.L #<imm>,<ea>
1873: OP_DEF(ori_l)
1874: {
1875: name = "ori";
1876: size = Size::L;
1877: src = imm32();
1878: dst = make_ea();
1879: }
1880:
1881: void
1882: Disasm::ops_cmp2chk2(Disasm::Size sz)
1883: {
1884: fetch16();
1885: if ((ir[1] & 0x0800) == 0) {
1886: // CMP2.[BWL] <ea>,Rn
1887: name = "cmp2";
1888: } else {
1889: // CHK2.[BWL] <ea>,Rn
1890: name = "chk2";
1891: }
1892: size = sz;
1893: src = make_ea();
1894: dst = make_rn(ir[1] >> 12);
1895: }
1896:
1897: // %0000_000011_mmmrrr CMP2/CHK2.B <ea>,Rn
1898: OP_DEF(cmp2chk2_b)
1899: {
1900: ops_cmp2chk2(Size::B);
1901: }
1902:
1903: // B{TST,CHG,CLR,SET} と MOVEP のメイン部分
1904: void
1905: Disasm::ops_btst_movep()
1906: {
1907: uint mr = (ir[0] >> 3) & 7;
1908: uint op = (ir[0] >> 6) & 3;
1909:
1910: if (mr == 0) {
1911: // B***.L Dx,Dy
1912: name = btst_names[op];
1913: size = Size::L;
1914: src = make_dn(ir[0] >> 9);
1915: dst = make_dn(ir[0]);
1916: } else if (mr == 1) {
1917: // MOVEP
1918: ops_movep();
1919: } else {
1920: // B***.B Dx,<ea>
1921: name = btst_names[op];
1922: size = Size::B;
1923: src = make_dn(ir[0] >> 9);
1924: dst = make_ea();
1925: }
1926: }
1927:
1928: // MOVEP
1929: void
1930: Disasm::ops_movep()
1931: {
1932: name = "movep";
1933: uint mode = (ir[0] >> 6) & 3;
1934: __assume(mode <= 3);
1935: switch (mode) {
1936: case 0: // MOVEP.W (d,Ay),Dx
1937: size = Size::W;
1938: src = "(" + addr16() + "," + make_an(ir[0]) + ")";
1939: dst = make_dn(ir[0] >> 9);
1940: break;
1941: case 1: // MOVEP.L (d,Ay),Dx
1942: size = Size::L;
1943: src = "(" + addr16() + "," + make_an(ir[0]) + ")";
1944: dst = make_dn(ir[0] >> 9);
1945: break;
1946: case 2: // MOVEP.W Dx,(d,Ay)
1947: size = Size::W;
1948: src = make_dn(ir[0] >> 9);
1949: dst = "(" + addr16() + "," + make_an(ir[0]) + ")";
1950: break;
1951: case 3: // MOVEP.L Dx,(d,Ay)
1952: size = Size::L;
1953: src = make_dn(ir[0] >> 9);
1954: dst = "(" + addr16() + "," + make_an(ir[0]) + ")";
1955: break;
1956: }
1957: }
1958:
1959: // %0000_xxx100_000yyy BTST.L Dx,Dy
1960: // %0000_xxx100_001yyy MOVEP.W (d,Ay),Dx
1961: // %0000_xxx100_mmmrrr BTST.B Dx,<ea>
1962: OP_DEF(btst_dn_ea)
1963: {
1964: ops_btst_movep();
1965: }
1966:
1967: // %0000_xxx101_000yyy BCHG.L Dx,Dy
1968: // %0000_xxx101_001yyy MOVEP.L (d,Ay),Dx
1969: // %0000_xxx101_mmmrrr BCHG.B Dx,<ea>
1970: OP_DEF(bchg_dn_ea)
1971: {
1972: ops_btst_movep();
1973: }
1974:
1975: // %0000_xxx110_000yyy BCLR.L Dx,Dy
1976: // %0000_xxx110_001yyy MOVEP.W Dx,(d,Ay)
1977: // %0000_xxx110_mmmrrr BCLR.B Dx,<ea>
1978: OP_DEF(bclr_dn_ea)
1979: {
1980: ops_btst_movep();
1981: }
1982:
1983: // %0000_xxx111_000yyy BSET.L Dx,Dy
1984: // %0000_xxx111_001yyy MOVEP.L Dx,(d,Ay)
1985: // %0000_xxx111_mmmrrr BSET.B Dx,<ea>
1986: OP_DEF(bset_dn_ea)
1987: {
1988: ops_btst_movep();
1989: }
1990:
1991: // %0000_001000_mmmrrr ANDI.B #<imm>,<ea>
1992: // %0000_001000_111100 ANDI.B #<imm>,CCR
1993: OP_DEF(andi_b)
1994: {
1995: name = "andi";
1996: size = Size::B;
1997: src = imm8();
1998: if ((ir[0] & 0x3f) == 0x3c) {
1999: dst = make_reg(Reg::CCR);
2000: } else {
2001: dst = make_ea();
2002: }
2003: }
2004:
2005: // %0000_001001_mmmrrr ANDI.W #<imm>,<ea>
2006: // %0000_001001_111100 ANDI.W #<imm>,SR
2007: OP_DEF(andi_w)
2008: {
2009: name = "andi";
2010: size = Size::W;
2011: src = imm16();
2012: if ((ir[0] & 0x3f) == 0x3c) {
2013: dst = make_reg(Reg::SR);
2014: } else {
2015: dst = make_ea();
2016: }
2017: }
2018:
2019: // %0000_001010_mmmrrr ANDI.L #<imm>,<ea>
2020: OP_DEF(andi_l)
2021: {
2022: name = "andi";
2023: size = Size::L;
2024: src = imm32();
2025: dst = make_ea();
2026: }
2027:
2028: // %0000_001011_mmmrrr CMP2/CHK2.W <ea>,Rn
2029: OP_DEF(cmp2chk2_w)
2030: {
2031: ops_cmp2chk2(Size::W);
2032: }
2033:
2034: // %0000_010000_mmmrrr SUBI.B #<imm>,<ea>
2035: OP_DEF(subi_b)
2036: {
2037: name = "subi";
2038: size = Size::B;
2039: src = imm8();
2040: dst = make_ea();
2041: }
2042:
2043: // %0000_010001_mmmrrr SUBI.W #<imm>,<ea>
2044: OP_DEF(subi_w)
2045: {
2046: name = "subi";
2047: size = Size::W;
2048: src = imm16();
2049: dst = make_ea();
2050: }
2051:
2052: // %0000_010010_mmmrrr SUBI.L #<imm>,<ea>
2053: OP_DEF(subi_l)
2054: {
2055: name = "subi";
2056: size = Size::L;
2057: src = imm32();
2058: dst = make_ea();
2059: }
2060:
2061: // %0000_010011_mmmrrr CMP2/CHK2.L <ea>,Rn
2062: OP_DEF(cmp2chk2_l)
2063: {
2064: ops_cmp2chk2(Size::L);
2065: }
2066:
2067: // %0000_011000_mmmrrr ADDI.B #<imm>,<ea>
2068: OP_DEF(addi_b)
2069: {
2070: name = "addi";
2071: size = Size::B;
2072: src = imm8();
2073: dst = make_ea();
2074: }
2075:
2076: // %0000_011001_mmmrrr ADDI.W #<imm>,<ea>
2077: OP_DEF(addi_w)
2078: {
2079: name = "addi";
2080: size = Size::W;
2081: src = imm16();
2082: dst = make_ea();
2083: }
2084:
2085: // %0000_011010_mmmrrr ADDI.L #<imm>,<ea>
2086: OP_DEF(addi_l)
2087: {
2088: name = "addi";
2089: size = Size::L;
2090: src = imm32();
2091: dst = make_ea();
2092: }
2093:
2094: // BTST,BCHG,BCLR,BSET #<imm>,<ea> の共通部分。
2095: void
2096: Disasm::ops_btst_imm_ea()
2097: {
2098: uint n = ir[0] & 0x3f;
2099: uint op = (ir[0] >> 6) & 3;
2100:
2101: fetch16();
2102: name = btst_names[op];
2103: if (n < 8) {
2104: size = Size::L;
2105: src = string_format("#%d", ir[1] & 31);
2106: dst = make_dn(n);
2107: } else {
2108: size = Size::B;
2109: src = string_format("#%d", ir[1] & 7);
2110: dst = make_ea();
2111: }
2112: }
2113:
2114: // %0000_100000_000yyy BTST.L #<imm>,Dy
2115: // %0000_100000_mmmrrr BTST.B #<imm>,<ea>
2116: OP_DEF(btst_imm_ea)
2117: {
2118: ops_btst_imm_ea();
2119: }
2120:
2121: // %0000_100001_000yyy BCHG.L #<imm>,Dy
2122: // %0000_100001_mmmrrr BCHG.B #<imm>,<ea>
2123: OP_DEF(bchg_imm_ea)
2124: {
2125: ops_btst_imm_ea();
2126: }
2127:
2128: // %0000_100010_000yyy BCLR.L #<imm>,Dy
2129: // %0000_100010_mmmrrr BCLR.B #<imm>,<ea>
2130: OP_DEF(bclr_imm_ea)
2131: {
2132: ops_btst_imm_ea();
2133: }
2134:
2135: // %0000_100011_000yyy BSET.L #<imm>,Dy
2136: // %0000_100011_mmmrrr BSET.B #<imm>,<ea>
2137: OP_DEF(bset_imm_ea)
2138: {
2139: ops_btst_imm_ea();
2140: }
2141:
2142: // %0000_101000_mmmrrr EORI.B #<imm>,<ea>
2143: // %0000_101000_111100 EORI.B #<imm>,CCR
2144: OP_DEF(eori_b)
2145: {
2146: name = "eori";
2147: size = Size::B;
2148: src = imm8();
2149: if ((ir[0] & 0x3f) == 0x3c) {
2150: dst = make_reg(Reg::CCR);
2151: } else {
2152: dst = make_ea();
2153: }
2154: }
2155:
2156: // %0000_101001_mmmrrr EORI.W #<imm>,<ea>
2157: // %0000_101001_111100 EORI.W #<imm>,SR
2158: OP_DEF(eori_w)
2159: {
2160: name = "eori";
2161: size = Size::W;
2162: src = imm16();
2163: if ((ir[0] & 0x3f) == 0x3c) {
2164: dst = make_reg(Reg::SR);
2165: } else {
2166: dst = make_ea();
2167: }
2168: }
2169:
2170: // %0000_101010_mmmrrr EORI.L #<imm>,<ea>
2171: OP_DEF(eori_l)
2172: {
2173: name = "eori";
2174: size = Size::L;
2175: src = imm32();
2176: dst = make_ea();
2177: }
2178:
2179: // CAS の共通部分
2180: void
2181: Disasm::ops_cas(Disasm::Size sz)
2182: {
2183: fetch16();
2184:
2185: name = "cas";
2186: size = sz;
2187: uint dc = ir[1];
2188: uint du = ir[1] >> 6;
2189: src = make_dn(dc) + "," + make_dn(du);
2190: dst = make_ea();
2191: }
2192:
2193: // CAS2 の共通部分
2194: void
2195: Disasm::ops_cas2(Disasm::Size sz)
2196: {
2197: name = "cas2";
2198: size = sz;
2199: fetch16();
2200: uint dc1 = ir[1] & 7;
2201: uint du1 = ir[1] >> 6;
2202: uint rn1 = ir[1] >> 12;
2203: fetch16();
2204: uint dc2 = ir[2] & 7;
2205: uint du2 = ir[2] >> 6;
2206: uint rn2 = ir[2] >> 12;
2207: src = make_dn(dc1) + ":" + make_dn(dc2) + ","
2208: + make_dn(du1) + ":" + make_dn(du2);
2209: dst = "(" + make_rn(rn1) + "):(" + make_rn(rn2) + ")";
2210: }
2211:
2212: // %0000_101011_mmmrrr CAS.B Dc,Du,<ea>
2213: OP_DEF(cas_b)
2214: {
2215: ops_cas(Size::B);
2216: }
2217:
2218: // %0000_110000_mmmrrr CMPI.B #<imm>,<ea>
2219: OP_DEF(cmpi_b)
2220: {
2221: name = "cmpi";
2222: size = Size::B;
2223: src = imm8();
2224: dst = make_ea();
2225: }
2226:
2227: // %0000_110001_mmmrrr CMPI.W #<imm>,<ea>
2228: OP_DEF(cmpi_w)
2229: {
2230: name = "cmpi";
2231: size = Size::W;
2232: src = imm16();
2233: dst = make_ea();
2234: }
2235:
2236: // %0000_110010_mmmrrr CMPI.L #<imm>,<ea>
2237: OP_DEF(cmpi_l)
2238: {
2239: name = "cmpi";
2240: size = Size::L;
2241: src = imm32();
2242: dst = make_ea();
2243: }
2244:
2245: // %0000_110011_mmmrrr CAS.W Dc,Du,<ea>
2246: // %0000_110011_111100 CAS2.W Dc1:Dc2,Du1:Du2,(Rn1):(Rn2)
2247: OP_DEF(cas_w)
2248: {
2249: uint n = ir[0] & 0x3f;
2250:
2251: if (n == 0x3c) {
2252: // CAS2.W Dc1:Dc2,Du1:Du2,(Rn1):(Rn2)
2253: ops_cas2(Size::W);
2254: } else {
2255: // CAS.W Dc,Du,<ea>
2256: ops_cas(Size::W);
2257: }
2258: }
2259:
2260: // MOVES の共通部分
2261: void
2262: Disasm::ops_moves(Disasm::Size sz)
2263: {
2264: fetch16();
2265:
2266: name = "moves";
2267: size = sz;
2268: if ((ir[1] & 0x0800) == 0) {
2269: // MOVES <ea>,Rn
2270: src = make_ea();
2271: dst = make_rn(ir[1] >> 12);
2272: } else {
2273: // MOVES Rn,<ea>
2274: src = make_rn(ir[1] >> 12);
2275: dst = make_ea();
2276: }
2277: }
2278:
2279: // %0000_111000_mmmrrr MOVES.B <ea>,Rn
2280: OP_DEF(moves_b)
2281: {
2282: ops_moves(Size::B);
2283: }
2284:
2285: // %0000_111001_mmmrrr MOVES.W <ea>,Rn
2286: OP_DEF(moves_w)
2287: {
2288: ops_moves(Size::W);
2289: }
2290:
2291: // %0000_111010_mmmrrr MOVES.L <ea>,Rn
2292: OP_DEF(moves_l)
2293: {
2294: ops_moves(Size::L);
2295: }
2296:
2297: // %0000_111011_mmmrrr CAS.L Dc,Du,<ea>
2298: // %0000_111011_111100 CAS2.L Dc1:Dc2,Du1:Du2,(Rn1):(Rn2)
2299: OP_DEF(cas_l)
2300: {
2301: uint n = ir[0] & 0x3f;
2302:
2303: if (n == 0x3c) {
2304: // CAS2.L Dc1:Dc2,Du1:Du2,(Rn1):(Rn2)
2305: ops_cas2(Size::L);
2306: } else {
2307: // CAS.L Dc,Du,<ea>
2308: ops_cas(Size::L);
2309: }
2310: }
2311:
2312: // MOVE.{BWL} <src>,<dst> の共通部分
2313: void
2314: Disasm::ops_move(Disasm::Size sz)
2315: {
2316: name = "move";
2317: size = sz;
2318: src = make_ea();
2319: uint dstea = ((ir[0] >> 9) & 7) | ((ir[0] >> 3) & 0x38);
2320: dst = make_ea(dstea);
2321: }
2322:
2323: // %0001_xxx000_mmmrrr MOVE.B <ea>,Dx
2324: OP_DEF(move_b_ea_dn)
2325: {
2326: ops_move(Size::B);
2327: }
2328:
2329: // %0001_xxx010_mmmrrr MOVE.B <ea>,(Ax)
2330: OP_DEF(move_b_ea_anin)
2331: {
2332: ops_move(Size::B);
2333: }
2334:
2335: // %0001_xxx011_mmmrrr MOVE.B <ea>,(Ax)+
2336: OP_DEF(move_b_ea_anpi)
2337: {
2338: ops_move(Size::B);
2339: }
2340:
2341: // %0001_xxx100_mmmrrr MOVE.B <ea>,-(Ax)
2342: OP_DEF(move_b_ea_anpd)
2343: {
2344: ops_move(Size::B);
2345: }
2346:
2347: // %0001_xxx101_mmmrrr MOVE.B <ea>,d16(Ax)
2348: OP_DEF(move_b_ea_andi)
2349: {
2350: ops_move(Size::B);
2351: }
2352:
2353: // %0001_xxx110_mmmrrr MOVE.B <ea>,(Ax,IX)
2354: OP_DEF(move_b_ea_anix)
2355: {
2356: ops_move(Size::B);
2357: }
2358:
2359: // %0001_000111_mmmrrr MOVE.B <ea>,Abs.W
2360: OP_DEF(move_b_ea_absw)
2361: {
2362: ops_move(Size::B);
2363: }
2364:
2365: // %0001_001111_mmmrrr MOVE.B <ea>,Abs.L
2366: OP_DEF(move_b_ea_absl)
2367: {
2368: ops_move(Size::B);
2369: }
2370:
2371: // %0010_xxx000_mmmrrr MOVE.L <ea>,Dx
2372: OP_DEF(move_l_ea_dn)
2373: {
2374: ops_move(Size::L);
2375: }
2376:
2377: // %0010_xxx001_mmmrrr MOVEA.L <ea>,Ax
2378: OP_DEF(movea_l)
2379: {
2380: name = "movea";
2381: size = Size::L;
2382: src = make_ea();
2383: dst = make_an(ir[0] >> 9);
2384: }
2385:
2386: // %0010_xxx010_mmmrrr MOVE.L <ea>,(Ax)
2387: OP_DEF(move_l_ea_anin)
2388: {
2389: ops_move(Size::L);
2390: }
2391:
2392: // %0010_xxx011_mmmrrr MOVE.L <ea>,(Ax)+
2393: OP_DEF(move_l_ea_anpi)
2394: {
2395: ops_move(Size::L);
2396: }
2397:
2398: // %0010_xxx100_mmmrrr MOVE.L <ea>,-(Ax)
2399: OP_DEF(move_l_ea_anpd)
2400: {
2401: ops_move(Size::L);
2402: }
2403:
2404: // %0010_xxx101_mmmrrr MOVE.L <ea>,d16(Ax)
2405: OP_DEF(move_l_ea_andi)
2406: {
2407: ops_move(Size::L);
2408: }
2409:
2410: // %0010_xxx110_mmmrrr MOVE.L <ea>,(Ax,IX)
2411: OP_DEF(move_l_ea_anix)
2412: {
2413: ops_move(Size::L);
2414: }
2415:
2416: // %0010_000111_mmmrrr MOVE.L <ea>,Abs.W
2417: OP_DEF(move_l_ea_absw)
2418: {
2419: ops_move(Size::L);
2420: }
2421:
2422: // %0010_001111_mmmrrr MOVE.L <ea>,Abs.L
2423: OP_DEF(move_l_ea_absl)
2424: {
2425: ops_move(Size::L);
2426: }
2427:
2428: // %0011_xxx000_mmmrrr MOVE.W <ea>,Dx
2429: OP_DEF(move_w_ea_dn)
2430: {
2431: ops_move(Size::W);
2432: }
2433:
2434: // %0011_xxx001_mmmrrr MOVEA.W <ea>,Ax
2435: OP_DEF(movea_w)
2436: {
2437: name = "movea";
2438: size = Size::W;
2439: src = make_ea();
2440: dst = make_an(ir[0] >> 9);
2441: }
2442:
2443: // %0011_xxx010_mmmrrr MOVE.W <ea>,(Ax)
2444: OP_DEF(move_w_ea_anin)
2445: {
2446: ops_move(Size::W);
2447: }
2448:
2449: // %0011_xxx011_mmmrrr MOVE.W <ea>,(Ax)+
2450: OP_DEF(move_w_ea_anpi)
2451: {
2452: ops_move(Size::W);
2453: }
2454:
2455: // %0011_xxx100_mmmrrr MOVE.W <ea>,-(Ax)
2456: OP_DEF(move_w_ea_anpd)
2457: {
2458: ops_move(Size::W);
2459: }
2460:
2461: // %0011_xxx101_mmmrrr MOVE.W <ea>,d16(Ax)
2462: OP_DEF(move_w_ea_andi)
2463: {
2464: ops_move(Size::W);
2465: }
2466:
2467: // %0011_xxx110_mmmrrr MOVE.W <ea>,(Ax,IX)
2468: OP_DEF(move_w_ea_anix)
2469: {
2470: ops_move(Size::W);
2471: }
2472:
2473: // %0011_000111_mmmrrr MOVE.W <ea>,Abs.W
2474: OP_DEF(move_w_ea_absw)
2475: {
2476: ops_move(Size::W);
2477: }
2478:
2479: // %0011_001111_mmmrrr MOVE.W <ea>,Abs.L
2480: OP_DEF(move_w_ea_absl)
2481: {
2482: ops_move(Size::W);
2483: }
2484:
2485: // %0100_000000_mmmrrr NEGX.B <ea>
2486: OP_DEF(negx_b)
2487: {
2488: name = "negx";
2489: size = Size::B;
2490: src = make_ea();
2491: }
2492:
2493: // %0100_000001_mmmrrr NEGX.W <ea>
2494: OP_DEF(negx_w)
2495: {
2496: name = "negx";
2497: size = Size::W;
2498: src = make_ea();
2499: }
2500:
2501: // %0100_000010_mmmrrr NEGX.L <ea>
2502: OP_DEF(negx_l)
2503: {
2504: name = "negx";
2505: size = Size::L;
2506: src = make_ea();
2507: }
2508:
2509: // %0100_000011_mmmrrr MOVE.W SR,<ea>
2510: OP_DEF(move_sr_ea)
2511: {
2512: name = "move";
2513: size = Size::W;
2514: src = make_reg(Reg::SR);
2515: dst = make_ea();
2516: }
2517:
2518: // %0100_xxx100_mmmrrr CHK.L <ea>,Dx
2519: OP_DEF(chk_l)
2520: {
2521: name = "chk";
2522: size = Size::L;
2523: src = make_ea();
2524: dst = make_dn(ir[0] >> 9);
2525: }
2526:
2527: // %0100_xxx110_mmmrrr CHK.W <ea>,Dx
2528: OP_DEF(chk_w)
2529: {
2530: name = "chk";
2531: size = Size::W;
2532: src = make_ea();
2533: dst = make_dn(ir[0] >> 9);
2534: }
2535:
2536: // %0100_xxx111_mmmrrr LEA.L <ea>,Ax
2537: // %0100_100111_000yyy EXTB.L Dy
2538: OP_DEF(lea)
2539: {
2540: uint n = ir[0] & 0x3f;
2541: uint x = (ir[0] >> 9) & 7;
2542: if (n < 8) {
2543: if (x == 4) {
2544: // EXTB.L Dy
2545: name = "extb";
2546: size = Size::L;
2547: src = make_dn(ir[0]);
2548: } else {
2549: OP_FUNC(illegal);
2550: }
2551: } else {
2552: // LEA.L <ea>,Ax
2553: name = "lea";
2554: size = Size::L;
2555: src = make_ea();
2556: dst = make_an(x);
2557: }
2558: }
2559:
2560: // %0100_001000_mmmrrr CLR.B <ea>
2561: OP_DEF(clr_b)
2562: {
2563: name = "clr";
2564: size = Size::B;
2565: src = make_ea();
2566: }
2567:
2568: // %0100_001001_mmmrrr CLR.W <ea>
2569: OP_DEF(clr_w)
2570: {
2571: name = "clr";
2572: size = Size::W;
2573: src = make_ea();
2574: }
2575:
2576: // %0100_001010_mmmrrr CLR.L <ea>
2577: OP_DEF(clr_l)
2578: {
2579: name = "clr";
2580: size = Size::L;
2581: src = make_ea();
2582: }
2583:
2584: // %0100_001011_mmmrrr MOVE.W CCR,<ea>
2585: OP_DEF(move_ccr_ea)
2586: {
2587: // MOVE to/from CCR のサイズは .W
2588: name = "move";
2589: size = Size::W;
2590: src = make_reg(Reg::CCR);
2591: dst = make_ea();
2592: }
2593:
2594: // %0100_010000_mmmrrr NEG.B <ea>
2595: OP_DEF(neg_b)
2596: {
2597: name = "neg";
2598: size = Size::B;
2599: src = make_ea();
2600: }
2601:
2602: // %0100_010001_mmmrrr NEG.W <ea>
2603: OP_DEF(neg_w)
2604: {
2605: name = "neg";
2606: size = Size::W;
2607: src = make_ea();
2608: }
2609:
2610: // %0100_010010_mmmrrr NEG.L <ea>
2611: OP_DEF(neg_l)
2612: {
2613: name = "neg";
2614: size = Size::L;
2615: src = make_ea();
2616: }
2617:
2618: // %0100_010011_mmmrrr MOVE.W <ea>,CCR
2619: OP_DEF(move_ea_ccr)
2620: {
2621: // MOVE to/from CCR のサイズは .W
2622: name = "move";
2623: size = Size::W;
2624: src = make_ea();
2625: dst = make_reg(Reg::CCR);
2626: }
2627:
2628: // %0100_011000_mmmrrr NOT.B <ea>
2629: OP_DEF(not_b)
2630: {
2631: name = "not";
2632: size = Size::B;
2633: src = make_ea();
2634: }
2635:
2636: // %0100_011001_mmmrrr NOT.W <ea>
2637: OP_DEF(not_w)
2638: {
2639: name = "not";
2640: size = Size::W;
2641: src = make_ea();
2642: }
2643:
2644: // %0100_011010_mmmrrr NOT.L <ea>
2645: OP_DEF(not_l)
2646: {
2647: name = "not";
2648: size = Size::L;
2649: src = make_ea();
2650: }
2651:
2652: // %0100_011011_mmmrrr MOVE.W <ea>,SR
2653: OP_DEF(move_ea_sr)
2654: {
2655: name = "move";
2656: size = Size::W;
2657: src = make_ea();
2658: dst = make_reg(Reg::SR);
2659: }
2660:
2661: // %0100_100000_mmmrrr NBCD.B <ea>
2662: // %0100_100000_001yyy LINK.L Ay,#<imm>
2663: OP_DEF(nbcd)
2664: {
2665: uint mm = (ir[0] >> 3) & 7;
2666:
2667: if (mm == 1) {
2668: // LINK.L Ay,#<imm>
2669: name = "link";
2670: size = Size::L;
2671: src = make_an(ir[0]);
2672: dst = "#" + disp32();
2673: } else {
2674: // NBCD.B <ea>
2675: name = "nbcd";
2676: size = Size::B;
2677: src = make_ea();
2678: }
2679: }
2680:
2681: // %0100_100001_000yyy SWAP.W Dy
2682: // %0100_100001_001nnn BKPT #<imm>
2683: // %0100_100001_mmmrrr PEA.L <ea>
2684: OP_DEF(pea)
2685: {
2686: uint n = ir[0] & 0x3f;
2687:
2688: if (n < 8) {
2689: // SWAP.W Dy
2690: name = "swap";
2691: size = Size::W;
2692: src = make_dn(n);
2693: } else if (n < 16) {
2694: // BKPT #<imm>
2695: name = "bkpt";
2696: src = string_format("#%d", ir[0] & 7);
2697: } else {
2698: // PEA.L <ea>
2699: name = "pea";
2700: size = Size::L;
2701: src = make_ea();
2702: }
2703: }
2704:
2705: // MOVEM/EXT の共通部分
2706: void
2707: Disasm::ops_movem_ext(Disasm::Size sz)
2708: {
2709: uint n = ir[0] & 0x3f;
2710:
2711: size = sz;
2712: if (n < 8) {
2713: // EXT.W Dy
2714: name = "ext";
2715: src = make_dn(ir[0]);
2716: } else {
2717: // MOVEM.W <list>,<ea>
2718: fetch16();
2719: name = "movem";
2720: src = make_reglist();
2721: dst = make_ea();
2722: }
2723: }
2724:
2725: // %0100_100010_000yyy EXT.W Dy
2726: // %0100_100010_mmmrrr MOVEM.W <list>,<ea>
2727: OP_DEF(movem_w_mem)
2728: {
2729: ops_movem_ext(Size::W);
2730: }
2731:
2732: // %0100_100011_000yyy EXT.L Dy
2733: // %0100_100011_mmmrrr MOVEM.L <list>,<ea>
2734: OP_DEF(movem_l_mem)
2735: {
2736: ops_movem_ext(Size::L);
2737: }
2738:
2739: // %0100_101000_mmmrrr TST.B <ea>
2740: OP_DEF(tst_b)
2741: {
2742: name = "tst";
2743: size = Size::B;
2744: src = make_ea();
2745: }
2746:
2747: // %0100_101001_mmmrrr TST.W <ea>
2748: OP_DEF(tst_w)
2749: {
2750: name = "tst";
2751: size = Size::W;
2752: src = make_ea();
2753: }
2754:
2755: // %0100_101010_mmmrrr TST.L <ea>
2756: OP_DEF(tst_l)
2757: {
2758: name = "tst";
2759: size = Size::L;
2760: src = make_ea();
2761: }
2762:
2763: // %0100_101011_mmmrrr TAS.B <ea>
2764: // %0100_101011_111100 ILLEGAL
2765: OP_DEF(tas)
2766: {
2767: uint n = ir[0] & 0x3f;
2768: if (n == 0x3c) {
2769: // ILLEGAL
2770: name = "illegal";
2771: } else {
2772: // TAS.B <ea>
2773: name = "tas";
2774: size = Size::B;
2775: src = make_ea();
2776: }
2777: }
2778:
2779: // %0100_110000_mmmrrr MUL{U,S}.L <ea>,Dl
2780: OP_DEF(mul)
2781: {
2782: fetch16();
2783:
2784: if ((ir[1] & 0x0800) == 0) {
2785: name = "mulu";
2786: } else {
2787: name = "muls";
2788: }
2789: size = Size::L;
2790: src = make_ea();
2791: if ((ir[1] & 0x0400) == 0) {
2792: dst = make_dn(ir[1] >> 12);
2793: } else {
2794: dst = make_dn(ir[1]) + ":" + make_dn(ir[1] >> 12);
2795: }
2796: }
2797:
2798: // %0100_110001_mmmrrr DIV{U,UL,S,SL}.L <ea>,Dq
2799: OP_DEF(div)
2800: {
2801: fetch16();
2802:
2803: if ((ir[1] & 0x0800) == 0) {
2804: name = "divu";
2805: } else {
2806: name = "divs";
2807: }
2808: size = Size::L;
2809: src = make_ea();
2810: uint dr = ir[1] & 7;
2811: uint dq = (ir[1] >> 12) & 7;
2812: if ((ir[1] & 0x0400) == 0) {
2813: if (dr == dq) {
2814: dst = make_dn(dr);
2815: } else {
2816: dst = make_dn(dr) + ":" + make_dn(dq);
2817: }
2818: } else {
2819: name += "l";
2820: dst = make_dn(dr) + ":" + make_dn(dq);
2821: }
2822: }
2823:
2824: // %0100_110010_mmmrrr MOVEM.W <ea>,<list>
2825: OP_DEF(movem_w)
2826: {
2827: fetch16();
2828: name = "movem";
2829: size = Size::W;
2830: src = make_ea();
2831: dst = make_reglist();
2832: }
2833:
2834: // %0100_110011_mmmrrr MOVEM.L <ea>,<list>
2835: OP_DEF(movem_l)
2836: {
2837: fetch16();
2838: name = "movem";
2839: size = Size::L;
2840: src = make_ea();
2841: dst = make_reglist();
2842: }
2843:
2844: // %0100_111001_00nnnn TRAP #<vector>
2845: // %0100_111001_010yyy LINK.W Ay,#<imm>
2846: // %0100_111001_011yyy UNLK Ay
2847: // %0100_111001_100yyy MOVE.L Ay,USP
2848: // %0100_111001_101yyy MOVE.L USP,Ay
2849: // %0100_111001_110000 RESET
2850: // %0100_111001_110001 NOP
2851: // %0100_111001_110010 STOP #<imm>
2852: // %0100_111001_110011 RTE
2853: // %0100_111001_110100 RTD #<imm>
2854: // %0100_111001_110101 RTS
2855: // %0100_111001_110110 TRAPV
2856: // %0100_111001_110111 RTR
2857: // %0100_111001_111010 MOVEC.L Rc,Rn
2858: // %0100_111001_111011 MOVEC.L Rn,Rc
2859: OP_DEF(trap)
2860: {
2861: uint n = ir[0] & 0x3f;
2862: switch (n) {
2863: case 0x00 ... 0x0f: // TRAP #<vector>
2864: name = "trap";
2865: src = string_format("#%d", n);
2866: break;
2867: case 0x10 ... 0x17: // LINK.W Ay,#<imm>
2868: name = "link";
2869: size = Size::W;
2870: src = make_an(ir[0]);
2871: dst = "#" + disp16();
2872: break;
2873: case 0x18 ... 0x1f: // UNLK Ay
2874: name = "unlk";
2875: src = make_an(ir[0]);
2876: break;
2877: case 0x20 ... 0x27: // MOVE.L Ay,USP
2878: name = "move";
2879: size = Size::L;
2880: src = make_an(ir[0]);
2881: dst = make_reg(Reg::USP);
2882: break;
2883: case 0x28 ... 0x2f: // MOVE.L USP,Ay
2884: name = "move";
2885: size = Size::L;
2886: src = make_reg(Reg::USP);
2887: dst = make_an(ir[0]);
2888: break;
2889: case 0x30: // RESET
2890: name = "reset";
2891: break;
2892: case 0x31: // NOP
2893: name = "nop";
2894: break;
2895: case 0x32: // STOP #<imm>
2896: name = "stop";
2897: src = imm16();
2898: break;
2899: case 0x33: // RTE
2900: name = "rte";
2901: break;
2902: case 0x34: // RTD #<imm>
2903: name = "rtd";
2904: src = imm16();
2905: break;
2906: case 0x35: // RTS
2907: name = "rts";
2908: break;
2909: case 0x36: // TRAPV
2910: name = "trapv";
2911: break;
2912: case 0x37: // RTR
2913: name = "rtr";
2914: break;
2915: case 0x3a: // MOVEC.L Rc,Rn
2916: fetch16();
2917: name = "movec";
2918: size = Size::L;
2919: src = make_movec();
2920: dst = make_rn(ir[1] >> 12);
2921: break;
2922: case 0x3b: // MOVEC.L Rn,Rc
2923: fetch16();
2924: name = "movec";
2925: size = Size::L;
2926: src = make_rn(ir[1] >> 12);
2927: dst = make_movec();
2928: break;
2929: default:
2930: OP_FUNC(illegal);
2931: break;
2932: }
2933: }
2934:
2935: // %0100_111010_mmmrrr JSR <ea>
2936: OP_DEF(jsr)
2937: {
2938: name = "jsr";
2939: src = make_ea();
2940: }
2941:
2942: // %0100_111011_mmmrrr JMP <ea>
2943: OP_DEF(jmp)
2944: {
2945: name = "jmp";
2946: src = make_ea();
2947: }
2948:
2949: // %0101_qqq000_mmmrrr ADDQ.B #qqq,<ea>
2950: OP_DEF(addq_b)
2951: {
2952: name = "addq";
2953: size = Size::B;
2954: src = make_q8();
2955: dst = make_ea();
2956: }
2957:
2958: // %0101_qqq001_mmmrrr ADDQ.W #qqq,<ea>
2959: // %0101_qqq001_001yyy ADDQ.W #qqq,Ay (.Lと等価)
2960: OP_DEF(addq_w)
2961: {
2962: // ニーモニック上は ADDQ.W #q,Ay を分ける必要はない
2963: name = "addq";
2964: size = Size::W;
2965: src = make_q8();
2966: dst = make_ea();
2967: }
2968:
2969: // %0101_qqq010_mmmrrr ADDQ.L #qqq,<ea>
2970: // %0101_qqq010_001yyy ADDQ.L #qqq,Ay
2971: OP_DEF(addq_l)
2972: {
2973: // ニーモニック上は ADDQ.L #q,Ay を分ける必要はない
2974: name = "addq";
2975: size = Size::L;
2976: src = make_q8();
2977: dst = make_ea();
2978: }
2979:
2980: // Scc/SF のメイン部分。
2981: void
2982: Disasm::ops_scc()
2983: {
2984: uint n = ir[0] & 0x3f;
2985: uint cc = (ir[0] >> 8) & 15;
2986: switch (n) {
2987: case 0x00 ... 0x07: // Scc.B Dn
2988: case 0x10 ... 0x39: // Scc.B <ea>
2989: name = "s";
2990: name += conditions[cc];
2991: size = Size::B;
2992: src = make_ea();
2993: break;
2994: case 0x08 ... 0x0f: // DBcc.W Dy,<label>
2995: if (cc == 1) {
2996: name = "dbra";
2997: } else {
2998: name = "db";
2999: name += conditions[cc];
3000: }
3001: size = Size::W;
3002: src = make_dn(ir[0]);
3003: dst = addr32(pc0 + 2 + (int32)(int16)fetch16());
3004: break;
3005: case 0x3a: // TRAPcc.W #<imm>
3006: name = "trap";
3007: name += conditions[cc];
3008: size = Size::W;
3009: src = imm16();
3010: break;
3011: case 0x3b: // TRAPcc.L #<imm>
3012: name = "trap";
3013: name += conditions[cc];
3014: size = Size::L;
3015: src = imm32();
3016: break;
3017: case 0x3c: // TRAPcc
3018: name = "trap";
3019: name += conditions[cc];
3020: break;
3021:
3022: default:
3023: OP_FUNC(illegal);
3024: break;
3025: }
3026: }
3027:
3028: // %0101_000011_mmmrrr ST.B <ea>
3029: // %0101_000011_001yyy DBT.W Dy,<label>
3030: // %0101_000011_111010 TRAPT.W #<imm>
3031: // %0101_000011_111011 TRAPT.L #<imm>
3032: // %0101_000011_111100 TRAPT
3033: OP_DEF(st)
3034: {
3035: ops_scc();
3036: }
3037:
3038: // %0101_qqq100_mmmrrr SUBQ.B #qqq,<ea>
3039: OP_DEF(subq_b)
3040: {
3041: name = "subq";
3042: size = Size::B;
3043: src = make_q8();
3044: dst = make_ea();
3045: }
3046:
3047: // %0101_qqq101_mmmrrr SUBQ.W #qqq,<ea>
3048: // %0101_qqq101_001yyy SUBQ.W #qqq,Ay (.Lと等価)
3049: OP_DEF(subq_w)
3050: {
3051: // ニーモニック上は SUBQ.W #q,Ay を分ける必要はない
3052: name = "subq";
3053: size = Size::W;
3054: src = make_q8();
3055: dst = make_ea();
3056: }
3057:
3058: // %0101_qqq110_mmmrrr SUBQ.L #qqq,<ea>
3059: // %0101_qqq110_001yyy SUBQ.L #qqq,Ay
3060: OP_DEF(subq_l)
3061: {
3062: // ニーモニック上は SUBQ.L #q,Ay を分ける必要はない
3063: name = "subq";
3064: size = Size::L;
3065: src = make_q8();
3066: dst = make_ea();
3067: }
3068:
3069: // %0101_000111_mmmrrr SF.B <ea>
3070: // %0101_000111_001yyy DBRA.W Dy,<label>
3071: // %0101_000111_111010 TRAPF.W #<imm>
3072: // %0101_000111_111011 TRAPF.L #<imm>
3073: // %0101_000111_111100 TRAPF
3074: OP_DEF(sf)
3075: {
3076: ops_scc();
3077: }
3078:
3079: // %0101_001011_mmmrrr SHI.B <ea>
3080: // %0101_001011_001yyy DBHI.W Dy,<label>
3081: // %0101_001011_111010 TRAPHI.W #<imm>
3082: // %0101_001011_111011 TRAPHI.L #<imm>
3083: // %0101_001011_111100 TRAPHI
3084: OP_DEF(shi)
3085: {
3086: ops_scc();
3087: }
3088:
3089: // %0101_001111_mmmrrr SLS.B <ea>
3090: // %0101_001111_001yyy DBLS.W Dy,<label>
3091: // %0101_001111_111010 TRAPLS.W #<imm>
3092: // %0101_001111_111011 TRAPLS.L #<imm>
3093: // %0101_001111_111100 TRAPLS
3094: OP_DEF(sls)
3095: {
3096: ops_scc();
3097: }
3098:
3099: // %0101_010011_mmmrrr SCC.B <ea>
3100: // %0101_010011_001yyy DBCC.W Dy,<label>
3101: // %0101_010011_111010 TRAPCC.W #<imm>
3102: // %0101_010011_111011 TRAPCC.L #<imm>
3103: // %0101_010011_111100 TRAPCC
3104: OP_DEF(scc)
3105: {
3106: ops_scc();
3107: }
3108:
3109: // %0101_010111_mmmrrr SCS.B <ea>
3110: // %0101_010111_001yyy DBCS.W Dy,<label>
3111: // %0101_010111_111010 TRAPCS.W #<imm>
3112: // %0101_010111_111011 TRAPCS.L #<imm>
3113: // %0101_010111_111100 TRAPCS
3114: OP_DEF(scs)
3115: {
3116: ops_scc();
3117: }
3118:
3119: // %0101_011011_mmmrrr SNE.B <ea>
3120: // %0101_011011_001yyy DBNE.W Dy,<label>
3121: // %0101_011011_111010 TRAPNE.W #<imm>
3122: // %0101_011011_111011 TRAPNE.L #<imm>
3123: // %0101_011011_111100 TRAPNE
3124: OP_DEF(sne)
3125: {
3126: ops_scc();
3127: }
3128:
3129: // %0101_011111_mmmrrr SEQ.B <ea>
3130: // %0101_011111_001yyy DBEQ.W Dy,<label>
3131: // %0101_011111_111010 TRAPEQ.W #<imm>
3132: // %0101_011111_111011 TRAPEQ.L #<imm>
3133: // %0101_011111_111100 TRAPEQ
3134: OP_DEF(seq)
3135: {
3136: ops_scc();
3137: }
3138:
3139: // %0101_100011_mmmrrr SVC.B <ea>
3140: // %0101_100011_001yyy DBVC.W Dy,<label>
3141: // %0101_100011_111010 TRAPVC.W #<imm>
3142: // %0101_100011_111011 TRAPVC.L #<imm>
3143: // %0101_100011_111100 TRAPVC
3144: OP_DEF(svc)
3145: {
3146: ops_scc();
3147: }
3148:
3149: // %0101_100111_mmmrrr SVS.B <ea>
3150: // %0101_100111_001yyy DBVS.W Dy,<label>
3151: // %0101_100111_111010 TRAPVS.W #<imm>
3152: // %0101_100111_111011 TRAPVS.L #<imm>
3153: // %0101_100111_111100 TRAPVS
3154: OP_DEF(svs)
3155: {
3156: ops_scc();
3157: }
3158:
3159: // %0101_101011_mmmrrr SPL.B <ea>
3160: // %0101_101011_001yyy DBPL.W Dy,<label>
3161: // %0101_101011_111010 TRAPPL.W #<imm>
3162: // %0101_101011_111011 TRAPPL.L #<imm>
3163: // %0101_101011_111100 TRAPPL
3164: OP_DEF(spl)
3165: {
3166: ops_scc();
3167: }
3168:
3169: // %0101_101111_mmmrrr SMI.B <ea>
3170: // %0101_101111_001yyy DBMI.W Dy,<label>
3171: // %0101_101111_111010 TRAPMI.W #<imm>
3172: // %0101_101111_111011 TRAPMI.L #<imm>
3173: // %0101_101111_111100 TRAPMI
3174: OP_DEF(smi)
3175: {
3176: ops_scc();
3177: }
3178:
3179: // %0101_110011_mmmrrr SGE.B <ea>
3180: // %0101_110011_001yyy DBGE.W Dy,<label>
3181: // %0101_110011_111010 TRAPGE.W #<imm>
3182: // %0101_110011_111011 TRAPGE.L #<imm>
3183: // %0101_110011_111100 TRAPGE
3184: OP_DEF(sge)
3185: {
3186: ops_scc();
3187: }
3188:
3189: // %0101_110111_mmmrrr SLT.B <ea>
3190: // %0101_110111_001yyy DBLT.W Dy,<label>
3191: // %0101_110111_111010 TRAPLT.W #<imm>
3192: // %0101_110111_111011 TRAPLT.L #<imm>
3193: // %0101_110111_111100 TRAPLT
3194: OP_DEF(slt)
3195: {
3196: ops_scc();
3197: }
3198:
3199: // %0101_111011_mmmrrr SGT.B <ea>
3200: // %0101_111011_001yyy DBGT.W Dy,<label>
3201: // %0101_111011_111010 TRAPGT.W #<imm>
3202: // %0101_111011_111011 TRAPGT.L #<imm>
3203: // %0101_111011_111100 TRAPGT
3204: OP_DEF(sgt)
3205: {
3206: ops_scc();
3207: }
3208:
3209: // %0101_111111_mmmrrr SLE.B <ea>
3210: // %0101_111111_001yyy DBLE.W Dy,<label>
3211: // %0101_111111_111010 TRAPLE.W #<imm>
3212: // %0101_111111_111011 TRAPLE.L #<imm>
3213: // %0101_111111_111100 TRAPLE
3214: OP_DEF(sle)
3215: {
3216: ops_scc();
3217: }
3218:
3219:
3220: // BRA/BSR/Bcc の共通部分。
3221: void
3222: Disasm::ops_bcc()
3223: {
3224: uint cond = (ir[0] >> 8) & 0x0f;
3225: uint32 disp = ir[0] & 0xff;
3226:
3227: switch (cond) {
3228: case 0: name = "bra"; break;
3229: case 1: name = "bsr"; break;
3230: default:
3231: name = "b";
3232: name += conditions[cond];
3233: break;
3234: }
3235:
3236: if (disp == 0) {
3237: // Bxx.W <label>
3238: size = Size::W;
3239: disp = (int32)(int16)fetch16();
3240: } else if (disp == 0xff) {
3241: // Bxx.L <label>
3242: size = Size::L;
3243: disp = (int32)fetch32();
3244: } else {
3245: // Bxx.B <label>
3246: size = Size::B;
3247: disp = (int32)(int8)disp;
3248: }
3249: src = addr32(pc0 + 2 + disp);
3250: }
3251:
3252: // %0110_000000_000000 BRA.W <label>
3253: // %0110_0000nn_nnnnnn BRA.B <label>
3254: // %0110_000011_111111 BRA.L <label>
3255: OP_DEF(bra)
3256: {
3257: ops_bcc();
3258: }
3259:
3260: // %0110_000100_000000 BSR.W <label>
3261: // %0110_0001nn_nnnnnn BSR.B <label>
3262: // %0110_000111_111111 BSR.L <label>
3263: OP_DEF(bsr)
3264: {
3265: ops_bcc();
3266: }
3267:
3268: // %0110_001000_000000 BHI.W <label>
3269: // %0110_0010nn_nnnnnn BHI.B <label>
3270: // %0110_001011_111111 BHI.L <label>
3271: OP_DEF(bhi)
3272: {
3273: ops_bcc();
3274: }
3275:
3276: // %0110_001100_000000 BLS.W <label>
3277: // %0110_0011nn_nnnnnn BLS.B <label>
3278: // %0110_001111_111111 BLS.L <label>
3279: OP_DEF(bls)
3280: {
3281: ops_bcc();
3282: }
3283:
3284: // %0110_010000_000000 BCC.W <label>
3285: // %0110_0100nn_nnnnnn BCC.B <label>
3286: // %0110_010011_111111 BCC.L <label>
3287: OP_DEF(bcc)
3288: {
3289: ops_bcc();
3290: }
3291:
3292: // %0110_010100_000000 BCS.W <label>
3293: // %0110_0101nn_nnnnnn BCS.B <label>
3294: // %0110_010111_111111 BCS.L <label>
3295: OP_DEF(bcs)
3296: {
3297: ops_bcc();
3298: }
3299:
3300: // %0110_011000_000000 BNE.W <label>
3301: // %0110_0110nn_nnnnnn BNE.B <label>
3302: // %0110_011011_111111 BNE.L <label>
3303: OP_DEF(bne)
3304: {
3305: ops_bcc();
3306: }
3307:
3308: // %0110_011100_000000 BEQ.W <label>
3309: // %0110_0111nn_nnnnnn BEQ.B <label>
3310: // %0110_011111_111111 BEQ.L <label>
3311: OP_DEF(beq)
3312: {
3313: ops_bcc();
3314: }
3315:
3316: // %0110_100000_000000 BVC.W <label>
3317: // %0110_1000nn_nnnnnn BVC.B <label>
3318: // %0110_100011_111111 BVC.L <label>
3319: OP_DEF(bvc)
3320: {
3321: ops_bcc();
3322: }
3323:
3324: // %0110_100100_000000 BVS.W <label>
3325: // %0110_1001nn_nnnnnn BVS.B <label>
3326: // %0110_100111_111111 BVS.L <label>
3327: OP_DEF(bvs)
3328: {
3329: ops_bcc();
3330: }
3331:
3332: // %0110_101000_000000 BPL.W <label>
3333: // %0110_1010nn_nnnnnn BPL.B <label>
3334: // %0110_101011_111111 BPL.L <label>
3335: OP_DEF(bpl)
3336: {
3337: ops_bcc();
3338: }
3339:
3340: // %0110_101100_000000 BMI.W <label>
3341: // %0110_1011nn_nnnnnn BMI.B <label>
3342: // %0110_101111_111111 BMI.L <label>
3343: OP_DEF(bmi)
3344: {
3345: ops_bcc();
3346: }
3347:
3348: // %0110_110000_000000 BGE.W <label>
3349: // %0110_1100nn_nnnnnn BGE.B <label>
3350: // %0110_110011_111111 BGE.L <label>
3351: OP_DEF(bge)
3352: {
3353: ops_bcc();
3354: }
3355:
3356: // %0110_110100_000000 BLT.W <label>
3357: // %0110_1101nn_nnnnnn BLT.B <label>
3358: // %0110_110111_111111 BLT.L <label>
3359: OP_DEF(blt)
3360: {
3361: ops_bcc();
3362: }
3363:
3364: // %0110_111000_000000 BGT.W <label>
3365: // %0110_1110nn_nnnnnn BGT.B <label>
3366: // %0110_111011_111111 BGT.L <label>
3367: OP_DEF(bgt)
3368: {
3369: ops_bcc();
3370: }
3371:
3372: // %0110_111100_000000 BLE.W <label>
3373: // %0110_1111nn_nnnnnn BLE.B <label>
3374: // %0110_111111_111111 BLE.L <label>
3375: OP_DEF(ble)
3376: {
3377: ops_bcc();
3378: }
3379:
3380: // %0111_xxx0nn_nnnnnn MOVEQ.L #<imm>,Dx
3381: OP_DEF(moveq)
3382: {
3383: uint8 val = ir[0] & 0xff;
3384:
3385: // IOCS コールを表示する。XXX 機種判定はまだしてない
3386: // IOCS コールは大抵
3387: // 70NN moveq.l #nn,d0
3388: // 4e4f trap #15
3389: // という命令列になっているので、これを検出する。
3390: uint16 next = peek16();
3391: if (next == 0x4e4f) {
3392: // IOCS コールと確定したら TRAP のワードも取り出しておく
3393: fetch16();
3394: name = "IOCS";
3395: src = x68k_iocscall[(uint)val] ?: "<undefined>";
3396: return;
3397: }
3398:
3399: name = "moveq";
3400: size = Size::L;
3401: // 負数なら 32bit で書いてみるか
3402: if ((val & 0x80)) {
3403: src = "#" + hex32((int32)(int8)val);
3404: } else {
3405: src = "#" + hex8(val);
3406: }
3407: dst = make_dn(ir[0] >> 9);
3408: }
3409:
3410: // %1000_xxx000_mmmrrr OR.B <ea>,Dx
3411: OP_DEF(or_b_ea_dn)
3412: {
3413: name = "or";
3414: size = Size::B;
3415: src = make_ea();
3416: dst = make_dn(ir[0] >> 9);
3417: }
3418:
3419: // %1000_xxx001_mmmrrr OR.W <ea>,Dx
3420: OP_DEF(or_w_ea_dn)
3421: {
3422: name = "or";
3423: size = Size::W;
3424: src = make_ea();
3425: dst = make_dn(ir[0] >> 9);
3426: }
3427:
3428: // %1000_xxx010_mmmrrr OR.L <ea>,Dx
3429: OP_DEF(or_l_ea_dn)
3430: {
3431: name = "or";
3432: size = Size::L;
3433: src = make_ea();
3434: dst = make_dn(ir[0] >> 9);
3435: }
3436:
3437: // %1000_xxx011_mmmrrr DIVU.W <ea>,Dx
3438: OP_DEF(divu_w)
3439: {
3440: name = "divu";
3441: size = Size::W;
3442: src = make_ea();
3443: dst = make_dn(ir[0] >> 9);
3444: }
3445:
3446: // %1000_xxx100_000yyy SBCD.B Dy,Dx
3447: // %1000_xxx100_001yyy SBCD.B -(Ay),-(Ax)
3448: // %1000_xxx100_mmmrrr OR.B Dx,<ea>
3449: OP_DEF(or_b_dn_ea)
3450: {
3451: uint n = ir[0] & 0x3f;
3452: uint x = ir[0] >> 9;
3453:
3454: if (n < 8) {
3455: // SBCD.B Dy,Dx
3456: name = "sbcd";
3457: size = Size::B;
3458: src = make_dn(n);
3459: dst = make_dn(x);
3460: } else if (n < 16) {
3461: // SBCD.B -(Ay),-(An)
3462: name = "sbcd";
3463: size = Size::B;
3464: src = make_anpd(n);
3465: dst = make_anpd(x);
3466: } else {
3467: // OR.B Dx,<ea>
3468: name = "or";
3469: size = Size::B;
3470: src = make_dn(x);
3471: dst = make_ea();
3472: }
3473: }
3474:
3475: // %1000_xxx101_000yyy PACK Dy,Dx,#<imm>
3476: // %1000_xxx101_001yyy PACK -(Ay),-(Ax),#<imm>
3477: // %1000_xxx101_mmmrrr OR.W Dx,<ea>
3478: OP_DEF(or_w_dn_ea)
3479: {
3480: uint n = ir[0] & 0x3f;
3481: uint x = ir[0] >> 9;
3482:
3483: if (n < 8) {
3484: name = "pack";
3485: src = make_dn(n) + "," + make_dn(x);
3486: dst = imm16();
3487: } else if (n < 16) {
3488: name = "pack";
3489: src = make_anpd(n) + "," + make_anpd(x);
3490: dst = imm16();
3491: } else {
3492: // OR.W Dx,<ea>
3493: name = "or";
3494: size = Size::W;
3495: src = make_dn(x);
3496: dst = make_ea();
3497: }
3498: }
3499:
3500: // %1000_xxx110_000yyy UNPK Dy,Dx,#<imm>
3501: // %1000_xxx110_001yyy UNPK -(Ay),-(Ax),#<imm>
3502: // %1000_xxx110_mmmrrr OR.L Dx,<ea>
3503: OP_DEF(or_l_dn_ea)
3504: {
3505: uint n = ir[0] & 0x3f;
3506: uint x = ir[0] >> 9;
3507:
3508: if (n < 8) {
3509: name = "unpk";
3510: src = make_dn(n) + "," + make_dn(x);
3511: dst = imm16();
3512: } else if (n < 16) {
3513: name = "unpk";
3514: src = make_anpd(n) + "," + make_anpd(x);
3515: dst = imm16();
3516: } else {
3517: // OR.L Dx,<ea>
3518: name = "or";
3519: size = Size::L;
3520: src = make_dn(x);
3521: dst = make_ea();
3522: }
3523: }
3524:
3525: // %1000_xxx111_mmmrrr DIVS.W <ea>,Dx
3526: OP_DEF(divs_w)
3527: {
3528: name = "divs";
3529: size = Size::W;
3530: src = make_ea();
3531: dst = make_dn(ir[0] >> 9);
3532: }
3533:
3534: // %1001_xxx000_mmmrrr SUB.B <ea>,Dx
3535: OP_DEF(sub_b_ea_dn)
3536: {
3537: name = "sub";
3538: size = Size::B;
3539: src = make_ea();
3540: dst = make_dn(ir[0] >> 9);
3541: }
3542:
3543: // %1001_xxx001_mmmrrr SUB.W <ea>,Dx
3544: OP_DEF(sub_w_ea_dn)
3545: {
3546: name = "sub";
3547: size = Size::W;
3548: src = make_ea();
3549: dst = make_dn(ir[0] >> 9);
3550: }
3551:
3552: // %1001_xxx010_mmmrrr SUB.L <ea>,Dx
3553: OP_DEF(sub_l_ea_dn)
3554: {
3555: name = "sub";
3556: size = Size::L;
3557: src = make_ea();
3558: dst = make_dn(ir[0] >> 9);
3559: }
3560:
3561: // %1001_xxx011_mmmrrr SUBA.W <ea>,Ax
3562: OP_DEF(suba_w)
3563: {
3564: name = "suba";
3565: size = Size::W;
3566: src = make_ea();
3567: dst = make_an(ir[0] >> 9);
3568: }
3569:
3570: // SUB の共通部分
3571: void
3572: Disasm::ops_sub(Disasm::Size sz)
3573: {
3574: uint n = ir[0] & 0x3f;
3575: uint x = ir[0] >> 9;
3576:
3577: size = sz;
3578: if (n < 8) {
3579: // SUBX.B Dy,Dx
3580: name = "subx";
3581: src = make_dn(n);
3582: dst = make_dn(x);
3583: } else if (n < 16) {
3584: // SUBX.B -(Ay),-(Ax)
3585: name = "subx";
3586: src = make_anpd(n);
3587: dst = make_anpd(x);
3588: } else {
3589: // SUB.B Dx,<ea>
3590: name = "sub";
3591: src = make_dn(x);
3592: dst = make_ea();
3593: }
3594: }
3595:
3596: // %1001_xxx100_000yyy SUBX.B Dy,Dx
3597: // %1001_xxx100_001yyy SUBX.B -(Ay),-(Ax)
3598: // %1001_xxx100_mmmrrr SUB.B Dx,<ea>
3599: OP_DEF(sub_b_dn_ea)
3600: {
3601: ops_sub(Size::B);
3602: }
3603:
3604: // %1001_xxx101_000yyy SUBX.W Dy,Dx
3605: // %1001_xxx101_001yyy SUBX.W -(Ay),-(Ax)
3606: // %1001_xxx101_mmmrrr SUB.W Dx,<ea>
3607: OP_DEF(sub_w_dn_ea)
3608: {
3609: ops_sub(Size::W);
3610: }
3611:
3612: // %1001_xxx110_000yyy SUBX.L Dy,Dx
3613: // %1001_xxx110_001yyy SUBX.L -(Ay),-(Ax)
3614: // %1001_xxx110_mmmrrr SUB.L Dx,<ea>
3615: OP_DEF(sub_l_dn_ea)
3616: {
3617: ops_sub(Size::L);
3618: }
3619:
3620: // %1001_xxx111_mmmrrr SUBA.L <ea>,Ax
3621: OP_DEF(suba_l)
3622: {
3623: name = "suba";
3624: size = Size::L;
3625: src = make_ea();
3626: dst = make_an(ir[0] >> 9);
3627: }
3628:
3629: // %1010_nnnnnn_nnnnnn A-Line
3630: OP_DEF(aline)
3631: {
3632: name = "<unknown A-Line trap>";
3633: }
3634:
3635: // %1011_xxx000_mmmrrr CMP.B <ea>,Dx
3636: OP_DEF(cmp_b)
3637: {
3638: name = "cmp";
3639: size = Size::B;
3640: src = make_ea();
3641: dst = make_dn(ir[0] >> 9);
3642: }
3643:
3644: // %1011_xxx001_mmmrrr CMP.W <ea>,Dx
3645: OP_DEF(cmp_w)
3646: {
3647: name = "cmp";
3648: size = Size::W;
3649: src = make_ea();
3650: dst = make_dn(ir[0] >> 9);
3651: }
3652:
3653: // %1011_xxx010_mmmrrr CMP.L <ea>,Dx
3654: OP_DEF(cmp_l)
3655: {
3656: name = "cmp";
3657: size = Size::L;
3658: src = make_ea();
3659: dst = make_dn(ir[0] >> 9);
3660: }
3661:
3662: // %1011_xxx011_mmmrrr CMPA.W <ea>,Ax
3663: OP_DEF(cmpa_w)
3664: {
3665: name = "cmpa";
3666: size = Size::W;
3667: src = make_ea();
3668: dst = make_an(ir[0] >> 9);
3669: }
3670:
3671: void
3672: Disasm::ops_eor_cmpm(Disasm::Size sz)
3673: {
3674: size = sz;
3675:
3676: uint mm = (ir[0] >> 3) & 7;
3677: if (mm == 1) {
3678: // CMPM.x (Ay)+,(Ax)+
3679: name = "cmpm";
3680: src = make_anpi(ir[0]);
3681: dst = make_anpi(ir[0] >> 9);
3682: } else {
3683: // EOR.x Dx,<ea>
3684: name = "eor";
3685: src = make_dn(ir[0] >> 9);
3686: dst = make_ea();
3687: }
3688: }
3689:
3690: // %1011_xxx100_mmmrrr EOR.B Dx,<ea>
3691: // %1011_xxx100_001yyy CMPM.B (Ay)+,(Ax)+
3692: OP_DEF(eor_b)
3693: {
3694: ops_eor_cmpm(Size::B);
3695: }
3696:
3697: // %1011_xxx101_mmmrrr EOR.W Dx,<ea>
3698: // %1011_xxx101_001yyy CMPM.W (Ay)+,(Ax)+
3699: OP_DEF(eor_w)
3700: {
3701: ops_eor_cmpm(Size::W);
3702: }
3703:
3704: // %1011_xxx110_mmmrrr EOR.L Dx,<ea>
3705: // %1011_xxx110_001yyy CMPM.L (Ay)+,(Ax)+
3706: OP_DEF(eor_l)
3707: {
3708: ops_eor_cmpm(Size::L);
3709: }
3710:
3711: // %1011_xxx111_mmmrrr CMPA.L <ea>,Ax
3712: OP_DEF(cmpa_l)
3713: {
3714: name = "cmpa";
3715: size = Size::L;
3716: src = make_ea();
3717: dst = make_an(ir[0] >> 9);
3718: }
3719:
3720: // %1100_xxx000_mmmrrr AND.B <ea>,Dx
3721: OP_DEF(and_b_ea_dn)
3722: {
3723: name = "and";
3724: size = Size::B;
3725: src = make_ea();
3726: dst = make_dn(ir[0] >> 9);
3727: }
3728:
3729: // %1100_xxx001_mmmrrr AND.W <ea>,Dx
3730: OP_DEF(and_w_ea_dn)
3731: {
3732: name = "and";
3733: size = Size::W;
3734: src = make_ea();
3735: dst = make_dn(ir[0] >> 9);
3736: }
3737:
3738: // %1100_xxx010_mmmrrr AND.L <ea>,Dx
3739: OP_DEF(and_l_ea_dn)
3740: {
3741: name = "and";
3742: size = Size::L;
3743: src = make_ea();
3744: dst = make_dn(ir[0] >> 9);
3745: }
3746:
3747: // %1100_xxx011_mmmrrr MULU.W <ea>,Dx
3748: OP_DEF(mulu_w)
3749: {
3750: name = "mulu";
3751: size = Size::W;
3752: src = make_ea();
3753: dst = make_dn(ir[0] >> 9);
3754: }
3755:
3756: // %1100_xxx100_000yyy ABCD.B Dy,Dx
3757: // %1100_xxx100_001yyy ABCD.B -(Ay),-(Ax)
3758: // %1100_xxx100_mmmrrr AND.B Dx,<ea>
3759: OP_DEF(and_b_dn_ea)
3760: {
3761: uint n = ir[0] & 0x3f;
3762: uint x = ir[0] >> 9;
3763:
3764: if (n < 8) {
3765: // ABCD.B Dy,Dx
3766: name = "abcd";
3767: size = Size::B;
3768: src = make_dn(n);
3769: dst = make_dn(x);
3770: } else if (n < 16) {
3771: // ABCD.B -(Ay),-(Ax)
3772: name = "abcd";
3773: size = Size::B;
3774: src = make_anpd(n);
3775: dst = make_anpd(x);
3776: } else {
3777: // AND.B Dx,<ea>
3778: name = "and";
3779: size = Size::B;
3780: src = make_dn(x);
3781: dst = make_ea();
3782: }
3783: }
3784:
3785: // %1100_xxx101_000yyy EXG.L Dx,Dy
3786: // %1100_xxx101_001yyy EXG.L Ax,Ay
3787: // %1100_xxx101_mmmrrr AND.W Dx,<ea>
3788: OP_DEF(and_w_dn_ea)
3789: {
3790: uint n = ir[0] & 0x3f;
3791: uint x = ir[0] >> 9;
3792:
3793: if (n < 8) {
3794: // EXG.L Dx,Dy
3795: name = "exg";
3796: size = Size::L;
3797: src = make_dn(x);
3798: dst = make_dn(n);
3799: } else if (n < 16) {
3800: // EXG.L Ax,Ay
3801: name = "exg";
3802: size = Size::L;
3803: src = make_an(x);
3804: dst = make_an(n);
3805: } else {
3806: // AND.W Dx,<ea>
3807: name = "and";
3808: size = Size::W;
3809: src = make_dn(x);
3810: dst = make_ea();
3811: }
3812: }
3813:
3814: // %1100_xxx110_001yyy EXG.L Dx,Ay
3815: // %1100_xxx110_mmmrrr AND.L Dx,<ea>
3816: OP_DEF(and_l_dn_ea)
3817: {
3818: uint mm = (ir[0] >> 3) & 7;
3819:
3820: if (mm == 1) {
3821: // EXG.L Dx,Ay
3822: name = "exg";
3823: size = Size::L;
3824: src = make_dn(ir[0] >> 9);
3825: dst = make_an(ir[0]);
3826: } else {
3827: // AND.L Dx,<ea>
3828: name = "and";
3829: size = Size::L;
3830: src = make_dn(ir[0] >> 9);
3831: dst = make_ea();
3832: }
3833: }
3834:
3835: // %1100_xxx111_mmmrrr MULS.W <ea>,Dx
3836: OP_DEF(muls_w)
3837: {
3838: name = "muls";
3839: size = Size::W;
3840: src = make_ea();
3841: dst = make_dn(ir[0] >> 9);
3842: }
3843:
3844: // %1101_xxx000_mmmrrr ADD.B <ea>,Dx
3845: OP_DEF(add_b_ea_dn)
3846: {
3847: name = "add";
3848: size = Size::B;
3849: src = make_ea();
3850: dst = make_dn(ir[0] >> 9);
3851: }
3852:
3853: // %1101_xxx001_mmmrrr ADD.W <ea>,Dx
3854: OP_DEF(add_w_ea_dn)
3855: {
3856: name = "add";
3857: size = Size::W;
3858: src = make_ea();
3859: dst = make_dn(ir[0] >> 9);
3860: }
3861:
3862: // %1101_xxx010_mmmrrr ADD.L <ea>,Dx
3863: OP_DEF(add_l_ea_dn)
3864: {
3865: name = "add";
3866: size = Size::L;
3867: src = make_ea();
3868: dst = make_dn(ir[0] >> 9);
3869: }
3870:
3871: // %1101_xxx011_mmmrrr ADDA.W <ea>,Ax
3872: OP_DEF(adda_w)
3873: {
3874: name = "adda";
3875: size = Size::W;
3876: src = make_ea();
3877: dst = make_an(ir[0] >> 9);
3878: }
3879:
3880: // ADD の共通部分
3881: void
3882: Disasm::ops_add(Disasm::Size sz)
3883: {
3884: uint n = ir[0] & 0x3f;
3885: uint x = ir[0] >> 9;
3886:
3887: size = sz;
3888: if (n < 8) {
3889: // ADDX.B Dy,Dx
3890: name = "addx";
3891: src = make_dn(n);
3892: dst = make_dn(x);
3893: } else if (n < 16) {
3894: // ADDX.B -(Ay),-(Ax)
3895: name = "addx";
3896: src = make_anpd(n);
3897: dst = make_anpd(x);
3898: } else {
3899: // ADD.B Dx,<ea>
3900: name = "add";
3901: src = make_dn(x);
3902: dst = make_ea();
3903: }
3904: }
3905:
3906: // %1101_xxx100_000yyy ADDX.B Dy,Dx
3907: // %1101_xxx100_001yyy ADDX.B -(Ay),-(Ax)
3908: // %1101_xxx100_mmmrrr ADD.B Dx,<ea>
3909: OP_DEF(add_b_dn_ea)
3910: {
3911: ops_add(Size::B);
3912: }
3913:
3914: // %1101_xxx101_000yyy ADDX.W Dy,Dx
3915: // %1101_xxx101_001yyy ADDX.W -(Ay),-(Ax)
3916: // %1101_xxx101_mmmrrr ADD.W Dx,<ea>
3917: OP_DEF(add_w_dn_ea)
3918: {
3919: ops_add(Size::W);
3920: }
3921:
3922: // %1101_xxx110_000yyy ADDX.L Dy,Dx
3923: // %1101_xxx110_001yyy ADDX.L -(Ay),-(Ax)
3924: // %1101_xxx110_mmmrrr ADD.L Dx,<ea>
3925: OP_DEF(add_l_dn_ea)
3926: {
3927: ops_add(Size::L);
3928: }
3929:
3930: // %1101_xxx111_mmmrrr ADDA.L <ea>,Ax
3931: OP_DEF(adda_l)
3932: {
3933: name = "adda";
3934: size = Size::L;
3935: src = make_ea();
3936: dst = make_an(ir[0] >> 9);
3937: }
3938:
3939: // シフト・ローテート系の共通部分
3940: void
3941: Disasm::ops_rotate(std::string dir, Disasm::Size sz)
3942: {
3943: uint xx = ir[0] >> 9;
3944: uint mm = (ir[0] >> 3) & 7;
3945:
3946: size = sz;
3947: dst = make_dn(ir[0]);
3948: switch (mm) {
3949: case 0: // AS* #qqq,Dy
3950: name = "as" + dir;
3951: src = make_q8();
3952: break;
3953: case 1: // LS* #qqq,Dy
3954: name = "ls" + dir;
3955: src = make_q8();
3956: break;
3957: case 2: // ROX* #qqq,Dy
3958: name = "rox" + dir;
3959: src = make_q8();
3960: break;
3961: case 3: // RO* #qqq,Dy
3962: name = "ro" + dir;
3963: src = make_q8();
3964: break;
3965: case 4: // AS* Dx,Dy
3966: name = "as" + dir;
3967: src = make_dn(xx);
3968: break;
3969: case 5: // LS* Dx,Dy
3970: name = "ls" + dir;
3971: src = make_dn(xx);
3972: break;
3973: case 6: // ROX* Dx,Dy
3974: name = "rox" + dir;
3975: src = make_dn(xx);
3976: break;
3977: case 7: // RO* Dx,Dy
3978: name = "ro" + dir;
3979: src = make_dn(xx);
3980: break;
3981: default:
3982: __unreachable();
3983: }
3984: }
3985:
3986: // %1110_qqq000_000yyy ASR.B #qqq,Dy
3987: // %1110_qqq000_001yyy LSR.B #qqq,Dy
3988: // %1110_qqq000_010yyy ROXR.B #qqq,Dy
3989: // %1110_qqq000_011yyy ROR.B #qqq,Dy
3990: // %1110_xxx000_100yyy ASR.B Dx,Dy
3991: // %1110_xxx000_101yyy LSR.B Dx,Dy
3992: // %1110_xxx000_110yyy ROXR.B Dx,Dy
3993: // %1110_xxx000_111yyy ROR.B Dx,Dy
3994: OP_DEF(asr_b_imm)
3995: {
3996: ops_rotate("r", Size::B);
3997: }
3998:
3999: // %1110_qqq001_000yyy ASR.W #qqq,Dy
4000: // %1110_qqq001_001yyy LSR.W #qqq,Dy
4001: // %1110_qqq001_010yyy ROXR.W #qqq,Dy
4002: // %1110_qqq001_011yyy ROR.W #qqq,Dy
4003: // %1110_xxx001_100yyy ASR.W Dx,Dy
4004: // %1110_xxx001_101yyy LSR.W Dx,Dy
4005: // %1110_xxx001_110yyy ROXR.W Dx,Dy
4006: // %1110_xxx001_111yyy ROR.W Dx,Dy
4007: OP_DEF(asr_w_imm)
4008: {
4009: ops_rotate("r", Size::W);
4010: }
4011:
4012: // %1110_qqq010_000yyy ASR.L #qqq,Dy
4013: // %1110_qqq010_001yyy LSR.L #qqq,Dy
4014: // %1110_qqq010_010yyy ROXR.L #qqq,Dy
4015: // %1110_qqq010_011yyy ROR.L #qqq,Dy
4016: // %1110_xxx010_100yyy ASR.L Dx,Dy
4017: // %1110_xxx010_101yyy LSR.L Dx,Dy
4018: // %1110_xxx010_110yyy ROXR.L Dx,Dy
4019: // %1110_xxx010_111yyy ROR.L Dx,Dy
4020: OP_DEF(asr_l_imm)
4021: {
4022: ops_rotate("r", Size::L);
4023: }
4024:
4025: // %1110_000011_mmmrrr ASR.W <ea>
4026: OP_DEF(asr_w)
4027: {
4028: name = "asr";
4029: size = Size::W;
4030: src = make_ea();
4031: }
4032:
4033: // %1110_qqq100_000yyy ASL.B #qqq,Dy
4034: // %1110_qqq100_001yyy LSL.B #qqq,Dy
4035: // %1110_qqq100_010yyy ROXL.B #qqq,Dy
4036: // %1110_qqq100_011yyy ROL.B #qqq,Dy
4037: // %1110_xxx100_100yyy ASL.B Dx,Dy
4038: // %1110_xxx100_101yyy LSL.B Dx,Dy
4039: // %1110_xxx100_110yyy ROXL.B Dx,Dy
4040: // %1110_xxx100_111yyy ROL.B Dx,Dy
4041: OP_DEF(asl_b_imm)
4042: {
4043: ops_rotate("l", Size::B);
4044: }
4045:
4046: // %1110_qqq101_000yyy ASL.W #qqq,Dy
4047: // %1110_qqq101_001yyy LSL.W #qqq,Dy
4048: // %1110_qqq101_010yyy ROXL.W #qqq,Dy
4049: // %1110_qqq101_011yyy ROL.W #qqq,Dy
4050: // %1110_xxx101_100yyy ASL.W Dx,Dy
4051: // %1110_xxx101_101yyy LSL.W Dx,Dy
4052: // %1110_xxx101_110yyy ROXL.W Dx,Dy
4053: // %1110_xxx101_111yyy ROL.W Dx,Dy
4054: OP_DEF(asl_w_imm)
4055: {
4056: ops_rotate("l", Size::W);
4057: }
4058:
4059: // %1110_qqq110_000yyy ASL.L #qqq,Dy
4060: // %1110_qqq110_001yyy LSL.L #qqq,Dy
4061: // %1110_qqq110_010yyy ROXL.L #qqq,Dy
4062: // %1110_qqq110_011yyy ROL.L #qqq,Dy
4063: // %1110_xxx110_100yyy ASL.L Dx,Dy
4064: // %1110_xxx110_101yyy LSL.L Dx,Dy
4065: // %1110_xxx110_110yyy ROXL.L Dx,Dy
4066: // %1110_xxx110_111yyy ROL.L Dx,Dy
4067: OP_DEF(asl_l_imm)
4068: {
4069: ops_rotate("l", Size::L);
4070: }
4071:
4072: // %1110_000111_mmmrrr ASL.W <ea>
4073: OP_DEF(asl_w)
4074: {
4075: name = "asl";
4076: size = Size::W;
4077: src = make_ea();
4078: }
4079:
4080: // %1110_001011_mmmrrr LSR.W <ea>
4081: OP_DEF(lsr_w)
4082: {
4083: name = "lsr";
4084: size = Size::W;
4085: src = make_ea();
4086: }
4087:
4088: // %1110_001111_mmmrrr LSL.W <ea>
4089: OP_DEF(lsl_w)
4090: {
4091: name = "lsl";
4092: size = Size::W;
4093: src = make_ea();
4094: }
4095:
4096: // %1110_010011_mmmrrr ROXR.W <ea>
4097: OP_DEF(roxr_w)
4098: {
4099: name = "roxr";
4100: size = Size::W;
4101: src = make_ea();
4102: }
4103:
4104: // %1110_010111_mmmrrr ROXL.W <ea>
4105: OP_DEF(roxl_w)
4106: {
4107: name = "roxl";
4108: size = Size::W;
4109: src = make_ea();
4110: }
4111:
4112: // %1110_011011_mmmrrr ROR.W <ea>
4113: OP_DEF(ror_w)
4114: {
4115: name = "ror";
4116: size = Size::W;
4117: src = make_ea();
4118: }
4119:
4120: // %1110_011111_mmmrrr ROL.W <ea>
4121: OP_DEF(rol_w)
4122: {
4123: name = "rol";
4124: size = Size::W;
4125: src = make_ea();
4126: }
4127:
4128: // %1110_100011_mmmrrr BFTST <ea>{#o:#w}
4129: OP_DEF(bftst)
4130: {
4131: fetch16();
4132: name = "bftst";
4133: src = make_ea() + make_bf();
4134: }
4135:
4136: // %1110_100111_mmmrrr BFEXTU <ea>{#o:#w},Dn
4137: OP_DEF(bfextu)
4138: {
4139: fetch16();
4140: name = "bfextu";
4141: src = make_ea() + make_bf();
4142: dst = make_dn(ir[1] >> 12);
4143: }
4144:
4145: // %1110_101011_mmmrrr BFCHG <ea>{#o:#w}
4146: OP_DEF(bfchg)
4147: {
4148: fetch16();
4149: name = "bfchg";
4150: src = make_ea() + make_bf();
4151: }
4152:
4153: // %1110_101111_mmmrrr BFEXTS <ea>{#o:#w},Dn
4154: OP_DEF(bfexts)
4155: {
4156: fetch16();
4157: name = "bfexts";
4158: src = make_ea() + make_bf();
4159: dst = make_dn(ir[1] >> 12);
4160: }
4161:
4162: // %1110_110011_mmmrrr BFCLR <ea>{#o:#w}
4163: OP_DEF(bfclr)
4164: {
4165: fetch16();
4166: name = "bfclr";
4167: src = make_ea() + make_bf();
4168: }
4169:
4170: // %1110_110111_mmmrrr BFFFO <ea>{#o:#w},Dn
4171: OP_DEF(bfffo)
4172: {
4173: fetch16();
4174: name = "bfffo";
4175: src = make_ea() + make_bf();
4176: dst = make_dn(ir[1] >> 12);
4177: }
4178:
4179: // %1110_111011_mmmrrr BFSET <ea>{#o:#w}
4180: OP_DEF(bfset)
4181: {
4182: fetch16();
4183: name = "bfset";
4184: src = make_ea() + make_bf();
4185: }
4186:
4187: // %1110_111111_mmmrrr BFINS Dn,<ea>{#o:#w}
4188: OP_DEF(bfins)
4189: {
4190: fetch16();
4191: name = "bfins";
4192: dst = make_ea() + make_bf();
4193: src = make_dn(ir[1] >> 12);
4194: }
4195:
4196: // PMOVE* の共通部分
4197: void
4198: Disasm::ops_pmove(Reg reg, Disasm::Size sz)
4199: {
4200: if ((ir[1] & 0x0100) == 0) {
4201: name = "pmove";
4202: } else {
4203: name = "pmovefd";
4204: }
4205: size = sz;
4206: if ((ir[1] & 0x0200) == 0) {
4207: src = make_ea();
4208: dst = make_reg(reg);
4209: } else {
4210: src = make_reg(reg);
4211: dst = make_ea();
4212: }
4213: }
4214:
4215: // %1111_000nnn_nnnnnn MMU_OP
4216: OP_DEF(mmuop)
4217: {
4218: uint16 ext = fetch16();
4219: switch (ext >> 8) {
4220: case 0x08: // PMOVE.L <ea>,TT0
4221: case 0x09: // PMOVEFD.L <ea>,TT0
4222: case 0x0a: // PMOVE.L TT0,<ea>
4223: ops_pmove(Reg::TT0, Size::L);
4224: break;
4225: case 0x0c: // PMOVE.L <ea>,TT1
4226: case 0x0d: // PMOVEFD.L <ea>,TT1
4227: case 0x0e: // PMOVE.L TT1,<ea>
4228: ops_pmove(Reg::TT1, Size::L);
4229: break;
4230: case 0x40: // PMOVE.L <ea>,TC
4231: case 0x41: // PMOVEFD.L <ea>,TC
4232: case 0x42: // PMOVE.L TC,<ea>
4233: ops_pmove(Reg::TC, Size::L);
4234: break;
4235: case 0x48: // PMOVE.Q <ea>,SRP
4236: case 0x49: // PMOVEFD.Q <ea>,SRP
4237: case 0x4a: // PMOVE.Q SRP,<ea>
4238: ops_pmove(Reg::SRP, Size::Q);
4239: break;
4240: case 0x4c: // PMOVE.Q <ea>,CRP
4241: case 0x4d: // PMOVEFD.Q <ea>,CRP
4242: case 0x4e: // PMOVE.Q CRP,<ea>
4243: ops_pmove(Reg::CRP, Size::Q);
4244: break;
4245: case 0x60: // PMOVE.W <ea>,MMUSR
4246: case 0x61: // PMOVEFD.W <ea>,MMUSR
4247: case 0x62: // PMOVE.W MMUSR,<ea>
4248: ops_pmove(Reg::MMUSR, Size::W);
4249: break;
4250:
4251: case 0x20: // PLOADW <fc>,<ea>
4252: case 0x22: // PLOADR <fc>,<ea>
4253: if ((ext & 0x0200) == 0) {
4254: name = "ploadw";
4255: } else {
4256: name = "ploadr";
4257: }
4258: src = make_fc();
4259: dst = make_ea();
4260: break;
4261:
4262: case 0x24: // PFLUSHA
4263: name = "pflusha";
4264: break;
4265:
4266: case 0x38: // PFLUSH <fc>,#<mask>,<ea>
4267: dst = make_ea();
4268: FALLTHROUGH;
4269: case 0x30: // PFLUSH <fc>,#<mask>
4270: name = "pflush";
4271: src = make_fc() + string_format(",#%d", (ir[1] >> 5) & 7);
4272: break;
4273:
4274: case 0x81: // PTESTW <fc>,<ea>,#0,An
4275: case 0x85: // PTESTW <fc>,<ea>,#1,An
4276: case 0x89: // PTESTW <fc>,<ea>,#2,An
4277: case 0x8d: // PTESTW <fc>,<ea>,#3,An
4278: case 0x91: // PTESTW <fc>,<ea>,#4,An
4279: case 0x95: // PTESTW <fc>,<ea>,#5,An
4280: case 0x99: // PTESTW <fc>,<ea>,#6,An
4281: case 0x9d: // PTESTW <fc>,<ea>,#7,An
4282: case 0x83: // PTESTR <fc>,<ea>,#0,An
4283: case 0x87: // PTESTR <fc>,<ea>,#1,An
4284: case 0x8b: // PTESTR <fc>,<ea>,#2,An
4285: case 0x8f: // PTESTR <fc>,<ea>,#3,An
4286: case 0x93: // PTESTR <fc>,<ea>,#4,An
4287: case 0x97: // PTESTR <fc>,<ea>,#5,An
4288: case 0x9b: // PTESTR <fc>,<ea>,#6,An
4289: case 0x9f: // PTESTR <fc>,<ea>,#7,An
4290: dst = make_an(ir[1] >> 5);
4291: FALLTHROUGH;
4292: case 0x80: // PTESTW <fc>,<ea>,#0
4293: case 0x84: // PTESTW <fc>,<ea>,#1
4294: case 0x88: // PTESTW <fc>,<ea>,#2
4295: case 0x8c: // PTESTW <fc>,<ea>,#3
4296: case 0x90: // PTESTW <fc>,<ea>,#4
4297: case 0x94: // PTESTW <fc>,<ea>,#5
4298: case 0x98: // PTESTW <fc>,<ea>,#6
4299: case 0x9c: // PTESTW <fc>,<ea>,#7
4300: case 0x82: // PTESTR <fc>,<ea>,#0
4301: case 0x86: // PTESTR <fc>,<ea>,#1
4302: case 0x8a: // PTESTR <fc>,<ea>,#2
4303: case 0x8e: // PTESTR <fc>,<ea>,#3
4304: case 0x92: // PTESTR <fc>,<ea>,#4
4305: case 0x96: // PTESTR <fc>,<ea>,#5
4306: case 0x9a: // PTESTR <fc>,<ea>,#6
4307: case 0x9e: // PTESTR <fc>,<ea>,#7
4308: if ((ext & 0x0200) == 0) {
4309: name = "ptestw";
4310: } else {
4311: name = "ptestr";
4312: }
4313: src = make_fc() + "," + make_ea()
4314: + string_format(",#%d", (ext >> 10) & 7);
4315: break;
4316:
4317: default:
4318: OP_FUNC(illegal);
4319: break;
4320: }
4321: }
4322:
4323: // %1111_001000_nnnnnn FPGEN
4324: OP_DEF(fpgen)
4325: {
4326: uint16 ext = fetch16();
4327:
4328: switch (ext >> 13) {
4329: case 0:
4330: ops_fpgen_fpn_fpn();
4331: break;
4332: case 2:
4333: ops_fpgen_ea_fpn();
4334: break;
4335: case 3:
4336: ops_fmove_fpn_ea();
4337: break;
4338: case 4:
4339: ops_fmovem_ea_ctl();
4340: break;
4341: case 5:
4342: ops_fmovem_ctl_ea();
4343: break;
4344: case 6:
4345: ops_fmovem_ea_fpn();
4346: break;
4347: case 7:
4348: ops_fmovem_fpn_ea();
4349: break;
4350: }
4351: }
4352:
4353: // FPgen <fpn>,<fpn>
4354: void
4355: Disasm::ops_fpgen_fpn_fpn()
4356: {
4357: uint sn = (ir[1] >> 10) & 7;
4358: uint dn = (ir[1] >> 7) & 7;
4359: uint mode = ir[1] & 0x7f;
4360:
4361: // FSINCOS だけ形式が違うので先に処理
4362: if (0x30 <= mode && mode < 0x38) {
4363: name = "fsincos";
4364: size = Size::X;
4365: src = make_fpn(sn);
4366: dst = make_fpn(ir[1]) + ":" + make_fpn(dn);
4367: return;
4368: }
4369:
4370: // FSINCOS 以外は全部同じ書式
4371: name = fpgen_names[mode];
4372: if (name.empty()) {
4373: OP_FUNC(illegal);
4374: return;
4375: }
4376: size = Size::X;
4377: src = make_fpn(sn);
4378: // FSIN FPm,FPm のように src, dst が同じ場合は FSIN FPm と書くが、
4379: // FMOVE FPm,FPm は src, dst が同じであっても FMOVE FPm,FPm と表記する。
4380: if (mode == 0x00/*FMOVE*/ || sn != dn) {
4381: dst = make_fpn(dn);
4382: }
4383: }
4384:
4385: // FPgen <ea>,<reg>
4386: void
4387: Disasm::ops_fpgen_ea_fpn()
4388: {
4389: uint sz = (ir[1] >> 10) & 7;
4390: uint dn = (ir[1] >> 7) & 7;
4391: uint mode = ir[1] & 0x7f;
4392:
4393: if (sz == 7) {
4394: // ここに FMOVECR
4395: ops_fmovecr();
4396: return;
4397: }
4398:
4399: name = fpgen_names[mode];
4400: if (name.empty()) {
4401: OP_FUNC(illegal);
4402: return;
4403: }
4404: size = (Size)sz;
4405: src = make_ea();
4406: dst = make_fpn(dn);
4407: }
4408:
4409: // FMOVECR
4410: void
4411: Disasm::ops_fmovecr()
4412: {
4413: uint dn = (ir[1] >> 7) & 7;
4414: uint offset = ir[1] & 0x7f;
4415: std::string text;
4416:
4417: name = "fmovecr";
4418: size = Size::X;
4419: src = "#" + hex8(offset);
4420: // 定数だけじゃ分かりづらいので内容も表示も表示してみるのはどうか。
4421: switch (offset) {
4422: case 0:
4423: src += "<pi>";
4424: break;
4425: case 0x0b ... 0x0f:
4426: src += fmovecr_text[offset - 0x0b];
4427: break;
4428: case 0x30 ... 0x3f:
4429: src += fmovecr_text[offset - 0x30 + 5];
4430: break;
4431: default:
4432: break;
4433: }
4434: dst = make_fpn(dn);
4435: }
4436:
4437: // FMOVE <fpn>,<ea>
4438: void
4439: Disasm::ops_fmove_fpn_ea()
4440: {
4441: uint sz = (ir[1] >> 10) & 7;
4442: uint sn = (ir[1] >> 7) & 7;
4443: uint mode = ir[1] & 0x7f;
4444:
4445: name = "fmove";
4446: size = (Size)sz;
4447: src = make_fpn(sn);
4448: dst = make_ea();
4449: if (sz == Size::P) {
4450: // static k-factor
4451: int k;
4452: // 7bit (符号なし)数を符号付き数に変える
4453: if ((mode & 0x40)) {
4454: k = (int8)(mode | 0x80);
4455: } else {
4456: k = mode;
4457: }
4458: dst += string_format("{#%d}", k);
4459: } else if (sz == Size::Pk) {
4460: // dynamic k-factor
4461: dst += "{" + make_dn(mode >> 4) + "}";
4462: }
4463: }
4464:
4465: void
4466: Disasm::ops_fmovem_ea_ctl()
4467: {
4468: uint n;
4469:
4470: n = make_fpctls(dst);
4471: if (n == 1) {
4472: name = "fmove";
4473: } else {
4474: name = "fmovem";
4475: }
4476: size = Size::L;
4477:
4478: src = make_ea();
4479: // #imm が複数ある場合
4480: if ((ir[0] & 0x3f) == 0x3c && n > 1) {
4481: for (int i = 1; i < n; i++) {
4482: src += "/";
4483: src += imm32();
4484: }
4485: }
4486: }
4487:
4488: void
4489: Disasm::ops_fmovem_ctl_ea()
4490: {
4491: uint n;
4492:
4493: n = make_fpctls(src);
4494: if (n == 1) {
4495: name = "fmove";
4496: } else {
4497: name = "fmovem";
4498: }
4499: size = Size::L;
4500: dst = make_ea();
4501: }
4502:
4503: void
4504: Disasm::ops_fmovem_ea_fpn()
4505: {
4506: name = "fmovem";
4507: size = Size::X;
4508: src = make_ea();
4509: if ((ir[1] & 0x1800) == 0x1800) {
4510: // dynamic list
4511: dst = make_dn(ir[1] >> 4);
4512: } else {
4513: dst = make_fpnlist();
4514: }
4515: }
4516:
4517: void
4518: Disasm::ops_fmovem_fpn_ea()
4519: {
4520: name = "fmovem";
4521: size = Size::X;
4522: if ((ir[1] & 0x1800) == 0x1800) {
4523: // dynamic list
4524: src = make_dn(ir[1] >> 4);
4525: } else {
4526: src = make_fpnlist();
4527: }
4528: dst = make_ea();
4529: }
4530:
4531: // %1111_001001_nnnnnn FScc.B <ea>
4532: // %1111_001001_001yyy FDBcc Dy,<label>
4533: // %1111_001001_111010 FTRAPcc.W #<imm>
4534: // %1111_001001_111011 FTRAPcc.L #<imm>
4535: // %1111_001001_111100 FTRAPcc
4536: OP_DEF(fxcc)
4537: {
4538: uint n = ir[0] & 0x3f;
4539:
4540: fetch16();
4541: switch (n) {
4542: case 0x00 ... 0x07: // FScc
4543: case 0x10 ... 0x39:
4544: name = "fs" + make_fpcc(ir[1]);
4545: size = Size::B;
4546: src = make_ea();
4547: break;
4548: case 0x08 ... 0x0f: // FDBcc
4549: name = "fdb" + make_fpcc(ir[1]);
4550: src = make_dn(ir[0]);
4551: dst = addr32(pc0 + 2 + (int32)(int16)fetch16());
4552: break;
4553: case 0x3a: // FTRAPcc.W #<imm>
4554: name = "ftrap" + make_fpcc(ir[1]);
4555: size = Size::W;
4556: src = imm16();
4557: break;
4558: case 0x3b: // FTRAPcc.L #<imm>
4559: name = "ftrap" + make_fpcc(ir[1]);
4560: size = Size::L;
4561: src = imm32();
4562: break;
4563: case 0x3c: // FTRAPcc
4564: name = "ftrap" + make_fpcc(ir[1]);
4565: break;
4566: default:
4567: OP_FUNC(illegal);
4568: break;
4569: }
4570: }
4571:
4572: // %1111_001010_nnnnnn FBcc.W <label>
4573: OP_DEF(fbcc_w)
4574: {
4575: int32 disp = (int32)(int16)fetch16();
4576:
4577: if ((ir[0] & 0x3f) == 0 && disp == 0) {
4578: // FBF.W +$0000 のみ FNOP
4579: name = "fnop";
4580: return;
4581: }
4582: name = "fb" + make_fpcc(ir[0]);
4583: size = Size::W;
4584: src = addr32(pc0 + 2 + disp);
4585: }
4586:
4587: // %1111_001011_nnnnnn FBcc.L <label>
4588: OP_DEF(fbcc_l)
4589: {
4590: name = "fb" + make_fpcc(ir[0]);
4591: size = Size::L;
4592: src = addr32(pc0 + 2 + (int32)fetch32());
4593: }
4594:
4595: // %1111_001100_nnnnnn FSAVE <ea>
4596: OP_DEF(fsave)
4597: {
4598: name = "fsave";
4599: src = make_ea();
4600: }
4601:
4602: // %1111_001101_nnnnnn FRESTORE <ea>
4603: OP_DEF(frestore)
4604: {
4605: name = "frestore";
4606: src = make_ea();
4607: }
4608:
4609: // %1111_nnnnnn_nnnnnn F-Line
4610: OP_DEF(fline)
4611: {
4612: // XXX x68k/Human68k 判定するか
4613: if ((ir[0] & 0xff00) == 0xff00) {
4614: uint dosno = ir[0] & 0xff;
4615: name = "DOS";
4616: src = x68k_doscall[dosno] ?: "<undefined>";
4617: } else if ((ir[0] & 0xff00) == 0xfe00) {
4618: uint n = ir[0] & 0xff;
4619: name = "FPACK";
4620: src = x68k_fpcall[n] ?: "<undefined>";
4621: } else {
4622: name = "<unknown F-Line trap>";
4623: }
4624: }
4625:
4626: // illegal instructions
4627: OP_DEF(illegal)
4628: {
4629: name = "<illegal instruction>";
4630: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.