Страница 27 из 41
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, все остальные биты игнорируются контроллером НГМД. При опера- ции поиска требуется дополнительно еще только один байт, в кото- ром должен содержаться номер новой дорожки. Чтение или запись сектора требует семи дополнительных командных байтов, которые идентичны в этих двух случаях. Байты с третьего по пятый содержат текущий номер дорожки, номер головки и номер сектора. За ними следуют четыре байта, содержащие техническую информацию, необхо- димую для контроллера НГМД.
|