int loadROM(fileBrowser_file* rom){ int ret = 0; savestates_job = 0; //clear all pending save states // First, if there's already a loaded ROM if(hasLoadedROM){ // Unload it, and deinit everything cpu_deinit(); eepromWritten = FALSE; mempakWritten = FALSE; sramWritten = FALSE; flashramWritten = FALSE; romClosed_RSP(); romClosed_input(); romClosed_audio(); romClosed_gfx(); closeDLL_RSP(); closeDLL_input(); closeDLL_audio(); closeDLL_gfx(); ROMCache_deinit(); free_memory(); #ifndef HW_RVL ARAM_manager_deinit(); #endif } format_mempacks(); reset_flashram(); init_eeprom(); hasLoadedROM = TRUE; #ifndef HW_RVL ARAM_manager_init(); #endif #ifdef USE_TLB_CACHE TLBCache_init(); #else tlb_mem2_init(); #endif //romFile_init(rom); ret = rom_read(rom); if(ret){ // Something failed while trying to read the ROM. hasLoadedROM = FALSE; return ret; } // Init everything for this ROM init_memory(); gfx_set_fb(xfb[0], xfb[1]); if (screenMode == SCREENMODE_16x9_PILLARBOX) gfx_set_window( 78, 0, 483, 480); else gfx_set_window( 0, 0, 640, 480); gfx_info_init(); audio_info_init(); // control_info_init(); rsp_info_init(); romOpen_gfx(); // gfx_set_fb(xfb[0], xfb[1]); romOpen_audio(); romOpen_input(); cpu_init(); if(autoSave==AUTOSAVE_ENABLE) { switch (nativeSaveDevice) { case NATIVESAVEDEVICE_SD: case NATIVESAVEDEVICE_USB: // Adjust saveFile pointers saveFile_dir = (nativeSaveDevice==NATIVESAVEDEVICE_SD) ? &saveDir_libfat_Default:&saveDir_libfat_USB; saveFile_readFile = fileBrowser_libfat_readFile; saveFile_writeFile = fileBrowser_libfat_writeFile; saveFile_init = fileBrowser_libfat_init; saveFile_deinit = fileBrowser_libfat_deinit; break; case NATIVESAVEDEVICE_CARDA: case NATIVESAVEDEVICE_CARDB: // Adjust saveFile pointers saveFile_dir = (nativeSaveDevice==NATIVESAVEDEVICE_CARDA) ? &saveDir_CARD_SlotA:&saveDir_CARD_SlotB; saveFile_readFile = fileBrowser_CARD_readFile; saveFile_writeFile = fileBrowser_CARD_writeFile; saveFile_init = fileBrowser_CARD_init; saveFile_deinit = fileBrowser_CARD_deinit; break; } // Try loading everything int result = 0; saveFile_init(saveFile_dir); result += loadEeprom(saveFile_dir); result += loadSram(saveFile_dir); result += loadMempak(saveFile_dir); result += loadFlashram(saveFile_dir); saveFile_deinit(saveFile_dir); switch (nativeSaveDevice) { case NATIVESAVEDEVICE_SD: // if (result) menu::MessageBox::getInstance().setMessage("Found & loaded save from SD card"); if (result) autoSaveLoaded = NATIVESAVEDEVICE_SD; break; case NATIVESAVEDEVICE_USB: // if (result) menu::MessageBox::getInstance().setMessage("Found & loaded save from USB device"); if (result) autoSaveLoaded = NATIVESAVEDEVICE_USB; break; case NATIVESAVEDEVICE_CARDA: // if (result) menu::MessageBox::getInstance().setMessage("Found & loaded save from memcard in slot A"); if (result) autoSaveLoaded = NATIVESAVEDEVICE_CARDA; break; case NATIVESAVEDEVICE_CARDB: // if (result) menu::MessageBox::getInstance().setMessage("Found & loaded save from memcard in slot B"); if (result) autoSaveLoaded = NATIVESAVEDEVICE_CARDB; break; } } return 0; }
void savestates_load() { gzFile f = NULL; char *filename, buf[1024]; int len, i; /* fix the filename to %s.st%d format */ filename = malloc(1024); sprintf(filename, "%s%s%s%s.st%d",(saveStateDevice==SAVESTATEDEVICE_USB)?"usb:":"sd:", statespath, ROM_SETTINGS.goodname, saveregionstr(),savestates_slot); f = gzopen(filename, "rb"); free(filename); if (!f) { return; } if(stop) { pauseRemovalThread(); } else { pauseAudio(); } gzread(f, &rdram_register, sizeof(RDRAM_register)); gzread(f, &MI_register, sizeof(mips_register)); gzread(f, &pi_register, sizeof(PI_register)); gzread(f, &sp_register, sizeof(SP_register)); gzread(f, &rsp_register, sizeof(RSP_register)); gzread(f, &si_register, sizeof(SI_register)); gzread(f, &vi_register, sizeof(VI_register)); gzread(f, &ri_register, sizeof(RI_register)); gzread(f, &ai_register, sizeof(AI_register)); gzread(f, &dpc_register, sizeof(DPC_register)); gzread(f, &dps_register, sizeof(DPS_register)); #ifdef USE_EXPANSION gzread(f, rdram, 0x800000); #else gzread(f, rdram, 0x400000); #endif gzread(f, SP_DMEM, 0x1000); gzread(f, SP_IMEM, 0x1000); gzread(f, PIF_RAM, 0x40); gzread(f, buf, 24); load_flashram_infos(buf); #ifndef USE_TLB_CACHE gzread(f, tlb_LUT_r, 0x100000); gzread(f, tlb_LUT_w, 0x100000); #else int numNodesWritten_r=0,numNodesWritten_w=0,cntr,tlbpage,tlbvalue; TLBCache_deinit(); TLBCache_init(); //Load number of them.. gzread(f, &numNodesWritten_r, 4); for(cntr=0;cntr<numNodesWritten_r;cntr++) { gzread(f, &tlbpage, 4); gzread(f, &tlbvalue, 4); TLBCache_set_r(tlbpage,tlbvalue); } gzread(f, &numNodesWritten_w, 4); for(cntr=0;cntr<numNodesWritten_w;cntr++) { gzread(f, &tlbpage, 4); gzread(f, &tlbvalue, 4); TLBCache_set_w(tlbpage,tlbvalue); } #endif gzread(f, &llbit, 4); gzread(f, reg, 32*8); for (i=0; i<32; i++) { gzread(f, reg_cop0+i, 4); gzread(f, buf, 4); // for compatibility with old versions purpose } set_fpr_pointers(Status); // Status is reg_cop0[12] gzread(f, &lo, 8); gzread(f, &hi, 8); gzread(f, reg_cop1_fgr_64, 32*8); if ((Status & 0x04000000) == 0) // 32-bit FPR mode requires data shuffling because 64-bit layout is always stored in savestate file shuffle_fpr_data(0x04000000, 0); gzread(f, &FCR0, 4); gzread(f, &FCR31, 4); gzread(f, tlb_e, 32*sizeof(tlb)); for (i=0; i<0x100000; i++) invalid_code_set(i, 1); gzread(f, &interp_addr, 4); //dynarec should be ok with just this gzread(f, &next_interupt, 4); gzread(f, &next_vi, 4); gzread(f, &vi_field, 4); len = 0; while(1) { gzread(f, buf+len, 4); if (*((unsigned long*)&buf[len]) == 0xFFFFFFFF) break; gzread(f, buf+len+4, 4); len += 8; } load_eventqueue_infos(buf); gzclose(f); last_addr = interp_addr; if(stop) { continueRemovalThread(); } else { resumeAudio(); } }