City #20
14 июля 1999

Планета Шелезяка - программирование XTR модема.



  ──══░░▒▒▓▓ ПЛАНЕТА ШЕЛЕЗЯКА ▓▓▒▒░░══──
            


 <LD> X-TRADE GROUP

             ╔════════════════╗
             ║                ║
   XTR-МОDЕМ               ║                ║
             ╚════════════════╝

                пpодолжение

              ПРОГРАММИРОВАНИЕ

    Для  любопытных пользователей сообщаем
необходимый  минимум информации. Общение с
модемом происходит через единственный порт
с адресом #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  PENTAGONа),
иначе растягивания не произойдет.


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

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

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

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

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





Другие статьи номера:

Вступление - юбилейный номер газеты "City".

Планета Шелезяка - программирование XTR модема.

Букашка - нова рубрика газеты.

Еще одна планета железяка - схема музыкальной карточки Soundrive v. 1.05

Смайлик - Юзеры с компютером- на "вы".

Ликбез - полный дизассемблеп ПЗУ TR-DOS'a.

БУК - Откудова у Герасима появилась энта Му-му.

Планета Шелезяка - ДОПОЛНИТЕЛЬНОЕ ОЗУ КЕШ.

Beatles Forever - "Как ветра осенние" (декабрь 1985 г).

Двиагтель торговли - Пpодам, куплю ,обменяю пpогpаммы для ZX Spectrum Каталог запишу бесплатно на ваши диски (5,25 или 3,5 дюйма).


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

Похожие статьи:
Металлургия - Описание схемы C-DOS модема.
Рассказ - Рассказ "Персона Грата".
Советы - Если ты упал...

В этот день...   16 июля