debut de demo asm

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

debut de demo asm

Message par tonton »

voici la premiere partie(plut tot que prevu) de mes apliquation 3D
en purassembleur .
d abord ,telecharger les includes ici:http:
http://do.nico.free.fr/objet2.zip

metre les sources qui suivront dans le meme repertoire.
active asm en ligne et pas de debugger.

premiere source:

le fil de fer.....

Code : Tout sélectionner

IncludeFile"ecran_perif.pb"
IncludeFile"graphique_ligne.pb"
IncludeFile"routine3d.pb"


    !MOV       dword[resolu],1024
    !CALL      initecran
    
    !mov       dword[torusobjet],1
    !lea       esi,[adobjet]
    !mov       dword[quartier],14
    !mov       dword[coulobjet],000f0f0h
    !mov       eax,170
    !CVTSI2SS  xmm0,eax
    !movss     [trx],xmm0
    !mov       eax,0
    !CVTSI2SS  xmm0,eax
    !movss     [try],xmm0
    !mov       eax,0
    !CVTSI2SS  xmm0,eax
    !movss     [trz],xmm0
    !call      creatobjet
    
    !mov       dword[torusobjet],1
    !lea       esi,[adobjet1]
    !mov       dword[quartier],28
    !mov       dword[coulobjet],0f00f0h
    !mov       eax,-150
    !CVTSI2SS  xmm0,eax
    !movss     [trx],xmm0
    !mov       eax,0
    !CVTSI2SS  xmm0,eax
    !movss     [try],xmm0
    !mov       eax,0
    !CVTSI2SS  xmm0,eax
    !movss     [trz],xmm0
    !call      creatobjet
    
    !mov       dword[torusobjet],1
    !lea       esi,[adobjet2]
    !mov       dword[quartier],40
    !mov       dword[coulobjet],0ff0ff0h
    !mov       eax,0
    !CVTSI2SS  xmm0,eax
    !movss     [trx],xmm0
    !mov       eax,0
    !CVTSI2SS  xmm0,eax
    !movss     [try],xmm0
    !mov       eax,0
    !CVTSI2SS  xmm0,eax
    !movss     [trz],xmm0
    !call      creatobjet
    
    !mov       dword[numerobjet],0
 !deb1:
    !CALL      flipcls  
 !deb11: 
    !call      chargeobjet   
    !mov       eax,[couleur_objet]
    !mov       [lignecoul],eax
    !CALL      autorot
    !CALL      pivotx
    !CALL      pivoty
    !CALL      pivotz
    !mov       ebx,[ad_coor]   
    !LEA       edx,[adcoor1] 
    !MOV       ecx,[nb_point]
 !deb2:
    !MOVups    xmm0,[ebx]
    !MOVups    [px],xmm0  
    !CALL      translat   
    !CALL      rotatx
    !CALL      rotaty
    !CALL      rotatz
    !CALL      perspect  
    !movups    xmm0,[px] 
    !movups    [edx],xmm0
    !ADD       ebx,12
    !ADD       edx,16
    !LOOP      deb2
    ;-------------------------------------------------------------------------
!finani0:   
    !LEA       eax,[adcoor1]
    !MOV       [madcoor1],eax
    !mov       eax,[ad_liai]
    !MOV       [madliai],eax
    !MOV       eax,[nb_face]
    !MOV       [nbface1],eax
!liaison:
    !mov       ecx,[madcoor1]
    !MOV       eax,[madliai]
    !MOV       ebx,[eax]
    !movups    xmm5,[ecx+ebx]
    !MOV       ebx,[eax+4]
    !movups    xmm6,[ecx+ebx]
    !MOV       ebx,[eax+8]
    !movups    xmm7,[ecx+ebx]
    !CALL      affichligne
    !ADD       dword[madliai],12
    !DEC       dword[nbface1]
    !JNE       liaison 
    
    !mov       eax,[nbobjet]
    !DEC       eax 
    !cmp       eax,[numerobjet]
    !je        plusobjet
    !inc       dword[numerobjet] 
    !JMP       deb11 
