summaryrefslogtreecommitdiff
path: root/Source/Core/DiscIO/Src/VolumeDirectory.cpp
diff options
context:
space:
mode:
authorPierre Bourdon <delroth@gmail.com>2012-05-16 09:27:37 +0200
committerPierre Bourdon <delroth@gmail.com>2012-05-16 09:27:37 +0200
commitfdff4cb1ffa76e894dd41ca5f97d31f122fd3f86 (patch)
tree20059e8c98923d27f235c9f12de31be97e20240f /Source/Core/DiscIO/Src/VolumeDirectory.cpp
parent2b77acc705eae11fdb4a25be6d6ea5db1fa52e21 (diff)
parent5a8ad9230271a5088b0cf582932959214c6b5527 (diff)
Merge branch 'master' into wii-network
Conflicts: Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE.cpp Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_FileIO.cpp Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_es.cpp Source/VSProps/Dolphin.Win32.props Source/VSProps/Dolphin.x64.props
Diffstat (limited to 'Source/Core/DiscIO/Src/VolumeDirectory.cpp')
-rw-r--r--Source/Core/DiscIO/Src/VolumeDirectory.cpp30
1 files changed, 13 insertions, 17 deletions
diff --git a/Source/Core/DiscIO/Src/VolumeDirectory.cpp b/Source/Core/DiscIO/Src/VolumeDirectory.cpp
index 08188bac71..dc76e2e641 100644
--- a/Source/Core/DiscIO/Src/VolumeDirectory.cpp
+++ b/Source/Core/DiscIO/Src/VolumeDirectory.cpp
@@ -16,6 +16,7 @@
// http://code.google.com/p/dolphin-emu/
#include "Common.h"
+#include "MathUtil.h"
#include "CommonPaths.h"
#include "VolumeDirectory.h"
#include "FileBlob.h"
@@ -23,17 +24,6 @@
namespace DiscIO
{
-static const u8 ENTRY_SIZE = 0x0c;
-static const u8 FILE_ENTRY = 0;
-static const u8 DIRECTORY_ENTRY = 1;
-static const u64 DISKHEADER_ADDRESS = 0;
-static const u64 DISKHEADERINFO_ADDRESS = 0x440;
-static const u64 APPLOADER_ADDRESS = 0x2440;
-static const u32 MAX_NAME_LENGTH = 0x3df;
-// relocatable
-static u64 FST_ADDRESS = 0x440;
-static u64 DOL_ADDRESS = 0;
-
CVolumeDirectory::CVolumeDirectory(const std::string& _rDirectory, bool _bIsWii,
const std::string& _rApploader, const std::string& _rDOL)
: m_totalNameSize(0)
@@ -44,6 +34,8 @@ CVolumeDirectory::CVolumeDirectory(const std::string& _rDirectory, bool _bIsWii,
, m_apploader(NULL)
, m_DOLSize(0)
, m_DOL(NULL)
+ , FST_ADDRESS(0)
+ , DOL_ADDRESS(0)
{
m_rootDirectory = ExtractDirectoryName(_rDirectory);
@@ -321,7 +313,7 @@ bool CVolumeDirectory::SetApploader(const std::string& _rApploader)
copy(data.begin(), data.end(), m_apploader);
// 32byte aligned (plus 0x20 padding)
- DOL_ADDRESS = (APPLOADER_ADDRESS + m_apploaderSize + 0x20 + 31) & ~31ULL;
+ DOL_ADDRESS = ROUND_UP(APPLOADER_ADDRESS + m_apploaderSize + 0x20, 0x20ull);
return true;
}
else
@@ -347,7 +339,7 @@ void CVolumeDirectory::SetDOL(const std::string& _rDOL)
Write32((u32)(DOL_ADDRESS >> m_addressShift), 0x0420, m_diskHeader);
// 32byte aligned (plus 0x20 padding)
- FST_ADDRESS = (DOL_ADDRESS + m_DOLSize + 0x20 + 31) & ~31ULL;
+ FST_ADDRESS = ROUND_UP(DOL_ADDRESS + m_DOLSize + 0x20, 0x20ull);
}
}
@@ -367,8 +359,12 @@ void CVolumeDirectory::BuildFST()
m_fstSize = m_fstNameOffset + m_totalNameSize;
m_FSTData = new u8[(u32)m_fstSize];
+ // if FST hasn't been assigned (ie no apploader/dol setup), set to default
+ if (FST_ADDRESS == 0)
+ FST_ADDRESS = APPLOADER_ADDRESS + 0x2000;
+
// 4 byte aligned start of data on disk
- m_dataStartAddress = (FST_ADDRESS + m_fstSize + 3) & ~3;
+ m_dataStartAddress = ROUND_UP(FST_ADDRESS + m_fstSize, 0x8000ull);
u64 curDataAddress = m_dataStartAddress;
u32 fstOffset = 0; // offset within FST data
@@ -389,8 +385,8 @@ void CVolumeDirectory::BuildFST()
// write FST size and location
_dbg_assert_(DVDINTERFACE, m_diskHeader);
Write32((u32)(FST_ADDRESS >> m_addressShift), 0x0424, m_diskHeader);
- Write32((u32)m_fstSize, 0x0428, m_diskHeader);
- Write32((u32)m_fstSize, 0x042c, m_diskHeader);
+ Write32((u32)(m_fstSize >> m_addressShift), 0x0428, m_diskHeader);
+ Write32((u32)(m_fstSize >> m_addressShift), 0x042c, m_diskHeader);
}
void CVolumeDirectory::WriteToBuffer(u64 _SrcStartAddress, u64 _SrcLength, u8* _Src,
@@ -490,7 +486,7 @@ void CVolumeDirectory::WriteEntry(const File::FSTEntry& entry, u32& fstOffset, u
m_virtualDisk.insert(make_pair(dataOffset, entry.physicalName));
// 4 byte aligned
- dataOffset = (dataOffset + entry.size + 3) & ~3ULL;
+ dataOffset = ROUND_UP(dataOffset + entry.size, 0x8000ull);
}
}