Create the AHCI branch for Aman's work
[reactos.git] / subsystems / mvdm / ntvdm / bios / kbdbios.c
1 /*
2 * COPYRIGHT: GPL - See COPYING in the top level directory
3 * PROJECT: ReactOS Virtual DOS Machine
4 * FILE: subsystems/mvdm/ntvdm/bios/kbdbios.c
5 * PURPOSE: VDM 32-bit PS/2 Keyboard BIOS Support Library
6 * PROGRAMMERS: Hermes Belusca-Maito (hermes.belusca@sfr.fr)
7 */
8
9 /* INCLUDES *******************************************************************/
10
11 #include "ntvdm.h"
12
13 #define NDEBUG
14 #include <debug.h>
15
16 #include "emulator.h"
17 #include "cpu/bop.h"
18 #include "int32.h"
19
20 #include "bios.h"
21 // #include "kbdbios.h"
22
23 /* DEFINES ********************************************************************/
24
25 /* BOP Identifiers */
26 #define BOP_KBD_IRQ 0x09
27 #define BOP_KBD_INT 0x16
28
29 /* PUBLIC FUNCTIONS ***********************************************************/
30
31 extern VOID WINAPI BiosKeyboardIrq(LPWORD Stack);
32 static VOID WINAPI KbdBiosIRQ(LPWORD Stack)
33 {
34 /*
35 * Set up a false stack to hardwire the BOP function (that can directly
36 * manipulate CPU registers) to the 32-bit interrupt function (which uses
37 * the stack to be able to modify the original CS:IP and FLAGS).
38 *
39 * See int32.h stack codes.
40 */
41 WORD EmuStack[4];
42 DWORD Flags = getEFLAGS();
43
44 DPRINT1("Calling BOP KbdBiosIRQ\n");
45
46 EmuStack[STACK_FLAGS] = LOWORD(Flags);
47 EmuStack[STACK_CS] = getCS();
48 EmuStack[STACK_IP] = getIP();
49 EmuStack[STACK_INT_NUM] = BOP_KBD_IRQ;
50
51 BiosKeyboardIrq(EmuStack);
52
53 setIP(EmuStack[STACK_IP]);
54 setCS(EmuStack[STACK_CS]);
55 setEFLAGS(MAKELONG(EmuStack[STACK_FLAGS], HIWORD(Flags)));
56 }
57
58 extern VOID WINAPI BiosKeyboardService(LPWORD Stack);
59 static VOID WINAPI KbdBiosINT(LPWORD Stack)
60 {
61 /*
62 * Set up a false stack to hardwire the BOP function (that can directly
63 * manipulate CPU registers) to the 32-bit interrupt function (which uses
64 * the stack to be able to modify the original CS:IP and FLAGS).
65 *
66 * See int32.h stack codes.
67 */
68 WORD EmuStack[4];
69 DWORD Flags = getEFLAGS();
70
71 DPRINT1("Calling BOP KbdBiosINT\n");
72
73 EmuStack[STACK_FLAGS] = LOWORD(Flags);
74 EmuStack[STACK_CS] = getCS();
75 EmuStack[STACK_IP] = getIP();
76 EmuStack[STACK_INT_NUM] = BOP_KBD_IRQ;
77
78 BiosKeyboardService(EmuStack);
79
80 setIP(EmuStack[STACK_IP]);
81 setCS(EmuStack[STACK_CS]);
82 setEFLAGS(MAKELONG(EmuStack[STACK_FLAGS], HIWORD(Flags)));
83 }
84
85 BOOLEAN KbdBiosInitialize(VOID)
86 {
87 /* Register the BIOS support BOPs */
88 RegisterBop(BOP_KBD_IRQ, KbdBiosIRQ); // BiosKeyboardIrq in kbdbios32.c
89 RegisterBop(BOP_KBD_INT, KbdBiosINT); // BiosKeyboardService in kbdbios32.c
90 return TRUE;
91 }
92
93 VOID KbdBiosCleanup(VOID)
94 {
95 /* Unregister the BIOS support BOPs */
96 RegisterBop(BOP_KBD_IRQ, NULL);
97 RegisterBop(BOP_KBD_INT, NULL);
98 }
99
100 /* EOF */