Plus de détails qu’il n’en faut sur le fonctionnement des cartouches Game Boy
(abc.decontextualize.com)- La création directe d’une cartouche Game Boy a nécessité des années de recherche et de conception
- Cet article rassemble de façon structurée, du point de vue d’un débutant, les principales informations techniques nécessaires pour fabriquer une cartouche Game Boy personnalisée
- La Game Boy est une plateforme attrayante pour la communauté du développement de jeux rétro et du hardware hacking, grâce à une architecture matérielle simple mais très extensible
- Les cartouches peuvent embarquer des données de jeu et du matériel supplémentaire (par ex. RTC, capteurs, etc.), ce qui permet d’ajouter de nouvelles fonctions à la Game Boy
- Le circuit de contrôleur de banque mémoire (MBC) permet d’étendre la capacité et d’accéder sélectivement à la mémoire, ouvrant la voie à différentes méthodes d’exécution des jeux
Introduction et objectifs
- L’auteur s’est fixé comme objectif personnel de fabriquer une cartouche Game Boy entièrement de zéro
- Il a organisé puis publié en open source ses connaissances sur la structure interne et le fonctionnement des cartouches Game Boy
- Le but de l’article est de réorganiser des informations techniques difficiles afin qu’elles restent accessibles à tous, du point de vue d’un débutant
- L’explication se concentre non pas sur le fonctionnement interne du matériel, mais sur son comportement observable de l’extérieur
- Les explications prennent comme référence le SoC de la DMG (Game Boy d’origine), même si l’interface de cartouche de la famille Game Boy reste globalement similaire
Ce qui rend la plateforme Game Boy spéciale
- La Game Boy est facile à appréhender mentalement, autant côté matériel que logiciel, grâce à sa simplicité et à l’intuitivité de sa conception
- Ses caractéristiques de portabilité et de faible consommation, ainsi que l’absence de protections complexes ou de verrouillage régional, permettent à tout le monde de développer dessus
- Il existe une grande richesse de documentation technique, schémas matériels et ressources issues de la communauté
- Les bibliothèques de jeux officielles et non officielles sont immenses, et les toolchains open source comme les outils de scripting visuel sont activement maintenus
- L’écosystème est très extensible, avec non seulement du matériel réel, mais aussi des émulateurs précis et des implémentations FPGA
Structure de base d’une cartouche Game Boy
- Sur les anciennes consoles, la frontière entre logiciel et matériel est souvent floue
- La Game Boy ne dispose ni de système d’exploitation ni de stockage non volatil intégré. Tout le code exécutable et le matériel additionnel se trouvent dans la cartouche
- Cela signifie que la cartouche doit être pleinement fonctionnelle pour que la Game Boy puisse démarrer et fonctionner
- Le connecteur de bord à 32 broches situé en bas de la cartouche constitue l’interface centrale d’échange de signaux avec la console
- Entre la cartouche et la console, les signaux se répartissent en alimentation, contrôle (lecture/écriture/sélection de puce), bus d’adresses (16 bits) et bus de données (8 bits)
Bus et principe de fonctionnement
- Un bus est une structure dans laquelle plusieurs composants partagent les mêmes lignes de signal afin de transmettre des données
- Le CPU de la Game Boy place l’adresse souhaitée sur le bus d’adresses et les données sur le bus de données
- Comme cette structure de bus est parallèle, il existe physiquement une broche pour chaque bit
- C’est avantageux en termes de vitesse, mais comme le bus est partagé, il existe un risque de conflit / contention (écriture simultanée)
- Si plusieurs circuits intégrés émettent des données en même temps, cela peut provoquer un court-circuit (avec risque de surchauffe et de panne) ; un seul circuit intégré doit donc toujours être actif à la fois
Principales catégories de mémoire de la Game Boy
- La Game Boy peut accueillir jusqu’à quatre types de circuits mémoire (RAM interne, VRAM, ROM de cartouche, RAM de cartouche)
- En pratique, la VRAM utilise un bus indépendant et est donc généralement exclue des explications de base
- L’ensemble RAM interne / RAM de cartouche / ROM de cartouche partage le même bus d’adresses et le même bus de données
- Une seule puce à la fois doit impérativement effectuer des opérations de lecture ou d’écriture sur le bus de données
- En pratique, on parle aussi de RAM interne (WRAM), RAM de cartouche (SRAM), RAM vidéo (VRAM) et RAM haute vitesse (HRAM)
Chip Select et structure des circuits
- Chaque puce mémoire possède une broche de sélection de puce (CS/CE, Chip Select/Chip Enable)
- Selon l’état de ce signal, seule une puce donnée peut accéder au bus de données
- Pour gérer cette sélection, la Game Boy réutilise les trois bits de poids fort du bus d’adresses (A15, A14, A13) ainsi que la broche _CS du CPU
- Cette connexion garantit que deux puces ou plus ne peuvent pas être activées simultanément
- Par exemple, la puce ROM n’est activée que lorsque A15 vaut 0, tandis que la RAM est activée via une logique distincte
Carte mémoire (Memory Map) et point de vue du programmeur
- Les états matériels des adresses et des broches sont abstraits, et le programmeur ne voit qu’une carte mémoire logique
- Dans l’espace d’adressage 16 bits, la plage 0x0000–0x7FFF correspond à la ROM de cartouche, 0xA000–0xBFFF à la RAM de cartouche, et 0xC000–0xDFFF à la RAM interne
- Lorsqu’une adresse donnée est accédée, la plage mémoire voulue est automatiquement activée tandis que les autres sont désactivées
- Les cartes mémoire constituent une référence essentielle dans la documentation Game Boy
Contrôleur de banque mémoire (MBC ; Memory Bank Controller)
- Le MBC est le circuit clé qui permet, sur les cartouches Game Boy, d’utiliser plus de 32 KB de ROM et de connecter de la RAM ou des périphériques supplémentaires
- Plusieurs types de MBC ont été commercialisés, mais l’article s’appuie ici sur le MBC5, relativement simple et polyvalent
- Le MBC5 prend en charge jusqu’à 8 MB de ROM et 128 KB de RAM de cartouche grâce à une technique de banking
- Il permet aussi le contrôle d’accès à la RAM et le pilotage de matériel distinct comme des capteurs externes ou une RTC
- Parmi les broches d’adresse de la ROM de cartouche, les bits de poids fort (A22~A14) sont contrôlés dynamiquement par le MBC5, tandis que les bits inférieurs sont reliés directement au bus d’adresses de la console
Principe du banking ROM
- Le CPU de la Game Boy dispose d’un espace d’adressage maximal de 64 KB, mais en pratique il n’utilise que 32 KB (16 KB + 16 KB) pour l’accès à la ROM
- Le MBC5 contrôle directement les adresses hautes de la ROM (sélection de banque) afin de mapper, par blocs de 16 KB, la zone souhaitée dans l’espace d’adressage du CPU
- Au niveau matériel, les 14 bits de poids faible du bus d’adresses du CPU (A0~A13) sont reliés directement à la puce ROM, tandis que les autres proviennent du MBC5
- Pendant l’exécution réelle du jeu, lorsqu’un logiciel écrit une valeur à une adresse mémoire spécifique, le MBC le détecte et met à jour en interne la banque sélectionnée
Protocole et mécanisme du MBC
- Le MBC5 détecte des combinaisons spécifiques d’adresses et de signaux de contrôle pour effectuer des opérations comme la sélection de banque ROM, la sélection de banque RAM, ou l’activation/la désactivation d’autres fonctions
- Par exemple, lors d’une opération d’écriture dans la zone où A15=0, A13=1, A14=0 (0x2000~0x3FFF), la valeur placée sur le bus de données est enregistrée comme numéro de banque ROM
- Pour le programmeur, le changement de banque n’est donc pas codé comme un contrôle bas niveau du circuit, mais simplement comme une écriture de données à une adresse donnée
- L’utilisation de la RAM de cartouche, des capteurs, de la RTC, etc., se contrôle selon un schéma comparable
- Cette réutilisation du bus permet de réduire le nombre de composants et d’abaisser les coûts
Conclusion et utilité pour la communauté
- La particularité de l’architecture des cartouches Game Boy tient à son faible coût, sa grande fiabilité et son extensibilité
- Pour fabriquer soi-même une cartouche, une compréhension précise de cette structure et de ces protocoles est indispensable
- En s’appuyant activement sur la communauté et sur l’abondante documentation disponible, il est possible de réduire fortement la barrière d’entrée du développement matériel-logiciel intégré
Références et pistes d’apprentissage complémentaires
- L’article Game Boy/Game Boy Color Architecture de Rodrigo Copetti
- La documentation technique de gbdev.io et des Pan Docs
- Divers schémas de cartouches open source et toolchains (par ex. GBDK, RGBDS, etc.)
- Exemple de projet réalisé soi-même : abc.decontextualize.com
(Dans la seconde moitié de l’article original, d’autres éléments plus complexes sont également abordés, comme des variantes de design du MBC, l’EEPROM / la mémoire flash, des circuits d’entrée/sortie et l’intégration de périphériques, mais les points ci-dessus constituent le cœur du fonctionnement des cartouches Game Boy.)
1 commentaires
Avis Hacker News
Je veux partager mon expérience avec le TI TXB0108 : grâce à la détection automatique du sens, on pourrait croire qu’il n’est pas nécessaire d’ajouter une logique de direction, mais en pratique je ne recommande pas son utilisation. En présence de bruit électrique, le sens peut s’inverser et une entrée devenir une sortie ; selon les cas, l’appareil encaisse, ou bien on obtient de la fameuse « fumée magique ». Avec vraiment peu de chance, cela peut même déboucher sur un incident en milieu industriel. Je pense que ce type de composant cache trop de risques pour être autant mis en avant : il ne faut l’utiliser que si l’on connaît précisément ses modes de défaillance ou s’il n’existe pas d’autre solution.
Ces composants sont vraiment imprévisibles. Il suffit parfois d’une ou deux pouces de piste sur la sortie, voire juste d’un connecteur, pour que le ringing de sortie provoque fréquemment une inversion automatique de direction. C’est pratiquement inutilisable sans être spécialiste, alors que c’est justement dans des contextes où l’on aurait envie de s’en servir qu’il devient difficile à employer.
J’ai déjà vu ce composant basculer de direction en permanence à très haute vitesse, en produisant un bruit et des oscillations sévères. Il y a aussi pas mal de contraintes liées aux pull-down, mais quand les deux côtés étaient tirés dans la même direction, ça se passait à peu près correctement.
En procrastinant sur autre chose, j’ai noté quelques points à la première lecture du design abc-pcb.pdf
Je me dis que j’aurais vraiment aimé avoir cet article à l’époque où je fabriquais des cartouches custom.
Dans mon jeu Cubeat, j’ai branché une puce OPL3-L sur l’entrée audio du GB pour faire de la musique FM, et la logique MBC n’utilise que des circuits logiques unitaires de la série 7400.
J’aimerais vraiment le terminer et le sortir un jour ; implémenter ce genre d’astuces étonnantes sur GB est une expérience très amusante.
Infos sur Cubeat
C’est exactement à ce niveau de détail que je voulais comprendre la structure des cartouches Game Boy.
L’idée que les cartouches Game Boy fournissent avec l’application à la fois la RAM et l’espace disque est fascinante ; quand on y pense, c’est logique aussi.
Je me demande si, si les téléphones avaient fonctionné comme ça, on aurait pu tous les quelques années acheter une nouvelle cartouche pour faire tourner des applis plus puissantes à mesure que les puces progressaient, ou même brancher une nouvelle antenne pour les mettre à niveau.
Les téléphones modulaires ont été proposés depuis longtemps, mais ce n’était ni pratique ni vraiment utile. Connecter tous les composants via des sockets augmente la latence entre puces et réduit la fiabilité, ce qui est encore pire pour un appareil secoué toute la journée dans une poche.
En pratique, ce n’est pas qu’un seul élément d’un téléphone qui vieillit : on veut généralement améliorer à la fois l’appareil photo, l’écran, le CPU, la RAM, la batterie, etc. Dans ce cas, mieux vaut simplement acheter un nouveau téléphone plutôt que remplacer les éléments un par un ; le principal gain à tout changer séparément, c’est au mieux d’économiser le prix de la coque.
On discute d’un système de hot patch de ROM pour microcontrôleurs, et pour cette raison l’avantage d’une structure où toute l’appli est embarquée dans la puce et s’exécute immédiatement est très clair. Mais les besoins des utilisateurs changent sans cesse, donc tout devient de plus en plus complexe.
C’est clairement une bonne idée, mais je me demande si les performances matérielles de l’appareil hôte ne deviendraient pas vite la limite.
On peut mettre de la RAM plus rapide dans la cartouche, mais rien ne dit que la carte existante saura en tirer parti correctement.
Même si l’on pouvait brancher un stockage plus rapide, si le matériel en face reste le même, il n’est pas certain que l’effet réel soit significatif.
J’imagine même le cas où l’on brancherait aussi l’appareil photo.
À propos de l’idée qu’en développant du logiciel custom Game Boy il n’est pas nécessaire de contourner de protection anticopie ou de verrouillage régional au niveau matériel : quelqu’un demande s’il ne faut pas quand même passer la vérification du logo.
RGBFIX) peut insérer automatiquement.Et après l’arrêt Sega v. Accolade, ce type de vérification par titre n’est en pratique plus juridiquement contraignant, donc il n’y a pas de véritable obstacle de contournement.
C’est dommage que devrs.com, un site de référence GB que je consultais autrefois, ne soit plus maintenu. La plupart des liens sont déjà morts, mais c’était un site plein de projets inspirants.
La vidéo Ultimate Game Boy Talk (conférence 33c3) vaut aussi le détour.
Ultimate Game Boy Talk - 33c3
Ma version de Pokemon Blue est passée dans la machine à laver puis dans le sèche-linge il y a 20 ans, et elle fonctionne encore parfaitement. C’est un matériel vraiment robuste. Je me demande si une carte SD survivrait à ce traitement.
Je me suis mis à KiCad et au design PCB ce mois-ci pour le plaisir, et je me demande s’il existe des cas où quelqu’un a recréé l’intégralité du PCB de la Game Boy originale avant de le publier en open source.
Une entreprise appelée FunnyPlaying fabrique et vend ses propres PCB pour GBC et GBA, mais il est difficile de trouver une version open source.
Le GitHub de nataliethenerd contient un projet de rétro-ingénierie CGB, mais sa licence interdit l’usage commercial.
La description indique : « schéma CGB reconstitué à partir d’un scan, poncé, puis redessiné en utilisant une carte CGB-CPU-04 ; pour les valeurs, se référer au schéma original ».
Je serais aussi curieux d’avoir des recommandations de ressources utiles pour la conception de PCB.