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