GB Recompiled – Vos ROMs Game Boy traduites en C natif

La
recompilation statique
, je vous en avais parlé avec
Zelda 64
et Sonic Unleashed. Le principe, en gros c’est qu’au lieu d’émuler bêtement le processeur et la mémoire d’origine, on traduit tout simplement le code assembleur du jeu directement en C natif. Du coup le jeu tourne nativement sur votre machine, sans couche d’émulation.
Et la bonne nouvelle du jour c’est que cette technique vient de parvenir jusqu’à la Game Boy avec
GB Recompiled
.
Vous filez à cet outil un fichier .gb et il vous sort OKLM un dossier avec du code C, un CMakeLists.txt et tout ce qu’il faut pour le compiler. Vous lancez cmake puis ninja, et votre vieux Pokemon Bleu tourne nativement sur votre PC plutôt que de passer par un émulateur qui simule le processeur Z80 à chaque frame.
Plutôt chouette non ???
Pour réussir ce tour de force, le recompilateur parse les opcodes Z80 de la cartouche, construit un graphe de contrôle de flux et résout les sauts indirects (genre les tables de jump, le truc qui rend la décompilation galère parce que l’adresse de destination dépend de la valeur d’un registre). Le taux de découverte dépasse alors les 98% même sur des RPGs bien touffus… pas mal pour de l’analyse purement statique !
Côté compatibilité, 7 jeux sont pour le moment validés : Tetris, Pokemon Blue, Donkey Kong Land, Kirby’s Dream Land, Zelda Link’s Awakening, Castlevania et Super Mario Land.
Par contre, attention, tous les jeux ne passent pas encore. Le runtime embarque un rendu
PPU scanline
, un système audio 4 canaux et les contrôleurs mémoire MBC1, MBC2, MBC3 et MBC5. Et comme tout ça tourne avec SDL2, du coup ça compile tranquillou sur macOS, Linux et Windows sans broncher !
Y’a aussi des outils de vérification assez bien pensés. Par exemple, un mode différentiel lance le binaire recompilé et un interpréteur Z80 côte à côte, puis compare l’exécution cycle par cycle avec une implémentation de référence. Tant que ça colle, le portage est fidèle !
Et y’a aussi un script Python basé sur PyBoy qui génère des traces d’exécution pour repérer les instructions que l’analyse statique aurait loupées. Voilà, ce que je veux vous dire c’est que c’est pas juste un traducteur tout bête. Y’a vraiment tout un pipeline de tests derrière pour assurer le meilleur portage possible.
Si vous avez suivi les autres projets autour de la portable de Nintendo, comme le
GB Interceptor
qui espionne le bus mémoire avec un adaptateur USB ou le
Game Bub
et son FPGA Xilinx, GB Recompiled choisit plutôt l’angle purement logiciel. Là où le FPGA reproduit les circuits et l’émulateur simule le CPU, la recompilation traduit le code source. Ce sont 3 philosophies différentes mais qui ont un seul et même objectif : Faire en sorte que ces jeux ne crèvent pas avec leurs cartouches en plastique gris.
Pour tester chez vous, c’est du classique : un petit terminal, un petit git clone, un cmake, un ninja, et vous passez votre fichier .gb au recompilateur.
git clone https://github.com/arcanite24/gb-recompiled.git
cd gb-recompiled
cmake -G Ninja -B build .
ninja -C build
# Générer le code C depuis la ROM
./build/bin/gbrecomp path/to/game.gb -o output/game
# Compiler la nouvelle version en C
cmake -G Ninja -S output/game -B output/game/build
ninja -C output/game/build
# Optionnel: Baisser ou augmenter le niveau d'optimisation
cmake -S output/game -B output/game/build -DGBRECOMP_GENERATED_OPT_LEVEL=2
# Et on lance !
./output/game/build/game
Voilà comment avec juste quelques commandes, votre bonne vieille cartouche GB peut enfin tourner nativement sur votre laptop. Notez que le support Game Boy Color est dans les tuyaux, ainsi qu’un build Android.
Le projet est franchement actif et ça sent très bon pour la suite !
Source : korben.info