-int emu_ReloadRom(void)\r
-{\r
- unsigned int rom_size = 0;\r
- char *used_rom_name = romFileName;\r
- char ext[5];\r
- pm_file *rom;\r
- int ret, cd_state;\r
-\r
- printf("emu_ReloadRom(%s)\n", romFileName);\r
-\r
- get_ext(romFileName, ext);\r
-\r
- // detect wrong extensions\r
- if(!strcmp(ext, ".srm") || !strcmp(ext, "s.gz") || !strcmp(ext, ".mds")) { // s.gz ~ .mds.gz\r
- sprintf(menuErrorMsg, "Not a ROM selected.");\r
- return 0;\r
- }\r
-\r
- PicoPatchUnload();\r
-\r
- // check for movie file\r
- if(movie_data) {\r
- free(movie_data);\r
- movie_data = 0;\r
- }\r
- if(!strcmp(ext, ".gmv")) {\r
- // check for both gmv and rom\r
- int dummy;\r
- FILE *movie_file = fopen(romFileName, "rb");\r
- if(!movie_file) {\r
- sprintf(menuErrorMsg, "Failed to open movie.");\r
- return 0;\r
- }\r
- fseek(movie_file, 0, SEEK_END);\r
- movie_size = ftell(movie_file);\r
- fseek(movie_file, 0, SEEK_SET);\r
- if(movie_size < 64+3) {\r
- sprintf(menuErrorMsg, "Invalid GMV file.");\r
- fclose(movie_file);\r
- return 0;\r
- }\r
- movie_data = malloc(movie_size);\r
- if(movie_data == NULL) {\r
- sprintf(menuErrorMsg, "low memory.");\r
- fclose(movie_file);\r
- return 0;\r
- }\r
- fread(movie_data, 1, movie_size, movie_file);\r
- fclose(movie_file);\r
- if (strncmp((char *)movie_data, "Gens Movie TEST", 15) != 0) {\r
- sprintf(menuErrorMsg, "Invalid GMV file.");\r
- return 0;\r
- }\r
- dummy = try_rfn_cut() || try_rfn_cut();\r
- if (!dummy) {\r
- sprintf(menuErrorMsg, "Could't find a ROM for movie.");\r
- return 0;\r
- }\r
- get_ext(romFileName, ext);\r
- }\r
- else if (!strcmp(ext, ".pat")) {\r
- int dummy;\r
- PicoPatchLoad(romFileName);\r
- dummy = try_rfn_cut() || try_rfn_cut();\r
- if (!dummy) {\r
- sprintf(menuErrorMsg, "Could't find a ROM to patch.");\r
- return 0;\r
- }\r
- get_ext(romFileName, ext);\r
- }\r
-\r
- // check for MegaCD image\r
- cd_state = cd_check(&used_rom_name);\r
- if (cd_state > 0) {\r
- PicoMCD |= 1;\r
- get_ext(used_rom_name, ext);\r
- } else if (cd_state == -1) {\r
- // bios_help() ?\r
- return 0;\r
- } else {\r
- if (PicoMCD & 1) PicoExitMCD();\r
- PicoMCD &= ~1;\r
- }\r
-\r
- rom = pm_open(used_rom_name);\r
- if(!rom) {\r
- sprintf(menuErrorMsg, "Failed to open rom.");\r
- return 0;\r
- }\r
-\r
- if(rom_data) {\r
- free(rom_data);\r
- rom_data = 0;\r
- rom_size = 0;\r
- }\r
-\r
- if( (ret = PicoCartLoad(rom, &rom_data, &rom_size)) ) {\r
- sprintf(menuErrorMsg, "PicoCartLoad() failed.");\r
- printf("%s\n", menuErrorMsg);\r
- pm_close(rom);\r
- return 0;\r
- }\r
- pm_close(rom);\r
-\r
- // detect wrong files (Pico crashes on very small files), also see if ROM EP is good\r
- if(rom_size <= 0x200 || strncmp((char *)rom_data, "Pico", 4) == 0 ||\r
- ((*(unsigned short *)(rom_data+4)<<16)|(*(unsigned short *)(rom_data+6))) >= (int)rom_size) {\r
- if (rom_data) free(rom_data);\r
- rom_data = 0;\r
- sprintf(menuErrorMsg, "Not a ROM selected.");\r
- return 0;\r
- }\r
-\r
- // load config for this ROM (do this before insert to get correct region)\r
- ret = emu_ReadConfig(1);\r
- if (!ret)\r
- emu_ReadConfig(0);\r
-\r
- printf("PicoCartInsert(%p, %d);\n", rom_data, rom_size);\r
- if(PicoCartInsert(rom_data, rom_size)) {\r
- sprintf(menuErrorMsg, "Failed to load ROM.");\r
- return 0;\r
- }\r
-\r
- Pico.m.frame_count = 0;\r
-\r
- // insert CD if it was detected\r
- if (cd_state > 0) {\r
- ret = Insert_CD(romFileName, cd_state == 2);\r
- if (ret != 0) {\r
- sprintf(menuErrorMsg, "Insert_CD() failed, invalid CD image?");\r
- printf("%s\n", menuErrorMsg);\r
- return 0;\r
- }\r
- }\r
-\r
- // emu_ReadConfig() might have messed currentConfig.lastRomFile\r
- strncpy(currentConfig.lastRomFile, romFileName, sizeof(currentConfig.lastRomFile)-1);\r
- currentConfig.lastRomFile[sizeof(currentConfig.lastRomFile)-1] = 0;\r
-\r
- if (PicoPatches) {\r
- PicoPatchPrepare();\r
- PicoPatchApply();\r
- }\r
-\r
- // additional movie stuff\r
- if(movie_data) {\r
- if(movie_data[0x14] == '6')\r
- PicoOpt |= 0x20; // 6 button pad\r
- else PicoOpt &= ~0x20;\r
- PicoOpt |= 0x40; // accurate timing\r
- if(movie_data[0xF] >= 'A') {\r
- if(movie_data[0x16] & 0x80) {\r
- PicoRegionOverride = 8;\r
- } else {\r
- PicoRegionOverride = 4;\r
- }\r
- PicoReset(0);\r
- // TODO: bits 6 & 5\r
- }\r
- movie_data[0x18+30] = 0;\r
- sprintf(noticeMsg, "MOVIE: %s", (char *) &movie_data[0x18]);\r
- }\r
- else\r
- {\r
- if(Pico.m.pal) {\r
- strcpy(noticeMsg, "PAL SYSTEM / 50 FPS");\r
- } else {\r
- strcpy(noticeMsg, "NTSC SYSTEM / 60 FPS");\r
- }\r
- }\r
- gettimeofday(¬iceMsgTime, 0);\r
-\r
- // load SRAM for this ROM\r
- if(currentConfig.EmuOpt & 1)\r
- emu_SaveLoadGame(1, 1);\r
-\r
- return 1;\r
-}\r
-\r
-\r