Deja Vu #08
31 мая 1999
  TR-DOS  

CODING - Как создать некопируемый сектор.

AY-Track:   -= 17 INSTANTS OF SPRINGS =-  
__________________________________________


(C) ALLEN/XLNC.
__________________________________________


     Как создать некопируемый сектор
     ...............................


Пункт первый. Вместо вступления...


   Многие  из  нас  часто  встречают такие
программы, которые ни в какую не копируют-
        ся  никакими  копировщиками. И это
        хорошо, т.к. авторы таких программ
        имеют   возможность  распоряжаться
        своим продуктом так, как этого хо-
        тят они, а не дядя Вася с барахол-
        ки,  который  привык  зарабатывать
        деньги при  помощи  McDonald Copy.
Думаю, не ошибусь, если скажу,что в каждом
городе есть свой дядя Вася,а то и не один.
И перед авторами  встает вопрос о том, как
бы так исхитриться записать на диск инфор-
мацию, что б ее никто не смог скопировать,
да еще и чтобы ее  можно  было  прочитать.
Многие авторы плюют на этот  вопрос  и ос-
тавляют все на самотек - авось пара долла-
ров перепадет от ламеров, которые даже  не
подозревают о существовании дяди  Васи  на
барахолке. Другие  обращаются  к  знакомым
IBM'щикам. Третьи  же начинают извращаться
на Спекки, правда, все, что до сих  пор на
Спекки сделано, копируется  так  же  легко
(вспомните, были времена,когда не все мог-
ли скопировать IS-DOS). Из  всех  этих пу-
тей самым приемлемым был второй,основанный
на некопируемых секторах. Но он  связан  с
офигительными расходами времени: можно за-
колебаться бегать к IBM'щику и назад домой
с кучей некопируемых дисков. Хорошо, когда
ПЦ стоит дома, но это дороговато, да и не-
удобно.

Пункт второй. Ближе к делу.


   В  статье  речь  идет  о том, как можно
сделать  некопируемые  сектора  на Спекки.
Для  начала  разберемся  с тем, почему это
некоторые  сектора не копируются. Да пото-
му,  что  их  нельзя отформатировать стан-
дартными  средствами Спекки. То есть, соз-
дать  заголовок  такого  сектора, чтобы ВГ
потом  нашла  его  и  знала, куда записать
данные.  А что может помешать его создать?
Да один простой факт: не все байты, посту-
пающие в регистр данных ВГ во время записи
дорожки,  переносятся  на  диск  напрямую.
Есть три бaйта, которые нельзя записать на
дорожку   стандартными   средствами:   это
#F5,#F6  и #F7. Причина проста: это управ-
ляющие  коды.  (Кстати, речь идет только о
режиме MFM. Режим FM применять нецелесооб-
разно.) Действуют  они только (!) в режиме
записи дорожки, т.е., форматирования. Пер-
вый  из  них  вызывает  запись кода #A1 на
диск,  который  является  частью синхроим-
пульса,  по  которому  ВГ  определяет, что
дальше  идет заголовок сектора или же дан-
ные.  Но не будем вдаваться в подробности.
Второй  из них вызывает запись кода #C2 на
дискету,  то  есть опять же ВГ прописывает
не  то, чего от нее хотят. Но самый полез-
ный код - код #F7, т.к. он вообще вызывает
запись  контрольной суммы, которая состоит
из двух байт, что обычно нарушает весь за-
головок. Ну и естественно, этот код #F7 на
диск  сам не передается. Итак, что же про-
исходит,  когда ВГ пытается создать на до-
роге такие сектора. А вот что: вместо того
параметра (номера дороги, головы, сектора,
длины  сектора), который  записан  номером
#F5,  #F6  или #F7, прописывается #A1, #C2
или  же  контрольная сумма пришедших байт,
то  есть практически случайное число, при-
чем  двухбайтное, то есть его запись рушит
даже  порядок  чисел, и то, что идет после
#F7, записывается не в то положение, в ко-
тором было, фактически заголовок полностью
разрушен.  А так как сектор будет иметь не
тe  параметры, ВГ не запишет данные из не-
копируемого  сектора никуда, то есть, если
там были ключи ксорки, копия будет как ми-
нимум  нерабочей. Из всего сказанного выше
рядовой  кодер  может  сделать  вывод, что
создать   некопируемые  сектора  на  треке
средствами  Спекки  невозможно (по крайней
мере, эта мысль красной нитью проходит че-
рез  весь  текст).  Можно, конечно, извра-
титься  и сделать контрольную сумму равной
этим  трем числам, но, признаясь честно, я
не знаю, по какому алгоритму считается эта
контрольная  сумма. Тем более, что имеется
куда более простой путь...

