]> icculus.org git repositories - crow/jumpnbump.git/blob - dos/interrpt.c
3bdf2e4cdbcc3988e1564eba72220b1199151bf2
[crow/jumpnbump.git] / dos / interrpt.c
1 /*
2  * interrpt.h
3  * Copyright (C) 1998 Brainchild Design - http://brainchilddesign.com/
4  * 
5  * Copyright (C) 2001 tarzeau@space.ch
6  *
7  * Copyright (C) 2002 Florian Schulze - crow@icculus.org
8  *
9  * Portions of this code are from the MPEG software simulation group
10  * idct implementation. This code will be replaced with a new
11  * implementation soon.
12  *
13  * This file is part of Jump'n'Bump.
14  *
15  * Jump'n'Bump is free software; you can redistribute it and/or modify
16  * it under the terms of the GNU General Public License as published by
17  * the Free Software Foundation; either version 2 of the License, or
18  * (at your option) any later version.
19  *
20  * Jump'n'Bump is distributed in the hope that it will be useful,
21  * but WITHOUT ANY WARRANTY; without even the implied warranty of
22  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
23  * GNU General Public License for more details.
24  *
25  * You should have received a copy of the GNU General Public License
26  * along with this program; if not, write to the Free Software
27  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
28  */
29
30 #include "globals.h"
31
32
33 struct {
34         char enabled;
35 } keyb_handler_info;
36
37 volatile char keyb[256];
38 volatile char last_keys[50];
39
40 unsigned char scancode2ascii[256] = {
41         0, 0, 49, 50, 51, 52, 53, 54, 55, 56,           /* 0-9 */
42         57, 48, 45, 0, 0, 0, 113, 119, 101, 114,        /* 10-19 */
43         116, 121, 117, 105, 111, 112, 0, 0, 0, 0,       /* 20-29 */
44         97, 115, 100, 102, 103, 104, 106, 107, 108, 0,  /* 30-39 */
45         0, 0, 0, 0, 122, 120, 99, 118, 98, 110,         /* 40-49 */
46         109, 44, 46, 47, 0, 0, 0, 32, 0, 0,             /* 50-59 */
47         0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
48         0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
49         0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
50         0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
51         0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
52         0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
53         0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
54         0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
55         0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
56         0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
57         0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
58         0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
59         0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
60         0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
61         0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
62         0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
63         0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
64         0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
65         0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
66         0, 0, 0, 0, 0, 0
67 };
68
69 _go32_dpmi_seginfo old_keyb_handler_seginfo, new_keyb_handler_seginfo;
70
71
72 void keyb_handler()
73 {
74         unsigned char key;
75         static char extended;
76         int c1;
77
78         key = inportb(0x60);
79
80         if (key == 0xe0)
81                 extended = 1;
82         else {
83                 if (extended == 0) {
84                         if ((key & 0x80) == 0) {
85                                 keyb[key & 0x7f] = 1;
86                                 for (c1 = 48; c1 > 0; c1--)
87                                         last_keys[c1] = last_keys[c1 - 1];
88                                 last_keys[0] = scancode2ascii[key & 0x7f];
89                         } else
90                                 keyb[key & 0x7f] = 0;
91                 } else {
92                         if ((key & 0x80) == 0) {
93                                 keyb[(key & 0x7f) + 0x80] = 1;
94                                 for (c1 = 48; c1 > 0; c1--)
95                                         last_keys[c1] = last_keys[c1 - 1];
96                                 last_keys[0] = scancode2ascii[(key & 0x7f) + 0x80];
97                         } else
98                                 keyb[(key & 0x7f) + 0x80] = 0;
99                 }
100                 if (extended == 1)
101                         extended = 0;
102         }
103
104         outportb(0x20, 0x20);
105
106 }
107
108 void keyb_handler_end()
109 {
110 }
111
112
113 char hook_keyb_handler(void)
114 {
115
116         if (keyb_handler_info.enabled == 0) {
117                 _go32_dpmi_lock_data((char *) &keyb, sizeof(keyb));
118                 _go32_dpmi_lock_code(keyb_handler, (unsigned long) keyb_handler_end - (unsigned long) keyb_handler);
119                 _go32_dpmi_get_protected_mode_interrupt_vector(9, &old_keyb_handler_seginfo);
120                 new_keyb_handler_seginfo.pm_offset = (int) keyb_handler;
121                 if (_go32_dpmi_allocate_iret_wrapper(&new_keyb_handler_seginfo) != 0)
122                         return 1;
123                 if (_go32_dpmi_set_protected_mode_interrupt_vector(9, &new_keyb_handler_seginfo) != 0) {
124                         _go32_dpmi_free_iret_wrapper(&new_keyb_handler_seginfo);
125                         return 1;
126                 }
127                 keyb_handler_info.enabled = 1;
128                 memset(last_keys, 0, sizeof(last_keys));
129         }
130
131         return 0;
132
133 }
134
135
136 void remove_keyb_handler(void)
137 {
138
139         if (keyb_handler_info.enabled == 1) {
140                 _go32_dpmi_set_protected_mode_interrupt_vector(9, &old_keyb_handler_seginfo);
141                 _go32_dpmi_free_iret_wrapper(&new_keyb_handler_seginfo);
142                 keyb_handler_info.enabled = 0;
143         }
144
145 }
146
147
148 char key_pressed(unsigned char key)
149 {
150
151         return keyb[key];
152
153 }