!plusobjet:    
    !mov       dword[numerobjet],0
 ;*********************************************************************************************
    !CALL      finprog  
    !JMP       deb1 
 ;*****************************************************************************************  

!section '.data' align 16
!adobjet:
!dd    0.0,99.0,20.1,97.1,40.1,90.1,60.1,80.1,80.1,60.1,90.1
!dd    40.1,97.1,20.1,99.1,0.1,97.1,-20.1,90.1,-40.1,80.1,-60.1,60.1,-80.1
!DD    40.1,-90.1,20.1,-97.1,0.0,-99.0
!DD    0ffffh
!adobjet1:
!dd    0.0,50.0,10.1,48.5,20.1,45.1,30.1,40.1,40.1,30.1,45.1
!dd    20.1,48.5,10.1,50.1,0.1,48.5,-10.1,45.1,-20.1,40.1,-30.1,30.1,-40.1
!DD    20.1,-45.1,10.1,-48.5,0.0,-50.0
!DD    0ffffh
!adobjet2:
! dd 0.1,200.1,150.1,200.1,100.1,100.1,100.1,-100.1,150.1,-200.1,0.1,-200.1,0ffffh
!image:  
!imagegran:
ouvert a tout commentaire et amelioration.

a+
Avatar de l’utilisateur
djes
Messages : 4252
Inscription : ven. 11/févr./2005 17:34
Localisation : Arras, France

Message par djes »

Bravo tonton! Que du bon! :D
erix14
Messages : 480
Inscription : sam. 27/mars/2004 16:44
Contact :

Message par erix14 »

Bravo tonton ! :D Des petits commentaires dans le code seraient un plus... :D ( genre un peu plus de pseudo-code )
tonton
Messages : 315
Inscription : mar. 26/avr./2005 15:19

Message par tonton »

salut:
merci djes :)
tu as raison eric14, je vait petit a petit ajouter des commentaires.

voila l etape 2 , toujours fil de fer mais avec facettes cachées:

Code : Tout sélectionner

