diff --git a/StaticAnalyser/Atari/StaticAnalyser.cpp b/StaticAnalyser/Atari/StaticAnalyser.cpp index abce4327d..5e78faa5f 100644 --- a/StaticAnalyser/Atari/StaticAnalyser.cpp +++ b/StaticAnalyser/Atari/StaticAnalyser.cpp @@ -27,9 +27,10 @@ void StaticAnalyser::Atari::AddTargets( target.tapes = tapes; target.cartridges = cartridges; target.atari.paging_model = Atari2600PagingModel::None; + target.atari.uses_superchip = false; // try to figure out the paging scheme -/* if(!cartridges.empty()) + if(!cartridges.empty()) { const std::list &segments = cartridges.front()->get_segments(); if(segments.size() == 1) @@ -48,9 +49,23 @@ void StaticAnalyser::Atari::AddTargets( } StaticAnalyser::MOS6502::Disassembly disassembly = StaticAnalyser::MOS6502::Disassemble(segment.data, 0x1000, {entry_address, break_address}, 0x1fff); - printf("%p", &disassembly); + + // check for any sort of on-cartridge RAM; that might imply a Super Chip or else immediately tip the + // hat that this is a CBS RAM+ cartridge + if(!disassembly.internal_stores.empty()) + { + bool writes_above_128 = false; + for(uint16_t address : disassembly.internal_stores) + { + writes_above_128 |= ((address & 0x1fff) > 0x10ff) && ((address & 0x1fff) < 0x1200); + } + if(writes_above_128) + target.atari.paging_model = Atari2600PagingModel::CBSRamPlus; + else + target.atari.uses_superchip = true; + } } - }*/ + } destination.push_back(target); } diff --git a/StaticAnalyser/StaticAnalyser.hpp b/StaticAnalyser/StaticAnalyser.hpp index 1aabae662..eebaa1216 100644 --- a/StaticAnalyser/StaticAnalyser.hpp +++ b/StaticAnalyser/StaticAnalyser.hpp @@ -32,7 +32,8 @@ enum class Atari2600PagingModel { Atari32k, ActivisionStack, ParkerBros, - Tigervision + Tigervision, + CBSRamPlus }; /*! @@ -57,6 +58,7 @@ struct Target { struct { Atari2600PagingModel paging_model; + bool uses_superchip; } atari; struct {