diff --git a/Source/Project64-core/N64System/N64DiskClass.cpp b/Source/Project64-core/N64System/N64DiskClass.cpp index 7a8a2c863..90687eeff 100644 --- a/Source/Project64-core/N64System/N64DiskClass.cpp +++ b/Source/Project64-core/N64System/N64DiskClass.cpp @@ -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 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); diff --git a/Source/Project64-core/N64System/N64DiskClass.h b/Source/Project64-core/N64System/N64DiskClass.h index 2d4bc92d9..65ecb9144 100644 --- a/Source/Project64-core/N64System/N64DiskClass.h +++ b/Source/Project64-core/N64System/N64DiskClass.h @@ -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;