1 /*
2 * UAE - The Un*x Amiga Emulator
3 *
4 * joystick/mouse emulation
5 *
6 * Copyright 2001, 2002 Toni Wilen
7 *
8 * new fetures:
9 * - very configurable (and very complex to configure :)
10 * - supports multiple native input devices (joysticks and mice)
11 * - supports mapping joystick/mouse buttons to keys and vice versa
12 * - joystick mouse emulation (supports both ports)
13 * - supports parallel port joystick adapter
14 * - full cd32 pad support (supports both ports)
15 * - fully backward compatible with old joystick/mouse configuration
16 *
17 */
18
19 //#define DONGLE_DEBUG
20
21 #include "sysconfig.h"
22 #include "sysdeps.h"
23
24 #include <ctype.h>
25
26 #include "options.h"
27 #include "custom.h"
28 #include "xwin.h"
29 #include "drawing.h"
30 #include "memory.h"
31 #include "events.h"
32 #include "newcpu.h"
33 #include "uae.h"
34 #include "picasso96.h"
35 #include "debug.h"
36 #include "gui.h"
37 #include "disk.h"
38 #include "audio.h"
39 #include "autoconf.h"
40 #include "traps.h"
41 #include "keyboard.h"
42 #include "inputdevice.h"
43 #include "keybuf.h"
44 #include "savestate.h"
45
46 #define DIR_LEFT 1
47 #define DIR_RIGHT 2
48 #define DIR_UP 4
49 #define DIR_DOWN 8
50
51 struct inputevent {
52 char *confname;
53 char *name;
54 int allow_mask;
55 int type;
56 int unit;
57 int data;
58 };
59
60 #define JOYBUTTON_1 0 /* fire/left mousebutton */
61 #define JOYBUTTON_2 1 /* 2nd/right mousebutton */
62 #define JOYBUTTON_3 2 /* 3rd/middle mousebutton */
63 #define JOYBUTTON_CD32_PLAY 3
64 #define JOYBUTTON_CD32_RWD 4
65 #define JOYBUTTON_CD32_FFW 5
66 #define JOYBUTTON_CD32_GREEN 6
67 #define JOYBUTTON_CD32_YELLOW 7
68 #define JOYBUTTON_CD32_RED 8
69 #define JOYBUTTON_CD32_BLUE 9
70
71 #define INPUTEVENT_JOY1_CD32_FIRST INPUTEVENT_JOY1_CD32_PLAY
72 #define INPUTEVENT_JOY2_CD32_FIRST INPUTEVENT_JOY2_CD32_PLAY
73 #define INPUTEVENT_JOY1_CD32_LAST INPUTEVENT_JOY1_CD32_BLUE
74 #define INPUTEVENT_JOY2_CD32_LAST INPUTEVENT_JOY2_CD32_BLUE
75
76 /* event masks */
77 #define AM_KEY 1 /* keyboard allowed */
78 #define AM_JOY_BUT 2 /* joystick buttons allowed */
79 #define AM_JOY_AXIS 4 /* joystick axis allowed */
80 #define AM_MOUSE_BUT 8 /* mouse buttons allowed */
81 #define AM_MOUSE_AXIS 16 /* mouse direction allowed */
82 #define AM_AF 32 /* supports autofire */
83 #define AM_INFO 64 /* information data for gui */
84 #define AM_DUMMY 128 /* placeholder */
85 #define AM_AUTO 256 /* forces autofire */
86 #define AM_K (AM_KEY|AM_JOY_BUT|AM_MOUSE_BUT|AM_AF) /* generic button/switch */
87
88 /* event flags */
89 #define ID_FLAG_AUTOFIRE 1
90
91 #define DEFEVENT(A, B, C, D, E, F) {#A, B, C, D, E, F },
92 struct inputevent events[] = {
93 {0, 0, AM_K, 0, 0, 0},
94 #include "inputevents.def"
95 {0, 0, 0, 0, 0, 0}
96 };
97 #undef DEFEVENT
98
99 static int sublevdir[2][MAX_INPUT_SUB_EVENT];
100
101 struct uae_input_device2 {
102 uae_u32 buttonmask;
103 int states[MAX_INPUT_DEVICE_EVENTS / 2];
104 };
105
106 static struct uae_input_device2 joysticks2[MAX_INPUT_DEVICES];
107 static struct uae_input_device2 mice2[MAX_INPUT_DEVICES];
108
109 static uae_u8 mouse_settings_reset[MAX_INPUT_SETTINGS][MAX_INPUT_DEVICES];
110 static uae_u8 joystick_settings_reset[MAX_INPUT_SETTINGS][MAX_INPUT_DEVICES];
111
112 static struct inputdevice_functions idev[3];
113
isdevice(struct uae_input_device * id)114 static int isdevice (struct uae_input_device *id)
115 {
116 int i, j;
117 for (i = 0; i < MAX_INPUT_DEVICE_EVENTS; i++) {
118 for (j = 0; j < MAX_INPUT_SUB_EVENT; j++) {
119 if (id->eventid[i][j] > 0)
120 return 1;
121 }
122 }
123 return 0;
124 }
125
inputdevice_uaelib(char * s,char * parm)126 int inputdevice_uaelib (char *s, char *parm)
127 {
128 int i;
129
130 for (i = 1; events[i].name; i++) {
131 if (!strcmp (s, events[i].confname)) {
132 handle_input_event (i, atol (parm), 1, 0);
133 return 1;
134 }
135 }
136 return 0;
137 }
138
139 static struct uae_input_device *joysticks;
140 static struct uae_input_device *mice;
141 static struct uae_input_device *keyboards;
142 static struct uae_input_device_kbr_default *keyboard_default;
143
144 static double mouse_axis[MAX_INPUT_DEVICES][MAX_INPUT_DEVICE_EVENTS];
145 static double oldm_axis[MAX_INPUT_DEVICES][MAX_INPUT_DEVICE_EVENTS];
146
147 static int mouse_x[MAX_INPUT_DEVICES], mouse_y[MAX_INPUT_DEVICE_EVENTS];
148 static int mouse_delta[MAX_INPUT_DEVICES][MAX_INPUT_DEVICE_EVENTS];
149 static int mouse_deltanoreset[MAX_INPUT_DEVICES][MAX_INPUT_DEVICE_EVENTS];
150 static int joybutton[MAX_INPUT_DEVICES];
151 static unsigned int joydir[MAX_INPUT_DEVICE_EVENTS];
152 static int joydirpot[MAX_INPUT_DEVICE_EVENTS][2];
153 static int mouse_frame_x[2], mouse_frame_y[2];
154
155 static int mouse_port[2];
156 static int cd32_shifter[2];
157 static int cd32_pad_enabled[2];
158 static int parport_joystick_enabled;
159 static int oldmx[4], oldmy[4];
160 static int oleft[4], oright[4], otop[4], obot[4];
161 static int potgo_hsync;
162
163 static int use_joysticks[MAX_INPUT_DEVICES];
164 static int use_mice[MAX_INPUT_DEVICES];
165 static int use_keyboards[MAX_INPUT_DEVICES];
166
167 #define INPUT_QUEUE_SIZE 16
168 struct input_queue_struct {
169 int event, storedstate, state, max, framecnt, nextframecnt;
170 };
171 static struct input_queue_struct input_queue[INPUT_QUEUE_SIZE];
172
173 /* Sigh. */
174 #define cfgfile_write fprintf
175
out_config(FILE * f,int id,int num,char * s1,char * s2)176 static void out_config (FILE *f, int id, int num, char *s1, char *s2)
177 {
178 cfgfile_write (f, "input.%d.%s%d=%s\n", id, s1, num, s2);
179 //write_log ("-input.%d.%s%d=%s\n", id, s1, num, s2);
180 }
181
write_config2(FILE * f,int idnum,int i,int offset,char * tmp1,struct uae_input_device * id)182 static void write_config2 (FILE *f, int idnum, int i, int offset, char *tmp1, struct uae_input_device *id)
183 {
184 char tmp2[200], *p;
185 int event, got, j, k;
186 char *custom;
187
188 p = tmp2;
189 got = 0;
190 for (j = 0; j < MAX_INPUT_SUB_EVENT; j++) {
191 event = id->eventid[i + offset][j];
192 custom = id->custom[i + offset][j];
193 if (custom == NULL && event <= 0) {
194 for (k = j + 1; k < MAX_INPUT_SUB_EVENT; k++) {
195 if (id->eventid[i + offset][k] > 0) break;
196 }
197 if (k == MAX_INPUT_SUB_EVENT)
198 break;
199 }
200 if (p > tmp2) {
201 *p++ = ',';
202 *p = 0;
203 }
204 if (custom)
205 sprintf (p, "'%s'.%d", custom, id->flags[i + offset][j]);
206 else if (event <= 0)
207 sprintf (p, "NULL");
208 else
209 sprintf (p, "%s.%d", events[event].confname, id->flags[i + offset][j]);
210 p += strlen (p);
211 }
212 if (p > tmp2)
213 out_config (f, idnum, i, tmp1, tmp2);
214 }
215
write_config(FILE * f,int idnum,int devnum,char * name,struct uae_input_device * id,struct uae_input_device2 * id2)216 static void write_config (FILE *f, int idnum, int devnum, char *name, struct uae_input_device *id, struct uae_input_device2 *id2)
217 {
218 char tmp1[100];
219 int i;
220
221 if (!isdevice (id))
222 return;
223 cfgfile_write (f, "input.%d.%s.%d.disabled=%d\n", idnum, name, devnum, id->enabled ? 0 : 1);
224 sprintf (tmp1, "%s.%d.axis.", name, devnum);
225 for (i = 0; i < ID_AXIS_TOTAL; i++)
226 write_config2 (f, idnum, i, ID_AXIS_OFFSET, tmp1, id);
227 sprintf (tmp1, "%s.%d.button." ,name, devnum);
228 for (i = 0; i < ID_BUTTON_TOTAL; i++)
229 write_config2 (f, idnum, i, ID_BUTTON_OFFSET, tmp1, id);
230 }
231
kbrlabel(char * s)232 static void kbrlabel (char *s)
233 {
234 while (*s) {
235 *s = toupper(*s);
236 if (*s == ' ') *s = '_';
237 s++;
238 }
239 }
240
write_kbr_config(FILE * f,int idnum,int devnum,struct uae_input_device * kbr)241 static void write_kbr_config (FILE *f, int idnum, int devnum, struct uae_input_device *kbr)
242 {
243 char tmp1[200], tmp2[200], tmp3[200], *p;
244 int i, j, k, event, skip;
245
246 if (!keyboard_default)
247 return;
248 i = 0;
249 while (i < MAX_INPUT_DEVICE_EVENTS && kbr->extra[i][0] >= 0) {
250 skip = 0;
251 k = 0;
252 while (keyboard_default[k].scancode >= 0) {
253 if (keyboard_default[k].scancode == kbr->extra[i][0]) {
254 skip = 1;
255 for (j = 1; j < MAX_INPUT_SUB_EVENT; j++) {
256 if (kbr->flags[i][j] || kbr->eventid[i][j] > 0)
257 skip = 0;
258 }
259 if (keyboard_default[k].event != kbr->eventid[i][0] || kbr->flags[i][0] != 0)
260 skip = 0;
261 break;
262 }
263 k++;
264 }
265 if (kbr->eventid[i][0] == 0 && kbr->flags[i][0] == 0 && keyboard_default[k].scancode < 0)
266 skip = 1;
267 if (skip) {
268 i++;
269 continue;
270 }
271 p = tmp2;
272 p[0] = 0;
273 for (j = 0; j < MAX_INPUT_SUB_EVENT; j++) {
274 char *custom = kbr->custom[i][j];
275 event = kbr->eventid[i][j];
276 if (custom == NULL && event <= 0) {
277 for (k = j + 1; k < MAX_INPUT_SUB_EVENT; k++) {
278 if (kbr->eventid[i][k] > 0) break;
279 }
280 if (k == MAX_INPUT_SUB_EVENT)
281 break;
282 }
283 if (p > tmp2) {
284 *p++ = ',';
285 *p = 0;
286 }
287 if (custom)
288 sprintf (p, "'%s'.%d", custom, kbr->flags[i][j]);
289 else if (event > 0)
290 sprintf (p, "%s.%d", events[event].confname, kbr->flags[i][j]);
291 else
292 strcat (p, "NULL");
293 p += strlen(p);
294 }
295 sprintf (tmp3, "%d", kbr->extra[i][0]);
296 kbrlabel (tmp3);
297 sprintf (tmp1, "keyboard.%d.button.%s", devnum, tmp3);
298 cfgfile_write (f, "input.%d.%s=%s\n", idnum, tmp1, tmp2);
299 i++;
300 }
301 }
302
write_inputdevice_config(struct uae_prefs * p,FILE * f)303 void write_inputdevice_config (struct uae_prefs *p, FILE *f)
304 {
305 int i, id;
306
307 cfgfile_write (f, "input.config=%d\n", p->input_selected_setting);
308 cfgfile_write (f, "input.joymouse_speed_analog=%d\n", p->input_joymouse_multiplier);
309 cfgfile_write (f, "input.joymouse_speed_digital=%d\n", p->input_joymouse_speed);
310 cfgfile_write (f, "input.joymouse_deadzone=%d\n", p->input_joymouse_deadzone);
311 cfgfile_write (f, "input.joystick_deadzone=%d\n", p->input_joystick_deadzone);
312 cfgfile_write (f, "input.mouse_speed=%d\n", p->input_mouse_speed);
313 cfgfile_write (f, "input.autofire=%d\n", p->input_autofire_framecnt);
314 for (id = 1; id <= MAX_INPUT_SETTINGS; id++) {
315 for (i = 0; i < MAX_INPUT_DEVICES; i++)
316 write_config (f, id, i, "joystick", &p->joystick_settings[id][i], &joysticks2[i]);
317 for (i = 0; i < MAX_INPUT_DEVICES; i++)
318 write_config (f, id, i, "mouse", &p->mouse_settings[id][i], &mice2[i]);
319 for (i = 0; i < MAX_INPUT_DEVICES; i++)
320 write_kbr_config (f, id, i, &p->keyboard_settings[id][i]);
321 }
322 }
323
getnum(char ** pp)324 static int getnum (char **pp)
325 {
326 char *p = *pp;
327 int v = atol (p);
328
329 while (*p != 0 && *p !='.' && *p != ',')
330 p++;
331 if (*p == '.' || *p == ',')
332 p++;
333 *pp = p;
334 return v;
335 }
getstring(char ** pp)336 static char *getstring (char **pp)
337 {
338 int i;
339 static char str[1000];
340 char *p = *pp;
341
342 if (*p == 0)
343 return 0;
344 i = 0;
345 while (*p != 0 && *p !='.' && *p != ',')
346 str[i++] = *p++;
347 if (*p == '.' || *p == ',')
348 p++;
349 str[i] = 0;
350 *pp = p;
351 return str;
352 }
353
reset_inputdevice_config(struct uae_prefs * pr)354 void reset_inputdevice_config (struct uae_prefs *pr)
355 {
356 memset (joystick_settings_reset, 0, sizeof (joystick_settings_reset));
357 memset (mouse_settings_reset, 0, sizeof (mouse_settings_reset));
358 }
359
clear_id(struct uae_input_device * id)360 static void clear_id (struct uae_input_device *id)
361 {
362 #ifndef _DEBUG
363 int i, j;
364 for (i = 0; i < MAX_INPUT_DEVICE_EVENTS; i++) {
365 for (j = 0; j < MAX_INPUT_SUB_EVENT; j++)
366 free (id->custom[i][j]);
367 }
368 #endif
369 memset (id, 0, sizeof (struct uae_input_device));
370 id->enabled = 1;
371 }
372
read_inputdevice_config(struct uae_prefs * pr,char * option,char * value)373 void read_inputdevice_config (struct uae_prefs *pr, char *option, char *value)
374 {
375 struct uae_input_device *id = 0;
376 struct inputevent *ie;
377 int devnum, num, button, joystick, flags, i, subnum, idnum, keynum;
378 int mask;
379 char *p, *p2, *custom;
380
381 option += 6; /* "input." */
382 p = getstring (&option);
383 if (!strcasecmp (p, "config"))
384 pr->input_selected_setting = atol (value);
385 if (!strcasecmp (p, "joymouse_speed_analog"))
386 pr->input_joymouse_multiplier = atol (value);
387 if (!strcasecmp (p, "joymouse_speed_digital"))
388 pr->input_joymouse_speed = atol (value);
389 if (!strcasecmp (p, "joystick_deadzone"))
390 pr->input_joystick_deadzone = atol (value);
391 if (!strcasecmp (p, "joymouse_deadzone"))
392 pr->input_joymouse_deadzone = atol (value);
393 if (!strcasecmp (p, "mouse_speed"))
394 pr->input_mouse_speed = atol (value);
395 if (!strcasecmp (p, "autofire"))
396 pr->input_autofire_framecnt = atol (value);
397 idnum = atol (p);
398 if (idnum <= 0 || idnum > MAX_INPUT_SETTINGS)
399 return;
400 if (memcmp (option, "mouse.", 6) == 0) {
401 p = option + 6;
402 devnum = getnum (&p);
403 if (devnum < 0 || devnum >= MAX_INPUT_DEVICES)
404 return;
405 id = &pr->mouse_settings[idnum][devnum];
406 if (!mouse_settings_reset[idnum][devnum])
407 clear_id (id);
408 mouse_settings_reset[idnum][devnum] = 1;
409 joystick = 0;
410 } else if (memcmp (option, "joystick.", 9) == 0) {
411 p = option + 9;
412 devnum = getnum (&p);
413 if (devnum < 0 || devnum >= MAX_INPUT_DEVICES)
414 return;
415 id = &pr->joystick_settings[idnum][devnum];
416 if (!joystick_settings_reset[idnum][devnum])
417 clear_id (id);
418 joystick_settings_reset[idnum][devnum] = 1;
419 joystick = 1;
420 } else if (memcmp (option, "keyboard.", 9) == 0) {
421 joystick = -1;
422 p = option + 9;
423 devnum = getnum (&p);
424 if (devnum < 0 || devnum >= MAX_INPUT_DEVICES)
425 return;
426 id = &pr->keyboard_settings[idnum][devnum];
427 }
428 if (!id)
429 return;
430 p2 = getstring (&p);
431 if (!p2)
432 return;
433 if (!strcmp (p2, "disabled")) {
434 int disabled;
435 p = value;
436 disabled = getnum (&p);
437 id->enabled = disabled == 0 ? 1 : 0;
438 return;
439 }
440
441 if (joystick < 0) {
442 num = getnum (&p);
443 keynum = 0;
444 while (id->extra[keynum][0] >= 0) {
445 if (id->extra[keynum][0] == num)
446 break;
447 keynum++;
448 }
449 if (id->extra[keynum][0] < 0)
450 return;
451 } else {
452 button = -1;
453 if (!strcmp (p2, "axis"))
454 button = 0;
455 else if(!strcmp (p2, "button"))
456 button = 1;
457 if (button < 0)
458 return;
459 num = getnum (&p);
460 }
461 p = value;
462
463 custom = NULL;
464 for (subnum = 0; subnum < MAX_INPUT_SUB_EVENT; subnum++) {
465 free (custom);
466 custom = NULL;
467 p2 = getstring (&p);
468 if (!p2)
469 break;
470 i = 1;
471 while (events[i].name) {
472 if (!strcmp (events[i].confname, p2))
473 break;
474 i++;
475 }
476 ie = &events[i];
477 if (!ie->name) {
478 ie = &events[0];
479 if (strlen (p2) > 2 && p2[0] == '\'' && p2[strlen (p2) - 1] == '\'') {
480 custom = my_strdup (p2 + 1);
481 custom[strlen (custom) - 1] = 0;
482 }
483 }
484 flags = getnum (&p);
485 if (custom == NULL && ie->name == NULL)
486 continue;
487 if (joystick < 0) {
488 if (!(ie->allow_mask & AM_K))
489 continue;
490 id->eventid[keynum][subnum] = ie - events;
491 id->flags[keynum][subnum] = flags;
492 free (id->custom[keynum][subnum]);
493 id->custom[keynum][subnum] = custom;
494 } else if (button) {
495 if (joystick)
496 mask = AM_JOY_BUT;
497 else
498 mask = AM_MOUSE_BUT;
499 if (!(ie->allow_mask & mask))
500 continue;
501 id->eventid[num + ID_BUTTON_OFFSET][subnum] = ie - events;
502 id->flags[num + ID_BUTTON_OFFSET][subnum] = flags;
503 free (id->custom[num + ID_BUTTON_OFFSET][subnum]);
504 id->custom[num + ID_BUTTON_OFFSET][subnum] = custom;
505 } else {
506 if (joystick)
507 mask = AM_JOY_AXIS;
508 else
509 mask = AM_MOUSE_AXIS;
510 if (!(ie->allow_mask & mask))
511 continue;
512 id->eventid[num + ID_AXIS_OFFSET][subnum] = ie - events;
513 id->flags[num + ID_AXIS_OFFSET][subnum] = flags;
514 free (id->custom[num + ID_AXIS_OFFSET][subnum]);
515 id->custom[num + ID_AXIS_OFFSET][subnum] = custom;
516 }
517 custom = NULL;
518 }
519 free (custom);
520 }
521
522 /* Mousehack stuff */
523
524 static int ievent_alive = 0;
525 static int lastmx, lastmy;
526
mousehack_setpos(int mousexpos,int mouseypos)527 static void mousehack_setpos (int mousexpos, int mouseypos)
528 {
529 uae_u8 *p;
530 if (!uae_boot_rom)
531 return;
532 p = rtarea + get_long (RTAREA_BASE + 40) + 12;
533 p[0] = mousexpos >> 8;
534 p[1] = mousexpos;
535 p[2] = mouseypos >> 8;
536 p[3] = mouseypos;
537 //write_log ("%dx%d\n", mousexpos, mouseypos);
538 }
539
new_mousehack_helper(void)540 static void new_mousehack_helper (void)
541 {
542 int mousexpos, mouseypos;
543
544 if (!mousehack_allowed ())
545 return;
546 #ifdef PICASSO96
547 if (picasso_on) {
548 mousexpos = lastmx - picasso96_state.XOffset;
549 mouseypos = lastmy - picasso96_state.YOffset;
550 } else
551 #endif
552 {
553 mouseypos = coord_native_to_amiga_y (lastmy) << 1;
554 mousexpos = coord_native_to_amiga_x (lastmx);
555 }
556 mousehack_setpos (mousexpos, mouseypos);
557 }
558
mousehack_alive(void)559 int mousehack_alive (void)
560 {
561 return ievent_alive > 0;
562 }
563
mousehack_helper(TrapContext * dummy)564 uae_u32 mousehack_helper (TrapContext *dummy)
565 {
566 int mousexpos, mouseypos;
567
568 #ifdef PICASSO96
569 if (picasso_on) {
570 mousexpos = lastmx - picasso96_state.XOffset;
571 mouseypos = lastmy - picasso96_state.YOffset;
572 } else
573 #endif
574 {
575 if (mouse_y[0] >= gfxvidinfo.height)
576 mouse_y[0] = gfxvidinfo.height - 1;
577 mouseypos = coord_native_to_amiga_y (lastmy) << 1;
578 mousexpos = coord_native_to_amiga_x (lastmx);
579 }
580
581 switch (m68k_dreg (regs, 0)) {
582 case 0:
583 return ievent_alive ? -1 : (1 || !uae_boot_rom) && needmousehack ();
584 case 1:
585 ievent_alive = 10;
586 if (!mousehack_allowed ())
587 return 0;
588 return mousexpos;
589 case 2:
590 if (!mousehack_allowed ())
591 return 0;
592 return mouseypos;
593 }
594 return 0;
595 }
596
adjust(int val)597 STATIC_INLINE int adjust (int val)
598 {
599 if (val > 127)
600 return 127;
601 else if (val < -127)
602 return -127;
603 return val;
604 }
605
getbuttonstate(int joy,int button)606 int getbuttonstate (int joy, int button)
607 {
608 return joybutton[joy] & (1 << button);
609 }
610
mouseupdate(int pct)611 static void mouseupdate (int pct)
612 {
613 int v, i;
614
615 for (i = 0; i < 2; i++) {
616
617 v = mouse_delta[i][0] * pct / 100;
618 mouse_x[i] += v;
619 if (!mouse_deltanoreset[i][0])
620 mouse_delta[i][0] -= v;
621
622 v = mouse_delta[i][1] * pct / 100;
623 mouse_y[i] += v;
624 if (!mouse_deltanoreset[i][1])
625 mouse_delta[i][1] -= v;
626
627 v = mouse_delta[i][2] * pct / 100;
628 if (v > 0)
629 record_key (0x7a << 1);
630 else if (v < 0)
631 record_key (0x7b << 1);
632 if (!mouse_deltanoreset[i][2])
633 mouse_delta[i][2] = 0;
634
635 if (mouse_frame_x[i] - mouse_x[i] > 127)
636 mouse_x[i] = mouse_frame_x[i] - 127;
637 if (mouse_frame_x[i] - mouse_x[i] < -127)
638 mouse_x[i] = mouse_frame_x[i] + 127;
639
640 if (mouse_frame_y[i] - mouse_y[i] > 127)
641 mouse_y[i] = mouse_frame_y[i] - 127;
642 if (mouse_frame_y[i] - mouse_y[i] < -127)
643 mouse_y[i] = mouse_frame_y[i] + 127;
644
645 if (pct == 100) {
646 if (!mouse_deltanoreset[i][0])
647 mouse_delta[i][0] = 0;
648 if (!mouse_deltanoreset[i][1])
649 mouse_delta[i][1] = 0;
650 if (!mouse_deltanoreset[i][2])
651 mouse_delta[i][2] = 0;
652 mouse_frame_x[i] = mouse_x[i];
653 mouse_frame_y[i] = mouse_y[i];
654 }
655
656 }
657 }
658
659 static int input_read, input_vpos;
660
readinput(void)661 static void readinput (void)
662 {
663 if (!input_read && (vpos & ~31) != (input_vpos & ~31)) {
664 idev[IDTYPE_JOYSTICK].read ();
665 idev[IDTYPE_MOUSE].read ();
666 mouseupdate ((vpos - input_vpos) * 100 / maxvpos);
667 input_vpos = vpos;
668 }
669 if (input_read) {
670 input_vpos = vpos;
671 input_read = 0;
672 }
673 }
674
getjoystate(int joy)675 int getjoystate (int joy)
676 {
677 int left = 0, right = 0, top = 0, bot = 0;
678 uae_u16 v = 0;
679
680 readinput ();
681 if (joydir[joy] & DIR_LEFT)
682 left = 1;
683 if (joydir[joy] & DIR_RIGHT)
684 right = 1;
685 if (joydir[joy] & DIR_UP)
686 top = 1;
687 if (joydir[joy] & DIR_DOWN)
688 bot = 1;
689 v = (uae_u8)mouse_x[joy] | (mouse_y[joy] << 8);
690 if (left || right || top || bot || !mouse_port[joy]) {
691 if (left)
692 top = !top;
693 if (right)
694 bot = !bot;
695 v &= ~0x0303;
696 v |= bot | (right << 1) | (top << 8) | (left << 9);
697 }
698 #ifdef DONGLE_DEBUG
699 if (notinrom ())
700 write_log ("JOY%dDAT %04.4X %s\n", joy, v, debuginfo (0));
701 #endif
702 return v;
703 }
704
JOY0DAT(void)705 uae_u16 JOY0DAT (void)
706 {
707 return getjoystate (0);
708 }
JOY1DAT(void)709 uae_u16 JOY1DAT (void)
710 {
711 return getjoystate (1);
712 }
713
JOYTEST(uae_u16 v)714 void JOYTEST (uae_u16 v)
715 {
716 mouse_x[0] &= 3;
717 mouse_y[0] &= 3;
718 mouse_x[1] &= 3;
719 mouse_y[1] &= 3;
720 mouse_x[0] |= v & 0xFC;
721 mouse_x[1] |= v & 0xFC;
722 mouse_y[0] |= (v >> 8) & 0xFC;
723 mouse_y[1] |= (v >> 8) & 0xFC;
724 mouse_frame_x[0] = mouse_x[0];
725 mouse_frame_y[0] = mouse_y[0];
726 mouse_frame_x[1] = mouse_x[1];
727 mouse_frame_y[1] = mouse_y[1];
728 // write_log ("%d:%04.4X %p\n",vpos,v,m68k_getpc ());
729 }
730
parconvert(uae_u8 v,int jd,int shift)731 static uae_u8 parconvert (uae_u8 v, int jd, int shift)
732 {
733 if (jd & DIR_UP)
734 v &= ~(1 << shift);
735 if (jd & DIR_DOWN)
736 v &= ~(2 << shift);
737 if (jd & DIR_LEFT)
738 v &= ~(4 << shift);
739 if (jd & DIR_RIGHT)
740 v &= ~(8 << shift);
741 return v;
742 }
743
744
745
746 /* io-pins floating: dir=1 -> return data, dir=0 -> always return 1 */
handle_parport_joystick(int port,uae_u8 pra,uae_u8 dra)747 uae_u8 handle_parport_joystick (int port, uae_u8 pra, uae_u8 dra)
748 {
749 uae_u8 v;
750 switch (port)
751 {
752 case 0:
753 v = (pra & dra) | (dra ^ 0xff);
754 if (parport_joystick_enabled) {
755 v = parconvert (v, joydir[2], 0);
756 v = parconvert (v, joydir[3], 4);
757 }
758 return v;
759 case 1:
760 v = ((pra & dra) | (dra ^ 0xff)) & 0x7;
761 if (parport_joystick_enabled) {
762 if (getbuttonstate (2, 0)) v &= ~1;
763 if (getbuttonstate (3, 0)) v &= ~4;
764 }
765 return v;
766 default:
767 abort ();
768 return 0;
769 }
770 }
771
handle_joystick_buttons(uae_u8 dra)772 uae_u8 handle_joystick_buttons (uae_u8 dra)
773 {
774 uae_u8 but = 0;
775 int i;
776
777 for (i = 0; i < 2; i++) {
778 if (cd32_pad_enabled[i]) {
779 uae_u16 p5dir = 0x0200 << (i * 4);
780 uae_u16 p5dat = 0x0100 << (i * 4);
781 but |= 0x40 << i;
782 /* Red button is connected to fire when p5 is 1 or floating */
783 if (!(potgo_value & p5dir) || ((potgo_value & p5dat) && (potgo_value & p5dir))) {
784 if (getbuttonstate (i, JOYBUTTON_CD32_RED))
785 but &= ~(0x40 << i);
786 }
787 } else if (!getbuttonstate (i, JOYBUTTON_1)) {
788 but |= 0x40 << i;
789 }
790 }
791 return but;
792 }
793
794 /* joystick 1 button 1 is used as a output for incrementing shift register */
handle_cd32_joystick_cia(uae_u8 pra,uae_u8 dra)795 void handle_cd32_joystick_cia (uae_u8 pra, uae_u8 dra)
796 {
797 static int oldstate[2];
798 int i;
799
800 for (i = 0; i < 2; i++) {
801 uae_u8 but = 0x40 << i;
802 uae_u16 p5dir = 0x0200 << (i * 4); /* output enable P5 */
803 uae_u16 p5dat = 0x0100 << (i * 4); /* data P5 */
804 if (!(potgo_value & p5dir) || !(potgo_value & p5dat)) {
805 if ((dra & but) && (pra & but) != oldstate[i]) {
806 if (!(pra & but)) {
807 cd32_shifter[i]--;
808 if (cd32_shifter[i] < 0)
809 cd32_shifter[i] = 0;
810 }
811 }
812 }
813 oldstate[i] = pra & but;
814 }
815 }
816
817 /* joystick port 1 button 2 is input for button state */
handle_joystick_potgor(uae_u16 potgor)818 static uae_u16 handle_joystick_potgor (uae_u16 potgor)
819 {
820 int i;
821
822 for (i = 0; i < 2; i++) {
823 uae_u16 p9dir = 0x0800 << (i * 4); /* output enable P9 */
824 uae_u16 p9dat = 0x0400 << (i * 4); /* data P9 */
825 uae_u16 p5dir = 0x0200 << (i * 4); /* output enable P5 */
826 uae_u16 p5dat = 0x0100 << (i * 4); /* data P5 */
827
828 if (mouse_port[i]) {
829 /* mouse has pull-up resistors in button lines */
830 if (!(potgo_value & p5dir))
831 potgor |= p5dat;
832 if (!(potgo_value & p9dir))
833 potgor |= p9dat;
834 }
835 if (potgo_hsync < 0) {
836 /* first 10 or so lines after potgo has started
837 * forces input-lines to zero
838 */
839 if (!(potgo_value & p5dir))
840 potgor &= ~p5dat;
841 if (!(potgo_value & p9dir))
842 potgor &= ~p9dat;
843 }
844
845 if (cd32_pad_enabled[i]) {
846 /* p5 is floating in input-mode */
847 potgor &= ~p5dat;
848 potgor |= potgo_value & p5dat;
849 if (!(potgo_value & p9dir))
850 potgor |= p9dat;
851 /* P5 output and 1 -> shift register is kept reset (Blue button) */
852 if ((potgo_value & p5dir) && (potgo_value & p5dat))
853 cd32_shifter[i] = 8;
854 /* shift at 1 == return one, >1 = return button states */
855 if (cd32_shifter[i] == 0)
856 potgor &= ~p9dat; /* shift at zero == return zero */
857 if (cd32_shifter[i] >= 2 && (joybutton[i] & ((1 << JOYBUTTON_CD32_PLAY) << (cd32_shifter[i] - 2))))
858 potgor &= ~p9dat;
859 //write_log ("%d:%04.4X %08.8X\n", cd32_shifter[i], potgor, m68k_getpc ());
860 } else {
861 if (getbuttonstate (i, JOYBUTTON_3))
862 potgor &= ~p5dat;
863 if (getbuttonstate (i, JOYBUTTON_2))
864 potgor &= ~p9dat;
865 }
866 }
867 return potgor;
868 }
869
870 uae_u16 potgo_value;
871 static uae_u16 potdats[2];
872 static int inputdelay;
873
inputdevice_hsync(void)874 void inputdevice_hsync (void)
875 {
876 int joy;
877
878 for (joy = 0; joy < 2; joy++) {
879 if (potgo_hsync >= 0) {
880 int active;
881
882 active = 0;
883 if ((potgo_value >> 9) & 1) /* output? */
884 active = ((potgo_value >> 8) & 1) ? 0 : 1;
885 if (potgo_hsync < joydirpot[joy][0])
886 active = 1;
887 if (getbuttonstate (joy, JOYBUTTON_3))
888 active = 1;
889 if (active)
890 potdats[joy] = ((potdats[joy] + 1) & 0xFF) | (potdats[joy] & 0xFF00);
891
892 active = 0;
893 if ((potgo_value >> 11) & 1) /* output? */
894 active = ((potgo_value >> 10) & 1) ? 0 : 1;
895 if (potgo_hsync < joydirpot[joy][1])
896 active = 1;
897 if (getbuttonstate (joy, JOYBUTTON_2))
898 active = 1;
899 if (active)
900 potdats[joy] += 0x100;
901 }
902 }
903 potgo_hsync++;
904 if (potgo_hsync > 255)
905 potgo_hsync = 255;
906
907
908 #ifdef CATWEASEL
909 catweasel_hsync ();
910 #endif
911 if (inputdelay > 0) {
912 inputdelay--;
913 if (inputdelay == 0) {
914 idev[IDTYPE_JOYSTICK].read ();
915 idev[IDTYPE_KEYBOARD].read ();
916 }
917 }
918 }
919
POT0DAT(void)920 uae_u16 POT0DAT (void)
921 {
922 return potdats[0];
923 }
POT1DAT(void)924 uae_u16 POT1DAT (void)
925 {
926 return potdats[1];
927 }
928
929 /* direction=input, data pin floating, last connected logic level or previous status
930 written when direction was ouput
931 * otherwise it is currently connected logic level.
932 * direction=output, data pin is current value, forced to zero if joystick button is pressed
933 * it takes some tens of microseconds before data pin changes state
934 */
935
POTGO(uae_u16 v)936 void POTGO (uae_u16 v)
937 {
938 int i;
939
940 //write_log ("W:%d: %04.4X %p\n", vpos, v, m68k_getpc ());
941 #ifdef DONGLE_DEBUG
942 if (notinrom ())
943 write_log ("POTGO %04.4X %s\n", v, debuginfo(0));
944 #endif
945 potgo_value = potgo_value & 0x5500; /* keep state of data bits */
946 potgo_value |= v & 0xaa00; /* get new direction bits */
947 for (i = 0; i < 8; i += 2) {
948 uae_u16 dir = 0x0200 << i;
949 if (v & dir) {
950 uae_u16 data = 0x0100 << i;
951 potgo_value &= ~data;
952 potgo_value |= v & data;
953 }
954 }
955 for (i = 0; i < 2; i++) {
956 if (cd32_pad_enabled[i]) {
957 uae_u16 p5dir = 0x0200 << (i * 4); /* output enable P5 */
958 uae_u16 p5dat = 0x0100 << (i * 4); /* data P5 */
959 if ((potgo_value & p5dir) && (potgo_value & p5dat))
960 cd32_shifter[i] = 8;
961 }
962 }
963 if (v & 1) {
964 potdats[0] = potdats[1] = 0;
965 potgo_hsync = -15;
966 }
967 }
968
POTGOR(void)969 uae_u16 POTGOR (void)
970 {
971 uae_u16 v = handle_joystick_potgor (potgo_value) & 0x5500;
972 //write_log ("R:%d:%04.4X %d %p\n", vpos, v, cd32_shifter[1], m68k_getpc ());
973 return v;
974 }
975
check_input_queue(int event)976 static int check_input_queue (int event)
977 {
978 struct input_queue_struct *iq;
979 int i;
980 for (i = 0; i < INPUT_QUEUE_SIZE; i++) {
981 iq = &input_queue[i];
982 if (iq->event == event) return i;
983 }
984 return -1;
985 }
986
queue_input_event(int event,int state,int max,int framecnt,int autofire)987 static void queue_input_event (int event, int state, int max, int framecnt, int autofire)
988 {
989 struct input_queue_struct *iq;
990 int i = check_input_queue (event);
991
992 if (event <= 0)
993 return;
994 if (state < 0 && i >= 0) {
995 iq = &input_queue[i];
996 iq->nextframecnt = -1;
997 iq->framecnt = -1;
998 iq->event = 0;
999 if (iq->state == 0)
1000 handle_input_event (event, 0, 1, 0);
1001 } else if (i < 0) {
1002 for (i = 0; i < INPUT_QUEUE_SIZE; i++) {
1003 iq = &input_queue[i];
1004 if (iq->framecnt < 0) break;
1005 }
1006 if (i == INPUT_QUEUE_SIZE) {
1007 write_log ("input queue overflow\n");
1008 return;
1009 }
1010 iq->event = event;
1011 iq->state = iq->storedstate = state;
1012 iq->max = max;
1013 iq->framecnt = framecnt;
1014 iq->nextframecnt = autofire > 0 ? framecnt : -1;
1015 }
1016 }
1017
1018 static uae_u8 keybuf[256];
1019 static int inputcode_pending, inputcode_pending_state;
1020
1021 /* Generate key up events for any keys that are 'stuck' down */
inputdevice_release_all_keys(void)1022 void inputdevice_release_all_keys (void)
1023 {
1024 int i;
1025
1026 for (i = 0; i < 0x80; i++) {
1027 if (keybuf[i] != 0) {
1028 keybuf[i] = 0;
1029 record_key (i << 1|1);
1030 }
1031 }
1032 }
1033
inputdevice_add_inputcode(int code,int state)1034 void inputdevice_add_inputcode (int code, int state)
1035 {
1036 inputcode_pending = code;
1037 inputcode_pending_state = state;
1038 }
1039
inputdevice_do_keyboard(int code,int state)1040 void inputdevice_do_keyboard (int code, int state)
1041 {
1042 if (code < 0x80) {
1043 uae_u8 key = code | (state ? 0x00 : 0x80);
1044 keybuf[key & 0x7f] = (key & 0x80) ? 0 : 1;
1045 if (((keybuf[AK_CTRL] || keybuf[AK_RCTRL]) && keybuf[AK_LAMI] && keybuf[AK_RAMI]) || key == AK_RESETWARNING) {
1046 int r = keybuf[AK_LALT] | keybuf[AK_RALT];
1047 memset (keybuf, 0, sizeof (keybuf));
1048 uae_reset (r);
1049 }
1050 record_key ((uae_u8)((key << 1) | (key >> 7)));
1051 //write_log ("Amiga key %02.2X %d\n", key & 0x7f, key >> 7);
1052 return;
1053 }
1054 inputdevice_add_inputcode (code, state);
1055 }
1056
inputdevice_handle_inputcode(void)1057 void inputdevice_handle_inputcode (void)
1058 {
1059 int code = inputcode_pending;
1060 int state = inputcode_pending_state;
1061 inputcode_pending = 0;
1062 if (code == 0)
1063 return;
1064 if (vpos != 0)
1065 write_log ("inputcode=%d but vpos = %d", code, vpos);
1066
1067 #ifdef ARCADIA
1068 switch (code)
1069 {
1070 case AKS_ARCADIADIAGNOSTICS:
1071 arcadia_flag &= ~1;
1072 arcadia_flag |= state ? 1 : 0;
1073 break;
1074 case AKS_ARCADIAPLY1:
1075 arcadia_flag &= ~4;
1076 arcadia_flag |= state ? 4 : 0;
1077 break;
1078 case AKS_ARCADIAPLY2:
1079 arcadia_flag &= ~2;
1080 arcadia_flag |= state ? 2 : 0;
1081 break;
1082 case AKS_ARCADIACOIN1:
1083 if (state)
1084 arcadia_coin[0]++;
1085 break;
1086 case AKS_ARCADIACOIN2:
1087 if (state)
1088 arcadia_coin[1]++;
1089 break;
1090 }
1091 #endif
1092
1093 if (!state)
1094 return;
1095 switch (code)
1096 {
1097 case AKS_ENTERGUI:
1098 gui_display (-1);
1099 break;
1100 #if 0
1101 case AKS_SCREENSHOT:
1102 screenshot(1, 1);
1103 break;
1104 #endif
1105 #ifdef ACTION_REPLAY
1106 case AKS_FREEZEBUTTON:
1107 action_replay_freeze ();
1108 break;
1109 #endif
1110 case AKS_FLOPPY0:
1111 gui_display (0);
1112 break;
1113 case AKS_FLOPPY1:
1114 gui_display (1);
1115 break;
1116 case AKS_FLOPPY2:
1117 gui_display (2);
1118 break;
1119 case AKS_FLOPPY3:
1120 gui_display (3);
1121 break;
1122 case AKS_EFLOPPY0:
1123 disk_eject (0);
1124 break;
1125 case AKS_EFLOPPY1:
1126 disk_eject (1);
1127 break;
1128 case AKS_EFLOPPY2:
1129 disk_eject (2);
1130 break;
1131 case AKS_EFLOPPY3:
1132 disk_eject (3);
1133 break;
1134 #if 0
1135 case AKS_IRQ7:
1136 Interrupt (7);
1137 break;
1138 #endif
1139 case AKS_PAUSE:
1140 pausemode (-1);
1141 break;
1142 #if 0
1143 case AKS_WARP:
1144 warpmode (-1);
1145 break;
1146 #endif
1147 case AKS_INHIBITSCREEN:
1148 toggle_inhibit_frame (IHF_SCROLLLOCK);
1149 break;
1150 #if 0
1151 case AKS_STATEREWIND:
1152 savestate_dorewind(1);
1153 break;
1154 case AKS_VOLDOWN:
1155 sound_volume (-1);
1156 break;
1157 case AKS_VOLUP:
1158 sound_volume (1);
1159 break;
1160 case AKS_VOLMUTE:
1161 sound_volume (0);
1162 break;
1163 #endif
1164 case AKS_QUIT:
1165 uae_quit ();
1166 break;
1167 case AKS_SOFTRESET:
1168 uae_reset (0);
1169 break;
1170 case AKS_HARDRESET:
1171 uae_reset (1);
1172 break;
1173 #if 0
1174 case AKS_STATESAVEQUICK:
1175 case AKS_STATESAVEQUICK1:
1176 case AKS_STATESAVEQUICK2:
1177 case AKS_STATESAVEQUICK3:
1178 case AKS_STATESAVEQUICK4:
1179 case AKS_STATESAVEQUICK5:
1180 case AKS_STATESAVEQUICK6:
1181 case AKS_STATESAVEQUICK7:
1182 case AKS_STATESAVEQUICK8:
1183 case AKS_STATESAVEQUICK9:
1184 savestate_quick ((code - AKS_STATESAVEQUICK) / 2, 1);
1185 break;
1186 case AKS_STATERESTOREQUICK:
1187 case AKS_STATERESTOREQUICK1:
1188 case AKS_STATERESTOREQUICK2:
1189 case AKS_STATERESTOREQUICK3:
1190 case AKS_STATERESTOREQUICK4:
1191 case AKS_STATERESTOREQUICK5:
1192 case AKS_STATERESTOREQUICK6:
1193 case AKS_STATERESTOREQUICK7:
1194 case AKS_STATERESTOREQUICK8:
1195 case AKS_STATERESTOREQUICK9:
1196 savestate_quick ((code - AKS_STATERESTOREQUICK) / 2, 0);
1197 break;
1198 #endif
1199 case AKS_TOGGLEFULLSCREEN:
1200 toggle_fullscreen ();
1201 break;
1202 case AKS_TOGGLEMOUSEGRAB:
1203 toggle_mousegrab ();
1204 break;
1205 case AKS_ENTERDEBUGGER:
1206 activate_debugger ();
1207 break;
1208 case AKS_STATESAVEDIALOG:
1209 gui_display (5);
1210 break;
1211 case AKS_STATERESTOREDIALOG:
1212 gui_display (4);
1213 break;
1214 #if 0
1215 case AKS_DECREASEREFRESHRATE:
1216 case AKS_INCREASEREFRESHRATE:
1217 {
1218 int dir = code == AKS_INCREASEREFRESHRATE ? 5 : -5;
1219 if (currprefs.chipset_refreshrate == 0)
1220 currprefs.chipset_refreshrate = currprefs.ntscmode ? 60 : 50;
1221 changed_prefs.chipset_refreshrate = currprefs.chipset_refreshrate + dir;
1222 if (changed_prefs.chipset_refreshrate < 10)
1223 changed_prefs.chipset_refreshrate = 10;
1224 if (changed_prefs.chipset_refreshrate > 900)
1225 changed_prefs.chipset_refreshrate = 900;
1226 }
1227 break;
1228 #endif
1229 case AKS_SWITCHINTERPOL:
1230 switch_audio_interpol ();
1231 break;
1232 }
1233 }
1234
handle_input_event(int nr,int state,int max,int autofire)1235 void handle_input_event (int nr, int state, int max, int autofire)
1236 {
1237 struct inputevent *ie;
1238 int joy;
1239
1240 if (nr <= 0)
1241 return;
1242 ie = &events[nr];
1243 //write_log ("'%s' %d %d\n", ie->name, state, max);
1244 if (autofire) {
1245 if (state)
1246 queue_input_event (nr, state, max, currprefs.input_autofire_framecnt, 1);
1247 else
1248 queue_input_event (nr, -1, 0, 0, 1);
1249 }
1250 switch (ie->unit)
1251 {
1252 case 1: /* ->JOY1 */
1253 case 2: /* ->JOY2 */
1254 case 3: /* ->Parallel port joystick adapter port #1 */
1255 case 4: /* ->Parallel port joystick adapter port #2 */
1256 joy = ie->unit - 1;
1257 if (ie->type & 4) {
1258 if (state)
1259 joybutton[joy] |= 1 << ie->data;
1260 else
1261 joybutton[joy] &= ~(1 << ie->data);
1262 } else if (ie->type & 8) {
1263 /* real mouse / analog stick mouse emulation */
1264 int delta;
1265 int deadzone = currprefs.input_joymouse_deadzone * max / 100;
1266 if (max) {
1267 if (state < deadzone && state > -deadzone) {
1268 state = 0;
1269 } else if (state < 0) {
1270 state += deadzone;
1271 } else {
1272 state -= deadzone;
1273 }
1274 max -= deadzone;
1275 delta = state * currprefs.input_joymouse_multiplier / max;
1276 } else {
1277 delta = state;
1278 }
1279 mouse_delta[joy][ie->data] += delta;
1280 } else if (ie->type & 32) {
1281 int speed = currprefs.input_joymouse_speed;
1282
1283 /* button mouse emulation */
1284 if (state && (ie->data & DIR_LEFT)) {
1285 mouse_delta[joy][0] = -speed;
1286 mouse_deltanoreset[joy][0] = 1;
1287 } else if (state && (ie->data & DIR_RIGHT)) {
1288 mouse_delta[joy][0] = speed;
1289 mouse_deltanoreset[joy][0] = 1;
1290 } else
1291 mouse_deltanoreset[joy][0] = 0;
1292
1293 if (state && (ie->data & DIR_UP)) {
1294 mouse_delta[joy][1] = -speed;
1295 mouse_deltanoreset[joy][1] = 1;
1296 } else if (state && (ie->data & DIR_DOWN)) {
1297 mouse_delta[joy][1] = speed;
1298 mouse_deltanoreset[joy][1] = 1;
1299 } else
1300 mouse_deltanoreset[joy][1] = 0;
1301
1302 } else if (ie->type & 64) { /* analog (paddle) */
1303 int deadzone = currprefs.input_joymouse_deadzone * max / 100;
1304 if (max) {
1305 if (state < deadzone && state > -deadzone) {
1306 state = 0;
1307 } else if (state < 0) {
1308 state += deadzone;
1309 } else {
1310 state -= deadzone;
1311 }
1312 state = state * max / (max - deadzone);
1313 }
1314 state = state / 256 + 128;
1315 joydirpot[joy][ie->data] = state;
1316 } else {
1317 int left = oleft[joy], right = oright[joy], top = otop[joy], bot = obot[joy];
1318 if (ie->type & 16) {
1319 /* button to axis mapping */
1320 if (ie->data & DIR_LEFT) left = oleft[joy] = state ? 1 : 0;
1321 if (ie->data & DIR_RIGHT) right = oright[joy] = state ? 1 : 0;
1322 if (ie->data & DIR_UP) top = otop[joy] = state ? 1 : 0;
1323 if (ie->data & DIR_DOWN) bot = obot[joy] = state ? 1 : 0;
1324 } else {
1325 /* "normal" joystick axis */
1326 int deadzone = currprefs.input_joystick_deadzone * max / 100;
1327 int neg, pos;
1328 if (state < deadzone && state > -deadzone)
1329 state = 0;
1330 neg = state < 0 ? 1 : 0;
1331 pos = state > 0 ? 1 : 0;
1332 if (ie->data & DIR_LEFT) left = oleft[joy] = neg;
1333 if (ie->data & DIR_RIGHT) right = oright[joy] = pos;
1334 if (ie->data & DIR_UP) top = otop[joy] = neg;
1335 if (ie->data & DIR_DOWN) bot = obot[joy] = pos;
1336 }
1337 joydir[joy] = 0;
1338 if (left) joydir[joy] |= DIR_LEFT;
1339 if (right) joydir[joy] |= DIR_RIGHT;
1340 if (top) joydir[joy] |= DIR_UP;
1341 if (bot) joydir[joy] |= DIR_DOWN;
1342 }
1343 break;
1344 case 0: /* ->KEY */
1345 inputdevice_do_keyboard (ie->data, state);
1346 break;
1347 }
1348 }
1349
inputdevice_vsync(void)1350 void inputdevice_vsync (void)
1351 {
1352 struct input_queue_struct *iq;
1353 int i;
1354
1355 for (i = 0; i < INPUT_QUEUE_SIZE; i++) {
1356 iq = &input_queue[i];
1357 if (iq->framecnt > 0) {
1358 iq->framecnt--;
1359 if (iq->framecnt == 0) {
1360 if (iq->state) iq->state = 0; else iq->state = iq->storedstate;
1361 handle_input_event (iq->event, iq->state, iq->max, 0);
1362 iq->framecnt = iq->nextframecnt;
1363 }
1364 }
1365 }
1366 mouseupdate (100);
1367 inputdelay = rand () % (maxvpos - 1);
1368 idev[IDTYPE_MOUSE].read ();
1369 input_read = 1;
1370 input_vpos = 0;
1371 inputdevice_handle_inputcode ();
1372 if (ievent_alive > 0)
1373 ievent_alive--;
1374 #ifdef ARCADIA
1375 if (arcadia_rom)
1376 arcadia_vsync ();
1377 #endif
1378 }
1379
inputdevice_reset(void)1380 void inputdevice_reset (void)
1381 {
1382 ievent_alive = 0;
1383 }
1384
setbuttonstateall(struct uae_input_device * id,struct uae_input_device2 * id2,int button,int state)1385 static void setbuttonstateall (struct uae_input_device *id, struct uae_input_device2 *id2, int button, int state)
1386 {
1387 int event, autofire, i;
1388 uae_u32 mask = 1 << button;
1389 uae_u32 omask = id2->buttonmask & mask;
1390 uae_u32 nmask = (state ? 1 : 0) << button;
1391 char *custom;
1392
1393 if (button >= ID_BUTTON_TOTAL)
1394 return;
1395 for (i = 0; i < MAX_INPUT_SUB_EVENT; i++) {
1396 struct inputevent *ie;
1397
1398 event = id->eventid[ID_BUTTON_OFFSET + button][sublevdir[state <= 0 ? 1 : 0][i]];
1399 custom = id->custom[ID_BUTTON_OFFSET + button][sublevdir[state <= 0 ? 1 : 0][i]];
1400 if (event <= 0 && custom == NULL)
1401 continue;
1402 autofire = (id->flags[ID_BUTTON_OFFSET + button][sublevdir[state <= 0 ? 1 : 0][i]] & ID_FLAG_AUTOFIRE) ? 1 : 0;
1403 ie = events + event;
1404 if (ie->allow_mask & AM_AUTO)
1405 autofire = 1;
1406 if (state < 0) {
1407 handle_input_event (event, 1, 1, 0);
1408 queue_input_event (event, 0, 1, 1, 0); /* send release event next frame */
1409 } else {
1410 if ((omask ^ nmask) & mask)
1411 handle_input_event (event, state, 1, autofire);
1412 }
1413 }
1414 if ((omask ^ nmask) & mask) {
1415 if (state)
1416 id2->buttonmask |= mask;
1417 else
1418 id2->buttonmask &= ~mask;
1419 }
1420 }
1421
1422
1423 /* - detect required number of joysticks and mice from configuration data
1424 * - detect if CD32 pad emulation is needed
1425 * - detect device type in ports (mouse or joystick)
1426 */
1427
iscd32(int ei)1428 static int iscd32 (int ei)
1429 {
1430 if (ei >= INPUTEVENT_JOY1_CD32_FIRST && ei <= INPUTEVENT_JOY1_CD32_LAST) {
1431 cd32_pad_enabled[0] = 1;
1432 return 1;
1433 }
1434 if (ei >= INPUTEVENT_JOY2_CD32_FIRST && ei <= INPUTEVENT_JOY2_CD32_LAST) {
1435 cd32_pad_enabled[1] = 1;
1436 return 2;
1437 }
1438 return 0;
1439 }
1440
isparport(int ei)1441 static int isparport (int ei)
1442 {
1443 if (ei > INPUTEVENT_PAR_JOY1_START && ei < INPUTEVENT_PAR_JOY_END) {
1444 parport_joystick_enabled = 1;
1445 return 1;
1446 }
1447 return 0;
1448 }
1449
ismouse(int ei)1450 static int ismouse (int ei)
1451 {
1452 if (ei >= INPUTEVENT_MOUSE1_FIRST && ei <= INPUTEVENT_MOUSE1_LAST) {
1453 mouse_port[0] = 1;
1454 return 1;
1455 }
1456 if (ei >= INPUTEVENT_MOUSE2_FIRST && ei <= INPUTEVENT_MOUSE2_LAST) {
1457 mouse_port[1] = 1;
1458 return 2;
1459 }
1460 return 0;
1461 }
1462
1463 #ifdef CD32
1464 extern int cd32_enabled;
1465 #endif
1466
scanevents(struct uae_prefs * p)1467 static void scanevents (struct uae_prefs *p)
1468 {
1469 int i, j, k, ei;
1470 struct inputevent *e;
1471 int n_joy = idev[IDTYPE_JOYSTICK].get_num();
1472 int n_mouse = idev[IDTYPE_MOUSE].get_num();
1473
1474 cd32_pad_enabled[0] = cd32_pad_enabled[1] = 0;
1475 parport_joystick_enabled = 0;
1476 mouse_port[0] = mouse_port[1] = 0;
1477 for (i = 0; i < MAX_INPUT_DEVICE_EVENTS; i++)
1478 joydir[i] = 0;
1479
1480 for (i = 0; i < MAX_INPUT_DEVICES; i++) {
1481 use_joysticks[i] = 0;
1482 use_mice[i] = 0;
1483 for (k = 0; k < MAX_INPUT_SUB_EVENT; k++) {
1484 for (j = 0; j < ID_BUTTON_TOTAL; j++) {
1485
1486 if (joysticks[i].enabled && i < n_joy) {
1487 ei = joysticks[i].eventid[ID_BUTTON_OFFSET + j][k];
1488 e = &events[ei];
1489 iscd32 (ei);
1490 isparport (ei);
1491 ismouse (ei);
1492 if (joysticks[i].eventid[ID_BUTTON_OFFSET + j][k] > 0)
1493 use_joysticks[i] = 1;
1494 }
1495 if (mice[i].enabled && i < n_mouse) {
1496 ei = mice[i].eventid[ID_BUTTON_OFFSET + j][k];
1497 e = &events[ei];
1498 iscd32 (ei);
1499 isparport (ei);
1500 ismouse (ei);
1501 if (mice[i].eventid[ID_BUTTON_OFFSET + j][k] > 0)
1502 use_mice[i] = 1;
1503 }
1504
1505 }
1506
1507 for (j = 0; j < ID_AXIS_TOTAL; j++) {
1508
1509 if (joysticks[i].enabled && i < n_joy) {
1510 ei = joysticks[i].eventid[ID_AXIS_OFFSET + j][k];
1511 iscd32 (ei);
1512 isparport (ei);
1513 ismouse (ei);
1514 if (ei > 0)
1515 use_joysticks[i] = 1;
1516 }
1517 if (mice[i].enabled && i < n_mouse) {
1518 ei = mice[i].eventid[ID_AXIS_OFFSET + j][k];
1519 iscd32 (ei);
1520 isparport (ei);
1521 ismouse (ei);
1522 if (ei > 0)
1523 use_mice[i] = 1;
1524 }
1525 }
1526 }
1527 }
1528 for (i = 0; i < MAX_INPUT_DEVICES; i++) {
1529 use_keyboards[i] = 0;
1530 if (keyboards[i].enabled && i < idev[IDTYPE_KEYBOARD].get_num()) {
1531 j = 0;
1532 while (keyboards[i].extra[j][0] >= 0) {
1533 use_keyboards[i] = 1;
1534 for (k = 0; k < MAX_INPUT_SUB_EVENT; k++) {
1535 ei = keyboards[i].eventid[j][k];
1536 iscd32 (ei);
1537 isparport (ei);
1538 ismouse (ei);
1539 }
1540 j++;
1541 }
1542 }
1543 }
1544 }
1545
1546 #ifdef CD32
setcd32(int joy,int n)1547 static void setcd32 (int joy, int n)
1548 {
1549 joysticks[joy].eventid[ID_BUTTON_OFFSET + 0][0] = n ? INPUTEVENT_JOY2_CD32_RED : INPUTEVENT_JOY1_CD32_RED;
1550 joysticks[joy].eventid[ID_BUTTON_OFFSET + 1][0] = n ? INPUTEVENT_JOY2_CD32_BLUE : INPUTEVENT_JOY1_CD32_BLUE;
1551 joysticks[joy].eventid[ID_BUTTON_OFFSET + 2][0] = n ? INPUTEVENT_JOY2_CD32_YELLOW : INPUTEVENT_JOY1_CD32_YELLOW;
1552 joysticks[joy].eventid[ID_BUTTON_OFFSET + 3][0] = n ? INPUTEVENT_JOY2_CD32_GREEN : INPUTEVENT_JOY1_CD32_GREEN;
1553 joysticks[joy].eventid[ID_BUTTON_OFFSET + 4][0] = n ? INPUTEVENT_JOY2_CD32_FFW : INPUTEVENT_JOY1_CD32_FFW;
1554 joysticks[joy].eventid[ID_BUTTON_OFFSET + 5][0] = n ? INPUTEVENT_JOY2_CD32_RWD : INPUTEVENT_JOY1_CD32_RWD;
1555 joysticks[joy].eventid[ID_BUTTON_OFFSET + 6][0] = n ? INPUTEVENT_JOY2_CD32_PLAY : INPUTEVENT_JOY1_CD32_PLAY;
1556 }
1557 #endif
1558
1559 int compatibility_device[2];
compatibility_mode(struct uae_prefs * prefs)1560 static void compatibility_mode (struct uae_prefs *prefs)
1561 {
1562 int joy, i;
1563 int used[4] = { 0, 0, 0, 0};
1564
1565 compatibility_device[0] = -1;
1566 compatibility_device[1] = -1;
1567 for (i = 0; i < MAX_INPUT_DEVICES; i++) {
1568 memset (&mice[i], 0, sizeof (*mice));
1569 memset (&joysticks[i], 0, sizeof (*joysticks));
1570 }
1571
1572 if ((joy = jsem_ismouse (0, prefs)) >= 0) {
1573 mice[joy].eventid[ID_AXIS_OFFSET + 0][0] = INPUTEVENT_MOUSE1_HORIZ;
1574 mice[joy].eventid[ID_AXIS_OFFSET + 1][0] = INPUTEVENT_MOUSE1_VERT;
1575 mice[joy].eventid[ID_AXIS_OFFSET + 2][0] = INPUTEVENT_MOUSE1_WHEEL;
1576 mice[joy].eventid[ID_BUTTON_OFFSET + 0][0] = INPUTEVENT_JOY1_FIRE_BUTTON;
1577 mice[joy].eventid[ID_BUTTON_OFFSET + 1][0] = INPUTEVENT_JOY1_2ND_BUTTON;
1578 mice[joy].eventid[ID_BUTTON_OFFSET + 2][0] = INPUTEVENT_JOY1_3RD_BUTTON;
1579 mice[joy].eventid[ID_BUTTON_OFFSET + 3][0] = INPUTEVENT_KEY_ALT_LEFT;
1580 mice[joy].eventid[ID_BUTTON_OFFSET + 3][1] = INPUTEVENT_KEY_CURSOR_LEFT;
1581 mice[joy].eventid[ID_BUTTON_OFFSET + 4][0] = INPUTEVENT_KEY_ALT_LEFT;
1582 mice[joy].eventid[ID_BUTTON_OFFSET + 4][1] = INPUTEVENT_KEY_CURSOR_RIGHT;
1583 mice[joy].enabled = 1;
1584 }
1585 if ((joy = jsem_ismouse (1, prefs)) >= 0) {
1586 mice[joy].eventid[ID_AXIS_OFFSET + 0][0] = INPUTEVENT_MOUSE2_HORIZ;
1587 mice[joy].eventid[ID_AXIS_OFFSET + 1][0] = INPUTEVENT_MOUSE2_VERT;
1588 mice[joy].eventid[ID_BUTTON_OFFSET + 0][0] = INPUTEVENT_JOY2_FIRE_BUTTON;
1589 mice[joy].eventid[ID_BUTTON_OFFSET + 1][0] = INPUTEVENT_JOY2_2ND_BUTTON;
1590 mice[joy].eventid[ID_BUTTON_OFFSET + 2][0] = INPUTEVENT_JOY2_3RD_BUTTON;
1591 mice[joy].enabled = 1;
1592 }
1593
1594 joy = jsem_isjoy (1, prefs);
1595 if (joy >= 0) {
1596 joysticks[joy].eventid[ID_AXIS_OFFSET + 0][0] = INPUTEVENT_JOY2_HORIZ;
1597 joysticks[joy].eventid[ID_AXIS_OFFSET + 1][0] = INPUTEVENT_JOY2_VERT;
1598 used[joy] = 1;
1599 joysticks[joy].eventid[ID_BUTTON_OFFSET + 0][0] = INPUTEVENT_JOY2_FIRE_BUTTON;
1600 joysticks[joy].eventid[ID_BUTTON_OFFSET + 1][0] = INPUTEVENT_JOY2_2ND_BUTTON;
1601 joysticks[joy].eventid[ID_BUTTON_OFFSET + 2][0] = INPUTEVENT_JOY2_FIRE_BUTTON_AF;
1602 #ifdef CD32
1603 if (cd32_enabled)
1604 setcd32 (joy, 1);
1605 #endif
1606 joysticks[joy].enabled = 1;
1607 }
1608
1609 joy = jsem_isjoy (0, prefs);
1610 if (joy >= 0) {
1611 used[joy] = 1;
1612 joysticks[joy].eventid[ID_AXIS_OFFSET + 0][0] = INPUTEVENT_JOY1_HORIZ;
1613 joysticks[joy].eventid[ID_AXIS_OFFSET + 1][0] = INPUTEVENT_JOY1_VERT;
1614 joysticks[joy].eventid[ID_BUTTON_OFFSET + 0][0] = INPUTEVENT_JOY1_FIRE_BUTTON;
1615 joysticks[joy].eventid[ID_BUTTON_OFFSET + 1][0] = INPUTEVENT_JOY1_2ND_BUTTON;
1616 joysticks[joy].eventid[ID_BUTTON_OFFSET + 2][0] = INPUTEVENT_JOY1_FIRE_BUTTON_AF;
1617 joysticks[joy].enabled = 1;
1618 }
1619
1620 for (joy = 0; used[joy]; joy++);
1621 if (JSEM_ISANYKBD (0, prefs)) {
1622 joysticks[joy].eventid[ID_AXIS_OFFSET + 0][0] = INPUTEVENT_JOY1_HORIZ;
1623 joysticks[joy].eventid[ID_AXIS_OFFSET + 1][0] = INPUTEVENT_JOY1_VERT;
1624 joysticks[joy].eventid[ID_BUTTON_OFFSET + 0][0] = INPUTEVENT_JOY1_FIRE_BUTTON;
1625 joysticks[joy].eventid[ID_BUTTON_OFFSET + 1][0] = INPUTEVENT_JOY1_2ND_BUTTON;
1626 joysticks[joy].eventid[ID_BUTTON_OFFSET + 2][0] = INPUTEVENT_JOY1_3RD_BUTTON;
1627 joysticks[joy].enabled = 1;
1628 used[joy] = 1;
1629 compatibility_device[0] = joy;
1630 }
1631 for (joy = 0; used[joy]; joy++);
1632 if (JSEM_ISANYKBD (1, prefs)) {
1633 joysticks[joy].eventid[ID_AXIS_OFFSET + 0][0] = INPUTEVENT_JOY2_HORIZ;
1634 joysticks[joy].eventid[ID_AXIS_OFFSET + 1][0] = INPUTEVENT_JOY2_VERT;
1635 joysticks[joy].eventid[ID_BUTTON_OFFSET + 0][0] = INPUTEVENT_JOY2_FIRE_BUTTON;
1636 joysticks[joy].eventid[ID_BUTTON_OFFSET + 1][0] = INPUTEVENT_JOY2_2ND_BUTTON;
1637 joysticks[joy].eventid[ID_BUTTON_OFFSET + 2][0] = INPUTEVENT_JOY2_3RD_BUTTON;
1638 #ifdef CD32
1639 if (cd32_enabled)
1640 setcd32 (joy, 1);
1641 #endif
1642 joysticks[joy].enabled = 1;
1643 used[joy] = 1;
1644 compatibility_device[1] = joy;
1645 }
1646 }
1647
inputdevice_updateconfig(struct uae_prefs * prefs)1648 void inputdevice_updateconfig (struct uae_prefs *prefs)
1649 {
1650 int i;
1651
1652 if (currprefs.jport0 != changed_prefs.jport0
1653 || currprefs.jport1 != changed_prefs.jport1) {
1654 currprefs.jport0 = changed_prefs.jport0;
1655 currprefs.jport1 = changed_prefs.jport1;
1656 }
1657 joybutton[0] = joybutton[1] = 0;
1658 joydir[0] = joydir[1] = 0;
1659 oldmx[0] = oldmx[1] = -1;
1660 oldmy[0] = oldmy[1] = -1;
1661 cd32_shifter[0] = cd32_shifter[1] = 8;
1662 oleft[0] = oleft[1] = 0;
1663 oright[0] = oright[1] = 0;
1664 otop[0] = otop[1] = 0;
1665 obot[0] = obot[1] = 0;
1666 for (i = 0; i < 2; i++) {
1667 mouse_deltanoreset[i][0] = 0;
1668 mouse_delta[i][0] = 0;
1669 mouse_deltanoreset[i][1] = 0;
1670 mouse_delta[i][1] = 0;
1671 mouse_deltanoreset[i][2] = 0;
1672 mouse_delta[i][2] = 0;
1673 }
1674 memset (keybuf, 0, sizeof (keybuf));
1675
1676 for (i = 0; i < INPUT_QUEUE_SIZE; i++)
1677 input_queue[i].framecnt = input_queue[i].nextframecnt = -1;
1678
1679 for (i = 0; i < MAX_INPUT_SUB_EVENT; i++) {
1680 sublevdir[0][i] = i;
1681 sublevdir[1][i] = MAX_INPUT_SUB_EVENT - i - 1;
1682 }
1683
1684 joysticks = prefs->joystick_settings[prefs->input_selected_setting];
1685 mice = prefs->mouse_settings[prefs->input_selected_setting];
1686 keyboards = prefs->keyboard_settings[prefs->input_selected_setting];
1687
1688 memset (joysticks2, 0, sizeof (joysticks2));
1689 memset (mice2, 0, sizeof (mice2));
1690 if (prefs->input_selected_setting == 0)
1691 compatibility_mode (prefs);
1692
1693 joystick_setting_changed ();
1694
1695 scanevents (prefs);
1696
1697 #ifdef CD32
1698 if (currprefs.input_selected_setting == 0 && cd32_enabled)
1699 cd32_pad_enabled[1] = 1;
1700 #endif
1701 }
1702
set_kbr_default(struct uae_prefs * p,int index,int num)1703 static void set_kbr_default (struct uae_prefs *p, int index, int num)
1704 {
1705 int i, j, k, l;
1706 struct uae_input_device_kbr_default *trans = keyboard_default;
1707 struct uae_input_device *kbr;
1708 struct inputdevice_functions *id = &idev[IDTYPE_KEYBOARD];
1709 uae_u32 scancode;
1710
1711 if (!trans)
1712 return;
1713 for (j = 0; j < MAX_INPUT_DEVICES; j++) {
1714 kbr = &p->keyboard_settings[index][j];
1715 for (i = 0; i < MAX_INPUT_DEVICE_EVENTS; i++) {
1716 memset (kbr, 0, sizeof (struct uae_input_device));
1717 kbr->extra[i][0] = -1;
1718 }
1719 if (j < id->get_num ()) {
1720 if (j == 0)
1721 kbr->enabled = 1;
1722 for (i = 0; i < id->get_widget_num (num); i++) {
1723 id->get_widget_type (num, i, 0, &scancode);
1724 kbr->extra[i][0] = scancode;
1725 l = 0;
1726 while (trans[l].scancode >= 0) {
1727 if (kbr->extra[i][0] == trans[l].scancode) {
1728 for (k = 0; k < MAX_INPUT_SUB_EVENT; k++) {
1729 if (kbr->eventid[i][k] == 0) break;
1730 }
1731 if (k == MAX_INPUT_SUB_EVENT) {
1732 write_log ("corrupt default keyboard mappings\n");
1733 return;
1734 }
1735 kbr->eventid[i][k] = trans[l].event;
1736 break;
1737 }
1738 l++;
1739 }
1740 }
1741 }
1742 }
1743 }
1744
inputdevice_default_prefs(struct uae_prefs * p)1745 void inputdevice_default_prefs (struct uae_prefs *p)
1746 {
1747 int i;
1748
1749 inputdevice_init ();
1750 p->input_joymouse_multiplier = 20;
1751 p->input_joymouse_deadzone = 33;
1752 p->input_joystick_deadzone = 33;
1753 p->input_joymouse_speed = 10;
1754 p->input_mouse_speed = 100;
1755 p->input_autofire_framecnt = 10;
1756 for (i = 0; i <= MAX_INPUT_SETTINGS; i++) {
1757 set_kbr_default (p, i, 0);
1758 input_get_default_mouse (p->mouse_settings[i]);
1759 input_get_default_joystick (p->joystick_settings[i]);
1760 }
1761 }
1762
inputdevice_setkeytranslation(struct uae_input_device_kbr_default * trans)1763 void inputdevice_setkeytranslation (struct uae_input_device_kbr_default *trans)
1764 {
1765 keyboard_default = trans;
1766 }
1767
inputdevice_translatekeycode(int keyboard,int scancode,int state)1768 int inputdevice_translatekeycode (int keyboard, int scancode, int state)
1769 {
1770 struct uae_input_device *na = &keyboards[keyboard];
1771 int j, k;
1772
1773 if (!keyboards || scancode < 0)
1774 return 0;
1775 j = 0;
1776 while (na->extra[j][0] >= 0) {
1777 if (na->extra[j][0] == scancode) {
1778 for (k = 0; k < MAX_INPUT_SUB_EVENT; k++) {/* send key release events in reverse order */
1779 int autofire = (na->flags[j][sublevdir[state == 0 ? 1 : 0][k]] & ID_FLAG_AUTOFIRE) ? 1 : 0;
1780 int event = na->eventid[j][sublevdir[state == 0 ? 1 : 0][k]];
1781 char *custom = na->custom[j][sublevdir[state == 0 ? 1 : 0][k]];
1782 handle_input_event (event, state, 1, autofire);
1783 //write_log ("'%s' %d ('%s') %d\n", na->name, event, events[event].name, state);
1784 }
1785 return 1;
1786 }
1787 j++;
1788 }
1789 return 0;
1790 }
1791
inputdevice_init(void)1792 void inputdevice_init (void)
1793 {
1794 idev[IDTYPE_JOYSTICK] = inputdevicefunc_joystick;
1795 idev[IDTYPE_JOYSTICK].init ();
1796 idev[IDTYPE_MOUSE] = inputdevicefunc_mouse;
1797 idev[IDTYPE_MOUSE].init ();
1798 idev[IDTYPE_KEYBOARD] = inputdevicefunc_keyboard;
1799 idev[IDTYPE_KEYBOARD].init ();
1800 }
1801
inputdevice_close(void)1802 void inputdevice_close (void)
1803 {
1804 idev[IDTYPE_JOYSTICK].close ();
1805 idev[IDTYPE_MOUSE].close ();
1806 idev[IDTYPE_KEYBOARD].close ();
1807 }
1808
get_uid(struct inputdevice_functions * id,int devnum)1809 static struct uae_input_device *get_uid (struct inputdevice_functions *id, int devnum)
1810 {
1811 struct uae_input_device *uid = 0;
1812 if (id == &idev[IDTYPE_JOYSTICK]) {
1813 uid = &joysticks[devnum];
1814 } else if (id == &idev[IDTYPE_MOUSE]) {
1815 uid = &mice[devnum];
1816 } else if (id == &idev[IDTYPE_KEYBOARD]) {
1817 uid = &keyboards[devnum];
1818 }
1819 return uid;
1820 }
1821
get_event_data(struct inputdevice_functions * id,int devnum,int num,int * eventid,char ** custom,int * flags,int sub)1822 static int get_event_data (struct inputdevice_functions *id, int devnum, int num, int *eventid, char **custom, int *flags, int sub)
1823 {
1824 struct uae_input_device *uid = get_uid (id, devnum);
1825 int type = id->get_widget_type (devnum, num, 0, 0);
1826 int i;
1827 if (type == IDEV_WIDGET_BUTTON) {
1828 i = num - id->get_widget_first (devnum, type) + ID_BUTTON_OFFSET;
1829 *eventid = uid->eventid[i][sub];
1830 *flags = uid->flags[i][sub];
1831 *custom = uid->custom[i][sub];
1832 return i;
1833 } else if (type == IDEV_WIDGET_AXIS) {
1834 i = num - id->get_widget_first (devnum, type) + ID_AXIS_OFFSET;
1835 *eventid = uid->eventid[i][sub];
1836 *flags = uid->flags[i][sub];
1837 *custom = uid->custom[i][sub];
1838 return i;
1839 } else if (type == IDEV_WIDGET_KEY) {
1840 i = num - id->get_widget_first (devnum, type);
1841 *eventid = uid->eventid[i][sub];
1842 *flags = uid->flags[i][sub];
1843 *custom = uid->custom[i][sub];
1844 return i;
1845 }
1846 return -1;
1847 }
1848
put_event_data(struct inputdevice_functions * id,int devnum,int num,int eventid,char * custom,int flags,int sub)1849 static int put_event_data (struct inputdevice_functions *id, int devnum, int num, int eventid, char *custom, int flags, int sub)
1850 {
1851 struct uae_input_device *uid = get_uid (id, devnum);
1852 int type = id->get_widget_type (devnum, num, 0, 0);
1853 int i;
1854 if (type == IDEV_WIDGET_BUTTON) {
1855 i = num - id->get_widget_first (devnum, type) + ID_BUTTON_OFFSET;
1856 uid->eventid[i][sub] = eventid;
1857 uid->flags[i][sub] = flags;
1858 free (uid->custom[i][sub]);
1859 uid->custom[i][sub] = custom ? my_strdup (custom) : NULL;
1860 return i;
1861 } else if (type == IDEV_WIDGET_AXIS) {
1862 i = num - id->get_widget_first (devnum, type) + ID_AXIS_OFFSET;
1863 uid->eventid[i][sub] = eventid;
1864 uid->flags[i][sub] = flags;
1865 free (uid->custom[i][sub]);
1866 uid->custom[i][sub] = custom ? my_strdup (custom) : NULL;
1867 return i;
1868 } else if (type == IDEV_WIDGET_KEY) {
1869 i = num - id->get_widget_first (devnum, type);
1870 uid->eventid[i][sub] = eventid;
1871 uid->flags[i][sub] = flags;
1872 free (uid->custom[i][sub]);
1873 uid->custom[i][sub] = custom ? my_strdup (custom) : NULL;
1874 return i;
1875 }
1876 return -1;
1877 }
1878
is_event_used(struct inputdevice_functions * id,int devnum,int isnum,int isevent)1879 static int is_event_used (struct inputdevice_functions *id, int devnum, int isnum, int isevent)
1880 {
1881 struct uae_input_device *uid = get_uid (id, devnum);
1882 int num, event, flag, sub;
1883 char *custom;
1884
1885 for (num = 0; num < id->get_widget_num (devnum); num++) {
1886 for (sub = 0; sub < MAX_INPUT_SUB_EVENT; sub++) {
1887 if (get_event_data (id, devnum, num, &event, &custom, &flag, sub) >= 0) {
1888 if (event == isevent && isnum != num)
1889 return 1;
1890 }
1891 }
1892 }
1893 return 0;
1894 }
1895
inputdevice_get_device_index(int devnum)1896 int inputdevice_get_device_index (int devnum)
1897 {
1898 if (devnum < idev[IDTYPE_JOYSTICK].get_num())
1899 return devnum;
1900 else if (devnum < idev[IDTYPE_JOYSTICK].get_num() + idev[IDTYPE_MOUSE].get_num())
1901 return devnum - idev[IDTYPE_JOYSTICK].get_num();
1902 else if (devnum < idev[IDTYPE_JOYSTICK].get_num() + idev[IDTYPE_MOUSE].get_num() + idev[IDTYPE_KEYBOARD].get_num())
1903 return devnum - idev[IDTYPE_JOYSTICK].get_num() - idev[IDTYPE_MOUSE].get_num();
1904 else
1905 return -1;
1906 }
1907
gettype(int devnum)1908 static int gettype (int devnum)
1909 {
1910 if (devnum < idev[IDTYPE_JOYSTICK].get_num())
1911 return IDTYPE_JOYSTICK;
1912 else if (devnum < idev[IDTYPE_JOYSTICK].get_num() + idev[IDTYPE_MOUSE].get_num())
1913 return IDTYPE_MOUSE;
1914 else if (devnum < idev[IDTYPE_JOYSTICK].get_num() + idev[IDTYPE_MOUSE].get_num() + idev[IDTYPE_KEYBOARD].get_num())
1915 return IDTYPE_KEYBOARD;
1916 else
1917 return -1;
1918 }
1919
getidf(int devnum)1920 static struct inputdevice_functions *getidf (int devnum)
1921 {
1922 return &idev[gettype (devnum)];
1923 }
1924
1925
1926 /* returns number of devices of type "type" */
inputdevice_get_device_total(int type)1927 int inputdevice_get_device_total (int type)
1928 {
1929 return idev[type].get_num ();
1930 }
1931 /* returns the name of device */
inputdevice_get_device_name(int type,int devnum)1932 char *inputdevice_get_device_name (int type, int devnum)
1933 {
1934 return idev[type].get_name (devnum);
1935 }
1936 /* returns state (enabled/disabled) */
inputdevice_get_device_status(int devnum)1937 int inputdevice_get_device_status (int devnum)
1938 {
1939 struct inputdevice_functions *idf = getidf (devnum);
1940 struct uae_input_device *uid = get_uid (idf, inputdevice_get_device_index (devnum));
1941 return uid->enabled;
1942 }
1943
1944 /* set state (enabled/disabled) */
inputdevice_set_device_status(int devnum,int enabled)1945 void inputdevice_set_device_status (int devnum, int enabled)
1946 {
1947 struct inputdevice_functions *idf = getidf (devnum);
1948 struct uae_input_device *uid = get_uid (idf, inputdevice_get_device_index (devnum));
1949 uid->enabled = enabled;
1950 }
1951
1952 /* returns number of axis/buttons and keys from selected device */
inputdevice_get_widget_num(int devnum)1953 int inputdevice_get_widget_num (int devnum)
1954 {
1955 struct inputdevice_functions *idf = getidf (devnum);
1956 return idf->get_widget_num (inputdevice_get_device_index (devnum));
1957 }
1958
get_ename(struct inputevent * ie,char * out)1959 static void get_ename (struct inputevent *ie, char *out)
1960 {
1961 if (!out)
1962 return;
1963 if (ie->allow_mask == AM_K)
1964 sprintf (out, "%s (0x%02.2X)", ie->name, ie->data);
1965 else
1966 strcpy (out, ie->name);
1967 }
1968
inputdevice_iterate(int devnum,int num,char * name,int * af)1969 int inputdevice_iterate (int devnum, int num, char *name, int *af)
1970 {
1971 struct inputdevice_functions *idf = getidf (devnum);
1972 static int id_iterator;
1973 struct inputevent *ie;
1974 int mask, data, flags, type;
1975 int devindex = inputdevice_get_device_index (devnum);
1976 char *custom;
1977
1978 *af = 0;
1979 *name = 0;
1980 for (;;) {
1981 ie = &events[++id_iterator];
1982 if (!ie->confname) {
1983 id_iterator = 0;
1984 return 0;
1985 }
1986 mask = 0;
1987 type = idf->get_widget_type (devindex, num, 0, 0);
1988 if (type == IDEV_WIDGET_BUTTON) {
1989 if (idf == &idev[IDTYPE_JOYSTICK]) {
1990 mask |= AM_JOY_BUT;
1991 } else {
1992 mask |= AM_MOUSE_BUT;
1993 }
1994 } else if (type == IDEV_WIDGET_AXIS) {
1995 if (idf == &idev[IDTYPE_JOYSTICK]) {
1996 mask |= AM_JOY_AXIS;
1997 } else {
1998 mask |= AM_MOUSE_AXIS;
1999 }
2000 } else if (type == IDEV_WIDGET_KEY) {
2001 mask |= AM_K;
2002 }
2003 if (ie->allow_mask & AM_INFO) {
2004 struct inputevent *ie2 = ie + 1;
2005 while (!(ie2->allow_mask & AM_INFO)) {
2006 if (is_event_used (idf, devindex, ie2 - ie, -1)) {
2007 ie2++;
2008 continue;
2009 }
2010 if (ie2->allow_mask & mask) break;
2011 ie2++;
2012 }
2013 if (!(ie2->allow_mask & AM_INFO))
2014 mask |= AM_INFO;
2015 }
2016 if (!(ie->allow_mask & mask))
2017 continue;
2018 get_event_data (idf, devindex, num, &data, &custom, &flags, 0);
2019 get_ename (ie, name);
2020 *af = (flags & ID_FLAG_AUTOFIRE) ? 1 : 0;
2021 return 1;
2022 }
2023 }
2024
inputdevice_get_mapped_name(int devnum,int num,int * pflags,char * name,char * custom,int sub)2025 int inputdevice_get_mapped_name (int devnum, int num, int *pflags, char *name, char *custom, int sub)
2026 {
2027 struct inputdevice_functions *idf = getidf (devnum);
2028 struct uae_input_device *uid = get_uid (idf, inputdevice_get_device_index (devnum));
2029 int flags = 0, flag, data;
2030 int devindex = inputdevice_get_device_index (devnum);
2031 char *customp = NULL;
2032
2033 if (name)
2034 strcpy (name, "<none>");
2035 if (custom)
2036 custom[0] = 0;
2037 if (pflags)
2038 *pflags = 0;
2039 if (uid == 0 || num < 0)
2040 return 0;
2041 if (get_event_data (idf, devindex, num, &data, &customp, &flag, sub) < 0)
2042 return 0;
2043 if (customp && custom)
2044 sprintf (custom, "\"%s\"", customp);
2045 if (flag & ID_FLAG_AUTOFIRE)
2046 flags |= IDEV_MAPPED_AUTOFIRE_SET;
2047 if (!data)
2048 return 0;
2049 if (events[data].allow_mask & AM_AF)
2050 flags |= IDEV_MAPPED_AUTOFIRE_POSSIBLE;
2051 if (pflags)
2052 *pflags = flags;
2053 get_ename (&events[data], name);
2054 return data;
2055 }
2056
inputdevice_set_mapping(int devnum,int num,char * name,char * custom,int af,int sub)2057 int inputdevice_set_mapping (int devnum, int num, char *name, char *custom, int af, int sub)
2058 {
2059 struct inputdevice_functions *idf = getidf (devnum);
2060 struct uae_input_device *uid = get_uid (idf, inputdevice_get_device_index (devnum));
2061 int eid, data, flag, amask;
2062 char ename[256];
2063 int devindex = inputdevice_get_device_index (devnum);
2064
2065 if (uid == 0 || num < 0)
2066 return 0;
2067 if (name) {
2068 eid = 1;
2069 while (events[eid].name) {
2070 get_ename (&events[eid], ename);
2071 if (!strcmp(ename, name)) break;
2072 eid++;
2073 }
2074 if (!events[eid].name)
2075 return 0;
2076 if (events[eid].allow_mask & AM_INFO)
2077 return 0;
2078 } else {
2079 eid = 0;
2080 }
2081 if (get_event_data (idf, devindex, num, &data, &custom, &flag, sub) < 0)
2082 return 0;
2083 if (data >= 0) {
2084 amask = events[eid].allow_mask;
2085 flag &= ~ID_FLAG_AUTOFIRE;
2086 if (amask & AM_AF)
2087 flag |= af ? ID_FLAG_AUTOFIRE : 0;
2088 put_event_data (idf, devindex, num, eid, custom, flag, sub);
2089 return 1;
2090 }
2091 return 0;
2092 }
2093
inputdevice_get_widget_type(int devnum,int num,char * name)2094 int inputdevice_get_widget_type (int devnum, int num, char *name)
2095 {
2096 struct inputdevice_functions *idf = getidf (devnum);
2097 return idf->get_widget_type (inputdevice_get_device_index (devnum), num, name, 0);
2098 }
2099
2100 static int config_change;
2101
inputdevice_config_change(void)2102 void inputdevice_config_change (void)
2103 {
2104 config_change = 1;
2105 }
2106
inputdevice_config_change_test(void)2107 int inputdevice_config_change_test (void)
2108 {
2109 int v = config_change;
2110 config_change = 0;
2111 return v;
2112 }
2113
inputdevice_copyconfig(struct uae_prefs * src,struct uae_prefs * dst)2114 void inputdevice_copyconfig (struct uae_prefs *src, struct uae_prefs *dst)
2115 {
2116 int i, j;
2117
2118 dst->input_selected_setting = src->input_selected_setting;
2119 dst->input_joymouse_multiplier = src->input_joymouse_multiplier;
2120 dst->input_joymouse_deadzone = src->input_joymouse_deadzone;
2121 dst->input_joystick_deadzone = src->input_joystick_deadzone;
2122 dst->input_joymouse_speed = src->input_joymouse_speed;
2123 dst->input_mouse_speed = src->input_mouse_speed;
2124 dst->input_autofire_framecnt = src->input_autofire_framecnt;
2125 dst->jport0 = src->jport0;
2126 dst->jport1 = src->jport1;
2127
2128 for (i = 0; i < MAX_INPUT_SETTINGS + 1; i++) {
2129 for (j = 0; j < MAX_INPUT_DEVICES; j++) {
2130 memcpy (&dst->joystick_settings[i][j], &src->joystick_settings[i][j], sizeof (struct uae_input_device));
2131 memcpy (&dst->mouse_settings[i][j], &src->mouse_settings[i][j], sizeof (struct uae_input_device));
2132 memcpy (&dst->keyboard_settings[i][j], &src->keyboard_settings[i][j], sizeof (struct uae_input_device));
2133 }
2134 }
2135
2136 inputdevice_updateconfig (dst);
2137 }
2138
inputdevice_swap_ports(struct uae_prefs * p,int devnum)2139 void inputdevice_swap_ports (struct uae_prefs *p, int devnum)
2140 {
2141 struct inputdevice_functions *idf = getidf (devnum);
2142 struct uae_input_device *uid = get_uid (idf, inputdevice_get_device_index (devnum));
2143 int i, j, k, event, unit;
2144 struct inputevent *ie, *ie2;
2145
2146 for (i = 0; i < MAX_INPUT_DEVICE_EVENTS; i++) {
2147 for (j = 0; j < MAX_INPUT_SUB_EVENT; j++) {
2148 event = uid->eventid[i][j];
2149 if (event <= 0)
2150 continue;
2151 ie = &events[event];
2152 if (ie->unit <= 0)
2153 continue;
2154 unit = ie->unit;
2155 k = 1;
2156 while (events[k].confname) {
2157 ie2 = &events[k];
2158 if (ie2->type == ie->type && ie2->data == ie->data && ie2->unit - 1 == ((ie->unit - 1) ^ 1) && ie2->allow_mask == ie->allow_mask) {
2159 uid->eventid[i][j] = k;
2160 break;
2161 }
2162 k++;
2163 }
2164 }
2165 }
2166 }
2167
inputdevice_copy_single_config(struct uae_prefs * p,int src,int dst,int devnum)2168 void inputdevice_copy_single_config (struct uae_prefs *p, int src, int dst, int devnum)
2169 {
2170 if (src == dst)
2171 return;
2172 if (devnum < 0 || gettype (devnum) == IDTYPE_JOYSTICK)
2173 memcpy (p->joystick_settings[dst], p->joystick_settings[src], sizeof (struct uae_input_device) * MAX_INPUT_DEVICES);
2174 if (devnum < 0 || gettype (devnum) == IDTYPE_MOUSE)
2175 memcpy (p->mouse_settings[dst], p->mouse_settings[src], sizeof (struct uae_input_device) * MAX_INPUT_DEVICES);
2176 if (devnum < 0 || gettype (devnum) == IDTYPE_KEYBOARD)
2177 memcpy (p->keyboard_settings[dst], p->keyboard_settings[src], sizeof (struct uae_input_device) * MAX_INPUT_DEVICES);
2178 }
2179
inputdevice_acquire(void)2180 void inputdevice_acquire (void)
2181 {
2182 int i;
2183
2184 inputdevice_unacquire ();
2185 for (i = 0; i < MAX_INPUT_DEVICES; i++) {
2186 if (use_joysticks[i])
2187 idev[IDTYPE_JOYSTICK].acquire (i, 0);
2188 }
2189 for (i = 0; i < MAX_INPUT_DEVICES; i++) {
2190 if (use_mice[i])
2191 idev[IDTYPE_MOUSE].acquire (i, 0);
2192 }
2193 for (i = 0; i < MAX_INPUT_DEVICES; i++) {
2194 if (use_keyboards[i])
2195 idev[IDTYPE_KEYBOARD].acquire (i, 0);
2196 }
2197 }
2198
inputdevice_unacquire(void)2199 void inputdevice_unacquire (void)
2200 {
2201 int i;
2202
2203 for (i = 0; i < MAX_INPUT_DEVICES; i++)
2204 idev[IDTYPE_JOYSTICK].unacquire (i);
2205 for (i = 0; i < MAX_INPUT_DEVICES; i++)
2206 idev[IDTYPE_MOUSE].unacquire (i);
2207 for (i = 0; i < MAX_INPUT_DEVICES; i++)
2208 idev[IDTYPE_KEYBOARD].unacquire (i);
2209 }
2210
2211 /* Call this function when host machine's joystick/joypad/etc button state changes
2212 * This function translates button events to Amiga joybutton/joyaxis/keyboard events
2213 */
2214
2215 /* button states:
2216 * state = -1 -> mouse wheel turned or similar (button without release)
2217 * state = 1 -> button pressed
2218 * state = 0 -> button released
2219 */
2220
setjoybuttonstate(int joy,int button,int state)2221 void setjoybuttonstate (int joy, int button, int state)
2222 {
2223 if (!joysticks[joy].enabled)
2224 return;
2225 setbuttonstateall (&joysticks[joy], &joysticks2[joy], button, state ? 1 : 0);
2226 }
2227
2228 /* buttonmask = 1 = normal toggle button, 0 = mouse wheel turn or similar
2229 */
setjoybuttonstateall(int joy,uae_u32 buttonbits,uae_u32 buttonmask)2230 void setjoybuttonstateall (int joy, uae_u32 buttonbits, uae_u32 buttonmask)
2231 {
2232 int i;
2233
2234 if (!joysticks[joy].enabled)
2235 return;
2236 for (i = 0; i < ID_BUTTON_TOTAL; i++) {
2237 if (buttonmask & (1 << i))
2238 setbuttonstateall (&joysticks[joy], &joysticks2[joy], i, (buttonbits & (1 << i)) ? 1 : 0);
2239 else if (buttonbits & (1 << i))
2240 setbuttonstateall (&joysticks[joy], &joysticks2[joy], i, -1);
2241 }
2242 }
2243 /* mouse buttons (just like joystick buttons)
2244 */
setmousebuttonstateall(int mouse,uae_u32 buttonbits,uae_u32 buttonmask)2245 void setmousebuttonstateall (int mouse, uae_u32 buttonbits, uae_u32 buttonmask)
2246 {
2247 int i;
2248
2249 if (!mice[mouse].enabled)
2250 return;
2251 for (i = 0; i < ID_BUTTON_TOTAL; i++) {
2252 if (buttonmask & (1 << i))
2253 setbuttonstateall (&mice[mouse], &mice2[mouse], i, (buttonbits & (1 << i)) ? 1 : 0);
2254 else if (buttonbits & (1 << i))
2255 setbuttonstateall (&mice[mouse], &mice2[mouse], i, -1);
2256 }
2257 }
2258
setmousebuttonstate(int mouse,int button,int state)2259 void setmousebuttonstate (int mouse, int button, int state)
2260 {
2261 if (!mice[mouse].enabled)
2262 return;
2263 setbuttonstateall (&mice[mouse], &mice2[mouse], button, state);
2264 }
2265
2266 /* same for joystick axis (analog or digital)
2267 * (0 = center, -max = full left/top, max = full right/bottom)
2268 */
setjoystickstate(int joy,int axis,int state,int max)2269 void setjoystickstate (int joy, int axis, int state, int max)
2270 {
2271 struct uae_input_device *id = &joysticks[joy];
2272 struct uae_input_device2 *id2 = &joysticks2[joy];
2273 int deadzone = currprefs.input_joymouse_deadzone * max / 100;
2274 int i, v1, v2;
2275
2276 if (!joysticks[joy].enabled)
2277 return;
2278 v1 = state;
2279 v2 = id2->states[axis];
2280 if (v1 < deadzone && v1 > -deadzone)
2281 v1 = 0;
2282 if (v2 < deadzone && v2 > -deadzone)
2283 v2 = 0;
2284 if (v1 == v2)
2285 return;
2286 for (i = 0; i < MAX_INPUT_SUB_EVENT; i++)
2287 handle_input_event (id->eventid[ID_AXIS_OFFSET + axis][i], state, max,
2288 id->flags[ID_AXIS_OFFSET + axis][i]);
2289 id2->states[axis] = state;
2290 }
2291
setmousestate(int mouse,int axis,int data,int isabs)2292 void setmousestate (int mouse, int axis, int data, int isabs)
2293 {
2294 int i, v;
2295 double *mouse_p, *oldm_p, d, diff;
2296 struct uae_input_device *id = &mice[mouse];
2297 static double fract1[MAX_INPUT_DEVICES][MAX_INPUT_DEVICE_EVENTS];
2298 static double fract2[MAX_INPUT_DEVICES][MAX_INPUT_DEVICE_EVENTS];
2299
2300 if (!mice[mouse].enabled)
2301 return;
2302 d = 0;
2303 mouse_p = &mouse_axis[mouse][axis];
2304 oldm_p = &oldm_axis[mouse][axis];
2305 if (!isabs) {
2306 *oldm_p = *mouse_p;
2307 *mouse_p += data;
2308 d = (*mouse_p - *oldm_p) * currprefs.input_mouse_speed / 100.0;
2309 /* printf (" offs %f\n", d); */
2310 } else {
2311 d = data - (int)(*oldm_p);
2312 *oldm_p = data;
2313 *mouse_p += d;
2314 if (axis == 0)
2315 lastmx = data;
2316 else
2317 lastmy = data;
2318 }
2319 v = (int)(d > 0 ? d + 0.5 : d - 0.5);
2320 fract1[mouse][axis] += d;
2321 fract2[mouse][axis] += v;
2322 diff = fract2[mouse][axis] - fract1[mouse][axis];
2323 if (diff > 1 || diff < -1) {
2324 v -= (int)diff;
2325 fract2[mouse][axis] -= diff;
2326 }
2327 for (i = 0; i < MAX_INPUT_SUB_EVENT; i++)
2328 handle_input_event (id->eventid[ID_AXIS_OFFSET + axis][i], v, 0, 0);
2329 new_mousehack_helper();
2330 }
2331
2332 #if 0
2333 void warpmode (int mode)
2334 {
2335 if (mode < 0) {
2336 if (turbo_emulation) {
2337 changed_prefs.gfx_framerate = currprefs.gfx_framerate = turbo_emulation;
2338 turbo_emulation = 0;
2339 } else {
2340 turbo_emulation = currprefs.gfx_framerate;
2341 }
2342 } else if (mode == 0 && turbo_emulation > 0) {
2343 changed_prefs.gfx_framerate = currprefs.gfx_framerate = turbo_emulation;
2344 turbo_emulation = 0;
2345 } else if (mode > 0 && !turbo_emulation) {
2346 turbo_emulation = currprefs.gfx_framerate;
2347 }
2348 if (turbo_emulation) {
2349 #if 0
2350 if (!currprefs.cpu_cycle_exact && !currprefs.blitter_cycle_exact)
2351 changed_prefs.gfx_framerate = currprefs.gfx_framerate = 10;
2352 #endif
2353 pause_sound ();
2354 } else {
2355 resume_sound ();
2356 }
2357 compute_vsynctime ();
2358 }
2359 #endif
2360
pausemode(int mode)2361 void pausemode (int mode)
2362 {
2363 if (mode < 0)
2364 pause_emulation = pause_emulation ? 0 : 1;
2365 else
2366 pause_emulation = mode;
2367 }
2368
jsem_isjoy(int port,struct uae_prefs * p)2369 int jsem_isjoy (int port, struct uae_prefs *p)
2370 {
2371 int v = JSEM_DECODEVAL (port, p);
2372 if (v < JSEM_JOYS)
2373 return -1;
2374 v -= JSEM_JOYS;
2375 if (v >= inputdevice_get_device_total (IDTYPE_JOYSTICK))
2376 return -1;
2377 return v;
2378 }
jsem_ismouse(int port,struct uae_prefs * p)2379 int jsem_ismouse (int port, struct uae_prefs *p)
2380 {
2381 int v = JSEM_DECODEVAL (port, p);
2382 if (v < JSEM_MICE)
2383 return -1;
2384 v -= JSEM_MICE;
2385 if (v >= inputdevice_get_device_total (IDTYPE_MOUSE))
2386 return -1;
2387 return v;
2388 }
jsem_iskbdjoy(int port,struct uae_prefs * p)2389 int jsem_iskbdjoy (int port, struct uae_prefs *p)
2390 {
2391 int v = JSEM_DECODEVAL (port, p);
2392 if (v < JSEM_KBDLAYOUT)
2393 return -1;
2394 v -= JSEM_KBDLAYOUT;
2395 if (v >= JSEM_LASTKBD)
2396 return -1;
2397 return v;
2398 }
2399
2400 extern int jsem_ismouse (int v, struct uae_prefs*);
2401 extern int jsem_iskbd (int v, struct uae_prefs*);
2402