mirror of
https://github.com/TomHarte/CLK.git
synced 2024-10-05 08:55:36 +00:00
Cut down to one disassembly, now I know a bit more about how the non-Atari schemes work.
This commit is contained in:
parent
597bd97b01
commit
37f4f6ba14
@ -90,20 +90,15 @@ static void DeterminePagingFor2kCartridge(StaticAnalyser::Target &target, const
|
|||||||
target.atari.paging_model = StaticAnalyser::Atari2600PagingModel::CommaVid;
|
target.atari.paging_model = StaticAnalyser::Atari2600PagingModel::CommaVid;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void DeterminePagingFor8kCartridge(StaticAnalyser::Target &target, const Storage::Cartridge::Cartridge::Segment &segment, const std::vector<StaticAnalyser::MOS6502::Disassembly> &disassemblies)
|
static void DeterminePagingFor8kCartridge(StaticAnalyser::Target &target, const Storage::Cartridge::Cartridge::Segment &segment, const StaticAnalyser::MOS6502::Disassembly &disassembly)
|
||||||
{
|
{
|
||||||
// make an assumption that this is the Atari paging model
|
// make an assumption that this is the Atari paging model
|
||||||
target.atari.paging_model = StaticAnalyser::Atari2600PagingModel::Atari8k;
|
target.atari.paging_model = StaticAnalyser::Atari2600PagingModel::Atari8k;
|
||||||
|
|
||||||
std::set<uint16_t> internal_accesses;
|
std::set<uint16_t> internal_accesses;
|
||||||
std::set<uint16_t> external_stores;
|
internal_accesses.insert(disassembly.internal_stores.begin(), disassembly.internal_stores.end());
|
||||||
for(const StaticAnalyser::MOS6502::Disassembly &disassembly : disassemblies)
|
internal_accesses.insert(disassembly.internal_modifies.begin(), disassembly.internal_modifies.end());
|
||||||
{
|
internal_accesses.insert(disassembly.internal_loads.begin(), disassembly.internal_loads.end());
|
||||||
internal_accesses.insert(disassembly.internal_stores.begin(), disassembly.internal_stores.end());
|
|
||||||
internal_accesses.insert(disassembly.internal_modifies.begin(), disassembly.internal_modifies.end());
|
|
||||||
internal_accesses.insert(disassembly.internal_loads.begin(), disassembly.internal_loads.end());
|
|
||||||
external_stores.insert(disassembly.external_stores.begin(), disassembly.external_stores.end());
|
|
||||||
}
|
|
||||||
|
|
||||||
int atari_access_count = 0;
|
int atari_access_count = 0;
|
||||||
int parker_access_count = 0;
|
int parker_access_count = 0;
|
||||||
@ -114,7 +109,7 @@ static void DeterminePagingFor8kCartridge(StaticAnalyser::Target &target, const
|
|||||||
atari_access_count += masked_address >= 0x1ff8 && masked_address < 0x1ffa;
|
atari_access_count += masked_address >= 0x1ff8 && masked_address < 0x1ffa;
|
||||||
parker_access_count += masked_address >= 0x1fe0 && masked_address < 0x1ff8;
|
parker_access_count += masked_address >= 0x1fe0 && masked_address < 0x1ff8;
|
||||||
}
|
}
|
||||||
for(uint16_t address: external_stores)
|
for(uint16_t address: disassembly.external_stores)
|
||||||
{
|
{
|
||||||
uint16_t masked_address = address & 0x1fff;
|
uint16_t masked_address = address & 0x1fff;
|
||||||
tigervision_access_count += masked_address == 0x3f;
|
tigervision_access_count += masked_address == 0x3f;
|
||||||
@ -142,21 +137,13 @@ static void DeterminePagingForCartridge(StaticAnalyser::Target &target, const St
|
|||||||
return (size_t)(address & 0xfff);
|
return (size_t)(address & 0xfff);
|
||||||
};
|
};
|
||||||
|
|
||||||
std::vector<StaticAnalyser::MOS6502::Disassembly> disassemblies;
|
std::vector<uint8_t> final_4k(segment.data.end() - 4096, segment.data.end());
|
||||||
std::set<uint16_t> internal_stores;
|
StaticAnalyser::MOS6502::Disassembly disassembly = StaticAnalyser::MOS6502::Disassemble(final_4k, address_mapper, {entry_address, break_address});
|
||||||
std::set<uint16_t> external_stores;
|
|
||||||
for(std::vector<uint8_t>::difference_type base = 0; base < segment.data.size(); base += 4096)
|
|
||||||
{
|
|
||||||
std::vector<uint8_t> sub_data(segment.data.begin() + base, segment.data.begin() + base + 4096);
|
|
||||||
disassemblies.push_back(StaticAnalyser::MOS6502::Disassemble(sub_data, address_mapper, {entry_address, break_address}));
|
|
||||||
internal_stores.insert(disassemblies.back().internal_stores.begin(), disassemblies.back().internal_stores.end());
|
|
||||||
external_stores.insert(disassemblies.back().external_stores.begin(), disassemblies.back().external_stores.end());
|
|
||||||
}
|
|
||||||
|
|
||||||
switch(segment.data.size())
|
switch(segment.data.size())
|
||||||
{
|
{
|
||||||
case 8192:
|
case 8192:
|
||||||
DeterminePagingFor8kCartridge(target, segment, disassemblies);
|
DeterminePagingFor8kCartridge(target, segment, disassembly);
|
||||||
break;
|
break;
|
||||||
case 12288:
|
case 12288:
|
||||||
target.atari.paging_model = StaticAnalyser::Atari2600PagingModel::CBSRamPlus;
|
target.atari.paging_model = StaticAnalyser::Atari2600PagingModel::CBSRamPlus;
|
||||||
@ -190,7 +177,7 @@ static void DeterminePagingForCartridge(StaticAnalyser::Target &target, const St
|
|||||||
// check for a Tigervision or Tigervision-esque scheme
|
// check for a Tigervision or Tigervision-esque scheme
|
||||||
if(target.atari.paging_model == StaticAnalyser::Atari2600PagingModel::None && segment.data.size() > 4096)
|
if(target.atari.paging_model == StaticAnalyser::Atari2600PagingModel::None && segment.data.size() > 4096)
|
||||||
{
|
{
|
||||||
bool looks_like_tigervision = external_stores.find(0x3f) != external_stores.end();
|
bool looks_like_tigervision = disassembly.external_stores.find(0x3f) != disassembly.external_stores.end();
|
||||||
if(looks_like_tigervision) target.atari.paging_model = StaticAnalyser::Atari2600PagingModel::Tigervision;
|
if(looks_like_tigervision) target.atari.paging_model = StaticAnalyser::Atari2600PagingModel::Tigervision;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user