Je veux mettre à poil le matos qui a permit pendant pratiquement 20 ans d'avoir plus de 2 canaux audio dans les cinémas.
Pour résumer le (vaste) sujet:
Vers 1994, Dolby ont eu l'idée d'encoder jusqu'à 6 canaux audio en AC-3 et d'intégrer le flux de données sous forme de petits codes optiques imprimés entre les perforations de la pellicule.
Une tête de lecture spéciale est installée sur le projo. L'arrière de la pellicule est éclairée par une LED bien puissante. Un capteur CCD linéaire transmet la vidéo des codes qui défilent au décodeur (Dolby DA-20).
Depuis les "pixels" des codes jusqu'à la sortie audio, ça se passe comme suit:
Lumière (ou pas) -> Capteur CCD -> ADC -> Détection des marqueurs, alignement, ré-échantillonnage de la vidéo -> séparation des données audio et de contrôle -> EDC Reed-Solomon pour l'audio -> décodage AC-3 -> DACs -> sorties audio.
Quelques images sur Wikipedia: https://en.wikipedia.org/wiki/Dolby_Digital#Cinema
J'ai pu chopper un DA-20 fonctionnel ainsi que quelques bandes annonces 35mm pour pas cher, cependant le prix des têtes de lecture sont un peu trop hauts pour le budget de ce projet-qui-rapporte-pas-de-sous.
Le capteur CCD est tout de même assez rapide malgré son âge: 30MHz sur deux canaux pour les pixels pairs et impairs. Malheureusement les capteurs de scanner qu'on trouve aujourd'hui favorisent la résolution plutôt que la vitesse, donc l'idée de faire fonctionner le décodeur "normalement" est mise de côté pour le moment.
La détection et correction d'erreur se fait par un chip spécialisé dont la documentation est dispo. L'algo et les paramètres sont connus donc pas d'inquiétude à ce niveau là.
Le décodage AC-3 se fait aussi par un chip spécialisé et documenté. Les specs du format AC-3 sont aussi publiques et des décodeurs open-source existent, toujours pas d'inquiétude.
Le vrai délire, c'est la conversion des codes 2D sur la pellicule en données.
Le brevet (https://patents.google.com/patent/US5710752A/en) donne quelques infos fort utiles, mais ne va pas en détail dans les champs de données, l'insertion des codes R-S, la méthode d'entrelacement, les métadonnées et données de contrôle...
Tout le traitement des codes optiques se fait avec 5 DSP. Oui, cinq. Des DSP56000 en plus ! J'ai hésité à poster dans le forum Falcon

Quatre DSP56000 identiques qui bossent en parallèle, et un DSP56002 chef d'orchestre.
Les quatre DSP56000 ont chacun une EPROM avec un petit programme qui sert de bootloader, afin que le DSP56002 puisse charger leur programme depuis une mémoire flash centrale.
La mémoire flash contient le programme de base du DSP56002, ainsi que le programme envoyé aux quatre DSP56000 qui font le gros du boulot.
Truc fun: la doc du DA-20 indique que des mises à jour sont parfois inclues dans les codes sur le film ! Pendant les "20 à 30 secondes" de mise à jour, la piste analogique du film est utilisée.
J'ai toutes les cartes, toutes les docs des composants et tous les dumps des mémoires en question, donc à priori j'aurais tout ce qu'il faut pour y arriver. SAUF QUE.
L'asm DSP56k m'explose le cerveau, et j'aurais besoin d'un peu d'aide pour commencer.
Le bootloader des DSP56000 est 100% compris, pas de souci vu que c'est du code style MCU.
Par contre au démarrage du DSP56002, je bloque déjà. Par exemple, il y a un bout de code qui fait s'afficher la sélection d'une roue codeuse 0~F sur un afficheur 7-segments.
J'ai pu repérer et comprendre la routine qui affiche le caractère (ShowSSegDigit, param: x0), par contre son appel ici me laisse perplexe:
ROM:0185 TestModeA: ; Test mode: Boucle infinie, montre l'état roue codeuse sur afficheur (testé IRL) ROM:0185 bchg #3,x:<<PBD ; Toggle bit 3 port B: kick watchdog ROM:0186 movep y:<<OUT_SSEG,x0 ; Lecture roue codeuse, exemple 9: $000009 -> x0 ROM:0187 move #$80,x1 ; $000080 -> x1 ROM:0189 mpy x1,x0,a #$F0,x1 ; x1*x0 -> a, $000080 * $000009 * 2 = 000900 -> a1 $0000F0 -> x1 ROM:018A move a0,a ; a0 -> a1 ?! Surement pas ROM:018B and x1,a #$800,x1 ROM:018D mpy x1,x0,a a1,y:YMEM_FFE1 ; IO externe inconnu ROM:018F move a1,x0 ROM:0190 jsr <ShowSSegDigit ROM:0191 jmp <TestModeA
A ROM:018A, le move a0,a devrait mettre a0 (les 24 bits bas de a) dans a (sous entendu a1, les 24 bits du milieu de a).
Ce qui aurait pour effet d'effacer le résultat du mpy à ROM:0189...
Je suis un peu largué avec les différents bus et la taille des registres DSP56k, malgré avoir passé quelques heures sur le manuel de programmation
S'il y a des habitués qui peuvent me mettre sur le bon chemin, je leur serais fort reconnaissant !