s32 FileMemoryCard::Save( uint slot, const u8 *src, u32 adr, int size ) { wxFFile& mcfp( m_file[slot] ); if( !mcfp.IsOpened() ) { DevCon.Error( "(FileMcd) Ignoring attempted save/write to disabled slot." ); return 1; } if(m_ispsx[slot]) { m_currentdata.MakeRoomFor( size ); for (int i=0; i<size; i++) m_currentdata[i] = src[i]; } else { if( !Seek(mcfp, adr) ) return 0; m_currentdata.MakeRoomFor( size ); mcfp.Read( m_currentdata.GetPtr(), size); for (int i=0; i<size; i++) { if ((m_currentdata[i] & src[i]) != src[i]) Console.Warning("(FileMcd) Warning: writing to uncleared data. (%d) [%08X]", slot, adr); m_currentdata[i] &= src[i]; } // Checksumness { if(adr == m_chkaddr) Console.Warning("(FileMcd) Warning: checksum sector overwritten. (%d)", slot); u64 *pdata = (u64*)&m_currentdata[0]; u32 loops = size / 8; for(u32 i = 0; i < loops; i++) m_chksum[slot] ^= pdata[i]; } } if( !Seek(mcfp, adr) ) return 0; return mcfp.Write( m_currentdata.GetPtr(), size ) != 0; }
memSavingState::memSavingState( SafeArray<u8>& save_to ) : memBaseStateInfo( save_to, _("Saving state to: ") ) { save_to.ChunkSize = ReallocThreshold; save_to.MakeRoomFor( MemoryBaseAllocSize ); }
s32 FileMemoryCard::Save( uint slot, const u8 *src, u32 adr, int size ) { wxFFile& mcfp( m_file[slot] ); if( !mcfp.IsOpened() ) { DevCon.Error( "(FileMcd) Ignoring attempted save/write to disabled slot." ); return 1; } if(m_ispsx[slot]) { m_currentdata.MakeRoomFor( size ); for (int i=0; i<size; i++) m_currentdata[i] = src[i]; } else { if( !Seek(mcfp, adr) ) return 0; m_currentdata.MakeRoomFor( size ); mcfp.Read( m_currentdata.GetPtr(), size); for (int i=0; i<size; i++) { if ((m_currentdata[i] & src[i]) != src[i]) Console.Warning("(FileMcd) Warning: writing to uncleared data. (%d) [%08X]", slot, adr); m_currentdata[i] &= src[i]; } // Checksumness { if(adr == m_chkaddr) Console.Warning("(FileMcd) Warning: checksum sector overwritten. (%d)", slot); u64 *pdata = (u64*)&m_currentdata[0]; u32 loops = size / 8; for(u32 i = 0; i < loops; i++) m_chksum[slot] ^= pdata[i]; } } if( !Seek(mcfp, adr) ) return 0; int status = mcfp.Write( m_currentdata.GetPtr(), size ); if( status ) { static auto last = std::chrono::time_point<std::chrono::system_clock>(); std::chrono::duration<float> elapsed = std::chrono::system_clock::now() - last; if(elapsed > std::chrono::seconds(5)) { wxString name, ext; wxFileName::SplitPath(m_file[slot].GetName(), NULL, NULL, &name, &ext); OSDlog( Color_StrongYellow, false, "Memory Card %s written.", (const char *)(name + "." + ext).c_str() ); last = std::chrono::system_clock::now(); } return 1; } return 0; }