kopia lustrzana https://github.com/Jean-MarcHarvengt/MCUME
198 wiersze
5.0 KiB
C
198 wiersze
5.0 KiB
C
/*
|
|
* UAE - The Un*x Amiga Emulator
|
|
*
|
|
* Stuff
|
|
*
|
|
* Copyright 1995, 1996 Ed Hanway
|
|
* Copyright 1995-97 Bernd Schmidt
|
|
*/
|
|
|
|
#define UAEMAJOR 0
|
|
#define UAEMINOR 6
|
|
#define UAEURSAMINOR 9
|
|
|
|
#define MAX_FILENAME 64
|
|
|
|
typedef enum { KBD_LANG_US, KBD_LANG_DE, KBD_LANG_SE, KBD_LANG_FR, KBD_LANG_IT, KBD_LANG_ES } KbdLang;
|
|
|
|
extern int version;
|
|
|
|
struct uae_prefs {
|
|
int framerate;
|
|
int illegal_mem;
|
|
int no_xhair;
|
|
int use_serial;
|
|
int automount_uaedev;
|
|
|
|
int fake_joystick;
|
|
KbdLang keyboard_lang;
|
|
int allow_save;
|
|
int emul_accuracy;
|
|
int test_drawing_speed;
|
|
|
|
int produce_sound;
|
|
int sound_bits;
|
|
int sound_freq;
|
|
int sound_minbsiz;
|
|
int sound_maxbsiz;
|
|
|
|
int gfx_width;
|
|
int gfx_height;
|
|
int gfx_lores;
|
|
int gfx_linedbl;
|
|
int gfx_correct_aspect;
|
|
int gfx_xcenter;
|
|
int gfx_ycenter;
|
|
int color_mode;
|
|
|
|
|
|
int blits_32bit_enabled;
|
|
int immediate_blits;
|
|
char df[4][MAX_FILENAME];
|
|
char hf0[MAX_FILENAME];
|
|
};
|
|
|
|
#define JSEM_DECODEVAL(n,v) (((v) >> (n*8)) & 255)
|
|
/* Determine how port n is configured with the value v in fake_joystick */
|
|
#define JSEM_ISJOY0(n,v) (JSEM_DECODEVAL(n,v) == 0)
|
|
#define JSEM_ISJOY1(n,v) (JSEM_DECODEVAL(n,v) == 1)
|
|
#define JSEM_ISMOUSE(n,v) (JSEM_DECODEVAL(n,v) == 2)
|
|
#define JSEM_ISNUMPAD(n,v) (JSEM_DECODEVAL(n,v) == 3)
|
|
#define JSEM_ISCURSOR(n,v) (JSEM_DECODEVAL(n,v) == 4)
|
|
#define JSEM_ISSOMEWHEREELSE(n,v) (JSEM_DECODEVAL(n,v) == 5)
|
|
/* These preferences make sense only at startup. */
|
|
extern int no_gui, use_debugger, use_gfxlib;
|
|
|
|
extern struct uae_prefs currprefs, changed_prefs;
|
|
|
|
|
|
extern void write_log (const char *);
|
|
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
|
|
|
|
extern char romfile[], prtname[], sername[];
|
|
|
|
/*
|
|
* 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
|
|
|
|
/* 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;
|
|
l8:
|
|
if (!len)
|
|
break;
|
|
len--;
|
|
p2 += 8;
|
|
}
|
|
}
|
|
|
|
#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;
|
|
}
|
|
}
|
|
|
|
static __inline__ int memcmpy(void *foo, const void *bar, int len)
|
|
{
|
|
int differs = memcmp(foo, bar, len);
|
|
memcpy(foo, bar, len);
|
|
return differs;
|
|
}
|
|
|
|
#define fast_memcmp memcmp
|
|
|
|
/*
|
|
* Frame rate hack. Currently only implemented for Pentium (P6?) CPUs.
|
|
*/
|
|
#if !defined __GNUC_MINOR__
|
|
#undef HAVE_RDTSC
|
|
#endif
|
|
|
|
#undef HAVE_INLINE_RPT
|
|
#ifdef HAVE_RDTSC
|
|
#define FRAME_RATE_HACK
|
|
|
|
typedef unsigned long frame_time_t;
|
|
static inline frame_time_t read_processor_time (void)
|
|
{
|
|
frame_time_t foo;
|
|
/* Don't assume the assembler knows rdtsc */
|
|
__asm__ (".byte 0x0f,0x31" : "=a" (foo) :);
|
|
return foo;
|
|
}
|
|
#define HAVE_INLINE_RPT
|
|
#else
|
|
typedef int frame_time_t;
|
|
#endif
|
|
|
|
#if defined FRAME_RATE_HACK && !defined HAVE_INLINE_RPT
|
|
extern frame_time_t read_processor_time (void);
|
|
#endif
|
|
extern frame_time_t vsynctime, vsyncmintime;
|
|
|
|
#if defined(AMIGA) && defined(__GNUC__)
|
|
#include "md-amiga/amiga-kludges.h"
|
|
#endif
|