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