Из журналов ZX Power #2-4 Харьков, 1997-1999 ВОССТАНОВЛЕНИЕ ПРОГРАММ. Александр Десятниченко, г.Сумы Первая публикация - журнал "ZX РЕВЮ Украина", ноябрь 1995г. Исправленная и значительно до- полненная версия - специально для электронного журнала "ZX POWER", ноябрь 1996г. ________________________________ 1.Причины необходимости восстановления программ. Безусловно, подавляющее боль- шинство высококачественных прог- рамм для ZX SPECTRUM - это игровые программы, написанные в Англии, Италии, Испании и дру- гих странах. Приятно во время загрузки такой игрушки полюбо- ваться красивой картинкой, а после ее окончания под звуки льющейся задорной мелодии выб- рать управление и с головой оку- нуться в этот прекрасный мирок компьютерных приключений. Но бывают и другие случаи, когда приходиться подолгу лицез- реть во время загрузки на кос- мически черный, без заставки, экран, в который перед запуском программы грузиться какая-то дрянь в виде полосочек и точе- чек, иногда занимая этим полэк- рана, а затем поверх такого изображения появляется игровое меню, сразу же забивающееся та- ким же мусором, после чего заг- рузка заканчивается и вам пред- лагается из этой свалки разоб- раться с управлением. Хорошо, если вам удастся угадать клави- шу, экран очиститься и начнется игра, а если клавиатура отка- жеться реагировать на ваши уси- лия, если игровые события будут разворачиваться поверх всего этого, ранее загруженного, как, например, это происходит в прог- раммах TITANIC, SATAN и CURRO JIMENEZ, если из динамика ваши уши будет наслаждать только ти- шина или более того, так долго загружаемая игра попросту завис- нет или сброситься? Причем, по моей статистике, таких программ, - около половины от всех разо- шедшихся по нашей стране! Естественно, сразу же возни- кает вопрос, - неужели это так и было задумано авторами прог- раммы, неужели игра никогда не имела ни заставки, ни музыки, ни удобного управления? Трудно поверить, но первоначально и эти уродливые создания были красиво, нестандартно загружаемыми, с яр- кими картинками и доставляли не- мало приятных часов любителям компьютерных игр. Почему же они стали такими? Ответ прост, - они были некор- ректно взломаны. Поэтому мной и было принято решение попробо- вать написать статью на никогда ранее не освещаемую тему восста- новления (по-английски - RESTO- RE) таких программ к их надлежа- щему виду. 2.Фирменные программы. Перед тем, как заняться вос- становлением неработающих или испорченных программ, неплохо познакомиться с системой выпус- ка на рынок готовых программных продуктов, их структурой и уяс- нить для себя, для чего же ко- му-то понадобилось эти програм- мы взламывать. Итак, фирменные программы. Каждый пользователь ZX SPECTRUM, например, в Анлии, для того, чтобы поиграться в новую игруш- ку, должен был сначала сходить в магазин и приобрести себе кассе- ту с ней. Это были кассеты, пол- ностью похожие на обычные аудио- кассеты с музыкой, за исключе- нием того, что на них были дру- гие наклейки и значительно мень- ше ленты - ровно столько, сколь- ко надо на одну игру. Если это была подгружаемая игра, то на стороне "А" кассеты были записа- ны основные блоки программы,а на стороне "В" - игровые подгрузки. Вы уже и сами заметили это по сообщениям типа "REWIND TAPE ON SIDE TWO" или "START TAPE ON SIDE B - SEARCHING FOR LEVEL 1", которые появляются на экране пе- ред загрузкой уровней. Представ- ляете, как это было удобно - после того, как ваш герой поги- бает, перематываете ленту внача- ло и грузите снова первый уро- вень. Отпадает всякая необходи- мость отмечать показания счетчи- ка или искать начало блока "на слух". Каждая кассета укомплек- товывалась описанием игры и об- лачалась в яркую упаковку с изображением персонажей игры, соответствующе выглядели и дис- ковые версии. Разумеется, такая кассета стояла, по нашим меркам, нема- ло. И это понятно, ведь фирма, выпустившая игру, должна за свой труд получать прибыль от прода- жи своей продукции. Чтобы зат- руднить нелегальное распостране- ние своих программ, фирмы были вынуждены принимать различные меры. Главной проблемой было за- щитить программу от перезапи- си (копирования) с последующей продажей пиратских копий. Неко- торые фирмы даже объявляли воз- награждение каждому, кто сооб- щит информацию, которая может оказаться полезной при поиске каналов несанкционированного распостранения программ. Такое сообщение вы сможете прочитать после загрузки игр SIGMA SEVEN и SABOTEUR 2 фирмы DARELL. А теперь о структуре самой фирменной программы. Любая прог- рамма, как вам известно, начи- нается с загрузчика, написан- ного на BASIC. Загрузчики самых первых игр, выпущенных в 1982-м году, не защищались совсем. Они просто загружали что-то типа картинки (графических редакто- ров тогда еще не было!) прямо в экран, затем загружали открытый блок кодов и запускали програм- му с необходимого адреса. В пос- ледующие два года уже начали приниматься попытки защитить программу от копирования через моментально появившиеся пират- ские программы-копировщики мето- дами избыточной длины файла (на ленту специальной процедурой выгружалась вся память от 16384 до 65535) и методами внедрения в имена файлов непечатаемых симво- лов. Вам также приходилось та- кое видеть, когда имя первого файла после сообщения Program: печатается другим цветом или же печатается в другом месте экра- на. В 1984-м году начали также применяться первые методы защи- тить программы на бейсике от просмотра, а кодовые блоки нача- ли кодироваться, чтобы другие программисты не могли подсмот- реть, как авторы программы реа- лизовали тот или другой интерес- ный алгоритм. После появления в 1986-м компрессирующих копиров- щиков, которые сжимали програм- му при ее загрузке и распаковы- вали при выгрузке прямо на ходу и таким образом позволяли копи- ровать длинные файлы, начали применятся методы защиты от ко- пирования путем изминения вре- менных констант и приминением нестандартных процедур загрузки. Одновременно с этим появились знаменитые многоступенчатые за- щиты типа SPEEDLOCK PROTECTION и ALCATRAZ LOADER. Были также и попытки защитить программы от копирования с магнитофона на магнитофон без копировщика мето- дом замера шума чистой ленты в паузах между блоками. В после- дующие годы защита осуществля- лась совершенствованием всех вы- шеперечисленных методов. Причем, с изобретением новых методов за- щиты придумывались и новые спо- собы визуального представления загрузки программы. Сначала это были изменения в цвете и ширине полос на бордере, затем в их полном исчезновении и индикации загрузки с помощью счетчиков и мигающих квадратиков, а затем и в загрузке картинок и кодовых файлов фрагментами в любое мес- то памяти или музыкальным сопро- вождением во время загрузки. Это в какой-то мере развлекало пользователя в процессе ожида- ния и создавало дополнительные эффекты мерам защиты, придавало солидности им и самой игре. Наглядным примером того, как выглядела фирменная програм- ма, может служить игра DEVIANTS (кассетная версия, конечно). Эта программа как-то умудрилась пройти к нам в том виде, в кото- ром ее выпустила фирма PLAYER PREMIER. Во-первых, первый файл после загрузчика явлется однов- ременно заставкой, которая выво- диться на экран не сразу цели- ком в виде графики, а формирует- ся подпрограммами в машинных ко- дах, во-вторых, в этом же файле находится загрузчик для ос- тальных двух блоков и, в-третьих, этот файл имеет нес- тандартный заголовок, создающий впечатления, что файл без загла- вия загружается бейсиком. Сле- дующий файл загружается нестан- дартной процедурой загрузки с измененным цветом полос на бор- дере, постоянным скроллингом в центре экрана и, что самое ори- гинальное, уже во время загруз- ки вы начинаете играть, - прог- рамма проверяет вашу реакцию и корректирует под это саму игру: на экране появляются цифры от 1 до 4, а вам нужно успевать на- жать такие же клавиши. После этого загружается последний файл игры, причем загружается в эк- ран, но это совершенно незамет- но, к тому же на экране появ- ляется мигающее сообщение. Но и это еще не все. Программа прове- ряет обьем памяти компьютера, и если окажется, что у вас ее 128К, то дополнительно еще дог- ружается блок музыкального соп- ровождения для муз. процессора AY8910. Вот так примерно и выглядели настоящие игры. Так почему же мы всего этого не наблюдаем, откуда же взялись эти уродливые версии программ,которыми нам приходить- ся пользоваться? Ответ прост. Фирменные версии игр покупались в специализированных отделах ма- газинов и затем перевозились за границу, в страны,где такая про- дажа не производилась, например, в Польшу. Местные "умельцы", стремясь заработать на распост- ранении игр и не имеющие ни воз- можности их копировать (ведь иг- ры очень хорошо защищались от копирования!), ни достаточных навыков в программировании,чтобы эту защиту корректно снять, просто прибегали к мультифейсно- му (то есть системному, а не программному) взлому этих прог- рамм. Затем мутным ручейком эти "шедевры" хакерской деятельнос- ти тысячами метров магнитной ленты расползлись по всему так сказать "нецивилизированому" ми- ру, в том числе попали и к нам. 3. Характеристика мультифейсного взлома. Для того,чтобы снова с некор- ректно взломанной программы или просто обрывков файлов снова восстановить нечто, максимально приближенное к фирменной,красиво и без сбоев работающей игре,сна- чала необходимо разобраться с тем, как же программа взламыва- лась с помощью мультифейсов и как она после такого взлома выглядит на ленте или диске. Итак, что такое мультифейс. Это специальное дополнительное устройство в виде катриджа, ко- торое подключаеться к системному разъему компьютера. Такие уст- ройства выпускались и использо- вались программистами в основном для наладки и отслеживания рабо- ты собственноручно написаных программ, являясь,таким образом, незаменимым инструментом при создании игр. Они позволяли на- жатием на кнопку в любой момент останавливать выполнение любой программы, находящейся в памяти компьютера, внесения в нее изме- нений, а, при необходимости, и выгрузке всей оперативной памяти на магнитный носитель. Затем можно было снова запустить прог- рамму на выполнение с того мес- та, в котором она была прервана. Работа такой системы хорошо зна- кома сейчас всем, у кого к ком- пьютеру подключен контроллер дисковода, имеющий специальную кнопку MAGIC для выгрузки всей оперативной памяти компьютера с адреса 16384 по 65535 на диск. Затем этот файл можно снова за- пустить командой GO TO и он за- грузится в память на то же самое место, где он находился до вы- грузки, после чего в регистры процессора занесуться данные,на- ходившиеся в них до выгрузки, и, таким образом, программа запус- титься с того места, в котором она была остановлена нажатием на кнопку MAGIC.Как вы в таких слу- чаях видели, экранная область на время загрузки этого файла выг- лядит очень странно и подозри- тельно, - на ней появляются, ис- чезают и передвигаются разного рода линии и точечки. Конечно, ведь для загрузки MAGIC-файла требуется место в оперативной памяти компьютера под машинный стек и под значения,которые поз- же будут восстанавливаться в ре- гистрах процессора.Поскольку вся полезная память в это время за- нята загружаемым файлом, эта ра- бота происходит в экранной об- ласти. Примерно так же выглядит и работа мультифейсов, за исключе- нием того, что выгрузка произво- диться в "нарезанном" виде, то есть не одним файлом длиной 49152 байта,а несколькими. Обыч- но выгружался один длинный файл, хранящий в себе информацию,нахо- дившуюся выше адреса, указанного в операторе CLEAR и один-два ко- ротких файла с экранной областью и с информащией, находящейся в области буфера принтера, систем- ных переменных и бейсик-програм- мы. В файл с экранной областью заносились также машинный стек и,часто, значения всех регистров вместе с подпрограммой их извле- чения оттуда перед запуском. При загрузке этой программы сначала в память программой на бейсике загружается самый длинный блок, затем в экранную область - то, что было в ней перед нажатием на кнопку мультифейса, затем, по- верх этого, - последний коро- тенький блок, который впослед- ствии программой в машинных ко- дах переносится на свое место, поскольку из бейсика загрузить его сразу туда невозможно. Те- перь вам, конечно же, стало по- нятно, почему некорректно взло- манные программы так некрасиво, с использованием экранной облас- ти, загружаются и не всегда пол- ноценно работают. Мне же оста- лось обзорно познакомить вас с типами встречающихся мультифей- сных взломов и их структурой, а затем приступим непосредственно к их восстановлению. 4. Типы мультифейсных взломов. Самые первые программы, взло- манные с помощью мультифейса и дошедшие до нас, это FLYING SHARK, HEARTLAND, AVENGER, DAN DARE, AIRWOLF 2, CHAIN REACTION, NETHER EARTH и многие другие, а также кассетная версия THE ARTIST 2. Давайте посмотрим на них поближе. Сначала загружает- ся бейсик-загрузчик, в котором скрыта машиннокодовая процедура, грузящая без заглавия еще 5 фай- лов, а именно: заставку длиной 6912 байт (прямо в экран), затем два блока 20000 и 20536 байт под адреса с 25000 и выше до конца памяти, затем экран очищается и в него грузиться игровое меню в виде картинки длиной 6916 байт, в которой кроме этого находятся машинный стек и значения регис- тров процессора, после чего под адрес 23296 загружается послед- ний кусок длиной 1705 байт, программа восстанавливает значе- ния регистров, игра запускается. Как правило, после восстановле- ния такой программы она на лен- те или диске занимает вдвое меньше места, поскольку этот мультифейсный взлом имеет, во-первых, некомпрессированные файлы, и, во-вторых, игровое ме- ню храниться дважды, - в виде картинки длиной 6916 байт и в виде программы, находящейся в длинных блоках. Кроме того, что это самый старый способ взлома, он еще и самый качественный, сбоев в работе пока еще замече- но не было, заставка к игре аб- солютно не портиться, хотя встречаются и программы, в кото- рых файл с ней отсутствует - вместо него грузится сразу игро- вое меню (игры AIRWOLF 2 и NETHER EARTH). В 1986 году появился самый известный вам мультифейсный взлом, после того, как загруз- чик запустится, на экране появ- ляется надпись "M1 LOADING",поз- же появилась и его модификация "М128", ей взламывались 48К-игры на 128К-машине. Вот некоторые из самых распостраненных программ, прошедшие через этот взлом: GREEN BERET (версия ROBY'86), ALIEN-HIGHWAY, FASTER THAN LIGHT (LIGHTFORCE), THANATOS, TURBO- BOAT, HOLLYWOOD POKER, PACMANIA, TITANIC 1 & 2, ELITE. Программы, взломанные этими методами, имеют следующую струк- туру. Сначала бейсик-загрузчик, который грузит длинный откопрес- сированый файл под адрес 24792 (M1 LOADING) или 25048 (М128). Затем в экранную область под ад- рес 16384 загружается откомпрес- сированое игровое меню. Из бей- сика подается команда RANDOMIZE USR 24830 (M1 LOADING) или 25086 (М128),запускается декомпрессор, в памяти "разворачивается" длин- ный блок, а на экране появляется игровое меню. Затем поверх этого меню (какой ужас!) загружается последний отрезок длиной 1968 байт, дальнейшие действия - пе- реброс этих байт в 23296 и не- корректный запуск. Главный не- достаток этого взлома - грязный экран, иногда даже во время иг- ры (вспомните TITANIC), встре- чаются и сбои в работе, полнос- тью отсутствуют заставки. Некоторые программы 1989-го года выпуска, а именно A.M.C. 2, CORSARIOS 1 & 2, COMMANDO 4,MAM- BO, FREDDY HARDEST 3, ULISES и другие имеют характерные загруз- чики типа CARGADOR (по-испански- "загрузчик"). Это типичные пред- ставители испанского мультифейс- ного взлома, в память последова- тельно грузятся: экранная об- ласть с системными переменными (9216 байт под 16384), длинный блок (38388 байт под 25600) и коротенький блок (1536 под 64000). Этим взломом объясняют- ся сбои в графике и кодах в иг- рах CORSARIOS 2 и MAMBO. Было несколько разработок и по адаптации под ленту обычного дискового MAGIC-файла. Так, наи- большего распостранения нашли ELVEN WARRIOR и PRINCE CLUMSY, загружающиеся двумя блоками по 24576 под адреса 16384 и 40960, а также компрессированые MAGIC- файлы, порезанные на куски (игры SATAN 1 и CURRO JIMENEZ). Это наиболее паскудные взломы,работа практически непредсказуемая,мно- го сбоев в графике,"мусор" в эк- ранной области, процесс восста- новления таких программ наиболее трудоемок. Несколько системных программ,адаптирующих MAGIC-фай- лы к загрузке с кассет были раз- работаны и в России в 1990-92 гг (MAGIC FILE COMPRESSOR и MAGIC COPY). Большое распостранение в на- шей стране получили также прог- раммы, чаще всего помеченные как IMPORTED BY RAJSOFT, имеющие та- кие стандартные данные: отком- прессированая под 50000 картин- ка, длинный блок, откомпрессиро- ваный под 24700, при запуске в верхнюю часть экрана перебрасы- вается из конца памяти блок ко- дов, который после декомпрессии длинного блока устанавливается на свое место (под адрес 23296), затем происходит обычный некор- ректный запуск. Встречаются как программы, загружающиеся одним кодовым блоком,например,SIRWOOD, KENDO WARRIOR, так и игры,загру- жающиеся кусками (сериал МОТ, например), причем нередко перед запуском игры путем декомпрессии одного из таких кусков на экран выводится то, что было на нем при нажатии на кнопку мультифей- са, иногда вместе с размещенной в верхней части экрана подпрог- раммой некорректного запуска и блоком кодов, который будет пе- реброшен в область буфера прин- тера, системных переменных и об- ласти бейсика. Реже встречаются и другие ти- пы взломов, например, игры VEN- TURAMA, CAESEFIRE и LIVINGSTONE2 (все 1991 г. выпуска) дошли до нас в виде бейсик-загрузчика,за- ставки (6912 байт), длинного от- компрессированного блока,который загружается под адрес 24500, ко- ротенького блока с машиннокодо- выми процедурами, которые перех- ватывают управление,и блока дли- ной 1204 байта, который, как вы уже смогли понять, загружается под адрес 23296. Можно также вспомнить и характерные взломы игр GUN SMOKE, MONSTER MUNCH, REBEL STAR 2. Стоит немножко разобраться и с самим некорректным запуском. Вот примерно такую процедуру вы обязательно найдете в каждой программе, взломаной ранее муль- тифейсом, - именно она и запус- кает взломанную игру точно с то- го момента, когда была нажата кнопка: DI LD SP,(16384) POP HL LD (16384),HL POP AF POP DE POP BC EXX POP IY POP IX POP HL POP DE POP BC POP AF PUSH AF CP 63 JR Z,L1 IM 2 L1 POP AF LD I,A JP PE,L2 POP AF RET L2 POP AF EI RET Как видите, сначала опреде- ляется, где находится стек. Чаще всего мультифейс заносит его значение в первые ячейки экран- ной области памяти,визуально это наблюдается как парочка точечек или маленьких линий в левом углу экрана на картинках.После этого, из стека начинают последователь- но черпаться данные для всех ре- гистров процессора,затем опреде- ляется по значению вектора пре- рываний (для IM 1 он обычно ра- вен 63) режим прерываний и, в последнюю очередь, были ли они разрешены. Ну и по команде RET подпрограмма вываливается в стек, а поскольку процессор за- бит уже всеми необходимыми дан- ными, то программа, взломанная несколько лет назад, продолжает свою работу с того места, где она была остановлена нажимающим на кнопку хакером. Вот и пред- ставьте себе, а что будет, если под стек самой игрой выделялось байт эдак с десять, а ниже нахо- дились полезные данные или ма- шинный код? Вот вам и сбои на экране во время игры в играх ACTION FIGHTER или G.I.HERO! Теперь, я надеюсь, вы поняли, как бегло отличить корректно взломанную или восстановленную программу от некорректно взло- манной,- если программа запуска- ется непосредственно с адреса запуска, не использует при за- грузке и запуске экранную об- ласть и нормально работает, - значит, такой программе никаких вмешательств не требуется, если же игра запускается вышеприве- денным образом,то такой програм- ме для ее полноценной работы и из эстетических целей явно по- требуется программное вмешатель- ство с целью придания ей вида, максимально приближенного к фир- менному оригиналу, чем мы с вами и займемся. 5.Восстановление программ методом поиска старого загрузчика. Это самый простой, надежный и эффективный метод восстановления программ. Принцип его очень прост. Ведь любая игра, прежде, чем запуститься, должна быть за- груженой в память компьютера.Ес- ли учесть тот факт,что все муль- тифейсы выгружают на магнитный носитель всю оперативную память компьютера, включая экранную об- ласть, и, что самое важное для нас, область бейсик-программы,то можно предположить, что старый загрузчик, которым эта игра ког- да-то (перед нажатием на кнопку мультифейсного устройства) за- гружалась, могла там, на своем месте, и остаться в этом файле. Отыскать это самое место очень просто. Нам хорошо известно, что обычно начало бейсик-программы находиться по адресу 23755 при работе с лентой и 23867 при ра- боте с диском. Значит,теперь это находиться в том коротеньком блоке, который загружается по- следним либо сразу под адрес 23296,либо же сначала загружает- ся в экранную область, а затем перебрасывается на свое родное место. А теперь наглядные приме- ры. Поройтесь в своей игротеке и отыщите в ней программу HOLLYWOOD POKER,она взламывалась мультифейсом типа "M1 LOADING". Для удобства (если вы работаете на 48К-машине) загрузим послед- ний блок длиной 1968 байт под адрес 33296 (на 10 Кб выше, чем 23296) и просмотрим его любым дизассемблером или монитором, начиная с адреса (теперь уже) 33755. Точно! В этом месте нахо- диться простейший бейсик-загруз- чик: 10 CLEAR 24999 20 LOAD "" CODE 30 LOAD "" CODE 40 RANDOMIZE USR 28070 Как видете, ранее программа состояла с двух блоков кодов, последовательно загружаемых в память и запускалась с адреса 28070. Правда, такие загрузчики на чистом бейсике находятся очень редко, чаще встречаются загрузчики на бейсике со встрое- ной процедурой в машинных кодах или бейсик-программы, формирую- щие машиннокодовые загрузчики где-нибудь в конце памяти. На- верное, я не ошибусь, если ска- жу, что у каждого из вас в кол- лекции есть игра TITANIC 1 и вы, конечно же, видели, сколько дря- ни на экране оказывается во вре- мя загрузки, и, что самое вред- ное для глаз, этот мусор портит красивую рамочку по периметру экрана на протяжении всей игры! Ничего страшного, сейчас мы вместе с вами восстановим эту программу и вернем ей надлежа- щий вид. Как вы уже заметили, програм- ма была взломана мультифейсным способом типа "М128" и имеет следующие файлы: длинный (адрес: 25048, длина: 31721), откомпрес- сированное игровое меню (адрес: 16384, длина: 4035), и короткий блок (адрес:16470, длина: 2352). Загружаем короткий блок под ад- рес 33296, затем понравившейся вам дизассемблер, например, MONS 3 в любое свободное место и запускаем его. Исследуем адреса от 33755 и выше.Так и есть,здесь расположен старый бейсикзагруз- чик, формирующий с помощью опе- раторов DATA и READ машиннокодо- вый загрузчик в адресах с 65000 по 65015. Посмотрим,что находит- ся там. Для этого нам нужно де- компрессировать длинный кодовый блок. Сбрасываем компьютер (имеется ввиду - нажимаем на кнопку RESET) и пишем небольшую программку на бейсике (для прос- тоты везде привожу примеры заг- рузки-выгрузки при работе с лен- той): 10 CLEAR 25047 20 LOAD "" CODE 30 LOAD "" CODE 16384 40 RANDOMIZE USR 25086 50 SAVE "titanic1" CODE 25648,39887 Что сделает эта программа? Она загрузит первых два блока некорректно взломанной програм- мы, декомпрессирует их (при этом на экране появится игровое ме- ню), после чего нажатием на лю- бую клавишу вы выгрузите деком- прессированый блок. Теперь,пред- видя ваши вопросы, разберемся с цифрами. Ну, по поводу адресов в операторах CLEAR,LOAD и RANDOMI- ZE USR понятно, их мы узнали из самого загрузчика "М128", а вот откуда я взял такие точные цифры в SAVE? Это тоже не трудно.Смот- рите: последний короткий блок длиной 2352 должен разместиться в конечном итоге по адресу 23296. 23296+2355=25648. Это ад- рес начала нового длинного де- компрессированого блока, по- сколько в обрезанных нами байтах с адреса 25048 по 25647 нахо- диться теперь уже не нужная нам процедура декомпрессии и восста- новления регистров. Как вычис- лить длину выгружаемого блока теперь тоже понятно: 65535-25648=39887. А теперь вы- грузим этот блок на ленту и про- смотрим, что же находиться в нем по адресу 65000 (ведь мы узнали, что именно здесь расположен ста- рый загрузчик игры). Переходим на этот адрес, видим: LD IX,25500 LD DE,38982 LD A,255 SCF CALL 1366 JP 52546 Теперь все ясно. Игра TITANIC до взлома являла собой один ко- довый файл длиной 38982, который загружался под адрес 25500 и за- пускался с адреса 52546. Попро- буем ее восстановить. Часть это- го файла от адреса 25648 и выше у нас уже есть сохраненным, не- обходимо только вырезать из по- следнего короткого блока недо- стающих 148 байт (те, которые должны находиться с адресов 25500 по 25647), объединить их, загрузив в память на свое место, и сохранить на диск готовый файл, точно такой же, каким он когда-то был до взлома. Теперь наступает самый волнующий мо- мент,- проверка работоспособнос- ти. Даем RANDOMIZE USR 52546. На экране появляется чистая, не ис- порченная, как раньше, рамочка, игровое меню и звучит мелодия. Выбираем управление и пробуем поиграть.Отлично! Никаких сбоев, прекрасная работа, загрузка все- го одним файлом (а не тремя, как раньше), а если еще его и отком- прессировать, то игра будет за- нимать на одну треть меньше мес- та на магнитном носителе.Ну что, понравилось? Не правда ли, такое чувство,как будто бы вы отремон- тировали безнадежно испорченый телевизор, который теперь отлич- но заработал. Естественно, сразу же возни- кает желание проделать ту же са- мую работу с второй частью игры (TITANIC 2). Да, все полностью совпадает, ее восстановление ни- чем не отличается от первой час- ти. Попробуем запустить... Ну что, не ждали? Еще бы, программа запрашивает код! Конечно,ведь вы ее полностью восстановили! А,как известно, обычно вторые части программ (PHANTIS 2, HYPSYS 2, NAVY MOVES 2 и т.п.) всегда за- прашивают перед началом код, ко- торый можно узнать, пройдя до конца первую часть. Ничего, при- выкайте,вы еще и не такое увиде- те. После восстановления некото- рые программы выдадут вам даже несколько картинок или скроллин- гов, которых вы раньше не виде- ли. Объясняется это очень прос- то. Ведь некорректно взломанная программа снова запускается точ- но с того же места, на котором хаккер-"специалист" нажал на кнопку мильтифейса. Естественно, перед этим он мог и код набрать, и пару картинок просмотреть или, может быть, даже пол игры прой- ти (например,так называемая "иг- ра" MIVISIS, представляющая со- бой второй уровень от DOMINATOR, отдельные уровни LAST NINJA 2),а после этого только сбросить игру на ленту и приподнести вам этот подарочек в виде мультифейсного взлома. Еще один пример. На днях мне попался мультифейсный взлом игры REBEL STAR 2. После загрузки программа зависала, не выдав ни- каких сообщений,и только когда я пробежался рукой по всей клавиа- туре, нажатие на какую-то клави- шу заставило ее заработать. Ког- да, спустя полчаса, я запустил эту игру в восстановленном виде, то она,после очистки экрана, вы- вела на экран надпись: "Введите уровень сложности 1...9". Други- ми словами, хакер,взломавший иг- ру, нажал на кнопку мультифейса тогда, когда эта надпись появи- лась на экране. Поэтому при за- пуске этот взлом начинал рабо- тать уже с места ожидания ввода уровня сложности (нажатия на клавиши от 1 до 9). Теперь вы можете заняться восстановлением и остальных, имеющихся в вашей коллекции, взломов методом поиска старого загрузчика. В игре TURBO-BOAT вы из такого загрузчика узнаете,что она грузилась одним файлом дли- ной 29440 под адрес 31488, и за- пускалась с адреса 32768. Для восстановления этой игры даже никакой склейки по частям не по- надобиться, - просто загрузить два первых блока, декомпрессиро- вать и выгрузить уже готовую программу. В игре GILBERT ESCAPE FROM DRILL, имеющей загрузчик типа CARGADOR, старый загрузчик в кодах находиться по адресу 26000. Во взломанном виде эта программа после запуска начинает проигрывать мелодию где-то с се- редины, а вот в восстановленом, конечно же, с начала. Вначале статьи я говорил о том, что фирменные программы имели очень сильную защиту. Где же она? Ведь приведенные выше примеры свидетельствуют о том, что эти программы загружались простейшими загрузчиками. Да, простейшими, но для кого? Не на- до забывать о том, что любую программу можно перевзламывать несколько раз и следы таких пе- ревзломов неоднократно приходи- лось видеть. Например, игра была выпущена в Англии, затем в Гол- ландии с нее корректно сняли за- щиту и написали простой загруз- чик в кодах. В Польше, в отличии от других стран,использующих для работы с дисководом операционную систему +D или же TR-DOS, нашла распостранение ихняя дисковая система OPUS. Поэтому пользова- тель,не знающий ассемблера, осо- бенно себя не утруждая, загрузил игру с ленты и "адаптировал" ее на диск кнопкой мультифейса. Не правда ли, знакомая ситуация? Ведь в нашей стране в 1989-91 гг по рукам ходили целые дискеты с такого рода "адаптированными" с помощью кнопки MAGIC играми XECUTOR, CHRONOS, ZYNAPS и мно- гими другими, имеющими не такие уж сильные защиты. Стоит ли удивлятся, если такие, с позво- ления сказать, "дисковые версии" кому-то снова захочется сбро- сить на кассету... Так и полу- чается, что игра, с первона- чально простым загрузчиком, при- ходит к нам абсолютно изкалечен- ной. Кстати, на месте, где должен располагаться во взломе старый бейсик-загрузчик, иногда можно обнаружить программу на бейсике или в кодах,которой программист, подготавливающий ее к выпуску, выгрузил кодовые блоки программы на ленту (чаще - на ленточный микродрайв). Такие находки, бе- зусловно, также способствуют ее восстановлению. 6.Восстановление программ методом поиска адреса запуска. Конечно, найти старый загрузчик во взломе и, пользуясь его данными, восста- новить игру достаточно просто. Но такое бывает достаточно редко, обычно только в самых старых играх. Более новые программы после загрузки занимают всю память от бу- фера принтера до последнего байта в 65535 и, разумеется, никакого старого загрузчи- ка вы в них не обнаружите. Как же посту- пить в таком случае? Если вы уже давно ковыряетесь по игровым программам то ли в поисках бесконечной жизни, то ли в поис- ках интересных алгоритмов, то, наверное, вы уже заметили, что во многом программы похожи друг на друга, я имею ввиду струк- туру программирования. Обычно в одном месте хранятся текстовые сообщения, в другом - графика, в третьем - подпрограм- мы, оканчивающиеся директивой RET, и, ко- нечно же, где-то все эти подпрограммы вы- зываются через CALL из, так сказать, ос- новной, связывающей программы.Раз такая программа есть, значит, где-то в ней есть и начало, - адрес, с которого начинается запуск игры после того, как вы перейдете на него из бейсик-загрузчика по команде RANDOMIZE USR. А если попытаться найти самому это место и запустить с него прог- рамму? Именно так чаще всего и приходится восстанавливать некорректно взломанные игры. Как же выглядит на языке ассемблера начало программы? Обычно запуск любой иг- ры начинается с запрета прерываний, уста- новки машинного стека, очистки экрана и установки цвета BORDER, затем идет вывод на экран игрового меню, формирование таб- лицы, установка IM 2, запуск мелодии и т.д. Вот наглядные примеры: DI LD SP,32768 SUB A OUT (#FE),A Так начинается программа TURBO-BOAT (как вы знаете, она запускается с адреса 32768). Примерно такое начало у большинства восстанавливаемых программ. Бывает также, что основная программа сра- зу начинается с вызова подпрограмм через многочисленные CALL, это сразу же броса- ется в глаза. Не надо боятся эксперимен- тировать, особенно если вы имеете возмож- ность быстро многократно перезагружаться с дисковода, - запишите все "подозри- тельные" адреса и попробуйте со всех их позапускать игру. Кроме того, что вы обя- зательно найдете адрес запуска, вы еще найдете и точки входа в различные подпрограммы, которые вас смогут заинте- ресовать с точки зрения реализации того или другого интересного алгоритма и вы потом сможете использовать это в собственных программах. Этот метод, бе- зусловно, неплохо подходит и для других целей, например, для взлома сильно защи- щенных программ. Зачем, собственно гово- ря, взламывают загрузчики? Только для то- го, чтобы узнать адреса загрузки и запус- ка игры! Так ведь теперь можно вообще ос- тавить загрузчик в покое и сразу загру- зить сам кодовый файл и найти в нем адрес его запуска! Вы скажете, адрес запуска найдем, а как быть с адресом загрузки? Поверьте, это тоже возможно. Вы видели кассетную версию игры RAINBOW ISLANDS, загрузчик которой отпугивает уже самой только своей длиной! Это вам не что-ни- будь, а почти полностью фирменный загруз- чик фирмы OCEAN, была снята только защита от копирования самого этого загрузчика. Так вот, когда у меня еще не было диско- вода, я, пропустив загрузчик, разобрался с адресами просмотром самого кодового файла буквально за полчаса. Ну а если вам надо найти адрес загрузки кодов, находя- щихся в MAGIC-файле на дисководе, то здесь вообще проблем нет, - просматривая его DISK DOCTOR'ом, STS'ом, можно сразу определить, где в нем полезная информа- ция, а где пустое место и соответственно потом сделать выгрузку. Помочь найти ад- рес запуска программы может и сам машин- ный стек. Ведь, прежде чем быть взломан- ной, программа успела запуститься и вы- полнить определенные операции, поковыряв- шись в стеке, можно попытаться опреде- лить, какие именно и найти это место в программе, после чего уже "плясать от не- го". Кстати, некоторые игры распространи- лись в полувосстановленном виде, напри- мер, THE SCEPTRE. Если посмотреть, как она запускается, то увидите, что в ре- гистры процессора заносятся данные, взя- тые хакером из стека, после чего он дела- ет JP на адрес, определенный таким же об- разом, то есть программа все равно запус- кается не с начала, а с того места, где была когда-то остановлена. И еще один очень интересный момент, касающийся ре- гистра R. Ведь он, как видите, нигде не восстанавливается! Так вот, некоторые иг- ры к нему достаточно чувствительны. Так, например, если перед JP на адрес запуска игры A.M.C. в регистр R занести большое значение, то постоянно в ящиках вам будет попадаться одно и то же, как следует из "закона подлости", самое ненужное оружие. Если же его обнулить, то все в порядке,- в каждом ящике разное. Ну а в играх фирмы OCEAN при большом значении в регистре R перед запуском вообще врагов то нет сов- сем, а то сразу они ходят толпами, анало- гично и амуниция, - то не попадается во- обще, а то вдруг сразу вся в одном месте. Другими словами, если хотите, чтобы восстановленная программа, в которой ход игры задается случайным образом, то есть в зависимости от значения регистра R (я думаю, вы сами догадаетесь, как об этом узнать,- несколько раз перезапустить иг- ру, поиграть и посмотреть, всегда ли одно и то же на том же месте, или каждый раз по-разному), работала нормально, то перед тем, как сделать JP на адрес старта, об- нулите регистр R или же попробуйте занес- ти в него разные значения. Некоторые ко- деры могут сказать, что ведь с момента старта и до того места, где в зависимости от R строится ход игры, сам регистр может пропрыгать не один десяток циклов... Ну что ж, попробуйте сами поэкспериментиро- вать и вы наверняка увидите немало инте- ресного. По-видимому, авторы игр учли все, кто его знает, может и ELITE никто не может пройти из-за того, что в ре- гистре R не то, что надо... 7.Восстановление программ с помощью перевзлома. Данный метод основан на известной на- родной поговорке "маслом кашу не испор- тишь". Выше уже был приведен пример того, как игры многократно перевзламывались, кочуя от одной системы к другой. Таким образом, если вы еще раз нажмете на MAGIC в том же самом месте, где когда-то нажи- малась кнопка мультифейса, хуже ей вы уже не сделаете, а вот себе работу значи- тельно облегчите. Нужно только не забы- вать, что эта кнопка портит несколько ячеек в системных переменных, поэтому, если там есть ценная информация, этот факт нужно будет учесть. Такой перевзлом иногда бывает просто незаменимым. Напри- мер, при восстановлении игр HYPER ACTIVE и SOLOMON'S KEY я попытался просмотреть дизассемблером кодовые блоки, а там, вместо привычных подпрограмм и текстовых сообщений - сплошная абракадабра. Просто при взломе этих программ мультифейсная кнопка была нажата в тот момент, когда игра уже была загружена, но фирменная многоступенчатая защита (так называемая "ксорка") еще не закончила процесс деко- дировки основного кодового блока. Чтобы не ломать голову над раскодировкой "вруч- ную" (а это может быть и невозможным в данном случае), пришлось загрузить некор- ректно взломанную программу, дать ей воз- можность полностью запуститься, а затем воспользоваться услугами кнопки MAGIC. И еще. Если для взлома 48К-программ ис- пользуют 128К-машины с дисководом, то по- чему бы не использовать эту технику и для восстановления программ! Ведь в нашем распоряжении есть прекрасный 128К-дизас- семблер STS, который обладает большими возможностями. С помощью этой программы вы можете загружать MAGIC-файлы целиком в память компьютера, просмотреть их и внес- ти любые измeнения, после чего сохранить на диске в любом нарезанном виде. Таким образом отпадает необходимость в многок- ратной загрузке-выгрузке и нарезке-склей- ке основного кодового блока игры. Но мож- но обойтись и 48К-машиной, если устано- вить в нее прошивку с так называемым "те- невым" монитором, об этом много говори- лось последнее время. Восстанавливая та- ким образом программы, вы рано или поздно натолкнетесь на игру, которая занимает всю память компьютера. Как выгрузить та- кой блок и как его потом загрузить? По- нятно, что пользуясь STS на 128К-машинах у вас проблем с этим не будет, ну а если кто-то будет мучиться с восстановлением программ в пределах 48К, то ему придется делать примерно так, как делали когда-то польские хакеры, загружая-выгружая по от- дельности длинный блок от CLEAR и выше и короткий длиной 1204-2048 байт. Вы, на- верное, видели, что многие из восстанов- ленных программ загружают в конце в зак- рашенную в черный цвет экранную область небольшие кодовые блоки длиной 1704 или, скажем, 1204 байта, а затем, с помощью процедурки в машинных кодах перебрасывают эти байты под адрес 23296. Можно и вам для начала попробовать так сделать. Я просил бы опытных хакеров и кодеров не прикалываться с моих подробных разъясне- ний таких элементарных, порой просто ла- мерных вещей, ведь основной своей целью я считаю приобщить многочисленных пользова- телей к кодерству путем "от простого к сложному", - сначала это простейший LDIR в восстановленной игрушке, а затем, может быть, человеку захочется попробовать и самому написать... В свою же очередь, я хотел бы напомнить им о том, что если вы взялись за восстановление игры, то уж, пожалуйста, уберите из этого взлома все лишнее: засоренный стек, обрывки данных, перенесенных на другое место с помощью LDDR, старые загрузчики в конце памяти, старые системные переменные и область бейсика, значения стека, а то и сам стек на картинке... Пусть уже восстановленная вами игра выглядит по-фирменному и изнут- ри, а то вдруг кто-нибудь захочет посмот- реть, как вы ее восстановили. И очень уж большая просьба не менять текстовые сооб- щения, есть любители завысить год выпус- ка, вместо имен авторов написать приветы, извратить фирменный CHEAT. 8.Другие восстановления. При восстановлении игр вы можете столкнуться и с другими проблемами. Так, просматривая листинг игры ELVEN WARRIOR, можно обнаружить старый загрузчик, из ко- торого следует, что игра загружалась тре- мя блоками: заставка, основной блок и му- зыка для сопроцессора. Ну, с заставкой и музыкой все ясно, - в этом случае их не восстановить, а вот саму игру можно поп- робовать. Казалось бы, все просто, - вы- тянуть из этого MAGIC-взлома блок длиной 32768 байт, начиная с адреса 24576, и за- пустить с адреса 33024. Увы, не совсем так. На экране много сбоев и игра не ра- ботает. Посмотрим, что находится по адре- су запуска. Да, здесь много "наворотов" с преобразованием в памяти компьютера сразу же после загрузки, - перед тем, как вы- вести на экран игровое меню, программа сама себя модифицирует в памяти, идет пе- реброс кодов с одного места в другое, за- несение данных в ячейки памяти и т.д., причем при этом затираются места програм- мы, где перед этим находилась полезная информация, уже переброшенная командами LDIR в другие участки памяти. Конечно, если теперь выгрузить файл вышеуказанной длины и затем снова запустить его с места старого старта, то она опять начнет вы- полнять все эти преобразования, перебра- сывая уже другую информацию в то же самое место. Такие игры можно восстановить либо разобравшись со всеми этими перебросами и установив всю информацию на то место, где она должна находиться перед стартом игры, либо же выгрузив всю использованную па- мять и убрав команды перебросов и преоб- разований, симулируя, что они уже прои- зошли. Кстати, вышеприведенный пример можно использовать и для новой, ориги- нальной защиты. Например, ваша программа загружается, запускается и сразу же унич- тожает часть самой себя, - ту часть, ко- торая только что уже отработала и больше не понадобится, теперь уже никто в вашей программе концов не найдет. И еще по по- воду ELVEN WARRIOR - меня сильно удручает тот факт, что эта и некоторые другие игры (SCEPTRE of BAGDAD, REBEL STAR 2 и т.д.) были переведены на русский язык ... в не- восстановленном(!) виде. Теперь немножко о восстановлении графики. После восста- новления игры CURRO JIMENEZ оказалось, что все игровые действия развиваются в средней части экрана, остальной экран был черный, сам собой напрашивался вопрос о том, что, вероятно, во время игры экран обрамляла красивая статическая графика в виде рамочки. Когда я тщательно изучил имеющееся в обрывках игры игровое меню и и загрузил его в экран без атрибутов (6144 вместо 6912 байт), на экране отчет- ливо вырисовалась черно-белая, тщательно прорисованная рамочка. Осталось только раскрасить ее и вывести на экран после выбора управления. Испорченную статичес- кую графику лечить достаточно просто. Нужно найти то место в программе, где она хранится (определить это можно, просмат- ривая все перебросы, адресованные в эк- ранную область), выгрузить, подправить в графическом редакторе и поставить на мес- то. По-другому обстоит дело со спрайтами, особенно работающими по маске, для их восстановления не обойтись без специ- ального программного обеспечения типа SCE или SPRITE TOOLS. О подгружаемых играх. Многие из них взламывались уже тогда, когда в память был загружен первый уро- вень. После восстановления такая програм- ма переходит сразу к игре, не требуя подгрузки, так как она уже там есть, о чем свидетельствуют внутренние системные переменные самой игры. Так у нас появи- лись RICK DANGEROUS 2, STRIDER и многие другие игры, у которых первый уровень представлен дважды: в самой игре и на ленте или диске сразу за игрой. Ес- тественно, если вы хотите восстановить все, как было, то можно попытаться убрать из памяти этот уровень и внести соот- ветствующие изменения в системные пере- менные программы. Нередки ошибки и в са- мих уровнях, например, в содержащейся в них графике. Больше всего же приходится еще заниматься восстановлением режимов 48/128К. Ведь многие игры выпускались универсальными, работающими с любым объе- мом памяти. Причем определение типа компьютера (48/128К) велось из загрузчи- ка, и если это была 128К-машина, то к иг- ре еще догружались дополнительные блоки с музыкой, графикой, шрифтами и т.п. в дру- гие страницы памяти. К тому же, в специ- ально отведенную ячейку памяти заносилось определенное значение. Во время работы программа обращалась к этой ячейке и со- ответственно строила свою работу. Конеч- но, если такая игра была взломана в режи- ме 128К, то она не может после взлома ра- ботать на 48К-машине и наоборот. Особенно это относится к играм фирмы CODEMASTERS. Так, например, получили широкое распространение такие игры как KAMIKAZE, PANIC DIZZY, NINJA MASACRE, COLUMBUS JUM- BO 1 & 2, SLIGHTLY MAGIC и другие, рабо- тающие только на 128К-компьютерах, хотя они выпускались универсальными. Так вот, практически все фирменные загрузчики CO- DEMASTERS имели проверку типа машины и заносили в отдельно выделенную ячейку па- мяти "отметку" об этом. Когда сама игра запускается, она обращается к этим ячей- кам, и если там занесено значение, соот- ветствующее 128К, то разрешается обраще- ние к другим страницам памяти и игра соп- ровождается дополнительной музыкой и гра- фикой; если же компьютер имеет только 48К, то все это игнорировалось и игра шла в обычном режиме. Таким образом, если у вас игра идет на 128К и отказывается ра- ботать в режиме 48К, то, в первую оче- редь, проверьте, к какой ячейке она обра- щается и что там находится. Если такое обращение есть, то вам останется только организовать из загрузчика проверку типа компьютера с занесением соответственного значения в нужную ячейку памяти и, соот- ветственно, загрузку или игнорирование дополнительных блоков. Процедура проверки может выглядеть примерно так: XOR A ;заносим в основную ;страницу LD (#C000),A;по адресу #С000 ноль LD A,#17 LD BC,#7FFD OUT (C),A ;пытаемся выбрать ;дополнительную ;страничку LD (#C000),A;заносим в ячейку ;#C000 число #17 LD A,#10 OUT (C),A ;выбираем основную ;страницу LD A,(#C000);читаем из #C000 CP #17 ;если здесь #17, у нас ;48 машина,а если 0,то ;это 128 машина JR NZ,LOOP XOR A ;обнуляем аккумулятор- ;это константа 48 Кб JR LOOP1 LOOP LD A,#FF ;а это константа для ;128 Кб LOOP1 LD (23627),A;заносим константу ;типа компьютера в ;системную переменную RET Теперь, когда данная подпрограмма от- работает, основная программа будет, как и предусматривалось ранее, находить в ячей- ке 23627 число, соответствующее типу ма- шины. Последнее время значительно добави- лось работы у тех, кто занимается восста- новлением именно этих режимов в играх, так как некоторые хакеры, явно не счита- ясь с интересами 48К-пользователей, пред- намеренно превращают универсальные, 48/128К-игры (The FLINTSTONES, LED STORM, YOGI BEAR GREAT ESCAPE и многие другие) в 128K ONLY. И еще хуже, когда из двух 48К-игр делают одну на 128K (PHANTOM F4, MORTADELLO & FILEMON 2 и т.д.), либо до- бавляют разной ерунды, дабы растянуть иг- ру на все 128К, как было сделано с SATAN. Очень убедительная просьба к этим товари- щам не портить больше игры! Восстанавливая игры, регулярно натыка- ешся на исходники, в которых очень трудно найти стартовый адрес, - программа плохо читаемая, разбросанная кусками по всей па- мяти, вперемешку с табличками, графикой, текстами и пр. Сейчас я опишу метод, с по- мощью которого можно практически всегда отыскать начало программы. Для этого нужно запустить 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, пишите на адрес редакции. __________________________________________ точную час- тоту генерации ZQ1, вращая движок C1 (контролируют либо на 14, либо на 8 ноге счетчика). Если нет частотомера, то ем- кость C1 ставят в районе 12-22 пикофарад (идеального кварца все равно нет). У меня получилось отстроить частоту с точностью -10 Гц. Но, естественно, такая точность особо не нужна. Все равно погрешность час- тоты ноты будет при округлении делителя до целого значения. Печатная плата генератора размером 20х30 мм установлена сверху платы звукового сопроцессора. После опробывания муз. редактора (конечно, с таблицей от So- undTracker'a) и попытке подыгрывания люби- мым композициям было замечено довольно точное соответствие реальным нотам. Ну ес- тественно! Теория пересеклась с практикой, т.е. как и должно быть. Наконец-то я смог нормально подыграть композиции "Two Win- ters Only" группы "My Dying Bride". Вооб- ще, кто занимается музыкой, такая нехитрая переделка позволит более продуктивно ис- пользовать свой Спектрум для несложных аранжировок. Помнится, как-то лет пять на- зад я с приятелем пытался с SoundTrackerom сделать аранжировку песни под гитару. В редакторе был написан простейший ритм-бокс и что-то типа звука флейты. Так вот, флей- та ну НИКАК не вписывалась в гитару. Я долго не мог понять почему. Понял намного позже, даже, точнее, мне кто-то подсказал. Как оказалось, все из-за несоответствия частоты. Теперь бы ту композицию прове- рить. ;-) Что же, может я не зря потратил время на устранение этого, мягко говоря, глюка? Ладно! Все это хорошо. А если не все имеют возможность залезть внутрь своего Спектрума с паяльником? Я вижу здесь два выхода из сложившейся ситуации. 1) Как уже правильно говорил JAM (я присо- единяюсь!) - писать новые муз. редакторы с нормальными таблицами делителей под 1.75 МГц. Хотя, по моему, проще пофиксить это дело в самом редакторе (например в ProT- racker'е). Лучше, чтобы была возможность подгрузки таблички с диска. Как сказал Rst7: "Драйвера - рулез!" ;-). 2) Покупка фирменного "Spectrum 2+" ;-) Это, конечно, шутка. Первый вариант более подходит. Ну а если не хотите корячить новый и старый софт (муз. демки, игрушки и т.д.) - собирайте вышеизложенную схему и наслаж- дайтесь "фирменным", не фальшивым звуком. Выражаю особую благодарность главному редактору "ZX-Power" за публикацию статьи. Главное, что идея не пропала. ;-) Да и те- ма вроде бы еще не иссякла. С интересом отвечу на все вопросы и возражения по ниже указанному адресу. С уважением, Бакум Владимир aka (R)soft 2:461/1024.6 (7/11/1999) __________________________________________