From 5e334dc8c7dfc055a7a6bfadaee43735d4ab6692 Mon Sep 17 00:00:00 2001 From: inspectredc Date: Thu, 19 Jun 2025 12:21:07 +0100 Subject: [PATCH] Support virtual addrs lookup --- src/Companion.cpp | 15 ++++++++++++++- src/Companion.h | 1 + 2 files changed, 15 insertions(+), 1 deletion(-) diff --git a/src/Companion.cpp b/src/Companion.cpp index 7a4ee09..e16a99f 100644 --- a/src/Companion.cpp +++ b/src/Companion.cpp @@ -405,6 +405,11 @@ void Companion::ParseCurrentFileConfig(YAML::Node node) { } } + if (node["virtual"]) { + auto virtualAddrMap = node["virtual"]; + gVirtualAddrMap[gCurrentFile] = std::make_tuple(virtualAddrMap[0].as(), virtualAddrMap[1].as()); + } + if(node["header"]) { auto header = node["header"]; switch (this->gConfig.exporterType) { @@ -1400,11 +1405,19 @@ std::optional Companion::GetFileOffsetFromSegmentedAddr(const uin return std::nullopt; } -std::optional> Companion::GetNodeByAddr(const uint32_t addr){ +std::optional> Companion::GetNodeByAddr(uint32_t addr){ if(!this->gAddrMap.contains(this->gCurrentFile)){ return std::nullopt; } + // HACK: Adjust address to rom address if virtual address + if (addr & 0x80000000) { + if (gVirtualAddrMap.contains(gCurrentFile)) { + addr -= std::get<0>(gVirtualAddrMap[gCurrentFile]); + addr += std::get<1>(gVirtualAddrMap[gCurrentFile]); + } + } + if(!this->gAddrMap[this->gCurrentFile].contains(addr)){ for (auto &file : this->gCurrentExternalFiles) { if (!this->gAddrMap.contains(file)) { diff --git a/src/Companion.h b/src/Companion.h index 4354a9b..60f10b6 100644 --- a/src/Companion.h +++ b/src/Companion.h @@ -212,6 +212,7 @@ private: std::variant, std::string> gWriteOrder; std::unordered_map> gFactories; std::unordered_map>> gWriteMap; + std::unordered_map> gVirtualAddrMap; std::unordered_map>> gAddrMap; void ProcessFile(YAML::Node root);