Bon finalement ces bricolages avec le dither 1 bit ne sont pas concluants dans 100% des cas. Pour certains morceaux ca passe, et poru d'autres c'est affreux.
Mais il y a un effet de bord interressant...
En effet, grace à l'optim faite pour ce mode là, j'arrive à faire tourner la routine de la forever (un peu modifiée) en 142 cycles, soit 7khz au lieu de 5khz.
Code:
* voix "X"
ldb #0 ; 2 (2) compteur
cpt set *-1
addb #0 ; 2 (2) frequence
stb <cpt ; 4 (2)
bcc ------- ; 3 (2) -----+ carry==0 => pas de changement de x,
tfr x,x ; 6 (2)
ldb <tabX+2 ; 4 (2) donc b est identique au précédent!
jmp <CCC ; 3 (2)
ldb ,-x ; 6 (2) | carry==1, on charge B tout en déplacant x
andb #$0F ; 2 (2) | haut ou bas de l'octet ?
bne BBB ; 3 (2) | si 0 ==> fin instrument:
stb <CCC-1 ; (2) | mute de la piste ou nop;nop si instrument à boucle
ldx #000 ; (3) | rebouclage
BBB orb #0 ; 2 (2) \|/ volume
CCC stb <tabX+2 ; 4 (2) => 28 (24) mis à jour canal "X"
* idem Y, U, et S => 4*28 = 112
* mixage
tabX ldb tab0 ; 5 (3) mixage canal X
tabY addb tab0 ; 5 (3) idem canal Y
tabU addb tab0 ; 5 (3) idem U
tabS addb tab0 ; 5 (3) idem S
stb $E7CD ; 5 (3) => 25 (15) sortie CNA
deca ; 2 (1)
bne loop ; 3 (2) => 142 == 7.0khz (x141==20ms)
Au niveau des modifs du player on voit qu'on lit les échantillons en remontant la mémoire (,-x) quand la carry du compteur est à 1, et donc quand la carry est à 0, on ne modifie pas la valeur de ce canal (cf tabX qui est relu et écrit dans le chemin de coté). C'est ca qui permet de marcher en temps constant tout en faisant gagner 3 cycles par rapport à la version "dither". La boucle est aussi plus courte et tient dans 128 octets permettant d'avoir un simple deca/bne à la fiin. Bref, ca tourne 40% plus vite. J'adore!
Je n'aurais jamais cru que je pouvais aller encore plus vite que la version "forever"
Comme quoi le semi échec sur le dither permettrait d'avoir un mode CNA encore plus performant, très proche de la qualité amiga d'origine dont les samples sont typiquement numérisés à 8khz.