Из журналов ZX Power #3-4, Харьков, 1998-99 CHEAT и POKES в игровых программах. Александр Десятниченко, г.Сумы _________________________________________ Первая публикация - журнал "ZX РЕВЮ УКРАИНА", 1996г. Новая, значительно до- полненная и исправленная версия - специ- ально для журнала "ZX POWER", 1997г. 1. История методов "нечестной" игры. Самые первые игровые программы для ZX SPECTRUM были достаточно примитивными и, соответственно, сравнительно легкими в игре. Наверное, любой из вас cможет часа- ми играть в RIVER RAID, залетая очень да- леко и обходясь при этом тем скудным за- пасом дополнительных жизней, которым был наделен пилот создателями программы. Но по мере того, как совершенствовалась тех- ника программирования, усложнялись и сами игры. Уже в 1985 году появились програм- мы, игровое пространство которых насчиты- вало от нескольких десятков до нескольких сотен экранов. Это такие хорошо известные вам игры как STARQUAKE, FIRELORD, ROBIN in the WOOD и многие другие. Значительно увеличилось количество противников в игре и заметно возросла их агрессивность, на- чались вводиться ограничения по времени выполнения поставленной задачи и амуниции главного персонажа. Возросли требования и к мозгам играющего, - теперь приходилось держать в голове карту лабиринта, раскладку предметов по локациям и при этом еще подбирать ключи к дверям или, параллельно со стрельбой по врагам, раз- мышлять над применением предметов. Безус- ловно, все эти факторы сильно повлияли на темпы прохождения игр, которых начало по- являться все больше и больше. Сами же иг- ры становились все красочнее, начали соз- даваться так называемые FINAL CUT, - это когда в самом конце игры при ее успешном прохождении демонстрировалось что-то типа мультфильма с поздравлениями и теперь иг- рающего,после каждого успешно пройденного экрана, начал мучить самый актуальный из всех вопросов, - а что же там, дальше? Вот примерно в это время и появились пер- вые методы "нечестной" игры. В чем они заключались? Конечно же, в устранении причин, усложняющих игру, и, в первую очередь, это касалось лимита жизней, - ведь мало кому удавалось пройти огромное игровое пространство с пятью жизнями в условиях, когда на тебя все время бросают камни, да еще и выполнить при этом пос- тавленную задачу. Тот, кто хоть немножко разбирался в машинном коде, просматривал листинг программы с целью найти в ней ад- реса ячеек памяти, в которых хранилось количество жизней, а также адреса, в ко- торых это самое количество уменьшалось с каждой гибелью персонажа, и вносил изме- нения в текст программы то ли непос- редственно, то ли с помощью оператора PO- KE в бейсик-загрузчике. Позже списки та- ких POKES начали публиковаться в компью- терных журналах и у каждого пользователя появилась возможность самому задавать в игре количество жизней, необходимое для ее прохождения или же просто ликвидиро- вать уменьшение числа дополнительных жиз- ней, установленного самой программой. К тому времени загрузчики уже достаточно хорошо защищались, поэтому некоторые игры "обессмерчивались" внесением жестких из- менений непосредственно в тело игры с по- мощью копировщика COPY-COPY (Pirate 02), который позволяет это делать. Именно в таком виде и дошли до нас такие игры как ALIEN 8, NODES of YESOD, INDIANA JONES и DIZZY. Фирмы-производители игр мгновенно отреагировали на такую наглость и наказа- ли пользователя кодированием основного блока игры. Теперь уже, прежде чем "за- циклить" программу, ее требовалось взло- мать и раскодировать. Жестко обессмерчи- вать игры стали реже, все чаще это стало делаться из загрузчика. Начали учиты- ваться и интересы играющих "по-честному", - в хаккерских загрузчиках перед POKE ставилось REM, чтобы в обычном режиме иг- ра работала нормально, а те, кто не укла- дывается в лимиты, установленные програм- мой, мог убрать оператор REM и играть с бесконечной жизнью. Некоторые загрузчики, перед тем, как запустить игру, задавали вопрос: "INFINITE LIVES (Y/N) ?", и, в случае утвердительного ответа, вносили соответствующие изменения. Новым словом было меню выбора режима игры. Впервые это можно было наблюдать в программе NEBULUS, позже - в загрузчиках Билла Гилберта к играм KRAKOUT 2 и ROBOCOP. Появились и первые мегатрейнеры, - так называют меню из нескольких, от трех до десятка пунктов, воспользовавшись которыми, можно полностью настроить все лимиты в игре по своему вкусу, начиная от бесконечной жиз- ни и заканчивая входом сразу же в любой уровень игры. Первые такие мегатрейнеры вы могли увидеть в играх SLAP FIGHT и NORTH STAR, особого же развития "инфини- тизация" программ нашла в нашей стране благодаря отсутствию закона об авторских правах. Сейчас практически каждая прог- рамма, адаптированная к работе в TR-DOS, снабжается если не мегатрейнером, то хотя бы единичным POKE. А ведь есть еще огром- ная масса игр прошлых лет, так ни кем до конца и не пройденных, а сколько есть но- вых игр, пока до нас еще не дошедших.. Многие из вас могут сказать, что все уже до нас дошло и ничего нового больше не будет. А где же FLYING SHARK 2 (from FI- REBIRDS'91), SAVAGE 4 (from PROBE' 91), MONSTRLAND (from ROLLINGSOFT'91), SATURN 2 (from OCEAN'91), CHANGE TO NINJA (from ULTIMATE'92),DEUCE (from DURELL'92), DARK INSIDE (from DINAMIC'92),GRABER (from CEPPELIN'92), HAND TO HAND (from U.S.GOLD' 92), LETIFEROUS (from IMAGI- NE'92), LITTLE ELEPH (from GOLD WIN'92), NINJA IN FUTURE (from HIT PAC'92), SAVAGE BARBARIAN (from MASTERTRONIC'92), TWILS (from CODEMASTERS' 92), THE GEGG (from KONAMI'92), THE ISLAND (from MIKRO- GEN'92), YAMAHA ISD (from ACTIVISION'92) и сотни других игр? Видели ли вы их, ведь достоверно известно, что эти игры су- ществуют, есть даже их описания! Неоднок- ратно на страницах различных изданий под- нимался вопрос о моральных аспектах бес- конечных жизней. Я же, являясь плохим иг- роком и поклонником всех методов не- честной игры, оставляю решение этого воп- роса на совести каждого и считаю своей задачей только просто ознакомить вас с методиками поиска адресов бессмертия, а как ими пользоваться, - то ли использо- вать только для себя, то ли встраивать в свои загрузчики и предлагать в таком виде широкому кругу пользователей, - пусть каждый из вас определится сам. 2. Фирменный CHEAT. В начале "синклеровской" эры ходили самые невероятные слухи о том, что в не- которых программах есть так называемые "горячие" клавиши, нажимая которые,можно вытворять такие вещи, как проходить сквозь стены, перескакивать через экраны и целые игровые уровни, обеспечить себе бессмертие и неограниченный боезапас. За- тем постепенно эти мошенничества (по-английски - CHEAT) становились пред- метом все большей огласки, и сейчас уже каждый школьник знает, что если в меню программы CYBERNOID 2 выбрать REDEFINE KEYS, а затем, на запрос переопределить клавиши влево, вправо и т.д., нажимать клавиши, которые в совокупности напишут на экране слово "ORGY", то можно запросто стать бессмертным. Очень интересные CHEAT в играх сериала DIZZY. Так, если после загрузки TREASURE ISLAND DIZZY (DIZZY 2), нажать одновременно клавиши Р, О и А, а затем ENTER, то запустится такой CHEAT. Теперь в любой момент в процессе игры можно нажать клавишу C (при этом сам Диз- зи исчезает) и клавишами Z, X, K и М пе- редвигать игровые экраны. Нажатие JUMP на джойстике возвращает Диззи в этот выбран- ный вами экран и можно продолжать игру уже с этого места. Еще круче устроен CHE- AT в SPELLBOUND DIZZY 128К (DIZZY 5). Ес- ли в титульной странице набрать "I WANT AN OMLETTE" (без пробелов, если не полу- чится с первого раза, то можно повторять до тех пор, пока бордюр не заморгает), то в процессе игры при нажатии на клавишу С на экран вызывается целое меню с выбором типа CHEAT, пользуясь которым можно не только двигать экранами, но и выбрать лю- бой предмет, добавить себе звезд и жиз- ней, даже сразу спасти всех членов се- мейства. Практически все программы фирмы OCEAN имеют встроенные фирменные CHEAT. Например, если в таблице рекордов игр NA- VY SEALS 1 & 2 набрать вместо своего име- ни фразу "CLUBBING SEASON", то, при зат- руднении в прохождении, можно нажать EN- TER и перейти сразу на следующий уровень. Практика показывает, что абсолютное большинство CHEAT активизируются тремя способами: переназначением клавиш управ- ления, набором кода в титульном листе, набором кода в таблице рекордов. Однако бывает, что программа на протяжении всей игры поддерживает CHEAT, - в игре IRON SOLDIER в любой момент можно сделаться бессмертным, нажав одновременно клавиши G,A,D. Что же это за CHEAT и откуда они там взялись? Дело в том, что программист, создающий игровую программу, должен про- верить ее работу и проверить не как-ни- будь, а обойти все экраны,пропрыгать по всем кочкам, поубиваться на каждом колыш- ке... Другими словами, он должен предус- мотреть все возможные и невозможные вари- анты игры в каждом игровом экране, чтобы программа везде правильно отработала и нигде не зависла, не говоря уже о том, что он должен пройти несколько раз всю игру от начала до конца полностью, убе- дившись в ее нормальной работе и в дости- жении поставленной цели. Конечно, от- дельные подпрограммы можно проверить и под наблюдением монитора-отладчика, а вот полностью игру - только в том виде,в ко- тором ее получит пользователь. Разумеет- ся, не каждый программист, даже если он является автором своей собственной игры, может быстро и легко пройти до конца, скажем, NARCOPOLICE со всеми уровнями. Поэтому, чисто для себя, программисты де- лали вот такие секретные CHEAT, набирали после загрузки пароль и проверяли свою игру от и до. Почему же они не убирали их после окончательной отладки? А вы представляете, что такое полностью гото- вая фирменная игра с кучами защит? Не так-то просто убрать из нее фрагмент программы, особенно если он сотни раз "перексорен" и упакован вместе с основным блоком игры. К тому же,спустя некоторое время можно опубликовать этот CHEAT и вызвать этим новый интерес к своей игре у тех, кто ее не смог пройти раньше. Если же вам очень хочется пройти до конца ка- кую-нибудь интересную, но тяжелую игру, а ни CHEAT, ни POKES к ней вам не известны, можно попытаться найти такой CHEAT само- му, для этого даже знания ассемблера по- началу не понадобятся, потребуется хоро- шая программа-монитор и немножко вашей интуиции. Проще всего это делается на диске, - декомпрессируется длинный кодо- вый блок игры, записывается на диск и просматривается монитором на предмет по- иска в нем текстовых сообщений. При рабо- те с лентой, после декомпрессии основного блока игры, загрузите любой дизассемблер и запустите его "на дамп". Просматривая содержимое памяти, особое внимание обра- тите на текстовые сообщения, которых во время игры вы никогда не видели на экра- не, и, если на глаза попадутся таковые, запишите или запомните их. Чаще всего это необычные слова или фразы, намекающие на CHEAT. Так, в игре MIDNIGHT RESISTANCE это будет предложение "I AM AN OCEAN TES- TER", сразу же за ним расположена целая подпрограмма, которую можно запустить ко- мандой RANDOMIZE USR 28749, и она предло- жит вам настроить игру по своему вкусу. Найдя такие необычные фразы, можно попы- таться набрать их в титульном листе или таблице счета. Если ничего не получится, а подозрение на эту фразу очень большое, то придется обратиться за помощью к ди- зассемблеру с целью найти, где в програм- ме идет обращение к этой фразе и что пос- ле этого должно произойти. И совсем уж надежно можно найти что-либо интересное, просматривая подпрограммы опроса клавиа- туры. Ведь переопределением клавиш, опро- сом горячих клавиш во время игры и контролем над одновременно нажатыми кла- вишами занимаются именно такие подпрог- раммы, и если вы найдете опрос клавиш, не участвующих в игре, то наверняка это CHE- AT. Я не привожу практических примеров того, как выглядит опрос клавиатуры на языке ассемблера, так как сам применяю 5-6 способов такого опроса. Что же каса- ется программистов-профессионалов, то всех пальцев на руках не хватит, чтобы просто только перечислить методы, с по- мощью которых можно контролировать нажа- тие нескольких клавиш, всего ряда или тем более единичной клавиши. К тому же,наде- юсь, каждый, кто собирается самостоя- тельно обессмерчивать игры, имеет представление об этом. Есть еще одна осо- бенность, которую тоже можно отнести к теме фирменных CHEAT, по крайней мере, в рамках этой статьи. Это касается кодов и паролей, которые выдают некоторые прог- раммы после прохождения определенного этапа игры, например, игрового уровня, и с помощью которых впоследствии можно бу- дет начать играть, пропустив уже пройден- ные ранее уровни игры. Такие коды и паро- ли неоднократно публиковались в печати, обнаружить их самому среди текстовых со- общений также не составляет особого тру- да, если они не закодированы, конечно. В некоторых программах, например, LORNA, вообще такие коды к уровням написаны с пояснениями: "CLAVE ACCESO FASE 2: LOLI", "CLAVE ACCESO FASE 3: PLANINGA" и т.д. Очень часто пользователи жалуются, что, зная код, они не могут его набрать, - клавиатура опрашивается настолько быстро, что стоит только коснуться первой клави- ши, как этой буквой мгновенно заполняется все пространство, выделенное для набора секретного слова. Извините, мои дорогие, но в этом виноват ваш компьютер, - он не "по-фирменному" опрашивает клавиатуру. Конечно, можно повозиться и переписать процедуру опроса, но если вы только хоти- те просто посмотреть, что там, в следую- щем уровне, а не выпускать эту игру для широкой аудитории, то я могу поделиться с вами секретом, как "по-варварски" бо- роться с непослушной клавиатурой. Принцип борьбы очень прост, - уж если ваш компью- тер так резво выбивает целую строку одной и той же буквы, так не препятствовать ему надо, а помочь в этом! Для этого снова запустите монитор, который позволяет не только просматривать, но и редактировать содержимое памяти, и поменяйте код. Нап- ример, если для второго уровня игры LORNA был код доступа LOLI, то вы его перебей- те, скажем, на 2222. Теперь, когда прог- рамма попросит вас ввести код для загруз- ки второго уровня, просто нажмите на кла- вишу 2. Послушная машина выбьет столько двоек, сколько поместится в отведенное для этого место на экране, после чего можно смело нажать на ENTER и загружать второй уровень. Еще раз хочу напомнить вам,что распространять программы с такими жестко внесенными изменениями ни в коем случае нельзя, ведь есть люди, которые из описания игры или из компьютерного журна- ла узнали коды доступа к уровням игры, а войти в них не смогут благодаря вашим, с позволения сказать, "модернизациям". И еще одно замечание. Код доступа может храниться в программе дважды, - в тексто- вом сообщении, выводимом на экран после успешно пройденного уровня, и просто само собой, - к нему и будет обращаться прог- рамма для сравнения с кодом, который наб- рали вы. 3. Использование опубликованных POKES. В многочисленных изданиях, посвященных ZX SPECTRUM, публиковались длинные списки POKES, была даже издана отдельная книга с POKES для 600 игр. Правда, большинство из них никто не проверял, во многих были до- пущены ошибки (об этом предупреждали и сами издатели),большое количество POKES подходило только для определенной версии игры, некоторые вообще предназначались только для жесткой установки с помощью копировщика. Неоднократно приходилось за- мечать и просто перепечатки из издания в издание с теми же самыми ошибками. И это еще ничего, гораздо хуже, когда некоторые ребята присылают в журнал POKES, взятые из других изданий или из чужих загрузчи- ков, делая ударения на том, что они их нашли сами. При испытаниях же оказывает- ся, что многие из них содержат явные ошибки и даже не проверялись. Определить, что эти POKES были найдены не их псев- до-авторами очень просто, - это сразу видно, если адрес бессмертия точно совпа- дает с необходимым, а значение,которое нужно занести в эту ячейку, не приводит к желанному результату. Например, для одной из игр было предложено для установки бес- конечной жизни по адресу 32132 занести 0. Оказалось же, что если занести в эту ячейку 0, то после первой же ошибки игра выдаст "GAME OVER", потому что в эту ячейку на самом деле нужно занести число 182. Можно смело делать вывод, что это POKE не только не принадлежит его мнимому автору, но даже не проверялось. В связи со всем этим, к опубликованным POKES нуж- но относиться с осторожностью, особенно если вы устанавливаете их жестко. В иде- альном случае POKES устанавливаются в загрузчики игр после загрузки длинного кодового блока и декомпрессии этого бло- ка, то есть перед последним RANDOMIZE USR. К сожалению, многие хакеры публикуют свои POKES, найденные в программах, заг- руженных под произвольный адрес или не- распакованных. Кстати, сейчас развелось очень много разных упаковщиков, которыми компрессируются длинные кодовые блоки. Естественно, POKES, найденные в програм- ме, упакованной одним компрессором, не подойдут для программы, откомпрессирован- ной другим. Очень хотелось бы, чтобы все, кто собирается обнародовать собственно- ручно найденные адреса бессмертия, указы- вал их для того случая, когда программа загружена на свое родное место в память машины и полностью распакована. Разумеет- ся, это должны быть безупречные POKES, правильно работающие и не дающие нежела- тельных побочных эффектов. А для тех, кто не смог найти в печати POKES для тяжелой игры или же просто не доверяет им, можно порекомендовать только одно, - загрузить дизассемблер и найти таковые самостоя- тельно. 4. Поиск адресов бессмертия. За период с 1991-го года с целью обессмерчивания мною было исследовано по- рядка 1000 игр, и я попытаюсь поделиться с вами своими методиками поиска и успеха- ми на этом поприще. Итак, с чего начать? Конечно же, в первую очередь нужно запус- тить саму игру и, убедившись в ее нор- мальной работе, немножко поиграть, обра- тив особое внимание на такие вещи, как: сколько дополнительных жизней дается программой, как это отображается на экра- не, как эти жизни отнимаются и что проис- ходит,когда лимит жизней исчерпался до конца. После этого нужно разобраться, заглянув в загрузчик, под какие адреса загружаются файлы программы и как они за- пускаются. Если с этим возникают затруд- нения, то сначала загрузчик придется взломать и привести всю игру к такому ви- ду, чтобы она легко загружалась и запус- калась из Бейсика командой RANDOMIZE USR. Как это делается, вы, надеюсь, понимаете, по крайней мере, это тема для отдельной статьи и таких статей и целых книг было немало. Пусть не обижаются на меня и зре- лые хакеры за то, что я так подробно "разжевываю" в своих статьях, по их мер- кам, порой элементарные вещи. Просто я ставлю себе целью написать так, чтобы да- же те, кто только вчера сел за компьютер, прочитал, попробовал и незаметно даже для себя перешагнул барьер между бейсиком и машинным кодом, потому что сам я начинал осваивать ассемблер именно таким образом, пытаясь обессмертить строптивые игрушки. Для первого примера наилучшим образом подходит какая-нибудь широко распростра- ненная и в то же время достаточно трудная игра, например, STAR BOWLS. Как вы заме- тили,первоначально игроку дается 8 жиз- ней, которые очень быстро впоследствии убывают. Из загрузчика следует, что длин- ный кодовый блок игры загружается под ад- рес 26000 и запускается с адреса 34620, предварительно распаковавшись запуском с начального адреса загрузки. Загружаем этот файл (не забывайте перед этим уста- новить CLEAR на единицу меньше, чем адрес загрузки, то есть 25999) и распаковываем командой RANDOMIZE USR 26000. Теперь нуж- но загрузить и запустить дизассемблер, но как же это сделать, ведь для этого нужно больше 6 кБ памяти, а у нас она вся заня- та загруженным и декомпрессированным длинным блоком игры? Но ведь не вся па- мять занята машинным кодом программы, ведь для игры требуется еще большое коли- чество графики, музыки, таблиц и т.д., которые нам сейчас не нужны. Если же из- вестно, что игра запускается с адреса 34620, то можно предположить, что от это- го адреса и ниже до 26000 и располагается вот эта ненужная нам пока информация, значит,сюда и загрузим дизассемблер. Ко- нечно, если вы работаете с диском, то можно сразу с помощью монитора опреде- литься,где в файле полезная информация, предварительно записав его в распакован- ном виде, и совсем нет проблем с 128к-ма- шинами, позволяющими без накладок загру- зить и исследовать код с помощью замеча- тельного STELTH STALKER MONITORа. Запус- тив дизассемблер, давайте попытаемся най- ти в программе то место, где задается ко- личество жизней. Классически количество жизней помещается в аккумулятор и зано- сится затем в ячейку памяти, постоянно его хранящую. Попросим дизассемблер найти нам мнемонику LD A,#08. Он мгновенно ос- тановится на адресе 47805: 47805 LD A,#08 47807 LD (48249),A Теперь становится понятным, что коли- чество жизней постоянно хранится в ячейке 48249. А что, если занести туда не 8, а, скажем, 100 жизней? Для этого можно пере- загрузить длинный блок, очистив память, декомпрессировать его (RANDOMIZE USR 26000) и дать POKE 47806,100. Теперь за- пустите саму игру (RANDOMIZE USR 34620) и вы собственными глазами увидите, что ко- личество жизней значительно возросло, правда, их стало почему-то не 100, а только 64... Дело в том, что эта игра распечатывает количество жизней в шестнадцатиричном представлении, и если вам понадобится 255 жизней, то на экране вместо привычного числа 255 появится #FF. Многие игры проверяют количество жизней и не печатают на экране, если их, скажем, больше 9. Игра BOSCONIAN, например, печа- тает количество жизней в десятичной фор- ме, но под это количество на экране выде- лено только два разряда и если вы задади- те ей больше 99 жизней, то после первого же столкновения получите GAME OVER. Есть игры, которые отображают количество жиз- ней не числом, а соответствующим коли- чеством предметов, например, количество жизней в игре ROBOCOP соответствует коли- честву голов Робокопа в нижней части эк- рана. Представляете, что будет, если за- дать их больше, чем предусмотрено? Конеч- но, если программа проверяет это, то от- секает лишние, а если нет? Тогда в LAST NINJA 2 программа при распечатке коли- чества оставшихся жизней попытается выстроить в одну шеренгу 255 ниндзей, а игра MURRAY MOUSE SUPER COP попробует разместить в пределах экрана 255 мышей. К тому же, даже такого огромного запаса жизней не всегда может хватить для успеш- ного завершения игры, - я, например, не уверен, что на двадцати семи уровнях игры SPACE HARRIER 2 меня убили меньше 255 раз. По всем этим причинам такой способ решения проблем с количеством жизней не только не нашел распространения, но он и нежелателен. Гораздо красивей и надежней работают POKES, устраняющие убавление жизней. Поскольку обычно за один раз от- нимается только одна жизнь, то наиболее вероятнее, по-видимому, применение коман- ды DEC для этой цели. Давайте вернемся снова к STAR BOWLS и проверим это предпо- ложение. Как мы уже знаем, для постоянно- го хранения количества жизней в этой программе выделена ячейка памяти по адре- су 48249. Попробуем отыскать фрагмент, где бы шло обращение к этой ячейки памя- ти, например, через аккумулятор. Дизас- семблер выдаст: 46275 LD A,(48249) 46278 DEC A 46279 DAA 46280 LD (48249),А Таким образом, наше предположение оп- равдалось. Командой DEC A по адресу 46278 количество жизней уменьшается на единицу, затем снова отправляется на постоянное хранение в ячейку 48249. Что ж, попробуем направить работу этой процедуры в свое русло, исключив из нее команду DEC A. Про- ще всего, конечно, забить ее нулем, кото- рый в переводе с языка машиного кода будет обозначать, что в этой ячейке во время вы- полнения программы не будет осуществляться никакой операции (NOP), ну, а на языке бейсика это звучит еще проще - POKE 646278,0. Теперь, если вы вставите в загрузчик строку с таким выражением перед запуском игры командой RANDOMIZE USR, то, сколько бы ваш герой в игре не умирал, у него все равно будет в запасе еще 8 жизней, другими словами, вы сделали его бессмертным. Ана- логично в игре выглядит и процедура, до- бавляющая жизнь при успешной игре: 45314 LD A,(48249) 45317 CP #08 45319 RET NC 45320 AND A 45321 INC A 45322 DAA 45323 LD (48249),A 45326 CALL 47988 Oна сначала проверяет, не равно ли ко- личество жизней восьми, и, если оно меньше, то будет увеличено на единицу ко- мандой INC A. Пусть не пугает вас команда DAA, - она нужна, чтобы подготовить число жизней к печати на экране подпрограммой, расположенной по адресу 47988. Taкой же CALL 47988 вы найдете и после процедур, задающих и отнимающих жизни. Часто приме- няются еще два способа подготовки чисел к печати: или же количество жизней сразу за- дается на #30 больше, чем надо, как это сделано в WAR MACHINE (LD A,#35), или же посредством добавления числа #30 к коли- честву жизней непосредственно перед печат- ью (АDD А,#30). Во многих играх количество жизней зада- ется, минуя аккумулятор, при помощи ре- гистра HL. Так, в игре CORSARIOS 2 это сделано так: LD HL,#05. Нередко и убавле- ние жизни тоже производится через тот же регистр: LD HL,24851 DEC (HL) JP P,25018 Это был фрагмент игры BATMAN 3, а в программе P-47 the FREEDOM FIGHTER приме- нен комбинированный метод: LD HL,29964 LD A,(HL) DEC A LD (HL),A Занимаясь обессмерчиванием игр, вскоре вы столкнетесь и с такой ситуацией, когда, забивая нулем команды DEC A или DEC (HL), при первом же погибании программа выдаст знакомое сообщение: "GAME OVER". Дело в том, что многие программы сразу же после отнимания делают флаговую проверку, а ко- манда NOP в таком случае пустит программу не в ту степь. В таком случае, а, еще луч- ше, в любом случае, вместо NOP следует применять однобайтные команды OR A или OR (HL) соответственно. Такое вы уже могли наблюдать, просматривая списки POKES, где по адресам вместо нуля заносится 182 или 183. А теперь о других, менее распростренен- ных способах. В игре NETHER WORLD, напри- мер, вы сможете обнаружить еще один способ убавления жизней: 33547 LD A,(65405) 33550 SUB #01 33552 LD (65405),A В таком случае достаточно вместо #01 поставить #00 и пусть себе отнимает по ну- лю жизней каждый раз. Достаточно оригина- лен метод отнимания жизней с помощью ко- манды SBC, как это сделано в игре SABRINA: LD HL,(24618) PUSH DE EX DE,HL LD HL,#01 EX DE,HL AND A SBC HL,DE POP DE LD (24618),HL Нарушить нормальную работу такого фраг- мента труднее, но тоже можно, например, забив нули в SBC HL,DE и единичку в LD HL,#01. Кстати, иногда бывает, что подоб- ные подпрограмы заканчиваются директивой RET и вызывается из основной програмы че- рез CALL. Tогда можно поступить проще - поставить RET (из бейсика - 201) в самое начало такой подпрограммы, чтобы CALL сюда как пришел, так ни с чем и ушел, не выпол- нив ни единиго действия. Среди хакеров це- нится именно такой способ инфинизации игр, когда при малом колличестве POKES достига- ется наибольшая отдача. В сложных, тяжелых и, как правило, очень интересных играх часто все лимиты, в том числе и количество жизней, хранятся в виде отдельной таблицы, выборка из которой производится через индексные регистры. Так, в программе CASANOVA количество жиз- ней задается как LD (IX+43),#05 и, соот- ветственно, убавляется как DEC (IX+43), a в игре TERMINATOR 2 вы можете наблюдать такое явление: DEC (IY-5). Нередко такие таблички хранятся отдельно и после GAME OVER выполняется LDIR ее на рабочее место, как это сделано в PRINCE CLUMSY или RETURN of the JEDI: LD HL,54079 LD DE,54059 LD BC,20 LDIR А затем и само отнимание жизни: LD HL,54059 LD A,(HL) OR A SCF RET Z DEC (HL) В некоторых программах ход событий спланирован таким образом, что количество ошибок с каждым тяжелым случаем увеличива- ется и, при достижении определенного зна- чения игра заканчивается. Впервые я такое увидел в игре HAMMER BOY: LD A,(42097) INC A LD (42097),A Кстати, в этой игре подсчет ошибок ана- логичным образом идет в двух местах и, ес- ли хоть в одном из них достигнет предела, то придется начать игру сначала. Подобного рода методы применяются также в тех случа- ях, когда контроль над одним и тем же ли- митом из одного и того же фрагмента прог- раммы невозможен или же если разного рода ошибки отнимают разное количество жизней. Естественно, что после того, как хакеры начали "циклить" игры, программисты фирм-производителей начали принимать меры против подобного рода деятельности. В подпрограммах, уменьшающих число жизней, начали применятся, как в игре TARGET RENE- GADE, недокументированные команды или, как в JUNGLE WARRIOR, сдвиг битов в байте. Найти такие вещи намного сложнее, да и что там говорить, если перед хорошим кодером поставить задачу сделать отнимание жизни так, чтобы этого никто не нашел, я думаю, многие бы справились. В таких случаях мож- но пойти на хитрость и сделать кое-что другое. Так, когда-то мне не удалось найти отнимание жизни в игре MAD MIX, зато легко отыскался участок, где задавалось коли- чество жизней и фрагмент, где шла проверка оставшегося значения: LD A,#03 LD (24624),A ..... LD A,(24624) AND A RET Z Даже этого уже достаточно, чтобы ее обессмертить, ведь проверка идет каждый раз после того, когда заберут жизнь. А что, если вместо проверки сделать снова занесение в 24624 троечки? Тем более, что такая программка будет занимать, как и программа проверочки, те же пять байт. Та- ким образом игра теперь будет забирать жизнь, но сразу же после этого, вместо проверки, устанавливать все те же три жиз- ни. 5. Бесконечное время, оружие, энергия. Нередко случается, что в азарте быстренько расстреляешь весь боекомплект, а затем сосешь палец, пока не убьют. Ес- тественно, возникает желание все это сде- лать бесконечно-вечным. Ну что ж, сложного ничего нет, тем более что делается это примерно теми же методами. Например, в иг- ре HAWKSTORM вам дается 50 патронов. Исследуя машинный код, нетрудно обнаружить LD A,50, а затем, соответственно, и завет- ное DEC A. Время также довольно часто задается и отнимается стандартно, вот как это выгля- дит в игре ROBOCOP 2: LD HL,43224 DEC (HL) RET NZ Но бывают случаи и потяжелее, когда ча- сы, минуты и секунды задаются, проверяются и отнимаются (или увеличиваются) отдельно. Ну и очень уж часто приходится сталки- ваться с самым интересным видом ограниче- ния - энергией. Начнем с самого простого вида представления энергии - числового, когда энергия отображается, как большое число, например, 100 или 1000 единиц. Та- кое можно наблюдать например, в игре CAPI- TAN TRUENO, но, снова-таки, все стан- дартно: LD HL,58943 DEC (HL) JP Z,24042 В отличие от количества жизней, чаще отнимается сразу несколько единиц энергии, как в игре TIME MACHINE: LD A,(60499) SUB #03 LD (60499),A Порой самой трудной задачей является определить, сколько же единиц энергии име- ет наш персонаж в самом начале игры, чтобы было затем от чего плясать в процессе по- иска. Ведь часто энергия отображается на экране в виде полосочки. Хорошо, если она состоит из отдельных элементов и их, как в игре FORGOTTEN WORLDS, например, можно сосчитать. А вот когда такой градации нет, на что только не приходится уповать, - считать, когда медленно убивают, через сколько ударов придет хана или, скажем, прикидывать по пикселям приблизительно, а потом пытаться найти что-то подобное... Ну, а теперь самый распостраненный ме- тод отнимания энергии из игр серии SIRWO- OD. Итак, удалось определить, что изна- чально дается 48 единиц энергии и хранится она в ячейке 59850, отнимается же при по- мощи команды SUB: LD C,2 LD A,(59850) SUB C BIT 7,A JP NZ,39989 BIT 7,C JR Z,LOOP CP 48 JR C,LOOP LD A,48 LD (59850),A JP 42272 LOOP LD (59850),A Kак видите, в С заносится количество отнимаемой энергии, оно и вычитается из А с последующей проверкой. Такое отнимание имеет много преимуществ, ведь можно вычи- тать различное количество энергии. Такое может быть необходимо, когда, скажем, тре- буется, чтобы различные виды монстров на- носили герою различной силы повреждения. Согласитесь, это делает игру более привле- кательной и реалистичной. В принципе, эта подпрограмма дает много места для вашего творчества, можно для нее подобрать нес- колько разных POKES и каждое будет по-сво- ему реализовывать бесконечную жизнь, ну, а самое простое здесь, конечно же, просто забить нулем команду SUB C. Нечто подобное найдете и в черепашках-ниндзя (TURTLES): LD A,(24422) LD B,A LD A,16 SUB B К тому же, в этой игре одной программой отнимается энергия всех четырех черепашек, что, безусловно, удобно в плане обессмер- чивания. Но когда вы попытаетесь пройти дальше, у вас появится еще один лимит - время, за которое черепашки должны успеть отключить все компьютеры, значит, придется "циклить" теперь еще и его! Не удивляй- тесь, подобного добра вам попадется еще немало, особенно в играх, где на каждом новом уровне новое задание. Или вот еще ситуация, - в игре HUMAN KILLING MACHINE после того, как вы ее обессмертите, первые уровни пройдутся легко, но потом, на пос- леднем уровне, после каждого вашего удара противник так быстро отдыхает, что вы не успеваете ему сбить эту энергию! Значит, придется найти место, где ему добавляют энергию и устранить этот сюрприз. А вот нетипичный случай отнимания энер- гии из полной версии игры XENON: LD HL,52262 NEG ADD A,(HL) LD (HL),A RET C LD (HL),#00 Достаточно оригинально идет работа с энергией в игре BRONX: LD A,(64813) XOR (IY-107) LD (64813),A Снова об играх от ATLANTIS SOFTWARE (SHOW BROTHERS), написанных на каком-то макроязыке и компилированных в машинный код. Все лимиты задаются здесь через HL, а обрабатываются процедуркой, работающей с ячейкой памяти, в которой этот лимит хра- нится. Достаточно поставить туда RET, что- бы обессмертить одним приемом все ограни- чения. И еще такая заморочка. В игре CORSARIOS с числовым представлением энергии, судя по экрану, дается 600 единиц. Порывшись в программе, не удалось найти место, где бы фигурировало такое число. Поиграв еще нем- ножко и внимательнее присмотревшись к то- му, как убавлялась энергия, я заметил, что задействуются только две первые цифры, а последний ноль там вроде как для красо- ты... Через минуту мое предположение оп- равдалось, так как нашлось LD HL,60, а еще через минуту игра шла в уже обессмерченом виде. 6. IMMORTAL как самая сильная форма бессмертия. По сравнению с INFINITE LIVES, слово IMMОRTAL (неуязвимость) появилось в лекси- коне синклеристов не так давно. В 1992-м году в Англии была выпущена программка HA- KER AMAZING, в которой приводились много- численные POKES и firm cheats, среди кото- рых попадалось и это новое словечко. Мно- гие пользователи, испытав опубликованные там IMMORTAL, были просто поражены их ра- ботой, после чего это понятие прочно при- жилось и в нашей среде. Помните, Н.Родио- нов в игре R-TYPE назвал такое POKE мисти- ческим? Что же это такое? Вы, наверное, видели, как во многих играх, после того, как ваше- го героя ухрюкают, он снова появляется, но при этом несколько секунд помигивает, буд- то готовится к новым приключениям. Причем, пока он мигает, он практически неуязвим, то есть его не берут пули, не давят танки, а иногда он даже не тонет в воде. Кто по- расторопней, тот в эти секунды может даже умудриться пропрыгать несколько площадок, пройдя, таким образом, тяжелое место, то самое, где ваш герой удостоился быть уби- енным прошлый раз. А что, если сделать, чтобы персонаж на все время игры стал та- ким неуязвимым, только чтобы не помигивал? Вот это и будет самый что ни на есть IM- MORTAL! Но как его найти? Можно, ведь вре- мя, которое персонаж помигивает, где-то задается и отнимается. Вот пример, пожа- луй, из самой известной игры BUBBLE BOBBLE: 43832 BIT Z,(IY+90) 43836 JP Z,43998 Время неуязвимости хранится в табличке, идет его проверка и, если заменить JP Z на JP и поставить вместо 90 число 150 (в той ячейке всегда то, что нам сейчас надо), можно запросто сделаться неуязвимым. А те- перь фрагмент из SOLOMON'S KEY: 49318 LD HL,(49813) 49321 LD A,L 49322 OR H 49323 JP Z,49390 49326 LD DE,(43206) 49330 CALL 49356 49333 OR A 49334 RET Z Если в этом фрагменте заменить условный выход RET Z на более кардинальный RET и, таким образом, отсечь часть программы, от- вечающую за обработку столкновений с вра- гами, то можно будет больше на них не отвлекаться и сосредоточиться на самом ло- гическом задании этой очень увлекательной игры. А в игре JACK the NIPPER 2 по адресу 41218 находится целая подпрограмма, отве- чающая за условия столкновения с врагами, водой и стенами и, если в этих процедурках заменить OR A на твердое XOR A, то можно настроить программу полностью по своему вкусу, например, прыгать, не разбиваясь, с любой высоты. А теперь главный принцип поиска неуяз- вимости. Итак, сначала надо найти, где в игре отнимается жизнь и потом смотреть от этого места выше, разбираясь, что выполня- ют те участки программы, которые отработа- ли до того, как отнялась жизнь. Таким об- разом можно найти фрагмент, где идет обра- ботка столкновений и затем пустить его по своему сценарию. Обычно приходится сделать RET для такой подпрограммы или обойти ее, поставив безусловный JR. Иногда, правда, бывает достаточно, как в CABAL, забить ну- лем DEC A, или, как в F1 TORNADO SIMULA- TOR, исправить SUB #01. 7. Другие POKES. Занимаясь обессмерчиванием игр, вы обя- зятельно столкнетесь и с массой других, так сказать, параллельных проблем. Напри- мер, чтобы проверить, правильно ли вы наш- ли POKE для, скажем, STORMLORD 2/2, необ- ходимо будет каждый раз перед запуском этой игры набирать код доступа к ней. Представьте, а если у вас под подозрением десяток POKES, да, к тому же, плохо рабо- тает клава из-за буржуйского метода ее оп- роса, да и самого кода вы можете не знать... А что же тогда говорить о простом пользователе, который не может даже просто посмотреть, что же там, во втором уровне VIAJE of CENTRO de la TIERRA по той причи- не, что не в силах решить головоломку в первом уровне, чтобы узнать пароль к сле- дующему уровню. Вот и лежат такие игры на дисках годами пустым грузом, а user даже и не предполагает, какая красота скрывается, скажем, во втором и третьем уровне игры SACRED SWORD (La ESPADA SAGRADA), той же фирмы TOPO SOFT с таким же доступом к уровням. Ну что, есть желание что-то изме- нить и в этой сфере? Ничего сложного. Если вы прошли до конца, скажем FREDDY HARDEST, то, конечно же, заметили, что она выдает код доступа к второй части, а вот вторая часть код почему-то не запрашивает... Ра- зумеется, она изначально делала это, прос- то до нас дошла уже жестко переделанной. Давайте заглянем во внутрености игры REX2, который запрашивает такой длинный код! По адресу 56046 вы увидите CALL 56103. Други- ми словами, по адресу 56103 находится подпрограмма запроса кода. Втюкайте туда RET и забудьте о коде. Примерно так же выглядит и TITANIC-2, - в начале програм- мы среди многочисленных CALL есть и один JP, если его убрать, код больше не попро- сят. А в играх сериала TOI ACID GAME про- цедура окодирования пациента находится прямо в основной программе, - можно забить ее всю нулями, обойти с помощью JP или вы- вести из строя так, чтобы она выходила в игру, какой бы матюк вы не набрали. Да, и еще. Желательно не курочить игру, жестко выбрасывая запрос кода, лучше сделайте так: если игрок выберет в вашем мегатрей- нере бесконечную жизнь, то ему автомати- чески дается и NO PASSWORD, если же попал- ся индивидуум, надеющийся пройти игру честно, то, пожалуйста, пусть заодно и с кодом посношается, раз он уж такой честный. А что делать, если игра очень тяжелая, никаких паролей не запрашивает, по-честно- му пройти не получается, но очень уж охота посмотреть, что же там, дальше? Ну, если это подгружаемая игра, то можно просто, поменяв уровни местами (или переименовав), добиться нужного эффекта. Правда, это го- дится только для старых дисковых версий, сейчас же все это упаковывается и собира- ется в моноблоки, разобрать которые под силу далеко не каждому. В одноблочных же играх можно попробовать поискать счетчик этапов и изменить его начальное содержи- мое. Только вот еще раз хочу сделать уда- рение на то, что распостранять такие вер- сии нельзя, если игра уж очень сложная, то предоставьте пользователю менюшку, пользу- ясь которой он сам определит, идти ли ему последовательно, или же прыгать через уровни. Нередки и случаи, когда, казалось бы, обессмерченная игра, загружает второй уро- вень и выдвигает вам совершенно новые ли- миты, идет по новому сценарию. Так, напри- мер, The UNTOUCHABLES, одна из красивейших игр, каждый уровень которой - отдельная игра. Разумеется, такие игры приходится обессмерчивать уровень за уровнем, причем, если в intro вы предлагали сделать выбор CHEAT или NORMAL, то это предложение должно тоже передаваться по этапу, обессмерчивая или оставляя, как было, каж- дый уровень в соответствии с выбранным в intro режиме. Еще одна проблема прохождения игр, - после гибели вас возвращает в самое начало уровня... Например, все знают, что в игре ZYNAPS 32 уровня, но видел ли кто хотя бы десятый, даже с бесконечной жизнью? А как же его увидишь, если после каждого загиба- ния игра возвращает нас на исходную. Дела- ем вскрытие: PUSH AF LD A,32 CALL 42670 CALL 34221 POP AF DEC A LD HL,45329 CALL 37346 RET Чутье нас не подвело, - если забить из- рядно приевшуюся инструкцию DEC A, то на- зад вас никто не вернет. Вот только жаль, что, благополучно скончавшись, вы начинае- те игру сразу в следующем уровне, а это значит, что был допущен пропуск довольно -таки большого куска игрового пространст- ва; хорошего в этом, естественно, мало. Давайте посмотрим, как удалось решить эту проблему в игре DRAGON BREED: 29004 LD A,(32888) 29007 AND A 29008 RET Z 29009 DEC A 29010 JR Z,29016 29012 RET ... 29016 XOR A 29017 LD (32888),A 29020 LD (32801),A 29023 LD (32806),A Как видите, эта процедура распоряжается нашей судьбой, - если случается столкнове- ние, то оно обнуляет координаты героя и возвращает к началу этапа и с начальным боекомплектом. Переставьте RET чуть выше (29010), чтобы исключить переход на обну- ление, и получите ожидаемый результат, - вас убивают, а вы тут же воскресаете и упорно двигаетесь вперед, не потеряв даже оружие. Еще одна летающе-стреляющая игра - SA- LAMANDER. Мало того, что ее тяжело обессмертить, так еще и летательный аппа- рат в ней ползает, как черепаха! Поковы- рявшись, удалось выудить целых четыре за- медляющих цикла типа: LD HL,2000 LOOP DEC HL LD A,H OR L JR NZ,LOOP Tеперь несколько экзотических POKES. Всем, конечно же, известно, что игра DIZZY 3 будет считаться пройденой, если вы собе- рете все 30 монет, многие же жалуются на недостачу в одну-две монеты. А ведь можно сделать так, чтобы на момент начала прик- лючений у Диззи уже имелась в кармане двойка-тройка монеток. Или вот еще один простор - адвентюрные программы. Там ведь тоже герои имеют энергию, силу, магию. Сложность такого "цикления" очевидна, - как правило, эти лимиты нигде не отобража- ются. Кроме этого, в литературе приходи- лось видеть POKES типа "игра без противни- ков", испытав которые, я остался недово- лен, так как игра теряет всякий смысл. Для тех же из вас, кто не смог найти POKES са- мостоятельно, или все еще не может преодо- леть психологический барьер между бейсиком и ассемблером (для таких я обязательно на- пишу статью, обещаю!), я предлагаю не- большой списочек из 200 POKES, найденных мною лично. В него вошли только POKES к тем играм, к которым подобной информации я нигде не встречал. Все POKES, разумеется, приведены для полностью распакованных программ, которые находятся в памяти на своем родном месте. ALIEN EVOLUTION 58228,182 (lives) ARKOS 1 52117,182 (lives) ARKOS 2 52126,182 (lives) ARKOS 3 51572,182 (lives) BARBARIAN 2 40212,0 (lives) BARBARIAN 3 37480,52 (lives) BASE 51932,182 (lives) BATTLE CITY 31568,0:30606,0 (lives) BESTIAL WARRIOR 41566,183 (lives) BEYOND the ICE PALACE 38280,182 (lives) BIGNOSE'S USA 42816,62:42817,3: 42821,0 (lives) BIONIC NINJA 53099,201 (all) BITE the DUST 35934,183 (lives) BLACK LAMP 32874,166 (energy) BLAZING THUNDER 33350,183 (lives) 34780,0:34810,0: 35630,0 (energy) BLOB the COP 48022,0 (energy) BRONX 36880,182 (lives) 34801,0:34802,0: 34803,0 (energy) BUTCHER HILL 27564,0:27576,0: 27612,0: 27624,0:27657,0: 28249,0 (energy) CAPTAIN FIZZ 28892,201 (energy) CASANOVA 49753,4:53153,182 (lives) CAVEMANIA 51381,201 (all) CHOY LEE KUNG FU 54220,0 (lives) CORONA MAGICA 29563,0 (energy) COSA NOSTRA 39706,0 (lives) 38841,0 (ammo) CRACK UP 40484,182 (lives) CRAZY CARS 1 29406,0:29422,0 (time) CRAZY CARS 2 29115,201 (time) CURRO JIMENEZ 40504,182:47192,182 (lives) 47898,0 (energy) DARIUS 39291,0 (lives) 33902,0:37106,0: 43841,0 (immortal) DARK FUSION 50408,0 (lives) 54168,0 (energy) DEMON SLAYER 54227,0:54265,0: 54303,0: 54341,0: 55654,0:55702,0 (energy) 55476,0 (time) 53425,0 (ammo) DESPERADO 2/1 36934,182 (lives) 36927,183 (energy) DESPERADO 2/2 35960,182 (lives) DESTINY MISSION 33353,0 (lives) 37245,201 (immortal) DEJA VU 50296,0 (lives) DIZZY DOWN the RAPIDS 34701,88:34702,129 (lives 1) 34756,88:34757,129 (lives 2) DRAGON SPIRIT 54498,0:54499,0 (lives) 54424,201 (immortal) DUCKULA 39755,0 (all) EARTH SHAKER 35344,183 (lives) ELIMINATOR 1 40311,0:44715,0 (lives) ELIMINATOR 2 35962,0 (lives) EGG HEAD 1 56648,183 (lives) EGG HEAD 2 58184,182 (lives) FAST FOOD 47844,0 (lives) FORGOTTEN WORLDS 35712,0:35722,0 (energy) FOX FIGHTS BACK 48071,0 (lives) 48063,201 (energy) FREDDY HARDEST 1 64011,183:64060,201 (lives) FREDDY HARDEST 2 61607,183:61621,201 (lives) FREDDY HARDEST 3 59004,0:59005,0 (lives) FRONT LINE 62499,0 (lives) F1 TORNADO SIMULATOR 58252,0:5863,0 (lives) GREEN BERET 41652,182 (lives) GUERILLA WAR 40848,0 (lives) GUN SMOKE 49871,183 (lives) HAMTE DAMTE 43165,182 (lives) 41953,201:51038,0 (energy) 50766,182 (ammo) HAVOC 38909,0:38926,0 (energy) HELLMASTER 32867,0 (lives) HUNDRA 40724,182:41431,182 (lives) 41354,201 (energy) HYPSYS 1 55018,201 (energy) HYPSYS 2 55319,201 (energy) i,BALL 2 45392,182 (lives) IMPOSSAMOLE 52483,0:52484,0 (lives) 53427,201:63028,201 (immortal) IRON SOLDIER 53951,201 (lives) JOE BLADE 3 35361,0:35362,0 (energy) 35377,0:35378,0 (ammo) 41590,0 (time) JUNGLE WARRIOR 44979,183 (lives) KGB SUPERSPY 41352,183 (lives) KLAD 28100,201:28114,201 (lives) KLIATBA NOCI 63475,183 (energy) 63361,0 (time) KOLOBOK 26185,0 (lives) LEONARD 64309,0 (lives) LIBERATOR 51252,0 (lives) LINE of FIRE 42633,0 (energy) LIVINGSTONE 2/1 48510,183:53995,5 (lives) LIVINGSTONE 2/2 45912,201:46766,183: 51393,5 (lives) LORDS of CROM 51056,0:56220,0 (lives) MACH 3 24624,0 (immortal) MAMBO 57046,0:57059,0 (lives) MASTER BLASTER 49988,0 (lives) 64252,0 (ammo) MAZI MANIA 40915,60:40916,0 (lives) 40540,0 (energy) MEGAXONIX 34908,201 (lives) NETHER WORLD 33575,0 (lives) 65352,0:65367,0 (time) 33094,0:33359,0: 33537,201 (energy) NEW YORK WARRIORS 30175,0 (immortal) NEXOR 36212,0 (lives) ORION 33410,180 (lives) PAPER BOY 1 50577,182 (lives) PAPER BOY 2 41053,0 (lives) PHANTIS 1 54216,0 (lives) PHANTIS 2 57606,0 (lives) 64515,201 (no password) PHANTOM F4 64693,183 (energy) 64712,183 (ammo) 64637,201 (time) PIPEWORK 42639,0 (lives) 42672,24:42797,201 (time) POSEIDON 42182,0 (lives) 42266,0 (energy) POTSWORTH 56792,183 (lives) PREDATOR 1 39575,0 (lives) 39819,0:39820,0 (ammo) 39428,201 (energy) PREDATOR 2 28729,183 (lives) 28706,0 (energy) 29049,183 (ammo) QARX 46058,5 (lives) RED HEAT 33644,183 (lives) 27821,24:27822,15: 37757,201 (energy) RETURN of JEDI 52140,0 (lives) RIPT OFF 35427,183 (lives) RISE OUT from DUGEON 31586,183 (lives) ROAD RUNNER 40806,0 (lives) 42685,0:42696,0: 45159,0 (energy) ROBOCOP 3 46144,201:46457,201: 46540,201 (energy) 35162,0:35163,0: 35164,0 (no game over) SAMURAI WARRIOR 37866,0 (energy) SANXION 36551,182 (lives) SCOOBY & SCRAPPY DOO 57275,183 (lives) SEA HAWK 50626,201 (all) SENDA 1 56959,0 (lives) SENDA 2 56449,0 (lives) 56366,201 (energy) SERGEANT SEYMOUR 34248,182 (lives) SEXTRIS 33891,0 (lives) SHAOLIN'S ROAD 44838,183:44843,0: 44844,0 (lives) SHURIKEN 62907,201 (lives) 62927,201:62947,201 (ammo) SIDEWINDER 2 36087,201 (energy) SIGMA 7 34203,183:58525,183: 58853,183 (lives) SILENT SHADOW 37841,0 (lives) 33080,201 (energy) SILK WORM 38505,0:38561,0 (immortal) SIR FRED 59788,0 (lives) SIRWOOD 1 40742,0 (energy) SIRWOOD 2 38486,0 (energy) SIRWOOD 3 36268,0 (energy) SNARE 27392,182 (lives) SONIC BOOM 31597,182 (credits) 31813,182 (lives) SPACE HARRIER 1 46551,0 (lives) SPACE HARRIER 2 40905,183 (lives) SPIRITS 51754,0 (lives) 51453,0 (energy) STAR PAWS 25635,182:62573,182 (all) STREET GANG 37127,183:39254,182 (lives) STRIDER 1 39950,0 (lives) 39893,201 (energy) STRIDER 2 33129,0:33130,0 (lives) 33514,0 (energy) SUBWAY VIGILANTE 27080,201:27134,0 (energy) SUPER CARS 39025,201 (all) SUPER DRAGON SLAYER 57964,201:59929,0 (immortal) SUPERKID in SPACE 51675,201 (all) SUPER TANK SIMULATOR 41547,0:41548,0 (lives) SWITCH BLADE 38430,201 (energy) TAPER 41005,183 (lives) TASK FORCE 57202,0 (lives) TECHNO-COP 37439,0 (time) TERMINATION 53120,0 (lives) 55274,0 (time) TEST DRIVER 2 27798,0 (lives) THUNDERCATS 31403,182 (lives) TINTIN on the MOON 50161,0:50660,0: 50661,0 (energy) TOKYO GANG 31562,0:31981,0: 32573,0 (energy) TOMCAT 37174,182 (lives) TOOBIN 61721,0 (credits) TORNADO ECR 54693,0 (lives) TOWDIE 30583,182 (energy) TREASURE 27534,182 (lives) TUMA 7/1 28893,0:29012,0: 40657,0 (all) TUMA 7/2 29676,0 (lives) 28538,0:28695,0 (ammo) TWIN WORLD 60906,182:60942,182 (energy) U.C.M. 36337,0:43734,0 (lives) WAR MACHINE 43093,0 (lives) 42932,201 (energy) 46442,0:46728,0: 46773,0 (ammo) 42708,0:42722,0 (time) 48482,0:48553,0 (keys) W.D.W. 2 50833,0:51847,0 (all) XENON 25029,182 (lives) 25001,201 (immortal) ZARJAZ 30230,183:30256,183 (energy) С наилучшими пожеланиями - DESALEX/XPJ. __________________________________________