Assembler для начинающих

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


      Адаптер дисковода является интерфейсом между микропроцессором и
    накопителем на гибких магнитных дисках. Схемы, смонтированные на
    плате этого адаптера, обеспечивают все функции, необходимые для
    ввода и вывода данных на гибкий диск (дискету). Адаптер
    обеспечивает также физическое кодирование и декодирование данных,
    необходимое для использования дискет.
 
      Центральной частью адаптера дисковода фирмы 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 Команда опроса
      ----------------------------------       состояния
A

                 Microsoft (R) Macro Assembler Version 5.00              1/1/80 04:06:03
             Фиг. 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  SENSEA
            Фиг. 8.20 Проверка состояния дисковода
      Каждое действие, выполняемое контроллером дисковода, состоит из
    трех фаз: команды, выполнения и результата. В фазе команды
    микросхема FDC ожидает данные, и это отражает бит DIO. Когда
    микросхема FDC устанавливает бит RQM, чтобы он указывал на
    готовность принять данные, программа может посылать команду в
    контроллер. В случае опроса состояния дисковода, она выводит в
    микросхему FDC два байта команды. Первый байт, 04H, является кодом
    операции этой команды. Второй байт сообщает, какой из механизмов
    опросить. В течение командной фазы признак DIO всегда показывает,
    что микросхема FDC ждет данные, и программа использует бит RQM для
    определения момента, когда можно посылать очередной байт данных.
 
      Теперь контроллер переходит в фазу выполнения. В течение этой
    фазы контроллер выполняет команду. В данном случае он опрашивает
    состояние дисковода. В течение этого времени бит RQM сообщает
    программе, чтобы она не использовала порт данных. После завершения
    операции признак DIO переключается на 1, сообщая программе, что она
    может читать регистр данных. По разрешению RQM программа может
    прочитать единственный байт состояния от этой операции. Как только


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

Содержание раздела