AT Hard Disk Ports

 The AT hard disk controller is incorporated onto the same adapter card as
 its diskette controller.  Its I/O ports, commands, and status signals are
 different from those of the XT controller.  See  XT Hard Disk Ports for
 details.

   ■ AT Hard disk controller #1 decodes ports 1f0H through 1f7H
   ■ AT Hard disk controller #2 decodes ports 170H through 177H

 The controller generates interrupt level 14 (IRQ 14) after every operation
 (read, write, seek, etc.).  IRQ 14 is vectored to INT 76H where an action
 flag bit is set at address 0:048e.

Port  Description
▀▀▀▀  ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
1f0H  Data register. Read/write data from/to controller sector buffer
──── ───────────────────────────────────────────────────────────────────────
1f1H  Write: Write Precompensation register.  Turn on write precompensation.
      Read: Error register.  Contains bits for last error.
      ╓7┬6┬5┬4┬3┬2┬1┬0╖
      ║ │ │0│ │0│ │ │ ║
      ╙╥┴╥┴─┴╥┴─┴╥┴╥┴╥╜ bit
       ║ ║   ║   ║ ║ ╚═► 0: Data Address Mark not found
       ║ ║   ║   ║ ╚═══► 1: Track 0 Error
       ║ ║   ║   ╚═════► 2: Command was aborted
       ║ ║   ╚═════════► 4: Sector ID not found
       ║ ╚═════════════► 6: ECC Error: Uncorrectable data error
       ╚═══════════════► 7: Bad block
──── ───────────────────────────────────────────────────────────────────────
1f2H  Sector count.  Read/Write count of sectors for operation
──── ───────────────────────────────────────────────────────────────────────
1f3H  Sector number.  Read/Write current/starting logical sector number
──── ───────────────────────────────────────────────────────────────────────
1f4H  Cylinder high (bits 0-1 are bits 8-9 of 10-bit cylinder number)
1f5H  Cylinder low (bits 0-7 of 10-bit cylinder number)
──── ───────────────────────────────────────────────────────────────────────
1f6H  Drive & Head.  Read/Write: bits indicate head, drive for operation
──── ───────────────────────────────────────────────────────────────────────
1f7H  Write: command register (Summary: see Tech Ref for full details)
             1xH = Restore to cylinder 0 (low nibble is step rate)
             7xH = Seek to cylinder (low nibble is step rate)
             2xH = Read sector (low nibble indicates retry and ECC-read)
             3xH = Write sector (low nibble indicates retry and ECC-read)
             50H = Format track
             4xH = verify read (low nibble indicates retry)
             90H = diagnose
             91H = set parameters (max heads,sectors) for selected drive

1f7H  Read:  status register
      ╓7┬6┬5┬4┬3┬2┬1┬0╖
      ║ │ │ │ │ │ │ │ ║
      ╙╥┴╥┴╥┴╥┴╥┴╥┴╥┴╥╜ bit
       ║ ║ ║ ║ ║ ║ ║ ╚═► 0: 1=previous command ended in an error.
       ║ ║ ║ ║ ║ ║ ╚═══► 1: Index: set to 1 while index hole is detected
       ║ ║ ║ ║ ║ ╚═════► 2: Corrected data.  Error found, but ECC fixed it.
       ║ ║ ║ ║ ╚═══════► 3: Data Request.  Buffer is waiting for data (busy)
       ║ ║ ║ ╚═════════► 4: Seek completed
       ║ ║ ╚═══════════► 5: Write fault
       ║ ╚═════════════► 6: Drive ready for read/write/seek (unless bit 4=0)
       ╚═══════════════► 7: Busy. 1=executing cmd (other bits are invalid)
──── ───────────────────────────────────────────────────────────────────────
See Also: INT 13H (disk I/O)
          Hard Disk Parameter Table
          Device Drivers
          BIOS Data Area
          Diskette Controller Ports
          XT Hard Disk Ports
          Cables and Pin Outs
          I/O Port Map
                                    -♦-