nedoIDE - подключение винтов к недокомпам

Публичный форум для http://www.nedopc.org/nedopc

Moderator: Shaos

User avatar
Shaos
Admin
Posts: 24080
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

nedoIDE - подключение винтов к недокомпам

Post by Shaos »

Стал подробнее разбираться с IDE/ATAPI

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 
Как видим не смотря на то, что интерфейс 16-битный, старшие 8 бит используются только по адресу 0, адрес сектора разбит на 4 однобайтовые части и второй набор адресов (/CS1=0) по сути может и не использоваться - отсюда идея: замапить эти адреса не в область портов, а в область памяти! :o

Причём мапить только младший байт у всех адресов кроме 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 интерфейс будет выдаваться строб чтения только при обращении к адресу 0, а адрес 1 будет читать содержимое промежуточного регистра, записанного на предыдущем шаге.

При записи данных в IDE интерфейс будет выдаваться строб записи только при обращении к адресу 1, а адрес 0 будет записывать промежуточный регистр, значение которого будет использоваться при записи в адрес 1.

Для всех остальных адресов стробы чтения и записи будут непосредственно браться с шины.
Last edited by Shaos on 11 Jul 2013 05:34, edited 1 time in total.
Я тут за главного - если что шлите мыло на me собака shaos точка net
User avatar
HardWareMan
Banned
Posts: 2139
Joined: 20 Mar 2005 13:41
Location: От туда

Post by HardWareMan »

Здесь применена хитрая мысль инженеров интела. У винта IDE все регистры 8 бит. И только регистр данных 16 бит. И весь прикол состоит в том, что на ISA есть отдельный сигнал CS16, который сигнализирует об 16ти битном обмене. И этот сигнал декодируется полностью из ног состояния процессора, поэтому контроллер IDE на винте, получив этот сигнал, выставляет полные 16 бит данных при обращении к регистру данных, выключая регистр кода ошибки, который по всем правилам адресации должен был всплыть в пару к порту данных. А второй чипсет - это декодирование ячейки 3x6H-3x7H. 3x6H это альтернативное состояние и управление устройством, а 3х7H не используется. Но я не помню, чтобы я их использовал.
Image
User avatar
Shaos
Admin
Posts: 24080
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

Post by Shaos »

Вот тут про старшие регистры написано следующее:
/CS0=1, /CS1=0, A2..A0=110B: 2nd status register/interrupt and reset register. When read this register gives you the same status byte as the primary (/CS0=0, /CS1=1, A2..A0=111B) status register. The only difference is that reading this register does not clear the interrupt from the IDE device when read. When written you can enable/disable the interrupts the IDE device generates; Also you can give a software reset to the IDE device.

/CS0=1, /CS1=0, A2..A0=111B: active status of the IDE device. In this register (read-only) you can find out if the IDE master or slave is currently active and find the currently selected head number. In a PC environment you can also find out if the floppy is currently in the drive. I have not used this register yet.
т.е. на них смело можно забить...

P.S. Прямая работа с LBA даёт возможность общаться с дисками размером до 128 гигабайт (137.4 если в степенях десятки) - все IDE-винты начиная с 1996 года обязаны уметь LBA).

P.P.S. Для более больших винтов есть 48-bit LBA, но оно мне пока непонятно...
Я тут за главного - если что шлите мыло на me собака shaos точка net
pfgx
Senior
Posts: 137
Joined: 20 Mar 2013 03:36
Location: Ростов-на-Дону

Post by pfgx »

Shaos wrote:P.P.S. Для более больших винтов есть 48-bit LBA, но оно мне пока непонятно...
Всё просто: http://wiki.osdev.org/ATA_PIO_Mode#48_bit_PIO
User avatar
He3HauKo
Senior
Posts: 176
Joined: 09 Aug 2012 11:20
Location: 95.135.174.189

Post by He3HauKo »

ОФФТОП!
Вот кто бы S.M.A.R.T спецификацию хотя на русский перевел!?
Хочу стать всезнайкой ;-)
User avatar
Shaos
Admin
Posts: 24080
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

