From e15d6717a1e92a2317aa3643e34f23e193bc4f1c Mon Sep 17 00:00:00 2001 From: Thomas Harte Date: Sun, 25 Mar 2018 13:37:33 -0400 Subject: [PATCH] Strips back Vic-20 static analysis to the bare minimum. Also corrects an unsafe assumption in fast loading. --- Analyser/Static/Commodore/StaticAnalyser.cpp | 16 +++--- Machines/Commodore/Vic-20/Vic20.cpp | 51 +++++++++++--------- 2 files changed, 36 insertions(+), 31 deletions(-) diff --git a/Analyser/Static/Commodore/StaticAnalyser.cpp b/Analyser/Static/Commodore/StaticAnalyser.cpp index c6daba8f6..4ec29a806 100644 --- a/Analyser/Static/Commodore/StaticAnalyser.cpp +++ b/Analyser/Static/Commodore/StaticAnalyser.cpp @@ -98,8 +98,8 @@ void Analyser::Static::Commodore::AddTargets(const Media &media, std::vector 0x2000) - target->memory_model = Target::MemoryModel::ThirtyTwoKB; - else if(target->memory_model == Target::MemoryModel::Unexpanded && !(starting_address >= 0x1000 || starting_address+file_size < 0x0400)) - target->memory_model = Target::MemoryModel::ThirtyTwoKB; +// if(starting_address + file_size > 0x2000) +// target->memory_model = Target::MemoryModel::ThirtyTwoKB; +// else if(target->memory_model == Target::MemoryModel::Unexpanded && !(starting_address >= 0x1000 || starting_address+file_size < 0x0400)) +// target->memory_model = Target::MemoryModel::ThirtyTwoKB; // } - } +// } } if(!target->media.empty()) diff --git a/Machines/Commodore/Vic-20/Vic20.cpp b/Machines/Commodore/Vic-20/Vic20.cpp index bb836401b..368fab781 100644 --- a/Machines/Commodore/Vic-20/Vic20.cpp +++ b/Machines/Commodore/Vic-20/Vic20.cpp @@ -585,32 +585,37 @@ class ConcreteMachine: uint8_t x = static_cast(m6502_.get_value_of_register(CPU::MOS6502::Register::X)); if(x == 0xe) { Storage::Tape::Commodore::Parser parser; + const uint64_t tape_position = tape_->get_tape()->get_offset(); std::unique_ptr data = parser.get_next_data(tape_->get_tape()); - uint16_t start_address, end_address; - start_address = static_cast(user_basic_memory_[0xc1] | (user_basic_memory_[0xc2] << 8)); - end_address = static_cast(user_basic_memory_[0xae] | (user_basic_memory_[0xaf] << 8)); + if(data) { + uint16_t start_address, end_address; + start_address = static_cast(user_basic_memory_[0xc1] | (user_basic_memory_[0xc2] << 8)); + end_address = static_cast(user_basic_memory_[0xae] | (user_basic_memory_[0xaf] << 8)); - // perform a via-processor_write_memory_map_ memcpy - uint8_t *data_ptr = data->data.data(); - std::size_t data_left = data->data.size(); - while(data_left && start_address != end_address) { - uint8_t *page = processor_write_memory_map_[start_address >> 10]; - if(page) page[start_address & 0x3ff] = *data_ptr; - data_ptr++; - start_address++; - data_left--; + // perform a via-processor_write_memory_map_ memcpy + uint8_t *data_ptr = data->data.data(); + std::size_t data_left = data->data.size(); + while(data_left && start_address != end_address) { + uint8_t *page = processor_write_memory_map_[start_address >> 10]; + if(page) page[start_address & 0x3ff] = *data_ptr; + data_ptr++; + start_address++; + data_left--; + } + + // set tape status, carry and flag + user_basic_memory_[0x90] |= 0x40; + uint8_t flags = static_cast(m6502_.get_value_of_register(CPU::MOS6502::Register::Flags)); + flags &= ~static_cast((CPU::MOS6502::Flag::Carry | CPU::MOS6502::Flag::Interrupt)); + m6502_.set_value_of_register(CPU::MOS6502::Register::Flags, flags); + + // to ensure that execution proceeds to 0xfccf, pretend a NOP was here and + // ensure that the PC leaps to 0xfccf + m6502_.set_value_of_register(CPU::MOS6502::Register::ProgramCounter, 0xfccf); + *value = 0xea; // i.e. NOP implied + } else { + tape_->get_tape()->set_offset(tape_position); } - - // set tape status, carry and flag - user_basic_memory_[0x90] |= 0x40; - uint8_t flags = static_cast(m6502_.get_value_of_register(CPU::MOS6502::Register::Flags)); - flags &= ~static_cast((CPU::MOS6502::Flag::Carry | CPU::MOS6502::Flag::Interrupt)); - m6502_.set_value_of_register(CPU::MOS6502::Register::Flags, flags); - - // to ensure that execution proceeds to 0xfccf, pretend a NOP was here and - // ensure that the PC leaps to 0xfccf - m6502_.set_value_of_register(CPU::MOS6502::Register::ProgramCounter, 0xfccf); - *value = 0xea; // i.e. NOP implied } } }