📄 unix.cpp
字号:
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 + -