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,
38 _go32_dpmi_seginfo old_keyb_handler_seginfo, new_keyb_handler_seginfo;
52 if ( (key & 0x80) == 0) {
54 for (c1 = 48; c1 > 0; c1--)
55 last_keys[c1] = last_keys[c1 - 1];
56 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];
69 keyb[(key & 0x7f) + 0x80] = 0;
79 void keyb_handler_end() {}
82 char hook_keyb_handler(void) {
84 if (keyb_handler_info.enabled == 0) {
85 _go32_dpmi_lock_data( (char *)&keyb, sizeof(keyb) );
86 _go32_dpmi_lock_code(keyb_handler, (unsigned long)keyb_handler_end - (unsigned long)keyb_handler);
87 _go32_dpmi_get_protected_mode_interrupt_vector(9, &old_keyb_handler_seginfo);
88 new_keyb_handler_seginfo.pm_offset = (int)keyb_handler;
89 if (_go32_dpmi_allocate_iret_wrapper(&new_keyb_handler_seginfo) != 0)
91 if (_go32_dpmi_set_protected_mode_interrupt_vector(9, &new_keyb_handler_seginfo) != 0) {
92 _go32_dpmi_free_iret_wrapper(&new_keyb_handler_seginfo);
95 keyb_handler_info.enabled = 1;
96 memset(last_keys, 0, sizeof(last_keys) );
104 void remove_keyb_handler(void) {
106 if (keyb_handler_info.enabled == 1) {
107 _go32_dpmi_set_protected_mode_interrupt_vector(9, &old_keyb_handler_seginfo);
108 _go32_dpmi_free_iret_wrapper(&new_keyb_handler_seginfo);
109 keyb_handler_info.enabled = 0;
115 char key_pressed(unsigned char key) {