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