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"); }
void PowerCallback (int unknown, int pwrflags) { if (pwrflags & PSP_POWER_CB_HOLD_SWITCH) { extern bool8 g_bShowProfilerIno; g_bShowProfilerInfo = (! g_bShowProfilerInfo); } if (pwrflags & PSP_POWER_CB_POWER_SWITCH){ if (g_bROMLoaded) { scePowerSetClockFrequency (222, 222, 111); S9xSetSoundMute (TRUE); g_bSleep = true; save_config (); Memory.SaveSRAM (S9xGetFilename ("srm")); } } else if (pwrflags & PSP_POWER_CB_RESUME_COMPLETE) { g_bSleep = false; } if (pwrflags & PSP_POWER_CB_BATTERY_LOW){ scePowerSetClockFrequency (222,222,111); S9xSetInfoString ("WARNING: PSP Battery is Low! (Automatically Throttling CPU)"); } int cbid; cbid = sceKernelCreateCallback ("Power Callback", (SceKernelCallbackFunction)PowerCallback, NULL); scePowerRegisterCallback (0, cbid); }
/* 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); } }
void S9xLoadState(int num) { const char * file = S9xGetQuickSaveFilename(num); int result = S9xUnfreezeGame(file); S9xSetInfoString("Load slot %u: %s", num, (result ? "done" : "failed")); }
void updateBindingMessage() { if ( keyBindingMode != NOT_BINDING ) { //Hack. Should just have to reset the timer... S9xSetInfoString( bindingNames[keyBindingMode] ); } }
void S9xMessage (int type, int number, const char *message) { const int max = 36 * 3; static char buffer[max + 1]; fprintf(stdout, "%s\n", message); strncpy(buffer, message, max + 1); buffer[max] = 0; S9xSetInfoString(buffer); }
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); } }
static void change_slot (int difference) { static char buf[256]; gui_config->current_save_slot += difference; gui_config->current_save_slot %= 1000; if (gui_config->current_save_slot < 0) gui_config->current_save_slot += 1000; if (!gui_config->rom_loaded) return; snprintf (buf, 256, "State Slot: %d", gui_config->current_save_slot); S9xSetInfoString (buf); GFX.InfoStringTimeout = 60; }
void S9xLoadState (const char *filename) { if (S9xUnfreezeGame (filename)) { sprintf (buf, "%s loaded", filename); S9xSetInfoString (buf); } else { fprintf (stderr, "Failed to load state file: %s\n", filename); } return; }
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 S9xMessage (int type, int, const char *str) { #ifdef DEBUGGER static FILE *out = NULL; if (out == NULL) out = fopen ("out.txt", "w"); fprintf (out, "%s\n", str); #endif S9xSetInfoString (str); // if we can't draw on the screen, messagebox it // also send to stderr/stdout depending on message type switch(type) { case S9X_INFO: if(Settings.StopEmulation) fprintf(stdout, "%s\n", str); break; case S9X_WARNING: fprintf(stdout, "%s\n", str); if(Settings.StopEmulation) MessageBoxA(GUI.hWnd, str, "Warning", MB_OK | MB_ICONWARNING); break; case S9X_ERROR: fprintf(stderr, "%s\n", str); if(Settings.StopEmulation) MessageBoxA(GUI.hWnd, str, "Error", MB_OK | MB_ICONERROR); break; case S9X_FATAL_ERROR: fprintf(stderr, "%s\n", str); if(Settings.StopEmulation) MessageBoxA(GUI.hWnd, str, "Fatal Error", MB_OK | MB_ICONERROR); break; default: fprintf(stdout, "%s\n", str); break; } }
void VideoLogger(void *pixels, int width, int height, int depth, int bytes_per_line) { int fc = S9xMovieGetFrameCounter(); if (fc > 0) framecounter = fc; else framecounter++; if (video) { int i; char *data = (char*)pixels; static int lastwidth = width; // first resolution static int lastheight = height; if (lastwidth != width || lastheight != height) // this is just for informing the encoder that something has changed { printf("Frame %d, resolution changed from %dx%d to %dx%d!\n", fc, lastwidth, lastheight, width, height); lastwidth = width; lastheight = height; } for (i=0; i < height; i++) fwrite(data + i*bytes_per_line, depth, width, video); fflush(video); fflush(audio); drift++; if (maxframes > 0 && __builtin_expect((unsigned)framecounter >= maxframes, 0)) { printf("-maxframes hit\ndrift:%d\n",drift); S9xExit(); } } if (Settings.DisplayPressedKeys==1 || keypressscreen) { uint16 MovieGetJoypad(int i); int buttons = MovieGetJoypad(0); static char buffer[128]; // This string spacing pattern is optimized for the 256 pixel wide screen. sprintf(buffer, "%s %s %s %s %s %s %c%c%c%c%c%c", buttons & SNES_START_MASK ? "Start" : "_____", buttons & SNES_SELECT_MASK ? "Select" : "______", buttons & SNES_UP_MASK ? "Up" : "__", buttons & SNES_DOWN_MASK ? "Down" : "____", buttons & SNES_LEFT_MASK ? "Left" : "____", buttons & SNES_RIGHT_MASK ? "Right" : "_____", buttons & SNES_A_MASK ? 'A':'_', buttons & SNES_B_MASK ? 'B':'_', buttons & SNES_X_MASK ? 'X':'_', buttons & SNES_Y_MASK ? 'Y':'_', buttons & SNES_TL_MASK ? 'L':'_', buttons & SNES_TR_MASK ? 'R':'_' /*framecounter*/); if (Settings.DisplayPressedKeys==1) fprintf(stderr, "%s %d \r", buffer, framecounter); //if (keypressscreen) S9xSetInfoString(buffer); } if (__builtin_expect(messageframe >= 0 && framecounter == messageframe, 0)) { S9xMessage(S9X_INFO, S9X_MOVIE_INFO, message); GFX.InfoStringTimeout = 300; messageframe = -1; } /* if (__builtin_expect(fastforwardpoint >= 0 && framecounter >= fastforwardpoint, 0)) { Settings.FramesToSkip = fastforwarddistance; fastforwardpoint = -1; }*/ }
bool keyboardBindingFilter( const SDL_Event& event ) { if (event.type != SDL_KEYDOWN ) return false; int key = event.key.keysym.sym; bool bindingKeyPressed = ( key == SDLK_EQUALS || key == SDLK_QUESTION ); if ( keyBindingMode == NOT_BINDING ) { if ( bindingKeyPressed ) { //Enter key-binding mode. keyBindingMode = NOT_BINDING; keyBindingMode++; return true; } else { //We're not presently binding, and they're not trying to bind. //Carry on! return false; } } //We're in key-binding mode... if ( bindingKeyPressed ) { //cancel; keyBindingMode = NOT_BINDING; S9xSetInfoString( "Cancelled binding!" ); } //Check that this is a valid key. //XXX: right now we don't support //orange, shift, or sym as keys b/c they are meta keys. int valid = 0 || ( key >= SDLK_a && key <= SDLK_z ) //Alpha || key == SDLK_BACKSPACE || key == SDLK_RETURN || key == SDLK_COMMA || key == SDLK_PERIOD || key == SDLK_SPACE || key == SDLK_AT; if ( valid ) { //We're in binding mode, and they pressed a bindable key! bindingJoypad[keyBindingMode] = key; keyBindingMode++; } if ( keyBindingMode == BINDING_DONE ) { //make this the current joy memcpy( Config.joypad1Mapping, bindingJoypad, sizeof(bindingJoypad) ); //Save their settings... writeOptions( BINDING_CFG, controllerOptions, sizeof(controllerOptions)/sizeof(controllerOptions[0]), true ); //Tell user we're done... updateBindingMessage(); //we're done here! keyBindingMode = NOT_BINDING; } return true; }
void S9xMessage(int type, int message_no, const char *str) { S9xSetInfoString (str); }
void S9xMessage(int /*type */, int /*number */, const char *message) { static char buffer[MAX_MESSAGE_LEN + 1]; snprintf(buffer, MAX_MESSAGE_LEN, "%s", message); S9xSetInfoString(buffer); }
void VideoLogger(void *pixels, int width, int height, int depth) { int fc = S9xMovieGetFrameCounter(); if (fc > 0) framecounter = fc; else framecounter++; if (video) { // if (width != 256 || height != 224) // { // fprintf(stderr, "\nVideoLogger: Warning! width=%d, height=%d\n", width, height); // breakpoint(); // } // This stuff is only good for unix code, but since nitsuja broke unix, I might as well break windows fwrite(pixels, 1024, 224, video); fflush(video); fflush(audio); drift++; if (maxframes > 0 && __builtin_expect(framecounter >= maxframes, 0)) { printf("-maxframes hit\ndrift:%d\n",drift); S9xExit(); } } if (Settings.DisplayPressedKeys || keypressscreen) { static char buffer[128]; sprintf(buffer, "%s %s %s %s %s %s %c%c%c%c%c%c", IPPU.Joypads[0] & SNES_START_MASK ? "Start" : "_____", IPPU.Joypads[0] & SNES_SELECT_MASK ? "Select" : "______", IPPU.Joypads[0] & SNES_UP_MASK ? "Up" : "__", IPPU.Joypads[0] & SNES_DOWN_MASK ? "Down" : "____", IPPU.Joypads[0] & SNES_LEFT_MASK ? "Left" : "____", IPPU.Joypads[0] & SNES_RIGHT_MASK ? "Right" : "_____", IPPU.Joypads[0] & SNES_A_MASK ? 'A':'_', IPPU.Joypads[0] & SNES_B_MASK ? 'B':'_', IPPU.Joypads[0] & SNES_X_MASK ? 'X':'_', IPPU.Joypads[0] & SNES_Y_MASK ? 'Y':'_', IPPU.Joypads[0] & SNES_TL_MASK ? 'L':'_', IPPU.Joypads[0] & SNES_TR_MASK ? 'R':'_' /*framecounter*/); if (Settings.DisplayPressedKeys) fprintf(stderr, "%s %d \r", buffer, framecounter); if (keypressscreen) S9xSetInfoString(buffer); } if (__builtin_expect(messageframe >= 0 && framecounter == messageframe, 0)) { S9xMessage(S9X_INFO, S9X_MOVIE_INFO, message); GFX.InfoStringTimeout = 300; messageframe = -1; } if (__builtin_expect(fastforwardpoint >= 0 && framecounter >= fastforwardpoint, 0)) { // Settings.FramesToSkip = fastforwarddistance; fastforwardpoint = -1; } }