int emu_SaveLoadState(const char *saveFname, int load) { int ret = 0; void *PmovFile = NULL; if(PmovFile = state_fopen(load ? "rb" : "wb")) { areaRead = (arearw *) emu_fread; areaWrite = (arearw *) emu_fwrite; areaEof = (areaeof *) emu_feof; areaSeek = (areaseek *) emu_fseek; areaClose = (areaclose *) emu_fclose; int ret = PmovState(load ? 6 : 5, PmovFile); areaClose(PmovFile); if(load) Pico.m.dirtyPal = 1; return ret; } return -1; }
int emu_SaveLoadGame(int load, int sram) { int ret = 0; char *saveFname; // make save filename saveFname = emu_GetSaveFName(load, sram, state_slot); if (saveFname == NULL) { if (!sram) { strcpy(noticeMsg, load ? "LOAD FAILED (missing file)" : "SAVE FAILED "); emu_noticeMsgUpdated(); } return -1; } lprintf("saveLoad (%i, %i): %s\n", load, sram, saveFname); if (sram) { FILE *sramFile; int sram_size; unsigned char *sram_data; int truncate = 1; if (PicoMCD&1) { if (PicoOpt&0x8000) { // MCD RAM cart? sram_size = 0x12000; sram_data = SRam.data; if (sram_data) memcpy32((int *)sram_data, (int *)Pico_mcd->bram, 0x2000/4); } else { sram_size = 0x2000; sram_data = Pico_mcd->bram; truncate = 0; // the .brm may contain RAM cart data after normal brm } } else { sram_size = SRam.end-SRam.start+1; if(Pico.m.sram_reg & 4) sram_size=0x2000; sram_data = SRam.data; } if (!sram_data) return 0; // SRam forcefully disabled for this game if (load) { sramFile = fopen(saveFname, "rb"); if(!sramFile) return -1; fread(sram_data, 1, sram_size, sramFile); fclose(sramFile); if ((PicoMCD&1) && (PicoOpt&0x8000)) memcpy32((int *)Pico_mcd->bram, (int *)sram_data, 0x2000/4); } else { // sram save needs some special processing // see if we have anything to save for (; sram_size > 0; sram_size--) if (sram_data[sram_size-1]) break; if (sram_size) { sramFile = fopen(saveFname, truncate ? "wb" : "r+b"); if (!sramFile) sramFile = fopen(saveFname, "wb"); // retry if (!sramFile) return -1; ret = fwrite(sram_data, 1, sram_size, sramFile); ret = (ret != sram_size) ? -1 : 0; fclose(sramFile); #ifndef NO_SYNC sync(); #endif } } return ret; } else { void *PmovFile = NULL; if (strcmp(saveFname + strlen(saveFname) - 3, ".gz") == 0) { if( (PmovFile = gzopen(saveFname, load ? "rb" : "wb")) ) { emu_setSaveStateCbs(1); if (!load) gzsetparams(PmovFile, 9, Z_DEFAULT_STRATEGY); } } else { if( (PmovFile = fopen(saveFname, load ? "rb" : "wb")) ) { emu_setSaveStateCbs(0); } } if(PmovFile) { ret = PmovState(load ? 6 : 5, PmovFile); areaClose(PmovFile); PmovFile = 0; if (load) Pico.m.dirtyPal=1; #ifndef NO_SYNC else sync(); #endif } else ret = -1; if (!ret) strcpy(noticeMsg, load ? "GAME LOADED " : "GAME SAVED "); else { strcpy(noticeMsg, load ? "LOAD FAILED " : "SAVE FAILED "); ret = -1; } emu_noticeMsgUpdated(); return ret; } }