8.10. Адаптер дисковода

Адаптер дисковода является интерфейсом между микропроцессором и накопителем на гибких магнитных дисках. Схемы, смонтированные на плате этого адаптера, обеспечивают все функции, необходимые для ввода и вывода данных на гибкий диск (дискету). Адаптер обеспечивает также физическое кодирование и декодирование данных, необходимое для использования дискет.

Центральной частью адаптера дисковода фирмы IBM является микросхема контроллера гибкого диска FDC (Floppy Disk Controller) мPD765 фирмы NEC. Эта компонента также производится фирмой Intel как микросхема 8272. Микросхема FDC управляет потоком данных на дискету и с нее. Микросхема FDC имеет два порта ввода-вывода, один для данных, а другой для отражения состояния. Порт данных находится по адресу 3F4H, а порт состояния по адресу 3F5H. Порт данных - двунаправленный, т.е. в различные моменты времени можно и читать данные из этого порта, и записывать их в порт. Регистр состояния можно только читать в любой момент времени. Он сообщает, как в данный момент нужно работать с регистром данных.

В регистре состояния есть 2 бита, которые используются во время работы с дисководом. Бит 6 - это признак ввода-вывода данных (DIO - Data Input/Output). Этот бит сообщает, каких действий в отношении регистра данных ожидает от вас контроллер. Если признак DIO равен 1, микросхема FDC ждет от вас чтения регистра данных. Если DIO равен 0, FDC ждет записи в регистр данных. Бит 7 порта состояния - это бит запроса устройства (RQM - Request For Master). Он аналогичен биту "занято" печатающего устройства. Когда бит RQM содержит 1, микросхема FDC готова к тому, чтобы читался или записывался регистр данных. Если вы не уделите внимание биту RQM, то введете микросхему FDC в заблуждение, и после этого ничего не будет работать.

Регистр данных в действительности не является единственным. Подобно контроллеру 6845, порт данных фактически состоит из группы регистров. Но в отличие от микросхемы 6845, регистра индекса регистров данных здесь нет. Данные, которые вы посылаете в контроллер, должны поступать в определенном порядке. Аналогично, в определенном порядке данные поступают из порта, когда вы их читаете.

В техническом описании содержится диаграмма, показывающая входные и выходные комбинации для всех операций дисковода. Рассмотрим простейшую команду микросхемы FDC, опрос состояния механизма. Вы выполняете эту операцию тогда, когда хотите что-либо узнать о текущем состоянии дисковода. На Фиг. 8.19 показаны данные для команды опроса состояния, а на Фиг. 8.20 показана программа, выполняющая операцию опроса состояния дисковода.

Команда04H
Модификатор команды00H
статус возвратаST3

Фиг. 8.19 Команда опроса состояния


Microsoft (R) Macro Assembler Version 5.00                  1/1/80 04:03:56
Фиг. 8.20 Проверка состояния дисковода                            Page  1-1
PAGE  ,132
                         TITLE    Фиг. 8.20 Проверка состояния дисковода

0000                     STACK    SEGMENT   STACK
0000    0040[                     DW        64 DUP (?)
             ????
            ]
0080                     STACK    ENDS

                         FDC_STATUS   RECORD    RQM:1, DIO:1, OTHER:6

0000                     CODE     SEGMENT
                                  ASSUME    CS:CODE

0000                     SENSE    PROC      FAR
0000    1E                        PUSH      DS            ; Адрес возврата
0001    2B C0                     SUB       AX, AX
0003    50                        PUSH      AX
0004    BA 03F4                   MOV       DX, 3F4H      ; Порт состояния контроллера дисков
0007    B4 04                     MOV       AH, 04H       ; Команда состояния устройства
0009    E8 001E R                 CALL      OUTPUT        ; Передача в контроллер
000C    B4 00                     MOV       AH, 0         ; Второй байт команды
000E    E8 001E R                 CALL      OUTPUT
                         ;-----   Чтение состояния из контроллера дисков
