GameBoy – Projet – DevCart32k – Partie 1

la cartouche DevCart32k, à gauche protoype maison, à droite version OSH Park

Écrit par

dans

,

INTRODUCTION

C’est rétro, c’est confort et c’est pas cher. C’est une cartouche qu’on insère dans la GameBoy et qui contient un bootloader en ROM, de la RAM, un bouton reset et un switch.

Le switch remplace la ROM par la RAM. Quel intérêt? On peut y écrire un nouveau programme IN SITU par simple transfert, à condition d’avoir un bootloader.

Pour ce faire, un programme côté PC communique avec ledit bootloader et se charge du transfert par le port parallèle. Ca va vite, quelques secondes.

L’avantage, en plus de la vitesse, c’est que ça tourne en réel sur le hardware, juste PC + GameBoy et un câble.

Bon, je préviens tout de suite, c’est limité à 32k pour le moment, mais j’ai des MBC5 en réserve…

Voici une petite démo qui charge mon programme de Terminal Série sans quitter l’IDE:

Allez, entrons dans le vif du sujet.

PARTIE 1 – Présentation

Le but du jeu est que la GameBoy télécharge toute seule son programme par le GamePort. Voici ma solution:

  • On connecte la GameBoy au PC par le port parallèle.
  • Le PC lance son programme de transfert, appelons le PPsend. Il envoie son Hello et attend celui de la GB.
  • La GB démarre sur le bootloader en ROM de la cartouche, qui envoie un Hello à PPsend.
  • PPsend répond Je suis là, je vais t’envoyer un prog.
  • Le Bootloader installe ses routines en RAM INTERNE de la GB, c’est à dire en $C000, et continue son éxécution là-bas, à l’abri du changement mémoire qui va s’effectuer (sinon il se ferait zapper la gueule direct). Dès lors, il attend qu’on ait switché la cartouche sur la RAM avant de poursuivre.
  • On switche donc. Ce qui était avant de la ROM (enfin, une EEPROM plutôt) devient de la RAM (pour ceux qui ont déjà deviné, on envoie plus A15 à l’EEPROM, mais à la RAM). Afin de gagner du temps, pas besoin d’informer le bootloader (celui qui est maintenant en $C000, ok?) qu’il peut démarrer le transfert, car…
  • … ce dernier est déjà en train de tester si le switch a été effectué. Comment? En essayant d’écrire un octet dans ce qu’il espère être maintenant de la RAM. Il boucle tant que ce qu’il a lu n’est pas ce qu’il a écrit.
  • Dès que le switch est détecté, le transfert démarre donc tout seul. L’écriture est beaucoup plus rapide que de la programmation d’EEPROM ou une copie sur SDCard. Forcément.
  • Le bootloader n’a plus qu’à passer la main à la fin du transfert. C’est comme si on avait inséré une nouvelle cartouche dans la GB.

Voilà, c’est simple, mais c’est efficace.

Poussons le concept un poil plus loin. Le programme que l’on transfère dans la RAM contiendra lui aussi le même bootloader, qui s’éxécutera bien sûr en tout premier.

Si on entre dans les détails, je dois préciser que le bootloader abandonne le transfert s’il ne reçoit pas de Hello au bout d’un certain temps (TimeOut, restons french).

Oui, mais comment ça démarre en ROM alors? Ben le programme d’amorçage se contente de rappeller le bootloader en boucle en cas de TimeOut. Of course, il n’a rien d’autre à éxécuter.

Voici donc la suite lorsqu’on reste en RAM et qu’on fait un Reset:

  • le bootloader démarre en premier et attend son hello, mais le TimeOut sera pris en compte.
  • Si on a pas lancé un transfert, il abandonne et donc la GameBoy fait un simple reset. Par contre, si on en avait lancé un, le nouveau programme est chargé et éxécuté, plus besoin de toucher au switch.

Les manipulations sont maintenant réduites au minimum.

C’est un cycle de développement qui me convient tout à fait. J’utilise CGBIDE 1.4 (parce que je suis un incurable nostalgique) et j’ai assigné PPsend à la touche F5.

une vue de CGBIDE
J’adore les anneaux de LED ça fait super pro…

A l’usage, c’est archi-simple: une fois le premier Bootload effectué par la ROM, (video précédente) je n’ai plus qu’à faire F7 (je compile), F5 (je lance le transfert) et Reset GB (ça démarre).

Dans la video suivante, j’utilise ma version prototype fait maison sur laquelle le bouton reset est orienté vers le bas. Du coup je n’ai plus qu’à appuyer sur la GameBoy…

Ca ne prend que quelques secondes, c’est fun et c’est pas cher.

OK, l’inconvénient, c’est qu’on ne trouve plus de PC avec un port parallèle, à part dans les déchetteries ou chez des vieux (enfants de) boomers…

J’ouvre donc une parenthèse pour ceux qui aimeraient cette bidouille tout en refusant de consacrer un vieil ordi dédié à la GB: il y a quand même plusieurs autres pistes.

Nota Bene: Peut-être que la nouvelle génération de GB hackers (ils sont vraiment doués!) a déjà une cartouche de développement en USB qui marche encore mieux que la mienne, je n’en sais rien, je vous expose juste ma bidouille au rapport qualité/prix imbattable…

Bref, dans ce que j’ai vu récemment, (mais je sors pas souvent de ma grotte), il y a deux projets passionnants qui pourraient peut-être converger avec le mien.

Un, l’interface GBlink/WebUSB:

https://gblink.io

On pourrait théoriquement l’utiliser avec un nouveau programme de transfert, qui passerait donc par USB et qui serait transparent côté GameBoy (même câble, même bootloader). Plus besoin d’avoir un PC avec port parallèle.

Deux, le projet de cartouche sur RP2040:

https://korben.info/guide-ultime-creer-vos-propres-cartouches.html

Cette cartouche émulée pourrait peut-être utiliser de la RAM et remplacer avantageusement la mienne, en brisant la limite des 32k dans la foulée. Le RP2040 ayant le contrôle du hardware, on pourrait même lui confier le switch ROM->RAM et tout automatiser.

Quand j’aurai du temps, je regarderai de près ces deux projets pour voir s’il y a quelque chose à faire.

Bon, plus simplement, on peut aussi récupérer une carte PCI port parallèle et la mettre sur un ordinateur récent, ou bien faire passer le transfert par le port série, moins rare, mais plus lent.

En attendant, pour ceux qui ont encore un port parallèle à leur disposition et que cette bidouille pourrait intéresser, je détaillerai tout le hardware dans la partie 2, et tout le soft dans la partie 3.

A suivre.

Commentaires

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *