void S9xQuickLoadSlot (int slot) { char def[PATH_MAX]; char filename[PATH_MAX]; char drive[_MAX_DRIVE]; char dir[_MAX_DIR]; char ext[_MAX_EXT]; if (!gui_config->rom_loaded) return; _splitpath (Memory.ROMFilename, drive, dir, def, ext); snprintf (filename, PATH_MAX, "%s%s%s.%03d", S9xGetDirectory (SNAPSHOT_DIR), SLASH_STR, def, slot); if (file_exists (filename)) S9xFreezeGame (S9xGetFilename (".undo", SNAPSHOT_DIR)); if (S9xUnfreezeGame (filename)) { snprintf (buf, PATH_MAX, "%s.%03d loaded", def, slot); S9xSetInfoString (buf); return; } static const char *digits = "t123456789"; _splitpath (Memory.ROMFilename, drive, dir, def, ext); snprintf (filename, PATH_MAX, "%s%s%s.zs%c", S9xGetDirectory (SNAPSHOT_DIR), SLASH_STR, def, digits[slot]); if (file_exists (filename)) S9xFreezeGame (S9xGetFilename (".undo", SNAPSHOT_DIR)); if (S9xUnfreezeGame (filename)) { snprintf (buf, PATH_MAX, "Loaded ZSNES freeze file %s.zs%c", def, digits [slot]); S9xSetInfoString (buf); return; } S9xMessage (S9X_ERROR, S9X_FREEZE_FILE_NOT_FOUND, "Freeze file not found"); }
bool8 SNES9X_FreezeTo(void) { OSStatus err; FSRef ref; char filename[PATH_MAX + 1]; if (cartOpen) { if (NavFreezeTo(filename)) { err = FSPathMakeRef((unsigned char *) filename, &ref, nil); if (!err) FSDeleteObject(&ref); S9xFreezeGame(filename); ChangeTypeAndCreator(filename, 'SAVE', '~9X~'); err = FSPathMakeRef((unsigned char *) filename, &ref, nil); WriteThumbnailToResourceFork(&ref, 128, 120); return true; } } return false; }
static void SaveStateMem() { SetSaveStateIoModeMemory(&mTempState); S9xFreezeGame("blah"); }
void S9xSaveState(int num) { const char * file = S9xGetQuickSaveFilename(num); int result = S9xFreezeGame(file); S9xSetInfoString("Save slot %u: %s", num, (result ? "done" : "failed")); }
/* QuickSave/Load from S9x base controls.cpp */ void S9xQuickSaveSlot (int slot) { char def[PATH_MAX]; char filename[PATH_MAX]; char drive[_MAX_DRIVE]; char dir[_MAX_DIR]; char ext[_MAX_EXT]; if (!gui_config->rom_loaded) return; _splitpath (Memory.ROMFilename, drive, dir, def, ext); snprintf (filename, PATH_MAX, "%s%s%s.%03d", S9xGetDirectory (SNAPSHOT_DIR), SLASH_STR, def, slot); if (S9xFreezeGame (filename)) { snprintf (buf, PATH_MAX, "%s.%03d saved", def, slot); S9xSetInfoString (buf); } }
bool snes_serialize(uint8_t *data, unsigned size) { memstream_set_buffer(data, size); if (S9xFreezeGame("foo") == FALSE) return false; return true; }
unsigned snes_serialize_size() { uint8_t *tmpbuf = new uint8_t[5000000]; memstream_set_buffer(tmpbuf, 5000000); S9xFreezeGame("foo"); delete [] tmpbuf; return memstream_get_last_size(); }
bool retro_serialize(void *data, size_t size) { memstream_set_buffer((uint8_t*)data, size); if (S9xFreezeGame("") == FALSE) return FALSE; return TRUE; }
EXPORT bool snes_serialize(uint8_t *data, unsigned size) { memstream_set_buffer(data, size); if (S9xFreezeGame("foo") == FALSE) return FALSE; return TRUE; }
static void SaveStateTemp() { char name[SAL_MAX_PATH]; sprintf(name, "%s%s%s", sal_DirectoryGetTemp(), SAL_DIR_SEP, ".svt"); if (!S9xFreezeGame(name)) fprintf(stderr, "Failed to write saved state at %s: %s\n", name, strerror(errno)); }
static void MusicBoxForceFreeze(void) { char filename[PATH_MAX + 1]; strcpy(filename, S9xGetFreezeFilename(999)); strcat(filename, ".tmp"); S9xFreezeGame(filename); }
size_t retro_serialize_size (void) { uint8_t *tmpbuf; tmpbuf = (uint8_t*)malloc(5000000); memstream_set_buffer(tmpbuf, 5000000); S9xFreezeGame(""); free(tmpbuf); return memstream_get_last_size(); }
int os9x_save(const char *ext) { const char *save_filename; os9x_externstate_mode=0; save_filename=S9xGetSaveFilename (ext); //msgBoxLines((char*)save_filename,10); S9xFreezeGame(save_filename); return 0; }
EXPORT unsigned snes_serialize_size (void) { uint8_t *tmpbuf; tmpbuf = (uint8_t*)malloc(5000000); memstream_set_buffer(tmpbuf, 5000000); S9xFreezeGame("foo"); free(tmpbuf); return memstream_get_last_size(); }
void S9xSaveState (const char *filename) { if (S9xFreezeGame (filename)) { sprintf (buf, "%s saved", filename); S9xSetInfoString (buf); } else { fprintf (stderr, "Couldn't save state file: %s\n", filename); } }
void S9xLoadState (const char *filename) { S9xFreezeGame (S9xGetFilename (".undo", SNAPSHOT_DIR)); if (S9xUnfreezeGame (filename)) { sprintf (buf, "%s loaded", filename); S9xSetInfoString (buf); } else { fprintf (stderr, "Failed to load state file: %s\n", filename); } }
void pauseGame() { if (!autosave) return; const char * file = S9xGetFilename(FILE_FREEZE); int result = S9xFreezeGame(file); printf("Freeze: %s", file); if (!result) { Config.snapshotSave = false; // Serves as a flag to Hgw puts(" failed"); } else { puts(" ok"); } }
unsigned snes_serialize_size() { if (S9xFreezeGame(s9x_tmp_file(S9X_TMP_STATE_FILE)) == FALSE) { return 0; } FILE *tmp = fopen(s9x_tmp_file(S9X_TMP_STATE_FILE), "rb"); if (!tmp) return 0; fseek(tmp, 0, SEEK_END); long len = ftell(tmp); fclose(tmp); return (unsigned)len; }
bool8 SNES9X_Freeze(void) { OSStatus err; FSRef ref; int which; const char *filename; if (cartOpen) { MacStopSound(); which = PromptFreezeDefrost(true); if (which >= 0) { filename = S9xGetFreezeFilename(which); err = FSPathMakeRef((unsigned char *) filename, &ref, nil); if (!err) FSDeleteObject(&ref); S9xFreezeGame(filename); ChangeTypeAndCreator(filename, 'SAVE', '~9X~'); err = FSPathMakeRef((unsigned char *) filename, &ref, nil); WriteThumbnailToResourceFork(&ref, 128, 120); SNES9X_Go(); MacStartSound(); return true; } else { MacStartSound(); return false; } } else return false; }
bool snes_serialize(uint8_t *data, unsigned size) { if (S9xFreezeGame(s9x_tmp_file(S9X_TMP_STATE_FILE)) == FALSE) { return false; } FILE *tmp = fopen(s9x_tmp_file(S9X_TMP_STATE_FILE), "rb"); if (!tmp) { return false; } size_t len = fread(data, 1, size, tmp); if (len != size) { fclose(tmp); return false; } fclose(tmp); return true; }
static void SaveStateFile(s8 *filename) { if (!S9xFreezeGame(filename)) fprintf(stderr, "Failed to write saved state at %s: %s\n", filename, strerror(errno)); }
bool8 Snapshot(const char* filename) { return (S9xFreezeGame(filename)); }
void menu_loop(void) { bool8_32 exit_loop = false; char fname[256], ext[8]; char snapscreen_tmp[17120]; uint8 *keyssnes = 0; SaveSlotNum_old = -1; Scale_org = Scale; highres_current=Settings.SupportHiRes; capt_screenshot(); memcpy(snapscreen_tmp,snapscreen,17120); Scale = false; Settings.SupportHiRes=FALSE; S9xDeinitDisplay(); S9xInitDisplay(0, 0); menu_dispupdate(); sys_sleep(100000); SDL_Event event; do { while(SDL_PollEvent(&event)==1) { //PANDORA & DINGOO & WIN32 ----------------------------------------------------- keyssnes = SDL_GetKeyState(NULL); if(keyssnes[sfc_key[UP_1]] == SDL_PRESSED) cursor--; else if(keyssnes[sfc_key[DOWN_1]] == SDL_PRESSED) cursor++; else if( (keyssnes[sfc_key[A_1]] == SDL_PRESSED) || (keyssnes[sfc_key[LEFT_1]] == SDL_PRESSED) || (keyssnes[sfc_key[RIGHT_1]] == SDL_PRESSED) ) { switch(cursor) { case 2: //exit snes9x if (keyssnes[sfc_key[A_1]] == SDL_PRESSED) S9xExit(); break; case 3: //reset snes9x if ((keyssnes[sfc_key[A_1]] == SDL_PRESSED)) { //make sure the sram is stored before resetting the console //it should work without, but better safe than sorry... Memory.SaveSRAM (S9xGetFilename (".srm")); S9xReset(); exit_loop = TRUE; } break; case 4: if (keyssnes[sfc_key[A_1]] == SDL_PRESSED) ShowCredit(); break; case 6: //save state if (keyssnes[sfc_key[A_1]] == SDL_PRESSED) { memcpy(snapscreen,snapscreen_tmp,16050); show_screenshot(); strcpy(fname," Saving..."); S9xDisplayString (temp, GFX.Screen +320/*280*/, 640,80/*204*/); S9xDeinitUpdate (320, 240); sprintf(ext, ".s0%d", SaveSlotNum); strcpy(fname, S9xGetFilename (ext)); save_screenshot(fname); sprintf(ext, ".00%d", SaveSlotNum); strcpy(fname, S9xGetFilename (ext)); S9xFreezeGame (fname); sync(); exit_loop = TRUE; } break; case 7: //load state if (keyssnes[sfc_key[A_1]] == SDL_PRESSED) { sprintf(ext, ".00%d", SaveSlotNum); strcpy(fname, S9xGetFilename (ext)); S9xLoadSnapshot (fname); exit_loop = TRUE; } break; case 8: //select save state slot if (keyssnes[sfc_key[LEFT_1]] == SDL_PRESSED) { if ( SaveSlotNum == 0 ) SaveSlotNum = MAX_SAVE_SLOTS-1; // slots start at 0, so 10 slots means slot 0 to 9 else --SaveSlotNum; } else if (keyssnes[sfc_key[RIGHT_1]] == SDL_PRESSED) { if ( SaveSlotNum == MAX_SAVE_SLOTS-1 ) // slots start at 0, so 10 slots means slot 0 to 9 SaveSlotNum = 0; else ++SaveSlotNum; } break; case 10: // rotate through scalers if (keyssnes[sfc_key[RIGHT_1]] == SDL_PRESSED) { do { g_scale = (blit_scaler_e) ( ( g_scale + 1 ) % bs_max ); } while ( ( blit_scalers [ g_scale ].valid == bs_invalid ) || ( highres_current && !(blit_scalers [ g_scale ].support_hires) ) ); } else if (keyssnes[sfc_key[LEFT_1]] == SDL_PRESSED) { do { g_scale = (blit_scaler_e) ( g_scale - 1 ); if (g_scale < 1) g_scale = (blit_scaler_e)(bs_max-1); } while ( ( blit_scalers [ g_scale ].valid == bs_invalid ) || ( highres_current && !(blit_scalers [ g_scale ].support_hires) ) ); } // now force update the display, so that the new scaler is directly used (fixes some glitches) S9xDeinitDisplay(); S9xInitDisplay(0, 0); break; case 11: // set frameskip if (Settings.SkipFrames == AUTO_FRAMERATE) Settings.SkipFrames = 10; if (keyssnes[sfc_key[LEFT_1]] == SDL_PRESSED) Settings.SkipFrames--; else Settings.SkipFrames++; if(Settings.SkipFrames<=0 || Settings.SkipFrames==10) Settings.SkipFrames = AUTO_FRAMERATE; else if (Settings.SkipFrames>=11) Settings.SkipFrames = 1; break; case 12: // set vsync if (g_vsync) g_vsync = 0; else g_vsync = 1; break; case 13: // set display fps Settings.DisplayFrameRate = !Settings.DisplayFrameRate; break; case 14: // set transparency Settings.Transparency = !Settings.Transparency; break; case 15: // cut lines from top if (keyssnes[sfc_key[RIGHT_1]] == SDL_PRESSED) cut_top++; else if (keyssnes[sfc_key[LEFT_1]] == SDL_PRESSED && cut_top>0) cut_top--; // now force update the display, so that the new scaler is directly used (fixes some glitches) S9xDeinitDisplay(); S9xInitDisplay(0, 0); break; case 16: // cut lines from bottom if (keyssnes[sfc_key[RIGHT_1]] == SDL_PRESSED) cut_bottom++; else if (keyssnes[sfc_key[LEFT_1]] == SDL_PRESSED && cut_bottom>0) cut_bottom--; S9xDeinitDisplay(); S9xInitDisplay(0, 0); break; case 17: // cut from the left if (keyssnes[sfc_key[RIGHT_1]] == SDL_PRESSED) cut_left++; else if (keyssnes[sfc_key[LEFT_1]] == SDL_PRESSED && cut_left>0) cut_left--; S9xDeinitDisplay(); S9xInitDisplay(0, 0); break; case 18: // cut from the right if (keyssnes[sfc_key[RIGHT_1]] == SDL_PRESSED) cut_right++; else if (keyssnes[sfc_key[LEFT_1]] == SDL_PRESSED && cut_right>0) cut_right--; S9xDeinitDisplay(); S9xInitDisplay(0, 0); break; case 20: //offer an option to change to alternative sample decoding //cf. http://www.gp32x.com/board/index.php?/topic/55378-snes9x4d4p-another-new-build-now-with-hi-res-and-new-rom-picker/page__view__findpost__p__958860 if (Settings.AltSampleDecode) Settings.AltSampleDecode = 0; else Settings.AltSampleDecode = 1; break; } } if(cursor==1) cursor=20; else if(cursor==21) cursor=2; if(cursor==5 || cursor==9 || cursor==19) { if(keyssnes[sfc_key[UP_1]] == SDL_PRESSED) cursor--; else if(keyssnes[sfc_key[DOWN_1]] == SDL_PRESSED) cursor++; } menu_dispupdate(); sys_sleep(1000); break; } } while( exit_loop!=TRUE && keyssnes[sfc_key[B_1]] != SDL_PRESSED ); Scale = Scale_org; Settings.SupportHiRes=highres_current; S9xDeinitDisplay(); S9xInitDisplay(0, 0); }