PS4Recomp — прототип статического рекомпилятора PS4 для Apple Silicon

Прокомментировать Просмотры: 0

И вот он, Bloodborne…

Всем привет! Меня не было здесь, наверное, месяца два или три. История вновь пошла по кругу: предыдущий проект, Kakehashi, пришлось закрыть, несмотря на солидное количество звёзд. Причиной стали отсутствие обратной связи и ещё… zsh.

После этого я пробовал разные идеи в надежде, что какая-нибудь приживётся. Около месяца назад взялся за очередной эксперимент: можно ли перекомпилировать x64-приложение под Apple Silicon, а графику при этом вывести через Metal? Меня вдохновил проект AnyPS5, который занимается, скажем так, переносом игр на ПК, и я решил попробовать реализовать нечто подобное.

С чего всё началось

Я не люблю Rosetta 2 и JIT, пользуюсь MacBook Pro на M1 всего с 8 ГБ оперативной памяти и вдобавок сменил нейросеть: раньше писал с Grok 4.5–4.6, а теперь — прости господи — с Gemini 3.8 Flash. Поэтому выбор пал на PS4: сопоставимый объём памяти и множество готовых материалов, в том числе ShadPS4 и OpenOrbis.

Сразу расскажу о процессе разработки. В папке, исключённой через .gitignore, находится репозиторий shadps4 с аналогичной лицензией GPL 2.0. По сути, я копировал его код, переводя с C++ на C, чтобы добиться максимально работоспособного результата. OpenOrbis поначалу использовался только для компиляции тестовых бинарников и изучения заголовочных файлов. Реализацией графики через Metal занимался сторонний разработчик manjarqo вместе со своим Claude Opus. Изначально он собирался помогать моему проекту, но затем решил отделиться и развивать собственный форк, разрешив мне использовать его наработки. За это ему огромное спасибо.

И ещё: я не геймер, поэтому воспринимаю всё происходящее прежде всего как эксперимент.

Принцип работы

Сначала вы скачиваете игру или создаёте её дамп — источник остаётся на ваше усмотрение и под вашу ответственность. Затем обрабатываете файлы сторонней утилитой https://github.com/xXJSONDeruloXx/ps4-pkg-tools и получаете распакованную папку. Похожую функциональность я удалил из своего проекта, чтобы случайно не навлечь на себя претензии Sony. После этого можно запускать сам рекомпилятор. Честно признаюсь: пока он не работает как полностью самостоятельный бинарник, поэтому собирайте его строго по инструкции ниже. Затем выполните команду:

./ps4-recomp  'путь/к/игре/eboot.bin'  --app-dir  'путь/к/игре'  --copy-resources -o  'путь/к/папке/сборки'  -c

Параметр —copy-resources не нужен при каждом запуске: достаточно указать его в первый раз для создания пакета .app. Утилита проанализирует все файлы .prx и eboot, определит функции и символы, используемые игрой и её зависимостями, построит графы и обнаружит таблицы переходов и другие необходимые элементы. Затем будут записаны сгенерированные файлы .s и C, после чего Ninja соберёт бинарник в восемь потоков.

Предупреждаю: проект находится на раннем этапе разработки. При работе с непроверенной игрой сборка в Ninja может завершиться ошибкой. Возможен и другой сценарий: бинарник соберётся, но игра при запуске вылетит или остановится на нереализованном символе OrbisOS.

Что уже работает

На данный момент проверены следующие игры:

  • The Last Of Us Remastered — запускается и работает. На моём Mac производительность составляет около 20 FPS, а на M1 Pro, по словам manjarqo, достигает примерно 90 FPS.

  • Bloodborne: Game of the Year Edition — запускается и позволяет играть. На моём Mac выдаёт примерно 6–20 FPS, но графических ошибок пока много.

  • Hogwarts Legacy — рекомпилируется, но вылетает при инициализации ICU из-за какой-то проблемы с локалями. За несколько дней разобраться с ней не удалось, поэтому работа над игрой пока приостановлена.

  • Hollow Knight: Silksong — рекомпилируется и почти доходит до первого кадра, но вылетает при раскрутке исключений C++. Мой рекомпилятор пока не поддерживает этот механизм, что временно исключает возможность запуска, пожалуй, всех игр на Unity.

