jak-project/decompiler/data/dir_tpages.cpp
water111 6366068bc0
Support dir tpages (#671)
* support dir tpages

* fix warnings and bad return

* one more try

* revive the offline test script

* fix this null bug
2021-07-02 14:50:58 -04:00

52 lines
1.4 KiB
C++

#include "third-party/fmt/core.h"
#include "decompiler/ObjectFile/ObjectFileDB.h"
#include "dir_tpages.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;
fmt::print("length: {}\n", dir_length);
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++;
}
assert(word_idx == (int)words.size());
return result;
}
} // namespace decompiler