Страница 7 из 27
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 ;
|