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


Адаптер синхронных коммуникаций



Адаптер синхронных коммуникаций


      Адаптер асинхронных коммуникаций дает возможность связываться с
    IBM PC по последовательному интерфейсу. Этот адаптер дает
    возможность связываться с другими ЭВМ, службами баз данных, а также
    с другими источниками информации. Мы не будем обсуждать принципы
    работы этого канала, а поговорим о методах программирования этого
    конкретного адаптера IBM PC.
 
      Интегральная микросхема коммуникаций проделывает всю работу по
    приему и передаче символов по асинхронной линии. Элемент
    асинхронной связи ACE (Asynchronous Communication Element) 8250
    можно запрограммировать для управления самыми различными аспектами
    связи. При инициализации элемента ACE под пограммным контролем


    оказываются размер символа, частота передачи, символы останова и
    биты четности. Адаптер также позволяет проверять и задавать
    стандартные сигналы управления модемом (модулятора -
    демодулятора).
 
      С помощью элемента ACE символ передается просто посредством его
    записи в регистр передачи. Микросхема далее выполняет все, что
    соответствует кодам, которые вы передали ей при инициализации.
    Чтобы принять символ, вы просто читаете его из буфера приема.
    Существует регистр состояния, называемый регистром состояния линии,
    который показывает, когда буфер передачи пуст и может принять
    другой символ. Другой бит регистра состояния сообщает, когда
    элемент ACE уже принял символ из другой системы.
 
      В техническом описании приводятся и другие регистры, входящие в
    элемент ACE 8250. Эти регистры дают возможность управления модемом
    и определения его состояния. Вы также можете разрешить выработку
    прерывания при возникновении в элементе ACE различных условий. Это
    позволяет вашей программе быстро реагировать на любую смену внешних
    условий. east-font-family:"MS Mincho"'>
