МОДЕРНИЗАЦИЯ ИГРЫ "ЧЕРНЫЙ ВОРОН-1" ПОД РАСШИРЕНИЕ 512К (#7FFD) (C) 1998 MAX ------------------------------------------ О сколько нам открытий чудных Готовит Славик Медноногов... почти по-Пушкину Итак, как и следовало ожидать, "Черный Ворон" оказался бестселлером на оте- чественном рынке программного обеспечения для платформы Спектрума. Хит сезона состо- ялся. Не буду кривить душой, если скажу, что это лучшее, что было до сих пор сдела- но на нашей платформе в жанре стратегий. Но в процессе игры начинаешь понемногу беситься из-за мелких недостатков, недоде- лок и глючков. Каждый, кто доходил до третьего уровня и будучи немедленно убитый неприятелем, был вынужден перезагружать всю программу, чтобы повторить или изме- нить тактику и стратегию ведения боя. При двух дисководах еще куда ни шло, но с од- ним просто вешалка... Вдоволь натрениро- вавшись менять диски, плюнул на копирайты и прочие условности, начал ковырять прог- рамму изнутри. Каково было мое удивление, когда я увидел полностью свободный доступ к алгоритмам. Проскочила мысль: неужели все так просто или автор решил, что три царапины на диске два вполне достаточно? Как я ошибался! Без труда найдя нужные места в программе, сделал коррекцию, затем запустил и... через 5-10 секунд все умер- ло... Шикарная защита, ничего не скажешь. Просто круто, и все тут. Но не для того я пишу все это, чтобы поведать вам, как там и что. Вовсе нет. Цель этой статейки - ознакомление с моей доработкой игры, дабы игоки не рвали на себе ничего ниоткуда, а имея дополни- тельную память по СТАНДАРТНОМУ порту #7FFD, могли спокойно наслаждаться прелес- тями ведения боевых действий в реальном времени. Короче, если у тебя нет ОЗУ свыше 128К по вышеуказанному порту, дальше мо- жешь не читать. КРИТИЧЕСКОЕ ОТСТУПЛЕНИЕ. Господа программисты! До каких пор вы будете писать программы с расчетом на 128К памяти? Двенадцать лет прошло с того момен та, как этот стандарт был изобретен и семь лет, как доведен до логического продолже- ния в виде 512К. А вам хоть кол на голове тиши, все нипочем. Достали эти отмазки в хелпах, типа сорри, братцы, памяти не хва- тает для того, для этого... Сейчас только ленивые, бедные и жадные не делают расшире ние ОЗУ. Так на кого равняемся, ребятки?.. Закончим со вступлением и перейдем к самому интересному, а именно к ассемблеру. Хочу сразу разочаровать любителей на халя- ву что-то поиметь: здесь нет технологий для снятий защиты. Данная доработка будет работать ТОЛЬКО на оригинальной версии и никакие пиратские глюкодромы здесь не ка- тят! Также не получится припахать инфиниты без детального и ПОЛНОГО изучения метода защиты. Так что покупайте исключительно оригинал! Такие таланты, как Медноногов, ОБЯЗАТЕЛЬНО должны оплачиваться. Итак, с разрешения автора делаем копию первого диска с трека 2 по трек 128 вклю- чительно. Можно не морочить голову и по- экспериментировать с оригиналом. Но для этого следует иметь устойчиво работающую систему и программу "Catalogue Master" (смотри ZX-Format #5). Этой программой сделай дубликат нулевой дорожки на 160 трек на тот случай, если процесс доработки тебя не устроит и ты захочешь все восста- новить. Затем ТОЛЬКО нулевой трек формати- руй по стандарту iS-DOS, после чего загру- зи "ALASM", или что там у тебя, и набирай нижеследующее: ;28.02.98 Сея штучка нужна для того, чтобы наш ше- девр записать на диск номер один. ORG #6000 LD HL,#6200 LD DE,#0000 LD ВС,#0106 CALL 15635 RET А теперь поехали! SM EQL #4000 ORG #6200 DI LD A,0 Здесь можно немного отсебятины позволить с началом игры, если установить системную #79D8 - номер level`а. Указываю ее по мно- гочисленным просьбам игрателей. Сработает она, если в стартовом меню выбрать "Новая игра" за неважно кого. Если невмоготу ста- ло воевать, короче, застрял где-то, тогда можешь "переступить" этот уровень (или просмотреть их все). JR LEVEL Как положено хаккерам, делаем подпись. DEFM "Cracked Ьу МАХ. " DEFM "Version for Spectrum 128" DEFM "/256/512 (port #7FFD)." LEVEL LD (#79D8+SM),A LD A,7 CALL PAGE Проверим наличие расширения по #7FFD. LD HL,#С000 LD DE,#5707 LD A,(HL) ЕХ AF,AF` LD (HL),Е LD A,D CALL PAGE LD (HL),D LD A,Е CALL PAGE LD A,(HL) СР Е ЕХ AF,AF` LD (HL),A ЕХ AF,AF` JR NZ,LNPROT Ты счастливый обладатель доп. страниц. В сервисном меню заменим слово "Закончить" на "Повторить". Другое не поместится. LD HL,MOD LD DE,#FD0B LD ВС,MOD1-MOD LDIR LD HL,MOD1 LD DE,#FD5Ч LD С,9 PLSH HL LDIR РОР HL LD DE,#FC5C LD С,6 LD A,С LDIR CALL PAGE Здесь подставляем процедурку переброса всей игры на дополнительные страницы. По- чему всей? Нет желания трахаться с разбор- ками что как и где меняется в процессе иг- ры, поэтому сохраним со всеми потрохами. LD HL,СОХРАН LD DE,#FABE LD ВС,MOD-СОХРАН LDIR LD A,#55 CALL PAGE LD HL,PAGE_55 LD DE,#С000 LD ВС,1000 LDIR А здесь замолчу, что делаю. Кто шибко умный, сам поймет. LNPROT XOR A CALL PAGE LD HL,LLE0CF LD DE,#E0CF LD ВС,END-BEG LDIR LD HL,POKED LD (#6Е9F+SM),HL LD A,#18 LD (#Е160),A LD A,#С9 LD (#D639),A LD HL,#0000 LD (#6D31+SM),HL LD L,#3Е LD (#7715+SM),HL LD A,#18 LD (#40D0+SM),A Перерасчет КС. Не скажу, как их считать надо, т.к. две недели их все выискивал. Да и не только в этом дело. Нет желания авто- ру свинью подсовывать - раз, нет желания давать возможность идиотам делать инфиниты - два, есть желание дождаться "Черный Во- рон-2" - три. Хватит аргументов? Так что привожу готовые контрольные коды. Ес- тественно, если чего изменишь без меня, то нифига работать не будет. LD HL,#FЧAF LD (HL),#AA LD HL,#7650+SM LD (HL),#81 LD HL,#400С+SM LD (HL),#5A LD HL,#4045+SM LD (HL),#41 LD HL,#4043+SM LD (HL),#06 LD HL,#4002+SM LD (HL),#D7 LD A,#04 CALL PAGE LD HL,#FFOO LD (HL),#96 LD A,#07 CALL PAGE LD HL,#FFFE LD (HL),#DD LD HL,#DB00 LD (HL),#С4 LD HL,#FE00 PLSH HL LD A,#06 PAGE LD ВС,#7FFD OR #18 OLT (С),A NOP RET Далее идут прибамбасы для туда-сюда пе- ребросок страниц и всякое такое. Цвет бор- дера меняется для контроля работы програм- мы. Все особенности листинга справедливы для ассемблера "ALASM". ; For page 6 СОХРАН DISP #FABE LD SP,#403Е LD HL,#A11С PLSH HL LD HL,#4331 PLSH HL LD HL,СОХР1 LD DE,#4100 LD ВС,255 PLSH DE LDIR LD A,4 OLT (#FE),A RET СОХР1 DISP #4100 LD A,#52 CALL #4337 CALL DRC0 CALL #432A CALL DR80 LD A,#50 CALL #4337 CALL DRC0 CALL #432D CALL DR80 LD A,#51 CALL #4337 CALL DRC0 LD A,3 CALL #4337 CALL DR80 LD A,#53 CALL #4337 CALL DRC0 CALL #4326 CALL DR80 LD A,#54 CALL #4337 CALL DRC0 CALL #4331 CALL DR80 LD A,#56 CALL #4337 CALL DRC0 CALL #4335 CALL DR80 LD A,#57 CALL #4337 CALL DRC0 LD A,#52 CALL #4337 CALL DR80 LD A,#55 CALL #4337 LD HL,#7651 LD DE,#DB00 LD ВС,2479 LDIR LD Н,#40 LD С,80 LDIR LD HL,#4100 LD DE,#4101 LD ВС,255 LD (HL),#40 LD A,Е OLT (#FE),A JP #4368 DR80 LD HL,#С000 LD DE,#8000 DR801 LD ВС,#4000 LDIR RET DRC0 LD HL,#8000 LD DE,#С000 JR DR801 ENT MOD DI LD HL,DRIVE PLSH HL LD A,#55 JP #4337 MOD1 DEFB #1В,#3Е,#32,#42,#3Е,#40 DEFB #38,#42,#4A Автор не избежал недочета многих програ- меров нашей "мышиной" эпохи. Имеется ввиду сетапное подключение/отключение кемпстон мышки. При загрузке отложенной игры и при включенной мышке очень часто получается, что экран "убегает". Происходит это из-за большой разницы между предидущими и теку- щими значениями портов моуса. Здесь этот глючек исправлен. Подробно о системных мы- ши смотри в иструкции по написанию драйве- ра в журнале ZX-Format. BEG LLE0CF DISP #E0CF DI LD HL,#70A0 LD (#77СЕ),HL LD A,(#79В2) OR A JR Z,LE0CF1 LD HL,#77D0 LD ВС,#FBDF IN A,(С) LD (HL),A INC HL LD В,#FF IN A,(С) LD (HL),A LE0CF1 ЕХ AF,AF` RET С CALL #бAбD CALL #40Е8 CALL #6С89 RET POKED PLSH HL LD HL,#7A6B ЕХ (SP),HL LD A,(#79D7) OR A LD A,(#79D8) JR Z,POKED1 СР #08 JR POKED2 POKED1 СР 13 POKED2 RET NZ LD (#7A6E),A RET ENT END А это сам драйвер переброса страниц, ко- торый я перебрасываю с доп. страницы на таблицу вектора прерываний, запускаю, а затем ликвидирую. Больше некуда приткнуть. PAGE_55 DISP #С000 DRIVE DI LD SP,#0000 LD В,#10 AY1 PLSH ВС LD A,В DEC A LD ВС,#FFFD OLT (С),A LD В,#BF СР 7 LD A,0 JR NZ,AY2 CPL AY2 OLT (С),A РОР ВС DJNZ AY1 LD HL,#79В1 LD ВС,#0404 AYЗ LD A,(HL) PLSH AF INC HL DJNZ AYЗ ЕХХ LD HL,#DB00 LD DE,#7651 LD ВС,2479 LDIR LD D,#40 LD С,80 LDIR ЕХХ LD В,С AYЧ DEC HL РОР AF LD (HL),A DJNZ AYЧ LD SP,#403Е LD HL,#A11С PLSH HL LD HL,DRIVE1 LD DE,#4100 LD ВС,255 PLSH DE LDIR LD A,4 OLT (#FE),A RET DRIVE1 DISP #4100 LD A,#50 CALL #4337 CALL DR_80 CALL #432A CALL DR_С0 LD A,#51 CALL #4337 CALL DR_80 CALL #432D CALL DR_С0 LD A,#53 CALL #4337 CALL DR_80 LD A,3 CALL #4337 CALL DR_С0 LD A,#54 CALL #4337 CALL DR_80 CALL #4326 CALL DR_С0 LD A,#56 CALL #4337 CALL DR_80 CALL #4331 CALL DR_С0 CALL #FA8С LD A,#57 CALL #4337 CALL DR_80 CALL #4335 CALL DR_С0 LD A,#52 CALL #4337 CALL DR_80 CALL #4331 LD HL,#4100 LD DE,#4101 LD ВС,255 LD (HL),#40 LD A,Е OLT (#FE),A XOR A LD (#79D8),A JP #4368 DR_80 LD HL,#С000 LD DE,#8000 DR_801 LD ВС,#4000 LDIR RET DR_С0 LD HL,#8000 LD DE,#С000 JR DR_801 ENT DEFS 100 ORG #6000 Подведем итоги дня: на 128`кило- байтных машинах все остается без измене- ний, а на расширении 256/512К в сервисном меню вместо "Закончить игру" появится "Повторить игру". После подтверждения действия все вернется в исходное положе- ние, т.е. на стартовое меню из четырех пунктов. Установки мышки и музыки при этом сохраняются. Можно заново начать, можно отложенное состояние перегрузить, без ре- сета вернуться в бейсик. А главное, нет надобности перезагрузки с диска один! Да, и еще. Обладатели фуфельных дисководов, иногородние и просто не внимательные могут заклеить второй диск воизбежание его порчи каким-нибудь неизвестным мне вирусом в программе или случайным глюком системы. После завершения работы над доработкой мне начали поступать сигналы, что при дисковых операциях игра виснет. Причина тривиальна: хотелось автору как лучше, а получилось как всегда. Автор дискового интерфейса (Медноногов?) решил сделать полутурболоа- дер, поэтому не делал позиционирование при каждом сбое в чтении сектора. Представьте, что из пяти секторов на треке как минимум три читается со второго/третьего раза. Что произойдет, если не делать вышесказанное? Правильно, мотор дисковода остановится, т.к. его раскручивает только команда пози- ционирования. Все хорошо, что хорошо кончается. За- канчивается и мой пасквиль на тему инород- ного вмешательства в геймуху. Осталось подключить полученую доработку. Вставляй копию диска один и запусти процедурку за- писи на диск из ассемблера командой RLN. Затем перейди в STS, если загружен, и ко- мандой SS+L считай системный сектор с ори- гинала диска один. Для неграмотных: в окне чтения сектора в STS укажите трек 0, сек- тор 8, длина 1, адрес #8000. Затем по ад- ресу #8006 набери нижеследующее: LD HL,#6200 LD DE,#0001 LD В,#01 CALL #60В3 JP #6200 Это и есть подзагрузка нашей доработ- ки. По адресу #82СС замени CALL #FE00 на JP #5D2В. А теперь вставь копию диска 1 и командой SS+S во все том-же STS сделай отгрузку модернизированного сектора. Пара- метры записи сектора аналогичны загрузоч- ным. Теперь можешь залепить все щели на дисках и запускать "Черного Ворона". Я прошел всю игру на такой доработке и поэтому даю стопроцентную гарантию рабо- тоспособности программы. Если же приклю- чится где-то облом, ищите проблемы и себя. Владельцы компьютеров с расширением не по порту #7FFD за подобными модификациями об- ращайтесь непосредственно к автору прог- раммы Славке Цветметкопыткину. Напоследок воизбежание недоразумений опишу оригиналы дисков с игрой. По крайней мере в Донецке продают именно такие и у меня есть все основания полагать, что это везде так. Итак, оба диска должны быть им- портного происхождения, иметь фирменные наклейки от Медноногова. Диск один на нак- лейке содержит имя автора, фирмы и клавиши запуска. Есть зеркальные изображения ката- пульты. Диск два имеет серийный номер (у меня 11742), изображение рогатого кунга с мечем и щитом, а также надпись "не заклеи- вай" со стрелкой, указывающей на прорезь защиты записи. Также на диске два должна быть физическая защита от копирования в виде трех царапин в районе 2/10 треков с верхней стороны. Если все перечисленное имеется, можете спать спокойно: автор ваши деньги получил и имеет стимул работать да- лее на наше с вами удовольствие.