IncludeFile"ecran_perif.pb"
IncludeFile"graphique_ligne.pb"
IncludeFile"routine3d.pb"


    !MOV       dword[resolu],1024         ;resolution (1024/768)  
    !CALL      initecran                  ;initialise les port E/S et saisi de l adresse ecran
    
    !mov       dword[torusobjet],1        ;cretation objet torrus
    !lea       esi,[adobjet]              ;adresse des coordonnées torrus
    !mov       dword[quartier],14         ;nombre de secteurs de l objet  
    !mov       dword[coulobjet],000f0f0h  ;couleur de l objet
    !mov       eax,210                    ;translation de l objet de 210 points sur l axe 'x'
    !CVTSI2SS  xmm0,eax                  
    !movss     [trx],xmm0
    !mov       eax,0                      ;translation de l objet de 0 points sur l axe 'y'
    !CVTSI2SS  xmm0,eax
    !movss     [try],xmm0
    !mov       eax,0                      ;translation de l objet de 0 points sur l axe 'z'
    !CVTSI2SS  xmm0,eax
    !movss     [trz],xmm0
    !call      creatobjet                 ;on crée l objet             
     
    !mov       dword[torusobjet],1        ;cretation 2emme objet torrus
    !lea       esi,[adobjet1]
    !mov       dword[quartier],28
    !mov       dword[coulobjet],0f00f0h
    !mov       eax,-150
    !CVTSI2SS  xmm0,eax
    !movss     [trx],xmm0
    !mov       eax,0
    !CVTSI2SS  xmm0,eax
    !movss     [try],xmm0
    !mov       eax,0
    !CVTSI2SS  xmm0,eax
    !movss     [trz],xmm0
    !call      creatobjet
    
    !mov       dword[torusobjet],1         ;cretation 3emme objet torrus
    !lea       esi,[adobjet2]
    !mov       dword[quartier],40
    !mov       dword[coulobjet],0ff0ff0h
    !mov       eax,0
    !CVTSI2SS  xmm0,eax
    !movss     [trx],xmm0
    !mov       eax,0
    !CVTSI2SS  xmm0,eax
    !movss     [try],xmm0
    !mov       eax,0
    !CVTSI2SS  xmm0,eax
    !movss     [trz],xmm0
    !call      creatobjet
    
    !mov       dword[numerobjet],0         ;met le compteur d objet a 0
 !deb1:
    !CALL      flipcls                     ;affichage 
 !deb11: ;------------- PASSE 1 : transformation des points des objets ---------------- 
    !call      chargeobjet                 ;charge les parametres d un objet
    !mov       eax,[couleur_objet]         ;charge  sa couleur
    !mov       [lignecoul],eax
    !CALL      autorot                     ;controle ratation  
    !CALL      pivotx                      ;calcule sinus/cosinus d angle sur 'x'
    !CALL      pivoty                      ;calcule sinus/cosinus d angle sur 'y'
    !CALL      pivotz                      ;calcule sinus/cosinus d angle sur 'y'
    !mov       ebx,[ad_coor]    
    !LEA       edx,[adcoor1] 
    !MOV       ecx,[nb_point]
 !deb2:
    !MOVups    xmm0,[ebx]
    !MOVups    [px],xmm0  
    !CALL      translat                    ;translation objet
    !CALL      rotatx                      ;rotation sur "x'
    !CALL      rotaty                      ;rotation sur "y'
    !CALL      rotatz                      ;rotation sur "z' 
    !CALL      perspect                    ;calcule perspective
    !movups    xmm0,[px] 
    !movups    [edx],xmm0
    !ADD       ebx,12
    !ADD       edx,16
    !LOOP      deb2
         ;--------------PASSE 2 ; calcule faces cachées et affichage des polygones ---
!finani0:   
    !LEA       eax,[adcoor1]
    !MOV       [madcoor1],eax
    !mov       eax,[ad_liai]
    !MOV       [madliai],eax
    !MOV       edx,[nb_face]
    !MOV       [nbface1],edx
!liaison:
    !MOV       ecx,[madcoor1]
    !MOV       eax,[madliai]
    !MOV       ebx,[eax]
    !movups    xmm0,[ecx+ebx]
    !movaps    xmm5,xmm0
    !MOV       ebx,[eax+4]
    !movups    xmm1,[ecx+ebx]
    !movaps    xmm6,xmm1
    !MOV       ebx,[eax+8]
    !movups    xmm2,[ecx+ebx]
    !movaps    xmm7,xmm2
    !CALL      calcnorm                    ;calcule de l angle du poly par raport a l observateur
    !MOV       eax,0
    !CMP       eax,[facvis]                ;angle negatif,donc invisible
    !JNLE      pasafac                     ;et on affiche pas le polygone
!pascoulff:  ;-----------------------------------------------------------------------
    !CALL      affichligne                 ;affiche le polygone sur l ecran logique
!pasafac:
    !ADD       dword[madliai],12
    !DEC       dword[nbface1]
    !JNE       liaison  
    !mov       eax,[nbobjet]               ;controle si il y a un autre objet 
    !DEC       eax 
    !cmp       eax,[numerobjet]            ;pas d autre objet 
    !je        plusobjet                 
    !inc       dword[numerobjet]           ;objet suivant
    !JMP       deb11                     
!plusobjet:    
    !mov       dword[numerobjet],0
 ;*********************************************************************************************
    !CALL      finprog                     ;quite si touche 'echap'
    !JMP       deb1 
 ;*****************************************************************************************  
    ;----------------- coordonnée des coupes d objet sur les x positif ----------------    
