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