void BTR_EwIb(UINT32 op) { UINT16 *out; UINT32 src, dst, res, madr; UINT16 bit; if (op >= 0xc0) { CPU_WORKCLOCK(2); GET_PCBYTE(src); out = reg16_b20[op]; dst = *out; bit = BIT_MAKEBIT16(src); if (dst & bit) { CPU_FLAGL |= C_FLAG; res = dst & ~bit; *out = (UINT16)res; } else { CPU_FLAGL &= ~C_FLAG; } } else { CPU_WORKCLOCK(6); madr = calc_ea_dst(op); GET_PCBYTE(src); dst = cpu_vmemoryread_w(CPU_INST_SEGREG_INDEX, madr); bit = BIT_MAKEBIT16(src); if (dst & bit) { CPU_FLAGL |= C_FLAG; } else { CPU_FLAGL &= ~C_FLAG; } res = dst & ~bit; cpu_vmemorywrite_w(CPU_INST_SEGREG_INDEX, madr, (UINT16)res); } }
void BTC_EdGd(void) { UINT32 *out; UINT32 op, src, dst, res, madr; UINT32 bit; PREPART_EA_REG32(op, src); bit = BIT_MAKEBIT32(src); if (op >= 0xc0) { CPU_WORKCLOCK(2); out = reg32_b20[op]; dst = *out; if (dst & bit) { CPU_FLAGL |= C_FLAG; } else { CPU_FLAGL &= ~C_FLAG; } res = dst ^ bit; *out = res; } else { CPU_WORKCLOCK(7); madr = calc_ea_dst(op); madr += BIT_OFFSET32(src); dst = cpu_vmemoryread_d(CPU_INST_SEGREG_INDEX, madr); if (dst & bit) { CPU_FLAGL |= C_FLAG; } else { CPU_FLAGL &= ~C_FLAG; } res = dst ^ bit; cpu_vmemorywrite_d(CPU_INST_SEGREG_INDEX, madr, res); } }
void CPUCALL JMP32_Ep(UINT32 op) { descriptor_t sd; UINT32 madr; UINT32 new_ip; UINT16 new_cs; UINT16 sreg; CPU_WORKCLOCK(11); if (op < 0xc0) { madr = calc_ea_dst(op); new_ip = cpu_vmemoryread_d(CPU_INST_SEGREG_INDEX, madr); new_cs = cpu_vmemoryread_w(CPU_INST_SEGREG_INDEX, madr + 4); 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); } return; } EXCEPTION(UD_EXCEPTION, 0); }
/* * BTR */ void BTR_EwGw(void) { UINT16 *out; UINT32 op, src, dst, res, madr; UINT16 bit; PREPART_EA_REG16(op, src); bit = BIT_MAKEBIT16(src); if (op >= 0xc0) { CPU_WORKCLOCK(2); out = reg16_b20[op]; dst = *out; if (dst & bit) { CPU_FLAGL |= C_FLAG; res = dst & ~bit; *out = (UINT16)res; } else { CPU_FLAGL &= ~C_FLAG; } } else { CPU_WORKCLOCK(7); madr = calc_ea_dst(op); madr += BIT_OFFSET16(src); dst = cpu_vmemoryread_w(CPU_INST_SEGREG_INDEX, madr); if (dst & bit) { CPU_FLAGL |= C_FLAG; } else { CPU_FLAGL &= ~C_FLAG; } res = dst & ~bit; cpu_vmemorywrite_w(CPU_INST_SEGREG_INDEX, madr, (UINT16)res); } }
void BTC_EdIb(UINT32 op) { UINT32 *out; UINT32 src, dst, res, madr; UINT32 bit; if (op >= 0xc0) { CPU_WORKCLOCK(2); GET_PCBYTE(src); out = reg32_b20[op]; dst = *out; bit = BIT_MAKEBIT32(src); if (dst & bit) { CPU_FLAGL |= C_FLAG; } else { CPU_FLAGL &= ~C_FLAG; } res = dst ^ bit; *out = res; } else { CPU_WORKCLOCK(6); madr = calc_ea_dst(op); GET_PCBYTE(src); dst = cpu_vmemoryread_d(CPU_INST_SEGREG_INDEX, madr); bit = BIT_MAKEBIT32(src); if (dst & bit) { CPU_FLAGL |= C_FLAG; } else { CPU_FLAGL &= ~C_FLAG; } res = dst ^ bit; cpu_vmemorywrite_d(CPU_INST_SEGREG_INDEX, madr, res); } }
void ESC6(void) { UINT32 op, madr; GET_PCBYTE(op); // TRACEOUT(("use FPU de %.2x", op)); if (op >= 0xc0) { } else { madr = calc_ea_dst(op); } }
void CPUCALL TEST_EwIw(UINT32 op) { UINT32 src, tmp, madr; if (op >= 0xc0) { CPU_WORKCLOCK(2); tmp = *(reg16_b20[op]); } else { CPU_WORKCLOCK(6); madr = calc_ea_dst(op); tmp = cpu_vmemoryread_w(CPU_INST_SEGREG_INDEX, madr); } GET_PCWORD(src); WORD_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 TEST_EbIb(UINT32 op) { UINT32 src, tmp, madr; if (op >= 0xc0) { CPU_WORKCLOCK(2); tmp = *(reg8_b20[op]); } else { CPU_WORKCLOCK(6); madr = calc_ea_dst(op); tmp = cpu_vmemoryread(CPU_INST_SEGREG_INDEX, madr); } GET_PCBYTE(src); BYTE_AND(tmp, src); }
void ESC1(void) { UINT32 op, madr; GET_PCBYTE(op); // TRACEOUT(("use FPU d9 %.2x", op)); if (op >= 0xc0) { } else { madr = calc_ea_dst(op); if ((op & 0x38) == 0x38) { TRACEOUT(("FSTCW")); cpu_vmemorywrite_w(CPU_INST_SEGREG_INDEX, madr, 0xffff); } } }
void LEA_GdM(void) { UINT32 *out; UINT32 op, dst; GET_PCBYTE(op); if (op < 0xc0) { CPU_WORKCLOCK(2); out = reg32_b53[op]; dst = calc_ea_dst(op); *out = dst; return; } EXCEPTION(UD_EXCEPTION, 0); }
void TEST_EdGd(void) { UINT32 op, src, tmp, madr; PREPART_EA_REG32(op, src); if (op >= 0xc0) { CPU_WORKCLOCK(2); tmp = *(reg32_b20[op]); } else { CPU_WORKCLOCK(7); madr = calc_ea_dst(op); tmp = cpu_vmemoryread_d(CPU_INST_SEGREG_INDEX, madr); } DWORD_AND(tmp, src); }
void SETNLE_Eb(void) { UINT32 op, madr; UINT8 v = CC_NLE?1:0; GET_PCBYTE(op); if (op >= 0xc0) { CPU_WORKCLOCK(2); *(reg8_b20[op]) = v; } else { CPU_WORKCLOCK(3); madr = calc_ea_dst(op); cpu_vmemorywrite(CPU_INST_SEGREG_INDEX, madr, v); } }
void BT_EdGd(void) { UINT32 op, src, dst, madr; PREPART_EA_REG32(op, src); if (op >= 0xc0) { CPU_WORKCLOCK(2); dst = *(reg32_b20[op]); } else { CPU_WORKCLOCK(7); madr = calc_ea_dst(op); madr += BIT_OFFSET32(src); dst = cpu_vmemoryread_d(CPU_INST_SEGREG_INDEX, madr); } CPU_FLAGL &= ~C_FLAG; CPU_FLAGL |= (dst >> BIT_INDEX32(src)) & 1; }
void BT_EwIb(UINT32 op) { UINT32 src, dst, madr; if (op >= 0xc0) { CPU_WORKCLOCK(2); GET_PCBYTE(src); dst = *(reg16_b20[op]); } else { CPU_WORKCLOCK(6); madr = calc_ea_dst(op); GET_PCBYTE(src); dst = cpu_vmemoryread_w(CPU_INST_SEGREG_INDEX, madr); } CPU_FLAGL &= ~C_FLAG; CPU_FLAGL |= (dst >> BIT_INDEX16(src)) & 1; }
void CPUCALL JMP_Ed(UINT32 op) { UINT32 madr; UINT32 new_ip; if (op >= 0xc0) { CPU_WORKCLOCK(7); new_ip = *(reg32_b20[op]); } else { CPU_WORKCLOCK(11); madr = calc_ea_dst(op); new_ip = cpu_vmemoryread_d(CPU_INST_SEGREG_INDEX, madr); } if (new_ip > CPU_STAT_CS_LIMIT) { EXCEPTION(GP_EXCEPTION, 0); } CPU_EIP = new_ip; }
void BOUND_GdMa(void) { UINT32 op, madr; UINT32 reg; CPU_WORKCLOCK(13); GET_PCBYTE(op); if (op < 0xc0) { reg = *(reg32_b53[op]); madr = calc_ea_dst(op); if (reg >= cpu_vmemoryread_d(CPU_INST_SEGREG_INDEX, madr) && reg <= cpu_vmemoryread_d(CPU_INST_SEGREG_INDEX, madr + 4)) { return; } EXCEPTION(BR_EXCEPTION, 0); return; } EXCEPTION(UD_EXCEPTION, 0); }
void CPUCALL CALL_Ew(UINT32 op) { UINT32 madr; UINT16 new_ip; CPU_SET_PREV_ESP(); if (op >= 0xc0) { CPU_WORKCLOCK(7); new_ip = *(reg16_b20[op]); } else { CPU_WORKCLOCK(11); madr = calc_ea_dst(op); new_ip = cpu_vmemoryread_w(CPU_INST_SEGREG_INDEX, madr); } if (new_ip > CPU_STAT_CS_LIMIT) { EXCEPTION(GP_EXCEPTION, 0); } PUSH0_16(CPU_IP); CPU_EIP = new_ip; CPU_CLEAR_PREV_ESP(); }
void CPUCALL CALL32_Ep(UINT32 op) { descriptor_t sd; UINT32 madr; UINT32 new_ip; UINT16 new_cs; UINT16 sreg; CPU_WORKCLOCK(16); if (op < 0xc0) { madr = calc_ea_dst(op); new_ip = cpu_vmemoryread_d(CPU_INST_SEGREG_INDEX, madr); new_cs = cpu_vmemoryread_w(CPU_INST_SEGREG_INDEX, madr + 4); 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); } return; } EXCEPTION(UD_EXCEPTION, 0); }