Post by Shaos »

He3HauKo wrote:ОФФТОП!
Вот кто бы S.M.A.R.T спецификацию хотя на русский перевел!?
Вот это чтоли?

Судя по всему люди просто придумали как по статистике ошибок предсказывать момент, когда хард-драйв должен быть заменён пока он совсем не грохнулся - в случае частных лиц, у которых хард-драйвов меньше десятка, оно не поможет ибо статистика основывается на больших количествах ;)
Я тут за главного - если что шлите мыло на me собака shaos точка net
User avatar
He3HauKo
Senior
Posts: 176
Joined: 09 Aug 2012 11:20
Location: 95.135.174.189

Post by He3HauKo »

Прошу прощения!
Немножко ошибся, имелось виду команды управления винчестером такие как: пароль, установка уровня шума, остановка шпинделя и тд.

Вот здесь есть описание стандартов ATA, неплохо заиметь на Русском, хотя бы описание ATA-1 :-?
Хочу стать всезнайкой ;-)
User avatar
Shaos
Admin
Posts: 24080
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

Post by Shaos »

Вычитал, что в регистр 1 можно таки писать - при записи оно называется "Features", но не все драйвы это поддерживают (причём одна из фичей - включение 8-битного обмена)...

Можно прикинуть выгоду от расположения ATA-регистров в области памяти, а не портов. Скажем в случае портов побайтное копирование сектора на ассемблере 8080 выглядело бы так:

Code: Select all

 MVI B,0 ; 256 words
 LXI H,adata
loop:
 MOV A,M ; 7
 OUT R0L ; 10
 INX H ; 5
 MOV A,M ; 7
 OUT R0H ; 10
 INX H ; 5
 DCR B ; 5
 MOV A,B ; 5
 ORA A ; 4
 JNZ loop ; 10
При этом скорость копирования будет 68 такта на слово или 34 такта на байт - для 2.5 МГц это 73 КБ в секунду (если развернуть цикл, то скорость будет выше - 22 такта на байт или 113 КБ в секунду).

Теперь прикинем расположение в памяти (слово отдаётся побайтно):

Code: Select all

 MVI B,0 ; 256 words
 LXI H,adata
loop:
 MOV A,M ; 7
 STA R0L ; 13
 INX H ; 5
 MOV A,M ; 7
 STA R0H ; 13
 INX H ; 5
 DCR B ; 5
 MOV A,B ; 5
 ORA A ; 4
 JNZ loop ; 10
Как видим получается на 6 тактов больше - 74 такта на слово или 37 тактов на байт - 67 КБ в секунду (при развёрнутом цикле 25 тактов на байт или 100 КБ в секунду).

Теперь пересылка словами:

Code: Select all

 MVI B,0 ; 256 words
 LXI H,adata
loop:
 MOV E,M ; 7
 INX H ; 5
 MOV D,M ; 7
 INX H ; 5
 XCHG ; 5
 SHLD R0 ; 16
 XCHG ; 5
 DCR B ; 5
 MOV A,B ; 5
 ORA A ; 4
 JNZ loop ; 10
Получается 74 такта на слово - много (также как и отдельными половинками). Попробуем развернуть цикл:

Code: Select all

 LHLD buffer ; 16
 SHLD R0 ; 16
 LHLD buffer+2
 SHLD R0
 LHLD buffer+4
 SHLD R0
 ...
 LHLD buffer+510
 SHLD R0
Выходит 32 такта на слово или 16 тактов на байт - 152 килобайта в секунду при тактовой 2.5 МГц :o

P.S. Тот же трюк для побайтовых посылок будет длиннее:
LDA buffer ; 13
STA R0L ; 13
LDA buffer+1 ; 13
STA R0H ; 13
т.е. 26 тактов на байт или 20 тактов на байт в случае посылки в порт (OUT на 3 такта быстрее чем STA).

