From: Aleksandar Andrejevic Date: Fri, 22 Nov 2013 02:02:05 +0000 (+0000) Subject: [FAST486] X-Git-Tag: backups/0.3.17@66124~1365^2~215 X-Git-Url: https://git.reactos.org/?p=reactos.git;a=commitdiff_plain;h=24954c9d07980276c101ac76c1c9b9469fb7b871;ds=sidebyside [FAST486] DAA, DAS: Update the flags. AAA, AAS: Subtract from AX instead of AL. The specification says AL, but so far in all known CPUs and emulators, AX is subtracted. AAD: Clear AH. svn path=/branches/ntvdm/; revision=61069 --- diff --git a/lib/fast486/opcodes.c b/lib/fast486/opcodes.c index 78bcd67e826..48c249f60c6 100644 --- a/lib/fast486/opcodes.c +++ b/lib/fast486/opcodes.c @@ -3042,6 +3042,13 @@ FAST486_OPCODE_HANDLER(Fast486OpcodeDaa) State->Flags.Cf = TRUE; } + Value = State->GeneralRegs[FAST486_REG_EAX].LowByte; + + /* Update the flags */ + State->Flags.Sf = (Value & SIGN_FLAG_BYTE) != 0; + State->Flags.Zf = (Value == 0); + State->Flags.Pf = Fast486CalculateParity(Value); + return TRUE; } @@ -3374,6 +3381,13 @@ FAST486_OPCODE_HANDLER(Fast486OpcodeDas) State->Flags.Cf = TRUE; } + Value = State->GeneralRegs[FAST486_REG_EAX].LowByte; + + /* Update the flags */ + State->Flags.Sf = (Value & SIGN_FLAG_BYTE) != 0; + State->Flags.Zf = (Value == 0); + State->Flags.Pf = Fast486CalculateParity(Value); + return TRUE; } @@ -3388,7 +3402,7 @@ FAST486_OPCODE_HANDLER(Fast486OpcodeAaa) if (((Value & 0x0F) > 9) || State->Flags.Af) { /* Correct it */ - State->GeneralRegs[FAST486_REG_EAX].LowByte += 0x06; + State->GeneralRegs[FAST486_REG_EAX].LowWord += 0x06; State->GeneralRegs[FAST486_REG_EAX].HighByte++; /* Set CF and AF */ @@ -3417,7 +3431,7 @@ FAST486_OPCODE_HANDLER(Fast486OpcodeAas) if (((Value & 0x0F) > 9) || State->Flags.Af) { /* Correct it */ - State->GeneralRegs[FAST486_REG_EAX].LowByte -= 0x06; + State->GeneralRegs[FAST486_REG_EAX].LowWord -= 0x06; State->GeneralRegs[FAST486_REG_EAX].HighByte--; /* Set CF and AF */ @@ -4876,6 +4890,7 @@ FAST486_OPCODE_HANDLER(Fast486OpcodeAam) State->GeneralRegs[FAST486_REG_EAX].LowByte = Value %= Base; /* Update flags */ + State->Flags.Af = FALSE; State->Flags.Zf = (Value == 0); State->Flags.Sf = ((Value & SIGN_FLAG_BYTE) != 0); State->Flags.Pf = Fast486CalculateParity(Value); @@ -4899,9 +4914,10 @@ FAST486_OPCODE_HANDLER(Fast486OpcodeAad) /* Adjust */ Value += State->GeneralRegs[FAST486_REG_EAX].HighByte * Base; - State->GeneralRegs[FAST486_REG_EAX].LowByte = Value; + State->GeneralRegs[FAST486_REG_EAX].LowWord = Value; /* Update flags */ + State->Flags.Af = FALSE; State->Flags.Zf = (Value == 0); State->Flags.Sf = ((Value & SIGN_FLAG_BYTE) != 0); State->Flags.Pf = Fast486CalculateParity(Value);