Любопытно, что проприетарные и специализированные движки запускаются и работают лучше универсальных.

Структура проекта

В проекте используется целый набор языков:

  • Go — основа проекта; на нём написаны собственный дизассемблер, переводчик инструкций и другие компоненты.

  • C/C++ — используются для runtime проекта, который, проще говоря, реализует инструкции OrbisOS.

  • Objective-C/C++ — применяются в прослойке для работы с Metal, шейдерами, окнами macOS и другими специфичными для платформы возможностями.

Ниже приведён фрагмент README проекта:

├── cmd/
│   ├── ps4-recomp/              # Main CLI entry point
│   └── lifter-difftest-asm/     # AMD64 vs ARM64 differential test harness
└── pkg/
    ├── analyzer/                # Reachable CFG & instruction coverage analyzer
    ├── disasm/                  # Instruction decoder & jump-table recovery
    ├── elfloader/               # ELF64/PRX parser & multi-module TLS linker
    ├── lifter/                  # AMD64 to ARM64 assembly lifter (TSO, SIMD, FPU)
    ├── emitter/                 # Assembly partitioner, bridge trampolines & NID shims
    └── runtime/                 # Host runtime & Orbis/POSIX kernel ABI
        ├── core/                # Guest context & Mach-O crash handlers
        ├── kernel/              # Direct memory, sync pools, threading, VFS
        └── modules/             # HLE modules (VideoOut, AudioOut, GnmDriver, Pad, etc.)

Инструкция по сборке

Вам понадобится Mac с процессором Apple Silicon. Установите инструменты разработчика командой xcode-select —install, а также Go и зависимости проекта:

brew install cmake ninja freetype ffmpeg

После этого соберите проект:

# 1. Клон репозитория
git clone --recursive https://github.com/wie-project/PS4Recomp.git
cd PS4Recomp

# 2. Собрать зависимости
# SPIRV-Cross (для перевода в Metal):
cd 3rdparty/spirv-cross
clang++ -O3 -std=c++17 -c spirv_cross.cpp spirv_cross_parsed_ir.cpp spirv_parser.cpp spirv_glsl.cpp spirv_msl.cpp spirv_cfg.cpp spirv_cross_c.cpp
ar rcs libspirv-cross.a *.o && rm -f *.o
cd ../..

# LibAtrac9 (для аудио):
cd 3rdparty/libatrac9
clang -O3 -c C/src/*.c
ar rcs libatrac9.a *.o && rm -f *.o
cd ../..

# GCN Shader Recompiler 
# Вырезанный и модифицированный manjarqo кусок из shadps4,
# отвечающий за расшифровку шейдеров
cd 3rdparty/gcn-recompiler
cmake -B build -G Ninja -DCMAKE_BUILD_TYPE=Release
ninja -C build
cp build/libgcn_recompiler.a .
cd ../..

# 3. Собрать сам бинарник
go build -o ps4-recomp ./cmd/ps4-recomp

Несколько скриншотов

В игре
Игровой процесс
Ласт
The Last of Us
Небольшая шутка ))
Немного юмора

В заключение

Не знаю, как долго продлится этот эксперимент, но, кажется, на этот раз я подошёл к нему лучше подготовленным. Простите за краткость: не хотелось подробно расписывать и расхваливать проект, чтобы снова не вводить никого в заблуждение, если он вдруг закроется из-за отсутствия интереса. Спасибо всем, кто заглянул в репозиторий и заинтересовался работой.

Если хотите помочь проекту или улучшить запуск какой-либо игры, можете даже попросить свою нейросеть подготовить исправления и пул-реквесты — тот же AnyPS5 вполне успешно развивается таким способом. Главное, убедитесь, что она не засоряет проект ненужными файлами .md и не прописывает адреса жёстко или не создаёт костыльные решения для конкретной игры. Реализация должна быть корректной и универсальной, иначе я её не приму. Моя цель — создать статический рекомпилятор для разных игр, а не только для Bloodborne.

Репозиторий: https://github.com/wie-project/PS4Recomp

 

Источник

Похожие статьи

Поиск по играм, новостям и статьям…

Введите не менее двух символов

Введите не менее двух символов