14 volatile char keyb[256];
17 unsigned char scancode2ascii[256] = {
18 0, 0, 49, 50, 51, 52, 53, 54, 55, 56, /* 0-9 */
19 57, 48, 45, 0, 0, 0, 113, 119, 101, 114, /* 10-19 */
20 116, 121, 117, 105, 111, 112, 0, 0, 0, 0, /* 20-29 */
21 97, 115, 100, 102, 103, 104, 106, 107, 108, 0, /* 30-39 */
22 0, 0, 0, 0, 122, 120, 99, 118, 98, 110, /* 40-49 */
23 109, 44, 46, 47, 0, 0, 0, 32, 0, 0, /* 50-59 */
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,
37 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
38 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
39 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
40 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
41 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
42 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
47 _go32_dpmi_seginfo old_keyb_handler_seginfo, new_keyb_handler_seginfo;
65 if ((key & 0x80) == 0) {
67 for (c1 = 48; c1 > 0; c1--)
68 last_keys[c1] = last_keys[c1 - 1];
69 last_keys[0] = scancode2ascii[key & 0x7f];
73 if ((key & 0x80) == 0) {
74 keyb[(key & 0x7f) + 0x80] = 1;
75 for (c1 = 48; c1 > 0; c1--)
76 last_keys[c1] = last_keys[c1 - 1];
77 last_keys[0] = scancode2ascii[(key & 0x7f) + 0x80];
79 keyb[(key & 0x7f) + 0x80] = 0;
90 void keyb_handler_end()
95 int hook_keyb_handler(void)
98 if (keyb_handler_info.enabled == 0) {
99 _go32_dpmi_lock_data((char *) &keyb, sizeof(keyb));
100 _go32_dpmi_lock_code(keyb_handler, (unsigned long) keyb_handler_end - (unsigned long) keyb_handler);
101 _go32_dpmi_get_protected_mode_interrupt_vector(9, &old_keyb_handler_seginfo);
102 new_keyb_handler_seginfo.pm_offset = (int) keyb_handler;
103 if (_go32_dpmi_allocate_iret_wrapper(&new_keyb_handler_seginfo) != 0)
105 if (_go32_dpmi_set_protected_mode_interrupt_vector(9, &new_keyb_handler_seginfo) != 0) {
106 _go32_dpmi_free_iret_wrapper(&new_keyb_handler_seginfo);
109 keyb_handler_info.enabled = 1;
110 memset(last_keys, 0, sizeof(last_keys));
113 SDL_EnableUNICODE(1);
114 memset((void *) last_keys, 0, sizeof(last_keys));
120 void remove_keyb_handler(void)
123 if (keyb_handler_info.enabled == 1) {
124 _go32_dpmi_set_protected_mode_interrupt_vector(9, &old_keyb_handler_seginfo);
125 _go32_dpmi_free_iret_wrapper(&new_keyb_handler_seginfo);
126 keyb_handler_info.enabled = 0;
132 int key_pressed(int key)
134 return keyb[(unsigned char) key];
137 int addkey(unsigned int key)
141 if (!(key & 0x8000)) {
142 keyb[key & 0x7fff] = 1;
143 for (c1 = 48; c1 > 0; c1--)
144 last_keys[c1] = last_keys[c1 - 1];
145 last_keys[0] = key & 0x7fff;
147 keyb[key & 0x7fff] = 0;
155 static Uint32 now, then = 0;
157 while (SDL_PollEvent(&e)) {
159 case SDL_MOUSEBUTTONDOWN:
163 switch (e.key.keysym.sym) {
165 if (e.type == SDL_KEYDOWN) {
171 if (e.type == SDL_KEYDOWN) {
176 if (e.type == SDL_KEYUP)
182 e.key.keysym.sym &= 0x7f;
183 if (e.type == SDL_KEYUP)
184 e.key.keysym.sym |= 0x8000;
185 addkey(e.key.keysym.sym);
196 now = SDL_GetTicks();
200 then = (1000 / 60) - (now - then);
201 if (then > 0 && then < 1000)