Fabrication d'une cartouche GameBoy programmable pas cher
Tester ses programmes dans un émulateur c’est bien, mais tester sur une véritable GameBoy c’est carrément mieux.
Pour cela, l’unique solution consiste à avoir une cartouche GameBoy programmable.
On en trouve facilement sur internet, avec une interface USB ou un slot SD, avec ou sans RTC etc… mais il faut avouer que les prix ne sont pas très attractifs !
Lors de mes recherches pour me procurer une telle cartouche, je suis tombé sur des articles de fabrication de cartouche GB DIY, il m’en fallait pas plus pour me motiver à faire ma propre cartouche.
Plusieurs méthodes de conception sont possibles, de la modification d’une véritable cartouche à la création complète d’une cartouche totalement custom.
J’ai évidemment choisi l’option la plus simple (et la moins onéreuse), c’est à dire sacrifier une cartouche de jeu pour la rendre programmable !
Modifications à apporter à une cartouche GB afin de la rendre programmable
Toutes les cartouches GB possèdent une mémoire qui contient le programme/jeu, mais cette mémoire ne peut pas être re-écrite (voir ci-dessous).
L’objectif va donc être de remplacer cette mémoire afin d’en mettre une qu’on pourra re-écrire facilement !
Mémoire ROM vs Flash
Pour être plus exact on devrait comparer ROM
(Read-Only Memory) et EEPROM
(Electrically-Erasable Programmable Read-Only Memory), la mémoire flash
étant un type d’EEPROM
.
Les cartouches sont équipées d’une mémoire ROM
. Comme le nom l’indique, il s’agit d’une mémoire accessible uniquement en lecture.
La mémoire flash
, vous la connaissez probablement déjà puisqu’on la retrouve dans tout un tas de périphériques/objets comme les clés USB, cartes SD, disques SSD etc…
Evidemment, cette mémoire permet un accès en lecture et en écriture.
Il existe différents types de boitier (package) pour toutes ces mémoires, mais dans les cartouches GB on va quasiment toujours trouver du SOIC
ou du SOP
(il s’agit de deux formats de montage en surface très similaires), généralement avec 32 broches mais aussi avec 44 broches pour les mémoires de 2Mo et 4Mo.
Dans le cas des cartouches GB, l’accès aux données est fait via une interface parallèle, c’est à dire qu’il y a un certain nombre d’entrées qui représentent l’adresse mémoire à atteindre (en binaire), et 8 sorties qui prendront la valeur présente à l’adresse mémoire demandée (toujours en binaire, donc 1 octet).
Si vous avez déjà lu mon précédent article, vous savez déjà cela, sinon vous pouvez aller le lire : Programmer une mémoire Flash (EEPROM) 32 broches avec un Arduino
Pour des boitiers équivalents, il s’avère que la répartition des broches des mémoires flash
est très similaire à celle des mémoires ROM
(voir le chapitre sur le remplacement de la ROM pour tous les détails).
De plus, on trouve des mémoires flash
avec des caractéristiques très proches des ROM
en terme de rapidité de lecture. Le tout étant d’avoir une mémoire au moins aussi rapide que la ROM
présente dans la cartouche.
Vous l’aurez compris, on va donc remplacer la ROM
par une mémoire flash
!
Pour le moment je vais faire en sorte de pouvoir extraire facilement la mémoire afin de la programmer avec mon programmateur fait maison à base d’Arduino.
J’ai donc choisi de me limiter aux boitiers DIP
et PLCC
qui ont le défaut d’être assez volumineux (surtout le DIP
) mais l’avantage d’être facilement manipulables en utilisant un socket adapté.
Choisir la bonne cartouche pour remplacer sa mémoire ROM
Comme dit ci-dessus, toutes les cartouches ont une ROM
, mais il est important de vérifier que le type de boitier est bien du SOIC
ou SOP
(ou un autre type que vous pourrez dessouder avec un simple fer).
Ceci dit, les cartouches qui n’ont pas ces types de boitier sont assez rares.
Maintenant il faut voir quels sont vos besoins. Avez-vous besoin de RAM
et/ou du RTC
? Quelle quantité de mémoire
souhaitez vous avoir ?
Afin de faciliter les recherches, je me suis permis de regrouper deux bases de données que j’ai trouvé sur internet afin de centraliser les infos et avoir un formulaire de recherche efficace et complet (ce que ne proposent pas les sources en question).
Voici donc ma version : Game Boy Cartridges
Evidemment, si vous souhaitez charger un jeu qui utilise de la RAM
et/ou le RTC
il faudra que votre cartouche programmable possède ces éléments. C’est pourquoi il est préférable de bien sélectionner votre cartouche !
Cartouches avec le RTC
Pour ce qui est du RTC
, excepté si vous voulez sacrifier une cartouche Pokémon (à partir de la seconde génération), vous risquez d’avoir un peu de mal à trouver votre bonheur.
Vous pouvez utiliser mon formulaire de recherche avec l’option RTC
pour trouver les jeux avec cette fonctionnalité.
Si vous souhaitez acheter une telle cartouche, faites attention à la version (release), si elle ne correspond pas exactement alors il n’y a probablement pas le RTC
!
Cartouches avec de la RAM
Concernant la RAM
, là vous aurez beaucoup de choix ! Le mieux étant d’ouvrir vos cartouches pour vérifier ce qu’elles ont dans le ventre.
Si votre cartouche possède de la RAM
, il faudra vérifier la référence de celle-ci afin de savoir sa taille.
La quantité maximale de RAM
qu’un jeu peut exploiter est de 128Ko avec un MBC5
(voir ci-dessous pour plus d’informations).
Quantité de mémoire max
Pour la quantité de mémoire, les ROM
vont de 32Ko à 8Mo mais il faut surtout regarder le Mapper
présent sur la cartouche.
Le Mapper
est optionnel et la taille maximale de la mémoire dépend de lui (idem pour la RAM
), voici la liste des mémoires max gérées par les différents Mapper
:
Mapper | ROM | RAM | RTC |
---|---|---|---|
None |
32Ko | Non | Non |
MBC1 |
2Mo | 32Ko | Non |
MBC2 |
256Ko | 512x4 bits | Non |
MBC3 |
2Mo | 32Ko | Oui |
MBC30 |
4Mo | 64Ko | Oui |
MBC5 |
8Mo | 128Ko | Non |
Il existe d’autres types de Mapper
mais ils sont bien plus rares. Les Mapper
de type HuC
sont similaires aux MBC
de même numéro.
MBC
signifie Memory Bank Controller
Qui peut le plus peut le moins, et heureusement puisqu’il semble impossible de trouver des mémoires flash
de plus de 512Ko en boitier DIP
ou PLCC
et fonctionnant sous une tension de 5V … (enfin, ça existe mais à 40$ pour 1Mo ça va pas le faire).
Personnellement j’ai des mémoires de 512Ko, je vais donc me limiter aux Mapper
1, 3 et 5 (ce sont clairement les plus répandus ^^).
Pour dépasser les 512Ko, il faudrait donc passer sur des boitiers TSOP
! Ce qui impliquerait de passer directement par la cartouche pour programmer la mémoire puisque les sockets TSOP
sont vraiment très volumineux et qu’il faudrait donc souder la mémoire flash dans la cartouche. Ca sera très certainement une évolution de ce projet, et donc un futur article :)
Pour le moment, je vais me contenter d’un bon vieux socket DIP32
avec une mémoire flash SST39SF040
.
Quoi qu’il en soit, l’objectif ici n’est pas de faire tourner tous les jeux GB existants, 512Ko ça sera largement suffisant pour tester mes propres programmes !
Matériel/Outils/Composants requis pour faire votre cartouche programmable
Pour commencer, il est préférable de vous procurer un tournevis (ou embout) 3.8MM Security Bit afin d’ouvrir les cartouches GB sans faire de dégâts et sans galérer.
Ensuite il vous faudra un bon fer à souder.
Personnellement j’ai un TS100 et je le recommande, il est vraiment top !
Et évidemment l’étain qui va bien avec éventuellement un peu de flux pour simplifier les soudures (en réalité il faudrait parler de brasage et non de soudure, mais on va pas se prendre la tête avec ça).
Comme vu précédemment, il faut un socket DIP32
! Pour être exact, il faut un socket DIP32-Wide
qui correspond bien à la largeur de la puce mémoire.
En effet, on retrouve deux largeurs dans les boitiers DIP
, 7.62mm (0.3”) et 15.24mm (0.6”).
Il faut donc sélectionner le bon socket, en l’occurrence 15.24mm (Wide).
Ceci dit, à partir du DIP32
il semble assez rare de trouver du 7.62mm.
Pour insérer ce socket dans la cartouche GB vous avez en gros deux possibilités :
- Utiliser un petit circuit imprimé coupé aux bonnes dimensions pour bien se caler dans la cartouche
- Laisser le socket en l’air et éventuellement tenter de le caler dans la cartouche
Dans les deux cas il faudra faire très attention à ne pas avoir de faux contact ou de court-circuit en positionnant le socket par dessus le circuit imprimé de la cartouche (vous pouvez utiliser par exemple un isolant comme du scotch d’électricien).
Personnellement j’ai ce qu’il faut pour faire un circuit imprimé à une face, c’est largement suffisant pour y souder le socket et faire les raccordements nécessaires.
Donc j’ai choisi la solution 1.
Alors évidemment le DIP32
est bien trop épais pour rentrer incognito dans une cartouche GB …
L’emplacement est donc vite vu puisqu’il peut rentrer qu’à un seul endroit, c’est à dire en haut de la cartouche en découpant la coque. Inutile de préciser qu’il faudra s’assurer que le placement soit assez haut pour permettre à la cartouche de s’insérer normalement dans la GB.
Dans une cartouche avec une pile (quasiment toutes celles qui ont de la RAM
et celles avec le RTC
), ça risque être un peu compliqué d’incruster le socket DIP32
… Il serait certainement plus simple de faire cela avec un socket PLCC32
(et une mémoire 29F040
), ça prendrait beaucoup moins de place !
Et pour finir, le fil !
Vu la taille des broches des boitiers SOP
et SOIC
, généralement moins de 0.5mm, il faut prévoir un fil assez fin pour arriver à faire un travail assez propre.
J’ai pris le plus petit que j’avais dans mon stock, à savoir du AWG30
(0.25mm²) et il s’avère que ce fil convient parfaitement pour ce projet !
Remplacer la ROM dans une cartouche GameBoy
Nous y voilà ! Il est temps d’attaquer le chantier !
Pour ma première tentative, j’ai décidé de sacrifier un jeu vraiment nul afin d’avoir aucun regret en cas d’échec.
Spoiler : J’ai réussi du premier coup ^^
Mon cobaye est donc le jeu Taxi 2 (CGB-BT2F-FRA) qui contient un mapper MBC5
avec une ROM MX23C8005
(1Mo en boitier SOP32
).
Donc pas de RAM ni de RTC, mais ce n’est pas bien grave, le but étant surtout de tester la manipulation afin de confirmer que ça fonctionne pour maximiser les chances de réussite lors des mes prochaines tentatives avec des cartouches plus intéressantes.
La procédure est assez simple : dessouder la ROM puis souder chaque fil de la mémoire flash à l’emplacement correspondant pour chaque broche.
Si vous possédez une station à air chaud pour dessouder la ROM tant mieux pour vous mais pensez bien à protéger les autres composants pour rien endommager (notamment la pile si vous en avez une).
Personnellement je n’ai pas encore de station à air chaud, je vais donc dessouder avec mon fer à souder.
C’est pas le plus pratique mais ça fonctionne bien en utilisant une petite aiguille à coudre pour soulever chaque patte une à une tant que l’étain est liquide.
Pour la correspondance des broches, il faut regarder le datasheet de la ROM (MX23C8005
dans mon cas), et comparer les placements avec votre mémoire flash, dans mon cas c’est une 39SF040
:
On constate 3 choses :
A18
a changé de placeA19
n’est pas présent sur la mémoire flash39SF040
- La broche
WE#
est présente uniquement sur la mémoire flash, ce qui s’explique facilement puisqu’il s’agit de la brocheWrite Enable
qui permet de gérer l’écriture (et pour rappel, la ROM ne permet pas l’écriture)
Pour A18
il suffit de souder le fil à l’emplacement correspondant.
Pour A19
inutile de le raccorder puisque ma mémoire flash fait seulement 512Ko et n’a donc pas besoin de ce 20ème bit d’adresse.
Et enfin pour WE#
, cette broche doit être à l’état haut pour le cycle de lecture (afin de se comporter comme la ROM), et vu que je prévois d’extraire la puce pour la programmer en dehors de la cartouche, j’ai décidé de relier cette broche directement à VCC
pour le moment.
Je l’ai pas indiqué avant mais Furrtek a déjà fait un article à ce sujet : Furrtek Cartouche Flash MBC1
Cependant, il est incomplet et il contient au moins une erreur.
En effet, d’après lui il faut relier WE#
à la broche 31 du connecteur de cartouche pour permettre la programmation. Alors oui ça lui permettra de faire la programmation, mais en fonctionnement normal ce n’est pas bon puisque cette broche 31 correspond à VIN
et qu’elle fournit rien de concluant, donc pas d’état haut ni d’état bas.
Enfin si, il y a une tension de 1.2V qui varie au rythme de la musique, j’ai pas essayé mais il est possible que ce soit un signal audio, dans le meilleur des cas ça serait interprété comme un état bas …
Donc en fonctionnement normal, WE#
serait dans un état incertain (probablement bas), ce qui n’est pas bon !
(Il y a une autre solution que je dois encore tester et qui devrait être bien plus propre, j’en parlerai dans un prochain article)
Voici donc le résultat :
J’avoue c’est pas très propre !! Faut dire que c’est surtout pour faire un prototype et confirmer que ça fonctionne.
N’oubliez pas d’isoler toutes les parties qui risqueraient de provoquer un court-circuit.
Sur la 3ème photo vous pouvez voir que j’ai utilisé du scotch d’électricien noir. J’ai fait en sorte que les soudures ne soient pas pointues afin de ne pas risquer qu’elles traversent le scotch !
Programmation de la mémoire et limitations à l’exécution
Comme indiqué plus haut dans l’article, pour le moment, je prévois d’extraire la puce de son socket pour la programmer avec mon programmateur fait maison.
Concernant les limitations, tout va dépendre de votre Mapper
et des composants présents sur votre cartouche.
Par exemple, si votre cartouche possède un MBC5
sans RAM
(comme ma cartouche de test), vous pourrez très bien faire tourner des programmes initialement prévus pour un autre MBC
tant que ce programme ne nécessite pas de RAM
Si vous avez de la RAM
, vous pourrez aussi faire tourner des programmes qui n’utilisent pas la RAM
mais vous pourrez évidemment faire tourner ceux qui en ont besoin, à partir du moment où vous avez une quantité de RAM
suffisante.
C’est évidemment valable aussi pour le RTC
.
Qui peut le plus peut le moins, mais l’inverse n’est pas possible, ne demandez pas à votre cartouche de faire quelque chose qu’elle est incapable de faire.
Conclusion
Même si cette solution n’est pas parfaite, elle reste très abordable, intéressante et surtout satisfaisante à réaliser !
Pour réaliser ce projet j’ai commandé 2 mémoires 39SF040
et 10 sockets DIP32
pour un total de 4.23€ frais de port compris sur aliexpress.
Les prix varient pas mal dans le temps mais ça vaut vraiment le coup ^^, il faut juste être patient car il faut généralement 1 mois pour la livraison.
Nul doute qu’il y aura une suite à cet article afin de présenter une évolution :)
Cependant, l’évolution nécessitera un peu plus de composants, rien que pour permettre de programmer la mémoire directement depuis la cartouche …
En attendant amusez vous bien et renseignez vous sur les prix des cartouches avant de les sacrifier, par exemple les jeux Pokémon coutent vraiment cher, ça serait dommage de les bousiller.