1
0
mirror of https://github.com/TomHarte/CLK.git synced 2024-11-23 03:32:32 +00:00

Added insurance against an infinite loop should the tape be exhausted.

This commit is contained in:
Thomas Harte 2016-09-12 22:22:23 -04:00
parent c3a795328d
commit e3571e8b9e
3 changed files with 11 additions and 2 deletions

View File

@ -136,7 +136,7 @@ unsigned int Machine::perform_bus_operation(CPU6502::BusOperation operation, uin
// CPU or 6560 costs. // CPU or 6560 costs.
if(_use_fast_tape_hack && _tape.has_tape() && address == 0xf92f && operation == CPU6502::BusOperation::ReadOpcode) if(_use_fast_tape_hack && _tape.has_tape() && address == 0xf92f && operation == CPU6502::BusOperation::ReadOpcode)
{ {
while(!_userPortVIA->get_interrupt_line() && !_keyboardVIA->get_interrupt_line()) while(!_userPortVIA->get_interrupt_line() && !_keyboardVIA->get_interrupt_line() && !_tape.get_tape()->is_at_end())
{ {
_userPortVIA->run_for_half_cycles(2); _userPortVIA->run_for_half_cycles(2);
_keyboardVIA->run_for_half_cycles(2); _keyboardVIA->run_for_half_cycles(2);
@ -184,7 +184,10 @@ unsigned int Machine::perform_bus_operation(CPU6502::BusOperation operation, uin
_is_running_at_zero_cost = true; _is_running_at_zero_cost = true;
set_clock_is_unlimited(true); set_clock_is_unlimited(true);
} }
if(address < 0xe000 && operation == CPU6502::BusOperation::ReadOpcode) if(
(address < 0xe000 && operation == CPU6502::BusOperation::ReadOpcode) ||
_tape.get_tape()->is_at_end()
)
{ {
_is_running_at_zero_cost = false; _is_running_at_zero_cost = false;
set_clock_is_unlimited(false); set_clock_is_unlimited(false);

View File

@ -50,6 +50,11 @@ void TapePlayer::set_tape(std::shared_ptr<Storage::Tape::Tape> tape)
get_next_pulse(); get_next_pulse();
} }
std::shared_ptr<Storage::Tape::Tape> TapePlayer::get_tape()
{
return _tape;
}
bool TapePlayer::has_tape() bool TapePlayer::has_tape()
{ {
return (bool)_tape; return (bool)_tape;

View File

@ -78,6 +78,7 @@ class TapePlayer: public TimedEventLoop {
void set_tape(std::shared_ptr<Storage::Tape::Tape> tape); void set_tape(std::shared_ptr<Storage::Tape::Tape> tape);
bool has_tape(); bool has_tape();
std::shared_ptr<Storage::Tape::Tape> get_tape();
void run_for_cycles(int number_of_cycles); void run_for_cycles(int number_of_cycles);
void run_for_input_pulse(); void run_for_input_pulse();