Справочник программиста на персональном компьютере фирмы IBM. Ввод/вывод - Установка текущего коммуникационного порта
ОГЛАВЛЕНИЕ
7.1.3 Установка текущего коммуникационного порта.
Имеются два способа, которыми программа может определить,
какой из коммуникационных портов должен использоваться. Один из
способов состоит в указании номера канала в операторе программы.
Второй способ состоит в написании программы для обмена через порт
COM1, но изменении коммуникационного адаптера, доступ к которому
идет через COM1.
Область данных BIOS содержит место для четырех 2-хбайтных
переменных, которые содержат базовые адреса коммуникационных
каналов (MS DOS поддерживает только первые два из них). Базовый
адрес порта это младший из группы адресов портов, через которые
можно получить доступ к данному коммуникационному каналу. Базовый
адрес для COM1 хранится в ячейке 0040:0000, а для COM2 - в ячейке
0040:0002. Для смены коммуникационных портов надо просто поменять
эти два значения. Повторная смена значений приведет к первона-
чальному назначению портов.
Высокий уровень.
В Бейсике оператор OPEN "COM" может использоваться в виде OPEN
C$+"1200,N,8" AS #2, где C$ может быть либо "COM1:", либо
"COM2:". В качестве альтернативы можно использовать PEEK и POKE
для обмена базовых адресов:
100 DEF SEG = &H40 'указываем на область данных BIOS
110 X = PEEK(0): Y = PEEK(1) 'запоминаем первые 2 байта
120 POKE 0,PEEK(2): POKE 1,PEEK(3) 'переносим 2-е два байта
130 POKE 2,X: POKE 3,Y 'засылаем запомненные значения
Средний уровень.
Если программа обращается к коммуникационному порту через
прерывание 14H BIOS, то COM порт определяется содержимым DX,
которое равно 0 или 1 (для COM1 или COM2). Вместо того, чтобы
присваивать DX непосредственное значение, заполняйте его из пере-
менной, которой может быть присвоено значение 0 или 1. Программы,
использующие коммуникационные функции 3 и 4 прерывания 21H всегда
адресуются к COM1. В этом случае надо поменять базовые адреса:
;---обмен базовых адресов для COM1 и COM2
MOV AX,40H ;ES указывает на область данных BIOS
MOV ES,AX ;
MOV DX,ES:[0] ;помещаем 1-й базовый адрес в DX
MOV AX,ES:[2] ;помещаем 2-й базовый адрес в AX
MOV ES:[0],AX ;обмениваем адреса
MOV ES:[2],DX ;