This item is from the Yet Another Enhanced IDE/Fast-ATA/ATA-2 FAQ, by John Wehman and Peter den Haan with numerous contributions by others. (v1.92).
The registers of the primary ATA channel occupy the following I/O addresses (in hexadecimal notation):
Register Read Function Write Function
01F0h Read Data Write Data (16 Bits) (16 bits) 01F1h Error register Set Features Data 01F2h Status of sector Write sector count count for command setup 01F3h Location of starting Write sector start sector for command setup 01F4h Location of Cyl-low Write cyl-low location for command setup 01F5h Location of Cyl-high Write cyl-high location for command setup 01F6h Head/device selection Write device selection and head selection for command setup 01F7h Device Status Device command
03F6h Alternate Status Device Control 03F7h Drive Address
Note that the floppy disk controller's disk change flag shares 03F7h which makes life difficult for designers that want to implement disk and floppy controllers separately. From this point of view it may come as no surprise that some of the problems in the CMD640x and RZ1000 'EIDE' interface chips touched upon elsewhere in this FAQ are floppy related.
There is no reason why there can't be a large number of interfaces like this one. There is a de facto standard for four of these ports:
Interface number CS0-decode CS1-decode IRQ number
1 01F0h-01F7h 03F6h-03F7h 14 2 0170h-0177h 0376h-0377h 15 or 10 3 01E8h-01EFh 03EEh-03EFh 12 or 11 4 0168h-016Fh 036Eh-036Fh 10 or 9
Only the first two enjoy really widespread support; for the secondary port, IRQ15 is the most commonly used interrupt by far. Potential BIOS support for arbitrary extra ports is found only in the Phoenix specification.