Correction d'erreurs dans la datasheet de la puce vidéo TS9347

Bonsoir à tous,

Dans ma quête pour savoir comment fonctionne mon M12 Phillips et pouvoir examiner son fonctionnement, je me suis mis à coder un émulateur.

Bien qu’il ne soit pas encore fonctionnel (non initialisation du modem, et bugs en tout genre), j’arrivais à afficher certaines pages correctement (répertoire):

Mais d’autres sont en partie vide car le microprocesseur envoi des commandes inconnues (ex: 0x03) à la puce vidéo (menu de l’horloge):

Je sais que la fiche de donnée de la puce (https://www.goto10.fr/minitel/specifications/ts9347.pdf) comporte de grosses erreurs de logique (surtout les schémas et le fonctionnement des pointeurs AP et MP) et c’est pourquoi j’utilise une version plus ancienne (http://www.bitsavers.org/components/stMicroelectronics/_dataBooks/Graphic_Processors_Data_Book_Mar89.pdf) qui ne présente pas d’erreurs de recopie à première vue.

Malheureusement cette version n’est pas non plus exempte d’erreurs (surtout dans le tableau des commandes) et je n’ai pas trouvé d’autre version pour la corriger.

Voici donc une correction de la fiche de donnée que j’ai assembler avec quelques indices et de la déduction pour ceux qui seraient intéressés: Minitel/m12/documentation/TS9347 Corrections.pdf at main · EcrouVis/Minitel · GitHub

Si vous voulez apporter des modifications ou ajouter des informations n’hésitez pas à me contacter.

En tout cas je continue à améliorer (et débugger :)) mon émulateur et je devrais avoir un schéma de fonctionnement à peu près correct du MBSL 4000FH5-5 dans peu de temps.

Bonne soirée,

Yves Landemarre

3 « J'aime »

Si je me souviens bien, j’ai déjà vérifié par le passé que l’encodage de la commande TSM 0x61 fonctionne également, mais je n’ai pas encore eu l’occasion de formaliser cela sous forme de test. Il est également intéressant de noter que 0x03 est le codage équivalent sur l’EF9345.

J’ai commencé à écrire des tests pour valider les implémentations EF9345/TS9347 :

Dans le même repo, tu trouveras une carte USB qui peut être utilisée pour envoyer des commandes à la puce directement depuis un PC et voir le résultat immédiatement sur le PC lui-même:

screenshot_40c

Si tu veux, je peux trouver un moyen de te donner un accès à distance à la mienne (ou, si tu es à Paris, je peux simplement te prêter la mienne [son logiciel fonctionne sous Linux]).

1 « J'aime »

Ma puce est soudée sur la carte mère du coup je ne peux pas tester pour l’instant.

Mon idée sur la formation des commandes étaient qu’elles n’étaient pas formées de manière random mais plus de manière orthogonale/modulaire et que TLM/TLA/CLL/TSM/TSA/CLS avaient la même structure avec bit 2: incrémentation sur Y, bit 1: 16/24bit et bit 5:AP/MP.

Il se peut aussi que certains bits ne soient pas checkés.

Un programme pour tester les commandes serait le suivant:

AP=0, MP=0, R1=1, R3=3

CLL

attendre la fin de la commande

pour toutes les commandes à tester:

AP=0, MP=0

CMD

attendre la fin de la commande

lire R1, AP, MP

(avec CMD une commande en lecture ou écriture et auto-incrémentation sur X)

2 « J'aime »

Pour ceux que ça intéresse voici les logs de mon émulateur lorsqu’il tente d’afficher la page de l’horloge:

Il peut y avoir des erreurs dans les arguments passés à/depuis la puce vidéo car je suis en plein débuggage mais je ne pense pas que cela ait un grand impact vu que c’est l’affichage d’une page fixe.

J’ai remarqué aussi que même si la commande pour la puce n’ai pas par exemple 3 arguments, le programme utilise parfois une fonction plus générale et passe aussi une valeur au hasard.

