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

    Плата адаптера дисковода устроена фирмой 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 все это будет рассмотрено в комплексе.

Hosted by uCoz