diff options
Diffstat (limited to 'libpcsxcore')
-rw-r--r-- | libpcsxcore/cdriso.c | 24 | ||||
-rw-r--r-- | libpcsxcore/cdrom.c | 3 | ||||
-rw-r--r-- | libpcsxcore/ppf.c | 43 | ||||
-rw-r--r-- | libpcsxcore/ppf.h | 15 |
4 files changed, 83 insertions, 2 deletions
diff --git a/libpcsxcore/cdriso.c b/libpcsxcore/cdriso.c index 1e9aded..2d371dd 100644 --- a/libpcsxcore/cdriso.c +++ b/libpcsxcore/cdriso.c @@ -22,6 +22,7 @@ #include "plugins.h" #include "cdrom.h" #include "cdriso.h" +#include "ppf.h" #ifdef _WIN32 #include <process.h> @@ -685,6 +686,25 @@ static int opensubfile(const char *isoname) { return 0; } +static int opensbifile(const char *isoname) { + char sbiname[MAXPATHLEN]; + int s; + + strncpy(sbiname, isoname, sizeof(sbiname)); + sbiname[MAXPATHLEN - 1] = '\0'; + if (strlen(sbiname) >= 4) { + strcpy(sbiname + strlen(sbiname) - 4, ".sbi"); + } + else { + return -1; + } + + fseek(cdHandle, 0, SEEK_END); + s = ftell(cdHandle) / 2352; + + return LoadSBI(sbiname, s); +} + static void PrintTracks(void) { int i; @@ -730,6 +750,9 @@ static long CALLBACK ISOopen(void) { if (!subChanMixed && opensubfile(GetIsoFile()) == 0) { SysPrintf("[+sub]"); } + if (opensbifile(GetIsoFile()) == 0) { + SysPrintf("[+sbi]"); + } SysPrintf(".\n"); @@ -765,6 +788,7 @@ static long CALLBACK ISOclose(void) { } } numtracks = 0; + UnloadSBI(); return 0; } diff --git a/libpcsxcore/cdrom.c b/libpcsxcore/cdrom.c index 0de7ecc..ee74835 100644 --- a/libpcsxcore/cdrom.c +++ b/libpcsxcore/cdrom.c @@ -988,10 +988,9 @@ void cdrInterrupt() { } // redump.org - wipe time - /*if( !cdr.Play && CheckSBI(cdr.Result+5) ) { + if( !cdr.Play && CheckSBI(cdr.Result+5) ) { memset( cdr.Result+2, 0, 6 ); } - */ cdr.Stat = Acknowledge; break; diff --git a/libpcsxcore/ppf.c b/libpcsxcore/ppf.c index 45c8733..268ed1c 100644 --- a/libpcsxcore/ppf.c +++ b/libpcsxcore/ppf.c @@ -330,3 +330,46 @@ void BuildPPFCache() { SysPrintf(_("Loaded PPF %d.0 patch: %s.\n"), method + 1, szPPF); } + +// redump.org SBI files, slightly different handling from PCSX-Reloaded +unsigned char *sbi_sectors; + +int LoadSBI(const char *fname, int sector_count) { + char buffer[16], sbifile[MAXPATHLEN]; + FILE *sbihandle; + u8 sbitime[3]; + int s; + + sbihandle = fopen(fname, "rb"); + if (sbihandle == NULL) + return -1; + +if (sbi_sectors != NULL) printf("sbi_sectors?\n"); + sbi_sectors = calloc(1, sector_count / 8); + if (sbi_sectors == NULL) + return -1; + + // 4-byte SBI header + fread(buffer, 1, 4, sbihandle); + while (!feof(sbihandle)) { + fread(sbitime, 1, 3, sbihandle); + fread(buffer, 1, 11, sbihandle); + + s = MSF2SECT(btoi(sbitime[0]), btoi(sbitime[1]), btoi(sbitime[2])); + if (s < sector_count) + sbi_sectors[s >> 3] |= 1 << (s&7); + else + SysPrintf(_("SBI sector %d >= %d?\n"), s, sector_count); + } + + fclose(sbihandle); + + return 0; +} + +void UnloadSBI(void) { + if (sbi_sectors) { + free(sbi_sectors); + sbi_sectors = NULL; + } +} diff --git a/libpcsxcore/ppf.h b/libpcsxcore/ppf.h index f578028..fdb11eb 100644 --- a/libpcsxcore/ppf.h +++ b/libpcsxcore/ppf.h @@ -27,6 +27,21 @@ void BuildPPFCache(); void FreePPFCache(); void CheckPPFCache(unsigned char *pB, unsigned char m, unsigned char s, unsigned char f); +int LoadSBI(const char *fname, int sector_count); +void UnloadSBI(void); + +extern unsigned char *sbi_sectors; + +static inline int CheckSBI(const u8 *t) +{ + int s; + if (sbi_sectors == NULL) + return 0; + + s = MSF2SECT(btoi(t[0]), btoi(t[1]), btoi(t[2])); + return (sbi_sectors[s >> 3] >> (s & 7)) & 1; +} + #ifdef __cplusplus } #endif |