# HG changeset patch # User Michael Pavone # Date 1462255700 25200 # Node ID e34334e6c682ff8380e0bdb368a5457af36cf440 # Parent dba8c630bdbf67b2d7027886b36efc497428febc 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 diff -r dba8c630bdbf -r e34334e6c682 gst.c --- 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; } diff -r dba8c630bdbf -r e34334e6c682 vdp.c --- 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 + void write_vram_byte(vdp_context *context, uint16_t address, uint8_t value) { if (!(address & 4)) { diff -r dba8c630bdbf -r e34334e6c682 vdp.h --- 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];