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

Адаптер асинхронных коммуникаций дает возможность связываться с IBM PC по последовательному интерфейсу. Этот адаптер дает возможность связываться с другими ЭВМ, службами баз данных, а также с другими источниками информации. Мы не будем обсуждать принципы работы этого канала, а поговорим о методах программирования этого конкретного адаптера IBM PC.

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

С помощью элемента ACE символ передается просто посредством его записи в регистр передачи. Микросхема далее выполняет все, что соответствует кодам, которые вы передали ей при инициализации. Чтобы принять символ, вы просто читаете его из буфера приема. Существует регистр состояния, называемый регистром состояния линии, который показывает, когда буфер передачи пуст и может принять другой символ. Другой бит регистра состояния сообщает, когда элемент ACE уже принял символ из другой системы.

В техническом описании приводятся и другие регистры, входящие в элемент ACE 8250. Эти регистры дают возможность управления модемом и определения его состояния. Вы также можете разрешить выработку прерывания при возникновении в элементе ACE различных условий. Это позволяет вашей программе быстро реагировать на любую смену внешних условий. Программа на Фиг. 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:03:56
Фиг. 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    94 A8 A3 2E 20 38 2E      MSG       DB      'Фиг. 8.15', 13, 10, '$'
        31 35 0D 0A 24

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
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:03:56
Фиг. 8.17 Обработка прерываний от последовательного канала        Page  1-1
PAGE  ,132
                         TITLE    Фиг. 8.17 Обработка прерываний от последовательного канала

0000                     ABS0     SEGMENT AT 0
                                  ORG     0BH*4
002C                     ASYNC_INTERRUPT LABEL     WORD
002C                     ABS0    ENDS

0000                     STACK    SEGMENT STACK
0000    0040[                     DW        64 DUP (?)
             ????
            ]
0080                     STACK    ENDS

0000                     CODE     SEGMENT
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        ; Сброс контроллера прерываний
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 помещает эти символы в буфер, где их может не торопясь просматривать другая программа.