1 /*
2 * UAE - The Un*x Amiga Emulator
3 *
4 * Stuff
5 *
6 * Copyright 1995, 1996 Ed Hanway
7 * Copyright 1995-2001 Bernd Schmidt
8 */
9
10 typedef enum { KBD_LANG_US, KBD_LANG_DK, KBD_LANG_DE, KBD_LANG_SE,
11 KBD_LANG_FR, KBD_LANG_IT, KBD_LANG_ES } KbdLang;
12
13 extern long int version;
14
15 struct uaedev_mount_info;
16
17 struct strlist {
18 struct strlist *next;
19 char *str;
20 };
21
22 struct config_list {
23 const char *filename;
24 const char *description;
25 const char *sortstr;
26 };
27
28 extern struct config_list *predef_configs;
29 extern int n_predef_configs;
30
31 struct uae_rect {
32 int w, h;
33 };
34
35 extern struct uae_rect *gfx_fullscreen_modes, *gfx_windowed_modes;
36 extern int n_fullscreen_modes, n_windowed_modes;
37
38 #define FILTER_SOUND_OFF 0
39 #define FILTER_SOUND_EMUL 1
40 #define FILTER_SOUND_ON 2
41
42 #define FILTER_SOUND_TYPE_A500 0
43 #define FILTER_SOUND_TYPE_A1200 1
44
45 /* maximum number native input devices supported (single type) */
46 #define MAX_INPUT_DEVICES 6
47 /* maximum number of native input device's buttons and axles supported */
48 #define MAX_INPUT_DEVICE_EVENTS 256
49 /* 4 different customization settings */
50 #define MAX_INPUT_SETTINGS 4
51 #define MAX_INPUT_SUB_EVENT 4
52 #define MAX_INPUT_SIMULTANEOUS_KEYS 4
53
54 struct uae_input_device {
55 char *name;
56 uae_s16 eventid[MAX_INPUT_DEVICE_EVENTS][MAX_INPUT_SUB_EVENT];
57 char *custom[MAX_INPUT_DEVICE_EVENTS][MAX_INPUT_SUB_EVENT];
58 uae_u16 flags[MAX_INPUT_DEVICE_EVENTS][MAX_INPUT_SUB_EVENT];
59 uae_s16 extra[MAX_INPUT_DEVICE_EVENTS][MAX_INPUT_SIMULTANEOUS_KEYS];
60 uae_u8 enabled;
61 };
62
63 typedef enum { DRV_NONE = -1, DRV_35_DD = 0, DRV_35_HD, DRV_525_SD, DRV_35_DD_ESCOM } drive_type;
64
65 enum { CP_GENERIC = 1, CP_CDTV, CP_CD32, CP_A500, CP_A500P, CP_A600, CP_A1000,
66 CP_A1200, CP_A2000, CP_A3000, CP_A3000T, CP_A4000, CP_A4000T };
67
68 struct gfx_params {
69 int width;
70 int height;
71 int lores;
72 int linedbl;
73 int correct_aspect;
74 int xcenter;
75 int ycenter;
76 int leds_on_screen;
77 };
78
79 struct uae_prefs {
80 struct strlist *unknown_lines;
81
82 char description[256];
83 char sortstr[256];
84 char info[256];
85
86 int illegal_mem;
87 int use_serial;
88 int serial_demand;
89 int parallel_demand;
90 int use_gfxlib;
91 int socket_emu;
92
93 int start_debugger;
94 int start_gui;
95
96 KbdLang keyboard_lang;
97 int allow_save;
98 int emul_accuracy;
99 int test_drawing_speed;
100
101 int produce_sound;
102 int sound_stereo;
103 int sound_stereo_separation;
104 int sound_mixed_stereo_delay;
105 int sound_freq;
106 int sound_maxbsiz;
107 int sound_interpol;
108 int sound_filter;
109 int sound_filter_type;
110
111 int gfx_framerate;
112 struct gfx_params gfx_w, gfx_f;
113 int gfx_afullscreen;
114 int gfx_pfullscreen;
115 int color_mode;
116
117 int blits_32bit_enabled;
118 int immediate_blits;
119 unsigned int chipset_mask;
120 int ntscmode;
121 int collision_level;
122
123 int cs_rtc;
124 int cs_ide;
125 int cs_a1000ram;
126 int cs_fatgaryrev;
127 int cs_ramseyrev;
128
129 char df[4][256];
130 char romfile[256];
131 unsigned int rom_crc32;
132 char romextfile[256];
133 char keyfile[256];
134 char prtname[256];
135 char sername[256];
136
137 char path_floppy[256];
138 char path_hardfile[256];
139 char path_rom[256];
140
141 int m68k_speed;
142 int cpu_model;
143 int fpu_model;
144 int address_space_24;
145
146 uae_u32 z3fastmem_size;
147 uae_u32 fastmem_size;
148 uae_u32 chipmem_size;
149 uae_u32 bogomem_size;
150 uae_u32 mbresmem_low_size;
151 uae_u32 mbresmem_high_size;
152 uae_u32 gfxmem_size;
153
154 int kickshifter;
155
156 struct uaedev_mount_info *mountinfo;
157 int bootrom;
158
159 int nr_floppies;
160 drive_type dfxtype[4];
161
162 /* Target specific options */
163 int x11_use_low_bandwidth;
164 int x11_use_mitshm;
165 int x11_use_dgamode;
166 int x11_hide_cursor;
167 int svga_no_linear;
168 int win32_middle_mouse;
169 int win32_logfile;
170 int win32_iconified_nospeed;
171 int win32_iconified_nosound;
172 int win32_no_overlay; /* If this is set, we won't try and use any RGB overlays */
173 int win32_automount_drives;
174
175 int curses_reverse_video;
176
177 int jport0;
178 int jport1;
179 int input_selected_setting;
180 int input_joymouse_multiplier;
181 int input_joymouse_deadzone;
182 int input_joystick_deadzone;
183 int input_joymouse_speed;
184 int input_autofire_framecnt;
185 int input_mouse_speed;
186 struct uae_input_device joystick_settings[MAX_INPUT_SETTINGS + 1][MAX_INPUT_DEVICES];
187 struct uae_input_device mouse_settings[MAX_INPUT_SETTINGS + 1][MAX_INPUT_DEVICES];
188 struct uae_input_device keyboard_settings[MAX_INPUT_SETTINGS + 1][MAX_INPUT_DEVICES];
189 };
190
191 /* Contains the filename of .uaerc */
192 extern char optionsfile[];
193 extern void save_options (FILE *, const struct uae_prefs *);
194
195 extern void default_prefs (struct uae_prefs *);
196 extern void discard_prefs (struct uae_prefs *);
197
198 extern int parse_cmdline_option (struct uae_prefs *, char, char *);
199
200 extern int cfgfile_yesno (const char *option, const char *value, const char *name, int *location);
201 extern int cfgfile_uintval (const char *option, const char *value, const char *name, unsigned int *location, int scale);
202 extern int cfgfile_intval (const char *option, const char *value, const char *name, int *location, int scale);
203 extern int cfgfile_strval (const char *option, const char *value, const char *name, int *location, const char *table[], int more);
204 extern int cfgfile_string (const char *option, const char *value, const char *name, char *location, int maxsz);
205 extern char *cfgfile_subst_path (const char *path, const char *subst, const char *file);
206
207 extern int target_parse_option (struct uae_prefs *, const char *option, const char *value);
208 extern void target_save_options (FILE *, const struct uae_prefs *);
209
210 extern int cfgfile_load (struct uae_prefs *, const char *filename);
211 extern int cfgfile_save (struct uae_prefs *, const char *filename);
212 extern void cfgfile_parse_line (struct uae_prefs *p, char *);
213 extern int cfgfile_parse_option (struct uae_prefs *p, char *option, char *value);
214 extern int cfgfile_get_description (const char *filename, char *description);
215 extern void cfgfile_show_usage (void);
216
217 extern int cstype_from_prefs (struct uae_prefs *p);
218 extern void built_in_chipset_prefs (struct uae_prefs *p, int);
219
220 extern int fixup_prefs_dimensions (struct gfx_params *, struct uae_rect *, int);
221
222 extern void check_prefs_changed_custom (void);
223 extern void check_prefs_changed_cpu (void);
224 extern void check_prefs_changed_audio (void);
225 extern int check_prefs_changed_gfx (void);
226
227 extern struct uae_prefs currprefs, changed_prefs;
228
229 extern struct gfx_params *curr_gfx;
230
231 extern void machdep_init (void);
232
233 /* AIX doesn't think it is Unix. Neither do I. */
234 #if defined(_ALL_SOURCE) || defined(_AIX)
235 #undef __unix
236 #define __unix
237 #endif
238
239 #define MAX_COLOR_MODES 5
240
241 /* #define NEED_TO_DEBUG_BADLY */
242
243 #if !defined(USER_PROGRAMS_BEHAVE)
244 #define USER_PROGRAMS_BEHAVE 0
245 #endif
246
247 /* Some memsets which know that they can safely overwrite some more memory
248 * at both ends and use that knowledge to align the pointers. */
249
250 #define QUADRUPLIFY(c) (((c) | ((c) << 8)) | (((c) | ((c) << 8)) << 16))
251
252 /* When you call this routine, bear in mind that it rounds the bounds and
253 * may need some padding for the array. */
254
255 #define fuzzy_memset(p, c, o, l) fuzzy_memset_1 ((p), QUADRUPLIFY (c), (o) & ~3, ((l) + 4) >> 2)
fuzzy_memset_1(void * p,uae_u32 c,int offset,int len)256 STATIC_INLINE void fuzzy_memset_1 (void *p, uae_u32 c, int offset, int len)
257 {
258 uae_u32 *p2 = (uae_u32 *)((char *)p + offset);
259 int a = len & 7;
260 len >>= 3;
261 switch (a) {
262 case 7: p2--; goto l1;
263 case 6: p2-=2; goto l2;
264 case 5: p2-=3; goto l3;
265 case 4: p2-=4; goto l4;
266 case 3: p2-=5; goto l5;
267 case 2: p2-=6; goto l6;
268 case 1: p2-=7; goto l7;
269 case 0: if (!--len) return; break;
270 }
271
272 for (;;) {
273 p2[0] = c;
274 l1:
275 p2[1] = c;
276 l2:
277 p2[2] = c;
278 l3:
279 p2[3] = c;
280 l4:
281 p2[4] = c;
282 l5:
283 p2[5] = c;
284 l6:
285 p2[6] = c;
286 l7:
287 p2[7] = c;
288
289 if (!len)
290 break;
291 len--;
292 p2 += 8;
293 }
294 }
295
296 /* This one knows it will never be asked to clear more than 32 bytes. Make sure you call this with a
297 constant for the length. */
298 #define fuzzy_memset_le32(p, c, o, l) fuzzy_memset_le32_1 ((p), QUADRUPLIFY (c), (o) & ~3, ((l) + 7) >> 2)
fuzzy_memset_le32_1(void * p,uae_u32 c,int offset,int len)299 STATIC_INLINE void fuzzy_memset_le32_1 (void *p, uae_u32 c, int offset, int len)
300 {
301 uae_u32 *p2 = (uae_u32 *)((char *)p + offset);
302
303 switch (len) {
304 case 9: p2[0] = c; p2[1] = c; p2[2] = c; p2[3] = c; p2[4] = c; p2[5] = c; p2[6] = c; p2[7] = c; p2[8] = c; break;
305 case 8: p2[0] = c; p2[1] = c; p2[2] = c; p2[3] = c; p2[4] = c; p2[5] = c; p2[6] = c; p2[7] = c; break;
306 case 7: p2[0] = c; p2[1] = c; p2[2] = c; p2[3] = c; p2[4] = c; p2[5] = c; p2[6] = c; break;
307 case 6: p2[0] = c; p2[1] = c; p2[2] = c; p2[3] = c; p2[4] = c; p2[5] = c; break;
308 case 5: p2[0] = c; p2[1] = c; p2[2] = c; p2[3] = c; p2[4] = c; break;
309 case 4: p2[0] = c; p2[1] = c; p2[2] = c; p2[3] = c; break;
310 case 3: p2[0] = c; p2[1] = c; p2[2] = c; break;
311 case 2: p2[0] = c; p2[1] = c; break;
312 case 1: p2[0] = c; break;
313 case 0: break;
314 default: printf("Hit the programmer.\n"); break;
315 }
316 }
317
318 #if defined(AMIGA) && defined(__GNUC__)
319 #include "od-amiga/amiga-kludges.h"
320 #endif
321