424 lines
12 KiB
C
424 lines
12 KiB
C
/*
|
|
* UAE - The Un*x Amiga Emulator
|
|
*
|
|
* Stuff
|
|
*
|
|
* Copyright 1995, 1996 Ed Hanway
|
|
* Copyright 1995-2001 Bernd Schmidt
|
|
*/
|
|
|
|
typedef enum { KBD_LANG_US, KBD_LANG_DK, KBD_LANG_DE, KBD_LANG_SE, KBD_LANG_FR, KBD_LANG_IT, KBD_LANG_ES } KbdLang;
|
|
|
|
struct uaedev_mount_info;
|
|
|
|
struct strlist {
|
|
struct strlist *next;
|
|
char *option, *value;
|
|
int unknown;
|
|
};
|
|
|
|
// Device Port
|
|
enum Porttype {
|
|
PORT_DEFAULT, // Load from device of dol file
|
|
PORT_SD, // Load from SD card
|
|
PORT_USB, // Load from USB port
|
|
PORT_SMB //Load from network
|
|
};
|
|
|
|
/* 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;
|
|
};
|
|
|
|
#define MAX_SPARE_DRIVES 20
|
|
|
|
#define CONFIG_TYPE_HARDWARE 1
|
|
#define CONFIG_TYPE_HOST 2
|
|
|
|
struct uae_prefs {
|
|
|
|
struct strlist *all_lines;
|
|
|
|
char description[256];
|
|
char info[256];
|
|
int config_version;
|
|
|
|
int illegal_mem;
|
|
int use_serial;
|
|
int serial_demand;
|
|
int serial_hwctsrts;
|
|
int serial_direct;
|
|
int parallel_demand;
|
|
int socket_emu;
|
|
|
|
#ifdef DEBUGGER
|
|
int start_debugger;
|
|
#endif
|
|
int start_gui;
|
|
|
|
KbdLang keyboard_lang;
|
|
int test_drawing_speed;
|
|
|
|
int produce_sound;
|
|
int sound_stereo;
|
|
int sound_stereo_separation;
|
|
int sound_mixed_stereo;
|
|
int sound_freq;
|
|
int sound_latency;
|
|
int sound_interpol;
|
|
int sound_adjust;
|
|
int sound_volume;
|
|
|
|
#ifdef JIT
|
|
int comptrustbyte;
|
|
int comptrustword;
|
|
int comptrustlong;
|
|
int comptrustnaddr;
|
|
int compnf;
|
|
int compforcesettings;
|
|
int compfpu;
|
|
|
|
int comp_hardflush;
|
|
int comp_constjump;
|
|
int comp_oldsegv;
|
|
|
|
int cachesize;
|
|
int optcount[10];
|
|
#endif
|
|
|
|
int gfx_framerate;
|
|
int gfx_width_win, gfx_height_win;
|
|
int gfx_width_fs, gfx_height_fs;
|
|
int gfx_width, gfx_height;
|
|
int gfx_refreshrate;
|
|
int gfx_vsync;
|
|
int gfx_lores;
|
|
int gfx_linedbl;
|
|
int gfx_correct_aspect;
|
|
int gfx_afullscreen;
|
|
int gfx_pfullscreen;
|
|
int gfx_xcenter;
|
|
int gfx_ycenter;
|
|
|
|
#ifdef GFXFILTER
|
|
int gfx_filter;
|
|
int gfx_filter_scanlines;
|
|
int gfx_filter_scanlineratio;
|
|
int gfx_filter_scanlinelevel;
|
|
int gfx_filter_horiz_zoom, gfx_filter_vert_zoom;
|
|
int gfx_filter_horiz_offset, gfx_filter_vert_offset;
|
|
int gfx_filter_filtermode;
|
|
#endif
|
|
|
|
int color_mode;
|
|
|
|
int immediate_blits;
|
|
unsigned int chipset_mask;
|
|
int ntscmode;
|
|
int genlock;
|
|
int chipset_refreshrate;
|
|
int collision_level;
|
|
int leds_on_screen;
|
|
int keyboard_leds[3];
|
|
int keyboard_leds_in_use;
|
|
int scsi;
|
|
int catweasel_io;
|
|
int cpu_idle;
|
|
int cpu_cycle_exact;
|
|
int blitter_cycle_exact;
|
|
int floppy_speed;
|
|
int tod_hack;
|
|
uae_u32 maprom;
|
|
|
|
char df[4][256];
|
|
char dfxlist[MAX_SPARE_DRIVES][256];
|
|
char romfile[256];
|
|
char romextfile[256];
|
|
char keyfile[256];
|
|
char flashfile[256];
|
|
#ifdef ACTION_REPLAY
|
|
char cartfile[256];
|
|
#endif
|
|
char prtname[256];
|
|
char sername[256];
|
|
#ifndef WIN32
|
|
char scsi_device[256];
|
|
#endif
|
|
|
|
int m68k_speed;
|
|
int cpu_level;
|
|
int cpu_compatible;
|
|
int address_space_24;
|
|
|
|
#ifdef HAVE_MACHDEP_TIMER
|
|
int use_processor_clock;
|
|
#endif
|
|
|
|
uae_u32 z3fastmem_size;
|
|
uae_u32 fastmem_size;
|
|
uae_u32 chipmem_size;
|
|
uae_u32 bogomem_size;
|
|
uae_u32 a3000mem_size;
|
|
uae_u32 gfxmem_size;
|
|
|
|
int kickshifter;
|
|
int filesys_no_uaefsdb;
|
|
|
|
struct uaedev_mount_info *mountinfo;
|
|
|
|
int nr_floppies;
|
|
int dfxtype[4];
|
|
#ifdef DRIVESOUND
|
|
int dfxclick[4];
|
|
char dfxclickexternal[4][256];
|
|
int dfxclickvolume;
|
|
#endif
|
|
|
|
int hide_cursor; /* Whether to hide host WM cursor or not */
|
|
|
|
/* Target specific options */
|
|
#ifdef USE_X11_GFX
|
|
int x11_use_low_bandwidth;
|
|
int x11_use_mitshm;
|
|
int x11_use_dgamode;
|
|
#endif
|
|
|
|
#ifdef USE_SVGALIB_GFX
|
|
int svga_no_linear;
|
|
#endif
|
|
|
|
#ifdef _WIN32
|
|
int win32_middle_mouse;
|
|
int win32_logfile;
|
|
|
|
int win32_active_priority;
|
|
int win32_inactive_priority;
|
|
int win32_inactive_pause;
|
|
int win32_inactive_nosound;
|
|
int win32_iconified_priority;
|
|
int win32_iconified_pause;
|
|
int win32_iconified_nosound;
|
|
|
|
int win32_no_overlay; /* If this is set, we won't try and use any RGB overlays */
|
|
int win32_ctrl_F11_is_quit;
|
|
int win32_automount_drives;
|
|
int win32_midioutdev;
|
|
int win32_midiindev;
|
|
int win32_aspi;
|
|
int win32_soundcard;
|
|
#endif
|
|
|
|
#ifdef USE_CURSES_GFX
|
|
int curses_reverse_video;
|
|
#endif
|
|
|
|
#if defined USE_SDL_GFX || defined USE_X11_GFX
|
|
int map_raw_keys;
|
|
#endif
|
|
#ifdef USE_SDL_GFX
|
|
int use_gl;
|
|
#endif
|
|
|
|
#ifdef USE_AMIGA_GFX
|
|
int amiga_screen_type;
|
|
char amiga_publicscreen[256];
|
|
int amiga_use_grey;
|
|
int amiga_use_dither;
|
|
#endif
|
|
|
|
#ifdef SAVESTATE
|
|
int statecapture;
|
|
int statecapturerate, statecapturebuffersize;
|
|
#endif
|
|
|
|
#ifdef GEKKO
|
|
int use_wheel_input;
|
|
int write_logfile;
|
|
int smb_enable;
|
|
char SmbUser[32];
|
|
char SmbPwd[32];
|
|
char SmbShare[32];
|
|
char SmbIp[32];
|
|
int Port; //SD, USB or SMB
|
|
int rumble[2];
|
|
int gfx_correct_ratio;
|
|
int gui_volume;
|
|
#endif
|
|
|
|
/* input */
|
|
|
|
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 save_options (FILE *, const struct uae_prefs *, int);
|
|
extern void cfgfile_write (FILE *f, const char *format,...);
|
|
|
|
extern void default_prefs (struct uae_prefs *, int);
|
|
extern void discard_prefs (struct uae_prefs *, int);
|
|
|
|
extern void prefs_set_attr (const char *key, const char *value);
|
|
extern const char *prefs_get_attr (const char *key);
|
|
|
|
|
|
int parse_cmdline_option (struct uae_prefs *, char, char *);
|
|
|
|
extern int cfgfile_yesno (const char *option, const char *value, const char *name, int *location);
|
|
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);
|
|
extern void cfgfile_subst_home (char *path, unsigned int maxlen);
|
|
|
|
extern int machdep_parse_option (struct uae_prefs *, const char *option, const char *value);
|
|
extern void machdep_save_options (FILE *, const struct uae_prefs *);
|
|
extern void machdep_default_options (struct uae_prefs *);
|
|
|
|
extern int target_parse_option (struct uae_prefs *, const char *option, const char *value);
|
|
extern void target_save_options (FILE *, const struct uae_prefs *);
|
|
extern void target_default_options (struct uae_prefs *);
|
|
|
|
extern int gfx_parse_option (struct uae_prefs *, const char *option, const char *value);
|
|
extern void gfx_save_options (FILE *, const struct uae_prefs *);
|
|
extern void gfx_default_options (struct uae_prefs *);
|
|
|
|
extern void audio_default_options (struct uae_prefs *p);
|
|
extern void audio_save_options (FILE *f, const struct uae_prefs *p);
|
|
extern int audio_parse_option (struct uae_prefs *p, const char *option, const char *value);
|
|
|
|
extern int cfgfile_load (struct uae_prefs *, const char *filename, int *);
|
|
extern int cfgfile_save (const struct uae_prefs *, const char *filename, int);
|
|
extern void cfgfile_parse_line (struct uae_prefs *p, char *, int);
|
|
extern int cfgfile_parse_option (struct uae_prefs *p, char *option, char *value, int);
|
|
extern int cfgfile_get_description (const char *filename, char *description, int*);
|
|
extern void cfgfile_show_usage (void);
|
|
extern uae_u32 cfgfile_uaelib(int mode, uae_u32 name, uae_u32 dst, uae_u32 maxlen);
|
|
extern uae_u32 cfgfile_uaelib_modify (uae_u32 mode, uae_u32 parms, uae_u32 size, uae_u32 out, uae_u32 outsize);
|
|
extern uae_u32 cfgfile_modify (uae_u32 index, char *parms, uae_u32 size, char *out, uae_u32 outsize);
|
|
extern void cfgfile_addcfgparam (char *);
|
|
extern unsigned int cmdlineparser (const char *s, char *outp[], unsigned int max);
|
|
extern int cfgfile_configuration_change(int);
|
|
|
|
extern void fixup_prefs_dimensions (struct uae_prefs *prefs);
|
|
|
|
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);
|
|
|
|
extern struct uae_prefs currprefs, changed_prefs;
|
|
|
|
extern void machdep_init (void);
|
|
|
|
/* AIX doesn't think it is Unix. Neither do I. */
|
|
#if defined(_ALL_SOURCE) || defined(_AIX)
|
|
#undef __unix
|
|
#define __unix
|
|
#endif
|
|
|
|
#define MAX_COLOR_MODES 5
|
|
|
|
/* #define NEED_TO_DEBUG_BADLY */
|
|
|
|
#if !defined(USER_PROGRAMS_BEHAVE)
|
|
#define USER_PROGRAMS_BEHAVE 0
|
|
#endif
|
|
|
|
/* Some memsets which know that they can safely overwrite some more memory
|
|
* at both ends and use that knowledge to align the pointers. */
|
|
|
|
#define QUADRUPLIFY(c) (((c) | ((c) << 8)) | (((c) | ((c) << 8)) << 16))
|
|
|
|
/* When you call this routine, bear in mind that it rounds the bounds and
|
|
* may need some padding for the array. */
|
|
|
|
#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;
|
|
}
|
|
}
|
|
|
|
/* 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);
|
|
|
|
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 TARGET_AMIGAOS && defined(__GNUC__)
|
|
#include "od-amiga/amiga-kludges.h"
|
|
#endif
|