Annotation of nono/m680x0/m680x0ea.cpp, revision 1.1.1.1

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

unix.superglobalmegacorp.com

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