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