Программа на Фиг. 8.16 демонстрирует основные механизмы,
    необходимые для инициирования элемента ACE, посылки и приема
    символа. Базовый адрес ввода-вывода платы адаптера равен 3F8H, так
    что регистры элемента ACE расположены по адресам от 3F8H до 3FEH.
    Можно также модифицировать адаптер асинхронной связи фирмы IBM так,
    чтобы его регистры соответствовали адресам ввода-вывода от 2F8H до
    2FEH. С помощью такой модификации можно установить в персональную
    ЭВМ второй адаптер и связаться с двумя различными внешними
    устройствами. Фактически, можно подключить печатающее устройство к
    системе с помощью последовательного, а не параллельного сопряжения.
    В этом случае нужны два адаптера: один из них работает с печатающим
    устройством, а другой обслуживает внешние связи.
 
      Один из портов ввода-вывода элемента ACE выполняет несколько
    функций. Оба буфера, передачи и приема, находятся по адресу 3F8H,
    так что когда что-либо записывается по этому адресу, информация
    попадает в буфер передачи, но при чтении по этому адресу, вы
    получаете последний символ, принятый микросхемой ACE. Этот же порт
    ввода-вывода выполняет и третью функцию. Значение делителя,
    определяющее скорость работы адаптера, записывается в этот порт
    ввода-вывода. Микросхема ACE делит входную частоту на число,
    помещенное в регистр делителя, позволяя тем самым выбрать скорость
    от 50 до 9600 бод. Режим использования порта 3F8H задает один из
    битов управляющего регистра.

             Microsoft (R) Macro Assembler Version 5.00                1/1/80 04:05:45
             Фиг. 8.16 Управление последовательным каналом             Page     1-1
 
 
                                           PAGE ,132
                                           TITLE      Фиг. 8.16 Управление последовательным каналом
 
              0000                        STACK      SEGMENT STACK
              0000      0040[                   DW   64 DUP (?)
                      ????
                                ]
              0080                        STACK      ENDS
 
              = 03F8                SERIAL  EQU      03F8H
 
              0000                        CODE SEGMENT
                                           ASSUME  CS:CODE
              0000                        ASYNC      PROC FAR
              0000      1E                      PUSH DS         ; Адрес возврата в ДОС
              0001      2B C0                   SUB  AX,AX
              0003      50                      PUSH AX
              0004      BA 03FB                  MOV  DX,SERIAL+3      ; Управляющий регистр
              0007      B0 80                   MOV  AL,80H
              0009      EE                      OUT  DX,AL            ; Настройка на установку скорости
              000A      B8 0180                  MOV  AX,384     ; Делитель частоты для скорости 300 бод
              000D      BA 03F8                  MOV  DX,SERIAL
              0010      EE                      OUT  DX,AL            ; Младшая часть делителя
              0011      8A C4                   MOV  AL,AH
 
                  Фиг. 8.16 Управление последовательным каналом (начало)
              0013      42                      INC  DX
              0014      EE                      OUT  DX,AL            ; Старшая часть делителя
              0015      BA 03FB                  MOV  DX,SERIAL+3      ; Управляющий регистр
              0018      B0 03                   MOV  AL,00000011b     ; Режим без проверки на четность,8 бит
              001A      EE                      OUT  DX,AL
 
                                     ;-----  Вывод символа в канал
 
              001B      BA 03FD                  MOV  DX,SERIAL+5      ; Регистр состояния канала
              001E                        SEND:
              001E      EC                      IN   AL,DX
              001F      A8 20                   TEST AL,20H
              0021      74 FB                   JZ   SEND
              0023      B0 41                   MOV  AL,'A'
              0025      BA 03F8                  MOV  DX,SERIAL
              0028      EE                      OUT  DX,AL
 
                                     ;-----  Прием символа
 
              0029      BA 03FD                  MOV  DX,SERIAL+5      ; Регистр состояния канала
              002C                        RECV:
              002C      EC                      IN   AL,DX
              002D      A8 02                   TEST AL,2
              002F      74 FB                   JZ   RECV
              0031      BA 03F8                  MOV  DX,SERIAL
              0034      EC                      IN   AL,DX
 
              0035      CB                      RET
              0036                        ASYNC      ENDP
              0036                        CODE ENDS
                                           END  ASYNC
 
      Фиг.8.16 Установка, пересылка и получение данных по
                      асинхронному каналу (продолжение)
 
      Первая часть программы примера инициализирует микросхему ACE
    8250. Первым делом программа настраивает скорость работы адаптера.
    Значение делителя, равное 384, устанавливает скорость 300 бод.
    Обратите внимание, что перед записью значения делителя программа
    заносит 1 в бит 7 управляющего регистра по адресу 3FBH.
    Окончательный вывод в порт 3FBH задает характеристики линии. В этом

             Microsoft (R) Macro Assembler Version 5.00                1/1/80 04:05:50
             Фиг. 8.17 Обработка прерываний от последовательного канала  Page     1-1
 
 
                                           PAGE ,132
                                           TITLE      Фиг. 8.17 Обработка прерываний от последовательного канала
 
              0000                        ABS0 SEGMENT AT 0
              002C                              ORG  0BH*4
              002C                        ASYNC_INTERRUPT LABEL  WORD
              002C                        ABS0 ENDS
 
              0000                        STACK      SEGMENT STACK
 
                  Фиг. 8.17 Обработка прерываний от последовательного канала (начало)
              0000      0040[                   DW   64 DUP (?)
                      ????
                                ]
              0080                        STACK      ENDS
 
              0000                        CODE SEGMENT
                                           ASSUME  CS:CODE
              0000      0049 R                  BUFFER_POINTER  DW     BUFFER
 
              0002                        SET_INTERRUPT    PROC FAR
              0002      2B C0                   SUB  AX,AX
              0004      8E D8                   MOV  DS,AX
                                           ASSUME  DS:ABS0  ; Адресация по сегментному регистру DS
                                                             ;  в область векторов прерываний
                                     ;-----  Установка прерывания
              0006      C7 06 002C R 0024 R           MOV  ASYNC_INTERRUPT,offset INT_HANDLER
              000C      8C 0E 002C R                  MOV  ASYNC_INTERRUPT,CS     ; Занесение вектора прерывания
 
              0010      BA 03F9                  MOV  DX,03F9H   ; Регистр разрешения прерываний
              0013      B0 04                   MOV  AL,04H     ; Прерывание по приему из канала
              0015      EE                      OUT  DX,AL
 
              0016      E4 21                   IN   AL,21H     ; Регистр маски прерываний 8259
              0018      24 F7                   AND  AL,0F7H    ; Занесение 0 в разряд 3
              001A      E6 21                   OUT  21H,AL     ; Прерывание не маскируется
 
              001C      BA 03FC                  MOV  DX,3FCH    ; Регистр управления модемом
              001F      B0 08                   MOV  AL,08H     ; разряд OUT2
              0021      EE                      OUT  DX,AL
 
              0022      EB FE             HERE:      JMP  HERE       ; Конец задания режима работы последователь-
              0024                        SET_INTERRUPT    ENDP       ;  ного канала,ожидание прерывания
 
                                     ;-----  Программа обработки прерываний от последовательного канала по приему
 
              0024                        INT_HANDLER      PROC FAR
              0024      50                      PUSH AX         ; Сохрание используемых регистров
              0025      53                      PUSH BX
              0026      52                      PUSH DX
              0027      BA 03FD                  MOV  DX,3FDH    ; Регистр состояния канала
              002A      EC                      IN   AL,DX
              002B      A8 01                   TEST AL,01H     ; Был ли получен символ?
              002D      74 12                   JZ   INT_RETURN ; Нет,возврат из прерывания
              002F      BA 03F8                  MOV  DX,3F8H    ; Регистр приема данных
              0032      EC                      IN   AL,DX            ; Выбор символа из канала
              0033      2E: 8B 1E 0000 R        MOV  BX,BUFFER_POINTER
              0038      2E: 88 07               MOV  CS:[BX],AL ; Сохранение в буфере
              003B      43                      INC  BX
              003C      2E: 89 1E 0000 R        MOV  BUFFER_POINTER,BX
              0041                        INT_RETURN:
              0041      5A                      POP  DX         ; Восстановление регистров
              0042      5B                      POP  BX
              0043      B0 20                   MOV  AL,20H     ; Сброс контроллера прерываний
 
             Фиг. 8.17 Обработка прерываний от последовательного канала  (продолжение)
              0045      E6 20                   OUT  20H,AL
              0047      58                      POP  AX
              0048      CF                      IRET             ; Возврат из прерывания
              0049                        INT_HANDLER      ENDP
              0049      0080[             BUFFER  DB 128 DUP (?)
                       ??
                                ]
 
 
              00C9                        CODE ENDS
                                           END  SET_INTERRUPT
 
            Фиг. 8.17 Асинхронные прерывания (окончание)
 
      Оставшиеся две части примера посылают и принимают символ. В
    регистре состояния линии по адресу ввода-вывода 3FDH есть биты
    состояния буферов передачи и приема. Посылать символ до тех пор,
    пока буфер передачи не опустеет, нельзя; и естественно, нельзя
    читать символ до того, как он принят.
 
      Адаптер асинхронной связи также работает с прерываниями. Сигнал
    OUT2 в регистре управления модемом передает сигнал прерывания от
    микросхемы ACE системе. Регистр разрешения прерываний в микросхеме
    ACE выбирает те возможные изменения состояний, которые приведут к
    возбуждению внешнего прерывания. Адаптер асинхронной связи
    возбуждает прерывание уровня 3 контроллера прерываний 8259.
 
      Давайте посмотрим, как можно использовать прерывание от
    асинхронной платы для того, чтобы принимать символы. На Фиг. 8.17
    показана последовательность событий, необходимых для включения
    системы прерываний. В случае аппаратного прерывания, программа
    устанавливает вектор прерывания, соответствующий уровню 3
    контроллера 8259 (прерывание 0BH по адресу 58H), на адрес процедуры
    обслуживания прерывания. Затем она сбрасывает бит регистра маски,
    соответствующий прерыванию от платы связи. В микросхеме ACE 8250
    программа загружает регистр разрешения прерывания так, чтобы
    разрешить прерывания по состоянию приемной линии. И наконец,
    программа включает линию OUT2, чтобы в систему поступали
    прерывания. Когда все это работает, не возникает никаких проблем о
    бработке символов по мере их получения системой. Программа на Фиг.
    8.17 помещает эти символы в буфер, где их может не торопясь
    просматривать другая программа.




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