void CALL32_Ap(void) { descriptor_t sd; UINT32 new_ip; UINT16 new_cs; UINT16 sreg; CPU_WORKCLOCK(13); GET_PCDWORD(new_ip); GET_PCWORD(new_cs); if (!CPU_STAT_PM || CPU_STAT_VM86) { /* Real mode or VM86 mode */ CPU_SET_PREV_ESP(); load_segreg(CPU_CS_INDEX, new_cs, &sreg, &sd, GP_EXCEPTION); if (new_ip > sd.u.seg.limit) { EXCEPTION(GP_EXCEPTION, 0); } PUSH0_32(CPU_CS); PUSH0_32(CPU_EIP); LOAD_SEGREG(CPU_CS_INDEX, new_cs); CPU_EIP = new_ip; CPU_CLEAR_PREV_ESP(); } else { /* Protected mode */ CALLfar_pm(new_cs, new_ip); } }
void JMP32_Ap(void) { descriptor_t sd; UINT32 new_ip; UINT16 new_cs; UINT16 sreg; CPU_WORKCLOCK(11); GET_PCDWORD(new_ip); GET_PCWORD(new_cs); if (!CPU_STAT_PM || CPU_STAT_VM86) { /* Real mode or VM86 mode */ /* check new instrunction pointer with new code segment */ load_segreg(CPU_CS_INDEX, new_cs, &sreg, &sd, GP_EXCEPTION); if (new_ip > sd.u.seg.limit) { EXCEPTION(GP_EXCEPTION, 0); } LOAD_SEGREG(CPU_CS_INDEX, new_cs); CPU_EIP = new_ip; } else { /* Protected mode */ JMPfar_pm(new_cs, new_ip); } }
void TEST_EAXId(void) { UINT32 src, tmp; CPU_WORKCLOCK(3); tmp = CPU_EAX; GET_PCDWORD(src); DWORD_AND(tmp, src); }
void TEST_EdId(UINT32 op) { UINT32 src, tmp, madr; if (op >= 0xc0) { CPU_WORKCLOCK(2); tmp = *(reg32_b20[op]); } else { CPU_WORKCLOCK(6); madr = calc_ea_dst(op); tmp = cpu_vmemoryread_d(CPU_INST_SEGREG_INDEX, madr); } GET_PCDWORD(src); DWORD_AND(tmp, src); }
void CALL_Ad(void) { UINT32 new_ip; UINT32 dest; CPU_WORKCLOCK(7); CPU_SET_PREV_ESP(); GET_PCDWORD(dest); new_ip = CPU_EIP + dest; if (new_ip > CPU_STAT_CS_LIMIT) { EXCEPTION(GP_EXCEPTION, 0); } PUSH0_32(CPU_EIP); CPU_EIP = new_ip; CPU_CLEAR_PREV_ESP(); }