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

1.1       root        1: //
                      2: // nono
1.1.1.2   root        3: // Copyright (C) 2020 nono project
                      4: // Licensed under nono-license.txt
1.1       root        5: //
                      6: 
1.1.1.4 ! root        7: // EA は大別して5種類。
        !             8: //
        !             9: // |d m  rxwp |        制御  CalcCtrl                サイズ不問
        !            10: // |dam+-rxw  |        可変  CalcData                B/W/L
        !            11: // |  m  rxwp |        MMU             CalcMMU                 サイズ不問
        !            12: // |dam+-rxwpi|        FPU             CalcFPU                 B/W/L/S/D/X/P
        !            13: // |d m+-rxwpi|        データ       FetchData               B/W/L
        !            14: // |dam+-rxwpi|        All             FetchAll                B/W/L
        !            15: //
        !            16: // CalcCtrl はユーザーズマニュアルで「制御(Control)」と呼ばれている
        !            17: // グループで、デスティネーション側のため EA の計算のみ。
        !            18: // また (An)+/-(An) を含まないため、サイズに関係なく1種類だけでよい。
        !            19: //
        !            20: // CalcData はユーザーズマニュアルで「可変」と呼ばれているグループで、
        !            21: // デスティネーション側のため EA の計算のみ。B/W/L
        !            22: //
        !            23: // CalcMMU は対 MMU 用に勝手に用意したもの。
        !            24: //
        !            25: // CalcFPU は対 FPU 用。ソースであっても CalcFPU を使用する。
        !            26: // サイズは B/W/L/S/D/X/P。
        !            27: // フェッチサイクルは別途存在するはずだが不詳。
        !            28: //
        !            29: // FetchData はユーザーズマニュアルで「データ(Data)」と呼ばれている
        !            30: // グループで、ソース側のため EA 計算および値の取得。B/W/L
        !            31: //
        !            32: // FetchAll はユーザーズマニュアルのここには記載がないグループで、
        !            33: // ソース側のため EA 計算および値の取得。B/W/L
        !            34: //
        !            35: // CalcCtrl、CalcData でアドレッシングモードに D や A が含まれている場合は
        !            36: // その命令のデスティネーションに Dn、An が指定できるという意味であり、
        !            37: // EA 処理であるここには関係ない。
        !            38: // EA 計算より前に呼出側で条件分けして処理すること。
        !            39: //
        !            40: // CalcCtrl、CalcData と FetchData には (*) 印の例外があるので留意。
        !            41: //
        !            42: // (CalcCtrl)
        !            43: // |  m  rxwp | CMP2/CHK2
        !            44: // |  m  rxwp | JMP/JSR
        !            45: // |  m  rxwp | LEA/PEA
        !            46: // |d m  rxwp | BFEXT*/BFFFO/BFTST
        !            47: // |d m  rxw  | (*) BFCHG/BFCLR/BFINS/BFSET <ea>{#o:#w}
        !            48: //
        !            49: // (CalcData)
        !            50: // |  m+-rxw  | ADD/SUB/CMP Dx,<ea>
        !            51: // |  m+-rxw  | CAS/TAS <ea>
        !            52: // |  m+-rxw  | MOVES <ea>,Rn
        !            53: // |  m+-rxw  | shift/rotate.W <ea>
        !            54: // |  m+-rxw  | BCHG/BCLR/BSET src,<ea>
        !            55: // |d m+-rxw  | ADDI/SUBI Dx,<ea>
        !            56: // |d m+-rwx  | NBCD <ea>
        !            57: // |d m+-rxw  | AND/OR/EOR Dx,<ea>
        !            58: // |d m+-rxw  | CLR/NEG/NEGX/NOT/TST/Scc <ea>
        !            59: // |d m+-rxw  | MOVE CCR/SR,<ea>
        !            60: // |dam+-rxw  | ADDQ/SUBQ #qqq,<ea>
        !            61: // |dam+-rxw  | (*) MOVE の dst 側。EA の分類的には CalcData だが、
        !            62: //              下位6ビットの IR ではないので、cea_data_NN() ではなく
        !            63: //              各々 cea_XXXX() のほうを個別に呼ぶこと。
        !            64: //
        !            65: // (CalcMMU)
        !            66: // |  m  rxw  | MMU
        !            67: //
        !            68: // (CalcFPU)
        !            69: // |d m+-rxw  | FScc.B <ea>
        !            70: // |dam+-rxw  | FMOVE.f FPn,<ea>
        !            71: // |dam+-rxw  | FMOVE.L ctl,<ea>
        !            72: // |dam+-rxw  | FMOVEM.L ctl,<ea>
        !            73: // |d m+-rxwpi| Fgen <ea>,FPn
        !            74: // |d m+-rxwpi| FMOVE.f <ea>,FPn
        !            75: // |dam+-rwxpi| FMOVE.L <ea>,ctl
        !            76: // |dam+-rxwpi| FMOVEM.L <ea>,ctl
        !            77: // 実際にどのアドレッシングモードが有効かどうかは極力個別の命令内で判断する?
        !            78: // ここは実行サイクル数的な分類。
        !            79: //
        !            80: // (FetchData)
        !            81: // |d m+-rxwpi| AND/OR/CHK <ea>,Dn
        !            82: // |d m+-rxwpi| MOVE.B <ea>,dst
        !            83: // |d m+-rxwpi| MOVE <ea>,CCR/SR
        !            84: // |d m+-rxwpi| MUL*/DIV* <ea>,Dn
        !            85: // |d m+-rxwp | (*) TST.B <ea>
        !            86: // |d m+-rxwp | (*) CMPI #<data>,<ea>
        !            87: // |  m+-rxwp | (*) BTST.B #<data>,<ea>
        !            88: // |  m+-rxwpi| (*) BTST.B Dx,<ea>
        !            89: //
        !            90: // (FetchAll)
        !            91: // |dam+-rxwpi| ADD/SUB/CMP <ea>,Dn
        !            92: // |dam+-rxwpi| MOVEA/ADDA/SUBA/CMPA <ea>,An
        !            93: // |dam+-rxwpi| TST.WL <ea>
        !            94: // |dam+-rxwpi| MOVE.WL <ea>,dst
        !            95: //
        !            96: // (たぶん別対応)
        !            97: // |  m -rxw  | MOVEM list,<ea>
        !            98: // |  m -rxw  | FMOVEM.X reg,<ea>
        !            99: // |  m -rxw  | FSAVE <ea>
        !           100: // |  m+ rxwp | MOVEM <ea>,list
        !           101: // |  m+ rxwp | FMOVEM.X <ea>,reg
        !           102: // |  m+ rxwp | FRESTORE <ea>
        !           103: 
        !           104: #include "mpu680x0.h"
        !           105: 
        !           106: //
        !           107: // Calc EA
        !           108: //
        !           109: 
        !           110: uint32
        !           111: MPU680x0Device::cea_anin(int n)
        !           112: {
        !           113:        CYCLE(2);
        !           114:        return internal_ea_anin(n);
        !           115: }
        !           116: 
        !           117: uint32
        !           118: MPU680x0Device::cea_anpi_8(int n)
        !           119: {
        !           120:        CYCLE(2);
        !           121:        return internal_ea_anpi_8(n);
        !           122: }
        !           123: 
        !           124: uint32
        !           125: MPU680x0Device::cea_anpi_16(int n)
        !           126: {
        !           127:        CYCLE(2);
        !           128:        return internal_ea_anpi_16(n);
        !           129: }
        !           130: 
        !           131: uint32
        !           132: MPU680x0Device::cea_anpi_32(int n)
        !           133: {
        !           134:        CYCLE(2);
        !           135:        return internal_ea_anpi_32(n);
        !           136: }
        !           137: 
        !           138: uint32
        !           139: MPU680x0Device::cea_anpd_8(int n)
        !           140: {
        !           141:        CYCLE(2);
        !           142:        return internal_ea_anpd_8(n);
        !           143: }
        !           144: 
        !           145: uint32
        !           146: MPU680x0Device::cea_anpd_16(int n)
        !           147: {
        !           148:        CYCLE(2);
        !           149:        return internal_ea_anpd_16(n);
        !           150: }
        !           151: 
        !           152: uint32
        !           153: MPU680x0Device::cea_anpd_32(int n)
        !           154: {
        !           155:        CYCLE(2);
        !           156:        return internal_ea_anpd_32(n);
        !           157: }
        !           158: 
        !           159: uint32
        !           160: MPU680x0Device::cea_andi(int n)
        !           161: {
        !           162:        CYCLE(2);
        !           163:        return internal_ea_andi(n);
        !           164: }
        !           165: 
        !           166: uint32
        !           167: MPU680x0Device::cea_anix(int n)
        !           168: {
        !           169:        CYCLE(10);      // XXX 4,4-18,20
        !           170:        return internal_ea_anix(n);
        !           171: }
        !           172: 
        !           173: uint32
        !           174: MPU680x0Device::cea_absw()
        !           175: {
        !           176:        CYCLE(2);
        !           177:        return internal_ea_absw();
        !           178: }
        !           179: 
        !           180: uint32
        !           181: MPU680x0Device::cea_absl()
        !           182: {
        !           183:        CYCLE(4);
        !           184:        return internal_ea_absl();
        !           185: }
        !           186: 
        !           187: uint32
        !           188: MPU680x0Device::cea_pcdi()
        !           189: {
        !           190:        CYCLE(2);
        !           191:        return internal_ea_pcdi();
        !           192: }
        !           193: 
        !           194: uint32
        !           195: MPU680x0Device::cea_pcix()
        !           196: {
        !           197:        CYCLE(10);      // XXX 4,4-18,20
        !           198:        return internal_ea_pcix();
        !           199: }
        !           200: 
        !           201: //
        !           202: // Fetch EA
        !           203: //
        !           204: 
        !           205: inline uint32
        !           206: MPU680x0Device::fea_anin()
        !           207: {
        !           208:        CYCLE(3);
        !           209:        return internal_ea_anin(eanum(ir));
        !           210: }
        !           211: 
        !           212: inline uint32
        !           213: MPU680x0Device::fea_anpi_8()
        !           214: {
        !           215:        CYCLE(3);
        !           216:        return internal_ea_anpi_8(eanum(ir));
        !           217: }
        !           218: 
        !           219: inline uint32
        !           220: MPU680x0Device::fea_anpi_16()
        !           221: {
        !           222:        CYCLE(3);
        !           223:        return internal_ea_anpi_16(eanum(ir));
        !           224: }
        !           225: 
        !           226: inline uint32
        !           227: MPU680x0Device::fea_anpi_32()
        !           228: {
        !           229:        CYCLE(3);
        !           230:        return internal_ea_anpi_32(eanum(ir));
        !           231: }
        !           232: 
        !           233: inline uint32
        !           234: MPU680x0Device::fea_anpd_8()
        !           235: {
        !           236:        CYCLE(4);
        !           237:        return internal_ea_anpd_8(eanum(ir));
        !           238: }
        !           239: 
        !           240: inline uint32
        !           241: MPU680x0Device::fea_anpd_16()
        !           242: {
        !           243:        CYCLE(4);
        !           244:        return internal_ea_anpd_16(eanum(ir));
        !           245: }
        !           246: 
        !           247: inline uint32
        !           248: MPU680x0Device::fea_anpd_32()
        !           249: {
        !           250:        CYCLE(4);
        !           251:        return internal_ea_anpd_32(eanum(ir));
        !           252: }
        !           253: 
        !           254: inline uint32
        !           255: MPU680x0Device::fea_andi()
        !           256: {
        !           257:        CYCLE(4);
        !           258:        return internal_ea_andi(eanum(ir));
        !           259: }
        !           260: 
        !           261: inline uint32
        !           262: MPU680x0Device::fea_anix()
        !           263: {
        !           264:        CYCLE2(12, 14); // XXX 6,6-18,21
        !           265:        return internal_ea_anix(eanum(ir));
        !           266: }
        !           267: 
        !           268: inline uint32
        !           269: MPU680x0Device::fea_absw()
        !           270: {
        !           271:        CYCLE(4);
        !           272:        return internal_ea_absw();
        !           273: }
        !           274: 
        !           275: inline uint32
        !           276: MPU680x0Device::fea_absl()
        !           277: {
        !           278:        CYCLE2(4, 5);
        !           279:        return internal_ea_absl();
        !           280: }
        !           281: 
        !           282: inline uint32
        !           283: MPU680x0Device::fea_pcdi()
        !           284: {
        !           285:        CYCLE(4);
        !           286:        return internal_ea_pcdi();
        !           287: }
        !           288: 
        !           289: inline uint32
        !           290: MPU680x0Device::fea_pcix()
        !           291: {
        !           292:        CYCLE2(12, 14); // XXX 6,6-18,21
        !           293:        return internal_ea_pcix();
        !           294: }
        !           295: 
        !           296: inline void
        !           297: MPU680x0Device::fea_imm_16()
        !           298: {
        !           299:        CYCLE(2);
        !           300: }
        !           301: 
        !           302: inline void
        !           303: MPU680x0Device::fea_imm_32()
        !           304: {
        !           305:        CYCLE(4);
        !           306: }
