[NTVDM]: Return the latched data for keyboard ps/2 port only. Also when starting...
authorHermès Bélusca-Maïto <hermes.belusca-maito@reactos.org>
Sun, 26 Oct 2014 15:01:14 +0000 (15:01 +0000)
committerHermès Bélusca-Maïto <hermes.belusca-maito@reactos.org>
Sun, 26 Oct 2014 15:01:14 +0000 (15:01 +0000)
svn path=/trunk/; revision=65012

reactos/subsystems/ntvdm/dos/dos32krnl/dos.c
reactos/subsystems/ntvdm/hardware/keyboard.c
reactos/subsystems/ntvdm/hardware/ps2.c

index f98ef75..582e43c 100644 (file)
@@ -20,6 +20,9 @@
 
 #include "bios/bios.h"
 
+#include "io.h"
+#include "hardware/ps2.h"
+
 /* PRIVATE VARIABLES **********************************************************/
 
 CALLBACK16 DosContext;
@@ -1164,6 +1167,12 @@ DWORD DosStartProcess(IN LPCSTR ExecutablePath,
     /* Attach to the console */
     VidBiosAttachToConsole(); // FIXME: And in fact, attach the full NTVDM UI to the console
 
+    // HACK: Simulate a ENTER key release scancode on the PS/2 port because
+    // some apps expect to read a key release scancode (> 0x80) when they
+    // are started.
+    IOWriteB(PS2_CONTROL_PORT, 0xD2);     // Next write is for the first PS/2 port
+    IOWriteB(PS2_DATA_PORT, 0x80 | 0x1C); // ENTER key release
+
     /* Start simulation */
     SetEvent(VdmTaskEvent);
     CpuSimulate();
index 5e98bf7..fbd1d7a 100644 (file)
@@ -47,7 +47,7 @@ VOID KeyboardEventHandler(PKEY_EVENT_RECORD KeyEvent)
 
 BOOLEAN KeyboardInit(BYTE PS2Connector)
 {
-    /* Finish to plug the mouse to the specified PS/2 port */
+    /* Finish to plug the keyboard to the specified PS/2 port */
     PS2Port = PS2Connector;
     PS2SetDeviceCmdProc(PS2Port, NULL, KeyboardCommand);
 
index bfede55..b7e6c13 100644 (file)
@@ -80,11 +80,14 @@ static BYTE WINAPI PS2ReadPort(USHORT Port)
         if (StatusRegister &   (1 << 0)) // || StatusRegister &   (1 << 5) for second PS/2 port
             StatusRegister &= ~(1 << 0); //    StatusRegister &= ~(1 << 5);
 
+        // FIXME: We may check there whether there is data latched in
+        // PS2 ports 1 or 2 (keyboard or mouse) and retrieve it there...
+
         /* Always return the available byte stored in the output buffer */
         return OutputBuffer;
     }
 
-    return 0;
+    return 0x00;
 }
 
 static VOID WINAPI PS2WritePort(USHORT Port, BYTE Data)
@@ -270,7 +273,18 @@ static BOOLEAN PS2PortQueueRead(BYTE PS2Port)
     if (!Port->IsEnabled) return FALSE;
 
     /* Make sure the queue is not empty (fast check) */
-    if (Port->QueueEmpty) return FALSE;
+    if (Port->QueueEmpty)
+    {
+        /* Only the keyboard should have its last data latched */
+        // FIXME: Alternatively this can be done in PS2ReadPort when
+        // we read PS2_DATA_PORT. What is the best solution??
+        if (PS2Port == 0)
+        {
+            OutputBuffer = Port->Queue[(Port->QueueStart - 1) % BUFFER_SIZE];
+        }
+
+        return FALSE;
+    }
 
     WaitForSingleObject(Port->QueueMutex, INFINITE);
 
@@ -337,7 +351,7 @@ BOOLEAN PS2QueuePush(BYTE PS2Port, BYTE Data)
     Port->QueueEnd++;
     Port->QueueEnd %= BUFFER_SIZE;
 
-    /* Since we inserted a value, it's not empty anymore */
+    /* The queue is not empty anymore */
     Port->QueueEmpty = FALSE;
 
 /*