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