Diskette Controller Ports

 This describes I/O for the Floppy Disk Controller (FDC).  The main
 component is the NEC µPD765 (or compatible FDC chip).

 The AT FDC is incorporated on the same card as its hard disk controller,
 but is compatible with the standard PC/XT FDC (except as noted below).
 The main differences are that the AT FDC is capable of multiple data rates
 but handles only two drives.

   ■ Diskette controller 1 decodes ports 3f0H through 3f7H
   ■ Diskette controller 2 decodes ports 370H through 377H (on AT only)

 The FDC generates interrupt level 6 (IRQ 6) after each operation (read,
 write, seek, recalibrate, etc.).  IRQ 6 is vectored to INT 0eH and handled
 by BIOS.

Port  Description
▀▀▀▀  ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
3f2H  Write: digital output register
      ╓7┬6┬5┬4┬3┬2┬1┬0╖
      ║D C B A│ │ │   ║
      ╙─┴─┴─┴─┴╥┴╥┴─┴─╜ bit
       ╚══╦══╝ ║ ║ ╚═╩═► 0-1: Drive to select 0-3 (AT: bit 1 not used)
          ║    ║ ╚═════► 2: 0=reset diskette controller; 1=enable controller
          ║    ╚═══════► 3: 1=enable diskette DMA and interrupts
          ╚══════════► 4-7: drive motor enable.  Set bits to turn drive ON.
                            (AT: bits 6-7 not used)
──── ───────────────────────────────────────────────────────────────────────
3f4H  Read-only: main status register
      ╓7┬6┬5┬4┬3┬2┬1┬0╖
      ║ │ │ │ │D C B A║
      ╙╥┴╥┴╥┴╥┴─┴─┴─┴─╜ bit
       ║ ║ ║ ║ ╚═════╩═► 0: diskette drive busy (AT: bits 2-3 not used)
       ║ ║ ║ ╚═════════► 4: 1=controller busy (read or write in progress)
       ║ ║ ╚═══════════► 5: 1=non-DMA mode; 0=DMA mode active
       ║ ╚═════════════► 6: Data direction: 1=ctrlr to CPU; 0 = CPU═►FDC
       ╚═══════════════► 7: Req. for Master. 1=OK to send/recv cmd or data
──── ───────────────────────────────────────────────────────────────────────
3f5H  Read/Write: FDC command/data register
      This port is used for all controller command operations.   First, a
      command byte is output, then one or more data parameters are output.
      The operation is performed, then 0 or more inputs return the results.
      All of this I/O goes through this port and must take place in the
      correct sequence.

      This lists the commands used by BIOS for its standard functions, but
      it does not show the parameters that follow or values of the results.
      Sorry, but you'll need the Tech Ref if you want more information.

      Cmd  Description
      ▀▀▀  ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
      e6H  Read data (expects 8 parms to follow; 7 results when done)
      c5H  Write data (expects 8 parms to follow; 7 results when done)
      4dH  Format track (expects 5 parms to follow; 7 results when done)
      07H  Recalibrate (expects 1 parm to follow; no results when done)
      0fH  Seek Track (expects 2 parms to follow; no results when done)
──── ───────────────────────────────────────────────────────────────────────
3f6H  AT  Write: fixed disk register (no information available)
──── ───────────────────────────────────────────────────────────────────────
3f7H  AT  Write: diskette control register
      ╓7┬6┬5┬4┬3┬2┬1┬0╖
      ║           │   ║
      ╙─┴─┴─┴─┴─┴─┴─┴─╜ bit
       ╚════╦════╝ ╚═╩═► 0-1: data transfer rate
            ║                 00=500 KBS, 01=300 KBS, 10=250 KBS, 11=res.
            ╚══════════► 2-7: I can't find anything about these

      Read: digital input register.  Used for diagnostics (except bit 7)
      ╓7┬6┬5┬4┬3┬2┬1┬0╖
      ║c│ │ head  │ │ ║
      ╙╥┴╥┴─┴─┴─┴─┴╥┴╥╜ bit
       ║ ║ ╚══╦══╝ ║ ╚═► 0: 1=select drive 0
       ║ ║    ║    ╚═══► 1: 1=select drive 1
       ║ ║    ╚══════► 2-5: Head select 0-3 (bit 2=hd 0, bit 3=hd 1, etc)
       ║ ╚═════════════► 6: Write Gate
       ╚═══════════════► 7: Change Line (1=diskette change line is ON)
──── ───────────────────────────────────────────────────────────────────────
See Also: INT 13H (disk I/O)
          Device Drivers
          BIOS Data Area
          AT Hard Disk Ports
          XT Hard Disk Ports
          Cables and Pin Outs
          I/O Port Map
                                    -♦-