diff --git a/src/floppy/fdc.c b/src/floppy/fdc.c index 1ece0bc9a..1d3ae1abb 100644 --- a/src/floppy/fdc.c +++ b/src/floppy/fdc.c @@ -685,12 +685,12 @@ fdc_seek_complete_interrupt(fdc_t *fdc, int drive) fdc_log("FDD %c: Seek complete interrupt\n", 0x41 + drive); fdc->fintr = 1; + fdc->interrupt = -3; fdc->st0 = 0x20 | (drive & 3); if (fdd_get_head(drive)) fdc->st0 |= 0x04; - fdc_int(fdc, 1); - fdc->stat = (fdc->stat & 0xf) | 0x80; + fdc_callback(fdc); } void diff --git a/src/floppy/fdd.c b/src/floppy/fdd.c index 07bb0a122..43b200f27 100644 --- a/src/floppy/fdd.c +++ b/src/floppy/fdd.c @@ -311,15 +311,20 @@ fdd_seek(int drive, int track_diff) fdd_audio_play_multi_track_seek(drive, old_track, fdd[drive].track); } + if (old_track + track_diff < 0) { + fdd_do_seek(drive, fdd[drive].track); + return; + } + // Count actual seek time (6ms per track + 50ms base) // 80 tracks -> 50 + 6 * 80 = 530ms double seek_ratio = 80.0 / (double)drive_types[fdd[drive].type].max_track; uint64_t seek_time_us = (50000 + (abs(actual_track_diff) * 6000 * seek_ratio)) * TIMER_USEC; if (!fdd_seek_timer[drive].callback) { timer_add(&(fdd_seek_timer[drive]), fdd_seek_complete_callback, &drives[drive], 0); - } - - timer_set_delay_u64(&fdd_seek_timer[drive], seek_time_us); + } + + timer_set_delay_u64(&fdd_seek_timer[drive], seek_time_us); } int