Page 2 sur 2

Publié : jeu. 14/déc./2006 18:51
par djes
J'ai commencé, mais je ne sais pas si je finirai ;)

Code : Tout sélectionner

poly_asm:     
  !zone_lam:  ;--  trie "y" par ordre croissant --------------------
     x=0
     y=0
     z=0
    !pushad											;sauve tous les registres généraux (en les mettant sur la pile)
    !lea      esi,[zbuffer]			;adresse du zbuffer à remplir -> esi
    !mov      [madzbuffer],esi	;->madzbuffer (une variable, voir plus bas)
    !cVTSS2SI eax,[v_ax1]				;on convertit les flottants en entiers, et on les balance dans les registres généraux (le maximum possible)
    !cVTSS2SI ebx,[v_ay1] 
    !cVTSS2SI ecx,[v_ax2]     
    !cVTSS2SI edx,[v_ay2] 
    !cVTSS2SI edi,[v_ax3]
    !cVTSS2SI esi,[v_ay3] 
    !MOVss    xmm0,[v_az1]			;les z dans les registres xm
    !movss    xmm1,[v_az2]
    !movss    xmm2,[v_az3]
   
   
    !CMP      ebx,esi						;cherche le y le plus haut (teste le contenu des deux registres)
    !Jnge     rien01_lam				; si nge-> not greater or equal (<), on continue
    !XCHG     ebx,esi						;sinon on inverse les points 1 et 3
    !XCHG     eax,edi
    !movss    xmm3,xmm0
    !movss    xmm0,xmm2
    !movss    xmm2,xmm3
!rien01_lam:
    !CMP      ebx,edx						;pareil pour les points 1 et 2
    !Jnge     rien02_lam
    !XCHG     ebx,edx
    !XCHG     eax,ecx
    !movss    xmm3,xmm0
    !movss    xmm0,xmm1
    !movss    xmm1,xmm3
!rien02_lam:     
    !CMP      edx,esi						;pareil pour les points 2 et 3
    !Jnge     rien03_lam
    !XCHG     edx,esi
    !XCHG     ecx,edi
    !movss    xmm3,xmm1
    !movss    xmm1,xmm2
    !movss    xmm2,xmm3
!rien03_lam: 
    !MOV      [fillx1],eax			;on balance tout dans des variables
    !MOV      [filly1],ebx
    !MOV      [fillx2],ecx   
    !MOV      [filly2],edx 
    !MOV      [fillx3],edi
    !MOV      [filly3],esi
    !MOVss    [fillz1],xmm0
    !MOVss    [fillz2],xmm1
    !MOVss    [fillz3],xmm2