[WIP] Le hack de la Game & Watch

Salon dédié à vos tutoriels concernant la modification, le modding ou la réparation de vos consoles nintendo "Game and watch" anciennes et nouvelles génération.
Répondre
Avatar du membre
Sylver
Référent Technique
Référent Technique
Messages : 29
Enregistré le : sam. 1 oct. 2022 11:57

[WIP] Le hack de la Game & Watch

Message par Sylver »

Guide en cours de réalisation

Image
TODO : Compléter et ajout de belles photos pour rendre la chose presque agréable à lire

Difficulté

Image

Résultat attendu
En suivant ce tutoriel vous pourrez changer le contenu de votre G&W afin de lui installer un système modifié permettant de jouer à de nombreux jeux (G&W/GB/GBC/NES/SMS/GG/PC Engine/Megadrive/MSX/Watara Supervision/Atari 7800 et sûrement d'autres à l'avenir). Il vous sera possible (mais pas obligatoire) de garder le firmware d'origine, dans ce cas il faudra utiliser la combinaison de touches Game + Gauche pour basculer dans retro-go. Vous pourrez également changer le composant de mémoire flash d'origine (1 ou 4Mo) par un composant de plus grande capacité (entre 16Mo et 256Mo suivant votre budget et vos compétence en soudure, le meilleur compromis étant certainement la taille de 64Mo)

Matériel nécessaire
Il vous faudra le matériel nécessaire pour pouvoir mener à bien ce hack :
  1. Une Game & Watch Mario ou Zelda. La principale différence entre les 2 est la présence de boutons select et start sur la version Zelda. Ces boutons ne sont pas essentiels pour la plupart des systèmes émulés, cependant sur certains jeux MSX et sur la plupart des jeux Megadrive, la présence de ces boutons est potentiellement indispensable pour pouvoir profiter des jeux utilisants plus de 2 boutons de tir.
  2. Des tourne-vis (tri wing et classiques) pour pouvoir ouvrir la G&W et pour pouvoir sortir la carte principale en cas de changement de la mémoire flash à l'air chaud (en cas de remplacement par une mémoire 32/64/128 ou 256Mo)
  3. Un ordinateur sous linux (Ubuntu de préférence pour suivre ce tutoriel, mais une autre distribution est possible si vous savez ce que vous faites), cela fonctionne aussi très bien sur Mac (c'est ce que j'utilise perso), et il est possible de faire l'opération avec un Raspberry Pi, mais je ne vais pas couvrir ce cas dans ce tutoriel car c'est plus compliqué et le flashage est plus lent (4 fois plus lent à peu près)
  4. Un adaptateur USB<->JTAG de type ST-Link V2
  5. Un fer à souder (pour différentes choses)
  6. Une station de soudure à air chaud (en cas de remplacement par une mémoire 32/64/128 ou 256Mo)
  7. Du flux de soudure
  8. De la soudure (= brasure) au plomb de préférence, c'est plus facile à utiliser
  9. Du temps
  10. De la persévérance
Généralités
La Game & Watch version Mario et Zelda est sortie et une petite équipe s'est attelée à décortiquer cette console et à essayer d'en récupérer le contenu et surtout de le modifier ! Et ils ont réussi !
Quelques caractéristiques techniques importantes :
- CPU : STM32H7B0VBT6
- Résolution d'écran : 320x240
- Flash disponible : 2x256Ko de flash interne dans le STM32 (2x128Ko sont non documentés il faut une version patchée d'OpenOCD pour accéder à toute la flash interne) + de base 1Mo de flash serial NOR sur les Mario et 4Mo sur les Zelda

Le hack
Le hack de la G&W est un hack assez galère, il faut un ordinateur sous Linux ou MacOS et un adaptateur USB JTAG ST-Link v2 (ou alors un Raspberry Pi mais je n'en parlerai pas car je n'ai pas du tout expérimenté).
La complexité de ce hack réside dans le fait qu'il faut avoir à la fois une très bonne maitrise de Linux en ligne de commande, des environnements de compilation et de la soudure pour changer la puce flash d'origine. Tout au long du processus vous pourrez rencontrer de nombreuses difficultés, et afin de ne pas mélanger les sources de problèmes, et risquer de vous retrouver bloqué sans savoir ce qui fonctionne et ce qui ne fonctionne pas, je vous propose de faire les choses progressivement : d'abord une configuration de l'environnement logiciel, un backup du firmware d'origine, une compilation et flashage de retro-go avec la mémoire flash d'origine (1 ou 4Mo donc suivant le modèle de G&W), un changement de mémoire flash, de nouveau un flashage de retro-go, puis le grand saut vers la version "multi-boot" (= firmware d'origine légèrement patché + retro-go)

1) Mise en place de l'environnement logiciel sous Linux Ubuntu
Je pars du principe que vous avez un linux installé, un Ubuntu (22.04 dans mon cas)
Déjà il faut installer un certain nombre d'outils (il y en a que vous avez peut-être déjà mais ce n'est pas grave) :

Code : Tout sélectionner

sudo apt-get install binutils-arm-none-eabi python3 python3-pip libhidapi-hidraw0 libftdi1 libftdi1-2 make git wget
Ensuite il va falloir installer une version modifiée de openocd, c'est l'outil qui va nous permettre de communiquer avec la G&W via le jtag. Cette version patchée est nécessaire pour accéder à une partie non documentée de la flash interne du STM32 (la documentation dit qu'il y a 2x128Ko de flash interne, mais en réalité on peut avoir accès à 2x256Ko de flash interne et nous en auront besoin). Mettez vous dans votre répertoire de travail (par exemple GnW) :

Code : Tout sélectionner

mkdir GnW && cd GnW
Ensuite récupérer le package d'installation de la version patchée et installez-la :

Code : Tout sélectionner

wget https://nightly.link/kbeckmann/ubuntu-openocd-git-builder/workflows/docker/master/openocd-git.deb.zip
unzip openocd-git.deb.zip
sudo dpkg -i openocd-git_*_amd64.deb
sudo apt-get -y -f install
Ca ne remplacera pas la version standard de openocd si vous l'avez, ça installe la version patchée dans le répertoire /opt/openocd-git/bin/
Maintenant il faut installer le compilateur ARM, vous pouvez le télécharger sur cette page : https://developer.arm.com/tools-and-sof ... /downloads , la version "10-2020-q4-major" est celle qui fonctionne avec tous les repository, dans mon tuto je vais installer la dernière version disponible lors de la rédaction de ce tuto (10.3-2021.10) car j'ai fait les modifications nécessaires dans mon repository pour que ça fonctionne
On récupère donc le package et on le décompresse :

Code : Tout sélectionner

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
tar xjf gcc-arm-none-eabi-10.3-2021.10-x86_64-linux.tar.bz2
1bis) Mise en place de l'environnement logiciel sous macOS
Si vous avec un ordinateur sous macOS, il faudra suivre les étapes suivantes :
Si vous n'avez pas déjà installé brew, c'est le moment :

Code : Tout sélectionner

/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
Cela prendra un peu de temps, c'est normal.
Maintenant vous pouvez installer les librairies nécessaires :

Code : Tout sélectionner

brew install wget texinfo libtool automake pkg-config libusb hidapi
Il faut maintenant installer la version modifiée de openocd :

Code : Tout sélectionner

git clone https://github.com/kbeckmann/ubuntu-openocd-git-builder.git
cd ubuntu-openocd-git-builder/openocd-git
export PATH=/usr/local/opt/texinfo/bin:$PATH
make mac
cd openocd
sudo make install
cd ../../..
Ensuite il faut installer le SDK ARM:

Code : Tout sélectionner

wget https://developer.arm.com/-/media/Files/downloads/gnu/12.2.rel1/binrel/arm-gnu-toolchain-12.2.rel1-darwin-x86_64-arm-none-eabi.pkg
il faut alors lancer le .pkg depuis le finder et poursuivre l'installation.
Il reste à modifier le path.

Code : Tout sélectionner

export PATH=/Applications/ArmGNUToolchain/12.2.rel1/arm-none-eabi/bin/:/opt/openocd-git/bin:$PATH
Vous pouvez rendre cette modification durable en créant un fichier .zprofile (ou .bash_profile suivant votre version de macOS) dans votre home contenant la ligne export du dessus.

2) La sauvegarde du firmware d'origine et déverrouillage du processeur
Nous allons procéder à la sauvegarde du contenu de la mémoire flash d'origine. Cela permettra au passage de valider que la communication avec la G&W se passe bien ! Vous aurez besoin de la sauvegarde de la flash d'origine si vous voulez installer le "dual boot". Nous en reparlerons plus tard.

Pour effectuer cette sauvegarde, il faut utiliser les scripts disponibles ici : https://github.com/ghidraninja/game-and-watch-backup
En gros il faut suivre le contenu du readme, mais bon comme vous aimez bien qu'on vous tienne par la main, voici comment faire ::d
On commence par récupérer le code :

Code : Tout sélectionner

git clone https://github.com/ghidraninja/game-and-watch-backup.git
cd game-and-watch-backup
export OPENOCD="/opt/openocd-git/bin/openocd"
Ensuite il faut dérouler les commandes et suivre les instructions :

Code : Tout sélectionner

./1_sanity_check.sh stlink zelda (ou "./1_sanity_check.sh stlink mario" si votre G&W est un modèle Mario, dans ce cas il faudra remplacer ça sur toutes les commandes qui suivent)
Maintenant il va falloir connecter la console à l'ordinateur via le JTAG :
*TODO : ajouter les infos pour la connexion JTAG*
Lancez

Code : Tout sélectionner

./2_backup_flash.sh stlink zelda
et pendant plusieurs dizaines de secondes, ça va travailler ! Si vous avec une erreur directement, c'est peut-être que votre connexion jtag n'est pas bien branchée !
Si tout est ok, lancez la commande

Code : Tout sélectionner

./3_backup_internal_flash.sh stlink zelda
Encore une fois ça va travailler un peu, puis ça va vous demander de travailler :mrgreen:. Quand un message apparait, il faut suivre les instructions :
- Débranchez la batterie (il ne faut pas avoir le cable USB de charge branché sinon ça ne fonctionnera pas)
- Rebranchez la batterie, appuyez sur le bouton power sans le relâcher ! L'écran devrait être bleu. Si à la place vous avez l'écran de démarrage de votre G&W, alors il faudra, sans relâcher le bouton power, appuyer sur le bouton time, l'écran devrait alors être bleu.
- Appuyez sur entrée et quelques secondes après ça sera bon
Vous pouvez entrer la commande suivante :

Code : Tout sélectionner

./4_unlock_device.sh stlink zelda
Optionnel : vous pouvez restaurer le firmware dans la flash pour remettre la console en état fonctionnel, mais n'utilisez pas cette commande pour essayer de restaurer le firmware d'origine après avoir mis une flash plus grande, ça ne fonctionnera pas (en fait ça marche sur les flash jusqu'à 16Mo je crois mais au dessus de cette taille vous aurez un message d'erreur et ça sera normal).

Code : Tout sélectionner

./5_restore.sh stlink zelda
Image
Bravo vous avez réussi là toute première étape ! Plus que 15 (non je rigole :mrgreen:)
A partir de maintenant vous pouvez changer la mémoire flash, mais pour le 1er essai on va s'entrainer sur la mémoire flash d'origine pour être certain que la partie compilation/flashage fonctionne bien.
Une petite info : le firmware est le même sur toutes les consoles d'un même modèle : toutes les éditions mario ont le même firmware et pareil pour les éditions zelda. Si vous avez déjà récupéré le firmware d'une édition et que vous voulez en hacker une autre console de la même sorte, vous pourrez vous contenter de directement lancer l'étape 4.

3) Flashage de retro-go
retro-go est l'environnement qui a été utilisé pour l'intégration de nouveaux jeux dans la G&W !
Il a été développé à l'origine par un développeur appelé ducalex pour les consoles ODROID-GO et utilisé par kbeckman comme base pour la G&W ! Il a cependant retiré quelques émulateurs qui ne tournaient pas bien sur la G&W (un émulateur Lynx et Snes).
De base nous avons donc eu ces consoles supportées par la G&W :
- Colecovision
- Game Boy et Game Boy Color
- NES
- Game & Watch
- Sega Master System
- Sega Game Gear
- Sega SG-1000
- PC Engine

