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