Move #07
07 июня 1997

C-DOS MODEM - Что такое 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.

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


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

Похожие статьи:
Бейсик - Кароче пацаны, щас я расскажу вам как надо работать в базике.
Demo-строение - Заливка треугольника, Гуpо shading, Наложение текстуры.
Информация об оболочке - Я, Мистер Глюк, сотворил данную оболочку по образу и подобию Форматовской...

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