!section '.data' align 16
!adobjet:
!dd    0.0,99.0,20.1,97.1,40.1,90.1,60.1,80.1,80.1,60.1,90.1
!dd    40.1,97.1,20.1,99.1,0.1,97.1,-20.1,90.1,-40.1,80.1,-60.1,60.1,-80.1
!DD    40.1,-90.1,20.1,-97.1,0.0,-99.0
!DD    0ffffh ; '0ffffh' pour signaler la fin des coordonnées d un objet 
!adobjet1:
!dd    0.0,50.0,10.1,48.5,20.1,45.1,30.1,40.1,40.1,30.1,45.1
!dd    20.1,48.5,10.1,50.1,0.1,48.5,-10.1,45.1,-20.1,40.1,-30.1,30.1,-40.1
!DD    20.1,-45.1,10.1,-48.5,0.0,-50.0
!DD    0ffffh
!adobjet2:
! dd 0.1,200.1,150.1,200.1,100.1,100.1,100.1,-100.1,150.1,-200.1,0.1,-200.1,0ffffh
!image:  
!imagegran:
ensuite les prochaines source , on passe au remplissage des polygonnes

a+
julien
Messages : 846
Inscription : ven. 30/janv./2004 15:06
Contact :

Message par julien »

Beau travail, mais ça ne fonctionne pas avec ma carte ATI Radeon 9800 128 mo (tout est brouillé)
Par contre ça fonctionne sur mon portabe (Trident video accelerator 8 Mo partagé)
bombseb
Messages : 445
Inscription : jeu. 25/août/2005 22:59
Localisation : 974
Contact :

Message par bombseb »

salut, désolé je me suis arretté à l'assembleur sous dos et du coup j'ai quelques question concernant ton code

à quoi servent ces instructions ??
CVTSI2SS
movss
MOVups

et xmm0 c'est un registre ??
Dr. Dri
Messages : 2527
Inscription : ven. 23/janv./2004 18:10

Message par Dr. Dri »

xmm à l'envers ca donne mmx... avec google tu devrais trouver de la doc...

Dri
tonton
Messages : 315
Inscription : mar. 26/avr./2005 15:19

Message par tonton »

bombseb a écrit :salut, désolé je me suis arretté à l'assembleur sous dos et du coup j'ai quelques question concernant ton code

à quoi servent ces instructions ??
CVTSI2SS
movss
MOVups

et xmm0 c'est un registre ??

toutes les 3 sont des instuctions SSE de 128 bit. elle sont presente sur les premiere generation de pentium, et maintenant sur tout les processeurs.

CVTSI2SS :converti un nombre entier en nombre virgule flotante
movss :charge un nombre 32bits en virgule flottante
MOVups :charge 4 nombre 32bit en virgule f, non alligné

xmm0 n est pas un registre mmx(64bit), mais un des 8 registres
SSE en 128 bit.
de xmm0 a xmm7.

je posterai une doc a ce sujet

a+
bombseb
Messages : 445
Inscription : jeu. 25/août/2005 22:59
Localisation : 974
Contact :

Message par bombseb »

hummm d'accord...

et bien je voit que l'assembleur à bien évolué depuis le dos 8O
fweil
Messages : 505
Inscription : dim. 16/mai/2004 17:50
Localisation : Bayonne (64)
Contact :

Message par fweil »

Il me semble qu'il y a un risque de mauvais fonctionnement sur certaines cartes grapiques.

Le nombre d'octets par ligne d'écran n'est pas forcément bien calculé ... c'est probablement le bug vu par Julien.

Sinon c'est joli et bien écrit.
Mon avatar reproduit l'image de 4x1.8m présentée au 'Salon international du meuble de Paris' en janvier 2004, dans l'exposition 'Shades' réunisant 22 créateurs autour de Matt Sindall. L'original est un stratifié en 150 dpi.
tonton
Messages : 315
Inscription : mar. 26/avr./2005 15:19

Message par tonton »

