Forge 64DD Disk Header for plugins
(For some reason, no idea how common that gets, but CMainGui::ProcessAllMessages can crash the entire emulator with some kind of access violation error...)
This commit is contained in:
parent
f312476b8b
commit
0233d848c2
|
@ -178,6 +178,25 @@ bool CN64Disk::AllocateDiskImage(uint32_t DiskFileSize)
|
|||
return true;
|
||||
}
|
||||
|
||||
bool CN64Disk::AllocateDiskHeader()
|
||||
{
|
||||
WriteTrace(TraceN64System, TraceDebug, "Allocating memory for disk header forge");
|
||||
AUTO_PTR<uint8_t> HeaderBase(new uint8_t[0x40 + 0x1000]);
|
||||
if (HeaderBase.get() == NULL)
|
||||
{
|
||||
SetError(MSG_MEM_ALLOC_ERROR);
|
||||
WriteTrace(TraceN64System, TraceError, "Failed to allocate memory for disk header forge (size: 0x40)");
|
||||
return false;
|
||||
}
|
||||
uint8_t * Header = (uint8_t *)(((uint64_t)HeaderBase.get() + 0xFFF) & ~0xFFF); // start at begining of memory page
|
||||
WriteTrace(TraceN64System, TraceDebug, "Allocated disk memory (%p)", Header);
|
||||
|
||||
//save information about the disk loaded
|
||||
m_DiskHeaderBase = HeaderBase.release();
|
||||
m_DiskHeader = Header;
|
||||
return true;
|
||||
}
|
||||
|
||||
bool CN64Disk::AllocateAndLoadDiskImage(const char * FileLoc)
|
||||
{
|
||||
WriteTrace(TraceN64System, TraceDebug, "Trying to open %s", FileLoc);
|
||||
|
@ -278,6 +297,11 @@ bool CN64Disk::AllocateAndLoadDiskImage(const char * FileLoc)
|
|||
ByteSwapDisk();
|
||||
|
||||
ProtectMemory(m_DiskImage, m_DiskFileSize, MEM_READWRITE);
|
||||
|
||||
AllocateDiskHeader();
|
||||
memcpy_s(m_DiskHeader, 0x20, m_DiskImage, 0x20);
|
||||
memcpy_s(m_DiskHeader + 0x20, 0x20, m_DiskImage + 0x43670, 0x20);
|
||||
memcpy_s(m_DiskHeader + 0x3B, 5, m_DiskImage + 0x43670, 5);
|
||||
return true;
|
||||
}
|
||||
|
||||
|
@ -330,6 +354,13 @@ void CN64Disk::UnallocateDiskImage()
|
|||
{
|
||||
m_DiskFile.Close();
|
||||
|
||||
if (m_DiskHeaderBase)
|
||||
{
|
||||
delete[] m_DiskHeaderBase;
|
||||
m_DiskHeaderBase = NULL;
|
||||
}
|
||||
m_DiskHeader = NULL;
|
||||
|
||||
if (m_DiskImageBase)
|
||||
{
|
||||
ProtectMemory(m_DiskImage, m_DiskFileSize, MEM_READWRITE);
|
||||
|
|
|
@ -27,7 +27,7 @@ public:
|
|||
void ClearDiskSettingID();
|
||||
uint8_t * GetDiskAddress() { return m_DiskImage; }
|
||||
uint8_t * GetDiskAddressBuffer() { return m_DiskImage + m_DiskBufAddress; }
|
||||
uint8_t * GetDiskHeader() { return m_DiskImage + 0x43650; }
|
||||
uint8_t * GetDiskHeader() { return m_DiskHeader; }
|
||||
void SetDiskAddressBuffer(uint32_t address) { m_DiskBufAddress = address; }
|
||||
stdstr GetRomName() const { return m_RomName; }
|
||||
stdstr GetFileName() const { return m_FileName; }
|
||||
|
@ -39,6 +39,7 @@ public:
|
|||
|
||||
private:
|
||||
bool AllocateDiskImage(uint32_t DiskFileSize);
|
||||
bool AllocateDiskHeader();
|
||||
bool AllocateAndLoadDiskImage(const char * FileLoc);
|
||||
void ByteSwapDisk();
|
||||
void ForceByteSwapDisk();
|
||||
|
@ -54,6 +55,8 @@ private:
|
|||
CFile m_DiskFile;
|
||||
uint8_t * m_DiskImage;
|
||||
uint8_t * m_DiskImageBase;
|
||||
uint8_t * m_DiskHeader;
|
||||
uint8_t * m_DiskHeaderBase;
|
||||
uint32_t m_DiskFileSize;
|
||||
uint32_t m_DiskBufAddress;
|
||||
LanguageStringID m_ErrorMsg;
|
||||
|
|
Loading…
Reference in New Issue