Разработка и ромхакинг > Программирование
[SMD] MegaDriveRecomp - статический рекомпилятор
(1/2) > >>
Werton:
Чел (наш :)) тут в дискорд SGDK залетел и такой приблудой поделился под Sega Genesis - статический рекомпилятор на основе эмулятора SegaCxx. Позволяет получить из бинарника не asm, а с++ код, который после можно собрать под нужную платформу (звуковое и графическое API тоже подменяется на кроссплатформенные). На хабре вот тоже заметка про него https://habr.com/ru/articles/1029360/.

https://github.com/testdriveupgrade/MegaDriveRecomp
SeregaZ:
угу... а там мы опять уперлись в дизассемблер, или этот рескомп сам все делает? что-то я верю в такое с трудом :) точнее не верю.
Chaotix:

--- Цитата: Werton от 01 Май 2026, 04:56:11 ---такой приблудой поделился под Sega Genesis - статический рекомпилятор на основе эмуля jgenesis. Позволяет получить из бинарника не asm, а с++ код, который после можно собрать под нужную платформу
--- Конец цитаты ---

И как потом собрать? Cгенерированные func_*.cpp файлы ссылаются на recomp_runtime.h, которого в репозитории нет. Из-за этого полученный код не собирается.
"Невозможно собрать: Отсутствует runtime library

Сгенерированный C++ код зависит от файла recomp_runtime.h, которого нет в репозитории. Проект находится на ранней стадии разработки: рекомпилятор (frontend) работает, но библиотека рантайма (backend), которая предоставляет RecompContext, m68k_flags_move(), recomp_mem_read/write() и прочее, еще не реализована. Это именно та часть, взаимодействующие с железом Genesis (VDP, звук, контроллеры, ROM). Без recomp_runtime.h и его реализации выходной проект невозможно собрать в рабочий бинарный файл. Этот рантайм должен обеспечивать полную (эмуляцию) среды окружения железа Genesis — состояние процессора, карту памяти, рендеринг VDP, FM-синтез звука и ввод с контроллеров, — что само по себе является огромным объемом работы." (C) ai агент



--- Код: ---// Generated by smd_recomp — DO NOT EDIT
#include "recomp_runtime.h"
#include "func_table.h"
--- Конец кода ---


У меня не получилось, короче. В одну сторону, работает. Каким-то чудом скомпилировал эти тулзы, они декомпилировали ром (насколько хорошо, большой вопрос). В output папке не появилось никаких рантаймов и makefile, что бы собрать обратно во что-то рабочее.

Наверное, должны были быть recomp_runtime.h и recomp_runtime.cpp, но их там нет. Либо забыли положить, либо не сделано до конца, либо я что-то делаю не так.
Беларус:
Непонятный текст там в источнике. Типа берётса ром и разбираетса. А эмулятр причём? :neznayu:
Werton:

--- Цитата: Беларус от 01 Май 2026, 19:31:08 ---Непонятный текст там в источнике. Типа берётса ром и разбираетса. А эмулятр причём? :neznayu:

--- Конец цитаты ---
В роме записаны инструкции, в эмуляторе есть декодер и интерпретатор этих инструкций. Как минимум, на сколько я понимаю, можно воспользоваться этим декодером.

Добавлено позже:
И да я там в первом посте немного насвистел (уже исправил), он на основе не jgenesis, а SegaCxx - это малоизвестный эмулятор написанный на cpp тоже от отечественного товарища, но очень сырой и даже с Gens рядом не валялся. А про jgenesis, он писал, что возможно на его основе, напишет уже на Rust другой рекомпилятор. Такая продуктивность наталкивает на мысль, что возможно автор просто балуется с нейронками :lol:
Chaotix:
Нерабочий нейрослоп, короче.  :) Было бы из-за чего шум поднимать.

Половины файлов нету нужных для сборки, описание мутное. Если оно работает, то только у автора и только с соником. Больше никто не разберётся, в текущем виде.
Werton:

