Справочник программиста на персональном компьютере фирмы 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 ;если да, то на обработку перерыва