ZX Format #03
29 февраля 1996

Программистам - Адаптация игр: адаптация программ на диск.


   АДАПТАЦИЯ ПРОГРАММ НА ДИСК

        ДЛЯ НАЧИНАЮЩИХ.


(C) Аксенов А.М. 1996

________________________________


   Небольшое предисловие.
   Данная работа состоит из двух
частей. В первой части речь пой-
дет о дискетировании самых прос-
тых программ.  Во второй части я
попытаюсь   осветить   некоторые
сложные случаи и расскажу о  128
играх.  Кроме того, в дополнение
к  "Адаптации   Программ...",  в
разделе  ПРОГРАММИСТАМ  есть еще
две  статьи - о закрытых кодах и
о том,как сделаться бессмертным.

        ________________


          Часть Первая

              ____



       Адаптация программ

  с бейсиковским загрузчиком.


   Я полагаю, что читатель имеет
некоторое представление о бейси-
ке,  поэтому, если некоторые со-
четания  латинских букв в тексте
Вам покажутся незнакомыми, - от-
ложите  эту  статейку и потруди-
тесь   почитать  руководство  по
программированию.  Для  движения
по  пути наименьшего сопротивле-
ния  я очень рекомендую Вам при-
обрести любой копировщик лента -
диск,  например,  P.Copier  либо
L-COPY  и  программу  типа  DISK

DOCTOR  (все  это можно купить в
LOGROS'е, а что касается "докто-
ра", - советую использовать con-
ver  commander).  Если у Вас нет
ничего из вышеперечисленного, не
беда,  можно обойтись и без это-
го.
   Как  Вы,  наверное, замечали,
практически все большие програм-
мы  состоят  из  нескольких  от-
дельных частей. Первая - сравни-
тельно маленькая, всегда имеющая
вид basic-файла - загрузчик. Да-
лее  может идти файл, содержащий
заставку,  либо сразу коды прог-
раммы. Кодовых файлов может быть
несколько.
   Все  кодовые файлы необходимо
переписать на диск. Для удобства
работы перепишите туда и загруз-
чик.  Если Вы имеете специальный
копировщик,то данная операция не
вызовет  проблем.  Если же копи-
ровщика нет, то перезапись можно
осуществить так:

1. грузите ленточный копировщик.

2. загружаете адаптируемую  про-
грамму в копировщик.

3. записываете в тетрадь длины и
адреса загрузки  ("стартовые ад-
реса") каждого файла.

   Нужно отметить, что адрес за-
грузки  содержится  в  заголовке
файла,  там  же  где и название.
Если  файл не имеет заголовка то
возникает  небольшая  проблема с
записью  на диск и большая с пе-
ределкой  загрузчика - "безголо-
вый"  файл  всегда означает, что
загрузчик написан в кодах.
   Если  все в порядке, то далее
произведите  следущие  действия:
отмотайте пленку к началу файла;
введите  LOAD"name"CODE  (name -
имя  файла, который Вы переписы-
ваете).   Напоминаю,   что  ввод
строки  должен завершаться нажа-
тием на "enter". Запустите плен-
ку.  Если  Вы получили сообщение
ОК, то далее введите

  RANDOMIZE USR 15619:  REM:
   SAVE"name"CODE start,len

start  -  стартовый адрес; len -
длина  файла. Если файл является
заставкой  и  при загрузке выво-
дится  на  экран,  то скопируйте
его при помощи такой программки:

10 CLEAR 25000:LOAD"name"SCREEN$
20 RANDOMIZE USR 15619: REM:
   SAVE"name"CODE 16384,6912

   Следует  отметить, что имя не
должно  быть длиннее 8 символов,
а работать лучше в BASIC-48. Ес-
ли  Вам  удалось скопировать все
файлы  программы (можете считать
что Вам крупно повезло), то нас-
тало  время заняться загрузчиком
(какие  могут возникнуть пробле-
мы,  я опишу далее).  Попробуйте
загрузить   загрузчик   командой
MERGE"".   Здесь  возможно  нес-
колько вариантов, например, ком-
пьютер сбросится или зависнет. А
может  и сказать "ОК". Если пос-
леднего не произошло, то сделай-
те так: введите LOAD""; загрузи-
те загрузчик и остановите магни-
тофон;   после   этого   нажмите
BREAK.  Если  при этом компьютер
не  повиснет и не сбросится, то,
возможно,   Вы  увидите  листинг
программы,  который будет выгля-
деть примерно так:

10 BORDER 0:PAPER 0:INK 7:CLEAR
    24999:LOAD"name1"CODE
20 LOAD"name2"CODE
30 RANDOMIZE USR 55000

   Здесь следует обратить внима-
ние  на  команды,  относящиеся к
загрузке, т.е.  LOAD "...".  При
работе  с лентой загрузку произ-
водит  программа,  находящаяся в
ПЗУ,  обращение к которой проис-
ходит по команде LOAD. Для рабо-
ты с диском требуется программа,
находящаяся  в другой части ПЗУ.
Переход туда производится по ко-
манде  RANDOMIZE  USR 15616. Для
того,  чтобы  после  перехода  в
часть  ПЗУ TR-DOS сразу выполня-
лась  команда, следует применить
комбинацию вида:

  RANDOMIZE USR 15619: REM:...,

где  после  REM  стоит требуемая
команда  (например, load). Таким
образом,  чтобы  вышеприведенный
загрузчик  работал с диском, его
следует переделать так:

10 BORDER 0:PAPER 0:INK7:CLEAR
    24999:RANDOMIZE USR 15619:
    REM:LOAD"name1"CODE
20 RANDOMIZE USR 15619:REM:
    LOAD"name2"CODE
30 RANDOMIZE USR 55000

   После  чего  следует  выйти в
TR-DOS  (RANDOMIZE  USR 15616) и
ввести  SAVE"name"LINE 10. Важно
помнить,  что  при  обращении  к
диску  после  REM:  может стоять
только   ОДНА  команда,  которая
должна  быть последней в строке,
иначе  программа  будет работать
неправильно.
   Если  все  указанные действия
удалось  осуществить без затруд-
нений,  то  работа окончена и Вы
можете  смело  запускать  игру с
диска.

   Теперь  -  проблемы,  которые
могут возникуть.
   Вам  не  удалось получить ос-

мысленный листинг программы. Ес-
ли это произошло из-за того, что
программа не грузится по команде
MERGE""   или   сбрасывается  по
BREAK, то можно попробовать сде-
лать так: введите  заголовок  от
длинной   программы,   поменяйте
кассету  и  загрузите  ту  часть
загрузчика,  что  идет после его
заголовка  (говоря проще, - под-
мените заголовок на заголовок от
более  длинной  программы). Если
Вы не имеете более длинной прог-
раммы, сделайте ее сами - напри-
мер наберите десяток строк типа:

10  PRINT " (здесь набейте много
     пробелов)"

