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;
|
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)
|
bool CN64Disk::AllocateAndLoadDiskImage(const char * FileLoc)
|
||||||
{
|
{
|
||||||
WriteTrace(TraceN64System, TraceDebug, "Trying to open %s", FileLoc);
|
WriteTrace(TraceN64System, TraceDebug, "Trying to open %s", FileLoc);
|
||||||
|
@ -278,6 +297,11 @@ bool CN64Disk::AllocateAndLoadDiskImage(const char * FileLoc)
|
||||||
ByteSwapDisk();
|
ByteSwapDisk();
|
||||||
|
|
||||||
ProtectMemory(m_DiskImage, m_DiskFileSize, MEM_READWRITE);
|
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;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -330,6 +354,13 @@ void CN64Disk::UnallocateDiskImage()
|
||||||
{
|
{
|
||||||
m_DiskFile.Close();
|
m_DiskFile.Close();
|
||||||
|
|
||||||
|
if (m_DiskHeaderBase)
|
||||||
|
{
|
||||||
|
delete[] m_DiskHeaderBase;
|
||||||
|
m_DiskHeaderBase = NULL;
|
||||||
|
}
|
||||||
|
m_DiskHeader = NULL;
|
||||||
|
|
||||||
if (m_DiskImageBase)
|
if (m_DiskImageBase)
|
||||||
{
|
{
|
||||||
ProtectMemory(m_DiskImage, m_DiskFileSize, MEM_READWRITE);
|
ProtectMemory(m_DiskImage, m_DiskFileSize, MEM_READWRITE);
|
||||||
|
|
|
@ -27,7 +27,7 @@ public:
|
||||||
void ClearDiskSettingID();
|
void ClearDiskSettingID();
|
||||||
uint8_t * GetDiskAddress() { return m_DiskImage; }
|
uint8_t * GetDiskAddress() { return m_DiskImage; }
|
||||||
uint8_t * GetDiskAddressBuffer() { return m_DiskImage + m_DiskBufAddress; }
|
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; }
|
void SetDiskAddressBuffer(uint32_t address) { m_DiskBufAddress = address; }
|
||||||
stdstr GetRomName() const { return m_RomName; }
|
stdstr GetRomName() const { return m_RomName; }
|
||||||
stdstr GetFileName() const { return m_FileName; }
|
stdstr GetFileName() const { return m_FileName; }
|
||||||
|
@ -39,6 +39,7 @@ public:
|
||||||
|
|
||||||
private:
|
private:
|
||||||
bool AllocateDiskImage(uint32_t DiskFileSize);
|
bool AllocateDiskImage(uint32_t DiskFileSize);
|
||||||
|
bool AllocateDiskHeader();
|
||||||
bool AllocateAndLoadDiskImage(const char * FileLoc);
|
bool AllocateAndLoadDiskImage(const char * FileLoc);
|
||||||
void ByteSwapDisk();
|
void ByteSwapDisk();
|
||||||
void ForceByteSwapDisk();
|
void ForceByteSwapDisk();
|
||||||
|
@ -54,6 +55,8 @@ private:
|
||||||
CFile m_DiskFile;
|
CFile m_DiskFile;
|
||||||
uint8_t * m_DiskImage;
|
uint8_t * m_DiskImage;
|
||||||
uint8_t * m_DiskImageBase;
|
uint8_t * m_DiskImageBase;
|
||||||
|
uint8_t * m_DiskHeader;
|
||||||
|
uint8_t * m_DiskHeaderBase;
|
||||||
uint32_t m_DiskFileSize;
|
uint32_t m_DiskFileSize;
|
||||||
uint32_t m_DiskBufAddress;
|
uint32_t m_DiskBufAddress;
|
||||||
LanguageStringID m_ErrorMsg;
|
LanguageStringID m_ErrorMsg;
|
||||||
|
|
Loading…
Reference in New Issue