[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 Game And Watch Mario

Pin out du modèle Mario avec une vue différente:
Autre vue du pin out du Game And Watch Mario

Pin out du modèle Zelda:
Pin out du Game And Watch 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.