Краткое описание портов и битов
контроллера Hard drive.
(С) Slot & Со
(R) Valerij KozHevnikov
(500:95/462.18@ZXNet)
-----------------------------------------
АМ - адресный маркер
CRC,КЦК - контрольно-циклический код
HOST - управляющий компьютер
ЕСС - код обнаружения ошибки
Конструктивно контроллер содержит два
девайса: контроллер ОЗУ 512k и контроллер
HDD. На той же платке есть еще контроллер
ХТ клавы, но он абсолютно независим и тут
не описывается.
#FCAF (out) - управление конфигурацией
контроллера.
bit 7,1 - старшие биты, формирующие но-
мер видеостраницы выводимой в режиме
640*200.
bit 0 - (=1) подключение порта конфигу-
рации ОЗУ 512k.
bit 4 - (=1) блокировка reset-а порта
конфигурации контроллера.
bit 5 - (=1) блокировка записи и чтения
всех портов контроллера.
bit 6 - (=1) аппаратный reset HDD.
#FDAF (out) - порт конфигурации ОЗУ.
Полностью приводить не буду, но факти-
чески можно иметь 4 независимых 128-х ма-
шины. То есть в любой из трех нижних сег-
ментов может подставляться одна из четы-
рех страниц, а с адреса #С000 - любая из
32-х имеющихся.
+---------+-------------+
| Сегмент | Страницы |
+---------+-------------+
| #0000 | 0,8,16,24 |
| | |
| #4000 | 5,13,21,29 |
| | |
| #8000 | 2,10,18,26 |
| | |
| #С000 | любая |
+---------+-------------+
Далее все про винт. Сразу скажу: злоу-
потреблять програмными/аппаратными резе-
тами не стоит. Винт паркует головы и дви-
гатель отрабатывает останов/разгон. Жизни
ему это не прибавит. Я вообще аппаратный
ресет исключил: оторвал 1-й контакт от
шлейфа, и все О`К.
+-----+--------------------------+--------------------------+
| | IN | OUT |
+=====+==========================+==========================+
|#FDAF|Регистр данных D8-D15 | пот used |
|#FFAF| пот used |Регистр данных D8-D15 |
|#FEAF|Регистр данных DO-D7 |Регистр данных DO-D7 |
|#F6AF|Регистр ошибок |Регистр предкоипенсацuu |
|#EEAF|Регистр счетчика секторов |Регистр счетчика секторов |
|#E6AF|Регистр ноиера сектора |Регистр ноиера сектора |
|#DEAF|Регистр ноиера цилиндра |Регистр ноиера цилиндра |
| | (low) | (low) |
|#D6AF|Регистр ноиера цилиндра |Регистр ноиера цилиндра |
| | (high) | (high) |
|#CEAF|Регистр накопителя/головки|Регистр накопителя/головки|
|#C6AF|Регистр состояния |Регистр коианд |
+-----+--------------------------+--------------------------+
|#CAAF|Регистр алютернатuвного |Управление состоянuеи на- |
| |состояния |копителя |
|#C2AF|Регистр адреса накопителя | пот used |
+-----+--------------------------+--------------------------+
Регистры данных #FDAF, #FEAF, #FFAF
используются при выполнении операций чте-
ния/записи сектора в программном режиме
ввода-вывода. Регистр #FEAF недоступен,
пока не начнется операция чтения или за-
писи. Передача данных осуществляется 16 -
разрядными словами. При чтении из порта
#FDAF считываются разряды D8-D15 регистра
данных HDD. Для их корректного считывания
предварительно необходимо считать разряды
D0-D7 (порт #FEAF) регистра данных HDD.
При записи сначала заносят D8-D15 в порт
#FFAF, затем D0-D7 в порт #FEAF.
При выполнении длинных операций чтени-
я/записи (когда вместе с данными переда-
ются байты КЦК) 4 байта ЕСС передаются
байтами, перед передачей байтов ЕСС пов-
торно устанавливается бит 3 "Data
request" регистра состояния.
* Такой способ передачи данных принят
из-за того, что размер слова для HDD IDE
- 16 бит, а размер шины - 8 бит. Поэтому
одно слово данных передается/принимается
двумя командами IN/OUT. Однако для уско-
рения операций ввода-вывода, адреса пор-
тов расположены таким образом, что воз-
можно использование команд INI/OUTI.
Например, чтение одного слова:
LD HL,BUFFER
LD ВС,#FEAF
INI
INI
или запись:
LD HL,BUFFER
LD ВС,#OOAF
OUTI
OUTI
* Адрес #OOAF взят из-за того, что ко-
манда OUTI делает DEC В до пересылки в
порт.
Регистр ошибок #FбAF (in) определяет
состояное HDD после выполнения операции.
Состояное этого регистра действительно:
- после выполнения команды, если уста-
новлен бит "Еггог" в регистре состояния.
- после выполнения команды "диагностика"
или после выполнения внутренней диагнос-
тики HDD по системному сбросу.
В диагностическом режиме коды регистра
ошибок определяют следующее:
#01 нет ошибки
#02 ошибка микроконтроллера
#03 ошибка буферного ОЗУ
#04 ошибка аппаратуры ЕСС
#05 ошибка микропроцессора
#8х готовь гроб, копай могилу нахрен
(HDD неисправен).
Значения битов регистра ошибок после
выполнения команды:
+-------+-------+------+-------+------+-------+------+------+
| 7 | 6 | 5 | 4 | 3 | 2 | 1 | О |
+-------+-------+------+-------+------+-------+------+------+
| BBK | UNC | О | IDNF | О | ABRT | TONF | AMNF |
+-------+-------+------+-------+------+-------+------+------+
bit 0 - Data Adress Mark Not Found - ус-
танавливается во время выполнения команды
"чтение сектора", если адресный маркер
данных сектора не найден после правильно-
го нахождения идентификатора этого секто-
ра.
bit 1 - Track 0 Not Found - устанавлива-
ется только в команде "рекалибровка", ес-
ли после 2048 шагов не обнаружена дорожка
0.
bit 2 - Aborted Command - устанавливает-
ся при получении из HDD состояния "Write
fault", "Not seek complete", "Drive пот
ready" или когда была загружена не-
действительная команда. Причина ошибки
может быть определена из регистров состо-
яния и ошибки.
bit 3 - пот used (=0)
bit 4 - ID Not Found - требуемые ци-
линдр, головка, сектор не могут быть об-
наружены или же произошла ошибка ЕСС в
поле идентификатора.
bit 5 - пот used (=0)
bit 6 - Uncorrect Data - ошибка ЕСС в
поле данных. Устанавливается в случае не-
корректируемой ошибки.
bit 7 - Bad Mark Block - в идентификато-
ре обнаружена метка дефектного сектора.
Регистр предкомпенсации #FбAF (out)
использовался для указания номера ци-
линдра с которого необходимо выполнить
предкомпенсацию. В современных моделях
предкомпенсацией управляет сам накопи-
тель, поэтому данный регистр может ис-
пользоваться для других целей.
Регистр счетчика секторов #EEAF содер-
жит количество секторов для операций чте-
ния/записи. Значение этого регистра
уменьшается на 1 при обработке каждого
сектора. Передача 1 сектора происходит
при значении 1, при значении 0 - 256 сек-
торов. Если при выполнении мультисектор-
ной передачи произошла ошибка записи или
чтения очередного сектора, то передача
прекращается, и в регистре счетчика сек-
торов находится кол-во секторов, которое
осталось после обнаружения ошибки. При
успешном завершении команды содержит 0.
Регистр номера сектора #E6AF содержит
стартовый номер сектора для операций чте-
ния-записи. После обработки каждого сек-
тора содержимое инкрементируется. После
завершения команды содержит номер послед-
него обработанного сектора или номер сек-
тора в котором произошла ошибка.
Регистры младшего #DEAF и старшего
#DбAF байтов номера цилиндра определяют
цилиндр, для которого будет выполняться
данная команда.
Регистр накопителя/головки #CEAF (in/
out) имеет вид:
+-------+-------+------+-------+------+-------+------+------+
| 7 | 6 | 5 | 4 | 3 | 2 | 1 | О |
+-------+-------+------+-------+------+-------+------+------+
| 1 | О | 1 | DRV | HS3 | HS2 | HS1 | HSO |
+-------+-------+------+-------+------+-------+------+------+
bit 0-3 - двоичный код выбранной головки
bit 4 - выбор HDD, 0 - накопитель 0
1 - накопитель 1
bit 5,6 - размер сектора:
00 резерв
01 резерв
10 512 байт/сектор.
11 резерв
bit 7 - резерв
Регистр состояния #C6AF (in) отобража-
ет текущее состояние HDD. Значение этого
регистра обновляется после выполнения
каждой команды. Если установлен бит BSY
этого регистра, то любые обращения к HDD
запрещены, и значения остальных битов не-
действительны. Чтение этого регистра
сбрасывает аппаратное прерывание IRQ14 (в
данной схеме это прерывание не использу-
ется).
Значения битов:
+-------+-------+------+-------+------+-------+------+------+
| 7 | 6 | 5 | 4 | 3 | 2 | 1 | О |
+-------+-------+------+-------+------+-------+------+------+
| BSY | DRDY | WFT | DSC | DRQ | CORR | INЧ | ERR |
+-------+-------+------+-------+------+-------+------+------+
bit 0 - Еггог - индицирует, что предыду-
щая команда закончилась с ошибкой, и один
или несколько битов установлены в ре-
гистре ошибок. Используется для быстрой
проверки успешного завершения команды.
Сбрасывается, когда в регистр команд за-
сылается новая команда.
bit 1 - Index - устанавливается в 1 при
каждом обороте пакета блинов. В современ-
ных моделях не используется.
bit 2 - Corrected Data - индицирует, что
при чтении данных произошла ошибка, кото-
рая была успешно скорректирована аппара-
турой КЦК. Корректируемые ошибки не прек-
ращают мультисекторную передачу.
bit 3 - Data Request - этот бит показы-
вает, что имеется запрос на обмен данными
с буфером сектора при выполнении команд
чтения-записи. По этому запросу необходи-
мо прочитать/записать данные в буфер, в
зависимости от выполняемой команды. (в
данной схеме, бит схожий с этим (27-й
контакт разъема) управляет сигналом /Wait
CPU Z80).
bit 4 - Drive Seek Complete - индициру-
ет, что головки завершили операцию поис-
ка.
bit 5 - Write Fault - индицирует не-
исправность в накопителе, или попытку ис-
полнить команду "запись" с некорректными
параметрами.
bit 6 - Drive Ready - установленный в 1
означает готовность HDD к выполнению ко-
манды.
bit 7 - Busy - определяет состояние HDD.
Устанавливается в 1 при выполнении коман-
ды или диагностики после системного сбро-
са. Когда этот бит установлен, никакие
другие биты регистра состояния не являют-
ся действительными. Бит Busy должен быть
проверен перед чтением любого регистра
состояния.
Регистр команд #C6AF (out) использует-
ся для загрузки выполняемой команды. Пе-
ред записью команды необходимо подгото-
вить файл задания - Task File (записать
необходимые данные в порты #EEAF, #E6AF,
#DEAF, #DбAF, #CEAF), когда HDD находится
в состоянии "не занят" (Busy = 0). Выпол-
нение команды начинается немедленно, с
момента записи в регистр команд.
Регистр альтернативного состояния
#CAAF (in) содержит такую же информацию,
что и основной. Различие в том, что чте-
ние альтернативного регистра не сбрасыва-
ет установленное прерывание IRQ14. (В
данной схеме IRQ14 не используется).
Регистр управления состоянием #CAAF
(out) содержит три управляющих бита:
+-------+-------+------+------+-------+-------+------+------+
| 7 | 6 | 5 | 4 | 3 | 2 | 1 | О |
+-------+-------+------+------+-------+-------+------+------+
| | | | | HS3EN | SRST | /IEN | |
+-------+-------+------+------+-------+-------+------+------+
bit 1 - Interrupt Enable - бит разреше-
ния прерывания от HDD к HOST. Когда этот
бит активен и накопитель выбран, HOST
прерывается. Сигнал к HOST IRQ14 должен
быть разрешен через трехстабильный буфер.
Когда этот бит не активен или HDD не выб-
ран, сигнал HOST IRQ14 будет иметь высо-
кий уровень. (В данной схеме это прерыва-
ние не используется).
bit 2 - Soft Reset - программный сброс.
Для сброса HDD этот бит надо установить в
1 и затем сбросить в 0.
bit 3 - Heads 3 Enable - используется
для разрешения выбора головок с 8 по 15.
Регистр адреса накопителя #С2AF (in)
содержит номера головки и накопителя,
выбранные предыдущей командой.
+-------+-------+------+-------+------+------+------+------+
| 7 | 6 | 5 | 4 | 3 | 2 | 1 | О |
+-------+-------+------+-------+------+------+------+------+
| | /WTG | /HS3 | /HS2 | /HS1 | /HSO | /DS1 | /DSO |
+-------+-------+------+-------+------+------+------+------+
bit 0,1 - Drive Select - биты выбора со-
ответствующего накопителя 0 или 1.
bit 2,3,4,5 - Head Select - двоичный код
выбранной головки.
bit 6 - Write Gate - бит выполнения за-
писи, активен во время операции записи.
-----
Краткое описание команд HDD IDE.
Команды из Host записываются в регистр
команд #C6AF и выполняются немедленно.
Перед записью команды в регистрах #EEAF,
#E6AF, #DEAF, #DбAF, #CEAF надо сформиро-
вать файл задания (task file), который
содержит данные, необходимые для выполне-
ния команды. Коды команд приведены в таб-
лице:
+---------------------+------+------------------------------+
| | | Uсполюзyеиые регистры |
| Kоианда | Код +-----+-----+-----+-----+------+
| | |#EEAF|#E6AF|#DEAF|#D6AF|#CEAF |
+=====================+======+=====+=====+=====+=====+======+
| Внутренняя | #9О | | | | | D |
| диагностика | | | | | | |
| | | | | | | |
| Фориатuрованuе | #5О | Y | | Y | Y | Y |
| дорожки | | | | | | |
| | | | | | | |
| Uдентuфuкацuя | #EC | | | | | D |
| HDD | | | | | | |
| | | | | | | |
| Uнuцuалuзацuя | #91 | Y | | | | Y |
| параиетров HDD | | | | | | |
| | | | | | | |
| Рекалибровка | #1О | | | | | D |
| | | | | | | |
| Чтение буфера | #E4 | | | | | D |
| | | | | | | |
| Чтение сектора(ов) | #2Ч | Y | Y | Y | Y | Y |
| | | | | | | |
| Верификация | #41 | Y | Y | Y | Y | Y |
| | | | | | | |
| Позиционирование | #7О | | Y | Y | Y | Y |
| | | | | | | |
| Запuсю буфера | #E8 | | | | | D |
| | | | | | | |
| Запuсю сектора(ов) | #3Ч | Y | Y | Y | Y | Y |
| | | | | | | |
| Sleep (спатю) | #E6 | | | | | |
| | | | | | | |
+---------------------+------+-----+-----+-----+-----+------+
Y - регистр используется.
D - в регистре #CEAF (выбор накопителя
и головки) используется только выбор на-
копителя.
X - младшая тетрада команд чтения и за-
писи сектора.
X = %OOlr
l - отвечает за режим длинной опера-
ции.
l=0 - нормальный режим, выполняются
функции CRC или ЕСС.
l=1 - режим длинной операции. Не вы-
рабатываются байты CRC или ЕСС, возникно-
вение ошибок в поле данных не проверяет-
ся. При чтении/записи сектора, добавляют-
ся 4 байта КЦК пользователя.
r - режим повторения при возникнове-
нии ошибки.
r=0 повторение разрешено
r=1 повторение запрещено
Внутренняя диагностика (#90) - выпол-
няется внутренняя диагностика HDD, по
окончании которой в регистре ошибок фор-
мируется код завершения. Если ошибок нет,
код завершения #01.
Форматирование дорожки (#50) - по этой
команде записывается формат нижнего уров-
ня на указанную дорожку HDD. У многих на-
копителей IDE форматирование дорожки про-
изводится при включении технологического
режима.
Идентификация HDD (#ЕС) - по этой ко-
манде в секторный буфер считывается пас-
порт диска и формируется запрос DRQ в ре-
гистре состояния.
Инициализация параметров HDD (#91) -
по этой команде HDD настраивается на па-
раметры задаваемые накопителю из Host.
Данная команда должна выполняться после
"сброса" HDD.
Рекалибровка (#10) - по этой команде
головки HDD устанавливаются на 0-й ци-
линдр.
Чтение буфера (#Е4) - по этой команде
устанавливается запрос DRQ в регистре
состояния. Host может прочитать содержи-
мое буфера (256 слов) через регистры дан-
ных.
Чтение сектора(ов) (#2X) - по этой ко-
манде заданный сектор считывается в сек-
торный буфер (обычно 512 байт). и форми-
руется запрос DRQ. Host может прочитать
содержимое буфера (256 слов) через ре-
гистры данных. В команде могут быть уста-
новлены биты l и/или r. Содержимое ре-
гистра #EEAF указывает на количество счи-
тываемых секторов (если #EEAF = 0 то счи-
тывается 256 секторов). Содержимое ре-
гистра #E6AF указывает начальный сектор.
Верификация (#41) - проверяется формат
указанной дорожки.
Позиционирование (#70) - головки HDD
устанавливаются на указанный цилиндр.
Запись буфера (#Е8) - устанавливается
запрос DRQ в регистре состояния, после
этого Host должен переслать 256 слов че-
рез регистры данных.
Запись сектора(ов) (#3X) - устанавли-
вается запрос DRQ в регистре состояния, и
Host должен переслать 256 слов через ре-
гистры данных. После этого данные записы-
ваются на магнитный диск. В команде могут
быть установлены биты l и/или r. Содержи-
мое регистра #EEAF указывает на коли-
чество записываемых секторов (если #EEAF
= 0 то записывается 256 секторов). Содер-
жимое регистра #E6AF указывает начальный
сектор.
Sleep (спать) (#Е6) - парковка голо-
вок, останов двигателя "блинов" и переход
в режим пониженного энергопотребления.
Любая другая команда прерывает команду
sleep. В старых моделях не поддерживает-
ся.
-----
Адресация регистров HDD IDE.
Для адресации регистров HDD IDE в
ZX-NEXT используются сигналы:
A5,A6,A7,A8,A9 - (селектирующие линии)
формируют базовый адрес регистров HDD.
A10,A11,A12,A13 - (соадресные линии) ис-
пользуются при выборе регистров HDD.
/WR - строб записи данных в регистры.
/RD - строб чтения данных из регистров.
Для выбора регистров:
A5,A7,A9 = 1
A6,A8 = 0
Состояние других сигналов показано в
таблице.
+-----+-----+-----+-----+-----------------+-----------------+
| А1О | А11 | А12 | А13 | Чтение регистров| Запuсю регистров|
| | | | | по сигналу /RD | по сигналу /WR |
+=====+=====+=====+=====+=================+=================+
| О | О | О | О | #C2AF | - |
| О | 1 | О | О | #CAAF | #CAAF |
| 1 | О | О | О | #C6AF | #C6AF |
| 1 | 1 | О | О | #CEAF | #CEAF |
| 1 | О | 1 | О | #D6AF | #D6AF |
| 1 | 1 | 1 | О | #DEAF | #DEAF |
| 1 | О | О | 1 | #E6AF | #E6AF |
| 1 | 1 | О | 1 | #EEAF | #EEAF |
| 1 | О | 1 | 1 | #F6AF | #F6AF |
| 1 | 1 | 1 | 1 | #FEAF | #FEAF |
+-----+-----+-----+-----+-----------------+-----------------+
-----
Формат паспорта Hdd (512 байт).
Все числа Нех.
+------+--------+-------------------------------------------+
| Addr | Length | Значение |
+------+--------+-------------------------------------------+
| ООО | О2 | Главное слово конфигурации |
| ОО2 | О2 | Количество цилиндров |
| ООЧ | О2 | Зарезервировано |
| ООб | О2 | Количество головок |
| ОО8 | О2 | Кол-во байт на дорожке |
| ООА | О2 | Кол-во байт в секторе |
| OOC | О2 | Кол-во секторов на дорожке |
| OOE | О6 | Спецификация продавца |
| О14 | 14 | Серийный ноиер (ASCII) |
| О28 | О2 | Тип контроллера |
| О2А | О2 | Eикостю буфера (кэша) деленая на #2ОО байт|
| О2C | О2 | Значение кода ECC для коианд Long Rd/Wr |
| О2E | О8 | Версия рабочих програии (ASCII) |
| О36 | 26 | Моделю (ASCII) |
+------+--------+-------------------------------------------+
Дальше каждый производитель волен впи-
сывать что угодно. У меня далее одни ну-
ли.
Слово - два байта, младший/старший.
ЕСС - Еггог Control Code.
Из-за непонятных стандартов, ASCII
выглядит в паспорте не совсем понятно.
Модель stЗ144AT смотрится как ts1344TA.
Значит, если понадобится вывести сие на
экран, нужно поменять местами первый байт
со вторым, третий с четвертым и т.д. до
конца строки.
Для понятности терминологии:
Дисковод: Мой винт:
80 цилиндров 1001 цилиндр
2 головки 15 головок
16 секторов/трек 17 секторов/трек
256 байт/сектор 512 байт/сектор
-----
Схема подключения HDD IDE к ZX SPECTRUM.
Схема имеет огромный размер и набрана
в условной графике обычным текстовым ре-
дактором, поэтому здесь ее нет. Но она
есть в приложении, так что ищите там.
Здесь только комментарии :(
Все микрухи - серии 1533.
D1 ИД7
D2 ЛЕ1
D3 ЛЛ1
D4 АПб
D5 ТМ9
D8 ЛП8
D9 ЛН1
D10 ЛИ1
D11,12 ИР23
D10 в принципе можно не ставить, она
чисто буферизующая, но я бы не стал сое-
динять напрямую шины компа и винта. D6 и
D7 отвечают за управление памятью 512k и
на схеме не показаны. Микрухи были вычис-
лены мной по памяти со справочником в ру-
ках. Диоды - любые маломощные, например
КДS22. Неуказанные номиналы резисторов
некритичны, подбираются на глаз, в диапа-
зоне 1.5 - 10 k. Схему я распечатал, и
долго сравнивал с оригиналом, глюков вро-
де не нашел. Транзистор VT1 отвечает за
блокировку аппаратного ресета порта
#FCAF. Можно поставить любой подходящий.
Сбросить винт можно аппаратно (битом 6
регистра #FCAF), либо через soft reset в
регистре управления состоянием (бит 2 в
#CAAF). При ресете винт паркует головы и
отрабатывает останов/разгон двигателя, а
это ему никакой пользы не приносит. У ме-
ня винт нельзя сбросить аппаратно (ресет
на шлейфе перекушен), и все рулезз.
Единственный способ полностью остановить
движок - команда "sleep", т.е. "спать",
так что все ОК.
Other articles: