logo

 

En cours d'écriture...

Histoire

La GameBoy Printer est une imprimante thermique sortie en 1998, vendue comme accessoire pour la GameBoy.

Elle a été conçue et produite par Seiko Instruments pour Nintendo.
Elle fut un relatif echec commercial, mais comme expliqué plus tard, c'était prévu.

Sa fonction la plus importante était d'imprimer des pokémons ou des faces de Kévin depuis la GameBoy Camera.

Une liste de jeux l'utilsant est trouvable sur wikipédia.

 

Hardware

Le bloc mécanique est encore produit et disponible chez SII, sous la reference MTP102. Elle prend du papier 38mm, et peut imprimer 1.2 bandes de 160x16 pixels par seconde.
Le moteur et la tête thermique sont alimentés en 5v.

Vue d'ensemble du dessous du circuit.

Notez le silkscreen inversé pour éviter de suivre les pistes (ça les cache vraiment bien).

Il n'y a aucun circuit intégré conçu par Nintendo.

 

Le coeur logique de l'imprimante est un 78011F (Datasheet: mPD78018F), un microcontroleur 8 bits conçu par NEC et produit au nom de SII.

Il possède 8Ko de ROM, et 512 octets de RAM, extensibles à 8Ko par l'ajout d'un circuit externe (ce qui est le cas ici).

Il s'occupe de gérer la communication avec la Gameboy (esclave), de stocker et décoder les images, de piloter le moteur et la tête thermique.

 

L'extension de RAM en question est un 9264BLF-10L (Datasheet: 9264BLF-10L), RAM haute vitesse de 64KBits (8Ko).

Puisque les images ne peuvent pas être imprimées directement pendant que les données sont reçues (question de vitesse et de format), cette RAM sert de mémoire tampon pour les stocker temporairement.

En théorie, elle peut contenir un peu plus qu'une image de 160x200 pixels, en 2 bits par pixels.
Cette limite est la taille maximale d'une image qui peut être transferée en une fois. Si l'image à imprimer est plus grande, il faudra plusieurs transferts et imprimer à la suite.

 

L'interface entre le microcontroleur et la tête thermique est assurée par deux LB1721M (Datasheet: LB1721M) produits par Sanyo, qui sont des octuples transistors Darlington.

La surveillance de la tension est assurée par un M62290L (Datasheet: M62290L/FP), aujourd'hui produit par Renesas.
Un code d'érreur est prevu pour indiquer à la Gameboy que la tension des piles est trop faible.

 

Réducteur et mécanisme d'avancement du papier.

La roue noire est fixée à l'axe du moteur, la grise sert à réduire la vitesse, la blanche ne tourne que lorsque la tête revient (elle fait avancer le papier), la noire à gauche fait se déplacer la tête.

 

La vis sans fin à double pas. L'un entraîne la tête de la gauche vers la droite pour imprimer, l'autre la rammène à gauche, deux fois plus rapidement.

Un microswitch est placé du côté gauche, pour indiquer quand la tête est en butée.

Quand la Gameboy Printer est allumée, la tête fait un va-et-vient pour mesurer la vitesse du moteur et être sûr qu'elle est dans la bonne position.

Schéma d'ensemble repris depuis le circuit (WIP):

(clic: version plus large)

Schéma de l'interface moteur.

Q2 est peut être un canal P, qui sert comme diode de roue libre. A vérifier.
MOT_CODE est mis à la masse par le tacho une fois par tour complet.
MOT_SWITCH est mis à la masse quand la tête thermique est en butée.
MOT_ON à pilote le moteur.

Les réferences correspondent à celles du circuit imprimé.

 

Liaison série GameBoy

La Gameboy Printer n'a besoin que des lignes SIN, SOUT, et CLK du port série Gameboy. Tout est en 0/5V.
SIN et SOUT sont croisés dans le câble (full duplex).

SIN du côté Gameboy (SOUT côté GBPrinter) doit être tiré à 5V par 15kOhms.

Une Gameboy transmet les données MSB en premier à 8333Bps (120µs par bit). Elles sont valides sur les fronts montants de CLK.
La vitesse peut être augmentée au moins jusqu'au double (16.7Kbps, 60µs par bit), la GBPrinter commence à rater des bits au délà de 20Kbps.

Quand un octet est transmis, un octet est reçu en même temps. La liaison full duplex n'est pas utilisée dans le cas de la GBPrinter:
La GBPrinter répond toujours 0x00 lorsque la Gameboy envoie des données.
La Gameboy envoie 0x00 lorsqu'elle attend des données depuis la GBPrinter.

 

Software

La Gameboy communique avec la GBPrinter avec des paquets au format suivant:

