1 /*
2  * javanvm/input.c - NestedVM-specific port code - input device support
3  *
4  * Copyright (c) 2001-2002 Jacek Poplawski (original atari_sdl.c)
5  * Copyright (c) 2007-2008 Perry McFarlane (javanvm port)
6  * Copyright (C) 2001-2008 Atari800 development team (see DOC/CREDITS)
7  *
8  * This file is part of the Atari800 emulator project which emulates
9  * the Atari 400, 800, 800XL, 130XE, and 5200 8-bit computers.
10 
11  * Atari800 is free software; you can redistribute it and/or modify
12  * it under the terms of the GNU General Public License as published by
13  * the Free Software Foundation; either version 2 of the License, or
14  * (at your option) any later version.
15 
16  * Atari800 is distributed in the hope that it will be useful,
17  * but WITHOUT ANY WARRANTY; without even the implied warranty of
18  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
19  * GNU General Public License for more details.
20 
21  * You should have received a copy of the GNU General Public License along
22  * with Atari800; if not, write to the Free Software Foundation, Inc.,
23  * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
24  */
25 
26 #include "javanvm/input.h"
27 
28 #include "akey.h"
29 #include "atari.h"
30 #include "../input.h"
31 #include "platform.h"
32 #include "ui.h"
33 #include "javanvm/javanvm.h"
34 
35 /* joystick emulation */
36 
37 /* a runtime switch for the kbd_joy_X_enabled vars is in the UI */
38 int kbd_joy_0_enabled = TRUE;	/* enabled by default, doesn't hurt */
39 int kbd_joy_1_enabled = FALSE;	/* disabled, would steal normal keys */
40 
41 static int KBD_TRIG_0 = VK_CONTROL;
42 static int KBD_TRIG_0_LOC = KEY_LOCATION_LEFT;
43 static int KBD_STICK_0_LEFT = VK_NUMPAD4;
44 static int KBD_STICK_0_LEFT_LOC = KEY_LOCATION_NUMPAD;
45 static int KBD_STICK_0_RIGHT = VK_NUMPAD6;
46 static int KBD_STICK_0_RIGHT_LOC = KEY_LOCATION_NUMPAD;
47 static int KBD_STICK_0_DOWN = VK_NUMPAD2;
48 static int KBD_STICK_0_DOWN_LOC = KEY_LOCATION_NUMPAD;
49 static int KBD_STICK_0_UP = VK_NUMPAD8;
50 static int KBD_STICK_0_UP_LOC = KEY_LOCATION_NUMPAD;
51 static int KBD_STICK_0_LEFTUP = VK_NUMPAD7;
52 static int KBD_STICK_0_LEFTUP_LOC = KEY_LOCATION_NUMPAD;
53 static int KBD_STICK_0_RIGHTUP = VK_NUMPAD9;
54 static int KBD_STICK_0_RIGHTUP_LOC = KEY_LOCATION_NUMPAD;
55 static int KBD_STICK_0_LEFTDOWN = VK_NUMPAD1;
56 static int KBD_STICK_0_LEFTDOWN_LOC = KEY_LOCATION_NUMPAD;
57 static int KBD_STICK_0_RIGHTDOWN = VK_NUMPAD3;
58 static int KBD_STICK_0_RIGHTDOWN_LOC = KEY_LOCATION_NUMPAD;
59 
60 static int KBD_TRIG_1 = VK_TAB;
61 static int KBD_TRIG_1_LOC = KEY_LOCATION_STANDARD;
62 static int KBD_STICK_1_LEFT = VK_A;
63 static int KBD_STICK_1_LEFT_LOC = KEY_LOCATION_STANDARD;
64 static int KBD_STICK_1_RIGHT = VK_D;
65 static int KBD_STICK_1_RIGHT_LOC = KEY_LOCATION_STANDARD;
66 static int KBD_STICK_1_DOWN = VK_X;
67 static int KBD_STICK_1_DOWN_LOC = KEY_LOCATION_STANDARD;
68 static int KBD_STICK_1_UP = VK_W;
69 static int KBD_STICK_1_UP_LOC = KEY_LOCATION_STANDARD;
70 static int KBD_STICK_1_LEFTUP = VK_Q;
71 static int KBD_STICK_1_LEFTUP_LOC = KEY_LOCATION_STANDARD;
72 static int KBD_STICK_1_RIGHTUP = VK_E;
73 static int KBD_STICK_1_RIGHTUP_LOC = KEY_LOCATION_STANDARD;
74 static int KBD_STICK_1_LEFTDOWN = VK_Z;
75 static int KBD_STICK_1_LEFTDOWN_LOC = KEY_LOCATION_STANDARD;
76 static int KBD_STICK_1_RIGHTDOWN = VK_C;
77 static int KBD_STICK_1_RIGHTDOWN_LOC = KEY_LOCATION_STANDARD;
78 static int swap_joysticks = 0;
79 
80 /* These functions call the NestedVM runtime */
JAVANVM_Kbhits(int key,int loc)81 static int JAVANVM_Kbhits(int key, int loc)
82 {
83 	return _call_java(JAVANVM_FUN_Kbhits, key, loc, 0);
84 }
85 
JAVANVM_PollKeyEvent(void * event)86 static int JAVANVM_PollKeyEvent(void *event)
87 {
88 	return _call_java(JAVANVM_FUN_PollKeyEvent, (int)event, 0, 0);
89 }
90 
JAVANVM_GetWindowClosed(void)91 static int JAVANVM_GetWindowClosed(void)
92 {
93 	return _call_java(JAVANVM_FUN_GetWindowClosed, 0, 0, 0);
94 }
95 
PLATFORM_Keyboard(void)96 int PLATFORM_Keyboard(void)
97 {
98 	static int lastkey = 0, key_pressed = 0, key_control = 0;
99  	static int lastuni = 0;
100 	static int lastloc = KEY_LOCATION_UNKNOWN;
101 	int shiftctrl = 0;
102     int event[JAVANVM_KeyEventSIZE];
103 
104 	/* Exit if the user closed the window */
105 	if (JAVANVM_GetWindowClosed()) {
106 		return AKEY_EXIT;
107 	}
108 
109 	if (JAVANVM_PollKeyEvent(event)) {
110 		switch (event[JAVANVM_KeyEventType]) {
111 		case KEY_PRESSED:
112 			lastkey = event[JAVANVM_KeyEventKeyCode];
113 			lastuni = event[JAVANVM_KeyEventKeyChar];
114 			lastloc = event[JAVANVM_KeyEventKeyLocation];
115 			key_pressed = 1;
116 			break;
117 		case KEY_RELEASED:
118 			lastkey = event[JAVANVM_KeyEventKeyCode];
119  			lastuni = 0;
120 			key_pressed = 0;
121 			break;
122 		}
123 
124 	}
125 	else if (!key_pressed)
126 		return AKEY_NONE;
127 
128 	UI_alt_function = -1;
129 	if (JAVANVM_Kbhits(VK_ALT,KEY_LOCATION_LEFT)) {
130 		if (key_pressed) {
131 			switch (lastkey) {
132 			case VK_F:
133 				key_pressed = 0;
134 				/*SwitchFullscreen();*/
135 				break;
136 			case VK_G:
137 				key_pressed = 0;
138 				/*SwitchWidth();*/
139 				break;
140 			case VK_B:
141 				key_pressed = 0;
142 				/*SwitchBW();*/
143 				break;
144 			case VK_J:
145 				key_pressed = 0;
146 				/*SwapJoysticks();*/
147 				break;
148 			case VK_R:
149 				UI_alt_function = UI_MENU_RUN;
150 				break;
151 			case VK_Y:
152 				UI_alt_function = UI_MENU_SYSTEM;
153 				break;
154 			case VK_O:
155 				UI_alt_function = UI_MENU_SOUND;
156 				break;
157 			case VK_W:
158 				UI_alt_function = UI_MENU_SOUND_RECORDING;
159 				break;
160 			case VK_A:
161 				UI_alt_function = UI_MENU_ABOUT;
162 				break;
163 			case VK_S:
164 				UI_alt_function = UI_MENU_SAVESTATE;
165 				break;
166 			case VK_D:
167 				UI_alt_function = UI_MENU_DISK;
168 				break;
169 			case VK_L:
170 				UI_alt_function = UI_MENU_LOADSTATE;
171 				break;
172 			case VK_C:
173 				UI_alt_function = UI_MENU_CARTRIDGE;
174 				break;
175 			case VK_T:
176 				UI_alt_function = UI_MENU_CASSETTE;
177 				break;
178 			case VK_BACK_SLASH:
179 				return AKEY_PBI_BB_MENU;
180 				break;
181 			break;
182 			}
183 		}
184 		if (UI_alt_function != -1) {
185 			key_pressed = 0;
186 			return AKEY_UI;
187 		}
188 	}
189 	/* SHIFT STATE */
190 	if ((JAVANVM_Kbhits(VK_SHIFT,KEY_LOCATION_LEFT)) || (JAVANVM_Kbhits(VK_SHIFT,KEY_LOCATION_RIGHT)))
191 		INPUT_key_shift = 1;
192 	else
193 		INPUT_key_shift = 0;
194 
195     /* CONTROL STATE */
196 	if ((JAVANVM_Kbhits(VK_CONTROL,KEY_LOCATION_LEFT)) || (JAVANVM_Kbhits(VK_CONTROL,KEY_LOCATION_RIGHT)))
197 		key_control = 1;
198 	else
199 		key_control = 0;
200 
201 	/* OPTION / SELECT / START keys */
202 	INPUT_key_consol = INPUT_CONSOL_NONE;
203 	if (JAVANVM_Kbhits(VK_F2,KEY_LOCATION_STANDARD))
204 		INPUT_key_consol &= (~INPUT_CONSOL_OPTION);
205 	if (JAVANVM_Kbhits(VK_F3,KEY_LOCATION_STANDARD))
206 		INPUT_key_consol &= (~INPUT_CONSOL_SELECT);
207 	if (JAVANVM_Kbhits(VK_F4,KEY_LOCATION_STANDARD))
208 		INPUT_key_consol &= (~INPUT_CONSOL_START);
209 
210 	if (key_pressed == 0)
211 		return AKEY_NONE;
212 
213 	/* Handle movement and special keys. */
214 	switch (lastkey) {
215 	case VK_F1:
216 		key_pressed = 0;
217 		return AKEY_UI;
218 	case VK_F5:
219 		key_pressed = 0;
220 		return INPUT_key_shift ? AKEY_COLDSTART : AKEY_WARMSTART;
221 	case VK_F8:
222 		key_pressed = 0;
223 		return (PLATFORM_Exit(1) ? AKEY_NONE : AKEY_EXIT);
224 	case VK_F9:
225 		return AKEY_EXIT;
226 	case VK_F10:
227 		key_pressed = 0;
228 		return INPUT_key_shift ? AKEY_SCREENSHOT_INTERLACE : AKEY_SCREENSHOT_INTERLACE;
229 	case VK_F12:
230 		key_pressed = 0;
231 		return AKEY_TURBO;
232 	}
233 	/* keyboard joysticks: don't pass the keypresses to emulation
234 	 * as some games pause on a keypress (River Raid, Bruce Lee)
235 	 */
236 #define LQE(x) (lastkey == KBD_##x && lastloc == KBD_##x##_LOC)
237 	if (!UI_is_active && kbd_joy_0_enabled) {
238 		if (LQE(STICK_0_LEFT) || LQE(STICK_0_RIGHT) ||
239 			LQE(STICK_0_UP) || LQE(STICK_0_DOWN) ||
240 			LQE(STICK_0_LEFTUP) || LQE(STICK_0_LEFTDOWN) ||
241 			LQE(STICK_0_RIGHTUP) || LQE(STICK_0_RIGHTDOWN) ||
242 			LQE(TRIG_0)) {
243 			key_pressed = 0;
244 			return AKEY_NONE;
245 		}
246 	}
247 
248 	if (!UI_is_active && kbd_joy_1_enabled) {
249 		if (LQE(STICK_1_LEFT) || LQE(STICK_1_RIGHT) ||
250 			LQE(STICK_1_UP) || LQE(STICK_1_DOWN) ||
251 			LQE(STICK_1_LEFTUP) || LQE(STICK_1_LEFTDOWN) ||
252 			LQE(STICK_1_RIGHTUP) || LQE(STICK_1_RIGHTDOWN) ||
253 			LQE(TRIG_1)) {
254 			key_pressed = 0;
255 			return AKEY_NONE;
256 		}
257 	}
258 #undef LQE
259 
260 	if (INPUT_key_shift)
261 		shiftctrl ^= AKEY_SHFT;
262 
263 	if (Atari800_machine_type == Atari800_MACHINE_5200 && !UI_is_active && lastloc == KEY_LOCATION_STANDARD) {
264 		if (lastkey == VK_F4)
265 			return AKEY_5200_START ^ shiftctrl;
266 		switch (lastuni) {
267 		case 'p':
268 			return AKEY_5200_PAUSE ^ shiftctrl;
269 		case 'r':
270 			return AKEY_5200_RESET ^ shiftctrl;
271 		case '0':
272 			return AKEY_5200_0 ^ shiftctrl;
273 		case '1':
274 			return AKEY_5200_1 ^ shiftctrl;
275 		case '2':
276 			return AKEY_5200_2 ^ shiftctrl;
277 		case '3':
278 			return AKEY_5200_3 ^ shiftctrl;
279 		case '4':
280 			return AKEY_5200_4 ^ shiftctrl;
281 		case '5':
282 			return AKEY_5200_5 ^ shiftctrl;
283 		case '6':
284 			return AKEY_5200_6 ^ shiftctrl;
285 		case '7':
286 			return AKEY_5200_7 ^ shiftctrl;
287 		case '8':
288 			return AKEY_5200_8 ^ shiftctrl;
289 		case '9':
290 			return AKEY_5200_9 ^ shiftctrl;
291 		case '#':
292 		case '=':
293 			return AKEY_5200_HASH ^ shiftctrl;
294 		case '*':
295 			return AKEY_5200_ASTERISK ^ shiftctrl;
296 		}
297 		return AKEY_NONE;
298 	}
299 
300 	if (key_control)
301 		shiftctrl ^= AKEY_CTRL;
302 
303 	if (lastloc == KEY_LOCATION_STANDARD) switch (lastkey) {
304 	case VK_BACK_QUOTE:
305 		return AKEY_ATARI ^ shiftctrl;
306 	case VK_END:
307 	case VK_F6:
308 		return AKEY_HELP ^ shiftctrl;
309 	case VK_PAGE_DOWN:
310 		return AKEY_F2 | AKEY_SHFT;
311 	case VK_PAGE_UP:
312 		return AKEY_F1 | AKEY_SHFT;
313 	case VK_HOME:
314 		return (key_control ? AKEY_LESS : AKEY_CLEAR)|shiftctrl;
315 	case VK_PAUSE:
316 	case VK_F7:
317 		return AKEY_BREAK;
318 	case VK_CAPS_LOCK:
319 		if (INPUT_key_shift)
320 			return AKEY_CAPSLOCK|shiftctrl;
321 		else
322 			return AKEY_CAPSTOGGLE|shiftctrl;
323 	case VK_SPACE:
324 		return AKEY_SPACE ^ shiftctrl;
325 	case VK_BACK_SPACE:
326 		return AKEY_BACKSPACE|shiftctrl;
327 	case VK_ENTER:
328 		return AKEY_RETURN ^ shiftctrl;
329 	case VK_LEFT:
330 		return (INPUT_key_shift ? AKEY_PLUS : AKEY_LEFT) ^ shiftctrl;
331 	case VK_RIGHT:
332 		return (INPUT_key_shift ? AKEY_ASTERISK : AKEY_RIGHT) ^ shiftctrl;
333 	case VK_UP:
334 		return (INPUT_key_shift ? AKEY_MINUS : AKEY_UP) ^ shiftctrl;
335 	case VK_DOWN:
336 		return (INPUT_key_shift ? AKEY_EQUAL : AKEY_DOWN) ^ shiftctrl;
337 	case VK_ESCAPE:
338 		return AKEY_ESCAPE ^ shiftctrl;
339 	case VK_TAB:
340 		return AKEY_TAB ^ shiftctrl;
341 	case VK_DELETE:
342 		if (INPUT_key_shift)
343 			return AKEY_DELETE_LINE|shiftctrl;
344 		else
345 			return AKEY_DELETE_CHAR;
346 	case VK_INSERT:
347 		if (INPUT_key_shift)
348 			return AKEY_INSERT_LINE|shiftctrl;
349 		else
350 			return AKEY_INSERT_CHAR;
351 	}
352 	if (INPUT_cx85 && lastloc == KEY_LOCATION_NUMPAD) switch (lastkey) {
353 	case VK_NUMPAD1:
354 		return AKEY_CX85_1;
355 	case VK_NUMPAD2:
356 		return AKEY_CX85_2;
357 	case VK_NUMPAD3:
358 		return AKEY_CX85_3;
359 	case VK_NUMPAD4:
360 		return AKEY_CX85_4;
361 	case VK_NUMPAD5:
362 		return AKEY_CX85_5;
363 	case VK_NUMPAD6:
364 		return AKEY_CX85_6;
365 	case VK_NUMPAD7:
366 		return AKEY_CX85_7;
367 	case VK_NUMPAD8:
368 		return AKEY_CX85_8;
369 	case VK_NUMPAD9:
370 		return AKEY_CX85_9;
371 	case VK_NUMPAD0:
372 		return AKEY_CX85_0;
373 	case VK_DECIMAL:
374 		return AKEY_CX85_PERIOD;
375 	case VK_SUBTRACT:
376 		return AKEY_CX85_MINUS;
377 	case VK_ENTER:
378 		return AKEY_CX85_PLUS_ENTER;
379 	case VK_DIVIDE:
380 		return (key_control ? AKEY_CX85_ESCAPE : AKEY_CX85_NO);
381 	case VK_MULTIPLY:
382 		return AKEY_CX85_DELETE;
383 	case VK_ADD:
384 		return AKEY_CX85_YES;
385 	}
386 
387 	/* Handle CTRL-0 to CTRL-9 and others */
388 	if (key_control && lastloc == KEY_LOCATION_STANDARD) {
389 		switch(lastuni) {
390 		case '.':
391 			return AKEY_FULLSTOP|shiftctrl;
392 		case ',':
393 			return AKEY_COMMA|shiftctrl;
394 		case ';':
395 			return AKEY_SEMICOLON|shiftctrl;
396 		case '/':
397 			return AKEY_SLASH|shiftctrl;
398 		}
399 		switch (lastkey) {
400 		case VK_BACK_SLASH:
401 			/* work-around for Windows */
402 			return AKEY_ESCAPE|shiftctrl;
403 		case VK_PERIOD:
404 			return AKEY_FULLSTOP|shiftctrl;
405 		case VK_COMMA:
406 			return AKEY_COMMA|shiftctrl;
407 		case VK_SEMICOLON:
408 			return AKEY_SEMICOLON|shiftctrl;
409 		case VK_SLASH:
410 			return AKEY_SLASH|shiftctrl;
411 		case VK_0:
412 			return AKEY_CTRL_0|shiftctrl;
413 		case VK_1:
414 			return AKEY_CTRL_1|shiftctrl;
415 		case VK_2:
416 			return AKEY_CTRL_2|shiftctrl;
417 		case VK_3:
418 			return AKEY_CTRL_3|shiftctrl;
419 		case VK_4:
420 			return AKEY_CTRL_4|shiftctrl;
421 		case VK_5:
422 			return AKEY_CTRL_5|shiftctrl;
423 		case VK_6:
424 			return AKEY_CTRL_6|shiftctrl;
425 		case VK_7:
426 			return AKEY_CTRL_7|shiftctrl;
427 		case VK_8:
428 			return AKEY_CTRL_8|shiftctrl;
429 		case VK_9:
430 			return AKEY_CTRL_9|shiftctrl;
431 		}
432 	}
433 
434 	/* Host Caps Lock will make lastuni switch case, so prevent this*/
435     if(lastuni>='A' && lastuni <= 'Z' && !INPUT_key_shift) lastuni += 0x20;
436     if(lastuni>='a' && lastuni <= 'z' && INPUT_key_shift) lastuni -= 0x20;
437 	/* Uses only UNICODE translation, no shift states (this was added to
438 	 * support non-US keyboard layouts)*/
439 	if (lastloc == KEY_LOCATION_STANDARD) {
440 		switch (lastuni) {
441 		case 1:
442 			return AKEY_CTRL_a|shiftctrl;
443 		case 2:
444 			return AKEY_CTRL_b|shiftctrl;
445 		case 3:
446 			return AKEY_CTRL_c|shiftctrl;
447 		case 4:
448 			return AKEY_CTRL_d|shiftctrl;
449 		case 5:
450 			return AKEY_CTRL_e|shiftctrl;
451 		case 6:
452 			return AKEY_CTRL_f|shiftctrl;
453 		case 7:
454 			return AKEY_CTRL_g|shiftctrl;
455 		case 8:
456 			return AKEY_CTRL_h|shiftctrl;
457 		case 9:
458 			return AKEY_CTRL_i|shiftctrl;
459 		case 10:
460 			return AKEY_CTRL_j|shiftctrl;
461 		case 11:
462 			return AKEY_CTRL_k|shiftctrl;
463 		case 12:
464 			return AKEY_CTRL_l|shiftctrl;
465 		case 13:
466 			return AKEY_CTRL_m|shiftctrl;
467 		case 14:
468 			return AKEY_CTRL_n|shiftctrl;
469 		case 15:
470 			return AKEY_CTRL_o|shiftctrl;
471 		case 16:
472 			return AKEY_CTRL_p|shiftctrl;
473 		case 17:
474 			return AKEY_CTRL_q|shiftctrl;
475 		case 18:
476 			return AKEY_CTRL_r|shiftctrl;
477 		case 19:
478 			return AKEY_CTRL_s|shiftctrl;
479 		case 20:
480 			return AKEY_CTRL_t|shiftctrl;
481 		case 21:
482 			return AKEY_CTRL_u|shiftctrl;
483 		case 22:
484 			return AKEY_CTRL_v|shiftctrl;
485 		case 23:
486 			return AKEY_CTRL_w|shiftctrl;
487 		case 24:
488 			return AKEY_CTRL_x|shiftctrl;
489 		case 25:
490 			return AKEY_CTRL_y|shiftctrl;
491 		case 26:
492 			return AKEY_CTRL_z|shiftctrl;
493 		case 'A':
494 			return AKEY_A;
495 		case 'B':
496 			return AKEY_B;
497 		case 'C':
498 			return AKEY_C;
499 		case 'D':
500 			return AKEY_D;
501 		case 'E':
502 			return AKEY_E;
503 		case 'F':
504 			return AKEY_F;
505 		case 'G':
506 			return AKEY_G;
507 		case 'H':
508 			return AKEY_H;
509 		case 'I':
510 			return AKEY_I;
511 		case 'J':
512 			return AKEY_J;
513 		case 'K':
514 			return AKEY_K;
515 		case 'L':
516 			return AKEY_L;
517 		case 'M':
518 			return AKEY_M;
519 		case 'N':
520 			return AKEY_N;
521 		case 'O':
522 			return AKEY_O;
523 		case 'P':
524 			return AKEY_P;
525 		case 'Q':
526 			return AKEY_Q;
527 		case 'R':
528 			return AKEY_R;
529 		case 'S':
530 			return AKEY_S;
531 		case 'T':
532 			return AKEY_T;
533 		case 'U':
534 			return AKEY_U;
535 		case 'V':
536 			return AKEY_V;
537 		case 'W':
538 			return AKEY_W;
539 		case 'X':
540 			return AKEY_X;
541 		case 'Y':
542 			return AKEY_Y;
543 		case 'Z':
544 			return AKEY_Z;
545 		case ':':
546 			return AKEY_COLON;
547 		case '!':
548 			return AKEY_EXCLAMATION;
549 		case '@':
550 			return AKEY_AT;
551 		case '#':
552 			return AKEY_HASH;
553 		case '$':
554 			return AKEY_DOLLAR;
555 		case '%':
556 			return AKEY_PERCENT;
557 		case '^':
558 			return AKEY_CARET;
559 		case '&':
560 			return AKEY_AMPERSAND;
561 		case '*':
562 			return AKEY_ASTERISK;
563 		case '(':
564 			return AKEY_PARENLEFT;
565 		case ')':
566 			return AKEY_PARENRIGHT;
567 		case '+':
568 			return AKEY_PLUS;
569 		case '_':
570 			return AKEY_UNDERSCORE;
571 		case '"':
572 			return AKEY_DBLQUOTE;
573 		case '?':
574 			return AKEY_QUESTION;
575 		case '<':
576 			return AKEY_LESS;
577 		case '>':
578 			return AKEY_GREATER;
579 		case 'a':
580 			return AKEY_a;
581 		case 'b':
582 			return AKEY_b;
583 		case 'c':
584 			return AKEY_c;
585 		case 'd':
586 			return AKEY_d;
587 		case 'e':
588 			return AKEY_e;
589 		case 'f':
590 			return AKEY_f;
591 		case 'g':
592 			return AKEY_g;
593 		case 'h':
594 			return AKEY_h;
595 		case 'i':
596 			return AKEY_i;
597 		case 'j':
598 			return AKEY_j;
599 		case 'k':
600 			return AKEY_k;
601 		case 'l':
602 			return AKEY_l;
603 		case 'm':
604 			return AKEY_m;
605 		case 'n':
606 			return AKEY_n;
607 		case 'o':
608 			return AKEY_o;
609 		case 'p':
610 			return AKEY_p;
611 		case 'q':
612 			return AKEY_q;
613 		case 'r':
614 			return AKEY_r;
615 		case 's':
616 			return AKEY_s;
617 		case 't':
618 			return AKEY_t;
619 		case 'u':
620 			return AKEY_u;
621 		case 'v':
622 			return AKEY_v;
623 		case 'w':
624 			return AKEY_w;
625 		case 'x':
626 			return AKEY_x;
627 		case 'y':
628 			return AKEY_y;
629 		case 'z':
630 			return AKEY_z;
631 		case ';':
632 			return AKEY_SEMICOLON;
633 		case '0':
634 			return AKEY_0;
635 		case '1':
636 			return AKEY_1;
637 		case '2':
638 			return AKEY_2;
639 		case '3':
640 			return AKEY_3;
641 		case '4':
642 			return AKEY_4;
643 		case '5':
644 			return AKEY_5;
645 		case '6':
646 			return AKEY_6;
647 		case '7':
648 			return AKEY_7;
649 		case '8':
650 			return AKEY_8;
651 		case '9':
652 			return AKEY_9;
653 		case ',':
654 			return AKEY_COMMA;
655 		case '.':
656 			return AKEY_FULLSTOP;
657 		case '=':
658 			return AKEY_EQUAL;
659 		case '-':
660 			return AKEY_MINUS;
661 		case '\'':
662 			return AKEY_QUOTE;
663 		case '/':
664 			return AKEY_SLASH;
665 		case '\\':
666 			return AKEY_BACKSLASH;
667 		case '[':
668 			return AKEY_BRACKETLEFT;
669 		case ']':
670 			return AKEY_BRACKETRIGHT;
671 		case '|':
672 			return AKEY_BAR;
673 		}
674 	}
675 
676 	return AKEY_NONE;
677 }
678 
JAVANVM_INPUT_Initialise(int * argc,char * argv[])679 int JAVANVM_INPUT_Initialise(int *argc, char *argv[])
680 {
681 	if (INPUT_cx85) {
682 		kbd_joy_0_enabled = FALSE;
683 	}
684 	return TRUE;
685 }
686 
do_platform_PORT(UBYTE * s0,UBYTE * s1)687 static void do_platform_PORT(UBYTE *s0, UBYTE *s1)
688 {
689 #define KBHITS(x) (JAVANVM_Kbhits(x,x##_LOC))
690 	int stick0, stick1;
691 	stick0 = stick1 = INPUT_STICK_CENTRE;
692 
693 	if (kbd_joy_0_enabled) {
694 		if (KBHITS(KBD_STICK_0_LEFT))
695 			stick0 = INPUT_STICK_LEFT;
696 		if (KBHITS(KBD_STICK_0_RIGHT))
697 			stick0 = INPUT_STICK_RIGHT;
698 		if (KBHITS(KBD_STICK_0_UP))
699 			stick0 = INPUT_STICK_FORWARD;
700 		if (KBHITS(KBD_STICK_0_DOWN))
701 			stick0 = INPUT_STICK_BACK;
702 		if ((KBHITS(KBD_STICK_0_LEFTUP))
703 			|| ((KBHITS(KBD_STICK_0_LEFT)) && (KBHITS(KBD_STICK_0_UP))))
704 			stick0 = INPUT_STICK_UL;
705 		if ((KBHITS(KBD_STICK_0_LEFTDOWN))
706 			|| ((KBHITS(KBD_STICK_0_LEFT)) && (KBHITS(KBD_STICK_0_DOWN))))
707 			stick0 = INPUT_STICK_LL;
708 		if ((KBHITS(KBD_STICK_0_RIGHTUP))
709 			|| ((KBHITS(KBD_STICK_0_RIGHT)) && (KBHITS(KBD_STICK_0_UP))))
710 			stick0 = INPUT_STICK_UR;
711 		if ((KBHITS(KBD_STICK_0_RIGHTDOWN))
712 			|| ((KBHITS(KBD_STICK_0_RIGHT)) && (KBHITS(KBD_STICK_0_DOWN))))
713 			stick0 = INPUT_STICK_LR;
714 	}
715 	if (kbd_joy_1_enabled) {
716 		if (KBHITS(KBD_STICK_1_LEFT))
717 			stick1 = INPUT_STICK_LEFT;
718 		if (KBHITS(KBD_STICK_1_RIGHT))
719 			stick1 = INPUT_STICK_RIGHT;
720 		if (KBHITS(KBD_STICK_1_UP))
721 			stick1 = INPUT_STICK_FORWARD;
722 		if (KBHITS(KBD_STICK_1_DOWN))
723 			stick1 = INPUT_STICK_BACK;
724 		if ((KBHITS(KBD_STICK_1_LEFTUP))
725 			|| ((KBHITS(KBD_STICK_1_LEFT)) && (KBHITS(KBD_STICK_1_UP))))
726 			stick1 = INPUT_STICK_UL;
727 		if ((KBHITS(KBD_STICK_1_LEFTDOWN))
728 			|| ((KBHITS(KBD_STICK_1_LEFT)) && (KBHITS(KBD_STICK_1_DOWN))))
729 			stick1 = INPUT_STICK_LL;
730 		if ((KBHITS(KBD_STICK_1_RIGHTUP))
731 			|| ((KBHITS(KBD_STICK_1_RIGHT)) && (KBHITS(KBD_STICK_1_UP))))
732 			stick1 = INPUT_STICK_UR;
733 		if ((KBHITS(KBD_STICK_1_RIGHTDOWN))
734 			|| ((KBHITS(KBD_STICK_1_RIGHT)) && (KBHITS(KBD_STICK_1_DOWN))))
735 			stick1 = INPUT_STICK_LR;
736 	}
737 
738 	if (swap_joysticks) {
739 		*s1 = stick0;
740 		*s0 = stick1;
741 	}
742 	else {
743 		*s0 = stick0;
744 		*s1 = stick1;
745 	}
746 }
747 
do_platform_TRIG(UBYTE * t0,UBYTE * t1)748 static void do_platform_TRIG(UBYTE *t0, UBYTE *t1)
749 {
750 	int trig0, trig1, i;
751 	trig0 = trig1 = 1;
752 
753 	if (kbd_joy_0_enabled) {
754 		trig0 = KBHITS(KBD_TRIG_0) ? 0 : 1;
755 	}
756 
757 	if (kbd_joy_1_enabled) {
758 		trig1 = KBHITS(KBD_TRIG_1) ? 0 : 1;
759 	}
760 
761 	if (swap_joysticks) {
762 		*t1 = trig0;
763 		*t0 = trig1;
764 	}
765 	else {
766 		*t0 = trig0;
767 		*t1 = trig1;
768 	}
769 }
770 #undef KBHITS
771 
PLATFORM_PORT(int num)772 int PLATFORM_PORT(int num)
773 {
774 #ifndef DONT_DISPLAY
775 	if (num == 0) {
776 		UBYTE a, b;
777 		do_platform_PORT(&a, &b);
778 		return (b << 4) | (a & 0x0f);
779 	}
780 #endif
781 	return 0xff;
782 }
783 
PLATFORM_TRIG(int num)784 int PLATFORM_TRIG(int num)
785 {
786 #ifndef DONT_DISPLAY
787 	UBYTE a, b;
788 	do_platform_TRIG(&a, &b);
789 	switch (num) {
790 	case 0:
791 		return a;
792 	case 1:
793 		return b;
794 	default:
795 		break;
796 	}
797 #endif
798 	return 1;
799 }
800