Pour info A: addresse IO (0x20-0x2F) et D: les données envoyées

Excellente idée !

J’ai essayé plusieurs valeurs et j’ai écrit le test en Python. Tu le trouveras ici : tests/test_memory.py

En bref, il y a beaucoup d’alias (en gras ce qui n’est pas documenté dans le datasheet):

Description EF9345 TS9347
Clear Page - 24 bit 05h (CLF) 05h (CLL)
Clear Page - 16 bit 07h (CLG) 07h, 65h (CLS), 67h
40C - 24 bit (MP)¹ 00h (KRF) 00h (TLM)
40C - 24 bit (AP)¹ 20h, 22h (TLA), 24h, 26h
40C - 16 bit (MP)¹ 02h² (KRG) 02h², 60h (TSM), 62h
40C - 16 bit (AP)¹ 70h (TSA), 72h, 74h, 76h
80C - 8 bit (MP)¹ 40h (KRC), 42h, 44h, 46h 40h (KRS), 42h, 44h, 46h
80C - 12 bit (MP)¹ 50h (KRL), 52h, 54h, 56h 50h (KRL), 52h, 54h, 56h
Byte Access (MP)¹ 30h (OCT), 32h 30h (TBM), 32h
Byte Access (AP)¹ 34h (OCT), 36h 34h (TBA), 36h

¹ = dit N la valeur, il y a aussi toutes les variantes:

  • N+01h pour l’auto-incrémentation
  • N+08h pour la lecture
  • N+09h pour la lecture avec auto-incrémentation

² = il se comporte comme 00 en lecture (il lit également le 3eme octet dans R3)

Merci beaucoup!

Je vais mettre à jour ma fiche de correction et mon émulateur pour voir quelles sont les différences d’affichage :grinning_face:

Il faudrait aussi tester si il n’y a pas d’autres effets secondaires à changer certains bits (par exemple changer Y quand X=40 et qu’il y a l’auto incrémentation)

Je pense que je l’ai testé, non ? Dans la dernière fonction du fichier.

Voici ce que je vois si je le rejoue sur la puce (n’y croyez pas trop, je introduis sûrement des erreurs dans le processus):

Ok

Je ne m’attendais pas à avoir un résultat valable mais ça s’approche pas mal de la réalité

A-t-on aussi testé avec les commandes 0x1X sur le TS9347?

J’ai mis à jour le fichier mais il y a CLS et TSM qui partagent un même numéro (0x65).

Quelles commandes ? Je ne vois que celles-ci dans ton log:

To TS9347 A: 0x28 / D: 0x02 # undocumented KRG
To TS9347 A: 0x28 / D: 0x03 # undocumented KRG + auto-incr
To TS9347 A: 0x28 / D: 0x0A # undocumented KRG + read 
To TS9347 A: 0x28 / D: 0x81 # write TGS
To TS9347 A: 0x28 / D: 0x82 # write MAT
To TS9347 A: 0x28 / D: 0x83 # write PAT
To TS9347 A: 0x28 / D: 0x84 # write DOR
To TS9347 A: 0x28 / D: 0x87 # write ROR
To TS9347 A: 0x28 / D: 0x8A # read MAT
To TS9347 A: 0x28 / D: 0x8B # read PAT
To TS9347 A: 0x28 / D: 0xE9 # MVD (move double buffer)

40C - 16 bits (MP) ne répond qu’aux numéros 60/61/68/69 et 62/63/6A/6B. Il n’y a pas de collision avec 65.

Ok j’ai juste mal compris. Je corrige mon doc.

Je n’ai pas trouvé de 0x1X dans la rom mais c’est probable qu’il y ait des alias avec ces commandes vu comment elles sont formées.

Finalement c’était ce qui m’empêchait de continuer :grin:

Après avoir implémenté les changements les pages rendent correctement.

Même le mode local à l’air de marcher maintenant!

2 « J'aime »