[FAST486]
authorAleksandar Andrejevic <aandrejevic@reactos.org>
Fri, 15 Nov 2013 20:49:48 +0000 (20:49 +0000)
committerAleksandar Andrejevic <aandrejevic@reactos.org>
Fri, 15 Nov 2013 20:49:48 +0000 (20:49 +0000)
- When accessing memory using ESP, make the SS segment default.
- The INT instructions always pushes 16-bit values in real mode, regardless
  of the operand/address size attributes.

svn path=/branches/ntvdm/; revision=61000

lib/fast486/common.c
lib/fast486/common.inl

index 42b7b96..d41c7c8 100644 (file)
@@ -240,6 +240,14 @@ Fast486InterruptInternal(PFAST486_STATE State,
             if (!Fast486StackPush(State, OldEsp)) return FALSE;
         }
     }
+    else
+    {
+        if (State->SegmentRegs[FAST486_REG_CS].Size)
+        {
+            /* Set OPSIZE, because INT always pushes 16-bit values in real mode */
+            State->PrefixFlags |= FAST486_PREFIX_OPSIZE;
+        }
+    }
 
     /* Push EFLAGS */
     if (!Fast486StackPush(State, State->Flags.Long)) return FALSE;
index a6ad252..1297b24 100644 (file)
@@ -730,6 +730,17 @@ Fast486ParseModRegRm(PFAST486_STATE State,
                 }
             }
 
+            if ((SibByte & 0x07) == FAST486_REG_ESP)
+            {
+                /* Check if there is no segment override */
+                if (!(State->PrefixFlags & FAST486_PREFIX_SEG))
+                {
+                    /* Add a SS: prefix */
+                    State->PrefixFlags |= FAST486_PREFIX_SEG;
+                    State->SegmentOverride = FAST486_REG_SS;
+                }
+            }
+
             /* Calculate the address */
             ModRegRm->MemoryAddress = Base + Index * Scale;
         }