Annotation of nono/m680x0/m68030ea.h, revision 1.1.1.1

1.1       root        1: //
                      2: // nono
                      3: // Copyright (C) 2017 [email protected]
                      4: //
                      5: // EA
                      6: //
                      7: 
                      8: #pragma once
                      9: 
                     10: // EA は大別して5種類。
                     11: //
                     12: // |d m  rxwp |        制御  CalcCtrl                サイズ不問
                     13: // |dam+-rxw  |        可変  CalcData                B/W/L
                     14: // |  m  rxwp |        MMU             CalcMMU                 サイズ不問
                     15: // |dam+-rxwpi|        FPU             CalcFPU                 B/W/L/S/D/X/P
                     16: // |d m+-rxwpi|        データ       FetchData               B/W/L
                     17: // |dam+-rxwpi|        All             FetchAll                B/W/L
                     18: //
                     19: // CalcCtrl はユーザーズマニュアルで「制御(Control)」と呼ばれている
                     20: // グループで、デスティネーション側のため EA の計算のみ。
                     21: // また (An)+/-(An) を含まないため、サイズに関係なく1種類だけでよい。
                     22: //
                     23: // CalcData はユーザーズマニュアルで「可変」と呼ばれているグループで、
                     24: // デスティネーション側のため EA の計算のみ。B/W/L
                     25: //
                     26: // CalcMMU は対 MMU 用に勝手に用意したもの。
                     27: //
                     28: // CalcFPU は対 FPU 用。ソースであっても CalcFPU を使用する。
                     29: // サイズは B/W/L/S/D/X/P。
                     30: // フェッチサイクルは別途存在するはずだが不詳。
                     31: //
                     32: // FetchData はユーザーズマニュアルで「データ(Data)」と呼ばれている
                     33: // グループで、ソース側のため EA 計算および値の取得。B/W/L
                     34: //
                     35: // FetchAll はユーザーズマニュアルのここには記載がないグループで、
                     36: // ソース側のため EA 計算および値の取得。B/W/L
                     37: //
                     38: // CalcCtrl、CalcData でアドレッシングモードに D や A が含まれている場合は
                     39: // その命令のデスティネーションに Dn、An が指定できるという意味であり、
                     40: // EA 処理であるここには関係ない。
                     41: // EA 計算より前に呼出側で条件分けして処理すること。
                     42: //
                     43: // CalcCtrl、CalcData と FetchData には (*) 印の例外があるので留意。
                     44: //
                     45: // (CalcCtrl)
                     46: // |  m  rxwp | CMP2/CHK2
                     47: // |  m  rxwp | JMP/JSR
                     48: // |  m  rxwp | LEA/PEA
                     49: // |d m  rxwp | BFEXT*/BFFFO/BFTST
                     50: // |d m  rxw  | (*) BFCHG/BFCLR/BFINS/BFSET <ea>{#o:#w}
                     51: //
                     52: // (CalcData)
                     53: // |  m+-rxw  | ADD/SUB/CMP Dx,<ea>
                     54: // |  m+-rxw  | CAS/TAS <ea>
                     55: // |  m+-rxw  | MOVES <ea>,Rn
                     56: // |  m+-rxw  | shift/rotate.W <ea>
                     57: // |  m+-rxw  | BCHG/BCLR/BSET src,<ea>
                     58: // |d m+-rxw  | ADDI/SUBI Dx,<ea>
                     59: // |d m+-rwx  | NBCD <ea>
                     60: // |d m+-rxw  | AND/OR/EOR Dx,<ea>
                     61: // |d m+-rxw  | CLR/NEG/NEGX/NOT/TST/Scc <ea>
                     62: // |d m+-rxw  | MOVE CCR/SR,<ea>
                     63: // |dam+-rxw  | ADDQ/SUBQ #qqq,<ea>
                     64: // |dam+-rxw  | (*) MOVE の dst 側。EA の分類的には CalcData だが、
                     65: //              下位6ビットの IR ではないので、cea_data_NN() ではなく
                     66: //              各々 cea_XXXX() のほうを個別に呼ぶこと。
                     67: //
                     68: // (CalcMMU)
                     69: // |  m  rxw  | MMU
                     70: //
                     71: // (CalcFPU)
                     72: // |d m+-rxw  | FScc.B <ea>
                     73: // |dam+-rxw  | FMOVE.f FPn,<ea>
                     74: // |dam+-rxw  | FMOVE.L ctl,<ea>
                     75: // |dam+-rxw  | FMOVEM.L ctl,<ea>
                     76: // |d m+-rxwpi| Fgen <ea>,FPn
                     77: // |d m+-rxwpi| FMOVE.f <ea>,FPn
                     78: // |dam+-rwxpi| FMOVE.L <ea>,ctl
                     79: // |dam+-rxwpi| FMOVEM.L <ea>,ctl
                     80: // 実際にどのアドレッシングモードが有効かどうかは極力個別の命令内で判断する?
                     81: // ここは実行サイクル数的な分類。
                     82: //
                     83: // (FetchData)
                     84: // |d m+-rxwpi| AND/OR/CHK <ea>,Dn
                     85: // |d m+-rxwpi| MOVE.B <ea>,dst
                     86: // |d m+-rxwpi| MOVE <ea>,CCR/SR
                     87: // |d m+-rxwpi| MUL*/DIV* <ea>,Dn
                     88: // |d m+-rxwp | (*) TST.B <ea>
                     89: // |d m+-rxwp | (*) CMPI #<data>,<ea>
                     90: // |  m+-rxwp | (*) BTST.B #<data>,<ea>
                     91: // |  m+-rxwpi| (*) BTST.B Dx,<ea>
                     92: //
                     93: // (FetchAll)
                     94: // |dam+-rxwpi| ADD/SUB/CMP <ea>,Dn
                     95: // |dam+-rxwpi| MOVEA/ADDA/SUBA/CMPA <ea>,An
                     96: // |dam+-rxwpi| TST.WL <ea>
                     97: // |dam+-rxwpi| MOVE.WL <ea>,dst
                     98: //
                     99: // (たぶん別対応)
                    100: // |  m -rxw  | MOVEM list,<ea>
                    101: // |  m -rxw  | FMOVEM.X reg,<ea>
                    102: // |  m -rxw  | FSAVE <ea>
                    103: // |  m+ rxwp | MOVEM <ea>,list
                    104: // |  m+ rxwp | FMOVEM.X <ea>,reg
                    105: // |  m+ rxwp | FRESTORE <ea>
                    106: 
                    107: extern uint32 internal_ea_ix(m68kcpu *cpu, uint32 anpc);
                    108: 
                    109: extern uint32 cea_ctrl(m68kcpu *);
                    110: extern uint32 cea_data_8(m68kcpu *);
                    111: extern uint32 cea_data_16(m68kcpu *);
                    112: extern uint32 cea_data_32(m68kcpu *);
                    113: extern uint32 cea_copro(m68kcpu *);
                    114: extern uint32 fea_data_8(m68kcpu *);
                    115: extern uint32 fea_data_16(m68kcpu *);
                    116: extern uint32 fea_data_32(m68kcpu *);
                    117: extern uint32 fea_all_8(m68kcpu *);
                    118: extern uint32 fea_all_16(m68kcpu *);
                    119: extern uint32 fea_all_32(m68kcpu *);
                    120: 
                    121: // mmmrrr のうち mmm の部分を取り出す
                    122: #define eamode(x)      (((x) >> 3) & 7)
                    123: 
                    124: // mmmrrr のうち rrr の部分を取り出す
                    125: #define eanum(x)       ((x) & 7)
                    126: 
                    127: //
                    128: // EA を計算だけするマクロ
                    129: // MOVE の DST 側からも呼ばれる
                    130: //
                    131: 
                    132: // (An)
                    133: static inline uint32 internal_ea_anin(m68kcpu *cpu, int n)
                    134: {
                    135:        return RegA(n);
                    136: }
                    137: 
                    138: // (An)+ .B
                    139: static inline uint32 internal_ea_anpi_8(m68kcpu *cpu, int n)
                    140: {
                    141:        m68030_save_reg_pi(cpu, n);
                    142:        if (n == 7) {
                    143:                RegA(n) += 2;
                    144:                return RegA(n) - 2;
                    145:        } else {
                    146:                RegA(n) += 1;
                    147:                return RegA(n) - 1;
                    148:        }
                    149: }
                    150: 
                    151: // (An)+ .W
                    152: static inline uint32 internal_ea_anpi_16(m68kcpu *cpu, int n)
                    153: {
                    154:        m68030_save_reg_pi(cpu, n);
                    155:        RegA(n) += 2;
                    156:        return RegA(n) - 2;
                    157: }
                    158: 
                    159: // (An)+ .L
                    160: static inline uint32 internal_ea_anpi_32(m68kcpu *cpu, int n)
                    161: {
                    162:        m68030_save_reg_pi(cpu, n);
                    163:        RegA(n) += 4;
                    164:        return RegA(n) - 4;
                    165: }
                    166: 
                    167: // -(An) .B
                    168: static inline uint32 internal_ea_anpd_8(m68kcpu *cpu, int n)
                    169: {
                    170:        m68030_save_reg_pd(cpu, n);
                    171:        if (n == 7) {
                    172:                RegA(n) -= 2;
                    173:        } else {
                    174:                RegA(n) -= 1;
                    175:        }
                    176:        return RegA(n);
                    177: }
                    178: 
                    179: // -(An) .W
                    180: static inline uint32 internal_ea_anpd_16(m68kcpu *cpu, int n)
                    181: {
                    182:        m68030_save_reg_pd(cpu, n);
                    183:        RegA(n) -= 2;
                    184:        return RegA(n);
                    185: }
                    186: 
                    187: // -(An) .L
                    188: static inline uint32 internal_ea_anpd_32(m68kcpu *cpu, int n)
                    189: {
                    190:        m68030_save_reg_pd(cpu, n);
                    191:        RegA(n) -= 4;
                    192:        return RegA(n);
                    193: }
                    194: 
                    195: // d16(An)
                    196: static inline uint32 internal_ea_andi(m68kcpu *cpu, int n)
                    197: {
                    198:        int32 disp = (int32)(int16)m68030_fetch_16(cpu);
                    199:        return RegA(n) + disp;
                    200: }
                    201: 
                    202: // (An,IX)
                    203: static inline uint32 internal_ea_anix(m68kcpu *cpu, int n)
                    204: {
                    205:        return internal_ea_ix(cpu, RegA(n));
                    206: }
                    207: 
                    208: // Abs.W
                    209: static inline uint32 internal_ea_absw(m68kcpu *cpu)
                    210: {
                    211:        return (int32)(int16)m68030_fetch_16(cpu);
                    212: }
                    213: 
                    214: // Abs.L
                    215: static inline uint32 internal_ea_absl(m68kcpu *cpu)
                    216: {
                    217:        return m68030_fetch_32(cpu);
                    218: }
                    219: 
                    220: // d16(PC)
                    221: static inline uint32 internal_ea_pcdi(m68kcpu *cpu)
                    222: {
                    223:        int32 pc = RegPC;
                    224:        int32 disp = (int32)(int16)m68030_fetch_16(cpu);
                    225:        return pc + disp;
                    226: }
                    227: 
                    228: // (PC,IX)
                    229: static inline uint32 internal_ea_pcix(m68kcpu *cpu)
                    230: {
                    231:        return internal_ea_ix(cpu, RegPC);
                    232: }
                    233: 
                    234: //
                    235: // Calc EA
                    236: //
                    237: 
                    238: static inline uint32
                    239: cea_anin(m68kcpu *cpu, int n)
                    240: {
                    241:        CYCLE(2);
                    242:        return internal_ea_anin(cpu, n);
                    243: }
                    244: 
                    245: static inline uint32
                    246: cea_anpi_8(m68kcpu *cpu, int n)
                    247: {
                    248:        CYCLE(2);
                    249:        return internal_ea_anpi_8(cpu, n);
                    250: }
                    251: 
                    252: static inline uint32
                    253: cea_anpi_16(m68kcpu *cpu, int n)
                    254: {
                    255:        CYCLE(2);
                    256:        return internal_ea_anpi_16(cpu, n);
                    257: }
                    258: 
                    259: static inline uint32
                    260: cea_anpi_32(m68kcpu *cpu, int n)
                    261: {
                    262:        CYCLE(2);
                    263:        return internal_ea_anpi_32(cpu, n);
                    264: }
                    265: 
                    266: static inline uint32
                    267: cea_anpd_8(m68kcpu *cpu, int n)
                    268: {
                    269:        CYCLE(2);
                    270:        return internal_ea_anpd_8(cpu, n);
                    271: }
                    272: 
                    273: static inline uint32
                    274: cea_anpd_16(m68kcpu *cpu, int n)
                    275: {
                    276:        CYCLE(2);
                    277:        return internal_ea_anpd_16(cpu, n);
                    278: }
                    279: 
                    280: static inline uint32
                    281: cea_anpd_32(m68kcpu *cpu, int n)
                    282: {
                    283:        CYCLE(2);
                    284:        return internal_ea_anpd_32(cpu, n);
                    285: }
                    286: 
                    287: static inline uint32
                    288: cea_andi(m68kcpu *cpu, int n)
                    289: {
                    290:        CYCLE(2);
                    291:        return internal_ea_andi(cpu, n);
                    292: }
                    293: 
                    294: static inline uint32
                    295: cea_anix(m68kcpu *cpu, int n)
                    296: {
                    297:        CYCLE(10);      // XXX 4,4-18,20
                    298:        return internal_ea_anix(cpu, n);
                    299: }
                    300: 
                    301: static inline uint32
                    302: cea_absw(m68kcpu *cpu)
                    303: {
                    304:        CYCLE(2);
                    305:        return internal_ea_absw(cpu);
                    306: }
                    307: 
                    308: static inline uint32
                    309: cea_absl(m68kcpu *cpu)
                    310: {
                    311:        CYCLE(4);
                    312:        return internal_ea_absl(cpu);
                    313: }
                    314: 
                    315: static inline uint32
                    316: cea_pcdi(m68kcpu *cpu)
                    317: {
                    318:        CYCLE(2);
                    319:        return internal_ea_pcdi(cpu);
                    320: }
                    321: 
                    322: static inline uint32
                    323: cea_pcix(m68kcpu *cpu)
                    324: {
                    325:        CYCLE(10);      // XXX 4,4-18,20
                    326:        return internal_ea_pcix(cpu);
                    327: }
                    328: 
                    329: //
                    330: // Fetch EA
                    331: //
                    332: 
                    333: static inline uint32
                    334: fea_anin(m68kcpu *cpu)
                    335: {
                    336:        CYCLE(3);
                    337:        return internal_ea_anin(cpu, eanum(RegIR));
                    338: }
                    339: 
                    340: static inline uint32
                    341: fea_anpi_8(m68kcpu *cpu)
                    342: {
                    343:        CYCLE(3);
                    344:        return internal_ea_anpi_8(cpu, eanum(RegIR));
                    345: }
                    346: 
                    347: static inline uint32
                    348: fea_anpi_16(m68kcpu *cpu)
                    349: {
                    350:        CYCLE(3);
                    351:        return internal_ea_anpi_16(cpu, eanum(RegIR));
                    352: }
                    353: 
                    354: static inline uint32
                    355: fea_anpi_32(m68kcpu *cpu)
                    356: {
                    357:        CYCLE(3);
                    358:        return internal_ea_anpi_32(cpu, eanum(RegIR));
                    359: }
                    360: 
                    361: static inline uint32
                    362: fea_anpd_8(m68kcpu *cpu)
                    363: {
                    364:        CYCLE(4);
                    365:        return internal_ea_anpd_8(cpu, eanum(RegIR));
                    366: }
                    367: 
                    368: static inline uint32
                    369: fea_anpd_16(m68kcpu *cpu)
                    370: {
                    371:        CYCLE(4);
                    372:        return internal_ea_anpd_16(cpu, eanum(RegIR));
                    373: }
                    374: 
                    375: static inline uint32
                    376: fea_anpd_32(m68kcpu *cpu)
                    377: {
                    378:        CYCLE(4);
                    379:        return internal_ea_anpd_32(cpu, eanum(RegIR));
                    380: }
                    381: 
                    382: static inline uint32
                    383: fea_andi(m68kcpu *cpu)
                    384: {
                    385:        CYCLE(4);
                    386:        return internal_ea_andi(cpu, eanum(RegIR));
                    387: }
                    388: 
                    389: static inline uint32
                    390: fea_anix(m68kcpu *cpu)
                    391: {
                    392:        CYCLE2(12, 14); // XXX 6,6-18,21
                    393:        return internal_ea_anix(cpu, eanum(RegIR));
                    394: }
                    395: 
                    396: static inline uint32
                    397: fea_absw(m68kcpu *cpu)
                    398: {
                    399:        CYCLE(4);
                    400:        return internal_ea_absw(cpu);
                    401: }
                    402: 
                    403: static inline uint32
                    404: fea_absl(m68kcpu *cpu)
                    405: {
                    406:        CYCLE2(4, 5);
                    407:        return internal_ea_absl(cpu);
                    408: }
                    409: 
                    410: static inline uint32
                    411: fea_pcdi(m68kcpu *cpu)
                    412: {
                    413:        CYCLE(4);
                    414:        return internal_ea_pcdi(cpu);
                    415: }
                    416: 
                    417: static inline uint32
                    418: fea_pcix(m68kcpu *cpu)
                    419: {
                    420:        CYCLE2(12, 14); // XXX 6,6-18,21
                    421:        return internal_ea_pcix(cpu);
                    422: }
                    423: 
                    424: static inline void
                    425: fea_imm_16(m68kcpu *cpu)
                    426: {
                    427:        CYCLE(2);
                    428: }
                    429: 
                    430: static inline void
                    431: fea_imm_32(m68kcpu *cpu)
                    432: {
                    433:        CYCLE(4);
                    434: }

unix.superglobalmegacorp.com

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