save some things that weren't saved but should have been
[pcsx_rearmed.git] / libpcsxcore / misc.c
index 9486d23..526ebd4 100644 (file)
@@ -35,6 +35,7 @@
 
 char CdromId[10] = "";
 char CdromLabel[33] = "";
+int  CdromFrontendId; // for frontend use
 
 // PSX Executable types
 #define PSX_EXE     1
@@ -640,7 +641,21 @@ static const char PcsxHeader[32] = "STv4 PCSX v" PCSX_VERSION;
 // If you make changes to the savestate version, please increment the value below.
 static const u32 SaveVersion = 0x8b410006;
 
+#define MISC_MAGIC 0x4353494d
+struct misc_save_data {
+       u32 magic;
+       u32 gteBusyCycle;
+       u32 muldivBusyCycle;
+       u32 biuReg;
+       u32 biosBranchCheck;
+       u32 gpuIdleAfter;
+       u32 gpuSr;
+       u32 frame_counter;
+       int CdromFrontendId;
+};
+
 int SaveState(const char *file) {
+       struct misc_save_data *misc = (void *)(psxH + 0xf000);
        void *f;
        GPUFreeze_t *gpufP = NULL;
        SPUFreezeHdr_t spufH;
@@ -649,6 +664,19 @@ int SaveState(const char *file) {
        int result = -1;
        int Size;
 
+       assert(!psxRegs.branching);
+       assert(!psxRegs.cpuInRecursion);
+       assert(!misc->magic);
+       misc->magic = MISC_MAGIC;
+       misc->gteBusyCycle = psxRegs.gteBusyCycle;
+       misc->muldivBusyCycle = psxRegs.muldivBusyCycle;
+       misc->biuReg = psxRegs.biuReg;
+       misc->biosBranchCheck = psxRegs.biosBranchCheck;
+       misc->gpuIdleAfter = psxRegs.gpuIdleAfter;
+       misc->gpuSr = HW_GPU_STATUS;
+       misc->frame_counter = frame_counter;
+       misc->CdromFrontendId = CdromFrontendId;
+
        f = SaveFuncs.open(file, "wb");
        if (f == NULL) return -1;
 
@@ -700,11 +728,13 @@ int SaveState(const char *file) {
 
        result = 0;
 cleanup:
+       memset(misc, 0, sizeof(*misc));
        SaveFuncs.close(f);
        return result;
 }
 
 int LoadState(const char *file) {
+       struct misc_save_data *misc = (void *)(psxH + 0xf000);
        u32 biosBranchCheckOld = psxRegs.biosBranchCheck;
        void *f;
        GPUFreeze_t *gpufP = NULL;
@@ -740,6 +770,16 @@ int LoadState(const char *file) {
        psxRegs.biosBranchCheck = ~0;
        psxRegs.gpuIdleAfter = psxRegs.cycle - 1;
        HW_GPU_STATUS &= SWAP32(~PSXGPU_nBUSY);
+       if (misc->magic == MISC_MAGIC) {
+               psxRegs.gteBusyCycle = misc->gteBusyCycle;
+               psxRegs.muldivBusyCycle = misc->muldivBusyCycle;
+               psxRegs.biuReg = misc->biuReg;
+               psxRegs.biosBranchCheck = misc->biosBranchCheck;
+               psxRegs.gpuIdleAfter = misc->gpuIdleAfter;
+               HW_GPU_STATUS = misc->gpuSr;
+               frame_counter = misc->frame_counter;
+               CdromFrontendId = misc->CdromFrontendId;
+       }
 
        psxCpu->Notify(R3000ACPU_NOTIFY_AFTER_LOAD, NULL);
 
@@ -776,6 +816,7 @@ int LoadState(const char *file) {
 
        result = 0;
 cleanup:
+       memset(misc, 0, sizeof(*misc));
        SaveFuncs.close(f);
        return result;
 }