pour le bug d affichage, s 'est le l instuction "stardrawing " que j utilise
pour la saisi de l adresse ecran, pas encore codé en assembleur.

essayer le nouveau include 'ecran_perif.bp'
remplacer le :

Code : Tout sélectionner

   !JMP     finproginit
   ;---------------------------  resolution ecran ------------------------
!initecran:
   !LEA     eax,[adecran]
   !MOV     [ecranlog],eax 
   !LEA     eax,[adzbuffer]
   !MOV     [madzbuffer],eax 
   !CALL    initport
   !CMP     dword[resolu],640
   !JE      ecr640 
   !CMP     dword[resolu],800
   !JE      ecr800 
   !CMP     dword[resolu],1024
   !JE      ecr1024 
   !CMP     dword[resolu],1280
   !JE      ecr1280 
   !RET
!ecr640:
   OpenScreen(640,480, 32, "") 
   !CALL    starrdd
   !MOV     dword[largecr],2560
   !MOV     dword[nbpixel],76800     
   !RET
!ecr800:
   OpenScreen(800,600, 32, "") 
   !CALL    starrdd
   !MOV     dword[largecr],3584
   !MOV     dword[nbpixel],120000     
   !RET
!ecr1024:
   OpenScreen(1024,768, 32, "") 
   !CALL    starrdd
   !MOV     dword[largecr],4096
   !MOV     dword[nbpixel],196608     
   !RET
!ecr1280:
   OpenScreen(1280,1024, 32, "") 
   !CALL    starrdd
   !MOV     dword[largecr],5120
   !MOV     dword[nbpixel],327680     
   !RET
   ;--------------------------------------------------------------------------
   ;--------------------- clavier ,souris ------------------------------------     
!initport:
   InitSprite() 
   InitKeyboard() 
   InitMouse() 
   !RET  
!starrdd: 
   StartDrawing(ScreenOutput()) 
   addecr1 = DrawingBuffer() 
   StopDrawing()
   FlipBuffers()
   StartDrawing(ScreenOutput()) 
   !MOV     eax,[v_addecr1]
   !MOV     [ecranphy],eax
   !ret
