]> xenbits.xensource.com Git - people/andrewcoop/seabios.git/commitdiff
floppy: Preserve motor and drive sel bits when resetting the floppy controller
authorNikolay Nikolov <nickysn@users.sourceforge.net>
Sun, 4 Feb 2018 15:26:59 +0000 (17:26 +0200)
committerKevin O'Connor <kevin@koconnor.net>
Thu, 8 Feb 2018 02:16:21 +0000 (21:16 -0500)
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>
src/hw/floppy.c

index 992983dc449443f41fed386ca7c0c0952a17cfae..573c45f50b4d0aa7f0b10345375322ae9fc441db 100644 (file)
@@ -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;