1.1       root      307: 
                    308: //
                    309: // EA の拡張ワード
                    310: //
                    311: 
                    312: uint32
1.1.1.4 ! root      313: MPU680x0Device::internal_ea_ix(uint32 anpc)
1.1       root      314: {
1.1.1.4 ! root      315:        uint16 ext = fetch_16();
1.1       root      316:        int rn = (ext >> 12) & 15;
                    317:        bool idx_long = (ext & 0x0800);
                    318:        int scale = (ext >> 9) & 3;
                    319: 
                    320:        if ((ext & 0x0100) == 0) {
                    321:                // Brief extension
                    322:                //
1.1.1.3   root      323:                //   F   E   D   C   B   A   9   8   7   6   5   4   3   2   1   0
                    324:                // +---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+
                    325:                // | DA|     n     | WL| SCALE | 0 |             disp              |
                    326:                // +---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+
1.1       root      327:                //
                    328:                // WL: インデックスレジスタ(Rn)のサイズ 1=.L 0=.W
                    329:                // SCALE: スケールファクタ %00=*1 %01=*2 %10=*4 %11=*8
                    330: 
                    331:                CYCLE(4);
                    332:                int32 disp = (int32)(int8)(ext & 0xff);
                    333:                uint32 idx;
                    334: 
                    335:                if (idx_long) {
1.1.1.4 ! root      336:                        idx = reg.R[rn];
1.1       root      337:                } else {
1.1.1.4 ! root      338:                        idx = (int32)(int16)(reg.R[rn] & 0xffff);
1.1       root      339:                }
                    340:                idx <<= scale;
                    341:                return anpc + (int32)idx + disp;
                    342:        } else {
                    343:                // Full extension
                    344:                //
1.1.1.3   root      345:                //   F   E   D   C   B   A   9   8   7   6   5   4   3   2   1   0
                    346:                // +---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+
                    347:                // | DA|     n     | WL| SCALE | 1 | BS| IS|  BDSZ | 0 |   I/IS    |
                    348:                // +---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+
1.1       root      349:                //
                    350:                // BS=1: ベースレジスタ・サプレス
                    351:                // IS=1: インデックスオペランド・サプレス
                    352:                // BDSZ: ベースディスプレースメントのサイズ %01=null %10=.W %11=.L
                    353:                // I/IS: モード
                    354: 
                    355:                // クロックは概略値なので完全に正確ではないがまず基本は以下の2通り。
                    356:                //  メモリ間接なし                       (6,  6)
                    357:                //  メモリ間接あり                       (10, 10)
                    358:                // これを元に必要に応じて以下をそれぞれ加算する。
                    359:                //  bd16                                        (+2, +3)
                    360:                //  bd32 (メモリ間接なし)        (+4, +6)
                    361:                //  bd32 (メモリ間接あり)        (+6, +6)
                    362:                //  outer (W/L 不問)          (+2, +3)
                    363:                // ただしここでは実行順の都合で bd32 はいずれも (+4, +6) とした。
                    364: 
                    365:                bool bs = (ext & 0x0080);
                    366:                bool is = (ext & 0x0040);
                    367:                int bdsize = (ext >> 4) & 3;
                    368:                int iis = (ext & 7);
                    369: 
                    370:                // ベースレジスタ
                    371:                if (bs) {
                    372:                        anpc = 0;
                    373:                }
                    374: 
                    375:                // ベース・ディスプレースメント
                    376:                uint32 base = 0;
                    377:                switch (bdsize) {
                    378:                 case 0:        // 予約
                    379:                        // XXX 未定義命令列になるんだろうか?
                    380:                        PANIC("BDSIZE==0 not impl");
                    381:                 case 1:        // ベースはヌル
                    382:                        break;
                    383:                 case 2:        // ベース.W
1.1.1.4 ! root      384:                        base = (int32)(int16)fetch_16();
1.1       root      385:                        CYCLE2(2, 3);
                    386:                        break;
                    387:                 case 3:        // ベース.L
1.1.1.4 ! root      388:                        base = fetch_32();
1.1       root      389:                        CYCLE2(4, 6);
                    390:                        break;
                    391:                 default:
                    392:                        __unreachable();
                    393:                }
                    394: 
                    395:                uint32 outer;
                    396:                if (is == 0) {
                    397:                        // インデックス
                    398:                        uint32 idx = 0;
                    399:                        if (idx_long) {
1.1.1.4 ! root      400:                                idx = reg.R[rn];
1.1       root      401:                        } else {
1.1.1.4 ! root      402:                                idx = (int32)(int16)(reg.R[rn] & 0xffff);
1.1       root      403:                        }
                    404:                        idx <<= scale;
                    405: 
                    406:                        switch (iis) {
                    407:                         case 0:        // no memory indirection
                    408:                                CYCLE(6);
                    409:                                return anpc + base + idx;
                    410: 
                    411:                         case 1:        // indirect pre-index with null outer
                    412:                                CYCLE(10);
1.1.1.4 ! root      413:                                return read_32(anpc + base + idx);
1.1       root      414:                         case 2:        // indirect pre-index with word outer
                    415:                                CYCLE2(10+2, 10+3);
1.1.1.4 ! root      416:                                outer = (int32)(int16)fetch_16();
        !           417:                                return read_32(anpc + base + idx) + outer;
1.1       root      418:                         case 3:        // indirect pre-index with long outer
                    419:                                CYCLE2(10+2, 10+3);
1.1.1.4 ! root      420:                                outer = fetch_32();
        !           421:                                return read_32(anpc + base + idx) + outer;
1.1       root      422: 
                    423:                         case 4:
                    424:                                PANIC("iis==4 reserved");
                    425: 
                    426:                         case 5:        // indirect post-index with null outer
                    427:                                CYCLE(10);
1.1.1.4 ! root      428:                                return read_32(anpc + base) + idx;
1.1       root      429:                         case 6:        // indirect post-index with word outer
                    430:                                CYCLE2(10+2, 10+3);
1.1.1.4 ! root      431:                                outer = (int32)(int16)fetch_16();
        !           432:                                return read_32(anpc + base) + idx + outer;
1.1       root      433:                         case 7:        // indirect post-index with long outer
                    434:                                CYCLE2(10+2, 10+3);
1.1.1.4 ! root      435:                                outer = fetch_32();
        !           436:                                return read_32(anpc + base) + idx + outer;
1.1       root      437:                         default:
                    438:                                __unreachable();
                    439:                        }
                    440:                } else {
                    441:                        switch (iis) {
                    442:                         case 0:        // no memory indirection
                    443:                                CYCLE(6);
                    444:                                return anpc + base;
                    445: 
                    446:                         case 1:        // memory indirect with null outer
                    447:                                CYCLE(10);
1.1.1.4 ! root      448:                                return read_32(anpc + base);
1.1       root      449:                         case 2:        // memory indirect with word outer
                    450:                                CYCLE2(10+2, 10+3);
1.1.1.4 ! root      451:                                outer = (int32)(int16)fetch_16();
        !           452:                                return read_32(anpc + base) + outer;
1.1       root      453:                         case 3:        // memory indirect with long outer
                    454:                                CYCLE2(10+2, 10+3);
1.1.1.4 ! root      455:                                outer = fetch_32();
        !           456:                                return read_32(anpc + base) + outer;
1.1       root      457:                         default:
                    458:                                PANIC("is==1 && iis>3 reserved");
                    459:                        }
                    460:                }
                    461:        }
                    462: }
                    463: 
                    464: //
                    465: // Calc EA
                    466: //
                    467: 
                    468: uint32
