rework gpu busy timing
[pcsx_rearmed.git] / libpcsxcore / misc.c
index 50caad4..9486d23 100644 (file)
@@ -22,6 +22,7 @@
 */
 
 #include <stddef.h>
+#include <errno.h>
 #include <assert.h>
 #include "misc.h"
 #include "cdrom.h"
@@ -174,8 +175,13 @@ static void getFromCnf(char *buf, const char *key, u32 *val)
        buf = strstr(buf, key);
        if (buf)
                buf = strchr(buf, '=');
-       if (buf)
-               *val = strtol(buf + 1, NULL, 16);
+       if (buf) {
+               unsigned long v;
+               errno = 0;
+               v = strtoul(buf + 1, NULL, 16);
+               if (errno == 0)
+                       *val = v;
+       }
 }
 
 int LoadCdrom() {
@@ -282,7 +288,7 @@ int LoadCdrom() {
        //psxCpu->Reset();
 
        if (Config.HLE)
-               psxBiosCheckExe(tmpHead.h.t_addr, tmpHead.h.t_size);
+               psxBiosCheckExe(tmpHead.h.t_addr, tmpHead.h.t_size, 0);
 
        return 0;
 }
@@ -690,6 +696,7 @@ int SaveState(const char *file) {
        psxRcntFreeze(f, 1);
        mdecFreeze(f, 1);
        new_dyna_freeze(f, 1);
+       padFreeze(f, 1);
 
        result = 0;
 cleanup:
@@ -731,6 +738,8 @@ int LoadState(const char *file) {
        SaveFuncs.read(f, &psxRegs, offsetof(psxRegisters, gteBusyCycle));
        psxRegs.gteBusyCycle = psxRegs.cycle;
        psxRegs.biosBranchCheck = ~0;
+       psxRegs.gpuIdleAfter = psxRegs.cycle - 1;
+       HW_GPU_STATUS &= SWAP32(~PSXGPU_nBUSY);
 
        psxCpu->Notify(R3000ACPU_NOTIFY_AFTER_LOAD, NULL);
 
@@ -743,8 +752,7 @@ int LoadState(const char *file) {
        SaveFuncs.read(f, gpufP, sizeof(GPUFreeze_t));
        GPU_freeze(0, gpufP);
        free(gpufP);
-       if (HW_GPU_STATUS == 0)
-               HW_GPU_STATUS = SWAP32(GPU_readStatus());
+       gpuSyncPluginSR();
 
        // spu
        SaveFuncs.read(f, &Size, 4);
@@ -760,9 +768,11 @@ int LoadState(const char *file) {
        psxRcntFreeze(f, 0);
        mdecFreeze(f, 0);
        new_dyna_freeze(f, 0);
+       padFreeze(f, 0);
 
+       events_restore();
        if (Config.HLE)
-               psxBiosCheckExe(biosBranchCheckOld, 0x60);
+               psxBiosCheckExe(biosBranchCheckOld, 0x60, 1);
 
        result = 0;
 cleanup: