Voici la fonction RLEAD telle que je l'ai analysée, elle m'a permis de comprendre comment le leader est constitué et comment le DAI peut le reconnaître. L'organigramme ci-dessous a été coloré et les lignes d'assembleur qui correspondent également. Le détail et le commentaire de chaque ligne est donné juste après l'organigramme. | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Le programme commence à être intéressant à la ligne 21, là où l'on détecte un état bas sur le signal. Au début de l'exécution de la ligne 21, le signal est bas au moins depuis la ligne 19, c'est à dire au moins depuis 7+10 cycles (lignes 19 et 20). Je dis "au moins" car en réalité et selon toute vraisemblance, il y est depuis beaucoup plus longtemps... Effectivement, vous pouvez remarquer que lors de l'attente de ce premier état bas, le programme boucle entre les ligne 16 et 20 mais vous noterez qu'à la ligne 16 on autorise les interruptions (EI), ce qui permet lors de l'arrivée d'une interruption (qui a lieu toutes les 20 ms grâce au blanking signal de synchro TV, mais peu importe) et ce qui permet au programme de se dérouter pour faire clignoter le curseur à l'écran... Donc pendant toute ce temps, inutile de vous faire un dessin, nous dépassons allègrement les 7+10 cycles des lignes 19 et 20. Quoiqu'il en soit, arrivé à la ligne 21, nous pouvons être sûr d'une chose, c'est d'avoir détecté le signal à l'état bas depuis un temps égal à 17 cycles machines. Près l'exécution de la ligne 24, il se sera passé 7+10+5+7+7+4=40 cycles. Nous entrerons alors dans une boucle (ligne 25 à 28) dont nous sortirons soit en ligne 26, soit en ligne 28. Si l'on sort en ligne 26 c'est qu'il s'est passé 40 + 255*(5+10+7+10) + 5+10 = 8215 cycles sans avoir détecté de niveau haut sur le signal cassette. Cela signifie alors que nous sommes restés au moins 8215 cycles à l'état bas... Or, l'horloge du 8080A du DAI est réglée sur une fréquence d'horloge d'exactement 2MHZ. Le cycle machine est donc égale à 1/2000000 = 0,5µs ! Ceci signifie donc que nous sommes à l'état bas depuis 8215*0,5µs, c'est à dire depuis 4,1075 ms, ce qui est beaucoup trop pour l'état bas d'un bit leader (CF ici) et c'est pourquoi l'on se permet de recommencer à zéro en RDL05, ce qui donne l'occasion au DAI de nous faire de l'oeil avec son curseur. En revanche, si l'on sorte en ligne 28, c'est que l'on vient de détecter un niveau haut... Poursuivons notre investigation :
Si nous sommes sortis à l'état haut ligne 28, c'est qu'on y est depuis au moins 7+10 = 17 cycles lorsque l'on arrive en début de ligne 29. Admettons que nous sortions de la boucle RDL50 en ligne 31, il se sera alors passé 17 + 7 + 255*(5+10+7+10)+5+10 = 8199 cycles, soit 4,0995 ms au niveau haut... C'est bien trop pour le niveau haut d'un bit leader qui ne devrait jamais excéder 283,5 µs !!! Dans ces condition, on peut de nouveau se permettre de reprendre tout au début ce qui donne encore l'occasion au DAI de nous faire de l'oeil avec son curseur. En revanche, si l'on sort en ligne 33, c'est que l'on vient de détecter un retour au niveau bas... Nous sommes donc sortis de la boucle RDL50 avec dans B, le nombre de passages dans la boucle... Dans ces conditions, nous sommes restés à l'état haut pendant 17+ B*(5+10+7+10) - 7 - 10 = B*32 cycles. Notons que la durée normale de l'état haut d'un bit leader est de 567 cycles, soit 283,5 µs. L'on peut donc s'attendre à ce que l'on passe 567/32 = 18 fois dans la boucle. On s'attendrait donc à ce que le programme initialise la valeur C avec 18 et non pas 40 (:28 en ligne 13). Toutefois, on sait également que la taille du bit leader est modifiable, ce qui signifie que cette fonction doit aussi fonctionner pour d'autres valeurs, alors pourquoi pas 40 ? Voyons la suite :
On voit qu'à la fin de cette routine, nous n'avons nullement la garantie que le leader est bel et bien terminé, c'est pourquoi il faut encore tester que les signaux qui suivent constituent 8 bits marquant la fin définitive du leader. C'est ce que fait la ligne 3 en appelant RBYTE chargée de lire 8 bits de donnée. Si cette fonction réussit, il faut encore que l'octet lu soit égal à :55, faute de quoi on reprendra tout à zéro une fois de plus (lignes 5 et 6). Enfin, on essaye de lire l'octet de type de fichier (ligne 7), si la fonction échoue, on reprend tout à zéro, sinon on sort de RHDR avec le type de fichier lu dans A.
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||