──══░░▒▒▓▓ ПЛАНЕТА ШЕЛЕЗЯКА ▓▓▒▒░░══──
<LD> X-TRADE GROUP
╔════════════════╗
║ ║
║ XTR-MODEM ║
║ ║
╚════════════════╝
продолжение
ПРОГРАММИРОВАНИЕ
Для любопытных пользователей сообщаем
необходимый минимум информации. Общение с
модемом происходит через единственный порт
с адресом #B7 (183).
IN A,(#B7), если линия не занята модемом
Bit7 BitO
0 0 линия не подключена к модему
0 1 снята трубка паралл. аппарата
1 0 звонок ( возможны глюки )
1 1 линия свободна
IN A,(#B7), если линия занята модемом
Bit7 всегда 0
BitO через него идут принимаемые данные
OUT (#B7),A
BitO при занятой линии - передаваемые
данные, при приеме д.б. =1
при освобожденной линии неактуален
Bit1 1-занять линию
0-освободить линию
BitЧ биты определяют время, до которого
BitS аппаратно растянется интервал вре-
Bit7 мени между двумя соседними коман-
Bitб дами IN A,(#B7) или OUT (#B7),A
Bit7-BitЧ
#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 тактов heTURBO
PENTAGONa, 16 тактов TURBO PENTAGONa),
иначе растягивания не произойдет.
Пример паузы в .002 секунды:
W002 XOR A
OUT (#B7),A ; период 32 мкС
LD B,62
W002_1 IN A,(#B7) ; 62*.000032=.001984
DJNZ W002_1
...
На любой машине это будет .002 сек,
независимо от TURBO/heTURBO.
Примеры программирования:
освободить линию OUT (#B7),#F0
занять линию OUT (#B7),#F3
Набор номера (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
WTCLO LD BC,#FFOO
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,WTCLO ; нет звонка
WTCLЗ LD B,0 ; ожидаем конец
WTCLЧ WAIT .002 ; звонка
IN A,(#B7)
AND D
CP E
JR Z,WTCLЗ
DJNZ WTCLЧ
; можно занимать линию
RET
! не рекомендуется занимать линию в
момент звонка (как-никак 120 вольт !!!),
нужно дождаться паузы между звонками
(сказанное справедливо для любого
оконечного устройства телефонной линии).
Other articles: