Контроллер НГМД может быть использован и для работы со стриммерами; специально для этого в контроллере имеется регистр TDR
(Tape Drive Register), пара младших битов которого задает номер устройства, которому соответствует стриммер (для него иначе настраиваются цепи ФАПЧ сепаратора данных).
Все операции с дискетами выполняются по командам, посылаемым хостом в регистр DR
(3F5) согласно состоянию битов регистра MSR
(3F4). Запись байта команды или данных в регистр DR разрешается лишь при текущем значении MSR
=10xxxxxxb, чтение — при MSR
=11xxxxxxb. Для записи/чтения этого регистра приходится использовать отдельные подпрограммы, не только дожидающиеся разрешающих значений MSR
, но и имеющие аварийный выход по тайм-ауту. Хост также выполняет запись в регистр DOR
(3F2) для запуска/останова дисковода, а также в CCR
(3F7) или DSR
(3F4) для выбора скорости передачи данных. В операциях обмена данными с дискетами обычно участвует контроллер DMA
, и он должен быть своевременно проинициализирован. Сигнал TC
(завершение цикла DMA) используется как признак завершения фазы данных. В общем виде процедура обмена данными состоит из следующих шагов.
1. Запуск мотора и выбор дисковода (записью в регистр DOR
).
2. Установка скорости (записью в регистр CCR
).
3. Выполнение команды рекалибровки.
4. Ожидание раскрутки двигателя (если мотор работает еще менее 0,5 с).
5. Позиционирование головки на требуемый цилиндр.
6. Инициализация контроллера DMA.
7. Посылка команды чтения/записи.
8. Ожидание прерывания от контроллера. Прерывание произойдет, когда завершится фаза исполнения, во время которой контроллер обычно обменивается данными с хостом. Если за определенное время прерывание не получено, фиксируется неудачная попытка обращения с ошибкой тайм-аута.
9. По прерыванию от контроллера считываются байты результата, и если ошибок нет, на этом обмен успешно завершается. Если есть ошибки, то снова переходят на шаг инициализации DMA и далее повторяют команду чтения/записи. Если за несколько (3) раз успех не достигается, то выполняется рекалибровка, затем инициализация DMA и повторные попытки чтения/записи. Если успех не достигается и после нескольких рекалибровок, обмен прекращается аварийно.
Помимо описанного механизма имеется механизм автоматического выключения мотора НГМД, если к нему долго нет обращения. Для этого в фиксированном месте ОЗУ (BIOS Data Area, ячейка 0:0440) имеется счетчик времени работы мотора НГМД и адрес дисковода (в позиционном коде), мотор которого включен (0:043F). При каждом обращении к дискете (когда в регистре DOR устанавливается бит включения мотора) в счетчик времени заносится константа, соответствующая выдержке на отключение (по умолчанию — 2 с). Обработчик аппаратного прерывания от таймера IRQ0
(BIOS Int 08h
) c интервалом около 55 мс декрементирует счетчик времени и по его обнулению отключает мотор (записью в регистр DOR
). Таким образом, если в течение заданного интервала нет обращений, мотор автоматически выключается. Конечно, это работает, лишь когда BIOS отрабатывает аппаратные прерывания от таймера, так что не отключающийся мотор дисковода может быть косвенным признаком «зависания» компьютера.
Исполнение каждой команды имеет три фазы.
1. Фаза команды . Контроллер устанавливает биты DQM
=1 и DIO
=0, что является приглашением к вводу команды. В регистр DR
посылается байт команды, после которого посылаются байты параметров в строго предписанном порядке. На прием каждого байта контроллер отзывается обнулением DQM
на время обработки. После получения последнего требуемого байта DQM
остается обнуленным и контроллер переходит в фазу исполнения. В качестве параметров фигурируют номер цилиндра С
, номер головки H
, номер сектора R
, код размера N
или длина поля данных сектора DTL
, номер последнего сектора на треке EOT
, число секторов SC
, длительность зазоров GPL
и некоторые другие данные.
2. Фаза исполнения требует передачи данных от хоста к контроллеру или обратно, передача может происходить как в режиме DMA, так и чисто программно (PIO). В режиме DMA обмен выполняется по сигналам DRQ
и DACK#
используемого канала. Если DMA не используется, то запросом на передачу является бит DQM
и сигнал прерывания. По окончании фазы вырабатывается сигнал прерывания (и его признак в регистре ST0
), и контроллер переходит в фазу результата.
Читать дальше