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