2 * COPYRIGHT: GPL - See COPYING in the top level directory
3 * PROJECT: ReactOS Virtual DOS Machine
5 * PURPOSE: VDM Keyboard BIOS Support Library
6 * PROGRAMMERS: Hermes Belusca-Maito (hermes.belusca@sfr.fr)
9 /* INCLUDES *******************************************************************/
19 // #include "kbdbios.h"
21 /* DEFINES ********************************************************************/
24 #define BOP_KBD_IRQ 0x09
25 #define BOP_KBD_INT 0x16
27 /* PUBLIC FUNCTIONS ***********************************************************/
29 extern VOID WINAPI
BiosKeyboardIrq(LPWORD Stack
);
30 static VOID WINAPI
KbdBiosIRQ(LPWORD Stack
)
33 * Set up a false stack to hardwire the BOP function (that can directly
34 * manipulate CPU registers) to the 32-bit interrupt function (which uses
35 * the stack to be able to modify the original CS:IP and FLAGS).
37 * See int32.h stack codes.
40 DWORD Flags
= getEFLAGS();
42 DPRINT1("Calling BOP KbdBiosIRQ\n");
44 EmuStack
[STACK_FLAGS
] = LOWORD(Flags
);
45 EmuStack
[STACK_CS
] = getCS();
46 EmuStack
[STACK_IP
] = getIP();
47 EmuStack
[STACK_INT_NUM
] = BOP_KBD_IRQ
;
49 BiosKeyboardIrq(EmuStack
);
51 setIP(EmuStack
[STACK_IP
]);
52 setCS(EmuStack
[STACK_CS
]);
53 setEFLAGS(MAKELONG(EmuStack
[STACK_FLAGS
], HIWORD(Flags
)));
56 extern VOID WINAPI
BiosKeyboardService(LPWORD Stack
);
57 static VOID WINAPI
KbdBiosINT(LPWORD Stack
)
60 * Set up a false stack to hardwire the BOP function (that can directly
61 * manipulate CPU registers) to the 32-bit interrupt function (which uses
62 * the stack to be able to modify the original CS:IP and FLAGS).
64 * See int32.h stack codes.
67 DWORD Flags
= getEFLAGS();
69 DPRINT1("Calling BOP KbdBiosINT\n");
71 EmuStack
[STACK_FLAGS
] = LOWORD(Flags
);
72 EmuStack
[STACK_CS
] = getCS();
73 EmuStack
[STACK_IP
] = getIP();
74 EmuStack
[STACK_INT_NUM
] = BOP_KBD_IRQ
;
76 BiosKeyboardService(EmuStack
);
78 setIP(EmuStack
[STACK_IP
]);
79 setCS(EmuStack
[STACK_CS
]);
80 setEFLAGS(MAKELONG(EmuStack
[STACK_FLAGS
], HIWORD(Flags
)));
83 BOOLEAN
KbdBiosInitialize(VOID
)
85 /* Register the BIOS support BOPs */
86 RegisterBop(BOP_KBD_IRQ
, KbdBiosIRQ
); // BiosKeyboardIrq in kbdbios32.c
87 RegisterBop(BOP_KBD_INT
, KbdBiosINT
); // BiosKeyboardService in kbdbios32.c
91 VOID
KbdBiosCleanup(VOID
)
93 /* Unregister the BIOS support BOPs */
94 RegisterBop(BOP_KBD_IRQ
, NULL
);
95 RegisterBop(BOP_KBD_INT
, NULL
);