FORUM
В 11-12 номере "ZX-РЕВЮ" (стр. 254) за прошлый год мы писали о существовании "циклических" защит программ от копирования и упоминали защиты класса ALKATRAZ LOADER.
В ответ на эту заметку пришло несколько писем. Победы, одержанные нашими читателями над этим загрузчиком с помощью аппаратных средств мы рассматривать не будем, считая этот путь не относящимся к теме, а вот частный случай, с которым разобрался Д.Коронцвит из Г. Жуковского, Моск. обл., мы рассмотрим.
Почему нас не интересуют аппаратные пути взлома и копирования программ? Дело в том, что с программистской точки зрения взлом ради взлома, копирование ради копирования не интересны. Нас интересуют программистские приемы, новые методы, короче интересует все то, на чем можно учиться и набирать опыт. И, если быть до конца честными, то надо признаться, что любые статьи, посвященные вскрытию программ и снятию защит в основном служат не тем, кто их снимает, а тем, кто их ставит и тем, кто учится программировать.
Итак, по порядку. Просматривая загрузчики, написанные Сергеем Скоробогатовым для дискофицированных им программ Winter Edition, Chase H.Q., Agent X и др., наш читатель столкнулся с листингом, который выглядел примерно так (см. листинг 1, комментарий к листингу - наш, "ИНФОРКОМ"):
Декодирование вручную, с помощью MONS3 показало, что то, что было АБРАКАДАБРОЙ, содержит блок, очень похожий на то, что Вы видите на листинге. Изменился только "ключ" и конечно изменился адрес, загружаемый в регистровую пару HL. Дальнейшее декодирование открыло еще один аналогичный блок и т.д. Длина и структура всех трех просмотренных блоков были одинаковыми.
Конечно, это лишь частный случай, но этот факт позволил написать программу, которая все последующее декодирование выполнила автоматически. Конечно, в более общих случаях она не сработает, но сам принцип будет полезен начинающим, а по мере необходимости они смогут адаптировать метод к конкретным условиям.
Пример декодирующей процедуры приведен в листинге 2.
ЛИСТИНГ 1
LD HL,nn - загрузили адрес, с которого начинается декодируемый блок.
LD ВС,пп - длина этого блока (организовали счетчик).
LOOP LD A,(HL) - приняли байт для декодирования.
XOR "ключ" - само декодирование.
LD (HL),A - заслали декодированное значение на место АБРАКАДАБРЫ.
INC HL - перешли к очередному байту.
DEC BC - уменьшили счетчик байтов на единицу.
LD A,B - подготовка к проверке счетчика на ноль.
OR C - проверка счетчика на ноль.
JR NZ,LOOP
AGAIN LD IX (аа)
LD L,(IX+1) LD H,(IX+2) LD C,(IX+4) LD D,(IX+5) LOOP LD A,(HL) XOR (IX+8) LD (HL),A INC HL
АБРАКАДАБРА
ЛИСТИНГ 2
аа - адрес ячейки, в которой организовано хранение адреса начала
"взламываемого" блока.
второй и третий байты исследуемого блока
содержат адрес декодируемого куска
пятый и шестой байты исследуемого блока
содержат длину декодируемого куска.
приняли байт для декодирования.
само декодирование.
заслали декодированное значение на место. перешли к очередному байту.
DEC BC - уменьшили счетчик байтов на единицу
LD A,B - подготовка к проверке счетчика на ноль.
OR C - проверка счетчика на ноль.
JR NZ,LOOP - если не все биты декодированы, переход к декодированию очередного байта.
LD ВС,0^ - длина декодирующего блоке - 16 байтов (010H).
ADD ^,ВС - "перепрыгнув" через рассмотренный блок, вводим в IX адрес начала следующего декодирующего блока.
LD (аа),^ - помещаем его адрес в ячейку с адресом аа.
LD A,0ЕЕH - 0EEH - это (238 в десятиричной системе) код операции XOR.
CP (IX+7) - сравниваем содержимое восьмого байта нового декодирующего блока с кодом 238, ожидая, что там будет стоять XOR.
JR Z,AGAIN - если это так, то возврат к началу и декодирование следующего блока.
RET - если нет, то возврат в вызывающую программу. Отсутствие XOR в данной
позиции может говорить либо о том, что все декодирование успешно завершено, либо о том, что защита сменила принцип кодирования и уже не использует XOR или использует не только XOR. Тогда надо остановиться и посмотреть, что же она использует и по-возможности внести изменения в свою декодирующую процедуру.
Адвентюрные игры.
Heavy on the Magic.
Свое исследование этой увлекательной игры, выпущенной фирмой GARGOYLE GAMES в 1986 году прислал наш читатель из Грозного Каракашев А.Г. С его полезными советами, посвященными игре Sceptre of Bagdad Вы знакомы по прошлому выпуску ZX-РЕВЮ.
Ему удалось пройти все игровое программное пространство до конца, он посетил все комнаты замка, но не может считать, что разобрался с программой полностью. Есть еще нерешенные проблемы, может быть кто-то знает подходы и к ним? Наш корреспондент пользовался некоторыми ходящими по рукам непроверенными описаниями и ряд вопросов связаны именно с ними.
Начнем с проблем, а потом перейдем к достижениям.
В описаниях говорится о 21 типе монстров. Обойдя весь замок, насчитать такого количества не удалось, даже если к монстрам отнести демонов, огонь, воду и персонажей, неперемещающихся в пространстве и не нападающих на главного героя.
В описаниях говорится о 280 предметах, которые можно исследовать. Если считать все, включая двери, столы, камни, сталактиты, никак более 250 не получается.
В описаниях говорится о том, что надписи на стенах встречаются довольно часто, удалось увидеть только одну - в комнате слева от начальной. Более того, нет нигде обещанной комнаты со множеством дверей, где висит особый знак, прочитав который можно погибнуть.
Вскрыв игру с помощью COPY-COPY, удалось обнаружить следующие имена демонов: ASTABOT, ASMODEE, BELEZBAR и MAGOT, но ни в каких книгах заклятий о них не упоминается.
Таким же путей взлома удалось найти слова: ADEPTUS MAJOR, ADEPTUS MINOR, MAGISTR TEMPLI, MAGUS. И невооруженным глазом видно, что эти слова обозначают магический ранг. Но нигде эти ранги не участвуют. Открыв все двери и обойдя все, что можно, герой повысил свой ранг от NEOPHYTE до PHILOSOPHUS через ZELATOR и PRACTICUS. Причем последняя дверь открывается только при ранге PHILOSOPHUS - не больше, не меньше.
Кто знает, где и как можно получить те ранги, которые были обнаружены при вскрытии программы? Отзовитесь! Может быть у кого-то есть фирменное описание игры?
Теперь несколько заметок для тех, кто еще не начал работать с этой увлекательной программой.
На самом первом экране Вы видите Аксила между двумя столами с книгами. Левая -отравлена, а вот правая - GRIMOIR ("Гримуар") содержит заклятья: BLAST, INVOKE, FREEZE.
C помощью заклятья BLAST можно уничтожать монстров, населяющих замок. Впрочем, для борьбы с самыми крепкими из них, придется прибегать еще и к помощи специальных предметов.
К дверям, около которых есть столы, надо подбирать ключи. Когда Аксил кладет на стол нужный ключ, дверь открывается.
К тем дверям, около которых есть знак в виде двух переплетенных колец, необходимо кроме ключа принести еще и мешочек с золотом (BAG OF GOLD) и положить его на стол. Мешочки с золотом взаимозаменяемы, т.е. любой такой мешочек (кроме отравленного) подойдет к любой такой двери.
Двери, возле которых есть охрана, открываются паролями.
Проход в следующие три двери повышает магический ранг:
ASK APEX - пароль "DOOR, SI LENCE" (комната ZELATOR).
SEEK FIRE BIRD TO ENTER DOOR - пароль "DOOR, LAZA" (комната PRACTICUS).
THE GREAT SIGN I IN FREE - пароль "DOOR, SORONOROS" (комната PHILOSOPHUS).
Прочие двери:
CRY AMD ENTER DOOR - пароль "DOOR, WOLF" - ведет на первый этаж.
ТО ENTER IS MADNESS - пароль "DOOR, LUNACY" - открывает дальнейшие глубины замка.
SAY NUMBER OF MAGIC WORDS -пароль "DOOR, ELEVEN" - назначение неясно. Пройдя эту дверь, Аксил исполняет какой-то победный танец и получает сообщение, внушающее уверенность в собственных силах: Well done! Axil the able you can made it for an exit.
Аналогична ей и дверь: EYE FOR AN EYE TO ENTER PARADISE - она открывается паролем "DOOR, LONG".
Интересна дверь PILE TOMB NOKEY. Для того, чтобы ее открыть, надо привлечь на помощь демона: INVOKE ASMODEE-, а затем дать ему команду "ASMODEE, DOOR", - и он разрушит дверь.
Теперь несколько слов о демонах. Каждому демону соответствует свой талисман. Поэтому, чтобы вызвать демона, надо выложить этот талисман в комнате. Если его вызвать без талисмана, он жестоко наказывает, отправляя героя в адские печи.
Для демона BELESBAR нужен талисман MANTIS. Функции этого демона пока неясны, единственное, что удалось установить - он дублирует команду EXEMINE.
Демон MAGOT предпочитает SUNFLOWER. Он знает, где в замке расположен какой-либо предмет.
Предмет демона ASTAROT - меч (SWORD). Кажется, это самый полезный из демонов. Он выполняет роль телепорта и перенесет Вас в названную Вами область замка. Правда, есть недостаток - за мечом приходится возвращаться пешком, поскольку второй раз его уже не вызвать.
ASMODEE - самый злобный демон. Его можно вызвать только в комнате, в которой лежит рубин (RUBY). Он реагирует только на команду DOOR и разрушает дверь, если Вы имеете ранг PHILOSOPHUS, в противном случае с ним лучше дела не иметь.
Вызывая демона, Вы должны помнить, что он появляется точно над талисманом, поэтому лучше встать от него чуть подальше.
Теперь ряд полезных советов.
1. С помощью CLASP можно пройти через огонь.
2. NOUGAT можно положить на место NUGGET.
3. С помощью NUGGET можно убить оборотня (WEREWOLF).
4. С помощью зеркала (MIRROR) можно победить Медузу (MEDUSA).
5. Вампира побеждают чесноком (GARLIC).
6. SLAT побеждает циклопа.
7. BALL можно положить на место PELLET.
8. С помощью PELLET можно победить SLUG.
9. Вместо яйца (EGG) положить скорлупу (SHELL).
10. Яйцо используется следующим образом. В районе NIDUS на первом уровне замка, где живут циклопы, нужно положить яйцо в огонь и вызвать птицу-феникс "NEST,PHOENIX". Феникс должен Вам сообщить пароль LAZA.
11. Гидру (HYDRA) можно пройти с помощью SNAKE.
12. Компоненты ULNA, HEAD, THIGH нужно сложить в котел и произнести заклятие "CAULDRON, ACHAD". В котле возникает новый монстр: AU, холодный и мертвый. Он подсказывает пароль LAZA, который уже сообщал Феникс. Может быть это сбой в программе, связанный с неудачным снятием ее защиты? Может быть. AU должен сказать что-то другое, например пароль LONG, который был извлечен из программы просмотром COPY-COPY и подбором.
13. Так же, просмотром кода был получен и пароль SORONOROS, хотя можно предположить, что его можно было бы вывести и из надписи на стене:
S |
A |
T |
O |
R |
A |
R |
E |
P |
O |
T |
E |
N |
E |
T |
O |
P |
E |
R |
A |
R |
O |
T |
A |
S |
14. Чтобы пройти через воду, служит заклятие "WATER, FALL".
15. Пройти через пропасть (CHASM) можно, имея FLASK.
16. В одной комнате двери не оказалось. Трое стражников сообщили, что южной двери не будет, пока не найдешь пароль с помощью ERLSTONE. Спросив об этом у MAROMa, получаешь ясный ответ, что искать его надо в районе PIT: Seek it in the pit. PIT находится в замке на четвертом этаже, но никакого ERLSTOME там нет. Демоны APEX и BELEZBAR на вопрос об этом просят показать им ERLSTONE.
Однако, с помощью хитрости, пройти за несуществующую дверь все же удалось. Просмотр в COPY-COPY дал слово LICHGATE, которое до этого нигде не использовалось. Сказав "ASTAROT, LICHGATE" в комнате с мечом, удалось попасть за эту дверь, так и не найдя ERLSTONE.
Таким образом, был пройден весь замок: 4 этажа, 8 X 8 комнат, но нет никакого выхода и нет естественного финала. Может быть, кто-то из читателей прошел игру до конца и сможет указать на ошибку в действиях, а может быть это сбой в программе, связанный с неудачным снятием защиты?
И еще: нигде не удалось использовать кость (RIB) и кости (BONES - три штуки).
В заключение наш читатель просит начать мозговой штурм игры "DUN DARACH", выпущенной той же фирмой GARGOYLE GAMES. "ИНФОРКОМ" присоединяется к этому пожеланию и обращает внимание на то, что есть еще две игры: TIR-NA-NOG и MARSPORT, не менее интересные и тоже пока никем не освещенные.
Полезные советы.
В прошлом году мы несколько раз писали об особенностях работы компьютеров "Дубна 48" (с. 115, 156). Мы просили тех читателей, которые найдут программные пути повышения совместимости этой популярной модели, поделиться своими достижениями со всеми любителями "Спектрума".
Суть проблемы, если Вы помните, состоит в том, что из-за нехватки быстродействующих микросхем памяти в этой модели был применен процессор с пониженной частотой, для чего были изменены некоторые константы в процедурах ПЗУ, управляющих загрузкой программ. В итоге программы, снабженные спецзагрузчиками, обходящими ПЗУ, могут не загружаться.
Своим видением этой небольшой проблемы и своими подходами сегодня делится наш читатель из поселка Провидения Магаданской обл. Михаил Владимирович Лапырев.
Во-первых, есть копировщики, работающие на "Дубне", которые позволяют Вам откопировать программу.
1. Lady COPY.
2. COPY FM3
3. COPY-COPY (Pirate 02)
Эти копировщики, правда, не компрессирующие, но свою задачу выполняют хорошо. И будет совсем прекрасно, если Вы достанете турбо-копировщики: 1 TURBO-COPY. 2TURBO-CAC.
Эти копировщики - компрессирующие и на "Дубне" они работают, хотя надо знать один нюанс. После загрузки копировщика и выхода в стартовое окно, не спешите нажимать LOAD. Включите магнитофон с программой, которую Вы хотите переписать и дождитесь пилоттона, идущего перед блоком программы, и только потом нажимайте клавишу. Не беспокойтесь, если между блоками копировщик будет принимать посторонний сигнал и выдавать сообщение об ошибке. После начала следующего пилотсигнала снова нажмите LOAD и так далее. Всю загрузку в копировщик выполняйте в режиме "Т".
А вот с выгрузкой придется немного помудрить. Если программа стандартная, то ее можно выгружать, как обычно, клавишей "А" (ABTO) в режиме "Т". Если же у программы свой загрузчик, то первый блок БЕЙСИК-загрузчика и загрузчик машинного кода надо выгружать в режиме "Т", а остальные блоки - в режиме "L". После такой переделки программа будет работать на компьютере "Дубна". Правда, возрастет примерно в 2 раза время загрузки и увеличится расход ленты. Надо также помнить, что переделанные таким образом программы уже не смогут работать на других машинах.
Таким приемом удалось адаптировать под "Дубну" многие из первоначально неработавших программ. Конечно, не все еще доведено до конца. Например, не поддается переделке программа SPOOKED, у которой нестандартный загрузчик выполняет как бы загрузку "с конца блока". Но это поле для новых экспериментов.
Советы и секреты.
CHRONOS - если в таблице результатов набрать YING IT BABY (причем обязательно заглавными буквами), то получите бесконечную энергию.
COBRA FORCE - если переназначить клавиши в игре на "SIMON", Вы получите бесконечную жизнь.
GEMINI WINGS - пароли: уровень 2 - EYEPLANT уровень 3 - WHATWALL уровень 4 - GOODNITE уровень 5 - SCULLDUG уровень 6 - WIGMOUTH уровень 7 - GREEPISH
PIPEMANIA - некоторые пароли: уровень 5 - DISK
уровень 9 - NAIL уровень 13 - ONCE уровень 17 - ROPE уровень 21 - PENS уровень 25 - SLIP уровень 29 - EACH уровень 33 - RISE
AFTERBURNER: POKE 37934,0: 37935,0: 37936,0 RET STORM - POKE 37337,201
Секретами поделился Фильков Андрей Павлович из Москвы.
Письмо читателя.
Здравствуйте, "ИНФОРКОМ". Я прочитал Ваш трехтомник по изучению и работе с машинным кодом. Пока я не ознакомился с вашим изданием, я без успеха натыкался на барьер машинного кода. Мне всего тринадцать лет, но даже мне было нетрудно вникнуть в особенности процессора Z-80.
Я являюсь подписчиком "ZX РЕВЮ" на 91-92 годы. До того, как я не прочитал вашего издания, рубрику "Машинные коды" я просто пролистывал, уделяя ей ноль внимания. Большое спасибо от всех людей, которые пользуются ПЭВМ "ZX-Spectrum". Коллекция игр у меня небольшая и я очень люблю умные игры, такие как SHERLOCK, KNYGHT TYME и THE HOBBIT. Я очень хотел бы обратиться к экспертам, чтобы они замолвили слово об игре DUN DARACH. Сам же имею по ней очень мало информации. P.S. Я прошу Вас напечатать в "ZX-РЕВЮ" немного информации.
Существует издание BEEP-SHOW, которое ежемесячно будет ко всем приходить, если Вы обратитесь по адресу: 416510, Астраханская об., г. Ахтубинск-6, Жуковского 24-63, UNICAL-STUDIO.
Этот журнал рассказывает о разных звуковых эффектах. Молчащая программа заговорит и запоет.
Король Юра, г. Свердловск.
* * *
Проблемы совместимости.
Нашим постоянным читателям знакомы работы Полубарьева С.В., направленные на повышение совместимости отечественных моделей Синклер-совместимых машин с их английским прародителем "ZX-Spectrum". "ИНФОРКОМ" традиционно рассматривает проблемы совместимости, как одни из самых основных и сегодня мы предлагаем Вашему вниманию две статьи, посвященные версиям "Ленинград-1" и "Пентагон-48".
Доработки портов ввода/вывода в Sinclair ZX-Spectrum модели "Ленинград-1"
(версия Зонова).
ZX-Spectrum-совместимый компьютер "Ленинград-1" (версия Зонова) создавался, по всей видимости, как максимально простой и дешевый вариант машины (или как самый доступный по элементам), о чем свидетельствуют многие примененные в нем схемотехнические решения (совмещенное поле ОЗУ 48 Кбайт и многие другие). Вероятно, именно по этой причине, логика адресации портов ввода/вывода в данной модели упрощена до такой степени, что это вызывает во многих игровых программах малоприятные эффекты мерцания бордюрной рамки экрана в такт с музыкой или звуком выстрела, а иногда и полную несовместимость, выражающуюся в "зависании" программ сразу после загрузки, или же в невозможности управления от KEMPSTON-джойстика. Однако, путем незначительных доработок схемы, эти недостатки можно полностью устранить.
Чтобы Вам полностью понять смысл вводимых изменений, здесь приводится краткая справка об устройстве аналогичных портов I/O фирменного ZX-Spectrum 48K, совместимости с которым мы добиваемся:
В фирменном компьютере для работы с периферийными устройствами используются следующие адреса:
254 (FE HEX)
- по вводу: клавиатура, ввод с магнитной ленты (далее МЛ);
- по выводу: цвет бордюрной рамки дисплея, звуковые эффекты, запись на МЛ.
251 (FB HEX)
- обслуживание фирменного узкопечатного устройства ZX-printer или аналогичных ему Timex-2040 Alphacom-32, Seicosha GP-50S.
31 (1F HEX)
- интерфейс джойстика типа Kempston.
При этом имеются следующие особенности:
1) При работе с портом 254 анализируется только сигнал на линии A0 адресной шины процессора. Поэтому с тем же самым успехом можно обращаться и к любому другому четному порту (252, 250, ... 0), поскольку при его выборке анализируется лишь разряд A0.
2) KEMPSTON-джойстик активируется в том случае, когда в адресе считываемого порта А5="0" и A0="1". При этом на шину данных передается байт, младшие 5 бит которого зависят от положения рукоятки и кнопки "FIRE" джойстика, а старшие 3 бита всегда равны "0". Таким образом, чтобы определить состояние джойстика типа KEMPSTON, программа может обратиться к любому порту с нечетным адресом в диапазоне 1...31.
3) Если ZX-Printer отсутствует в составе системы, то с порта 251 (#FB) должен считываться байт 255 (#FF). В противном случае компьютер будет неизбежно "зависать" при попытке выполнения операторов Бейсика LPRINT и LLIST, а также при загрузке некоторых игровых программ.
Теперь рассмотрим, как организована система ввода/вывода в версии "Ленинград-1":
1) По чтению порта 254 - совместимость с оригиналом полная, но запись в порт 254 выполняется при обращении к любому, а не только "четному" адресу порта (в этом причина мерцания бордюрной рамки). Причина - при выборке ИМС К555ТМ9, на которой выполнен порт вывода 254, адрес вообще не учитывается и не проверяется.
2) KEMPSTON-джойстик имеет сразу 2 дефекта: во-первых, считывается вообще по любому "нечетному" адресу, во-вторых, 3 старших бита установлены в "1" вместо "0".
3) Вытекает из предыдущего пункта: поскольку джойстик считывается по любым, в том числе и не "своим" адресам, то из порта 251 может иногда читаться не совсем то, что надо бы. В авторском варианте схемы это проходит незамеченным, поскольку "1" в старших битах означают отсутствие принтера в системе, но стоит только "занулить" их, и периодические "зависания" машины Вам надежно обеспечены.
Если Вы, прочитав вышеизложенное, узнали описание своих "бед", можете приступить к доработке. Остальным предлагаем убедиться в этом:
- выполните команду PRINT IN 31. На фирменной машине должен быть получен результат 0 (00000000 в двоичном коде). Вы, скорее всего, получите 224 или 255.
- теперь выполните PRINT IN 33 и PRINT IN 251. Если результат первой команды совпадает с предыдущим - нарушена адресация джойстика. Если то же относится и ко второй команде, да ПРИ этом еще и печатается не 255 - Вы уже наверное сталкивались, или скоро столкнетесь с проблемой загрузки игр, которые у Ваших приятелей работали нормально.
- выполните OUT 255,0 и OUT 255, 255. Если рамка экрана стала при этом менять цвет - и здесь нарушена адресация.
К счастью, разработчики платы этой машины предусмотрели в ее углу довольно большое макетное поле - "слепыш", на котором можно разместить все детали, необходимые для доработки.
Вам потребуются ИМС К555ЛЛ1 и К555ЛИ1 (по 1 шт. каждого типа) и некоторое количество тонкого изолированного провода (лучше всего марки МГТФ-0.07).
Дополнительные ИМС установите на свободное место на "слепыше" и подведите к ним питание (+5в) и "землю". Теперь приступим к собственно доработкам:
1) Замените нагрузочные резисторы джойстика на МЛТ-0.125,1кОм. Их общую точку отсоедините от "+5в" и подключите к "земле". С "землей" следует также соединить выводы 6, 10 и 13 мультиплексора D37 (D42) К555КП11. Общий провод джойстика при этом соединяется с "+5в". Это необходимо для использования джойстиков, изготовленных в стандарте "Atari", которые имеют нормально разомкнутые контакты ("Ленинград-1" спроектирован под самодельный джойстик с нормально замкнутыми контактами). Разумеется, что если Ваш джойстик уже подключен через инверторы, то резисторы менять не обязательно, а свободные входы мультиплексора заземлить все равно придется.
Примечание: автору известны 2 варианта чертежа принципиальной схемы, которые отличаются только нумерацией корпусов ИМС, поэтому приводится двойная нумерация. Вам следует определить, какая из них имеется у Вас. Для справки: упомянутый мультиплексор установлен на плате рядом с разъемом кабеля клавиатуры, ближе к краю платы.
2) Обеспечим стандартную адресацию порта вывода 254, выполненного на ИМС D39 (D40) К555ТМ9. Для этого произведем следующие изменения в схеме компьютера (рис. 1):
Рис. 1
Этим Вы блокируете запись в регистр К555ТМ9 при обращении по "нечетному" адресу, здесь и далее дополнительно введенные элементы имеют после номера значок " ' " чтобы отличать их от элементов базовой схемы компьютера.
3) Обеспечим нормальную адресацию интерфейса Kempston-джойстика. Для этого служит следующая доработка (рис. 2):
Рис. 2.
При этом обеспечивается "фирменная" выборка по следующему принципу:
- при A0="0" - клавиатура;
- при A0="1" и А5="0" - джойстик;
- при A0="1" и А5="1" - ничего не выбрано, при этом с шины данных считывается байт 255 (#FF).
Вышеприведенные доработки не обеспечивают 100% совместимости с фирменным ZX-Spectrum (следует отметить, что абсолютно совместимых моделей самодельных Спектрумов на сегодня не существует, - причины этого достаточно сложны и их обсуждение не является задачей данной заметки), но позволяет ликвидировать подавляющее большинство конфликтных ситуаций между аппаратной частью и программным обеспечением компьютера.
Еще несколько примечаний. Во-первых, помните, что "Ленинград- 1" - достаточно сложная машина, которую нетрудно вывести из строя неумелым вмешательством в схему и нелегко потом отремонтировать, поэтому не беритесь за доработку, если Вы не обладаете достаточным опытом работы с микропроцессорными системами, лучше обратитесь за помощью к более опытному человеку. Во-вторых, если Вас не волнуют проблемы с джойстиком, можете выполнить только пункт 2 (изменение выборки порта вывода 254). В-третьих, убедитесь перед началом доработки, что монтаж совпадает со схемой, и ранее до Вас никакого вмешательства в схему компьютера произведено не было.
Доработка "Pentagon-48K" для обеспечения совместимости с Sinclair "ZX-
Spectrum"
На Spectrum в версии "Pentagon-48K", собранной в соответствии со схемой, не работают некоторые программы, например, "ELITE", копировщики COPY-86M, OutCopy. Одна из вероятных причин этого, возможно, заключается в следующем.
Известно, что микропроцессор Z80A имеет 3 режима обработки прерываний: IM0, IM1 и IM2. С обработкой прерываний в первых двух режимах проблемы не возникает, поскольку и в том, и в другом случае производится переход по фиксированному адресу памяти, начиная с которого размещен обработчик прерывания. При обработке прерывания в режиме IM2 периферийное устройство, выдавшее сигнал INT, должно установить на шине данных младший байт адреса, по которому в памяти находится двухбайтный вектор адреса перехода на обработчик прерываний этого устройства. Этот байт считывается процессором. Старший адресный байт, используемый для формирования полного адреса обработчика прерываний, берется процессором из регистра I. Таким образом, в памяти может быть организована таблица векторов (точек входа в подпрограммы-драйверы внешних устройств), а сами драйверы располагаются произвольно, без привязки к жестко заданным аппаратной логикой адресам.
Хотя в компьютере ZX-Spectrum и не предусматривался режим IM2, он вполне может быть использован при соблюдении определенных ограничений. Это основывается на том, что в случае отсутствия на шине данных по заданному адресу устройства, которое эти данные выставляет, с нее считывается байт #FF (255), поскольку шина в фирменном компьютере "подтянута" резисторами 8.2 кОм к "плюсу" источника питания. Единственным стандартным источником прерываний в Spectrum является синхронизатор дисплея, выдающий 50 запросов на прерывание в секунду (в начале развертки каждого телевизионного кадра). Естественно, никаких данных на шину он при этом не выставляет, поэтому процессор примет #FF за младший байт адреса, по которому размещен вектор перехода на обработчик прерывания.
Таким образом, мы имеем возможность "перехватить" управление у стандартного драйвера прерывания, записанного в ПЗУ машины. Для этого необходимо выполнить следующее:
- разместить свой драйвер обработки прерывания в произвольно выбранном Вами месте памяти;
- вектор перехода, по которому производится передача управления драйверу, записать в ОЗУ, начиная с адреса #xxFF (т.е. старший байт адреса произволен, а младший всегда равен 255);
- записать старший байт (#xx) в регистр I процессора;
- выполнить команду IM2. Теперь при каждом прерывании будет запускаться не подпрограмма в ПЗУ, а Ваш собственный драйвер.
Такое решение может быть полезным, например, если Вы пишете программу, в которой необходима постоянная индикация текущего времени на экране (типа "электронных часов"), но параллельно с этим нужно выполнять и какие-то другие действия (скажем, редактировать текстовый документ), которые должны занимать основную часть процессорного времени. Возможно применение такого способа и при организации нестандартного драйвера клавиатуры и для других "фоновых" задач. Для любителей "покопаться" в коде фирменных программ не секрет, что немало игр могут использовать этот режим прерываний.
В "Pentagon-48K" шина данных не имеет нагрузочных резисторов, в результате чего при чтении байта с несуществующего устройства в некоторые моменты времени ее состояние может оказаться неопределенным. В режиме IM2 это может привести к "захвату" ложного адреса обработки прерывания, последствия чего очевидны. Не исключено, что в игре "ELITE" именно это и происходит.
Борьба с этим естественна - ввести в схему 8 резисторов, "подтягивающих" выводы D0...D8 процессора к шине "+5 вольт". Номинал этих резисторов для различных экземпляров машины может быть в пределах 3,3...10 кОм. Разумеется, не следует без достаточных оснований стараться установить резисторы "поменьше", поскольку это увеличивает коэффициент нагрузки и без того перегруженного процессора. Попробуйте сперва 7,5...10 кОм, и только если это не дает эффекта, уменьшайте сопротивление.
Для тех, кто имеет "Pentagon-48K" без собранного контроллера "Beta disk Interface", или с ним, но собранным по стандартной схеме (на плате установлены 4 ПЗУ К573РФ4, РФ6, 2764 или 2 ПЗУ 27128 и шинный формирователь КР580ВА86), переделки на этом заканчиваются.
Тем же, кто использует в качестве ПЗУ микросхемы 27256, заменив микросхему КР580ВА86 на перемычки, придется ее все же установить, иначе от перегрузки то и дело будет выходить из строя К561ЛН1, установленная в контроллере. Но, впаивая КР580ВА86, отсоедините ее вывод 9 (CS) от общего провода схемы и подайте на него сигнал IORQ от процессора Z80A. Это устранит конфликт на шине данных между 27256 и ВА86.
Вышеописанные доработки неоднократно проверены на практике и значительно улучшают совместимость "Pentagon-48K".
На необходимость доработки "Ленинграда" по дешифрации внешних портов указывают и другие авторы. Мы не будем здесь повторять все присланные рекомендации, но приведем несколько полезных советов от Иванова Н.Ю. из Якутии, касающихся других вопросов.
1. RGB-выход на "Ленинграде". (Рис. 3).
Рис. 3
Микросхема D11 (555ЛП5) желательно должна быть серии 555. Серии же 155 и 1533 работают не вполне хорошо, D40 тоже желательно серии 555.
2. Если на ножку 6 процессора подать 5V через резистор 1 кОм (обязательно по паспорту), то плата будет работать при пониженном напряжении от 4,5 до 5.5 вольт. Были даже случаи и от 3,8 до 4 В.
3. Сигнал INT можно настраивать по музыке из программ Savage или Saboteur. Эти программы очень чувствительны к длительности импульса, а недостаток этот присущ многим заводским машинам.
Проблемы "ELITE".
Мы уже писали о том, что есть возможность перехвата "Таргонов" в гиперпространстве. Многие пилоты пользуются этим для быстрого повышения игрового рейтинга. К сожалению, при этом могут возникать проблемы с нехваткой топлива на Вашем корабле.
Оригинальное решение проблемы нашли пилоты из Екатеринбурга Дремин A. (DEADLY), Кулик С. (DEADLY) и Киселев Д. A. (ELITE) из Казани. Вот их рекомендации:
Перед боем надо заправиться топливом у звезды и оттуда сделать гиперпереход. Следите, чтобы в этот момент надпись FUEL SCOOPS ON была на экране.
Эффект следующий. Во время боев в гиперпространстве все время будет гореть эта надпись, как будто дозаправка топливом не прекращалась. Вы сможете переходить от одной атаки к другой, не боясь "застрять" в космосе. Кстати, это мероприятия одновременно предохранит Вас от утечек горючего при повреждениях в бою (FUEL LEAK!).
Серьезному исследованию подвергли наши читатели поведение недокументированных космических объектов, впервые о которых сообщил нам Кислов Д.Н. из г. Челябинска ^Х-РЕВЮ-92, с.253). Напомним, что это крупные объекты неправильной геометрической формы, выпускающие в случае нападения на них несколько малых боевых аппаратов.
Семья потомственных художников Париловых из знаменитого города Палеха исследовала эти объекты вблизи и пришли к выводу, что они хоть и имеют не вполне регулярную форму, но зато этих форм три. Более того, они различаются даже в месторасположении боевого лазера (конечно это можно установить только побывав в ближнем бою с кораблем, почти вплотную).
Абсолютное большинство писем, которые пришли от пилотов, содержат мнение о том, что это астероид с "отшельниками". Наиболее глубокое исследование подготовил Шилин Д. П. из г. Симбирска. Он подтверждает данные Кислова и значительно их дополняет. Не претендуя на истину в последней инстанции, он систематизировал и обобщил данные и пришел к выводу, что "объект" обладает и свойствами астероида с поселившимися на нем "отшельниками" и свойствами "космической платформы", но факты, говорящие за первую версию, значительно более весомы. Д. П. Шилин высказал еще предположение, что авторы программы включили в нее корабль, обладающий и теми и другими свойствами для того, чтобы в условиях ограниченной памяти дать максимальный простор для фантазии играющих. Поскольку это не первый "фокус" фирмы, то в этой гипотезе что-то есть. Вспомните хотя бы о том, что три дополнительные миссии и связанное с ними оружие были недокументированны в официальной инструкции. Также были недокументированны и ряд управляющих клавиш. Совершенно ясно, что многое фирма "спрятала" для исследователей. Ход очень оригинальный, позволяющий поддерживать интерес к программе годами.
Наш корреспондент предлагает "хаккерам" включиться в исследование программы не только "снаружи", но и как бы "изнутри". Так, в качестве объекта первого удара им предлагается код программы где-то начиная с адреса 58500 и до конца ОЗУ. Здесь находятся текстовые сообщения, в которых, возможно, кто-то и найдет что-либо интересное.
Сообщения закодированы очень распространенным способом, который применяется во многих программах, особенно в адвентюрных.
Известно, что в английском языке многие слова состоят из типичных слогов, например таких, как OR, IR, ЕА и т.п. Это позволяет уменьшать размеры текстового блока от 1,5 до 5 раз. В ELITE закодированы даже целые слова, повторяющиеся много раз. К примеру, LASER, COMPUTER и другие. Каждому такому слову или слогу присваивается код. Например, присвоим слогу ER код 145, тогда в памяти к примеру вместо слова GLIDER можно будет разместить G, L, I, D, 145. Обычно кодируют 256 слов или слогов. Число 256 принято потому, что в этом случае код будет занимать 1 байт.
Просмотр таких закодированных сообщений может быть трудным. Это не гладкий текст, а обрывки каких-то фраз, череда разных букв. Поэтому этот способ не только сжимает текст, но еще и делает его нечитаемым. Д. П. Шилин исследовал текстовый блок "Элиты" и даже составил программу по его декодированию, но работу еще не закончил в связи с нехваткой времени. Если кто-то найдет там что-либо интересное, мы с удовольствием напечатаем. Сам же корреспондент приводит значения некоторых вскрытых им кодов:
128 - AL |
129 - LE |
131 - GL |
133 - СЕ |
134 - BI |
137 - ES |
138 - AR |
139 - НА |
140 - IN |
141 - DI |
142 - RE |
145 - AT |
144 - ER |
146 - EB |
148 - RA |
149 - LA |
150 - VE |
151 - TI |
152 - ED 153 - OR
154 - QU 155 - AH
156 - ТЕ 158 - RI
159 - ON 165 - SYSTEM
174 - UNIT 187 - LASER
203 - ST 206 - CARGO
215 - COMPUTER 227 - LARGE
Следует также добавить, что обычно в программах такие коды начинаются с какого-то определенного числа, ведь надо же оставить еще место для таблицы символов. В стандартном знакогенераторе символы расположены, начиная с 32 по 127.
Очень часто в программах для увеличения скрытности текста этот отрезок смещается в какую-либо сторону, то есть коды символов специально делают несовпадающими со стандартными, однако, к счастью, создатели "Элиты" этого не сделали.
Примечание "ИНФОРКОМа":
За примерами того, как кодируется текст в игровых программах далеко ходить не надо. Этот прием чрезвычайно широко распространен. Но ведь кодируют не только текст, но и графику. Мы как раз подготовили статью о том, как это делают на примере программы JET SET WILLY. В одном из ближайших выпусков напечатаем и Вы сможете очень элегантно хранить графику своих программ с малым расходом памяти.
47-ая галактика: тупик или дорога к новый мирам?
Мы неоднократно упоминали о появлении 47-ой галактики в версии Родионова. Большинство наших читателей полагают, что это дефект программы, вызванный неаккуратным снятием защиты. На это указывают и неадекватные суммы кредов на счетах и сумасшедшее вооружение. Но если внешний дефект смог вызвать появление 47-ой галактики, то возникает вопрос: "А нельзя ли нормальным путем проникнуть в новые миры?". По крайней мере в двух письмах начато исследование этого вопроса. Но начнем все по порядку.
Несколько месяцев назад мы предложили читателям начать атаку на тот отгрузочный блок, который сохраняется на ленте при сохранении состояния программы. Многие уже в этом преуспели и мы об этом тоже писали. К чему же ведет это исследование дальше? Давайте посмотрим.
Сначала мы представим выводы, сделанные Балисом Линасом из Каунаса. 1...11 - имя пилота в символах ASCII. Байт, равный нулю информирует об окончании имени. 12 - правовой статус. 0 - clean 1...49 - offender; 50...255 - fugitive.
Как видите, правовой статус - величина не дискретная, т. е. может постепенно ухудшаться или улучшаться.
13...15 - боевой рейтинг. Значения этой трехбайтной переменной таковы: 0,0,0...255,8,0 - HARMLESS 0,9,0...255,16,0 - М. HARMLESS 0,17,0..255,32,0 - POOR 0,33,0..255,64,0 - AVERAGE 0,65,0..255,128,0 - AB. AVERAGE 0,129,0.255,255,2 - COMPETENT 0,0,3...255,255,10 - DANGEROUS 0,0,11..255,255,25 - DEADLY 0,0,26..255,255,255-ELITE 16...17 - ?
18 - номер карты галактики (0 -первая, 1 - вторая и т. д.).
19 - CASH
1...255 - 1000 - 255000 Cr.
20 - CASH
1...255 - 256000 - 65280000Cr
21 - CASH
1...255 - 0,1 - 25,5 Cr
22 - CASH
1...255 - 25,6 - 6528 Cr
Сумма денег образуется суммированием всех этих четырех байтов. 24...40 - наличие груза в корабле (см. ZX-PEBЮ-92, c.254).
41 - грузоподъемность корабля. Если здесь содержится 0 и в байтах 24...40 тоже нули, то в корабле находятся беженцы (REFUGEES).
42 - FRONT LASER:
1 - pulse laser:
2 - beam laser;
3 - military laser;
4 - mining laser.
43 - REAR LASER
44 - LEFT LASER
45 - RIGHT LASER
46 - байт первой миссии. Если не 0, то дают миссию.
47 - FUEL
48 - количество ракет.
49 - LARGE CARGO BAY (В номере ZX-PEBЮ-92, с. 254 здесь и далее ошибка).
50 - Е. С. М. SYSTEM
51 - Дополнительный PULSE LASER
52 - Дополнительный BEAM LASER
53 - FUEL SCOOPS
54 - ESCAPE POD
55 - ENERGY BOMB
56 - ENERGY UNIT
57 - DOCKING COMPUTER
58 - GALACTIC HYPERDRIVE
59 - Дополнительный MILITARY LAS.
60 - Дополнительный MINING LASER
61...66 - данные по галактике, в которой Вы находитесь.
67 - ?
68 - Координата Y курсора на большой карте галактики.
0 - вверху; 255-внизу.
69 - ?
70 - Координата X курсора на большой карте галактики, 0 - слева; 255 - справа.
71 - 74 - ???
75 - 91 - содержат информацию о наличии товаров на станции.
92 - ?
93 - наличие дополнительного оружия на корабле:
64...127 - CLOAKING DEVICE; 128..191 - Е.С.М. SYS. JAMMER; 192..255 - и то и другое. 94...102 - ??
Теперь рассмотрим внимательно байты 61... 66, содержащие данные по галактике, в которой Вы находитесь.
|
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
61 |
74 |
148 |
41 |
82 |
164 |
73 |
146 |
37 |
62 |
90 |
180 |
105 |
210 |
165 |
75 |
150 |
45 |
63 |
73 |
144 |
33 |
66 |
132 |
9 |
18 |
36 |
64 |
2 |
4 |
8 |
15 |
32 |
64 |
128 |
1 |
65 |
83 |
166 |
77 |
154 |
53 |
106 |
212 |
169 |
66 |
183 |
111 |
222 |
189 |
123 |
246 |
237 |
219 |
Обратите внимание на то, что содержимое данных по каждой галактике можно получить логическим удвоением данных по предыдущей галактике. Мы говорим именно о логическом, а не об арифметическом удвоении именно потому, что если при удвоении образуется число, большее чем 255, то 255 от него отбрасывается, а в таблицу заносится остаток.
|
41 |
42 |
43 |
44 |
45 |
46 |
47 |
48 |
61 |
129 |
3 |
6 |
12 |
24 |
48 |
96 |
192 |
62 |
161 |
67 |
134 |
13 |
26 |
52 |
104 |
208 |
63 |
245 |
235 |
215 |
175 |
95 |
190 |
125 |
250 |
64 |
72 |
144 |
33 |
66 |
132 |
9 |
18 |
36 |
65 |
80 |
160 |
65 |
130 |
5 |
10 |
20 |
40 |
66 |
241 |
227 |
199 |
143 |
31 |
62 |
124 |
248 |
Таким образом, облетев все восемь галактик и полетев дальше, Вы попадаете в ... первую галактику.
И вот что по этому поводу пишет наш читатель из Каунаса:
"Если изменить значение хотя бы одного байта, мы попадем в новую систему из восьми галактик и названия планет не будут повторяться. Возможно, что в игре есть какие-то условия, позволяющие перелететь в другие системы, но я их пока не обнаружил. Сколько всего галактик в игре, я даже не берусь ответить. Прошу всех о помощи! Надо найти способ перелета в другие галактики! Я уверен, что он есть, и большая вероятность, что там скрывается планета RAXXLA. "
Мы не случайно приводим слова нашего читателя из Литвы дословно. У Вас есть прекрасная возможность сравнить его выводы с выводами, полученными в то же время, но на несколько тысяч километров восточнее.
Семейный экипаж из села Гайтер Хабаровского края в составе Троеглазова Павла Герасимовича и его сына Геры провел огромную многодневную работу. Облетев восемь галактик, не уклоняясь ни от одного боя и отгружаясь на каждой планете они тщательно исследовали 102-байтный блок и тоже раскрыли циклический характер изменения байтов с 61 по 66 при переходе от 1-ой до 8-ой галактик. Но они пошли дальше и исследовали галактику N47, в которую на некоторых версиях "Элиты" можно попасть "нелегальным" путем. Как оказалось, с ней тоже связана группа из восьми галактик, данные по которым представлены ниже:
И вот, что пишут они:
"А где галактики между 8-ой и 41-ой? Они есть! Мы обнаружили за короткое время еще 36 галактик и прогулялись по ним. Мы также подозреваем, что галактик может оказаться больше, чем 48... В глубинах этих неизвестных еще галактик можно, по-видимому, повстречать и корабли поколений и пресловутую планету RAXXLA. Ищите и обрящите"
Вот как разыскивались эти новые галактики. В первоначальном варианте (система LAVE) исследователи обнуляли один за другим каждый байт из шести (61...66) и каждый раз попадали в новую галактику. Пока еще неясно является ли каждая из вновь открытых галактик "опорной" для генерации целой серии из 8-ми галактик или эти галактики - часть одной системы. Не выяснены также все вопросы, связанные с "устойчивостью" новых систем. Дело в том, что после перехода из первой во вторую и т. д. и вновь после возврата в первую могут наблюдаться сбои в работе программы. Возможно, есть какие-то законы, ограничивающие бесконечно возможное количество галактических систем, зато какие открытия там возможны! Так, например, при 61-ом байте, равном нулю, в самом центре 5-ой галактики есть ЧЕТВЕРНАЯ ЗВЕЗДА:
TEAMA
Обнулив 62-ой байт и прогулявшись по полученной "восьмерке", наши корреспонденты с интересом увидели, что во второй галактике созвездия неожиданно похожи на земные: М. Медведица, Цефей, Дракон, Рыба, Лира. Третья галактика - необычно высоко социально развита, в шестой есть созвездие, похожее на Северную корону, а восьмая - кишит бандитами всех мастей.
Вот к таким интересным открытиям может привести кропотливое исследование. Теперь дело совсем за малым - надо найти способ и условия возможности перемещения между галактическими системами. Но этот малый шаг можно пройти только объединив усилия всех пилотов и растянуться он может надолго.
Авторы исследования полагают, что они затронули только "краешек" глобальной проблемы доведения игры до логического конца.
"Новые" галактики - это еще не все интересное из того, что удалось установить семейному экипажу. Интерпретация байтов в основном та же, что и представленная выше, но зато есть некоторые любопытные комментарии.
1. Байты 24 - 40 - товары.
Здесь есть особенность. Максимальные цифры (255) можно вносить только в 37-ой, 38-ой и 39-ый байты. Сумма же остальных байтов (товаров) не должна превышать 20 (35, если у Вас есть LARGE CARGO BAY). Все же, что выше этой нормы, будет при попытке продажи умножено на существующую в данном месте цену и списано с Вашего банковского счета. А вот, что будет, если Вы доведете свой счет таким способом до нуля и будете продавать дальше, - узнайте сами.
2. Байты 42... 44. Засылая сюда число, большее чем 4, Вы получаете лазеры с самыми невероятными названиями. 99% их работают, как технологические и все имеют хорошую скорострельность и огромную силу удара. Замечено, что бортовые лазеры имеют примерно вдвое более высокую скорострельность, чем носовые и кормовые.
Интересно, что на этих "супер-лазерах" можно хорошо подзаработать. При замене такого оружия на стандартное (из меню) на Ваш счет в банке поступает немалая сумма (30 тыс. и более) компенсации, но бывает и наоборот. Проверьте!
3. Байт 46 - миссия "Сверхновая".
Обычное значение - 0. В зависимости от величины засланного сюда числа, Вы получите миссию сразу или после нескольких перелетов с планеты на планету.
4. Интересно поэкспериментировать с байтами из группы 47-60.
Засылая в 47-ой байт число 255, Вы получите на карте круг размером 25,5 световых лет и сможете перелететь на самую дальнюю планету этого круга за один обычный перелет, но если перелетите на ближайшую, излишки топлива у Вас отберут и останется обычный радиус в 7 световых лет.
Заслав в 48-ой байт число 100 или 200, Вы получите соответственно 100 или 200 ракет. При пуске ракет они могут появляться стаей на экране, заслоняя "пейзаж". Можно стрелять очередями по 5-6 ракет.
Во все байты, кроме 50-го можно засылать максимальное число -255.
5. С группой байтов 94...102, увы и этому экипажу справиться пока не удалось. Что ж, будем ждать новых открытий.
Кто может помочь с ремонтом японского дисковода ТЕАС - отзовитесь. Вышла из строя 40-ножечная микросхема на плате 15532097-05В.
745100, Туркмения, Балканская обл., г. Небит-Даг, кв-л 211, д. 70, кв. 14, Виннику.
RAGETI
ADIIS
BESOORRA