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".
Другие статьи номера:
Похожие статьи:
В этот день... 21 ноября