1.1.1.4 ! root      469: MPU680x0Device::cea_ctrl()
1.1       root      470: {
1.1.1.4 ! root      471:        switch (eamode(ir)) {
1.1       root      472:         case 2:        // (An)
1.1.1.4 ! root      473:                return cea_anin(eanum(ir));
1.1       root      474:         case 5:        // d16(An)
1.1.1.4 ! root      475:                return cea_andi(eanum(ir));
1.1       root      476:         case 6:        // (An,IX)
1.1.1.4 ! root      477:                return cea_anix(eanum(ir));
1.1       root      478:         case 7:
1.1.1.4 ! root      479:                switch (eanum(ir)) {
1.1       root      480:                 case 0:        // Abs.W
1.1.1.4 ! root      481:                        return cea_absw();
1.1       root      482:                 case 1:        // Abs.L
1.1.1.4 ! root      483:                        return cea_absl();
1.1       root      484:                 case 2:        // d16(PC)
1.1.1.4 ! root      485:                        return cea_pcdi();
1.1       root      486:                 case 3:        // (PC,IX)
1.1.1.4 ! root      487:                        return cea_pcix();
1.1       root      488:                 default:
                    489:                        break;
                    490:                }
                    491:                break;
                    492:        }
                    493:        // 不当命令
1.1.1.4 ! root      494:        throw M68K::EXCEP_ILLEGAL;
1.1       root      495: }
                    496: 
                    497: uint32
