Справочник программиста на персональном компьютере фирмы IBM. Дисковые накопители
Страница 28. Программирование контроллера НГМД 765 и микросхемы прямого доступа к памяти 8237. Часть 2




   Первый байт этой  технической  информации  относится  к  числу
байтов в секторе, которое кодируется как 0 для 128, 1 для 256,  2
для 512 и 3 для 1024. Конечно  дискеты,  созданные в MS DOS имеют
сектора размером 512 байт. Затем идут данные конца дорожки (EOT),
которые дают максимальный номер сектора  для цилиндра; это значе-
ние  равно 9 для дискет емкостью 360K.  Наконец, идет байт дающий
длину сдвига (GPL, равный 2AH) и длину  данных (DTL, равный FFH).
Техническое  руководство  по IBM PC содержит  таблицу, в  которой
объясняются другие вхожные  параметры,  например  те, которые ис-
пользуются при форматировании диска.  MS DOS хранит четыре техни-
ческих параметра в  памяти,  в  специальной  таблице  параметров,
называемой базой диска (disk base).  Вектор прерывания 1EH указы-
вает на эту таблицу.  Четыре  значения  хранятся в том порядке, в
котором  они  должны быть переданы контроллеру НГМД,  начиная  со
смещения 3. В следующей таблице показана командная последователь-
ность для трех операций, используемых в нижеприведенном  примере.
В цепочках битов черех X  обозначены биты, значение которых несу-
щественно,  через H - номер головки, а через DD - номер накопите-
ля.

   Операция   # байта   Функция           Установка для головки 0
                                           дорожки 15, сектора 1

   Поиск         1      номер кода 00001111           1FH
                 2      головка и накопитель          00H
                        XXXXXHDD

   Чтение        1      номер кода 01100110           66H
   сектора       2      головка и накопитель          00H
                        XXXXXHDD
                 3      номер дорожки                 0FH
                 4      номер головки                 00H
                 5      номер сектора                 01H
                 6      байтов в секторе              02H
                 7      конец дорожки                 09H
                 8      длина сдвига                  1AH
                 9      длина данных                  FFH

   Запись        1      номер кода 01000101           45H
   сектора     2-9      те же, что и для чтения сектора

   Вы  должны быть уверены, что контроллер НГМД готов прежде  чем
Вы пошлете или прочитаете байт  из  регистра  данных.  Биты 7 и 6
регистра статуса предоставляют эту информацию. Вот значение битов
этого регистра:

биты 3-0    1 = накопитель D-A в режиме поиска
       4    1 = контроллер НГМД выполняет команду чтения/записи
       5    1 = контроллер НГМД не в режиме DMA
       6    1 = регистр данных контроллер НГМД готов к приему
                данных
            0 = готов к посылке данных
       7    1 = контроллер НГМД готов к посылке или приему данных

Перед началом  дисковых  операций  неплохо  проверить,  что бит 6
равен  нулю, индицируя что контроллер НГМД ожидает команду.  Если
он ожидает посылки данных, то произошла ошибка. Когда байт данных
посылается в регистр данных, то бит 7 регистра статуса становится
равным нулю; продолжайте чтение регистра  до тех пор, пока бит не
изменится обратно на 1, а затем посылайте следующий байт команды.
Аналогично, проверяйте этот бит статуса  перед чтением байта ста-
туса  в фазе результата.  Нижеприведенный пример кончается  двумя
процедурами, которые выполняют эти функции.
   Когда операция поиска завершена, то контроллер НГМД инициирует
прерывание 6, прерывание от НГМД. Хотя так же просто можно узнать
об окончании операции поиска  проверяя регистр статуса, в примере
это делается за счет обработки прерывания.  Когда происходит пре-
рывание, то обработчик прерывания  BIOS устанавливает бит 7 байта
статуса  поиска в области данных BIOS, расположенного  по  адресу
0040:003E. Это единственный результат обработки прерывания. Можно
проверять этот байт до тех пор, пока бит 7 не будет установлен, а
затем переходить к следующему шагу операции чтения сектора.
   Следующий шаг состоит в  инициализации микросхеиы прямого дос-
тупа  к  памяти 8237.  Эта микросхема занимается  обменом  данных
между  периферийными  устройствами  и  памятью,  работой, которой
может заниматься также процессор.  На самом деле, в PCjr, где нет
микросхемы DMA, контроллер НГМД  посылает  данные прямо в процес-
сор,  который  в свою очередь пересылает их в  память.   Тактовая
частота процессора  адекватна  этой  задаче, однако при пересылке
данных  все  прерывания  должны быть запрещены, с  тем  чтобы  не
происходило потери данных. Это  означает, что в PCjr при передаче
данных ввод с клавиатуры или из модема запрещен.  Прерывания тай-
мера также  игнорируются,  однако  впоследствии  счетчик  времени
суток  обновляется специальной процедурой, использующей  канал  1
микросхемы таймера  8253  для  подсчета  импульсов,  прошедших за
время дисковых операций.  Все остальные модели IBM PC имеют  мик-
росхему DMA, поэтому процессор свободен при передаче данных.
   IBM PC и XT используют 4-хканальную микросхему DMA 8237. Канал
0  предназначен для "освежения" памяти (memory refresh); он  пос-
тоянно восстанавливает заряд  ячеек  оперативной памяти.  Если Вы
будете  работать по этому каналу, то это приведет скорее всего  к
краху машины. Канал 2  предназначен  для дисковых операций, а два
другие канала, с номерами 1 и 3, доступны (через разъемы расшире-
ния) для  дополнительного  оборудования.  К  сожалению, обмен па-

мять-память требует двух каналов и одним из них должен быть канал
0, поэтому такой обмен недоступен на IBM PC и XT. Однако AT имеет
7  каналов  прямого доступа к памяти и DMA автоматически  исполь-
зуется инструкциями MOVS,  существенно  увеличивая производитель-
ность.
   Перед инициализацией канала программа должна послать в микрос-
хему код, сообщающий будет  ли  происходить  чтение  или запись в
контроллер НГМД.  Этот однобайтный код равен 46H для чтения и 4AH
- для записи. Этот код должен быть послан в каждый из двух портов
с адресами 0BH и 0CH.
   Каждый  канал микросхемы 8237 использует три  регистра.   Один
16-битный регистр, регистр  счетчика, содержит число передаваемых
байтов  данных.  Его величина должна быть на единицу меньше,  чем
требуемое число байтов.   Для  канала  2  доступ к этому регистру
осуществляется через порт 05H; пошлите в него два  последователь-
ных байта, причем сначала младший байт.

 
« Предыдущая статья   Следующая статья »