[Project64] Only create mempak on write
This commit is contained in:
parent
ffbe446c79
commit
1d7bdd2c27
|
@ -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];
|
||||||
};
|
};
|
|
@ -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 */
|
||||||
|
|
Loading…
Reference in New Issue