Пункт третий. Но как?


   А   вот  так.  Числа,  указанные  выше,
нельзя  записать  на трек во всех случаях,
кроме  одного.  Не  знаю, чем вызван такой
эффект, скорее всего, это какая-то недора-
ботка  программы микроконтроллера ВГ93, но
нам эта штука очень даже на руку. А случай
этот  заключается  вот в чем: после записи
контрольной суммы, ВГ почему-то записывает
на  диск  абсолютно  любой байт, включая и
это три рулезных. Если понятно, как заста-
вить  ВГ создать сектор номер (длина) #F7,
можете  дальше  не  читать. Если же вы еще
плохо разбираетесь с ВГ, читайте и запоми-
найте. Для начала расскажу, из чего состо-
ит сектор(а точнее, как его сформировать).

#F5,#F5,#F5
#FE


CN-номер  цилиндра. Как и все другие пара-
метры, этот номер лишь формальность, он не
влияет на позиционирование головы во время
форматирования,  а  лишь  записывается  на
диск, со всеми исключениями, перечисленны-
ми выше.
HN-номер  головки.  Хотя диапазон значений
этого  числа-всего  лишь  один  бит, число
опять  же  можно записать любое, кроме тех
самых трех, и опять  же для ВГ оно безраз-
лично во время форматирования.
SN-номер  сектора.  Все по-прежнему, число
просто переносится на трек.
SL-длина  сектора.  Все то же самое, число
тоже переносится.
CC-контрольная  сумма. Для ее записи нужно
один  раз  записать в регистр данных число
#F7.


22 байта #4E
12 байт  #00
 3 байта #F5
 1 байт  #FB


ДАННЫЕ СЕКТОРА.


(кстати,  на  резонный  вопрос, задаваемый
некоторыми,  звучащий  так:  "А почему при
реставрировании  не записывать данные сра-
зу, не командой записи сектора, а во время
форматирования?"  отвечу,  чтобы знали те,
кто  еще не понял: если в данных попадутся
все те же злосчастные три байта, запишется
фуфло. Так что, если есть желание - можете
прописывать, проверять, не то-еще раз про-
писали, уже записью сектора).
   Так вот, если любое из этих чисел заме-
нить  на #F7, то этот параметр и следующий
за   ним   заменят  псевдослучайные  числа
(практика  показывает, что они обычно одни
и  те же), а после них можно записать _лю-
бое_ число... То есть, я делаю так: тогда,
когда нужно подавать номер цилиндра, подаю
#F7. Тогда номер цилиндра и головы (сторо-
ны) заменят случайные числа. После этого я
подаю следующий #F7, он попадает аккурат в
место номера сектора, вслед  за ним можно
подавать длину сектора. Внимание! Тут есть
одна тонкость, но о ней ниже.
   Вот программа, которая расформатит трек
в соответствии с таблицей в конце програм-
мы. Адреса даны для DOS v5.03/5.04


        di
        ld hl,#3d98; Подпрограмма перетаскивает голову на
        call dos   ; нулевой цилиндр.

        ld hl,#1feb; Подпрограмма устанавливает текущей сторо-
        call dos   ; ну, на которой находится нулевой трек.
                   ; Есть путаница: нулевой стороной считается
                   ; та,  которой  соответствует  трек  номер
                   ; один, если считать до 160.

        ld a,#f4   ; Подача команды записи дорожки с паузой.
        ld bc,#1f  ;
        call otac  ;


        ld hl,tabl ; Таблица секторов, рассмотрена ниже.
        ld c,#7f   ; Регистр данных ВГ93.
