aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNikolay Nikolov <nickysn@users.sourceforge.net>2018-02-04 17:26:59 +0200
committerKevin O'Connor <kevin@koconnor.net>2018-02-07 21:16:21 -0500
commit53d82f0ee8eba571689f64b748bca8e9badda8b2 (patch)
tree145e5e65e93356fab69e69af25ec01100c124121
parent53fc631307b2c4a403e183afcc5ffe27987349a6 (diff)
downloadseabios-53d82f0ee8eba571689f64b748bca8e9badda8b2.zip
seabios-53d82f0ee8eba571689f64b748bca8e9badda8b2.tar.gz
seabios-53d82f0ee8eba571689f64b748bca8e9badda8b2.tar.bz2
floppy: Preserve motor and drive sel bits when resetting the floppy controller
In case of read or write errors, the floppy system is usually reset and the operation is retried. In that case, the floppy motor state must be preserved in order to avoid creating jitter and keep the floppy motor spinning smoothly at a constant speed. Additionally, the drive select bits should probably also be preserved, because some systems might need a small delay after selecting a new drive. In that case, the operation would be retried, without changing the currently selected drive. In floppy_enable_controller(), the IRQ bit is now enabled first, before the reset bit is set. I'm not completely sure whether this is necessary. It is done just in case some hardware introduces a delay between setting this bit and actually enabling the IRQ, which would cause us to miss the IRQ, sent by the controller immediately after reset. Signed-off-by: Nikolay Nikolov <nickysn@users.sourceforge.net>
-rw-r--r--src/hw/floppy.c9
1 files changed, 6 insertions, 3 deletions
diff --git a/src/hw/floppy.c b/src/hw/floppy.c
index 992983d..573c45f 100644
--- a/src/hw/floppy.c
+++ b/src/hw/floppy.c
@@ -212,7 +212,8 @@ static void
floppy_disable_controller(void)
{
dprintf(2, "Floppy_disable_controller\n");
- floppy_dor_write(0x00);
+ // Clear the reset bit (enter reset state) and clear 'enable IRQ and DMA'
+ floppy_dor_mask(FLOPPY_DOR_IRQ | FLOPPY_DOR_RESET, 0);
}
static int
@@ -324,8 +325,10 @@ floppy_enable_controller(void)
{
dprintf(2, "Floppy_enable_controller\n");
SET_BDA(floppy_motor_counter, FLOPPY_MOTOR_TICKS);
- floppy_dor_write(0x00);
- floppy_dor_write(FLOPPY_DOR_IRQ | FLOPPY_DOR_RESET);
+ // Clear the reset bit (enter reset state), but set 'enable IRQ and DMA'
+ floppy_dor_mask(FLOPPY_DOR_RESET, FLOPPY_DOR_IRQ);
+ // Set the reset bit (normal operation) and keep 'enable IRQ and DMA' on
+ floppy_dor_mask(0, FLOPPY_DOR_IRQ | FLOPPY_DOR_RESET);
int ret = floppy_wait_irq();
if (ret)
return ret;