ZX Power
#04
09 января 2000 |
|
Ликбез - ВОССТАНОВЛЕНИЕ ИГР#3. Заключительная статья.
ВОССТАНОВЛЕНИЕ ПРОГРАММ часть 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, пишите на адрес редакции. __________________________________________
Другие статьи номера:
Похожие статьи:
В этот день... 21 ноября