--- uae/src/savestate.c 2018/04/24 17:16:18 1.1.1.5 +++ uae/src/savestate.c 2018/04/24 17:18:10 1.1.1.6 @@ -47,13 +47,14 @@ #include "options.h" #include "memory.h" - +#include "zfile.h" #include "savestate.h" +#include "gui.h" int savestate_state; char *savestate_filename; -FILE *savestate_file; +struct zfile *savestate_file; /* functions for reading/writing bytes, shorts and longs in big-endian * format independent of host machine's endianess */ @@ -67,6 +68,11 @@ void save_u32_func (uae_u8 **dstp, uae_u *dst++ = (uae_u8)(v >> 0); *dstp = dst; } +void save_u64_func (uae_u8 **dstp, uae_u64 v) +{ + save_u32_func (dstp, (uae_u32)(v >> 32)); + save_u32_func (dstp, (uae_u32)v); +} void save_u16_func (uae_u8 **dstp, uae_u16 v) { uae_u8 *dst = *dstp; @@ -83,7 +89,7 @@ void save_u8_func (uae_u8 **dstp, uae_u8 void save_string_func (uae_u8 **dstp, const char *from) { uae_u8 *dst = *dstp; - while(*from) + while (*from) *dst++ = *from++; *dst++ = 0; *dstp = dst; @@ -97,6 +103,15 @@ uae_u32 restore_u32_func (const uae_u8 * *dstp = dst + 4; return v; } +uae_u64 restore_u64_func (const uae_u8 **dstp) +{ + uae_u64 v; + + v = restore_u32_func (dstp); + v <<= 32; + v |= restore_u32_func (dstp); + return v; +} uae_u16 restore_u16_func (const uae_u8 **dstp) { uae_u16 v; @@ -124,14 +139,14 @@ char *restore_string_func (const uae_u8 do { v = *dst++; *top++ = v; - } while(v); + } while (v); *dstp = dst; return to; } /* read and write IFF-style hunks */ -static void save_chunk (FILE *f, uae_u8 *chunk, long len, const char *name) +static void save_chunk (struct zfile *f, uae_u8 *chunk, long len, const char *name) { uae_u8 tmp[4], *dst; uae_u8 zero[4]= { 0, 0, 0, 0 }; @@ -140,24 +155,24 @@ static void save_chunk (FILE *f, uae_u8 return; /* chunk name */ - fwrite (name, 1, 4, f); + zfile_fwrite (name, 1, 4, f); /* chunk size */ dst = &tmp[0]; save_u32 (len + 4 + 4 + 4); - fwrite (&tmp[0], 1, 4, f); + zfile_fwrite (&tmp[0], 1, 4, f); /* chunk flags */ dst = &tmp[0]; save_u32 (0); - fwrite (&tmp[0], 1, 4, f); + zfile_fwrite (&tmp[0], 1, 4, f); /* chunk data */ - fwrite (chunk, 1, len, f); + zfile_fwrite (chunk, 1, len, f); /* alignment */ len = 4 - (len & 3); if (len) - fwrite (zero, 1, len, f); + zfile_fwrite (zero, 1, len, f); } -static uae_u8 *restore_chunk (FILE *f, char *name, long *len, long *filepos) +static uae_u8 *restore_chunk (struct zfile *f, char *name, long *len, long *filepos) { uae_u8 tmp[4], dummy[4], *mem; const uae_u8 *src; @@ -165,10 +180,10 @@ static uae_u8 *restore_chunk (FILE *f, c long len2; /* chunk name */ - fread (name, 1, 4, f); + zfile_fread (name, 1, 4, f); name[4] = 0; /* chunk size */ - fread (tmp, 1, 4, f); + zfile_fread (tmp, 1, 4, f); src = tmp; len2 = restore_u32 () - 4 - 4 - 4; if (len2 < 0) @@ -178,62 +193,55 @@ static uae_u8 *restore_chunk (FILE *f, c return 0; /* chunk flags */ - fread (tmp, 1, 4, f); + zfile_fread (tmp, 1, 4, f); src = tmp; flags = restore_u32 (); - *filepos = ftell (f); + *filepos = zfile_ftell (f) - 4 - 4; + /* chunk data. RAM contents will be loaded during the reset phase, no need to malloc multiple megabytes here. */ if (strcmp (name, "CRAM") != 0 && strcmp (name, "BRAM") != 0 && strcmp (name, "FRAM") != 0 - && strcmp (name, "ZRAM") != 0) + && strcmp (name, "ZRAM") != 0 + && strcmp (name, "A3K1") != 0 + && strcmp (name, "A3K2") != 0) { mem = malloc (len2); - fread (mem, 1, len2, f); + zfile_fread (mem, 1, len2, f); } else { mem = 0; - fseek (f, len2, SEEK_CUR); + zfile_fseek (f, len2, SEEK_CUR); } /* alignment */ len2 = 4 - (len2 & 3); if (len2) - fread (dummy, 1, len2, f); + zfile_fread (dummy, 1, len2, f); return mem; } -#if 0 void restore_ram (size_t filepos, uae_u8 *memory) { uae_u8 tmp[8]; uae_u8 *src = tmp; - int size, fullize; + int size, fullsize; uae_u32 flags; zfile_fseek (savestate_file, filepos, SEEK_SET); zfile_fread (tmp, 1, sizeof(tmp), savestate_file); - size = restore_u32(); - flags = restore_u32(); + size = restore_u32 (); + flags = restore_u32 (); size -= 4 + 4 + 4; - if (flags & 1) { - zfile_fread (tmp, 1, 4, savestate_file); - src = tmp; - fullsize = restore_u32(); - size -= 4; - zfile_zuncompress (memory, fullsize, savestate_file, size); - } else { - zfile_fread (memory, 1, size, savestate_file); - } + zfile_fread (memory, 1, size, savestate_file); } -#endif static void restore_header (const uae_u8 *src) { char *emuname, *emuversion, *description; - restore_u32(); + restore_u32 (); emuname = restore_string (); emuversion = restore_string (); description = restore_string (); @@ -248,14 +256,14 @@ static void restore_header (const uae_u8 void restore_state (const char *filename) { - FILE *f; - uae_u8 *chunk,*end; + struct zfile *f; + const uae_u8 *chunk, *end; char name[5]; long len; long filepos; chunk = 0; - f = fopen (filename, "rb"); + f = zfile_open (filename, "rb"); if (!f) goto error; @@ -270,6 +278,10 @@ void restore_state (const char *filename changed_prefs.bogomem_size = 0; changed_prefs.chipmem_size = 0; changed_prefs.fastmem_size = 0; + changed_prefs.gfxmem_size = 0; + changed_prefs.z3fastmem_size = 0; + changed_prefs.mbresmem_low_size = 0; + changed_prefs.mbresmem_high_size = 0; savestate_state = STATE_RESTORE; for (;;) { chunk = restore_chunk (f, name, &len, &filepos); @@ -279,10 +291,15 @@ void restore_state (const char *filename if (!strcmp (name, "CRAM")) { restore_cram (len, filepos); continue; - } - else if (!strcmp (name, "BRAM")) { + } else if (!strcmp (name, "BRAM")) { restore_bram (len, filepos); continue; + } else if (!strcmp (name, "A3K1")) { + restore_a3000lram (len, filepos); + continue; + } else if (!strcmp (name, "A3K2")) { + restore_a3000hram (len, filepos); + continue; } else if (!strcmp (name, "FRAM")) { restore_fram (len, filepos); continue; @@ -350,6 +367,7 @@ void restore_state (const char *filename name, len, end - chunk); free (chunk); } + gui_update (); return; error: @@ -358,14 +376,14 @@ void restore_state (const char *filename if (chunk) free (chunk); if (f) - fclose (f); + zfile_fclose (f); } void savestate_restore_finish (void) { if (savestate_state != STATE_RESTORE) return; - fclose (savestate_file); + zfile_fclose (savestate_file); savestate_file = 0; savestate_state = 0; } @@ -377,11 +395,11 @@ void save_state (const char *filename, c uae_u8 header[1000]; char tmp[100]; uae_u8 *dst; - FILE *f; + struct zfile *f; int len,i; char name[5]; - f = fopen (filename, "wb"); + f = zfile_open (filename, "wb"); if (!f) return; @@ -396,7 +414,7 @@ void save_state (const char *filename, c save_chunk (f, dst, len, "CPU "); free (dst); - strcpy(name, "DSKx"); + strcpy (name, "DSKx"); for (i = 0; i < 4; i++) { dst = save_disk (i, &len, 0); if (dst) { @@ -453,6 +471,10 @@ void save_state (const char *filename, c save_chunk (f, dst, len, "CRAM"); dst = save_bram (&len); save_chunk (f, dst, len, "BRAM"); + dst = save_a3000lram (&len); + save_chunk (f, dst, len, "A3K1"); + dst = save_a3000hram (&len); + save_chunk (f, dst, len, "A3K2"); dst = save_fram (&len); save_chunk (f, dst, len, "FRAM"); dst = save_zram (&len); @@ -466,10 +488,10 @@ void save_state (const char *filename, c free (dst); } while ((dst = save_rom (0, &len, 0))); - fwrite ("END ", 1, 4, f); - fwrite ("\0\0\0\08", 1, 4, f); + zfile_fwrite ("END ", 1, 4, f); + zfile_fwrite ("\0\0\0\08", 1, 4, f); write_log ("Save of '%s' complete\n", filename); - fclose (f); + zfile_fclose (f); } /*