и  отгрузите  эту  программу  на
ленту командой SAVE"name".
   По окончании загрузки компью-
тер выдаст "tape loading error".
Не пугайтесь, так и должно быть.
После   этого  можно  попытаться
просмотреть  листинг. Как прави-
ло,  если приходится прибегать к
таким  суровым мерам, то листинг
будет,  в лучшем случае, трудно-
читаемым. Поробуйте ввести LIST.
Возможно  что  после этого Вы не
увидите  текста,  но обязательно
получите какое-нибудь сообщение-
например   "ОК"   или   "invalid
color".  Затем попробуйте ввести
LIST  1,  или  LIST (любой номер
больше  чем  у  первой  строки).
Возможно,  что  Вы  увидете нор-
мальный  листинг. Если виден ос-
мысленный  текст,  то можно спо-
койно переделывать его для рабо-
ты с диском.
   Если  от  любой  строки виден
только  номер, а за ним - пусто-
та,  либо  строка,  в которой не
видно  символов,  то  это скорее
всего  означает,  что  в  тексте
есть "управляющие символы", т.е.
цифры,   определяющие  параметры
печати  текста на экране (напри-
мер  -  цвета  чернил и бумаги).
Естественно, если текст выводит-
ся  чернилами  цвета  бумаги, то
его невозможно прочесть. Вызови-
те строку на редактирование. Ес-
ли  при этом машина будет задум-
чиво  гудеть,  то  введите  POKE
23608,1.  Вызвав  строку,  можно
попытаться  стереть эти коварные
коды, как простой символ в стро-
ке.   Для  этого  включите  звук
громче  и двигайте курсор, прис-
лушиваясь  к щелчкам. Когда про-
исходит  "наезд"  на управляющий
символ,  курсор  не двигается по
экрану  пока  код не будет прой-
ден,  однако  при каждом нажатии
на курсорную клавишу слышен щел-
чок (при этом происходит измене-
ние адреса, на который указывает
курсор).  Итак,  найдя код, сде-
лайте  два  "щелчка"  за  него и
после этого жмите DELETE.
   Затерев  код,  Вы можете уви-
деть  текст,  а можете и не уви-
деть,  так как кодов обычно ста-
вится много и стереть необходимо
все.

   Есть  несколько более простых
способов   получить  осмысленный
листинг.
   Простейший:  перепишите  заг-
