int LoadStateEmbed(char *file) { GPUFreeze_t *gpufP; int Size; char header[32]; FILE* fp; FILE* fp2; uint8 * embSaveTmp; size_t blockSize = Movie.memoryCard1Offset-Movie.saveStateOffset; embSaveTmp = (uint8*)malloc(blockSize); fp = fopen(file,"rb"); fp2 = fopen("embsave.tmp","wb"); fseek(fp, Movie.saveStateOffset, SEEK_SET); fread(embSaveTmp, 1, blockSize, fp); fwrite(embSaveTmp, 1, blockSize, fp2); fclose(fp); fclose(fp2); EMUFILE_FILE ef("embsave.tmp", "rb"); if (ef.fail()) return -1; EMUFILE *f = &ef; psxCpu->Reset(); gzread(f, header, 32); if (strncmp("STv3 PSXjin", header, 9)) { return -1; } exceptionPatches.clear(); int tag; gzread(f, &tag, 4); if (tag == 'ExPs') { gzread(f, &Size, 4); while (Size--) { u32 addr, val; gzread(f, &addr, 4); gzread(f, &val, 4); exceptionPatches.push_back(std::make_pair(addr, val)); } gzseek(f, 128*96*3-4-4-exceptionPatches.size()*4*2, SEEK_CUR); } else gzseek(f, 128*96*3-4, SEEK_CUR); gzread(f, psxM, 0x00200000); gzread(f, psxP, 0x00010000); gzread(f, psxR, 0x00080000); gzread(f, psxH, 0x00010000); gzread(f, (void*)&psxRegs, sizeof(psxRegs)); if (Config.HLE) //adelikat: TODO: remove all references to Config.HLE, we will not be using that BIOS, ever psxBiosFreeze(0); // gpu gpufP = (GPUFreeze_t *) malloc (sizeof(GPUFreeze_t)); gzread(f, gpufP, sizeof(GPUFreeze_t)); gpufP->extraData = malloc(gpufP->extraDataSize); gzread(f, gpufP->extraData, gpufP->extraDataSize); GPUfreeze(0, gpufP); free(gpufP->extraData); free(gpufP); sioFreeze(f, 0); cdrFreeze(f, 0); psxHwFreeze(f, 0); CDRisoFreeze(f,0); psxRcntFreeze(f, 0); mdecFreeze(f, 0); //TODO - no movie state? are you sure? // spu gzread(f, &Size, 4); EMUFILE_MEMORY memfile; memfile.truncate(Size); gzread(f, memfile.buf(), Size); bool ok = SPUunfreeze_new(&memfile); if(!ok) return 1; remove("embsave.tmp"); return 0; }
int LoadStateEmufile(EMUFILE *f) { GPUFreeze_t *gpufP; int Size; char header[32]; printf("loadstate---\n"); psxCpu->Reset(); gzread(f, header, 32); if (strncmp("STv3 PSXjin", header, 9)) { return -1; } exceptionPatches.clear(); int tag; gzread(f, &tag, 4); if (tag == 'ExPs') { gzread(f, &Size, 4); while (Size--) { u32 addr, val; gzread(f, &addr, 4); gzread(f, &val, 4); exceptionPatches.push_back(std::make_pair(addr, val)); } gzseek(f, 128*96*3-4-4-exceptionPatches.size()*4*2, SEEK_CUR); } else gzseek(f, 128*96*3-4, SEEK_CUR); gzread(f, psxM, 0x00200000); gzread(f, psxP, 0x00010000); gzread(f, psxR, 0x00080000); gzread(f, psxH, 0x00010000); gzread(f, (void*)&psxRegs, sizeof(psxRegs)); if (Config.HLE) psxBiosFreeze(0); // gpu gpufP = (GPUFreeze_t *) malloc (sizeof(GPUFreeze_t)); gzread(f, gpufP, sizeof(GPUFreeze_t)); gpufP->extraData = malloc(gpufP->extraDataSize); gzread(f, gpufP->extraData, gpufP->extraDataSize); GPUfreeze(0, gpufP); free(gpufP->extraData); free(gpufP); sioFreeze(f, 0); cdrFreeze(f, 0); psxHwFreeze(f, 0); CDRisoFreeze(f,0); psxRcntFreeze(f, 0); mdecFreeze(f, 0); PadFreeze(f, 0); MovieFreeze(f, 0); // spu gzread(f, &Size, 4); EMUFILE_MEMORY memfile; memfile.truncate(Size); gzread(f, memfile.buf(), Size); bool ok = SPUunfreeze_new(&memfile); if(!ok) return 1; return 0; }