--- Цитата: Chaotix от 02 Май 2026, 09:13:13 ---Было бы из-за чего шум поднимать.
--- Конец цитаты ---
Я всего лишь написал пост, а сделать из этого отдельную тему это уже решение модератора, так что ты давай к нему с этими претензиями :)


--- Цитата: Chaotix от 02 Май 2026, 09:13:13 ---Половины файлов нету нужных для сборки, описание мутное. Если оно работает, то только у автора и только с соником. Больше никто не разберётся, в текущем виде.
--- Конец цитаты ---
Ну хз, другому челу с дискорда 10 минут потребовалось, чтобы разобраться и скомпилировать проект.



Добавлено позже:

--- Цитата: Chaotix от 01 Май 2026, 14:48:43 ---И как потом собрать? Cгенерированные func_*.cpp файлы ссылаются на recomp_runtime.h, которого в репозитории нет. Из-за этого полученный код не собирается.

У меня не получилось, короче. В одну сторону, работает. Каким-то чудом скомпилировал эти тулзы, они декомпилировали ром (насколько хорошо, большой вопрос). В output папке не появилось никаких рантаймов и makefile, что бы собрать обратно во что-то рабочее.

Наверное, должны были быть recomp_runtime.h и recomp_runtime.cpp, но их там нет. Либо забыли положить, либо не сделано до конца, либо я что-то делаю не так.
--- Конец цитаты ---
А ты про обратную сборку из cpp, пропустил этот пост  :shifty: Я честно хз, я даже саму тулзу не пробовал собрать, оно мне пока вроде и не к чему, но да, пока все сыро и немного на отвали выглядит. Напиши ему ишью в репу пусть чинит, а то понимаешь хайпа навел, а оно нифига не фурычит :lol:
Chaotix:

--- Цитата: Werton от 02 Май 2026, 13:24:17 ---А ты про обратную сборку из cpp, пропустил этот пост  :shifty:
--- Конец цитаты ---
Да, я не про саму тулзу.
Стоит заметить, она тоже не собирается без приколов. Там нехватало CMakeLists.txt, как у чела на твоём скрине.

Но, если разгадать эту мумбу-юмбу и собрать вопреки тому, что написано автором в build.md, то получишь код аля ассемблер завёрнутый в C++, который так просто нигде не запустить


--- Цитата ---а сделать из этого отдельную тему это уже решение модератора, так что ты давай к нему с этими претензиями :)
--- Конец цитаты ---

Я больше про Хабр и build.md. Там пафосно написано, что всё просто:
"создаётся код, который можно собрать современным компилятором.
Графика, звук и ввод переподключаются к актуальным API.."

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

Добавлено позже:

--- Цитата: Беларус от 01 Май 2026, 19:31:08 ---Непонятный текст там в источнике.
--- Конец цитаты ---
такое чувство что все нейронкой сгенерировано, и исходники и статья


Добавлено позже:
Кто-нибудь знает это случайно не тот же метод которым sonic для android на windows запускают?
Chaotix:

--- Цитата: SegaMark от 03 Май 2026, 07:38:33 ---Кто-нибудь знает это случайно не тот же метод которым sonic для android на windows запускают?

--- Конец цитаты ---
Маловероятно. Sonic для Android это рекомпилировали движок Retro Engine от Christian Whitehead, насколько я знаю.
"Кристиан изначально делал фан‑игры по Сонику, затем начал писать свой движок для современных платформ, а потом Sonic Team официально заключила с ним партнёрство и использовала его для официальных релизов.
Использовался для Sonic 1 Remastered, Sonic 2 Remastered, Sonic CD, Sonic Mania и пр.

Android‑порты и Sonic Mania легче рекомпилировать под ПК, чем пытаться дизассемблировать оригинал.

Из Genesis рома получится низкоуровневый, сильно привязанный к железу код. Там нужно восстанавливать и железо консоли (адресацию, стек и т.п.). Нужно либо эмулировать всё это программно, либо вручную переписать код, чтобы работало без родного железа (что является очень сложной задачей).

В Android‑портах такой код уже давно абстрагирован движком.
Retro Engine уже изначально используют: C/C++‑код; нужные форматы графики и всё это. Поэтому, декомпилировав именно этот код, можно пересобрать проект под Windows гораздо проще.

