summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAnghelo Carvajal <angheloalf95@gmail.com>2021-12-26 19:24:12 -0300
committerGitHub <noreply@github.com>2021-12-26 17:24:12 -0500
commit155a463a54a3bc9b9c86000ae6d819455875ec15 (patch)
tree22e9b3545e0051dac9162d901ae49cb87d1ba647
parent431c1bc46c64712a42a22893dc28e9503fe3934a (diff)
Fix padding generation for double word aligned variables (#223)
* Don't produce a symbol for 8byte aligned symbols * Change Vtx alignment to 8 * Remove Align16 * handle unaccounteds properly when stuff has Align8 alignment * format * Fix warning * typo
-rw-r--r--ZAPD/Declaration.h3
-rw-r--r--ZAPD/ZAnimation.cpp6
-rw-r--r--ZAPD/ZDisplayList.cpp2
-rw-r--r--ZAPD/ZFile.cpp71
-rw-r--r--ZAPD/ZFile.h2
-rw-r--r--ZAPD/ZSkeleton.cpp2
-rw-r--r--ZAPD/ZVtx.cpp2
7 files changed, 36 insertions, 52 deletions
diff --git a/ZAPD/Declaration.h b/ZAPD/Declaration.h
index b7bb0d3..4a743b5 100644
--- a/ZAPD/Declaration.h
+++ b/ZAPD/Declaration.h
@@ -12,8 +12,7 @@ typedef uint32_t offset_t;
enum class DeclarationAlignment
{
Align4,
- Align8,
- Align16
+ Align8
};
enum class StaticConfig
diff --git a/ZAPD/ZAnimation.cpp b/ZAPD/ZAnimation.cpp
index adb0ae7..4d9266b 100644
--- a/ZAPD/ZAnimation.cpp
+++ b/ZAPD/ZAnimation.cpp
@@ -104,7 +104,7 @@ void ZNormalAnimation::DeclareReferences(const std::string& prefix)
valuesStr += "\n ";
}
- parent->AddDeclarationArray(rotationValuesOffset, DeclarationAlignment::Align16,
+ parent->AddDeclarationArray(rotationValuesOffset, DeclarationAlignment::Align4,
rotationValues.size() * 2, "s16",
StringHelper::Sprintf("%sFrameData", defaultPrefix.c_str()),
rotationValues.size(), valuesStr);
@@ -118,7 +118,7 @@ void ZNormalAnimation::DeclareReferences(const std::string& prefix)
indicesStr += "\n";
}
- parent->AddDeclarationArray(rotationIndicesOffset, DeclarationAlignment::Align16,
+ parent->AddDeclarationArray(rotationIndicesOffset, DeclarationAlignment::Align4,
rotationIndices.size() * 6, "JointIndex",
StringHelper::Sprintf("%sJointIndices", defaultPrefix.c_str()),
rotationIndices.size(), indicesStr);
@@ -385,7 +385,7 @@ size_t ZCurveAnimation::GetRawDataSize() const
DeclarationAlignment ZCurveAnimation::GetDeclarationAlignment() const
{
- return DeclarationAlignment::Align16;
+ return DeclarationAlignment::Align4;
}
std::string ZCurveAnimation::GetSourceTypeName() const
diff --git a/ZAPD/ZDisplayList.cpp b/ZAPD/ZDisplayList.cpp
index ad88613..5e9b1b2 100644
--- a/ZAPD/ZDisplayList.cpp
+++ b/ZAPD/ZDisplayList.cpp
@@ -850,7 +850,7 @@ void ZDisplayList::Opcode_G_VTX(uint64_t data, char* line)
{
segptr_t segmented = data & 0xFFFFFFFF;
references.push_back(segmented);
- parent->AddDeclaration(segmented, DeclarationAlignment::Align16, 16, "Vtx",
+ parent->AddDeclaration(segmented, DeclarationAlignment::Align8, 16, "Vtx",
StringHelper::Sprintf("0x%08X", segmented), "");
return;
}
diff --git a/ZAPD/ZFile.cpp b/ZAPD/ZFile.cpp
index f1d50a8..f7f3f69 100644
--- a/ZAPD/ZFile.cpp
+++ b/ZAPD/ZFile.cpp
@@ -8,6 +8,7 @@
#include "Globals.h"
#include "OutputFormatter.h"
#include "Utils/BinaryWriter.h"
+#include "Utils/BitConverter.h"
#include "Utils/Directory.h"
#include "Utils/File.h"
#include "Utils/MemoryStream.h"
@@ -949,9 +950,6 @@ std::string ZFile::ProcessDeclarations()
defines += ProcessTextureIntersections(name);
- // Account for padding/alignment
- uint32_t lastAddr = 0;
-
// printf("RANGE START: 0x%06X - RANGE END: 0x%06X\n", rangeStart, rangeEnd);
// Optimization: See if there are any arrays side by side that can be merged...
@@ -1002,43 +1000,6 @@ std::string ZFile::ProcessDeclarations()
{
while (item.second->size % 4 != 0)
item.second->size++;
-
- if (lastAddr != 0)
- {
- if (item.second->alignment == DeclarationAlignment::Align16)
- {
- int32_t curPtr = lastAddr + declarations[lastAddr]->size;
-
- while (curPtr % 4 != 0)
- {
- declarations[lastAddr]->size++;
- curPtr++;
- }
- }
- else if (item.second->alignment == DeclarationAlignment::Align8)
- {
- size_t curPtr = lastAddr + declarations[lastAddr]->size;
-
- while (curPtr % 4 != 0)
- {
- declarations[lastAddr]->size++;
- curPtr++;
- }
-
- while (curPtr % 8 != 0)
- {
- char buffer[2048];
-
- sprintf(buffer, "u32 %s_align%02zX = 0;\n", name.c_str(), curPtr);
- item.second->preText = buffer + item.second->preText;
-
- declarations[lastAddr]->size += 4;
- curPtr += 4;
- }
- }
- }
-
- lastAddr = item.first;
}
HandleUnaccountedData();
@@ -1199,14 +1160,15 @@ void ZFile::HandleUnaccountedData()
{
uint32_t lastAddr = 0;
uint32_t lastSize = 0;
- std::vector<uint32_t> declsAddresses;
+ std::vector<offset_t> declsAddresses;
+
for (const auto& item : declarations)
{
declsAddresses.push_back(item.first);
}
bool breakLoop = false;
- for (uint32_t currentAddress : declsAddresses)
+ for (offset_t currentAddress : declsAddresses)
{
if (currentAddress >= rangeEnd)
{
@@ -1235,7 +1197,7 @@ void ZFile::HandleUnaccountedData()
}
}
-bool ZFile::HandleUnaccountedAddress(uint32_t currentAddress, uint32_t lastAddr, uint32_t& lastSize)
+bool ZFile::HandleUnaccountedAddress(offset_t currentAddress, offset_t lastAddr, uint32_t& lastSize)
{
if (currentAddress != lastAddr && declarations.find(lastAddr) != declarations.end())
{
@@ -1275,6 +1237,29 @@ bool ZFile::HandleUnaccountedAddress(uint32_t currentAddress, uint32_t lastAddr,
xmlFilePath.c_str(), currentAddress, name.c_str(), rawData.size()));
}
+ // Handle Align8
+ if (currentAddress % 8 == 0 && diff % 8 != 0)
+ {
+ Declaration* currentDecl = GetDeclaration(currentAddress);
+
+ if (currentDecl != nullptr)
+ {
+ if (currentDecl->alignment == DeclarationAlignment::Align8)
+ {
+ // Check removed bytes are zeroes
+ if (BitConverter::ToUInt32BE(rawData, unaccountedAddress + diff - 4) == 0)
+ {
+ diff -= 4;
+ }
+ }
+
+ if (diff == 0)
+ {
+ return false;
+ }
+ }
+ }
+
for (int i = 0; i < diff; i++)
{
uint8_t val = rawData.at(unaccountedAddress + i);
diff --git a/ZAPD/ZFile.h b/ZAPD/ZFile.h
index 7918d5f..ac4062d 100644
--- a/ZAPD/ZFile.h
+++ b/ZAPD/ZFile.h
@@ -133,5 +133,5 @@ protected:
std::string ProcessTextureIntersections(const std::string& prefix);
void HandleUnaccountedData();
- bool HandleUnaccountedAddress(uint32_t currentAddress, uint32_t lastAddr, uint32_t& lastSize);
+ bool HandleUnaccountedAddress(offset_t currentAddress, offset_t lastAddr, uint32_t& lastSize);
};
diff --git a/ZAPD/ZSkeleton.cpp b/ZAPD/ZSkeleton.cpp
index 1a2f93f..4467c96 100644
--- a/ZAPD/ZSkeleton.cpp
+++ b/ZAPD/ZSkeleton.cpp
@@ -139,7 +139,7 @@ ZResourceType ZSkeleton::GetResourceType() const
DeclarationAlignment ZSkeleton::GetDeclarationAlignment() const
{
- return DeclarationAlignment::Align16;
+ return DeclarationAlignment::Align4;
}
uint8_t ZSkeleton::GetLimbCount()
diff --git a/ZAPD/ZVtx.cpp b/ZAPD/ZVtx.cpp
index d5214e8..e4b3d97 100644
--- a/ZAPD/ZVtx.cpp
+++ b/ZAPD/ZVtx.cpp
@@ -82,5 +82,5 @@ std::string ZVtx::GetExternalExtension() const
DeclarationAlignment ZVtx::GetDeclarationAlignment() const
{
- return DeclarationAlignment::Align16;
+ return DeclarationAlignment::Align8;
}