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