P.P.S. Если же наш буфер будет идти задом-наперёд, то можно сделать ещё быстрее - через стек:
LXI SP,buffer+512
PUSH H ; 11
SHLD R0 ; 16
PUSH H
SHLD R0
...
т.е. 27 тактов на слово или 13.5 тактов на байт - 180 КБ в секунду при 2.5 МГц :o

P.P.P.S. Буржуйский DivIDE обещает пиковую скорость 218 КБ в секунду на Z80 с 3.5 МГц через INI/OUTI - в нашем случае с развёрнутым циклом такты будут теже что и на 8080 - т.е. 16 тактов на байт что по сути тоже самое (218750 байтов в секунду), но через стек будет ещё быстрее - 259259 байтов в секунду!
Last edited by Shaos on 11 Jul 2013 15:28, edited 3 times in total.
Я тут за главного - если что шлите мыло на me собака shaos точка net
User avatar
Shaos
Admin
Posts: 24080
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

Post by Shaos »

He3HauKo wrote:Вот здесь есть описание стандартов ATA, неплохо заиметь на Русском, хотя бы описание ATA-1 :-?
Учись читать по английски ;)

А вообще спектрумисты уже вдоль и поперёк всё по русски пообсуждали в разных спековских изданиях :)
Я тут за главного - если что шлите мыло на me собака shaos точка net
User avatar
Shaos
Admin
Posts: 24080
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

Post by Shaos »

А теперь можно прикинуть как нам преобразовать адреса так, чтобы всё заработало как хотелось:

Code: Select all

    | RD | WR |
----+----+----+
000 |000 |000*|
001 |000*|000 |
010 |001 |010 |
011 |011 |011 |
100 |100 |100 |
101 |101 |101 |
110 |110 |110 |
111 |111 |111 |
Для нулевого регистра вёздочкой обозначено когда оно не будет обращаться к IDE интерфейсу, а будет записывать вспомогательные регистры - один на выход по адресу 0 и второй на вход по адресу 1 (при этом обязательно сначала работать с младшим байтом, а потом со старшим).
Я тут за главного - если что шлите мыло на me собака shaos точка net
User avatar
HardWareMan
Banned
Posts: 2139
Joined: 20 Mar 2005 13:41
Location: От туда

Post by HardWareMan »

He3HauKo wrote:Прошу прощения!
Немножко ошибся, имелось виду команды управления винчестером такие как: пароль, установка уровня шума, остановка шпинделя и тд.

Вот здесь есть описание стандартов ATA, неплохо заиметь на Русском, хотя бы описание ATA-1 :-?
Я вас умоляю. Вот вам ATA6 (не весь, правда, но большинство что нужно) и книжка, которая есть у меня в бумажном виде: Программирование дисковых подсистем. Про нее я уже тут говорил, она, как говориться "маст хэв". К ней диск идет, если интересно, могу подкинуть тоже.
User avatar
MC68k
Retired
Posts: 1328
Joined: 25 Jul 2011 00:14
Location: WWW

Post by MC68k »

User avatar
Lavr
Supreme God
Posts: 16689
Joined: 21 Oct 2009 08:08
Location: Россия

IDE2LPT

Post by Lavr »

А никто не пробовал поиграться вот с такой штукой - IDE2LPT ?

Она как бы известна давно, и ПО её постепенно развивалось...

Сам я не рискнул делать, поскольку пока была необходимость в такой штуке -
с ней пришлось бы таскать отдельный блок питания и драйвер...

А потом уже с ЮСБ-интерфейсом внешние жесткие диски появились.
Но конструкция всё-равно кажется интересной...
iLavr
vinxru
Retired
Posts: 587
Joined: 27 Mar 2013 04:55
Location: 62.192.229.16

Post by vinxru »

Друзья собирали, работало.
User avatar
Shaos
Admin
Posts: 24080
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

Post by Shaos »

У меня валяется промышленный LPT2IDE в корпусе куда винт втыкается - с драйверами под дос ;)

Я на нём винт для Спринтера готовил в 2004 году...
Я тут за главного - если что шлите мыло на me собака shaos точка net