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