From 1f57a70a213b5083c4cc18b36bc92a071f1148c3 Mon Sep 17 00:00:00 2001 From: SarahW Date: Mon, 13 May 2019 19:39:56 +0100 Subject: [PATCH] Slow down sector read/write speed on AT Fixed Disk Adapter. Fixes OS/2 v1.0 hard drive formatter. --- src/mfm_at.c | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/src/mfm_at.c b/src/mfm_at.c index 83fee43..cccd1c9 100644 --- a/src/mfm_at.c +++ b/src/mfm_at.c @@ -21,6 +21,14 @@ #define IDE_TIME (TIMER_USEC*10)//(5 * 100 * (1 << TIMER_SHIFT)) +/*Rough estimate - MFM drives spin at 3600 RPM, with 17 sectors per track, + meaning (3600/60)*17 = 1020 sectors per second, or 980us per sector. + + This is required for OS/2 on slow 286 systems, as the hard drive formatter + will crash with 'internal processing error' if write sector interrupts are too + close in time*/ +#define SECTOR_TIME (TIMER_USEC * 980) + #define STAT_ERR 0x01 #define STAT_INDEX 0x02 #define STAT_CORRECTED_DATA 0x04 @@ -313,7 +321,7 @@ void mfm_writew(uint16_t port, uint16_t val, void *p) { mfm->pos = 0; mfm->status = STAT_BUSY; - timer_set_delay_u64(&mfm->callback_timer, 6*IDE_TIME); + timer_set_delay_u64(&mfm->callback_timer, SECTOR_TIME); } } @@ -382,7 +390,7 @@ uint16_t mfm_readw(uint16_t port, void *p) { mfm_next_sector(mfm); mfm->status = STAT_BUSY; - timer_set_delay_u64(&mfm->callback_timer, 6*IDE_TIME); + timer_set_delay_u64(&mfm->callback_timer, SECTOR_TIME); } } }