예제 #1
0
 void SaveState()
 {
     LOG_DBG("SaveState()\n");
     char * currentsavestate;
     currentsavestate = new char [999];
     strcpy(currentsavestate, Settings.PS3PathSaveStates.c_str());
     LOG_DBG("Settings.PS3PathSaveStates.size() = %d\n", Settings.PS3PathSaveStates.size());
     LOG_DBG("Settings.PS3PathSaveStates = %s\n", Settings.PS3PathSaveStates.c_str());
     LOG_DBG("Savestate path: %s \n",currentsavestate);
     ChangePathAndExt(current_rom,".sav",currentsavestate);
     FILE *f = fopen(currentsavestate,"wb");
     if (f)
     {
         LOG("f: %s\n", currentsavestate);
         printf("Enter in savestate\n");
         uint8 *buf =(uint8 *)memalign(32,STATE_SIZE);
         int state_size = state_save(buf);
         LOG_DBG("Writing savestate...\n");
         fwrite(buf, state_size, 1, f);
         LOG_DBG("Writing of savestate done!\n");
         fclose(f);
         free(buf);
         LOG_DBG("Out from savestate\n");
     }
 }
예제 #2
0
void save_state(const char *dest) {
    FILE *f = fopen(dest, "w+b");
    if (f) {
        state_save(state_buf);
        fwrite(&state_buf, STATE_SIZE, 1, f);
        fclose(f);
        SYSMenuDisplayString("Saved state to %s", dest);
    }
}
예제 #3
0
bool
cmd_save ( char * const cmd , State * const state )
{
  /*
   * Try and pull a filename off the command.
   */
  char* filename = strtok ( NULL , " \n" );

  /*
   * Initialize the return value to false, for failure.
   */
  bool retval = false;

  if ( filename )
    {
      /*
       * If a filename was given, try and save to filename.
       */

      /*
       * Attempt to open the file. If successful, save the state to
       * the file. Close the file.
       */
      FILE* savefile = fopen ( filename , "w" );
      retval = savefile && state_save ( state , savefile );
      fclose ( savefile );
   }
  else
    {
      /*
       * If no filename was provided, save to stdout.
       */

      retval = state_save ( state , stdout );
    }

  /*
   * Return the retval.
   */
  return retval;
};
예제 #4
0
GPGX_EX int gpgx_state_size(void *dest, int size)
{
	int actual = 0;
	if (size < gpgx_state_max_size())
		return -1;

	actual = state_save((unsigned char*) dest);
	if (actual > size)
		// fixme!
		return -1;
	return actual;
}
예제 #5
0
void Application::saveState(const int i)
{
     char path[MAX_PATH];
     makePath(_stateDir, path);
     sprintf(path, "%s%d.sav", path, i);

     LOGD("SaveState: %s", path);

     FILE *f = fopen(path,"wb");
     if (f)
     {
          uint8 *buf =(uint8 *)memalign(32,STATE_SIZE);
          int state_size = state_save(buf, 1);
          fwrite(buf, state_size, 1, f);
          fclose(f);
          free(buf);
     }
}
예제 #6
0
//initialize movie data for recording
int movie_record()
{
	//get rid of previous data
	if(nes->movie.data)
		movie_unload();

	//initialize the movie struct
	nes->movie.mode &= ~7;
	nes->movie.mode |= MOVIE_RECORD;
	nes->movie.pos = 0;
	nes->movie.len = MOVIE_PREALLOC_SIZE;
	nes->movie.data = (u8*)mem_alloc(nes->movie.len);
	nes->movie.startframe = nes->ppu.frames;

	//save state here for loading
	nes->movie.state = memfile_create();
	state_save(nes->movie.state);

	return(0);
}
예제 #7
0
static int gui_state_save(int slot)
{
	if (sshot_img) {
		free(sshot_img);
		sshot_img = NULL;
	}

	// Remember which saveslot was accessed last
	saveslot = slot;

	video_clear();
	port_printf(160-(6*8/2), 120-(8/2), "SAVING");
	video_flip();

	if (state_save(slot) < 0) {
		// Error saving

		for (;;) {
			u32 keys = key_read();
			video_clear();
			// check keys
			if (keys) {
				key_reset();
				return 0;
			}

			port_printf(160-(11*8/2), 120-12, "SAVE FAILED");
			port_printf(160-(18*8/2), 120+12, "Out of disk space?");
			video_flip();
			timer_delay(75);
		}
	}

	// Return -1 to gui_StateSave() caller menu, so it knows
	//  to tell main menu to return back to main menu.
	return -1;
}
예제 #8
0
파일: event.c 프로젝트: nocrew/ostis
static int event_key(SDL_KeyboardEvent key, int state)
{
  SDL_Keysym k;

  k = key.keysym;

  if((k.mod & KMOD_CTRL) && (k.mod & KMOD_LGUI) && (k.mod & KMOD_SHIFT)) {
    if(k.sym == SDLK_F1) {
      screen_set_delay(0);
    } else if(k.sym == SDLK_F2) {
      screen_set_delay(10000);
    } else if(k.sym == SDLK_F3) {
      screen_set_delay(20000);
    } else if(k.sym == SDLK_F4) {
      screen_set_delay(30000);
    } else if(k.sym == SDLK_F5) {
      screen_set_delay(40000);
    } else if(k.sym == SDLK_F6) {
      screen_set_delay(50000);
    } else if(k.sym == SDLK_F7) {
      screen_set_delay(75000);
    } else if(k.sym == SDLK_F8) {
      screen_set_delay(100000);
    } else if(k.sym == SDLK_F9) {
      screen_set_delay(150000);
    } else if(k.sym == SDLK_F10) {
      screen_set_delay(200000);
    } else if(k.sym == SDLK_F11) {
      screen_set_delay(500000);
    } else if(k.sym == SDLK_F12) {
      screen_set_delay(1000000);
    }
    return EVENT_NONE;
  }
  
  if((k.sym == ' ') || (k.sym == 27) ||
     ((k.sym >= '0') && (k.sym <= '9')) ||
     ((k.sym >= 'a') && (k.sym <= 'z')) ||
     (k.sym == '\'') || (k.sym == ',') || (k.sym == '-') || (k.sym == '.') ||
     (k.sym == '/') || (k.sym == ';') || (k.sym == '=') || (k.sym == '[') ||
     (k.sym == '\\') || (k.sym == ']') || (k.sym == '`') ||
     (k.sym == '\r') || (k.sym == '\b') || (k.sym == '\t')
     ) {
    ikbd_queue_key(scancode[k.sym], state);
  } else if((k.sym >= SDLK_F1) && (k.sym <= SDLK_F10)) {
    ikbd_queue_key(SCAN_F1+k.sym-SDLK_F1, state);
  } else if(k.sym == SDLK_F11) {
    if(k.mod & KMOD_CTRL && state == EVENT_RELEASE) {
      printf("DEBUG: Toggle screen disable\n");
      screen_disable(!screen_check_disable());
    } else {
      if(state == EVENT_RELEASE) {
        if(debugger)
          return EVENT_DEBUG;
        else {
          state_save("ostis.state", state_collect());
          SDL_Quit();
          exit(0);
        }
      }
    }
  } else if(k.sym == SDLK_PAUSE) {
    if(k.mod & KMOD_CTRL) {
      if(state == EVENT_RELEASE) {
        screen_toggle_fullscreen();
      }
    } else {
      if(state == EVENT_RELEASE) {
        screen_toggle_grab();
      }
    }
  } else if(k.sym == SDLK_PRINTSCREEN) {
    if(k.mod & KMOD_ALT) {
      if(state == EVENT_RELEASE) {
        printf("DEBUG: Start debugger\n");
      }
    } else {
      if(state == EVENT_RELEASE) {
	// TODO: toggle this state.
	diag_set_module_levels("CPU0:6");
      }
    }
  } else if(k.sym == SDLK_F12) {
    if(state == EVENT_RELEASE) {
      printf("-------------------------------------------\n");
      cpu_print_status(CPU_USE_CURRENT_PC);
      printf("- - - - - - - - - - - - - - - - - - - - - -\n");
      mfp_print_status();
      printf("- - - - - - - - - - - - - - - - - - - - - -\n");
      ikbd_print_status();
      printf("DEBUG: Speed: %g FPS\n", screen_fps());
      printf("-------------------------------------------\n");
    }
  } else if(k.sym == SDLK_F13) {
    if(state == EVENT_RELEASE) {
      printf("DEBUG: Collecting state\n");
      laststate = state_collect();
    }
  } else if(k.sym == SDLK_F14) {
    if(state == EVENT_RELEASE) {
      printf("DEBUG: Restoring state\n");
      state_restore(laststate);
    }
  } else if(k.sym == SDLK_LSHIFT) {
    ikbd_queue_key(SCAN_LSHIFT, state);
  } else if(k.sym == SDLK_RSHIFT) {
    ikbd_queue_key(SCAN_RSHIFT, state);
  } else if(k.sym == SDLK_LCTRL) {
    ikbd_queue_key(SCAN_CONTROL, state);
  } else if(k.sym == SDLK_LALT) {
    ikbd_queue_key(SCAN_ALT, state);
  } else if(k.sym == SDLK_UP) {
    ikbd_queue_key(SCAN_UP, state);
  } else if(k.sym == SDLK_DOWN) {
    ikbd_queue_key(SCAN_DOWN, state);
  } else if(k.sym == SDLK_LEFT) {
    ikbd_queue_key(SCAN_LEFT, state);
  } else if(k.sym == SDLK_RIGHT) {
    ikbd_queue_key(SCAN_RIGHT, state);
  } else if(k.sym == SDLK_END) {
    ikbd_queue_key(SCAN_INSERT, state);
  } else if(k.sym == SDLK_PAGEDOWN) {
    ikbd_queue_key(SCAN_DELETE, state);
  } else {
    printf("Unimplemented key: %d\n", k.sym);
  }
  return EVENT_NONE;
}
예제 #9
0
파일: file_slot.c 프로젝트: XClouded/xielei
int slot_save(int slot, int device)
{
  char filename[MAXPATHLEN];
  int filesize, done = 0;
  int offset = device ? 2112 : 0;
  u8 *savebuffer;

  if (slot > 0)
  {
    /* allocate buffer */
    savebuffer = (u8 *)memalign(32,STATE_SIZE);
    if (!savebuffer)
    {
      GUI_WaitPrompt("Error","Unable to allocate memory !");
      return 0;
    }

    GUI_MsgBoxOpen("Information","Saving State ...",1);
    filesize = state_save(&savebuffer[offset]);
  }
  else
  {
    if (!sram.on)
    {
       GUI_WaitPrompt("Error","SRAM is disabled !");
       return 0;
    }

    /* allocate buffer */
    savebuffer = (u8 *)memalign(32,0x10000+offset);
    if (!savebuffer)
    {
      GUI_WaitPrompt("Error","Unable to allocate memory !");
      return 0;
    }

    GUI_MsgBoxOpen("Information","Saving SRAM ...",1);
    memcpy(&savebuffer[offset], sram.sram, 0x10000);
    sram.crc = crc32(0, sram.sram, 0x10000);
    filesize = 0x10000;
  }

  if (!device)
  {
    /* FAT support */
    if (slot > 0)
      sprintf(filename, "%s/saves/%s.gp%d", DEFAULT_PATH, rom_filename, slot - 1);
    else
      sprintf(filename, "%s/saves/%s.srm", DEFAULT_PATH, rom_filename);

    /* Open file */
    FILE *fp = fopen(filename, "wb");
    if (!fp)
    {
      GUI_WaitPrompt("Error","Unable to open file !");
      free(savebuffer);
      return 0;
    }

    /* Write from buffer (2k blocks) */
    while (filesize > FILECHUNK)
    {
      fwrite(savebuffer + done, FILECHUNK, 1, fp);
      done += FILECHUNK;
      filesize -= FILECHUNK;
    }

    /* Write remaining bytes */
    fwrite(savebuffer + done, filesize, 1, fp);
    done += filesize;
    fclose(fp);
  }
  else
  {
    /* Memory Card support */
    if (slot > 0)
      sprintf(filename, "MD-%04X.gp%d", rominfo.realchecksum, slot - 1);
    else
      sprintf(filename, "MD-%04X.srm", rominfo.realchecksum);

    /* Initialise the CARD system */
    char action[64];
    memset(&SysArea, 0, CARD_WORKAREA);
    CARD_Init("GENP", "00");

    /* CARD slot */
    device--;

    /* Attempt to mount the card */
    if (!CardMount(device))
    {
      GUI_WaitPrompt("Error","Unable to mount memory card");
      free(savebuffer);
      return 0;
    }

    /* Retrieve the sector size */
    u32 SectorSize = 0;
    int CardError = CARD_GetSectorSize(device, &SectorSize);
    if (!SectorSize)
    {
      sprintf(action, "Invalid sector size (%d)", CardError);
      GUI_WaitPrompt("Error",action);
      CARD_Unmount(device);
      free(savebuffer);
      return 0;
    }

    /* Build the output buffer */
    char comment[2][32] = { {"Genesis Plus GX"}, {"SRAM Save"} };
    strcpy (comment[1], filename);
    memcpy (&savebuffer[0], &icon, 2048);
    memcpy (&savebuffer[2048], &comment[0], 64);

    /* Adjust file size */
    filesize += 2112;
    if (filesize % SectorSize)
      filesize = ((filesize / SectorSize) + 1) * SectorSize;

    /* Check if file already exists */
    card_file CardFile;
    if (CARD_Open(device, filename, &CardFile) == CARD_ERROR_READY)
    {
      int size = filesize - CardFile.len;
      CARD_Close(&CardFile);
      memset(&CardFile,0,sizeof(CardFile));

      /* Check file new size */
      if (size > 0)
      {
        CardError = CARD_Create(device, "TEMP", size, &CardFile);
        if (CardError)
        {
          sprintf(action, "Unable to increase file size (%d)", CardError);
          GUI_WaitPrompt("Error",action);
          CARD_Unmount(device);
          free(savebuffer);
          return 0;
        }

        /* delete temporary file */
        CARD_Close(&CardFile);
        memset(&CardFile,0,sizeof(CardFile));
        CARD_Delete(device, "TEMP");
      }

      /* delete previously existing file */
      CARD_Delete(device, filename);
    }

    /* Create a new file */
    CardError = CARD_Create(device, filename, filesize, &CardFile);
    if (CardError)
    {
      sprintf(action, "Unable to create file (%d)", CardError);
      GUI_WaitPrompt("Error",action);
      CARD_Unmount(device);
      free(savebuffer);
      return 0;
    }

    /* Update file informations */
    time_t rawtime;
    time(&rawtime);
    card_stat CardStatus;
    CARD_GetStatus(device, CardFile.filenum, &CardStatus);
    CardStatus.icon_addr = 0x0;
    CardStatus.icon_fmt = 2;
    CardStatus.icon_speed = 1;
    CardStatus.comment_addr = 2048;
    CardStatus.time = rawtime;
    CARD_SetStatus(device, CardFile.filenum, &CardStatus);

    /* Write file sectors */
    while (filesize > 0)
    {
      CARD_Write(&CardFile, &savebuffer[done], SectorSize, done);
      filesize -= SectorSize;
      done += SectorSize;
    }

    /* Close file */
    CARD_Close(&CardFile);
    CARD_Unmount(device);
  }

  GUI_MsgBoxClose();
  free(savebuffer);

  /* Save screenshot */
  if (slot && !device)
  {
    sprintf(filename,"%s/saves/%s__%d.png", DEFAULT_PATH, rom_filename, slot - 1);
    gxSaveScreenshot(filename);
  }

  return 1;
}
예제 #10
0
GPGX_EX int gpgx_state_save(void *dest, int size)
{
	return state_save((unsigned char*) dest) == size;
}
예제 #11
0
파일: rccmds.c 프로젝트: r043v/yAnl
static int cmd_savestate(int argc, char **argv)
{
	state_save(argc > 1 ? atoi(argv[1]) : -1);
	return 0;
}
예제 #12
0
파일: emulator.c 프로젝트: shangluo/rxnes
void emulator_save_state()
{
	state_save();
}