From 4d35eee630f6c9885bce8cc90a5294417e3dd328 Mon Sep 17 00:00:00 2001 From: OBattler Date: Mon, 29 Sep 2025 00:15:40 +0200 Subject: [PATCH] FDD: When a drive is set to turbo mode, keep it silent and bring back the fast seeks. --- src/floppy/fdc.c | 10 +++++++++ src/floppy/fdd.c | 50 +++++++++++++++++++++++------------------- src/floppy/fdd_audio.c | 6 ++--- 3 files changed, 40 insertions(+), 26 deletions(-) diff --git a/src/floppy/fdc.c b/src/floppy/fdc.c index 44adc569b..71a03bac2 100644 --- a/src/floppy/fdc.c +++ b/src/floppy/fdc.c @@ -1940,6 +1940,16 @@ fdc_callback(void *priv) case 0x0f: /*Seek*/ fdc->st0 = 0x20 | (fdc->params[0] & 3); fdc->stat = 0x10 | (1 << fdc->rw_drive); + if (fdd_get_turbo(1 << fdc->rw_drive)) { + if (fdc->flags & FDC_FLAG_PCJR) { + fdc->fintr = 1; + fdc->interrupt = -4; + timer_set_delay_u64(&fdc->timer, 1024 * TIMER_USEC); + } else { + fdc->interrupt = -3; + fdc_callback(fdc); + } + } // Interrupts and callbacks in the fdd callback function return; case 0x10: /*Version*/ diff --git a/src/floppy/fdd.c b/src/floppy/fdd.c index 212317f49..d4d9d4476 100644 --- a/src/floppy/fdd.c +++ b/src/floppy/fdd.c @@ -385,31 +385,35 @@ fdd_seek(int drive, int track_diff) fdd_changed[drive] = 0; - /* Trigger appropriate audio for track movements */ - int actual_track_diff = abs(old_track - fdd[drive].track); - if (actual_track_diff == 1) { - /* Single track movement */ - fdd_audio_play_single_track_step(drive, old_track, fdd[drive].track); - } else if (actual_track_diff > 1) { - /* Multi-track seek */ - fdd_audio_play_multi_track_seek(drive, old_track, fdd[drive].track); - } - - if (old_track + track_diff < 0) { + if (fdd[drive].turbo) fdd_do_seek(drive, fdd[drive].track); - return; + else { + /* Trigger appropriate audio for track movements */ + int actual_track_diff = abs(old_track - fdd[drive].track); + if (actual_track_diff == 1) { + /* Single track movement */ + fdd_audio_play_single_track_step(drive, old_track, fdd[drive].track); + } else if (actual_track_diff > 1) { + /* Multi-track seek */ + 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; + } + + fdd_seek_in_progress[drive] = 1; + + if (!fdd_seek_timer[drive].callback) { + timer_add(&(fdd_seek_timer[drive]), fdd_seek_complete_callback, &drives[drive], 0); + } + + double initial_seek_time = FDC_FLAG_PCJR & fdd_fdc->flags ? 40000.0 : 15000.0; + double track_seek_time = FDC_FLAG_PCJR & fdd_fdc->flags ? 10000.0 : 6000.0; + uint64_t seek_time_us = (initial_seek_time + (abs(actual_track_diff) * track_seek_time)) * TIMER_USEC; + timer_set_delay_u64(&fdd_seek_timer[drive], seek_time_us); } - - fdd_seek_in_progress[drive] = 1; - - if (!fdd_seek_timer[drive].callback) { - timer_add(&(fdd_seek_timer[drive]), fdd_seek_complete_callback, &drives[drive], 0); - } - - double initial_seek_time = FDC_FLAG_PCJR & fdd_fdc->flags ? 40000.0 : 15000.0; - double track_seek_time = FDC_FLAG_PCJR & fdd_fdc->flags ? 10000.0 : 6000.0; - uint64_t seek_time_us = (initial_seek_time + (abs(actual_track_diff) * track_seek_time)) * TIMER_USEC; - timer_set_delay_u64(&fdd_seek_timer[drive], seek_time_us); } int diff --git a/src/floppy/fdd_audio.c b/src/floppy/fdd_audio.c index 409ddfe8c..afa78002f 100644 --- a/src/floppy/fdd_audio.c +++ b/src/floppy/fdd_audio.c @@ -386,7 +386,7 @@ fdd_audio_close(void) void fdd_audio_set_motor_enable(int drive, int motor_enable) { - if (!fdd_sounds_enabled) + if (!fdd_sounds_enabled || fdd_get_turbo(drive)) return; drive_audio_samples_t *samples = get_drive_samples(drive); @@ -420,7 +420,7 @@ fdd_audio_set_motor_enable(int drive, int motor_enable) void fdd_audio_play_single_track_step(int drive, int from_track, int to_track) { - if (!fdd_sounds_enabled) + if (!fdd_sounds_enabled || fdd_get_turbo(drive)) return; if (drive < 0 || drive >= FDD_NUM) @@ -435,7 +435,7 @@ fdd_audio_play_single_track_step(int drive, int from_track, int to_track) void fdd_audio_play_multi_track_seek(int drive, int from_track, int to_track) { - if (!fdd_sounds_enabled) + if (!fdd_sounds_enabled || fdd_get_turbo(drive)) return; if (drive < 0 || drive >= FDD_NUM)