diff --git a/reactos/subsystems/ntvdm/dos/dos32krnl/dos.c b/reactos/subsystems/ntvdm/dos/dos32krnl/dos.c index f98ef757ba0..582e43c558a 100644 --- a/reactos/subsystems/ntvdm/dos/dos32krnl/dos.c +++ b/reactos/subsystems/ntvdm/dos/dos32krnl/dos.c @@ -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(); diff --git a/reactos/subsystems/ntvdm/hardware/keyboard.c b/reactos/subsystems/ntvdm/hardware/keyboard.c index 5e98bf73e89..fbd1d7ac265 100644 --- a/reactos/subsystems/ntvdm/hardware/keyboard.c +++ b/reactos/subsystems/ntvdm/hardware/keyboard.c @@ -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); diff --git a/reactos/subsystems/ntvdm/hardware/ps2.c b/reactos/subsystems/ntvdm/hardware/ps2.c index bfede556a03..b7e6c13a9af 100644 --- a/reactos/subsystems/ntvdm/hardware/ps2.c +++ b/reactos/subsystems/ntvdm/hardware/ps2.c @@ -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; /*