Из журнала Deja Vu #08, Кемерово, 1999 (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)