En cours d'écriture...
 |
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.
|
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é.
|
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.
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 |
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.
|