# HG changeset patch # User Michael Pavone # Date 1461032807 25200 # Node ID f52cb02a14665d0968788e9d11c032f4419efc0c # Parent 750995b587a076b612fd2a49eed1bfa8f6a6b46e Fixed loading save states from menu diff -r 750995b587a0 -r f52cb02a1466 gst.c --- 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: diff -r 750995b587a0 -r f52cb02a1466 stateview.c --- 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) { }