logo

 

Toujours en cours d'écriture...

SmartCom était le nom d'une cartouche conçue et vendue par Datel qui se vantait de pouvoir transformer la GameBoy Color en assistant personnel.
Merci à Arthur (voir Tagbox) d'avoir pu m'envoyer la sienne.

Elle est assez difficile à trouver et se trouve déjà parmi des collections. Elle permet d'écrire des notes, de les envoyer et recevoir par infrarouge, met à disposition l'heure, la date, un calendrier avec rappel d'évenement, d'un carnet d'adresses et d'un numérotateur téléphonique.
Sa rareté est dûe aux nombreux problèmes techniques rencontrés par les utilisateurs, et le peu d'interet que les distributeurs de jeux lui portaient (qui craignaient d'avoir du mal à vendre une sorte de PDA sans clavier...)

J'ai pu faire un dump complet du 39SF020 à travers la cartouche:

SmartCom: Dump Flash complet (256Ko zippés)

SmartCom: Dump Flash programme (128Ko zippés)

SmartCom: Dump Flash patché pour émulateur (128Ko zippés)

Certaines routines désassemblées et commentées arriveront bientôt...

Seule routine utile dans la bank 4:

ROM0:0150 di
ROM0:0151 ld b,a
ROM0:0152 xor a
ROM0:0153 ld (FFFF),a
ROM0:0156 ld hl,0167
ROM0:0159 ld de,FF80
ROM0:015C ld c,10
ROM0:015E ldi a,(hl)
ROM0:015F ld (de),a
ROM0:0160 nc de
ROM0:0161 dec c
ROM0:0162 jr nz,015E
ROM0:0164 jp FF80
ROM0:0167 ld a,(0107)
ROM0:016A cp 66
ROM0:016C jr z,0167
ROM0:016E ld a,b
ROM0:016F jp 0101
ROM0:0172 di
ROM0:0173 ld (D200),a
Interruptions désactivées
B=A
A=0
Aucune interruption
Charge la HRAM avec 16 octets à partir de $0167







Part dans la HRAM
Routine HRAM: Attends que ($0107) passe à autre chose que $66
C'est à dire qu'elle attend que le logo SmartCom revienne: que la bank0 soit de retour avant de repartir à ($0101).


Code de merde jamais éxecuté...

Le manuel, visiblement traduit par une machine, indique que certaines des fonctionalités peuvent être indisponibles selon le numéro de série de la GameBoy. Celà met en évidence l'existence de plusieurs version du ROM de la GameBoy, et peut être plusieurs versions du processeur.

Toutes les cartouches trouvables sur le marché ont leur pile morte, en fait elle était souvent morte avant même que la cartouche soit vendue à cause d'une consommation excessive.
La cartouche utilise un PIC 16C620 comme horloge interne (RTC, Real Time Clock), il est accompagné d'un quartz à 32.768Khz, presque toujours utilisé dans les RTC pour obtenir " la seconde".
Il est probable que le firmware du PIC était mal conçu, et qu'il se mettait à consommer plus que prévu (n'entre pas en mode SLEEP).

Une autre curiosité est celle de l'alimentation du circuit entier par la pile. Seules deux diodes (D1 et D2) empêchent la GameBoy de recharger la pile de force, et à l'inverse, de vider la pile dans la GameBoy (pas directement câblée à VCC). A ma connaissance, aucun autre circuit intégré à part le PIC n'a besoin de fonctionner quand on ne se sert pas de la cartouche... Une fuite de courant inutile.

Ma version du SmartCom consomme 260µA hors usage. (puis 8µA maintenant ? Je crois que mon ampèremetre a un problème).

Le fix consiste à forcer la ligne A16 à 1 durant au moins 90ms, le temps que la GameBoy fasse sa vérification sur le logo.
Comme PAL_21 est une broche output uniquement, la forcer à 1 provoque un court-circuit. Pour empêcher cela, on utilise une porte OU réalisée avec D1, D2 et R5. Ceci permet de redonner la main au PAL une fois la correction faite au démarrage. La ligne PAL_21 est utilisée plus tard, si elle n'est pas relâchée à temps, SmartCom plante (parfois un écran noir).

Au démarrage, Q2 est bloqué: A16 est fixée au niveau haut par R4. C2 se charge progressivement à travers R3 jusqu'à rendre Q2 passant.
La valeur de R5 est importante, si elle est trop basse, le PAL ne pourra pas fournir assez de courant. Si elle est trop haute, la ligne deviendra flotante si PAL_21 est à l'état bas.

