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