Плата адаптера дисковода устроена фирмой IBM так, что она  использует возможность прямого доступа в память системы (ПДП).  Прямой доступ в память позволяет устройству ввода-вывода передавать  данные непосредственно в память или из нее. При этом микропроцессор  не "касается" данных. Принтер, например, требует передачи каждого  печатаемого символа самим микропроцессором. В случае же обмена с  дискетой микропроцессор был бы тяжелой обузой для достаточно  быстрой передачи данных. Программа микропроцессора для передачи  данных дисковода была бы очень похожа на программу Фиг. 8.15, где  символы посылались в принтер. То есть программа должна была бы  читать бит RQM, в цикле, чтобы проверить наличие очередного байта  данных. Тем не менее, если микропроцессор не ответит дисководу  достаточно быстро, то данные будут потеряны.

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

Давайте посмотрим, как нужно настраивать ПДП на операцию чтения  с дискеты. На Фиг. 8.21 показана программа, предназначенная для  этой цели. ПДП имеет четыре канала. Дисковод подключен к каналу 2  ПДП. Каналы 1 и 3 доступны через системный канал ввода-вывода для  других устройств ввода-вывода, а канал 0 используется для очень  важной аппаратной функции - поддерживания регенерации памяти. Если  вы вмешаетесь в работу канала 0 ПДП, содержимое всей памяти  системы, вероятнее всего, изменится.

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

На Фиг. 8.21 BUFFER - имя области данных. Программа определяет  абсолютный адрес буфера BUFFER в системе. Для этого она прибавляет  смещение BUFFER к сдвинутому (умноженному на 16) значению регистра  CS, который содержит значение сегмента буфера. Затем программа  помещает младшие 16 бит адреса в регистр адреса ПДП канала 2.  Старшие 4 бита адреса помещаются в специальный регистр "страницы".   В   действительности контроллер ПДП 8237 работает только с 16-битовым адресом. В IBM PC этот регистр страницы добавлен для  того, чтобы программа могла читать данные в любое место памяти. Имеется три регистра страницы, по одному для каналов 1, 2 и 3.  Регистр страницы имеет размер всего 4 бита, и поэтому старшие биты регистра AL не играют роли при формировании физического адреса   буфера данных.

 

             Microsoft (R) Macro Assembler Version 5.00                1/1/80 04:06:09

             Фиг. 8.21 Настройка прямого доступа в память             Page     1-1

 

                                           PAGE ,132

                                           TITLE      Фиг. 8.21 Настройка прямого доступа в память

 

             0000                        STACK      SEGMENT STACK

             0000      0040[                   DW   64 DUP (?)

                      ????

                                ]

             0080                        STACK      ENDS

 

             = 0000                DMA  EQU  0          ; Адрес порта DMA

             0000                        CODE  SEGMENT

                                           ASSUME CS:CODE

             0000                        DMA_SET PROC     FAR

             0000      1E                      PUSH  DS         ; Адрес возврата

             0001      2B C0                   SUB  AX, AX

             0003      50                      PUSH  AX

 

             0004      B0 46                   MOV  AL, 46H    ; Установка DMA в режим чтения с дискеты

             0006      E6 0B                   OUT  DMA+11, AL  ;  в память

             0008      E6 0C                   OUT  DMA+12, AL

             000A      8C C8                   MOV  AX, CS      ; Текущий адрес сегмента

             000C      B1 04                   MOV  CL, 4

             000E      D3 C0                   ROL  AX, CL      ; Умножение на 16

             0010      8A E8                   MOV  CH, AL      ; Старшие 4 разряда в регистре CH

             0012      24 F0                   AND  AL, 0F0H   ; Очистка младших разрядов

             0014      05 0032 R               ADD  AX, offset BUFFER      ; Прибавление адреса буфера

             0017      80 D5 00                ADC  CH, 0

             001A      E6 04                   OUT  DMA+4, AL  ; Вывод младшего байта адреса

             001C      8A C4                   MOV  AL, AH

             001E      E6 04                   OUT  DMA+4, AL  ; Вывод старшего байта адреса

             0020      8A C5                   MOV  AL, CH

             0022      E6 81                   OUT  081H, AL   ; Установка регистра страницы

 

             0024      B8 01FF                  MOV  AX, 511    ; Счетчик на один сектор

             0027      E6 05                   OUT  DMA+5, AL  ; Младший байт счетчика

             0029      8A C4                   MOV  AL, AH

             002B      E6 05                   OUT  DMA+5, AL  ; Старший байт счетчика

             002D      B0 02                   MOV  AL, 2            ; Открыть для прямого доступа канал 2

             002F      E6 0A                   OUT  DMA+10, AL

             0031      CB                      RET

             0032                        DMA_SET ENDP

             0032      0200[             BUFFER  DB  512 DUP (?)      ; Буфер для чтения с диска

                       ??

                                ]

             0232                        CODE  ENDS

                                           END

Фиг. 8.21 Настройка прямого доступа в память

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

Адаптер дисковода соединяет множество компонентов программного  и аппаратного обеспечение компьютера. Адаптер дисковода использует  и ПДП, и прерывания для обслуживания работы дисковода. Сам по себе  контроллер дисковода - сложное, "интеллектуальное" устройство  управления, требующее получения "программы" перед началом работы. В  следующей главе при обсуждении управления механизмом дисковода с  помощью программы BIOS все это будет рассмотрено в комплексе.