Справочник программиста на персональном компьютере фирмы IBM. Дисковые накопители Страница 29. Программирование контроллера НГМД 765 и микросхемы прямого доступа к памяти 8237. Часть 3
|
Страница 29 из 41
Остальные два регистра содержат адрес буфера в памяти, с кото- рым будет происходить обмен данными. Этот адрес задается как 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 послана неверная команда контроллеру НГМД
|