MEGAPACK: ультимативное решение для сжатия данных на Sega Mega Drive

MEGAPACK: ультимативное решение для сжатия данных на Sega Mega Drive

Предыстория: Путешествие в недра кода

Весной 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 лет назад, до сих пор демонстрирует феноменальную эффективность на специфических задачах упаковки графики.

Заключение

Никогда не бойтесь писать тем, чьими работами вы восхищались в детстве. Зачастую разработчики с радостью идут на контакт и делятся бесценным опытом. Изучение старых игр — это не просто ностальгия, а возможность найти уникальные инженерные решения, которые остаются актуальными и по сей день.

 

Источник

Читайте также