[FAST486][NTVDM]
[reactos.git] / reactos / lib / fast486 / fast486.c
index 21b2384..12a3768 100644 (file)
@@ -54,35 +54,38 @@ Fast486ExecutionControl(PFAST486_STATE State, FAST486_EXEC_CMD Command)
     /* Main execution loop */
     do
     {
+        if (!State->Halted)
+        {
 NextInst:
-        /* Check if this is a new instruction */
-        if (State->PrefixFlags == 0) State->SavedInstPtr = State->InstPtr;
+            /* Check if this is a new instruction */
+            if (State->PrefixFlags == 0) State->SavedInstPtr = State->InstPtr;
 
-        /* Perform an instruction fetch */
-        if (!Fast486FetchByte(State, &Opcode))
-        {
-            /* Exception occurred */
-            State->PrefixFlags = 0;
-            continue;
-        }
+            /* Perform an instruction fetch */
+            if (!Fast486FetchByte(State, &Opcode))
+            {
+                /* Exception occurred */
+                State->PrefixFlags = 0;
+                continue;
+            }
 
-        // TODO: Check for CALL/RET to update ProcedureCallCount.
+            // TODO: Check for CALL/RET to update ProcedureCallCount.
 
-        /* Call the opcode handler */
-        CurrentHandler = Fast486OpcodeHandlers[Opcode];
-        CurrentHandler(State, Opcode);
+            /* Call the opcode handler */
+            CurrentHandler = Fast486OpcodeHandlers[Opcode];
+            CurrentHandler(State, Opcode);
 
-        /* If this is a prefix, go to the next instruction immediately */
-        if (CurrentHandler == Fast486OpcodePrefix) goto NextInst;
+            /* If this is a prefix, go to the next instruction immediately */
+            if (CurrentHandler == Fast486OpcodePrefix) goto NextInst;
 
-        /* A non-prefix opcode has been executed, reset the prefix flags */
-        State->PrefixFlags = 0;
+            /* A non-prefix opcode has been executed, reset the prefix flags */
+            State->PrefixFlags = 0;
+        }
 
         /*
          * Check if there is an interrupt to execute, or a hardware interrupt signal
          * while interrupts are enabled.
          */
-        if (State->Flags.Tf)
+        if (State->Flags.Tf && !State->Halted)
         {
             /* Perform the interrupt */
             Fast486PerformInterrupt(State, 0x01);
@@ -98,6 +101,9 @@ NextInst:
         }
         else if (State->IntStatus == FAST486_INT_EXECUTE)
         {
+            /* No longer halted */
+            State->Halted = FALSE;
+
             /* Perform the interrupt */
             Fast486PerformInterrupt(State, State->PendingIntNum);
 
@@ -143,7 +149,7 @@ Fast486MemWriteCallback(PFAST486_STATE State, ULONG Address, PVOID Buffer, ULONG
 
 static VOID
 NTAPI
-Fast486IoReadCallback(PFAST486_STATE State, ULONG Port, PVOID Buffer, ULONG DataCount, UCHAR DataSize)
+Fast486IoReadCallback(PFAST486_STATE State, USHORT Port, PVOID Buffer, ULONG DataCount, UCHAR DataSize)
 {
     UNREFERENCED_PARAMETER(State);
     UNREFERENCED_PARAMETER(Port);
@@ -154,7 +160,7 @@ Fast486IoReadCallback(PFAST486_STATE State, ULONG Port, PVOID Buffer, ULONG Data
 
 static VOID
 NTAPI
-Fast486IoWriteCallback(PFAST486_STATE State, ULONG Port, PVOID Buffer, ULONG DataCount, UCHAR DataSize)
+Fast486IoWriteCallback(PFAST486_STATE State, USHORT Port, PVOID Buffer, ULONG DataCount, UCHAR DataSize)
 {
     UNREFERENCED_PARAMETER(State);
     UNREFERENCED_PARAMETER(Port);
@@ -163,13 +169,6 @@ Fast486IoWriteCallback(PFAST486_STATE State, ULONG Port, PVOID Buffer, ULONG Dat
     UNREFERENCED_PARAMETER(DataSize);
 }
 
-static VOID
-NTAPI
-Fast486IdleCallback(PFAST486_STATE State)
-{
-    UNREFERENCED_PARAMETER(State);
-}
-
 static VOID
 NTAPI
 Fast486BopCallback(PFAST486_STATE State, UCHAR BopCode)
@@ -197,7 +196,6 @@ Fast486Initialize(PFAST486_STATE         State,
                   FAST486_MEM_WRITE_PROC MemWriteCallback,
                   FAST486_IO_READ_PROC   IoReadCallback,
                   FAST486_IO_WRITE_PROC  IoWriteCallback,
-                  FAST486_IDLE_PROC      IdleCallback,
                   FAST486_BOP_PROC       BopCallback,
                   FAST486_INT_ACK_PROC   IntAckCallback,
                   PULONG                 Tlb)
@@ -207,7 +205,6 @@ Fast486Initialize(PFAST486_STATE         State,
     State->MemWriteCallback = (MemWriteCallback ? MemWriteCallback : Fast486MemWriteCallback);
     State->IoReadCallback   = (IoReadCallback   ? IoReadCallback   : Fast486IoReadCallback  );
     State->IoWriteCallback  = (IoWriteCallback  ? IoWriteCallback  : Fast486IoWriteCallback );
-    State->IdleCallback     = (IdleCallback     ? IdleCallback     : Fast486IdleCallback    );
     State->BopCallback      = (BopCallback      ? BopCallback      : Fast486BopCallback     );
     State->IntAckCallback   = (IntAckCallback   ? IntAckCallback   : Fast486IntAckCallback  );
 
@@ -229,7 +226,6 @@ Fast486Reset(PFAST486_STATE State)
     FAST486_MEM_WRITE_PROC MemWriteCallback = State->MemWriteCallback;
     FAST486_IO_READ_PROC   IoReadCallback   = State->IoReadCallback;
     FAST486_IO_WRITE_PROC  IoWriteCallback  = State->IoWriteCallback;
-    FAST486_IDLE_PROC      IdleCallback     = State->IdleCallback;
     FAST486_BOP_PROC       BopCallback      = State->BopCallback;
     FAST486_INT_ACK_PROC   IntAckCallback   = State->IntAckCallback;
     PULONG                 Tlb              = State->Tlb;
@@ -283,7 +279,6 @@ Fast486Reset(PFAST486_STATE State)
     State->MemWriteCallback = MemWriteCallback;
     State->IoReadCallback   = IoReadCallback;
     State->IoWriteCallback  = IoWriteCallback;
-    State->IdleCallback     = IdleCallback;
     State->BopCallback      = BopCallback;
     State->IntAckCallback   = IntAckCallback;
     State->Tlb              = Tlb;