frontend: pandora: work around r20a vs r21 versioning
[pcsx_rearmed.git] / libpcsxcore / misc.c
index ad2e5d5..58170cf 100644 (file)
@@ -26,6 +26,7 @@
 #include "mdec.h"
 #include "gpu.h"
 #include "ppf.h"
+#include <zlib.h>
 
 char CdromId[10] = "";
 char CdromLabel[33] = "";
@@ -56,7 +57,8 @@ void mmssdd( char *b, char *p )
 {
        int m, s, d;
 #if defined(__arm__)
-       int block = (b[3] << 24) | (b[2] << 16) | (b[1] << 8) | b[0];
+       unsigned char *u = (void *)b;
+       int block = (u[3] << 24) | (u[2] << 16) | (u[1] << 8) | u[0];
 #elif defined(__BIGENDIAN__)
        int block = (b[0] & 0xff) | ((b[1] & 0xff) << 8) | ((b[2] & 0xff) << 16) | (b[3] << 24);
 #else
@@ -107,6 +109,7 @@ void mmssdd( char *b, char *p )
 
 int GetCdromFile(u8 *mdir, u8 *time, char *filename) {
        struct iso_directory_record *dir;
+       int retval = -1;
        u8 ddir[4096];
        u8 *buf;
        int i;
@@ -120,7 +123,7 @@ int GetCdromFile(u8 *mdir, u8 *time, char *filename) {
                if (dir->length[0] == 0) {
                        return -1;
                }
-               i += dir->length[0];
+               i += (u8)dir->length[0];
 
                if (dir->flags[0] & 0x2) { // it's a dir
                        if (!strnicmp((char *)&dir->name[0], filename, dir->name_len[0])) {
@@ -136,11 +139,12 @@ int GetCdromFile(u8 *mdir, u8 *time, char *filename) {
                } else {
                        if (!strnicmp((char *)&dir->name[0], filename, strlen(filename))) {
                                mmssdd(dir->extent, (char *)time);
+                               retval = 0;
                                break;
                        }
                }
        }
-       return 0;
+       return retval;
 }
 
 static const unsigned int gpu_ctl_def[] = {
@@ -204,9 +208,9 @@ int LoadCdrom() {
                // read the SYSTEM.CNF
                READTRACK();
 
-               sscanf((char *)buf + 12, "BOOT = cdrom:\\%256s", exename);
+               sscanf((char *)buf + 12, "BOOT = cdrom:\\%255s", exename);
                if (GetCdromFile(mdir, time, exename) == -1) {
-                       sscanf((char *)buf + 12, "BOOT = cdrom:%256s", exename);
+                       sscanf((char *)buf + 12, "BOOT = cdrom:%255s", exename);
                        if (GetCdromFile(mdir, time, exename) == -1) {
                                char *ptr = strstr((char *)buf + 12, "cdrom:");
                                if (ptr != NULL) {
@@ -264,7 +268,7 @@ int LoadCdromFile(const char *filename, EXE_HEADER *head) {
        u32 size, addr;
        void *mem;
 
-       sscanf(filename, "cdrom:\\%256s", exename);
+       sscanf(filename, "cdrom:\\%255s", exename);
 
        time[0] = itob(0); time[1] = itob(2); time[2] = itob(0x10);
 
@@ -308,7 +312,7 @@ int CheckCdrom() {
        char *buf;
        unsigned char mdir[4096];
        char exename[256];
-       int i, c;
+       int i, len, c;
 
        FreePPFCache();
 
@@ -318,8 +322,9 @@ int CheckCdrom() {
 
        READTRACK();
 
-       CdromLabel[0] = '\0';
-       CdromId[0] = '\0';
+       memset(CdromLabel, 0, sizeof(CdromLabel));
+       memset(CdromId, 0, sizeof(CdromId));
+       memset(exename, 0, sizeof(exename));
 
        strncpy(CdromLabel, buf + 52, 32);
 
@@ -333,9 +338,9 @@ int CheckCdrom() {
        if (GetCdromFile(mdir, time, "SYSTEM.CNF;1") != -1) {
                READTRACK();
 
-               sscanf(buf + 12, "BOOT = cdrom:\\%256s", exename);
+               sscanf(buf + 12, "BOOT = cdrom:\\%255s", exename);
                if (GetCdromFile(mdir, time, exename) == -1) {
-                       sscanf(buf + 12, "BOOT = cdrom:%256s", exename);
+                       sscanf(buf + 12, "BOOT = cdrom:%255s", exename);
                        if (GetCdromFile(mdir, time, exename) == -1) {
                                char *ptr = strstr(buf + 12, "cdrom:");                 // possibly the executable is in some subdir
                                if (ptr != NULL) {
@@ -359,14 +364,13 @@ int CheckCdrom() {
                return -1;              // SYSTEM.CNF and PSX.EXE not found
 
        if (CdromId[0] == '\0') {
-               i = strlen(exename);
-               if (i >= 2) {
-                       if (exename[i - 2] == ';') i-= 2;
-                       c = 8; i--;
-                       while (i >= 0 && c >= 0) {
-                               if (isalnum(exename[i])) CdromId[c--] = exename[i];
-                               i--;
-                       }
+               len = strlen(exename);
+               c = 0;
+               for (i = 0; i < len; ++i) {
+                       if (exename[i] == ';' || c >= sizeof(CdromId) - 1)
+                               break;
+                       if (isalnum(exename[i]))
+                               CdromId[c++] = exename[i];
                }
        }
 
@@ -384,6 +388,7 @@ int CheckCdrom() {
        }
        SysPrintf(_("CD-ROM Label: %.32s\n"), CdromLabel);
        SysPrintf(_("CD-ROM ID: %.9s\n"), CdromId);
+       SysPrintf(_("CD-ROM EXE Name: %.255s\n"), exename);
 
        BuildPPFCache();
 
@@ -506,7 +511,8 @@ int Load(const char *ExePath) {
                                retval = -1;
                                break;
                        case INVALID_EXE:
-                               SysPrintf(_("This file does not appear to be a valid PSX file.\n"));
+                               SysPrintf(_("This file does not appear to be a valid PSX EXE file.\n"));
+                               SysPrintf(_("(did you forget -cdfile ?)\n"));
                                retval = -1;
                                break;
                }
@@ -522,6 +528,35 @@ int Load(const char *ExePath) {
 
 // STATES
 
+static void *zlib_open(const char *name, const char *mode)
+{
+       return gzopen(name, mode);
+}
+
+static int zlib_read(void *file, void *buf, u32 len)
+{
+       return gzread(file, buf, len);
+}
+
+static int zlib_write(void *file, const void *buf, u32 len)
+{
+       return gzwrite(file, buf, len);
+}
+
+static long zlib_seek(void *file, long offs, int whence)
+{
+       return gzseek(file, offs, whence);
+}
+
+static void zlib_close(void *file)
+{
+       gzclose(file);
+}
+
+struct PcsxSaveFuncs SaveFuncs = {
+       zlib_open, zlib_read, zlib_write, zlib_seek, zlib_close
+};
+
 static const char PcsxHeader[32] = "STv4 PCSX v" PACKAGE_VERSION;
 
 // Savestate Versioning!
@@ -529,50 +564,50 @@ static const char PcsxHeader[32] = "STv4 PCSX v" PACKAGE_VERSION;
 static const u32 SaveVersion = 0x8b410006;
 
 int SaveState(const char *file) {
-       gzFile f;
+       void *f;
        GPUFreeze_t *gpufP;
        SPUFreeze_t *spufP;
        int Size;
        unsigned char *pMem;
 
-       f = gzopen(file, "wb");
+       f = SaveFuncs.open(file, "wb");
        if (f == NULL) return -1;
 
-       new_dyna_save();
+       new_dyna_before_save();
 
-       gzwrite(f, (void *)PcsxHeader, 32);
-       gzwrite(f, (void *)&SaveVersion, sizeof(u32));
-       gzwrite(f, (void *)&Config.HLE, sizeof(boolean));
+       SaveFuncs.write(f, (void *)PcsxHeader, 32);
+       SaveFuncs.write(f, (void *)&SaveVersion, sizeof(u32));
+       SaveFuncs.write(f, (void *)&Config.HLE, sizeof(boolean));
 
        pMem = (unsigned char *)malloc(128 * 96 * 3);
        if (pMem == NULL) return -1;
        GPU_getScreenPic(pMem);
-       gzwrite(f, pMem, 128 * 96 * 3);
+       SaveFuncs.write(f, pMem, 128 * 96 * 3);
        free(pMem);
 
        if (Config.HLE)
                psxBiosFreeze(1);
 
-       gzwrite(f, psxM, 0x00200000);
-       gzwrite(f, psxR, 0x00080000);
-       gzwrite(f, psxH, 0x00010000);
-       gzwrite(f, (void *)&psxRegs, sizeof(psxRegs));
+       SaveFuncs.write(f, psxM, 0x00200000);
+       SaveFuncs.write(f, psxR, 0x00080000);
+       SaveFuncs.write(f, psxH, 0x00010000);
+       SaveFuncs.write(f, (void *)&psxRegs, sizeof(psxRegs));
 
        // gpu
        gpufP = (GPUFreeze_t *)malloc(sizeof(GPUFreeze_t));
        gpufP->ulFreezeVersion = 1;
        GPU_freeze(1, gpufP);
-       gzwrite(f, gpufP, sizeof(GPUFreeze_t));
+       SaveFuncs.write(f, gpufP, sizeof(GPUFreeze_t));
        free(gpufP);
 
        // spu
        spufP = (SPUFreeze_t *) malloc(16);
-       SPU_freeze(2, spufP);
-       Size = spufP->Size; gzwrite(f, &Size, 4);
+       SPU_freeze(2, spufP, psxRegs.cycle);
+       Size = spufP->Size; SaveFuncs.write(f, &Size, 4);
        free(spufP);
        spufP = (SPUFreeze_t *) malloc(Size);
-       SPU_freeze(1, spufP);
-       gzwrite(f, spufP, Size);
+       SPU_freeze(1, spufP, psxRegs.cycle);
+       SaveFuncs.write(f, spufP, Size);
        free(spufP);
 
        sioFreeze(f, 1);
@@ -580,8 +615,9 @@ int SaveState(const char *file) {
        psxHwFreeze(f, 1);
        psxRcntFreeze(f, 1);
        mdecFreeze(f, 1);
+       new_dyna_freeze(f, 1);
 
-       gzclose(f);
+       SaveFuncs.close(f);
 
        new_dyna_after_save();
 
@@ -589,7 +625,7 @@ int SaveState(const char *file) {
 }
 
 int LoadState(const char *file) {
-       gzFile f;
+       void *f;
        GPUFreeze_t *gpufP;
        SPUFreeze_t *spufP;
        int Size;
@@ -597,15 +633,15 @@ int LoadState(const char *file) {
        u32 version;
        boolean hle;
 
-       f = gzopen(file, "rb");
+       f = SaveFuncs.open(file, "rb");
        if (f == NULL) return -1;
 
-       gzread(f, header, sizeof(header));
-       gzread(f, &version, sizeof(u32));
-       gzread(f, &hle, sizeof(boolean));
+       SaveFuncs.read(f, header, sizeof(header));
+       SaveFuncs.read(f, &version, sizeof(u32));
+       SaveFuncs.read(f, &hle, sizeof(boolean));
 
        if (strncmp("STv4 PCSX", header, 9) != 0 || version != SaveVersion) {
-               gzclose(f);
+               SaveFuncs.close(f);
                return -1;
        }
        Config.HLE = hle;
@@ -614,29 +650,29 @@ int LoadState(const char *file) {
                psxBiosInit();
 
        psxCpu->Reset();
-       gzseek(f, 128 * 96 * 3, SEEK_CUR);
+       SaveFuncs.seek(f, 128 * 96 * 3, SEEK_CUR);
 
-       gzread(f, psxM, 0x00200000);
-       gzread(f, psxR, 0x00080000);
-       gzread(f, psxH, 0x00010000);
-       gzread(f, (void *)&psxRegs, sizeof(psxRegs));
+       SaveFuncs.read(f, psxM, 0x00200000);
+       SaveFuncs.read(f, psxR, 0x00080000);
+       SaveFuncs.read(f, psxH, 0x00010000);
+       SaveFuncs.read(f, (void *)&psxRegs, sizeof(psxRegs));
 
        if (Config.HLE)
                psxBiosFreeze(0);
 
        // gpu
        gpufP = (GPUFreeze_t *)malloc(sizeof(GPUFreeze_t));
-       gzread(f, gpufP, sizeof(GPUFreeze_t));
+       SaveFuncs.read(f, gpufP, sizeof(GPUFreeze_t));
        GPU_freeze(0, gpufP);
        free(gpufP);
        if (HW_GPU_STATUS == 0)
                HW_GPU_STATUS = GPU_readStatus();
 
        // spu
-       gzread(f, &Size, 4);
+       SaveFuncs.read(f, &Size, 4);
        spufP = (SPUFreeze_t *)malloc(Size);
-       gzread(f, spufP, Size);
-       SPU_freeze(0, spufP);
+       SaveFuncs.read(f, spufP, Size);
+       SPU_freeze(0, spufP, psxRegs.cycle);
        free(spufP);
 
        sioFreeze(f, 0);
@@ -644,27 +680,27 @@ int LoadState(const char *file) {
        psxHwFreeze(f, 0);
        psxRcntFreeze(f, 0);
        mdecFreeze(f, 0);
+       new_dyna_freeze(f, 0);
 
-       gzclose(f);
-       new_dyna_restore();
+       SaveFuncs.close(f);
 
        return 0;
 }
 
 int CheckState(const char *file) {
-       gzFile f;
+       void *f;
        char header[32];
        u32 version;
        boolean hle;
 
-       f = gzopen(file, "rb");
+       f = SaveFuncs.open(file, "rb");
        if (f == NULL) return -1;
 
-       gzread(f, header, sizeof(header));
-       gzread(f, &version, sizeof(u32));
-       gzread(f, &hle, sizeof(boolean));
+       SaveFuncs.read(f, header, sizeof(header));
+       SaveFuncs.read(f, &version, sizeof(u32));
+       SaveFuncs.read(f, &hle, sizeof(boolean));
 
-       gzclose(f);
+       SaveFuncs.close(f);
 
        if (strncmp("STv4 PCSX", header, 9) != 0 || version != SaveVersion)
                return -1;