[SOFT386]

Fix typecasts to make sure the value is sign-extended.


svn path=/branches/ntvdm/; revision=60694
This commit is contained in:
Aleksandar Andrejevic 2013-10-18 21:45:10 +00:00
parent 25445ea35f
commit fb5036618e

View file

@ -988,7 +988,7 @@ SOFT386_OPCODE_HANDLER(Soft386OpcodeGroupD3)
SOFT386_OPCODE_HANDLER(Soft386OpcodeGroupF6) SOFT386_OPCODE_HANDLER(Soft386OpcodeGroupF6)
{ {
UCHAR Dummy, Value; UCHAR Dummy, Value = 0;
SOFT386_MOD_REG_RM ModRegRm; SOFT386_MOD_REG_RM ModRegRm;
BOOLEAN AddressSize = State->SegmentRegs[SOFT386_REG_CS].Size; BOOLEAN AddressSize = State->SegmentRegs[SOFT386_REG_CS].Size;
@ -1081,7 +1081,7 @@ SOFT386_OPCODE_HANDLER(Soft386OpcodeGroupF6)
/* IMUL */ /* IMUL */
case 5: case 5:
{ {
SHORT Result = (SHORT)Value * (SHORT)State->GeneralRegs[SOFT386_REG_EAX].LowByte; SHORT Result = (SHORT)((CHAR)Value) * (SHORT)((CHAR)State->GeneralRegs[SOFT386_REG_EAX].LowByte);
/* Update the flags */ /* Update the flags */
State->Flags.Cf = State->Flags.Of = State->Flags.Cf = State->Flags.Of =
@ -1125,7 +1125,7 @@ SOFT386_OPCODE_HANDLER(Soft386OpcodeGroupF6)
SOFT386_OPCODE_HANDLER(Soft386OpcodeGroupF7) SOFT386_OPCODE_HANDLER(Soft386OpcodeGroupF7)
{ {
ULONG Dummy, Value, SignFlag; ULONG Dummy, Value = 0, SignFlag;
SOFT386_MOD_REG_RM ModRegRm; SOFT386_MOD_REG_RM ModRegRm;
BOOLEAN OperandSize, AddressSize; BOOLEAN OperandSize, AddressSize;
@ -1292,7 +1292,7 @@ SOFT386_OPCODE_HANDLER(Soft386OpcodeGroupF7)
{ {
if (OperandSize) if (OperandSize)
{ {
LONGLONG Result = (LONGLONG)Value * (LONGLONG)State->GeneralRegs[SOFT386_REG_EAX].Long; LONGLONG Result = (LONGLONG)((LONG)Value) * (LONGLONG)((LONG)State->GeneralRegs[SOFT386_REG_EAX].Long);
/* Update the flags */ /* Update the flags */
State->Flags.Cf = State->Flags.Of = State->Flags.Cf = State->Flags.Of =
@ -1304,7 +1304,7 @@ SOFT386_OPCODE_HANDLER(Soft386OpcodeGroupF7)
} }
else else
{ {
LONG Result = (LONG)Value * (LONG)State->GeneralRegs[SOFT386_REG_EAX].LowWord; LONG Result = (LONG)Value * (LONG)((SHORT)State->GeneralRegs[SOFT386_REG_EAX].LowWord);
/* Update the flags */ /* Update the flags */
State->Flags.Cf = State->Flags.Of = State->Flags.Cf = State->Flags.Of =
@ -1365,8 +1365,8 @@ SOFT386_OPCODE_HANDLER(Soft386OpcodeGroupF7)
{ {
LONG Dividend = (LONG)State->GeneralRegs[SOFT386_REG_EAX].LowWord LONG Dividend = (LONG)State->GeneralRegs[SOFT386_REG_EAX].LowWord
| ((LONG)State->GeneralRegs[SOFT386_REG_EDX].LowWord << 16); | ((LONG)State->GeneralRegs[SOFT386_REG_EDX].LowWord << 16);
SHORT Quotient = Dividend / (SHORT)Value; SHORT Quotient = Dividend / (SHORT)LOWORD(Value);
SHORT Remainder = Dividend % (SHORT)Value; SHORT Remainder = Dividend % (SHORT)LOWORD(Value);
/* Write back the results */ /* Write back the results */
State->GeneralRegs[SOFT386_REG_EAX].LowWord = (USHORT)Quotient; State->GeneralRegs[SOFT386_REG_EAX].LowWord = (USHORT)Quotient;