int bit_count(long x asm("%d0"));
bit_count: moveq.l #33,%d1 Loop: subq.w #1,%d1 add.l %d0,%d0 bcc.s Loop rtsMais ça suppose qu'on a dans d0 une valeur non nulle.
bit_count: moveq.l #33,%d1 Loop: subq.w #1,%d1 add.l %d0,%d0 bcc.s Loop rtsMais ça suppose qu'on a dans d0 une valeur non nulle.
;C prototype: BOOL CollideSprite32 (short x0,short y0,short x1,short y1,unsigned char h,void *sprite0,void *sprite1) ; ;BOOL CollideSprite32 (register short x0 asm ("%d0"), ; register short y0 asm ("%d1"), ; register short x1 asm ("%d2"), ; register short y1 asm ("%d3"), ; register unsigned char h asm ("%d4"), ; register void *sprite0 asm ("%a0"), ; register void *sprite1 asm ("%a1")); xdef CollideSprite32 CollideSprite32: ;if (x0>x1) cmp.w d2,d0 bhi.s _x0_superior sub.w d0,d2 bra.s _continue _x0_superior: sub.w d2,d0 move.w d0,d2 exg a0,a1 exg d1,d3 ;dx->d2 _continue: cmp.w #32,d2 bge.s _no_collide cmp.w d3,d1 bge.s _y1_superior sub.w d1,d3 move.w d3,d1 lsl.w #2,d3 add.l d3,a0 bra.s _continue1 _y1_superior: sub.w d3,d1 move.w d1,d3 lsl.w #2,d3 add.l d3,a1 _continue1: cmp.w d4,d1 blt.s _test_collide move.l #0,d0 rts _test_collide: addq.l #1,d1 move.l (a0)+,d0 move.l (a1)+,d3 lsl.l d2,d3 and.l d0,d3 tst.l d3 beq.s _continue1 moveq.l #1,d0 rts _no_collide: moveq.l #0,d0 rts
//Teste collision entre sprite de 32 pixels short TestCollideSprite32 (short x0, short y0, short x1, short y1, unsigned char h, unsigned long *sprite0, unsigned long *sprite1) { short dx,dy,i; //Sprite 0 à droite de sprite 1 if (x0<x1) dx=x1-x0; else { //Si sprite0 est à droite de sprite 1 juste //echanger les variables dx=x0-x1; SWAPDATA (sprite0,sprite1); SWAPDATA (y0,y1); } if (dx>=32) return 0; //Aucune collision if (y0<y1) { dy=y1-y0; sprite1+=dy; } else { dy=y0-y1; sprite0+=dy; } for (i=dy;i<h;i++,sprite0++,sprite1++) { if ((((unsigned long)*sprite1)<<dx) & (((unsigned long)*sprite0))) return 1; } return 0; }
Une fois n'est pas coutume
geogeoOu bien je me suis trompé dans mon raisonnement.
: Je vais m'en passer mais ce que je ne comprend pas c'est pourquoi ma routine en C fonctionne à merveille? TIGCC apporte des modifications?
geogeo
: Ce que j'aime bien c'est que moi je ne dois pas poster dans tes topics quand tu me le demande
Je m'ennuyais, donc j'ai essayé de le faire en ASM. ;short CollideSprite32 (register short x0 asm ("%d0"), ; register short y0 asm ("%d1"), ; register short x1 asm ("%d2"), ; register short y1 asm ("%d3"), ; register unsigned char h asm ("%d4"), ; register void *sprite0 asm ("%a0"), ; register void *sprite1 asm ("%a1")); xdef CollideSprite32 CollideSprite32: move.w d3,-(a7) ;if (x0>x1) cmp.w d2,d0 bls.s _x1_superior exg.w d0,d2 exg.w d1,d3 exg.l a0,a1 _x1_superior: sub.w d0,d2 ;dx->d2 cmpi.w #32,d2 bge.s _no_collide cmp.w d3,d1 bge.s _y0_superior sub.w d1,d3 move.w d3,d1 lsl.w #2,d3 add.w d3,a0 bra.s _continue1 _y0_superior: sub.w d3,d1 move.w d1,d3 lsl.w #2,d3 add.w d3,a1 _continue1: cmp.w d4,d1 bge.s _no_collide addq.w #1,d1 move.l (a0)+,d0 move.l (a1)+,d3 lsr.l d2,d3 and.l d3,d0 beq.s _continue1 move.w (a7)+,d3 rts _Est-ce que ça marche ? Je n'ai pas testé.
geogeo :
Je comprend pas, j'essaye de transformer la routine en C en ASM et la routine en ASM ne fonctionne par parfaitement.
Sasume
: Kevin> Quand on fait [code]a>>b[/code], la partie gauche de a est forcément remplie de 0 ?
Kevin KoflerOK, c'est ce qui me semble le plus logique.
:Sasume
: Kevin> Quand on fait [code]a>>b[/code], la partie gauche de a est forcément remplie de 0 ?
Non, si a est signé et négatif, alors elle est remplie de 1.
Si a est signé, >> est compilé en asr, pas lsr.
L (Rouge) = Laser. E (Bleu) = Grande raquette. M (Blanc)= 3 billes qui ce régénère. S (OR) = Ralentissement de la bille (vitesse d’origine). C (Vert) = Colle permettant de rattraper la balle et de la viser où on veut. P (Gris) = Vie supplémentaire. B (Rose) = Passage au niveau suivant... D (Cyan) = 5 balles. Si l'une d'elles tombent, elles tombent toute. I (Vert) = Traînée Fantôme. R (Noir) = Rétrécissement de la raquette. M (Rose) = Bille de feu. T (Bleu) = Double raquette moyenne. OR = Combinaison