(clic) Fix avec diodes, ou avec portes logiques.

Ca marche !

 

Contenu de la mémoire:

Bank
Contenu
0
Header avec le logo Smartcom (), programme de base
1
Alphabet, polices LCD, icones, claviers
2
Boutons "Delete","Save","Load","Send","Receive", écrans "Sending" et "Receiving"
3
Carte du monde, icones du carnet d'adresses, nom des capitales
4
Header avec le logo Nintendo, écran "Initializing", fonctions abandonnées...
5
Télécommande, texte du menu de configuration
6
Tout le menu principal, nom des mois et des jours
7
Calculette et splashscreen "Smart Com"
8
Carnet d'adresse... "chris_u@datel.co.uk", Chris Urquhart ?
9
10
11
12
Notes...
13
14
15

A Écrire... Code et graphismes qui traînent dans bank 4 et qui sont jamais utilisés:

(Cliquer pour voir la version plus grande)

Composants:

SST Multi-Purpose Flash 39SF020 (256Ko)
PALCE 20V08
74HC373 latch 8 bits (bankswitch, R/W RTC...)
74HC74 double bascule D (écriture vers RTC)

La première chose intriguante est l'absence de RAM, alors qu'il est possible d'enregistrer du texte et des numéros de téléphone.
La RAM et l'EEPROM intégrés du PIC sont beaucoup trop petites pour pouvoir stocker ce genre de données.
L'astuce consiste tout simplement à utiliser une mémoire flash commune pour le programme et pour les données à enregistrer, plutot qu'une ROM d'un côté et une RAM de l'autre.

Le datasheet de la mémoire flash montre que ce modèle a une particularité importante, et qu'il ne peut pas être remplacé par n'importe lequel: généralement il faut qu'un bloc de données soit écrit assez rapidement avant que le cycle d'écriture commence, souvent de l'ordre de 128 octets, avec moins de 2ms entre chaque octet. Ici, la mémoire est écrite octet par octet, ce qui élimine tout besoin d'une logique de contrôle temporisée pour compenser le temps nécessaire pour écrire chaque octet. Le programme du SmartCom peut lui-même écrire dans sa propre mémoire simplement avec des temporistations logicielles.

 

Le menu principal affiche les heures, les minutes, un double-point pour les secondes, le jour, le mois, et les 7 icones. De haut en bas:
Bloc-notes, "e-mail", carnet d'adresses, calculatrice, heure/date, télécommande, configuration.

 

Le menu de configuration permet d'activer l'alarme, l'heure d'hiver/d'été, l'affichage de l'heure en 12 ou 24h, le son que fait le curseur sur le menu principal (tous moches, et trop longs) et la durée du bip de l'alarme.

 

Message d'erreur buggé qui est apparu qu'une fois, juste après avoir édité un fichier dans le bloc-notes.
Le pointeur texte était visiblement pas au bon endroit...

 

L'écran "About"