рузчик  на  диск, запустите disk
doctor  и  введите  команду open
file. Обычно сия команда отдает-
ся  нажатием  кнопочки  "O". Ес-
тественно, что при запросе имени
файла  нужно  ввести то имя, под
которым  Вы переписывали загруз-
чик.  Тип файла - B (basic). От-
крыв  файл, введите команду "B".
Как  правило, в ответ доктор вы-
дает  Вам листинг, который имеет
смысл.  Перепишите  его  в  свой
"протокол вскрытия". Если в лис-
тинге за любым числом стоит чис-
ло  в скобках (некоторые доктора
выделяют  это  число  еще и цве-
том),  то переписывайте содержи-
мое этих скобок. В качестве при-
мера возьмем такую строку:

30 CLEAR 0(24499):POKE 23874
    (23874),0(0):LOAD"sw.1"CODE
    50000(16384):RANDOMIZE USR
    60000(16384)

   В Вашем протоколе должно быть
записано:

30 CLEAR 24499:POKE 23874,0:LOAD
    "sw.1"CODE 16384:RANDOMIZE
    USR 16384

   Другой   способ:  используйте
copy-copy или любой подобный ко-
пировщик.  Загрузите загрузчик в
него, сотрите управляющие коды и
отгрузите  программу  обратно на
ленту. Для подобной операции по-
лезно  знать,  что  строка имеет
следующее строение:

NN.LL._______.13.


