#include "plugins.h"
#include "cdrom.h"
#include "cdriso.h"
+#include "ppf.h"
#ifdef _WIN32
#include <process.h>
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;
if (!subChanMixed && opensubfile(GetIsoFile()) == 0) {
SysPrintf("[+sub]");
}
+ if (opensbifile(GetIsoFile()) == 0) {
+ SysPrintf("[+sbi]");
+ }
SysPrintf(".\n");
}
}
numtracks = 0;
+ UnloadSBI();
return 0;
}
}
// 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;
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;
+ }
+}
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