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 минут, считая время отлад- ки, так что если оно будет да- вать глюки, - прошу не ругаться. Зато на этой программке можно потренироваться стирать управля- ющие коды.
Другие статьи номера:
Похожие статьи:
В этот день... 14 декабря