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