4c5f2c881085658c2de23bcf99174e274b75af1d
[crow/jumpnbump.git] / dos / interrpt.c
1 #include "globals.h"
2
3
4 struct {
5         char enabled;
6 } keyb_handler_info;
7
8 volatile char keyb[256];
9 volatile char last_keys[50];
10
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,
37         0, 0, 0, 0, 0, 0
38 };
39
40 _go32_dpmi_seginfo old_keyb_handler_seginfo, new_keyb_handler_seginfo;
41
42
43 void keyb_handler()
44 {
45         unsigned char key;
46         static char extended;
47         int c1;
48
49         key = inportb(0x60);
50
51         if (key == 0xe0)
52                 extended = 1;
53         else {
54                 if (extended == 0) {
55                         if ((key & 0x80) == 0) {
56                                 keyb[key & 0x7f] = 1;
57                                 for (c1 = 48; c1 > 0; c1--)
58                                         last_keys[c1] = last_keys[c1 - 1];
59                                 last_keys[0] = scancode2ascii[key & 0x7f];
60                         } else
61                                 keyb[key & 0x7f] = 0;
62                 } else {
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];
68                         } else
69                                 keyb[(key & 0x7f) + 0x80] = 0;
70                 }
71                 if (extended == 1)
72                         extended = 0;
73         }
74
75         outportb(0x20, 0x20);
76
77 }
78
79 void keyb_handler_end()
80 {
81 }
82
83
84 char hook_keyb_handler(void)
85 {
86
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)
93                         return 1;
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);
96                         return 1;
97                 }
98                 keyb_handler_info.enabled = 1;
99                 memset(last_keys, 0, sizeof(last_keys));
100         }
101
102         return 0;
103
104 }
105
106
107 void remove_keyb_handler(void)
108 {
109
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;
114         }
115
116 }
117
118
119 char key_pressed(unsigned char key)
120 {
121
122         return keyb[key];
123
124 }