A propos de vitesse il y a un truc que je ne comprends pas dans l'algo. La valeur de vitesse (speed) est lue et stockée dans le registre c' en tout début de pattern. Ensuite l'algo décrémente c', jusqu'à 0, et il passe alors à 255. Donc la valeur de c fait 6, 5..2 1 0, 255 254 ... 2 1 0, 255 254 ... 2 1 0, etc. Combien de fois la partie 255..0 ? je trouve 256 fois puisqu'on itère sur b' =255..0 avec djnz. Bref le nombre de boucle de l'algo est 6+256*256.
Le fait que la vitesse (6) apparaisse comme constante additive me surprends. En toute logique elle devrait être une constante multiplicative (exemple: speed*256=6*256), puisque cela affecte l'ensemble des durées. Mais pour faire cela il faut ré-initialiser c' à 6 (speed) à chaque rebouclage sur b. Or, dans le code, c' n'est initialisé qu'une fois, en début de pattern et pas à chaque rebouclage sur b' et playRegular. Je suis perdu!
Quelqu'un qui connait les subtilités Z80 mieux que moi peut-il expliquer pourquoi mon analyse du code est forcément fausse?
Code : Tout sélectionner
rdptn0
;; sam: init pattern avec c'=(speed)
playRegular
exx
....
....
;; sam: décrémente c'
dec c ;4
;; sam: rebouclage si c' n'est pas nul
jr nz,playRegular ;12
;; sam: ici, à la sortie c=0
....
....
;; sam: décrémente b, et retourne à playRegular avec c=0, et pas c=(speed).
;; sam: Ca fait (speed)+255*256 tours et pas (speed)*256 tours
djnz playRegular
Est-ce que le exx de playRegular restore les registre b,c à la valeur initiale par magie ?? Qu'est-ce qu'il y a d'évident que je loupe??
[EDIT]c'est bon j'ai trouvé! Pour comprendre j'ai fait tourner DCVG5K.. et là j'ai compris que j'ai inversé le role de B et C (ce CPU est du mauvais Endian, le bougre). Du coup (speed) est dans B' et la boucle intérieure sur se déroule 256 fois (sur C). On obtient bien 256*(speed) tours de boucle ce qui fait du sens. Sachant que chaque tour de boucle coute 224 T-cycles, ca nous fait (speed)*14.3ms de durée par ligne du pattern (le canal 4 peut être stoppé plus tôt).