Справочник программиста на персональном компьютере фирмы IBM. Ввод/вывод - Определение статуса коммуникационного порта

ОГЛАВЛЕНИЕ

     7.1.4 Определение статуса коммуникационного порта.


   Регистр статуса линии микросхемы UART 8250 определяет протокол
связи.   Этот регистр имеет адрес порта на 5 больше, чем  базовый
адрес данного канала.  Обычно он постоянно просматривается в про-
цессе коммуникационного обмена. При передаче данных регистр сооб-
щает, что предыдущий символ уже  послан, позволяя программе запи-
сать новый символ поверх его.  При приеме данных регистр информи-
рует программу о  поступлении  следующего  символа,  с  тем чтобы
программа могла прочитать его прежде чем он будет уничтожен  сле-
дующим прибывшим. Значение битов этого регистра следующее:

   бит 0   1 = байт данных получен
       1   1 = полученные данные были перезаписаны (предыдущий
               символ не был вовремя считан)
       2   1 = ошибка четности (вероятно, из-за шума в линии)
       3   1 = ошибка окружения (передача не синхронизована)
       4   1 = обнаружен перерыв (получена длинная строка единиц,
               индицирующая, что другая станция запрашивает
               конец передачи)
       5   1 = регистр хранения передатчика пуст (в этот регистр
               должны помещаться передаваемые данные)
       6   1 = регистр сдвига передатчика пуст (этот регистр по-
               лучает данные из регистра хранения и преобразует
               их в последовательный вид)
       7   1 = таймаут (устройство не связано с машиной)

   Высокий уровень.


   В Бейсике сначала определите  базовый адрес используемого ком-
муникационного  порта, затем добавьте к нему 5 и используйте опе-
ратор INP для получения  байта  из  этого  порта.  В приложении Б
объясняется как в Бейсике производятся битовые операции,  которые
необходимо проделать программе,  чтобы  интерпретировать значение
этого байта.  В следующем примере проверяется бит наличия переры-
ва:

100 DEF SEG = &H40         'указываем на область данных BIOS
110 ADDR = PEEK(4)+PEEK(5)*256   'вычисляем адрес COM2
120 X = INP(ADDR+5)        'вычисляем адрес регистра статуса
130 IF X AND 16 THEN 500   'переход на подпр-му, если бит 4 = 1
 .
 .
500 '''начинаем процедуру обработки перерыва

   Средний уровень.


   Функция 3 прерывания 14H BIOS  возвращает в AH регистр статуса
линии (AL получает регистр статуса модема [7.1.5]).  При входе DX
должен содержать номер  коммуникационного  порта, к которому осу-

ществляется  доступ, где COM1 = 0, а COM2 = 1.  Как и  предыдущий
пример, этот проверяет наличие перерыва:

   MOV  AH,3          ;номер функции
   MOV  DX,1          ;выбираем COM2
   INT  14H           ;получаем байт статуса
   TEST AH,10000B     ;обнаружен перерыв?
   JNZ  BREAK_DETECT  ;если да, то на процедуру обработки

   Низкий уровень.


   Этот пример совершенно аналогичен  приведенному на Бейсике. Из
области  данных BIOS считывается базовый адрес  коммуникационного
канала, к нему добавляется 5, а затем из полученного адреса порта
считывается байт статуса.

   MOV  AX,40H          ;ES указывает на область данных BIOS
   MOV  ES,AX           ;
   MOV  DX,ES:[2]       ;получаем базовый адрес COM2
   ADD  DX,5            ;добавляем 5 для регистра статуса
   IN   AL,DX           ;получаем байт статуса
   TEST AL,10000B       ;бит 5 установлен?
   JNZ  BREAK_DETECT    ;если да, то на обработку перерыва