diff options
| author | SND\weimingzhi_cp <SND\weimingzhi_cp@e17a0e51-4ae3-4d35-97c3-1a29b211df97> | 2010-05-10 05:49:51 +0000 |
|---|---|---|
| committer | SND\weimingzhi_cp <SND\weimingzhi_cp@e17a0e51-4ae3-4d35-97c3-1a29b211df97> | 2010-05-10 05:49:51 +0000 |
| commit | ff65e7452f417bc1b909dbec26a787202adfd319 (patch) | |
| tree | f1eb712c79ca1f28aa1bc9042ed0dc22630ab027 | |
| parent | c8690b57b1b762905661e7c0306be17e44b0998f (diff) | |
| download | pcsxr-ff65e7452f417bc1b909dbec26a787202adfd319.tar.gz | |
added savestate versioning
git-svn-id: https://pcsxr.svn.codeplex.com/svn/pcsxr@47747 e17a0e51-4ae3-4d35-97c3-1a29b211df97
| -rw-r--r-- | ChangeLog | 1 | ||||
| -rw-r--r-- | libpcsxcore/misc.c | 40 |
2 files changed, 26 insertions, 15 deletions
@@ -5,6 +5,7 @@ May 10, 2010 Wei Mingzhi <whistler_wmz@users.sf.net> * libpcsxcore/psxcommon.h: Likewise. * libpcsxcore/sio.c: Likewise. * libpcsxcore/psxcounters.c: Likewise. + * libpcsxcore/misc.c: Added savestate versioning support. May 10, 2010 edgbla <edgbla@yandex.ru> diff --git a/libpcsxcore/misc.c b/libpcsxcore/misc.c index e9a069dd..3e8e46f1 100644 --- a/libpcsxcore/misc.c +++ b/libpcsxcore/misc.c @@ -452,7 +452,11 @@ int Load(const char *ExePath) { // STATES -const char PcsxHeader[32] = "STv3 PCSX v" PACKAGE_VERSION; +static const char PcsxHeader[32] = "STv4 PCSX v" PACKAGE_VERSION; + +// Savestate Versioning! +// If you make changes to the savestate version, please increment the value below. +static const u32 SaveVersion = SWAPu32(0x8b410001); int SaveState(const char *file) { gzFile f; @@ -465,6 +469,7 @@ int SaveState(const char *file) { if (f == NULL) return -1; gzwrite(f, (const void *)PcsxHeader, 32); + gzwrite(f, (const void *)&SaveVersion, sizeof(SaveVersion)); pMem = (unsigned char *)malloc(128 * 96 * 3); if (pMem == NULL) return -1; @@ -478,10 +483,10 @@ int SaveState(const char *file) { gzwrite(f, psxM, 0x00200000); gzwrite(f, psxR, 0x00080000); gzwrite(f, psxH, 0x00010000); - gzwrite(f, (void*)&psxRegs, sizeof(psxRegs)); + gzwrite(f, (void *)&psxRegs, sizeof(psxRegs)); // gpu - gpufP = (GPUFreeze_t *) malloc(sizeof(GPUFreeze_t)); + gpufP = (GPUFreeze_t *)malloc(sizeof(GPUFreeze_t)); gpufP->ulFreezeVersion = 1; GPU_freeze(1, gpufP); gzwrite(f, gpufP, sizeof(GPUFreeze_t)); @@ -514,35 +519,39 @@ int LoadState(const char *file) { SPUFreeze_t *spufP; int Size; char header[32]; + u32 version; f = gzopen(file, "rb"); if (f == NULL) return -1; - psxCpu->Reset(); - - gzread(f, header, 32); + gzread(f, header, sizeof(header)); + gzread(f, &version, sizeof(u32)); - if (strncmp("STv3 PCSX", header, 9)) { gzclose(f); return -1; } + if (strncmp("STv4 PCSX", header, 9) != 0 || version != SaveVersion) { + gzclose(f); + return -1; + } - gzseek(f, 128*96*3, SEEK_CUR); + psxCpu->Reset(); + gzseek(f, 128 * 96 * 3, SEEK_CUR); gzread(f, psxM, 0x00200000); gzread(f, psxR, 0x00080000); gzread(f, psxH, 0x00010000); - gzread(f, (void*)&psxRegs, sizeof(psxRegs)); + gzread(f, (void *)&psxRegs, sizeof(psxRegs)); if (Config.HLE) psxBiosFreeze(0); // gpu - gpufP = (GPUFreeze_t *) malloc (sizeof(GPUFreeze_t)); + gpufP = (GPUFreeze_t *)malloc(sizeof(GPUFreeze_t)); gzread(f, gpufP, sizeof(GPUFreeze_t)); GPU_freeze(0, gpufP); free(gpufP); // spu gzread(f, &Size, 4); - spufP = (SPUFreeze_t *) malloc (Size); + spufP = (SPUFreeze_t *)malloc(Size); gzread(f, spufP, Size); SPU_freeze(0, spufP); free(spufP); @@ -561,17 +570,18 @@ int LoadState(const char *file) { int CheckState(const char *file) { gzFile f; char header[32]; + u32 version; f = gzopen(file, "rb"); if (f == NULL) return -1; - psxCpu->Reset(); - - gzread(f, header, 32); + gzread(f, header, sizeof(header)); + gzread(f, &version, sizeof(u32)); gzclose(f); - if (strncmp("STv3 PCSX", header, 9)) return -1; + if (strncmp("STv4 PCSX", header, 9) != 0 || version != SaveVersion) + return -1; return 0; } |
