1  /*
2   * UAE - The Un*x Amiga Emulator
3   *
4   * Stuff
5   *
6   * Copyright 1995, 1996 Ed Hanway
7   * Copyright 1995-98 Bernd Schmidt
8   */
9 
10 #define UAEMAJOR 0
11 #define UAEMINOR 8
12 #define UAESUBREV 9
13 
14 typedef enum { KBD_LANG_US, KBD_LANG_DE, KBD_LANG_SE, KBD_LANG_FR, KBD_LANG_IT, KBD_LANG_ES } KbdLang;
15 
16 extern long int version;
17 
18 struct uaedev_mount_info;
19 
20 struct strlist {
21     struct strlist *next;
22     char *str;
23 };
24 
25 struct uae_prefs {
26     struct strlist *unknown_lines;
27 
28     char description[256];
29 
30     int illegal_mem;
31     int no_xhair;
32     int use_serial;
33     int serial_demand;
34     int parallel_demand;
35     int automount_uaedev;
36     int use_gfxlib;
37     int socket_emu;
38 
39     int start_debugger;
40     int start_gui;
41 
42     int jport0;
43     int jport1;
44     KbdLang keyboard_lang;
45     int allow_save;
46     int emul_accuracy;
47     int test_drawing_speed;
48 
49     int produce_sound;
50     int stereo;
51     int sound_bits;
52     int sound_freq;
53     int sound_minbsiz;
54     int sound_maxbsiz;
55     int sound_pri_time;
56     int sound_pri_cutoff;
57     int sound_interpol;
58 
59     int gfx_framerate;
60     int gfx_width;
61     int gfx_height;
62     int gfx_lores;
63     int gfx_linedbl;
64     int gfx_correct_aspect;
65     int gfx_afullscreen;
66     int gfx_pfullscreen;
67     int gfx_xcenter;
68     int gfx_ycenter;
69     int color_mode;
70 
71     int blits_32bit_enabled;
72     int immediate_blits;
73     unsigned int chipset_mask;
74     int ntscmode;
75 
76     char df[4][256];
77     char romfile[256];
78     char keyfile[256];
79     char prtname[256];
80 
81     char path_floppy[256];
82     char path_hardfile[256];
83     char path_rom[256];
84 
85     int m68k_speed;
86     int cpu_level;
87     int cpu_compatible;
88     int address_space_24;
89 
90     uae_u32 z3fastmem_size;
91     uae_u32 fastmem_size;
92     uae_u32 chipmem_size;
93     uae_u32 bogomem_size;
94     uae_u32 a3000mem_size;
95     uae_u32 gfxmem_size;
96 
97     struct uaedev_mount_info *mountinfo;
98 
99     /* Target specific options */
100     int x11_use_low_bandwidth;
101     int x11_use_mitshm;
102     int x11_use_dgamode;
103     int x11_hide_cursor;
104     int svga_no_linear;
105     int win32_middle_mouse;
106     int win32_sound_style;
107     int win32_sound_tweak;
108     int win32_logfile;
109     int win32_iconified_nospeed;
110     int win32_iconified_nosound;
111 };
112 
113 extern void save_options (FILE *, struct uae_prefs *);
114 
115 extern void default_prefs (struct uae_prefs *);
116 extern void discard_prefs (struct uae_prefs *);
117 
118 extern int cfgfile_yesno (char *option, char *value, char *name, int *location);
119 extern int cfgfile_intval (char *option, char *value, char *name, int *location, int scale);
120 extern int cfgfile_strval (char *option, char *value, char *name, int *location, const char *table[], int more);
121 extern int cfgfile_string (char *option, char *value, char *name, char *location, int maxsz);
122 extern char *cfgfile_subst_path (const char *path, const char *subst, const char *file);
123 
124 extern int target_parse_option (struct uae_prefs *, char *option, char *value);
125 extern void target_save_options (FILE *, struct uae_prefs *);
126 
127 extern int cfgfile_load (struct uae_prefs *, const char *filename);
128 extern int cfgfile_save (struct uae_prefs *, const char *filename);
129 extern void cfgfile_parse_line (struct uae_prefs *p, char *);
130 extern int cfgfile_parse_option (struct uae_prefs *p, char *option, char *value);
131 extern int cfgfile_get_description (const char *filename, char *description);
132 extern void cfgfile_show_usage (void);
133 
134 extern void fixup_prefs_dimensions (struct uae_prefs *prefs);
135 
136 extern void check_prefs_changed_custom (void);
137 extern void check_prefs_changed_cpu (void);
138 extern int check_prefs_changed_gfx (void);
139 
140 #define JSEM_DECODEVAL(n,v) ((n) == 0 ? (v)->jport0 : (v)->jport1)
141 /* Determine how port n is configured */
142 #define JSEM_ISJOY0(n,v) (JSEM_DECODEVAL(n,v) == 0)
143 #define JSEM_ISJOY1(n,v) (JSEM_DECODEVAL(n,v) == 1)
144 #define JSEM_ISMOUSE(n,v) (JSEM_DECODEVAL(n,v) == 2)
145 #define JSEM_ISNUMPAD(n,v) (JSEM_DECODEVAL(n,v) == 3)
146 #define JSEM_ISCURSOR(n,v) (JSEM_DECODEVAL(n,v) == 4)
147 #define JSEM_ISSOMEWHEREELSE(n,v) (JSEM_DECODEVAL(n,v) == 5)
148 extern const char *gameport_state (int n);
149 
150 extern struct uae_prefs currprefs, changed_prefs;
151 
152 #if __GNUC__ - 1 > 1 || __GNUC_MINOR__ - 1 > 6
153 extern void write_log (const char *, ...) __attribute__ ((format (printf, 1, 2)));
154 #else
155 extern void write_log (const char *, ...);
156 #endif
157 
158 extern void machdep_init (void);
159 
160 /* AIX doesn't think it is Unix. Neither do I. */
161 #if defined(_ALL_SOURCE) || defined(_AIX)
162 #undef __unix
163 #define __unix
164 #endif
165 
166 extern char romfile[], keyfile[], prtname[], sername[];
167 
168 extern int cloanto_rom;
169 
170 #define MAX_COLOR_MODES 5
171 
172 extern int fast_memcmp(const void *foo, const void *bar, int len);
173 extern int memcmpy(void *foo, const void *bar, int len);
174 
175 /*
176  * You can specify numbers from 0 to 5 here. It is possible that higher
177  * numbers will make the CPU emulation slightly faster, but if the setting
178  * is too high, you will run out of memory while compiling.
179  * Best to leave this as it is.
180  */
181 #define CPU_EMU_SIZE 0
182 
183 /* #define NEED_TO_DEBUG_BADLY */
184 
185 #if !defined(USER_PROGRAMS_BEHAVE)
186 #define USER_PROGRAMS_BEHAVE 0
187 #endif
188 
189 /* Some memsets which know that they can safely overwrite some more memory
190  * at both ends and use that knowledge to align the pointers. */
191 
192 #define QUADRUPLIFY(c) (((c) | ((c) << 8)) | (((c) | ((c) << 8)) << 16))
193 
194 /* When you call this routine, bear in mind that it rounds the bounds and
195  * may need some padding for the array. */
196 
197 #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)198 static inline void fuzzy_memset_1 (void *p, uae_u32 c, int offset, int len)
199 {
200     uae_u32 *p2 = (uae_u32 *)((char *)p + offset);
201     int a = len & 7;
202     len >>= 3;
203     switch (a) {
204      case 7: p2--; goto l1;
205      case 6: p2-=2; goto l2;
206      case 5: p2-=3; goto l3;
207      case 4: p2-=4; goto l4;
208      case 3: p2-=5; goto l5;
209      case 2: p2-=6; goto l6;
210      case 1: p2-=7; goto l7;
211      case 0: if (!--len) return; break;
212     }
213 
214     for (;;) {
215 	p2[0] = c;
216 	l1:
217 	p2[1] = c;
218 	l2:
219 	p2[2] = c;
220 	l3:
221 	p2[3] = c;
222 	l4:
223 	p2[4] = c;
224 	l5:
225 	p2[5] = c;
226 	l6:
227 	p2[6] = c;
228 	l7:
229 	p2[7] = c;
230 
231 	if (!len)
232 	    break;
233 	len--;
234 	p2 += 8;
235     }
236 }
237 
238 /* This one knows it will never be asked to clear more than 32 bytes.  Make sure you call this with a
239    constant for the length.  */
240 #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)241 static inline void fuzzy_memset_le32_1 (void *p, uae_u32 c, int offset, int len)
242 {
243     uae_u32 *p2 = (uae_u32 *)((char *)p + offset);
244 
245     switch (len) {
246      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;
247      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;
248      case 7: p2[0] = c; p2[1] = c; p2[2] = c; p2[3] = c; p2[4] = c; p2[5] = c; p2[6] = c; break;
249      case 6: p2[0] = c; p2[1] = c; p2[2] = c; p2[3] = c; p2[4] = c; p2[5] = c; break;
250      case 5: p2[0] = c; p2[1] = c; p2[2] = c; p2[3] = c; p2[4] = c; break;
251      case 4: p2[0] = c; p2[1] = c; p2[2] = c; p2[3] = c; break;
252      case 3: p2[0] = c; p2[1] = c; p2[2] = c; break;
253      case 2: p2[0] = c; p2[1] = c; break;
254      case 1: p2[0] = c; break;
255      case 0: break;
256      default: printf("Hit the programmer.\n"); break;
257     }
258 }
259 
260 #if defined(AMIGA) && defined(__GNUC__)
261 /* #include "od-amiga/amiga-kludges.h" */
262 #endif
263