1
0
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:
Thomas Harte 2018-05-18 22:07:58 -04:00
parent 7b7beb13a3
commit ed06533e60
2 changed files with 22 additions and 6 deletions

View File

@ -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_;

View File

@ -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_;
} }