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