mirror of
https://github.com/open-goal/jak-project.git
synced 2025-02-17 12:40:04 +00:00
![water111](/assets/img/avatar_default.png)
* temp * temp * before cleaning up * cleanup merge * fix warnings * merge fix * clang format
54 lines
1.5 KiB
C++
54 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++;
|
|
}
|
|
|
|
word_idx = ((word_idx + 3) / 4) * 4;
|
|
ASSERT(word_idx == (int)words.size());
|
|
|
|
return result;
|
|
}
|
|
} // namespace decompiler
|