0011                     IN_DIO:
0011    EC                        IN        AL, DX        ; Ждать, пока флаг DIO разрешит ввод
0012    A8 80                     TEST      AL, MASK RQM  ; из контроллера
0014    74 FB                     JZ        IN_DIO
0016                     IN_RQM:
0016    EC                        IN        AL, DX        ; Ждать, пока флаг RQM покажет, что
0017    A8 80                     TEST      AL, MASK RQM  ; контроллер готов
0019    74 FB                     JZ        IN_RQM
001B    42                        INC       DX            ; Установка на порт данных
001C    EC                        IN        AL, DX        ; Чтение состояния контроллера
001D    CB                        RET                     ; Конец примера
001E                     SENSE    ENDP
                         ;-----   Подпрограмма посылки байта в контроллер
001E                     OUTPUT   PROC      NEAR
001E    EC                        IN        AL, DX        ; Ожидание пока DIO разрешит чтение
001F    A8 40                     TEST      AL, MASK DIO  ; из контроллера из контроллера
0021    75 FB                     JNZ       OUTPUT
0023                     OUT_RQM:
0023    EC                        IN        AL, DX        ; Ожидание пока RQM покажет, что
0024    A8 80                     TEST      AL, MASK RQM  ; контроллер готов
0026    74 FB                     JZ        OUT_RQM
0028    42                        INC       DX            ; Установка на порт данных
0029    8A C4                     MOV       AL, AH        ; Посылаемые данные
002B    EE                        OUT       DX, AL        ; Вывод в порт
002C    4A                        DEC       DX            ; Установка на порт состояния
002D    C3                        RET
002E                     OUTPUT   ENDP

002E                     CODE     ENDS
                         END      SENSE

                                  Фиг. 8.20 Проверка состояния дисковода

Каждое действие, выполняемое контроллером дисковода, состоит из трех фаз: команды, выполнения и результата. В фазе команды микросхема FDC ожидает данные, и это отражает бит DIO. Когда микросхема FDC устанавливает бит RQM, чтобы он указывал на ь принять данные, программа может посылать команду в контроллер. В случае опроса состояния дисковода, она выводит в у FDC два байта команды. Первый байт, 04H, является кодом операции этой команды. Второй байт сообщает, какой из механизмов опросить. В течение командной фазы признак DIO всегда показывает, что микросхема FDC ждет данные, и программа использует бит RQM для определения момента, когда можно посылать очередной байт данных.

Теперь контроллер переходит в фазу выполнения. В течение этой фазы контроллер выполняет команду. В данном случае он опрашивает состояние дисковода. В течение этого времени бит RQM сообщает е, чтобы она не использовала порт данных. После завершения операции признак DIO переключается на 1, сообщая программе, что она может читать регистр данных. По разрешению RQM программа может прочитать единственный байт состояния от этой операции. Как только программа прочитает всю информацию состояния признак DIO снова принимает значение 0, ожидая ввода следующей команды.

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

По адресу ввода-вывода 3F2H находится цифровой выводной регистр контроллера дисковода. Этот выводной порт выполняет некоторые дополнительные операции управления дисководом. Основное назначение этого порта - управление двигателями дисковода. У механизмов дисководов 5 1/4 дюйма, используемых в IBM PC, двигатели работают не непрерывно. Программа должна включить двигатель перед чтением или записью на дискету - и выключить его после. Если вы оставите двигатель включенным на все время, это приведет к быстрому износу дискеты. Когда двигатель работает, на передней панели дисковода горит красная лампочка.

Адаптер использует цифровой выводной регистр и для других целей. Два бита выбирают необходимый дисковод. Этот регистр также используется для сброса микросхемы FDC, так как существуют ошибочные ситуации, которые вводят контроллер в неопределенное состояние. В таких случаях единственный выход - сбросить контроллер и попробовать снова.