1

Cette question va paraître inutile mais bon.

Voilà, je voudrais tester un bit à un endroit bien précis de la mémoire.

Du genre:

data:
dc.b 125,85,47,52....


data:
movem.l d0/d1/a0,-(a7)
lea.l data_ptr(PC),a0
move.b_ data_bitn,d1
btst d1,(a0)+
bne no_impulsion
bset #0,($60000E)
bra suite
no_impulsion:
bclr #0,($60000E)

suite:
addq.b #1,data_bitn
cmp.b #8,data_bitn
beq add_ptr_data
bra end_data

add_ptr_data:
addq.l #1,data_ptr
clr.b data_bitn

end_data:
movem.l (a7)+,d0/d1/a0
rts

Mais quand je fais btst d1,(a0)+ ça ne fonctionne pas. sad
avatar
la Nature nous montre seulement la queue du lion. Mais je suis certain que le lion a qui elle appartient pense qu'il ne peut pas se révéler en une fois en raison de son immense taille.

- Fondateur de Ti-Gen -: http://www.tigen.org

- Membre du Groupe Orage Studio -: http://oragestudio.free.fr/

- Mon site perso -: http://tisofts.free.fr

Projets TI68K en cours:
GFA-Basic = http://www.tigen.org/gfabasic
Arkanoid.
PolySnd 3.0.

2

c'est quoi _data_bitn et data_ptr ?

3

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)

4

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.
avatar
la Nature nous montre seulement la queue du lion. Mais je suis certain que le lion a qui elle appartient pense qu'il ne peut pas se révéler en une fois en raison de son immense taille.

- Fondateur de Ti-Gen -: http://www.tigen.org

- Membre du Groupe Orage Studio -: http://oragestudio.free.fr/

- Mon site perso -: http://tisofts.free.fr

Projets TI68K en cours:
GFA-Basic = http://www.tigen.org/gfabasic
Arkanoid.
PolySnd 3.0.

5

Au fait, ton coda 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)


Ah bon, il faut vaiment que ce code soit optimisé en vitesse, que dois-je faire?
avatar
la Nature nous montre seulement la queue du lion. Mais je suis certain que le lion a qui elle appartient pense qu'il ne peut pas se révéler en une fois en raison de son immense taille.

- Fondateur de Ti-Gen -: http://www.tigen.org

- Membre du Groupe Orage Studio -: http://oragestudio.free.fr/

- Mon site perso -: http://tisofts.free.fr

Projets TI68K en cours:
GFA-Basic = http://www.tigen.org/gfabasic
Arkanoid.
PolySnd 3.0.

6

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.

7

Euh ouais, il y a peut-être un peu trop de branchements, ça doit sûrement être optimisable à ce niveau là, mon exemple

8

Ah ouai, là je comprend mieux, l'optimisation. par contre je ne peut pas stocker l'adresse de data ou databitn dans un registre... Je ne peux faire ça que avec des variables. sad Je sais que s'est lent, mais je ne peux faire autrement.
avatar
la Nature nous montre seulement la queue du lion. Mais je suis certain que le lion a qui elle appartient pense qu'il ne peut pas se révéler en une fois en raison de son immense taille.

- Fondateur de Ti-Gen -: http://www.tigen.org

- Membre du Groupe Orage Studio -: http://oragestudio.free.fr/

- Mon site perso -: http://tisofts.free.fr

Projets TI68K en cours:
GFA-Basic = http://www.tigen.org/gfabasic
Arkanoid.
PolySnd 3.0.

9

Pourquoi tu ne peux pas stoquer le contenu de databitn dans un registre ?

10

>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 ++

11

Pourquoi (a0)+?


Pour extrait l'octet.

Pourquoi tu ne peux pas stoquer le contenu de databitn dans un registre ?

Ca à un rapport avec ma librairie et il met impossible de passer par le stack et encore moins par registre. Le test des bits ne ce fait pas en continue.
avatar
la Nature nous montre seulement la queue du lion. Mais je suis certain que le lion a qui elle appartient pense qu'il ne peut pas se révéler en une fois en raison de son immense taille.

- Fondateur de Ti-Gen -: http://www.tigen.org

- Membre du Groupe Orage Studio -: http://oragestudio.free.fr/

- Mon site perso -: http://tisofts.free.fr

Projets TI68K en cours:
GFA-Basic = http://www.tigen.org/gfabasic
Arkanoid.
PolySnd 3.0.

12

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.
avatar
la Nature nous montre seulement la queue du lion. Mais je suis certain que le lion a qui elle appartient pense qu'il ne peut pas se révéler en une fois en raison de son immense taille.

- Fondateur de Ti-Gen -: http://www.tigen.org

- Membre du Groupe Orage Studio -: http://oragestudio.free.fr/

- Mon site perso -: http://tisofts.free.fr

Projets TI68K en cours:
GFA-Basic = http://www.tigen.org/gfabasic
Arkanoid.
PolySnd 3.0.

13

Pourquoi (a0)+?
Pour extraire l'octet.
Mais pourquoi (a0)+ ? (la question portait sur le +)
Seb C bien

C bien, C beau, C ni Bosch ni Bush: C ++

14