1.1.1.4 ! root      498: MPU680x0Device::cea_data_8()
1.1       root      499: {
1.1.1.4 ! root      500:        switch (eamode(ir)) {
1.1       root      501:         case 2:        // (An)
1.1.1.4 ! root      502:                return cea_anin(eanum(ir));
1.1       root      503:         case 3:        // (An)+
1.1.1.4 ! root      504:                return cea_anpi_8(eanum(ir));
1.1       root      505:         case 4:        // -(An)
1.1.1.4 ! root      506:                return cea_anpd_8(eanum(ir));
1.1       root      507:         case 5:        // d16(An)
1.1.1.4 ! root      508:                return cea_andi(eanum(ir));
1.1       root      509:         case 6:        // (An,IX)
1.1.1.4 ! root      510:                return cea_anix(eanum(ir));
1.1       root      511:         case 7:
1.1.1.4 ! root      512:                switch (eanum(ir)) {
1.1       root      513:                 case 0:        // Abs.W
1.1.1.4 ! root      514:                        return cea_absw();
1.1       root      515:                 case 1:        // Abs.L
1.1.1.4 ! root      516:                        return cea_absl();
1.1       root      517:                 default:
                    518:                        break;
                    519:                }
                    520:                break;
                    521:        }
                    522:        // 不当命令
1.1.1.4 ! root      523:        throw M68K::EXCEP_ILLEGAL;
1.1       root      524: }
                    525: 
                    526: uint32