Taille
16 Bits
8 Bits
8 Bits
16 Bits
Variable
16 Bits
8 Bits
8 Bits
Description
Magic bytes
Commande
Compression
Longueur des données
Données
Checksum
Lecture présence
Lecture status
Gameboy > GBPrinter
0x88
0x33
*
0 ou 1
LSB
MSB
*
LSB
MSB
0x00
0x00
GBPrinter > Gameboy
0x00
0x00
0x00
0x00
0x00
0x00
0x00
0x00
0x00
*
*

Magic bytes: Toujours 0x88, puis 0x33. La GBPrinter attends toujours cette séquence en début de paquet.

Commande: 0x01, 0x02, 0x03, 0x04 ou 0x0F. Voir détails ci-dessous.

Compression: Flag qui indique si les données sont compressées (RLE) ou non. La Gameboy Camera ne s'en sert pas, et je ne sais pas quels jeux s'en servent.

Longeur des données: Longueur des données qui vont suivre, en octets. LSB en premier.

Checksum: Somme 16 bits de toutes les données du paquet, sauf les magic bytes et le checksum lui-même.

Lecture présence: La GBPrinter retourne typiquement 0x81 quand tout va bien (parfois 0x80 ?).

Lecture status: Bitmap de l'état de la GBPrinter (action en cours, erreurs...)

 

Description des commandes et de leurs arguments:

Commande Description Argument 1 Longueur Données
0x01 Initialisation 0x00 0x0000 Aucunes
0x02 Démarrer impression 0x00 0x0004

0x01 ?
Marges, souvent 0x13 (1 avant, 3 après)
Palette, souvent 0xE4
Exposition (7 bits), souvent 0x40

0x03 ? ? ? ?
0x04 Transfert image 0x00 Max.: 0x0280 Données graphiques (bande de 160x16 pixels)
0x0F Lire statut 0x00 0x0000 Aucunes

 

Définition des bits du status:

Bit 7 Bit 6 Bit 5 Bit 4 Bit 3 Bit 2 Bit 1 Bit 0
Trop chaud ou froid ? Bourrage papier ? Tension trop faible Prêt à imprimer Impression demandée Impression en cours Mauvais checksum

 

Exemples de transactions

Une transaction typique pour une image complète (160x144, soit 9 bandes 16x120 pixels) est constituée comme suit:

1) Initialisation (commande 0x01), la réponse doit être 0x81, 0x00
2) Envoyer 640 octets de données (commande 0x04, longueur 0x0280)
3) Verifier que le status est à 0x08 (commande 0x0F)

Attention: Il y a un timeout d'environ 250ms lorsque les données sont transmises. Si aucune commande n'est envoyée pendant cette durée, le status repasse à 0 et les données précedentes sont éffacées !

4) Recommencer 2) et 3) 8 fois
5) Envoyer un paquet de données vide (commande 0x04, longueur à 0)
6) Imprimer (commande 0x02)
7) Verifier que le status est à 0x06 (impression en cours)
8) Attendre que le status soit à 0x04 (impression terminée)

Commande 4: ((8 pixels * 8 pixels ) * 20 tiles en largeur * 2 lignes)/4 couleurs = 640 (0x0280).

 

Dump brut des données entre la GameBoy Camera et la GBPrinter de cette image:

Les octets pairs sont envoyés par la Gameboy, les octets impais sont envoyés par la GBPrinter.



Les deux lignes "Nintendo" du haut.


En-tête d'une commande 4 (0x88, 0x33, 0x04, 0x00, 0x80, 0x02...0xFF, 0xFF...)

 

 

Convertisseur données GBCamera vers bitmap:

GBCAM2BITMAP 0.1b (avec DLL de runtime Visual Basic 6).

Voir le fichier texte. Le fichier en entrée doit être un binaire composé des octets envoyés/reçus sur SIN et SOUT.

 

 

Code source AVR-GCC pour interface série/GBPrinter ATMega8, les broches sont définies au début:

GBPRINTERM8 (avec DLL de runtime Visual Basic 6).

Source du programme de transfert PC vers GBPrinter (VB6), fait pour fonctionner avec l'interface ATMega8 seulement:

PC2GBPRINTER

 

 

Les différentes nuances de gris sont obtenues à partir de la durée de chauffage du papier.

Les chronogrammes ci-contre ont été relevées sur une ligne en sortie de l'µC, pilotant les transistors Darlington.

 

Le temps aloué à un pixel dépend de la vitesse du moteur (jamais exactement la même selon les GBPrinters): 4ms en moyenne, rapport cyclique entre 24% et 39% pour les différents tons.

Le temps de refroidissement donne un noir presque complet pour 39%.

La durée des impulsions sont calculées avant impression avec un des arguments de la commande 0x02 (exposition). Ici elle est de 0x40.

 


Réponse de la GameBoy Printer (status sur les deux derniers octets): 0x81, 0x00.

footer
symbol symbol symbol symbol symbol