http://www.retroleum.co.uk/ide_interface.html
Code: Select all
IDE reg: A0-A2: /CS0: /CS1: Use:
$0 000 0 1 IDE Data Port
$1 001 0 1 Read: Error code
$2 010 0 1 Number Of Sectors To Transfer
$3 011 0 1 Sector address LBA 0 (0:7)
$4 100 0 1 Sector address LBA 1 (8:15)
$5 101 0 1 Sector address LBA 2 (16:23)
$6 110 0 1 Sector address LBA 3 (24:27) (also see **)
$7 111 0 1 Read: "Status", Write: Issue command to drive
$8 000 1 0 Not Important
$9 001 1 0 Not Important
$A 010 1 0 Not Important
$B 011 1 0 Not Important
$C 100 1 0 Not Important
$D 101 1 0 Not Important
$E 110 1 0 Not Important
$F 111 1 0 Not Important

Причём мапить только младший байт у всех адресов кроме 0 - для которого старшую часть замапить на адрес 1, сдвинув "Read: Error code" на адрес 2 при чтении (при записи оно всё также будет "Number Of Sectors To Transfer").
Code: Select all
0 - IDE Data Port (0:7)
1 - IDE Data Port (8:15)
2 - Read: Error code (moved from 1), Write: Number Of Sectors To Transfer (usually 1)
3 - Sector address LBA 0 (0:7)
4 - Sector address LBA 1 (8:15)
5 - Sector address LBA 2 (16:23)
6 - Sector address LBA 3 (24:27) (highest 3 bits must be "1" for LBA)
7 - Read: "Status", Write: Issue command to drive
При записи данных в IDE интерфейс будет выдаваться строб записи только при обращении к адресу 1, а адрес 0 будет записывать промежуточный регистр, значение которого будет использоваться при записи в адрес 1.
Для всех остальных адресов стробы чтения и записи будут непосредственно браться с шины.