From 7eae9e66363bedc0e4f9fbcb2a2972eee0a49284 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Herm=C3=A8s=20B=C3=A9lusca-Ma=C3=AFto?= Date: Sat, 27 Sep 2014 23:45:24 +0000 Subject: [PATCH] [NTVDM]: Fix a bug introduced in revision 64324, where I didn't restore the original values of CF and AX. Fix some keyboard issues in Mystery Mansion. svn path=/trunk/; revision=64360 --- reactos/subsystems/ntvdm/bios/bios32/kbdbios32.c | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/reactos/subsystems/ntvdm/bios/bios32/kbdbios32.c b/reactos/subsystems/ntvdm/bios/bios32/kbdbios32.c index 0c60a546500..0782f3e719f 100644 --- a/reactos/subsystems/ntvdm/bios/bios32/kbdbios32.c +++ b/reactos/subsystems/ntvdm/bios/bios32/kbdbios32.c @@ -194,6 +194,7 @@ static VOID WINAPI BiosKeyboardService(LPWORD Stack) // Keyboard IRQ 1 static VOID WINAPI BiosKeyboardIrq(LPWORD Stack) { + BOOLEAN SkipScanCode; BYTE ScanCode, VirtualKey; WORD Character; @@ -204,18 +205,25 @@ static VOID WINAPI BiosKeyboardIrq(LPWORD Stack) * In return, if CF is set we continue processing the scan code * stored in AL, and if not, we skip it. */ + BYTE CF, AX; + CF = getCF(); + AX = getAX(); + setCF(1); setAL(IOReadB(PS2_DATA_PORT)); setAH(0x4F); Int32Call(&BiosContext, BIOS_MISC_INTERRUPT); - /* Check whether CL is clear. If so, skip the scan code. */ - if (getCF() == 0) goto Quit; - /**/setCF(0);/**/ // FIXME: HACK: Reset CF otherwise we enter in an infinite loop. - /* Retrieve the modified scan code in AL */ + SkipScanCode = (getCF() == 0); ScanCode = getAL(); + setAX(AX); + setCF(CF); + + /* Check whether CF is clear. If so, skip the scan code. */ + if (SkipScanCode) goto Quit; + /* Get the corresponding virtual key code */ VirtualKey = MapVirtualKey(ScanCode & 0x7F, MAPVK_VSC_TO_VK); -- 2.17.1