Programming: C. Urquhart K. Brady
RTC: A. Edge (Alex Edge est maintenant directeur technique chez Datel. Il a probablement écrit le firmware du PIC)
Hardware: R. Harding (Mention spéciale pour l'échec de la pile)
Thanks to: Pascal Felber TeamKNOx (Deux "grands noms" dans le hacking et la recherche sur GameBoy)
Software v1.0 (Quelqu'un a autre chose ?)
RTC v1.2 (Quelqu'un devrait avoir autre chose !)

Si il y a eu des révisions de la RTC, il y a du avoir des soucis...

 

Schéma repris et vérifié en 7 heures chrono ;)
Tout est correct, U5 est deviné depuis le comportement de PAL_21.

Le 74HC373 (latch 8 bits) permet de diriger une partie du bus de données sur différentes lignes d'adresses de la flash (bankswitching). Quand le bus d'adresse est sous $4000, /OE du latch descend pour que les sorties du latch soient libérées et tirées à 0 par les R1,R2,R3 et R4. Ce qui fixe la bank0 entre $0000 et $3FFF quoi qu'il arrive.

La bank selectionnée est positionnée à partir de $4000. Normal...

SmartCom écrit un octet sur $3F00 pour changer de bank. Comme le PAL n'est pas au courant des lignes A0 à A6, cette écriture devrait faire le même effet de $3F00 à $3F7F. L'adresse $3F80 est utilisée pour la lecture

Écriture sur $3F00:
76543210
CD?xdcba

C:ClockIn PIC.
D:DataIn PIC
a, b, c et d: respectivement les lignes A14, A15, A16 et A17 de la flash.
x: n'importe
?: connecté à RA2 du PIC, jamais utilisé ? Reset complet ? Bizarre.

La broche RB7 du PIC est câblée sur RST, il a donc besoin de savoir quand tout redémarre. Il utilise donc une communication par étapes et le signal RST lui permet d'annuler l'échange en cours si il est interrompu.

 

Broche RB3 du PIC au démarrage, surement connectée d'une façon à PAL_21:

160ms bas (Smartcom)
50ms haut (Nintendo)
260ms bas (Smartcom)
5.6s haut (Nintendo)
bas tout le temps (Relâche)

PAL_18: empêche de sortir de la merde sur Qx au démarrage, avant que LE monte ?
PAL_16 routé sur PAL_21 après le coup foireux du logo ? Ca semble logique vu la disposition des broches.
Écriture possible que dans 8ko ? de A000 à BFFF (1010xxxx xxxxxxxx à 10111111 11111111)
PAL_17 et PAL_27 routés sur PAL_25 et PAL_26 sur demande de lecture de la RTC ? Ca metterais RB1 et RB2 sur D0 et D1.

Il se passe jamais rien sur RA2... Toujours à 0.

Vérifié: RA1: clock in, 1ms haut, 1ms bas. Deux octets quand on change les paramètres (alarme on/off).
Vérifié: RA0: data in.
Vérifié: deux fois 5 octets au démarrage, puis 5 octets, voir boot RA1. (Params, date, puis heure ?)
Vérifié: écrit deux octets toutes les minutes (demande de lecture, synchro minute ?).
Vérifié: PAL_21 utilisé pour la ruse du logo. Reste tout le temps à 0 sur une gameboy color CH21996884. 0: "SMARTCOM™" 1: "Nintendo"
Vérifié:
Changement 24h/12h et DLS: rien d'envoyé au PIC.

Vérifié: RB1 (et RB2 ?): communication sortante depuis le PIC.
Vérifié: RB3: timing.
RA2: mystère, ne change jamais d'état.

A faire:
Le 39SF020 s'écrit octet par octet et a besoin d'un strobe sur OE pour démarrer l'écriture (role du PAL important !).Essayer de lire le contenu de la flash et du PIC.
Forcer RA2 à l'état haut.
Voir si PAL_21 = PAL_16.
Voir si PAL_17 = PAL_25 et PAL_27 = PAL_26.
Chronogramme de PAL_18 au démarrage: ok, change souvent.
Quelle heure/date et alarme par défaut quand on enlève la pile ? Rien par défaut, ne compte pas l'heure, garde la dernière enregistrée (eeprom pic ?)

 

Échanges de données avec le PIC:

Commande:
Puis...
$01
Rien (demande de préparation ?)
$02
Lit 4 octets
$03
Écrit 3 octets
$04
Rien
$05
Écrit 1 octet
$06
Écrit 1 octet (Réglage paramètres)
$FF
Lit 2 octets (get version ? Puisque pas dans le mapping de l'écran About)

Commandes disponibles du PIC: 1,2,3,4,5,6,FF

Ecriture sur RA0, données valides sur front montant de RA1:

En premanence quand on est dans le menu "heure et date":
01010000
00000000
(demande de lecture ?)

Enregistrer alarme à 12h04 26/08/2002:

11000000 (3)
01100000 (6)
00000111 (244)
00000000 (0)

Sauvegarde des options, alarme ON, 30 secondes:
01100000
01111000 (30)

Sauvegarde des options, alarme ON, 11 secondes:
01100000
11010000 (11)

Sauvegarde des options, alarme ON, 10 secondes:
01100000
01010000 (10)

Sauvegarde des options, alarme OFF, 10 secondes:
00100000
01100000
(toujours 6 quand alarme off)

0A100000 (alarme on/off)
abcde000 (longueur de l'alarme en secondes)

Lecture (?) sur RB1, données valides sur front ? de RA1:

Démarrage 1, RB1:
00000000 0
10110100 45
01000000 2
00000000 0
00000000 0

00000000 0
11101100 55
10100000 5
00000000 0
00000000 0

00000000 0
00100000 4
00010000 8
00000000 0
00000000 0

footer
symbol symbol symbol symbol symbol