| Разработка и ромхакинг > Программирование |
| [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. |
| Навигация |
| Главная страница сообщений |
| Следующая страница |