⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 unix.cpp

📁 著名SFC模拟器Snes9x的源代码。
💻 CPP
📖 第 1 页 / 共 4 页
字号:
    if (snapshot_filename)    {	int Flags = CPU.Flags & (DEBUG_MODE_FLAG | TRACE_FLAG);	if (!S9xLoadSnapshot (snapshot_filename))	    exit (1);	CPU.Flags |= Flags;    }    S9xGraphicsMode ();    sprintf (String, "\"%s\" %s: %s", Memory.ROMName, TITLE, VERSION);    S9xSetTitle (String);    #ifdef JOYSTICK_SUPPORT    uint32 JoypadSkip = 0;#endif    InitTimer ();    if (!Settings.APUEnabled)	S9xSetSoundMute (FALSE);#if 0    {	FILE *fs = fopen ("test.bin", "r");	if (fs)	{	    memset (IAPU.RAM, 0, 1024 * 64);	    int bytes = fread (IAPU.RAM + 1024, 1, 13, fs);	    bytes = fread (IAPU.RAM + 1024, 1, 1024 * 63, fs);	    fclose (fs);#ifdef SPCTOOL	    _FixSPC (1024, 0, 0, 0, 0, 0xff);#else	    IAPU.PC = IAPU.RAM + 1024;#endif	    APU.Flags ^= TRACE_FLAG;	    extern FILE *apu_trace;	    if (APU.Flags & TRACE_FLAG)	    {#ifdef SPCTOOL		printf ("ENABLED\n");		_SetSPCDbg (TraceSPC);                   //Install debug handler#endif		if (apu_trace == NULL)		    apu_trace = fopen ("aputrace.log", "wb");	    }	    CPU.Cycles = 1024 * 10;	    APU_EXECUTE ();	    exit (0);	}    }#endif    while (1)    {	if (!Settings.Paused#ifdef DEBUGGER	    || (CPU.Flags & (DEBUG_MODE_FLAG | SINGLE_STEP_FLAG))#endif           )	    S9xMainLoop ();	if (Settings.Paused#ifdef DEBUGGER	    || (CPU.Flags & DEBUG_MODE_FLAG)#endif           )	{	    S9xSetSoundMute (TRUE);	}#ifdef DEBUGGER	if (CPU.Flags & DEBUG_MODE_FLAG)	{	    S9xDoDebug ();	}	else#endif	if (Settings.Paused)	    S9xProcessEvents (TRUE);#ifdef JOYSTICK_SUPPORT	if (Settings.JoystickEnabled && (JoypadSkip++ & 1) == 0)	    ReadJoysticks ();#endif	S9xProcessEvents (FALSE);		if (!Settings.Paused#ifdef DEBUGGER	    && !(CPU.Flags & DEBUG_MODE_FLAG)#endif	               )	{	    S9xSetSoundMute (FALSE);	}    }    return (0);}void S9xAutoSaveSRAM (){    Memory.SaveSRAM (S9xGetFilename (".srm"));}void S9xExit (){    S9xSetSoundMute (TRUE);    S9xDeinitDisplay ();    Memory.SaveSRAM (S9xGetFilename (".srm"));    S9xSaveCheatFile (S9xGetFilename (".cht"));    Memory.Deinit ();    S9xDeinitAPU ();#ifdef _NETPLAY_SUPPORT    if (Settings.NetPlay)	S9xNetPlayDisconnect ();#endif        exit (0);}void S9xInitInputDevices (){#ifdef JOYSTICK_SUPPORT    InitJoysticks ();#endif}#ifdef JOYSTICK_SUPPORTvoid InitJoysticks (){#ifdef JSIOCGVERSION    int version;    unsigned char axes, buttons;    if ((js_fd [0] = open (js_device [0], O_RDONLY | O_NONBLOCK)) < 0)    {	perror (js_device [0]);	return;    }    if (ioctl (js_fd [0], JSIOCGVERSION, &version))    {        puts("joystick: You need at least driver version 1.0 for joystick support");	close (js_fd [0]);	return;    }    js_fd [1] = open (js_device [1], O_RDONLY | O_NONBLOCK);    js_fd [2] = open (js_device [2], O_RDONLY | O_NONBLOCK);    js_fd [3] = open (js_device [3], O_RDONLY | O_NONBLOCK);#ifdef JSIOCGNAME    char name [130];    bzero (name, 128);    if (ioctl (js_fd [0], JSIOCGNAME(128), name) > 0)     {        printf ("Using %s (%s) as pad1", name, js_device [0]);        if (js_fd [1] > 0)	{	    ioctl (js_fd [1], JSIOCGNAME(128), name);	    printf ("and %s (%s) as pad2", name, js_device [1]);	}    }     else#endif    {	ioctl (js_fd [0], JSIOCGAXES, &axes);	ioctl (js_fd [0], JSIOCGBUTTONS, &buttons);	printf ("Using %d-axis %d-button joystick (%s) as pad1", axes, buttons, js_device [0]);	if (js_fd [1] > 0)	{	    ioctl (js_fd [0], JSIOCGAXES, &axes);	    ioctl (js_fd [0], JSIOCGBUTTONS, &buttons);	    printf (" and %d-axis %d-button (%s) as pad2", axes, buttons, js_device [1]);	}    }    puts (".");#endif}void ReadJoysticks (){#ifdef JSIOCGVERSION    struct js_event js_ev;    int i;    for (i = 0; i < 4 && js_fd [i] >= 0; i++)    {	while (read (js_fd[i], &js_ev, sizeof (struct js_event)) == sizeof (struct js_event) )	{	    switch (js_ev.type & ~JS_EVENT_INIT)	    {	    case JS_EVENT_AXIS:		if (js_ev.number == 0)		{		    if(js_ev.value < -16384)		    {			joypads [i] |= SNES_LEFT_MASK; 			joypads [i] &= ~SNES_RIGHT_MASK;			break;		    }		    if (js_ev.value > 16384)		    {			joypads [i] &= ~SNES_LEFT_MASK;			joypads [i] |= SNES_RIGHT_MASK; 			break;		    }		    joypads [i] &= ~SNES_LEFT_MASK;		    joypads [i] &= ~SNES_RIGHT_MASK;		    break;			}		if (js_ev.number == 1)		{		    if (js_ev.value < -16384)		    {			joypads [i] |= SNES_UP_MASK; 			joypads [i] &= ~SNES_DOWN_MASK;			break;		    }		    if (js_ev.value > 16384)		    {			joypads [i] &= ~SNES_UP_MASK;			joypads [i] |= SNES_DOWN_MASK; 			break;		    }		    joypads [i] &= ~SNES_UP_MASK;		    joypads [i] &= ~SNES_DOWN_MASK;		    break;			}		break;	    case JS_EVENT_BUTTON:		if (js_ev.number > 15)		    break;		if (js_ev.value)		    joypads [i] |= js_map_button [i][js_ev.number];		else		    joypads [i] &= ~js_map_button [i][js_ev.number];		break;	    }	}    }#endif}#endif // defined (JOYSTICK_SUPPORT)const char *GetHomeDirectory (){    return (getenv ("HOME"));}const char *S9xGetSnapshotDirectory (){    static char filename [PATH_MAX];    const char *snapshot;        if (!(snapshot = getenv ("SNES9X_SNAPSHOT_DIR")) &&	!(snapshot = getenv ("SNES96_SNAPSHOT_DIR")))    {	const char *home = GetHomeDirectory ();	strcpy (filename, home);	strcat (filename, SLASH_STR);	strcat (filename, ".snes96_snapshots");	mkdir (filename, 0777);	chown (filename, getuid (), getgid ());    }    else	return (snapshot);    return (filename);}const char *S9xGetFilename (const char *ex){    static char filename [PATH_MAX + 1];    char drive [_MAX_DRIVE + 1];    char dir [_MAX_DIR + 1];    char fname [_MAX_FNAME + 1];    char ext [_MAX_EXT + 1];    _splitpath (Memory.ROMFilename, drive, dir, fname, ext);    strcpy (filename, S9xGetSnapshotDirectory ());    strcat (filename, SLASH_STR);    strcat (filename, fname);    strcat (filename, ex);    return (filename);}const char *S9xGetROMDirectory (){    const char *roms;        if (!(roms = getenv ("SNES9X_ROM_DIR")) &&	!(roms = getenv ("SNES96_ROM_DIR")))	return ("." SLASH_STR "roms");    else	return (roms);}const char *S9xBasename (const char *f){    const char *p;    if ((p = strrchr (f, '/')) != NULL || (p = strrchr (f, '\\')) != NULL)	return (p + 1);    return (f);}const char *S9xChooseFilename (bool8 read_only){    char def [PATH_MAX + 1];    char title [PATH_MAX + 1];    char drive [_MAX_DRIVE + 1];    char dir [_MAX_DIR + 1];    char ext [_MAX_EXT + 1];    _splitpath (Memory.ROMFilename, drive, dir, def, ext);    strcat (def, ".s96");    sprintf (title, "%s snapshot filename",	    read_only ? "Select load" : "Choose save");    const char *filename;    S9xSetSoundMute (TRUE);    filename = S9xSelectFilename (def, S9xGetSnapshotDirectory (), "s96", title);    S9xSetSoundMute (FALSE);    return (filename);}bool8 S9xOpenSnapshotFile (const char *fname, bool8 read_only, STREAM *file){    char filename [PATH_MAX + 1];    char drive [_MAX_DRIVE + 1];    char dir [_MAX_DIR + 1];    char ext [_MAX_EXT + 1];    _splitpath (fname, drive, dir, filename, ext);    if (*drive || *dir == '/' ||	(*dir == '.' && (*(dir + 1) == '/'        )))    {	strcpy (filename, fname);	if (!*ext)	    strcat (filename, ".s96");    }    else    {	strcpy (filename, S9xGetSnapshotDirectory ());	strcat (filename, SLASH_STR);	strcat (filename, fname);	if (!*ext)	    strcat (filename, ".s96");    }    #ifdef ZLIB    if (read_only)    {	if ((*file = OPEN_STREAM (filename, "rb")))	    return (TRUE);    }    else    {	if ((*file = OPEN_STREAM (filename, "wb")))	{	    chown (filename, getuid (), getgid ());	    return (TRUE);	}    }#else    char command [PATH_MAX];        if (read_only)    {	sprintf (command, "gzip -d <\"%s\"", filename);	if (*file = popen (command, "r"))	    return (TRUE);    }    else    {	sprintf (command, "gzip --best >\"%s\"", filename);	if (*file = popen (command, "wb"))	    return (TRUE);    }#endif    return (FALSE);}void S9xCloseSnapshotFile (STREAM file){#ifdef ZLIB    CLOSE_STREAM (file);#else    pclose (file);#endif}bool8 S9xInitUpdate (){    return (TRUE);}bool8 S9xDeinitUpdate (int Width, int Height, bool8 /*sixteen_bit*/){    S9xPutImage (Width, Height);    return (TRUE);}static unsigned long now (){    static unsigned long seconds_base = 0;    struct timeval tp;    gettimeofday (&tp, NULL);    if (!seconds_base)	seconds_base = tp.tv_sec;    return ((tp.tv_sec - seconds_base) * 1000 + tp.tv_usec / 1000);}void OutputFrameRate (){    static int FrameCount = 0;    static unsigned long then = now ();    if (++FrameCount % 60 == 0)    {	unsigned long here = now ();//	printf ("\rFrame rate: %.2lfms", (double) (here - then) / 60);//	fflush (stdout);	then = here;    }}void _makepath (char *path, const char *, const char *dir,		const char *fname, const char *ext){    if (dir && *dir)    {	strcpy (path, dir);	strcat (path, "/");    }    else	*path = 0;    strcat (path, fname);    if (ext && *ext)    {        strcat (path, ".");        strcat (path, ext);    }}void _splitpath (const char *path, char *drive, char *dir, char *fname,		 char *ext){    *drive = 0;    char *slash = strrchr (path, '/');    if (!slash)	slash = strrchr (path, '\\');    char *dot = strrchr (path, '.');    if (dot && slash && dot < slash)	dot = NULL;    if (!slash)    {	strcpy (dir, "");	strcpy (fname, path);        if (dot)        {	    *(fname + (dot - path)) = 0;	    strcpy (ext, dot + 1);        }	else	    strcpy (ext, "");    }    else

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -