tracage de ligne en assempleur

Pour discuter de l'assembleur
tonton
Messages : 315
Inscription : mar. 26/avr./2005 15:19

tracage de ligne en assempleur

Message par tonton »

le tacage de ligne de purebasic et relativement lent.
voici une routine en assembleur integré dans un programme qui trace
beaucoup de ligne.
au lancement du programme c 'est le tracage en purebasic.

pour activer la routne assembleur, metre un";" devant les lignes suivantes:

; LineXY (x,y+z,tableau(mempoint+1),tableau2(mempoint+1),RGB(0,255,0))
; LineXY (tableau(mempoint),tableau2(mempoint),tableau(mempoint+1),tableau2(mempoint+1),RGB(0,255,0))
; LineXY (x,y+z,x2,y2,RGB(0,255,0))
; LineXY (x2,y2,tableau(mempoint),tableau2(mempoint),RGB(0,255,0))
; LineXY (x,y+z,tableau(mempoint+1),tableau2(mempoint+1),RGB(0,255,0))
; LineXY (tableau(mempoint),tableau2(mempoint),tableau(mempoint+1),tableau2(mempoint+1),RGB(0,255,0))
; LineXY (x,y+z,x2,y2,RGB(0,255,0))
; LineXY (x2,y2,tableau(mempoint),tableau2(mempoint),RGB(0,255,0))
; Goto pas_asm


Code : Tout sélectionner

InitSprite()
InitKeyboard()
InitMouse()
OpenScreen(1024,768, 32, "")
 
Dim tableau(1500)
Dim tableau2(1500)


   
   x1.f
   y1.f
   posi.f
   a.f
   mempoint=0
    
     emp=0          ;amplitude de depart
     ampli=1
  
     
    z=0
    b=100
    prem=0
    posi=3  
    limite =posi*70
    zoom=200
    npt=0
  ptx=0
  ptx1=0
  pty=0
  pty1=0

deb1:
 emp+ampli
 If emp>20
 ampli=-ampli
 EndIf
 If emp<-20
 ampli=-ampli
 EndIf
 
; emp=-10 
  prem=0
  x=205
  y=300
  a=0
  x1=-150
  y1=-150
 
 StartDrawing(ScreenOutput())
 addecr = DrawingBuffer() 

Gosub dessin   
;Goto finie  
  prempt=0 
  x2=0
  y2=0
dessin1:
     

      coox=x
      cooy=(y+z)

           x=x+8
           x1=x1+4
       z=(Cos((Sqr((x1*x1)/zoom+(y1*y1)/zoom))))*emp       
  
             
           If npt<100
           If prempt=1
           coo=(y+z)
 
             LineXY (x,y+z,tableau(mempoint+1),tableau2(mempoint+1),RGB(0,255,0))
             LineXY (tableau(mempoint),tableau2(mempoint),tableau(mempoint+1),tableau2(mempoint+1),RGB(0,255,0))
             LineXY (x,y+z,x2,y2,RGB(0,255,0))
             LineXY (x2,y2,tableau(mempoint),tableau2(mempoint),RGB(0,255,0))
                LineXY (x,y+z,tableau(mempoint+1),tableau2(mempoint+1),RGB(0,255,0))
             LineXY (tableau(mempoint),tableau2(mempoint),tableau(mempoint+1),tableau2(mempoint+1),RGB(0,255,0))
             LineXY (x,y+z,x2,y2,RGB(0,255,0))
            LineXY (x2,y2,tableau(mempoint),tableau2(mempoint),RGB(0,255,0))
            Goto pas_asm 
 
           ptx=x
           pty=y+z
           ptx1=tableau(mempoint+1)
           pty1=tableau2(mempoint+1)
           Gosub tracage
           ptx=tableau(mempoint)
           pty=tableau2(mempoint)
           ptx1=tableau(mempoint+1)
           pty1=tableau2(mempoint+1)
           Gosub tracage
           ptx=x
           pty=y+z
           ptx1=x2
           pty1=y2
           Gosub tracage
           ptx=x2
           pty=y2
           ptx1=tableau(mempoint)
           pty1=tableau2(mempoint)
           Gosub tracage
             ptx=x
           pty=y+z
           ptx1=tableau(mempoint+1)
           pty1=tableau2(mempoint+1)
           Gosub tracage
           ptx=tableau(mempoint)
           pty=tableau2(mempoint)
           ptx1=tableau(mempoint+1)
           pty1=tableau2(mempoint+1)
           Gosub tracage
           ptx=x
           pty=y+z
           ptx1=x2
           pty1=y2
           Gosub tracage
           ptx=x2
           pty=y2
           ptx1=tableau(mempoint)
           pty1=tableau2(mempoint)
           Gosub tracage

