
Предыстория: Путешествие в недра кода
Весной 2021 года я решил вернуться к старому хобби — исследованию архитектуры игр для Sega Mega Drive / Genesis. Выбор пал на легендарную Fantastic Adventures of Dizzy. В детстве этот картридж казался мне невероятно сложным: собрать все звёзды для встречи с финальным боссом было задачей практически невыполнимой для ребёнка.
Сегодня, глядя на проект глазами инженера, я всё так же восхищаюсь этой игрой. Сочная палитра, атмосферное музыкальное сопровождение, обилие загадок и масштабные уровни — настоящий шедевр своего времени. Именно такие проекты, сочетающие детские воспоминания и техническое совершенство, становятся идеальными объектами для реверс-инжиниринга.
Зачем нужен реверс старых игр?
На этот вопрос трудно дать однозначный ответ. Я не стремлюсь стать массовым создателем ромхаков — на моем счету лишь одна модификация, тогда как у энтузиастов их десятки. Часто процесс исследования останавливается на полпути, когда любопытство удовлетворено.
Для меня это своего рода медитация, способ разгрузить мозг и, возможно, создать полезный инструмент для других исследователей. Параллельно я тестирую собственные утилиты для IDA Pro, отлавливая баги и добавляя новые функции в процессе работы «в полях».
В случае с Dizzy моей амбициозной целью было создание редактора уровней, чтобы найти скрытые разработчиками секреты. И хотя редактор так и не увидел свет, результат превзошел ожидания.
Первый прорыв: Наследие Amiga
Мои попытки разобраться в коде игры начались ещё в 2015 году. Тогда удалось обнаружить алгоритм сжатия Amiga Imploder (с характерным тегом IMP! в заголовке). Этот упаковщик часто использовался в портах с Amiga на Sega. Мне удалось восстановить логику упаковщика, изучив оригинальный файл FImp, после чего проект был заморожен на несколько лет.
Второй подход и неожиданное открытие
Вернувшись к задаче в 2021 году, я наткнулся на второй алгоритм сжатия. Он не был похож ни на одно стандартное решение. Распаковщик в коде игры выглядел настолько запутанным, что попытки переписать его на C зашли в тупик.
Тогда у меня родилась дерзкая идея: найти кого-то из оригинальной команды разработчиков. Шансы были невелики — игра вышла в 1991 году, и контакты тех лет давно канули в лету. Однако удача улыбнулась мне.
Переписка с легендой
После недолгих поисков я обнаружил почту Дерека Ли-Гилкриста (Derek Leigh-Gilchrist), работавшего в компании Happy Cactus. Я отправил ему короткое письмо без особой надежды на успех:
«Здравствуйте! Я хотел бы связаться с Дереком Ли-Гилкристом, чтобы обсудить Fantastic Adventures of Dizzy для Amiga и Sega Mega Drive. Я занимаюсь ромхакингом этих платформ, и было бы здорово пообщаться об этих играх».
К моему восторгу, ответ пришёл довольно быстро:
«Привет, Владимир! Это Дерек. Спрашивай о чём угодно, буду рад помочь. Дел».
Технические откровения: Секреты Codemasters
Дерек поделился уникальными подробностями разработки:
«Персонажи и спрайты упаковывались специальной системой, которая анализировала изображения и использовала битовую упаковку, основанную на частоте соседства определенных цветов. Это была ранняя форма своего рода «глубокого обучения», созданная Джоном Мензисом. Благодаря этому алгоритму мы смогли уместить игру в 512 КБ! В работе с графикой он на 30% обходил стандартный LZ. Остальные данные жали модифицированным Imploder.
Музыкальный драйвер для Z80 написал Эш Хогг, он конвертировал модули из Amiga Noisetracker. Всю работу я вел на Amiga 4000/040, загружая код на Mega Drive через параллельный кабель».
От ассемблера к современному коду
Дерек прислал мне исходный код распаковщика в виде текста. Ознакомиться с оригинальным кодом на ASM можно по ссылке: megaunp.s.
К сожалению, исходников самого упаковщика (MEGAPACK) у Дерека не сохранилось. Тогда я обратился за помощью к известному в узких кругах ромхакеру Марату. Спустя некоторое время он прислал работающий алгоритм упаковки на Pascal.
Хотя код на Pascal был рабочим, его было сложно интегрировать в современные проекты. Я потратил несколько недель, чтобы портировать этот алгоритм на C. Теперь все наработки доступны в репозитории: megapack-megadrive.
Король компрессии: Сравнительный анализ
Почему я считаю MEGAPACK выдающимся достижением? Взгляните на результаты тестирования. В качестве образца взят графический блок объемом 18 752 байта.
| Алгоритм | Размер после сжатия (байт) |
|---|---|
| MEGAPACK (Fantastic Dizzy) | 10 387 |
| LZMA2 | 10 867 |
| GZIP | 11 159 |
| LZH (Thunder Force 3) | 11 386 |
| Nemesis (игры Sega) | 11 652 |
| ApLib | 12 682 |
| RNC ProPack | 13 297 |
| LZ4W (SGDK) | 16 926 |
Результаты говорят сами за себя: алгоритм Джона Мензиса, созданный более 30 лет назад, до сих пор демонстрирует феноменальную эффективность на специфических задачах упаковки графики.
Заключение
Никогда не бойтесь писать тем, чьими работами вы восхищались в детстве. Зачастую разработчики с радостью идут на контакт и делятся бесценным опытом. Изучение старых игр — это не просто ностальгия, а возможность найти уникальные инженерные решения, которые остаются актуальными и по сей день.


