Move #07
07 июня 1997

C-DOS MODEM - Что такое C-DOS? Установка режимов. Каким образом C-DOS осуществляет передачу данных?

<b>C-DOS MODEM</b> - Что такое C-DOS? Установка режимов.
 Каким образом C-DOS осуществляет передачу данных?
               C-DOS МОДЕМ
──────────────────────────────────────────
(c) Ars

    В  этом  номере  я  продолжаю описание
C-DOS модема. Прежде всего скажу пару слов
об самой программе. Самая первая программа
поддержки  (также как и первая схема C-DOS
модема)   принадлежит   московской   фирме
"Аллегро"  (не  путать  с минской ALIBRO).
Кстати  все  ли  знают,  что  такое C-DOS?
Вообще-то      это     аббревиатура     от
Communication Data Operating System, что в
переводе само по себе не нуждается, однако
как  бы  намекает  на  то,  что черточка в
сокращении  CDOS  никчему.  Ну да ладно, с
черточкой этой...
    Итак,  основные  кодовые  доработки  и
дизайн  C-DOS'а  сделал  Robert & Modem'Co
под   мудрым   руководством   KSA.  И  это
произошло,  судя  по  дате  копирайта аж в
1994  году.  С тех пор много воды утекло и
много пива выпито... Я повидал кучу версий
C-DOS'а, а именно: 2.00, 2.50, 3.00, 3.33,
3.34,  1.05,  1.06,  1.07, 1.10. Это все -
московские   версии  и  указаны  они,  так
сказать,  в  порядке  увеличения наворотов
(глюков  :-).  Описывать,  что  за они и к
чему я не буду, об этом можно прочитать из
московских   сетевых   газет.   Хочу  лишь
обратить   внимание   на   один   факт:  в
наворачивании   or/and/xor  обезглючивании
C-DOS'а  приняла  участие  толпа народа, а
именно:  FANTOMASSOFT,  КОЛОВОРАТЪ & Wolk,
MPR,  etc.  Было  сделана  масса  полезных
вещей,  типа  спикерфона,  файла  HISTORY,
устранен  конфликт  АОН'а  и модема и т.д.
Менюшка  с  копирайтом, которая появляется
при   загрузке   C-DOS'а,   уже  не  могла
вместить  всех желающих, и потому она была
благоразумно  расширена и растянута. Между
тем,  несмотря  на все эти весьма полезные
новшества,  не  было сделано элементарного
обезглючивания   этой  действительно  всем
нужной  програмки. Глюки и глючки кочевали
из   одной   версии   в   другую,  бережно
сохраняясь  и  приумножаясь. :( И еще одно
наблюдение,    которое    можно    сделать
невооруженным    глазом:    все   основные
процедуры  C-DOS'а, как в версии 2.00, так
и   в   2.50,  3.00,...,  короче  во  всех
остальных  тоже,  находятся по одним и тем
же  адресам  в  памяти. О чем это говорит?
Есть  одна  небольшая  идейка...  Да никто
никогда   в   глаза   не  видал  исходника
программы  C-DOS!  Все  основные доработки
программы  выполнялись  в самом популярном
на   сегодняшний   день   ассемблере   под
названием STS!...;-(
    Вообщем,  понятно  куда  я клоню. Если
вам  действительно  нужен  новый C-DOS, то
дело  только в процедурах взаимодействия с
железом. Оболочка - это дело ерундовое, ее
может написать любой кодер. А вот копануть
железо  поглубже,  это  уж извините, будет
посложнее.  Это вам не оболочки кодировать
;-) Так что, я обращаюсь ко всем 2day real
software  &  hardware crackers: что, слабо
ломануть  C-DOS'ку??? На сегодняшний день,
на   мое  предложение  отклинулась  только
группа   E-Mage   из  Гродно,  за  что  ей
огромное спасибо!
    Для затравки опишу каким образом C-DOS
осуществляет  передачу  данных.  Я привожу
здесь    исходник    процедуры   передачи,
полученный    путем    дизассемблирования.
Некоторые   команды   (ненужные   на   мой
взгляд?)  я  взял  в  комментарии.  Честно
говоря,  я  не  думаю,  что таким способом
обеспечивается точная длительность сигнала
в  тактах либо обеспечивается что-то вроде
компенсации переходных процессов. Но может
быть   я   и  не  прав  или  пока  что  не
разобрался :(

;Procedure Transmit

        DI
        LD HL,(Start)   ;рассчитываем
        LD DE,(Length)  ;адрес конца
        ADD HL,DE       ;блока
        LD (End),HL
        LD B,#40        ;начало блока-
Header  EXX             ;длинный пилотон
        ;LD A,(IX+#00)  
        CALL Out1
        EXX
        DJNZ Header
Next_N  LD HL,(Start)   ;начало байта-
        CALL Out0       ;стартовый пилотон
Next    LD DE,(End)     
        ;XOR A
        ;XOR A
        BIT 0,(HL)
        CALL Z,Out0     ;передача 0-го 
        CALL NZ,Out1    ;бита байта
        ;LD A,(IX+#00)
        BIT 1,(HL)
        CALL Z,Out0     ;следующий бит
        CALL NZ,Out1    ;байта
        ;LD A,(IX+#00)
        BIT 2,(HL)
        CALL Z,Out0     ;и т.д.
        CALL NZ,Out1
        ;LD A,(IX+#00)
        BIT 3,(HL)
        CALL Z,Out0
        CALL NZ,Out1
        ;LD A,(IX+#00)
        BIT 4,(HL)
        CALL Z,Out0
        CALL NZ,Out1
        ;LD A,(IX+#00)
        BIT 5,(HL)
        CALL Z,Out0
        CALL NZ,Out1
        LD A,(IX+#00)
        BIT 6,(HL)
        CALL Z,Out0
        CALL NZ,Out1
        ;LD A,(IX+#00)
        BIT 7,(HL)
        CALL Z,Out0
        CALL NZ,Out1
        ;LD BC,#0000
        XOR A
        OR (HL)
        EX DE,HL
        CALL PE,Out0    ;9-й бит!
        CALL PO,Out1    ;бит четности
        ;LD A,(IX+#00)
        INC DE
        ;LD BC,#0000    ;в версии Normal-
PilotE  NOP             ;CALL Out1 (пило-
        NOP             ;тон конца байта)
        NOP             
        SBC HL,DE       ;проверка endblok
        EX DE,HL        ;в версии Normal-
NextJP  JP NZ,Next      ;or JP NZ,Next1
        CALL Out1       ;конец блока
        RET

Out0    ;LD BC,#0000    ;формирование
        LD A,(Sys)      ;меандра для
        XOR #80         ;передачи сигнала
        OUT (#EF),A     ;логического 0
        CALL Out0H      ;(высокая частота)
        XOR #80
        OUT (#EF),A
        CALL Out0L
        XOR A           ;установка флага Z
        RET             

Out1    LD A,(Sys)      ;формирование
        XOR #80         ;меандра для
        OUT (#EF),A     ;передачи сигнала
        CALL Out1H      ;логической 1
        XOR #80         ;(низкая частота)
        OUT (#EF),A
        CALL Out1L
        RET

Out0H   LD B,#2C        ;условно: передний
        DJNZ $          ;фронт импульса
        ;NOP            ;для логич.0
        RET
Out0L   LD B,#24        ;задний фронт
        DJNZ $          ;импульса для 
        ;NOP            ;логич.0 (поляр-
        RET             ;ность - противо-
                        ;ложная)
Out1H   LD B,#5C        
        DJNZ $          ;передний фронт
        ;NOP            ;импульса для
        RET             ;передачи лог.1
Out1L   LD B,#55
        DJNZ $          ;задний фронт
        ;NOP            ;импульса для
        RET             ;передачи лог.1

Start   DW 0
Length  DW 0
End     DW 0
Sys     DB #20          ;состояние порта
                        ;модема

    Теперь комментарии к процедуре. Прежде
всего  обратите  внимание, как реализована
частотная   модуляция   при   передаче   -
процедуры  Out0  и  Out1: логические 0 и 1
передаются (модулируются) в виде частотной
посылки   (форма   сигнала  -  практически
меандр),  причем  частота передачи сигнала
"1"  примерно  в 2 раза меньше, чем "0". В
принципе  здесь  имеются  все  аналогии  с
форматом  передачи на ленте. По телефонной
линии    сигнал    идет    уже    в   виде
синусоидального    сигнала.    А   входной
усилитель      модема      преобразовывает
(демодулирует)   этот   сигнал   снова   в
прямоугольный.
    Передача   информации   осуществляется
блоками.    При    установлении   коннекта
передается    заголовок    с    системными
параметрами:  тип  версии, номер телефона,
пароль  и  т.п.  При  передаче  файла блок
имеет   размер   1   сектор   +   2  байта
контрольной  суммы. Начало блока заносится
в  переменную  Begin,  длина - в Length. В
начале передачи блока сразу посылается для
синхронизации   пилотон   (метка  Header),
представляющий  собой  меандр определенной
длительности  с  частотой, соответствуюшей
логической   1.   Далее  передается  более
короткий   стартовый  пилотон  с  частотой
логического  0. После этого передается сам
байт  побитно,  с  0-го  по  7-й  бит.  По
завершению  передачи всех 8 бит посылается
бит  четности:  это  логич.0, если в байте
четное   число  установленных  битов  либо
логич.1,  если  число  единииц  -  нечетно
Наконец посылается завершающий пилотон для
байта   (логич.1).  В  самом  конце  блока
посылается  такой  же  пилотон как признак
конца передачи.
    Данная        процедура       Transmit
соответствует   режиму  Turbo.  В  режимах
Normal и Turbo2 есть некоторые отличия.
    В   режиме  Usual,  не  совместимом  с
Turbo, синхронизирующие сигналы посылаются
при   передаче  каждого  байта.  В  режиме
Turbo2,  совместимом с Turbo, используется
автоматическая    настройка   длительности
фронтов  в  процедуре  приема, а начальные
задержки   уменьшены.   В   режиме  Turbo2
скорость  автоматически устанавливается по
max  для  данной линии, что, кстати, очень
актуально при пересылке больших файлов.
    Время  передачи  блока  в  16  Кб  при
отсутствии ошибок:

      ┌─────────────┬──────────────┐
      │   version   │     time     │
      ├─────────────┼──────────────┤
      │    Usual    │ 1 мин. 50 с. │
      │    Turbo    │ 1 мин. 30 с. │
      │   Turbo 2   │ 1 мин. 08 с. │
      └─────────────┴──────────────┘
 
    В   режиме   Turbo2  при  установлении
оптимальной       скорости      происходит
ступенчатое   снижение  частоты  передачи,
вплоть до Turbo-версии.
    В    заключении    приведу   процедуру
установки режимов (только ту их часть, что
касается процедуры Transmit).

;Procedure Set_Version

        LD A,(Vers)     ;номер версии:
        OR A            ;0-Usual
        JP Z,SetV_N     ;1-Turbo
        DEC A           ;2-Turbo2
        JP Z,SetV_T

SetV_T2 Call SetPil0
        LD BC,#2220
        LD DE,#5622     ;min длительность
        CALL SetOut     ;заднего фронта
        . . .
        RET

SetV_T  Call SetPil0
        CALL SetOut0
        . . .
        RET

SetV_N  LD A,#CD        ;у каждого байта
        LD HL,Out1      ;есть пилотон!
        Call SetPil
        Call SetOut0
        . . .
        RET

SetOut0 LD BC,#2C24     ;значения длитель-
        LD DE,#5C5F     ;ности фронтов для
SetOut  LD A,B          ;Usual и Turbo
        LD (OutOH+1),A  
        LD A,C          ;расставляем
        LD (OutOL+1),A  ;константы
        LD A,D          ;передачи
        LD (Out1H+1),A
        LD A,E
        LD (Out1L+1),A
        RET

SetPil0 XOR A           ;для Turbo-версий
        LD HL,0         ;нет пилотона для
        LD DE,Next      ;каждого байта
SetPil  LD (PilotE),A
        LD (PilotE+1),HL
        LD (NextJP+1),DE
        RET

    На  этом  пока  что все, но я надеюсь,
что   совместными   усилиями   мы   быстро
разберемся    с   C-DOS'ом.   Ваши   идеи,
предложения и процедуры принимаются на FTL
BBS   в   файлах   FOR_CDOS   -  файлы  НЕ
секретные.



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

Письмо - Письмо от Postman'a в газету.

От редакции - сомненение в целессобразности газеты.

C-DOS MODEM - Что такое C-DOS? Установка режимов. Каким образом C-DOS осуществляет передачу данных?

Музыкантам - PROFESSIONAL SOUND CREATOR demo realise (E-mage) : основ- ные параметры , горячие клавиши редактора.

CHEAT - Несколько полезных советов для любителей MORTAL COMBAT , STRIP REVERSI.

Реклама - Реклама и объявления.


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

Похожие статьи:
Железо - небольшая доработка ZSC модема.
Учебник - "Ветви персика": Многотомное издание индийских монахов, которые пытаются научить духовной и плотской любви людей (продолжение).
Новье !? - О программах: Seymous wild west adventure, Paris to Dakar, Sergant Seymour Robotcop, Sky Hight Stuntman, Bubble Dizzy, CJ'Elephant Antics, Grell and Falla, Amazing Adventures of Robin Hood, Murray mouse super cop.
HOT GAMES - Лучшая десятка от Magic Soft.
Demo Party - обзор демосцены за 1999 год.

В этот день...   20 января