changeset 962:f52cb02a1466

Fixed loading save states from menu
author Michael Pavone <pavone@retrodev.com>
date Mon, 18 Apr 2016 19:26:47 -0700
parents 750995b587a0
children bd549b25c362
files gst.c stateview.c
diffstat 2 files changed, 51 insertions(+), 25 deletions(-) [+]
line wrap: on
line diff
--- a/gst.c	Sun Apr 17 23:50:41 2016 -0700
+++ b/gst.c	Mon Apr 18 19:26:47 2016 -0700
@@ -66,7 +66,7 @@
 
 uint32_t m68k_load_gst(m68k_context * context, FILE * gstfile)
 {
-	uint8_t buffer[4096];
+	uint8_t buffer[GST_68K_REG_SIZE];
 	fseek(gstfile, GST_68K_REGS, SEEK_SET);
 	if (fread(buffer, 1, GST_68K_REG_SIZE, gstfile) != GST_68K_REG_SIZE) {
 		fputs("Failed to read 68K registers from savestate\n", stderr);
@@ -93,23 +93,13 @@
 	} else {
 		context->aregs[8] = read_le_32(buffer + GST_68K_SSP_OFFSET);
 	}
-	fseek(gstfile, GST_68K_RAM, SEEK_SET);
-	for (int i = 0; i < (32*1024);) {
-		//FIXME: Need to deal with code in RAM that has potentially changed after this
-		if (fread(buffer, 1, sizeof(buffer), gstfile) != sizeof(buffer)) {
-			fputs("Failed to read 68K RAM from savestate\n", stderr);
-			return 0;
-		}
-		for(curpos = buffer; curpos < (buffer + sizeof(buffer)); curpos += sizeof(uint16_t)) {
-			ram[i++] = read_be_16(curpos);
-		}
-	}
+	
 	return pc;
 }
 
 uint8_t m68k_save_gst(m68k_context * context, uint32_t pc, FILE * gstfile)
 {
-	uint8_t buffer[4096];
+	uint8_t buffer[GST_68K_REG_SIZE];
 	uint8_t * curpos = buffer;
 	for (int i = 0; i < 8; i++) {
 		write_le_32(curpos, context->dregs[i]);
@@ -139,16 +129,6 @@
 		return 0;
 	}
 
-	fseek(gstfile, GST_68K_RAM, SEEK_SET);
-	for (int i = 0; i < (32*1024);) {
-		for(curpos = buffer; curpos < (buffer + sizeof(buffer)); curpos += sizeof(uint16_t)) {
-			write_be_16(curpos, ram[i++]);
-		}
-		if (fwrite(buffer, 1, sizeof(buffer), gstfile) != sizeof(buffer)) {
-			fputs("Failed to write 68K RAM to savestate\n", stderr);
-			return 0;
-		}
-	}
 	return 1;
 }
 
@@ -218,11 +198,19 @@
 		context->mem_pointers[1] = NULL;
 	}
 	context->bank_reg = bank >> 15;
+	uint8_t buffer[Z80_RAM_BYTES];
 	fseek(gstfile, GST_Z80_RAM, SEEK_SET);
-	if(fread(context->mem_pointers[0], 1, 8*1024, gstfile) != (8*1024)) {
+	if(fread(buffer, 1, sizeof(buffer), gstfile) != (8*1024)) {
 		fputs("Failed to read Z80 RAM from savestate\n", stderr);
 		return 0;
 	}
+	for (int i = 0; i < Z80_RAM_BYTES; i++)
+	{
+		if (context->mem_pointers[0][i] != buffer[i]) {
+			context->mem_pointers[0][i] = buffer[i];
+			z80_handle_code_write(i, context);
+		}
+	}
 	return 1;
 }
 
@@ -414,6 +402,7 @@
 
 uint32_t load_gst(genesis_context * gen, char * fname)
 {
+	char buffer[4096];
 	FILE * gstfile = fopen(fname, "rb");
 	if (!gstfile) {
 		fprintf(stderr, "Could not open file %s for reading\n", fname);
@@ -432,6 +421,7 @@
 	if (!pc) {
 		goto error_close;
 	}
+	
 	if (!vdp_load_gst(gen->vdp, gstfile)) {
 		goto error_close;
 	}
@@ -443,6 +433,22 @@
 	}
 	gen->ports[0].control = 0x40;
 	gen->ports[1].control = 0x40;
+	
+	fseek(gstfile, GST_68K_RAM, SEEK_SET);
+	for (int i = 0; i < (32*1024);) {
+		if (fread(buffer, 1, sizeof(buffer), gstfile) != sizeof(buffer)) {
+			fputs("Failed to read 68K RAM from savestate\n", stderr);
+			return 0;
+		}
+		for(char *curpos = buffer; curpos < (buffer + sizeof(buffer)); curpos += sizeof(uint16_t)) {
+			uint16_t word = read_be_16(curpos);
+			if (word != gen->work_ram[i]) {
+				gen->work_ram[i] = word;
+				m68k_handle_code_write(0xFF0000 | (i << 1), gen->m68k);
+			}
+			i++;
+		}
+	}
 	fclose(gstfile);
 	return pc;
 
@@ -454,6 +460,7 @@
 
 uint8_t save_gst(genesis_context * gen, char *fname, uint32_t m68k_pc)
 {
+	char buffer[4096];
 	FILE * gstfile = fopen(fname, "wb");
 	if (!gstfile) {
 		fprintf(stderr, "Could not open %s for writing\n", fname);
@@ -475,6 +482,16 @@
 	if (!ym_save_gst(gen->ym, gstfile)) {
 		goto error_close;
 	}
+	fseek(gstfile, GST_68K_RAM, SEEK_SET);
+	for (int i = 0; i < (32*1024);) {
+		for(char *curpos = buffer; curpos < (buffer + sizeof(buffer)); curpos += sizeof(uint16_t)) {
+			write_be_16(curpos, gen->work_ram[i++]);
+		}
+		if (fwrite(buffer, 1, sizeof(buffer), gstfile) != sizeof(buffer)) {
+			fputs("Failed to write 68K RAM to savestate\n", stderr);
+			return 0;
+		}
+	}
 	return 1;
 
 error_close:
--- a/stateview.c	Sun Apr 17 23:50:41 2016 -0700
+++ b/stateview.c	Mon Apr 18 19:26:47 2016 -0700
@@ -16,7 +16,6 @@
 uint8_t reset = 1;
 uint8_t busreq = 0;
 
-uint16_t *ram;
 uint8_t z80_ram[Z80_RAM_BYTES];
 
 uint16_t read_dma_value(uint32_t address)
@@ -24,6 +23,16 @@
 	return 0;
 }
 
+m68k_context *m68k_handle_code_write(uint32_t address, m68k_context *context)
+{
+	return NULL;
+}
+
+z80_context *z80_handle_code_write(uint32_t address, z80_context *context)
+{
+	return NULL;
+}
+
 void ym_data_write(ym2612_context * context, uint8_t value)
 {
 }