diff blastem.c @ 955:229c23b3ab73

Switch to storing SRAM/EEPROM and save states in a per-game directory rather than next to the ROM (for SRAM/EEPROM) or in the current working directory (for save states)
author Michael Pavone <pavone@retrodev.com>
date Fri, 15 Apr 2016 18:29:39 -0700
parents 08346262990b
children f5550cdffe49
line wrap: on
line diff
--- a/blastem.c	Tue Apr 12 22:50:31 2016 -0700
+++ b/blastem.c	Fri Apr 15 18:29:39 2016 -0700
@@ -192,6 +192,7 @@
 
 int break_on_sync = 0;
 int save_state = 0;
+char *save_state_path;
 
 //#define DO_DEBUG_PRINT
 #ifdef DO_DEBUG_PRINT
@@ -309,8 +310,8 @@
 			{
 				sync_z80(z_context, z_context->current_cycle + MCLKS_PER_Z80);
 			}
-			save_gst(gen, "savestate.gst", address);
-			puts("Saved state to savestate.gst");
+			save_gst(gen, save_state_path, address);
+			printf("Saved state to %s\n", save_state_path);
 		} else if(save_state) {
 			context->sync_cycle = context->current_cycle + 1;
 		}
@@ -974,6 +975,25 @@
 	}
 }
 
+void setup_saves(char *fname, rom_info *info)
+{
+	char * barename = basename_no_extension(fname);
+	char const * parts[3] = {get_save_dir(), "/", barename};
+	char *save_dir = alloc_concat_m(3, parts);
+	if (!ensure_dir_exists(save_dir)) {
+		warning("Failed to create save directory %s\n", save_dir);
+	}
+	parts[0] = save_dir;
+	parts[2] = info->save_type == SAVE_I2C ? "save.eeprom" : "save.sram";
+	free(save_filename);
+	save_filename = alloc_concat_m(3, parts);
+	parts[2] = "quicksave.gst";
+	free(save_state_path);
+	save_state_path = alloc_concat_m(3, parts);
+	info->save_dir = save_dir;
+	free(barename);
+}
+
 int main(int argc, char ** argv)
 {
 	set_exe_str(argv[0]);
@@ -1150,21 +1170,7 @@
 	if (!headless) {
 		render_init(width, height, title, fps, fullscreen);
 	}
-	int fname_size = strlen(romfname);
-	char * ext = info.save_type == SAVE_I2C ? "eeprom" : "sram";
-	save_filename = malloc(fname_size+strlen(ext) + 2);
-	memcpy(save_filename, romfname, fname_size);
-	int i;
-	for (i = fname_size-1; fname_size >= 0; --i) {
-		if (save_filename[i] == '.') {
-			strcpy(save_filename + i + 1, ext);
-			break;
-		}
-	}
-	if (i < 0) {
-		save_filename[fname_size] = '.';
-		strcpy(save_filename + fname_size + 1, ext);
-	}
+	setup_saves(romfname, &info);
 
 	genesis = alloc_init_genesis(&info, fps, (ym_log && !menu) ? YM_OPT_WAVE_LOG : 0);
 	if (menu) {
@@ -1189,7 +1195,7 @@
 					genesis = menu_context;
 				}
 				free(game_context->cart);
-				free(save_filename);
+				free(info.save_dir);
 				base_map[0].buffer = ram = game_context->work_ram;
 			} else {
 				base_map[0].buffer = ram = malloc(RAM_WORDS * sizeof(uint16_t));
@@ -1202,20 +1208,7 @@
 			byteswap_rom(rom_size);
 			set_region(&info, force_version);
 			update_title(info.name);
-			fname_size = strlen(menu_context->next_rom);
-			ext = info.save_type == SAVE_I2C ? "eeprom" : "sram";
-			save_filename = malloc(fname_size+strlen(ext) + 2);
-			memcpy(save_filename, menu_context->next_rom, fname_size);
-			for (i = fname_size-1; fname_size >= 0; --i) {
-				if (save_filename[i] == '.') {
-					strcpy(save_filename + i + 1, ext);
-					break;
-				}
-			}
-			if (i < 0) {
-				save_filename[fname_size] = '.';
-				strcpy(save_filename + fname_size + 1, ext);
-			}
+			setup_saves(menu_context->next_rom, &info);
 			if (!game_context) {
 				//start a new arena and save old one in suspended genesis context
 				genesis->arena = start_new_arena();