[Game and watch] - Hack des modèle Mario ou Zelda
Introduction
Cette page explique le hack de la Nintendo Game and Watch Mario ou Zelda qui permet de lui ajouter des émulateurs avec Retrogo ou encore de changer sa mémoire très petite par une plus grande, un bon rapport qualité-prix est de choisir une mémoire de 64 MO.
Prés-requis
- Une Game and Watch Mario ou Zelda.
- Un PC tournant sous Linux ou un Linux dans une machine virtuelle (ubuntu sera pris comme exemple ici et la configuration d'une machine virtuelle ne sera pas expliquée).
- Un programmateur STLink, d'autres programmateurs peuvent être utilisés.
- Une connexion internet pour télécharger certains éléments, une fois cela fait la connexion ne sera plus nécessaire.
- De quoi démonter le Game and Watch et de quoi souder les éléments au programmateurs pour flasher la console, ceci ne sera pas abordé ici, on part du principe que vous savez faire cela.
- Savoir utiliser un terminal de lignes de commandes (on tape les commandes une à une en faisant entrer entre chacune, le terminal peut être lancé via le raccourci clavier "ctrl+alt+t" par défaut).
Mettre en place l'environnement
On part du principe que les outils et autres programmes se trouveront dans le dossier "gnw" dans le dossier de l'utilisateur, donc le chemin "~/gnw".
On ouvre donc un terminal puis on tape la commande suivante pour créer ce répertoire:
mkdir ~/gnw
Une fois cela fait on tape cette commande pour entrer dans le répertoire nouvellement créé:
cd ~/gnw
On met nos dépôts à jour histoire de bien récupérer les dernières versions des paquets ensuite:
sudo apt update
On installe ensuite les paquets dont on va avoir besoin:
sudo apt install python3-pip git binutils-arm-none-eabi python3 libhidapi-hidraw0 libftdi1 libftdi1-2 build-essential openocd default-jre
Ensuite on récupère une build patché de Openocd:
wget https://nightly.link/kbeckmann/ubuntu-openocd-git-builder/workflows/docker/master/openocd-git.deb.zip
On la décompresse:
unzip openocd-git.deb.zip
On l'installe:
sudo dpkg -i openocd-git_*_amd64.deb
On valide l'installation:
sudo apt -y -f install
Maintenant on va télécharger le compilateur:
wget https://developer.arm.com/-/media/Files/downloads/gnu-rm/10.3-2021.10/gcc-arm-none-eabi-10.3-2021.10-x86_64-linux.tar.bz2
On décompresse le fichier téléchargé:
tar xjf gcc-arm-none-eabi-10.3-2021.10-x86_64-linux.tar.bz2
On récupère le dépôt de Game-and-watch-bakcup:
git clone --recursive https://github.com/ghidraninja/game-and-watch-backup.git
Au tour du dépôt de Game-and-watch-patch si on souhaite mettre en place le dual boot entre le firmware officiel et Retrogo, sinon tout se qui concerne le dossier "game-and-watch-patch" peut être ignoré:
git clone --recursive https://github.com/BrianPugh/game-and-watch-patch.git
Enfin le dépôt de Game-and-watch-retrogo:
git clone --recursive https://github.com/sylverb/game-and-watch-retro-go.git
On se rend ensuite dans le répertoire des patches pour installer les dépendances Python requises:
cd game-and-watch-patch
On installe les dépendances:
pip3 install -r requirements.txt
On va faire de même avec le projet Retrogo:
cd ../game-and-watch-retrogo
Puis:
pip3 install -r requirements.txt
Et enfin on revient à notre répertoire de travail:
cd ..
Attention, si la commande "pip3 ..." ne fonctionne pas comme cela sera le cas avec les versions supérieur à Ubuntu 22.04 la remplacer par cette commande:
pip3 install --break-system-packages -r requirements.txt
Bien qu'il soit vrai que cette commande ne soit pas la plus intéressante elle reste la plus simple à faire, une alternative pour utiliser un environnement isolé comme il est maintenant préconisé sera ajouté par la suite à ce tuto lorsque la méthode aura été testée.
Mettre à jour le STLink
Aller sur cette page et récupérer l'outil pour mettre à jour (nécessite de créer un compte sur le site):
https://www.st.com/en/development-tools/stsw-link007.html
Une fois le fichier récupérer le décompresser dans le répertoire de travail, ici "gnw" (l'interface graphique d'ubuntu le permet facilement).
Pour lancer l'utilitaire on tape la commande:
java -jar ~/gnw/stsw-link007/AllPlatforms/STLinkUpgrade.jar
Puis dans l'outil qui s'ouvre on pourra mettre à jour via le bouton "upgrade". Une fois la mise à jour terminée débrancher et rebrancher le Stlink et cliquer sur "refresh" histoire de confirmer que la mise à jour s'est bien passée.
Note: Parfois durant les étapes du flash le firmware du STLink peut se corrompre, on le voit car dans l'outil la version du firmware ne s'affiche pas. Dans ce cas refaire la procédure de mise à jour qui devrait régler le problème.
Note: En cas d'erreur avec dev.rules du Stlink taper la commande suivante et relancer le programme:
sudo dpkg --remove --force-remove-reinstreq st-stlink-udev-rules
Mise en place du hack
Pin out des consoles
Pin out du modèle Mario:

Pin out du modèle Mario avec une vue différente:

Pin out du modèle Zelda:

Quelques commandes importantes à taper à chaque ouverture du terminal lorsqu'on travail sur ce projet
Nous avons quelques variables à configurer pour que notre environnement soit pleinement fonctionnel, pour éviter que tout cela n'interfère avec les autres éléments possiblement installés sur la machine on ne fera pas de définition automatique de celles-ci.
Ces commandes sont donc à taper à chaque fois que le terminal est ouvert pour travailler sur ce projet.
La première commande indique où se trouve notre Openocd patché:
export OPENOCD="/opt/openocd-git/bin/openocd"
La seconde commande indique où se trouvent les fichiers pour le compilateur:
export GCC_PATH="/home/$USER/gnw/gcc-arm-none-eabi-10.3-2021.10/bin/"
Cette troisième commande définie le programmateur utilisé:
export ADAPTER=stlink
Voir sur les Github des différents projets pour savoir quelle valeur peut prendre cette variable "ADAPTER".
Notes générales durant le flash
- La batterie ne doit pas être connectée durant le flash.
- La console doit être alimentée via son port USB, via un port du PC par exemple.
- Avant de lancer une commande de flash faire un power cycle de la console (débrancher puis rebrancher le câble USB de la console) puis allumer la console et enfin maintenir power jusqu'à se que l'écran s'éteigne mais toujours maintenir power et lancer le script de flash jusqu'à se qu'il soit indiqué que le flash est en cours.
- En cas de problème sur une opération relancer la même en faisant un power cycle entre les commandes mais en aucun cas ne passer à l'étape suivante. Et si réellement ça ne fonctionne pas restaurer le backup, ceci devrait toujours fonctionner.
Le backup et le déverrouillage
Notons que le backup est unique à chaque modèle donc une fois qu'on a le backup du modèle sur lequel on travail il est le même pour toutes les autres consoles du même modèle, il ne sera donc pas forcément nécessaire de refaire le backup à chaque fois.
On commence donc par aller dans le répertoire game-and-watch-backup:
cd ~/gnw/game-and-watch-backup
Ensuite on exécute les scripts dans l'ordre indiqué, si il fonctionne on passe au suivant, sinon on recommence le script en cours. Il faut également bien lire se que demandent les scripts lorsqu'ils demandent quelque chose et suivre les instructions:
- ./1_sanity_check.sh stlink zelda
- ./2_backup_flash.sh stlink zelda
- ./3_backup_internal_flash.sh stlink zelda
- ./4_unlock_device.sh stlink zelda
- ./5_restore.sh stlink zelda
Pour sauvegarder et débloquer le modèle mario il suffit de remplacer "zelda" par "mario" dans les commandes. Une fois le script 4 exécuté la console est débloquée même si on change la mémoire.
Pour un programmateur différent du Stlink une liste de ceux-ci peut être obtenu en lançant le script 1 sans paramètre. Une fois la liste obtenue on remplace "stlink" par le nom du programmateur dans la ligne de commande.
Une fois le script 3 terminé avec succès je recommande de sauvegarder les fichiers présent dans le répertoire "backup" du dossier de game-and-watch-backup.
Je recommande, une fois le script 4 exécuté, d'exécuter le script 5 sans changer la mémoire histoire d'avoir toujours un élément fonctionnel.
Maintenant on peut changer la mémoire de la console si on le souhaite puis, si on souhaite restaurer la console dans l'état d'origine, on réexécute le script 5 (si mémoire de 64 MO ou plus il faudra ajouter "LARGE_FLASH=1 " sans les guillemets au début de la commande 5, attention à l'espace entre le 1 et la suite de la commande qu'il faut respecter). Cependant si on veut installer le patch pour le dual boot avec Retrogo il n'est pas nécessaire de restaurer le backup puisque celui-ci sera de toutes façons patché puis flashé durant le processus et si on utilise juste Retrogo en simple boot il n'est pas non plus nécessaire de restaurer la sauvegarde sur la nouvelle mémoire.
Si on a déjà fait un backup d'un modèle il n'est pas nécessaire d'exécuter les scripts 2 et 3.
Patch pour le dual boot ou Triple boot avec le portage de Zelda 3
En premier lieu il faut copier les fichiers obtenus lors du backup à la racine du projet, donc dans le dossier "game-and-watch-patch" (le faire via l'interface graphique, c'est aussi bien).
Ensuite on se rend dans ce dossier:
cd ~/gnw/game-and-watch-patch
On tape cette commande pour télécharger le SDK:
make download_sdk
On prépare ensuite les fichiers à flasher pour le dual boot avec Retrogo:
make PATCH_PARAMS="--device=zelda" LARGE_FLASH=1
Puis si tout se passe bien on flash:
make PATCH_PARAMS="--device=zelda" LARGE_FLASH=1 flash_patched
Attention dans les deux dernières commandes, si la mémoire fait moins de 64 MO le paramètre LARGE_FLASH=1 doit être retiré.
Attention dans les deux dernières commandes, si modèle mario on remplace "zelda" par "mario" dans la commande.
Mettre en place Retrogo
On va placer les roms dans les sous-dossiers du dossier "roms" se trouvant dans le dossier "game-and-watch-retrogo" (roms Megadrive dans le dossier "md", rome NES dans le répertoire "nes", etc...). Attention à la mémoire qui sera utilisée, il n'y a pas beaucoup de mémoire donc il faut tout de même être sélectif. Les roms ne doivent pas être compressées.
Une fois tout cela en place on se rend donc dans le dossier de Retrogo:
cd ~/gnw/game-and-watch-retrogo
On exécute ensuite la commande suivante pour un dual boot:
make -j8 EXTFLASH_SIZE_MB=60 EXTFLASH_OFFSET=4194304 INTFLASH_BANK=2 GNW_TARGET=zelda
Puis si tout se passe bien on flash le dual boot avec cette commande:
make -j8 EXTFLASH_SIZE_MB=60 EXTFLASH_OFFSET=4194304 INTFLASH_BANK=2 GNW_TARGET=zelda flash
Attention dans les deux dernières commandes, si on flash sur une mémoire différente de 64 MB (exemple donné ici) il faut adapter le paramètre "EXTFLASH_SIZE_MB" à la taille de la mémoire en prenant en compte que la mémoire pour le firmware fait 4 MB pour le modèle Zelda et 1MB pour le modèle mario donc soustraire cette valeur à la taille de la mémoire installée (par exemple pour une mémoire de 128 MB il faudra mettre le paramètre à 124 pour une console zelda et 127 pour une console mario).
Pour un simple boot les commandes sont les suivantes:
make -j8 EXTFLASH_SIZE_MB=64 GNW_TARGET=zelda
Puis si tout se passe bien on flash:
make -j8 EXTFLASH_SIZE_MB=64 GNW_TARGET=zelda flash
Pour adapter ces commandes à un modèle Mario il faut remplacer "zelda" par "mario" bien sûr.
Si souci avec le flash on peut tenter d'ajouter le paramètre EXTFLASH_FORCE_SPI=1 aux commandes, ceci n'est nécessaire qu'avec certains clone des programmateurs. On peut aussi tenter de remettre le firmware du programmateur à jour car parfois il se corrompt.