bool LoadRAM (char * filepath, bool silent) { int offset = 0; bool retval = false; int device; if(!FindDevice(filepath, &device)) return 0; if(GameInfo->type == GIT_FDS) // RAM saves don't exist for FDS games return false; AllocSaveBuffer (); offset = LoadFile(filepath, silent); // Check to see if this is a PocketNES save file if (goomba_is_sram(savebuffer)) { void* cleaned = goomba_cleanup(savebuffer); if (!cleaned) { ErrorPrompt(goomba_last_error()); } else if (cleaned != savebuffer) { memcpy(savebuffer, cleaned, GOOMBA_COLOR_SRAM_SIZE); free(cleaned); } // Look for just one save file. If there aren't any, or there is more than one, don't read any data. const stateheader* sh1 = NULL; const stateheader* sh2 = NULL; const stateheader* sh = stateheader_first(savebuffer); while (sh && stateheader_plausible(sh)) { if (little_endian_conv_16(sh->type) != GOOMBA_SRAMSAVE) { } else if (sh1 == NULL) { sh1 = sh; } else { sh2 = sh; break; } sh = stateheader_advance(sh); } if (sh1 == NULL) { ErrorPrompt("PocketNES save file has no SRAM."); offset = 0; } else if (sh2 != NULL) { ErrorPrompt("PocketNES save file has more than one SRAM."); offset = 0; } else { goomba_size_t len; void* extracted = goomba_extract(savebuffer, sh1, &len); if (!extracted) ErrorPrompt(goomba_last_error()); else { memcpy(savebuffer, extracted, len); offset = len; free(extracted); } } } if (offset > 0) { if(GameInfo->type == GIT_CART) WiiFCEU_GameSave(&iNESCart, 1); else if(GameInfo->type == GIT_VSUNI) WiiFCEU_GameSave(&UNIFCart, 1); ResetNES(); retval = true; } else { // if we reached here, nothing was done! if(!silent) InfoPrompt ("Save file not found"); } FreeSaveBuffer (); return retval; }
bool LoadBatteryOrState(char * filepath, int action, bool silent) { bool result = false; int offset = 0; int device; if(!FindDevice(filepath, &device)) return 0; AllocSaveBuffer(); // load the file into savebuffer offset = LoadFile(filepath, silent); if (cartridgeType == 1 && goomba_is_sram(savebuffer)) { void* cleaned = goomba_cleanup(savebuffer); if (savebuffer == NULL) { ErrorPrompt(goomba_last_error()); offset = 0; } else { if (cleaned != savebuffer) { memcpy(savebuffer, cleaned, GOOMBA_COLOR_SRAM_SIZE); free(cleaned); } stateheader* sh = stateheader_for(savebuffer, RomTitle); if (sh == NULL) { ErrorPrompt(goomba_last_error()); offset = 0; } else { goomba_size_t outsize; void* gbc_sram = goomba_extract(savebuffer, sh, &outsize); if (gbc_sram == NULL) { ErrorPrompt(goomba_last_error()); offset = 0; } else { memcpy(savebuffer, gbc_sram, outsize); offset = outsize; free(gbc_sram); } } } } // load savebuffer into VBA memory if (offset > 0) { if(action == FILE_SRAM) { if(cartridgeType == 1) result = MemgbReadBatteryFile((char *)savebuffer, offset); else result = MemCPUReadBatteryFile((char *)savebuffer, offset); } else { result = emulator.emuReadMemState((char *)savebuffer, offset); } } FreeSaveBuffer(); if(!silent && !result) { if(offset == 0) { if(action == FILE_SRAM) ErrorPrompt ("Save file not found"); else ErrorPrompt ("State file not found"); } else { if(action == FILE_SRAM) ErrorPrompt ("Invalid save file"); else ErrorPrompt ("Invalid state file"); } } return result; }
static void export_click(GtkWidget* widget, gpointer data) { GtkTreeIter iter; if (_filePath != NULL && gtk_tree_selection_get_selected(GTK_TREE_SELECTION(selection), NULL, &iter)) { const void* ptr; gtk_tree_model_get(GTK_TREE_MODEL(listStore), &iter, 1, &ptr, -1); if (pocketnes_is_romheader(ptr)) { const pocketnes_romheader* r = (const pocketnes_romheader*)ptr; GtkWidget* dialog = gtk_file_chooser_dialog_new("Export", GTK_WINDOW(window), GTK_FILE_CHOOSER_ACTION_SAVE, GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, GTK_STOCK_SAVE, GTK_RESPONSE_ACCEPT, NULL); gint res = gtk_dialog_run(GTK_DIALOG(dialog)); if (res == GTK_RESPONSE_ACCEPT) { char* path = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(dialog)); FILE* outfile = fopen(path, "wb"); if (outfile == NULL) { error_msg("Could not open file: %s", strerror(errno)); } else { fwrite(r+1, 1, r->filesize, outfile); fclose(outfile); } g_free(path); } gtk_widget_destroy(dialog); } else if (gb_is_rom(ptr)) { GtkWidget* dialog = gtk_file_chooser_dialog_new("Export", GTK_WINDOW(window), GTK_FILE_CHOOSER_ACTION_SAVE, GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, GTK_STOCK_SAVE, GTK_RESPONSE_ACCEPT, NULL); gint res = gtk_dialog_run(GTK_DIALOG(dialog)); if (res == GTK_RESPONSE_ACCEPT) { char* path = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(dialog)); FILE* outfile = fopen(path, "wb"); if (outfile == NULL) { error_msg("Could not open file: %s", strerror(errno)); } else { fwrite(ptr, 1, gb_rom_size(ptr), outfile); fclose(outfile); } g_free(path); } gtk_widget_destroy(dialog); } else if (stateheader_plausible(ptr)) { const stateheader* sh = (const stateheader*)ptr; goomba_size_t len; void* gbcsav = goomba_extract(loaded_file, sh, &len); if (gbcsav == NULL) { error_msg("%s", goomba_last_error()); return; } GtkWidget* dialog = gtk_file_chooser_dialog_new("Export", GTK_WINDOW(window), GTK_FILE_CHOOSER_ACTION_SAVE, GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, GTK_STOCK_SAVE, GTK_RESPONSE_ACCEPT, NULL); gint res = gtk_dialog_run(GTK_DIALOG(dialog)); if (res == GTK_RESPONSE_ACCEPT) { char* path = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(dialog)); FILE* outfile = fopen(path, "wb"); if (outfile == NULL) { error_msg("Could not open file: %s", strerror(errno)); } else { fwrite(gbcsav, 1, len, outfile); fclose(outfile); } g_free(path); } gtk_widget_destroy(dialog); free(gbcsav); } } }