+static int detect_media(const char *fname)\r
+{\r
+ static const short sms_offsets[] = { 0x7ff0, 0x3ff0, 0x1ff0 };\r
+ pm_file *pmf;\r
+ char buff[32];\r
+ char ext[5];\r
+ int i;\r
+\r
+ get_ext(fname, ext);\r
+\r
+ // detect wrong extensions\r
+ if (!strcmp(ext, ".srm") || !strcmp(ext, "s.gz") || !strcmp(ext, ".mds")) // s.gz ~ .mds.gz\r
+ return PM_BAD;\r
+\r
+ /* don't believe in extensions, except .cue */\r
+ if (strcasecmp(ext, ".cue") == 0)\r
+ return PM_CD;\r
+\r
+ pmf = pm_open(fname);\r
+ if (pmf == NULL)\r
+ return PM_BAD;\r
+\r
+ if (pm_read(buff, 32, pmf) != 32) {\r
+ pm_close(pmf);\r
+ return PM_BAD;\r
+ }\r
+\r
+ if (strncasecmp("SEGADISCSYSTEM", buff + 0x00, 14) == 0 ||\r
+ strncasecmp("SEGADISCSYSTEM", buff + 0x10, 14) == 0) {\r
+ pm_close(pmf);\r
+ return PM_CD;\r
+ }\r
+\r
+ for (i = 0; i < array_size(sms_offsets); i++) {\r
+ if (pm_seek(pmf, sms_offsets[i], SEEK_SET) != sms_offsets[i])\r
+ goto not_mark3; /* actually it could be but can't be detected */\r
+\r
+ if (pm_read(buff, 16, pmf) != 16)\r
+ goto not_mark3;\r
+\r
+ if (strncasecmp("TMR SEGA", buff, 8) == 0) {\r
+ pm_close(pmf);\r
+ return PM_MARK3;\r
+ }\r
+ }\r
+\r
+not_mark3:\r
+ pm_close(pmf);\r
+ /* the main emu function is to emulate MD, so assume MD */\r
+ return PM_MD_CART;\r
+}\r
+\r