Author: hbelusca Date: Sun Oct 26 15:01:14 2014 New Revision: 65012
URL: http://svn.reactos.org/svn/reactos?rev=65012&view=rev Log: [NTVDM]: Return the latched data for keyboard ps/2 port only. Also when starting an app put a ENTER key release into the keyboard buffer because some apps expect it.
Modified: trunk/reactos/subsystems/ntvdm/dos/dos32krnl/dos.c trunk/reactos/subsystems/ntvdm/hardware/keyboard.c trunk/reactos/subsystems/ntvdm/hardware/ps2.c
Modified: trunk/reactos/subsystems/ntvdm/dos/dos32krnl/dos.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/subsystems/ntvdm/dos/dos32k... ============================================================================== --- trunk/reactos/subsystems/ntvdm/dos/dos32krnl/dos.c [iso-8859-1] (original) +++ trunk/reactos/subsystems/ntvdm/dos/dos32krnl/dos.c [iso-8859-1] Sun Oct 26 15:01:14 2014 @@ -19,6 +19,9 @@ #include "dos/dem.h"
#include "bios/bios.h" + +#include "io.h" +#include "hardware/ps2.h"
/* PRIVATE VARIABLES **********************************************************/
@@ -1164,6 +1167,12 @@ /* 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();
Modified: trunk/reactos/subsystems/ntvdm/hardware/keyboard.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/subsystems/ntvdm/hardware/k... ============================================================================== --- trunk/reactos/subsystems/ntvdm/hardware/keyboard.c [iso-8859-1] (original) +++ trunk/reactos/subsystems/ntvdm/hardware/keyboard.c [iso-8859-1] Sun Oct 26 15:01:14 2014 @@ -47,7 +47,7 @@
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);
Modified: trunk/reactos/subsystems/ntvdm/hardware/ps2.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/subsystems/ntvdm/hardware/p... ============================================================================== --- trunk/reactos/subsystems/ntvdm/hardware/ps2.c [iso-8859-1] (original) +++ trunk/reactos/subsystems/ntvdm/hardware/ps2.c [iso-8859-1] Sun Oct 26 15:01:14 2014 @@ -80,11 +80,14 @@ 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 @@ 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 @@ 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;
/*