[SOFT386]
authorAleksandar Andrejevic <aandrejevic@reactos.org>
Sat, 12 Oct 2013 13:58:34 +0000 (13:58 +0000)
committerAleksandar Andrejevic <aandrejevic@reactos.org>
Sat, 12 Oct 2013 13:58:34 +0000 (13:58 +0000)
Implement Soft386Interrupt.
[NTVDM]
Implement EmulatorInterrupt and EmulatorExternalInterrupt for NEW_EMULATOR.

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

include/reactos/libs/soft386/soft386.h
lib/soft386/soft386.c
subsystems/ntvdm/emulator.c

index 96c9d46..d8ced70 100644 (file)
@@ -359,7 +359,7 @@ Soft386Reset(PSOFT386_STATE State);
 
 VOID
 NTAPI
-Soft386Interrupt(PSOFT386_STATE State, UCHAR Number);
+Soft386Interrupt(PSOFT386_STATE State, UCHAR Number, BOOLEAN Hardware);
 
 VOID
 NTAPI
index 02d91b0..060ac2c 100644 (file)
@@ -273,10 +273,27 @@ Soft386Reset(PSOFT386_STATE State)
 
 VOID
 NTAPI
-Soft386Interrupt(PSOFT386_STATE State, UCHAR Number)
+Soft386Interrupt(PSOFT386_STATE State, UCHAR Number, BOOLEAN Hardware)
 {
-    // TODO: NOT IMPLEMENTED!!!
-    UNIMPLEMENTED;
+    SOFT386_IDT_ENTRY IdtEntry;
+
+    if (Hardware)
+    {
+        /* Set the hardware interrupt flag */
+        State->HardwareInt = TRUE;
+    }
+
+    if (!Soft386GetIntVector(State, Number, &IdtEntry))
+    {
+        /* An exception occurred, let the handler execute */
+        return;
+    }
+
+    /* Perform the interrupt */
+    Soft386InterruptInternal(State,
+                             IdtEntry.Selector,
+                             MAKELONG(IdtEntry.Offset, IdtEntry.OffsetHigh),
+                             IdtEntry.Type);
 }
 
 VOID
index e3b8027..a9814e1 100644 (file)
@@ -461,6 +461,7 @@ VOID EmulatorExecute(WORD Segment, WORD Offset)
 
 VOID EmulatorInterrupt(BYTE Number)
 {
+#ifndef NEW_EMULATOR
     LPDWORD IntVecTable = (LPDWORD)((ULONG_PTR)BaseAddress);
     UINT Segment, Offset;
 
@@ -468,13 +469,11 @@ VOID EmulatorInterrupt(BYTE Number)
     Segment = HIWORD(IntVecTable[Number]);
     Offset = LOWORD(IntVecTable[Number]);
 
-#ifndef NEW_EMULATOR
     /* Call the softx86 API */
     softx86_make_simple_interrupt_call(&EmulatorContext, &Segment, &Offset);
 #else
-    UNREFERENCED_PARAMETER(Segment);
-    UNREFERENCED_PARAMETER(Offset);
-    // TODO: NOT IMPLEMENTED
+    /* Call the Soft386 API */
+    Soft386Interrupt(&EmulatorContext, Number, FALSE);
 #endif
 }
 
@@ -483,6 +482,9 @@ VOID EmulatorExternalInterrupt(BYTE Number)
 #ifndef NEW_EMULATOR
     /* Call the softx86 API */
     softx86_ext_hw_signal(&EmulatorContext, Number);
+#else
+    /* Call the Soft386 API */
+    Soft386Interrupt(&EmulatorContext, Number, TRUE);
 #endif
 }