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

ОГЛАВЛЕНИЕ



   Остальные два регистра содержат адрес буфера в памяти, с кото-
рым  будет  происходить обмен данными.  Этот адрес  задается  как
20-битное число, поэтому, например,  адрес 3000:ABCD задается как
3ABCD.  Младшие 16 битов посылаются в регистр адреса, который для
канала 2 имеет адрес порта 04H.  Сначала посылается младший байт.
Старшие  4  бита  идут в регистр страницы, который для  канала  2
имеет адрес порта 81H.  Когда байт посылается по этому адресу, то
имеют  значение  только 4 младших бита.  Если буфер  создается  в
сегменте данных, то Вам  нужно  сложить  значение  DS  и смещение
буфера для получения 20-битного значения. Сложение может привести
к переносу в значение регистра страницы.  Например, если DS равен
1F00H,  а смещение буфера - 2000H, то результирующий адрес  будет
равен 1F00 + 2000 = 21000H.
   После того как эти три регистра  установлены, пошлите 2 в порт
с адресом 0AH, чтобы разрешить канал 2.  Это оставляет микросхему
DMA в состоянии ожидания данных от накопителя, а программа должна
немедленно начать посылку командных байтов в контроллер НГМД. Вот
краткий перечень шагов при программировании микросхемы 8237:

1. Послать код чтения или записи.
2.  Вычислить 20-битный адрес памяти буфера, в который будут пос-
ланы данные, и заслать его в регистры адреса и страницы канала 2.
3.  Поместить значение числа передаваемых  байтов (минус 1) в ре-
гистр счетчика канала 2.
4. Разрешить канал.

   После посылки  командных  байтов,  снова ожидайте прерывания и
обращайтесь  с  ним так же, как и после операции  поиска.   Затем
прочитайте байты статуса. Они таковы:

   Операция    # байта      Функция

   Поиск         нет

   Чтение         1        байт статуса 0
                  2        байт статуса 1

                  3        байт статуса 2
                  4        номер дорожки
                  5        номер головки
                  6        номер сектора
                  7        код байтов на сектор (0-3)

   Запись       1-7        то же, что и для чтения

Вот значения битов трех байтов статуса:

Байт статуса 0:
   биты 7-6   00 = нормальное завершение
              01 = начато выполнение, не может завершиться
              10 = неверная команда
              11 = невыполнено, т.к. накопитель не подключен
          5   1 = выполняется операция поиска
          4   1 = ошибка накопителя
          3   1 = накопитель не готов
          2   номер выбранной головки
        1-0   номер выбранного накопителя

Байт статуса 1:
   бит 7   1 = номер затребованного сектора больше максимума
       6   не используется (всегда 0)
       5   1 = ошибка передачи данных
       4   1 = переполнение данных
       3   не используется (всегда 0)
       2   1 = не может найти или прочитать сектор
       1   1 = не может записать из-за защиты от записи
       0   1 = отсутствует адресная метка при форматизации

Байт статуса 2:
   бит 7   не используется (всегда 0)
       6   1 = встречена адресная метка удаленных данных
       5   1 = ошибка циклического контроля четности данных
       4   1 = проблема с идентификацией дорожки
       3   1 = условие команды сканирования удовлетворено
       2   1 = условие команды сканирования не удовлетворено
       1   1 = плохая дорожка
       0   1 = отсутствует адресная метка

   Как Вы видите большая часть информации  относится к форматиро-
ванию диска, которое нас в настоящий момент не интересует. Однако
имеется еще четвертый  байт  статуса,  который  содержит полезную
информацию:

Байт статуса 3:
   бит 7   1 = ошибка накопителя
       6   1 = диск защищен от записи
       5   1 = накопитель готов
       4   1 = текущая позиция головки известна
       3   1 = дискета двухсторонняя
       2   номер выбранной головки
     1-0   номер выбранного накопителя

Вы можете получить этот четвертый байт статуса, послав контролле-
ру НГМД команду  "Определи  статус  накопителя" (Sense Drive Sta-
tus).  Первый байт этой двухбайтной команды это число 4, а второй
байт содержит номер накопителя  в  битах 1 и 0, и номер головки в
бите  2.   Единственным результатом этой операции  является  байт
статуса 3.  Отметим, что после  каждой дисковой операции, если Вы
используете  процедуры DOS или BIOS, результирующие байты статуса
помещаются в область  данных  BIOS,  начиная  с адреса 0040:0042.
Операционная  система хранит также байт статуса дискеты по адресу
0040:0041, значение битов которого следующее:

   Значение бита             Ошибка

        80H           нет ответа на присоединение накопителя
        40H           операция поиска неуспешна
        20H           ошибка контроллера НГМД
        10H           ошибка данных при чтении (ошибка CRC)
        09H           попытка прямого доступа за границу 64K
        08H           переполнение DMA
        04H           затребованный сектор не найден
        02H           не найдена адресная марка
        01H           послана неверная команда контроллеру НГМД