- FILE *tmp;\r
- char *p;\r
-\r
- p = romFileName + strlen(romFileName) - 1;\r
- for (; p > romFileName; p--)\r
- if (*p == '.') break;\r
- *p = 0;\r
-\r
- if((tmp = fopen(romFileName, "rb"))) {\r
- fclose(tmp);\r
- return 1;\r
- }\r
- return 0;\r
-}\r
-\r
-static void get_ext(char *file, char *ext)\r
-{\r
- char *p;\r
-\r
- p = file + strlen(file) - 4;\r
- if (p < file) p = file;\r
- strncpy(ext, p, 4);\r
- ext[4] = 0;\r
- strlwr(ext);\r
-}\r
-\r
-char *biosfiles_us[] = { "us_scd2_9306", "SegaCDBIOS9303", "us_scd1_9210" };\r
-char *biosfiles_eu[] = { "eu_mcd2_9306", "eu_mcd2_9303", "eu_mcd1_9210" };\r
-char *biosfiles_jp[] = { "jp_mcd1_9112", "jp_mcd1_9111" };\r
-\r
-extern char **g_argv;\r
-\r
-int find_bios(int region, char **bios_file)\r
-{\r
- static char bios_path[1024];\r
- int i, j, count;\r
- char **files;\r
- FILE *f = NULL;\r
-\r
- if (region == 4) { // US\r
- files = biosfiles_us;\r
- count = sizeof(biosfiles_us) / sizeof(char *);\r
- } else if (region == 8) { // EU\r
- files = biosfiles_eu;\r
- count = sizeof(biosfiles_eu) / sizeof(char *);\r
- } else if (region == 1 || region == 2) {\r
- files = biosfiles_jp;\r
- count = sizeof(biosfiles_jp) / sizeof(char *);\r
- } else {\r
- return 0;\r
- }\r
-\r
- for (i = 0; i < count; i++)\r
- {\r
- strncpy(bios_path, g_argv[0], 1023);\r
- bios_path[1024-32] = 0;\r
- for (j = strlen(bios_path); j > 0; j--)\r
- if (bios_path[j] == '/') { bios_path[j+1] = 0; break; }\r
- strcat(bios_path, files[i]);\r
- strcat(bios_path, ".bin");\r
- f = fopen(bios_path, "rb");\r
- if (f) break;\r
-\r
- bios_path[strlen(bios_path) - 4] = 0;\r
- strcat(bios_path, ".zip");\r
- f = fopen(bios_path, "rb");\r
- if (f) break;\r
- }\r
-\r
- if (f) {\r
- printf("using bios: %s\n", bios_path);\r
- fclose(f);\r
- if (bios_file) *bios_file = bios_path;\r
- return 1;\r
- } else {\r
- sprintf(menuErrorMsg, "no %s BIOS files found, read docs",\r
- region != 4 ? (region == 8 ? "EU" : "JAP") : "USA");\r
- printf("%s\n", menuErrorMsg);\r
- return 0;\r
- }\r
-}\r
-\r
-/* checks if romFileName points to valid MegaCD image\r
- * if so, checks for suitable BIOS */\r
-static int cd_check(char *ext, char **bios_file)\r
-{\r
- unsigned char buf[32];\r
- FILE *cd_f;\r
- int type = 0, region = 4; // 1: Japan, 4: US, 8: Europe\r
-\r
- cd_f = fopen(romFileName, "rb");\r
- if (!cd_f) return 0; // let the upper level handle this\r
-\r
- if (fread(buf, 1, 32, cd_f) != 32) {\r
- fclose(cd_f);\r
- return 0;\r
- }\r
-\r
- if (!strncasecmp("SEGADISCSYSTEM", (char *)buf+0x00, 14)) type = 1; // Sega CD (ISO)\r
- if (!strncasecmp("SEGADISCSYSTEM", (char *)buf+0x10, 14)) type = 2; // Sega CD (BIN)\r
- if (type == 0) {\r
- fclose(cd_f);\r
- return 0;\r
- }\r
-\r
- /* it seems we have a CD image here. Try to detect region and load a suitable BIOS now.. */\r
- fseek(cd_f, (type == 1) ? 0x100 : 0x110, SEEK_SET);\r
- fread(buf, 1, 1, cd_f);\r
- fclose(cd_f);\r
-\r
- if (buf[0] == 0x64) region = 4; // EU\r
- if (buf[0] == 0xa1) region = 1; // JAP\r
-\r
- printf("detected %s Sega/Mega CD image with %s region\n",\r
- type == 2 ? "BIN" : "ISO", region != 4 ? (region == 8 ? "EU" : "JAP") : "USA");\r
-\r
- if (PicoRegionOverride) {\r
- region = PicoRegionOverride;\r
- printf("overrided region to %s\n", region != 4 ? (region == 8 ? "EU" : "JAP") : "USA");\r
- }\r
-\r
- if(find_bios(region, bios_file))\r
- return type; // CD and BIOS detected\r
-\r
- return -1; // CD detected but load failed\r