Sonic 3 A.I.R. это другое, не Retro Engine.
Оригинальный код Sonic 3 & Knuckles был переписан/переведён в высокоуровневый скриптовый DSL (Lemonscript), а не оставлен как голый 68K‑ассемблер; это больше похоже на декомпиляцию, чем на прямую эмуляцию. Внутри используется движок, который частично эмулирует особенности Sega Genesis (регистры, память и т.п.), но сама игра не запускает ROM‑файл в классическом эмуляторе" (C) всем известная инфаМожет что-то новое появилось и кроме декомпилов Retro Engine (я давно не следил за темой).
Томахомэ:

--- Цитата: Werton от 01 Май 2026, 04:56:11 ---Чел (наш :)) тут в дискорд SGDK залетел и такой приблудой поделился под Sega Genesis - статический рекомпилятор на основе эмулятора SegaCxx. Позволяет получить из бинарника не asm, а с++ код, который после можно собрать под нужную платформу (звуковое и графическое API тоже подменяется на кроссплатформенные). На хабре вот тоже заметка про него https://habr.com/ru/articles/1029360/.

https://github.com/testdriveupgrade/MegaDriveRecomp

--- Конец цитаты ---

Судя по именам формата func_[hex_addr].cpp, нейронка будто разбивает дизасм на подпрограммы и каждую почему-то заносит в отдельный source-файл, после чего переписывает на C++. Проблема в том, что в итоге после компиляции с C++ подпрограмма может получиться гораздо тяжелее, чем была.



Технологии бы пока подозреть ещё, плюс практичнее смотрится прямой, без посредничества высокоуровневых языков, реасм для целевой платформы... К тому же, ручной реверс - это тоже ведь занятие по-своему интересное, упражнялка для мозгов не хуже шахмат или кроссвордов.
Chaotix:

--- Цитата: Томахомэ от 03 Май 2026, 08:27:37 ---Судя по именам формата func_[hex_addr].cpp, нейронка будто разбивает дизасм на подпрограммы и каждую почему-то заносит в отдельный source-файл, после чего переписывает на C++.
--- Конец цитаты ---
Что бы по скрину не гадать, то вот код во что оно рекомпилирует:
 zt-recomp-20260503.zip (895.52 КБ - загружено 18 раз.)
 HISTORY_RU.txt (13.12 КБ - загружено 16 раз.)
На примере zero tolerance. Там recomp_runtime.h, попытка восстановить недостающий рантайм нейронкой. В HISTORY_RU.txt лог, с чем пришлось столкнуться и почему ничего не получилось. Точнее, 244 из 256 функций компилируются без ошибок (12 нужно фиксить) и нет эмуляции графического чипа (VDP), звука и контроллера. Автор же этого не положил.

Короче, не поиграем в Zero Tolerance в 60фпс и с ogg музыкой.
Не в этот раз. :)
Werton:

--- Цитата: Томахомэ от 03 Май 2026, 08:27:37 ---Судя по именам формата func_[hex_addr].cpp, нейронка будто разбивает дизасм на подпрограммы и каждую почему-то заносит в отдельный source-файл, после чего переписывает на C++. Проблема в том, что в итоге после компиляции с C++ подпрограмма может получиться гораздо тяжелее, чем была.

--- Конец цитаты ---
Нету там никакой нейронки, да и чтобы генерить файлы по шаблону она и не нужна, это сама программа делает, за это отвечает модуль lifter.cpp. Видимо он преобразует распознанные анализатором инструкции в эквивалентный cpp код.
Написал я автору в дискорде про недостающие файлы и дал ссылку на этот тред, может отпишется.
SegaMark:

--- Цитата: Chaotix от 03 Май 2026, 09:28:01 ---нет эмуляции графического чипа (VDP), звука и контроллера.
--- Конец цитаты ---
то есть то что запустился Соник это фейк?

https://habrastorage.org/r/w1560/getpro/habr/upload_files/543/acf/ee8/543acfee884252fb797de856aed74a6e.jpg
Добавлено позже:

