Annotation of nono/m680x0/m680x0disasm.cpp, revision 1.1.1.4

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

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.