[SOFT386]
[reactos.git] / lib / soft386 / soft386.c
index 22732fd..02cd048 100644 (file)
 // #define _INC_WINDOWS
 #include <windef.h>
 
+// #define NDEBUG
+#include <debug.h>
+
 #include <soft386.h>
 #include "common.h"
 #include "opcodes.h"
 
-// #define NDEBUG
-#include <debug.h>
-
 /* DEFINES ********************************************************************/
 
 typedef enum
@@ -64,6 +64,9 @@ Soft386ExecutionControl(PSOFT386_STATE State, INT Command)
             /* A non-prefix opcode has been executed, reset the prefix flags */
             State->PrefixFlags = 0;
         }
+
+        /* Increment the time stamp counter */
+        State->TimeStampCounter++;
     }
     while ((Command == SOFT386_CONTINUE)
            || (Command == SOFT386_STEP_OVER && ProcedureCallCount > 0)
@@ -208,6 +211,7 @@ Soft386Reset(PSOFT386_STATE State)
     SOFT386_IO_READ_PROC IoReadCallback = State->IoReadCallback;
     SOFT386_IO_WRITE_PROC IoWriteCallback = State->IoWriteCallback;
     SOFT386_IDLE_PROC IdleCallback = State->IdleCallback;
+    SOFT386_BOP_PROC BopCallback = State->BopCallback;
 
     /* Clear the entire structure */
     RtlZeroMemory(State, sizeof(*State));
@@ -235,13 +239,14 @@ Soft386Reset(PSOFT386_STATE State)
 
     /* Initialize CR0 */
     State->ControlRegisters[SOFT386_REG_CR0] |= SOFT386_CR0_ET;
-    
+
     /* Restore the callbacks */
     State->MemReadCallback = MemReadCallback;
     State->MemWriteCallback = MemWriteCallback;
     State->IoReadCallback = IoReadCallback;
     State->IoWriteCallback = IoWriteCallback;
     State->IdleCallback = IdleCallback;
+    State->BopCallback = BopCallback;
 }
 
 VOID
@@ -267,4 +272,20 @@ Soft386ExecuteAt(PSOFT386_STATE State, USHORT Segment, ULONG Offset)
     State->InstPtr.Long = Offset;
 }
 
+VOID
+NTAPI
+Soft386SetStack(PSOFT386_STATE State, USHORT Segment, ULONG Offset)
+{
+    /* Load the new SS */
+    if (!Soft386LoadSegment(State, SOFT386_REG_SS, Segment))
+    {
+        /* An exception occurred, let the handler execute instead */
+        return;
+    }
+
+    /* Set the new SP */
+    State->GeneralRegs[SOFT386_REG_ESP].Long = Offset;
+}
+
+
 /* EOF */