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 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 ENTER32_IwIb(void) { UINT32 sp, bp; UINT32 new_bp; UINT32 val; UINT16 dimsize; UINT8 level; GET_PCWORD(dimsize); GET_PCBYTE(level); level &= 0x1f; CPU_SET_PREV_ESP(); PUSH0_32(CPU_EBP); if (level == 0) { /* enter level=0 */ CPU_WORKCLOCK(11); CPU_EBP = CPU_ESP; if (!CPU_STAT_SS32) { CPU_SP -= dimsize; } else { CPU_ESP -= dimsize; } } else { --level; if (level == 0) { /* enter level=1 */ CPU_WORKCLOCK(15); sp = CPU_ESP; PUSH0_32(sp); CPU_EBP = sp; if (CPU_STAT_SS32) { CPU_ESP -= dimsize; } else { CPU_SP -= dimsize; } } else { /* enter level=2-31 */ CPU_WORKCLOCK(12 + level * 4); if (CPU_STAT_SS32) { bp = CPU_EBP; new_bp = CPU_ESP; while (level--) { bp -= 4; CPU_ESP -= 4; val = cpu_vmemoryread_d(CPU_SS_INDEX, bp); cpu_vmemorywrite_d(CPU_SS_INDEX, CPU_ESP, val); } REGPUSH0_32(new_bp); CPU_EBP = new_bp; CPU_ESP -= dimsize; } else { bp = CPU_BP; new_bp = CPU_ESP; while (level--) { bp -= 4; CPU_SP -= 4; val = cpu_vmemoryread_d(CPU_SS_INDEX, bp); cpu_vmemorywrite_d(CPU_SS_INDEX, CPU_SP, val); } REGPUSH0_32_16(new_bp); CPU_EBP = new_bp; CPU_SP -= dimsize; } } } CPU_CLEAR_PREV_ESP(); }