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