示例#1
0
文件: fceuram.cpp 项目: dborth/fceugx
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;
}
示例#2
0
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;
}
示例#3
0
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);
		}
	}
}