здесь NN - два байта, составляю-
щие номер строки; LL - два байта
длины  строки; ____ - собственно
содержимое  строки  и  число  13
(#0D)   -  символ  конца  строки
(enter). Управляющие коды:

7  - ","

8  - Backspace

16 - ink

17 - paper

18 - flash

19 - bright

20 - inverse

21 - over

22 - AT
23 - TAB


   К  слову: и при помощи докто-
ра, и при помощи copy-copy можно
просмотреть  текст  программы по
кодам  команд, но здесь придется
немного  поднапрячь  мозги,  так
как необходимо различать - какой
код  является  командой, а какой
просто  совпадает  по значению с
оной.  Для этого полезно помнить
структуру  строки  и  одну  тон-
кость,  которая  касается  пред-
ставления числа в бейсике. Напо-
минаю,  в чем соль: если число в
строке  указано  таким  образом:
CLEAR VAL"24999", то это значит,
что  оператор  CLEAR выполняется
по 24999, но если Вы видите, на-
пример, CLEAR 24999, то это сов-
сем  не означает, что и в данном
случае  оператор  имеет аргумент
24999.  Когда  число  стоит  без
оператора  VAL его коды выглядят
так:
_____.#0E._____.


здесь  первые  несколько  байт -
это  коды символьной формы числа
(т.е. того, что Вы видите на эк-
ране);  #0E  =  десятичное  14 -
префикс,  разделяющий символьную
форму и пять байт цифрового зна-
чения;  последние 5 байт опреде-
ляют  истинное  значение  числа.
Третий  и  четвертый байты после
префикса  задают  модуль  числа.
Можно  точно  сказать,  что если
при  таком  просмотре не обнару-
жится ни одного LOAD, то загруз-
чик  реализован в кодах. О кодо-
вых  загрузчиках я расскажу поз-
же.
   Сейчас  переходим к проблемам
копирования  файлов на диск. Та-
ких проблем, пожалуй, всего три:
очень   длинный  файл,  неверный
байт четности и плохой стартовый
адрес  (при ручном копировании).
Последнее  выражается в том, что
после загрузки файла машина вис-
нет  или  сбрасывается. Избежать
этого  очень просто - достаточно
загружать   файл  по  LOAD"name"
CODE  adr, предварительно выпол-
нив CLEAR "adr-1", где adr - ад-
рес  загрузки. Адрес можно брать
не  меньше  24400,  иначе машина
будет отлынивать от работы всеми
доступными  ей  средствами.  При
этом файлу может оказаться мало-
вато места, - возникает проблема
номер  один  -  слишком  длинный
файл.
   Случай с неверным байтом чет-
ности  выражается в том, что при
попытке использовать готовый ко-
пировщик лента-диск по окончании
загрузки  Вы получаете сообщение
типа  load  error,  но  при этом
программа  нормально  работает с
ленты. Если программа не работа-
ет  и  с  ленты, это значит, что
там просто плохая запись. С этим
можно бороться только аппаратны-
ми  методами.
   Запись  с  плохим байтом чет-
ности  применялась почти на всех
кассетах студии "МАСТЕР". Обойти
эту  проблему  можно,  переписав
программу  на ленте копировщиком
TF-Copy  2 (если все файлы имеют
заголовки)  либо  OMNY COPY, или
использовать  копировщик лента -
диск  TD-COPY.  Этот  копировщик
позволяет  не  обращать внимания
на  ошибки, но делает файлы, ко-
торые медленно грузятся. Послед-
нее  средство - перезапись вруч-
ную, с подменой заголовка. Заго-
ловок   делается  так:  наберите
SAVE "name" CODE 1,65535 и запи-
шите  только  сам заголовок. Имя
может быть любым, а при загрузке
файла  рекомендую  делать  таким
образом:  набрать  CLEAR  24499,
далее  - LOAD "name" CODE 24500,
по окончании загрузки Вы увидите
"tape loading error", после чего
набирайте

  RANDOMIZE  USR 15619: REM:
   SAVE  "name"CODE 24500,len

len  - длина, которую Вы, конеч-
но,  не забыли записать в прото-
кол.  Кстати,  иногда  так можно
копировать и безголовые файлы.
   Специально  для тех, кому ле-
ниво  прибегать к вышеописанному
способу,  в  ПРИЛОЖЕНИЕ включена
моя  программка,  которая  может
немного облегчить перезапись не-
удобных  файлов.  Называется она
"->МАСТЕР" и может следующее:

1.  переписать в нормальном виде
файлы с затерянной четностью (и-
ногда  не слишком хорошая запись
работает,  но не идет в копиров-
щик)
2.  переписать  файлы  с  кассет
студии  МАСТЕР  (тех, на которых
сделана первая попытка защиты от
копирования,  которая мешает пе-
реписать их копировщиком лента--
диск)
3.  пришить заголовки к безголо-
вым   файлам  (все  файлы  будут
иметь тип "C")

   Программка работает с единич-
ной   порцией  информации,  т.е.
загрузив   любой  фрагмент,  Вам
нужно  будет записать его. Пишет
она, естественно, только на лен-
ту.  Управление  очень простое -
сначала  нужно  определить режим
работы,  а  далее - просто нажи-
мать  на "enter", не забывая пе-
реставлять  кассеты. Для синтеза
заголовков на вопрос HEADERLESS?
ответить "Y", если подшивать за-
головки  не  нужно,  то "N". При
работе с "защищенными" кассетами
на второй вопрос ответить "Y". В
последнем случае будет срезаться
лишний байт (последний), который
и  вносит  ошибку в работу копи-
ровщика.
   Предупреждаю,  что сие произ-
ведение  было  написано примерно
за 40 минут, считая время отлад-
ки,  так  что если оно будет да-
вать глюки, - прошу не ругаться.
Зато  на  этой  программке можно
потренироваться стирать управля-
ющие коды.

                            



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

IS-DOS - "IS-DOS - начинающим" No 3

IS-DOS - "Оконная система IS-DOS".

IS-DOS - "Формат объектных модулей *.obj IS-DOS Ассемблера".

IS-DOS - "Формат таблицы локальных символов IS-DOS Ассемблера".

Авторы журнала - ZX-Format No.3

Железо - Исправление ошибки TR-DOS.

Железо - новая звуковая карта: General Sound.

Железо - новая модель Спектрума: Scorpion ZS 256 Turbo+.

Железо - о турбировании Спектрум-машин.

Железо - обзор модемов для ZX Spectrum.

Железо - Шинная архитектура Спектрума (концептуальная разработка).

Игрушки - "Last battle" (Последняя битва) подробное описание.

Игрушки - 48 утюгов (второй уровень).

Игрушки - десятка наиболее продаваемых в С.-Петербурге.

Игрушки - описание игры BATMAN-II.

Игрушки - что новенького: The Light Corridor, Jonny Quest in Doctor Zins, Bedlam, Bubble Dizzy, Navy Seals, Пираты.

Конкурс - конкурс на компьютерный анекдот.

Лотерея - лотерея для читателей журнала.

От авторов - о третьем выпуске журнала.

Отдохнём - HУ, ЮЗЕР, ПОГОДИ!

Отдохнём - глюкодром: Самые ОПЕЧАТКИ.

Помощь - Очередной трактат об очердной оболчке и не только.

Почтовый ящик - дискуссия.

Почтовый ящик - доска обьявлений.

Почтовый ящик - письма читателей.

Премьера - TASM 4.0 (Turbo ASseMbler for ZX-Spectrum 128k)

Премьера - Приключения ВИННИ ПУХА.

Программистам - Basic для всех №3.

Программистам - Адаптация игр: адаптация программ на диск.

Программистам - Адаптация игр: зыкрытые коды.

Программистам - адаптцация игр: бессмертия.

Программистам - ассемблер: Экскурс в анатомию ZX

Разное - Amiga: вопросы и ответы.

Разное - Амига: новости.

Разное - Перспективы П/О.


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

Похожие статьи:
Обзор - новые игры: Mystery of Arkham Manor, Magic Stripes, Satan II.
Доска почета - Отрывки из разговоров на втором дне Fun Top-98: Alex(R), Kano, Boss, Mitchell, Daniel, Serzh.
Demo Party - SerzhSoft: сказание о CC'999.

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