--- Цитата: Chaotix от 03 Май 2026, 09:28:01 ---Что бы по скрину не гадать, то вот код во что оно рекомпилирует:
--- Конец цитаты ---
Даа я ожидал что будет хотя бы что то похожее что выводиться в C плагинах в дизассемблерных программах типа Ghidra, но тут по суту код ничем не проще чем когда его приходиться дизасмить.

Просьба не размещать с помощью тэга img изображение со стороной более 700 пикселей. ghostdog3
Chaotix:

--- Цитата: SegaMark от 03 Май 2026, 20:27:56 ---то есть то что запустился Соник это фейк?
--- Конец цитаты ---
Не обязательно.
Я имел ввиду что, там нету движка, который запускает этот рекомпилированный код. Я добавил туда заглушку.
Но, у автора наверное лежало тут c:\smd_recomp\SegaCxx\output\recomp_runtime.cpp (+recomp_runtime.h), но он не положил на гитхаб. Почему, непонятно.
Dport:
Вообще, насчет портирования игр с Сеги на пк необязательна рекомпиляция, взять тот же Sonic & Knuckles Collection, хакеры с Sonic Retro выяснили, то портирование происходило так: исходный код Sonic 3 & Knuckles был переведен из m68k в x86 ассемблер(с помощью автотранслятора), для того чтобы все этого работало в Win 95 была написана оболочка на с++, она отвечала за графику(vdp) и ввод-вывод с пк ну и музыку. Оболочка была декомпилирована и самое интересное, что она не заточена специально под Соника. за сжатие и расжатие графики отвечает именно конвертированный x86 код. Т.Е. в теории, можно использовать 68к -> x86 транслятор, чтобы перевести код дизассемблированной игры и подружить ее с этой оболочкой. Репозиторий с декомпиляцией(хотя правильнее было бы сказать перевод x86 асма в С): (пока не завершена, но с++ оболочка уже декомпилирована) https://git.sr.ht/~benoitren/skccport
Про Игрок:
Этой примочкой можно получить код поведения персонажа из игры?
Werton:

--- Цитата: Про Игрок от 04 Май 2026, 02:24:53 ---Этой примочкой можно получить код поведения персонажа из игры?

--- Конец цитаты ---
В теории да, на практике код не человекочитаемый, ни фига не проще, чем ассемблер читать.


--- Цитата: Werton от 03 Май 2026, 16:34:00 ---Написал я автору в дискорде про недостающие файлы и дал ссылку на этот тред, может отпишется.
--- Конец цитаты ---
Короч, автор ответил что это альфа, выложил т.к. особо нетерпеливые очень просили, сейчас у него нет времени ей дальше заниматься.
Беларус:
Ещё вот эти рекомпилятры непонятно чем отличаютса от дизасма Иды и Гидры. Даже нейросеть не смогла обьяснить, как и автр этово на Хабре.
Как можно статически вычислить все условные прыжки, например? Это даже динамически непросто - требуетса пройти все возможные ветки кода.
Werton:

--- Цитата: Беларус от 04 Май 2026, 12:50:13 ---Как можно статически вычислить все условные прыжки, например? Это даже динамически непросто - требуетса пройти все возможные ветки кода.
--- Конец цитаты ---
И в чём сложность пройти все ветки кода, когда как раз всё равно придётся "проходить весь код"? Я понимаю, когда код самоизменяющийся/генерирующийся в ram, это да гораздо сложнее, но вряд ли, кто такое юзал в мегадрайве.

Добавлено позже:

--- Цитата: Беларус от 04 Май 2026, 12:50:13 ---Ещё вот эти рекомпилятры непонятно чем отличаютса от дизасма Иды и Гидры. Даже нейросеть не смогла обьяснить, как и автр этово на Хабре.
--- Конец цитаты ---
Странный вопрос, рекомпилятор по сути это декомпиляция плюс трансляция. Так что ничем она не отличается, а включает ее в себя. Но я не шарю, лучше спросить того, кто шарит за эту тему, кто эмули писал, например MetalliC'a.
Навигация
Главная страница сообщений
Следующая страница

Перейти к полной версии