Справочник программиста на персональном компьютере фирмы IBM. Дисковые накопители - Программирование контроллера НГМД 765 и микросхемы прямого доступа к памяти 8237
ОГЛАВЛЕНИЕ
5.4.1 Программирование контроллера НГМД 765 и микросхемы прямого доступа к памяти 8237.
Микросхема контроллера НГМД 765 фирмы NEC управляет мотором и
головками накопителя на дискетах и обрабатывает потоки данных,
направляемые в или из дисковых секторов. Один контроллер, уста-
новленный на плате адаптора дисков, может обслуживать до четырех
НГМД. За исключением случаев, связанных с защитой от копирования,
программистам не приходится программировать микросхему контролле-
ра НГМД прямо. Процедуры работы с дисками, предоставляемые DOS и
BIOS эффективны и удобны, кроме того, очень рисковано писать свои
собственные процедуры, поскольку ошибки в них могут разрушить
дисковый каталог или таблицу размещения файлов, что вызовет пол-
ное разрушение информации на диске.
Нижеследующее обсуждение служит цели дать Вам только общее
представление. Листинг ROM-BIOS, приведенный в конце каждого
технического руководства по MS DOS, содержит код тщательно разра-
ботанных процедур для форматирования дискет, чтения и записи
секторов, а также сброса и получения статуса накопителей. После
того, как Вы усвоите приведенный здесь материал, изучите процеду-
ры ROM-BIOS для продолжения Вашего образования в области операций
с дисками на низком уровне. Вам потребуется также документация по
микросхеме контроллера НГМД 8272A фирмы Intel, которая аналогична
микросхеме фирмы NEC. В данной документации перечислены прерыва-
ния, генерируемые контроллером НГМД, в то время как в документа-
ции по IBM PC этого списка нет. Информация о микросхеме 8272A
может быть найдена во втором томе Справочника по компонентам
микросистем (Microsystem Components Handbook).
Контроллер НГМД может выполнять 15 операций, из которых здесь
будут обсуждаться только три: операции поиска и чтения или записи
одного сектора. Понимание того как они работают позволит Вам
выполнить любую из оставшихся двенадцати, при условии, что у Вас
будет вышеупомянутая информация. Чтение файла состоит в поиске
его в каталоге [5.2.1], определении его положения на диске с
помощью таблицы размещения файлов [5.1.1] и затем наборе операций
чтения одного сектора. Эта процедура включает 6 шагов:
1. Включение мотора и короткое ожидание, пока он наберет обороты.
2. Выполнение операции поиска и ожидание прерывания, указывающего
на завершение этой операции.
3. Инициализация микросхемы DMA для пересылки данных в память.
4. Посылка команды чтения контроллеру НГМД и ожидание прерывания,
указывающего, что пересылка данных завершена.
5. Получение информации о статусе контроллера НГМД.
6. Выключение мотора.
Контроллер НГМД работает через три порта ввода/вывода. На
самом деле микросхема имеет больше, чем три регистра, но доступ
к большинству из них осуществляется через один порт. Эти три
порта такие:
3F2H регистр цифрового вывода
3F4H регистр статуса
3F5H регистр данных
Первый шаг состоит в доступе к регистру цифрового вывода.
Значение его битов следующее:
биты 1-0 выбор накопителя, где 00 = A
01 = B
10 = C
11 = D
2 0 = сброс контроллера НГМД
3 1 = разрешение прерывания FDC и доступа DMA
7-4 1 = включение мотора накопителя D-A (бит 4 = A)
Это регистр только для записи, поэтому необходимо заботиться обо
всех его битах. В нижеприведенном примере используется накопитель
A, поэтому цепочка битов должна выглядеть 00011100. Такая уста-
новка битов выбирает накопитель A, сохраняет установленным бит 2,
разрешающий работу с НГМД и включает мотор накопителя A. Не сбра-
сывайте бит 2 в ноль, так как в этом случае Вам придется произво-
дить перекалибровку накопителя, действие, которое необходимо
очень редко.
"Перекалибровка" накопителя подразумевает возврат его головки
на нулевую дорожку. Эта операция осуществляется посылкой простой
последовательности команд контроллеру НГМД. Контроллер НГМД уп-
равляет текущей позицией головки, за счет запоминания всех изме-
нений позиции головки после ее начальной установки на нулевую
дорожку. Когда контроллер НГМД сбрасывается, за счет изменения
бита 2 регистра цифрового вывода, то значение текущей позиции
головки устанавливается в ноль, независимо от того, на какой
дорожке находится головка на самом деле, что делает необходимым
перекалибровку. Обычно сброс контроллера НГМД производится только
в случае такой серьезной ошибки накопителя, после которой неиз-
вестно текущее состояние контроллера НГМД и накопителя.
Отметим, что выбор накопителя и включение его мотора - это
отдельные действия. Контроллер НГМД может иметь доступ только к
одному накопителю в данный момент времени, но мотры могут быть
включены у нескольких. Моторы могут оставаться включенными еще
несколько секунд после завершения обмена данными, в ожидании
следующего доступа к накопителю. Такая стратегия позволяет избе-
жать потери времени на повторное ожидание пока мотор наберет
скорость. Напротив, мотор нельзя оставлять постоянно включенным,
так как это приведет к преждевременному износу дискет.
Работа микросхемы контроллера НГМД разделяется на три фазы:
командная фаза, фаза выполнения и фаза результата. В командной
фазе один или более байтов посылаются в регистр данных. Последо-
вательность байтов строго фиксирована и она меняется от команды к
команде. Затем контроллер НГМД выполняет команду и в это время он
находится в фазе выполнения. Наконец, во время фазы результата,
ряд байтов статуса считываются из регистра данных. При этом обя-
зательно, чтобы не было ошибки в числе передаваемых или считывае-
мых данных в регистр данных в фазах командной и результата.
Число байтов команды и результата меняется в зависимости от
выполняемой контроллером дисковой операции. В техническом руко-
водстве по IBM PC приведены данные для всех 15 операций. Первый
байт команды является кодом, определяющим требуемую операцию.
Номер кода содержится в младших 5-ти битах байта и в некоторых
случаях в старших трех битах закодирована добавочная информация.
В большинстве случаев второй байт команды содержит номер накопи-
теля (0-3) в младших двух битах и номер головки (0 или 1) в бите
2, все остальные биты игнорируются контроллером НГМД. При опера-
ции поиска требуется дополнительно еще только один байт, в кото-
ром должен содержаться номер новой дорожки. Чтение или запись
сектора требует семи дополнительных командных байтов, которые
идентичны в этих двух случаях. Байты с третьего по пятый содержат
текущий номер дорожки, номер головки и номер сектора. За ними
следуют четыре байта, содержащие техническую информацию, необхо-
димую для контроллера НГМД.