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