mirror of
https://github.com/TomHarte/CLK.git
synced 2024-11-26 23:52:26 +00:00
Implements write support out of the Disk II.
This commit is contained in:
parent
7b7beb13a3
commit
ed06533e60
@ -104,6 +104,13 @@ void DiskII::run_for(const Cycles cycles) {
|
|||||||
case 0xb: shift_register_ = data_input_; break; // load data register from data bus
|
case 0xb: shift_register_ = data_input_; break; // load data register from data bus
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Currently writing?
|
||||||
|
if(inputs_&input_mode) {
|
||||||
|
// state_ & 0x80 should be the current level sent to the disk;
|
||||||
|
// therefore transitions in that bit should become flux transitions
|
||||||
|
drives_[active_drive_].write_bit(!!((state_ ^ address) & 0x80));
|
||||||
|
}
|
||||||
|
|
||||||
// TODO: surely there's a less heavyweight solution than this?
|
// TODO: surely there's a less heavyweight solution than this?
|
||||||
if(!drive_is_sleeping_[0]) drives_[0].run_for(Cycles(1));
|
if(!drive_is_sleeping_[0]) drives_[0].run_for(Cycles(1));
|
||||||
if(!drive_is_sleeping_[1]) drives_[1].run_for(Cycles(1));
|
if(!drive_is_sleeping_[1]) drives_[1].run_for(Cycles(1));
|
||||||
@ -135,9 +142,9 @@ void DiskII::set_state_machine(const std::vector<uint8_t> &state_machine) {
|
|||||||
|
|
||||||
state b0, state b2, state b3, pulse, Q7, Q6, shift, state b1
|
state b0, state b2, state b3, pulse, Q7, Q6, shift, state b1
|
||||||
|
|
||||||
... and has the top nibble reflected. Beneath Apple Pro-DOS uses a
|
... and has the top nibble of each value stored in the ROM reflected.
|
||||||
different order and several of the online copies are reformatted
|
Beneath Apple Pro-DOS uses a different order and several of the
|
||||||
into that order.
|
online copies are reformatted into that order.
|
||||||
|
|
||||||
So the code below remaps into Beneath Apple Pro-DOS order if the
|
So the code below remaps into Beneath Apple Pro-DOS order if the
|
||||||
supplied state machine isn't already in that order.
|
supplied state machine isn't already in that order.
|
||||||
@ -221,8 +228,16 @@ int DiskII::read_address(int address) {
|
|||||||
|
|
||||||
case 0xc: inputs_ &= ~input_command; break;
|
case 0xc: inputs_ &= ~input_command; break;
|
||||||
case 0xd: inputs_ |= input_command; break;
|
case 0xd: inputs_ |= input_command; break;
|
||||||
case 0xe: inputs_ &= ~input_mode; break;
|
case 0xe:
|
||||||
case 0xf: inputs_ |= input_mode; break;
|
if(inputs_ & input_mode)
|
||||||
|
drives_[active_drive_].end_writing();
|
||||||
|
inputs_ &= ~input_mode;
|
||||||
|
break;
|
||||||
|
case 0xf:
|
||||||
|
if(!(inputs_ & input_mode))
|
||||||
|
drives_[active_drive_].begin_writing(Storage::Time(1, 2045454), false);
|
||||||
|
inputs_ |= input_mode;
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
set_controller_can_sleep();
|
set_controller_can_sleep();
|
||||||
return (address & 1) ? 0xff : shift_register_;
|
return (address & 1) ? 0xff : shift_register_;
|
||||||
|
@ -202,7 +202,8 @@ Storage::Time PCMPatchedTrack::seek_to(const Time &time_since_index_hole) {
|
|||||||
else
|
else
|
||||||
current_time_ = underlying_track_->seek_to(time_since_index_hole);
|
current_time_ = underlying_track_->seek_to(time_since_index_hole);
|
||||||
|
|
||||||
assert(current_time_ <= time_since_index_hole);
|
// The assert below is disabled as it assumes too much about total precision.
|
||||||
|
// assert(current_time_ <= time_since_index_hole);
|
||||||
return current_time_;
|
return current_time_;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user