--- np2/i386c/ia32/instructions/ctrl_trans.c 2004/02/06 16:49:51 1.8 +++ np2/i386c/ia32/instructions/ctrl_trans.c 2005/02/27 15:07:36 1.18 @@ -1,4 +1,4 @@ -/* $Id: ctrl_trans.c,v 1.8 2004/02/06 16:49:51 monaka Exp $ */ +/* $Id: ctrl_trans.c,v 1.18 2005/02/27 15:07:36 yui Exp $ */ /* * Copyright (c) 2002-2003 NONAKA Kimihiro @@ -41,38 +41,41 @@ void JMP_Jb(void) { - DWORD ip; + UINT32 ip; CPU_WORKCLOCK(7); GET_PCBYTESD(ip); ADD_EIP(ip); + CPU_PREFETCH_CLEAR(); } void JMP_Jw(void) { - DWORD ip; + UINT32 ip; CPU_WORKCLOCK(7); GET_PCWORDS(ip); ADD_EIP(ip); + CPU_PREFETCH_CLEAR(); } void JMP_Jd(void) { - DWORD ip; + UINT32 ip; CPU_WORKCLOCK(7); GET_PCDWORD(ip); ADD_EIP(ip); + CPU_PREFETCH_CLEAR(); } void -JMP_Ew(DWORD op) +JMP_Ew(UINT32 op) { - DWORD madr; - DWORD new_ip; + UINT32 madr; + UINT32 new_ip; if (op >= 0xc0) { CPU_WORKCLOCK(7); @@ -87,10 +90,10 @@ JMP_Ew(DWORD op) } void -JMP_Ed(DWORD op) +JMP_Ed(UINT32 op) { - DWORD madr; - DWORD new_ip; + UINT32 madr; + UINT32 new_ip; if (op >= 0xc0) { CPU_WORKCLOCK(7); @@ -107,8 +110,8 @@ JMP_Ed(DWORD op) void JMP16_Ap(void) { - DWORD new_ip; - WORD new_cs; + UINT32 new_ip; + UINT16 new_cs; CPU_WORKCLOCK(11); GET_PCWORD(new_ip); @@ -126,8 +129,8 @@ JMP16_Ap(void) void JMP32_Ap(void) { - DWORD new_ip; - WORD new_cs; + UINT32 new_ip; + UINT16 new_cs; CPU_WORKCLOCK(11); GET_PCDWORD(new_ip); @@ -143,11 +146,11 @@ JMP32_Ap(void) } void -JMP16_Ep(DWORD op) +JMP16_Ep(UINT32 op) { - DWORD madr; - DWORD new_ip; - WORD new_cs; + UINT32 madr; + UINT32 new_ip; + UINT16 new_cs; CPU_WORKCLOCK(11); if (op < 0xc0) { @@ -168,11 +171,11 @@ JMP16_Ep(DWORD op) } void -JMP32_Ep(DWORD op) +JMP32_Ep(UINT32 op) { - DWORD madr; - DWORD new_ip; - WORD new_cs; + UINT32 madr; + UINT32 new_ip; + UINT16 new_cs; CPU_WORKCLOCK(11); if (op < 0xc0) { @@ -197,7 +200,7 @@ void JO_Jb(void) { - if (!CPU_OV) { + if (CC_NO) { JMPNOP(2, 1); } else { JMPSHORT(7); @@ -208,7 +211,7 @@ void JO_Jw(void) { - if (!CPU_OV) { + if (CC_NO) { JMPNOP(2, 2); } else { JMPNEAR(7); @@ -219,7 +222,7 @@ void JO_Jd(void) { - if (!CPU_OV) { + if (CC_NO) { JMPNOP(2, 4); } else { JMPNEAR_4(7); @@ -231,7 +234,7 @@ void JNO_Jb(void) { - if (CPU_OV) { + if (CC_O) { JMPNOP(2, 1); } else { JMPSHORT(7); @@ -242,7 +245,7 @@ void JNO_Jw(void) { - if (CPU_OV) { + if (CC_O) { JMPNOP(2, 2); } else { JMPNEAR(7); @@ -253,7 +256,7 @@ void JNO_Jd(void) { - if (CPU_OV) { + if (CC_O) { JMPNOP(2, 4); } else { JMPNEAR_4(7); @@ -265,7 +268,7 @@ void JC_Jb(void) { - if (!(CPU_FLAGL & C_FLAG)) { + if (CC_NC) { JMPNOP(2, 1); } else { JMPSHORT(7); @@ -276,7 +279,7 @@ void JC_Jw(void) { - if (!(CPU_FLAGL & C_FLAG)) { + if (CC_NC) { JMPNOP(2, 2); } else { JMPNEAR(7); @@ -287,7 +290,7 @@ void JC_Jd(void) { - if (!(CPU_FLAGL & C_FLAG)) { + if (CC_NC) { JMPNOP(2, 4); } else { JMPNEAR_4(7); @@ -299,7 +302,7 @@ void JNC_Jb(void) { - if (CPU_FLAGL & C_FLAG) { + if (CC_C) { JMPNOP(2, 1); } else { JMPSHORT(7); @@ -309,7 +312,7 @@ void JNC_Jw(void) { - if (CPU_FLAGL & C_FLAG) { + if (CC_C) { JMPNOP(2, 2); } else { JMPNEAR(7); @@ -319,7 +322,7 @@ void JNC_Jd(void) { - if (CPU_FLAGL & C_FLAG) { + if (CC_C) { JMPNOP(2, 4); } else { JMPNEAR_4(7); @@ -331,7 +334,7 @@ void JZ_Jb(void) { - if (!(CPU_FLAGL & Z_FLAG)) { + if (CC_NZ) { JMPNOP(2, 1); } else { JMPSHORT(7); @@ -342,7 +345,7 @@ void JZ_Jw(void) { - if (!(CPU_FLAGL & Z_FLAG)) { + if (CC_NZ) { JMPNOP(2, 2); } else { JMPNEAR(7); @@ -353,7 +356,7 @@ void JZ_Jd(void) { - if (!(CPU_FLAGL & Z_FLAG)) { + if (CC_NZ) { JMPNOP(2, 4); } else { JMPNEAR_4(7); @@ -365,7 +368,7 @@ void JNZ_Jb(void) { - if (CPU_FLAGL & Z_FLAG) { + if (CC_Z) { JMPNOP(2, 1); } else { JMPSHORT(7); @@ -376,7 +379,7 @@ void JNZ_Jw(void) { - if (CPU_FLAGL & Z_FLAG) { + if (CC_Z) { JMPNOP(2, 2); } else { JMPNEAR(7); @@ -387,7 +390,7 @@ void JNZ_Jd(void) { - if (CPU_FLAGL & Z_FLAG) { + if (CC_Z) { JMPNOP(2, 4); } else { JMPNEAR_4(7); @@ -399,7 +402,7 @@ void JNA_Jb(void) { - if (!(CPU_FLAGL & (Z_FLAG | C_FLAG))) { + if (CC_A) { JMPNOP(2, 1); } else { JMPSHORT(7); @@ -410,7 +413,7 @@ void JNA_Jw(void) { - if (!(CPU_FLAGL & (Z_FLAG | C_FLAG))) { + if (CC_A) { JMPNOP(2, 2); } else { JMPNEAR(7); @@ -421,7 +424,7 @@ void JNA_Jd(void) { - if (!(CPU_FLAGL & (Z_FLAG | C_FLAG))) { + if (CC_A) { JMPNOP(2, 4); } else { JMPNEAR_4(7); @@ -433,7 +436,7 @@ void JA_Jb(void) { - if (CPU_FLAGL & (Z_FLAG | C_FLAG)) { + if (CC_NA) { JMPNOP(2, 1); } else { JMPSHORT(7); @@ -444,7 +447,7 @@ void JA_Jw(void) { - if (CPU_FLAGL & (Z_FLAG | C_FLAG)) { + if (CC_NA) { JMPNOP(2, 2); } else { JMPNEAR(7); @@ -455,7 +458,7 @@ void JA_Jd(void) { - if (CPU_FLAGL & (Z_FLAG | C_FLAG)) { + if (CC_NA) { JMPNOP(2, 4); } else { JMPNEAR_4(7); @@ -467,7 +470,7 @@ void JS_Jb(void) { - if (!(CPU_FLAGL & S_FLAG)) { + if (CC_NS) { JMPNOP(2, 1); } else { JMPSHORT(7); @@ -478,7 +481,7 @@ void JS_Jw(void) { - if (!(CPU_FLAGL & S_FLAG)) { + if (CC_NS) { JMPNOP(2, 2); } else { JMPNEAR(7); @@ -489,7 +492,7 @@ void JS_Jd(void) { - if (!(CPU_FLAGL & S_FLAG)) { + if (CC_NS) { JMPNOP(2, 4); } else { JMPNEAR_4(7); @@ -501,7 +504,7 @@ void JNS_Jb(void) { - if (CPU_FLAGL & S_FLAG) { + if (CC_S) { JMPNOP(2, 1); } else { JMPSHORT(7); @@ -512,7 +515,7 @@ void JNS_Jw(void) { - if (CPU_FLAGL & S_FLAG) { + if (CC_S) { JMPNOP(2, 2); } else { JMPNEAR(7); @@ -523,7 +526,7 @@ void JNS_Jd(void) { - if (CPU_FLAGL & S_FLAG) { + if (CC_S) { JMPNOP(2, 4); } else { JMPNEAR_4(7); @@ -535,7 +538,7 @@ void JP_Jb(void) { - if (!(CPU_FLAGL & P_FLAG)) { + if (CC_NP) { JMPNOP(2, 1); } else { JMPSHORT(7); @@ -546,7 +549,7 @@ void JP_Jw(void) { - if (!(CPU_FLAGL & P_FLAG)) { + if (CC_NP) { JMPNOP(2, 2); } else { JMPNEAR(7); @@ -557,7 +560,7 @@ void JP_Jd(void) { - if (!(CPU_FLAGL & P_FLAG)) { + if (CC_NP) { JMPNOP(2, 4); } else { JMPNEAR_4(7); @@ -569,7 +572,7 @@ void JNP_Jb(void) { - if (CPU_FLAGL & P_FLAG) { + if (CC_P) { JMPNOP(2, 1); } else { JMPSHORT(7); @@ -580,7 +583,7 @@ void JNP_Jw(void) { - if (CPU_FLAGL & P_FLAG) { + if (CC_P) { JMPNOP(2, 2); } else { JMPNEAR(7); @@ -591,7 +594,7 @@ void JNP_Jd(void) { - if (CPU_FLAGL & P_FLAG) { + if (CC_P) { JMPNOP(2, 4); } else { JMPNEAR_4(7); @@ -603,7 +606,7 @@ void JL_Jb(void) { - if ((!(CPU_FLAGL & S_FLAG)) == (!CPU_OV)) { + if (CC_NL) { JMPNOP(2, 1); } else { JMPSHORT(7); @@ -614,7 +617,7 @@ void JL_Jw(void) { - if ((!(CPU_FLAGL & S_FLAG)) == (!CPU_OV)) { + if (CC_NL) { JMPNOP(2, 2); } else { JMPNEAR(7); @@ -625,7 +628,7 @@ void JL_Jd(void) { - if ((!(CPU_FLAGL & S_FLAG)) == (!CPU_OV)) { + if (CC_NL) { JMPNOP(2, 4); } else { JMPNEAR_4(7); @@ -637,7 +640,7 @@ void JNL_Jb(void) { - if ((!(CPU_FLAGL & S_FLAG)) != (!CPU_OV)) { + if (CC_L) { JMPNOP(2, 1); } else { JMPSHORT(7); @@ -648,7 +651,7 @@ void JNL_Jw(void) { - if ((!(CPU_FLAGL & S_FLAG)) != (!CPU_OV)) { + if (CC_L) { JMPNOP(2, 2); } else { JMPNEAR(7); @@ -659,7 +662,7 @@ void JNL_Jd(void) { - if ((!(CPU_FLAGL & S_FLAG)) != (!CPU_OV)) { + if (CC_L) { JMPNOP(2, 4); } else { JMPNEAR_4(7); @@ -671,7 +674,7 @@ void JLE_Jb(void) { - if ((!(CPU_FLAGL & Z_FLAG)) && ((!(CPU_FLAGL & S_FLAG)) == (!CPU_OV))) { + if (CC_NLE) { JMPNOP(2, 1); } else { JMPSHORT(7); @@ -682,7 +685,7 @@ void JLE_Jw(void) { - if ((!(CPU_FLAGL & Z_FLAG)) && ((!(CPU_FLAGL & S_FLAG)) == (!CPU_OV))) { + if (CC_NLE) { JMPNOP(2, 2); } else { JMPNEAR(7); @@ -693,7 +696,7 @@ void JLE_Jd(void) { - if ((!(CPU_FLAGL & Z_FLAG)) && ((!(CPU_FLAGL & S_FLAG)) == (!CPU_OV))) { + if (CC_NLE) { JMPNOP(2, 4); } else { JMPNEAR_4(7); @@ -705,7 +708,7 @@ void JNLE_Jb(void) { - if ((CPU_FLAGL & Z_FLAG) || ((!(CPU_FLAGL & S_FLAG)) != (!CPU_OV))) { + if (CC_LE) { JMPNOP(2, 1); } else { JMPSHORT(7); @@ -716,7 +719,7 @@ void JNLE_Jw(void) { - if ((CPU_FLAGL & Z_FLAG) || ((!(CPU_FLAGL & S_FLAG)) != (!CPU_OV))) { + if (CC_LE) { JMPNOP(2, 2); } else { JMPNEAR(7); @@ -727,7 +730,7 @@ void JNLE_Jd(void) { - if ((CPU_FLAGL & Z_FLAG) || ((!(CPU_FLAGL & S_FLAG)) != (!CPU_OV))) { + if (CC_LE) { JMPNOP(2, 4); } else { JMPNEAR_4(7); @@ -829,30 +832,32 @@ LOOP_Jb(void) void CALL_Aw(void) { - DWORD ip; + SINT32 ip; CPU_WORKCLOCK(7); GET_PCWORDS(ip); PUSH0_16(CPU_IP); ADD_EIP(ip); + CPU_PREFETCH_CLEAR(); } void CALL_Ad(void) { - DWORD ip; + UINT32 ip; CPU_WORKCLOCK(7); GET_PCDWORD(ip); PUSH0_32(CPU_EIP); ADD_EIP(ip); + CPU_PREFETCH_CLEAR(); } void -CALL_Ew(DWORD op) +CALL_Ew(UINT32 op) { - DWORD madr; - DWORD new_ip; + UINT32 madr; + UINT32 new_ip; if (op >= 0xc0) { CPU_WORKCLOCK(7); @@ -867,10 +872,10 @@ CALL_Ew(DWORD op) } void -CALL_Ed(DWORD op) +CALL_Ed(UINT32 op) { - DWORD madr; - DWORD new_ip; + UINT32 madr; + UINT32 new_ip; if (op >= 0xc0) { CPU_WORKCLOCK(7); @@ -887,8 +892,8 @@ CALL_Ed(DWORD op) void CALL16_Ap(void) { - DWORD new_ip; - WORD new_cs; + UINT32 new_ip; + UINT16 new_cs; CPU_WORKCLOCK(13); GET_PCWORD(new_ip); @@ -909,8 +914,8 @@ CALL16_Ap(void) void CALL32_Ap(void) { - DWORD new_ip; - WORD new_cs; + UINT32 new_ip; + UINT16 new_cs; CPU_WORKCLOCK(13); GET_PCDWORD(new_ip); @@ -929,11 +934,11 @@ CALL32_Ap(void) } void -CALL16_Ep(DWORD op) +CALL16_Ep(UINT32 op) { - DWORD ad; - DWORD new_ip; - WORD new_cs; + UINT32 ad; + UINT32 new_ip; + UINT16 new_cs; CPU_WORKCLOCK(16); if (op < 0xc0) { @@ -957,11 +962,11 @@ CALL16_Ep(DWORD op) } void -CALL32_Ep(DWORD op) +CALL32_Ep(UINT32 op) { - DWORD ad; - DWORD new_ip; - WORD new_cs; + UINT32 ad; + UINT32 new_ip; + UINT16 new_cs; CPU_WORKCLOCK(16); if (op < 0xc0) { @@ -990,7 +995,7 @@ CALL32_Ep(DWORD op) void RETnear16(void) { - DWORD new_ip; + UINT32 new_ip; CPU_WORKCLOCK(11); POP0_16(new_ip); @@ -1000,7 +1005,7 @@ RETnear16(void) void RETnear32(void) { - DWORD new_ip; + UINT32 new_ip; CPU_WORKCLOCK(11); POP0_32(new_ip); @@ -1010,42 +1015,42 @@ RETnear32(void) void RETnear16_Iw(void) { - DWORD new_ip; - WORD ad; + UINT32 new_ip; + UINT16 size; CPU_WORKCLOCK(11); - GET_PCWORD(ad); + GET_PCWORD(size); POP0_16(new_ip); SET_EIP(new_ip); if (!CPU_STAT_SS32) { - CPU_SP += ad; + CPU_SP += size; } else { - CPU_ESP += ad; + CPU_ESP += size; } } void RETnear32_Iw(void) { - DWORD new_ip; - DWORD ad; + UINT32 new_ip; + UINT16 size; CPU_WORKCLOCK(11); - GET_PCWORD(ad); + GET_PCWORD(size); POP0_32(new_ip); SET_EIP(new_ip); - if (CPU_STAT_SS32) { - CPU_ESP += ad; + if (!CPU_STAT_SS32) { + CPU_SP += size; } else { - CPU_SP += ad; + CPU_ESP += size; } } void RETfar16(void) { - DWORD new_ip; - WORD new_cs; + UINT32 new_ip; + UINT16 new_cs; CPU_WORKCLOCK(15); if (!CPU_STAT_PM || CPU_STAT_VM86) { @@ -1064,8 +1069,8 @@ RETfar16(void) void RETfar32(void) { - DWORD new_ip; - WORD new_cs; + UINT32 new_ip; + UINT32 new_cs; CPU_WORKCLOCK(15); if (!CPU_STAT_PM || CPU_STAT_VM86) { @@ -1073,7 +1078,7 @@ RETfar32(void) POP0_32(new_ip); POP0_32(new_cs); - CPU_SET_SEGREG(CPU_CS_INDEX, new_cs); + CPU_SET_SEGREG(CPU_CS_INDEX, (UINT16)new_cs); SET_EIP(new_ip); } else { /* Protected mode */ @@ -1084,12 +1089,12 @@ RETfar32(void) void RETfar16_Iw(void) { - DWORD ad; - DWORD new_ip; - WORD new_cs; + UINT32 new_ip; + UINT16 new_cs; + UINT16 size; CPU_WORKCLOCK(15); - GET_PCWORD(ad); + GET_PCWORD(size); if (!CPU_STAT_PM || CPU_STAT_VM86) { /* Real mode or VM86 mode */ POP0_16(new_ip); @@ -1099,75 +1104,98 @@ RETfar16_Iw(void) SET_EIP(new_ip); if (!CPU_STAT_SS32) { - CPU_SP += ad; + CPU_SP += size; } else { - CPU_ESP += ad; + CPU_ESP += size; } } else { /* Protected mode */ - RETfar_pm(ad); + RETfar_pm(size); } } void RETfar32_Iw(void) { - DWORD ad; - DWORD new_ip; - WORD new_cs; + UINT32 new_ip; + UINT32 new_cs; + UINT16 size; CPU_WORKCLOCK(15); - GET_PCWORD(ad); + GET_PCWORD(size); if (!CPU_STAT_PM || CPU_STAT_VM86) { /* Real mode or VM86 mode */ POP0_32(new_ip); POP0_32(new_cs); - CPU_SET_SEGREG(CPU_CS_INDEX, new_cs); + CPU_SET_SEGREG(CPU_CS_INDEX, (UINT16)new_cs); SET_EIP(new_ip); - if (CPU_STAT_SS32) { - CPU_ESP += ad; + if (!CPU_STAT_SS32) { + CPU_SP += size; } else { - CPU_SP += ad; + CPU_ESP += size; } } else { /* Protected mode */ - RETfar_pm(ad); + RETfar_pm(size); } } void IRET(void) { - DWORD new_ip; - DWORD new_flags; - DWORD mask; - WORD new_cs; + UINT32 new_ip; + UINT32 new_flags; + UINT32 new_cs; +#if !defined(IA32_DONT_USE_SET_EFLAGS_FUNCTION) + UINT32 mask; +#endif - CPU_WORKCLOCK(31); if (!CPU_STAT_PM) { /* Real mode */ + CPU_WORKCLOCK(22); +#if defined(IA32_DONT_USE_SET_EFLAGS_FUNCTION) + if (!CPU_INST_OP32) { + POP0_16(new_ip); + POP0_16(new_cs); + POP0_16(new_flags); + CPU_FLAG = new_flags & ALL_FLAG; + } else { + POP0_32(new_ip); + POP0_32(new_cs); + POP0_32(new_flags); + CPU_EFLAG = (new_flags & (ALL_FLAG|RF_FLAG|AC_FLAG|ID_FLAG)) | (CPU_EFLAG & (VM_FLAG|VIF_FLAG|VIP_FLAG)); + } + CPU_OV = CPU_FLAG & O_FLAG; + CPU_TRAP = (CPU_FLAG & (I_FLAG|T_FLAG)) == (I_FLAG|T_FLAG); +#else mask = I_FLAG|IOPL_FLAG; if (!CPU_INST_OP32) { POP0_16(new_ip); POP0_16(new_cs); POP0_16(new_flags); - set_flags(new_flags, mask); } else { POP0_32(new_ip); POP0_32(new_cs); POP0_32(new_flags); mask |= RF_FLAG; - set_eflags(new_flags, mask); } - CPU_SET_SEGREG(CPU_CS_INDEX, new_cs); + set_eflags(new_flags, mask); +#endif + + CPU_SET_SEGREG(CPU_CS_INDEX, (UINT16)new_cs); SET_EIP(new_ip); } else { /* Protected mode */ IRET_pm(); } +#if defined(IA32_SUPPORT_DEBUG_REGISTER) + if (CPU_EFLAG & RF_FLAG) { + CPU_STAT_BP_EVENT |= CPU_STAT_BP_EVENT_RF; + } +#endif IRQCHECKTERM(); } @@ -1178,7 +1206,7 @@ void INT1(void) { - CPU_WORKCLOCK(23); + CPU_WORKCLOCK(33); INTERRUPT(1, 1, 0, 0); } @@ -1186,7 +1214,7 @@ void INT3(void) { - CPU_WORKCLOCK(23); + CPU_WORKCLOCK(33); INTERRUPT(3, 2, 0, 0); } @@ -1195,19 +1223,19 @@ INTO(void) { if (!CPU_OV) { - CPU_WORKCLOCK(4); + CPU_WORKCLOCK(3); return; } - CPU_WORKCLOCK(24); + CPU_WORKCLOCK(35); INTERRUPT(4, 3, 0, 0); } void INT_Ib(void) { - BYTE vect; + UINT8 vect; - CPU_WORKCLOCK(23); + CPU_WORKCLOCK(37); if (!CPU_STAT_PM || !CPU_STAT_VM86 || (CPU_STAT_IOPL == CPU_IOPL3)) { GET_PCBYTE(vect); INTERRUPT(vect, -1, 0, 0); @@ -1219,8 +1247,8 @@ INT_Ib(void) void BOUND_GwMa(void) { - DWORD op, madr; - WORD reg; + UINT32 op, madr; + UINT16 reg; int vect; CPU_WORKCLOCK(13); @@ -1242,8 +1270,8 @@ BOUND_GwMa(void) void BOUND_GdMa(void) { - DWORD op, madr; - DWORD reg; + UINT32 op, madr; + UINT32 reg; int vect; CPU_WORKCLOCK(13); @@ -1268,11 +1296,11 @@ BOUND_GdMa(void) void ENTER16_IwIb(void) { - DWORD sp, bp; - DWORD size; - DWORD val; - WORD dimsize; - BYTE level; + UINT32 sp, bp; + UINT32 size; + UINT32 val; + UINT16 dimsize; + UINT8 level; GET_PCWORD(dimsize); GET_PCBYTE(level); @@ -1286,7 +1314,7 @@ ENTER16_IwIb(void) } else { sp = CPU_ESP; } - CHECK_STACK_PUSH(&CPU_STAT_SREG(CPU_SS_INDEX), sp, size); + STACK_PUSH_CHECK(CPU_REGS_SREG(CPU_SS_INDEX), &CPU_STAT_SREG(CPU_SS_INDEX), sp, size); } PUSH0_16(CPU_BP); @@ -1304,7 +1332,7 @@ ENTER16_IwIb(void) CPU_WORKCLOCK(15); sp = CPU_SP; PUSH0_16(sp); - CPU_BP = sp; + CPU_BP = (UINT16)sp; if (!CPU_STAT_SS32) { CPU_SP -= dimsize; } else { @@ -1312,30 +1340,28 @@ ENTER16_IwIb(void) } } else { /* enter level=2-31 */ CPU_WORKCLOCK(12 + level * 4); - if (!CPU_INST_OP32) { - if (!CPU_STAT_SS32) { - bp = CPU_BP; - CPU_BP = CPU_SP; - while (level--) { - bp -= 2; - CPU_SP -= 2; - val = cpu_vmemoryread_w(CPU_SS_INDEX, bp); - cpu_vmemorywrite_w(CPU_SS_INDEX, CPU_SP, val); - } - REGPUSH0(CPU_BP); - CPU_SP -= dimsize; - } else { - bp = CPU_EBP; - CPU_BP = CPU_SP; - while (level--) { - bp -= 2; - CPU_ESP -= 2; - val = cpu_vmemoryread_w(CPU_SS_INDEX, bp); - cpu_vmemorywrite_w(CPU_SS_INDEX, CPU_ESP, val); - } - REGPUSH0_16_32(CPU_EBP); - CPU_ESP -= dimsize; + if (!CPU_STAT_SS32) { + bp = CPU_BP; + CPU_BP = CPU_SP; + while (level--) { + bp -= 2; + CPU_SP -= 2; + val = cpu_vmemoryread_w(CPU_SS_INDEX, bp); + cpu_vmemorywrite_w(CPU_SS_INDEX, CPU_SP, (UINT16)val); } + REGPUSH0(CPU_BP); + CPU_SP -= dimsize; + } else { + bp = CPU_EBP; + CPU_BP = CPU_SP; + while (level--) { + bp -= 2; + CPU_ESP -= 2; + val = cpu_vmemoryread_w(CPU_SS_INDEX, bp); + cpu_vmemorywrite_w(CPU_SS_INDEX, CPU_ESP, (UINT16)val); + } + REGPUSH0_16_32(CPU_BP); + CPU_ESP -= dimsize; } } } @@ -1344,11 +1370,11 @@ ENTER16_IwIb(void) void ENTER32_IwIb(void) { - DWORD sp, bp; - DWORD size; - DWORD val; - WORD dimsize; - BYTE level; + UINT32 sp, bp; + UINT32 size; + UINT32 val; + UINT16 dimsize; + UINT8 level; GET_PCWORD(dimsize); GET_PCBYTE(level); @@ -1362,7 +1388,7 @@ ENTER32_IwIb(void) } else { sp = CPU_SP; } - CHECK_STACK_PUSH(&CPU_STAT_SREG(CPU_SS_INDEX), sp, size); + STACK_PUSH_CHECK(CPU_REGS_SREG(CPU_SS_INDEX), &CPU_STAT_SREG(CPU_SS_INDEX), sp, size); } PUSH0_32(CPU_EBP); @@ -1395,7 +1421,7 @@ ENTER32_IwIb(void) bp -= 4; CPU_ESP -= 4; val = cpu_vmemoryread_d(CPU_SS_INDEX, bp); - cpu_vmemorywrite(CPU_SS_INDEX, CPU_ESP, val); + cpu_vmemorywrite_d(CPU_SS_INDEX, CPU_ESP, val); } REGPUSH0_32(CPU_EBP); CPU_ESP -= dimsize; @@ -1416,54 +1442,37 @@ ENTER32_IwIb(void) } void -LEAVE16(void) +LEAVE(void) { - WORD bp; - DWORD sp, size; + UINT32 sp, bp; + UINT s; - CPU_WORKCLOCK(5); + CPU_WORKCLOCK(4); if (CPU_STAT_PM) { - bp = CPU_BP; + if (!CPU_INST_OP32) { + s = 2; + } else { + s = 4; + } if (!CPU_STAT_SS32) { sp = CPU_SP; - size = 2; + bp = CPU_BP; } else { sp = CPU_ESP; - size = 4; - } - if (bp < sp) { - ia32_panic("LEAVE16: bp < sp"); + bp = CPU_EBP; } - CHECK_STACK_PUSH(&CPU_STAT_SREG(CPU_SS_INDEX), sp, (bp - sp) + size); + STACK_POP_CHECK(CPU_REGS_SREG(CPU_SS_INDEX), &CPU_STAT_SREG(CPU_SS_INDEX), sp, (bp - sp) + s); } - CPU_SP = CPU_BP; - REGPOP0(CPU_BP); -} - -void -LEAVE32(void) -{ - DWORD bp, sp, size; - - CPU_WORKCLOCK(5); - - if (CPU_STAT_PM) { - bp = CPU_EBP; - if (CPU_STAT_SS32) { - sp = CPU_ESP; - size = 4; - } else { - sp = CPU_SP; - size = 2; - } - if (bp < sp) { - ia32_panic("LEAVE32: bp < sp"); - } - CHECK_STACK_PUSH(&CPU_STAT_SREG(CPU_SS_INDEX), sp, (bp - sp) + size); + if (!CPU_STAT_SS32) { + CPU_SP = CPU_BP; + } else { + CPU_ESP = CPU_EBP; + } + if (!CPU_INST_OP32) { + REGPOP0(CPU_BP); + } else { + POP0_32(CPU_EBP); } - - CPU_ESP = CPU_EBP; - POP0_32(CPU_EBP); }