/* * BTC */ void BTC_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; } else { CPU_FLAGL &= ~C_FLAG; } res = dst ^ bit; *out = (UINT16)res; } 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_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; } else { CPU_FLAGL &= ~C_FLAG; } res = dst ^ bit; *out = (UINT16)res; } 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 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); } } }
/* * STACK */ void ENTER16_IwIb(void) { UINT32 sp, bp; UINT32 val; UINT16 dimsize; UINT16 new_bp; UINT8 level; GET_PCWORD(dimsize); GET_PCBYTE(level); level &= 0x1f; CPU_SET_PREV_ESP(); PUSH0_16(CPU_BP); if (level == 0) { /* enter level=0 */ CPU_WORKCLOCK(11); CPU_BP = CPU_SP; if (!CPU_STAT_SS32) { CPU_SP -= dimsize; } else { CPU_ESP -= dimsize; } } else { --level; if (level == 0) { /* enter level=1 */ CPU_WORKCLOCK(15); sp = CPU_SP; PUSH0_16(sp); CPU_BP = (UINT16)sp; if (!CPU_STAT_SS32) { CPU_SP -= dimsize; } else { CPU_ESP -= dimsize; } } else { /* enter level=2-31 */ CPU_WORKCLOCK(12 + level * 4); if (!CPU_STAT_SS32) { bp = CPU_BP; new_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(new_bp); CPU_BP = new_bp; CPU_SP -= dimsize; } else { bp = CPU_EBP; new_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(new_bp); CPU_BP = new_bp; CPU_ESP -= dimsize; } } } CPU_CLEAR_PREV_ESP(); }