Change up the way Mempaks are meant to work, use the standard file functions. Mempaks are now loaded in when the game launches, and file handles are only opened durring read and writes

This commit is contained in:
Emmet Young 2016-01-28 14:02:05 +11:00
parent 72e6928ea8
commit 643a684c77
3 changed files with 164 additions and 194 deletions

View File

@ -13,8 +13,9 @@
class Mempak class Mempak
{ {
public: public:
static void Close();
static uint8_t CalculateCrc(uint8_t * DataToCrc); static uint8_t CalculateCrc(uint8_t * DataToCrc);
static void Load();
static void Format(int32_t Control);
static void ReadFrom(int32_t Control, uint8_t * command); static void ReadFrom(int32_t Control, uint8_t * command);
static void WriteTo(int32_t Control, uint8_t * command); static void WriteTo(int32_t Control, uint8_t * command);
}; };

View File

@ -11,90 +11,68 @@
#include "stdafx.h" #include "stdafx.h"
#include "Mempak.H" #include "Mempak.H"
#include <Common/path.h> #include <Common/path.h>
#include <Windows.h>
static uint8_t Mempaks[4][0x8000]; uint8_t Mempaks[4][0x8000];
void * hMempakFile[4]; CPath MempakNames[4];
void Mempak::Close() void Mempak::Load()
{ {
for (int32_t i = 0; i < 4; i++) stdstr MempakName;
for (int i = 0; i < 3; i++)
{ {
if (hMempakFile[i]) MempakName.Format("%s_Cont_%d", g_Settings->LoadStringVal(Game_GameName).c_str(), i + 1);
MempakNames[i].SetDriveDirectory(g_Settings->LoadStringVal(Directory_NativeSave).c_str());
MempakNames[i].SetName(MempakName.c_str());
MempakNames[i].SetExtension("mpk");
if (!MempakNames[i].DirectoryExists())
{ {
CloseHandle(hMempakFile[i]); MempakNames[i].DirectoryCreate();
hMempakFile[i] = NULL; }
if (MempakNames[i].Exists())
{
FILE *mempak = fopen(MempakNames[i], "rb");
fread(Mempaks[i], 1, 0x8000, mempak);
fclose(mempak);
}
else
{
Mempak::Format(i);
} }
} }
} }
void LoadMempak(int32_t Control) void Mempak::Format(int32_t Control)
{ {
CPath FileName; uint8_t Initialize[] = {
DWORD dwRead; 0x81, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0C, 0x0D, 0x0E, 0x0F,
stdstr MempakName; 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1A, 0x1B, 0x1C, 0x1D, 0x1E, 0x1F,
bool bFormatMempak = false; 0xFF, 0xFF, 0xFF, 0xFF, 0x05, 0x1A, 0x5F, 0x13, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x01, 0xFF, 0x66, 0x25, 0x99, 0xCD,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0xFF, 0xFF, 0xFF, 0xFF, 0x05, 0x1A, 0x5F, 0x13, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x01, 0xFF, 0x66, 0x25, 0x99, 0xCD,
0xFF, 0xFF, 0xFF, 0xFF, 0x05, 0x1A, 0x5F, 0x13, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x01, 0xFF, 0x66, 0x25, 0x99, 0xCD,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0xFF, 0xFF, 0xFF, 0xFF, 0x05, 0x1A, 0x5F, 0x13, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x01, 0xFF, 0x66, 0x25, 0x99, 0xCD,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x71, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03,
};
MempakName.Format("%s_Cont_%d", g_Settings->LoadStringVal(Game_GameName).c_str(), Control + 1); memcpy(&Mempaks[Control][0], Initialize, 0x110);
FileName.SetDriveDirectory(g_Settings->LoadStringVal(Directory_NativeSave).c_str()); for (int32_t count = 0x110; count < 0x8000; count += 2)
FileName.SetName(MempakName.c_str());
FileName.SetExtension("mpk");
if (!FileName.Exists())
{ {
bFormatMempak = true; Mempaks[Control][count] = 0x00;
Mempaks[Control][count + 1] = 0x03;
if (!FileName.DirectoryExists())
{
FileName.DirectoryCreate();
}
uint8_t Initialize[] = {
0x81, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0C, 0x0D, 0x0E, 0x0F,
0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1A, 0x1B, 0x1C, 0x1D, 0x1E, 0x1F,
0xFF, 0xFF, 0xFF, 0xFF, 0x05, 0x1A, 0x5F, 0x13, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x01, 0xFF, 0x66, 0x25, 0x99, 0xCD,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0xFF, 0xFF, 0xFF, 0xFF, 0x05, 0x1A, 0x5F, 0x13, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x01, 0xFF, 0x66, 0x25, 0x99, 0xCD,
0xFF, 0xFF, 0xFF, 0xFF, 0x05, 0x1A, 0x5F, 0x13, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x01, 0xFF, 0x66, 0x25, 0x99, 0xCD,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0xFF, 0xFF, 0xFF, 0xFF, 0x05, 0x1A, 0x5F, 0x13, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x01, 0xFF, 0x66, 0x25, 0x99, 0xCD,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x71, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03,
};
memcpy(&Mempaks[Control][0], Initialize, 0x110);
for (int32_t count = 0x110; count < 0x8000; count += 2)
{
Mempaks[Control][count] = 0x00;
Mempaks[Control][count + 1] = 0x03;
}
}
hMempakFile[Control] = CreateFile(FileName, GENERIC_WRITE | GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL | FILE_FLAG_RANDOM_ACCESS, NULL);
if (hMempakFile[Control] == INVALID_HANDLE_VALUE)
{
WriteTrace(TraceN64System, TraceError, "Failed to open (%s), lastError = %X", (LPCTSTR)FileName, GetLastError());
return;
}
SetFilePointer(hMempakFile[Control], 0, NULL, FILE_BEGIN);
if (bFormatMempak)
{
WriteFile(hMempakFile[Control], Mempaks[Control], 0x8000, &dwRead, NULL);
}
else
{
ReadFile(hMempakFile[Control], Mempaks[Control], 0x8000, &dwRead, NULL);
} }
} }
@ -137,10 +115,6 @@ void Mempak::ReadFrom(int32_t Control, uint8_t * command)
if (address < 0x8000) if (address < 0x8000)
{ {
if (hMempakFile[Control] == NULL)
{
LoadMempak(Control);
}
memcpy(&command[5], &Mempaks[Control][address], 0x20); memcpy(&command[5], &Mempaks[Control][address], 0x20);
} }
else else
@ -152,19 +126,15 @@ void Mempak::ReadFrom(int32_t Control, uint8_t * command)
void Mempak::WriteTo(int32_t Control, uint8_t * command) void Mempak::WriteTo(int32_t Control, uint8_t * command)
{ {
DWORD dwWritten;
uint32_t address = (command[3] << 8) | (command[4] & 0xE0); uint32_t address = (command[3] << 8) | (command[4] & 0xE0);
if (address < 0x8000) if (address < 0x8000)
{ {
if (hMempakFile[Control] == NULL)
{
LoadMempak(Control);
}
memcpy(&Mempaks[Control][address], &command[5], 0x20); memcpy(&Mempaks[Control][address], &command[5], 0x20);
SetFilePointer(hMempakFile[Control], 0, NULL, FILE_BEGIN); FILE* mempak = fopen(MempakNames[Control], "wb");
WriteFile(hMempakFile[Control], &Mempaks[Control][0], 0x8000, &dwWritten, NULL); fwrite(Mempaks[Control], 1, 0x8000, mempak);
fclose(mempak);
} }
else else
{ {

View File

@ -65,12 +65,12 @@ m_CheatsSlectionChanged(false)
m_Limiter.SetHertz(gameHertz); m_Limiter.SetHertz(gameHertz);
g_Settings->SaveDword(GameRunning_ScreenHertz, gameHertz); g_Settings->SaveDword(GameRunning_ScreenHertz, gameHertz);
m_Cheats.LoadCheats(!g_Settings->LoadDword(Setting_RememberCheats), Plugins); m_Cheats.LoadCheats(!g_Settings->LoadDword(Setting_RememberCheats), Plugins);
Mempak::Load();
} }
CN64System::~CN64System() CN64System::~CN64System()
{ {
SetActiveSystem(false); SetActiveSystem(false);
Mempak::Close();
if (m_SyncCPU) if (m_SyncCPU)
{ {
m_SyncCPU->CpuStopped(); m_SyncCPU->CpuStopped();
@ -552,7 +552,6 @@ void CN64System::Reset(bool bInitReg, bool ClearMenory)
RefreshGameSettings(); RefreshGameSettings();
m_Audio.Reset(); m_Audio.Reset();
m_MMU_VM.Reset(ClearMenory); m_MMU_VM.Reset(ClearMenory);
Mempak::Close();
m_CyclesToSkip = 0; m_CyclesToSkip = 0;
m_AlistCount = 0; m_AlistCount = 0;