summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorinspectredc <inspectredc@gmail.com>2025-06-19 12:21:07 +0100
committerLywx <kiritodev01@gmail.com>2025-07-04 17:41:27 -0600
commit5e334dc8c7dfc055a7a6bfadaee43735d4ab6692 (patch)
tree4da2a435b109a99c70bb3b6636813000c3af8992 /src
parent8b5ef9129c2106564f0cfbc7f6dd934b5b5884ae (diff)
Support virtual addrs lookup
Diffstat (limited to 'src')
-rw-r--r--src/Companion.cpp15
-rw-r--r--src/Companion.h1
2 files changed, 15 insertions, 1 deletions
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<uint32_t, uint32_t>(virtualAddrMap[0].as<uint32_t>(), virtualAddrMap[1].as<uint32_t>());
+ }
+
if(node["header"]) {
auto header = node["header"];
switch (this->gConfig.exporterType) {
@@ -1400,11 +1405,19 @@ std::optional<std::uint32_t> Companion::GetFileOffsetFromSegmentedAddr(const uin
return std::nullopt;
}
-std::optional<std::tuple<std::string, YAML::Node>> Companion::GetNodeByAddr(const uint32_t addr){
+std::optional<std::tuple<std::string, YAML::Node>> 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::vector<std::string>, std::string> gWriteOrder;
std::unordered_map<std::string, std::shared_ptr<BaseFactory>> gFactories;
std::unordered_map<std::string, std::map<std::string, std::vector<WriteEntry>>> gWriteMap;
+ std::unordered_map<std::string, std::tuple<uint32_t, uint32_t>> gVirtualAddrMap;
std::unordered_map<std::string, std::unordered_map<uint32_t, std::tuple<std::string, YAML::Node>>> gAddrMap;
void ProcessFile(YAML::Node root);