]>
Commit | Line | Data |
---|---|---|
c7de829c WD |
1 | /**************************************************************************** |
2 | * | |
3 | * SciTech OS Portability Manager Library | |
4 | * | |
5 | * ======================================================================== | |
6 | * | |
7 | * The contents of this file are subject to the SciTech MGL Public | |
8 | * License Version 1.0 (the "License"); you may not use this file | |
9 | * except in compliance with the License. You may obtain a copy of | |
10 | * the License at http://www.scitechsoft.com/mgl-license.txt | |
11 | * | |
12 | * Software distributed under the License is distributed on an | |
13 | * "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or | |
14 | * implied. See the License for the specific language governing | |
15 | * rights and limitations under the License. | |
16 | * | |
17 | * The Original Code is Copyright (C) 1991-1998 SciTech Software, Inc. | |
18 | * | |
19 | * The Initial Developer of the Original Code is SciTech Software, Inc. | |
20 | * All Rights Reserved. | |
21 | * | |
22 | * ======================================================================== | |
23 | * | |
24 | * | |
25 | * Language: ANSI C | |
26 | * Environment: any | |
27 | * | |
28 | * Description: Test program to check the ability to install a C based | |
29 | * keyboard Int 15h interrupt handler. This is an alternate | |
30 | * way to intercept scancodes from the keyboard by hooking | |
31 | * the Int 15h keyboard intercept callout. | |
32 | * | |
33 | * Functions tested: PM_setKey15Handler() | |
34 | * PM_restoreKey15Handler() | |
35 | * | |
36 | * | |
37 | ****************************************************************************/ | |
38 | ||
39 | #include <stdlib.h> | |
40 | #include <stdio.h> | |
41 | #include "pmapi.h" | |
42 | ||
43 | volatile long count = 0; | |
44 | volatile short lastScanCode = 0; | |
45 | ||
46 | #pragma off (check_stack) /* No stack checking under Watcom */ | |
47 | ||
48 | short PMAPI keyHandler(short scanCode) | |
49 | { | |
50 | count++; | |
51 | lastScanCode = scanCode; | |
52 | return scanCode; /* Let BIOS process as normal */ | |
53 | } | |
54 | ||
55 | int main(void) | |
56 | { | |
57 | int ch; | |
58 | PM_lockHandle lh; | |
59 | ||
60 | printf("Program running in "); | |
61 | switch (PM_getModeType()) { | |
8bde7f77 WD |
62 | case PM_realMode: |
63 | printf("real mode.\n\n"); | |
64 | break; | |
65 | case PM_286: | |
66 | printf("16 bit protected mode.\n\n"); | |
67 | break; | |
68 | case PM_386: | |
69 | printf("32 bit protected mode.\n\n"); | |
70 | break; | |
71 | } | |
c7de829c WD |
72 | |
73 | /* Install our timer handler and lock handler pages in memory. It is | |
74 | * difficult to get the size of a function in C, but we know our | |
75 | * function is well less than 100 bytes (and an entire 4k page will | |
76 | * need to be locked by the server anyway). | |
77 | */ | |
78 | PM_lockCodePages((__codePtr)keyHandler,100,&lh); | |
79 | PM_lockDataPages((void*)&count,sizeof(count),&lh); | |
80 | PM_installBreakHandler(); /* We *DONT* want Ctrl-Break's! */ | |
81 | PM_setKey15Handler(keyHandler); | |
82 | printf("Keyboard interrupt handler installed - Type some characters and\n"); | |
83 | printf("hit ESC to exit\n"); | |
84 | while ((ch = PM_getch()) != 0x1B) { | |
8bde7f77 WD |
85 | printf("%c", ch); |
86 | fflush(stdout); | |
87 | } | |
c7de829c WD |
88 | |
89 | PM_restoreKey15Handler(); | |
90 | PM_restoreBreakHandler(); | |
91 | PM_unlockDataPages((void*)&count,sizeof(count),&lh); | |
92 | PM_unlockCodePages((__codePtr)keyHandler,100,&lh); | |
93 | printf("\n\nKeyboard handler was called %ld times\n", count); | |
94 | printf("Last scan code %04X\n", lastScanCode); | |
95 | return 0; | |
96 | } |