8 volatile char keyb[256];
10 unsigned char scancode2ascii[256] = {
11 0, 0, 49, 50, 51, 52, 53, 54, 55, 56, //0-9
12 57, 48, 45, 0, 0, 0, 113, 119, 101, 114, //10-19
13 116, 121, 117, 105, 111, 112, 0, 0, 0, 0, //20-29
14 97, 115, 100, 102, 103, 104, 106, 107, 108, 0, //30-39
15 0, 0, 0, 0, 122, 120, 99, 118, 98, 110, //40-49
16 109, 44, 46, 47, 0, 0, 0, 32, 0, 0, //50-59
17 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
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,
39 _go32_dpmi_seginfo old_keyb_handler_seginfo, new_keyb_handler_seginfo;
54 if ((key & 0x80) == 0) {
56 for (c1 = 48; c1 > 0; c1--)
57 last_keys[c1] = last_keys[c1 - 1];
58 last_keys[0] = scancode2ascii[key & 0x7f];
62 if ((key & 0x80) == 0) {
63 keyb[(key & 0x7f) + 0x80] = 1;
64 for (c1 = 48; c1 > 0; c1--)
65 last_keys[c1] = last_keys[c1 - 1];
66 last_keys[0] = scancode2ascii[(key & 0x7f) + 0x80];
68 keyb[(key & 0x7f) + 0x80] = 0;
78 void keyb_handler_end()
83 char hook_keyb_handler(void)
86 if (keyb_handler_info.enabled == 0) {
87 _go32_dpmi_lock_data((char *) &keyb, sizeof(keyb));
88 _go32_dpmi_lock_code(keyb_handler, (unsigned long) keyb_handler_end - (unsigned long) keyb_handler);
89 _go32_dpmi_get_protected_mode_interrupt_vector(9, &old_keyb_handler_seginfo);
90 new_keyb_handler_seginfo.pm_offset = (int) keyb_handler;
91 if (_go32_dpmi_allocate_iret_wrapper(&new_keyb_handler_seginfo) != 0)
93 if (_go32_dpmi_set_protected_mode_interrupt_vector(9, &new_keyb_handler_seginfo) != 0) {
94 _go32_dpmi_free_iret_wrapper(&new_keyb_handler_seginfo);
97 keyb_handler_info.enabled = 1;
98 memset(last_keys, 0, sizeof(last_keys));
106 void remove_keyb_handler(void)
109 if (keyb_handler_info.enabled == 1) {
110 _go32_dpmi_set_protected_mode_interrupt_vector(9, &old_keyb_handler_seginfo);
111 _go32_dpmi_free_iret_wrapper(&new_keyb_handler_seginfo);
112 keyb_handler_info.enabled = 0;
118 char key_pressed(unsigned char key)