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 #define DIR_LEFT_BIT 0
11 #define DIR_RIGHT_BIT 1
12 #define DIR_UP_BIT 2
13 #define DIR_DOWN_BIT 3
14 #define DIR_LEFT (1 << DIR_LEFT_BIT)
15 #define DIR_RIGHT (1 << DIR_RIGHT_BIT)
16 #define DIR_UP (1 << DIR_UP_BIT)
17 #define DIR_DOWN (1 << DIR_DOWN_BIT)
18 
19 #define JOYBUTTON_1 0 /* fire/left mousebutton */
20 #define JOYBUTTON_2 1 /* 2nd/right mousebutton */
21 #define JOYBUTTON_3 2 /* 3rd/middle mousebutton */
22 #define JOYBUTTON_CD32_PLAY 3
23 #define JOYBUTTON_CD32_RWD 4
24 #define JOYBUTTON_CD32_FFW 5
25 #define JOYBUTTON_CD32_GREEN 6
26 #define JOYBUTTON_CD32_YELLOW 7
27 #define JOYBUTTON_CD32_RED 8
28 #define JOYBUTTON_CD32_BLUE 9
29 
30 #define IDTYPE_JOYSTICK 0
31 #define IDTYPE_MOUSE 1
32 #define IDTYPE_KEYBOARD 2
33 #define IDTYPE_INTERNALEVENT 3
34 #define IDTYPE_MAX 4
35 
36 struct inputdevice_functions {
37 	int	(*init)			(void);
38 	void	(*close)		(void);
39 	int	(*acquire)		(int,int);
40 	void	(*unacquire)		(int);
41 	void	(*read)			(void);
42 	int	(*get_num)		(void);
43 	TCHAR*	(*get_friendlyname)	(int);
44 	TCHAR*	(*get_uniquename)	(int);
45 	int	(*get_widget_num)	(int);
46 	int	(*get_widget_type)	(int,int,TCHAR*,uae_u32*);
47 	int	(*get_widget_first)	(int,int);
48 	int	(*get_flags)		(int);
49 };
50 extern struct inputdevice_functions inputdevicefunc_joystick;
51 extern struct inputdevice_functions inputdevicefunc_mouse;
52 extern struct inputdevice_functions inputdevicefunc_keyboard;
53 extern int pause_emulation;
54 
55 struct uae_input_device_default_node
56 {
57 	int evt;
58 	uae_u64 flags;
59 };
60 
61 struct uae_input_device_kbr_default {
62     int scancode;
63     struct uae_input_device_default_node node[MAX_INPUT_SUB_EVENT];
64 };
65 
66 struct inputevent {
67 	const TCHAR *confname;
68 	const TCHAR *name;
69 	int allow_mask;
70 	int type;
71 	int unit;
72 	int data;
73 };
74 
75 #define MAX_INPUT_QUALIFIERS (8 + 5)
76 
77 /* event flags */
78 #define ID_FLAG_AUTOFIRE 1
79 #define ID_FLAG_TOGGLE 2
80 #define ID_FLAG_GAMEPORTSCUSTOM1 4
81 #define ID_FLAG_GAMEPORTSCUSTOM2 8
82 #define ID_FLAG_INVERTTOGGLE 16
83 #define ID_FLAG_INVERT 32
84 
85 #define ID_FLAG_GAMEPORTSCUSTOM_MASK (ID_FLAG_GAMEPORTSCUSTOM1 | ID_FLAG_GAMEPORTSCUSTOM2)
86 #define ID_FLAG_AUTOFIRE_MASK (ID_FLAG_TOGGLE | ID_FLAG_INVERTTOGGLE | ID_FLAG_AUTOFIRE)
87 
88 #define ID_FLAG_QUALIFIER1          0x000000100000000
89 #define ID_FLAG_QUALIFIER1_R        0x000000200000000
90 #define ID_FLAG_QUALIFIER2          0x000000400000000
91 #define ID_FLAG_QUALIFIER3          0x000001000000000
92 #define ID_FLAG_QUALIFIER4          0x000004000000000
93 #define ID_FLAG_QUALIFIER5          0x000010000000000
94 #define ID_FLAG_QUALIFIER6          0x000040000000000
95 #define ID_FLAG_QUALIFIER7          0x000100000000000
96 #define ID_FLAG_QUALIFIER8          0x000400000000000
97 #define ID_FLAG_QUALIFIER_SPECIAL   0x001000000000000
98 #define ID_FLAG_QUALIFIER_SPECIAL_R 0x002000000000000
99 #define ID_FLAG_QUALIFIER_SHIFT     0x004000000000000
100 #define ID_FLAG_QUALIFIER_CONTROL   0x010000000000000
101 #define ID_FLAG_QUALIFIER_ALT       0x040000000000000
102 #define ID_FLAG_QUALIFIER_WIN       0x100000000000000
103 #define ID_FLAG_QUALIFIER_MASK      0xfffffff00000000
104 #define ID_FLAG_QUALIFIER_MASK_R    0xaaaaaaa00000000
105 
106 #define IDEV_WIDGET_NONE 0
107 #define IDEV_WIDGET_BUTTON 1
108 #define IDEV_WIDGET_AXIS 2
109 #define IDEV_WIDGET_BUTTONAXIS 3
110 #define IDEV_WIDGET_KEY 4
111 
112 #define IDEV_MAPPED_AUTOFIRE_POSSIBLE 1
113 #define IDEV_MAPPED_AUTOFIRE_SET 2
114 #define IDEV_MAPPED_TOGGLE 4
115 #define IDEV_MAPPED_INVERTTOGGLE 8
116 #define IDEV_MAPPED_GAMEPORTSCUSTOM1 16
117 #define IDEV_MAPPED_GAMEPORTSCUSTOM2 32
118 #define IDEV_MAPPED_INVERT 64
119 #define IDEV_MAPPED_QUALIFIER1          0x000000100000000
120 #define IDEV_MAPPED_QUALIFIER2          0x000000400000000
121 #define IDEV_MAPPED_QUALIFIER3          0x000001000000000
122 #define IDEV_MAPPED_QUALIFIER4          0x000004000000000
123 #define IDEV_MAPPED_QUALIFIER5          0x000010000000000
124 #define IDEV_MAPPED_QUALIFIER6          0x000040000000000
125 #define IDEV_MAPPED_QUALIFIER7          0x000100000000000
126 #define IDEV_MAPPED_QUALIFIER8          0x000400000000000
127 #define IDEV_MAPPED_QUALIFIER_SPECIAL   0x001000000000000
128 #define IDEV_MAPPED_QUALIFIER_SHIFT     0x004000000000000
129 #define IDEV_MAPPED_QUALIFIER_CONTROL   0x010000000000000
130 #define IDEV_MAPPED_QUALIFIER_ALT       0x040000000000000
131 #define IDEV_MAPPED_QUALIFIER_WIN       0x100000000000000
132 #define IDEV_MAPPED_QUALIFIER_MASK      0xfffffff00000000
133 
134 #define ID_BUTTON_OFFSET 0
135 #define ID_BUTTON_TOTAL 32
136 #define ID_AXIS_OFFSET 32
137 #define ID_AXIS_TOTAL 32
138 
139 #define MAX_COMPA_INPUTLIST 30
140 
141 int inputdevice_iterate (int devnum, int num, TCHAR *name, int *af);
142 bool inputdevice_set_gameports_mapping (struct uae_prefs *prefs, int devnum, int num, int evtnum, uae_u64 flags, int port);
143 int inputdevice_set_mapping (int devnum, int num, const TCHAR *name, TCHAR *custom, uae_u64 flags, int port, int sub);
144 int inputdevice_get_mapping (int devnum, int num, uae_u64 *pflags, int *port, TCHAR *name, TCHAR *custom, int sub);
145 void inputdevice_copyconfig (const struct uae_prefs *src, struct uae_prefs *dst);
146 void inputdevice_copy_single_config (struct uae_prefs *p, int src, int dst, int devnum, int selectedwidget);
147 void inputdevice_swap_ports (struct uae_prefs *p, int devnum);
148 void inputdevice_swap_compa_ports (struct uae_prefs *p, int portswap);
149 void inputdevice_config_change (void);
150 int inputdevice_config_change_test (void);
151 int inputdevice_get_device_index (int devnum);
152 TCHAR *inputdevice_get_device_name (int type, int devnum);
153 TCHAR *inputdevice_get_device_name2 (int devnum);
154 TCHAR *inputdevice_get_device_unique_name (int type, int devnum);
155 int inputdevice_get_device_status (int devnum);
156 void inputdevice_set_device_status (int devnum, int enabled);
157 int inputdevice_get_device_total (int type);
158 int inputdevice_get_widget_num (int devnum);
159 int inputdevice_get_widget_type (int devnum, int num, TCHAR *name);
160 
161 int input_get_default_mouse (struct uae_input_device *uid, int num, int port, int af, bool gp, bool wheel);
162 int input_get_default_lightpen (struct uae_input_device *uid, int num, int port, int af, bool gp);
163 int input_get_default_joystick (struct uae_input_device *uid, int num, int port, int af, int mode, bool gp);
164 int input_get_default_joystick_analog (struct uae_input_device *uid, int num, int port, int af, bool gp);
165 int input_get_default_keyboard (int num);
166 
167 #define DEFEVENT(A, B, C, D, E, F) INPUTEVENT_ ## A,
168 enum inputevents {
169 INPUTEVENT_ZERO,
170 #include "inputevents.def"
171 INPUTEVENT_END
172 };
173 #undef DEFEVENT
174 
175 void handle_cd32_joystick_cia (uae_u8, uae_u8);
176 uae_u8 handle_parport_joystick (int port, uae_u8 pra, uae_u8 dra);
177 uae_u8 handle_joystick_buttons (uae_u8, uae_u8);
178 
179 #define MAGICMOUSE_BOTH 0
180 #define MAGICMOUSE_NATIVE_ONLY 1
181 #define MAGICMOUSE_HOST_ONLY 2
182 
183 int magicmouse_alive (void);
184 int inputdevice_is_tablet (void);
185 int input_mousehack_status (int mode, uaecptr diminfo, uaecptr dispinfo, uaecptr vp, uae_u32 moffset);
186 void input_mousehack_mouseoffset (uaecptr pointerprefs);
187 int mousehack_alive (void);
188 void setmouseactive (int);
189 
190 void setmousebuttonstateall (int mouse, uae_u32 buttonbits, uae_u32 buttonmask);
191 void setjoybuttonstateall (int joy, uae_u32 buttonbits, uae_u32 buttonmask);
192 void setjoybuttonstate (int joy, int button, int state);
193 void setmousebuttonstate (int mouse, int button, int state);
194 void setjoystickstate (int joy, int axle, int state, int max);
195 int getjoystickstate (int mouse);
196 void setmousestate (int mouse, int axis, int data, int isabs);
197 int getmousestate (int mouse);
198 void inputdevice_updateconfig (const struct uae_prefs *srcprefs, struct uae_prefs *dstprefs);
199 void inputdevice_updateconfig_internal (const struct uae_prefs *srcprefs, struct uae_prefs *dstprefs);
200 void inputdevice_devicechange (struct uae_prefs *prefs);
201 
202 #define INTERNALEVENT_CPURESET 0
203 #define INTERNALEVENT_KBRESET 1
204 
205 void send_internalevent (int eventid);
206 
207 int inputdevice_translatekeycode (int keyboard, int scancode, int state);
208 void inputdevice_checkqualifierkeycode (int keyboard, int scancode, int state);
209 void inputdevice_setkeytranslation (struct uae_input_device_kbr_default **trans, int **kbmaps);
210 void inputdevice_do_keyboard (int code, int state);
211 int inputdevice_iskeymapped (int keyboard, int scancode);
212 int inputdevice_synccapslock (int, int*);
213 void inputdevice_testrecord (int type, int num, int wtype, int wnum, int state, int max);
214 int inputdevice_get_compatibility_input (struct uae_prefs*, int index, int *typelist, int *inputlist, const int **at);
215 struct inputevent *inputdevice_get_eventinfo (int evt);
216 bool inputdevice_get_eventname (const struct inputevent *ie, TCHAR *out);
217 void inputdevice_compa_prepare_custom (struct uae_prefs *prefs, int index, int mode, bool removeold);
218 void inputdevice_compa_clear (struct uae_prefs *prefs, int index);
219 int intputdevice_compa_get_eventtype (int evt, const int **axistable);
220 void inputdevice_sparecopy (struct uae_input_device *uid, int num, int sub);
221 
222 uae_u16 potgo_value;
223 uae_u16 POTGOR (void);
224 void POTGO (uae_u16 v);
225 uae_u16 POT0DAT (void);
226 uae_u16 POT1DAT (void);
227 void JOYTEST (uae_u16 v);
228 uae_u16 JOY0DAT (void);
229 uae_u16 JOY1DAT (void);
230 void JOYSET (int num, uae_u16 v);
231 uae_u16 JOYGET (int num);
232 
233 void inputdevice_vsync (void);
234 void inputdevice_hsync (void);
235 void inputdevice_reset (void);
236 
237 void write_inputdevice_config (struct uae_prefs *p, struct zfile *f);
238 void read_inputdevice_config (struct uae_prefs *p, const TCHAR *option, TCHAR *value);
239 void reset_inputdevice_config (struct uae_prefs *pr);
240 int inputdevice_joyport_config (struct uae_prefs *p, const TCHAR *value, int portnum, int mode, int type);
241 int inputdevice_getjoyportdevice (int port, int val);
242 
243 void inputdevice_init (void);
244 void inputdevice_close (void);
245 void inputdevice_default_prefs (struct uae_prefs *p);
246 
247 void inputdevice_acquire (int allmode);
248 void inputdevice_unacquire (void);
249 
250 void indicator_leds (int num, int state);
251 
252 void warpmode (int mode);
253 void pausemode (int mode);
254 
255 void inputdevice_add_inputcode (int code, int state);
256 void inputdevice_handle_inputcode (void);
257 
258 void inputdevice_tablet (int x, int y, int z,
259 	      int pressure, uae_u32 buttonbits, int inproximity,
260 	      int ax, int ay, int az);
261 void inputdevice_tablet_info (int maxx, int maxy, int maxz, int maxax, int maxay, int maxaz, int xres, int yres);
262 void inputdevice_tablet_strobe (void);
263 
264 uae_u64 input_getqualifiers (void);
265 
266 #define JSEM_MODE_DEFAULT 0
267 #define JSEM_MODE_WHEELMOUSE 1
268 #define JSEM_MODE_MOUSE 2
269 #define JSEM_MODE_JOYSTICK 3
270 #define JSEM_MODE_GAMEPAD 4
271 #define JSEM_MODE_JOYSTICK_ANALOG 5
272 #define JSEM_MODE_MOUSE_CDTV 6
273 #define JSEM_MODE_JOYSTICK_CD32 7
274 #define JSEM_MODE_LIGHTPEN 8
275 
276 #define JSEM_KBDLAYOUT 0
277 #define JSEM_JOYS 100
278 #define JSEM_MICE 200
279 #define JSEM_END 300
280 #define JSEM_XARCADE1LAYOUT (JSEM_KBDLAYOUT + 3)
281 #define JSEM_XARCADE2LAYOUT (JSEM_KBDLAYOUT + 4)
282 #define JSEM_DECODEVAL(port,p) ((p)->jports[port].id)
283 #define JSEM_ISNUMPAD(port,p) (jsem_iskbdjoy(port,p) == JSEM_KBDLAYOUT)
284 #define JSEM_ISCURSOR(port,p) (jsem_iskbdjoy(port,p) == JSEM_KBDLAYOUT + 1)
285 #define JSEM_ISSOMEWHEREELSE(port,p) (jsem_iskbdjoy(port,p) == JSEM_KBDLAYOUT + 2)
286 #define JSEM_ISXARCADE1(port,p) (jsem_iskbdjoy(port,p) == JSEM_XARCADE1LAYOUT)
287 #define JSEM_ISXARCADE2(port,p) (jsem_iskbdjoy(port,p) == JSEM_XARCADE2LAYOUT)
288 #define JSEM_LASTKBD 5
289 #define JSEM_ISANYKBD(port,p) (jsem_iskbdjoy(port,p) >= JSEM_KBDLAYOUT && jsem_iskbdjoy(port,p) < JSEM_KBDLAYOUT + JSEM_LASTKBD)
290 
291 int jsem_isjoy (int port, const struct uae_prefs *p);
292 int jsem_ismouse (int port, const struct uae_prefs *p);
293 int jsem_iskbdjoy (int port, const struct uae_prefs *p);
294 
295 int inputdevice_uaelib (const TCHAR *, const TCHAR *);
296 
297 int inputdevice_testread (int*, int*, int*, bool);
298 int inputdevice_istest (void);
299 void inputdevice_settest (int);
300 int inputdevice_testread_count (void);
301 
302