MCPcopy Create free account
hub / github.com/PCSX2/pcsx2 / Save

Method Save

pcsx2/SIO/Memcard/MemoryCardFile.cpp:440–508  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

438}
439
440s32 FileMemoryCard::Save(uint slot, const u8* src, u32 adr, int size)
441{
442 std::FILE* mcfp = m_file[slot];
443
444 if (!mcfp)
445 {
446 DevCon.Error("(FileMcd) Ignoring attempted save/write to disabled slot.");
447 return 1;
448 }
449
450 if (m_ispsx[slot])
451 {
452 if (static_cast<int>(m_currentdata.size()) < size)
453 m_currentdata.resize(size);
454 for (int i = 0; i < size; i++)
455 m_currentdata[i] = src[i];
456 }
457 else
458 {
459 if (!Seek(mcfp, adr))
460 return 0;
461 if (static_cast<int>(m_currentdata.size()) < size)
462 m_currentdata.resize(size);
463
464 const size_t read_result = std::fread(m_currentdata.data(), size, 1, mcfp);
465 if (read_result == 0)
466 Host::ReportErrorAsync("Memory Card Read Failed", "Error reading memory card.");
467
468 for (int i = 0; i < size; i++)
469 {
470 if ((m_currentdata[i] & src[i]) != src[i])
471 Console.Warning("(FileMcd) Warning: writing to uncleared data. (%d) [%08X]", slot, adr);
472 m_currentdata[i] &= src[i];
473 }
474
475 // Checksumness
476 {
477 if (adr == m_chkaddr)
478 Console.Warning("(FileMcd) Warning: checksum sector overwritten. (%d)", slot);
479
480 u64* pdata = (u64*)&m_currentdata[0];
481 u32 loops = size / 8;
482
483 for (u32 i = 0; i < loops; i++)
484 m_chksum[slot] ^= pdata[i];
485 }
486 }
487
488 if (!Seek(mcfp, adr))
489 return 0;
490
491 if (std::fwrite(m_currentdata.data(), size, 1, mcfp) == 1)
492 {
493 static auto last = std::chrono::time_point<std::chrono::system_clock>();
494
495 std::chrono::duration<float> elapsed = std::chrono::system_clock::now() - last;
496 if (elapsed > std::chrono::seconds(5))
497 {

Callers 5

AddBindingsMethod · 0.45
FileMcd_SaveFunction · 0.45
DoSaveInputProfileMethod · 0.45
RenderMethod · 0.45

Calls 6

formatFunction · 0.50
ErrorMethod · 0.45
sizeMethod · 0.45
resizeMethod · 0.45
dataMethod · 0.45
WarningMethod · 0.45

Tested by

no test coverage detected