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