Par la suite plusieurs systèmes ont été ajoutés :
- Watara Supervision (ajouté par moi même)
- MSX 1/2/2+ (ajouté par moi même)
- Atari 7800 (encore ajouté par moi même)
- Genesis (Ajouté par un breton appelé bzhxx, j'ai participé de façon mineure à ce projet : ajout des savestate et correction de problèmes de cohabitation avec les autres émulateurs)

J'ai aussi essayé d'ajouter d'autres systèmes (pico-8, Wonderswan Color) mais les performances étaient trop mauvaises ou le portage ne s'est pas bien passé. J'ai quelques autres choses de prévues, mais vous verrez bien si ça abouti un jour !

Quelques liens :
- https://github.com/kbeckmann/game-and-watch-retro-go : le repository officiel de kbeckman, malheureusement il n'est plus maintenu car kbeckman n'a plus trop le temps de s'occuper de ça
- https://github.com/olderzeus/game-and-watch-retro-go : un fork du repository officiel qui ajoute pas mal d'amélioration (dont les miniatures), c'est plus ou moins devenu le repository officiel car kbeckman a demandé aux développeurs de travailler avec cette base. La plupart de mes modifications sont disponibles dans des branches sur ce repository
- https://github.com/bzhxx/game-and-watch-retro-go/ : le repository de bzhxx qui contient les dernières évolutions de son émulateur genesis, il peut y avoir des soucis de cohabitation avec d'autres émulateurs
- https://github.com/sylverb/game-and-watch-retro-go : mon repository avec mes dernières évolutions, c'est en gros celui le plus à jour en général

Après toute cette lecture, nous allons passer aux choses sérieuses : installer retro-go ! Pourquoi ne pas directement changer de flash et installer le dual boot ? Tout simplement parce que retro-go propose un écran au moment de la procédure de flashage qui vous permettra d'avoir quelques informations utiles en cas de soucis (ça sera particulièrement utile si ça ne fonctionne pas après le changement de flash, mais nous y reviendrons).
Je vais prêcher pour ma paroisse et vous conseiller d'utiliser mon repository retro-go. Je ne vous dis pas ça parce que j'y gagne quelque chose, juste parce que mon repository a quelques avantages que n'ont pas encore les autres : j'intègre quelques modifications utiles comme un patch qui permet d'avoir l'heure/date de la console dans les jeux GB (indispensable pour certains jeux GB Pokemon qui s'appuient sur l'évolution du temps pour la progression dans le jeu), des évolutions pour rendre le tout compatible avec les dernières versions du compilateur ARM, et plein de petites améliorations discrètes mais bien utiles ;)
Donc pour récupérer le code de mon repository, il faut retourner dans le répertoire de travail et lancer le clone :

Code : Tout sélectionner

cd ..
git clone --recurse-submodules https://github.com/sylverb/game-and-watch-retro-go
cd game-and-watch-retro-go
Ensuite il faut lire attentivement le fichier readme et suivre les indications de celui-ci ! Encore une fois je vais vous tenir par la main :hello:

Il va maintenant vous falloir mettre quelques roms dans le répertoire roms du répertoire. Les roms ne doivent pas être compressées, et il faut les ranger dans les répertoire correspondant à la console qui correspond (répertoire roms/gb pour les jeux GB/GBC, roms/nes pour les jeux nes, roms/md pour les jeux megadrive, ...)

TODO : parler de la génération des roms de jeux G&W classiques

faites attention à ne pas mettre trop de roms, vous n'avez que quelques Mo de place dans la G&W et le but est juste de valider que vous arrivez à compiler et à flasher retro-go ! Donc une fois que vous aurez mis une ou quelques petites roms dans les bon répertoires, il faudra lancer ces commandes :
Si vous êtes sous macOS seulement, lancez cette commande :

Code : Tout sélectionner

make download_sdk
Sur tous les systèmes, il faut lancer ces commandes :

Code : Tout sélectionner

python3 -m pip install -r requirements.txt
export OPENOCD="/opt/openocd-git/bin/openocd"
export GCC_PATH="/home/$USER/GnW/gcc-arm-none-eabi-10.3-2021.10/bin/"
make -j8 EXTFLASH_SIZE_MB=4 GNW_TARGET=zelda flash
Si vous avez une version mario il faudra remplacer la dernière commande par

