void BX_CPU_C::BSR_GwEw(bxInstruction_c *i) { Bit16u op1_16, op2_16; /* op2_16 is a register or memory reference */ if (i->modC0()) { op2_16 = BX_READ_16BIT_REG(i->rm()); } else { /* pointer, segment address pair */ read_virtual_word(i->seg(), RMAddr(i), &op2_16); } if (op2_16 == 0) { assert_ZF(); /* op1_16 undefined */ return; } op1_16 = 15; while ( (op2_16 & 0x8000) == 0 ) { op1_16--; op2_16 <<= 1; } SET_FLAGS_OSZAPC_RESULT_16(op1_16, BX_INSTR_BITSCAN16); /* now write result back to destination */ BX_WRITE_16BIT_REG(i->nnn(), op1_16); }
void BX_CPP_AttrRegparmN(1) BX_CPU_C::NEG_EwR(bxInstruction_c *i) { Bit16u op1_16 = BX_READ_16BIT_REG(i->rm()); op1_16 = - (Bit16s)(op1_16); BX_WRITE_16BIT_REG(i->rm(), op1_16); SET_FLAGS_OSZAPC_RESULT_16(op1_16, BX_LF_INSTR_NEG16); }
void BX_CPP_AttrRegparmN(1) BX_CPU_C::NEG_EwM(bxInstruction_c *i) { Bit16u op1_16; BX_CPU_CALL_METHODR(i->ResolveModrm, (i)); op1_16 = read_RMW_virtual_word(i->seg(), RMAddr(i)); op1_16 = - (Bit16s)(op1_16); write_RMW_virtual_word(op1_16); SET_FLAGS_OSZAPC_RESULT_16(op1_16, BX_LF_INSTR_NEG16); }