ВОССТАНОВЛЕНИЕ ПРОГРАММ
часть 3
(С) 1996-99, Александр Десятниченко
__________________________________________
Восстанавливая игры, регулярно натыка-
ешся на исходники, в которых очень трудно
найти стартовый адрес, - программа плохо
читаемая, разбросанная кусками по всей па-
мяти, вперемешку с табличками, графикой,
текстами и пр. Сейчас я опишу метод, с по-
мощью которого можно практически всегда
отыскать начало программы.
Для этого нужно запустить STS и загру-
зить в него полностью всю игру, - от 16384
до 65535. При необходимости, придется де-
компрессировать все блоки и поставить на
свое место ту часть программы, которая
должна размещаться в адресах с 23296 по
25000, не забудьте только перед этим пере-
нести резидент самого монитора на свобод-
ное место в экранной области, примерно в
район 20000. Другими словами, вы должны
разместить игру так, чтобы она была пол-
ностью готова к обычному запуску процеду-
рой восстановления регистров. Теперь най-
дите саму эту процедуру, она всегда нахо-
дится в экране и начинается так: LD
SP,(16384). Aдрес может быть и другим, но
он тоже обязательно будет в пределах экра-
на, после этой строки идут многочисленные
POP, затем определение IM 1/IM 2 и, нако-
нец, RET.
Пример такой процедуры я приводил в на-
чале этой статьи. Установите программный
счетчик на эту начальную строку и, нажимая
SHIFT+Z, в пошаговом режиме выполните эту
процедуру. Что это дает? Сначала "вспом-
нится" стек, затем из него начнут извле-
каться значения регистров на момент взлома
игры и вы сможете пронаблюдать эти значе-
ния. Затем внимательно посмотрите за кур-
сором и определите, какой режим прерывания
был установлен на момент взлома и, нако-
нец-то, самое главное, - по команде RET вы
вывалитесь в сам код игры, - как раз в то
место, в котором она была остановлена
кнопкой мультифейса! Что вам еще надо?
Двигаясь от этого места вверх по прог-
рамме, вы по-любому найдете ее начало, тем
более что теперь знаете, например, заноси-
лось ли что-нибудь в IY, где по умолчанию
обычно 23610, устанавливался ли IM 2 и
т.п. Посмотрите снова на адрес, где у вас
сейчас установился стек и проверьте, нет
ли там каких-нибудь интересных адресов...
Теперь еще пару слов об играх с подгру-
жаемыми уровнями. Так, если вы пытались
пройти до конца STRIDER, то, конечно же,
зависли на последнем (пятом) уровне. Более
того, - даже скачанный с Internet'а исход-
ник имеет тот же глюк. При восстановлении
же оказалось, что один из трех блоков это-
го уровня был выгружен нужной длины, но...
не с того адреса! Возможно, ошибка была
допущена даже самой фирмой-производителем,
по крайней мере, рабочей версии игры мне
не попадалось. Загрузив этот блок в игру и
выгрузив его, как положено, удалось все
поставить на свои места и, наконец-то,
предоставить пользователю полную версию
игры, включая картинку и музыку для 128К,
взятые с интернетовского исходника.
Кстати, работоспособность уровней можно
попробовать проверить сразу. Для этого
"подсовываете" игре вместо первого уровня,
скажем, третий или пятый. В большинстве
случаев номер пройдет, если же нет, то
придется разобраться с внутренними систем-
ными переменными самой игры и сделать не-
обходимые изменения, чтобы убедить игру,
что она имеет то, что надо. Просмотрев та-
ким образом всю программу, можно теперь
собрать ее "в кучу", обессмертить, напи-
сать intro и т.п. Кстати, кому интересно,
почитайте note к SHADOW DANCER, там MAX
IWAMOTO приводит целую эпопею о работе по
востановлению запоротых уровней к этой иг-
рушке.
А еще бывают игры, написанные на языках
высокого уровня, которые, как не странно,
тоже кто-то сбросил мэджиком. Например,
хорошо известная вам адвентюра TELLYWISE,
(Вообще-то по нашему мнению "TELLYWISE"
является не адвентюрой, а телевизионным
менеджером, если, конечно, это не ка-
кая-нибудь другая игра с подобным названи-
ем... - Прим.Ред.)
почти полностью сделанная на бейсике. Та-
кие игры придется декомпрессировать, заг-
рузить в STS и выгрузить бейсик под видом
кодов. Затем переименовать расширение фай-
ла, загрузить этот файл, как бейсик в
обычном режиме и, найдя строку для автоза-
пуска, снова выгрузить, как нормальную
бейсиковскую программу.
Вам, конечно же, известны и многочис-
ленные игры от SHOW BROTHERS (ATLANTIS
SOFTWARE). Это, например, HEARTBROKEN, SU-
PERKID 1&2, IRON SOLDIER, SEA HAWK, CAVE-
MANIA, DOWN TOWN, KOSMOS и т.д. Они тоже
делались не на ассемблере, а то ли на ка-
ком-то языке высокого уровня с последующей
компиляцией, то ли с помощью какой-то обо-
лочки для создания игр. Причем, игры, на-
писанные таким образом, обращаются к сис-
темным переменным и, если там будет не то,
что было при написании этих игр, то во
время игры появляются разного рода глюки
типа застревания на ровном месте, зависа-
ния пуль в воздухе и прочее.
Как восстановить такие игры? Для этого
нужно найти невосстановленную игру этих
товарищей, например, SEA HAWK и взять из
нее кусок 23552, 203. Затем этот кусок
повставлять во все подобные игры,
укомпрессировав его вместе со всей игрой,
либо сделав LDIR на это место. К сожале-
нию, многие такие игры уже утеряны.
Пользователь, увидев глюки, думает, что
игра испорчена и стирает ее. Когда-то дав-
но у меня была игра INTERALIA 1990-го года
от SHOW BROTHERS, а теперь я ее ищу, чтобы
восстановить и не могу нигде найти.
Часто причиной неработоспособности
программы на разных типах компьютеров мо-
жет стать и сам компьютер. Так, многие иг-
ры фирмы HEWSON (ELIMINATOR, EXOLON, CY-
BERNOID, BATTLE VALEY и т.п.) для опреде-
ления объема памяти обрашаются к ПЗУ, имея
ввиду, что для 48К и 128К ПЗУ используются
разные, но, проверяя содержание какой-то
одной ячейки ПЗУ; такая проверка выдаст
ошибочный результат, если сама ПЗУ прошита
нестандартно. Вот пример из игры BATTLE
VALLEY:
45269 LD A,(14446)
45272 CP #FF
45274 JR NZ,45281
45276 LD A,#01
45278 LD (61297),A
45281 ...
Как видите, проверяется ячейка 14446, и
если у вас нестандартное ПЗУ, то игра бу-
дет идти только в режиме 128К. В таком
случае следует внести исправление в текст
программы так, чтобы проверялось не ПЗУ, а
какая-либо ячейка из системных переменных,
например, 23388. В этой ячейке, как из-
вестно, #00 при 48К и #10, если у вас 128К
(если вы, разумеется, не изменяли это зна-
чение переключением страниц памяти из бей-
сика или, скажем, размещением там распа-
ковщика).
Примерно та же причина мешает в 128К
играть музыке для АY в программах ACTION
FIGHTER и LITTLE PUFF. Интересный эффект
наблюдается на "Ленинградах" при запуске
игры SERGEANT SEYMOUR ROBOTCOP - появляет-
ся игровое меню, выполненное запоротым
шрифтом. Затерев пару "левых" OUT'ов в са-
мом начале программы, можно заставить ее
прилично работать на любой машине.
Чaстенько приходится сталкиваться и с
опросом клавиатуры, когда после IN A,(C)
идет проверка не установки битов, а про-
верка на конкретное значение типа CP #nn.
Естественно, на фирменой тачке проблем с
этим не будет, а вот на наших изворотах в
аккумулятор может попасть все, что угодно,
так как вместе с необходимым битом может
установиться/сброситься и парочка "немнож-
ко других". Естественно, игры в этом слу-
чае или как бы не реагируют на клавиатуру,
как ABU SIMBEL PROFANATION, или же выпол-
няют действие какое угодно, но только не
то, какое вам надо. Переделка такого опро-
са клавиатуры на побитную проверку типа
BIT n, A решает все вопросы.
А теперь позвольте сделать одну ма-
ленькую рекомендацию, она касается не
сколько темы восстановления, сколько темы
модернизации игр. Не правда ли, иногда бы-
вает досадно, когда в хорошей и не самой
старой игрушке все надписи (в т.ч. и ос-
новное меню) выводятся обычным, ПЗУ-шным
шрифтом. Приходит на ум мысль о том, что
неужели было так сложно использовать если
не отдельный font, то хотя бы утолстить
тот, что в ПЗУ, ведь это так просто и пот-
ребует только два дополнительных байта в
подпрограмме печати. Mежду второй и трет-
ьей строкой стандартного
LD B,8
LD A,(HL)
LD (DE),A
INC HL
нужно просто вставить RRA и OR(HL). Таким
образом за одним разом с восстановлением
можно улучшить и дизайн, если игра, конеч-
но же, позволит сделать такую вставку, а
не выводит надписи, например, посредством
RSТ #10.
И последний момент. Начиная с первых
номеров и еще печатных изданий поднимался
вопрос о так называемом порте #FF, благо-
даря которому на большинстве машин не ра-
ботали DUET, SHORT CIRCUIT, RENEGADE и
т.п., а ARCANOID 1 вообще сидел глухо,
оживить его предлагалось только методом
технической доработки компьютера. Заинте-
ресовавшись, я полез в этот самый ARCANOID
и нашел следующий момент:
LOOP DI
IN BC,#28FF
IN A,(C)
INC A
JR Z,LOOP
Заменив это дело на фрагмент
LD BC,2580
LOOP DEC BC
LD A,B
OR C
JR NZ,LOOP
удалось не только запустить игру, но и ре-
гулировать скорость полета мяча, изменяя
начальное значение в регистре ВС замедляю-
щего цикла.
Много было версий о том, зачем же было
надо делать в Спектруме этот самый порт
#FF и какая от него польза. Основная масса
суждений сводилась к тому, что этот порт
был нужен для того, чтобы лучше синхрони-
зировать передвижение обьектов на экране в
соответствии с ходом луча кинескопа. И
вот, недавно, отыскался в том же inter-
net'е любопытный документ о том, что порт
#FF был предназначен для защиты производи-
теля самих компьютеров от пиратских подде-
лок. Sinclair Research направила в адрес
крупных фирм-производителей софта, в час-
ности OCEAN и IMAGINE, секретную просьбу
использовать порт #FF в своих программах,
а также всю необходимую информацию об этом
порте. В 1996-м году, когда компьютер на-
чали официально изготавливать и другие
фирмы, появились проблемы со старым соф-
том, где использовался порт #FF. Фирмы
OCEAN и IMAGINE принесли извинения (!)
пользователям новых машин и выпустили ре-
миксы своих старых игр, но уже без ис-
пользования этого злополучного порта. Так
появились игры ARCANOID 128K, SHORT CIRCU-
IT 128K и т.п.
На этой приятной ноте я, пожалуй, и за-
кончу эту статью, надеюсь, вы нашли здесь
хоть что-то интересное и полезное для се-
бя. Если это так, - значит, поставленная
задача достигнута, и я буду рад написать
для вас еще много статей подобного стиля.
С благодарностью приму любые отзывы и кри-
тику на все то, чем я вас гружу на страни-
цах ZX-Power, пишите на адрес редакции.
__________________________________________