1
2 /*
3 * O2EM Free Odyssey2 / Videopac+ Emulator
4 *
5 * Created by Daniel Boris <dboris@comcast.net> (c) 1997,1998
6 *
7 * Developed by Andre de la Rocha <adlroc@users.sourceforge.net>
8 *
9 * http://o2em.sourceforge.net
10 *
11 *
12 *
13 * Keyboard emulation
14 */
15
16
17 #include <stdio.h>
18 #include <stdlib.h>
19 #include <string.h>
20 #include "types.h"
21 #include "cpu.h"
22 #include "vmachine.h"
23 #include "vdc.h"
24 #include "audio.h"
25 #include "voice.h"
26 #include "vpp.h"
27 #include "keyboard.h"
28 #include "allegro.h"
29
30
31 int NeedsPoll = 0;
32
33 Byte keycode;
34 Byte last_key;
35 Byte new_int=0; /* Is new interrupt installed */
36
37 Byte key_done=0;
38 Byte key_debug=0;
39
40 struct keyb keybtab[] = {
41 {KEY_A,"A"},
42 {KEY_B,"B"},
43 {KEY_C,"C"},
44 {KEY_D,"D"},
45 {KEY_E,"E"},
46 {KEY_F,"F"},
47 {KEY_G,"G"},
48 {KEY_H,"H"},
49 {KEY_I,"I"},
50 {KEY_J,"J"},
51 {KEY_K,"K"},
52 {KEY_L,"L"},
53 {KEY_M,"M"},
54 {KEY_N,"N"},
55 {KEY_O,"O"},
56 {KEY_P,"P"},
57 {KEY_Q,"Q"},
58 {KEY_R,"R"},
59 {KEY_S,"S"},
60 {KEY_T,"T"},
61 {KEY_U,"U"},
62 {KEY_V,"V"},
63 {KEY_W,"W"},
64 {KEY_X,"X"},
65 {KEY_Y,"Y"},
66 {KEY_Z,"Z"},
67 {KEY_0,"0"},
68 {KEY_1,"1"},
69 {KEY_2,"2"},
70 {KEY_3,"3"},
71 {KEY_4,"4"},
72 {KEY_5,"5"},
73 {KEY_6,"6"},
74 {KEY_7,"7"},
75 {KEY_8,"8"},
76 {KEY_9,"9"},
77 {KEY_0_PAD,"0_PAD"},
78 {KEY_1_PAD,"1_PAD"},
79 {KEY_2_PAD,"2_PAD"},
80 {KEY_3_PAD,"3_PAD"},
81 {KEY_4_PAD,"4_PAD"},
82 {KEY_5_PAD,"5_PAD"},
83 {KEY_6_PAD,"6_PAD"},
84 {KEY_7_PAD,"7_PAD"},
85 {KEY_8_PAD,"8_PAD"},
86 {KEY_9_PAD,"9_PAD"},
87 {KEY_TILDE,"TILDE"},
88 {KEY_MINUS,"MINUS"},
89 {KEY_EQUALS,"EQUALS"},
90 {KEY_BACKSPACE,"BACKSPACE"},
91 {KEY_TAB,"TAB"},
92 {KEY_OPENBRACE,"OPENBRACE"},
93 {KEY_CLOSEBRACE,"CLOSEBRACE"},
94 {KEY_ENTER,"ENTER"},
95 {KEY_COLON,"COLON"},
96 {KEY_QUOTE,"QUOTE"},
97 {KEY_BACKSLASH,"BACKSLASH"},
98 {KEY_BACKSLASH2,"BACKSLASH2"},
99 {KEY_COMMA,"COMMA"},
100 {KEY_STOP,"STOP"},
101 {KEY_SLASH,"SLASH"},
102 {KEY_SPACE,"SPACE"},
103 {KEY_INSERT,"INSERT"},
104 {KEY_DEL,"DEL"},
105 {KEY_HOME,"HOME"},
106 {KEY_END,"END"},
107 {KEY_PGUP,"PGUP"},
108 {KEY_PGDN,"PGDN"},
109 {KEY_LEFT,"LEFT"},
110 {KEY_RIGHT,"RIGHT"},
111 {KEY_UP,"UP"},
112 {KEY_DOWN,"DOWN"},
113 {KEY_SLASH_PAD,"SLASH_PAD"},
114 {KEY_ASTERISK,"ASTERISK"},
115 {KEY_MINUS_PAD,"MINUS_PAD"},
116 {KEY_PLUS_PAD,"PLUS_PAD"},
117 {KEY_DEL_PAD,"DEL_PAD"},
118 {KEY_ENTER_PAD,"ENTER_PAD"},
119 {KEY_PRTSCR,"PRTSCR"},
120 {KEY_PAUSE,"PAUSE"},
121 {KEY_ABNT_C1,"ABNT_C1"},
122 {KEY_YEN,"YEN"},
123 {KEY_KANA,"KANA"},
124 {KEY_AT,"AT"},
125 {KEY_CIRCUMFLEX,"CIRCUMFLEX"},
126 {KEY_COLON2,"COLON2"},
127 {KEY_KANJI,"KANJI"},
128 {KEY_LSHIFT,"LSHIFT"},
129 {KEY_RSHIFT,"RSHIFT"},
130 {KEY_LCONTROL,"LCONTROL"},
131 {KEY_RCONTROL,"RCONTROL"},
132 {KEY_ALT,"ALT"},
133 {KEY_ALTGR,"ALTGR"},
134 {KEY_LWIN,"LWIN"},
135 {KEY_RWIN,"RWIN"},
136 {KEY_MENU,"MENU"},
137 {KEY_SCRLOCK,"SCRLOCK"},
138 {KEY_NUMLOCK,"NUMLOCK"},
139 {0,""}
140 };
141
142
143 int joykeys[2][5] = {{0,0,0,0,0},{0,0,0,0,0}};
144 int joykeystab[128];
145
146
set_defjoykeys(int jn,int sc)147 void set_defjoykeys(int jn, int sc){
148 if (sc)
149 set_joykeys(jn,KEY_W,KEY_S,KEY_A,KEY_D,KEY_SPACE);
150 else
151 set_joykeys(jn,KEY_UP,KEY_DOWN,KEY_LEFT,KEY_RIGHT,KEY_RSHIFT);
152 }
153
154
set_joykeys(int jn,int up,int down,int left,int right,int fire)155 void set_joykeys(int jn, int up, int down, int left, int right, int fire){
156 int i,j;
157 if ((jn<0) || (jn>1)) return;
158 joykeys[jn][0] = up;
159 joykeys[jn][1] = down;
160 joykeys[jn][2] = left;
161 joykeys[jn][3] = right;
162 joykeys[jn][4] = fire;
163
164 for (i=0; i<128; i++) joykeystab[i]=0;
165
166 for (j=0; j<2; j++)
167 for (i=0; i<5; i++) {
168 if ((joykeys[j][i]<1) || (joykeys[j][i]>127))
169 joykeys[j][i] = 0;
170 else
171 joykeystab[joykeys[j][i]] = 1;
172 }
173 }
174
175
handle_key(void)176 void handle_key(void){
177 if (NeedsPoll) poll_keyboard();
178 if (key[KEY_ESC] || key[KEY_F12]) {
179 do {
180 rest(5);
181 if (NeedsPoll) poll_keyboard();
182 } while (key[KEY_ESC] || key[KEY_F12]);
183 key_done=1;
184 }
185 if (key[KEY_F5]) {
186 init_cpu();
187 init_roms();
188 init_vpp();
189 clearscr();
190 do {
191 rest(5);
192 if (NeedsPoll) poll_keyboard();
193 } while (key[KEY_F5]);
194 }
195
196 if (key[KEY_F4]) key_debug=1;
197
198 if (key[KEY_F1]) {
199 do {
200 rest(5);
201 if (NeedsPoll) poll_keyboard();
202 } while (key[KEY_F1]);
203
204 mute_audio();
205 mute_voice();
206 display_info();
207
208 do {
209 rest(5);
210 if (NeedsPoll) poll_keyboard();
211
212 if (key[KEY_ALT] && key[KEY_ENTER]) {
213 app_data.fullscreen = app_data.fullscreen ? 0 : 1;
214 grmode();
215 display_info();
216 do {
217 rest(5);
218 if (NeedsPoll) poll_keyboard();
219 } while (key[KEY_ENTER]);
220 }
221
222 } while ((!key[KEY_F1]) && (!key[KEY_ESC]) && (!key[KEY_F12]));
223 do {
224 rest(5);
225 if (NeedsPoll) poll_keyboard();
226 } while (key[KEY_F1]);
227
228 init_sound_stream();
229 }
230
231 if (key[KEY_F8]) {
232 BITMAP *bmp;
233 PALETTE pal;
234 char *p;
235 static char name[1024];
236 static int scshot_counter = 0;
237
238 if (strlen(app_data.scshot)>0){
239 if ((p=strchr(app_data.scshot,'@'))) {
240 *p = 0;
241 sprintf(name, "%s%02d%s", app_data.scshot, scshot_counter++, p+1);
242 *p = '@';
243 } else {
244 strcpy(name, app_data.scshot);
245 }
246 get_palette(pal);
247 bmp = create_sub_bitmap(screen, 0, 0, SCREEN_W, SCREEN_H);
248 save_bitmap(name, bmp, pal);
249 destroy_bitmap(bmp);
250 do {
251 rest(5);
252 if (NeedsPoll) poll_keyboard();
253 } while (key[KEY_F8]);
254 }
255 }
256
257
258 if (key[KEY_ALT] && key[KEY_ENTER]) {
259 app_data.fullscreen = app_data.fullscreen ? 0 : 1;
260 grmode();
261 do {
262 rest(5);
263 if (NeedsPoll) poll_keyboard();
264 } while (key[KEY_ENTER]);
265 }
266
267 }
268
269
keyjoy(int jn)270 Byte keyjoy(int jn){
271 Byte d;
272 d=0xFF;
273 if ((jn>=0) && (jn<=1)){
274 if (NeedsPoll) poll_keyboard();
275 if (key[joykeys[jn][0]]) d &= 0xFE;
276 if (key[joykeys[jn][1]]) d &= 0xFB;
277 if (key[joykeys[jn][2]]) d &= 0xF7;
278 if (key[joykeys[jn][3]]) d &= 0xFD;
279 if (key[joykeys[jn][4]]) d &= 0xEF;
280 }
281 return d;
282 }
283
284
init_keyboard(void)285 void init_keyboard(void){
286 key_done=0;
287 key_debug=0;
288 install_keyboard();
289 new_int=1;
290 NeedsPoll = keyboard_needs_poll();
291 }
292
293
Set_Old_Int9(void)294 void Set_Old_Int9(void){
295 remove_keyboard();
296 new_int=0;
297 }
298
299