8 volatile char keyb[256];
9 volatile char last_keys[50];
11 unsigned char scancode2ascii[256] = {
12 0, 0, 49, 50, 51, 52, 53, 54, 55, 56, /* 0-9 */
13 57, 48, 45, 0, 0, 0, 113, 119, 101, 114, /* 10-19 */
14 116, 121, 117, 105, 111, 112, 0, 0, 0, 0, /* 20-29 */
15 97, 115, 100, 102, 103, 104, 106, 107, 108, 0, /* 30-39 */
16 0, 0, 0, 0, 122, 120, 99, 118, 98, 110, /* 40-49 */
17 109, 44, 46, 47, 0, 0, 0, 32, 0, 0, /* 50-59 */
18 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
19 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
20 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
21 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
22 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
23 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
24 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
25 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
26 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
27 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
28 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
29 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
30 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
31 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
32 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
33 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
34 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
35 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
36 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
40 _go32_dpmi_seginfo old_keyb_handler_seginfo, new_keyb_handler_seginfo;
55 if ((key & 0x80) == 0) {
57 for (c1 = 48; c1 > 0; c1--)
58 last_keys[c1] = last_keys[c1 - 1];
59 last_keys[0] = scancode2ascii[key & 0x7f];
63 if ((key & 0x80) == 0) {
64 keyb[(key & 0x7f) + 0x80] = 1;
65 for (c1 = 48; c1 > 0; c1--)
66 last_keys[c1] = last_keys[c1 - 1];
67 last_keys[0] = scancode2ascii[(key & 0x7f) + 0x80];
69 keyb[(key & 0x7f) + 0x80] = 0;
79 void keyb_handler_end()
84 char hook_keyb_handler(void)
87 if (keyb_handler_info.enabled == 0) {
88 _go32_dpmi_lock_data((char *) &keyb, sizeof(keyb));
89 _go32_dpmi_lock_code(keyb_handler, (unsigned long) keyb_handler_end - (unsigned long) keyb_handler);
90 _go32_dpmi_get_protected_mode_interrupt_vector(9, &old_keyb_handler_seginfo);
91 new_keyb_handler_seginfo.pm_offset = (int) keyb_handler;
92 if (_go32_dpmi_allocate_iret_wrapper(&new_keyb_handler_seginfo) != 0)
94 if (_go32_dpmi_set_protected_mode_interrupt_vector(9, &new_keyb_handler_seginfo) != 0) {
95 _go32_dpmi_free_iret_wrapper(&new_keyb_handler_seginfo);
98 keyb_handler_info.enabled = 1;
99 memset(last_keys, 0, sizeof(last_keys));
107 void remove_keyb_handler(void)
110 if (keyb_handler_info.enabled == 1) {
111 _go32_dpmi_set_protected_mode_interrupt_vector(9, &old_keyb_handler_seginfo);
112 _go32_dpmi_free_iret_wrapper(&new_keyb_handler_seginfo);
113 keyb_handler_info.enabled = 0;
119 char key_pressed(unsigned char key)