Author: aandrejevic
Date: Mon Jul 15 02:34:45 2013
New Revision: 59490

URL: http://svn.reactos.org/svn/reactos?rev=59490&view=rev
Log:
[SOFTX86]
Fix carry/overflow condition for the SUB instruction.


Modified:
    branches/ntvdm/lib/3rdparty/softx86/softx86/add.c

Modified: branches/ntvdm/lib/3rdparty/softx86/softx86/add.c
URL: 
http://svn.reactos.org/svn/reactos/branches/ntvdm/lib/3rdparty/softx86/softx86/add.c?rev=59490&r1=59489&r2=59490&view=diff
==============================================================================
--- branches/ntvdm/lib/3rdparty/softx86/softx86/add.c   [iso-8859-1] (original)
+++ branches/ntvdm/lib/3rdparty/softx86/softx86/add.c   [iso-8859-1] Mon Jul 15 
02:34:45 2013
@@ -342,13 +342,16 @@
 /* peform the addition */
        ret = src - val;
 
-/* if carry/overflow */
-       if (ret > src)
-               ctx->state->reg_flags.val |=
-                        (SX86_CPUFLAG_CARRY | SX86_CPUFLAG_OVERFLOW);
-       else
-               ctx->state->reg_flags.val &=
-                       ~(SX86_CPUFLAG_CARRY | SX86_CPUFLAG_OVERFLOW);
+/* if carry */
+        if (val > src) ctx->state->reg_flags.val |= SX86_CPUFLAG_CARRY;
+        else ctx->state->reg_flags.val &= ~SX86_CPUFLAG_CARRY;
+
+/* if overflow */
+       if (((src & 0x80) != (val & 0x80)) && ((src & 0x80) != (ret & 0x80)))
+        {
+            ctx->state->reg_flags.val |= SX86_CPUFLAG_OVERFLOW;
+        }
+       else ctx->state->reg_flags.val &= ~SX86_CPUFLAG_OVERFLOW;
 
 /* if result treated as signed value is negative */
        if (ret & 0x80) ctx->state->reg_flags.val |=  SX86_CPUFLAG_SIGN;
@@ -391,7 +394,10 @@
         else ctx->state->reg_flags.val &= ~SX86_CPUFLAG_CARRY;
 
 /* if overflow */
-       if ((ret & 0x8000) != (src & 0x8000)) ctx->state->reg_flags.val |= 
SX86_CPUFLAG_OVERFLOW;
+       if (((src & 0x8000) != (val & 0x8000)) && ((src & 0x8000) != (ret & 
0x8000)))
+        {
+            ctx->state->reg_flags.val |= SX86_CPUFLAG_OVERFLOW;
+        }
        else ctx->state->reg_flags.val &= ~SX86_CPUFLAG_OVERFLOW;
 
 /* if result treated as signed value is negative */
@@ -430,13 +436,17 @@
 /* peform the addition */
        ret = src - val;
 
-/* if carry/overflow */
-       if (ret > src)
-               ctx->state->reg_flags.val |=
-                        (SX86_CPUFLAG_CARRY | SX86_CPUFLAG_OVERFLOW);
-       else
-               ctx->state->reg_flags.val &=
-                       ~(SX86_CPUFLAG_CARRY | SX86_CPUFLAG_OVERFLOW);
+/* if carry */
+        if (val > src) ctx->state->reg_flags.val |= SX86_CPUFLAG_CARRY;
+        else ctx->state->reg_flags.val &= ~SX86_CPUFLAG_CARRY;
+
+/* if overflow */
+       if (((src & 0x80000000) != (val & 0x80000000))
+            && ((src & 0x80000000) != (ret & 0x80000000)))
+        {
+            ctx->state->reg_flags.val |= SX86_CPUFLAG_OVERFLOW;
+        }
+       else ctx->state->reg_flags.val &= ~SX86_CPUFLAG_OVERFLOW;
 
 /* if result treated as signed value is negative */
        if (ret & 0x80000000)   ctx->state->reg_flags.val |=  SX86_CPUFLAG_SIGN;


Reply via email to