1  /*
2   * UAE - The Un*x Amiga Emulator
3   *
4   * Joystick, mouse and keyboard emulation prototypes and definitions
5   *
6   * Copyright 1995 Bernd Schmidt
7   * Copyright 2001-2002 Toni Wilen
8   */
9 
10 #ifndef UAE_INPUTDEVICE_H
11 #define UAE_INPUTDEVICE_H
12 
13 #include "uae/types.h"
14 #ifdef FSUAE
15 #include "options.h"
16 #endif
17 
18 #define DIR_LEFT_BIT 0
19 #define DIR_RIGHT_BIT 1
20 #define DIR_UP_BIT 2
21 #define DIR_DOWN_BIT 3
22 #define DIR_LEFT (1 << DIR_LEFT_BIT)
23 #define DIR_RIGHT (1 << DIR_RIGHT_BIT)
24 #define DIR_UP (1 << DIR_UP_BIT)
25 #define DIR_DOWN (1 << DIR_DOWN_BIT)
26 
27 #define JOYBUTTON_1 0 /* fire/left mousebutton */
28 #define JOYBUTTON_2 1 /* 2nd/right mousebutton */
29 #define JOYBUTTON_3 2 /* 3rd/middle mousebutton */
30 #define JOYBUTTON_CD32_PLAY 3
31 #define JOYBUTTON_CD32_RWD 4
32 #define JOYBUTTON_CD32_FFW 5
33 #define JOYBUTTON_CD32_GREEN 6
34 #define JOYBUTTON_CD32_YELLOW 7
35 #define JOYBUTTON_CD32_RED 8
36 #define JOYBUTTON_CD32_BLUE 9
37 
38 #define IDTYPE_JOYSTICK 0
39 #define IDTYPE_MOUSE 1
40 #define IDTYPE_KEYBOARD 2
41 #define IDTYPE_INTERNALEVENT 3
42 #define IDTYPE_MAX 4
43 
44 struct inputdevice_functions {
45     int (*init)(void);
46     void (*close)(void);
47     int (*acquire)(int,int);
48     void (*unacquire)(int);
49     void (*read)(void);
50     int (*get_num)(void);
51     TCHAR* (*get_friendlyname)(int);
52     TCHAR* (*get_uniquename)(int);
53     int (*get_widget_num)(int);
54     int (*get_widget_type)(int,int,TCHAR*,uae_u32*);
55     int (*get_widget_first)(int,int);
56     int (*get_flags)(int);
57 };
58 extern struct inputdevice_functions inputdevicefunc_joystick;
59 extern struct inputdevice_functions inputdevicefunc_mouse;
60 extern struct inputdevice_functions inputdevicefunc_keyboard;
61 extern int pause_emulation;
62 
63 struct uae_input_device_default_node
64 {
65 	int evt;
66 	uae_u64 flags;
67 };
68 
69 struct uae_input_device_kbr_default {
70     int scancode;
71     struct uae_input_device_default_node node[MAX_INPUT_SUB_EVENT];
72 };
73 
74 struct inputevent {
75 	const TCHAR *confname;
76 	const TCHAR *name;
77 	const TCHAR *shortname;
78 	int allow_mask;
79 	int type;
80 	int unit;
81 	int data;
82 	int portid;
83 };
84 
85 #define MAX_INPUT_QUALIFIERS (8 + 5)
86 
87 /* event flags */
88 #define ID_FLAG_AUTOFIRE 1
89 #define ID_FLAG_TOGGLE 2
90 #define ID_FLAG_GAMEPORTSCUSTOM1 4
91 #define ID_FLAG_GAMEPORTSCUSTOM2 8
92 #define ID_FLAG_INVERTTOGGLE 16
93 #define ID_FLAG_INVERT 32
94 #define ID_FLAG_RESERVEDGAMEPORTSCUSTOM 64
95 #define ID_FLAG_SET_ONOFF 128
96 #define ID_FLAG_SET_ONOFF_VAL 256
97 
98 #define ID_FLAG_GAMEPORTSCUSTOM_MASK (ID_FLAG_GAMEPORTSCUSTOM1 | ID_FLAG_GAMEPORTSCUSTOM2)
99 #define ID_FLAG_AUTOFIRE_MASK (ID_FLAG_TOGGLE | ID_FLAG_INVERTTOGGLE | ID_FLAG_AUTOFIRE)
100 
101 #define ID_FLAG_QUALIFIER1          0x000000100000000ULL
102 #define ID_FLAG_QUALIFIER1_R        0x000000200000000ULL
103 #define ID_FLAG_QUALIFIER2          0x000000400000000ULL
104 #define ID_FLAG_QUALIFIER3          0x000001000000000ULL
105 #define ID_FLAG_QUALIFIER4          0x000004000000000ULL
106 #define ID_FLAG_QUALIFIER5          0x000010000000000ULL
107 #define ID_FLAG_QUALIFIER6          0x000040000000000ULL
108 #define ID_FLAG_QUALIFIER7          0x000100000000000ULL
109 #define ID_FLAG_QUALIFIER8          0x000400000000000ULL
110 #define ID_FLAG_QUALIFIER_SPECIAL   0x001000000000000ULL
111 #define ID_FLAG_QUALIFIER_SPECIAL_R 0x002000000000000ULL
112 #define ID_FLAG_QUALIFIER_SHIFT     0x004000000000000ULL
113 #define ID_FLAG_QUALIFIER_CONTROL   0x010000000000000ULL
114 #define ID_FLAG_QUALIFIER_ALT       0x040000000000000ULL
115 #define ID_FLAG_QUALIFIER_WIN       0x100000000000000ULL
116 #define ID_FLAG_QUALIFIER_MASK      0xfffffff00000000ULL
117 #define ID_FLAG_QUALIFIER_MASK_R    0xaaaaaaa00000000ULL
118 
119 #define ID_FLAG_SAVE_MASK_CONFIG 0x000001ff
120 #define ID_FLAG_SAVE_MASK_QUALIFIERS ID_FLAG_QUALIFIER_MASK
121 #define ID_FLAG_SAVE_MASK_FULL (ID_FLAG_SAVE_MASK_CONFIG | ID_FLAG_SAVE_MASK_QUALIFIERS)
122 
123 #define IDEV_WIDGET_NONE 0
124 #define IDEV_WIDGET_BUTTON 1
125 #define IDEV_WIDGET_AXIS 2
126 #define IDEV_WIDGET_BUTTONAXIS 3
127 #define IDEV_WIDGET_KEY 4
128 
129 #define IDEV_MAPPED_AUTOFIRE_POSSIBLE 1
130 #define IDEV_MAPPED_AUTOFIRE_SET 2
131 #define IDEV_MAPPED_TOGGLE 4
132 #define IDEV_MAPPED_INVERTTOGGLE 8
133 #define IDEV_MAPPED_GAMEPORTSCUSTOM1 16
134 #define IDEV_MAPPED_GAMEPORTSCUSTOM2 32
135 #define IDEV_MAPPED_INVERT 64
136 #define IDEV_MAPPED_SET_ONOFF 128
137 #define IDEV_MAPPED_SET_ONOFF_VAL 256
138 
139 #define IDEV_MAPPED_QUALIFIER1          0x000000100000000ULL
140 #define IDEV_MAPPED_QUALIFIER2          0x000000400000000ULL
141 #define IDEV_MAPPED_QUALIFIER3          0x000001000000000ULL
142 #define IDEV_MAPPED_QUALIFIER4          0x000004000000000ULL
143 #define IDEV_MAPPED_QUALIFIER5          0x000010000000000ULL
144 #define IDEV_MAPPED_QUALIFIER6          0x000040000000000ULL
145 #define IDEV_MAPPED_QUALIFIER7          0x000100000000000ULL
146 #define IDEV_MAPPED_QUALIFIER8          0x000400000000000ULL
147 #define IDEV_MAPPED_QUALIFIER_SPECIAL   0x001000000000000ULL
148 #define IDEV_MAPPED_QUALIFIER_SHIFT     0x004000000000000ULL
149 #define IDEV_MAPPED_QUALIFIER_CONTROL   0x010000000000000ULL
150 #define IDEV_MAPPED_QUALIFIER_ALT       0x040000000000000ULL
151 #define IDEV_MAPPED_QUALIFIER_WIN       0x100000000000000ULL
152 #define IDEV_MAPPED_QUALIFIER_MASK      0xfffffff00000000ULL
153 
154 #define SET_ONOFF_ON_VALUE  0x7fffff01
155 #define SET_ONOFF_OFF_VALUE 0x7fffff00
156 
157 #define ID_BUTTON_OFFSET 0
158 #define ID_BUTTON_TOTAL 32
159 #define ID_AXIS_OFFSET 32
160 #define ID_AXIS_TOTAL 32
161 
162 #define MAX_COMPA_INPUTLIST 30
163 
164 /* event masks */
165 #define AM_KEY 1 /* keyboard allowed */
166 #define AM_JOY_BUT 2 /* joystick buttons allowed */
167 #define AM_JOY_AXIS 4 /* joystick axis allowed */
168 #define AM_MOUSE_BUT 8 /* mouse buttons allowed */
169 #define AM_MOUSE_AXIS 16 /* mouse direction allowed */
170 #define AM_AF 32 /* supports autofire */
171 #define AM_INFO 64 /* information data for gui */
172 #define AM_DUMMY 128 /* placeholder */
173 #define AM_CUSTOM 256 /* custom event */
174 #define AM_SETTOGGLE 512 /* on/off/toggle */
175 #define AM_K (AM_KEY|AM_JOY_BUT|AM_MOUSE_BUT|AM_AF) /* generic button/switch */
176 #define AM_KK (AM_KEY|AM_JOY_BUT|AM_MOUSE_BUT)
177 #define AM_KT (AM_K|AM_SETTOGGLE)
178 
179 extern int inputdevice_iterate (int devnum, int num, TCHAR *name, int *af);
180 extern bool inputdevice_set_gameports_mapping (struct uae_prefs *prefs, int devnum, int num, int evtnum, uae_u64 flags, int port, int input_selected_setting);
181 extern int inputdevice_set_mapping (int devnum, int num, const TCHAR *name, TCHAR *custom, uae_u64 flags, int port, int sub);
182 extern int inputdevice_get_mapping (int devnum, int num, uae_u64 *pflags, int *port, TCHAR *name, TCHAR *custom, int sub);
183 extern void inputdevice_copyconfig (const struct uae_prefs *src, struct uae_prefs *dst);
184 extern void inputdevice_copy_single_config (struct uae_prefs *p, int src, int dst, int devnum, int selectedwidget);
185 extern void inputdevice_swap_ports (struct uae_prefs *p, int devnum);
186 extern void inputdevice_swap_compa_ports (struct uae_prefs *p, int portswap);
187 extern void inputdevice_config_change (void);
188 extern int inputdevice_config_change_test (void);
189 extern int inputdevice_get_device_index (int devnum);
190 extern TCHAR *inputdevice_get_device_name (int type, int devnum);
191 extern TCHAR *inputdevice_get_device_name2 (int devnum);
192 extern TCHAR *inputdevice_get_device_unique_name (int type, int devnum);
193 extern int inputdevice_get_device_status (int devnum);
194 extern void inputdevice_set_device_status (int devnum, int enabled);
195 extern int inputdevice_get_device_total (int type);
196 extern int inputdevice_get_widget_num (int devnum);
197 extern int inputdevice_get_widget_type (int devnum, int num, TCHAR *name);
198 
199 extern int input_get_default_mouse (struct uae_input_device *uid, int num, int port, int af, bool gp, bool wheel, bool joymouseswap);
200 extern int input_get_default_lightpen (struct uae_input_device *uid, int num, int port, int af, bool gp, bool joymouseswap);
201 extern int input_get_default_joystick (struct uae_input_device *uid, int num, int port, int af, int mode, bool gp, bool joymouseswap);
202 extern int input_get_default_joystick_analog (struct uae_input_device *uid, int num, int port, int af, bool gp, bool joymouseswap);
203 extern int input_get_default_keyboard (int num);
204 
205 #define DEFEVENT(A, B, C, D, E, F) INPUTEVENT_ ## A,
206 #define DEFEVENT2(A, B, B2, C, D, E, F, G) INPUTEVENT_ ## A,
207 enum inputevents {
208 INPUTEVENT_ZERO,
209 #include "../inputevents.def"
210 INPUTEVENT_END
211 };
212 #undef DEFEVENT
213 #undef DEFEVENT2
214 
215 extern void handle_cd32_joystick_cia (uae_u8, uae_u8);
216 extern uae_u8 handle_parport_joystick (int port, uae_u8 pra, uae_u8 dra);
217 extern uae_u8 handle_joystick_buttons (uae_u8, uae_u8);
218 
219 #define MAGICMOUSE_BOTH 0
220 #define MAGICMOUSE_NATIVE_ONLY 1
221 #define MAGICMOUSE_HOST_ONLY 2
222 
223 extern int magicmouse_alive (void);
224 extern int is_tablet (void);
225 extern int inputdevice_is_tablet (void);
226 extern int input_mousehack_status (int mode, uaecptr diminfo, uaecptr dispinfo, uaecptr vp, uae_u32 moffset);
227 extern void input_mousehack_mouseoffset (uaecptr pointerprefs);
228 extern int mousehack_alive (void);
229 extern void mousehack_wakeup(void);
230 extern void mousehack_write(int reg, uae_u16 val);
231 extern void setmouseactive (int);
232 extern bool ismouseactive (void);
233 
234 extern void setmousebuttonstateall (int mouse, uae_u32 buttonbits, uae_u32 buttonmask);
235 extern void setjoybuttonstateall (int joy, uae_u32 buttonbits, uae_u32 buttonmask);
236 extern void setjoybuttonstate (int joy, int button, int state);
237 extern void setmousebuttonstate (int mouse, int button, int state);
238 extern void setjoystickstate (int joy, int axle, int state, int max);
239 extern int getjoystickstate (int mouse);
240 void setmousestate (int mouse, int axis, int data, int isabs);
241 extern int getmousestate (int mouse);
242 extern void inputdevice_updateconfig (const struct uae_prefs *srcprefs, struct uae_prefs *dstprefs);
243 extern void inputdevice_updateconfig_internal (const struct uae_prefs *srcprefs, struct uae_prefs *dstprefs);
244 extern void inputdevice_devicechange (struct uae_prefs *prefs);
245 
246 #define INTERNALEVENT_CPURESET 0
247 #define INTERNALEVENT_KBRESET 1
248 
249 extern void send_internalevent (int eventid);
250 
251 extern int inputdevice_translatekeycode (int keyboard, int scancode, int state);
252 extern void inputdevice_checkqualifierkeycode (int keyboard, int scancode, int state);
253 extern void inputdevice_setkeytranslation (struct uae_input_device_kbr_default **trans, int **kbmaps);
254 extern void inputdevice_do_keyboard (int code, int state);
255 extern int inputdevice_iskeymapped (int keyboard, int scancode);
256 extern int inputdevice_synccapslock (int, int*);
257 extern void inputdevice_testrecord (int type, int num, int wtype, int wnum, int state, int max);
258 extern int inputdevice_get_compatibility_input (struct uae_prefs*, int index, int *typelist, int *inputlist, const int **at);
259 extern const struct inputevent *inputdevice_get_eventinfo (int evt);
260 extern bool inputdevice_get_eventname (const struct inputevent *ie, TCHAR *out);
261 extern void inputdevice_compa_prepare_custom (struct uae_prefs *prefs, int index, int mode, bool removeold);
262 extern void inputdevice_compa_clear (struct uae_prefs *prefs, int index);
263 extern int intputdevice_compa_get_eventtype (int evt, const int **axistable);
264 extern void inputdevice_sparecopy (struct uae_input_device *uid, int num, int sub);
265 extern void inputdevice_parse_jport_custom(struct uae_prefs *pr, int index, int port, TCHAR *outname);
266 extern void inputdevice_generate_jport_custom(struct uae_prefs *pr, int port);
267 
268 extern uae_u16 potgo_value;
269 extern uae_u16 POTGOR (void);
270 extern void POTGO (uae_u16 v);
271 extern uae_u16 POT0DAT (void);
272 extern uae_u16 POT1DAT (void);
273 extern void JOYTEST (uae_u16 v);
274 extern uae_u16 JOY0DAT (void);
275 extern uae_u16 JOY1DAT (void);
276 extern void JOYSET (int num, uae_u16 v);
277 extern uae_u16 JOYGET (int num);
278 
279 extern void inputdevice_vsync (void);
280 extern void inputdevice_hsync (void);
281 extern void inputdevice_reset (void);
282 
283 extern void write_inputdevice_config (struct uae_prefs *p, struct zfile *f);
284 extern void read_inputdevice_config (struct uae_prefs *p, const TCHAR *option, TCHAR *value);
285 extern void reset_inputdevice_config (struct uae_prefs *pr);
286 extern int inputdevice_joyport_config(struct uae_prefs *p, const TCHAR *value, int portnum, int mode, int type);
287 extern void inputdevice_joyport_config_store(struct uae_prefs *p, const TCHAR *value, int portnum, int mode, int type);
288 extern int inputdevice_getjoyportdevice (int port, int val);
289 extern void inputdevice_validate_jports (struct uae_prefs *p, int changedport, bool *fixedports);
290 extern void inputdevice_fix_prefs(struct uae_prefs *p);
291 extern void inputdevice_config_load_start(struct uae_prefs *p);
292 
293 extern void inputdevice_init (void);
294 extern void inputdevice_close (void);
295 extern void inputdevice_default_prefs (struct uae_prefs *p);
296 
297 extern void inputdevice_acquire (int allmode);
298 extern void inputdevice_unacquire(void);
299 extern void inputdevice_unacquire(bool emulationactive, int inputmask);
300 
301 extern void indicator_leds (int num, int state);
302 
303 extern void warpmode (int mode);
304 extern void pausemode (int mode);
305 
306 extern void inputdevice_add_inputcode (int code, int state);
307 extern void inputdevice_handle_inputcode (void);
308 
309 extern void inputdevice_tablet (int x, int y, int z,
310 	      int pressure, uae_u32 buttonbits, int inproximity,
311 	      int ax, int ay, int az);
312 extern void inputdevice_tablet_info (int maxx, int maxy, int maxz, int maxax, int maxay, int maxaz, int xres, int yres);
313 extern void inputdevice_tablet_strobe (void);
314 
315 extern uae_u64 input_getqualifiers (void);
316 
317 extern void setsystime (void);
318 
319 #define JSEM_MODE_DEFAULT 0
320 #define JSEM_MODE_WHEELMOUSE 1
321 #define JSEM_MODE_MOUSE 2
322 #define JSEM_MODE_JOYSTICK 3
323 #define JSEM_MODE_GAMEPAD 4
324 #define JSEM_MODE_JOYSTICK_ANALOG 5
325 #define JSEM_MODE_MOUSE_CDTV 6
326 #define JSEM_MODE_JOYSTICK_CD32 7
327 #define JSEM_MODE_LIGHTPEN 8
328 
329 #define JSEM_KBDLAYOUT 0
330 #define JSEM_CUSTOM 10
331 #define JSEM_JOYS 100
332 #define JSEM_MICE 200
333 #define JSEM_END 300
334 #define JSEM_DECODEVAL(port,p) ((p)->jports[port].id)
335 #define JSEM_ISNUMPAD(port,p) (jsem_iskbdjoy(port,p) == JSEM_KBDLAYOUT)
336 #define JSEM_ISCURSOR(port,p) (jsem_iskbdjoy(port,p) == JSEM_KBDLAYOUT + 1)
337 #define JSEM_ISSOMEWHEREELSE(port,p) (jsem_iskbdjoy(port,p) == JSEM_KBDLAYOUT + 2)
338 #define JSEM_ISCUSTOM(port,p) ((p)->jports[port].id >= JSEM_CUSTOM && (p)->jports[port].id < JSEM_CUSTOM + MAX_JPORTS_CUSTOM)
339 #define JSEM_GETCUSTOMIDX(port,p) ((p)->jports[port].id - JSEM_CUSTOM)
340 #define JSEM_LASTKBD 3
341 #define JSEM_ISANYKBD(port,p) (jsem_iskbdjoy(port,p) >= JSEM_KBDLAYOUT && jsem_iskbdjoy(port,p) < JSEM_KBDLAYOUT + JSEM_LASTKBD)
342 
343 extern int jsem_isjoy (int port, const struct uae_prefs *p);
344 extern int jsem_ismouse (int port, const struct uae_prefs *p);
345 extern int jsem_iskbdjoy (int port, const struct uae_prefs *p);
346 
347 extern int inputdevice_uaelib (const TCHAR *, const TCHAR *);
348 extern int inputdevice_uaelib(const TCHAR *s, int parm, int max, bool autofire);
349 
350 extern int inputdevice_testread (int*, int*, int*, bool);
351 extern int inputdevice_istest (void);
352 extern void inputdevice_settest (int);
353 extern int inputdevice_testread_count (void);
354 
355 extern bool target_can_autoswitchdevice(void);
356 
357 #endif /* UAE_INPUTDEVICE_H */
358