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

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

unix.superglobalmegacorp.com

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