Code : Tout sélectionner

make -j8 EXTFLASH_SIZE_MB=1 GNW_TARGET=mario flash
Je reviendrais plus en détail sur les options de la commande make, car il y en a beaucoup d'autres que nous utiliserons plus tard !
La compilation devrait se dérouler et se terminer par un flashage de retro-go ! Si jamais le flashage échoue alors que la console est allumée et que tout devrait fonctionner, alors relancez la dernière commande en laissant le bouton power appuyé (tentez 2 fois pour être sûr de partir au moins une fois de la position éteinte)
ImageImage

Voilà si tout va bien, vous venez de flasher votre premier retro-go !


Le changement de flash
L'opération consiste à enlever le composant CMS de mémoire flash (1 ou 4Mo suivant les modèles de G&W) et à le remplacer par un composant de plus grande capacité. Il y a en gros 3 niveaux de difficultés :
- Les puces de 16Mo qui ont exactement le même format que la puce d'origine avec de belles pattes bien visibles, ça peut se faire au fer à souder. Les composants sont disponibles pour quelques euros sur aliexpress
- Les puces de 32 ou 64Mo qui n'ont pas de pattes, il vaut mieux utiliser une station de soudure à l'air chaud pour faire ça. Il parait que certains y arrivent au fer à souder, mais il faut une très bonne technique et des panes adaptées ... La référence des 64Mo est MX25U51245GZ4I00 et il se trouve sur aliexpress pour environ 5€.

- Les puces 128 ou 256Mo. Là c'est pour les habitués, le composant est en BGA, c'est à dire qu'il a des petites billes en dessous. Clairement ça ne se soude pas directement dans la G&W, il faut un adaptateur pour pouvoir l'installer dedans ! Le référence des 256Mo est MX66U2G45GXRI00, par contre le composant est difficile à trouver (pas la peine de le chercher sur aliexpress) et il faut compter 60€ hors frais de port pour espérer en avoir. Les adaptateurs sont disponibles sous forme de fichier gerber ici : https://github.com/DNA64/bga24-to-sop8-adapter
Une petite vidéo d'installation :


Le multi-boot
A compléter : c'est pour permettre de garder le firmware d'origine en plus de retro-go, pour les impatients la plupart des indications sont ici : https://github.com/BrianPugh/game-and-watch-patch
Les pièges qui pourraient vous pourrir la vie (j'ai testé pour vous avant, je vous dévoile mes secrets :mrgreen:) :
- Si vous avez compilé retro-go en mode non multi-boot, il faut faire un make clean avant de compiler avec les options pour le multi-boot, sinon vous aurez des trucs bizarres lors de la programmation de la console
- Pour la programmation de la console, il faudra démarrer la console en laissant le bouton power appuyé (aussi bien pour le firmware d'origine patch que pour retro-go), sans cela la programmation ne se lancera pas

Les trucs et astuces
- Si vous démarrez la console avec le bouton time appuyé, vous démarrerez sur le menu principal (utile si pour une raison ou une autre la console plante en essayant de démarrer le dernier jeu lancé)
- Si vous éteignez la console en cours de partie avec le bouton pause appuyé, l'état de la partie ne sera pas enregistré !

FAQ
Comment faire pour ne pas embarquer tel ou tel émulateur pour économiser de la place ?
En fait même si tous les émulateurs sont en apparence compilés (ça va changer prochainement), en réalité au final seul les émulateurs vraiment utilisés sont intégrés dans la Game&Watch, donc il n’y a rien à faire, s’il n’y a pas de roms nes, ne compilateur NES ne sera pas chargé dans la console


TODO : ajouter schema de sauvetage en cas de pistes arrachées
Modifié en dernier par Sylver le dim. 7 janv. 2024 11:16, modifié 23 fois.
Avatar du membre
Xrider
Administrateur
Administrateur
Messages : 3625
Enregistré le : sam. 14 sept. 2019 10:47
Localisation : MaskRom
Contact :

Re: [WIP] Le hack de la Game & Watch

Message par Xrider »

:super:
Merci pour ta qualité rédactionnelle ;)

Ce tuto éclaircit clairement les choses sur le hack de la Game & watch ! On en apprend aussi plus sur le multi boot.

Impatient de voir les photos qui illustreront ton tuto ;)

