diff --git a/StaticAnalyser/Atari/StaticAnalyser.cpp b/StaticAnalyser/Atari/StaticAnalyser.cpp index 1e6cb3ea2..a89647a2b 100644 --- a/StaticAnalyser/Atari/StaticAnalyser.cpp +++ b/StaticAnalyser/Atari/StaticAnalyser.cpp @@ -92,6 +92,9 @@ static void DeterminePagingFor2kCartridge(StaticAnalyser::Target &target, const static void DeterminePagingFor8kCartridge(StaticAnalyser::Target &target, const Storage::Cartridge::Cartridge::Segment &segment, const std::vector &disassemblies) { + // make an assumption that this is the Atari paging model + target.atari.paging_model = StaticAnalyser::Atari2600PagingModel::Atari8k; + std::set internal_accesses; std::set external_stores; for(const StaticAnalyser::MOS6502::Disassembly &disassembly : disassemblies) @@ -102,16 +105,19 @@ static void DeterminePagingFor8kCartridge(StaticAnalyser::Target &target, const external_stores.insert(disassembly.external_stores.begin(), disassembly.external_stores.end()); } - bool looks_like_atari = false; - bool looks_like_parker_bros = false; + int atari_access_count = 0; + int parker_access_count = 0; + int tigervision_access_count = 0; for(uint16_t address : internal_accesses) { - looks_like_atari |= ((address & 0x1fff) >= 0x1ff8) && ((address & 0x1fff) < 0x1ffa); - looks_like_parker_bros |= ((address & 0x1fff) >= 0x1fe0) && ((address & 0x1fff) < 0x1fe8); + uint16_t masked_address = address & 0x1fff; + atari_access_count += masked_address >= 0x1ff8 && masked_address < 0x1ffa; + parker_access_count += masked_address >= 0x1fe0 && masked_address < 0x1ff8; + tigervision_access_count += address == 0x3f; } - if(looks_like_parker_bros) target.atari.paging_model = StaticAnalyser::Atari2600PagingModel::ParkerBros; - if(looks_like_atari) target.atari.paging_model = StaticAnalyser::Atari2600PagingModel::Atari8k; + if(parker_access_count > atari_access_count) target.atari.paging_model = StaticAnalyser::Atari2600PagingModel::ParkerBros; + else if(tigervision_access_count > atari_access_count) target.atari.paging_model = StaticAnalyser::Atari2600PagingModel::Tigervision; } static void DeterminePagingForCartridge(StaticAnalyser::Target &target, const Storage::Cartridge::Cartridge::Segment &segment) @@ -163,7 +169,7 @@ static void DeterminePagingForCartridge(StaticAnalyser::Target &target, const St // check for a Super Chip. Atari ROM images [almost] always have the same value stored over RAM // regions. - if(target.atari.paging_model != StaticAnalyser::Atari2600PagingModel::CBSRamPlus) + if(target.atari.paging_model != StaticAnalyser::Atari2600PagingModel::CBSRamPlus && target.atari.paging_model != StaticAnalyser::Atari2600PagingModel::MNetwork) { bool has_superchip = true; for(size_t address = 0; address < 256; address++)