xeij/MC68EC030.java (3/3)
1 2 3 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;
} //efaCntWord
//a = efaCltWord (ea) //| M WXZ |
// 制御可変モードのワードオペランドの実効アドレスを求める
// efaCntWordとの違いは(d16,PC)と(d8,PC,Rn.wl)がないこと
// efaCltLongとの違いはサイクル数のみ
@SuppressWarnings ("fallthrough") public static int efaCltWord (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 += 10;
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
} //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
//コプロ命令途中割り込みとコプロプロトコル違反
// 擬似的に「エラー($000D)が発生しました」が出るようにする
//
// リセット
// 終了時刻は現在時刻
// NULLステートをセット
// 通常状態に移行
// FP0-FP7はqNaN
// FPCR/FPSR/FPIARは0
// FSAVE
// NULLステート
// headは0x00380000
// nは0
// サイクル数は14
// IDLEステート
// headは0x1f380000
// nは0x38>>2
// 通常状態または命令途中を保存
// body2は通常状態は0、命令途中0x0f800000
// cyclesは68881は50、68882は98
// 実効アドレスを求める
// ステートフレームを書く
// -(Ar)
// 末尾から
// Arを書き換える
// -(Ar)以外
// 先頭から
// 通常状態に移行
// 終了時刻を設定
// FRESTORE
// 実効アドレスを求める
// ステートフレームの先頭を読む
// NULLステート
// cyclesは19
// リセット
// IDLEステートまたは不明
// cyclesは68881は55、68882は103
// ステートフレームの本体を読む
// 先頭から
// 通常状態または命令途中を復元
// NULLステートをクリア
// (Ar)+のときArを書き換える
// 終了時刻を設定
// FSAVE/FRESTORE以外のコプロ命令
// NULLステートをクリア
// 命令途中
// 通常状態に移行
// 終了時刻は現在時刻
// プロトコル違反
// 終了時刻前
// 待機中に移行
// PCを巻き戻す
// 終了時刻後
// 通常状態に移行
// 終了時刻を設定
// コプロ命令を実行
// 割り込み
// 待機中
// 命令途中に移行
// フォーマット$9のスタックフレームをプッシュ
// 待機中でない
// フォーマット$0のスタックフレームをプッシュ
// RTE
// スタックフレームをポップ
// フォーマット$9
// 通常状態に移行
//
static final boolean CPV_ON = true;
static final long CPV_FREQ = 33333333; //コプロの動作周波数。33MHz
static long cpvEndTime; //終了時刻
static boolean cpvNullState; //NULLステート
static final int CPV_NORMAL = 0; //通常状態
static final int CPV_WAITING = 1; //待機中
static final int CPV_MID_INSTRUCTION = 2; //命令途中
static int cpvStatus; //状態
//cpvReset ()
// リセット
static void cpvReset () {
//終了時刻は現在時刻
cpvEndTime = XEiJ.mpuClockTime;
//NULLステートをセット
cpvNullState = true;
//通常状態に移行
cpvStatus = CPV_NORMAL;
//FP0-FP7はqNaN
for (int n = 0; n < 8; n++) {
XEiJ.fpuBox.epbFPn[n].setnan ();
}
//FPCR/FPSR/FPIARは0
XEiJ.fpuBox.epbFpcr = 0;
XEiJ.fpuBox.epbFpsr = 0;
XEiJ.fpuBox.epbFpiar = 0;
} //cpvReset
//done = cpvCommon (w)
// FSAVE/FRESTORE以外のコプロ命令
static boolean cpvCommon (int w) throws M68kException {
//NULLステートをクリア
cpvNullState = false;
if (cpvStatus == CPV_MID_INSTRUCTION) { //命令途中
//通常状態に移行
cpvStatus = CPV_NORMAL;
//終了時刻は現在時刻
cpvEndTime = XEiJ.mpuClockTime;
//プロトコル違反
XEiJ.mpuCycleCount += 34;
int vectorNumber = 0x000d;
int save_sr = XEiJ.regSRT1 | XEiJ.regSRT0 | XEiJ.regSRS | XEiJ.regSRM | XEiJ.regSRI | XEiJ.regCCR;
int sp = XEiJ.regRn[15];
XEiJ.regSRT1 = XEiJ.regSRT0 = 0; //srのTビットを消す
if (XEiJ.regSRS == 0) { //ユーザモードのとき
XEiJ.regSRS = XEiJ.REG_SR_S; //スーパーバイザモードへ移行する
XEiJ.mpuUSP = sp; //USPを保存
sp = XEiJ.regSRM != 0 ? XEiJ.mpuMSP : XEiJ.mpuISP; //SSPを復元
if (DataBreakPoint.DBP_ON) {
DataBreakPoint.dbpMemoryMap = DataBreakPoint.dbpSuperMap; //スーパーバイザメモリマップに切り替える
} else {
XEiJ.busMemoryMap = XEiJ.busSuperMap; //スーパーバイザメモリマップに切り替える
}
if (InstructionBreakPoint.IBP_ON) {
InstructionBreakPoint.ibpOp1MemoryMap = InstructionBreakPoint.ibpOp1SuperMap;
}
}
XEiJ.regRn[15] = (sp -= 20);
//+16
// プログラムの中の無関係な命令やスタックエリアなどを指している
// たまたまバスに乗っていたアドレスを指しているような乱雑さで詳細は不明
XEiJ.busWl (sp + 16, XEiJ.regPC0);
//+12
// 0x000ff230、0x000ff23cなど
// 違う命令でも同じだったり同じ命令でもオペランドによって違ったりする
// 同じ命令かつ同じオペランドだと同じようなのでルールはあるようだが詳細は不明
XEiJ.busWl (sp + 12, 0x000ff200);
XEiJ.busWl (sp + 8, XEiJ.regPC0); //命令の先頭
XEiJ.busWw (sp + 6, 0x9000 | (vectorNumber << 2)); //フォーマットとオフセット
XEiJ.busWl (sp + 2, XEiJ.regPC); //次にフェッチするアドレス。次の命令とは限らない
XEiJ.busWw (sp, save_sr); //sr
irpSetPC (XEiJ.busRlsf (XEiJ.mpuVBR + (vectorNumber << 2))); //例外ベクタを取り出してジャンプする
return true;
} else if ((XEiJ.mpuClockTime - cpvEndTime) < 0L) { //終了時刻前
//待機中に移行
cpvStatus = CPV_WAITING;
//PCを巻き戻す
XEiJ.regPC = XEiJ.regPC0;
XEiJ.mpuCycleCount += 4;
return true;
} else { //終了時刻後
//通常状態に移行
cpvStatus = CPV_NORMAL;
//終了時刻を設定
int cycles = 0;
if (w == -1) { //FScc/FDBcc/FTRAPcc
int mmm_000 = XEiJ.regOC & 0b111_000;
if (mmm_000 == 0b001_000) { //FDBcc
// 真で分岐しないとき18、偽で分岐しないとき22、偽で分岐するとき18
cycles += 18;
} else if (mmm_000 == 0b111_000) { //FTRAPcc
// トラップするとき36、しないとき16、ワードは+2、ロングは+4
cycles += 16;
} else { //FScc
// Drは16、(Ar)+と-(Ar)は真のとき18、偽のとき17、他は16+ea
cycles += 16;
}
} else if (w == -2) { //FBccW
// 分岐するとき18、分岐しないとき16
// FNOPはFBF.W (*)+4の別名
cycles += 16;
} else if (w == -3) { //FBccL
// 分岐するとき18、分岐しないとき16
cycles += 16;
} else { //Fgen
int t = w >> 13;
int m = w >> 10 & 7;
//int n = w >> 7 & 7;
//int c = w & 0x7f;
int i = (XEiJ.currentCopro0 & 2) != 0 ? 1 : 0; //0=68881,1=68882
if (t == 0) {
//$0xxx-$1xxx: Fop.X FPm,FPn
int c = w & 0x3f; //6bit
cycles += CPV_REG[i << 9 | c << 3 | 7];
} else if (t == 2 && m == 7) {
//$5Cxx-$5Fxx: FMOVECR.X #c,FPn
cycles += CPV_CR[i];
} else if (t == 2) {
//$40xx-$5Bxx: F[op]c.[LSXPWDB]m <ea>,FPn
// srcがRnのとき-5、dstがRnのとき-2
int c = w & 0x3f; //6bit
cycles += CPV_REG[i << 9 | c << 3 | m];
} else if (t == 3) {
//$6xxx-$7xxx: FMOVE.[LSXPsWDBPd]m FPn,<ea>
cycles += CPV_MEM[i << 3 | m];
} else if (t == 4) {
//$8xxx-$9xxx: FMOVEM.L <ea>,FPCR/FPSR/FPIAR
// 25+6n n==1でsrcがRrのとき-5、dstがRrのとき-2
} else if (t == 5) {
//$Axxx-$Bxxx: FMOVEM.L FPCR/FPSR/FPIAR,<ea>
// 25+6n n==1でsrcがRrのとき-5、dstがRrのとき-2
} else if (t == 6) {
//$Cxxx-$Dxxx: FMOVEM.X <ea>,<list>
// 33+31n listがDrのとき+14
} else if (t == 8) {
//$Exxx-$Fxxx: FMOVEM.X <list>,<ea>
// 35+25n listがDrのとき+14
}
}
cpvEndTime = XEiJ.mpuClockTime + (XEiJ.TMR_FREQ / CPV_FREQ) * cycles;
//コプロ命令を実行
return false;
}
} //cpvCommon
//CPV_CR
// FMOVECR.X #c,FPnのサイクル数
//!!! Totalのみ
/*
public static final char[] CPV_CR = {
//68881
29,
//68882
32,
};
*/
//perl ../misc/itoc.pl MC68EC030.java CPV_CR
public static final char[] CPV_CR = "\35 ".toCharArray ();
//CPV_MEM
// FMOVE.* FPn,<ea>のサイクル数
//!!! Totalのみ
/*
public static final char[] CPV_MEM = {
//68881
//L S X Ps W D B Pd
100, 80, 72, 2002, 100, 86, 100, 2016,
//68882
//L S X Ps W D B Pd
110, 38, 50, 2006, 110, 44, 110, 2020,
};
*/
//perl ../misc/itoc.pl MC68EC030.java CPV_MEM
public static final char[] CPV_MEM = "dPH\u07d2dVd\u07e0n&2\u07d6n,n\u07e4".toCharArray ();
//CPV_REG
// Fop.* *,FPnのサイクル数
//!!! Totalのみ
/*
public static final char[] CPV_REG = {
//68881
//L S X P W D B FPm
60, 52, 56, 870, 60, 58, 60, 33, //$xx00: FMOVE.* *m,FPn
82, 74, 78, 892, 82, 80, 82, 55, //$xx01: FINT.* *m,FPn
714, 706, 710, 1524, 714, 712, 714, 687, //$xx02: FSINH.* *m,FPn
82, 74, 78, 892, 82, 80, 82, 55, //$xx03: FINTRZ.* *m,FPn
134, 126, 130, 944, 134, 132, 134, 107, //$xx04: FSQRT.* *m,FPn
134, 126, 130, 944, 134, 132, 134, 107, //$xx05: FSQRT.* *m,FPn (MC68882)
598, 590, 594, 1408, 598, 596, 598, 571, //$xx06: FLOGNP1.* *m,FPn
598, 590, 594, 1408, 598, 596, 598, 571, //$xx07: FLOGNP1.* *m,FPn (MC68882)
572, 564, 568, 1382, 572, 570, 572, 545, //$xx08: FETOXM1.* *m,FPn
688, 680, 684, 1498, 688, 686, 688, 661, //$xx09: FTANH.* *m,FPn
430, 422, 426, 1240, 430, 428, 430, 403, //$xx0A: FATAN.* *m,FPn
430, 422, 426, 1240, 430, 428, 430, 403, //$xx0B: FATAN.* *m,FPn (MC68882)
608, 600, 604, 1418, 608, 606, 608, 581, //$xx0C: FASIN.* *m,FPn
720, 712, 716, 1530, 720, 718, 720, 693, //$xx0D: FATANH.* *m,FPn
418, 410, 414, 1228, 418, 416, 418, 391, //$xx0E: FSIN.* *m,FPn
500, 492, 496, 1310, 500, 498, 500, 473, //$xx0F: FTAN.* *m,FPn
524, 516, 520, 1334, 524, 522, 524, 497, //$xx10: FETOX.* *m,FPn
594, 586, 590, 1404, 594, 592, 594, 567, //$xx11: FTWOTOX.* *m,FPn
594, 586, 590, 1404, 594, 592, 594, 567, //$xx12: FTENTOX.* *m,FPn
594, 586, 590, 1404, 594, 592, 594, 567, //$xx13: FTENTOX.* *m,FPn (MC68882)
552, 544, 548, 1362, 552, 550, 552, 525, //$xx14: FLOGN.* *m,FPn
608, 600, 604, 1418, 608, 606, 608, 581, //$xx15: FLOG10.* *m,FPn
608, 600, 604, 1418, 608, 606, 608, 581, //$xx16: FLOG2.* *m,FPn
608, 600, 604, 1418, 608, 606, 608, 581, //$xx17: FLOG2.* *m,FPn (MC68882)
62, 54, 58, 872, 62, 60, 62, 35, //$xx18: FABS.* *m,FPn
634, 626, 630, 1444, 634, 632, 634, 607, //$xx19: FCOSH.* *m,FPn
62, 54, 58, 872, 62, 60, 62, 35, //$xx1A: FNEG.* *m,FPn
62, 54, 58, 872, 62, 60, 62, 35, //$xx1B: FNEG.* *m,FPn (MC68882)
652, 644, 648, 1462, 652, 650, 652, 625, //$xx1C: FACOS.* *m,FPn
418, 410, 414, 1228, 418, 416, 418, 391, //$xx1D: FCOS.* *m,FPn
72, 64, 68, 882, 72, 70, 72, 45, //$xx1E: FGETEXP.* *m,FPn
58, 50, 54, 868, 58, 56, 58, 31, //$xx1F: FGETMAN.* *m,FPn
132, 124, 128, 940, 132, 130, 132, 103, //$xx20: FDIV.* *m,FPn
99, 91, 95, 907, 99, 97, 99, 70, //$xx21: FMOD.* *m,FPn
80, 72, 76, 888, 80, 78, 80, 51, //$xx22: FADD.* *m,FPn
100, 92, 96, 908, 100, 98, 100, 71, //$xx23: FMUL.* *m,FPn
98, 90, 94, 906, 98, 96, 98, 69, //$xx24: FSGLDIV.* *m,FPn
129, 121, 125, 937, 129, 127, 129, 100, //$xx25: FREM.* *m,FPn
70, 62, 66, 878, 70, 68, 70, 41, //$xx26: FSCALE.* *m,FPn
88, 80, 84, 896, 88, 86, 88, 59, //$xx27: FSGLMUL.* *m,FPn
80, 72, 76, 888, 80, 78, 80, 51, //$xx28: FSUB.* *m,FPn
80, 72, 76, 888, 80, 78, 80, 51, //$xx29: FSUB.* *m,FPn (MC68882)
80, 72, 76, 888, 80, 78, 80, 51, //$xx2A: FSUB.* *m,FPn (MC68882)
80, 72, 76, 888, 80, 78, 80, 51, //$xx2B: FSUB.* *m,FPn (MC68882)
80, 72, 76, 888, 80, 78, 80, 51, //$xx2C: FSUB.* *m,FPn (MC68882)
80, 72, 76, 888, 80, 78, 80, 51, //$xx2D: FSUB.* *m,FPn (MC68882)
80, 72, 76, 888, 80, 78, 80, 51, //$xx2E: FSUB.* *m,FPn (MC68882)
80, 72, 76, 888, 80, 78, 80, 51, //$xx2F: FSUB.* *m,FPn (MC68882)
478, 470, 474, 1288, 478, 476, 478, 451, //$xx30: FSINCOS.* *m,FP0:FPn (c=0,s=n)
478, 470, 474, 1288, 478, 476, 478, 451, //$xx31: FSINCOS.* *m,FP1:FPn (c=1,s=n)
478, 470, 474, 1288, 478, 476, 478, 451, //$xx32: FSINCOS.* *m,FP2:FPn (c=2,s=n)
478, 470, 474, 1288, 478, 476, 478, 451, //$xx33: FSINCOS.* *m,FP3:FPn (c=3,s=n)
478, 470, 474, 1288, 478, 476, 478, 451, //$xx34: FSINCOS.* *m,FP4:FPn (c=4,s=n)
478, 470, 474, 1288, 478, 476, 478, 451, //$xx35: FSINCOS.* *m,FP5:FPn (c=5,s=n)
478, 470, 474, 1288, 478, 476, 478, 451, //$xx36: FSINCOS.* *m,FP6:FPn (c=6,s=n)
478, 470, 474, 1288, 478, 476, 478, 451, //$xx37: FSINCOS.* *m,FP7:FPn (c=7,s=n)
62, 54, 58, 870, 62, 60, 62, 33, //$xx38: FCMP.* *m,FPn
62, 54, 58, 870, 62, 60, 62, 33, //$xx39: FCMP.* *m,FPn (MC68882)
60, 52, 56, 870, 60, 58, 60, 33, //$xx3A: FTST.* *m
60, 52, 56, 870, 60, 58, 60, 33, //$xx3B: FTST.* *m (MC68882)
62, 54, 58, 870, 62, 60, 62, 33, //$xx3C: FCMP.* *m,FPn (MC68882)
62, 54, 58, 870, 62, 60, 62, 33, //$xx3D: FCMP.* *m,FPn (MC68882)
60, 52, 56, 870, 60, 58, 60, 33, //$xx3E: FTST.* *m (MC68882)
60, 52, 56, 870, 60, 58, 60, 33, //$xx3F: FTST.* *m (MC68882)
//68882
//L S X P W D B FPm
48, 34, 46, 891, 48, 40, 48, 21, //$xx00: FMOVE.* *m,FPn
88, 71, 83, 913, 88, 77, 88, 58, //$xx01: FINT.* *m,FPn
720, 703, 715, 1545, 720, 709, 720, 690, //$xx02: FSINH.* *m,FPn
88, 71, 83, 913, 88, 77, 88, 58, //$xx03: FINTRZ.* *m,FPn
140, 123, 135, 965, 140, 129, 140, 110, //$xx04: FSQRT.* *m,FPn
140, 123, 135, 965, 140, 129, 140, 110, //$xx05: FSQRT.* *m,FPn (MC68882)
604, 587, 599, 1429, 604, 593, 604, 574, //$xx06: FLOGNP1.* *m,FPn
604, 587, 599, 1429, 604, 593, 604, 574, //$xx07: FLOGNP1.* *m,FPn (MC68882)
578, 561, 573, 1403, 578, 567, 578, 548, //$xx08: FETOXM1.* *m,FPn
694, 677, 689, 1519, 694, 683, 694, 664, //$xx09: FTANH.* *m,FPn
436, 419, 431, 1261, 436, 425, 436, 406, //$xx0A: FATAN.* *m,FPn
436, 419, 431, 1261, 436, 425, 436, 406, //$xx0B: FATAN.* *m,FPn (MC68882)
614, 597, 609, 1439, 614, 603, 614, 584, //$xx0C: FASIN.* *m,FPn
726, 709, 721, 1551, 726, 715, 726, 696, //$xx0D: FATANH.* *m,FPn
424, 407, 419, 1249, 424, 413, 424, 394, //$xx0E: FSIN.* *m,FPn
506, 489, 501, 1331, 506, 495, 506, 476, //$xx0F: FTAN.* *m,FPn
530, 513, 525, 1355, 530, 519, 530, 500, //$xx10: FETOX.* *m,FPn
600, 583, 595, 1425, 600, 589, 600, 570, //$xx11: FTWOTOX.* *m,FPn
600, 583, 595, 1425, 600, 589, 600, 570, //$xx12: FTENTOX.* *m,FPn
600, 583, 595, 1425, 600, 589, 600, 570, //$xx13: FTENTOX.* *m,FPn (MC68882)
558, 541, 553, 1383, 558, 547, 558, 528, //$xx14: FLOGN.* *m,FPn
614, 597, 609, 1439, 614, 603, 614, 584, //$xx15: FLOG10.* *m,FPn
614, 597, 609, 1439, 614, 603, 614, 584, //$xx16: FLOG2.* *m,FPn
614, 597, 609, 1439, 614, 603, 614, 584, //$xx17: FLOG2.* *m,FPn (MC68882)
68, 51, 63, 893, 68, 57, 68, 38, //$xx18: FABS.* *m,FPn
640, 623, 635, 1465, 640, 629, 640, 610, //$xx19: FCOSH.* *m,FPn
68, 51, 63, 893, 68, 57, 68, 38, //$xx1A: FNEG.* *m,FPn
68, 51, 63, 893, 68, 57, 68, 38, //$xx1B: FNEG.* *m,FPn (MC68882)
658, 641, 653, 1483, 658, 647, 658, 628, //$xx1C: FACOS.* *m,FPn
424, 407, 419, 1249, 424, 413, 424, 394, //$xx1D: FCOS.* *m,FPn
78, 61, 73, 903, 78, 67, 78, 48, //$xx1E: FGETEXP.* *m,FPn
64, 47, 59, 889, 64, 53, 64, 34, //$xx1F: FGETMAN.* *m,FPn
146, 121, 133, 961, 146, 127, 146, 108, //$xx20: FDIV.* *m,FPn
113, 88, 100, 928, 113, 94, 113, 75, //$xx21: FMOD.* *m,FPn
94, 69, 81, 909, 94, 75, 94, 56, //$xx22: FADD.* *m,FPn
114, 89, 101, 929, 114, 95, 114, 76, //$xx23: FMUL.* *m,FPn
112, 87, 99, 927, 112, 93, 112, 74, //$xx24: FSGLDIV.* *m,FPn
143, 118, 130, 958, 143, 124, 143, 105, //$xx25: FREM.* *m,FPn
84, 59, 71, 899, 84, 65, 84, 46, //$xx26: FSCALE.* *m,FPn
102, 77, 89, 917, 102, 83, 102, 64, //$xx27: FSGLMUL.* *m,FPn
94, 69, 81, 909, 94, 75, 94, 56, //$xx28: FSUB.* *m,FPn
94, 69, 81, 909, 94, 75, 94, 56, //$xx29: FSUB.* *m,FPn (MC68882)
94, 69, 81, 909, 94, 75, 94, 56, //$xx2A: FSUB.* *m,FPn (MC68882)
94, 69, 81, 909, 94, 75, 94, 56, //$xx2B: FSUB.* *m,FPn (MC68882)
94, 69, 81, 909, 94, 75, 94, 56, //$xx2C: FSUB.* *m,FPn (MC68882)
94, 69, 81, 909, 94, 75, 94, 56, //$xx2D: FSUB.* *m,FPn (MC68882)
94, 69, 81, 909, 94, 75, 94, 56, //$xx2E: FSUB.* *m,FPn (MC68882)
94, 69, 81, 909, 94, 75, 94, 56, //$xx2F: FSUB.* *m,FPn (MC68882)
484, 467, 479, 1309, 484, 473, 484, 454, //$xx30: FSINCOS.* *m,FP0:FPn (c=0,s=n)
484, 467, 479, 1309, 484, 473, 484, 454, //$xx31: FSINCOS.* *m,FP1:FPn (c=1,s=n)
484, 467, 479, 1309, 484, 473, 484, 454, //$xx32: FSINCOS.* *m,FP2:FPn (c=2,s=n)
484, 467, 479, 1309, 484, 473, 484, 454, //$xx33: FSINCOS.* *m,FP3:FPn (c=3,s=n)
484, 467, 479, 1309, 484, 473, 484, 454, //$xx34: FSINCOS.* *m,FP4:FPn (c=4,s=n)
484, 467, 479, 1309, 484, 473, 484, 454, //$xx35: FSINCOS.* *m,FP5:FPn (c=5,s=n)
484, 467, 479, 1309, 484, 473, 484, 454, //$xx36: FSINCOS.* *m,FP6:FPn (c=6,s=n)
484, 467, 479, 1309, 484, 473, 484, 454, //$xx37: FSINCOS.* *m,FP7:FPn (c=7,s=n)
76, 51, 63, 891, 76, 57, 76, 38, //$xx38: FCMP.* *m,FPn
76, 51, 63, 891, 76, 57, 76, 38, //$xx39: FCMP.* *m,FPn (MC68882)
66, 49, 61, 891, 66, 55, 66, 36, //$xx3A: FTST.* *m
66, 49, 61, 891, 66, 55, 66, 36, //$xx3B: FTST.* *m (MC68882)
76, 51, 63, 891, 76, 57, 76, 38, //$xx3C: FCMP.* *m,FPn (MC68882)
76, 51, 63, 891, 76, 57, 76, 38, //$xx3D: FCMP.* *m,FPn (MC68882)
66, 49, 61, 891, 66, 55, 66, 36, //$xx3E: FTST.* *m (MC68882)
66, 49, 61, 891, 66, 55, 66, 36, //$xx3F: FTST.* *m (MC68882)
};
*/
//perl ../misc/itoc.pl MC68EC030.java CPV_REG
public static final char[] CPV_REG = "<48\u0366<:<!RJN\u037cRPR7\u02ca\u02c2\u02c6\u05f4\u02ca\u02c8\u02ca\u02afRJN\u037cRPR7\206~\202\u03b0\206\204\206k\206~\202\u03b0\206\204\206k\u0256\u024e\u0252\u0580\u0256\u0254\u0256\u023b\u0256\u024e\u0252\u0580\u0256\u0254\u0256\u023b\u023c\u0234\u0238\u0566\u023c\u023a\u023c\u0221\u02b0\u02a8\u02ac\u05da\u02b0\u02ae\u02b0\u0295\u01ae\u01a6\u01aa\u04d8\u01ae\u01ac\u01ae\u0193\u01ae\u01a6\u01aa\u04d8\u01ae\u01ac\u01ae\u0193\u0260\u0258\u025c\u058a\u0260\u025e\u0260\u0245\u02d0\u02c8\u02cc\u05fa\u02d0\u02ce\u02d0\u02b5\u01a2\u019a\u019e\u04cc\u01a2\u01a0\u01a2\u0187\u01f4\u01ec\u01f0\u051e\u01f4\u01f2\u01f4\u01d9\u020c\u0204\u0208\u0536\u020c\u020a\u020c\u01f1\u0252\u024a\u024e\u057c\u0252\u0250\u0252\u0237\u0252\u024a\u024e\u057c\u0252\u0250\u0252\u0237\u0252\u024a\u024e\u057c\u0252\u0250\u0252\u0237\u0228\u0220\u0224\u0552\u0228\u0226\u0228\u020d\u0260\u0258\u025c\u058a\u0260\u025e\u0260\u0245\u0260\u0258\u025c\u058a\u0260\u025e\u0260\u0245\u0260\u0258\u025c\u058a\u0260\u025e\u0260\u0245>6:\u0368><>#\u027a\u0272\u0276\u05a4\u027a\u0278\u027a\u025f>6:\u0368><>#>6:\u0368><>#\u028c\u0284\u0288\u05b6\u028c\u028a\u028c\u0271\u01a2\u019a\u019e\u04cc\u01a2\u01a0\u01a2\u0187H@D\u0372HFH-:26\u0364:8:\37\204|\200\u03ac\204\202\204gc[_\u038bcacFPHL\u0378PNP3d\\`\u038cdbdGbZ^\u038ab`bE\201y}\u03a9\201\177\201dF>B\u036eFDF)XPT\u0380XVX;PHL\u0378PNP3PHL\u0378PNP3PHL\u0378PNP3PHL\u0378PNP3PHL\u0378PNP3PHL\u0378PNP3PHL\u0378PNP3PHL\u0378PNP3\u01de\u01d6\u01da\u0508\u01de\u01dc\u01de\u01c3\u01de\u01d6\u01da\u0508\u01de\u01dc\u01de\u01c3\u01de\u01d6\u01da\u0508\u01de\u01dc\u01de\u01c3\u01de\u01d6\u01da\u0508\u01de\u01dc\u01de\u01c3\u01de\u01d6\u01da\u0508\u01de\u01dc\u01de\u01c3\u01de\u01d6\u01da\u0508\u01de\u01dc\u01de\u01c3\u01de\u01d6\u01da\u0508\u01de\u01dc\u01de\u01c3\u01de\u01d6\u01da\u0508\u01de\u01dc\u01de\u01c3>6:\u0366><>!>6:\u0366><>!<48\u0366<:<!<48\u0366<:<!>6:\u0366><>!>6:\u0366><>!<48\u0366<:<!<48\u0366<:<!0\".\u037b0(0\25XGS\u0391XMX:\u02d0\u02bf\u02cb\u0609\u02d0\u02c5\u02d0\u02b2XGS\u0391XMX:\214{\207\u03c5\214\201\214n\214{\207\u03c5\214\201\214n\u025c\u024b\u0257\u0595\u025c\u0251\u025c\u023e\u025c\u024b\u0257\u0595\u025c\u0251\u025c\u023e\u0242\u0231\u023d\u057b\u0242\u0237\u0242\u0224\u02b6\u02a5\u02b1\u05ef\u02b6\u02ab\u02b6\u0298\u01b4\u01a3\u01af\u04ed\u01b4\u01a9\u01b4\u0196\u01b4\u01a3\u01af\u04ed\u01b4\u01a9\u01b4\u0196\u0266\u0255\u0261\u059f\u0266\u025b\u0266\u0248\u02d6\u02c5\u02d1\u060f\u02d6\u02cb\u02d6\u02b8\u01a8\u0197\u01a3\u04e1\u01a8\u019d\u01a8\u018a\u01fa\u01e9\u01f5\u0533\u01fa\u01ef\u01fa\u01dc\u0212\u0201\u020d\u054b\u0212\u0207\u0212\u01f4\u0258\u0247\u0253\u0591\u0258\u024d\u0258\u023a\u0258\u0247\u0253\u0591\u0258\u024d\u0258\u023a\u0258\u0247\u0253\u0591\u0258\u024d\u0258\u023a\u022e\u021d\u0229\u0567\u022e\u0223\u022e\u0210\u0266\u0255\u0261\u059f\u0266\u025b\u0266\u0248\u0266\u0255\u0261\u059f\u0266\u025b\u0266\u0248\u0266\u0255\u0261\u059f\u0266\u025b\u0266\u0248D3?\u037dD9D&\u0280\u026f\u027b\u05b9\u0280\u0275\u0280\u0262D3?\u037dD9D&D3?\u037dD9D&\u0292\u0281\u028d\u05cb\u0292\u0287\u0292\u0274\u01a8\u0197\u01a3\u04e1\u01a8\u019d\u01a8\u018aN=I\u0387NCN0@/;\u0379@5@\"\222y\205\u03c1\222\177\222lqXd\u03a0q^qK^EQ\u038d^K^8rYe\u03a1r_rLpWc\u039fp]pJ\217v\202\u03be\217|\217iT;G\u0383TAT.fMY\u0395fSf@^EQ\u038d^K^8^EQ\u038d^K^8^EQ\u038d^K^8^EQ\u038d^K^8^EQ\u038d^K^8^EQ\u038d^K^8^EQ\u038d^K^8^EQ\u038d^K^8\u01e4\u01d3\u01df\u051d\u01e4\u01d9\u01e4\u01c6\u01e4\u01d3\u01df\u051d\u01e4\u01d9\u01e4\u01c6\u01e4\u01d3\u01df\u051d\u01e4\u01d9\u01e4\u01c6\u01e4\u01d3\u01df\u051d\u01e4\u01d9\u01e4\u01c6\u01e4\u01d3\u01df\u051d\u01e4\u01d9\u01e4\u01c6\u01e4\u01d3\u01df\u051d\u01e4\u01d9\u01e4\u01c6\u01e4\u01d3\u01df\u051d\u01e4\u01d9\u01e4\u01c6\u01e4\u01d3\u01df\u051d\u01e4\u01d9\u01e4\u01c6L3?\u037bL9L&L3?\u037bL9L&B1=\u037bB7B$B1=\u037bB7B$L3?\u037bL9L&L3?\u037bL9L&B1=\u037bB7B$B1=\u037bB7B$".toCharArray ();
} //class MC68EC030