c'est quoi _data_bitn et data_ptr ?
jackiechan Le 08/07/2003 à 12:30Edité par jackiechan le 08/07/2003 à 12:48 Au fait, ton code n'utilise presque que des adresse absolues.
En plus d'être relativement lent, ça fait grossir la taille de l'exécutable pour fournir la table de relogements et ça ralentit le lancement du programme (mais ça c'est négligeable)
Data_bitn s'est le bit n° à extraire dans l'octet en court.
En bref je veux parcourir une série de données bit à bit. Si le bit est à 1, impulsion, sinon pas d'impulsion.
J'avance mon pointeur de données data_ptr, lorsque j'ai finis de parcourir tout les bit de l'octet en cours.
Tu peux mettre l'adresse de DataBitn dans un registre d'adresse, et au lieu de faire addq.b #1,DataBitn, tu ferais addq.b #1,(a0), ce qui serait déjà bien plus rapide.
Ou bien, tu peux mettre DataBitn dans un registre pendant toute la fonction et à la fin seulement, tu fais un move.b d1,DataBitn.
Ou bien, si possible, tu n'utilises pas du tout de variable globale, tu n'utilises qu'un registre (impossible si plusieurs fonctions se servent de DataBitn).
Mais à mon avis, une autre technique à essayer (de tête, je ne sais pas si ce sera plus rapide, mais c'est possible), c'est un truc du genre :
DonnéeSuivante:
move.b (a0)+,d0
Boucle:
lsr.b #1,d0
beq.s DonnéeSuivante
bcc.s no_impulsion
bset.b #0,$60000E
bra.s Boucle
no_impulsion:
bclr.b #0,$60000E
bra.s Boucle
Bon, là ça ne marcherait pas parce que ça bouclerait à l'infini, mais c'est pour que tu voies le principe.
Euh ouais, il y a peut-être un peu trop de branchements, ça doit sûrement être optimisable à ce niveau là, mon exemple
Pourquoi tu ne peux pas stoquer le contenu de databitn dans un registre ?
>geogeo>btst d1,(a0)+
Pourquoi (a0)+?
Pour les vars, si tu peux pas les passer par registres, tu peux peut-être par la stack?
Seb C bien
C bien, C beau, C ni Bosch ni Bush: C ++
Voilà je veins de créer la fonction et ça fonctionne très bien. Mais je ne voit pas ce que je peux optimiser dans le cas où je ne peux pas utiliser de registre ou le stack pour sauvegarder mon pointeur et le le numéro du bit à tester.
J'avais fait ça:
move.l d0,-(a7)
move.l a0,-(a7)
move.l wav_ptr(PC),a0
move.b wav_bit,d0
btst d0,(a0)+
beq no_impulsion
bset #0,($60000E)
bra suite_wav
no_impulsion:
bclr #0,($60000E)
suite_wav:
addq.b #1,wav_bit
cmp.b #8,wav_bit
ble end_wav
add_ptr_wav:
addq.l #1,wav_ptr
clr.b wav_bit
end_wav:
move.l (a7)+,a0
move.l (a7)+,d0
bra done_voice2
PpHd Le 09/07/2003 à 12:57 Ca va pas ce que j'ai fait ?
Si si, il est plus rapide?
i vu moveq.l #7,d1
...
btst.b d1,(a0)J'ai pas trop lu, la flemme, mais j'aPour tester le dernier bit d'un octet, il y a plus rapide.

Un site complet sur lequel vous trouverez des programmes et des jeux pour votre calculatrice TI 89 / Titanium / 92+ / Voyage 200 :
www.ti-fr.com.
Quelques idées personnelles
ici.
Ce n'est pas toujours ce bit qui va être testé
Lis ce qu'il y a entre les deux, et au-dessus aussi, et tu sauras pourquoi j'ai fait comme ça... C'est un exemple parfait de citation hors du contexte.
C'est optimisable si le code qui suit n'est pas très long. C'est ce que je veux dire.

Un site complet sur lequel vous trouverez des programmes et des jeux pour votre calculatrice TI 89 / Titanium / 92+ / Voyage 200 :
www.ti-fr.com.
Quelques idées personnelles
ici.
C'est faux. On a besoin d'avoir 7 en %d1 la prochaîne fois que ce morceau de code est exécuté.