1.1.1.4 ! root      527: MPU680x0Device::cea_data_16()
1.1       root      528: {
1.1.1.4 ! root      529:        switch (eamode(ir)) {
1.1       root      530:         case 2:        // (An)
1.1.1.4 ! root      531:                return cea_anin(eanum(ir));
1.1       root      532:         case 3:        // (An)+
1.1.1.4 ! root      533:                return cea_anpi_16(eanum(ir));
1.1       root      534:         case 4:        // -(An)
1.1.1.4 ! root      535:                return cea_anpd_16(eanum(ir));
1.1       root      536:         case 5:        // d16(An)
1.1.1.4 ! root      537:                return cea_andi(eanum(ir));
1.1       root      538:         case 6:        // (An,IX)
1.1.1.4 ! root      539:                return cea_anix(eanum(ir));
1.1       root      540:         case 7:
1.1.1.4 ! root      541:                switch (eanum(ir)) {
1.1       root      542:                 case 0:        // Abs.W
1.1.1.4 ! root      543:                        return cea_absw();
1.1       root      544:                 case 1:        // Abs.L
1.1.1.4 ! root      545:                        return cea_absl();
1.1       root      546:                 default:
                    547:                        break;
                    548:                }
                    549:                break;
                    550:        }
                    551:        // 不当命令
1.1.1.4 ! root      552:        throw M68K::EXCEP_ILLEGAL;
1.1       root      553: }
                    554: 
                    555: uint32
1.1.1.4 ! root      556: MPU680x0Device::cea_data_32()
1.1       root      557: {
1.1.1.4 ! root      558:        switch (eamode(ir)) {
1.1       root      559:         case 2:        // (An)
1.1.1.4 ! root      560:                return cea_anin(eanum(ir));
1.1       root      561:         case 3:        // (An)+
1.1.1.4 ! root      562:                return cea_anpi_32(eanum(ir));
1.1       root      563:         case 4:        // -(An)
1.1.1.4 ! root      564:                return cea_anpd_32(eanum(ir));
1.1       root      565:         case 5:        // d16(An)
1.1.1.4 ! root      566:                return cea_andi(eanum(ir));
1.1       root      567:         case 6:        // (An,IX)
1.1.1.4 ! root      568:                return cea_anix(eanum(ir));
1.1       root      569:         case 7:
1.1.1.4 ! root      570:                switch (eanum(ir)) {
1.1       root      571:                 case 0:        // Abs.W
1.1.1.4 ! root      572:                        return cea_absw();
1.1       root      573:                 case 1:        // Abs.L
1.1.1.4 ! root      574:                        return cea_absl();
1.1       root      575:                 default:
                    576:                        break;
                    577:                }
                    578:                break;
                    579:        }
                    580:        // 不当命令
1.1.1.4 ! root      581:        throw M68K::EXCEP_ILLEGAL;
1.1       root      582: }
                    583: 
                    584: // MMU からの呼び出し用。
                    585: uint32
