1.15. ИНФОРМАЦИЯ О TR-DOS
1. TR-DOS занимает 112 байтов памяти с произвольным доступом.
2. Без присоединенной TR-DOS RAM пользователя начинается с адреса
23755, при присоединенной TR-DOS RAM:пользователя начинается с адреса
23867.
3. TR-DOS использует сектора дйска дйя^шзя&я данных и; программ
(см раздел 1), если количество байтов превышает256, используется другой
сектор. Это продолжается до тех пор, шжа.ие происходит запдоь:йй?го фай-
ла. Для записи 522 байтов потребуется 3 сектора. Третий. сектор!содержит
только 10 байтов. Только эти 10 байтов будут загружены <?;М^^;ОЬта^хпиеся
пустые 246 байтов не загружаются, чтобы не затереть другае данные, которые
могут находится в памяти SOS.
4. В дополнении к 112 байтам RAM ТКн{ЮЁ: Также использует буфер в
256 байтов при осуществлении доступа к диску. Этот буфер имеет динами-
ческое распределение. При выполнении больного количества команд TR-
DOS сначала сдвигает программу BASIC (если таковая существует) вверх с
целью создания буфера. После завершения команды, программа BASIC пе-
редвигается назад к своей исходной позиции. Эта операция происходит нез-
аметно.
5. Команда MOVE требует 4К (минимум):йз;SPECTRUM RAM в каче-
стве рабочего пространства. Если MOVE вьшолняётся^ a i программа еще в
памяти, необходимо перевести компьютер в исходное:с0стшние.и затем вы-
полнить MOVE. Перевод компьютера в исходное состояние Mo^tiSbni осу-
ществлен с помощью возврата к SOS и ввода RANDOMIZE USR! или с
помощью системного переключателя переводом ег&з положение "фброс".
6. На одном диске может находится до 128 файлов.
2. АДАПТАЦИЯ ПРОГРАММ ВЩЩ№
В СИСТЕМЕ TR-DOS
2.1. КАК БОРОТЬСЯ СгБЕИШКШр1
Загрузчики программы, с которыми вы .можете встретиться, можно раз-
делить на три категории: загрузчики на Бейсике (загрузка производится опе-
ратором LOAD), загрузчики в машинных кодах!и: смешагшые загрузчики.
Самое простое и приятное, с чем вы можетеcixS^^ это безусловно,
загрузчики на Бейсике. Их, в свою очередь можно рйдёлить на открытые и
закрытые.
Открытые загрузчики — это тагаё зщруэтики, когда нажимаешь BREAK
после загрузки первого файла (т.е.; Загрузчика)»: затем ENTER, и на приятном
голубом фоне сицим цветом появляется: :;
10 INK 1: PAPER 5: BORDER 5:25199||:
20 LOAD ""SCREE^hLQAD ""СОЙЁ Ч!=I i 11 ill I1
30 RANDOMIZE и§Й'^7бё;|или::что-то в'ёТбй роде.
Я надеюсь, что не ущемЛю'^ше самолюбие, если все-таки покажу, как
такую программу адаптировать на
10 INK 1: PAPER 5: BQ.RDER 5: CLEi#f5:199
20 RANDOMIZE USR 15ШГ REM:..LOAD ':j'namerC0DE 16384
25 RANDOMIZE USR|5619:::ЙЁМ;1!::ША0 "name2"C0DE
30 RANDOMIZE USR ШдШ^'
где camel и namel ^-1 названия, .которые вы присвоите последующим
файлам»::!:!::::.. ..........
В бшвшм случаев названия файлов можно оставить старыми, но
это по нескольким причинам.
Во-первых, названия файлов в. кассетной версии могут содержать симво-
лы или комбинации сиЖалов, которые будут восприниматься системой TR-
DOS неправильно (так, например, встретив оператор LOAD ИВ:SCREEN",
система будет загружать файл SCREEN с дисковода^В", а отнюдь не файл
"BtSCREEN", как вам этого хотелось).
Во-вторых, если на кассете файлов с названием SCREEN может находи-
тся ровно столько, сколько их туда влезет, то на диске такой файл может
содержаться только один; тагам образом, желательно, чтобы названия всех
файлов программы была связаны с названием самой программы (например
rambo sc, rambo cd и r^ljlli Кроме того, считается хорошим тоном называть
основной фавд:^^ужаемьш) заглавными буквами, а остальные файлы —
Полагая^:nto необходимые файлы пока еще на кассете, можно рекомен-
довать-изменить их названия на желаемые, воспользовавшись обыкновенным
копировщиком (TF COPY, COPY DE LUXE, COPY COPY и др.).
После этого вам останется скопировать файлы на диск при помощи спе-
циального котшр^йш^а. Лучше всего воспользоваться копировщиком Pro-
grammable : Copier::v2.0 (PCOPffiR) или AMCOPIER. В этом случае вам,
во-первых, не придется изменять названия файлов заранее (можно будет из-
менить названия оператором1 ;NEW системы TR-DOS после копирования
файлов на диск), .а вр^вторьк,' можно быть уверенным, чпго файл и диск не
будут испорчены можно добиться использованием копировщика Дере-
щука).
Но вот, самым тщательным: образом просмотрев все свои диски, вы окон-
чательно убедились, что; "специального копировщика" у вас нет. Не отчаи-
вайтесь, еще не всб.дояёряно, даже такой беде можно помочь. Для этого
загрузите обьпшовешшй копировщик и в!шмательно изучите все, что он вам
расскажет о ваших файлах. Вам дамф знать длину и стартовый адрес загру-
зки каждого файла.
Записав всю инфорШЦШ^а^ можете смело нажимать
кнопку сброса. Теперь, обладая столь ценным материалом, вы можете дейс-
твовать дальше.
Пусть, например, копировщик сообщил вам следящее:
файл SCREEN — стартовый адрес 49152,.длина.69.12
файл CODE — стартовый адрес 2520&:ШШ 40335, тогда переделайте
первоначальный вариант загрузчика .слф^щим образом
10 INK 1: PAPER 5: B0RDEfil:6^!^lL^AR 25199
20 LOAD " "SCREENS %'
21 RANDOMIZE USR 15619: REM: SAVEj^shaky scJ!:
CODE 16384,6912
30 LOAD ""CODE
31 RANDOMIZE USR 15619: REM: SAVE:."shaky mn"
CODE 25300,40335
40 STOP т.е. после каждого оператора затрузвд Pi ДЗйфЙ • вставьте Опера-
тор записи на диск, указав длину, данную.: копи^вйдаом. Если загрузчик
специально не определяет стартовый адрес заг^кн; то воспользуйтесь адре-
сом, который вам любезно предоставил копировщик, в противном случае,
используйте адрес, по которому файл загружается с ленты. В данном примере
копировщик указал стартовый адрес первого файла равным 49152, а загрузка
производится оператором LOAD ""SCREENS, что является эквивалентом
оператора LOAD ""CODE 16384, 6912, поэтому файл необходимо записы-
вать с адреса 16384, а не 49152.
На этом, как правило, ваши мучения должны зжончиться. Единственной
серьезной проблемой при переделке программ с таю»* • ^йфузчиком может
стать то, что цвет фона и листинга будут совпадать, и; вам пр!йдйся:изменить
текущий цвет оператором INK либо PAPER, но даже этого можно :шбежать,
воспользовавшись оператором MERGE вместо оператора LOAD при загрузке
файла загрузчика. В этом случае программа не запустится, а появится сооб-
щение О ОК, 0:1. Единственное, чего не следует забывать;, *гш .таким методом
загрузки можно воспользоваться только на чистой машине (Шс бёгате за тря-
пкой, я имею ввиду, что вы только что отпуртйЩ кнопку сброса).
Другие проблемы, которые могут возникнуть; рассмотрены ниже.
Буду надеяться, что с этим вопросом уступила ЦйЩ^.^сность даже у
того, кто ничего не понял.
Теперь можно обсудить сложности, ксгёорые могут возникнуть при встре-
че с закрытым загрузчиком на БЕЙСИКе."
Ваше счастье, если просмотрев листинг протраммы; вы увидите то, что
было показано в предыдущем примере, но на практик гораздо чаще попа-
дается что-нибудь вроде:
О REM S.S Captain, why don'tjiyou gdJfMCkijyp.MijSelf?
0 DRAW USR VAL "24500", deBhUGi Ibeh'Mj-
0 REM FLASH DRAW???Aw COPY М:ййи ewp более страшное.
He хотелось бы.-делать из этой программу! философское эссе об интер-
претации операторов и строк; Бейсик-систеМЫ, йо некоторые теоретические
моменты придется разобрать/1;;:;;: !.; .
Защищать Бейсик-программу 6f Й р&мотра и редактирования можно не-
сколькими способами. Рассмотрим наиболее популярные из них.
Вы, вероятно, уже сталкивались с таким фокусом, как нулевая строка,
которую нельзя ни удалить, ни;$Ш&ать для редактирования. Управиться с
такой защитой можно;двумя способши:
Первый способ заЛЦфч^сй в том,; <гто вы загружаете одну из многочис-
ленных сервисных программ, которая, позволяет перенумеровать строки, по-
сле вьщ&лйрия которой вы получите вполне доброкачественный листинг (в
плане ibrcyi^iwI hy^epbK строк и т.п.).
Второй способ: ;бшее интересен, но наиболее эффективен только в том
случае, если нулевая Ь^йта бдаа^и располагается самой первой в программе.
Кроме того, воспользовавшись вторым способом, вы сможете сами генери-
ровать нулевую строку.
Для начала небольшое теоретическое вступление о хранении строк Бей-
сика в памяти, На следующей диаграмме показана строка Бейсика:
номер строки |
длина строки |
операторы |
перевод |
(2 байта) |
(2 байта) |
Бейсика |
строки |
Вас интересуют два первых байта строки, а именно байты, задающие
номер строки. Вы уже, вероятно, поняли, что изменить номер строки проще
простого непосредственным вводом числа оператором РОКЕ, но куда вво-
дить?! Вот этим вопросом мы сейчас и займемся.
Определить начало Бейсик-программы (т.е. начало самой первой строки
Бейсик-программы) можно, воспользовавшись системной переменной Бей-
сик-интерпретатора. Она находится по адресу 23635 и занимает 2 байта.
Таким образом, получить адрес первого байта первой строки Бейсик-про-
граммы можно, выполнив оператор:
PRINT РЕЕК 23635+256*РЕЕК 23636
Если к вашему агрегату не подключено никакой периферии, то на этане
вы увидите число 23/55. В том случае, когда вы имели контакт с TR-DOS,
адрес будет 23867.
Итак, адрес, по которому можно изменить номер начальной строки Бей-
сик-программы, обнаружен: это, к примеру, адрес 23755. Теперь надо уяс-
нить, что же все-таки нужно вводить по этому адресу. Номер строки можно
установить следующим образом:
РОКЕ 23755,NM-256*INT (NM/256): РОКЕ 23756, INT (NM/256) где
NM — номер строки, который вы хотите присвоить начальной строке Бей-
сик-программы.
Это идеальный способ переопределения строки, можно поэксперименти-
ровать с номерами строк более 9999 — вы получите весьма оригинальные
результаты.
Как показывает практика, необходимость задавать номер строки более
255 возникает редко. В этом случае можно воспользоваться более простым
оператором:
РОКЕ 23756,NM где NM — номер строки не более 255 (еще раз хочу
напомнить, что последние два примера приведены исходя из того, что Бей-
сик-программа начинается с адреса 23755). Этим оператором изменяется то-
лько младший байт номера строки.
Выше было сказано, что такой способ эффективен в том случае, когда
нулевая строка находится в начале программы. На самом деле, ничто вам не
мешает изменить номер второй по счету и последующих строк. Для этого
необходимо использовать информацию о длине строки, содержащуюся в дву-
хъ следующих за номером строки байтах. Прибавив длину строки к ее нача-
лу, вы получите начало следующей
Со строками разобрались, теперь попытаемся разобрать другое способы
защиты Бейсик-программ.
Другим, не менее распространенным способом является добавление в
строки Бейсика различных контрольных кодов. Такими контрольными ко-
дами могут являться коды управления INK, PAPER, AT, TAB и другие. Пол-
ную таблицу контрольных кодов вы сможете найти в любом приличном
описании SPECTRUM-Бейсика.
Большинство таких контрольных кодов можно удалить клавишей DE-
LETE, вызвав строку для редактирования. Поочередно нажимайте клавишу
передвижения курсора вправо и DELETE. Рано или! поздно вы увидите впо-
лне осмысленную информацию. .^iiliJIlii!::::;:..
Все это хорошо пройдет лишь тогда, когда авторами защита нспрльзо-
вались корректные контрольные коды. Но бывает фхуже. Когда БтейЬйк-ин-
терпретатор просит вывести листинг программы Ш-м цветом начиная с
координаты 240,86, он просто-напросто прекращаем : йывод на экр№, а при
попытке редактирования начинает орать истошным гшреом]; Bee; ёш попы-
тки кричать можно прекратить оператором ГОКЕ 23608,0. Теперь можно
действовать по старой схеме.
Снова немного теории.
ДХлся: начала надо объяснить разницу между контройьЁШ кодом INK и
оператором INK. Когда при вьюоде листинг^ на экран Бейсйк-система встре-
чает оператор INK, она честно выводит: & j же встречается контро-
льньгй код INK, то следующий за ним байт оп^дшшефадет "чернил" и вывод
продолжается другим цветом. Контрольный код ШК:й оператор INK разли-
чаются своими кодами в таблице АЗСЗЬ и их нельзя путать. Все выше ска-
занное справедливо для PAPER, Ж Необходимо учесть
только то, что координаты вывода[на экр^Ь (койтрйьньш код AT) устанав-
ливают двумя последующими байтами, а не одним.
Еще одна крайне неприятная вещь, которая С может вам помешать спра-
вится с Бейсик-профаШой;ярн адаптации н^кйС^ — это недостаток памяти.
Такая ситуация может возникнуть.. во-первых из-за того, что TR-DOS
резервирует 112 байт для своих систешпж- переменных, а во-вторых, опера-
торы загрузки с диска могут занимать в пкмяти значительно больше места,
чем с ленты (ну, если Ьы привыкли исчислять память мегабайтами, слово
"значительно" беру назад), в-тршьи*г:jсистеме TR-DOS необходим буфер не
менее 256 байт для запит/чтёния файлов, вывода каталога и т.п.
Так йди иначе, этого бывает достаточно для того, чтобы компьютер уди-
вил вас-шо^цением:
Outi'Of
No room for"n'^;!;!;!;;:;;.::...
или чем-либо поДбёйЫй»;!!::;;Р
Не печальтесь, в этом случае (как, впрочем, и во всех остальных) ком-
пьютер можно обмануть. Наиболее простой и доступный способ — это раз-
деление загрузчика на две или более частей.
Пусть, например, исходный загрузчик выглядел так:
10 CLEAR 24250
20 LOAD " "SCREEN&nijiiiHIillli
30 LOAD ""Mjip11"™'
40:LpABjlpiji::^296,256
50 SbSM IZE USR Hm
60 L#D ""CODE j!
70 RANDOMIZE US#;24576
Без вы написали загрузчик для этой программы с диска:
10 CLEAR Ш^ёб
20 RANDOMIZE USIUffll&EM: LOAD "bomb sc"C0DE 16384
30 RANDOM LOAD "bomb mn"C0DE
40 RANDOM I a|pR 15619: R|k;: LOAD "bomb pb"C0DE 23296
50 RANDOM IZ^ USR 23296::::{j!!
60 RANDOMIZE USR:;lg:iiP№M:;-LOAD "bomb is"C0DE
70 RANDOMIZE иЩЩгб
и, запустив программу, вместо жрм получили сообщение:
Out of memory 20:1.» ...^нШрР^""4!:.
Христа ради, не тя!JMep #: фбезьянеУ попробуйте разбить загрузчик на
две части. '!
Это можно сделать следующем образом. Первая здсть будет выглядеть
Так: „::::!1::!ШН:
10 CLEAR 24250 ..a&iif Р^"4'
20 RANDOMIZE USR 15619: ВЕМ:.Ш1ршЬ sc"C0DE 16384
30 RANDOMIZE USR 15619: ШрШ'"bomb mn"C0DE
40 RANDOMIZE USR 15619: RBi: LOAD "bombififtV
Вторая часть, которая брег иметЬ: Лазвание на!: диске "bomb bs", будет
выглядеть так:
10 RANDOMIZE USR 23296
20 RANDOMIZE USR 15619: REM: ОД0 "bomb ls"C0DE
30 RANDOMIZE USR 24576 ..««ISlllillb.
Выполняя загрузку таким образом, компьютер заэдуЗМ! ; :fSak*iitoa Первый
загрузчик, которому места в памяти вполне досг$Т:0*Ш;;:?йём, после выпол-
нения заданных операций, он загрузит втсЩйрзЩрЧЙк, которому, в свою
очередь, места в памяти также достаточно. Второй загрузчик закончит эпо-
пею с загрузкой и запустит вашу программу.
Могут возникнуть ситуации, коша придется распилить загрузчик на три
или более частей, но это бывает крайне редко.
В предыдущей части было подробно описзано как обращаться с загруз-
чиком на Бейсике уже после того, как вы получили лиЩёг :5^1рузчика (даже
в том случае, коща полученное нечто слабо напок^ает МЬтйот)л; Вполне
законно у вас могли возникнуть вопросы о том, как получить этот-листинг
(нечто), ведь далеко не всегда, нажав на BREAK:;после загрузки;первого
файла, вы получаете листинг (нечто). Результата пробного вмешательства
в нормальный ход событий могут быть совершенно нёпрйз^азуемы; Начиная
с того, что программа сбросится, и кончая тем, что она повесятся шш обзовет
вас неприличным словом.
Попробуем разобраться, как с этим боройсяШ|::::|::::::.....
Нажатие клавиши BREAK довольно невкусный:Шфёоб раскрутки про-
грамм. Значительно приятнее подготовить версию загрузчика без автозапус-
ка, тогда вы получите полную свободу в Шехвиях.
Самое простое, что можно сделатё:!^:;это: запустить копировщик
COPY86/M или Out Сору (что, в общем-то, Щ®; &; ТР&е) и скопировать
загрузчик, не забыв нажать на клавишу R перед как его скидывать.
Таким образом вы получите про1рэд*ЙУ: Sfca. автозапуск^.
Подобные вещи позволяют; сделат:Б;;жопировщики, написанные
Tadeusz'eM Wilczek'oM (COPY NEW, COPY, COPY COPY,
COPY COPY COPY, COPY COPYiCOPY ;C0PV:i;;fc0PY й т.п.).
Но получилось так, что вы побрёЬгалй: держать у себя копировщик, по-
зволяющий корректй^ЙЬать программы т^кш||йбразом. Попробую помочь
вам даже в таком беЗнадёЩЩ Положении. Шбёрите следующую программу:
10 FOR А=23296 ТО 23334
20 READ S* POKE A, S.::;;;:;::: ' W
30 NEXT А ,:::;::;:::::,
40 RANDOMIZE USR |з2Ш!р" "ijl
50 STQ? ^IjjlF" р:
60 DA|k:221,33,0,128,17,0,55,205,86,5,33,0,200,34,
254,203,71,32,
-8,221,ЗЗ/б^Щ^!»., 0,62; 0,195,194,4
Когда вы ее : | ^НЩЙна войдет в режим загрузки, но загрузит
только заголовок, затем, п£й Мкатии на SPACE, программа скинет на кас-
сету, новый заголовок.
Для тех, кто слышал слово Ассемблер и на вопрос "Сколько времени"
отвечает "два эф девятого" привожу исходный текст с комментариями
ORG 23296 (5B00h)
L0 IX,32768 (8000b;):ji;iaifflpec загрузки заголовка
LD DE, 17 Ш^ШрЙна заголовка
БС^ражок "загрузка"
CALLj||366 (0556Ь)<;;1загрузка файла
LD Ни||33024 (81Q0B); установка строки
; автоЩрйй;^5:::'
LD (32779), HL WAITL00P.LD А, 127 (7Fh); ожидание нажатия
клавиши
; BREAK "%Ш
IN А,(254) W
RRA
JR С,WAITL00P:
LD IX,32768; см!
LD DE, 17Ч
LD А, О
CALL 1218 (04C2h); ;;Шись йа ленту
RET iij: ji Ш
Теперь отвлекусь и ошЩг эффекты, возможш^епрг останове профаммы
клавишей BREAK, и способу Которыми они ^ЬЙтгаю^я.
Эта информация может быть полезна скорее не для того, чтобы вскрыть
чужую профамму, а для того, чтрбы защй1ГБть свою (имейте, однако, ввиду
вражескую сущность подобных. скисаний; не забывайте, что воспользовав-
шись данными ниже указаниями ftbi не защитите, дрофамму от того, кто, как
и вы, соблаговолил ее прочесть).::
1. После нажатия на клавишу BRE AIC Загрузчик ^продолжает исправно
Перекреститесь и откажитесь от:ШШк: фкрыта: эту профамму, Вы к
этому еще не готовы, т.к. гарантированно можяф:заявить, что зафузчик на-
писан в машинных кодах (я не имею ввиду профессионалов, которые читают
это произведение только для того, чтобы посмеяться над авторрм)^;
2. После нажатия BREAK машина обнуляется.
Если зафузчик на RANDOMIZEe, то наиболее вщЩЁО ii
следующей операции: .....i:!!:!:::!::!::111""'
РОКЕ (РЕЕК 23613+256*РЕЕК 23614),
РОКЕ (РЕЕК 23613+256*РЕЕК 23614)+1 ,'Ши аналогичной.
Выполнив подобный оператор, мы (или нё;мы) изменяем адрес "возврата
по ошибке" на 0. Таким образом, вместо того, чтобы перейти на подпрофам-
му ПЗУ, которая выводит сообщение об ошибке, профамма переходит на
нулевой адрес. К чему это приводит, я полагаю, известно всем. Для тех,, кому
неизвестно — поясню: машина обнуляется (мо&'ете попробовать RANDOM-
IZE USR 0). j;!:!!!l:!|lj:::::.
3. После нажатия BREAK экран стал черный й• йшшна ни на что не
реагирует (кроме сброса, надо полагать).
Вполне вероятно использование оператора РОКВ 23659Д зй&Шшего ко-
личество строк в окне для вьюода сообщения равным 0. Попытка БЙасик-ин-
терпретатора уложить свое обращение в 0 строк;приводит к тому^ что у
машины происходит "заскок" и она виснет.
4. После нажатия BREAK, цвет экрана не изменЩ% дцжние. рЬ строки
экрана имеют цвет бордюра (цвет экрана также может иметь цвет бордюра,
в том числе и черный. Не путайте с предыдущим). При на^айш на клавиши
вы сльшште нежное пощелкивание, но на экране, ничего не изменяется.
Если вы еще не успели пощелкать, Ha^ptir^ BtORDER 7 (или любое
другое значение) и нажмите ENTER невзирая на т6, ^;на экране ничего не
появляется. Как правило, вы увидите надпйСь:
О 0К, 0: 1 iiijj'i::. ¥
Теперь можете работать как обычно.1 :; (Щяи вы успели пощелкать, то
предварительно пощелкайте клавишей DELETE);Mj|;h::::::.:|-
В этом случае использовался оператор
РОКЕ 23624Д1 ще п — цвет атрибута нижнего окна.
Это вкратце. Теперь retrons a i$s;maatpns.
Получив живой загрузчик, попь1тайтесь :еш классифицировать в рамках
того, что вам уже известно.
Как говорилось в начале часта 2.1., загрузчики бывают на Бейсике, в
машинных кодах и смешанные. Пр^аригёльную классификацию загрузчи-
ка можно произвести-изучив файлы программы;! Бейсик позволяет загружать
только файлы с заголовком. Загрузчик в машинных кодах может загружать
что угодно и как угодно, но*, как .правило, загружает файлы без заголовков
(в оригинальных версиях игровых яроздамм загрузчики загружают такое, что
ни один копировщик на себя ответственности не берет и файлы этих про-
грамм не копирует). Таким образом, если: файлы без заголовка, то опреде-
ленно можно сказать, чш загрузчик, с которым вы имеете дело, написан в
машинных кодах. Если файлы.;с;;заголовком, то можно предполагать, что
загрузчики на RANDOMIZEeii^o:^Определенно этого сказать пока нельзя.
Если файлы попадаются как с заголовком, так и без него, то можно предпо-
лагать чт£ угодно, кройётого, что загрузчик на Бейсике.
Нередки случаи, когда загрузчик ;На Бейсике загружает и запускает за-
грузчик;8!к6дах.
Ддрг 'бшанмф&ной классификации необходимо изучить содержимое за-
грузчика. Если зсефайлы программы — с заголовком, и количество опера-
торов LOAD совпадает; С количеством файлов, то можете бьпъ спокойны,
загрузчик на Бейсике.