[Project64] Only create mempak on write

This commit is contained in:
zilmar 2017-01-21 10:11:14 +11:00
parent ffbe446c79
commit 1d7bdd2c27
2 changed files with 50 additions and 12 deletions

View File

@ -13,14 +13,21 @@
class CMempak class CMempak
{ {
public: public:
static uint8_t CalculateCrc(uint8_t * DataToCrc); CMempak();
void ReadFrom(int32_t Control, uint32_t address, uint8_t * data); void ReadFrom(int32_t Control, uint32_t address, uint8_t * data);
void WriteTo(int32_t Control, uint32_t address, uint8_t * data); void WriteTo(int32_t Control, uint32_t address, uint8_t * data);
static uint8_t CalculateCrc(uint8_t * DataToCrc);
private: private:
void LoadMempak(int32_t Control); CMempak(const CMempak&); // Disable copy constructor
CMempak& operator=(const CMempak&); // Disable assignment
void LoadMempak(int32_t Control, bool Create);
void Format(int32_t Control); void Format(int32_t Control);
uint8_t m_Mempaks[4][128 * 256]; /* [CONTROLLERS][PAGES][BYTES_PER_PAGE] */ uint8_t m_Mempaks[4][128 * 256]; /* [CONTROLLERS][PAGES][BYTES_PER_PAGE] */
CFile m_MempakHandle[4]; CFile m_MempakHandle[4];
bool m_Formatted[4];
}; };

View File

@ -14,7 +14,16 @@
#include <stdio.h> #include <stdio.h>
#include <Common/path.h> #include <Common/path.h>
void CMempak::LoadMempak(int32_t Control) CMempak::CMempak()
{
for (uint32_t i = 0; i < sizeof(m_Formatted) / sizeof(m_Formatted[0]); i++)
{
m_Formatted[i] = 0;
}
memset(m_Mempaks, 0, sizeof(m_Mempaks));
}
void CMempak::LoadMempak(int32_t Control, bool Create)
{ {
stdstr MempakName; stdstr MempakName;
MempakName.Format("%s_Cont_%d", g_Settings->LoadStringVal(Game_GameName).c_str(), Control + 1); MempakName.Format("%s_Cont_%d", g_Settings->LoadStringVal(Game_GameName).c_str(), Control + 1);
@ -24,6 +33,17 @@ void CMempak::LoadMempak(int32_t Control)
{ {
MempakPath.AppendDirectory(g_Settings->LoadStringVal(Game_UniqueSaveDir).c_str()); MempakPath.AppendDirectory(g_Settings->LoadStringVal(Game_UniqueSaveDir).c_str());
} }
if (!Create && !MempakPath.Exists())
{
if (!m_Formatted[Control])
{
CMempak::Format(Control);
m_Formatted[Control] = true;
}
return;
}
if (!MempakPath.DirectoryExists()) if (!MempakPath.DirectoryExists())
{ {
MempakPath.DirectoryCreate(); MempakPath.DirectoryCreate();
@ -35,8 +55,12 @@ void CMempak::LoadMempak(int32_t Control)
m_MempakHandle[Control].SeekToBegin(); m_MempakHandle[Control].SeekToBegin();
if (formatMempak) if (formatMempak)
{
if (!m_Formatted[Control])
{ {
CMempak::Format(Control); CMempak::Format(Control);
m_Formatted[Control] = true;
}
m_MempakHandle[Control].Write(m_Mempaks[Control], 0x8000); m_MempakHandle[Control].Write(m_Mempaks[Control], 0x8000);
} }
else else
@ -113,9 +137,9 @@ void CMempak::ReadFrom(int32_t Control, uint32_t address, uint8_t * data)
{ {
if (address < 0x8000) if (address < 0x8000)
{ {
if (!m_MempakHandle[Control].IsOpen()) if (!m_Formatted[Control] && !m_MempakHandle[Control].IsOpen())
{ {
LoadMempak(Control); LoadMempak(Control, false);
} }
memcpy(data, &m_Mempaks[Control][address], 0x20); memcpy(data, &m_Mempaks[Control][address], 0x20);
@ -130,17 +154,24 @@ void CMempak::ReadFrom(int32_t Control, uint32_t address, uint8_t * data)
void CMempak::WriteTo(int32_t Control, uint32_t address, uint8_t * data) void CMempak::WriteTo(int32_t Control, uint32_t address, uint8_t * data)
{ {
if (address < 0x8000) if (address < 0x8000)
{
if (!m_Formatted[Control])
{
CMempak::Format(Control);
m_Formatted[Control] = true;
}
if (memcmp(&m_Mempaks[Control][address], data, 0x20) != 0)
{ {
if (!m_MempakHandle[Control].IsOpen()) if (!m_MempakHandle[Control].IsOpen())
{ {
LoadMempak(Control); LoadMempak(Control, true);
} }
memcpy(&m_Mempaks[Control][address], data, 0x20); memcpy(&m_Mempaks[Control][address], data, 0x20);
m_MempakHandle[Control].Seek(address, CFile::begin); m_MempakHandle[Control].Seek(address, CFile::begin);
m_MempakHandle[Control].Write(data, 0x20); m_MempakHandle[Control].Write(data, 0x20);
} }
}
else else
{ {
/* Rumble pack area */ /* Rumble pack area */