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

Attempted to give the PLL a litte extra leeway, and fixed PCMTrack length test.

This commit is contained in:
Thomas Harte 2016-07-29 18:52:50 -04:00
parent 8f62211f5e
commit fead524eb5
2 changed files with 7 additions and 4 deletions

View File

@ -11,11 +11,11 @@
using namespace Storage; using namespace Storage;
DiskDrive::DiskDrive(unsigned int clock_rate, unsigned int revolutions_per_minute) : DiskDrive::DiskDrive(unsigned int clock_rate, unsigned int revolutions_per_minute) :
_clock_rate(clock_rate), _clock_rate(clock_rate * 16),
_revolutions_per_minute(revolutions_per_minute), _revolutions_per_minute(revolutions_per_minute),
_head_position(0), _head_position(0),
TimedEventLoop(clock_rate) TimedEventLoop(clock_rate * 16)
{} {}
void DiskDrive::set_expected_bit_length(Time bit_length) void DiskDrive::set_expected_bit_length(Time bit_length)
@ -63,6 +63,8 @@ void DiskDrive::run_for_cycles(int number_of_cycles)
if(has_disk()) if(has_disk())
{ {
_cycles_since_index_hole += (unsigned int)number_of_cycles; _cycles_since_index_hole += (unsigned int)number_of_cycles;
number_of_cycles *= 16;
_pll->run_for_cycles(number_of_cycles); _pll->run_for_cycles(number_of_cycles);
TimedEventLoop::run_for_cycles(number_of_cycles); TimedEventLoop::run_for_cycles(number_of_cycles);
} }
@ -100,6 +102,7 @@ void DiskDrive::process_next_event()
case Track::Event::IndexHole: case Track::Event::IndexHole:
_cycles_since_index_hole = 0; _cycles_since_index_hole = 0;
process_index_hole(); process_index_hole();
printf("\n");
break; break;
} }
get_next_event(); get_next_event();

View File

@ -33,7 +33,7 @@ PCMTrack::Event PCMTrack::get_next_event()
{ {
unsigned int clock_multiplier = _track_clock_rate / _segments[_segment_pointer].length_of_a_bit.clock_rate; unsigned int clock_multiplier = _track_clock_rate / _segments[_segment_pointer].length_of_a_bit.clock_rate;
const uint8_t *segment_data = _segments[_segment_pointer].data.get(); const uint8_t *segment_data = _segments[_segment_pointer].data.get();
while(_bit_pointer < _segments[_segment_pointer].length_of_a_bit.length) while(_bit_pointer < _segments[_segment_pointer].number_of_bits)
{ {
// for timing simplicity, bits are modelled as happening at the end of their window // for timing simplicity, bits are modelled as happening at the end of their window
// TODO: should I account for the converse bit ordering? Or can I assume MSB first? // TODO: should I account for the converse bit ordering? Or can I assume MSB first?
@ -66,7 +66,7 @@ void PCMTrack::fix_length()
_track_clock_rate = NumberTheory::least_common_multiple(_track_clock_rate, _segments[c].length_of_a_bit.clock_rate); _track_clock_rate = NumberTheory::least_common_multiple(_track_clock_rate, _segments[c].length_of_a_bit.clock_rate);
} }
// therby determine the total length, storing it to next_event as the track-total divisor // thereby determine the total length, storing it to next_event as the track-total divisor
_next_event.length.clock_rate = 0; _next_event.length.clock_rate = 0;
for(size_t c = 0; c < _segments.size(); c++) for(size_t c = 0; c < _segments.size(); c++)
{ {