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