]> icculus.org git repositories - crow/jumpnbump.git/blob - dos/interrpt.c
Initial revision
[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 _go32_dpmi_seginfo old_keyb_handler_seginfo, new_keyb_handler_seginfo;
39
40
41 void keyb_handler() {
42         unsigned char key;
43         static char extended;
44         int c1;
45
46         key = inportb(0x60);
47
48         if (key == 0xe0)
49                 extended = 1;
50         else {
51                 if (extended == 0) {
52                         if ( (key & 0x80) == 0) {
53                                 keyb[key & 0x7f] = 1;
54                                 for (c1 = 48; c1 > 0; c1--)
55                                         last_keys[c1] = last_keys[c1 - 1];
56                                 last_keys[0] = scancode2ascii[key & 0x7f];
57                         }
58                         else
59                                 keyb[key & 0x7f] = 0;
60                 }
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                         }
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 char hook_keyb_handler(void) {
83
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)
90                 return 1;
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);
93                 return 1;
94                 }
95     keyb_handler_info.enabled = 1;
96                 memset(last_keys, 0, sizeof(last_keys) );
97   }
98
99   return 0;
100
101 }
102
103
104 void remove_keyb_handler(void) {
105
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;
110   }
111
112 }
113
114
115 char key_pressed(unsigned char key) {
116
117         return keyb[key];
118
119 }
120