[SOFT386]
[reactos.git] / lib / soft386 / soft386.c
index 76c5f58..02cd048 100644 (file)
@@ -211,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));
@@ -238,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
@@ -270,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 */