Micro #07
04 августа 1998
  TR-DOS  

Tape и Disk - Адаптация программ к системе TR-DOS (часть 2).

<b>Tape и Disk</b> - Адаптация программ к системе 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".




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

Новинки - обзор новых игрушек: Fisher, Dizzy 5, Зеркало, Dizzy 2.

Письмо из FidoNet - письмо от Вячеслава Медноногова о ЧВ и Хакерах.

Железо - небольшая доработка ZSC модема.

Tape и Disk - Адаптация программ к системе TR-DOS (часть 2).

Проходилка - пошаговое прохождение игры Зеркало.

AD&D - описание система AD&D (часть 3).

Pokes - Poke's из Интернета part 2.


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

Похожие статьи:
Аперитивчик - вступление: много раз ставился вопрос о прекращении выпуска пос ледующих номеров Deja VU...
Программистам - Формат Mod файлов. Описания формата стандартных MOD файлов, используемых в General Sound.
Новые программы - Обзор Xas редактор-ассемблер 128К (v5.05).
Реклама - реклама и объявления.
Всяко-разно - Анкетка от EI.

В этот день...   21 ноября