m1      ld b,#0a   ; Эта п/п выдает B байт значения D в рег. C
        ld d,#4e   ; А вообще, создается пробельчик.
        call l20b1 ;


        ld b,#0c   ; Создается массив, указывающий на заголо-
        ld d,0     ; вок сектора.
        call l20b1 ;
        ld b,3     ;
        ld d,#f5   ;
        call l20b1 ;


        ld d,#fe   ; Эта п/п выдает один байт значения D.
        call l20af ;


        ld d,(hl)  ; Берется номер цилиндра из таблицы
        call l20af
        inc hl
        ld d,(hl)  ; Номер головки
        call l20af
        inc hl
        ld d,(hl)  ; Номер сектора
        call l20af
        inc hl
        ld d,(hl)  ; Длина сектора
        call l20af
        ld d,#f7   ; Контрольная сумма заголовка.
        call l20af


        ld b,#16   ; Пробел номер два
        ld d,#4e
        call l20b1
        ld b,#0c   ; Синхропромежуток
        ld d,0
        call l20b1
        ld b,3     ; Синхроимпульс, запишется #A1
        ld d,#f5
        call l20b1
        ld d,#fb   ; Метка данных
        call l20af
        ld a,(hl)  ; Проверка объема сектора.
        and 3      ; Как и ВГ, программка проверяет по двум
        cp 0       ; битам. Кстати, это удобно тогда, когда
        jr z,k128  ; длина сектора-нестандартное число.
        cp 1       ;
        jr z,k256  ;
        cp 2       ;
        jr z,k512  ;
k1024              ; Так вот. Килобайтовый сектор-мелочи,
        ld b,0     ; самое важное- то, что вы прочитаете
        ld d,0     ; в конце программки.
        call l20b1 ;
        ld b,0     ;
        ld d,0     ;
        call l20b1 ;
        ld b,0     ;
        ld d,0     ;
        call l20b1 ;
        ld b,0     ;
        ld d,0     ;
        call l20b1 ;
        jr m5      ;
                   ;
k128    ld b,128
        ld d,0
        call l20b1
        jr m5
k256
        ld b,0
        ld d,0
        call l20b1
        jr m5
k512
        ld b,0
        ld d,0
        call l20b1
        ld b,0
        ld d,0
        call l20b1
m5
        ld d,#f7   ; контр. сумма
        call l20af
        ld b,#32
        ld d,#4e
        call l20b1
        inc hl
        ld a,(hl)
        cp #ff     ; если не конец-повторили.
        jp nz,m1   ;
        ld b,0     ; дописали конец трека,
        ld d,#4e   ;
        call l20b1 ;
        jp m,m2    ;
        call l20b1 ;
m2
        ret        ; выход из программки.
l20b1   ld iy,#20b1
        push iy
        jp #3d2f
l20af   ld iy,#20af
        push iy
        jp #3d2f
otac    ld iy,#2a53
        push iy
        jp #3d2f
dos     push hl
        jp #3d2f
tabl
        db 0,0,1,1
        db 0,0,2,1
        db 0,0,3,1
        db 0,0,4,1
        db 0,0,5,1
        db 0,0,6,1
        db 0,0,7,1
        db 0,0,8,1
        db 0,0,9,1
        db #f7,#f7,3,#f7
        db #ff


