[NTVDM]
authorAleksandar Andrejevic <aandrejevic@reactos.org>
Sun, 27 Oct 2013 19:08:58 +0000 (19:08 +0000)
committerAleksandar Andrejevic <aandrejevic@reactos.org>
Sun, 27 Oct 2013 19:08:58 +0000 (19:08 +0000)
The PS/2 should latch the last value that was read in the case of multiple reads.
Modify the BIOS keyboard IRQ handler to support hooks.

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

subsystems/ntvdm/bios.c
subsystems/ntvdm/ps2.c

index efb3718..7807e67 100644 (file)
@@ -1132,9 +1132,9 @@ VOID BiosHandleIrq(BYTE IrqNumber, LPWORD Stack)
         {
             BYTE ScanCode, VirtualKey;
             WORD Character;
-            
+
             /* Loop while there is a scancode available */
-            while (KeyboardReadStatus() & 1)
+            do
             {
                 /* Get the scan code and virtual key code */
                 ScanCode = KeyboardReadData();
@@ -1173,6 +1173,7 @@ VOID BiosHandleIrq(BYTE IrqNumber, LPWORD Stack)
                     BiosKeyboardMap[VirtualKey] &= ~(1 << 7);
                 }
             }
+            while (KeyboardReadStatus() & 1);
 
             /* Clear the keyboard flags */
             Bda->KeybdShiftFlags = 0;
index 034d811..e17c3d2 100644 (file)
@@ -20,7 +20,7 @@ static BYTE KeyboardQueue[KEYBOARD_BUFFER_SIZE];
 static BOOLEAN KeyboardQueueEmpty = TRUE;
 static UINT KeyboardQueueStart = 0;
 static UINT KeyboardQueueEnd = 0;
-static BYTE KeyboardResponse = 0;
+static BYTE KeyboardData = 0, KeyboardResponse = 0;
 static BOOLEAN KeyboardReadResponse = FALSE, KeyboardWriteResponse = FALSE;
 static BYTE KeyboardConfig = PS2_DEFAULT_CONFIG;
 
@@ -190,19 +190,19 @@ VOID KeyboardWriteCommand(BYTE Command)
 
 BYTE KeyboardReadData()
 {
-    BYTE Value = 0;
-
     /* If there was a response byte from the controller, return it */
     if (KeyboardReadResponse)
     {
         KeyboardReadResponse = FALSE;
-        return KeyboardResponse;
+        KeyboardData = KeyboardResponse;
+    }
+    else
+    {
+        /* Otherwise, read the data from the queue */
+        KeyboardQueuePop(&KeyboardData);
     }
-    
-    /* Otherwise, read the data from the queue */
-    KeyboardQueuePop(&Value);
 
-    return Value;
+    return KeyboardData;
 }
 
 VOID KeyboardWriteData(BYTE Data)