--- uae/src/include/options.h 2018/04/24 16:38:39 1.1 +++ uae/src/include/options.h 2018/04/24 17:18:55 1.1.1.27 @@ -1,248 +1,321 @@ /* * UAE - The Un*x Amiga Emulator * - * cpp magic + * Stuff * - * Copyright 1995, 1996 Bernd Schmidt, Ed Hanway + * Copyright 1995, 1996 Ed Hanway + * Copyright 1995-2001 Bernd Schmidt */ -#define UAEMAJOR 0 -#define UAEMINOR 6 -#define UAEURSAMINOR 4 - -typedef enum { KBD_LANG_US, KBD_LANG_DE, KBD_LANG_SE, KBD_LANG_FR, KBD_LANG_IT } KbdLang; - -extern int version; -extern int framerate; -extern int produce_sound; -extern int correct_aspect; -extern int use_fast_draw; -extern int use_debugger; -extern int use_serial; -extern int illegal_mem; -extern int use_fast_mem; -extern int use_gfxlib; -extern int no_xhair; -extern int use_lores; -extern int automount_uaedev; -extern int fake_joystick; -extern KbdLang keyboard_lang; -extern int color_mode; -extern int screen_res; -extern int sound_desired_bits; -extern int sound_desired_freq; -extern int sound_desired_bsiz; -extern int allow_save; -extern int no_gui; -extern long hardfile_size; +typedef enum { KBD_LANG_US, KBD_LANG_DK, KBD_LANG_DE, KBD_LANG_SE, + KBD_LANG_FR, KBD_LANG_IT, KBD_LANG_ES } KbdLang; -/* Contains the filename of .uaerc */ -extern char optionsfile[]; +extern long int version; -/* AIX doesn't think it is Unix. Neither do I. */ -#if defined(_ALL_SOURCE) || defined(_AIX) -#undef __unix -#define __unix -#endif +struct uaedev_mount_info; -#define MAX_COLOR_MODES 5 -#define MAX_SCREEN_MODES 4 +struct strlist { + struct strlist *next; + char *str; +}; + +struct config_list { + const char *filename; + const char *description; + const char *sortstr; +}; + +extern struct config_list *predef_configs; +extern int n_predef_configs; + +struct uae_rect { + int w, h; +}; + +extern struct uae_rect *gfx_fullscreen_modes, *gfx_windowed_modes; +extern int n_fullscreen_modes, n_windowed_modes; + +#define FILTER_SOUND_OFF 0 +#define FILTER_SOUND_EMUL 1 +#define FILTER_SOUND_ON 2 + +#define FILTER_SOUND_TYPE_A500 0 +#define FILTER_SOUND_TYPE_A1200 1 + +/* maximum number native input devices supported (single type) */ +#define MAX_INPUT_DEVICES 6 +/* maximum number of native input device's buttons and axles supported */ +#define MAX_INPUT_DEVICE_EVENTS 256 +/* 4 different customization settings */ +#define MAX_INPUT_SETTINGS 4 +#define MAX_INPUT_SUB_EVENT 4 +#define MAX_INPUT_SIMULTANEOUS_KEYS 4 + +struct uae_input_device { + char *name; + uae_s16 eventid[MAX_INPUT_DEVICE_EVENTS][MAX_INPUT_SUB_EVENT]; + char *custom[MAX_INPUT_DEVICE_EVENTS][MAX_INPUT_SUB_EVENT]; + uae_u16 flags[MAX_INPUT_DEVICE_EVENTS][MAX_INPUT_SUB_EVENT]; + uae_s16 extra[MAX_INPUT_DEVICE_EVENTS][MAX_INPUT_SIMULTANEOUS_KEYS]; + uae_u8 enabled; +}; + +typedef enum { DRV_NONE = -1, DRV_35_DD = 0, DRV_35_HD, DRV_525_SD, DRV_35_DD_ESCOM } drive_type; + +enum { CP_GENERIC = 1, CP_CDTV, CP_CD32, CP_A500, CP_A500P, CP_A600, CP_A1000, + CP_A1200, CP_A2000, CP_A3000, CP_A3000T, CP_A4000, CP_A4000T }; + +struct gfx_params { + int width; + int height; + int lores; + int linedbl; + int correct_aspect; + int xcenter; + int ycenter; + int leds_on_screen; +}; + +struct uae_prefs { + struct strlist *unknown_lines; + + char description[256]; + char sortstr[256]; + char info[256]; + + int illegal_mem; + int use_serial; + int serial_demand; + int parallel_demand; + int use_gfxlib; + int socket_emu; + + int start_debugger; + int start_gui; + + KbdLang keyboard_lang; + int allow_save; + int emul_accuracy; + int test_drawing_speed; + + int produce_sound; + int sound_stereo; + int sound_stereo_separation; + int sound_mixed_stereo_delay; + int sound_freq; + int sound_maxbsiz; + int sound_interpol; + int sound_filter; + int sound_filter_type; + + int gfx_framerate; + struct gfx_params gfx_w, gfx_f; + int gfx_afullscreen; + int gfx_pfullscreen; + int color_mode; + + int blits_32bit_enabled; + int immediate_blits; + unsigned int chipset_mask; + int ntscmode; + int collision_level; + + int cs_rtc; + int cs_ide; + int cs_a1000ram; + int cs_fatgaryrev; + int cs_ramseyrev; + + char df[4][256]; + char romfile[256]; + unsigned int rom_crc32; + char romextfile[256]; + char keyfile[256]; + char prtname[256]; + char sername[256]; + + char path_floppy[256]; + char path_hardfile[256]; + char path_rom[256]; + + int m68k_speed; + int cpu_model; + int fpu_model; + int address_space_24; + + uae_u32 z3fastmem_size; + uae_u32 fastmem_size; + uae_u32 chipmem_size; + uae_u32 bogomem_size; + uae_u32 mbresmem_low_size; + uae_u32 mbresmem_high_size; + uae_u32 gfxmem_size; + + int kickshifter; + + struct uaedev_mount_info *mountinfo; + int bootrom; + + int nr_floppies; + drive_type dfxtype[4]; + + /* Target specific options */ + int x11_use_low_bandwidth; + int x11_use_mitshm; + int x11_use_dgamode; + int x11_hide_cursor; + int svga_no_linear; + int win32_middle_mouse; + int win32_logfile; + int win32_iconified_nospeed; + int win32_iconified_nosound; + int win32_no_overlay; /* If this is set, we won't try and use any RGB overlays */ + int win32_automount_drives; + + int curses_reverse_video; + + int jport0; + int jport1; + int input_selected_setting; + int input_joymouse_multiplier; + int input_joymouse_deadzone; + int input_joystick_deadzone; + int input_joymouse_speed; + int input_autofire_framecnt; + int input_mouse_speed; + struct uae_input_device joystick_settings[MAX_INPUT_SETTINGS + 1][MAX_INPUT_DEVICES]; + struct uae_input_device mouse_settings[MAX_INPUT_SETTINGS + 1][MAX_INPUT_DEVICES]; + struct uae_input_device keyboard_settings[MAX_INPUT_SETTINGS + 1][MAX_INPUT_DEVICES]; +}; -extern void target_specific_usage(void); +/* Contains the filename of .uaerc */ +extern char optionsfile[]; +extern void save_options (FILE *, const struct uae_prefs *); -extern char df0[], df1[], df2[], df3[], romfile[], prtname[], sername[]; +extern void default_prefs (struct uae_prefs *); +extern void discard_prefs (struct uae_prefs *); -#ifndef __unix -extern void parse_cmdline(int argc, char **argv); -#endif +extern int parse_cmdline_option (struct uae_prefs *, char, char *); -#ifdef __mac__ -/* Apparently, no memcpy :-/ */ -static __inline__ void *memcpy(void *to, void *from, int size) -{ - BlockMove(from, to, size); -} -#endif +extern int cfgfile_yesno (const char *option, const char *value, const char *name, int *location); +extern int cfgfile_uintval (const char *option, const char *value, const char *name, unsigned int *location, int scale); +extern int cfgfile_intval (const char *option, const char *value, const char *name, int *location, int scale); +extern int cfgfile_strval (const char *option, const char *value, const char *name, int *location, const char *table[], int more); +extern int cfgfile_string (const char *option, const char *value, const char *name, char *location, int maxsz); +extern char *cfgfile_subst_path (const char *path, const char *subst, const char *file); -/* strdup() may be non-portable if you have a weird system */ -static char *my_strdup(const char*s) -{ - /* The casts to char * are there to shut up the compiler on HPUX */ - char *x = (char*)malloc(strlen((char *)s) + 1); - strcpy(x, (char *)s); - return x; -} +extern int target_parse_option (struct uae_prefs *, const char *option, const char *value); +extern void target_save_options (FILE *, const struct uae_prefs *); -#undef REGPARAM -#define fast_memcmp memcmp -#define memcmpy generic_memcmpy +extern int cfgfile_load (struct uae_prefs *, const char *filename); +extern int cfgfile_save (struct uae_prefs *, const char *filename); +extern void cfgfile_parse_line (struct uae_prefs *p, char *); +extern int cfgfile_parse_option (struct uae_prefs *p, char *option, char *value); +extern int cfgfile_get_description (const char *filename, char *description); +extern void cfgfile_show_usage (void); -static __inline__ int generic_memcmpy(void *foo, const void *bar, int len) -{ - int res = memcmp(foo, bar, len); - if (res) - memcpy(foo, bar, len); - return res; -} +extern int cstype_from_prefs (struct uae_prefs *p); +extern void built_in_chipset_prefs (struct uae_prefs *p, int); -#if defined(__GNUC_MINOR__) +extern int fixup_prefs_dimensions (struct gfx_params *, struct uae_rect *, int); +extern void fixup_cpu (struct uae_prefs *); -#ifdef __i386__ +extern void check_prefs_changed_custom (void); +extern void check_prefs_changed_cpu (void); +extern void check_prefs_changed_audio (void); +extern int check_prefs_changed_gfx (void); -#define INTEL_FLAG_OPT +extern struct uae_prefs currprefs, changed_prefs; -#undef fast_memcmp -#undef memcmpy +extern struct gfx_params *curr_gfx; -/* - * Careful: These inline functions may be used only _once_. We'd want to - * generate unique labels for each inline function, but unfortunately not each - * installation of GCC comes with GAS. Bletch. - */ +extern void machdep_init (void); -static __inline__ int fast_memcmp(const void *foo, const void *bar, int len) -{ - int differs, baz; - __asm__ __volatile__ ("subl $4, %2\n" - "jc LLA2\n" - "LLA1:\n" - "movl (%0),%%ebx\n" - "cmpl (%1),%%ebx\n" - "jne LLA5\n" - "addl $4, %0\n" - "addl $4, %1\n" - "subl $4, %2\n" - "jnc LLA1\n" - "LLA2:\n" - "addl $4, %2\n" - "jz LLA4\n" - "LLA3:\n" - "movb (%0),%%bl\n" - "cmpb (%1),%%bl\n" - "jne LLA5\n" - "incl %0\n" - "incl %1\n" - "decl %2\n" - "jnz LLA3\n" - "LLA4:\n" - "movl $0, %3\n" - "jmp LLA6\n" - "LLA5:\n" - "movl $1, %3\n" - "LLA6:\n" - : "=&r" (foo), "=&r" (bar), "=&rm" (len), "=rm" (differs), - "=&b" (baz) - : "0" (foo), "1" (bar), "2" (len), "3" (baz) : "cc"); - return differs; -} +/* AIX doesn't think it is Unix. Neither do I. */ +#if defined(_ALL_SOURCE) || defined(_AIX) +#undef __unix +#define __unix +#endif -static __inline__ int memcmpy(void *foo, const void *bar, int len) -{ - int differs, baz = 0, uupzuq = 0; +#define MAX_COLOR_MODES 5 - __asm__ __volatile__ ("subl %1, %2\n" - "movl $0, %0\n" - "subl $16, %3\n" - "jc LLB7\n" - - "LLB8:\n" - "movl (%1),%%ecx\n" - "movl (%2,%1),%%ebx\n" - "xorl %%ebx, %%ecx\n" - "movl %%ebx, (%1)\n" - "orl %%ecx, %0\n" - - "movl 4(%2,%1),%%ebx\n" - "movl 4(%1),%%ecx\n" - "xorl %%ebx, %%ecx\n" - "movl %%ebx, 4(%1)\n" - "orl %%ecx, %0\n" - - "movl 8(%2,%1),%%ebx\n" - "movl 8(%1),%%ecx\n" - "xorl %%ebx, %%ecx\n" - "movl %%ebx, 8(%1)\n" - "orl %%ecx, %0\n" - - "movl 12(%2,%1),%%ebx\n" - "movl 12(%1),%%ecx\n" - "xorl %%ebx, %%ecx\n" - "movl %%ebx, 12(%1)\n" - "orl %%ecx, %0\n" - - "addl $16, %1\n" - "subl $16, %3\n" - "jnc LLB8\n" - - "LLB7:\n" - "addl $16, %3\n" - "subl $4, %3\n" - "jc LLB2\n" - - "LLB1:\n" - "movl (%2,%1),%%ebx\n" - "movl (%1),%%ecx\n" - "xorl %%ebx, %%ecx\n" - "movl %%ebx, (%1)\n" - "orl %%ecx, %0\n" - "addl $4, %1\n" - "subl $4, %3\n" - "jnc LLB1\n" - - "LLB2:\n" - "addl $4, %3\n" - "jz LLB6\n" - "xorl %%ecx, %%ecx\n" - - "LLB3:\n" - "movb (%2,%1),%%bl\n" - "movb (%1),%%cl\n" - "xorb %%bl,%%cl\n" - "movb %%bl,(%1)\n" - "orl %%ecx, %0\n" - "incl %1\n" - "decl %3\n" - "jnz LLB3\n" - - "LLB6:\n" - : "=m" (differs) - : "r" (foo), "r" (bar), "r" (len), "b" (baz), "c" (uupzuq) : "cc", "memory"); - /* Now tell the compiler that foo, bar and len have been modified - * If someone finds a way to express all this cleaner in constraints that - * GCC 2.7.2 understands, please FIXME */ - __asm__ __volatile__ ("" : "=rm" (foo), "=rm" (bar), "=rm" (len) : : "ebx", "ecx", "edx", "eax", "esi", "memory"); +/* #define NEED_TO_DEBUG_BADLY */ - return differs; -} -#endif /* __i386__ */ +#if !defined(USER_PROGRAMS_BEHAVE) +#define USER_PROGRAMS_BEHAVE 0 +#endif -#if __GNUC__ > 2 || __GNUC_MINOR__ > 6 +/* Some memsets which know that they can safely overwrite some more memory + * at both ends and use that knowledge to align the pointers. */ -#if defined(__i386__) && !defined(USE_PROFILING) -#define REGPARAM __attribute__((regparm(3))) -#endif /* __i386__ */ +#define QUADRUPLIFY(c) (((c) | ((c) << 8)) | (((c) | ((c) << 8)) << 16)) -#endif /* GCC version 2.7 or higher */ -#endif /* GCC 2 */ +/* When you call this routine, bear in mind that it rounds the bounds and + * may need some padding for the array. */ -#ifndef REGPARAM -#define REGPARAM -#endif +#define fuzzy_memset(p, c, o, l) fuzzy_memset_1 ((p), QUADRUPLIFY (c), (o) & ~3, ((l) + 4) >> 2) +STATIC_INLINE void fuzzy_memset_1 (void *p, uae_u32 c, int offset, int len) +{ + uae_u32 *p2 = (uae_u32 *)((char *)p + offset); + int a = len & 7; + len >>= 3; + switch (a) { + case 7: p2--; goto l1; + case 6: p2-=2; goto l2; + case 5: p2-=3; goto l3; + case 4: p2-=4; goto l4; + case 3: p2-=5; goto l5; + case 2: p2-=6; goto l6; + case 1: p2-=7; goto l7; + case 0: if (!--len) return; break; + } + + for (;;) { + p2[0] = c; + l1: + p2[1] = c; + l2: + p2[2] = c; + l3: + p2[3] = c; + l4: + p2[4] = c; + l5: + p2[5] = c; + l6: + p2[6] = c; + l7: + p2[7] = c; + + if (!len) + break; + len--; + p2 += 8; + } +} -/* - * You can specify numbers from 0 to 5 here. It is possible that higher - * numbers will make the CPU emulation slightly faster, but if the setting - * is too high, you will run out of memory while compiling. - * Best to leave this as it is. - */ -#define CPU_EMU_SIZE 0 - -#ifdef DONT_WANT_SOUND -#undef LINUX_SOUND -#undef AF_SOUND -#undef SOLARIS_SOUND -#undef SGI_SOUND -#endif +/* This one knows it will never be asked to clear more than 32 bytes. Make sure you call this with a + constant for the length. */ +#define fuzzy_memset_le32(p, c, o, l) fuzzy_memset_le32_1 ((p), QUADRUPLIFY (c), (o) & ~3, ((l) + 7) >> 2) +STATIC_INLINE void fuzzy_memset_le32_1 (void *p, uae_u32 c, int offset, int len) +{ + uae_u32 *p2 = (uae_u32 *)((char *)p + offset); -/* #define NEED_TO_DEBUG_BADLY */ + switch (len) { + 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; + 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; + case 7: p2[0] = c; p2[1] = c; p2[2] = c; p2[3] = c; p2[4] = c; p2[5] = c; p2[6] = c; break; + case 6: p2[0] = c; p2[1] = c; p2[2] = c; p2[3] = c; p2[4] = c; p2[5] = c; break; + case 5: p2[0] = c; p2[1] = c; p2[2] = c; p2[3] = c; p2[4] = c; break; + case 4: p2[0] = c; p2[1] = c; p2[2] = c; p2[3] = c; break; + case 3: p2[0] = c; p2[1] = c; p2[2] = c; break; + case 2: p2[0] = c; p2[1] = c; break; + case 1: p2[0] = c; break; + case 0: break; + default: printf("Hit the programmer.\n"); break; + } +} +#if defined(AMIGA) && defined(__GNUC__) +#include "od-amiga/amiga-kludges.h" +#endif