diff genesis.c @ 1428:2540c05520f2

New savestates are working. New config file option for selecting format states will be saved in. Mostly complete, needs a little more work before release
author Michael Pavone <pavone@retrodev.com>
date Wed, 09 Aug 2017 23:26:51 -0700
parents 4e5797b3935a
children c886c54d8cf1
line wrap: on
line diff
--- a/genesis.c	Sun Aug 06 00:06:36 2017 -0700
+++ b/genesis.c	Wed Aug 09 23:26:51 2017 -0700
@@ -339,19 +339,23 @@
 			if (slot == QUICK_SAVE_SLOT) {
 				save_path = save_state_path;
 			} else {
-				char slotname[] = "slot_0.gst";
+				char slotname[] = "slot_0.state";
 				slotname[5] = '0' + slot;
+				if (!use_native_states) {
+					strcpy(slotname + 7, "gst");
+				}
 				char const *parts[] = {gen->header.save_dir, PATH_SEP, slotname};
 				save_path = alloc_concat_m(3, parts);
 			}
-			serialize_buffer state;
-			init_serialize(&state);
-			genesis_serialize(gen, &state, address);;
-			FILE *statefile = fopen(save_path, "wb");
-			fwrite(state.data, 1, state.size, statefile);
-			fclose(statefile);
-			free(state.data);
-			//save_gst(gen, save_path, address);
+			if (use_native_states) {
+				serialize_buffer state;
+				init_serialize(&state);
+				genesis_serialize(gen, &state, address);
+				save_to_file(&state, save_path);
+				free(state.data);
+			} else {
+				save_gst(gen, save_path, address);
+			}
 			printf("Saved state to %s\n", save_path);
 			if (slot != QUICK_SAVE_SLOT) {
 				free(save_path);
@@ -1005,26 +1009,19 @@
 	set_keybindings(&gen->io);
 	render_set_video_standard((gen->version_reg & HZ50) ? VID_PAL : VID_NTSC);
 	if (statefile) {
-		//first try loading as a GST format savestate
-		uint32_t pc = load_gst(gen, statefile);
-		if (!pc) {
-			//switch to native format if that fails
-			FILE *f = fopen(statefile, "rb");
-			if (!f) {
-				goto state_error;
-			}
-			long statesize = file_size(f);
-			deserialize_buffer state;
-			void *statedata = malloc(statesize);
-			if (statesize != fread(statedata, 1, statesize, f)) {
-				goto state_error;
-			}
-			fclose(f);
-			init_deserialize(&state, statedata, statesize);
+		//first try loading as a native format savestate
+		deserialize_buffer state;
+		uint32_t pc;
+		if (load_from_file(&state, statefile)) {
 			genesis_deserialize(&state, gen);
-			free(statedata);
+			free(state.data);
 			//HACK
 			pc = gen->m68k->last_prefetch_address;
+		} else {
+			pc = load_gst(gen, statefile);
+			if (!pc) {
+				fatal_error("Failed to load save state %s\n", statefile);
+			}
 		}
 		printf("Loaded %s\n", statefile);
 		if (gen->header.enter_debugger) {
@@ -1043,8 +1040,6 @@
 	}
 	handle_reset_requests(gen);
 	return;
-state_error:
-	fatal_error("Failed to load save state %s\n", statefile);
 }
 
 static void resume_genesis(system_header *system)
@@ -1218,7 +1213,7 @@
 		}
 		for (int i = 0; i < CRAM_SIZE; i++)
 		{
-			write_cram(gen->vdp, i, rand());
+			write_cram_internal(gen->vdp, i, rand());
 		}
 		for (int i = 0; i < VSRAM_SIZE; i++)
 		{