1.1.1.4 ! root      586: MPU680x0Device::cea_copro()
1.1       root      587: {
1.1.1.4 ! root      588:        switch (eamode(ir)) {
1.1       root      589:         case 2:        // (An)
                    590:                CYCLE(4);
1.1.1.4 ! root      591:                return internal_ea_anin(eanum(ir));
1.1       root      592:         case 5:        // d16(An)
                    593:                CYCLE(4);
1.1.1.4 ! root      594:                return internal_ea_andi(eanum(ir));
1.1       root      595:         case 6:        // (An,IX)
                    596:                CYCLE(4);
1.1.1.4 ! root      597:                return internal_ea_anix(eanum(ir));
1.1       root      598:         case 7:
1.1.1.4 ! root      599:                switch (eanum(ir)) {
1.1       root      600:                 case 0:        // Abs.W
                    601:                        CYCLE(4);
1.1.1.4 ! root      602:                        return internal_ea_absw();
1.1       root      603:                 case 1:        // Abs.L
                    604:                        CYCLE(6);
1.1.1.4 ! root      605:                        return internal_ea_absl();
1.1       root      606:                 default:
                    607:                        break;
                    608:                }
                    609:                break;
                    610:        }
                    611:        // 不当命令
1.1.1.4 ! root      612:        throw M68K::EXCEP_ILLEGAL;
1.1       root      613: }
                    614: 
                    615: //
                    616: // Fetch EA
                    617: //
                    618: 
                    619: uint32
1.1.1.4 ! root      620: MPU680x0Device::fea_data_8()
1.1       root      621: {
                    622:        uint32 ea;
                    623: 
1.1.1.4 ! root      624:        switch (eamode(ir)) {
1.1       root      625:         case 0:        // Dn
1.1.1.4 ! root      626:                return reg.D[eanum(ir)] & 0xff;
1.1       root      627:         case 2:        // (An)
1.1.1.4 ! root      628:                ea = fea_anin();
        !           629:                return read_8(ea);
1.1       root      630:         case 3:        // (An)+
1.1.1.4 ! root      631:                ea = fea_anpi_8();
        !           632:                return read_8(ea);
1.1       root      633:         case 4:        // -(An)
1.1.1.4 ! root      634:                ea = fea_anpd_8();
        !           635:                return read_8(ea);
1.1       root      636:         case 5:        // d16(An)
1.1.1.4 ! root      637:                ea = fea_andi();
        !           638:                return read_8(ea);
1.1       root      639:         case 6:        // (An,IX)
1.1.1.4 ! root      640:                ea = fea_anix();
        !           641:                return read_8(ea);
1.1       root      642:         case 7:
1.1.1.4 ! root      643:                switch (eanum(ir)) {
1.1       root      644:                 case 0:        // Abs.W
1.1.1.4 ! root      645:                        ea = fea_absw();
        !           646:                        return read_8(ea);
1.1       root      647:                 case 1:        // Abs.L
1.1.1.4 ! root      648:                        ea = fea_absl();
        !           649:                        return read_8(ea);
1.1       root      650:                 case 2:        // d16(PC)
1.1.1.4 ! root      651:                        ea = fea_pcdi();
        !           652:                        return read_8(ea);
1.1       root      653:                 case 3:        // (PC,IX)
1.1.1.4 ! root      654:                        ea = fea_pcix();
        !           655:                        return read_8(ea);
1.1       root      656:                 case 4:        // #imm
1.1.1.4 ! root      657:                        fea_imm_16();
        !           658:                        return fetch_16() & 0xff;
1.1       root      659:                 default:
                    660:                        break;
                    661:                }
                    662:                break;
                    663:         default:
                    664:                break;
                    665:        }
                    666:        // 不当命令
1.1.1.4 ! root      667:        throw M68K::EXCEP_ILLEGAL;
1.1       root      668: }
                    669: 
                    670: uint32
1.1.1.4 ! root      671: MPU680x0Device::fea_data_16()
1.1       root      672: {
                    673:        uint32 ea;
                    674: 
1.1.1.4 ! root      675:        switch (eamode(ir)) {
1.1       root      676:         case 0:        // Dn
1.1.1.4 ! root      677:                return reg.D[eanum(ir)] & 0xffff;
1.1       root      678:         case 2:        // (An)
1.1.1.4 ! root      679:                ea = fea_anin();
        !           680:                return read_16(ea);
1.1       root      681:         case 3:        // (An)+
1.1.1.4 ! root      682:                ea = fea_anpi_16();
        !           683:                return read_16(ea);
1.1       root      684:         case 4:        // -(An)
1.1.1.4 ! root      685:                ea = fea_anpd_16();
        !           686:                return read_16(ea);
1.1       root      687:         case 5:        // d16(An)
1.1.1.4 ! root      688:                ea = fea_andi();
        !           689:                return read_16(ea);
1.1       root      690:         case 6:        // (An,IX)
1.1.1.4 ! root      691:                ea = fea_anix();
        !           692:                return read_16(ea);
1.1       root      693:         case 7:
1.1.1.4 ! root      694:                switch (eanum(ir)) {
1.1       root      695:                 case 0:        // Abs.W
1.1.1.4 ! root      696:                        ea = fea_absw();
        !           697:                        return read_16(ea);
1.1       root      698:                 case 1:        // Abs.L
1.1.1.4 ! root      699:                        ea = fea_absl();
        !           700:                        return read_16(ea);
1.1       root      701:                 case 2:        // d16(PC)
1.1.1.4 ! root      702:                        ea = fea_pcdi();
        !           703:                        return read_16(ea);
1.1       root      704:                 case 3:        // (PC,IX)
1.1.1.4 ! root      705:                        ea = fea_pcix();
        !           706:                        return read_16(ea);
1.1       root      707:                 case 4:        // #imm
1.1.1.4 ! root      708:                        fea_imm_16();
        !           709:                        return fetch_16();
1.1       root      710:                 default:
                    711:                        break;
                    712:                }
                    713:                break;
                    714:         default:
                    715:                break;
                    716:        }
                    717:        // 不当命令
1.1.1.4 ! root      718:        throw M68K::EXCEP_ILLEGAL;
1.1       root      719: }
                    720: 
                    721: uint32
