changeset 1019:e34334e6c682

Fix GST savestate loading to deal with SAT cache to fix sprite corruption on savestate load. Clear out Z80 native_pc so the Z80 state does not get hosed when loading a savestate while the emulator is already running
author Michael Pavone <pavone@retrodev.com>
date Mon, 02 May 2016 23:08:20 -0700
parents dba8c630bdbf
children 3f5b94f3c922 4a92889e2889
files gst.c vdp.c vdp.h
diffstat 3 files changed, 9 insertions(+), 4 deletions(-) [+]
line wrap: on
line diff
--- a/gst.c	Mon May 02 22:20:19 2016 -0700
+++ b/gst.c	Mon May 02 23:08:20 2016 -0700
@@ -211,12 +211,13 @@
 			z80_handle_code_write(i, context);
 		}
 	}
+	context->native_pc = NULL;
 	return 1;
 }
 
 uint8_t vdp_load_gst(vdp_context * context, FILE * state_file)
 {
-	uint8_t tmp_buf[CRAM_SIZE*2];
+	uint8_t tmp_buf[VRAM_SIZE];
 	fseek(state_file, GST_VDP_REGS, SEEK_SET);
 	if (fread(context->regs, 1, VDP_REGS, state_file) != VDP_REGS) {
 		fputs("Failed to read VDP registers from savestate\n", stderr);
@@ -227,7 +228,7 @@
 		context->framebuf = context->oddbuf;
 	}
 	latch_mode(context);
-	if (fread(tmp_buf, 1, sizeof(tmp_buf), state_file) != sizeof(tmp_buf)) {
+	if (fread(tmp_buf, 1, CRAM_SIZE*2, state_file) != CRAM_SIZE*2) {
 		fputs("Failed to read CRAM from savestate\n", stderr);
 		return 0;
 	}
@@ -246,10 +247,13 @@
 		context->vsram[i] = (tmp_buf[i*2+1] << 8) | tmp_buf[i*2];
 	}
 	fseek(state_file, GST_VDP_MEM, SEEK_SET);
-	if (fread(context->vdpmem, 1, VRAM_SIZE, state_file) != VRAM_SIZE) {
+	if (fread(tmp_buf, 1, VRAM_SIZE, state_file) != VRAM_SIZE) {
 		fputs("Failed to read VRAM from savestate\n", stderr);
 		return 0;
 	}
+	for (int i = 0; i < VRAM_SIZE; i++) {
+		write_vram_byte(context, i, tmp_buf[i]);
+	}
 	return 1;
 }
 
--- a/vdp.c	Mon May 02 22:20:19 2016 -0700
+++ b/vdp.c	Mon May 02 23:08:20 2016 -0700
@@ -518,7 +518,7 @@
 		context->cd &= 0xF;
 	}
 }
-#include <assert.h>
+
 void write_vram_byte(vdp_context *context, uint16_t address, uint8_t value)
 {
 	if (!(address & 4)) {
--- a/vdp.h	Mon May 02 22:20:19 2016 -0700
+++ b/vdp.h	Mon May 02 23:08:20 2016 -0700
@@ -204,6 +204,7 @@
 void latch_mode(vdp_context * context);
 uint32_t vdp_cycles_to_frame_end(vdp_context * context);
 uint32_t vdp_frame_end_line(vdp_context *context);
+void write_vram_byte(vdp_context *context, uint16_t address, uint8_t value);
 
 extern int32_t color_map[1 << 12];