8.11. Прямой доступ у памяти

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

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

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

На Фиг. 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:03:56
Фиг. 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 все это будет рассмотрено в комплексе.