[SOFT386]
[reactos.git] / lib / soft386 / soft386.c
index a362cf9..feca579 100644 (file)
@@ -56,6 +56,31 @@ Soft386ExecutionControl(PSOFT386_STATE State, INT Command)
     /* Main execution loop */
     do
     {
+        /* Check if this is a new instruction */
+        if (State->PrefixFlags == 0)
+        {
+            State->SavedInstPtr = State->InstPtr;
+
+            /* Check if interrupts are enabled and there is an interrupt pending */
+            if (State->Flags.If && State->HardwareInt)
+            {
+                SOFT386_IDT_ENTRY IdtEntry;
+
+                /* Get the interrupt vector */
+                if (Soft386GetIntVector(State, State->PendingIntNum, &IdtEntry))
+                {
+                    /* Perform the interrupt */
+                    Soft386InterruptInternal(State,
+                                             IdtEntry.Selector,
+                                             MAKELONG(IdtEntry.Offset, IdtEntry.OffsetHigh),
+                                             IdtEntry.Type);
+                }
+
+                /* Clear the interrupt pending flag */
+                State->HardwareInt = FALSE;
+            }
+        }
+
         /* Perform an instruction fetch */
         if (!Soft386FetchByte(State, &Opcode)) continue;
 
@@ -77,13 +102,19 @@ Soft386ExecutionControl(PSOFT386_STATE State, INT Command)
             /* A non-prefix opcode has been executed, reset the prefix flags */
             State->PrefixFlags = 0;
         }
+        else
+        {
+            /* This is a prefix, go to the next instruction immediately */
+            continue;
+        }
 
         /* Increment the time stamp counter */
         State->TimeStampCounter++;
     }
     while ((Command == SOFT386_CONTINUE)
            || (Command == SOFT386_STEP_OVER && ProcedureCallCount > 0)
-           || (Command == SOFT386_STEP_OUT && ProcedureCallCount >= 0));
+           || (Command == SOFT386_STEP_OUT && ProcedureCallCount >= 0)
+           || (Soft386OpcodeHandlers[Opcode] == Soft386OpcodePrefix));
 }
 
 /* PUBLIC FUNCTIONS ***********************************************************/
@@ -266,8 +297,9 @@ VOID
 NTAPI
 Soft386Interrupt(PSOFT386_STATE State, UCHAR Number)
 {
-    // TODO: NOT IMPLEMENTED!!!
-    UNIMPLEMENTED;
+    /* Set the hardware interrupt flag */
+    State->HardwareInt = TRUE;
+    State->PendingIntNum = Number;
 }
 
 VOID
@@ -300,5 +332,14 @@ Soft386SetStack(PSOFT386_STATE State, USHORT Segment, ULONG Offset)
     State->GeneralRegs[SOFT386_REG_ESP].Long = Offset;
 }
 
+VOID
+NTAPI
+Soft386SetSegment(PSOFT386_STATE State,
+                  SOFT386_SEG_REGS Segment,
+                  USHORT Selector)
+{
+    /* Call the internal function */
+    Soft386LoadSegment(State, Segment, Selector);
+}
 
 /* EOF */