1.1.1.4 ! root      722: MPU680x0Device::fea_data_32()
1.1       root      723: {
                    724:        uint32 ea;
                    725: 
1.1.1.4 ! root      726:        switch (eamode(ir)) {
1.1       root      727:         case 0:        // Dn
1.1.1.4 ! root      728:                return reg.D[eanum(ir)];
1.1       root      729:         case 2:        // (An)
1.1.1.4 ! root      730:                ea = fea_anin();
        !           731:                return read_32(ea);
1.1       root      732:         case 3:        // (An)+
1.1.1.4 ! root      733:                ea = fea_anpi_32();
        !           734:                return read_32(ea);
1.1       root      735:         case 4:        // -(An)
1.1.1.4 ! root      736:                ea = fea_anpd_32();
        !           737:                return read_32(ea);
1.1       root      738:         case 5:        // d16(An)
1.1.1.4 ! root      739:                ea = fea_andi();
        !           740:                return read_32(ea);
1.1       root      741:         case 6:        // (An,IX)
1.1.1.4 ! root      742:                ea = fea_anix();
        !           743:                return read_32(ea);
1.1       root      744:         case 7:
1.1.1.4 ! root      745:                switch (eanum(ir)) {
1.1       root      746:                 case 0:        // Abs.W
1.1.1.4 ! root      747:                        ea = fea_absw();
        !           748:                        return read_32(ea);
1.1       root      749:                 case 1:        // Abs.L
1.1.1.4 ! root      750:                        ea = fea_absl();
        !           751:                        return read_32(ea);
1.1       root      752:                 case 2:        // d16(PC)
1.1.1.4 ! root      753:                        ea = fea_pcdi();
        !           754:                        return read_32(ea);
1.1       root      755:                 case 3:        // (PC,IX)
1.1.1.4 ! root      756:                        ea = fea_pcix();
        !           757:                        return read_32(ea);
1.1       root      758:                 case 4:        // #imm
1.1.1.4 ! root      759:                        fea_imm_32();
        !           760:                        return fetch_32();
1.1       root      761:                 default:
                    762:                        break;
                    763:                }
                    764:                break;
                    765:         default:
                    766:                break;
                    767:        }
                    768:        // 不当命令
1.1.1.4 ! root      769:        throw M68K::EXCEP_ILLEGAL;
1.1       root      770: }
                    771: 
                    772: uint32
1.1.1.4 ! root      773: MPU680x0Device::fea_all_8()
1.1       root      774: {
                    775:        uint32 ea;
                    776: 
1.1.1.4 ! root      777:        switch (eamode(ir)) {
1.1       root      778:         case 0:        // Dn
1.1.1.4 ! root      779:                return reg.D[eanum(ir)] & 0xff;
1.1       root      780:         case 1:        // An
                    781:                // An.B は不当命令
                    782:                break;
                    783:         case 2:        // (An)
1.1.1.4 ! root      784:                ea = fea_anin();
        !           785:                return read_8(ea);
1.1       root      786:         case 3:        // (An)+
1.1.1.4 ! root      787:                ea = fea_anpi_8();
        !           788:                return read_8(ea);
1.1       root      789:         case 4:        // -(An)
1.1.1.4 ! root      790:                ea = fea_anpd_8();
        !           791:                return read_8(ea);
1.1       root      792:         case 5:        // d16(An)
1.1.1.4 ! root      793:                ea = fea_andi();
        !           794:                return read_8(ea);
1.1       root      795:         case 6:        // (An,IX)
1.1.1.4 ! root      796:                ea = fea_anix();
        !           797:                return read_8(ea);
1.1       root      798:         case 7:
1.1.1.4 ! root      799:                switch (eanum(ir)) {
1.1       root      800:                 case 0:        // Abs.W
1.1.1.4 ! root      801:                        ea = fea_absw();
        !           802:                        return read_8(ea);
1.1       root      803:                 case 1:        // Abs.L
1.1.1.4 ! root      804:                        ea = fea_absl();
        !           805:                        return read_8(ea);
1.1       root      806:                 case 2:        // d16(PC)
1.1.1.4 ! root      807:                        ea = fea_pcdi();
        !           808:                        return read_8(ea);
1.1       root      809:                 case 3:        // (PC,IX)
1.1.1.4 ! root      810:                        ea = fea_pcix();
        !           811:                        return read_8(ea);
1.1       root      812:                 case 4:        // #imm
1.1.1.4 ! root      813:                        fea_imm_16();
        !           814:                        return fetch_16() & 0xff;
1.1       root      815:                 default:
                    816:                        break;
                    817:                }
                    818:                break;
                    819:         default:
                    820:                break;
                    821:        }
                    822:        // 不当命令
1.1.1.4 ! root      823:        throw M68K::EXCEP_ILLEGAL;
1.1       root      824: }
                    825: 
                    826: uint32
