Фанат Super Mario 64 смог портировать игру на ПК без эмуляции. Реверс-инженеры два года работали с кодом

Abnormal programmingCReverse engineeringDIYGames and game consoles
image

Поклонник Super Mario 64 смог портировать проект на компьютер спустя 24 года после его выхода, не прибегая к эмуляции Nintendo 64. Портированная игра поддерживает DirectX 12 и совместима с трассировкой лучей.

Пользователям продемонстрировали трассировку лучей Паскаля Гилчера, с помощью алгоритма фонового затенения, с помощью эффекта отражения на поверхности объектов и расширенными эффектами глубины резкости.


С поддержкой DirectX удалось реализовать широкоформатный режим игры и увеличить разрешение. Автор эксперимента смог запустить Super Mario 64 в разрешении 4K при 550 кадрах/с на ПК с процессором Intel Core i7-7700K 4,5 ГГц и видеокартой NVIDIA GeForce GTX 1080 8 Гбайт. Он порекомендовал установить ограничение частоты на 30 кадров/с.


Как отмечается, выход порта для ПК не имеет ничего общего с недавней утечкой внутренних файлов Nintendo, относящихся ко временам Gamecube. Он стал прямым результатом усилий команды Zelda по декомпиляции ПЗУ Super Mario 64 в разборный код C — реверс-инжиниринга от простого двоичного до легко читаемого кода. На эти попытки ушло два года.

Первый шаг в реверс-инжиниринге ПЗУ N64 предполагает установление версии IDO-компилятора Silicon Graphics, которая была использована для создания ПЗУ. Затем нужно выяснить, как организовано ПЗУ, говорят энтузиасты. В играх N64 файлы упорядочены в 16-байтовые блоки, что облегчает просмотр «отступов», отмечающих конец файла. Отладочные сборки игры могут также помочь инженерам задокументировать ее структуру благодаря наличию несжатых файлов и макросов C, таких как __FILE__ и __LINE__, которые показывают внутренние имена, используемые Nintendo.

Чтобы получить пригодный для использования C-код, нужно вручную сопоставить побайтовый код с исходным кодом сборки всех функций в игре после выполнения через компилятор. Однако отдельные функции N64 могут выполняться с тысячами инструкций, и в одной игре N64 может быть несколько тысяч таких функций.

Сложность также варьируется в зависимости от игры. Для Super Mario 64 Nintendo скомпилировала исходный код без каких-либо необычных опций, и это означает, что декомпилированный язык ассемблера было проще преобразовать обратно в C-код. А, к примеру, в случае с Ocarina of Time Nintendo использовала флаги оптимизации для генерации более быстрого кода, и полученное ПЗУ намного сложнее превратить обратно в исходный код. После нескольких месяцев работы Zelda включила в С-код только около 15% функций Ocarina of Time.
См. также:

Tags:marion64nintendo 64портированиереверс-инжиниринг
Hubs: Abnormal programming C Reverse engineering DIY Games and game consoles
+20
7.3k 7
Comments 26

Popular right now

Reverse Engineer
from 3,500 to 4,000 $Hand2NoteRemote job
Engineering Manager
from 2,500 to 4,000 $LuxandRemote job
Программист (C, Linux)
from 120,000 to 200,000 ₽АМИКОНМоскваRemote job
С++ game developer
from 120,000 to 200,000 ₽SPLRemote job
Embedded C Разработчик / Embedded C Software Developer
from 100,000 ₽Flipper Devices Inc.МоскваRemote job