Давным-давно, в далекой-предалекой галактике… В общем была такая приставка «Денди». И было на нее море пиратских картриджей разной степени паршивости. Но один не давал мне покоя.
Через некоторое время после покупки желанной «Денди», я, как и все, столкнулся с проблемой, что комплектный картридж с «танчиками» уже не вставляет, как раньше. Назрела необходимость покупки нового, чтобы было хотя бы на что меняться с другими товарищами. Продавались картриджи с помпой по всей Москве, так что был выбран самый простой и удобный вариант — Универмаг Московский возле Ярославского вокзала. На третьем этаже был целый отдел с игрушками, причем не только от фирмы Steepler.
К выбору картриджа я подошел со всей тщательностью. Выбирал самый тяжелый и самый желтый картридж из всех. Чем тяжелее картридж, тем больше в него влезало игр, причем наклейка на этот показатель никак не влияла. Забегая вперед, скажу, что на моем в последствии наклейки не оказалось вовсе. Наконец, выбор был сделан: многоигровка 7-в-1 с «Черным плащом», «змейками» и «Magic Jewel».
Началась новая эра (лично для меня), после простеньких «уточек» и «марио» я получил сразу великолепнейшие и красивейшие игры с музыкой (сколько времени я убил на запись и прослушивание заставочной темы из Робокопа, это не передать словами).
Была лишь одна вещь, которая омрачала мою радость. Игра «Snake Rattle’n Roll» на этом картридже всегда намертво зависала в седьмом уровне на «фонтанчиках». Как только брался приз-часы, появлялся одинокий фонтанчик, а дальше следовала неминуемая смерть. Обидно было еще и потому, что даже с секретными переходами между уровнями, известными мне на тот момент, добраться до того места было ой как сложно. Впоследствии был, конечно же, найден переход из первого уровня сразу в восьмой, что несколько спасло дело, но это было уже достаточно поздно и всерьез игру пройти так и не удалось. Спустя время, картридж и вовсе затерялся в чьих-то закромах и так ко мне и не вернулся. Но история на этом не заканчивается, а начинается новая.
Некоторое время назад я получил по почте пачку картриджей (кстати, огромная просьба тем, кто мне что-то отправлял вне зависимости, хотел бы он вернуть картриджи обратно или нет, свяжитесь со мной по почте, и засвидетельствуйте принадлежность тех или иных посылок именно вам; память у меня плохая, а посылки скопились за довольно большое время, сам я уже могу и не вспомнить, кого за что благодарить). Среди тех картриджей оказался один, полу-живой, с явными следами вандало-ремонта, и показывал он только одну игру «Черный плащ» с глюками в графике. На плате значилось 12-в-1. После выпайки и считывания ПЗУ, оказалось, что это ни что иное, как тот самый родной картридж со «змейками». Вот он, герой рассказа, в коробке с оригинальной наклейкой:

7 в 1 "со змейками"
Замулить маппер не составило большого труда, благо все игры имеются в отдельном виде, все (кроме простых) работают на оригинальной версии MMC1 от Nintendo и соответственно могут быть выделены нужные для переключения банки ПЗУ и для пиратского маппера. К слову сказать, несмотря на простоту, пиратский вариант сам по себе позволяет практически идеально имитировать работу большинства картриджей на базе MMC1, с тем лишь исключением, что каждую игру необходимо индивидуально модифицировать. В частности, «Робокоп» требовал от пиратов огромных усилий по модификации кода, потому как функции смены банков разбросаны в нем по всему ПЗУ, с чем доблестные тайваньцы успешно справились.
Пришла очередь узнать наконец, что же было причиной такого жестокого зависания «змеек».

