- static const short sms_offsets[] = { 0x7ff0, 0x3ff0, 0x1ff0 };
- static const char *sms_exts[] = { "sms", "gg", "sg" };
- static const char *md_exts[] = { "gen", "bin", "smd" };
- char buff0[32], buff[32];
- unsigned short *d16;
- pm_file *pmf;
- char ext[5];
- int i;
-
- get_ext(fname, ext);
-
- // detect wrong extensions
- if (!strcmp(ext, ".srm") || !strcmp(ext, "s.gz") || !strcmp(ext, ".mds")) // s.gz ~ .mds.gz
- return PM_BAD_DETECT;
-
- /* don't believe in extensions, except .cue */
- if (strcasecmp(ext, ".cue") == 0)
- return PM_CD;
-
- pmf = pm_open(fname);
- if (pmf == NULL)
- return PM_BAD_DETECT;
-
- if (pm_read(buff0, 32, pmf) != 32) {
- pm_close(pmf);
- return PM_BAD_DETECT;
- }
-
- if (strncasecmp("SEGADISCSYSTEM", buff0 + 0x00, 14) == 0 ||
- strncasecmp("SEGADISCSYSTEM", buff0 + 0x10, 14) == 0) {
- pm_close(pmf);
- return PM_CD;
- }
-
- /* check for SMD evil */
- if (pmf->size >= 0x4200 && (pmf->size & 0x3fff) == 0x200) {
- if (pm_seek(pmf, sms_offsets[0] + 0x200, SEEK_SET) == sms_offsets[0] + 0x200 &&
- pm_read(buff, 16, pmf) == 16 &&
- strncmp("TMR SEGA", buff, 8) == 0)
- goto looks_like_sms;
-
- /* could parse further but don't bother */
- goto extension_check;
- }
-
- /* MD header? Act as TMSS BIOS here */
- if (pm_seek(pmf, 0x100, SEEK_SET) == 0x100 && pm_read(buff, 16, pmf) == 16) {
- if (strncmp(buff, "SEGA", 4) == 0 || strncmp(buff, " SEG", 4) == 0)
- goto looks_like_md;
- }
-
- for (i = 0; i < ARRAY_SIZE(sms_offsets); i++) {
- if (pm_seek(pmf, sms_offsets[i], SEEK_SET) != sms_offsets[i])
- continue;
-
- if (pm_read(buff, 16, pmf) != 16)
- continue;
-
- if (strncmp("TMR SEGA", buff, 8) == 0)
- goto looks_like_sms;
- }
+ static const short sms_offsets[] = { 0x7ff0, 0x3ff0, 0x1ff0 };
+ static const char *sms_exts[] = { "sms", "gg", "sg" };
+ static const char *md_exts[] = { "gen", "bin", "smd" };
+ char buff0[32], buff[32];
+ unsigned short *d16;
+ pm_file *pmf;
+ char ext[5];
+ int i;
+
+ get_ext(fname, ext);
+
+ // detect wrong extensions
+ if (!strcmp(ext, ".srm") || !strcmp(ext, "s.gz") || !strcmp(ext, ".mds")) // s.gz ~ .mds.gz
+ return PM_BAD_DETECT;
+
+ /* don't believe in extensions, except .cue */
+ if (strcasecmp(ext, ".cue") == 0)
+ return PM_CD;
+
+ pmf = pm_open(fname);
+ if (pmf == NULL)
+ return PM_BAD_DETECT;
+
+ if (pm_read(buff0, 32, pmf) != 32) {
+ pm_close(pmf);
+ return PM_BAD_DETECT;
+ }
+
+ if (strncasecmp("SEGADISCSYSTEM", buff0 + 0x00, 14) == 0 ||
+ strncasecmp("SEGADISCSYSTEM", buff0 + 0x10, 14) == 0) {
+ pm_close(pmf);
+ return PM_CD;
+ }
+
+ /* check for SMD evil */
+ if (pmf->size >= 0x4200 && (pmf->size & 0x3fff) == 0x200) {
+ if (pm_seek(pmf, sms_offsets[0] + 0x200, SEEK_SET) == sms_offsets[0] + 0x200 &&
+ pm_read(buff, 16, pmf) == 16 &&
+ strncmp("TMR SEGA", buff, 8) == 0)
+ goto looks_like_sms;
+
+ /* could parse further but don't bother */
+ goto extension_check;
+ }
+
+ /* MD header? Act as TMSS BIOS here */
+ if (pm_seek(pmf, 0x100, SEEK_SET) == 0x100 && pm_read(buff, 16, pmf) == 16) {
+ if (strncmp(buff, "SEGA", 4) == 0 || strncmp(buff, " SEG", 4) == 0)
+ goto looks_like_md;
+ }
+
+ for (i = 0; i < ARRAY_SIZE(sms_offsets); i++) {
+ if (pm_seek(pmf, sms_offsets[i], SEEK_SET) != sms_offsets[i])
+ continue;
+
+ if (pm_read(buff, 16, pmf) != 16)
+ continue;
+
+ if (strncmp("TMR SEGA", buff, 8) == 0)
+ goto looks_like_sms;
+ }