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