;первое число - цилиндр,
;второе - головка,
;третье - номер сектора,
;четвертое - длина.

   Совсем  необязательно  ВТОРОЕ (первое -
- всегда  #F7) число делать #F7. Я предпо-
читаю  его,  а кому-то больше подойдет #F6
или #F5. Так как метод описан,как метод, а
не как пример программы, которая почему-то
работает, делайте так, как вам нравится.
   И в конце самое важное. В качестве дли-
ны некопируемого сектора идет ТРЕТЬЕ число
в  линии, а четвертое должно быть #F7. Это
несколько  ограничивает программиста, т.к.
если  это число будет не #F7, то почему-то
поле  данных  не  находится.  Длина такого
сектора  будет  равна килобайту.  Если же
просто  необходимо сделать сектор поменее,
то  придется после его форматирования про-
писать  его  нулями,  иначе  от него будет
только  заголовок. Причина в том, что сме-
щается  заголовок  начала  области данных.
При этом не гарантируется сохранность сек-
тора,  следующего  за  ним. Короче говоря,
надежнее всего работать с программкой так,
как  она  написана. Хотя опытный кодер сам
разберется, моя задача была только подска-
зать метод создания некопируемого сектора.

Внимание!  На статье стоит знак копирайта,
а это значит, что каждый, воспользовавший-
ся МОИМ методом создания некопируемых сек-
торов,  по  идее должен отметить этот факт
на видном  месте  где-нить в HELP'е в Cre-
dits.  Так  как существует еще один метод,
как  оказалось,  он  применен в программке
"Protect",  помещенной в приложение к DEJA
VU 7, легко различить, который из них при-
менялся: различаются номер цилиндра и сто-
роны. Так, при работе моей программки, они
равны соответственно #B2 и #30. Хотя, если
кто захочет, может и не указывать, чей ме-
тод применялся, если он не уважает авторс-
кие права, а значит, и Сцену Спектрума.
   На  этом я хотел бы закончить свою ста-
тейку, попросить извинения за нескладность
изложения  и  за отнятое пространными выс-
туплениями  время.  Надеюсь, вышесказанное
понадобится хотя бы кому-нибудь.

Буду  рад ответить на все вопросы, связан-
ные со Спекки. Пишите мне:

454129 Челябинск,
Новороссийская,
дом 93, кв. 14
Мазырко Борису Валерьевичу
(As ALLEN/XLNC)




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

Аперативчик - Об управлении в оболочке DEJA VU

Аперативчик - Номер вышел с опозданием на месяц.

Аперативчик - Халявы больше не будет.

Тема - Резервы #2. Перспектива.

Тема - О работе с электронным диском в IS-Dos.

Тема - Новый перекресток - кое-что из сложностей игры The Castle.

Тема - Принтер и ZX-Spectrum (система команд принтеров семейства Epson).

Капля припоя - Ода часам.

Капля припоя - Сканер v1.3.

Капля припоя - Disk protector v1.4 (схема).

SOFTWARE - Обзор новинок демок: Iris UltraDemo, Lazarus Trackmo, Russian Fields of Experiments, Pressure Trackmo.

SOFTWARE - Обзор новинок игр: Белый Орел, Leprekon,Козел,Puzzle (prerelease от Flash), Space, Translate Worlds,Devil-s Curse, Choppers: death match, Twilight: The Land of Shadows, Falen Angel, 12 Тайных книг, The Cezar,Chainick horror in Flat.

SOFTWARE - Обзор системок: ASCII Convertor v2.71 , Global Commander v1.31, BA v1.0, X-Copy.

SOFTWARE - Люди, как боги: сценарий к игре Elite III

SOFTWARE - О работе с программой для печати изображений XL-graph.

CODING - The Оптимизация - построение таблицы частоты повторения байтов.

CODING - Универсальный Player - Pro Tracker v3.31.

CODING - Недокументированные особенности процессора Z80.

CODING - Конверсия графики в текст-формат ASCII.

CODING - Как создать некопируемый сектор.

CODING - BUGS в Plaeyer-e Pro Tracker 3.x

ANOTHER WORLD - Процессор Pentium III.

ANOTHER WORLD - На стыке трех миров.

ANOTHER WORLD - Новости из мира Амиги.

ANOTHER WORLD - Мой выбор - ПЦ?.

Доска почета - Что мы думает о сцене.

Доска почета - Все на party!

Доска почета - О CD-ROM проекте из города Кемерово.

Семь и 1/2 - День дурака.

Семь и 1/2 - Нарочно не придумаешь: семь историй от продацов ZX софта.

Семь и 1/2 - Анекдоты.

Проба пера - Амига rulez или suxx?

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


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

Похожие статьи:
B.B.S. Новости - О новой B.B.S. - Chip-BBS.
humor - aнекдот недели от Freeman'a
IBM Новости - О компакт дисках для IBM.

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