gilles a écrit :Tu as une idée du % du cpu qui est occupé par la routine?
Le code source fourni sur la D7 peut faire une version débug qui réponds à cette question:
- Ouvrir SNOW.ASM dans un macro assembleur (j'utilise MASS6809)
- Changer le ORG $6200 en ORG $8000 histoire de ne pas écraser les data de l'assembleur
- Faire passer DBG à 1
- Faire passer TO7 à 0 si on est sur autre chose qu'un TO7
- Compiler avec A/IM (5mins... c'est long!)
- Lancer sur le label "ini" (ou $8000 si on arrive pas à atteindre les minuscules au clavier)
La version débug ainsi produite change la couleur du tour de l'écran pendant le temps de service de l'interruption, et donc la proportion de couleur changée dans le bord de l'écran indique le pourcentage d'occupation CPU par le player.
Si j'isole un bord de l'écran et que je compte le ratio des pixels blancs par rapport au noirs,
J'obtiens 29 lignes blanches pour un total de 814, soit moins de 5% du temps moyenné sur 20ms à ce moment là. Évidemment plus les notes sont aiguës, plus le pourcentage est élevé. L'extrait vient de "Here Comes Santa Claus" qui est dans l'octave 5. Si on joue dans l'octave 6, le pourcentage est doublé, dans l'octave 7 quadruplé. Bon dans l'ensemble, la charge doit tourner autour de 3 à 6% pour les octaves 4-5. Dans le pire des cas (octave 7, note SI), on met à genoux le CPU.. mais ce cas est très rare.
On se rend aussi compte que le service d'une interruption dure typiquement 1 ligne, soit 64µs, 64 cycles.. (10 instructions). Mais bon, c'est à pondérer suivant que l'émulateur émule le changement de couleur du tour à l'instruction près où à la scanline près. Mais l'ordre de gardeur est juste. Si je compte les cycles
Code : Tout sélectionner
1026 6530 SndIntr set *
1027 * le moniteur du TO8 force b3=0 en
1028 * $E7C1 a chaque fois que $60DC
1029 * tombe a zero (il est decremente
1030 * a chaque interruption). On lui
1031 * donne donc une valeur != 1.
1032 * Ici a l'entree de l'interrupt
1033 * A contient $6019 qui ne peut
1034 * être nul.
1035 5 6530 B7 60DC sta $60DC ; un truc!=1
78 2 6533 86 00 lda #0
79 6534 SndMsk set *-1
1037 4 6535 98 C1 eora <CRC ; creneau
1038 4 6537 97 C1 sta <CRC
1039
1040 * debug leger: changement tour
1041 if DBG
1042 bsr dbg
1043 endc
1044
1045 * decompte du temps tick
78 3 6539 CC 0000 ldd #0
79 653A TckTime set *-2
78 4 653C 83 0000 subd #0
79 653D PerIntr set *-2
1048 3 653F 25 06 bcs TickTO
1049 6 6541 FD 653A std TckTime
1050 6544 EndIntr set *
1051 if DBG
1052 bsr dbg
1053 endc
1054 4 6544 96 C6 lda <TMSB ; clear TCO
1055 15 6546 3B rti
Je trouve 50cycles (qui doivent passer à +/-64 avec le changement de tour). C'est très peu, mais il faut ajouter le sur-coût des pré-traitement faits par la ROM. De ce point de vue là, le TO7 a une rom très efficace. Le TO8 en revanche perd pas mal de cycles en ROM (avec typiquement un décompte en $60DC dont je n'ai pas trouvé l'utilité).