+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+0x10B : 0x110+0x10B, SEEK_SET);\r
+ fread(buf, 1, 1, cd_f);\r
+ fclose(cd_f);\r
+\r
+ if (buf[0] == 0x64) region = 8; // 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
+}\r
+\r