ça permet de passer à la donnée suivante en incrémentant a0 (d'où le nom du label smile)
avatar
Que cache le pays des Dieux ? - Forum Ghibli - Forum Littéraire

La fin d'un monde souillé est venue. L'oiseau blanc plane dans le ciel annonçant le début d'une longue ère de purification. Détachons-nous à jamais de notre vie dans ce monde de souffrance. Ô toi l'oiseau blanc, l'être vêtu de bleu, guide nous vers ce monde de pureté. - Sutra originel dork.

15

Mais pourquoi (a0)+ ? (la question portait sur le +)


Excuse moi. En effet ça extrait la donnée puis désempile de 1 octet a0.
avatar
la Nature nous montre seulement la queue du lion. Mais je suis certain que le lion a qui elle appartient pense qu'il ne peut pas se révéler en une fois en raison de son immense taille.

- Fondateur de Ti-Gen -: http://www.tigen.org

- Membre du Groupe Orage Studio -: http://oragestudio.free.fr/

- Mon site perso -: http://tisofts.free.fr

Projets TI68K en cours:
GFA-Basic = http://www.tigen.org/gfabasic
Arkanoid.
PolySnd 3.0.

16

Pour lire bit par bit, moi, j'utiliserais:
 subq.b #1,d1
 bcc.s positive
 moveq.l #7,d1
 addq.l #1,a0
positive:
 btst.b d1,(a0)

Attention, ce n'est peut-être pas optimal.

Et c'est le type de parcours utilisé par exemple pour les sprites: on lit de gauche à droite. C'est-à-dire qu'on commence par le bit 7 et qu'on va jusqu'au bit 0.
avatar
Mes news pour calculatrices TI: Ti-Gen
Mes projets PC pour calculatrices TI: TIGCC, CalcForge (CalcForgeLP, Emu-TIGCC)
Mes chans IRC: #tigcc et #inspired sur irc.freequest.net (UTF-8)

Liberté, Égalité, Fraternité

17

Je propose cela:
data: 
	movem.l d0/d1/a0/a1,-(a7) 
	lea	data_ptr(PC),a0 
	move.l	(a0)+,a1
	move.b	(a0)+,d1
	moveq	#1,d0
	and.b	d1,d0
	move.b	d0,$60000E
	lsr.b	#1,d1	
	subq.b	#1,(a0)
	bne.s	\End
		move.b	#8,(a0)
		move.b	(a1)+,-(a0)
		move.l	a1,-(a0)
		movem.l (a7)+,d0/d1/a0/a1
		rts 		
\End:	move.b	d1,-(a0)
	movem.l (a7)+,d0/d1/a0/a1
	rts
	
data_ptr	dc.l	0
data_value	dc.b	0
data_bit	dc.b	0	


C'est fait a la va-vite.

18

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
avatar
la Nature nous montre seulement la queue du lion. Mais je suis certain que le lion a qui elle appartient pense qu'il ne peut pas se révéler en une fois en raison de son immense taille.

- Fondateur de Ti-Gen -: http://www.tigen.org

- Membre du Groupe Orage Studio -: http://oragestudio.free.fr/

- Mon site perso -: http://tisofts.free.fr

Projets TI68K en cours:
GFA-Basic = http://www.tigen.org/gfabasic
Arkanoid.
PolySnd 3.0.

19

Ce que voulais dire, pour mon plus c'est
_ pourquoi augmenter d'un byte(octet), alors que la logique est de passer au bit suivant, ce que fait déjà la fin de la routine:
addq.b #1,data_bitn
cmp.b #8,data_bitn
beq add_ptr_data
bra end_data

add_ptr_data:
addq.l #1,data_ptr
clr.b data_bitn 


_ pourquoi tu changes la valeur de a0, alors qu'a0 n'est plus utilsé jusqu'à ce que tu le restore.

Je t'accorde que c'est pas très important, mais éviter une incrémentation inutile serait un bon début.
Seb C bien

C bien, C beau, C ni Bosch ni Bush: C ++

20

Ca va pas ce que j'ai fait ?

21

Si si, il est plus rapide?
avatar
la Nature nous montre seulement la queue du lion. Mais je suis certain que le lion a qui elle appartient pense qu'il ne peut pas se révéler en une fois en raison de son immense taille.

- Fondateur de Ti-Gen -: http://www.tigen.org

- Membre du Groupe Orage Studio -: http://oragestudio.free.fr/

- Mon site perso -: http://tisofts.free.fr

Projets TI68K en cours:
GFA-Basic = http://www.tigen.org/gfabasic
Arkanoid.
PolySnd 3.0.

22

Comptes les cycles, tu verras. Ou benche smile

23

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.
avatar
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.

24

Ce n'est pas toujours ce bit qui va être testé

25

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.
avatar
Mes news pour calculatrices TI: Ti-Gen
Mes projets PC pour calculatrices TI: TIGCC, CalcForge (CalcForgeLP, Emu-TIGCC)
Mes chans IRC: #tigcc et #inspired sur irc.freequest.net (UTF-8)

Liberté, Égalité, Fraternité

26

C'est optimisable si le code qui suit n'est pas très long. C'est ce que je veux dire.
avatar
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.

27

C'est faux. On a besoin d'avoir 7 en %d1 la prochaîne fois que ce morceau de code est exécuté.
avatar
Mes news pour calculatrices TI: Ti-Gen
Mes projets PC pour calculatrices TI: TIGCC, CalcForge (CalcForgeLP, Emu-TIGCC)
Mes chans IRC: #tigcc et #inspired sur irc.freequest.net (UTF-8)

Liberté, Égalité, Fraternité

28

Ok.
avatar
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.