xeij/MC68EC030.java (3/3)- Source code ソースコード - XEiJ - STUDIO KAMADA
xeij/MC68EC030.java (3/3)
1 2 3

               (w << 31 - 11 >= 0 ? (short) XEiJ.regRn[w >> 12] :  //ワードインデックス
                XEiJ.regRn[w >> 12])  //ロングインデックス
               << (w >> 9 & 3));  //スケールファクタ。ワードインデックスのときは符号拡張してから掛ける
          return ((w & 0x0103) <= 0x0100 ? t + x :  //メモリ間接なし
                  ((XEiJ.TEST_BIT_2_SHIFT ? w << 31 - 2 >= 0 : (w & 4) == 0) ? XEiJ.busRls (t + x) :  //プリインデックス
                   XEiJ.busRls (t) + x)  //ポストインデックス
                  + ((XEiJ.TEST_BIT_1_SHIFT ? w << 31 - 1 >= 0 : (w & 2) == 0) ? 0 :  //ヌルアウタディスプレースメント
                     (XEiJ.TEST_BIT_0_SHIFT ? w << 31 - 0 >= 0 : (w & 1) == 0) ? XEiJ.busRwse ((XEiJ.regPC += 2) - 2) :  //pcws。ワードアウタディスプレースメント
                     XEiJ.busRlse ((XEiJ.regPC += 4) - 4)));  //pcls。ロングアウタディスプレースメント
        case 0b111_000:  //(xxx).W
          XEiJ.mpuCycleCount += 8;
          return XEiJ.busRwse ((XEiJ.regPC += 2) - 2);  //pcws
        case 0b111_001:  //(xxx).L
          XEiJ.mpuCycleCount += 12;
          return XEiJ.busRlse ((XEiJ.regPC += 4) - 4);  //pcls
        }  //switch
        M68kException.m6eNumber = M68kException.M6E_ILLEGAL_INSTRUCTION;
        throw M68kException.m6eSignal;
      }  //efaCltWord

      //a = efaAnyLong (ea)  //|  M+-WXZPI|
      //  任意のモードのロングオペランドの実効アドレスを求める
      //  efaAnyWordとの違いは(Ar)+と-(Ar)がArを4変化させることと、#<data>がPCを4変化させることと、
      //  オペランドのアクセスが1ワード増える分の4サイクルが追加されていること
      @SuppressWarnings ("fallthrough") public static int efaAnyLong (int ea) throws M68kException {
        int t, w, x;
        switch (ea) {
        case 0b010_000:  //(A0)
          if (XEiJ.EFA_SEPARATE_AR) {
            XEiJ.mpuCycleCount += 8;
            return XEiJ.regRn[ 8];
          }
          //fallthrough
        case 0b010_001:  //(A1)
          if (XEiJ.EFA_SEPARATE_AR) {
            XEiJ.mpuCycleCount += 8;
            return XEiJ.regRn[ 9];
          }
          //fallthrough
        case 0b010_010:  //(A2)
          if (XEiJ.EFA_SEPARATE_AR) {
            XEiJ.mpuCycleCount += 8;
            return XEiJ.regRn[10];
          }
          //fallthrough
        case 0b010_011:  //(A3)
          if (XEiJ.EFA_SEPARATE_AR) {
            XEiJ.mpuCycleCount += 8;
            return XEiJ.regRn[11];
          }
          //fallthrough
        case 0b010_100:  //(A4)
          if (XEiJ.EFA_SEPARATE_AR) {
            XEiJ.mpuCycleCount += 8;
            return XEiJ.regRn[12];
          }
          //fallthrough
        case 0b010_101:  //(A5)
          if (XEiJ.EFA_SEPARATE_AR) {
            XEiJ.mpuCycleCount += 8;
            return XEiJ.regRn[13];
          }
          //fallthrough
        case 0b010_110:  //(A6)
          if (XEiJ.EFA_SEPARATE_AR) {
            XEiJ.mpuCycleCount += 8;
            return XEiJ.regRn[14];
          }
          //fallthrough
        case 0b010_111:  //(A7)
          if (XEiJ.EFA_SEPARATE_AR) {
            XEiJ.mpuCycleCount += 8;
            return XEiJ.regRn[15];
          } else {
            XEiJ.mpuCycleCount += 8;
            return XEiJ.regRn[ea - (0b010_000 - 8)];
          }
        case 0b011_000:  //(A0)+
          if (XEiJ.EFA_SEPARATE_AR) {
            XEiJ.mpuCycleCount += 8;
            return (XEiJ.regRn[ 8] += 4) - 4;
          }
          //fallthrough
        case 0b011_001:  //(A1)+
          if (XEiJ.EFA_SEPARATE_AR) {
            XEiJ.mpuCycleCount += 8;
            return (XEiJ.regRn[ 9] += 4) - 4;
          }
          //fallthrough
        case 0b011_010:  //(A2)+
          if (XEiJ.EFA_SEPARATE_AR) {
            XEiJ.mpuCycleCount += 8;
            return (XEiJ.regRn[10] += 4) - 4;
          }
          //fallthrough
        case 0b011_011:  //(A3)+
          if (XEiJ.EFA_SEPARATE_AR) {
            XEiJ.mpuCycleCount += 8;
            return (XEiJ.regRn[11] += 4) - 4;
          }
          //fallthrough
        case 0b011_100:  //(A4)+
          if (XEiJ.EFA_SEPARATE_AR) {
            XEiJ.mpuCycleCount += 8;
            return (XEiJ.regRn[12] += 4) - 4;
          }
          //fallthrough
        case 0b011_101:  //(A5)+
          if (XEiJ.EFA_SEPARATE_AR) {
            XEiJ.mpuCycleCount += 8;
            return (XEiJ.regRn[13] += 4) - 4;
          }
          //fallthrough
        case 0b011_110:  //(A6)+
          if (XEiJ.EFA_SEPARATE_AR) {
            XEiJ.mpuCycleCount += 8;
            return (XEiJ.regRn[14] += 4) - 4;
          }
          //fallthrough
        case 0b011_111:  //(A7)+
          if (XEiJ.EFA_SEPARATE_AR) {
            XEiJ.mpuCycleCount += 8;
            return (XEiJ.regRn[15] += 4) - 4;
          } else {
            XEiJ.mpuCycleCount += 8;
            return (XEiJ.regRn[ea - (0b011_000 - 8)] += 4) - 4;
          }
        case 0b100_000:  //-(A0)
          if (XEiJ.EFA_SEPARATE_AR) {
            XEiJ.mpuCycleCount += 10;
            return XEiJ.regRn[ 8] -= 4;
          }
          //fallthrough
        case 0b100_001:  //-(A1)
          if (XEiJ.EFA_SEPARATE_AR) {
            XEiJ.mpuCycleCount += 10;
            return XEiJ.regRn[ 9] -= 4;
          }
          //fallthrough
        case 0b100_010:  //-(A2)
          if (XEiJ.EFA_SEPARATE_AR) {
            XEiJ.mpuCycleCount += 10;
            return XEiJ.regRn[10] -= 4;
          }
          //fallthrough
        case 0b100_011:  //-(A3)
          if (XEiJ.EFA_SEPARATE_AR) {
            XEiJ.mpuCycleCount += 10;
            return XEiJ.regRn[11] -= 4;
          }
          //fallthrough
        case 0b100_100:  //-(A4)
          if (XEiJ.EFA_SEPARATE_AR) {
            XEiJ.mpuCycleCount += 10;
            return XEiJ.regRn[12] -= 4;
          }
          //fallthrough
        case 0b100_101:  //-(A5)
          if (XEiJ.EFA_SEPARATE_AR) {
            XEiJ.mpuCycleCount += 10;
            return XEiJ.regRn[13] -= 4;
          }
          //fallthrough
        case 0b100_110:  //-(A6)
          if (XEiJ.EFA_SEPARATE_AR) {
            XEiJ.mpuCycleCount += 10;
            return XEiJ.regRn[14] -= 4;
          }
          //fallthrough
        case 0b100_111:  //-(A7)
          if (XEiJ.EFA_SEPARATE_AR) {
            XEiJ.mpuCycleCount += 10;
            return XEiJ.regRn[15] -= 4;
          } else {
            XEiJ.mpuCycleCount += 10;
            return XEiJ.regRn[ea - (0b100_000 - 8)] -= 4;
          }
        case 0b101_000:  //(d16,A0)
        case 0b101_001:  //(d16,A1)
        case 0b101_010:  //(d16,A2)
        case 0b101_011:  //(d16,A3)
        case 0b101_100:  //(d16,A4)
        case 0b101_101:  //(d16,A5)
        case 0b101_110:  //(d16,A6)
        case 0b101_111:  //(d16,A7)
          XEiJ.mpuCycleCount += 12;
          if (XEiJ.MPU_COMPOUND_POSTINCREMENT) {
            return (XEiJ.regRn[ea - (0b101_000 - 8)]  //ベースレジスタ
                    + XEiJ.busRwse ((XEiJ.regPC += 2) - 2));  //pcws。ワードディスプレースメント
          } else {
            t = XEiJ.regPC;
            XEiJ.regPC = t + 2;
            return (XEiJ.regRn[ea - (0b101_000 - 8)]  //ベースレジスタ
                    + XEiJ.busRwse (t));  //pcws。ワードディスプレースメント
          }
        case 0b110_000:  //(d8,A0,Rn.wl)
        case 0b110_001:  //(d8,A1,Rn.wl)
        case 0b110_010:  //(d8,A2,Rn.wl)
        case 0b110_011:  //(d8,A3,Rn.wl)
        case 0b110_100:  //(d8,A4,Rn.wl)
        case 0b110_101:  //(d8,A5,Rn.wl)
        case 0b110_110:  //(d8,A6,Rn.wl)
        case 0b110_111:  //(d8,A7,Rn.wl)
          XEiJ.mpuCycleCount += 14;
          if (XEiJ.MPU_COMPOUND_POSTINCREMENT) {
            w = XEiJ.busRwze ((XEiJ.regPC += 2) - 2);  //pcwz。拡張ワード
          } else {
            w = XEiJ.regPC;
            XEiJ.regPC = w + 2;
            w = XEiJ.busRwze (w);  //pcwz。拡張ワード
          }
          XEiJ.mpuCycleCount += XEiJ.EFA_EXTENSION_CLK[w & 511];
          t = (((~w & 0x0180) == 0 ? 0 :  //ベースレジスタサプレス
                XEiJ.regRn[ea - (0b110_000 - 8)])  //ベースレジスタ
               + (w << 31 - 8 >= 0 ? (byte) w :  //バイトディスプレースメント
                  w << 31 - 5 >= 0 ? 0 :  //ヌルベースディスプレースメント
                  w << 31 - 4 >= 0 ? XEiJ.busRwse ((XEiJ.regPC += 2) - 2) :  //pcws。ワードベースディスプレースメント
                  XEiJ.busRlse ((XEiJ.regPC += 4) - 4)));  //pcls。ロングベースディスプレースメント
          x = ((~w & 0x0140) == 0 ? 0 :  //インデックスサプレス
               (w << 31 - 11 >= 0 ? (short) XEiJ.regRn[w >> 12] :  //ワードインデックス
                XEiJ.regRn[w >> 12])  //ロングインデックス
               << (w >> 9 & 3));  //スケールファクタ。ワードインデックスのときは符号拡張してから掛ける
          return ((w & 0x0103) <= 0x0100 ? t + x :  //メモリ間接なし
                  ((XEiJ.TEST_BIT_2_SHIFT ? w << 31 - 2 >= 0 : (w & 4) == 0) ? XEiJ.busRls (t + x) :  //プリインデックス
                   XEiJ.busRls (t) + x)  //ポストインデックス
                  + ((XEiJ.TEST_BIT_1_SHIFT ? w << 31 - 1 >= 0 : (w & 2) == 0) ? 0 :  //ヌルアウタディスプレースメント
                     (XEiJ.TEST_BIT_0_SHIFT ? w << 31 - 0 >= 0 : (w & 1) == 0) ? XEiJ.busRwse ((XEiJ.regPC += 2) - 2) :  //pcws。ワードアウタディスプレースメント
                     XEiJ.busRlse ((XEiJ.regPC += 4) - 4)));  //pcls。ロングアウタディスプレースメント
        case 0b111_000:  //(xxx).W
          XEiJ.mpuCycleCount += 12;
          return XEiJ.busRwse ((XEiJ.regPC += 2) - 2);  //pcws
        case 0b111_001:  //(xxx).L
          XEiJ.mpuCycleCount += 16;
          return XEiJ.busRlse ((XEiJ.regPC += 4) - 4);  //pcls
        case 0b111_010:  //(d16,PC)
          XEiJ.mpuCycleCount += 12;
          t = XEiJ.regPC;
          XEiJ.regPC = t + 2;
          return (t  //ベースレジスタ
                  + XEiJ.busRwse (t));  //pcws。ワードディスプレースメント
        case 0b111_011:  //(d8,PC,Rn.wl)
          XEiJ.mpuCycleCount += 14;
          t = XEiJ.regPC;
          XEiJ.regPC = t + 2;
          w = XEiJ.busRwze (t);  //pcwz。拡張ワード
          XEiJ.mpuCycleCount += XEiJ.EFA_EXTENSION_CLK[w & 511];
          t = (((~w & 0x0180) == 0 ? 0 :  //ベースレジスタサプレス
                t)  //ベースレジスタ
               + (w << 31 - 8 >= 0 ? (byte) w :  //バイトディスプレースメント
                  w << 31 - 5 >= 0 ? 0 :  //ヌルベースディスプレースメント
                  w << 31 - 4 >= 0 ? XEiJ.busRwse ((XEiJ.regPC += 2) - 2) :  //pcws。ワードベースディスプレースメント
                  XEiJ.busRlse ((XEiJ.regPC += 4) - 4)));  //pcls。ロングベースディスプレースメント
          x = ((~w & 0x0140) == 0 ? 0 :  //インデックスサプレス
               (w << 31 - 11 >= 0 ? (short) XEiJ.regRn[w >> 12] :  //ワードインデックス
                XEiJ.regRn[w >> 12])  //ロングインデックス
               << (w >> 9 & 3));  //スケールファクタ。ワードインデックスのときは符号拡張してから掛ける
          return ((w & 0x0103) <= 0x0100 ? t + x :  //メモリ間接なし
                  ((XEiJ.TEST_BIT_2_SHIFT ? w << 31 - 2 >= 0 : (w & 4) == 0) ? XEiJ.busRls (t + x) :  //プリインデックス
                   XEiJ.busRls (t) + x)  //ポストインデックス
                  + ((XEiJ.TEST_BIT_1_SHIFT ? w << 31 - 1 >= 0 : (w & 2) == 0) ? 0 :  //ヌルアウタディスプレースメント
                     (XEiJ.TEST_BIT_0_SHIFT ? w << 31 - 0 >= 0 : (w & 1) == 0) ? XEiJ.busRwse ((XEiJ.regPC += 2) - 2) :  //pcws。ワードアウタディスプレースメント
                     XEiJ.busRlse ((XEiJ.regPC += 4) - 4)));  //pcls。ロングアウタディスプレースメント
        case 0b111_100:  //#<data>
          XEiJ.mpuCycleCount += 8;
          if (XEiJ.MPU_COMPOUND_POSTINCREMENT) {
            return (XEiJ.regPC += 4) - 4;
          } else {
            t = XEiJ.regPC;
            XEiJ.regPC = t + 4;
            return t;
          }
        }  //switch
        M68kException.m6eNumber = M68kException.M6E_ILLEGAL_INSTRUCTION;
        throw M68kException.m6eSignal;
      }  //efaAnyLong

      //a = efaMemLong (ea)  //|  M+-WXZP |
      //  メモリモードのロングオペランドの実効アドレスを求める
      //  efaAnyLongとの違いは#<data>がないこと
      @SuppressWarnings ("fallthrough") public static int efaMemLong (int ea) throws M68kException {
        int t, w, x;
        switch (ea) {
        case 0b010_000:  //(A0)
          if (XEiJ.EFA_SEPARATE_AR) {
            XEiJ.mpuCycleCount += 8;
            return XEiJ.regRn[ 8];
          }
          //fallthrough
        case 0b010_001:  //(A1)
          if (XEiJ.EFA_SEPARATE_AR) {
            XEiJ.mpuCycleCount += 8;
            return XEiJ.regRn[ 9];
          }
          //fallthrough
        case 0b010_010:  //(A2)
          if (XEiJ.EFA_SEPARATE_AR) {
            XEiJ.mpuCycleCount += 8;
            return XEiJ.regRn[10];
          }
          //fallthrough
        case 0b010_011:  //(A3)
          if (XEiJ.EFA_SEPARATE_AR) {
            XEiJ.mpuCycleCount += 8;
            return XEiJ.regRn[11];
          }
          //fallthrough
        case 0b010_100:  //(A4)
          if (XEiJ.EFA_SEPARATE_AR) {
            XEiJ.mpuCycleCount += 8;
            return XEiJ.regRn[12];
          }
          //fallthrough
        case 0b010_101:  //(A5)
          if (XEiJ.EFA_SEPARATE_AR) {
            XEiJ.mpuCycleCount += 8;
            return XEiJ.regRn[13];
          }
          //fallthrough
        case 0b010_110:  //(A6)
          if (XEiJ.EFA_SEPARATE_AR) {
            XEiJ.mpuCycleCount += 8;
            return XEiJ.regRn[14];
          }
          //fallthrough
        case 0b010_111:  //(A7)
          if (XEiJ.EFA_SEPARATE_AR) {
            XEiJ.mpuCycleCount += 8;
            return XEiJ.regRn[15];
          } else {
            XEiJ.mpuCycleCount += 8;
            return XEiJ.regRn[ea - (0b010_000 - 8)];
          }
        case 0b011_000:  //(A0)+
          if (XEiJ.EFA_SEPARATE_AR) {
            XEiJ.mpuCycleCount += 8;
            return (XEiJ.regRn[ 8] += 4) - 4;
          }
          //fallthrough
        case 0b011_001:  //(A1)+
          if (XEiJ.EFA_SEPARATE_AR) {
            XEiJ.mpuCycleCount += 8;
            return (XEiJ.regRn[ 9] += 4) - 4;
          }
          //fallthrough
        case 0b011_010:  //(A2)+
          if (XEiJ.EFA_SEPARATE_AR) {
            XEiJ.mpuCycleCount += 8;
            return (XEiJ.regRn[10] += 4) - 4;
          }
          //fallthrough
        case 0b011_011:  //(A3)+
          if (XEiJ.EFA_SEPARATE_AR) {
            XEiJ.mpuCycleCount += 8;
            return (XEiJ.regRn[11] += 4) - 4;
          }
          //fallthrough
        case 0b011_100:  //(A4)+
          if (XEiJ.EFA_SEPARATE_AR) {
            XEiJ.mpuCycleCount += 8;
            return (XEiJ.regRn[12] += 4) - 4;
          }
          //fallthrough
        case 0b011_101:  //(A5)+
          if (XEiJ.EFA_SEPARATE_AR) {
            XEiJ.mpuCycleCount += 8;
            return (XEiJ.regRn[13] += 4) - 4;
          }
          //fallthrough
        case 0b011_110:  //(A6)+
          if (XEiJ.EFA_SEPARATE_AR) {
            XEiJ.mpuCycleCount += 8;
            return (XEiJ.regRn[14] += 4) - 4;
          }
          //fallthrough
        case 0b011_111:  //(A7)+
          if (XEiJ.EFA_SEPARATE_AR) {
            XEiJ.mpuCycleCount += 8;
            return (XEiJ.regRn[15] += 4) - 4;
          } else {
            XEiJ.mpuCycleCount += 8;
            return (XEiJ.regRn[ea - (0b011_000 - 8)] += 4) - 4;
          }
        case 0b100_000:  //-(A0)
          if (XEiJ.EFA_SEPARATE_AR) {
            XEiJ.mpuCycleCount += 10;
            return XEiJ.regRn[ 8] -= 4;
          }
          //fallthrough
        case 0b100_001:  //-(A1)
          if (XEiJ.EFA_SEPARATE_AR) {
            XEiJ.mpuCycleCount += 10;
            return XEiJ.regRn[ 9] -= 4;
          }
          //fallthrough
        case 0b100_010:  //-(A2)
          if (XEiJ.EFA_SEPARATE_AR) {
            XEiJ.mpuCycleCount += 10;
            return XEiJ.regRn[10] -= 4;
          }
          //fallthrough
        case 0b100_011:  //-(A3)
          if (XEiJ.EFA_SEPARATE_AR) {
            XEiJ.mpuCycleCount += 10;
            return XEiJ.regRn[11] -= 4;
          }
          //fallthrough
        case 0b100_100:  //-(A4)
          if (XEiJ.EFA_SEPARATE_AR) {
            XEiJ.mpuCycleCount += 10;
            return XEiJ.regRn[12] -= 4;
          }
          //fallthrough
        case 0b100_101:  //-(A5)
          if (XEiJ.EFA_SEPARATE_AR) {
            XEiJ.mpuCycleCount += 10;
            return XEiJ.regRn[13] -= 4;
          }
          //fallthrough
        case 0b100_110:  //-(A6)
          if (XEiJ.EFA_SEPARATE_AR) {
            XEiJ.mpuCycleCount += 10;
            return XEiJ.regRn[14] -= 4;
          }
          //fallthrough
        case 0b100_111:  //-(A7)
          if (XEiJ.EFA_SEPARATE_AR) {
            XEiJ.mpuCycleCount += 10;
            return XEiJ.regRn[15] -= 4;
          } else {
            XEiJ.mpuCycleCount += 10;
            return XEiJ.regRn[ea - (0b100_000 - 8)] -= 4;
          }
        case 0b101_000:  //(d16,A0)
        case 0b101_001:  //(d16,A1)
        case 0b101_010:  //(d16,A2)
        case 0b101_011:  //(d16,A3)
        case 0b101_100:  //(d16,A4)
        case 0b101_101:  //(d16,A5)
        case 0b101_110:  //(d16,A6)
        case 0b101_111:  //(d16,A7)
          XEiJ.mpuCycleCount += 12;
          if (XEiJ.MPU_COMPOUND_POSTINCREMENT) {
            return (XEiJ.regRn[ea - (0b101_000 - 8)]  //ベースレジスタ
                    + XEiJ.busRwse ((XEiJ.regPC += 2) - 2));  //pcws。ワードディスプレースメント
          } else {
            t = XEiJ.regPC;
            XEiJ.regPC = t + 2;
            return (XEiJ.regRn[ea - (0b101_000 - 8)]  //ベースレジスタ
                    + XEiJ.busRwse (t));  //pcws。ワードディスプレースメント
          }
        case 0b110_000:  //(d8,A0,Rn.wl)
        case 0b110_001:  //(d8,A1,Rn.wl)
        case 0b110_010:  //(d8,A2,Rn.wl)
        case 0b110_011:  //(d8,A3,Rn.wl)
        case 0b110_100:  //(d8,A4,Rn.wl)
        case 0b110_101:  //(d8,A5,Rn.wl)
        case 0b110_110:  //(d8,A6,Rn.wl)
        case 0b110_111:  //(d8,A7,Rn.wl)
          XEiJ.mpuCycleCount += 14;
          if (XEiJ.MPU_COMPOUND_POSTINCREMENT) {
            w = XEiJ.busRwze ((XEiJ.regPC += 2) - 2);  //pcwz。拡張ワード
          } else {
            w = XEiJ.regPC;
            XEiJ.regPC = w + 2;
            w = XEiJ.busRwze (w);  //pcwz。拡張ワード
          }
          XEiJ.mpuCycleCount += XEiJ.EFA_EXTENSION_CLK[w & 511];
          t = (((~w & 0x0180) == 0 ? 0 :  //ベースレジスタサプレス
                XEiJ.regRn[ea - (0b110_000 - 8)])  //ベースレジスタ
               + (w << 31 - 8 >= 0 ? (byte) w :  //バイトディスプレースメント
                  w << 31 - 5 >= 0 ? 0 :  //ヌルベースディスプレースメント
                  w << 31 - 4 >= 0 ? XEiJ.busRwse ((XEiJ.regPC += 2) - 2) :  //pcws。ワードベースディスプレースメント
                  XEiJ.busRlse ((XEiJ.regPC += 4) - 4)));  //pcls。ロングベースディスプレースメント
          x = ((~w & 0x0140) == 0 ? 0 :  //インデックスサプレス
               (w << 31 - 11 >= 0 ? (short) XEiJ.regRn[w >> 12] :  //ワードインデックス
                XEiJ.regRn[w >> 12])  //ロングインデックス
               << (w >> 9 & 3));  //スケールファクタ。ワードインデックスのときは符号拡張してから掛ける
          return ((w & 0x0103) <= 0x0100 ? t + x :  //メモリ間接なし
                  ((XEiJ.TEST_BIT_2_SHIFT ? w << 31 - 2 >= 0 : (w & 4) == 0) ? XEiJ.busRls (t + x) :  //プリインデックス
                   XEiJ.busRls (t) + x)  //ポストインデックス
                  + ((XEiJ.TEST_BIT_1_SHIFT ? w << 31 - 1 >= 0 : (w & 2) == 0) ? 0 :  //ヌルアウタディスプレースメント
                     (XEiJ.TEST_BIT_0_SHIFT ? w << 31 - 0 >= 0 : (w & 1) == 0) ? XEiJ.busRwse ((XEiJ.regPC += 2) - 2) :  //pcws。ワードアウタディスプレースメント
                     XEiJ.busRlse ((XEiJ.regPC += 4) - 4)));  //pcls。ロングアウタディスプレースメント
        case 0b111_000:  //(xxx).W
          XEiJ.mpuCycleCount += 12;
          return XEiJ.busRwse ((XEiJ.regPC += 2) - 2);  //pcws
        case 0b111_001:  //(xxx).L
          XEiJ.mpuCycleCount += 16;
          return XEiJ.busRlse ((XEiJ.regPC += 4) - 4);  //pcls
        case 0b111_010:  //(d16,PC)
          XEiJ.mpuCycleCount += 12;
          t = XEiJ.regPC;
          XEiJ.regPC = t + 2;
          return (t  //ベースレジスタ
                  + XEiJ.busRwse (t));  //pcws。ワードディスプレースメント
        case 0b111_011:  //(d8,PC,Rn.wl)
          XEiJ.mpuCycleCount += 14;
          t = XEiJ.regPC;
          XEiJ.regPC = t + 2;
          w = XEiJ.busRwze (t);  //pcwz。拡張ワード
          XEiJ.mpuCycleCount += XEiJ.EFA_EXTENSION_CLK[w & 511];
          t = (((~w & 0x0180) == 0 ? 0 :  //ベースレジスタサプレス
                t)  //ベースレジスタ
               + (w << 31 - 8 >= 0 ? (byte) w :  //バイトディスプレースメント
                  w << 31 - 5 >= 0 ? 0 :  //ヌルベースディスプレースメント
                  w << 31 - 4 >= 0 ? XEiJ.busRwse ((XEiJ.regPC += 2) - 2) :  //pcws。ワードベースディスプレースメント
                  XEiJ.busRlse ((XEiJ.regPC += 4) - 4)));  //pcls。ロングベースディスプレースメント
          x = ((~w & 0x0140) == 0 ? 0 :  //インデックスサプレス
               (w << 31 - 11 >= 0 ? (short) XEiJ.regRn[w >> 12] :  //ワードインデックス
                XEiJ.regRn[w >> 12])  //ロングインデックス
               << (w >> 9 & 3));  //スケールファクタ。ワードインデックスのときは符号拡張してから掛ける
          return ((w & 0x0103) <= 0x0100 ? t + x :  //メモリ間接なし
                  ((XEiJ.TEST_BIT_2_SHIFT ? w << 31 - 2 >= 0 : (w & 4) == 0) ? XEiJ.busRls (t + x) :  //プリインデックス
                   XEiJ.busRls (t) + x)  //ポストインデックス
                  + ((XEiJ.TEST_BIT_1_SHIFT ? w << 31 - 1 >= 0 : (w & 2) == 0) ? 0 :  //ヌルアウタディスプレースメント
                     (XEiJ.TEST_BIT_0_SHIFT ? w << 31 - 0 >= 0 : (w & 1) == 0) ? XEiJ.busRwse ((XEiJ.regPC += 2) - 2) :  //pcws。ワードアウタディスプレースメント
                     XEiJ.busRlse ((XEiJ.regPC += 4) - 4)));  //pcls。ロングアウタディスプレースメント
        }  //switch
        M68kException.m6eNumber = M68kException.M6E_ILLEGAL_INSTRUCTION;
        throw M68kException.m6eSignal;
      }  //efaMemLong

      //a = efaMltLong (ea)  //|  M+-WXZ  |
      //  メモリ可変モードのロングオペランドの実効アドレスを求める
      //  efaMemLongとの違いは(d16,PC)と(d8,PC,Rn.wl)がないこと
      @SuppressWarnings ("fallthrough") public static int efaMltLong (int ea) throws M68kException {
        int t, w, x;
        switch (ea) {
        case 0b010_000:  //(A0)
          if (XEiJ.EFA_SEPARATE_AR) {
            XEiJ.mpuCycleCount += 8;
            return XEiJ.regRn[ 8];
          }
          //fallthrough
        case 0b010_001:  //(A1)
          if (XEiJ.EFA_SEPARATE_AR) {
            XEiJ.mpuCycleCount += 8;
            return XEiJ.regRn[ 9];
          }
          //fallthrough
        case 0b010_010:  //(A2)
          if (XEiJ.EFA_SEPARATE_AR) {
            XEiJ.mpuCycleCount += 8;
            return XEiJ.regRn[10];
          }
          //fallthrough
        case 0b010_011:  //(A3)
          if (XEiJ.EFA_SEPARATE_AR) {
            XEiJ.mpuCycleCount += 8;
            return XEiJ.regRn[11];
          }
          //fallthrough
        case 0b010_100:  //(A4)
          if (XEiJ.EFA_SEPARATE_AR) {
            XEiJ.mpuCycleCount += 8;
            return XEiJ.regRn[12];
          }
          //fallthrough
        case 0b010_101:  //(A5)
          if (XEiJ.EFA_SEPARATE_AR) {
            XEiJ.mpuCycleCount += 8;
            return XEiJ.regRn[13];
          }
          //fallthrough
        case 0b010_110:  //(A6)
          if (XEiJ.EFA_SEPARATE_AR) {
            XEiJ.mpuCycleCount += 8;
            return XEiJ.regRn[14];
          }
          //fallthrough
        case 0b010_111:  //(A7)
          if (XEiJ.EFA_SEPARATE_AR) {
            XEiJ.mpuCycleCount += 8;
            return XEiJ.regRn[15];
          } else {
            XEiJ.mpuCycleCount += 8;
            return XEiJ.regRn[ea - (0b010_000 - 8)];
          }
        case 0b011_000:  //(A0)+
          if (XEiJ.EFA_SEPARATE_AR) {
            XEiJ.mpuCycleCount += 8;
            return (XEiJ.regRn[ 8] += 4) - 4;
          }
          //fallthrough
        case 0b011_001:  //(A1)+
          if (XEiJ.EFA_SEPARATE_AR) {
            XEiJ.mpuCycleCount += 8;
            return (XEiJ.regRn[ 9] += 4) - 4;
          }
          //fallthrough
        case 0b011_010:  //(A2)+
          if (XEiJ.EFA_SEPARATE_AR) {
            XEiJ.mpuCycleCount += 8;
            return (XEiJ.regRn[10] += 4) - 4;
          }
          //fallthrough
        case 0b011_011:  //(A3)+
          if (XEiJ.EFA_SEPARATE_AR) {
            XEiJ.mpuCycleCount += 8;
            return (XEiJ.regRn[11] += 4) - 4;
          }
          //fallthrough
        case 0b011_100:  //(A4)+
          if (XEiJ.EFA_SEPARATE_AR) {
            XEiJ.mpuCycleCount += 8;
            return (XEiJ.regRn[12] += 4) - 4;
          }
          //fallthrough
        case 0b011_101:  //(A5)+
          if (XEiJ.EFA_SEPARATE_AR) {
            XEiJ.mpuCycleCount += 8;
            return (XEiJ.regRn[13] += 4) - 4;
          }
          //fallthrough
        case 0b011_110:  //(A6)+
          if (XEiJ.EFA_SEPARATE_AR) {
            XEiJ.mpuCycleCount += 8;
            return (XEiJ.regRn[14] += 4) - 4;
          }
          //fallthrough
        case 0b011_111:  //(A7)+
          if (XEiJ.EFA_SEPARATE_AR) {
            XEiJ.mpuCycleCount += 8;
            return (XEiJ.regRn[15] += 4) - 4;
          } else {
            XEiJ.mpuCycleCount += 8;
            return (XEiJ.regRn[ea - (0b011_000 - 8)] += 4) - 4;
          }
        case 0b100_000:  //-(A0)
          if (XEiJ.EFA_SEPARATE_AR) {
            XEiJ.mpuCycleCount += 10;
            return XEiJ.regRn[ 8] -= 4;
          }
          //fallthrough
        case 0b100_001:  //-(A1)
          if (XEiJ.EFA_SEPARATE_AR) {
            XEiJ.mpuCycleCount += 10;
            return XEiJ.regRn[ 9] -= 4;
          }
          //fallthrough
        case 0b100_010:  //-(A2)
          if (XEiJ.EFA_SEPARATE_AR) {
            XEiJ.mpuCycleCount += 10;
            return XEiJ.regRn[10] -= 4;
          }
          //fallthrough
        case 0b100_011:  //-(A3)
          if (XEiJ.EFA_SEPARATE_AR) {
            XEiJ.mpuCycleCount += 10;
            return XEiJ.regRn[11] -= 4;
          }
          //fallthrough
        case 0b100_100:  //-(A4)
          if (XEiJ.EFA_SEPARATE_AR) {
            XEiJ.mpuCycleCount += 10;
            return XEiJ.regRn[12] -= 4;
          }
          //fallthrough
        case 0b100_101:  //-(A5)
          if (XEiJ.EFA_SEPARATE_AR) {
            XEiJ.mpuCycleCount += 10;
            return XEiJ.regRn[13] -= 4;
          }
          //fallthrough
        case 0b100_110:  //-(A6)
          if (XEiJ.EFA_SEPARATE_AR) {
            XEiJ.mpuCycleCount += 10;
            return XEiJ.regRn[14] -= 4;
          }
          //fallthrough
        case 0b100_111:  //-(A7)
          if (XEiJ.EFA_SEPARATE_AR) {
            XEiJ.mpuCycleCount += 10;
            return XEiJ.regRn[15] -= 4;
          } else {
            XEiJ.mpuCycleCount += 10;
            return XEiJ.regRn[ea - (0b100_000 - 8)] -= 4;
          }
        case 0b101_000:  //(d16,A0)
        case 0b101_001:  //(d16,A1)
        case 0b101_010:  //(d16,A2)
        case 0b101_011:  //(d16,A3)
        case 0b101_100:  //(d16,A4)
        case 0b101_101:  //(d16,A5)
        case 0b101_110:  //(d16,A6)
        case 0b101_111:  //(d16,A7)
          XEiJ.mpuCycleCount += 12;
          if (XEiJ.MPU_COMPOUND_POSTINCREMENT) {
            return (XEiJ.regRn[ea - (0b101_000 - 8)]  //ベースレジスタ
                    + XEiJ.busRwse ((XEiJ.regPC += 2) - 2));  //pcws。ワードディスプレースメント
          } else {
            t = XEiJ.regPC;
            XEiJ.regPC = t + 2;
            return (XEiJ.regRn[ea - (0b101_000 - 8)]  //ベースレジスタ
                    + XEiJ.busRwse (t));  //pcws。ワードディスプレースメント
          }
        case 0b110_000:  //(d8,A0,Rn.wl)
        case 0b110_001:  //(d8,A1,Rn.wl)
        case 0b110_010:  //(d8,A2,Rn.wl)
        case 0b110_011:  //(d8,A3,Rn.wl)
        case 0b110_100:  //(d8,A4,Rn.wl)
        case 0b110_101:  //(d8,A5,Rn.wl)
        case 0b110_110:  //(d8,A6,Rn.wl)
        case 0b110_111:  //(d8,A7,Rn.wl)
          XEiJ.mpuCycleCount += 14;
          if (XEiJ.MPU_COMPOUND_POSTINCREMENT) {
            w = XEiJ.busRwze ((XEiJ.regPC += 2) - 2);  //pcwz。拡張ワード
          } else {
            w = XEiJ.regPC;
            XEiJ.regPC = w + 2;
            w = XEiJ.busRwze (w);  //pcwz。拡張ワード
          }
          XEiJ.mpuCycleCount += XEiJ.EFA_EXTENSION_CLK[w & 511];
          t = (((~w & 0x0180) == 0 ? 0 :  //ベースレジスタサプレス
                XEiJ.regRn[ea - (0b110_000 - 8)])  //ベースレジスタ
               + (w << 31 - 8 >= 0 ? (byte) w :  //バイトディスプレースメント
                  w << 31 - 5 >= 0 ? 0 :  //ヌルベースディスプレースメント
                  w << 31 - 4 >= 0 ? XEiJ.busRwse ((XEiJ.regPC += 2) - 2) :  //pcws。ワードベースディスプレースメント
                  XEiJ.busRlse ((XEiJ.regPC += 4) - 4)));  //pcls。ロングベースディスプレースメント
          x = ((~w & 0x0140) == 0 ? 0 :  //インデックスサプレス
               (w << 31 - 11 >= 0 ? (short) XEiJ.regRn[w >> 12] :  //ワードインデックス
                XEiJ.regRn[w >> 12])  //ロングインデックス
               << (w >> 9 & 3));  //スケールファクタ。ワードインデックスのときは符号拡張してから掛ける
          return ((w & 0x0103) <= 0x0100 ? t + x :  //メモリ間接なし
                  ((XEiJ.TEST_BIT_2_SHIFT ? w << 31 - 2 >= 0 : (w & 4) == 0) ? XEiJ.busRls (t + x) :  //プリインデックス
                   XEiJ.busRls (t) + x)  //ポストインデックス
                  + ((XEiJ.TEST_BIT_1_SHIFT ? w << 31 - 1 >= 0 : (w & 2) == 0) ? 0 :  //ヌルアウタディスプレースメント
                     (XEiJ.TEST_BIT_0_SHIFT ? w << 31 - 0 >= 0 : (w & 1) == 0) ? XEiJ.busRwse ((XEiJ.regPC += 2) - 2) :  //pcws。ワードアウタディスプレースメント
                     XEiJ.busRlse ((XEiJ.regPC += 4) - 4)));  //pcls。ロングアウタディスプレースメント
        case 0b111_000:  //(xxx).W
          XEiJ.mpuCycleCount += 12;
          return XEiJ.busRwse ((XEiJ.regPC += 2) - 2);  //pcws
        case 0b111_001:  //(xxx).L
          XEiJ.mpuCycleCount += 16;
          return XEiJ.busRlse ((XEiJ.regPC += 4) - 4);  //pcls
        }  //switch
        M68kException.m6eNumber = M68kException.M6E_ILLEGAL_INSTRUCTION;
        throw M68kException.m6eSignal;
      }  //efaMltLong

      //a = efaCntLong (ea)  //|  M  WXZP |
      //  制御モードのロングオペランドの実効アドレスを求める
      //  efaMemLongとの違いは(Ar)+と-(Ar)がないこと
      //  efaCntWordとの違いはサイクル数のみ
      @SuppressWarnings ("fallthrough") public static int efaCntLong (int ea) throws M68kException {
        int t, w, x;
        switch (ea) {
        case 0b010_000:  //(A0)
          if (XEiJ.EFA_SEPARATE_AR) {
            XEiJ.mpuCycleCount += 8;
            return XEiJ.regRn[ 8];
          }
          //fallthrough
        case 0b010_001:  //(A1)
          if (XEiJ.EFA_SEPARATE_AR) {
            XEiJ.mpuCycleCount += 8;
            return XEiJ.regRn[ 9];
          }
          //fallthrough
        case 0b010_010:  //(A2)
          if (XEiJ.EFA_SEPARATE_AR) {
            XEiJ.mpuCycleCount += 8;
            return XEiJ.regRn[10];
          }
          //fallthrough
        case 0b010_011:  //(A3)
          if (XEiJ.EFA_SEPARATE_AR) {
            XEiJ.mpuCycleCount += 8;
            return XEiJ.regRn[11];
          }
          //fallthrough
        case 0b010_100:  //(A4)
          if (XEiJ.EFA_SEPARATE_AR) {
            XEiJ.mpuCycleCount += 8;
            return XEiJ.regRn[12];
          }
          //fallthrough
        case 0b010_101:  //(A5)
          if (XEiJ.EFA_SEPARATE_AR) {
            XEiJ.mpuCycleCount += 8;
            return XEiJ.regRn[13];
          }
          //fallthrough
        case 0b010_110:  //(A6)
          if (XEiJ.EFA_SEPARATE_AR) {
            XEiJ.mpuCycleCount += 8;
            return XEiJ.regRn[14];
          }
          //fallthrough
        case 0b010_111:  //(A7)
          if (XEiJ.EFA_SEPARATE_AR) {
            XEiJ.mpuCycleCount += 8;
            return XEiJ.regRn[15];
          } else {
            XEiJ.mpuCycleCount += 8;
            return XEiJ.regRn[ea - (0b010_000 - 8)];
          }
        case 0b101_000:  //(d16,A0)
        case 0b101_001:  //(d16,A1)
        case 0b101_010:  //(d16,A2)
        case 0b101_011:  //(d16,A3)
        case 0b101_100:  //(d16,A4)
        case 0b101_101:  //(d16,A5)
        case 0b101_110:  //(d16,A6)
        case 0b101_111:  //(d16,A7)
          XEiJ.mpuCycleCount += 12;
          if (XEiJ.MPU_COMPOUND_POSTINCREMENT) {
            return (XEiJ.regRn[ea - (0b101_000 - 8)]  //ベースレジスタ
                    + XEiJ.busRwse ((XEiJ.regPC += 2) - 2));  //pcws。ワードディスプレースメント
          } else {
            t = XEiJ.regPC;
            XEiJ.regPC = t + 2;
            return (XEiJ.regRn[ea - (0b101_000 - 8)]  //ベースレジスタ
                    + XEiJ.busRwse (t));  //pcws。ワードディスプレースメント
          }
        case 0b110_000:  //(d8,A0,Rn.wl)
        case 0b110_001:  //(d8,A1,Rn.wl)
        case 0b110_010:  //(d8,A2,Rn.wl)
        case 0b110_011:  //(d8,A3,Rn.wl)
        case 0b110_100:  //(d8,A4,Rn.wl)
        case 0b110_101:  //(d8,A5,Rn.wl)
        case 0b110_110:  //(d8,A6,Rn.wl)
        case 0b110_111:  //(d8,A7,Rn.wl)
          XEiJ.mpuCycleCount += 14;
          if (XEiJ.MPU_COMPOUND_POSTINCREMENT) {
            w = XEiJ.busRwze ((XEiJ.regPC += 2) - 2);  //pcwz。拡張ワード
          } else {
            w = XEiJ.regPC;
            XEiJ.regPC = w + 2;
            w = XEiJ.busRwze (w);  //pcwz。拡張ワード
          }
          XEiJ.mpuCycleCount += XEiJ.EFA_EXTENSION_CLK[w & 511];
          t = (((~w & 0x0180) == 0 ? 0 :  //ベースレジスタサプレス
                XEiJ.regRn[ea - (0b110_000 - 8)])  //ベースレジスタ
               + (w << 31 - 8 >= 0 ? (byte) w :  //バイトディスプレースメント
                  w << 31 - 5 >= 0 ? 0 :  //ヌルベースディスプレースメント
                  w << 31 - 4 >= 0 ? XEiJ.busRwse ((XEiJ.regPC += 2) - 2) :  //pcws。ワードベースディスプレースメント
                  XEiJ.busRlse ((XEiJ.regPC += 4) - 4)));  //pcls。ロングベースディスプレースメント
          x = ((~w & 0x0140) == 0 ? 0 :  //インデックスサプレス
               (w << 31 - 11 >= 0 ? (short) XEiJ.regRn[w >> 12] :  //ワードインデックス
                XEiJ.regRn[w >> 12])  //ロングインデックス
               << (w >> 9 & 3));  //スケールファクタ。ワードインデックスのときは符号拡張してから掛ける
          return ((w & 0x0103) <= 0x0100 ? t + x :  //メモリ間接なし
                  ((XEiJ.TEST_BIT_2_SHIFT ? w << 31 - 2 >= 0 : (w & 4) == 0) ? XEiJ.busRls (t + x) :  //プリインデックス
                   XEiJ.busRls (t) + x)  //ポストインデックス
                  + ((XEiJ.TEST_BIT_1_SHIFT ? w << 31 - 1 >= 0 : (w & 2) == 0) ? 0 :  //ヌルアウタディスプレースメント
                     (XEiJ.TEST_BIT_0_SHIFT ? w << 31 - 0 >= 0 : (w & 1) == 0) ? XEiJ.busRwse ((XEiJ.regPC += 2) - 2) :  //pcws。ワードアウタディスプレースメント
                     XEiJ.busRlse ((XEiJ.regPC += 4) - 4)));  //pcls。ロングアウタディスプレースメント
        case 0b111_000:  //(xxx).W
          XEiJ.mpuCycleCount += 12;
          return XEiJ.busRwse ((XEiJ.regPC += 2) - 2);  //pcws
        case 0b111_001:  //(xxx).L
          XEiJ.mpuCycleCount += 16;
          return XEiJ.busRlse ((XEiJ.regPC += 4) - 4);  //pcls
        case 0b111_010:  //(d16,PC)
          XEiJ.mpuCycleCount += 12;
          t = XEiJ.regPC;
          XEiJ.regPC = t + 2;
          return (t  //ベースレジスタ
                  + XEiJ.busRwse (t));  //pcws。ワードディスプレースメント
        case 0b111_011:  //(d8,PC,Rn.wl)
          XEiJ.mpuCycleCount += 14;
          t = XEiJ.regPC;
          XEiJ.regPC = t + 2;
          w = XEiJ.busRwze (t);  //pcwz。拡張ワード
          XEiJ.mpuCycleCount += XEiJ.EFA_EXTENSION_CLK[w & 511];
          t = (((~w & 0x0180) == 0 ? 0 :  //ベースレジスタサプレス
                t)  //ベースレジスタ
               + (w << 31 - 8 >= 0 ? (byte) w :  //バイトディスプレースメント
                  w << 31 - 5 >= 0 ? 0 :  //ヌルベースディスプレースメント
                  w << 31 - 4 >= 0 ? XEiJ.busRwse ((XEiJ.regPC += 2) - 2) :  //pcws。ワードベースディスプレースメント
                  XEiJ.busRlse ((XEiJ.regPC += 4) - 4)));  //pcls。ロングベースディスプレースメント
          x = ((~w & 0x0140) == 0 ? 0 :  //インデックスサプレス
               (w << 31 - 11 >= 0 ? (short) XEiJ.regRn[w >> 12] :  //ワードインデックス
                XEiJ.regRn[w >> 12])  //ロングインデックス
               << (w >> 9 & 3));  //スケールファクタ。ワードインデックスのときは符号拡張してから掛ける
          return ((w & 0x0103) <= 0x0100 ? t + x :  //メモリ間接なし
                  ((XEiJ.TEST_BIT_2_SHIFT ? w << 31 - 2 >= 0 : (w & 4) == 0) ? XEiJ.busRls (t + x) :  //プリインデックス
                   XEiJ.busRls (t) + x)  //ポストインデックス
                  + ((XEiJ.TEST_BIT_1_SHIFT ? w << 31 - 1 >= 0 : (w & 2) == 0) ? 0 :  //ヌルアウタディスプレースメント
                     (XEiJ.TEST_BIT_0_SHIFT ? w << 31 - 0 >= 0 : (w & 1) == 0) ? XEiJ.busRwse ((XEiJ.regPC += 2) - 2) :  //pcws。ワードアウタディスプレースメント
                     XEiJ.busRlse ((XEiJ.regPC += 4) - 4)));  //pcls。ロングアウタディスプレースメント
        }  //switch
        M68kException.m6eNumber = M68kException.M6E_ILLEGAL_INSTRUCTION;
        throw M68kException.m6eSignal;
      }  //efaCntLong

      //a = efaCltLong (ea)  //|  M  WXZ  |
      //  制御可変モードのワードオペランドの実効アドレスを求める
      //  efaCntLongとの違いは(d16,PC)と(d8,PC,Rn.wl)がないこと
      //  efaCltWordとの違いはサイクル数のみ
      @SuppressWarnings ("fallthrough") public static int efaCltLong (int ea) throws M68kException {
        int t, w, x;
        switch (ea) {
        case 0b010_000:  //(A0)
          if (XEiJ.EFA_SEPARATE_AR) {
            XEiJ.mpuCycleCount += 8;
            return XEiJ.regRn[ 8];
          }
          //fallthrough
        case 0b010_001:  //(A1)
          if (XEiJ.EFA_SEPARATE_AR) {
            XEiJ.mpuCycleCount += 8;
            return XEiJ.regRn[ 9];
          }
          //fallthrough
        case 0b010_010:  //(A2)
          if (XEiJ.EFA_SEPARATE_AR) {
            XEiJ.mpuCycleCount += 8;
            return XEiJ.regRn[10];
          }
          //fallthrough
        case 0b010_011:  //(A3)
          if (XEiJ.EFA_SEPARATE_AR) {
            XEiJ.mpuCycleCount += 8;
            return XEiJ.regRn[11];
          }
          //fallthrough
        case 0b010_100:  //(A4)
          if (XEiJ.EFA_SEPARATE_AR) {
            XEiJ.mpuCycleCount += 8;
            return XEiJ.regRn[12];
          }
          //fallthrough
        case 0b010_101:  //(A5)
          if (XEiJ.EFA_SEPARATE_AR) {
            XEiJ.mpuCycleCount += 8;
            return XEiJ.regRn[13];
          }
          //fallthrough
        case 0b010_110:  //(A6)
          if (XEiJ.EFA_SEPARATE_AR) {
            XEiJ.mpuCycleCount += 8;
            return XEiJ.regRn[14];
          }
          //fallthrough
        case 0b010_111:  //(A7)
          if (XEiJ.EFA_SEPARATE_AR) {
            XEiJ.mpuCycleCount += 8;
            return XEiJ.regRn[15];
          } else {
            XEiJ.mpuCycleCount += 8;
            return XEiJ.regRn[ea - (0b010_000 - 8)];
          }
        case 0b101_000:  //(d16,A0)
        case 0b101_001:  //(d16,A1)
        case 0b101_010:  //(d16,A2)
        case 0b101_011:  //(d16,A3)
        case 0b101_100:  //(d16,A4)
        case 0b101_101:  //(d16,A5)
        case 0b101_110:  //(d16,A6)
        case 0b101_111:  //(d16,A7)
          XEiJ.mpuCycleCount += 12;
          if (XEiJ.MPU_COMPOUND_POSTINCREMENT) {
            return (XEiJ.regRn[ea - (0b101_000 - 8)]  //ベースレジスタ
                    + XEiJ.busRwse ((XEiJ.regPC += 2) - 2));  //pcws。ワードディスプレースメント
          } else {
            t = XEiJ.regPC;
            XEiJ.regPC = t + 2;
            return (XEiJ.regRn[ea - (0b101_000 - 8)]  //ベースレジスタ
                    + XEiJ.busRwse (t));  //pcws。ワードディスプレースメント
          }
        case 0b110_000:  //(d8,A0,Rn.wl)
        case 0b110_001:  //(d8,A1,Rn.wl)
        case 0b110_010:  //(d8,A2,Rn.wl)
        case 0b110_011:  //(d8,A3,Rn.wl)
        case 0b110_100:  //(d8,A4,Rn.wl)
        case 0b110_101:  //(d8,A5,Rn.wl)
        case 0b110_110:  //(d8,A6,Rn.wl)
        case 0b110_111:  //(d8,A7,Rn.wl)
          XEiJ.mpuCycleCount += 14;
          if (XEiJ.MPU_COMPOUND_POSTINCREMENT) {
            w = XEiJ.busRwze ((XEiJ.regPC += 2) - 2);  //pcwz。拡張ワード
          } else {
            w = XEiJ.regPC;
            XEiJ.regPC = w + 2;
            w = XEiJ.busRwze (w);  //pcwz。拡張ワード
          }
          XEiJ.mpuCycleCount += XEiJ.EFA_EXTENSION_CLK[w & 511];
          t = (((~w & 0x0180) == 0 ? 0 :  //ベースレジスタサプレス
                XEiJ.regRn[ea - (0b110_000 - 8)])  //ベースレジスタ
               + (w << 31 - 8 >= 0 ? (byte) w :  //バイトディスプレースメント
                  w << 31 - 5 >= 0 ? 0 :  //ヌルベースディスプレースメント
                  w << 31 - 4 >= 0 ? XEiJ.busRwse ((XEiJ.regPC += 2) - 2) :  //pcws。ワードベースディスプレースメント
                  XEiJ.busRlse ((XEiJ.regPC += 4) - 4)));  //pcls。ロングベースディスプレースメント
          x = ((~w & 0x0140) == 0 ? 0 :  //インデックスサプレス
               (w << 31 - 11 >= 0 ? (short) XEiJ.regRn[w >> 12] :  //ワードインデックス
                XEiJ.regRn[w >> 12])  //ロングインデックス
               << (w >> 9 & 3));  //スケールファクタ。ワードインデックスのときは符号拡張してから掛ける
          return ((w & 0x0103) <= 0x0100 ? t + x :  //メモリ間接なし
                  ((XEiJ.TEST_BIT_2_SHIFT ? w << 31 - 2 >= 0 : (w & 4) == 0) ? XEiJ.busRls (t + x) :  //プリインデックス
                   XEiJ.busRls (t) + x)  //ポストインデックス
                  + ((XEiJ.TEST_BIT_1_SHIFT ? w << 31 - 1 >= 0 : (w & 2) == 0) ? 0 :  //ヌルアウタディスプレースメント
                     (XEiJ.TEST_BIT_0_SHIFT ? w << 31 - 0 >= 0 : (w & 1) == 0) ? XEiJ.busRwse ((XEiJ.regPC += 2) - 2) :  //pcws。ワードアウタディスプレースメント
                     XEiJ.busRlse ((XEiJ.regPC += 4) - 4)));  //pcls。ロングアウタディスプレースメント
        case 0b111_000:  //(xxx).W
          XEiJ.mpuCycleCount += 12;
          return XEiJ.busRwse ((XEiJ.regPC += 2) - 2);  //pcws
        case 0b111_001:  //(xxx).L
          XEiJ.mpuCycleCount += 16;
          return XEiJ.busRlse ((XEiJ.regPC += 4) - 4);  //pcls
        }  //switch
        M68kException.m6eNumber = M68kException.M6E_ILLEGAL_INSTRUCTION;
        throw M68kException.m6eSignal;
      }  //efaCltLong

      //a = efaAnyQuad (ea)  //|  M+-WXZPI|
      //  任意のモードのクワッドオペランドの実効アドレスを求める
      //  efaAnyLongとの違いは(Ar)+と-(Ar)がArを8変化させることと、#<data>がPCを8変化させることと、
      //  オペランドのアクセスが2ワード増える分の8サイクルが追加されていること
      @SuppressWarnings ("fallthrough") public static int efaAnyQuad (int ea) throws M68kException {
        int t, w, x;
        switch (ea) {
        case 0b010_000:  //(A0)
          if (XEiJ.EFA_SEPARATE_AR) {
            XEiJ.mpuCycleCount += 16;
            return XEiJ.regRn[ 8];
          }
          //fallthrough
        case 0b010_001:  //(A1)
          if (XEiJ.EFA_SEPARATE_AR) {
            XEiJ.mpuCycleCount += 16;
            return XEiJ.regRn[ 9];
          }
          //fallthrough
        case 0b010_010:  //(A2)
          if (XEiJ.EFA_SEPARATE_AR) {
            XEiJ.mpuCycleCount += 16;
            return XEiJ.regRn[10];
          }
          //fallthrough
        case 0b010_011:  //(A3)
          if (XEiJ.EFA_SEPARATE_AR) {
            XEiJ.mpuCycleCount += 16;
            return XEiJ.regRn[11];
          }
          //fallthrough
        case 0b010_100:  //(A4)
          if (XEiJ.EFA_SEPARATE_AR) {
            XEiJ.mpuCycleCount += 16;
            return XEiJ.regRn[12];
          }
          //fallthrough
        case 0b010_101:  //(A5)
          if (XEiJ.EFA_SEPARATE_AR) {
            XEiJ.mpuCycleCount += 16;
            return XEiJ.regRn[13];
          }
          //fallthrough
        case 0b010_110:  //(A6)
          if (XEiJ.EFA_SEPARATE_AR) {
            XEiJ.mpuCycleCount += 16;
            return XEiJ.regRn[14];
          }
          //fallthrough
        case 0b010_111:  //(A7)
          if (XEiJ.EFA_SEPARATE_AR) {
            XEiJ.mpuCycleCount += 16;
            return XEiJ.regRn[15];
          } else {
            XEiJ.mpuCycleCount += 16;
            return XEiJ.regRn[ea - (0b010_000 - 8)];
          }
        case 0b011_000:  //(A0)+
          if (XEiJ.EFA_SEPARATE_AR) {
            XEiJ.mpuCycleCount += 16;
            return (XEiJ.regRn[ 8] += 8) - 8;
          }
          //fallthrough
        case 0b011_001:  //(A1)+
          if (XEiJ.EFA_SEPARATE_AR) {
            XEiJ.mpuCycleCount += 16;
            return (XEiJ.regRn[ 9] += 8) - 8;
          }
          //fallthrough
        case 0b011_010:  //(A2)+
          if (XEiJ.EFA_SEPARATE_AR) {
            XEiJ.mpuCycleCount += 16;
            return (XEiJ.regRn[10] += 8) - 8;
          }
          //fallthrough
        case 0b011_011:  //(A3)+
          if (XEiJ.EFA_SEPARATE_AR) {
            XEiJ.mpuCycleCount += 16;
            return (XEiJ.regRn[11] += 8) - 8;
          }
          //fallthrough
        case 0b011_100:  //(A4)+
          if (XEiJ.EFA_SEPARATE_AR) {
            XEiJ.mpuCycleCount += 16;
            return (XEiJ.regRn[12] += 8) - 8;
          }
          //fallthrough
        case 0b011_101:  //(A5)+
          if (XEiJ.EFA_SEPARATE_AR) {
            XEiJ.mpuCycleCount += 16;
            return (XEiJ.regRn[13] += 8) - 8;
          }
          //fallthrough
        case 0b011_110:  //(A6)+
          if (XEiJ.EFA_SEPARATE_AR) {
            XEiJ.mpuCycleCount += 16;
            return (XEiJ.regRn[14] += 8) - 8;
          }
          //fallthrough
        case 0b011_111:  //(A7)+
          if (XEiJ.EFA_SEPARATE_AR) {
            XEiJ.mpuCycleCount += 16;
            return (XEiJ.regRn[15] += 8) - 8;
          } else {
            XEiJ.mpuCycleCount += 16;
            return (XEiJ.regRn[ea - (0b011_000 - 8)] += 8) - 8;
          }
        case 0b100_000:  //-(A0)
          if (XEiJ.EFA_SEPARATE_AR) {
            XEiJ.mpuCycleCount += 18;
            return XEiJ.regRn[ 8] -= 8;
          }
          //fallthrough
        case 0b100_001:  //-(A1)
          if (XEiJ.EFA_SEPARATE_AR) {
            XEiJ.mpuCycleCount += 18;
            return XEiJ.regRn[ 9] -= 8;
          }
          //fallthrough
        case 0b100_010:  //-(A2)
          if (XEiJ.EFA_SEPARATE_AR) {
            XEiJ.mpuCycleCount += 18;
            return XEiJ.regRn[10] -= 8;
          }
          //fallthrough
        case 0b100_011:  //-(A3)
          if (XEiJ.EFA_SEPARATE_AR) {
            XEiJ.mpuCycleCount += 18;
            return XEiJ.regRn[11] -= 8;
          }
          //fallthrough
        case 0b100_100:  //-(A4)
          if (XEiJ.EFA_SEPARATE_AR) {
            XEiJ.mpuCycleCount += 18;
            return XEiJ.regRn[12] -= 8;
          }
          //fallthrough
        case 0b100_101:  //-(A5)
          if (XEiJ.EFA_SEPARATE_AR) {
            XEiJ.mpuCycleCount += 18;
            return XEiJ.regRn[13] -= 8;
          }
          //fallthrough
        case 0b100_110:  //-(A6)
          if (XEiJ.EFA_SEPARATE_AR) {
            XEiJ.mpuCycleCount += 18;
            return XEiJ.regRn[14] -= 8;
          }
          //fallthrough
        case 0b100_111:  //-(A7)
          if (XEiJ.EFA_SEPARATE_AR) {
            XEiJ.mpuCycleCount += 18;
            return XEiJ.regRn[15] -= 8;
          } else {
            XEiJ.mpuCycleCount += 18;
            return XEiJ.regRn[ea - (0b100_000 - 8)] -= 8;
          }
        case 0b101_000:  //(d16,A0)
        case 0b101_001:  //(d16,A1)
        case 0b101_010:  //(d16,A2)
        case 0b101_011:  //(d16,A3)
        case 0b101_100:  //(d16,A4)
        case 0b101_101:  //(d16,A5)
        case 0b101_110:  //(d16,A6)
        case 0b101_111:  //(d16,A7)
          XEiJ.mpuCycleCount += 20;
          if (XEiJ.MPU_COMPOUND_POSTINCREMENT) {
            return (XEiJ.regRn[ea - (0b101_000 - 8)]  //ベースレジスタ
                    + XEiJ.busRwse ((XEiJ.regPC += 2) - 2));  //pcws。ワードディスプレースメント
          } else {
            t = XEiJ.regPC;
            XEiJ.regPC = t + 2;
            return (XEiJ.regRn[ea - (0b101_000 - 8)]  //ベースレジスタ
                    + XEiJ.busRwse (t));  //pcws。ワードディスプレースメント
          }
        case 0b110_000:  //(d8,A0,Rn.wl)
        case 0b110_001:  //(d8,A1,Rn.wl)
        case 0b110_010:  //(d8,A2,Rn.wl)
        case 0b110_011:  //(d8,A3,Rn.wl)
        case 0b110_100:  //(d8,A4,Rn.wl)
        case 0b110_101:  //(d8,A5,Rn.wl)
        case 0b110_110:  //(d8,A6,Rn.wl)
        case 0b110_111:  //(d8,A7,Rn.wl)
          XEiJ.mpuCycleCount += 22;
          if (XEiJ.MPU_COMPOUND_POSTINCREMENT) {
            w = XEiJ.busRwze ((XEiJ.regPC += 2) - 2);  //pcwz。拡張ワード
          } else {
            w = XEiJ.regPC;
            XEiJ.regPC = w + 2;
            w = XEiJ.busRwze (w);  //pcwz。拡張ワード
          }
          XEiJ.mpuCycleCount += XEiJ.EFA_EXTENSION_CLK[w & 511];
          t = (((~w & 0x0180) == 0 ? 0 :  //ベースレジスタサプレス
                XEiJ.regRn[ea - (0b110_000 - 8)])  //ベースレジスタ
               + (w << 31 - 8 >= 0 ? (byte) w :  //バイトディスプレースメント
                  w << 31 - 5 >= 0 ? 0 :  //ヌルベースディスプレースメント
                  w << 31 - 4 >= 0 ? XEiJ.busRwse ((XEiJ.regPC += 2) - 2) :  //pcws。ワードベースディスプレースメント
                  XEiJ.busRlse ((XEiJ.regPC += 4) - 4)));  //pcls。ロングベースディスプレースメント
          x = ((~w & 0x0140) == 0 ? 0 :  //インデックスサプレス
               (w << 31 - 11 >= 0 ? (short) XEiJ.regRn[w >> 12] :  //ワードインデックス
                XEiJ.regRn[w >> 12])  //ロングインデックス
               << (w >> 9 & 3));  //スケールファクタ。ワードインデックスのときは符号拡張してから掛ける
          return ((w & 0x0103) <= 0x0100 ? t + x :  //メモリ間接なし
                  ((XEiJ.TEST_BIT_2_SHIFT ? w << 31 - 2 >= 0 : (w & 4) == 0) ? XEiJ.busRls (t + x) :  //プリインデックス
                   XEiJ.busRls (t) + x)  //ポストインデックス
                  + ((XEiJ.TEST_BIT_1_SHIFT ? w << 31 - 1 >= 0 : (w & 2) == 0) ? 0 :  //ヌルアウタディスプレースメント
                     (XEiJ.TEST_BIT_0_SHIFT ? w << 31 - 0 >= 0 : (w & 1) == 0) ? XEiJ.busRwse ((XEiJ.regPC += 2) - 2) :  //pcws。ワードアウタディスプレースメント
                     XEiJ.busRlse ((XEiJ.regPC += 4) - 4)));  //pcls。ロングアウタディスプレースメント
        case 0b111_000:  //(xxx).W
          XEiJ.mpuCycleCount += 20;
          return XEiJ.busRwse ((XEiJ.regPC += 2) - 2);  //pcws
        case 0b111_001:  //(xxx).L
          XEiJ.mpuCycleCount += 24;
          return XEiJ.busRlse ((XEiJ.regPC += 4) - 4);  //pcls
        case 0b111_010:  //(d16,PC)
          XEiJ.mpuCycleCount += 20;
          t = XEiJ.regPC;
          XEiJ.regPC = t + 2;
          return (t  //ベースレジスタ
                  + XEiJ.busRwse (t));  //pcws。ワードディスプレースメント
        case 0b111_011:  //(d8,PC,Rn.wl)
          XEiJ.mpuCycleCount += 22;
          t = XEiJ.regPC;
          XEiJ.regPC = t + 2;
          w = XEiJ.busRwze (t);  //pcwz。拡張ワード
          XEiJ.mpuCycleCount += XEiJ.EFA_EXTENSION_CLK[w & 511];
          t = (((~w & 0x0180) == 0 ? 0 :  //ベースレジスタサプレス
                t)  //ベースレジスタ
               + (w << 31 - 8 >= 0 ? (byte) w :  //バイトディスプレースメント
                  w << 31 - 5 >= 0 ? 0 :  //ヌルベースディスプレースメント
                  w << 31 - 4 >= 0 ? XEiJ.busRwse ((XEiJ.regPC += 2) - 2) :  //pcws。ワードベースディスプレースメント
                  XEiJ.busRlse ((XEiJ.regPC += 4) - 4)));  //pcls。ロングベースディスプレースメント
          x = ((~w & 0x0140) == 0 ? 0 :  //インデックスサプレス
               (w << 31 - 11 >= 0 ? (short) XEiJ.regRn[w >> 12] :  //ワードインデックス
                XEiJ.regRn[w >> 12])  //ロングインデックス
               << (w >> 9 & 3));  //スケールファクタ。ワードインデックスのときは符号拡張してから掛ける
          return ((w & 0x0103) <= 0x0100 ? t + x :  //メモリ間接なし
                  ((XEiJ.TEST_BIT_2_SHIFT ? w << 31 - 2 >= 0 : (w & 4) == 0) ? XEiJ.busRls (t + x) :  //プリインデックス
                   XEiJ.busRls (t) + x)  //ポストインデックス
                  + ((XEiJ.TEST_BIT_1_SHIFT ? w << 31 - 1 >= 0 : (w & 2) == 0) ? 0 :  //ヌルアウタディスプレースメント
                     (XEiJ.TEST_BIT_0_SHIFT ? w << 31 - 0 >= 0 : (w & 1) == 0) ? XEiJ.busRwse ((XEiJ.regPC += 2) - 2) :  //pcws。ワードアウタディスプレースメント
                     XEiJ.busRlse ((XEiJ.regPC += 4) - 4)));  //pcls。ロングアウタディスプレースメント
        case 0b111_100:  //#<data>
          XEiJ.mpuCycleCount += 16;
          if (XEiJ.MPU_COMPOUND_POSTINCREMENT) {
            return (XEiJ.regPC += 8) - 8;
          } else {
            t = XEiJ.regPC;
            XEiJ.regPC = t + 8;
            return t;
          }
        }  //switch
        M68kException.m6eNumber = M68kException.M6E_ILLEGAL_INSTRUCTION;
        throw M68kException.m6eSignal;
      }  //efaAnyQuad

      //a = efaMltQuad (ea)  //|  M+-WXZ  |
      //  メモリ可変モードのクワッドオペランドの実効アドレスを求める
      //  efaMltLongとの違いは(Ar)+と-(Ar)がArを8変化させることと、#<data>がPCを8変化させることと、
      //  オペランドのアクセスが2ワード増える分の8サイクルが追加されていること
      @SuppressWarnings ("fallthrough") public static int efaMltQuad (int ea) throws M68kException {
        int t, w, x;
        switch (ea) {
        case 0b010_000:  //(A0)
          if (XEiJ.EFA_SEPARATE_AR) {
            XEiJ.mpuCycleCount += 16;
            return XEiJ.regRn[ 8];
          }
          //fallthrough
        case 0b010_001:  //(A1)
          if (XEiJ.EFA_SEPARATE_AR) {
            XEiJ.mpuCycleCount += 16;
            return XEiJ.regRn[ 9];
          }
          //fallthrough
        case 0b010_010:  //(A2)
          if (XEiJ.EFA_SEPARATE_AR) {
            XEiJ.mpuCycleCount += 16;
            return XEiJ.regRn[10];
          }
          //fallthrough
        case 0b010_011:  //(A3)
          if (XEiJ.EFA_SEPARATE_AR) {
            XEiJ.mpuCycleCount += 16;
            return XEiJ.regRn[11];
          }
          //fallthrough
        case 0b010_100:  //(A4)
          if (XEiJ.EFA_SEPARATE_AR) {
            XEiJ.mpuCycleCount += 16;
            return XEiJ.regRn[12];
          }
          //fallthrough
        case 0b010_101:  //(A5)
          if (XEiJ.EFA_SEPARATE_AR) {
            XEiJ.mpuCycleCount += 16;
            return XEiJ.regRn[13];
          }
          //fallthrough
        case 0b010_110:  //(A6)
          if (XEiJ.EFA_SEPARATE_AR) {
            XEiJ.mpuCycleCount += 16;
            return XEiJ.regRn[14];
          }
          //fallthrough
        case 0b010_111:  //(A7)
          if (XEiJ.EFA_SEPARATE_AR) {
            XEiJ.mpuCycleCount += 16;
            return XEiJ.regRn[15];
          } else {
            XEiJ.mpuCycleCount += 16;
            return XEiJ.regRn[ea - (0b010_000 - 8)];
          }
        case 0b011_000:  //(A0)+
          if (XEiJ.EFA_SEPARATE_AR) {
            XEiJ.mpuCycleCount += 16;
            return (XEiJ.regRn[ 8] += 8) - 8;
          }
          //fallthrough
        case 0b011_001:  //(A1)+
          if (XEiJ.EFA_SEPARATE_AR) {
            XEiJ.mpuCycleCount += 16;
            return (XEiJ.regRn[ 9] += 8) - 8;
          }
          //fallthrough
        case 0b011_010:  //(A2)+
          if (XEiJ.EFA_SEPARATE_AR) {
            XEiJ.mpuCycleCount += 16;
            return (XEiJ.regRn[10] += 8) - 8;
          }
          //fallthrough
        case 0b011_011:  //(A3)+
          if (XEiJ.EFA_SEPARATE_AR) {
            XEiJ.mpuCycleCount += 16;
            return (XEiJ.regRn[11] += 8) - 8;
          }
          //fallthrough
        case 0b011_100:  //(A4)+
          if (XEiJ.EFA_SEPARATE_AR) {
            XEiJ.mpuCycleCount += 16;
            return (XEiJ.regRn[12] += 8) - 8;
          }
          //fallthrough
        case 0b011_101:  //(A5)+
          if (XEiJ.EFA_SEPARATE_AR) {
            XEiJ.mpuCycleCount += 16;
            return (XEiJ.regRn[13] += 8) - 8;
          }
          //fallthrough
        case 0b011_110:  //(A6)+
          if (XEiJ.EFA_SEPARATE_AR) {
            XEiJ.mpuCycleCount += 16;
            return (XEiJ.regRn[14] += 8) - 8;
          }
          //fallthrough
        case 0b011_111:  //(A7)+
          if (XEiJ.EFA_SEPARATE_AR) {
            XEiJ.mpuCycleCount += 16;
            return (XEiJ.regRn[15] += 8) - 8;
          } else {
            XEiJ.mpuCycleCount += 16;
            return (XEiJ.regRn[ea - (0b011_000 - 8)] += 8) - 8;
          }
        case 0b100_000:  //-(A0)
          if (XEiJ.EFA_SEPARATE_AR) {
            XEiJ.mpuCycleCount += 18;
            return XEiJ.regRn[ 8] -= 8;
          }
          //fallthrough
        case 0b100_001:  //-(A1)
          if (XEiJ.EFA_SEPARATE_AR) {
            XEiJ.mpuCycleCount += 18;
            return XEiJ.regRn[ 9] -= 8;
          }
          //fallthrough
        case 0b100_010:  //-(A2)
          if (XEiJ.EFA_SEPARATE_AR) {
            XEiJ.mpuCycleCount += 18;
            return XEiJ.regRn[10] -= 8;
          }
          //fallthrough
        case 0b100_011:  //-(A3)
          if (XEiJ.EFA_SEPARATE_AR) {
            XEiJ.mpuCycleCount += 18;
            return XEiJ.regRn[11] -= 8;
          }
          //fallthrough
        case 0b100_100:  //-(A4)
          if (XEiJ.EFA_SEPARATE_AR) {
            XEiJ.mpuCycleCount += 18;
            return XEiJ.regRn[12] -= 8;
          }
          //fallthrough
        case 0b100_101:  //-(A5)
          if (XEiJ.EFA_SEPARATE_AR) {
            XEiJ.mpuCycleCount += 18;
            return XEiJ.regRn[13] -= 8;
          }
          //fallthrough
        case 0b100_110:  //-(A6)
          if (XEiJ.EFA_SEPARATE_AR) {
            XEiJ.mpuCycleCount += 18;
            return XEiJ.regRn[14] -= 8;
          }
          //fallthrough
        case 0b100_111:  //-(A7)
          if (XEiJ.EFA_SEPARATE_AR) {
            XEiJ.mpuCycleCount += 18;
            return XEiJ.regRn[15] -= 8;
          } else {
            XEiJ.mpuCycleCount += 18;
            return XEiJ.regRn[ea - (0b100_000 - 8)] -= 8;
          }
        case 0b101_000:  //(d16,A0)
        case 0b101_001:  //(d16,A1)
        case 0b101_010:  //(d16,A2)
        case 0b101_011:  //(d16,A3)
        case 0b101_100:  //(d16,A4)
        case 0b101_101:  //(d16,A5)
        case 0b101_110:  //(d16,A6)
        case 0b101_111:  //(d16,A7)
          XEiJ.mpuCycleCount += 20;
          if (XEiJ.MPU_COMPOUND_POSTINCREMENT) {
            return (XEiJ.regRn[ea - (0b101_000 - 8)]  //ベースレジスタ
                    + XEiJ.busRwse ((XEiJ.regPC += 2) - 2));  //pcws。ワードディスプレースメント
          } else {
            t = XEiJ.regPC;
            XEiJ.regPC = t + 2;
            return (XEiJ.regRn[ea - (0b101_000 - 8)]  //ベースレジスタ
                    + XEiJ.busRwse (t));  //pcws。ワードディスプレースメント
          }
        case 0b110_000:  //(d8,A0,Rn.wl)
        case 0b110_001:  //(d8,A1,Rn.wl)
        case 0b110_010:  //(d8,A2,Rn.wl)
        case 0b110_011:  //(d8,A3,Rn.wl)
        case 0b110_100:  //(d8,A4,Rn.wl)
        case 0b110_101:  //(d8,A5,Rn.wl)
        case 0b110_110:  //(d8,A6,Rn.wl)
        case 0b110_111:  //(d8,A7,Rn.wl)
          XEiJ.mpuCycleCount += 22;
          if (XEiJ.MPU_COMPOUND_POSTINCREMENT) {
            w = XEiJ.busRwze ((XEiJ.regPC += 2) - 2);  //pcwz。拡張ワード
          } else {
            w = XEiJ.regPC;
            XEiJ.regPC = w + 2;
            w = XEiJ.busRwze (w);  //pcwz。拡張ワード
          }
          XEiJ.mpuCycleCount += XEiJ.EFA_EXTENSION_CLK[w & 511];
          t = (((~w & 0x0180) == 0 ? 0 :  //ベースレジスタサプレス
                XEiJ.regRn[ea - (0b110_000 - 8)])  //ベースレジスタ
               + (w << 31 - 8 >= 0 ? (byte) w :  //バイトディスプレースメント
                  w << 31 - 5 >= 0 ? 0 :  //ヌルベースディスプレースメント
                  w << 31 - 4 >= 0 ? XEiJ.busRwse ((XEiJ.regPC += 2) - 2) :  //pcws。ワードベースディスプレースメント
                  XEiJ.busRlse ((XEiJ.regPC += 4) - 4)));  //pcls。ロングベースディスプレースメント
          x = ((~w & 0x0140) == 0 ? 0 :  //インデックスサプレス
               (w << 31 - 11 >= 0 ? (short) XEiJ.regRn[w >> 12] :  //ワードインデックス
                XEiJ.regRn[w >> 12])  //ロングインデックス
               << (w >> 9 & 3));  //スケールファクタ。ワードインデックスのときは符号拡張してから掛ける
          return ((w & 0x0103) <= 0x0100 ? t + x :  //メモリ間接なし
                  ((XEiJ.TEST_BIT_2_SHIFT ? w << 31 - 2 >= 0 : (w & 4) == 0) ? XEiJ.busRls (t + x) :  //プリインデックス
                   XEiJ.busRls (t) + x)  //ポストインデックス
                  + ((XEiJ.TEST_BIT_1_SHIFT ? w << 31 - 1 >= 0 : (w & 2) == 0) ? 0 :  //ヌルアウタディスプレースメント
                     (XEiJ.TEST_BIT_0_SHIFT ? w << 31 - 0 >= 0 : (w & 1) == 0) ? XEiJ.busRwse ((XEiJ.regPC += 2) - 2) :  //pcws。ワードアウタディスプレースメント
                     XEiJ.busRlse ((XEiJ.regPC += 4) - 4)));  //pcls。ロングアウタディスプレースメント
        case 0b111_000:  //(xxx).W
          XEiJ.mpuCycleCount += 20;
          return XEiJ.busRwse ((XEiJ.regPC += 2) - 2);  //pcws
        case 0b111_001:  //(xxx).L
          XEiJ.mpuCycleCount += 24;
          return XEiJ.busRlse ((XEiJ.regPC += 4) - 4);  //pcls
        }  //switch
        M68kException.m6eNumber = M68kException.M6E_ILLEGAL_INSTRUCTION;
        throw M68kException.m6eSignal;
      }  //efaMltQuad

      //a = efaAnyExtd (ea)  //|  M+-WXZPI|
      //  任意のモードのエクステンデッドオペランドの実効アドレスを求める
      //  efaAnyQuadとの違いは(Ar)+と-(Ar)がArを12変化させることと、#<data>がPCを12変化させることと、
      //  オペランドのアクセスが2ワード増える分の8サイクルが追加されていること
      @SuppressWarnings ("fallthrough") public static int efaAnyExtd (int ea) throws M68kException {
        int t, w, x;
        switch (ea) {
        case 0b010_000:  //(A0)
          if (XEiJ.EFA_SEPARATE_AR) {
            XEiJ.mpuCycleCount += 24;
            return XEiJ.regRn[ 8];
          }
          //fallthrough
        case 0b010_001:  //(A1)
          if (XEiJ.EFA_SEPARATE_AR) {
            XEiJ.mpuCycleCount += 24;
            return XEiJ.regRn[ 9];
          }
          //fallthrough
        case 0b010_010:  //(A2)
          if (XEiJ.EFA_SEPARATE_AR) {
            XEiJ.mpuCycleCount += 24;
            return XEiJ.regRn[10];
          }
          //fallthrough
        case 0b010_011:  //(A3)
          if (XEiJ.EFA_SEPARATE_AR) {
            XEiJ.mpuCycleCount += 24;
            return XEiJ.regRn[11];
          }
          //fallthrough
        case 0b010_100:  //(A4)
          if (XEiJ.EFA_SEPARATE_AR) {
            XEiJ.mpuCycleCount += 24;
            return XEiJ.regRn[12];
          }
          //fallthrough
        case 0b010_101:  //(A5)
          if (XEiJ.EFA_SEPARATE_AR) {
            XEiJ.mpuCycleCount += 24;
            return XEiJ.regRn[13];
          }
          //fallthrough
        case 0b010_110:  //(A6)
          if (XEiJ.EFA_SEPARATE_AR) {
            XEiJ.mpuCycleCount += 24;
            return XEiJ.regRn[14];
          }
          //fallthrough
        case 0b010_111:  //(A7)
          if (XEiJ.EFA_SEPARATE_AR) {
            XEiJ.mpuCycleCount += 24;
            return XEiJ.regRn[15];
          } else {
            XEiJ.mpuCycleCount += 24;
            return XEiJ.regRn[ea - (0b010_000 - 8)];
          }
        case 0b011_000:  //(A0)+
          if (XEiJ.EFA_SEPARATE_AR) {
            XEiJ.mpuCycleCount += 24;
            return (XEiJ.regRn[ 8] += 12) - 12;
          }
          //fallthrough
        case 0b011_001:  //(A1)+
          if (XEiJ.EFA_SEPARATE_AR) {
            XEiJ.mpuCycleCount += 24;
            return (XEiJ.regRn[ 9] += 12) - 12;
          }
          //fallthrough
        case 0b011_010:  //(A2)+
          if (XEiJ.EFA_SEPARATE_AR) {
            XEiJ.mpuCycleCount += 24;
            return (XEiJ.regRn[10] += 12) - 12;
          }
          //fallthrough
        case 0b011_011:  //(A3)+
          if (XEiJ.EFA_SEPARATE_AR) {
            XEiJ.mpuCycleCount += 24;
            return (XEiJ.regRn[11] += 12) - 12;
          }
          //fallthrough
        case 0b011_100:  //(A4)+
          if (XEiJ.EFA_SEPARATE_AR) {
            XEiJ.mpuCycleCount += 24;
            return (XEiJ.regRn[12] += 12) - 12;
          }
          //fallthrough
        case 0b011_101:  //(A5)+
          if (XEiJ.EFA_SEPARATE_AR) {
            XEiJ.mpuCycleCount += 24;
            return (XEiJ.regRn[13] += 12) - 12;
          }
          //fallthrough
        case 0b011_110:  //(A6)+
          if (XEiJ.EFA_SEPARATE_AR) {
            XEiJ.mpuCycleCount += 24;
            return (XEiJ.regRn[14] += 12) - 12;
          }
          //fallthrough
        case 0b011_111:  //(A7)+
          if (XEiJ.EFA_SEPARATE_AR) {
            XEiJ.mpuCycleCount += 24;
            return (XEiJ.regRn[15] += 12) - 12;
          } else {
            XEiJ.mpuCycleCount += 24;
            return (XEiJ.regRn[ea - (0b011_000 - 8)] += 12) - 12;
          }
        case 0b100_000:  //-(A0)
          if (XEiJ.EFA_SEPARATE_AR) {
            XEiJ.mpuCycleCount += 26;
            return XEiJ.regRn[ 8] -= 12;
          }
          //fallthrough
        case 0b100_001:  //-(A1)
          if (XEiJ.EFA_SEPARATE_AR) {
            XEiJ.mpuCycleCount += 26;
            return XEiJ.regRn[ 9] -= 12;
          }
          //fallthrough
        case 0b100_010:  //-(A2)
          if (XEiJ.EFA_SEPARATE_AR) {
            XEiJ.mpuCycleCount += 26;
            return XEiJ.regRn[10] -= 12;
          }
          //fallthrough
        case 0b100_011:  //-(A3)
          if (XEiJ.EFA_SEPARATE_AR) {
            XEiJ.mpuCycleCount += 26;
            return XEiJ.regRn[11] -= 12;
          }
          //fallthrough
        case 0b100_100:  //-(A4)
          if (XEiJ.EFA_SEPARATE_AR) {
            XEiJ.mpuCycleCount += 26;
            return XEiJ.regRn[12] -= 12;
          }
          //fallthrough
        case 0b100_101:  //-(A5)
          if (XEiJ.EFA_SEPARATE_AR) {
            XEiJ.mpuCycleCount += 26;
            return XEiJ.regRn[13] -= 12;
          }
          //fallthrough
        case 0b100_110:  //-(A6)
          if (XEiJ.EFA_SEPARATE_AR) {
            XEiJ.mpuCycleCount += 26;
            return XEiJ.regRn[14] -= 12;
          }
          //fallthrough
        case 0b100_111:  //-(A7)
          if (XEiJ.EFA_SEPARATE_AR) {
            XEiJ.mpuCycleCount += 26;
            return XEiJ.regRn[15] -= 12;
          } else {
            XEiJ.mpuCycleCount += 26;
            return XEiJ.regRn[ea - (0b100_000 - 8)] -= 12;
          }
        case 0b101_000:  //(d16,A0)
        case 0b101_001:  //(d16,A1)
        case 0b101_010:  //(d16,A2)
        case 0b101_011:  //(d16,A3)
        case 0b101_100:  //(d16,A4)
        case 0b101_101:  //(d16,A5)
        case 0b101_110:  //(d16,A6)
        case 0b101_111:  //(d16,A7)
          XEiJ.mpuCycleCount += 28;
          if (XEiJ.MPU_COMPOUND_POSTINCREMENT) {
            return (XEiJ.regRn[ea - (0b101_000 - 8)]  //ベースレジスタ
                    + XEiJ.busRwse ((XEiJ.regPC += 2) - 2));  //pcws。ワードディスプレースメント
          } else {
            t = XEiJ.regPC;
            XEiJ.regPC = t + 2;
            return (XEiJ.regRn[ea - (0b101_000 - 8)]  //ベースレジスタ
                    + XEiJ.busRwse (t));  //pcws。ワードディスプレースメント
          }
        case 0b110_000:  //(d8,A0,Rn.wl)
        case 0b110_001:  //(d8,A1,Rn.wl)
        case 0b110_010:  //(d8,A2,Rn.wl)
        case 0b110_011:  //(d8,A3,Rn.wl)
        case 0b110_100:  //(d8,A4,Rn.wl)
        case 0b110_101:  //(d8,A5,Rn.wl)
        case 0b110_110:  //(d8,A6,Rn.wl)
        case 0b110_111:  //(d8,A7,Rn.wl)
          XEiJ.mpuCycleCount += 30;
          if (XEiJ.MPU_COMPOUND_POSTINCREMENT) {
            w = XEiJ.busRwze ((XEiJ.regPC += 2) - 2);  //pcwz。拡張ワード
          } else {
            w = XEiJ.regPC;
            XEiJ.regPC = w + 2;
            w = XEiJ.busRwze (w);  //pcwz。拡張ワード
          }
          XEiJ.mpuCycleCount += XEiJ.EFA_EXTENSION_CLK[w & 511];
          t = (((~w & 0x0180) == 0 ? 0 :  //ベースレジスタサプレス
                XEiJ.regRn[ea - (0b110_000 - 8)])  //ベースレジスタ
               + (w << 31 - 8 >= 0 ? (byte) w :  //バイトディスプレースメント
                  w << 31 - 5 >= 0 ? 0 :  //ヌルベースディスプレースメント
                  w << 31 - 4 >= 0 ? XEiJ.busRwse ((XEiJ.regPC += 2) - 2) :  //pcws。ワードベースディスプレースメント
                  XEiJ.busRlse ((XEiJ.regPC += 4) - 4)));  //pcls。ロングベースディスプレースメント
          x = ((~w & 0x0140) == 0 ? 0 :  //インデックスサプレス
               (w << 31 - 11 >= 0 ? (short) XEiJ.regRn[w >> 12] :  //ワードインデックス
                XEiJ.regRn[w >> 12])  //ロングインデックス
               << (w >> 9 & 3));  //スケールファクタ。ワードインデックスのときは符号拡張してから掛ける
          return ((w & 0x0103) <= 0x0100 ? t + x :  //メモリ間接なし
                  ((XEiJ.TEST_BIT_2_SHIFT ? w << 31 - 2 >= 0 : (w & 4) == 0) ? XEiJ.busRls (t + x) :  //プリインデックス
                   XEiJ.busRls (t) + x)  //ポストインデックス
                  + ((XEiJ.TEST_BIT_1_SHIFT ? w << 31 - 1 >= 0 : (w & 2) == 0) ? 0 :  //ヌルアウタディスプレースメント
                     (XEiJ.TEST_BIT_0_SHIFT ? w << 31 - 0 >= 0 : (w & 1) == 0) ? XEiJ.busRwse ((XEiJ.regPC += 2) - 2) :  //pcws。ワードアウタディスプレースメント
                     XEiJ.busRlse ((XEiJ.regPC += 4) - 4)));  //pcls。ロングアウタディスプレースメント
        case 0b111_000:  //(xxx).W
          XEiJ.mpuCycleCount += 28;
          return XEiJ.busRwse ((XEiJ.regPC += 2) - 2);  //pcws
        case 0b111_001:  //(xxx).L
          XEiJ.mpuCycleCount += 32;
          return XEiJ.busRlse ((XEiJ.regPC += 4) - 4);  //pcls
        case 0b111_010:  //(d16,PC)
          XEiJ.mpuCycleCount += 28;
          t = XEiJ.regPC;
          XEiJ.regPC = t + 2;
          return (t  //ベースレジスタ
                  + XEiJ.busRwse (t));  //pcws。ワードディスプレースメント
        case 0b111_011:  //(d8,PC,Rn.wl)
          XEiJ.mpuCycleCount += 30;
          t = XEiJ.regPC;
          XEiJ.regPC = t + 2;
          w = XEiJ.busRwze (t);  //pcwz。拡張ワード
          XEiJ.mpuCycleCount += XEiJ.EFA_EXTENSION_CLK[w & 511];
          t = (((~w & 0x0180) == 0 ? 0 :  //ベースレジスタサプレス
                t)  //ベースレジスタ
               + (w << 31 - 8 >= 0 ? (byte) w :  //バイトディスプレースメント
                  w << 31 - 5 >= 0 ? 0 :  //ヌルベースディスプレースメント
                  w << 31 - 4 >= 0 ? XEiJ.busRwse ((XEiJ.regPC += 2) - 2) :  //pcws。ワードベースディスプレースメント
                  XEiJ.busRlse ((XEiJ.regPC += 4) - 4)));  //pcls。ロングベースディスプレースメント
          x = ((~w & 0x0140) == 0 ? 0 :  //インデックスサプレス
               (w << 31 - 11 >= 0 ? (short) XEiJ.regRn[w >> 12] :  //ワードインデックス
                XEiJ.regRn[w >> 12])  //ロングインデックス
               << (w >> 9 & 3));  //スケールファクタ。ワードインデックスのときは符号拡張してから掛ける
          return ((w & 0x0103) <= 0x0100 ? t + x :  //メモリ間接なし
                  ((XEiJ.TEST_BIT_2_SHIFT ? w << 31 - 2 >= 0 : (w & 4) == 0) ? XEiJ.busRls (t + x) :  //プリインデックス
                   XEiJ.busRls (t) + x)  //ポストインデックス
                  + ((XEiJ.TEST_BIT_1_SHIFT ? w << 31 - 1 >= 0 : (w & 2) == 0) ? 0 :  //ヌルアウタディスプレースメント
                     (XEiJ.TEST_BIT_0_SHIFT ? w << 31 - 0 >= 0 : (w & 1) == 0) ? XEiJ.busRwse ((XEiJ.regPC += 2) - 2) :  //pcws。ワードアウタディスプレースメント
                     XEiJ.busRlse ((XEiJ.regPC += 4) - 4)));  //pcls。ロングアウタディスプレースメント
        case 0b111_100:  //#<data>
          XEiJ.mpuCycleCount += 24;
          if (XEiJ.MPU_COMPOUND_POSTINCREMENT) {
            return (XEiJ.regPC += 12) - 12;
          } else {
            t = XEiJ.regPC;
            XEiJ.regPC = t + 12;
            return t;
          }
        }  //switch
        M68kException.m6eNumber = M68kException.M6E_ILLEGAL_INSTRUCTION;
        throw M68kException.m6eSignal;
      }  //efaAnyExtd

      //a = efaMltExtd (ea)  //|  M+-WXZ  |
      //  メモリ可変モードのエクステンデッドオペランドの実効アドレスを求める
      //  efaMltQuadとの違いは(Ar)+と-(Ar)がArを12変化させることと、#<data>がPCを12変化させることと、
      //  オペランドのアクセスが2ワード増える分の8サイクルが追加されていること
      @SuppressWarnings ("fallthrough") public static int efaMltExtd (int ea) throws M68kException {
        int t, w, x;
        switch (ea) {
        case 0b010_000:  //(A0)
          if (XEiJ.EFA_SEPARATE_AR) {
            XEiJ.mpuCycleCount += 24;
            return XEiJ.regRn[ 8];
          }
          //fallthrough
        case 0b010_001:  //(A1)
          if (XEiJ.EFA_SEPARATE_AR) {
            XEiJ.mpuCycleCount += 24;
            return XEiJ.regRn[ 9];
          }
          //fallthrough
        case 0b010_010:  //(A2)
          if (XEiJ.EFA_SEPARATE_AR) {
            XEiJ.mpuCycleCount += 24;
            return XEiJ.regRn[10];
          }
          //fallthrough
        case 0b010_011:  //(A3)
          if (XEiJ.EFA_SEPARATE_AR) {
            XEiJ.mpuCycleCount += 24;
            return XEiJ.regRn[11];
          }
          //fallthrough
        case 0b010_100:  //(A4)
          if (XEiJ.EFA_SEPARATE_AR) {
            XEiJ.mpuCycleCount += 24;
            return XEiJ.regRn[12];
          }
          //fallthrough
        case 0b010_101:  //(A5)
          if (XEiJ.EFA_SEPARATE_AR) {
            XEiJ.mpuCycleCount += 24;
            return XEiJ.regRn[13];
          }
          //fallthrough
        case 0b010_110:  //(A6)
          if (XEiJ.EFA_SEPARATE_AR) {
            XEiJ.mpuCycleCount += 24;
            return XEiJ.regRn[14];
          }
          //fallthrough
        case 0b010_111:  //(A7)
          if (XEiJ.EFA_SEPARATE_AR) {
            XEiJ.mpuCycleCount += 24;
            return XEiJ.regRn[15];
          } else {
            XEiJ.mpuCycleCount += 24;
            return XEiJ.regRn[ea - (0b010_000 - 8)];
          }
        case 0b011_000:  //(A0)+
          if (XEiJ.EFA_SEPARATE_AR) {
            XEiJ.mpuCycleCount += 24;
            return (XEiJ.regRn[ 8] += 12) - 12;
          }
          //fallthrough
        case 0b011_001:  //(A1)+
          if (XEiJ.EFA_SEPARATE_AR) {
            XEiJ.mpuCycleCount += 24;
            return (XEiJ.regRn[ 9] += 12) - 12;
          }
          //fallthrough
        case 0b011_010:  //(A2)+
          if (XEiJ.EFA_SEPARATE_AR) {
            XEiJ.mpuCycleCount += 24;
            return (XEiJ.regRn[10] += 12) - 12;
          }
          //fallthrough
        case 0b011_011:  //(A3)+
          if (XEiJ.EFA_SEPARATE_AR) {
            XEiJ.mpuCycleCount += 24;
            return (XEiJ.regRn[11] += 12) - 12;
          }
          //fallthrough
        case 0b011_100:  //(A4)+
          if (XEiJ.EFA_SEPARATE_AR) {
            XEiJ.mpuCycleCount += 24;
            return (XEiJ.regRn[12] += 12) - 12;
          }
          //fallthrough
        case 0b011_101:  //(A5)+
          if (XEiJ.EFA_SEPARATE_AR) {
            XEiJ.mpuCycleCount += 24;
            return (XEiJ.regRn[13] += 12) - 12;
          }
          //fallthrough
        case 0b011_110:  //(A6)+
          if (XEiJ.EFA_SEPARATE_AR) {
            XEiJ.mpuCycleCount += 24;
            return (XEiJ.regRn[14] += 12) - 12;
          }
          //fallthrough
        case 0b011_111:  //(A7)+
          if (XEiJ.EFA_SEPARATE_AR) {
            XEiJ.mpuCycleCount += 24;
            return (XEiJ.regRn[15] += 12) - 12;
          } else {
            XEiJ.mpuCycleCount += 24;
            return (XEiJ.regRn[ea - (0b011_000 - 8)] += 12) - 12;
          }
        case 0b100_000:  //-(A0)
        case 0b100_001:  //-(A1)
        case 0b100_010:  //-(A2)
        case 0b100_011:  //-(A3)
        case 0b100_100:  //-(A4)
        case 0b100_101:  //-(A5)
        case 0b100_110:  //-(A6)
        case 0b100_111:  //-(A7)
          XEiJ.mpuCycleCount += 26;
          return XEiJ.regRn[ea - (0b100_000 - 8)] -= 12;
        case 0b101_000:  //(d16,A0)
        case 0b101_001:  //(d16,A1)
        case 0b101_010:  //(d16,A2)
        case 0b101_011:  //(d16,A3)
        case 0b101_100:  //(d16,A4)
        case 0b101_101:  //(d16,A5)
        case 0b101_110:  //(d16,A6)
        case 0b101_111:  //(d16,A7)
          XEiJ.mpuCycleCount += 28;
          if (XEiJ.MPU_COMPOUND_POSTINCREMENT) {
            return (XEiJ.regRn[ea - (0b101_000 - 8)]  //ベースレジスタ
                    + XEiJ.busRwse ((XEiJ.regPC += 2) - 2));  //pcws。ワードディスプレースメント
          } else {
            t = XEiJ.regPC;
            XEiJ.regPC = t + 2;
            return (XEiJ.regRn[ea - (0b101_000 - 8)]  //ベースレジスタ
                    + XEiJ.busRwse (t));  //pcws。ワードディスプレースメント
          }
        case 0b110_000:  //(d8,A0,Rn.wl)
        case 0b110_001:  //(d8,A1,Rn.wl)
        case 0b110_010:  //(d8,A2,Rn.wl)
        case 0b110_011:  //(d8,A3,Rn.wl)
        case 0b110_100:  //(d8,A4,Rn.wl)
        case 0b110_101:  //(d8,A5,Rn.wl)
        case 0b110_110:  //(d8,A6,Rn.wl)
        case 0b110_111:  //(d8,A7,Rn.wl)
          XEiJ.mpuCycleCount += 30;
          if (XEiJ.MPU_COMPOUND_POSTINCREMENT) {
            w = XEiJ.busRwze ((XEiJ.regPC += 2) - 2);  //pcwz。拡張ワード
          } else {
            w = XEiJ.regPC;
            XEiJ.regPC = w + 2;
            w = XEiJ.busRwze (w);  //pcwz。拡張ワード
          }
          XEiJ.mpuCycleCount += XEiJ.EFA_EXTENSION_CLK[w & 511];
          t = (((~w & 0x0180) == 0 ? 0 :  //ベースレジスタサプレス
                XEiJ.regRn[ea - (0b110_000 - 8)])  //ベースレジスタ
               + (w << 31 - 8 >= 0 ? (byte) w :  //バイトディスプレースメント
                  w << 31 - 5 >= 0 ? 0 :  //ヌルベースディスプレースメント
                  w << 31 - 4 >= 0 ? XEiJ.busRwse ((XEiJ.regPC += 2) - 2) :  //pcws。ワードベースディスプレースメント
                  XEiJ.busRlse ((XEiJ.regPC += 4) - 4)));  //pcls。ロングベースディスプレースメント
          x = ((~w & 0x0140) == 0 ? 0 :  //インデックスサプレス
               (w << 31 - 11 >= 0 ? (short) XEiJ.regRn[w >> 12] :  //ワードインデックス
                XEiJ.regRn[w >> 12])  //ロングインデックス
               << (w >> 9 & 3));  //スケールファクタ。ワードインデックスのときは符号拡張してから掛ける
          return ((w & 0x0103) <= 0x0100 ? t + x :  //メモリ間接なし
                  ((XEiJ.TEST_BIT_2_SHIFT ? w << 31 - 2 >= 0 : (w & 4) == 0) ? XEiJ.busRls (t + x) :  //プリインデックス
                   XEiJ.busRls (t) + x)  //ポストインデックス
                  + ((XEiJ.TEST_BIT_1_SHIFT ? w << 31 - 1 >= 0 : (w & 2) == 0) ? 0 :  //ヌルアウタディスプレースメント
                     (XEiJ.TEST_BIT_0_SHIFT ? w << 31 - 0 >= 0 : (w & 1) == 0) ? XEiJ.busRwse ((XEiJ.regPC += 2) - 2) :  //pcws。ワードアウタディスプレースメント
                     XEiJ.busRlse ((XEiJ.regPC += 4) - 4)));  //pcls。ロングアウタディスプレースメント
        case 0b111_000:  //(xxx).W
          XEiJ.mpuCycleCount += 28;
          return XEiJ.busRwse ((XEiJ.regPC += 2) - 2);  //pcws
        case 0b111_001:  //(xxx).L
          XEiJ.mpuCycleCount += 32;
          return XEiJ.busRlse ((XEiJ.regPC += 4) - 4);  //pcls
        }  //switch
        M68kException.m6eNumber = M68kException.M6E_ILLEGAL_INSTRUCTION;
        throw M68kException.m6eSignal;
      }  //efaMltExtd

      //a = efaLeaPea (ea)  //|  M  WXZP |
      //  LEA命令とPEA命令のオペランドの実効アドレスを求める
      //  efaCntWordとの違いはサイクル数のみ
      //  LEA命令のベースサイクル数4を含んでいるのでLEA命令ではベースサイクル数を加えなくてよい
      //  PEA命令のベースサイクル数は12-4=8
      @SuppressWarnings ("fallthrough") public static int efaLeaPea (int ea) throws M68kException {
        int t, w, x;
        switch (ea) {
        case 0b010_000:  //(A0)
          if (XEiJ.EFA_SEPARATE_AR) {
            XEiJ.mpuCycleCount += 4;
            return XEiJ.regRn[ 8];
          }
          //fallthrough
        case 0b010_001:  //(A1)
          if (XEiJ.EFA_SEPARATE_AR) {
            XEiJ.mpuCycleCount += 4;
            return XEiJ.regRn[ 9];
          }
          //fallthrough
        case 0b010_010:  //(A2)
          if (XEiJ.EFA_SEPARATE_AR) {
            XEiJ.mpuCycleCount += 4;
            return XEiJ.regRn[10];
          }
          //fallthrough
        case 0b010_011:  //(A3)
          if (XEiJ.EFA_SEPARATE_AR) {
            XEiJ.mpuCycleCount += 4;
            return XEiJ.regRn[11];
          }
          //fallthrough
        case 0b010_100:  //(A4)
          if (XEiJ.EFA_SEPARATE_AR) {
            XEiJ.mpuCycleCount += 4;
            return XEiJ.regRn[12];
          }
          //fallthrough
        case 0b010_101:  //(A5)
          if (XEiJ.EFA_SEPARATE_AR) {
            XEiJ.mpuCycleCount += 4;
            return XEiJ.regRn[13];
          }
          //fallthrough
        case 0b010_110:  //(A6)
          if (XEiJ.EFA_SEPARATE_AR) {
            XEiJ.mpuCycleCount += 4;
            return XEiJ.regRn[14];
          }
          //fallthrough
        case 0b010_111:  //(A7)
          if (XEiJ.EFA_SEPARATE_AR) {
            XEiJ.mpuCycleCount += 4;
            return XEiJ.regRn[15];
          } else {
            XEiJ.mpuCycleCount += 4;
            return XEiJ.regRn[ea - (0b010_000 - 8)];
          }
        case 0b101_000:  //(d16,A0)
        case 0b101_001:  //(d16,A1)
        case 0b101_010:  //(d16,A2)
        case 0b101_011:  //(d16,A3)
        case 0b101_100:  //(d16,A4)
        case 0b101_101:  //(d16,A5)
        case 0b101_110:  //(d16,A6)
        case 0b101_111:  //(d16,A7)
          XEiJ.mpuCycleCount += 8;
          if (XEiJ.MPU_COMPOUND_POSTINCREMENT) {
            return (XEiJ.regRn[ea - (0b101_000 - 8)]  //ベースレジスタ
                    + XEiJ.busRwse ((XEiJ.regPC += 2) - 2));  //pcws。ワードディスプレースメント
          } else {
            t = XEiJ.regPC;
            XEiJ.regPC = t + 2;
            return (XEiJ.regRn[ea - (0b101_000 - 8)]  //ベースレジスタ
                    + XEiJ.busRwse (t));  //pcws。ワードディスプレースメント
          }
        case 0b110_000:  //(d8,A0,Rn.wl)
        case 0b110_001:  //(d8,A1,Rn.wl)
        case 0b110_010:  //(d8,A2,Rn.wl)
        case 0b110_011:  //(d8,A3,Rn.wl)
        case 0b110_100:  //(d8,A4,Rn.wl)
        case 0b110_101:  //(d8,A5,Rn.wl)
        case 0b110_110:  //(d8,A6,Rn.wl)
        case 0b110_111:  //(d8,A7,Rn.wl)
          XEiJ.mpuCycleCount += 12;
          if (XEiJ.MPU_COMPOUND_POSTINCREMENT) {
            w = XEiJ.busRwze ((XEiJ.regPC += 2) - 2);  //pcwz。拡張ワード
          } else {
            w = XEiJ.regPC;
            XEiJ.regPC = w + 2;
            w = XEiJ.busRwze (w);  //pcwz。拡張ワード
          }
          XEiJ.mpuCycleCount += XEiJ.EFA_EXTENSION_CLK[w & 511];
          t = (((~w & 0x0180) == 0 ? 0 :  //ベースレジスタサプレス
                XEiJ.regRn[ea - (0b110_000 - 8)])  //ベースレジスタ
               + (w << 31 - 8 >= 0 ? (byte) w :  //バイトディスプレースメント
                  w << 31 - 5 >= 0 ? 0 :  //ヌルベースディスプレースメント
                  w << 31 - 4 >= 0 ? XEiJ.busRwse ((XEiJ.regPC += 2) - 2) :  //pcws。ワードベースディスプレースメント
                  XEiJ.busRlse ((XEiJ.regPC += 4) - 4)));  //pcls。ロングベースディスプレースメント
          x = ((~w & 0x0140) == 0 ? 0 :  //インデックスサプレス
               (w << 31 - 11 >= 0 ? (short) XEiJ.regRn[w >> 12] :  //ワードインデックス
                XEiJ.regRn[w >> 12])  //ロングインデックス
               << (w >> 9 & 3));  //スケールファクタ。ワードインデックスのときは符号拡張してから掛ける
          return ((w & 0x0103) <= 0x0100 ? t + x :  //メモリ間接なし
                  ((XEiJ.TEST_BIT_2_SHIFT ? w << 31 - 2 >= 0 : (w & 4) == 0) ? XEiJ.busRls (t + x) :  //プリインデックス
                   XEiJ.busRls (t) + x)  //ポストインデックス
                  + ((XEiJ.TEST_BIT_1_SHIFT ? w << 31 - 1 >= 0 : (w & 2) == 0) ? 0 :  //ヌルアウタディスプレースメント
                     (XEiJ.TEST_BIT_0_SHIFT ? w << 31 - 0 >= 0 : (w & 1) == 0) ? XEiJ.busRwse ((XEiJ.regPC += 2) - 2) :  //pcws。ワードアウタディスプレースメント
                     XEiJ.busRlse ((XEiJ.regPC += 4) - 4)));  //pcls。ロングアウタディスプレースメント
        case 0b111_000:  //(xxx).W
          XEiJ.mpuCycleCount += 8;
          return XEiJ.busRwse ((XEiJ.regPC += 2) - 2);  //pcws
        case 0b111_001:  //(xxx).L
          XEiJ.mpuCycleCount += 12;
          return XEiJ.busRlse ((XEiJ.regPC += 4) - 4);  //pcls
        case 0b111_010:  //(d16,PC)
          XEiJ.mpuCycleCount += 8;
          t = XEiJ.regPC;
          XEiJ.regPC = t + 2;
          return (t  //ベースレジスタ
                  + XEiJ.busRwse (t));  //pcws。ワードディスプレースメント
        case 0b111_011:  //(d8,PC,Rn.wl)
          XEiJ.mpuCycleCount += 12;
          t = XEiJ.regPC;
          XEiJ.regPC = t + 2;
          w = XEiJ.busRwze (t);  //pcwz。拡張ワード
          XEiJ.mpuCycleCount += XEiJ.EFA_EXTENSION_CLK[w & 511];
          t = (((~w & 0x0180) == 0 ? 0 :  //ベースレジスタサプレス
                t)  //ベースレジスタ
               + (w << 31 - 8 >= 0 ? (byte) w :  //バイトディスプレースメント
                  w << 31 - 5 >= 0 ? 0 :  //ヌルベースディスプレースメント
                  w << 31 - 4 >= 0 ? XEiJ.busRwse ((XEiJ.regPC += 2) - 2) :  //pcws。ワードベースディスプレースメント
                  XEiJ.busRlse ((XEiJ.regPC += 4) - 4)));  //pcls。ロングベースディスプレースメント
          x = ((~w & 0x0140) == 0 ? 0 :  //インデックスサプレス
               (w << 31 - 11 >= 0 ? (short) XEiJ.regRn[w >> 12] :  //ワードインデックス
                XEiJ.regRn[w >> 12])  //ロングインデックス
               << (w >> 9 & 3));  //スケールファクタ。ワードインデックスのときは符号拡張してから掛ける
          return ((w & 0x0103) <= 0x0100 ? t + x :  //メモリ間接なし
                  ((XEiJ.TEST_BIT_2_SHIFT ? w << 31 - 2 >= 0 : (w & 4) == 0) ? XEiJ.busRls (t + x) :  //プリインデックス
                   XEiJ.busRls (t) + x)  //ポストインデックス
                  + ((XEiJ.TEST_BIT_1_SHIFT ? w << 31 - 1 >= 0 : (w & 2) == 0) ? 0 :  //ヌルアウタディスプレースメント
                     (XEiJ.TEST_BIT_0_SHIFT ? w << 31 - 0 >= 0 : (w & 1) == 0) ? XEiJ.busRwse ((XEiJ.regPC += 2) - 2) :  //pcws。ワードアウタディスプレースメント
                     XEiJ.busRlse ((XEiJ.regPC += 4) - 4)));  //pcls。ロングアウタディスプレースメント
        }  //switch
        M68kException.m6eNumber = M68kException.M6E_ILLEGAL_INSTRUCTION;
        throw M68kException.m6eSignal;
      }  //efaLeaPea

      //a = efaJmpJsr (ea)  //|  M  WXZP |
      //  JMP命令とJSR命令のオペランドの実効アドレスを求める
      //  efaCntWordとの違いはサイクル数のみ
      //  JMP命令のベースサイクル数8を含んでいるのでJMP命令ではベースサイクル数を加えなくてよい
      //  JSR命令のベースサイクル数は16-8=8
      @SuppressWarnings ("fallthrough") public static int efaJmpJsr (int ea) throws M68kException {
        int t, w, x;
        switch (ea) {
        case 0b010_000:  //(A0)
          if (XEiJ.EFA_SEPARATE_AR) {
            XEiJ.mpuCycleCount += 8;
            return XEiJ.regRn[ 8];
          }
          //fallthrough
        case 0b010_001:  //(A1)
          if (XEiJ.EFA_SEPARATE_AR) {
            XEiJ.mpuCycleCount += 8;
            return XEiJ.regRn[ 9];
          }
          //fallthrough
        case 0b010_010:  //(A2)
          if (XEiJ.EFA_SEPARATE_AR) {
            XEiJ.mpuCycleCount += 8;
            return XEiJ.regRn[10];
          }
          //fallthrough
        case 0b010_011:  //(A3)
          if (XEiJ.EFA_SEPARATE_AR) {
            XEiJ.mpuCycleCount += 8;
            return XEiJ.regRn[11];
          }
          //fallthrough
        case 0b010_100:  //(A4)
          if (XEiJ.EFA_SEPARATE_AR) {
            XEiJ.mpuCycleCount += 8;
            return XEiJ.regRn[12];
          }
          //fallthrough
        case 0b010_101:  //(A5)
          if (XEiJ.EFA_SEPARATE_AR) {
            XEiJ.mpuCycleCount += 8;
            return XEiJ.regRn[13];
          }
          //fallthrough
        case 0b010_110:  //(A6)
          if (XEiJ.EFA_SEPARATE_AR) {
            XEiJ.mpuCycleCount += 8;
            return XEiJ.regRn[14];
          }
          //fallthrough
        case 0b010_111:  //(A7)
          if (XEiJ.EFA_SEPARATE_AR) {
            XEiJ.mpuCycleCount += 8;
            return XEiJ.regRn[15];
          } else {
            XEiJ.mpuCycleCount += 8;
            return XEiJ.regRn[ea - (0b010_000 - 8)];
          }
        case 0b101_000:  //(d16,A0)
        case 0b101_001:  //(d16,A1)
        case 0b101_010:  //(d16,A2)
        case 0b101_011:  //(d16,A3)
        case 0b101_100:  //(d16,A4)
        case 0b101_101:  //(d16,A5)
        case 0b101_110:  //(d16,A6)
        case 0b101_111:  //(d16,A7)
          XEiJ.mpuCycleCount += 10;
          if (XEiJ.MPU_COMPOUND_POSTINCREMENT) {
            return (XEiJ.regRn[ea - (0b101_000 - 8)]  //ベースレジスタ
                    + XEiJ.busRwse ((XEiJ.regPC += 2) - 2));  //pcws。ワードディスプレースメント
          } else {
            t = XEiJ.regPC;
            XEiJ.regPC = t + 2;
            return (XEiJ.regRn[ea - (0b101_000 - 8)]  //ベースレジスタ
                    + XEiJ.busRwse (t));  //pcws。ワードディスプレースメント
          }
        case 0b110_000:  //(d8,A0,Rn.wl)
        case 0b110_001:  //(d8,A1,Rn.wl)
        case 0b110_010:  //(d8,A2,Rn.wl)
        case 0b110_011:  //(d8,A3,Rn.wl)
        case 0b110_100:  //(d8,A4,Rn.wl)
        case 0b110_101:  //(d8,A5,Rn.wl)
        case 0b110_110:  //(d8,A6,Rn.wl)
        case 0b110_111:  //(d8,A7,Rn.wl)
          XEiJ.mpuCycleCount += 14;
          if (XEiJ.MPU_COMPOUND_POSTINCREMENT) {
            w = XEiJ.busRwze ((XEiJ.regPC += 2) - 2);  //pcwz。拡張ワード
          } else {
            w = XEiJ.regPC;
            XEiJ.regPC = w + 2;
            w = XEiJ.busRwze (w);  //pcwz。拡張ワード
          }
          XEiJ.mpuCycleCount += XEiJ.EFA_EXTENSION_CLK[w & 511];
          t = (((~w & 0x0180) == 0 ? 0 :  //ベースレジスタサプレス
                XEiJ.regRn[ea - (0b110_000 - 8)])  //ベースレジスタ
               + (w << 31 - 8 >= 0 ? (byte) w :  //バイトディスプレースメント
                  w << 31 - 5 >= 0 ? 0 :  //ヌルベースディスプレースメント
                  w << 31 - 4 >= 0 ? XEiJ.busRwse ((XEiJ.regPC += 2) - 2) :  //pcws。ワードベースディスプレースメント
                  XEiJ.busRlse ((XEiJ.regPC += 4) - 4)));  //pcls。ロングベースディスプレースメント
          x = ((~w & 0x0140) == 0 ? 0 :  //インデックスサプレス
               (w << 31 - 11 >= 0 ? (short) XEiJ.regRn[w >> 12] :  //ワードインデックス
                XEiJ.regRn[w >> 12])  //ロングインデックス
               << (w >> 9 & 3));  //スケールファクタ。ワードインデックスのときは符号拡張してから掛ける
          return ((w & 0x0103) <= 0x0100 ? t + x :  //メモリ間接なし
                  ((XEiJ.TEST_BIT_2_SHIFT ? w << 31 - 2 >= 0 : (w & 4) == 0) ? XEiJ.busRls (t + x) :  //プリインデックス
                   XEiJ.busRls (t) + x)  //ポストインデックス
                  + ((XEiJ.TEST_BIT_1_SHIFT ? w << 31 - 1 >= 0 : (w & 2) == 0) ? 0 :  //ヌルアウタディスプレースメント
                     (XEiJ.TEST_BIT_0_SHIFT ? w << 31 - 0 >= 0 : (w & 1) == 0) ? XEiJ.busRwse ((XEiJ.regPC += 2) - 2) :  //pcws。ワードアウタディスプレースメント
                     XEiJ.busRlse ((XEiJ.regPC += 4) - 4)));  //pcls。ロングアウタディスプレースメント
        case 0b111_000:  //(xxx).W
          XEiJ.mpuCycleCount += 10;
          return XEiJ.busRwse ((XEiJ.regPC += 2) - 2);  //pcws
        case 0b111_001:  //(xxx).L
          XEiJ.mpuCycleCount += 12;
          return XEiJ.busRlse ((XEiJ.regPC += 4) - 4);  //pcls
        case 0b111_010:  //(d16,PC)
          XEiJ.mpuCycleCount += 10;
          t = XEiJ.regPC;
          XEiJ.regPC = t + 2;
          return (t  //ベースレジスタ
                  + XEiJ.busRwse (t));  //pcws。ワードディスプレースメント
        case 0b111_011:  //(d8,PC,Rn.wl)
          XEiJ.mpuCycleCount += 14;
          t = XEiJ.regPC;
          XEiJ.regPC = t + 2;
          w = XEiJ.busRwze (t);  //pcwz。拡張ワード
          XEiJ.mpuCycleCount += XEiJ.EFA_EXTENSION_CLK[w & 511];
          t = (((~w & 0x0180) == 0 ? 0 :  //ベースレジスタサプレス
                t)  //ベースレジスタ
               + (w << 31 - 8 >= 0 ? (byte) w :  //バイトディスプレースメント
                  w << 31 - 5 >= 0 ? 0 :  //ヌルベースディスプレースメント
                  w << 31 - 4 >= 0 ? XEiJ.busRwse ((XEiJ.regPC += 2) - 2) :  //pcws。ワードベースディスプレースメント
                  XEiJ.busRlse ((XEiJ.regPC += 4) - 4)));  //pcls。ロングベースディスプレースメント
          x = ((~w & 0x0140) == 0 ? 0 :  //インデックスサプレス
               (w << 31 - 11 >= 0 ? (short) XEiJ.regRn[w >> 12] :  //ワードインデックス
                XEiJ.regRn[w >> 12])  //ロングインデックス
               << (w >> 9 & 3));  //スケールファクタ。ワードインデックスのときは符号拡張してから掛ける
          return ((w & 0x0103) <= 0x0100 ? t + x :  //メモリ間接なし
                  ((XEiJ.TEST_BIT_2_SHIFT ? w << 31 - 2 >= 0 : (w & 4) == 0) ? XEiJ.busRls (t + x) :  //プリインデックス
                   XEiJ.busRls (t) + x)  //ポストインデックス
                  + ((XEiJ.TEST_BIT_1_SHIFT ? w << 31 - 1 >= 0 : (w & 2) == 0) ? 0 :  //ヌルアウタディスプレースメント
                     (XEiJ.TEST_BIT_0_SHIFT ? w << 31 - 0 >= 0 : (w & 1) == 0) ? XEiJ.busRwse ((XEiJ.regPC += 2) - 2) :  //pcws。ワードアウタディスプレースメント
                     XEiJ.busRlse ((XEiJ.regPC += 4) - 4)));  //pcls。ロングアウタディスプレースメント
        }  //switch
        M68kException.m6eNumber = M68kException.M6E_ILLEGAL_INSTRUCTION;
        throw M68kException.m6eSignal;
      }  //efaJmpJsr

    }  //class MC68EC030

1 2 3
STUDIO KAMADA
Copyright © 1999-2026 Makoto Kamada