!finprog:
   StopDrawing()
   ExamineKeyboard() 
   If KeyboardPushed(#PB_Key_Escape) 
   End 
   EndIf 
   StartDrawing(ScreenOutput())
   !RET
!souris:  
   ExamineMouse()
   moux=MouseX()
   mouy=MouseY()
   !PUSH    eax  
   !MOV     eax,[v_moux]
   !MOV     [xsouris],eax
   !MOV     eax,[v_mouy]
   !MOV     [ysouris],eax
   !POP     eax
   !RET
 !clavier:
   ExamineKeyboard()  
   clav$=KeyboardInkey()
   clav=Asc(clav$)
   !PUSH    eax
   !MOV     al,byte[v_clav]
   !MOV     byte[codeclav],al
   !POP     eax 
   !RET
   ;-------------------------------------------------------------------------------------
   ;--transfere le buffer ecran sur l ecran physique et efface le buffer ecran et z buffer------------------  
!flipclsz: 
   !MOV     ecx,[nbpixel]
   !MOV     edi,[ecranphy]
   !MOV     esi,[ecranlog]
   !MOV     ebp,[madzbuffer]
   !MOVaps  xmm1,[noir];gris
   !MOVaps  xmm2,[noir]
!fgh:
   !MOVaps  xmm0,[esi] 
   !MOVaps  [esi],xmm1
   !MOVaps  [edi],xmm0
   !MOVaps  [ebp],xmm2
   !ADD     esi,16
   !ADD     edi,16
   !ADD     ebp,16
   !LOOP    fgh  
   !RET   ;-----------------------------------------------------------------
   ;--transfere le buffer ecran sur l ecran physique et efface le buffer ecran ------------------  
!flipcls: 
   !MOV     ecx,[nbpixel]
   !MOV     edi,[ecranphy]
   !MOV     esi,[ecranlog]
   !MOVaps  xmm1,[noir];gris
!fgh2:
   !MOVaps  xmm0,[esi] 
   !MOVaps  [esi],xmm1
   !MOVaps  [edi],xmm0
   !ADD     esi,16
   !ADD     edi,16
   !LOOP    fgh2  
   !RET   ;-----------------------------------------------------------------   
    ;----------------transfere le buffer ecran sur l ecran physique ------------------  
!flip: 
   !MOV     ecx,[nbpixel]
   !MOV     edi,[ecranphy]
   !MOV     esi,[ecranlog]
!fgh3:
   !MOVaps  xmm0,[esi] 
   !MOVaps  [esi],xmm1
   !ADD     esi,16
   !LOOP    fgh3  
   !RET   ;-----------------------------------------------------------------  
!efface_ecr: ;----------------  efface le buffer ecran --------------------------  
   !MOV     ecx,[nbpixel]
   !MOV     esi,[ecranlog]
   !MOVaps  xmm0,[gris]
!fgh0:
   !MOVaps  [esi],xmm0
   !ADD     esi,16
   !LOOP    fgh0   
   !RET  ;------------------------------------------------------------------------
!efface_zbuf: ;----------------  efface le zbuffer  --------------------------  
   !MOV     ecx,[nbpixel]
   !MOV     esi,[madzbuffer]
   !MOVaps  xmm0,[noir]
!fgh01:
   !ADD     esi,16
   !LOOP    fgh01   
   !RET  ;------------------------------------------------------------------------
 ;---------------- converti une image bmp 24 bits en bmp 32 bits--------------------- 
!transimage:  
   !LEA     edi,[image]
   !MOV     ecx,1024
   !MOV     [imagex],ecx
   !MOV     edx,863
   !MOV     [imagey],edx
   !MOV     ebp,1024
   !SUB     ebp,ecx
   !SAL     ebp,2
   !MOV     ebx,ecx
   !ADD     edi,036h
   !LEA     esi,[mimage]
   !MOV     [adimage],esi
!ima01:
   !MOV     eax,[edi]
   !And     eax,00ffffffh 
   !MOV     [esi],eax
   !ADD     edi,3
   !ADD     esi,4
   !LOOP    ima01  
   !MOV     ecx,ebx
   !DEC     edx
   !JA      ima01 
   !RET
   ;------------------------------------------------------------------------------

   ;------------------------------------------------------------------------------
!section '.data' align 16
!resolu:
   !dd      0 
!largecr:
   !dd      0
!nbpixel:
   !dd      0
!xsouris:
   !dd      0
!ysouris:
   !dd      0
!codeclav:
   !dd      0

!section '.data' align 16
!adecran:
   !rd      1310720
!mimage:
   !rd      1310720 
!finproginit:
dite si ca marche, sur toute cartes , merci
fweil
Messages : 505
Inscription : dim. 16/mai/2004 17:50
Localisation : Bayonne (64)
Contact :

Message par fweil »

Ca fonctionne pour moi : carte vidéo intégrée Intel ... testé en 1024*768 et 800 * 600
Mon avatar reproduit l'image de 4x1.8m présentée au 'Salon international du meuble de Paris' en janvier 2004, dans l'exposition 'Shades' réunisant 22 créateurs autour de Matt Sindall. L'original est un stratifié en 150 dpi.
julien
Messages : 846
Inscription : ven. 30/janv./2004 15:06
Contact :

Message par julien »

ça ne fonctionne pas non plus avec le nouveau ecran_perif.pb
Avatar de l’utilisateur
djes
Messages : 4252
Inscription : ven. 11/févr./2005 17:34
Localisation : Arras, France

Message par djes »

Regarde DrawingBufferPitch()
dlolo
Messages : 118
Inscription : ven. 18/févr./2005 16:29

Message par dlolo »

Ca ne fonctionne pas non plus pour moi. (CG Radeon X700 Pro)
Répondre