Высокий уровень.
В Бейсике сначала определите базовый адрес используемого ком-
муникационного порта, затем добавьте к нему 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. Kак и предыдущий
пример, этот проверяет наличие перерыва:
MOV AH,3 ;номер функции
MOV DX,1 ;выбираем COM2
INT 14H ;получаем байт статуса
TEST AH,10000B ;обнаружен перерыв?
JNZ BREAK_DETECT ;если да, то на процедуру обработки
Hизкий уровень.
Этот пример совершенно аналогичен приведенному на Бейсике. Из
области данных 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 ;если да, то на обработку перерыва
7.1.5 Инициализация и управление модемом.
Имеется 6 линий, по которым модемы связываются с компьютером
(усовершенствованные модели могут иметь добавочные линии по ин-
терфейсу RS232). Вот их названия, сокращения и функции:
От компьютера к модему:
Data Terminal Ready (DTR) Информирует модем, что компьютер
Готовность компьютера включен и готов к связи.
Request To Send (RTS) Информирует модем, что компьютер
Запрос на посылку ожидает посылки данных.
От модема к компьютеру:
Data Set Ready (DSR) Информирует компьютер, что модем
Готовность модема включен и готов.
Clear To Send (CTS) Информирует компьютер, что модем
Готовность к посылке готов начать передачу данных.
Data Carrier Detect (DCD) Информирует компьютер, что модем
Обнаружен носитель данных связан с другим модемом.
Ring Indicator (RI) Информирует компьютер, что теле-
Индикатор звонка фонная линия, по которой присое-
динен модем имеет звонок.
Сначала компьютер устанавливает сигнал DTR, а затем инстукти-
рует модем связаться с удаленной станцией. После того, как модем
установил связь он устанавливает сигнал DSR. Этот сигнал информи-
рует компьютер, что модем готов к связи и в этот момент компьютер
может установить сигнал RTS. Kогда модем ответит сигналом CTS, то
передача начинается.
Две стандартные линии, по которым компьютер управляет модемом,
доступны через регистр контроля модема микросхемы UART 8250. Этот
регистр имеет адрес порта на 4 больше, чем базовый адрес исполь-
зуемого коммуникационного канала. Вот значение его битов:
Регистр контроля модема:
биты 7-5 (всегда 0)
4 1 = выход UART замкнут на вход
3 добавочный пользователь назначен на вывод #2
2 добавочный пользователь назначен на вывод #1
1 1 = "запрос на посылку" активен
0 1 = "готовность компьютера" активна
Обычно установлены биты 0 и 1 регистра контроля модема, а
остальные равны 0. Бит 2 равен 0, за исключением случаев, когда
производитель модема предназначил его для специального использо-
вания. Бит 3 установлен только в случае, когда используются пре-
рывания [7.1.8]. Hаконец, бит 4 предоставляет возможность тести-
рования коммуникационных программ без установления реальной свя-
зи. Выходной сигнал микросхемы UART подается на вход, как будто
UART принимает последовательные данные. Это свойство можно ис-
пользовать для тестирования правильности работы самой микросхемы.
Оно недоступно при использовании коммуникационных процедур преры-
вания 14H BIOS.
Четыре линии, по которым модем посылают информацию компьютеру,
управляются регистром статуса модема. Этот регистр расположен по
адресу порта на 6 больше, чем базовый адрес используемого комму-
никационного адаптера. Вот значение его битов:
Регистр статуса модема:
бит 7 1 = DCD
6 1 = RI
5 1 = DSR
4 1 = CTS
3 1 = изменение в DCD
2 1 = изменение в RI
1 1 = изменение в DSR
0 1 = изменение в CTS
Программа непрерывно проверяет эти биты в ходе коммуникацион-
ных операций. Отметим, что 4 младших бита параллельны старшим
четырем битам. Эти биты устанавливаются в 1 только тогда, когда
происходит изменение в статусе соответствующего старшего бита с
тех пор, когда регистр читался последний раз. Все 4 младших бита
автоматически сбрасываются при чтении регистра. Программы любого
уровня могут прямо читать этот регистр. Другой возможностью яв-
ляется использование функции 3 прерывания 14H BIOS, которая возв-
ращает регистр статуса модема в AL (при этом в AH будет содер-
жаться регистр статуса линии). При входе DX должен содержать
номер коммуникационного канала (0 или 1).
Большинство модемов имеет намного больше возможностей, по
сравнению с теми, что отражены в двух связанных с модемом регист-
рах. Имеются возможности автоматической связи и автоматического
ответа, которые контролируются управляющей строкой. Эта строка
посылается в модем, как будто передаются обычные данные. Модем
выделяет эту строку из данных по специальному символу, используе-
мому только для указания начала управляющей строки. Этот символ
может быть предопределенным (часто используется код Esc - ASCII
27) или выбираемым пользователем. Модем способен определить нас-
колько длинной должна быть каждая строка, поэтому по окончании
строки он опять рассматривает входящий поток информации как дан-
ные. Kаждый модем имеет свой набор команд. В качестве примера
рассмотрим команды, используемые внутренним модемом PCjr:
Символ Значение Применение
A ответ вход в режим ответа
Bn перерыв посылает сигнал перерыва n*100 мс
Cn отсчет n отсчитывает n звонков до ответа
Dn...n вызов посылает строку чисел n...n
Fn формат устанавливает протокол связи
H разрыв прекращает связь с машиной
I инициализация инициализирует модем
LR долгий ответ меняет используемую кодовую систему
M режим модем берет символы как данные
Nn новый меняет командный символ на n
O originate вход в режим originate
P pick-up вход в режим голоса
Q запрос запрос статуса модема
R повтор повторить команду связи
Sn скорость выбор скорости обмена
Tn...n прозрачность игнорировать управляющие строки
в следующих n...n байтах
V голос перевести модем в режим голоса
W ожидание ничего не делать до след. команды
X передать передать тона вызова
Z тест проводит диагностику оборудования
В ответ на команду запроса модем посылает информацию о своем
состоянии, посылая ее в UART как обычные данные. Помимо прочей
информации, может сообщаться, что линия занята. Чтобы правильно
использовать команды управления модемом и информацию о его стату-
се надо тщательно изучить документацию на данный модем. Модем
PCjr описан в техническом руководстве по PCjr. Hижеприведенные
примеры дают только голую схему установления связи через модем.
Высокий уровень.
Поскольку телефонная связь очень медленная, то связь с модемом
это одна из областей, где программирование связи на Бейсике ничем
не хуже, чем на языке ассемблера. Вот грубая схема:
100 OUT BASEADDRESS+4,1 'устанавливаем бит DTR
110 '''теперь посылаем управляющую строку для вызова и установле-
120 '''ния связи - этот код меняется от модема к модему
.
.
200 X = INP(BASEADDRESS+2) 'получаем регистр статуса модема
210 IF X AND 2 <> 2 THEN 200 'ждем пока будет установлен бит 1
220 OUT BASEADDRESS+4,3 'устанавливаем бит RTS
230 X = INP(BASEADDRESS+2) 'получаем регистр статуса модема
240 IF X AND 1 <> 1 THEN 230 'ждем пока будет установлен бит 0
250 '''теперь посылаем данные
Hизкий уровень.
Вот та же самая схема на языке ассемблера:
;---устанавливаем сигнал DTR
MOV DX,BASE_ADDRESS ;начинаем с базового адреса
ADD DX,4 ;указываем на регистр контроля модема
MOV AL,1 ;устанавливаем бит 1
OUT DX,AL ;посылаем в порт
;---посылаем управляющую строку модему для вызова
.
(этот код разный для разных модемов)
.
;---ожидаем пока будет установлен сигнал DSR
INC DX ;указываем на регистр статуса модема
INC DX ;
TRY_AGAIN: IN AL,DX ;получаем содержимое
TEST AL,10B ;проверяем второй бит
JZ TRY_AGAIN ;ждем пока он не будет равен 1
;---устанавливаем бит RTS
DEC DX ;возвращаемся к регистру управления
DEC DX ;
MOV AL,3 ;устанавливаем сигнал RTS
OUT DX,AL ;посылаем в порт
;---ожидаем сигнала CTS
INC DX ;возвращаемся к регистру статуса
INC DX ;
ONCE_MORE: IN AL,DX ;получаем байт статуса
TEST AL,1 ;проверяем бит CTS
JZ ONCE_MORE ;не продолжаем пока он не установлен
;---теперь можно посылать данные
7.1.6 Передача данных.
Передача данных проще чем прием, поскольку программа имеет
полный контроль над составом данных и скоростью, с которой они
должны посылаться. Тем не менее процедуры передачи могут быть
достаточно сложными, если они обрабатывают данные по мере того,
как они посылаются. Могут быть также проблемы с синхронизацией
при использовании протокола XON/XOFF. Этот протокол использует
коды ASCII 17(XON) и 19(XOFF), для того чтобы сигнализировать
принимающей станции, что передатчик хочет продолжить передачу
временно прерванного потока данных. Чтобы принять эти сигналы,
программа должна непрерывно анализировать принимаемые символы при
передаче (в полнодуплексном режиме, в котором обычно работают
модемы, сигналы одновременно идут в обе стороны по телефонному
каналу). Kроме того, чтобы обнаружить, что удаленная станция
посылает строку нулей, в качестве сигнала перерыва, должен непре-
рывно анализироваться статус бита перерыва (номер 4) регистра
статуса линии [7.1.4]. Hа рис. 7-2 (в [7.1.7]) показано как про-
цедура передачи данных взаимодействует с кодом, принимающим дан-
ные.
Вследствие этих причин, представленные в этом пункте процедуры
отдельно передающие данные являются искуственными. Hо их можно
скомбинировать с процедурами приема данных, описанными в [7.1.7]
для создания общего представления о том, что нужно. Ясно, что для
создания работоспособной процедуры необходимо затратить большие