|
Micro
#07
04 августа 1998 |
|
Tape и Disk - Адаптация программ к системе TR-DOS (часть 2).

╔══************************************══╗
╠═ АДАПТАЦИЯ ПРОГРАММ К СИСТЕМЕ TR-DOS. ═╣
╠═ - ЧАСТЬ 2. - ═╣
╚══************************************══╝
ГЛАВА 1
---------------------------
КАК БОРОТЬСЯ С БЕЙСИКОМ.
Загрузчики программ, с которыми Вы мо-
жете встретиться, подразделяются на три
категории: загрузчики на Бейсике (загрузка
производится оператором LOAD), загрузчики
в машинных кодах и смешанные загрузчики.
Проще и приятнее, безусловно, иметь
дело с загрузчиками на Бейсике. Их можно
разделить на открытые и закрытые.
Открытые загрузчики - это когда после
загрузки первого файла программы (то есть
собственно загрузчика) нажимаешь Break,
затем Enter, и на приятном голубом фоне
появляется:
10 INK 1: PAPER 5: BORDER 5: CLEAR 25199
20 LOAD "" SCREEN$: LOAD ""CODE
30 RANDOMIZE USR 32768
или что-то в этом роде.
Надеюсь, что не ущемлю Ваше самолюбие,
если все же покажу, как адаптировать к
диску такую программу:
10 INK 1: PAPER 5: BORDER 5: CLEAR 25199
20 RANDOMIZE USR 15619: REM: LOAD"name1"
CODE 16384
25 RANDOMIZE USR 15619: REM: LOAD"name2"
CODE
30 RANDOMIZE USR 32768
- где name1 и name2 - имена, которые Вы
присвоите файлам,следующим за загрузчиком.
Иногда эти имена можно оставить прежними,
но чаще их приходится изменять. Во-первых,
имена файлов в кассетной версии могут со-
держать символы или комбинации символов,
которые будут восприниматься системой TR-
-DOS неправильно. Например, встретив опе-
ратор LOAD "B:SCREEN", TR-DOS будет загру-
жать файл "SCREEN" с дисковода "B", а
отнюдь не файл с именем "B:SCREEN", как
хотелось бы. Во-вторых, в отличие от кас-
сеты, на которой файлов с именем "SCREEN"
может находиться сколько угодно, на диске
файл с таким именем должен быть только
один. Поэтому обычно файлы программы назы-
вают именами, производными от имени самой
программы (например, "rambo$", "rambo cd"
и т. п.). Кроме того, считается хорошим
тоном в имени основного файла (загрузчика)
использовать прописные буквы, а в именах
остальных - строчные.
Изменить имена файлов на желаемые можно
еще до перенесения программы на диск, вос-
пользовавшись обыкновенным ленточным ко-
пировщиком (TF COPY, COPY DE LUXE, COPY
COPY и др.), после чего останется лишь пе-
ребросить файлы на диск специальным копи-
ровщиком <<лента-диск>>. Удобнее всего
пользоваться копировщиками Programmable
Copier v.2.0(PCopier), PCopier Plus, или
AMCopier. При работе с перечисленными
копировщиками, во-первых, можно поменять
имена файлов уже после копирования на
диск, а во-вторых, есть уверенность, что
файлы и диск не будут испорчены (при ис-
пользовании же копировщика Дерещука такой
уверенности нет).
Но вот Вы, самым тщательным образом
просмотрев все свои диски, убедились, что
<<специального копировщика>> на них нет.
Не отчаивайтесь, еще не все потеряно. За-
грузите программу в обыкновенный копиров-
щик и внимательно изучите все, что он рас-
скажет о ее файлах.Запишите длины и адреса
загрузки каждого файла и смело нажимайте
кнопку сброса. Теперь, обладая столь цен-
ной информацией, можно действовать дальше.
Пусть, например,копировщик сообщил сле-
дующее:
файл "SCREEN" - адрес загрузки 49152,
длина 6912;
файл "code" - адрес загрузки 25200,длина
40335.
Используя эти данные, можно на основе
приведенного варианта загрузчика написать
специальный копировщик:
10 INK 1: PAPER 5: BORDER 5: CLEAR 25199
20 LOAD ""SCREEN$
21 RANDOMIZE USR 15619:
REM: SAVE "shaky sc"CODE 16384,6912
30 LOAD ""CODE
31 RANDOMIZE USR 15619:
REM: SAVE "shaky mn"CODE 25200,40335
40 STOP
- то есть после каждого оператора загрузки
файла с ленты нужно поставить оператор за-
писи на диск, указав адрес и длину файла.
Если в ленточном загрузчике не упоминается
адрес загрузки, то используйте адрес, ко-
торый любезно сообщил копировщик. Но будь-
те внимательны, не всегда адрес в загруз-
чике указан в явном виде: в приведенном
примере копировщик указал адрес первого
файла 49152, но загрузка производится опе-
ратором LOAD ""SCREEN$, который является
эквивалентом LOAD ""CODE 16384,6912.Поэто-
му файл необходимо записывать с адреса
16384, а не 49152.
На этом,как правило,Ваши мучения должны
закончиться. Единственной "серьезной"
проблемой при переделке подобного загруз-
чика может стать то, что при выводе его
листинга цвет фона и тона совпадут, и Вам
придется изменить один цвет оператором
INK или PAPER. Но даже этого можно избе-
жать, подгрузив файл загрузчика оператором
MERGE, а не LOAD. В этом случае программа
не запустится, а появится сообщение
0 ОК, 0:1.Единственно,не следует забывать,
что делать это можно только на чистой ма-
шине,то есть после нажатия клавиши сброса.
Надеюсь,что в вопросах открытых загруз-
чиков, наступила полная ясность даже у
того, кто ничего не понял.
------------------
Ваше счастье, если просмотрев листинг
загрузчика, Вы увидите нечто похожее на
предыдущий пример, то есть нормальную бей-
сик-программу, но на практике гораздо чаще
появляется что-нибудь вроде:
0 REM Look here, little bozo, why don't
you go fuck yourself?
0 DRAW USR VAL "24500",deBillGilbert'89
0 REM FLASH DRAW ???Aw COPY M
или еще более страшное. Подобный ужас мож-
но назвать з а к р ы т ы м загрузчиком.
Попытаюсь научить Вас <<открывать>> его.
Бейсик-программу защищают от просмотра
и редактирования несколькими способами.
Рассмотрим самые популярные из них.
Вы, вероятно, уже сталкивались с таким
фокусом, как нулевая строка, которую нель-
зя ни удалить, ни вызвать на редактирова-
ние. Справиться с такой защитой можно дву-
мя путями. Первый заключается в пернумера-
ции строк с помощью одной из многочислен-
ных сервисных программ (ZXED,например).
После чего обычно получается вполне добро-
качественный листинг (отсутствуют нулевые
строки и т. п.).
Второй путь более изящен, но эффективен
только в том случае, если нулевая строка
располагается первой в программе. Для его
реализации нужно иметь представление о
формате хранения строк бейсик-программы в
памяти ZX Spectrum:
┌─────────┬──────────┬───────────┬───────┐
│ номер │ длина │ операторы │перевод│
│ строки │ строки │ Бейсика │строки │
│(2 байта)│(2 байта) │ │ │
└─────────┴──────────┴───────────┴───────┘
Вы уже, вероятно, поняли, что изменить
номер строки проще простого, записав опе-
ратором POKE требуемое число в первые два
байта программы. Но куда записывать? Вот
этим вопросом мы сейчас и займемся.
Определить начало бейсик-программы по-
может системная переменная PROG. Она нахо-
дится по адресу 23635 и занимает два бай-
та. Таким образом, выяснить адрес первого
байта можно, выполнив оператор
PRINT PEEK 23635 + 256 * PEEK 23636
Если к Вашему Speccy не подключено ни-
какой периферии, то после выполнения этого
оператора на экране появится число 23755.
Если подключен и инициализирован Beta-
-Disk, то появится число 23867, поскольку
TR-DOS резервирует 112 ячеек для своих
нужд.
Итак, адрес, по которому хранится номер
начальной строки бейсик-программы, обнару-
жен: пусть, к примеру, он равен 23755. Те-
перь можно менять номер первой строки:
POKE 23755,N - 256 * INT(N/256):
POKE 23756,INT(N/256)
- где N - требуемый номер. Это идеальный
способ переопределения номера строки.Може-
те,кстати поэкспериментировать,задавая но-
мера строк более 9999: получаются весьма
любопытные результаты. Как показывает
практика, необходимость изменять номера
более 255 возникает редко. Поэтому обычно
достаточно выполнить всего один оператор:
POKE 23756,N
- где N - номер строки не более 255. Этим
оператором изменяется только младший байт
номера строки (еще раз хочу напомнить, что
последние два примера приведены, исходя из
того, что бейсик-программа начинается с
адреса 23755).
Выше было сказано, что такой способ
борьбы с нулевой строкой эффективен толь-
ко, когда нулевая строка находится в нача-
ле программы. На самом же деле, ничто не
мешает изменить номер второй и последующих
строк. Для этого пригодится информация о
длине строки,содержащаяся в двух следующих
за номером строки байтах. Прибавив длину
строки к адресу ее начала, получим адрес
следующей строки.
----------------------
Не менее распространенным приемом защи-
ты бейсик-программ является добавление в
строки бейсик-программы различных управ-
ляющих кодов:INK, PAPER, AT, TAB и других,
но об этом и многом другом читайте в сле-
дующем номере "MICRO".
______________________
В "MICRO 8" планируется напечачать
окончание главы 1, а так же главу 2 "Как
бороться с "BREAK'ом".
07.08.98 Gloom Demons & Computer Eye.
Special for "MICRO 7".
Другие статьи номера:
Похожие статьи:
В этот день... 17 ноября