From d6338e42cc0875e54bdce4b86aa30fe636d667ce Mon Sep 17 00:00:00 2001 From: OBattler Date: Wed, 7 May 2025 23:08:26 +0200 Subject: [PATCH] Significantly speed up floppy turbo mode when the FDC is using DMA. --- src/floppy/fdc.c | 9 +++++++++ src/floppy/fdd_86f.c | 18 +++++++++++++++--- src/include/86box/fdc.h | 1 + 3 files changed, 25 insertions(+), 3 deletions(-) diff --git a/src/floppy/fdc.c b/src/floppy/fdc.c index de8508e69..e779ea2d7 100644 --- a/src/floppy/fdc.c +++ b/src/floppy/fdc.c @@ -279,6 +279,15 @@ fdc_is_mfm(fdc_t *fdc) return fdc->mfm ? 1 : 0; } +int +fdc_is_dma(fdc_t *fdc) +{ + if ((fdc->flags & FDC_FLAG_PCJR) || !fdc->dma) + return 0; + else + return 1; +} + void fdc_request_next_sector_id(fdc_t *fdc) { diff --git a/src/floppy/fdd_86f.c b/src/floppy/fdd_86f.c index 0a7120b16..24fde57b1 100644 --- a/src/floppy/fdd_86f.c +++ b/src/floppy/fdd_86f.c @@ -2414,16 +2414,28 @@ d86f_turbo_poll(int drive, int side) case STATE_0C_READ_DATA: case STATE_11_SCAN_DATA: case STATE_16_VERIFY_DATA: - d86f_turbo_read(drive, side); + if (fdc_is_dma(d86f_fdc)) + for (int i = 0; i < (128 << dev->last_sector.id.n); i++) + d86f_turbo_read(drive, side); + else + d86f_turbo_read(drive, side); break; case STATE_05_WRITE_DATA: case STATE_09_WRITE_DATA: - d86f_turbo_write(drive, side); + if (fdc_is_dma(d86f_fdc)) + for (int i = 0; i < (128 << dev->last_sector.id.n); i++) + d86f_turbo_write(drive, side); + else + d86f_turbo_write(drive, side); break; case STATE_0D_FORMAT_TRACK: - d86f_turbo_format(drive, side, (side && (d86f_get_sides(drive) != 2))); + if (fdc_is_dma(d86f_fdc)) + while (dev->state == STATE_0D_FORMAT_TRACK) + d86f_turbo_format(drive, side, (side && (d86f_get_sides(drive) != 2))); + else + d86f_turbo_format(drive, side, (side && (d86f_get_sides(drive) != 2))); return; case STATE_IDLE: diff --git a/src/include/86box/fdc.h b/src/include/86box/fdc.h index 36cfaeb7a..ed62cb45f 100644 --- a/src/include/86box/fdc.h +++ b/src/include/86box/fdc.h @@ -206,6 +206,7 @@ extern int fdc_get_drive(fdc_t *fdc); extern int fdc_get_perp(fdc_t *fdc); extern int fdc_get_format_n(fdc_t *fdc); extern int fdc_is_mfm(fdc_t *fdc); +extern int fdc_is_dma(fdc_t *fdc); extern double fdc_get_hut(fdc_t *fdc); extern double fdc_get_hlt(fdc_t *fdc); extern void fdc_request_next_sector_id(fdc_t *fdc);