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

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

unix.superglobalmegacorp.com

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