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


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



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


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




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