1
0
mirror of https://github.com/TomHarte/CLK.git synced 2024-06-26 10:29:31 +00:00

Accept a paging scheme if it becomes 60% likely.

This commit is contained in:
Thomas Harte 2023-09-06 22:40:39 -04:00
parent 8c3ebe23f6
commit e98f78316b

View File

@ -123,90 +123,8 @@ static Analyser::Static::TargetList CartridgeTargetsFrom(
Analyser::Static::Z80::Approach::Exhaustive Analyser::Static::Z80::Approach::Exhaustive
); );
// // Look for a indirect store followed by an unconditional JP or CALL into another
// // segment, that's a fairly explicit sign where found.
using Instruction = Analyser::Static::Z80::Instruction; using Instruction = Analyser::Static::Z80::Instruction;
std::map<uint16_t, Instruction> &instructions = disassembly.instructions_by_address; const std::map<uint16_t, Instruction> &instructions = disassembly.instructions_by_address;
bool is_ascii = false;
// auto iterator = instructions.begin();
// while(iterator != instructions.end()) {
// auto next_iterator = iterator;
// next_iterator++;
// if(next_iterator == instructions.end()) break;
//
// if( iterator->second.operation == Instruction::Operation::LD &&
// iterator->second.destination == Instruction::Location::Operand_Indirect &&
// (
// iterator->second.operand == 0x5000 ||
// iterator->second.operand == 0x6000 ||
// iterator->second.operand == 0x6800 ||
// iterator->second.operand == 0x7000 ||
// iterator->second.operand == 0x77ff ||
// iterator->second.operand == 0x7800 ||
// iterator->second.operand == 0x8000 ||
// iterator->second.operand == 0x9000 ||
// iterator->second.operand == 0xa000
// ) &&
// (
// next_iterator->second.operation == Instruction::Operation::CALL ||
// next_iterator->second.operation == Instruction::Operation::JP
// ) &&
// ((next_iterator->second.operand >> 13) != (0x4000 >> 13))
// ) {
// const uint16_t address = uint16_t(next_iterator->second.operand);
// switch(iterator->second.operand) {
// case 0x6000:
// if(address >= 0x6000 && address < 0x8000) {
// target.msx.cartridge_type = Analyser::Static::MSXCartridgeType::KonamiWithSCC;
// }
// break;
// case 0x6800:
// if(address >= 0x6000 && address < 0x6800) {
// target.msx.cartridge_type = Analyser::Static::MSXCartridgeType::ASCII8kb;
// }
// break;
// case 0x7000:
// if(address >= 0x6000 && address < 0x8000) {
// target.msx.cartridge_type = Analyser::Static::MSXCartridgeType::KonamiWithSCC;
// }
// if(address >= 0x7000 && address < 0x7800) {
// is_ascii = true;
// }
// break;
// case 0x77ff:
// if(address >= 0x7000 && address < 0x7800) {
// target.msx.cartridge_type = Analyser::Static::MSXCartridgeType::ASCII16kb;
// }
// break;
// case 0x7800:
// if(address >= 0xa000 && address < 0xc000) {
// target.msx.cartridge_type = Analyser::Static::MSXCartridgeType::ASCII8kb;
// }
// break;
// case 0x8000:
// if(address >= 0x8000 && address < 0xa000) {
// target.msx.cartridge_type = Analyser::Static::MSXCartridgeType::KonamiWithSCC;
// }
// break;
// case 0x9000:
// if(address >= 0x8000 && address < 0xa000) {
// target.msx.cartridge_type = Analyser::Static::MSXCartridgeType::KonamiWithSCC;
// }
// break;
// case 0xa000:
// if(address >= 0xa000 && address < 0xc000) {
// target.msx.cartridge_type = Analyser::Static::MSXCartridgeType::Konami;
// }
// break;
// case 0xb000:
// if(address >= 0xa000 && address < 0xc000) {
// target.msx.cartridge_type = Analyser::Static::MSXCartridgeType::KonamiWithSCC;
// }
// break;
// }
// }
//
// iterator = next_iterator;
// Look for LD (nnnn), A instructions, and collate those addresses. // Look for LD (nnnn), A instructions, and collate those addresses.
std::map<uint16_t, int> address_counts; std::map<uint16_t, int> address_counts;
@ -218,49 +136,46 @@ static Analyser::Static::TargetList CartridgeTargetsFrom(
} }
} }
// Weight confidences by number of observed hits. // Weight confidences by number of observed hits; if any is above 60% confidence, just use it.
float total_hits = const auto ascii_8kb_total = address_counts[0x6000] + address_counts[0x6800] + address_counts[0x7000] + address_counts[0x7800];
float( const auto ascii_16kb_total = address_counts[0x6000] + address_counts[0x7000] + address_counts[0x77ff];
address_counts[0x6000] + address_counts[0x6800] + const auto konami_total = address_counts[0x6000] + address_counts[0x8000] + address_counts[0xa000];
address_counts[0x7000] + address_counts[0x7800] + const auto konami_with_scc_total = address_counts[0x5000] + address_counts[0x7000] + address_counts[0x9000] + address_counts[0xb000];
address_counts[0x77ff] + address_counts[0x8000] +
address_counts[0xa000] + address_counts[0x5000] +
address_counts[0x9000] + address_counts[0xb000]
);
targets.push_back(CartridgeTarget( const auto total_hits = ascii_8kb_total + ascii_16kb_total + konami_total + konami_with_scc_total;
segment,
start_address, const bool is_ascii_8kb = (ascii_8kb_total * 5) / (total_hits * 3);
Analyser::Static::MSX::Cartridge::ASCII8kb, const bool is_ascii_16kb = (ascii_16kb_total * 5) / (total_hits * 3);
float( address_counts[0x6000] + const bool is_konami = (konami_total * 5) / (total_hits * 3);
address_counts[0x6800] + const bool is_konami_with_scc = (konami_with_scc_total * 5) / (total_hits * 3);
address_counts[0x7000] +
address_counts[0x7800]) / total_hits)); if(!is_ascii_16kb && !is_konami && !is_konami_with_scc) {
targets.push_back(CartridgeTarget( targets.push_back(CartridgeTarget(
segment, segment,
start_address, start_address,
Analyser::Static::MSX::Cartridge::ASCII16kb, Analyser::Static::MSX::Cartridge::ASCII8kb,
float( address_counts[0x6000] + float(ascii_8kb_total) / float(total_hits)));
address_counts[0x7000] + }
address_counts[0x77ff]) / total_hits)); if(!is_ascii_8kb && !is_konami && !is_konami_with_scc) {
if(!is_ascii) { targets.push_back(CartridgeTarget(
segment,
start_address,
Analyser::Static::MSX::Cartridge::ASCII16kb,
float(ascii_16kb_total) / float(total_hits)));
}
if(!is_ascii_8kb && !is_ascii_16kb && !is_konami_with_scc) {
targets.push_back(CartridgeTarget( targets.push_back(CartridgeTarget(
segment, segment,
start_address, start_address,
Analyser::Static::MSX::Cartridge::Konami, Analyser::Static::MSX::Cartridge::Konami,
float( address_counts[0x6000] + float(konami_total) / float(total_hits)));
address_counts[0x8000] +
address_counts[0xa000]) / total_hits));
} }
if(!is_ascii) { if(!is_ascii_8kb && !is_ascii_16kb && !is_konami) {
targets.push_back(CartridgeTarget( targets.push_back(CartridgeTarget(
segment, segment,
start_address, start_address,
Analyser::Static::MSX::Cartridge::KonamiWithSCC, Analyser::Static::MSX::Cartridge::KonamiWithSCC,
float( address_counts[0x5000] + float(konami_with_scc_total) / float(total_hits)));
address_counts[0x7000] +
address_counts[0x9000] +
address_counts[0xb000]) / total_hits));
} }
} }