1.1.1.4 ! root      827: MPU680x0Device::fea_all_16()
1.1       root      828: {
                    829:        uint32 ea;
                    830: 
1.1.1.4 ! root      831:        switch (eamode(ir)) {
1.1       root      832:         case 0:        // Dn
                    833:         case 1:        // An
1.1.1.4 ! root      834:                return reg.R[ir & 15] & 0xffff;
1.1       root      835:         case 2:        // (An)
1.1.1.4 ! root      836:                ea = fea_anin();
        !           837:                return read_16(ea);
1.1       root      838:         case 3:        // (An)+
1.1.1.4 ! root      839:                ea = fea_anpi_16();
        !           840:                return read_16(ea);
1.1       root      841:         case 4:        // -(An)
1.1.1.4 ! root      842:                ea = fea_anpd_16();
        !           843:                return read_16(ea);
1.1       root      844:         case 5:        // d16(An)
1.1.1.4 ! root      845:                ea = fea_andi();
        !           846:                return read_16(ea);
1.1       root      847:         case 6:        // (An,IX)
1.1.1.4 ! root      848:                ea = fea_anix();
        !           849:                return read_16(ea);
1.1       root      850:         case 7:
1.1.1.4 ! root      851:                switch (eanum(ir)) {
1.1       root      852:                 case 0:        // Abs.W
1.1.1.4 ! root      853:                        ea = fea_absw();
        !           854:                        return read_16(ea);
1.1       root      855:                 case 1:        // Abs.L
1.1.1.4 ! root      856:                        ea = fea_absl();
        !           857:                        return read_16(ea);
1.1       root      858:                 case 2:        // d16(PC)
1.1.1.4 ! root      859:                        ea = fea_pcdi();
        !           860:                        return read_16(ea);
1.1       root      861:                 case 3:        // (PC,IX)
1.1.1.4 ! root      862:                        ea = fea_pcix();
        !           863:                        return read_16(ea);
1.1       root      864:                 case 4:        // #imm
1.1.1.4 ! root      865:                        fea_imm_16();
        !           866:                        return fetch_16();
1.1       root      867:                 default:
                    868:                        break;
                    869:                }
                    870:                break;
                    871:         default:
                    872:                break;
                    873:        }
                    874:        // 不当命令
1.1.1.4 ! root      875:        throw M68K::EXCEP_ILLEGAL;
1.1       root      876: }
                    877: 
                    878: uint32
1.1.1.4 ! root      879: MPU680x0Device::fea_all_32()
1.1       root      880: {
                    881:        uint32 ea;
                    882: 
1.1.1.4 ! root      883:        switch (eamode(ir)) {
1.1       root      884:         case 0:        // Dn
                    885:         case 1:        // An
1.1.1.4 ! root      886:                return reg.R[ir & 15];
1.1       root      887:         case 2:        // (An)
1.1.1.4 ! root      888:                ea = fea_anin();
        !           889:                return read_32(ea);
1.1       root      890:         case 3:        // (An)+
1.1.1.4 ! root      891:                ea = fea_anpi_32();
        !           892:                return read_32(ea);
1.1       root      893:         case 4:        // -(An)
1.1.1.4 ! root      894:                ea = fea_anpd_32();
        !           895:                return read_32(ea);
1.1       root      896:         case 5:        // d16(An)
1.1.1.4 ! root      897:                ea = fea_andi();
        !           898:                return read_32(ea);
1.1       root      899:         case 6:        // (An,IX)
1.1.1.4 ! root      900:                ea = fea_anix();
        !           901:                return read_32(ea);
1.1       root      902:         case 7:
1.1.1.4 ! root      903:                switch (eanum(ir)) {
1.1       root      904:                 case 0:        // Abs.W
1.1.1.4 ! root      905:                        ea = fea_absw();
        !           906:                        return read_32(ea);
1.1       root      907:                 case 1:        // Abs.L
1.1.1.4 ! root      908:                        ea = fea_absl();
        !           909:                        return read_32(ea);
1.1       root      910:                 case 2:        // d16(PC)
1.1.1.4 ! root      911:                        ea = fea_pcdi();
        !           912:                        return read_32(ea);
1.1       root      913:                 case 3:        // (PC,IX)
1.1.1.4 ! root      914:                        ea = fea_pcix();
        !           915:                        return read_32(ea);
1.1       root      916:                 case 4:        // #imm
1.1.1.4 ! root      917:                        fea_imm_32();
        !           918:                        return fetch_32();
1.1       root      919:                 default:
                    920:                        break;
                    921:                }
                    922:                break;
                    923:         default:
                    924:                break;
                    925:        }
                    926:        // 不当命令
1.1.1.4 ! root      927:        throw M68K::EXCEP_ILLEGAL;
1.1       root      928: }

unix.superglobalmegacorp.com

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