То самое место
Вот оно, проблемное место. Одно движение вниз, чтобы забрать приз-часы и прощай долгие часы трудов по прохождению до этого места. Экспериментально было найдено место, где игра срывается в бездну, а также исходный байт данных, который к этому ведет. Осталось только найти место, где он получает свое деструктивное значение. И такое место было найдено:
Оригинальный код
$FFC9 8D FF BF STA $BFFF $FFCC 4A LSR $FFCD 8D FF BF STA $BFFF $FFD0 4A LSR $FFD1 8D FF BF STA $BFFF $FFD4 4A LSR $FFD5 8D FF BF STA $BFFF $FFD8 4A LSR $FFD9 8D FF BF STA $BFFF $FFDC 60 RTS
Пиратский модифицированный код
$FFC9 0A ASL $FFCA 0A ASL $FFCB 0A ASL $FFCC 8D FF BF STA $BFFF $FFCF EA NOP $FFD0 EA NOP $FFD1 2C FF BF BIT $BFFF $FFD4 EA NOP $FFD5 2C FF BF BIT $BFFF $FFD8 4A LSR $FFD9 2C FF BF BIT $BFFF $FFDC 60 RTS
Часть своих данных игра хранит видео-ПЗУ и периодически ей надо их оттуда считывать. В частности, в видео-ПЗУ хранятся некоторые данные уровня, например, как раз данные активных объектов. Когда мы берем приз-часы, игровое поле модифицируется так, чтобы появились анимированные фонтанчики. Сначала вызывается функция смены банка видео-ПЗУ, а потом функция копирования данных из видео-ПЗУ в ОЗУ приставки. Обе функции вызываются одна за другой, первая с параметром номера банка в регистре А, вторая с параметром индекса массива данных, с которого необходимо начать копирование данных.
Не так явно бросается в глаза тот факт, что оригинальная функция смены банков всегда очищает регистр А, так как сдвигает его на 5 бит вправо, а число, в него записываемое, не превышает 31. Таким образом, в оригинальной игре, после вызова функции смены банка, функция копирования всегда должна инициализироваться нулевым значением в регистре А. У пиратов же, функция состоит из старой части, в которой опкоды MOV заменены на BIT, чтобы не влиять на пиратский маппер, а нужное значение для его собственного регистра получается сдвигом индекса банка графики на 3 влево. Таким образом, на выходе из этой функции регистр А не очищается, а его значение передается как индекс начала области данных для копирования. В определенный момент нужные данные пишутся не туда и приводят к фатальному сбою.
Исправить данный баг можно было бы всего лишь добавлением гарантированной очистки регистра А перед выходом из подпрограммы смены банка. Вот так, пиратская недоработка могла стоить кучи нервных клеток для молодого организма и кучи впустую потраченного времени на ее поиск у взрослого. 😉
Вот и сказочки конец, а кто дочитал до этого места, получит приз.
30 Comments
Why only in Russian?? I need to translate this:] Please add some comments in English.
Я до читал до конца, где мой приз??? )))
dr88, lol, I can’t write so much in english, sorry 😉
Fallved, а приз — дамп этого картриджа лол, на CaH4e3’s Stuff Home.
I always look for your updates:) Could be nice to translate them sometimes:P
I always translate my updates 😉 this one first I didn’t translate lol
Alright, if anyone wants, I can translate it for you, English-speakers. Just mail me on cr45h_it_away@mail.ru, my mailbox is always open for guests (but not for spam intruders, of course, tee-hee-hee…)
No worries Cah4e3, just want to get rid of mall the mistakes you usually make d;)
И правда помню этот катридж был и у меня. Действительно, ситуация со змейкой на уровне с фонтанчиками долго вводила меня в ступор! Потом как-то и забылось…
Буквально на днях решил пройти уже с помощью эмулятора этот Snake. Прошёл без проблем и фонтанчики. А вот в самом последнем уровне пришлось долго повозиться в самом конце, чтобы запрыгнуть в финишную «лунку». На приставке я бы это точно вряд ли прошёл — терпения бы столько не хватило 🙂
Интересно! 🙂
Хотя на денди мне эти «змейки» не разу не встречались…
Спасибо Cah4e3, что ты есть. Интересно пишешь. Я отлично помню этих «змеек», игра мне не понравилась – очень сложная, и дальше 4-го уровня я не проходил. 🙂
З.Ы. «сколько времени я убил на запись и прослушивание заставочной темы из Терминатора». Может все-таки из «Робокопа 3»? Я сам не мог наслушаться.:)
Hello. Will you make more Contra dumps? Like Forest Contra, New Contra and the multicart?
У меня был точно такой карик=))
только в змейках дальше 4 кроаня не доходил…
Да, было время, то же бился с этими фонтанчиками, в конце концов забил и улетал на ракете в 8. Доходил до луны но ногу убить так и не смог, не бессмертна ли она в этой пиратке? На эмуле прошел без проблем.
>>Началась новая эра (лично для меня), после простеньких «уточек» и «марио» я получил сразу великолепнейшие и красивейшие игры с музыкой (сколько времени я убил на запись и прослушивание заставочной темы из Робокопа, это не передать словами).<<
Точь-в-точь про меня. :))) Я точно также после картриджа 9999in1, прилагавегося к приставке, вскоре потерял интерес к простым играм и приобрел заветную 7-игровку — абсолютно точно такую же как на фото. И о сколько времени я убил на "змеек". Страшно подумать сколько жизней изменил баг с очисткой регистра А… Спасибо, Cah4e3, что поведал наконец о причине этого чёртового глюка!
Мдя из за одного регисра A я тоже в свое время не смог пройти этот уровень.
Была вот ещё одна игра Frankenstein — The Monster Returns с примерно темже глюком, зависала во втором уровне при прыжке на «кочку» на болоте. Причём перепробовал много картриджей глюк был на всех. Интесрено с чем там связано на эмуляторах идёт без проблем.
ну если найдется картридж, то легко. такой фигни было еще несколько, типа глюков на лифте в shatterhand, правда сам я его не помню ниразу.
cah4e3, спасибо 🙂
Hello. Will you make more Contra pirate dumps?
Спасибо за инфу 🙂 Тоже в детстве оч мучался, только переход с 1 на 8 или 5 на 8й решал… На самом деле, баг еще проявляется даже если не брать часы, а просто прыгнуть в пропасть право-вверх от часов. Видимо, там тоже банки переключаются 🙂
It´s possible to emulate a rom call Where´s Bin Laden? That Cartrige is a clone of Where´s Wally is so rare i saw a image no the internet and i don´t now where is the image now :(.
It’s only possible if you find cartridge for me, even images didn’t help. 😉
да,какой облом был когда игра зависла,я думал картридж заезжанный а оно вон оказывается как …
лишь только спустя долгие годы прошел её на эмуляторе.
Contra pirate dumps?
Да-да, точь в точь как и я. Только у меня вместо танчиков наряду с уточками был «лоде руннер» :))).
Со змейками парился аналогично. Более того, однажды совершил невозможное — дошёл до этого места один двумя змейками!!! (просто никто из друзей не мог дойти до туда) Хотел сделать такой трюк. Одну змейку подталкиваю пальцем ноги на часы, а вторую тут же пихаю в водопад. Фонтанчик брызнул один раз, змейка естественно с него свалилась и поплыла вниз. Потом стандартный «матрас» на экране.
А ещё мне удалось на втором уровне заставить ногу упасть в море — наизабавнейший баг! 😉
Мда. Носстальгия. Был у меня такой карт когда-то.
не помнишь, в каком году Dendy купил? какая модель?
Модель, конечно же, денди джуниор, а вот год — хоть убей не помню. 😉
а у меня на 7-игровке со Змейками были Трёхглазый Мальчик и 3д-Пакман
до седьмого уровня не доходил, хз. хотя игра очень нравилась
Скачал ром с сайта http://cah4e3.shedevr.org.ru вот в этом архиве 7-in-1 [p1][U][!], но…не один эмулятор его не берёт. Чем открывали?