diff --git a/StaticAnalyser/Atari/StaticAnalyser.cpp b/StaticAnalyser/Atari/StaticAnalyser.cpp index a0fa49ccf..03cc91ff8 100644 --- a/StaticAnalyser/Atari/StaticAnalyser.cpp +++ b/StaticAnalyser/Atari/StaticAnalyser.cpp @@ -17,14 +17,30 @@ static void DeterminePagingFor2kCartridge(StaticAnalyser::Target &target, const // if this is a 2kb cartridge then it's definitely either unpaged or a CommaVid uint16_t entry_address, break_address; - entry_address = (uint16_t)(segment.data[0x7fc] | (segment.data[0x7fd] << 8)); - break_address = (uint16_t)(segment.data[0x7fe] | (segment.data[0x7ff] << 8)); + entry_address = ((uint16_t)(segment.data[0x7fc] | (segment.data[0x7fd] << 8))) & 0x1fff; + break_address = ((uint16_t)(segment.data[0x7fe] | (segment.data[0x7ff] << 8))) & 0x1fff; // a CommaVid start address needs to be outside of its RAM if(entry_address < 0x1800 || break_address < 0x1800) return; StaticAnalyser::MOS6502::Disassembly disassembly = StaticAnalyser::MOS6502::Disassemble(segment.data, 0x1800, {entry_address, break_address}, 0x1fff); +// StaticAnalyser::MOS6502::Disassembly standard_disassembly = +// StaticAnalyser::MOS6502::Disassemble(segment.data, 0x1000, {entry_address, break_address}, 0x1fff); + + // if there are no subroutines in the top 2kb of memory then this isn't a CommaVid + bool has_subroutine_call = false; + for(uint16_t address : disassembly.internal_calls) + { + const uint16_t masked_address = address & 0x1fff; + if(masked_address >= 0x1800) + { + has_subroutine_call = true; + break; + } + } + if(!has_subroutine_call) return; + std::set all_writes = disassembly.external_stores; all_writes.insert(disassembly.external_modifies.begin(), disassembly.external_modifies.end()); diff --git a/StaticAnalyser/Disassembler/Disassembler6502.cpp b/StaticAnalyser/Disassembler/Disassembler6502.cpp index 5a1a66bed..9c3066769 100644 --- a/StaticAnalyser/Disassembler/Disassembler6502.cpp +++ b/StaticAnalyser/Disassembler/Disassembler6502.cpp @@ -18,6 +18,7 @@ struct PartialDisassembly { static void AddToDisassembly(PartialDisassembly &disassembly, const std::vector &memory, uint16_t start_address, uint16_t entry_point, uint16_t address_mask) { + disassembly.disassembly.internal_calls.insert(start_address); uint16_t address = entry_point & address_mask; while(1) { diff --git a/StaticAnalyser/Disassembler/Disassembler6502.hpp b/StaticAnalyser/Disassembler/Disassembler6502.hpp index 2204b095b..e973d110c 100644 --- a/StaticAnalyser/Disassembler/Disassembler6502.hpp +++ b/StaticAnalyser/Disassembler/Disassembler6502.hpp @@ -64,6 +64,7 @@ struct Instruction { struct Disassembly { std::map instructions_by_address; std::set outward_calls; + std::set internal_calls; std::set external_stores, external_loads, external_modifies; std::set internal_stores, internal_loads, internal_modifies; };