mirror of
https://github.com/TomHarte/CLK.git
synced 2024-12-11 15:49:38 +00:00
Avoid being thrown by looping BASIC.
This commit is contained in:
parent
e835b2c68c
commit
48c0ae8fe4
@ -84,6 +84,7 @@ std::optional<BASICAnalysis> analyse(const File &file) {
|
|||||||
// a machine code entry point.
|
// a machine code entry point.
|
||||||
|
|
||||||
BASICAnalysis analysis;
|
BASICAnalysis analysis;
|
||||||
|
std::set<uint16_t> visited_lines;
|
||||||
while(true) {
|
while(true) {
|
||||||
// Analysis has failed if there isn't at least one complete BASIC line from here.
|
// Analysis has failed if there isn't at least one complete BASIC line from here.
|
||||||
if(size_t(line_address - file.starting_address) + 5 >= file.data.size()) {
|
if(size_t(line_address - file.starting_address) + 5 >= file.data.size()) {
|
||||||
@ -120,7 +121,10 @@ std::optional<BASICAnalysis> analyse(const File &file) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if(!next_line_address) {
|
// Exit if a formal end of the program has been declared or if, as some copy protections do,
|
||||||
|
// the linked list of line contents has been made circular.
|
||||||
|
visited_lines.insert(line_number);
|
||||||
|
if(!next_line_address || visited_lines.find(next_line_address) != visited_lines.end()) {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -182,14 +186,25 @@ Analyser::Static::TargetList Analyser::Static::Commodore::GetTargets(
|
|||||||
if(analysis && !analysis->machine_code_addresses.empty()) {
|
if(analysis && !analysis->machine_code_addresses.empty()) {
|
||||||
string_stream << "1";
|
string_stream << "1";
|
||||||
|
|
||||||
|
// Disassemble.
|
||||||
const auto disassembly = Analyser::Static::MOS6502::Disassemble(
|
const auto disassembly = Analyser::Static::MOS6502::Disassemble(
|
||||||
file.data,
|
file.data,
|
||||||
Analyser::Static::Disassembler::OffsetMapper(file.starting_address),
|
Analyser::Static::Disassembler::OffsetMapper(file.starting_address),
|
||||||
analysis->machine_code_addresses
|
analysis->machine_code_addresses
|
||||||
);
|
);
|
||||||
// TODO: disassemble.
|
|
||||||
|
|
||||||
printf("");
|
// Very dumb check: if FF3E or FF3F were touched, this is for the +4.
|
||||||
|
for(const auto address: {0xff3e, 0xff3f}) {
|
||||||
|
for(const auto &collection: {
|
||||||
|
disassembly.external_loads,
|
||||||
|
disassembly.external_stores,
|
||||||
|
disassembly.external_modifies
|
||||||
|
}) {
|
||||||
|
if(collection.find(uint16_t(address)) != collection.end()) {
|
||||||
|
target->machine = Machine::Plus4; // TODO: use a better target?
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
string_stream << "\nRUN\n";
|
string_stream << "\nRUN\n";
|
||||||
|
Loading…
Reference in New Issue
Block a user