mirror of
https://github.com/reactos/reactos.git
synced 2025-04-18 03:34:11 +00:00
[FAST486]
Fix the calculation of AF in ADC and the calculation of AF and CF in SBB. svn path=/branches/ntvdm/; revision=61068
This commit is contained in:
parent
c0d571c92a
commit
363543b325
2 changed files with 23 additions and 21 deletions
|
@ -2483,7 +2483,7 @@ FAST486_OPCODE_HANDLER(Fast486OpcodeAdcByteModrm)
|
|||
State->Flags.Cf = State->Flags.Cf || ((Result < FirstValue) && (Result < SecondValue));
|
||||
State->Flags.Of = ((FirstValue & SIGN_FLAG_BYTE) == (SecondValue & SIGN_FLAG_BYTE))
|
||||
&& ((FirstValue & SIGN_FLAG_BYTE) != (Result & SIGN_FLAG_BYTE));
|
||||
State->Flags.Af = ((((FirstValue & 0x0F) + (SecondValue & 0x0F)) & 0x10) != 0);
|
||||
State->Flags.Af = ((FirstValue ^ SecondValue ^ Result) & 0x10) != 0;
|
||||
State->Flags.Zf = (Result == 0);
|
||||
State->Flags.Sf = ((Result & SIGN_FLAG_BYTE) != 0);
|
||||
State->Flags.Pf = Fast486CalculateParity(Result);
|
||||
|
@ -2540,7 +2540,7 @@ FAST486_OPCODE_HANDLER(Fast486OpcodeAdcModrm)
|
|||
State->Flags.Cf = State->Flags.Cf || ((Result < FirstValue) && (Result < SecondValue));
|
||||
State->Flags.Of = ((FirstValue & SIGN_FLAG_LONG) == (SecondValue & SIGN_FLAG_LONG))
|
||||
&& ((FirstValue & SIGN_FLAG_LONG) != (Result & SIGN_FLAG_LONG));
|
||||
State->Flags.Af = ((((FirstValue & 0x0F) + (SecondValue & 0x0F)) & 0x10) != 0);
|
||||
State->Flags.Af = ((FirstValue ^ SecondValue ^ Result) & 0x10) != 0;
|
||||
State->Flags.Zf = (Result == 0);
|
||||
State->Flags.Sf = ((Result & SIGN_FLAG_LONG) != 0);
|
||||
State->Flags.Pf = Fast486CalculateParity(Result);
|
||||
|
@ -2575,7 +2575,7 @@ FAST486_OPCODE_HANDLER(Fast486OpcodeAdcModrm)
|
|||
State->Flags.Cf = State->Flags.Cf || ((Result < FirstValue) && (Result < SecondValue));
|
||||
State->Flags.Of = ((FirstValue & SIGN_FLAG_WORD) == (SecondValue & SIGN_FLAG_WORD))
|
||||
&& ((FirstValue & SIGN_FLAG_WORD) != (Result & SIGN_FLAG_WORD));
|
||||
State->Flags.Af = ((((FirstValue & 0x0F) + (SecondValue & 0x0F)) & 0x10) != 0);
|
||||
State->Flags.Af = ((FirstValue ^ SecondValue ^ Result) & 0x10) != 0;
|
||||
State->Flags.Zf = (Result == 0);
|
||||
State->Flags.Sf = ((Result & SIGN_FLAG_WORD) != 0);
|
||||
State->Flags.Pf = Fast486CalculateParity(Result);
|
||||
|
@ -2621,7 +2621,7 @@ FAST486_OPCODE_HANDLER(Fast486OpcodeAdcAl)
|
|||
State->Flags.Cf = State->Flags.Cf || ((Result < FirstValue) && (Result < SecondValue));
|
||||
State->Flags.Of = ((FirstValue & SIGN_FLAG_BYTE) == (SecondValue & SIGN_FLAG_BYTE))
|
||||
&& ((FirstValue & SIGN_FLAG_BYTE) != (Result & SIGN_FLAG_BYTE));
|
||||
State->Flags.Af = ((((FirstValue & 0x0F) + (SecondValue & 0x0F)) & 0x10) != 0);
|
||||
State->Flags.Af = ((FirstValue ^ SecondValue ^ Result) & 0x10) != 0;
|
||||
State->Flags.Zf = (Result == 0);
|
||||
State->Flags.Sf = ((Result & SIGN_FLAG_BYTE) != 0);
|
||||
State->Flags.Pf = Fast486CalculateParity(Result);
|
||||
|
@ -2664,7 +2664,7 @@ FAST486_OPCODE_HANDLER(Fast486OpcodeAdcEax)
|
|||
State->Flags.Cf = State->Flags.Cf || ((Result < FirstValue) && (Result < SecondValue));
|
||||
State->Flags.Of = ((FirstValue & SIGN_FLAG_LONG) == (SecondValue & SIGN_FLAG_LONG))
|
||||
&& ((FirstValue & SIGN_FLAG_LONG) != (Result & SIGN_FLAG_LONG));
|
||||
State->Flags.Af = ((((FirstValue & 0x0F) + (SecondValue & 0x0F)) & 0x10) != 0);
|
||||
State->Flags.Af = ((FirstValue ^ SecondValue ^ Result) & 0x10) != 0;
|
||||
State->Flags.Zf = (Result == 0);
|
||||
State->Flags.Sf = ((Result & SIGN_FLAG_LONG) != 0);
|
||||
State->Flags.Pf = Fast486CalculateParity(Result);
|
||||
|
@ -2694,7 +2694,7 @@ FAST486_OPCODE_HANDLER(Fast486OpcodeAdcEax)
|
|||
State->Flags.Cf = State->Flags.Cf || ((Result < FirstValue) && (Result < SecondValue));
|
||||
State->Flags.Of = ((FirstValue & SIGN_FLAG_WORD) == (SecondValue & SIGN_FLAG_WORD))
|
||||
&& ((FirstValue & SIGN_FLAG_WORD) != (Result & SIGN_FLAG_WORD));
|
||||
State->Flags.Af = ((((FirstValue & 0x0F) + (SecondValue & 0x0F)) & 0x10) != 0);
|
||||
State->Flags.Af = ((FirstValue ^ SecondValue ^ Result) & 0x10) != 0;
|
||||
State->Flags.Zf = (Result == 0);
|
||||
State->Flags.Sf = ((Result & SIGN_FLAG_WORD) != 0);
|
||||
State->Flags.Pf = Fast486CalculateParity(Result);
|
||||
|
@ -2765,10 +2765,10 @@ FAST486_OPCODE_HANDLER(Fast486OpcodeSbbByteModrm)
|
|||
Result = FirstValue - SecondValue - Carry;
|
||||
|
||||
/* Update the flags */
|
||||
State->Flags.Cf = FirstValue < (SecondValue + 1);
|
||||
State->Flags.Cf = Carry ? (FirstValue <= SecondValue) : (FirstValue < SecondValue);
|
||||
State->Flags.Of = ((FirstValue & SIGN_FLAG_BYTE) != (SecondValue & SIGN_FLAG_BYTE))
|
||||
&& ((FirstValue & SIGN_FLAG_BYTE) != (Result & SIGN_FLAG_BYTE));
|
||||
State->Flags.Af = (FirstValue & 0x0F) < ((SecondValue + 1) & 0x0F);
|
||||
State->Flags.Af = ((FirstValue ^ SecondValue ^ Result) & 0x10) != 0;
|
||||
State->Flags.Zf = (Result == 0);
|
||||
State->Flags.Sf = ((Result & SIGN_FLAG_BYTE) != 0);
|
||||
State->Flags.Pf = Fast486CalculateParity(Result);
|
||||
|
@ -2826,10 +2826,10 @@ FAST486_OPCODE_HANDLER(Fast486OpcodeSbbModrm)
|
|||
Result = FirstValue - SecondValue - Carry;
|
||||
|
||||
/* Update the flags */
|
||||
State->Flags.Cf = FirstValue < (SecondValue + Carry);
|
||||
State->Flags.Cf = Carry ? (FirstValue <= SecondValue) : (FirstValue < SecondValue);
|
||||
State->Flags.Of = ((FirstValue & SIGN_FLAG_LONG) != (SecondValue & SIGN_FLAG_LONG))
|
||||
&& ((FirstValue & SIGN_FLAG_LONG) != (Result & SIGN_FLAG_LONG));
|
||||
State->Flags.Af = (FirstValue & 0x0F) < ((SecondValue + 1) & 0x0F);
|
||||
State->Flags.Af = ((FirstValue ^ SecondValue ^ Result) & 0x10) != 0;
|
||||
State->Flags.Zf = (Result == 0);
|
||||
State->Flags.Sf = ((Result & SIGN_FLAG_LONG) != 0);
|
||||
State->Flags.Pf = Fast486CalculateParity(Result);
|
||||
|
@ -2864,10 +2864,10 @@ FAST486_OPCODE_HANDLER(Fast486OpcodeSbbModrm)
|
|||
Result = FirstValue - SecondValue - Carry;
|
||||
|
||||
/* Update the flags */
|
||||
State->Flags.Cf = FirstValue < (SecondValue + Carry);
|
||||
State->Flags.Cf = Carry ? (FirstValue <= SecondValue) : (FirstValue < SecondValue);
|
||||
State->Flags.Of = ((FirstValue & SIGN_FLAG_WORD) != (SecondValue & SIGN_FLAG_WORD))
|
||||
&& ((FirstValue & SIGN_FLAG_WORD) != (Result & SIGN_FLAG_WORD));
|
||||
State->Flags.Af = (FirstValue & 0x0F) < ((SecondValue + 1) & 0x0F);
|
||||
State->Flags.Af = ((FirstValue ^ SecondValue ^ Result) & 0x10) != 0;
|
||||
State->Flags.Zf = (Result == 0);
|
||||
State->Flags.Sf = ((Result & SIGN_FLAG_WORD) != 0);
|
||||
State->Flags.Pf = Fast486CalculateParity(Result);
|
||||
|
@ -2906,10 +2906,10 @@ FAST486_OPCODE_HANDLER(Fast486OpcodeSbbAl)
|
|||
Result = FirstValue - SecondValue - Carry;
|
||||
|
||||
/* Update the flags */
|
||||
State->Flags.Cf = FirstValue < (SecondValue + Carry);
|
||||
State->Flags.Cf = Carry ? (FirstValue <= SecondValue) : (FirstValue < SecondValue);
|
||||
State->Flags.Of = ((FirstValue & SIGN_FLAG_BYTE) != (SecondValue & SIGN_FLAG_BYTE))
|
||||
&& ((FirstValue & SIGN_FLAG_BYTE) != (Result & SIGN_FLAG_BYTE));
|
||||
State->Flags.Af = (FirstValue & 0x0F) < ((SecondValue + 1) & 0x0F);
|
||||
State->Flags.Af = ((FirstValue ^ SecondValue ^ Result) & 0x10) != 0;
|
||||
State->Flags.Zf = (Result == 0);
|
||||
State->Flags.Sf = ((Result & SIGN_FLAG_BYTE) != 0);
|
||||
State->Flags.Pf = Fast486CalculateParity(Result);
|
||||
|
@ -2947,10 +2947,10 @@ FAST486_OPCODE_HANDLER(Fast486OpcodeSbbEax)
|
|||
Result = FirstValue - SecondValue - Carry;
|
||||
|
||||
/* Update the flags */
|
||||
State->Flags.Cf = FirstValue < (SecondValue + Carry);
|
||||
State->Flags.Cf = Carry ? (FirstValue <= SecondValue) : (FirstValue < SecondValue);
|
||||
State->Flags.Of = ((FirstValue & SIGN_FLAG_LONG) != (SecondValue & SIGN_FLAG_LONG))
|
||||
&& ((FirstValue & SIGN_FLAG_LONG) != (Result & SIGN_FLAG_LONG));
|
||||
State->Flags.Af = (FirstValue & 0x0F) < ((SecondValue + Carry) & 0x0F);
|
||||
State->Flags.Af = ((FirstValue ^ SecondValue ^ Result) & 0x10) != 0;
|
||||
State->Flags.Zf = (Result == 0);
|
||||
State->Flags.Sf = ((Result & SIGN_FLAG_LONG) != 0);
|
||||
State->Flags.Pf = Fast486CalculateParity(Result);
|
||||
|
@ -2973,10 +2973,10 @@ FAST486_OPCODE_HANDLER(Fast486OpcodeSbbEax)
|
|||
Result = FirstValue - SecondValue - Carry;
|
||||
|
||||
/* Update the flags */
|
||||
State->Flags.Cf = FirstValue < (SecondValue + Carry);
|
||||
State->Flags.Cf = Carry ? (FirstValue <= SecondValue) : (FirstValue < SecondValue);
|
||||
State->Flags.Of = ((FirstValue & SIGN_FLAG_WORD) != (SecondValue & SIGN_FLAG_WORD))
|
||||
&& ((FirstValue & SIGN_FLAG_WORD) != (Result & SIGN_FLAG_WORD));
|
||||
State->Flags.Af = (FirstValue & 0x0F) < ((SecondValue + Carry) & 0x0F);
|
||||
State->Flags.Af = ((FirstValue ^ SecondValue ^ Result) & 0x10) != 0;
|
||||
State->Flags.Zf = (Result == 0);
|
||||
State->Flags.Sf = ((Result & SIGN_FLAG_WORD) != 0);
|
||||
State->Flags.Pf = Fast486CalculateParity(Result);
|
||||
|
|
|
@ -85,7 +85,7 @@ Fast486ArithmeticOperation(PFAST486_STATE State,
|
|||
|| ((Result < FirstValue) && (Result < (SecondValue + Carry)));
|
||||
State->Flags.Of = ((FirstValue & SignFlag) == (SecondValue & SignFlag))
|
||||
&& ((FirstValue & SignFlag) != (Result & SignFlag));
|
||||
State->Flags.Af = ((((FirstValue & 0x0F) + ((SecondValue + Carry) & 0x0F)) & 0x10) != 0);
|
||||
State->Flags.Af = ((FirstValue ^ SecondValue ^ Result) & 0x10) != 0;
|
||||
|
||||
break;
|
||||
}
|
||||
|
@ -98,10 +98,12 @@ Fast486ArithmeticOperation(PFAST486_STATE State,
|
|||
Result = (FirstValue - SecondValue - Carry) & MaxValue;
|
||||
|
||||
/* Update CF, OF and AF */
|
||||
State->Flags.Cf = FirstValue < (SecondValue + Carry);
|
||||
State->Flags.Cf = Carry
|
||||
? (FirstValue <= SecondValue)
|
||||
: (FirstValue < SecondValue);
|
||||
State->Flags.Of = ((FirstValue & SignFlag) != (SecondValue & SignFlag))
|
||||
&& ((FirstValue & SignFlag) != (Result & SignFlag));
|
||||
State->Flags.Af = (FirstValue & 0x0F) < ((SecondValue + Carry) & 0x0F);
|
||||
State->Flags.Af = ((FirstValue ^ SecondValue ^ Result) & 0x10) != 0;
|
||||
|
||||
break;
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue