open-goal-jak-project/decompiler/data/dir_tpages.cpp

56 lines
1.5 KiB
C++

#include "dir_tpages.h"
#include "decompiler/ObjectFile/ObjectFileDB.h"
#include "third-party/fmt/core.h"
namespace decompiler {
std::string DirTpageResult::to_source() const {
std::string result;
int i = 0;
for (auto len : lengths) {
result += fmt::format(" {:6s} ;; entry {}\n", fmt::format("#x{:x}", len), i);
i++;
}
return result;
}
DirTpageResult process_dir_tpages(ObjectFileData& data) {
DirTpageResult result;
auto& words = data.linked_data.words_by_seg.at(0);
int word_idx = 0;
// first is type
ASSERT(words.at(word_idx).kind() == LinkedWord::TYPE_PTR);
ASSERT(words.at(word_idx).symbol_name() == "texture-page-dir");
word_idx++;
// next is length
ASSERT(words.at(word_idx).kind() == LinkedWord::PLAIN_DATA);
int dir_length = words.at(word_idx).data;
word_idx++;
for (int i = 0; i < dir_length; i++) {
ASSERT(words.at(word_idx).kind() == LinkedWord::PLAIN_DATA);
u32 entry = words.at(word_idx).data;
ASSERT((entry & 0xffff7000) == 0); // 7 checks for sign bit.
word_idx++;
result.lengths.push_back(entry & 0xffff);
ASSERT(words.at(word_idx).kind() == LinkedWord::SYM_PTR);
ASSERT(words.at(word_idx).symbol_name() == "#f");
word_idx++;
ASSERT(words.at(word_idx).kind() == LinkedWord::SYM_PTR);
ASSERT(words.at(word_idx).symbol_name() == "#f");
word_idx++;
}
if (data.linked_data.version != GameVersion::Jak3) {
word_idx = ((word_idx + 3) / 4) * 4;
}
ASSERT(word_idx == (int)words.size());
return result;
}
} // namespace decompiler