ZXNet эхоконференция «code.zx»


тема: xtr-modem {2/2}



от: 500:812/28.08
кому: Ivan Savin
дата: 23 Feb 1998


----- ПРОГРАММИРОВАHИЕ -----

Для любопытных пользователей сообщаем
необходимый минимум информации. Общение с
модемом происходит через единственный порт
с адресом #B7 (183).


IN A,(#B7), если линия не занята модемом

Bit7 Bit0
0 0 линия не подключена к модему
0 1 снята трубка паралл. аппарата
1 0 звонок ( возможны глюки )
1 1 линия свободна


IN A,(#B7), если линия занята модемом

Bit7 всегда 0
Bit0 через него идут принимаемые данные


OUT (#B7),A

Bit0 при занятой линии - передаваемые
данные, при приеме д.б. =1
при освобожденной линии неактуален
Bit1 1-занять линию
0-освободить линию

Bit4 биты определяют время, до которого
Bit5 аппаратно растянется интервал вре-
Bit7 мени между двумя соседними коман-
Bit6 дами IN A,(#B7) или OUT (#B7),A

Bit7-Bit4
#00 время .000002*16 сек
#10 время .000002*15 сек
...
#E0 время .000002*1 сек
#F0 асинхронный режим, NO WAIT

Для случая #F0 ничего не растягивается,
все выполняется, как для порта #FE в режи-
ме эмуляции VICOMM.

Для чего нужны биты 7-4?

пример:

LD A,#?0 *
OUT (#B7),A *
IN A,(#B7) !
POP AF
IN A,(#B7) !

без аппаратной поддежки для команд, отме-
ченых знаком !, период выполненя составит:

тактов секунд

PENTAGON 11+10=21 .000006
TURBO PENTAGON 11+10=21* .000004 !
SCORPION 12+10=22 .0000063
TURBO SCORPION 12+10=22* .000004 !
KAY 12+10=22 .0000063
TURBO KAY 12+12=24 .0000034

* плюсуется WAIT
! приблизително

Для случая XTR период для всех машин
уравнивается, увеличиваясь (!) до значе-
ния, установленого в битах 7-4 (кроме зна-
чения #F0).

То же спрведливо для OUT (#B7),A и для
любых комбинаций IN/OUT с портом #B7.

Примечание_1: естественно, программа долж-
на быть писана под худшую машину, чтобы
время исполнения команд на этой машине бы-
ло меньше, чем установленое время, до ко-
торого все растягивается (иначе это будет
сжатие!).

примечание_2: период без растягивания не
должен быть менее .00000229 сек, (8 тактов
неTURBO PENTAGONа, 16 тактов TURBO PENTA-
GONа), иначе растягивания не произойдет.

Пример паузы в .002 секунды:

W002 XOR A
OUT (#B7),A ; период 32 мкС
LD B,62
W002_1 IN A,(#B7) ; 62*.000032=.001984
DJNZ W002_1
...

Hа любой машине это будет .002 сек, не-
зависимо от TURBO/неTURBO.

Примеры программирования:

освободить линию OUT (#B7),#F0
занять линию OUT (#B7),#F3

Hабор номера (WAIT ... в секундах):

ADRNUM DB "1234567"

DIAL OUT (#B7),#00 ; сброс линии
WAIT 0.5
OUT (#B7),#02 ; занять линию
LD HL,ADRNUM
LD C,7
DIAL7 WAIT 0.5
LD A,(HL)
SUB #30
JR NZ,DIAL7_0
LD A,10 ; для нуля-десять
DIAL7_0 LD B,A
INC HL
PUSH HL
PUSH BC
CALL DIALN ; набор цифры
POP BC
POP HL
DEC C
JR NZ,DIAL7
WAIT 0.5
OUT (#B7),#03
RET

DIALN OUT (#B7),#00
WAIT .06
OUT (#B7),#02
WAIT .04
DJNZ DIALN1
RET

Передача данных (принцип VICOMM):

OUT (#B7),#F2
WAIT
OUT (#B7),#F3
WAIT
повторять по алгоритму

Ожидание звонка:

WTCALL LD DE,#8180
XOR A
OUT (#B7),A
WTCL0 LD BC,#FF00
WTCL1 WAIT .002
IN A,(#B7)
AND D
CP E
JR NZ,WTCL2
INC C
WTCL2 DJNZ WTCL1
LD A,C
CP 30 ; антиглюк
JR C,WTCL0 ; нет звонка
WTCL3 LD B,0 ; ожидаем конец
WTCL4 WAIT .002 ; звонка
IN A,(#B7)
AND D
CP E
JR Z,WTCL3
DJNZ WTCL4
; можно занимать линию
RET

! не рекомендуется занимать линию в мо-
мент звонка (как-никак 120 вольт !!!),
нужно дождаться паузы между звонками (ска-
занное справедливо для любого оконечного
устройства телефонной линии).

__________________________

Вот и всё.

-+- iS-DOS 4.5




Темы: Игры, Программное обеспечение, Пресса, Аппаратное обеспечение, Сеть, Демосцена, Люди, Программирование

Похожие статьи:
Эпилог
Игрушки - Heavy on the magic.
Новости - Monster рассказывает об оболочке к газете.

В этот день...   21 октября