Author: aandrejevic
Date: Mon Apr 20 00:36:46 2015
New Revision: 67320
URL:
http://svn.reactos.org/svn/reactos?rev=67320&view=rev
Log:
[FAST486]
Whether stack operations use ESP or SP depends on the size of the stack segment.
Modified:
trunk/reactos/lib/fast486/common.inl
Modified: trunk/reactos/lib/fast486/common.inl
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/lib/fast486/common.inl?rev…
==============================================================================
--- trunk/reactos/lib/fast486/common.inl [iso-8859-1] (original)
+++ trunk/reactos/lib/fast486/common.inl [iso-8859-1] Mon Apr 20 00:36:46 2015
@@ -301,6 +301,7 @@
ULONG Value)
{
BOOLEAN Size = State->SegmentRegs[FAST486_REG_CS].Size;
+ ULONG StackPointer = State->GeneralRegs[FAST486_REG_ESP].Long;
/* The OPSIZE prefix toggles the size */
TOGGLE_OPSIZE(Size);
@@ -320,7 +321,9 @@
/* Store the value in SS:[ESP - 4] */
if (!Fast486WriteMemory(State,
FAST486_REG_SS,
- State->GeneralRegs[FAST486_REG_ESP].Long -
sizeof(ULONG),
+ State->SegmentRegs[FAST486_REG_SS].Size
+ ? StackPointer - sizeof(ULONG)
+ : LOWORD(StackPointer - sizeof(ULONG)),
&Value,
sizeof(ULONG)))
{
@@ -328,8 +331,16 @@
return FALSE;
}
- /* Subtract ESP by 4 */
- State->GeneralRegs[FAST486_REG_ESP].Long -= sizeof(ULONG);
+ if (State->SegmentRegs[FAST486_REG_SS].Size)
+ {
+ /* Subtract ESP by 4 */
+ State->GeneralRegs[FAST486_REG_ESP].Long -= sizeof(ULONG);
+ }
+ else
+ {
+ /* Subtract SP by 4 */
+ State->GeneralRegs[FAST486_REG_ESP].LowWord -= sizeof(ULONG);
+ }
}
else
{
@@ -346,7 +357,9 @@
/* Store the value in SS:[SP - 2] */
if (!Fast486WriteMemory(State,
FAST486_REG_SS,
- LOWORD(State->GeneralRegs[FAST486_REG_ESP].LowWord -
sizeof(USHORT)),
+ State->SegmentRegs[FAST486_REG_SS].Size
+ ? StackPointer - sizeof(USHORT)
+ : LOWORD(StackPointer - sizeof(USHORT)),
&ShortValue,
sizeof(USHORT)))
{
@@ -354,8 +367,16 @@
return FALSE;
}
- /* Subtract SP by 2 */
- State->GeneralRegs[FAST486_REG_ESP].LowWord -= sizeof(USHORT);
+ if (State->SegmentRegs[FAST486_REG_SS].Size)
+ {
+ /* Subtract ESP by 2 */
+ State->GeneralRegs[FAST486_REG_ESP].Long -= sizeof(USHORT);
+ }
+ else
+ {
+ /* Subtract SP by 2 */
+ State->GeneralRegs[FAST486_REG_ESP].LowWord -= sizeof(USHORT);
+ }
}
return TRUE;