Good Job :super:
Avatar du membre
Xrider
Administrateur
Administrateur
Messages : 3625
Enregistré le : sam. 14 sept. 2019 10:47
Localisation : MaskRom
Contact :

Re: [WIP] Le hack de la Game & Watch

Message par Xrider »

Merci pour la mise a jour Sylver ;)
Avatar du membre
landsat
Référent Technique
Référent Technique
Messages : 38
Enregistré le : ven. 1 avr. 2022 08:58

Re: [WIP] Le hack de la Game & Watch

Message par landsat »

Truc de fouuuuuuuuuuuuuuuuuuuuu

trop beau, tu corriges mes DST de philo ?
Avatar du membre
Chris®
Administrateur
Administrateur
Messages : 799
Enregistré le : dim. 27 mars 2022 21:35

Re: [WIP] Le hack de la Game & Watch

Message par Chris® »

:super: :super:

:merci: :merci:
Avatar du membre
amiral-_-sega
Delta User Lv1
Delta User Lv1
Messages : 22
Enregistré le : jeu. 22 sept. 2022 10:14

Re: [WIP] Le hack de la Game & Watch

Message par amiral-_-sega »

Super intéressant , est ce que le "full set " GW passe dans la mémoire d'origine ?
Avatar du membre
landsat
Référent Technique
Référent Technique
Messages : 38
Enregistré le : ven. 1 avr. 2022 08:58

Re: [WIP] Le hack de la Game & Watch

Message par landsat »

NOn ça passe pas.

De base la Zelda il y a 4mo, donc tu vas devoir faire des choix.
Avatar du membre
amiral-_-sega
Delta User Lv1
Delta User Lv1
Messages : 22
Enregistré le : jeu. 22 sept. 2022 10:14

Re: [WIP] Le hack de la Game & Watch

Message par amiral-_-sega »

Ok merci , sous Mac OS tu passes par le terminal comme sur ton tuto pour Linux ?
Avatar du membre
landsat
Référent Technique
Référent Technique
Messages : 38
Enregistré le : ven. 1 avr. 2022 08:58

Re: [WIP] Le hack de la Game & Watch

Message par landsat »

Oui je pense, j'ai pas de mac.
Avatar du membre
Sylver
Référent Technique
Référent Technique
Messages : 29
Enregistré le : sam. 1 oct. 2022 11:57

Re: [WIP] Le hack de la Game & Watch

Message par Sylver »

amiral-_-sega a écrit : jeu. 17 nov. 2022 11:40 Ok merci , sous Mac OS tu passes par le terminal comme sur ton tuto pour Linux ?
Oui c’est en ligne de commande, ce qui change c’est essentiellement la façon d’installer les packages dont on a besoin.
Avatar du membre
Seb_48
Contributeur Lv1
Contributeur Lv1
Messages : 47
Enregistré le : dim. 12 déc. 2021 09:09
Localisation : Nord

Re: [WIP] Le hack de la Game & Watch

Message par Seb_48 »

Ca tombe à point nommé!!! :D Certaines personnes offrent leurs services pour hacker ces petites machines mais je me suis posé la question sur la procédure à suivre.. Une méthode complète et illustrée serai un moyen pour clarifier tout ça. :cote:

Et Sylver nous l'apporte :super:

Bonne continuation ^^
Avatar du membre
Kr4ken
Modérateur
Modérateur
Messages : 930
Enregistré le : mar. 19 avr. 2022 06:20
Localisation : Istres (13)

Re: [WIP] Le hack de la Game & Watch

Message par Kr4ken »

Yay !! :ghee:

Bravo pour ce joli tuto ! :super: :super: :super:

Déçu par contre de ne plus avoir de machine sous linux depuis qques années maintenant, a moins que je récupère un ordi du conseil général d'un des mioches et que je lui dump un ubuntu léger :mrgreen:

On verra quand j'aurai un peu éclairci tout ce que j'ai sur le feu.

Bruno
Kr4ken
Répondre

Retourner vers « Nintendo - Game and Watch »