-static unsigned char id_header[0x100];\r
-\r
-/* checks if fname points to valid MegaCD image\r
- * if so, checks for suitable BIOS */\r
-int emu_cd_check(int *pregion, char *fname_in)\r
-{\r
- unsigned char buf[32];\r
- pm_file *cd_f;\r
- int region = 4; // 1: Japan, 4: US, 8: Europe\r
- char ext[5], *fname = fname_in;\r
- cue_track_type type = CT_UNKNOWN;\r
- cue_data_t *cue_data = NULL;\r
-\r
- get_ext(fname_in, ext);\r
- if (strcasecmp(ext, ".cue") == 0) {\r
- cue_data = cue_parse(fname_in);\r
- if (cue_data != NULL) {\r
- fname = cue_data->tracks[1].fname;\r
- type = cue_data->tracks[1].type;\r
- }\r
- else\r
- return -1;\r
- }\r
-\r
- cd_f = pm_open(fname);\r
- if (cue_data != NULL)\r
- cue_destroy(cue_data);\r
-\r
- if (cd_f == NULL) return 0; // let the upper level handle this\r
-\r
- if (pm_read(buf, 32, cd_f) != 32) {\r
- pm_close(cd_f);\r
- return -1;\r
- }\r
-\r
- if (!strncasecmp("SEGADISCSYSTEM", (char *)buf+0x00, 14)) {\r
- if (type && type != CT_ISO)\r
- elprintf(EL_STATUS, ".cue has wrong type: %i", type);\r
- type = CT_ISO; // Sega CD (ISO)\r
- }\r
- if (!strncasecmp("SEGADISCSYSTEM", (char *)buf+0x10, 14)) {\r
- if (type && type != CT_BIN)\r
- elprintf(EL_STATUS, ".cue has wrong type: %i", type);\r
- type = CT_BIN; // Sega CD (BIN)\r
- }\r
-\r
- if (type == CT_UNKNOWN) {\r
- pm_close(cd_f);\r
- return 0;\r
- }\r
-\r
- pm_seek(cd_f, (type == CT_ISO) ? 0x100 : 0x110, SEEK_SET);\r
- pm_read(id_header, sizeof(id_header), cd_f);\r
-\r
- /* it seems we have a CD image here. Try to detect region now.. */\r
- pm_seek(cd_f, (type == CT_ISO) ? 0x100+0x10B : 0x110+0x10B, SEEK_SET);\r
- pm_read(buf, 1, cd_f);\r
- pm_close(cd_f);\r
-\r
- if (buf[0] == 0x64) region = 8; // EU\r
- if (buf[0] == 0xa1) region = 1; // JAP\r
-\r
- lprintf("detected %s Sega/Mega CD image with %s region\n",\r
- type == CT_BIN ? "BIN" : "ISO", region != 4 ? (region == 8 ? "EU" : "JAP") : "USA");\r
-\r
- if (pregion != NULL) *pregion = region;\r
-\r
- return type;\r
-}\r
-\r