void CPS2VM::SaveVMState(const char* sPath, unsigned int& result) { if(m_ee->m_gs == NULL) { printf("PS2VM: GS Handler was not instancied. Cannot save state.\r\n"); result = 1; return; } try { Framework::CStdStream stateStream(sPath, "wb"); Framework::CZipArchiveWriter archive; m_ee->SaveState(archive); m_iop->SaveState(archive); m_ee->m_gs->SaveState(archive); m_iopOs->GetPadman()->SaveState(archive); //TODO: Save CDVDFSV state archive.Write(stateStream); } catch(...) { result = 1; return; } printf("PS2VM: Saved state to file '%s'.\r\n", sPath); result = 0; }
void CFrameDump::Write(Framework::CStream& output) const { Framework::CZipArchiveWriter archive; archive.InsertFile(new CMemoryStateFile(STATE_INITIAL_GSRAM, m_initialGsRam, CGSHandler::RAMSIZE)); archive.InsertFile(new CMemoryStateFile(STATE_INITIAL_GSREGS, m_initialGsRegisters, sizeof(uint64) * CGSHandler::REGISTER_MAX)); { auto privRegsStateFile = new CRegisterStateFile(STATE_INITIAL_GSPRIVREGS); privRegsStateFile->SetRegister64(STATE_PRIVREG_SMODE2, m_initialSMODE2); archive.InsertFile(privRegsStateFile); } unsigned int currentPacket = 0; for(const auto& packet : m_packets) { auto packetMetadataFileName = STATE_PACKET_METADATA_PREFIX + std::to_string(currentPacket); archive.InsertFile(new CMemoryStateFile(packetMetadataFileName.c_str(), &packet.metadata, sizeof(CGsPacketMetadata))); if(!packet.registerWrites.empty()) { auto packetRegisterWritesFileName = STATE_PACKET_REGISTERWRITES_PREFIX + std::to_string(currentPacket); archive.InsertFile(new CMemoryStateFile(packetRegisterWritesFileName.c_str(), packet.registerWrites.data(), packet.registerWrites.size() * sizeof(CGSHandler::RegisterWrite))); } if(!packet.imageData.empty()) { auto packetImageDataName = STATE_PACKET_IMAGEDATA_PREFIX + std::to_string(currentPacket); archive.InsertFile(new CMemoryStateFile(packetImageDataName.c_str(), packet.imageData.data(), packet.imageData.size())); } currentPacket++; } archive.Write(output); }
void CFrameDump::Write(Framework::CStream& output) const { Framework::CZipArchiveWriter archive; archive.InsertFile(new CMemoryStateFile(STATE_INITIAL_GSRAM, m_initialGsRam, CGSHandler::RAMSIZE)); archive.InsertFile(new CMemoryStateFile(STATE_INITIAL_GSREGS, m_initialGsRegisters, sizeof(uint64) * CGSHandler::REGISTER_MAX)); unsigned int currentPacket = 0; for(const auto& packet : m_packets) { std::string packetName = STATE_PACKET_PREFIX + std::to_string(currentPacket); std::string packetMetadataName = STATE_PACKET_METADATA_PREFIX + std::to_string(currentPacket); archive.InsertFile(new CMemoryStateFile(packetName.c_str(), packet.writes.data(), packet.writes.size() * sizeof(CGSHandler::RegisterWrite))); archive.InsertFile(new CMemoryStateFile(packetMetadataName.c_str(), &packet.metadata, sizeof(CGsPacketMetadata))); currentPacket++; } archive.Write(output); }