diff options
Diffstat (limited to 'src/drive.c')
-rw-r--r-- | src/drive.c | 21 |
1 files changed, 11 insertions, 10 deletions
diff --git a/src/drive.c b/src/drive.c index 64b765a..5bc2e3b 100644 --- a/src/drive.c +++ b/src/drive.c @@ -47,7 +47,7 @@ void drive_init(drive_t *drive) { drive->current_idx = 0; drive->lookahead_idx = 0; - drive_cycle(drive, 0, false); + drive_cycle(drive); } void drive_step_up(drive_t *drive) { @@ -68,16 +68,19 @@ void drive_step_down(drive_t *drive) { } } -bool drive_cycle(drive_t *drive, uint8_t cycles, bool advance) { +bool drive_advance(drive_t *drive, uint8_t cycles) { bool byte_ready = false; - if (advance) { - for (uint8_t i = 0; i < cycles; i++) { - uint8_t j = (i + drive->current_idx) & (DRIVE_LOOKAHEAD - 1); - byte_ready |= drive->byte_ready[j]; - } - drive->current_idx = (drive->current_idx + cycles) & (DRIVE_LOOKAHEAD - 1); + + for (uint8_t i = 0; i < cycles; i++) { + uint8_t j = (i + drive->current_idx) & (DRIVE_LOOKAHEAD - 1); + byte_ready |= drive->byte_ready[j]; } + drive->current_idx = (drive->current_idx + cycles) & (DRIVE_LOOKAHEAD - 1); + return byte_ready; +} + +void drive_cycle(drive_t *drive) { while (drive->lookahead_idx != ((drive->current_idx - 1) & (DRIVE_LOOKAHEAD - 1))) { uint8_t j = (drive->lookahead_idx + 1) & (DRIVE_LOOKAHEAD - 1); uint8_t timer_next = drive->timer + BITRATE_PER_TRACK[drive->track]; @@ -194,6 +197,4 @@ bool drive_cycle(drive_t *drive, uint8_t cycles, bool advance) { drive->lookahead_idx = j; drive->timer = timer_next; } - - return byte_ready; } |