pas_asm:           
                                                    
                         tableau(mempoint)=x2
                         tableau2(mempoint)=y2
             mempoint=mempoint+1
         
                                                              
              EndIf 
              x2=x
              y2=y+z

             prempt=1
          npt=npt+1
      Goto dessin1
           EndIf
         tableau(mempoint)=x2
         tableau2(mempoint)=y2
  
     mempoint=0
     npt=0
   prempt=0  
  x=205
  x1=-150
y1=y1+7.6;3.8
     a=a+posi
     ADD y,4
       
   x=x-a
    If a <limite
   Goto dessin1
   EndIf
   
finie:   
 
 FlipBuffers()
 ClearScreen(0,0,0)
 StopDrawing()
 
   stopit:
  ExamineKeyboard() 
  
    If KeyboardPushed(#PB_Key_Left) 
     posampli=posampli+1
     negampli=negampli-1
     emp=emp+1
    EndIf
    If KeyboardPushed(#PB_Key_Right) 
   posampli=posampli-1
     negampli=negampli+1
     emp=emp-1
     EndIf
   If KeyboardPushed(#PB_Key_Up) 
     zoom=zoom+1
    EndIf
    If KeyboardPushed(#PB_Key_Down) 
   zoom=zoom-1
    EndIf
  If KeyboardPushed(#PB_Key_Escape) 
     StopDrawing()
    End
   EndIf
    If KeyboardPushed(#pb_key_a)
    Goto stopit
    EndIf
   
 
   Goto deb1
   
   
   dessin:
     
      coox=x
      cooy=(y+z)

            x=x+8
           x1=x1+4
       z=(Cos((Sqr((x1*x1)/zoom+(y1*y1)/zoom))))*emp       
   
           If npt<100
             Plot(x,y+z,RGB(0,255,0))
             tableau(mempoint)=x
             tableau2(mempoint)=y+z
             mempoint =mempoint+1
          npt=npt+1   

      Goto dessin
     EndIf
     npt=0
      x=205
  x1=-150
y1=y1+7.6;3.8
     a=a+posi
     ADD y,4
       
   x=x-a
   mempoint=0
        Return
        
tracage:        
     difx=0
  dify=0
  
  
  MOV  eax,ptx1  
  SUB  eax,ptx
  JNS  l_positifx
  NEG  eax
positifx:
  INC  eax
  MOV  difx,eax 
  MOV  eax,pty1  
  SUB  eax,pty
  JNS  l_positify
  NEG  eax
positify:
  INC  eax
  MOV  dify,eax 
  
  MOV  eax,ptx1
  CMP  eax,ptx
  JGE  l_gd
dg:  
  MOV  eax,pty1
  CMP  eax,pty
  JLE  l_bh1
  
  MOV  eax,difx
  CMP  eax,dify
  JGE  l_line5
  JMP  l_line6 
bh1:
  MOV  eax,difx
  CMP  eax,dify
  JGE  l_line7
  JMP  l_line8  
gd: 
  MOV  eax,pty1
  CMP  eax,pty
  JLE  l_bh
  MOV  eax,difx
  CMP  eax,dify
  JGE  l_line1
  JMP  l_line2  
bh:
  MOV  eax,difx
  CMP  eax,dify
  JGE  l_line3
  JMP  l_line4

line1:
 
  MOV  eax,ptx
  ROL  eax,2
  MOV  ebx,pty
  ROL  ebx,8
  ROL  ebx,4
  ADD  eax,ebx
  MOV  edi,addecr
  ADD  edi,eax
  MOV  ecx,difx
  MOV  ebx,dify
  MOV  edx,ecx
  MOV  esi,edx
  MOV  eax,000ff00h 
 
depx:  
  SUB  edx,ebx
  JGE  l_depx1
  ADD  edi,4096
  ADD  edx,esi
depx1: 
  MOV  [edi],eax
  ADD  edi,4
  LOOP l_depx
  JMP  l_fintrace 

  
  
line2:
  MOV  eax,ptx1
  ROL  eax,2
  MOV  ebx,pty1
  ROL  ebx,8
  ROL  ebx,4
  ADD  eax,ebx
  MOV  edi,addecr
  ADD  edi,eax
  MOV  ecx,dify
  MOV  ebx,difx
  MOV  edx,ecx
  MOV  esi,edx
  MOV  eax,000ff00h 
depx2:  
  SUB  edx,ebx
  JGE  l_depx12
  SUB  edi,4
  ADD  edx,esi
depx12: 
  MOV  [edi],eax
  SUB  edi,4096
  LOOP l_depx2
  JMP  l_fintrace

line3:
  MOV  eax,ptx
  ROL  eax,2
  MOV  ebx,pty
  ROL  ebx,8
  ROL  ebx,4
  ADD  eax,ebx
  MOV  edi,addecr
  ADD  edi,eax
  MOV  ecx,difx
  MOV  ebx,dify
  MOV  edx,difx
  MOV  esi,edx
  MOV  eax,000ff00h 
 
depx3:  
  SUB  edx,ebx
  JGE  l_depx13
  SUB  edi,4096
  ADD  edx,esi
depx13: 
  MOV  [edi],eax
  ADD  edi,4
  LOOP l_depx3
  JMP  l_fintrace 
  

line4:
  MOV  eax,ptx
  ROL  eax,2
  MOV  ebx,pty
  ROL  ebx,8
  ROL  ebx,4
  ADD  eax,ebx
  MOV  edi,addecr
  ADD  edi,eax
  MOV  ecx,dify
  MOV  ebx,difx
  MOV  edx,dify
  MOV  esi,edx
  MOV  eax,000ff00h 
 
depx4:  
  SUB  edx,ebx
  JGE  l_depx14
  ADD  edi,4
  ADD  edx,esi
depx14: 
  MOV  [edi],eax
  SUB  edi,4096
  LOOP l_depx4
  JMP  l_fintrace 

line5:
 
  MOV  eax,ptx1
  ROL  eax,2
  MOV  ebx,pty1
  ROL  ebx,8
  ROL  ebx,4
  ADD  eax,ebx
  MOV  edi,addecr
  ADD  edi,eax
  MOV  ecx,difx
  MOV  ebx,dify
  MOV  edx,ecx
  MOV  esi,edx
  MOV  eax,000ff00h 
 
depx5:  
  SUB  edx,ebx
  JGE  l_depx15
  SUB  edi,4096
  ADD  edx,esi
depx15: 
  MOV  [edi],eax
  ADD  edi,4
  LOOP l_depx5
  JMP  l_fintrace 

  
  
line6:
  MOV  eax,ptx1
  ROL  eax,2
  MOV  ebx,pty1
  ROL  ebx,8
  ROL  ebx,4
  ADD  eax,ebx
  MOV  edi,addecr
  ADD  edi,eax
  MOV  ecx,dify
  MOV  ebx,difx
  MOV  edx,ecx
  MOV  esi,edx
  MOV  eax,000ff00h 
depx6:  
  SUB  edx,ebx
  JGE  l_depx16
  ADD  edi,4
  ADD  edx,esi
depx16: 
  MOV  [edi],eax
  SUB  edi,4096
  LOOP l_depx6
  JMP  l_fintrace

line7:
  MOV  eax,ptx
  ROL  eax,2
  MOV  ebx,pty
  ROL  ebx,8
  ROL  ebx,4
  ADD  eax,ebx
  MOV  edi,addecr
  ADD  edi,eax
  MOV  ecx,difx
  MOV  ebx,dify
  MOV  edx,difx
  MOV  esi,edx
  MOV  eax,000ff00h 
 
depx7:  
  SUB  edx,ebx
  JGE  l_depx17
  SUB  edi,4096
  ADD  edx,esi
depx17: 
  MOV  [edi],eax
  SUB  edi,4
  LOOP l_depx7
  JMP  l_fintrace 
  

line8:
  MOV  eax,ptx1
  ROL  eax,2
  MOV  ebx,pty1
  ROL  ebx,8
  ROL  ebx,4
  ADD  eax,ebx
  MOV  edi,addecr
  ADD  edi,eax
  MOV  ecx,dify
  MOV  ebx,difx
  MOV  edx,dify
  MOV  esi,edx
  MOV  eax,000ff00h 
 
depx8:  
  SUB  edx,ebx
  JGE  l_depx18
  ADD  edi,4
  ADD  edx,esi
depx18: 
  MOV  [edi],eax
  ADD  edi,4096
  LOOP l_depx8
  JMP  l_fintrace 
  
 fintrace:  
Return
     

    End
  
erix14
Messages : 480
Inscription : sam. 27/mars/2004 16:44
Contact :

Message par erix14 »

Effectivement, ta routine en assembleur est beaucoup plus rapide.
Très beau travail :D
Avatar de l’utilisateur
djes
Messages : 4252
Inscription : ven. 11/févr./2005 17:34
Localisation : Arras, France

Message par djes »

Cool! On commence à être bien équipé! ;) Sur amiga, on s'amusait souvent à faire des concours d'optim de ce genre de routines... C'est ton cas aussi?
comtois
Messages : 5186
Inscription : mer. 21/janv./2004 17:48
Contact :

Message par comtois »

euh , tu n'aurais pas quelque chose pour remplacer la fonction Plot() qui est assez lente ?
Avatar de l’utilisateur
djes
Messages : 4252
Inscription : ven. 11/févr./2005 17:34
Localisation : Arras, France

Message par djes »

Le problème avec toutes ces fonctions optimisées (je parle du plot), c'est qu'elles accédent directement au hard. N'oublions pas que sous windows, c'est carrêment déconseillé, ou alors il faut prendre en compte les différents formats de couleurs, etc, et Dieu sait si dans quelques années ce sera encore compatible. Je pense qu'il vaut mieux rester dans la logique (pourrave) de Microsoft et n'optimiser que les algos qui peuvent l'être, et utiliser les fonctions système pour le reste, même si ça m'arrache la g* de dire ça.
KarLKoX
Messages : 1191
Inscription : jeu. 26/févr./2004 15:36
Localisation : France
Contact :

Message par KarLKoX »

Ce n'est pas vrais : tu parlerais de la programmation DOS ou de pilotes, je ne dit pas mais les optimisations asm, quand elles ne sont pas spécifiques à du matériel, ne casse pas la rétrocompatibilité. (cf le mmx, sse, sse2, 3dnow ...)
C'est juste que l'asm, dans certain cas, est plus efficient car plus proche du hard.
De plus, rien n'empêche de programmer en asm tout en restant dans la philosophie windowsienne (cf masm ou ... fasm).
"Qui baise trop bouffe un poil." P. Desproges
tonton
Messages : 315
Inscription : mar. 26/avr./2005 15:19

Message par tonton »

salut

pour comtois ,la fonction plot est assez rapide sur purbasic, il faut vraiment tracé beaucoup de point sur un programme tres leger pour
faire la difference
voici un exemple:

Code : Tout sélectionner

  plotx=0
  ploty=0
  plotcoul=100
  
InitSprite()
InitKeyboard()

OpenScreen(1024,768, 32, "")
deb:
x=0
y=0
 
 StartDrawing(ScreenOutput())
 addecr = DrawingBuffer() 
 FlipBuffers()
 
affichage: 
      
  x+1
  If plotx>1023
  x=0
  y+1
  EndIf
  If y>767
  y=0
  x=0
  plotcoul+50
  
  EndIf
  If plotcoul>25500
  pltcoul=0
    Goto finaffichage:
  EndIf
  plotx=x
  ploty=y
  
  
   
 ; Plot (plotx,ploty,plotcoul)
  
 Gosub affplot
 
 
 Goto affichage
finaffichage: 
 StopDrawing()
finprog: 
  ExamineKeyboard() 
 
  If KeyboardPushed(#PB_Key_Escape) 
  End
       EndIf
  
 Goto finprog 

affplot: 
  MOV  eax,plotx
  ROL  eax,2
  MOV  edi,ploty
  ROL  edi,12      
  ADD  edi,eax
  ADD  edi,addecr
  MOV  eax,plotcoul 
  MOV  [edi],eax
 Return
 
  
ce petit programme rempli l ecran de points avec un "plot" en assembleur.

pour passer en "plot" purbasic modifier par:

Plot (plotx,ploty,plotcoul)

;Gosub affplot

tu verras, le gain n est meme pas de 2
c 'est surtout pour le tracage de ligne que le gain est proche de 20
Avatar de l’utilisateur
djes
Messages : 4252
Inscription : ven. 11/févr./2005 17:34
Localisation : Arras, France

Message par djes »

KarLKoX a écrit :Ce n'est pas vrais : tu parlerais de la programmation DOS ou de pilotes, je ne dit pas mais les optimisations asm, quand elles ne sont pas spécifiques à du matériel, ne casse pas la rétrocompatibilité. (cf le mmx, sse, sse2, 3dnow ...)
C'est juste que l'asm, dans certain cas, est plus efficient car plus proche du hard.
De plus, rien n'empêche de programmer en asm tout en restant dans la philosophie windowsienne (cf masm ou ... fasm).
Je parlais bien de fonctions spécifiques à du matériel... en l'occurence pour le plot, la façon dont les cartes graphiques gèrent la mémoire. Qui sait si dans quelques temps, l'accès direct ne sera pas totalement impossible, ou n'utilisera plus de mode classiques 16/24/32 bits. Déjà, là on utilise les sprites de pure pour la copie mem->mem gfx.

Enfin je dis ça parce que personnellement ça m'embête de devoir gérer les différentes représentations mémoire RGBA ABGR etc, pour être parfaitement compatible. A chaque fois, j'ai l'impression de faire de la bidouille sans être sûr que mes progs seront toujours éxécutables.

Enfin, c'est plus un débat qu'une certitude, car je suis pro-asm! :)
tonton
Messages : 315
Inscription : mar. 26/avr./2005 15:19

Message par tonton »

:D
encore mes courbes, mais avec remplissage de zones.
effet fluorescent.

Code : Tout sélectionner

InitSprite()
InitKeyboard()
InitMouse()
OpenScreen(1024,768, 32, "")

 
Dim tableau(1500)
Dim tableau2(1500)
  addd=?dat
  addd1=addd
totpt=0
linn=0
 lindroit=0
 ptx=0
 pty=0
 ptx1=0
 pty1=0
    difx=0 
  dify=0 
fillcoul=$00ff00

   
   x1.f
   y1.f
   posi.f
   a.f
   mempoint=0
    
     emp=51          ;amplitude de depart
     ampli=2
  
     
    z=0
    b=100
    prem=0
    posi=3  
    limite =posi*70
    zoom=200
    npt=0
  ptx=0
  ptx1=0
  pty=0
  pty1=0

deb1:
 emp+ampli
 If emp>70
 ampli=-ampli
 EndIf
 If emp<-70
 ampli=-ampli
 EndIf
 
; emp=-10 
  prem=0
  x=205
  y=300
  a=0
  x1=-150
  y1=-150
 
 StartDrawing(ScreenOutput())
 addecr = DrawingBuffer() 
 

Gosub dessin   
;Goto finie  
  prempt=0 
  x2=0
  y2=0
dessin1:
     

      coox=x
      cooy=(y+z)

           x=x+8
           x1=x1+3
       z=(Cos((Sqr((x1*x1)/zoom+(y1*y1)/zoom))))*emp       
  
             
           If npt<100
           If prempt=1
           coo=(y+z)
 
          fillcoul=(((y2-(y1))/2)+$8f)
           plotx3=tableau(mempoint+1)
           ploty3=tableau2(mempoint+1)
           plotx2=tableau(mempoint)
           ploty2=tableau2(mempoint)
           plotx1=x
           ploty1=y+z
           Gosub tracageline
           plotx3=tableau(mempoint)
           ploty3=tableau2(mempoint)
           plotx1=x2
           ploty1=y2
           plotx2=x
           ploty2=y+z
           Gosub tracageline
           
                                                    
                         tableau(mempoint)=x2
                         tableau2(mempoint)=y2
             mempoint=mempoint+1
         
                                                              
              EndIf 
              x2=x
              y2=y+z

             prempt=1
          npt=npt+1
      Goto dessin1
           EndIf
         tableau(mempoint)=x2
         tableau2(mempoint)=y2
  
     mempoint=0
     npt=0
   prempt=0  
  x=205
  x1=-150
y1=y1+4.8;1.6;3.8
     a=a+posi
     ADD y,4
       
   x=x-a
    If a <limite
   Goto dessin1
   EndIf
   
finie:   
 
 FlipBuffers()
 ClearScreen(0,0,0)
 StopDrawing()
 
   stopit:
  ExamineKeyboard() 
  
    If KeyboardPushed(#PB_Key_Left) 
     posampli=posampli+1
     negampli=negampli-1
     emp=emp+1
    EndIf
    If KeyboardPushed(#PB_Key_Right) 
   posampli=posampli-1
     negampli=negampli+1
     emp=emp-1
     EndIf
   If KeyboardPushed(#PB_Key_Up) 
     zoom=zoom+1
    EndIf
    If KeyboardPushed(#PB_Key_Down) 
   zoom=zoom-1
    EndIf
  If KeyboardPushed(#PB_Key_Escape) 
     StopDrawing()
    End
   EndIf
    If KeyboardPushed(#pb_key_a)
    Goto stopit
    EndIf
   
 
   Goto deb1
   
   
   dessin:
     
      coox=x
      cooy=(y+z)

            x=x+8
           x1=x1+3
       z=(Cos((Sqr((x1*x1)/zoom+(y1*y1)/zoom))))*emp       
   
           If npt<100
          ;   Plot(x,y+z,RGB(0,255,0))
             tableau(mempoint)=x
             tableau2(mempoint)=y+z
             mempoint =mempoint+1
          npt=npt+1   

      Goto dessin
     EndIf
     npt=0
      x=205
  x1=-150
y1=y1+4.8
     a=a+posi
     ADD y,4
       
   x=x-a
   mempoint=0
        Return
        
        
        
tracageline:   
addd=addd1
   MOV   eax,ploty1
   CMP   eax,ploty2
   JG    l_condfill6
 
   MOV   eax,ploty2
   CMP   eax,ploty3
   JG    l_condfill3
      
   MOV   eax,ploty3
   SUB   eax,ploty1
   INC   eax
   MOV   linn,eax
     
   MOV   eax,plotx1
   MOV   ptx,eax
   MOV   eax,ploty1
   MOV   pty,eax
   MOV   eax,plotx2
   MOV   ptx1,eax
   MOV   eax,ploty2
   MOV   pty1,eax
   
    CALL  l_tracage
   
   MOV   eax,plotx2
   MOV   ptx,eax
   MOV   eax,ploty2
   MOV   pty,eax
   MOV   eax,plotx3
   MOV   ptx1,eax
   MOV   eax,ploty3
   MOV   pty1,eax
 
   CALL  l_tracage
   
   MOV   eax,addd1
   ADD   eax,4
   MOV   addd,eax
   MOV   eax,plotx1
   MOV   ptx,eax
   MOV   eax,ploty1
   MOV   pty,eax
   MOV   eax,plotx3
   MOV   ptx1,eax
   MOV   eax,ploty3
   MOV   pty1,eax
 
   CALL  l_tracage
   
   JMP   l_fincond
   
      ;********************************************************************************
        
condfill3:   
   MOV   eax,ploty1
   CMP   eax,ploty3
   JNGE  l_condfill4

   MOV   eax,ploty2
   SUB   eax,ploty3
   INC   eax
   MOV   linn,eax
   
   MOV   eax,plotx3
   MOV   ptx,eax
   MOV   eax,ploty3
   MOV   pty,eax
   MOV   eax,plotx1
   MOV   ptx1,eax
   MOV   eax,ploty1
   MOV   pty1,eax
  
   CALL  l_tracage
  
   MOV   eax,plotx1
   MOV   ptx,eax
   MOV   eax,ploty1
   MOV   pty,eax
   MOV   eax,plotx2
   MOV   ptx1,eax
   MOV   eax,ploty2
   MOV   pty1,eax
  
   CALL  l_tracage
   
   MOV   eax,addd1
   ADD   eax,4
   MOV   addd,eax
   MOV   eax,plotx3
   MOV   ptx,eax
   MOV   eax,ploty3
   MOV   pty,eax
   MOV   eax,plotx2
   MOV   ptx1,eax
   MOV   eax,ploty2
   MOV   pty1,eax
 
   CALL  l_tracage
   
   JMP   l_fincond
 ;*****************************************************************************************
 condfill4:  
   MOV   eax,ploty2
   SUB   eax,ploty1
   INC   eax
   MOV   linn,eax
   
   MOV   eax,plotx1
   MOV   ptx,eax
   MOV   eax,ploty1
   MOV   pty,eax
   MOV   eax,plotx3
   MOV   ptx1,eax
   MOV   eax,ploty3
   MOV   pty1,eax
 
   CALL  l_tracage;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  
   MOV   eax,plotx3
   MOV   ptx,eax
   MOV   eax,ploty3
   MOV   pty,eax
   MOV   eax,plotx2
   MOV   ptx1,eax
   MOV   eax,ploty2
   MOV   pty1,eax
 
   CALL  l_tracage
   
   MOV   eax,addd1
   ADD   eax,4
   MOV   addd,eax
   MOV   eax,plotx1
   MOV   ptx,eax
   MOV   eax,ploty1
   MOV   pty,eax
   MOV   eax,plotx2
   MOV   ptx1,eax
   MOV   eax,ploty2
   MOV   pty1,eax
  
   CALL  l_tracage
   
   JMP   l_fincond
  
   
  ;*****************************************************************************
condfill6:   
   MOV   eax,ploty1
   CMP   eax,ploty3
   JGE   l_supy1a

   MOV   eax,ploty3
   SUB   eax,ploty2
   INC   eax
   MOV   linn,eax
   
   MOV   eax,plotx2
   MOV   ptx,eax
   MOV   eax,ploty2
   MOV   pty,eax
   MOV   eax,plotx1
   MOV   ptx1,eax
   MOV   eax,ploty1
   MOV   pty1,eax
 
   CALL  l_tracage
  
   MOV   eax,plotx1
   MOV   ptx,eax
   MOV   eax,ploty1
   MOV   pty,eax
   MOV   eax,plotx3
   MOV   ptx1,eax
   MOV   eax,ploty3
   MOV   pty1,eax
 
   CALL  l_tracage
 
   MOV   eax,addd1
   ADD   eax,4
   MOV   addd,eax
   MOV   eax,plotx2
   MOV   ptx,eax
   MOV   eax,ploty2
   MOV   pty,eax
   MOV   eax,plotx3
   MOV   ptx1,eax
   MOV   eax,ploty3
   MOV   pty1,eax   ;///////////////////////////////////////////:
  
   CALL  l_tracage
   
   JMP   l_fincond 
   
supy1a: ;*****************************************************************************
   MOV   eax,ploty2
   CMP   eax,ploty3
   JNGE  l_condfill1
     
   MOV   eax,ploty1
   SUB   eax,ploty3
   INC   eax
   MOV   linn,eax
   
   MOV   eax,plotx3
   MOV   ptx,eax
   MOV   eax,ploty3
   MOV   pty,eax
   MOV   eax,plotx2
   MOV   ptx1,eax
   MOV   eax,ploty2
   MOV   pty1,eax
   
   CALL  l_tracage
  
   MOV   eax,plotx2
   MOV   ptx,eax
   MOV   eax,ploty2
   MOV   pty,eax
   MOV   eax,plotx1
   MOV   ptx1,eax
   MOV   eax,ploty1
   MOV   pty1,eax
 
   CALL  l_tracage
   
   MOV   eax,addd1
   ADD   eax,4
   MOV   addd,eax
   MOV   eax,plotx3
   MOV   ptx,eax
   MOV   eax,ploty3
   MOV   pty,eax
   MOV   eax,plotx1
   MOV   ptx1,eax
   MOV   eax,ploty1
   MOV   pty1,eax
  
   CALL  l_tracage
   
   JMP   l_fincond
   
  ;********************************************************************************
condfill1:   
   MOV   eax,ploty1
   SUB   eax,ploty2
   INC   eax
   MOV   linn,eax
   MOV   eax,plotx2
   MOV   ptx,eax
   MOV   eax,ploty2
   MOV   pty,eax
   MOV   eax,plotx3
   MOV   ptx1,eax
   MOV   eax,ploty3
   MOV   pty1,eax
  
   CALL  l_tracage
  
   MOV   eax,plotx3
   MOV   ptx,eax
   MOV   eax,ploty3
   MOV   pty,eax
   MOV   eax,plotx1
   MOV   ptx1,eax
   MOV   eax,ploty1
   MOV   pty1,eax
 
   CALL  l_tracage
   
   MOV   eax,addd1
   ADD   eax,4
   MOV   addd,eax
   MOV   eax,plotx2
   MOV   ptx,eax
   MOV   eax,ploty2
   MOV   pty,eax
   MOV   eax,plotx1
   MOV   ptx1,eax
   MOV   eax,ploty1
   MOV   pty1,eax
 
   CALL  l_tracage
  
fincond: 
  CALL   l_rempli 

    
 Return
 
        
tracage:        
  MOV  ebx,pty1  
  SUB  ebx,pty 
  INC  ebx 
  MOV  dify,ebx 
  
  
  MOV  eax,ptx1  
  SUB  eax,ptx 
  JNS  l_positifx 
  NEG  eax 
  INC  eax
  MOV  difx,eax
  CMP  ebx,eax
  JGE  l_line3
 ; JE   l_line4
  JMP  l_line6
positifx: 
  INC  eax 
  MOV  difx,eax
  CMP  ebx,eax
  JGE  l_line2
;  CMP  edx,edi
;  JE   l_line1
  JMP  l_line5 
  
line1:  
  MOV  eax,ptx 
  ROL  eax,2 
  MOV  edi,pty 
  ROL  edi,12 
  ADD  edi,eax 
  ADD  edi,addecr 
  MOV  ebp,addd
  MOV  ecx,difx 
  MOV  ebx,dify 
  MOV  edx,ecx 
  MOV  esi,edx 
depx1:  
  SUB  edx,ebx 
  JGE  l_depx11 
  SUB  edi,4
  MOV  [ebp],edi
  ADD  ebp,8
  ADD  edi,4100 
  ADD  edx,esi 
depx11:
  ADD  edi,4
  LOOP l_depx1 
  SUB  edi,4
  MOV  [ebp],edi
  MOV  addd,ebp
  JMP  l_fintrace 
  
line2:
  MOV  eax,ptx 
  ROL  eax,2 
  MOV  edi,pty 
  ROL  edi,12 
  ADD  edi,eax 
  ADD  edi,addecr 
  MOV  ebp,addd
  MOV  ecx,dify 
  MOV  ebx,difx 
  MOV  edx,ecx 
  MOV  esi,edx 
depx2:  
  SUB  edx,ebx 
  JGE  l_depx12 
  ADD  edi,4
  ADD  edx,esi 
depx12:
  MOV  [ebp],edi
  ADD  ebp,8 
  ADD  edi,4096
  LOOP l_depx2 
  SUB  ebp,8
  MOV  addd,ebp
  JMP  l_fintrace  ;---------------------------------------------------- 

line3:   ;-----------------------------------------------------------
  MOV  eax,ptx 
  ROL  eax,2 
  MOV  edi,pty 
  ROL  edi,12 
  ADD  edi,eax 
  ADD  edi,addecr 
  MOV  ebp,addd
  MOV  ecx,dify 
  MOV  ebx,difx 
  MOV  edx,ecx 
  MOV  esi,edx 
depx3:  
  SUB  edx,ebx 
  JGE  l_depx13 
  SUB  edi,4
  ADD  edx,esi
depx13: 
  MOV  [ebp],edi
  ADD  ebp,8
  ADD  edi,4096
  LOOP l_depx3 
  SUB  ebp,8
  MOV  addd,ebp
  JMP  l_fintrace ;----------------------------------------------------
  
line4: ;----------------------------------------------
  MOV  eax,ptx 
  ROL  eax,2 
  MOV  edi,pty 
  ROL  edi,12 
  ADD  edi,eax 
  ADD  edi,addecr 
  MOV  ebp,addd
  MOV  ecx,difx 
  MOV  ebx,dify 
  MOV  edx,ecx 
  MOV  esi,edx 
depx4:  
  SUB  edx,ebx 
  JGE  l_depx14 
  ADD  edi,4
  MOV  [ebp],edi
  ADD  ebp,8
  ADD  edi,4092 
  ADD  edx,esi 
depx14: 
  SUB  edi,4 
  LOOP l_depx4 
  ADD  edi,4
  MOV  [ebp],edi
  MOV  addd,ebp
  JMP  l_fintrace ;-----------------------------------------
  
line5:  
  MOV  eax,ptx 
  ROL  eax,2 
  MOV  edi,pty 
  ROL  edi,12 
  ADD  edi,eax 
  ADD  edi,addecr 
  MOV  ebp,addd
  MOV  ecx,difx 
  MOV  ebx,dify 
  MOV  edx,ecx 
  MOV  esi,edx 
  MOV  [ebp],edi
  ADD  ebp,8
depx5:  
  SUB  edx,ebx 
  JGE  l_depx15 
  ADD  edi,4096 
  MOV  [ebp],edi
  ADD  ebp,8
  ADD  edx,esi 
depx15:
  ADD  edi,4
  LOOP l_depx5 
  SUB  ebp,8
  MOV  addd,ebp
  JMP  l_fintrace 
  
line6: ;----------------------------------------------
  MOV  eax,ptx 
  ROL  eax,2 
  MOV  edi,pty 
  ROL  edi,12 
  ADD  edi,eax 
  ADD  edi,addecr 
  MOV  ebp,addd
  MOV  ecx,difx 
  MOV  ebx,dify 
  MOV  edx,ecx 
  MOV  esi,edx 
  MOV  [ebp],edi
  ADD  ebp,8
depx6:  
  SUB  edx,ebx 
  JGE  l_depx16 
  ADD  edi,4096 
  MOV  [ebp],edi
  ADD  ebp,8
  ADD  edx,esi 
depx16: 
  SUB  edi,4 
  LOOP l_depx6 
  SUB  ebp,8 
  MOV  addd,ebp
  JMP  l_fintrace ;-----------------------------------------
   
 fintrace:  
 RET
 
rempli:
  CLD
  MOV  eax,fillcoul
  MOV  ebx,addd1
  MOV  edx,linn
rempli2:
  MOV  ecx,[ebx]
  MOV  edi,[ebx+4]
  SUB  ecx,edi
  JB   l_rempli20
  SAR  ecx,2
  INC  ecx
  REP  stosd 
  ADD  ebx,8
  DEC  edx
  JA   l_rempli2
  RET 

rempli20:
  MOV  ecx,[ebx+4]
  MOV  edi,[ebx]
  SUB  ecx,edi
  JB   l_rempli2
  SAR  ecx,2
  INC  ecx
  REP  stosd 
  ADD  ebx,8
  DEC  edx
  JA   l_rempli20
  RET  
 
 !section '.data'

dat: 
! rd 1600 

Avatar de l’utilisateur
flaith
Messages : 1487
Inscription : jeu. 07/avr./2005 1:06
Localisation : Rennes
Contact :

Message par flaith »

un mot : superbe
comtois
Messages : 5186
Inscription : mer. 21/janv./2004 17:48
Contact :

Message par comtois »

c'est excellent 8O

Mais tu es comme moi , tu oublies de tester en mode débug ton programme , si tu l'avais fait , tu aurais pu constater une erreur avec un StopDrawing :P

Mais j'adore , bravo .
Avatar de l’utilisateur
djes
Messages : 4252
Inscription : ven. 11/févr./2005 17:34
Localisation : Arras, France

Message par djes »

Superbe!

Un petit truc : au risque de me répéter, sans setframerate, chez moi, ça scintille à mort...
Répondre