This page is at least 16 years old !
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. 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. |
J'ai pu faire un dump complet du 39SF020 à travers la cartouche:
|
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. 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. |
(clic) Fix avec diodes, ou avec portes logiques.
Ca marche !
Contenu de la mémoire:
Bank
|
Contenu
|
0
|
Header avec le logo Smartcom (
![]() |
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:
![]() |
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: |
![]() |
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. |
![]() |
L'écran "About" Programming: C. Urquhart K. Brady Si il y a eu des révisions de la RTC, il y a du avoir des soucis... |
![]() |
Broche RB3 du PIC au démarrage, surement connectée d'une façon à PAL_21: 160ms bas (Smartcom) |
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