АДАПТАЦИЯ ПРОГРАММ НА ДИСК
ДЛЯ НАЧИНАЮЩИХ.
(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 минут, считая время отлад-
ки, так что если оно будет да-
вать глюки, - прошу не ругаться.
Зато на этой программке можно
потренироваться стирать управля-
ющие коды.