Accueil > > > MASMBLEND
MASMBLEND
Information sur la source
Description
MasmBlend permet d'utiliser les objets 3D crées par BLENDER dans les programmes Masm utilisant la bibliothèque OpenGL. Une fois l'objet crée sous blender,exporter le au format wavefront (.obj) Dans MasmBlend,sélectionnez fichier/ouvrir fichier blend format .obj,le contenu du fichier apparait dans la fenetre de gauche,appuyez sur le bouton CONVERSION,le resultat apparait dans l'autre fenetre.Sauvegardez le au format .txt par exemples. Vous n'avez plus qu'à l'incorporer dans votre prog Masm par copier/coller. Pour l'affichage,utilisez glInterleavedArrays et glDrawElements. (cf lisez moi.txt)
Source
- .586
- .model flat,stdcall
- option casemap:none
-
- include MasmBlend.inc
- include comdlg32.inc
- INCLUDELIB user32.lib
- INCLUDELIB kernel32.lib
- INCLUDELIB gdi32.lib
- includelib comdlg32.lib
-
- traduction proto
-
- .data
- ofn OPENFILENAME <>
- MAXSIZE equ 260
- buffer db MAXSIZE dup(0)
-
- .data?
- ID_BUFFER_ASM dword ?
- ID_BUFFER_BLEND dword ?
- HANDLE_PROCESS_PRIMAIRE dword ?
- hFile_blend dword ?
- hwndedit dword ?
- hwndedit1 dword ?
- szero sdword ?
- hFile_asm dword ?
- taille_fichier_obj dword ?
-
- .code
-
- debut:
- invoke GetModuleHandle,NULL
- mov HANDLE_PROCESS_PRIMAIRE,eax
- invoke Maitre,HANDLE_PROCESS_PRIMAIRE
- invoke ExitProcess,eax
-
- Maitre PROC hInst:DWORD
- LOCAL IDclass[4]:BYTE
- LOCAL Menu1[4]:byte
- LOCAL largeur,hauteur,xSupGauche,ySupGauche,hWnd:DWORD
- LOCAL wc:WNDCLASSEX
-
- mov DWORD PTR[ebp-4],004D5341h
- mov DWORD PTR[ebp-8],006E656Dh
-
- mov wc.cbSize,SIZEOF WNDCLASSEX
- mov wc.style,CS_HREDRAW or CS_VREDRAW
- mov wc.lpfnWndProc,poste
- mov wc.cbClsExtra,NULL
- mov wc.cbWndExtra,NULL
- mov wc.hInstance,NULL
- mov wc.hIcon,NULL
- mov wc.hCursor,NULL
- mov wc.hbrBackground,1
- lea eax,Menu1
- mov wc.lpszMenuName,eax
- lea eax,IDclass
- mov wc.lpszClassName,eax
- mov wc.hIconSm,NULL
- .data
-
- MainHDC DWORD 0
-
- .code
-
- mov largeur,750
- mov hauteur,650
- mov xSupGauche,10
- mov ySupGauche,10
-
- mov eax,hInst
- mov wc.hInstance,eax
- invoke LoadIcon,hInst,2
- mov wc.hIcon,eax
- invoke LoadCursor,NULL,IDC_ARROW
- mov wc.hCursor,eax
- invoke RegisterClassEx, ADDR wc
- invoke ShowCursor,TRUE
- invoke CreateWindowEx, WS_EX_CLIENTEDGE,ADDR IDclass,NULL,WS_OVERLAPPEDWINDOW,
- xSupGauche,ySupGauche,largeur,hauteur,NULL,NULL,hInst,NULL
- mov hWnd,eax
- invoke ShowWindow,hWnd,SW_SHOWNORMAL
- invoke UpdateWindow,hWnd
-
- invoke chercheMsg,hInst
- ret
- Maitre ENDP
- ;-------------------------
- poste PROC hWin:DWORD,uMsg:DWORD,wParam:DWORD,lParam:DWORD
-
- LOCAL ButtonClassName[8]:BYTE
- LOCAL ButtonText[12]:BYTE
- LOCAL labelClassName[8]:BYTE
- LOCAL labelText[12]:BYTE
- LOCAL labelText2[12]:BYTE
- LOCAL editClassName[8]:BYTE
- LOCAL buffer_asm[12]:BYTE
- LOCAL WINRect:RECT
- LOCAL hMemory_blend:DWORD
- LOCAL hMemory_asm:DWORD
- LOCAL hwndButton:DWORD
- LOCAL hwndLabel,hwndLabel2:dword
- LOCAL BCN,BTT,LBN,LBT,LBT2,ECN,BUF,SRW,SZE:DWORD
- LOCAL hFile:DWORD
- LOCAL SizeReadWrite:DWORD
-
- mov hMemory_blend,0
- mov hMemory_asm,0
-
- ;initialisation des variables locales
-
- mov DWORD PTR[ebp-4],00006E6Fh
- mov DWORD PTR[ebp-8],74747562h
- mov DWORD PTR[ebp-12],00006E6Fh
- mov DWORD PTR[ebp-16],69737265h
- mov DWORD PTR[ebp-20],766E6F63h
- mov DWORD PTR[ebp-24],00006369h
- mov DWORD PTR[ebp-28],74617473h
- mov DWORD PTR[ebp-32],004A424Fh
- mov DWORD PTR[ebp-36],5F726569h
- mov DWORD PTR[ebp-40],68636966h
- mov DWORD PTR[ebp-44],004D5341h
- mov DWORD PTR[ebp-48],5F726569h
- mov DWORD PTR[ebp-52],68636966h
- mov DWORD PTR[ebp-56],00000000h
- mov DWORD PTR[ebp-60],74696465h
-
- .if uMsg == WM_CREATE
-
- ;creation interface graphique
- ;-----------------------------
- ;bouton -----------
- ; "conversion"
- lea eax,ButtonClassName
- mov BCN,eax
- lea eax,ButtonText
- mov BTT,eax
-
- invoke CreateWindowEx,NULL,BCN,BTT,\
- WS_CHILD or WS_VISIBLE or BS_DEFPUSHBUTTON,\
- 255,5,140,25,hWin,1,HANDLE_PROCESS_PRIMAIRE,NULL
- mov hwndButton,eax
-
- ;label ----------
- ; "fichier blend"
- lea eax,labelClassName
- mov LBN,eax
- lea eax,labelText
- mov LBT,eax
- invoke CreateWindowEx,NULL, LBN,LBT,\
- WS_CHILD or WS_VISIBLE or SS_CENTER,\
- 55,20,100,15,hWin,1,HANDLE_PROCESS_PRIMAIRE,NULL
- mov hwndLabel,eax
-
- ; "fichier ASM"
-
- lea eax,labelText2
- mov LBT2,eax
- invoke CreateWindowEx,NULL,LBN,LBT2,\
- WS_CHILD or WS_VISIBLE or SS_CENTER,\
- 450,20,100,15,hWin,2,HANDLE_PROCESS_PRIMAIRE,NULL
- mov hwndLabel2,eax
-
- ;editeur de texte ----------
- ; "fichier blend"
-
- lea eax,editClassName
- mov ECN,eax
- invoke CreateWindowEx,WS_EX_OVERLAPPEDWINDOW,ECN,NULL,\
- WS_VISIBLE or WS_CHILD or ES_LEFT or ES_MULTILINE or\
- ES_AUTOHSCROLL or ES_AUTOVSCROLL or WS_VSCROLL or WS_HSCROLL,\
- 5,40,320,500,hWin,1,HANDLE_PROCESS_PRIMAIRE,NULL
- mov hwndedit,eax
-
- ; "fichier ASM"
- invoke CreateWindowEx,WS_EX_OVERLAPPEDWINDOW,ECN,NULL,\
- WS_VISIBLE or WS_CHILD or ES_LEFT or ES_MULTILINE or\
- ES_AUTOHSCROLL or ES_AUTOVSCROLL or WS_VSCROLL or WS_HSCROLL,\
- 350,40,360,500,hWin,2,HANDLE_PROCESS_PRIMAIRE,NULL
- mov hwndedit1,eax
-
- ;------ remplissage structure Open File Name
-
- invoke SetFocus,hwndedit
- mov ofn.lStructSize,SIZEOF ofn
- push hWin
- pop ofn.hwndOwner
- push HANDLE_PROCESS_PRIMAIRE
- pop ofn.hInstance
- mov ofn.lpstrFilter,NULL
- mov ofn.lpstrFile, OFFSET buffer ;stockage nom du fichier ouvert
- mov ofn.nMaxFile,MAXSIZE
- ret
-
- .ELSEIF uMsg==WM_COMMAND
- mov eax,wParam
- .if lParam==0
- nop
- nop
-
- .if ax==1 ;IDM_OPEN
- ;ouvre la boite de dialogue openfilename
- ;et selectionne le fichier .obj
-
- mov ofn.Flags, OFN_FILEMUSTEXIST or \
- OFN_PATHMUSTEXIST or OFN_LONGNAMES or\
- OFN_EXPLORER or OFN_HIDEREADONLY
- invoke GetOpenFileName, ADDR ofn
- .if eax==TRUE
- invoke CreateFile,ADDR buffer,\
- GENERIC_READ or GENERIC_WRITE ,\
- FILE_SHARE_READ or FILE_SHARE_WRITE,\
- NULL,OPEN_EXISTING,FILE_ATTRIBUTE_ARCHIVE,\
- NULL
- mov hFile_blend,eax
-
- ;determination de la taille du fichier .obj choisi
- invoke GetFileSize,hFile_blend,0
- mov taille_fichier_obj,eax
- ;creation des buffers de travail
- ;qui recoit le fichier .obj à traiter
- invoke GlobalAlloc,GMEM_FIXED,eax
- mov ID_BUFFER_BLEND,eax ;buffer pour fichier.obj
- invoke GlobalLock,eax
- ;qui recoit le resultat du traitement
- mov eax,taille_fichier_obj
- shl eax,1 ;on double la taille par precaution
- invoke GlobalAlloc,GMEM_FIXED,eax
- mov ID_BUFFER_ASM,eax ;buffer pour traduction asm
- invoke GlobalLock,eax
-
- ;initialisation des buffers avec 20h
-
- mov ecx,taille_fichier_obj
- mov eax,ID_BUFFER_BLEND
- mov edx,ID_BUFFER_ASM
- initiBuff: mov BYTE ptr[eax],20h
- mov BYTE PTR[edx],20h
- inc eax
- inc edx
- dec ecx
- cmp ecx,0
- jne initiBuff
- ;
- mov ecx,taille_fichier_obj
- mov edx,ID_BUFFER_ASM
- add edx,taille_fichier_obj
- initBis: mov byte ptr[edx],20h
- inc edx
- dec ecx
- cmp ecx,0
- jne initBis
- ;
- ;lit le fichier .obj et le stocke dans le buffer
- invoke ReadFile,hFile_blend,ID_BUFFER_BLEND,taille_fichier_obj,ADDR SizeReadWrite,NULL
- ;
- invoke SendMessage,hwndedit,WM_SETTEXT,NULL,ID_BUFFER_BLEND
- .endif
- invoke SetFocus,hwndedit
- ;
- ret
- .elseif ax==2 ;IDM_SAVE
- ;sauvegarde le contenu de l'edit text "masm"
- ;dans le fichier choisi
- mov ofn.Flags,OFN_LONGNAMES or\
- OFN_EXPLORER or OFN_HIDEREADONLY
- invoke GetSaveFileName, ADDR ofn
- .if eax==TRUE
- invoke CreateFile,ADDR buffer,\
- GENERIC_READ or GENERIC_WRITE ,\
- FILE_SHARE_READ or FILE_SHARE_WRITE,\
- NULL,CREATE_NEW,FILE_ATTRIBUTE_ARCHIVE,\
- NULL
- mov hFile,eax
- ;
- mov eax,taille_fichier_obj
- shl eax,1
- invoke SendMessage,hwndedit1,WM_GETTEXT,eax,ID_BUFFER_ASM
- lea ecx,SizeReadWrite
- mov SRW,ecx
- invoke WriteFile,hFile,ID_BUFFER_ASM,eax,SRW,NULL
- invoke CloseHandle,hFile
- .endif
- invoke SetFocus,hwndedit1
- ret
- .elseif ax==3 ;IDM_EXIT
- invoke DestroyWindow,hWin
- ret
- .endif
- .else
- .IF ax==1 ;ButtonID ;conversion demandée
- ;-------------------------------------------------------
- shr eax,16
- .IF ax==0 ;BN_CLICKED
-
-
- ;extraction des donnees de buffer_blend vers bufferAsm
-
- invoke traduction
-
- ;on charge bufferAsm dans edit masm (ecrase le texte present si il y en a un)
- invoke SendMessage,hwndedit1,WM_SETTEXT,NULL,ID_BUFFER_ASM
-
- .ENDIF
- .ENDIF
- .endif
-
- .ELSEIF uMsg == WM_KEYDOWN
- mov eax,wParam
- cmp eax,VK_ESCAPE
- jne suite
- invoke DestroyWindow,hWin
- suite: ret
-
- .elseif uMsg == WM_CLOSE
- invoke DestroyWindow,hWin
- ret
-
- .elseif uMsg == WM_DESTROY
- ;ferme le fichier .obj
- lea ecx,hFile_blend
- invoke CloseHandle,dword ptr[ecx]
- ;deverouille les zones memoires
- push [ID_BUFFER_BLEND]
- pop eax
- invoke GlobalUnlock,eax
- push [ID_BUFFER_ASM]
- pop eax
- invoke GlobalUnlock,eax
-
- ;libere la memoire
- push [ID_BUFFER_BLEND]
- pop eax
- invoke GlobalFree,eax
- push [ID_BUFFER_ASM]
- pop eax
- invoke GlobalFree,eax
- ;
- invoke PostQuitMessage,NULL
- ret
-
- .endif
- invoke DefWindowProc,hWin,uMsg,wParam,lParam
- ret
-
- poste ENDP
- ;-----------------------
- chercheMsg PROC hInst1:DWORD
- LOCAL msg:MSG
-
- boucleMsg:
- invoke PeekMessage,ADDR msg,0,0,0,PM_NOREMOVE
- or eax,eax
- jz pasMsg
- invoke GetMessage,ADDR msg,NULL,0,0
- or eax,eax
- jz fin
- invoke TranslateMessage,ADDR msg
- invoke DispatchMessage,ADDR msg
- jmp boucleMsg
- pasMsg:
- jmp boucleMsg
- fin:
- mov eax,msg.wParam
-
- ret
- chercheMsg ENDP
- traduction proc uses eax ecx edx ebx
-
-
- LOCAL valeur_texture,compteur_octets:DWORD
- LOCAL curseur_blend,curseur_asm,nombre_de_signe_moins,curseur_blend_intermediaire:DWORD
- LOCAL longueur_ligne_vertex:BYTE
- LOCAL compteur_boucle,nbre_sommets,compteur_chiffre,compteur_sommet:dword
-
- mov compteur_octets,0
- mov valeur_texture,0
- mov curseur_blend,30h
- mov curseur_asm,0
- mov nombre_de_signe_moins,0
- mov curseur_blend_intermediaire,0
- mov longueur_ligne_vertex,26
- mov compteur_boucle,0
- ;------------------------------------------------------------------------------------
- ;premier scanne du fichier blend en entier pour retrouver et afficher tous les vertex
- ;------------------------------------------------------------------------------------
- extraction:
-
- mov longueur_ligne_vertex,26 ;longueur mini d'une ligne de vertex (sans -)
- ;extraction de 4 caractères
- mov eax,ID_BUFFER_BLEND
- add eax,curseur_blend
- cmp BYTE PTR [eax],0Dh
- jne NOvertex
- cmp BYTE PTR [eax+1],0Ah
- jne NOvertex
- ;on est au debut d'une ligne de code
- ;est ce une ligne de vertex ?
- cmp BYTE PTR [eax+2],'v'
- jne NOvertex
- cmp BYTE PTR [eax+3],' '
- jne NOvertex
- ;oui c'est une ligne de vertex
- ;traitement de la ligne de vertex
- mov eax,curseur_blend
- mov curseur_blend_intermediaire,eax ;sauvegarde de la position du curseur_blend
- add curseur_blend_intermediaire,4
- A1:
- mov eax,ID_BUFFER_ASM
- add eax,curseur_asm
- mov BYTE PTR [eax],'D'
- mov BYTE PTR [eax+1],'W'
- mov BYTE PTR [eax+2],'O'
- mov BYTE PTR [eax+3],'R'
- mov BYTE PTR [eax+4],'D'
- mov BYTE PTR [eax+5],' '
- ;coordonnees de texture type carré
- inc valeur_texture
- cmp valeur_texture,5
- jne V1
- mov valeur_texture,1
- V1:
- cmp valeur_texture,1
- jne V2
- mov BYTE PTR [eax+6],'0'
- mov BYTE PTR [eax+7],'.'
- mov BYTE PTR [eax+8],'0'
- mov BYTE PTR [eax+9],','
- mov BYTE PTR [eax+10],'0'
- mov BYTE PTR [eax+11],'.'
- mov BYTE PTR [eax+12],'0'
- mov BYTE PTR [eax+13],','
- V2:
- cmp valeur_texture,2
- jne V3
- mov BYTE PTR [eax+6],'1'
- mov BYTE PTR [eax+7],'.'
- mov BYTE PTR [eax+8],'0'
- mov BYTE PTR [eax+9],','
- mov BYTE PTR [eax+10],'0'
- mov BYTE PTR [eax+11],'.'
- mov BYTE PTR [eax+12],'0'
- mov BYTE PTR [eax+13],','
- V3: cmp valeur_texture,3
- jne V4
- mov BYTE PTR [eax+6],'1'
- mov BYTE PTR [eax+7],'.'
- mov BYTE PTR [eax+8],'0'
- mov BYTE PTR [eax+9],','
- mov BYTE PTR [eax+10],'1'
- mov BYTE PTR [eax+11],'.'
- mov BYTE PTR [eax+12],'0'
- mov BYTE PTR [eax+13],','
- V4: cmp valeur_texture,4
- jne V5
- mov BYTE PTR [eax+6],'0'
- mov BYTE PTR [eax+7],'.'
- mov BYTE PTR [eax+8],'0'
- mov BYTE PTR [eax+9],','
- mov BYTE PTR [eax+10],'1'
- mov BYTE PTR [eax+11],'.'
- mov BYTE PTR [eax+12],'0'
- mov BYTE PTR [eax+13],','
- V5:
- ;mise à jour du curseur_asm pour pointer sur le caractere suivant
- add curseur_asm,14
- add compteur_octets,14
- A2:
- mov eax,ID_BUFFER_BLEND
- add eax,curseur_blend_intermediaire
- cmp BYTE PTR [eax],02Dh ;'-'
- jne A3
- inc nombre_de_signe_moins
- A3:
- inc curseur_blend_intermediaire ;pointe sur caractere suivant
- mov eax,curseur_blend
- add eax,33
- cmp curseur_blend_intermediaire,eax
- jne A2
-
- mov ah,byte ptr longueur_ligne_vertex
- add ah,byte ptr nombre_de_signe_moins
- mov longueur_ligne_vertex,ah
-
- ;stockage de cette ligne de vertex dans bufferAsm
- mov eax,curseur_blend
- mov curseur_blend_intermediaire,eax
- add curseur_blend_intermediaire,4
- A4:
- mov eax,ID_BUFFER_ASM
- add eax,curseur_asm
- inc curseur_asm ;[buffer_asm+curseur_asm] pointe sur caractere suivant '0DWORD '
- inc compteur_octets
- mov ecx,ID_BUFFER_BLEND
- add ecx,curseur_blend_intermediaire
- mov dh,BYTE PTR [ecx]
- ;mise en place des virgules
- cmp dh,20h
- jne A5
- mov BYTE PTR[eax],','
- jmp A6
- A5: mov BYTE PTR [eax],dh
- A6: inc curseur_blend_intermediaire
- mov ah,longueur_ligne_vertex
- dec ah
- mov longueur_ligne_vertex,ah
- cmp ah,0
- jne A4
- ;ajout des caracteres de fin de lignes
- mov eax,ID_BUFFER_ASM
- add eax,curseur_asm
- mov BYTE PTR[eax],0Dh
- inc eax
- mov BYTE PTR[eax],0Ah
-
- ;ici curseur_asm pointe sur sur le dernier caractere lu/ecrit
- inc curseur_asm ;pointe sur derniere position libre
- inc curseur_asm
- add compteur_octets,2
- mov eax,curseur_blend
- add eax,29
- add eax,nombre_de_signe_moins
- mov curseur_blend,eax
-
- ;remise à zero
- mov curseur_blend_intermediaire,0
- mov nombre_de_signe_moins,0
- jmp Z1
-
- NOvertex:
- inc curseur_blend
- jmp Z1
- Z1:
- inc compteur_boucle
- mov ebx,taille_fichier_obj
- cmp compteur_boucle,ebx ;à determiner en fonction de la taille du fichier(100 000)
- jne extraction
-
- ;---------------------------------------------------------------------
- ;deuxieme scanne du fichier blend en entier pour retrouver les faces
- ;----------------------------------------------------------------------
-
- mov curseur_blend,30h
- mov curseur_blend_intermediaire,0
- mov compteur_boucle,0
- mov compteur_chiffre,0
- mov compteur_sommet,0
- face:
-
- mov eax,ID_BUFFER_BLEND
- add eax,curseur_blend
- cmp BYTE PTR [eax],0Dh
- jne blabla
- cmp BYTE PTR [eax+1],0Ah
- jne blabla
- cmp BYTE PTR [eax+2],'f'
- jne blabla
- cmp BYTE PTR [eax+3],' '
- jne blabla
- ;c'est une ligne de face,ecriture de "BYTE "
- mov ecx,ID_BUFFER_ASM
- add ecx,curseur_asm
- mov BYTE PTR [ecx],'W'
- mov BYTE PTR [ecx+1],'O'
- mov BYTE PTR [ecx+2],'R'
- mov BYTE PTR [ecx+3],'D'
- mov BYTE PTR [ecx+4],' '
- ;curseur_asm pointe sur le caractere suivant ' '
- add curseur_asm,5
- add compteur_octets,5
-
- xor edx,edx
- xor esi,esi
- xor edi,edi
- mov esi,4
- mov edi,5
- C0:
- mov dh,BYTE PTR[eax+esi]
- cmp dh,0Dh
- je stop
- cmp dh,20h
- je fin_chiffre
- ;
- mov byte ptr[ecx+edi],dh
- inc compteur_chiffre
- inc esi
- inc edi
- jmp C0
- ;
- fin_chiffre:
- mov byte ptr[ecx+edi],','
-
- .if compteur_chiffre==1
- mov dl,49
- F1:
- mov dh,byte ptr[ecx+edi-1]
- cmp dh,dl
- jne F2
- dec dl
- mov byte ptr[ecx+edi-1],dl
- jmp F4
- F2:
- inc dl
- cmp dl,58
- je F4
- jmp F1
- F4:
- .endif
-
- .if compteur_chiffre==2
- ;xx='10' ?
- mov dh,byte ptr[ecx+edi-2]
- cmp dh,49
- jne H1
- mov dh,byte ptr[ecx+edi-1]
- cmp dh,48
- jne H1
- mov byte ptr[ecx+edi-2],20h ;on met un blanc
- mov byte ptr[ecx+edi-1],57 ;9 10-1=blanc+'9'
- jmp fin2
- H1:
- ;xx=x0 ?
- mov dh,byte ptr[ecx+edi-1]
- cmp dh,48 ;=0 ?
- jne H2
- mov byte ptr[ecx+edi-1],57 ;'9'
- mov dh,byte ptr[ecx+edi-2]
- dec dh ;dizaine-1
- mov byte ptr[ecx+edi-2],dh ; si xx=x0 alors xx=(x-1)9
- jmp fin2
- H2:
- ;sinon xx=x(x-1)
- mov dh,byte ptr[ecx+edi-1]
- dec dh
- mov byte ptr[ecx+edi-1],dh
- fin2:
- .endif
-
- .if compteur_chiffre==3 ;x1=ecx+edi-3 x2=ecx+edi-2 x3=ecx+edi-1
- ;xxx=100 ?
- mov dh,byte ptr[ecx+edi-1]
- cmp dh,48 ;x1=0 ?
- jne M1
- mov dh,byte ptr[ecx+edi-2]
- cmp dh,48 ;x2=0 ?
- jne M1
- mov dh,byte ptr[ecx+edi-3]
- cmp dh,48 ;x1=1?
- jne M1
- ;oui c'est 100 d'ou 100= 99
- mov byte ptr[ecx+edi-3],20h ;blanc
- mov byte ptr[ecx+edi-2],57 ;9
- mov byte ptr[ecx+edi-1],57 ;9
- jmp fin3suite
- M1: ;xxx=x00 ?
- mov dh,byte ptr[ecx+edi-1]
- cmp dh,48
- jne M2
- mov dh,byte ptr[ecx+edi-2]
- cmp dh,48
- jne M2
- ;oui c'est x00 d'ou xxx=(x-1)99
- mov byte ptr[ecx+edi-1],57 ;9
- mov byte ptr[ecx+edi-2],57 ;9
- mov dh,byte ptr[ecx+edi-3]
- dec dh
- mov byte ptr[ecx+edi-3],dh
- jmp fin3suite
- M2:
- ;xxx=xx0 ?
- mov dh,byte ptr[ecx+edi-1]
- cmp dh,48 ;=0 ?
- jne M3
- ;oui d'ou xx0=x(x-1)9
- mov byte ptr[ecx+edi-1],57 ;9
- mov dh,byte ptr[ecx+edi-2]
- dec dh
- mov byte ptr[ecx+edi-2],dh ;x2=x2-1
- ;x3 ne change pas,on s'en occupe pas
- jmp fin3suite
- M3: ;sinon xxx=xx(x-1)
- mov dh,byte ptr[ecx+edi-1]
- dec dh
- mov byte ptr[ecx+edi-1],dh
-
- fin3suite:
- .endif
-
- .if compteur_chiffre==4
- ;xxxx=1000 d'ou = 999
- mov dh,byte ptr[ecx+edi-1]
- cmp dh,48 ;=0 ?
- jne O1
- mov dh,byte ptr[ecx+edi-2]
- cmp dh,48 ;=0 ?
- jne O1
- mov dh,byte ptr[ecx+edi-3]
- cmp dh,48 ;=0 ?
- jne O1
- mov dh,byte ptr[ecx+edi-4]
- cmp dh,49 ;=1 ?
- ;ok c'est 1000
- mov byte ptr[ecx+edi-4],20h ;espace
- mov byte ptr[ecx+edi-3],57 ;9
- mov byte ptr[ecx+edi-2],57 ;9
- mov byte ptr[ecx+edi-1],57 ;9
- jmp fin4
- O1: ;xxxx=x000 d'ou =(x-1)999
- mov dh,byte ptr[ecx+edi-1]
- cmp dh,48
- jne O2
- mov dh,byte ptr[ecx+edi-2]
- cmp dh,48
- jne O2
- mov dh,byte ptr[ecx+edi-3]
- cmp dh,48
- jne O2
- ;ok c'est x000
- mov dh,byte ptr[ecx+edi-4]
- dec dh
- mov byte ptr[ecx+edi-4],dh
- mov byte ptr[ecx+edi-3],57 ;9
- mov byte ptr[ecx+edi-2],57 ;9
- mov byte ptr[ecx+edi-1],57 ;9
- jmp fin4
- O2: ;xxxx=xx00 d'ou =x(x-1)99
- mov dh,byte ptr[ecx+edi-1]
- cmp dh,48
- jne O3
- mov dh,byte ptr[ecx+edi-2]
- cmp dh,48
- jne O3
- ;ok c'est xx00
- mov dh,byte ptr[ecx+edi-3]
- dec dh
- mov byte ptr[ecx+edi-3],dh
- mov byte ptr[ecx+edi-2],57 ;9
- mov byte ptr[ecx+edi-1],57 ;9
- jmp fin4
-
- O3: ;xxxx=xxx0 d'ou =xx(x-1)9
- mov dh,byte ptr[ecx+edi-1]
- cmp dh,48
- jne O4
- ;ok c'est xxx0
- mov dh,byte ptr[ecx+edi-2]
- dec dh
- mov byte ptr[ecx+edi-2],dh
- mov byte ptr[ecx+edi-1],57 ;9
- jmp fin4
- O4: ;sinon xxxx=xxx(x-1)
- mov dh,byte ptr[ecx+edi-1]
- dec dh
- mov byte ptr[ecx+edi-1],dh
- fin4:
- .endif
-
- mov compteur_chiffre,0
- inc compteur_sommet
-
- inc esi
- inc edi
- jmp C0
- stop:
- ;ici on teste le dernier paquet de chiffres (qui n'est pas suivi de virgules)
-
- .if compteur_chiffre==1
- mov dl,49
- G1:
- mov dh,byte ptr[ecx+edi-1]
- cmp dh,dl
- jne G2
- dec dl
- mov byte ptr[ecx+edi-1],dl
- jmp G4
- G2:
- inc dl
- cmp dl,58
- je G4
- jmp G1
- G4:
- .endif
-
-
- .if compteur_chiffre==2
-
- ;xx='10' ?
- mov dh,byte ptr[ecx+edi-2]
- cmp dh,49
- jne J1
- mov dh,byte ptr[ecx+edi-1]
- cmp dh,48
- jne J1
- mov byte ptr[ecx+edi-2],20h ;on met un blanc
- mov byte ptr[ecx+edi-1],57 ;9 10-1=blanc+'9'
- jmp fin2bis
- J1:
- ;xx=x0 ?
- mov dh,byte ptr[ecx+edi-1]
- cmp dh,48 ;=0 ?
- jne J2
- mov byte ptr[ecx+edi-1],57 ;'9'
- mov dh,byte ptr[ecx+edi-2]
- dec dh ;dizaine-1
- mov byte ptr[ecx+edi-2],dh ; si xx=x0 alors xx=(x-1)9
- jmp fin2bis
- J2:
- ;sinon xx=x(x-1)
- mov dh,byte ptr[ecx+edi-1]
- dec dh
- mov byte ptr[ecx+edi-1],dh
- fin2bis:
- .endif
-
- .if compteur_chiffre==3
- ;xxx=100 ?
- mov dh,byte ptr[ecx+edi-1]
- cmp dh,48 ;x1=0 ?
- jne K1
- mov dh,byte ptr[ecx+edi-2]
- cmp dh,48 ;x2=0 ?
- jne K1
- mov dh,byte ptr[ecx+edi-3]
- cmp dh,48 ;x1=1?
- jne K1
- ;oui c'est 100 d'ou 100= 99
- mov byte ptr[ecx+edi-3],20h ;blanc
- mov byte ptr[ecx+edi-2],57 ;9
- mov byte ptr[ecx+edi-1],57 ;9
- jmp fin3
- K1: ;xxx=x00 ?
- mov dh,byte ptr[ecx+edi-1]
- cmp dh,48
- jne K2
- mov dh,byte ptr[ecx+edi-2]
- cmp dh,48
- jne K2
- ;oui c'est x00 d'ou xxx=(x-1)99
- mov byte ptr[ecx+edi-1],57 ;9
- mov byte ptr[ecx+edi-2],57 ;9
- mov dh,byte ptr[ecx+edi-3]
- dec dh
- mov byte ptr[ecx+edi-3],dh
- jmp fin3
- K2:
- ;xxx=xx0 ?
- mov dh,byte ptr[ecx+edi-1]
- cmp dh,48 ;=0 ?
- jne K3
- ;oui d'ou xx0=x(x-1)9
- mov byte ptr[ecx+edi-1],57 ;9
- mov dh,byte ptr[ecx+edi-2]
- dec dh
- mov byte ptr[ecx+edi-2],dh ;x2=x2-1
- ;x3 ne change pas,on s'en occupe pas
- jmp fin3
- K3: ;sinon xxx=xx(x-1)
- mov dh,byte ptr[ecx+edi-1]
- dec dh
- mov byte ptr[ecx+edi-1],dh
-
- fin3:
- .endif
-
- .if compteur_chiffre==4
- ;xxxx=1000 d'ou = 999
- mov dh,byte ptr[ecx+edi-1]
- cmp dh,48 ;=0 ?
- jne P1
- mov dh,byte ptr[ecx+edi-2]
- cmp dh,48 ;=0 ?
- jne P1
- mov dh,byte ptr[ecx+edi-3]
- cmp dh,48 ;=0 ?
- jne P1
- mov dh,byte ptr[ecx+edi-4]
- cmp dh,49 ;=1 ?
- ;ok c'est 1000
- mov byte ptr[ecx+edi-4],20h ;espace
- mov byte ptr[ecx+edi-3],57 ;9
- mov byte ptr[ecx+edi-2],57 ;9
- mov byte ptr[ecx+edi-1],57 ;9
- jmp fin4suite
- P1: ;xxxx=x000 d'ou =(x-1)999
- mov dh,byte ptr[ecx+edi-1]
- cmp dh,48
- jne P2
- mov dh,byte ptr[ecx+edi-2]
- cmp dh,48
- jne P2
- mov dh,byte ptr[ecx+edi-3]
- cmp dh,48
- jne P2
- ;ok c'est x000
- mov dh,byte ptr[ecx+edi-4]
- dec dh
- mov byte ptr[ecx+edi-4],dh
- mov byte ptr[ecx+edi-3],57 ;9
- mov byte ptr[ecx+edi-2],57 ;9
- mov byte ptr[ecx+edi-1],57 ;9
- jmp fin4suite
- P2: ;xxxx=xx00 d'ou =x(x-1)99
- mov dh,byte ptr[ecx+edi-1]
- cmp dh,48
- jne P3
- mov dh,byte ptr[ecx+edi-2]
- cmp dh,48
- jne P3
- ;ok c'est xx00
- mov dh,byte ptr[ecx+edi-3]
- dec dh
- mov byte ptr[ecx+edi-3],dh
- mov byte ptr[ecx+edi-2],57 ;9
- mov byte ptr[ecx+edi-1],57 ;9
- jmp fin4suite
-
- P3: ;xxxx=xxx0 d'ou =xx(x-1)9
- mov dh,byte ptr[ecx+edi-1]
- cmp dh,48
- jne P4
- ;ok c'est xxx0
- mov dh,byte ptr[ecx+edi-2]
- dec dh
- mov byte ptr[ecx+edi-2],dh
- mov byte ptr[ecx+edi-1],57 ;9
- jmp fin4suite
- P4: ;sinon xxxx=xxx(x-1)
- mov dh,byte ptr[ecx+edi-1]
- dec dh
- mov byte ptr[ecx+edi-1],dh
- fin4suite:
- .endif
-
- mov compteur_chiffre,0
- inc compteur_sommet
- mov byte ptr[ecx+edi],0Dh
- mov byte ptr[ecx+edi+1],0Ah
- add curseur_blend,esi
- add curseur_asm,edi
- add compteur_octets,edi
- jmp Y1
-
- blabla:
-
- inc curseur_blend
- jmp Y1
-
- Y1:
-
- inc compteur_boucle
- ;cmp compteur_boucle,390 ;à determiner en fonction de la taille du fichier
- mov ebx,taille_fichier_obj
- dec ebx
- dec ebx ;taille_fichier-2
- cmp compteur_boucle,ebx ;à determiner en fonction de la taille du fichier(100 000)
- jne face
-
- ;-------------------------------------
- ;fin du traitement du fichier blend
- ;-------------------------------------
- ;affichage du nombre de sommets total
-
- mov byte ptr[ecx+edi+2],0Dh
- mov byte ptr[ecx+edi+3],0Ah
- mov byte ptr[ecx+edi+4],';'
-
- ;
- add edi,18
- add compteur_octets,18
-
- .data
- stocke qword 0
- .code
- fild compteur_sommet
- fistp dword ptr[stocke]
- ;
- cmp compteur_sommet,10
- jae cont ;>=10 ? saut si gauche>=droit
- xor edx,edx
- mov dl,byte ptr compteur_sommet
- add dl,030h
- mov byte ptr[ecx+edi],dl
- jmp bye
- cont:
-
- divise:
- mov edx,dword ptr stocke+4
- mov eax,dword ptr stocke
- mov ebx,10
- div ebx
- mov dword ptr stocke,eax ;eax=resultat
- add edx,030h ;edx=reste
- mov byte ptr[ecx+edi],dl
- ;resultat=10 ?
- cmp dword ptr stocke,10
- jne cont1
- ;oui
- mov byte ptr[ecx+edi],'0'
- mov byte ptr[ecx+edi-1],'1'
- jmp bye
- cont1: ;resultat<10 ?
- cmp dword ptr stocke,10
- ja cont2 ;saut si gauche>droit
- ;oui
- xor edx,edx
- mov dl,byte ptr stocke
- add dl,30h
- mov byte ptr[ecx+edi-1],dl
- jmp bye
- cont2: ;resultat>10 on peut encore diviser
- dec edi
- jmp divise
-
- bye:
- add edi,10
- add compteur_octets,10
-
- mov byte ptr[ecx+edi+2],' '
- mov byte ptr[ecx+edi+2],'S'
- mov byte ptr[ecx+edi+3],'O'
- mov byte ptr[ecx+edi+4],'M'
- mov byte ptr[ecx+edi+5],'M'
- mov byte ptr[ecx+edi+6],'E'
- mov byte ptr[ecx+edi+7],'T'
- mov byte ptr[ecx+edi+8],'S'
-
- mov byte ptr[ecx+edi+9],0Dh
- mov byte ptr[ecx+edi+10],0Ah
-
- ;nettoyage position inoccupée du bufferAsm
-
- add compteur_octets,30
- add curseur_asm,38
- ;mov eax,NbreOctetFichierBlend
- mov eax,taille_fichier_obj
- shl eax,1 ;eax=eax*2
- sub eax,dword ptr compteur_octets
-
- .data
- x dword ?
- .code
- mov x,eax
- mov eax,ID_BUFFER_ASM
- add eax,curseur_asm
- nettoie:
- mov byte ptr[eax],0h
- inc eax
- dec x
- cmp x,0
- jne nettoie
- ret
-
- traduction endp
-
- end debut
-
.586
.model flat,stdcall
option casemap:none
include MasmBlend.inc
include comdlg32.inc
INCLUDELIB user32.lib
INCLUDELIB kernel32.lib
INCLUDELIB gdi32.lib
includelib comdlg32.lib
traduction proto
.data
ofn OPENFILENAME <>
MAXSIZE equ 260
buffer db MAXSIZE dup(0)
.data?
ID_BUFFER_ASM dword ?
ID_BUFFER_BLEND dword ?
HANDLE_PROCESS_PRIMAIRE dword ?
hFile_blend dword ?
hwndedit dword ?
hwndedit1 dword ?
szero sdword ?
hFile_asm dword ?
taille_fichier_obj dword ?
.code
debut:
invoke GetModuleHandle,NULL
mov HANDLE_PROCESS_PRIMAIRE,eax
invoke Maitre,HANDLE_PROCESS_PRIMAIRE
invoke ExitProcess,eax
Maitre PROC hInst:DWORD
LOCAL IDclass[4]:BYTE
LOCAL Menu1[4]:byte
LOCAL largeur,hauteur,xSupGauche,ySupGauche,hWnd:DWORD
LOCAL wc:WNDCLASSEX
mov DWORD PTR[ebp-4],004D5341h
mov DWORD PTR[ebp-8],006E656Dh
mov wc.cbSize,SIZEOF WNDCLASSEX
mov wc.style,CS_HREDRAW or CS_VREDRAW
mov wc.lpfnWndProc,poste
mov wc.cbClsExtra,NULL
mov wc.cbWndExtra,NULL
mov wc.hInstance,NULL
mov wc.hIcon,NULL
mov wc.hCursor,NULL
mov wc.hbrBackground,1
lea eax,Menu1
mov wc.lpszMenuName,eax
lea eax,IDclass
mov wc.lpszClassName,eax
mov wc.hIconSm,NULL
.data
MainHDC DWORD 0
.code
mov largeur,750
mov hauteur,650
mov xSupGauche,10
mov ySupGauche,10
mov eax,hInst
mov wc.hInstance,eax
invoke LoadIcon,hInst,2
mov wc.hIcon,eax
invoke LoadCursor,NULL,IDC_ARROW
mov wc.hCursor,eax
invoke RegisterClassEx, ADDR wc
invoke ShowCursor,TRUE
invoke CreateWindowEx, WS_EX_CLIENTEDGE,ADDR IDclass,NULL,WS_OVERLAPPEDWINDOW,
xSupGauche,ySupGauche,largeur,hauteur,NULL,NULL,hInst,NULL
mov hWnd,eax
invoke ShowWindow,hWnd,SW_SHOWNORMAL
invoke UpdateWindow,hWnd
invoke chercheMsg,hInst
ret
Maitre ENDP
;-------------------------
poste PROC hWin:DWORD,uMsg:DWORD,wParam:DWORD,lParam:DWORD
LOCAL ButtonClassName[8]:BYTE
LOCAL ButtonText[12]:BYTE
LOCAL labelClassName[8]:BYTE
LOCAL labelText[12]:BYTE
LOCAL labelText2[12]:BYTE
LOCAL editClassName[8]:BYTE
LOCAL buffer_asm[12]:BYTE
LOCAL WINRect:RECT
LOCAL hMemory_blend:DWORD
LOCAL hMemory_asm:DWORD
LOCAL hwndButton:DWORD
LOCAL hwndLabel,hwndLabel2:dword
LOCAL BCN,BTT,LBN,LBT,LBT2,ECN,BUF,SRW,SZE:DWORD
LOCAL hFile:DWORD
LOCAL SizeReadWrite:DWORD
mov hMemory_blend,0
mov hMemory_asm,0
;initialisation des variables locales
mov DWORD PTR[ebp-4],00006E6Fh
mov DWORD PTR[ebp-8],74747562h
mov DWORD PTR[ebp-12],00006E6Fh
mov DWORD PTR[ebp-16],69737265h
mov DWORD PTR[ebp-20],766E6F63h
mov DWORD PTR[ebp-24],00006369h
mov DWORD PTR[ebp-28],74617473h
mov DWORD PTR[ebp-32],004A424Fh
mov DWORD PTR[ebp-36],5F726569h
mov DWORD PTR[ebp-40],68636966h
mov DWORD PTR[ebp-44],004D5341h
mov DWORD PTR[ebp-48],5F726569h
mov DWORD PTR[ebp-52],68636966h
mov DWORD PTR[ebp-56],00000000h
mov DWORD PTR[ebp-60],74696465h
.if uMsg == WM_CREATE
;creation interface graphique
;-----------------------------
;bouton -----------
; "conversion"
lea eax,ButtonClassName
mov BCN,eax
lea eax,ButtonText
mov BTT,eax
invoke CreateWindowEx,NULL,BCN,BTT,\
WS_CHILD or WS_VISIBLE or BS_DEFPUSHBUTTON,\
255,5,140,25,hWin,1,HANDLE_PROCESS_PRIMAIRE,NULL
mov hwndButton,eax
;label ----------
; "fichier blend"
lea eax,labelClassName
mov LBN,eax
lea eax,labelText
mov LBT,eax
invoke CreateWindowEx,NULL, LBN,LBT,\
WS_CHILD or WS_VISIBLE or SS_CENTER,\
55,20,100,15,hWin,1,HANDLE_PROCESS_PRIMAIRE,NULL
mov hwndLabel,eax
; "fichier ASM"
lea eax,labelText2
mov LBT2,eax
invoke CreateWindowEx,NULL,LBN,LBT2,\
WS_CHILD or WS_VISIBLE or SS_CENTER,\
450,20,100,15,hWin,2,HANDLE_PROCESS_PRIMAIRE,NULL
mov hwndLabel2,eax
;editeur de texte ----------
; "fichier blend"
lea eax,editClassName
mov ECN,eax
invoke CreateWindowEx,WS_EX_OVERLAPPEDWINDOW,ECN,NULL,\
WS_VISIBLE or WS_CHILD or ES_LEFT or ES_MULTILINE or\
ES_AUTOHSCROLL or ES_AUTOVSCROLL or WS_VSCROLL or WS_HSCROLL,\
5,40,320,500,hWin,1,HANDLE_PROCESS_PRIMAIRE,NULL
mov hwndedit,eax
; "fichier ASM"
invoke CreateWindowEx,WS_EX_OVERLAPPEDWINDOW,ECN,NULL,\
WS_VISIBLE or WS_CHILD or ES_LEFT or ES_MULTILINE or\
ES_AUTOHSCROLL or ES_AUTOVSCROLL or WS_VSCROLL or WS_HSCROLL,\
350,40,360,500,hWin,2,HANDLE_PROCESS_PRIMAIRE,NULL
mov hwndedit1,eax
;------ remplissage structure Open File Name
invoke SetFocus,hwndedit
mov ofn.lStructSize,SIZEOF ofn
push hWin
pop ofn.hwndOwner
push HANDLE_PROCESS_PRIMAIRE
pop ofn.hInstance
mov ofn.lpstrFilter,NULL
mov ofn.lpstrFile, OFFSET buffer ;stockage nom du fichier ouvert
mov ofn.nMaxFile,MAXSIZE
ret
.ELSEIF uMsg==WM_COMMAND
mov eax,wParam
.if lParam==0
nop
nop
.if ax==1 ;IDM_OPEN
;ouvre la boite de dialogue openfilename
;et selectionne le fichier .obj
mov ofn.Flags, OFN_FILEMUSTEXIST or \
OFN_PATHMUSTEXIST or OFN_LONGNAMES or\
OFN_EXPLORER or OFN_HIDEREADONLY
invoke GetOpenFileName, ADDR ofn
.if eax==TRUE
invoke CreateFile,ADDR buffer,\
GENERIC_READ or GENERIC_WRITE ,\
FILE_SHARE_READ or FILE_SHARE_WRITE,\
NULL,OPEN_EXISTING,FILE_ATTRIBUTE_ARCHIVE,\
NULL
mov hFile_blend,eax
;determination de la taille du fichier .obj choisi
invoke GetFileSize,hFile_blend,0
mov taille_fichier_obj,eax
;creation des buffers de travail
;qui recoit le fichier .obj à traiter
invoke GlobalAlloc,GMEM_FIXED,eax
mov ID_BUFFER_BLEND,eax ;buffer pour fichier.obj
invoke GlobalLock,eax
;qui recoit le resultat du traitement
mov eax,taille_fichier_obj
shl eax,1 ;on double la taille par precaution
invoke GlobalAlloc,GMEM_FIXED,eax
mov ID_BUFFER_ASM,eax ;buffer pour traduction asm
invoke GlobalLock,eax
;initialisation des buffers avec 20h
mov ecx,taille_fichier_obj
mov eax,ID_BUFFER_BLEND
mov edx,ID_BUFFER_ASM
initiBuff: mov BYTE ptr[eax],20h
mov BYTE PTR[edx],20h
inc eax
inc edx
dec ecx
cmp ecx,0
jne initiBuff
;
mov ecx,taille_fichier_obj
mov edx,ID_BUFFER_ASM
add edx,taille_fichier_obj
initBis: mov byte ptr[edx],20h
inc edx
dec ecx
cmp ecx,0
jne initBis
;
;lit le fichier .obj et le stocke dans le buffer
invoke ReadFile,hFile_blend,ID_BUFFER_BLEND,taille_fichier_obj,ADDR SizeReadWrite,NULL
;
invoke SendMessage,hwndedit,WM_SETTEXT,NULL,ID_BUFFER_BLEND
.endif
invoke SetFocus,hwndedit
;
ret
.elseif ax==2 ;IDM_SAVE
;sauvegarde le contenu de l'edit text "masm"
;dans le fichier choisi
mov ofn.Flags,OFN_LONGNAMES or\
OFN_EXPLORER or OFN_HIDEREADONLY
invoke GetSaveFileName, ADDR ofn
.if eax==TRUE
invoke CreateFile,ADDR buffer,\
GENERIC_READ or GENERIC_WRITE ,\
FILE_SHARE_READ or FILE_SHARE_WRITE,\
NULL,CREATE_NEW,FILE_ATTRIBUTE_ARCHIVE,\
NULL
mov hFile,eax
;
mov eax,taille_fichier_obj
shl eax,1
invoke SendMessage,hwndedit1,WM_GETTEXT,eax,ID_BUFFER_ASM
lea ecx,SizeReadWrite
mov SRW,ecx
invoke WriteFile,hFile,ID_BUFFER_ASM,eax,SRW,NULL
invoke CloseHandle,hFile
.endif
invoke SetFocus,hwndedit1
ret
.elseif ax==3 ;IDM_EXIT
invoke DestroyWindow,hWin
ret
.endif
.else
.IF ax==1 ;ButtonID ;conversion demandée
;-------------------------------------------------------
shr eax,16
.IF ax==0 ;BN_CLICKED
;extraction des donnees de buffer_blend vers bufferAsm
invoke traduction
;on charge bufferAsm dans edit masm (ecrase le texte present si il y en a un)
invoke SendMessage,hwndedit1,WM_SETTEXT,NULL,ID_BUFFER_ASM
.ENDIF
.ENDIF
.endif
.ELSEIF uMsg == WM_KEYDOWN
mov eax,wParam
cmp eax,VK_ESCAPE
jne suite
invoke DestroyWindow,hWin
suite: ret
.elseif uMsg == WM_CLOSE
invoke DestroyWindow,hWin
ret
.elseif uMsg == WM_DESTROY
;ferme le fichier .obj
lea ecx,hFile_blend
invoke CloseHandle,dword ptr[ecx]
;deverouille les zones memoires
push [ID_BUFFER_BLEND]
pop eax
invoke GlobalUnlock,eax
push [ID_BUFFER_ASM]
pop eax
invoke GlobalUnlock,eax
;libere la memoire
push [ID_BUFFER_BLEND]
pop eax
invoke GlobalFree,eax
push [ID_BUFFER_ASM]
pop eax
invoke GlobalFree,eax
;
invoke PostQuitMessage,NULL
ret
.endif
invoke DefWindowProc,hWin,uMsg,wParam,lParam
ret
poste ENDP
;-----------------------
chercheMsg PROC hInst1:DWORD
LOCAL msg:MSG
boucleMsg:
invoke PeekMessage,ADDR msg,0,0,0,PM_NOREMOVE
or eax,eax
jz pasMsg
invoke GetMessage,ADDR msg,NULL,0,0
or eax,eax
jz fin
invoke TranslateMessage,ADDR msg
invoke DispatchMessage,ADDR msg
jmp boucleMsg
pasMsg:
jmp boucleMsg
fin:
mov eax,msg.wParam
ret
chercheMsg ENDP
traduction proc uses eax ecx edx ebx
LOCAL valeur_texture,compteur_octets:DWORD
LOCAL curseur_blend,curseur_asm,nombre_de_signe_moins,curseur_blend_intermediaire:DWORD
LOCAL longueur_ligne_vertex:BYTE
LOCAL compteur_boucle,nbre_sommets,compteur_chiffre,compteur_sommet:dword
mov compteur_octets,0
mov valeur_texture,0
mov curseur_blend,30h
mov curseur_asm,0
mov nombre_de_signe_moins,0
mov curseur_blend_intermediaire,0
mov longueur_ligne_vertex,26
mov compteur_boucle,0
;------------------------------------------------------------------------------------
;premier scanne du fichier blend en entier pour retrouver et afficher tous les vertex
;------------------------------------------------------------------------------------
extraction:
mov longueur_ligne_vertex,26 ;longueur mini d'une ligne de vertex (sans -)
;extraction de 4 caractères
mov eax,ID_BUFFER_BLEND
add eax,curseur_blend
cmp BYTE PTR [eax],0Dh
jne NOvertex
cmp BYTE PTR [eax+1],0Ah
jne NOvertex
;on est au debut d'une ligne de code
;est ce une ligne de vertex ?
cmp BYTE PTR [eax+2],'v'
jne NOvertex
cmp BYTE PTR [eax+3],' '
jne NOvertex
;oui c'est une ligne de vertex
;traitement de la ligne de vertex
mov eax,curseur_blend
mov curseur_blend_intermediaire,eax ;sauvegarde de la position du curseur_blend
add curseur_blend_intermediaire,4
A1:
mov eax,ID_BUFFER_ASM
add eax,curseur_asm
mov BYTE PTR [eax],'D'
mov BYTE PTR [eax+1],'W'
mov BYTE PTR [eax+2],'O'
mov BYTE PTR [eax+3],'R'
mov BYTE PTR [eax+4],'D'
mov BYTE PTR [eax+5],' '
;coordonnees de texture type carré
inc valeur_texture
cmp valeur_texture,5
jne V1
mov valeur_texture,1
V1:
cmp valeur_texture,1
jne V2
mov BYTE PTR [eax+6],'0'
mov BYTE PTR [eax+7],'.'
mov BYTE PTR [eax+8],'0'
mov BYTE PTR [eax+9],','
mov BYTE PTR [eax+10],'0'
mov BYTE PTR [eax+11],'.'
mov BYTE PTR [eax+12],'0'
mov BYTE PTR [eax+13],','
V2:
cmp valeur_texture,2
jne V3
mov BYTE PTR [eax+6],'1'
mov BYTE PTR [eax+7],'.'
mov BYTE PTR [eax+8],'0'
mov BYTE PTR [eax+9],','
mov BYTE PTR [eax+10],'0'
mov BYTE PTR [eax+11],'.'
mov BYTE PTR [eax+12],'0'
mov BYTE PTR [eax+13],','
V3: cmp valeur_texture,3
jne V4
mov BYTE PTR [eax+6],'1'
mov BYTE PTR [eax+7],'.'
mov BYTE PTR [eax+8],'0'
mov BYTE PTR [eax+9],','
mov BYTE PTR [eax+10],'1'
mov BYTE PTR [eax+11],'.'
mov BYTE PTR [eax+12],'0'
mov BYTE PTR [eax+13],','
V4: cmp valeur_texture,4
jne V5
mov BYTE PTR [eax+6],'0'
mov BYTE PTR [eax+7],'.'
mov BYTE PTR [eax+8],'0'
mov BYTE PTR [eax+9],','
mov BYTE PTR [eax+10],'1'
mov BYTE PTR [eax+11],'.'
mov BYTE PTR [eax+12],'0'
mov BYTE PTR [eax+13],','
V5:
;mise à jour du curseur_asm pour pointer sur le caractere suivant
add curseur_asm,14
add compteur_octets,14
A2:
mov eax,ID_BUFFER_BLEND
add eax,curseur_blend_intermediaire
cmp BYTE PTR [eax],02Dh ;'-'
jne A3
inc nombre_de_signe_moins
A3:
inc curseur_blend_intermediaire ;pointe sur caractere suivant
mov eax,curseur_blend
add eax,33
cmp curseur_blend_intermediaire,eax
jne A2
mov ah,byte ptr longueur_ligne_vertex
add ah,byte ptr nombre_de_signe_moins
mov longueur_ligne_vertex,ah
;stockage de cette ligne de vertex dans bufferAsm
mov eax,curseur_blend
mov curseur_blend_intermediaire,eax
add curseur_blend_intermediaire,4
A4:
mov eax,ID_BUFFER_ASM
add eax,curseur_asm
inc curseur_asm ;[buffer_asm+curseur_asm] pointe sur caractere suivant '0DWORD '
inc compteur_octets
mov ecx,ID_BUFFER_BLEND
add ecx,curseur_blend_intermediaire
mov dh,BYTE PTR [ecx]
;mise en place des virgules
cmp dh,20h
jne A5
mov BYTE PTR[eax],','
jmp A6
A5: mov BYTE PTR [eax],dh
A6: inc curseur_blend_intermediaire
mov ah,longueur_ligne_vertex
dec ah
mov longueur_ligne_vertex,ah
cmp ah,0
jne A4
;ajout des caracteres de fin de lignes
mov eax,ID_BUFFER_ASM
add eax,curseur_asm
mov BYTE PTR[eax],0Dh
inc eax
mov BYTE PTR[eax],0Ah
;ici curseur_asm pointe sur sur le dernier caractere lu/ecrit
inc curseur_asm ;pointe sur derniere position libre
inc curseur_asm
add compteur_octets,2
mov eax,curseur_blend
add eax,29
add eax,nombre_de_signe_moins
mov curseur_blend,eax
;remise à zero
mov curseur_blend_intermediaire,0
mov nombre_de_signe_moins,0
jmp Z1
NOvertex:
inc curseur_blend
jmp Z1
Z1:
inc compteur_boucle
mov ebx,taille_fichier_obj
cmp compteur_boucle,ebx ;à determiner en fonction de la taille du fichier(100 000)
jne extraction
;---------------------------------------------------------------------
;deuxieme scanne du fichier blend en entier pour retrouver les faces
;----------------------------------------------------------------------
mov curseur_blend,30h
mov curseur_blend_intermediaire,0
mov compteur_boucle,0
mov compteur_chiffre,0
mov compteur_sommet,0
face:
mov eax,ID_BUFFER_BLEND
add eax,curseur_blend
cmp BYTE PTR [eax],0Dh
jne blabla
cmp BYTE PTR [eax+1],0Ah
jne blabla
cmp BYTE PTR [eax+2],'f'
jne blabla
cmp BYTE PTR [eax+3],' '
jne blabla
;c'est une ligne de face,ecriture de "BYTE "
mov ecx,ID_BUFFER_ASM
add ecx,curseur_asm
mov BYTE PTR [ecx],'W'
mov BYTE PTR [ecx+1],'O'
mov BYTE PTR [ecx+2],'R'
mov BYTE PTR [ecx+3],'D'
mov BYTE PTR [ecx+4],' '
;curseur_asm pointe sur le caractere suivant ' '
add curseur_asm,5
add compteur_octets,5
xor edx,edx
xor esi,esi
xor edi,edi
mov esi,4
mov edi,5
C0:
mov dh,BYTE PTR[eax+esi]
cmp dh,0Dh
je stop
cmp dh,20h
je fin_chiffre
;
mov byte ptr[ecx+edi],dh
inc compteur_chiffre
inc esi
inc edi
jmp C0
;
fin_chiffre:
mov byte ptr[ecx+edi],','
.if compteur_chiffre==1
mov dl,49
F1:
mov dh,byte ptr[ecx+edi-1]
cmp dh,dl
jne F2
dec dl
mov byte ptr[ecx+edi-1],dl
jmp F4
F2:
inc dl
cmp dl,58
je F4
jmp F1
F4:
.endif
.if compteur_chiffre==2
;xx='10' ?
mov dh,byte ptr[ecx+edi-2]
cmp dh,49
jne H1
mov dh,byte ptr[ecx+edi-1]
cmp dh,48
jne H1
mov byte ptr[ecx+edi-2],20h ;on met un blanc
mov byte ptr[ecx+edi-1],57 ;9 10-1=blanc+'9'
jmp fin2
H1:
;xx=x0 ?
mov dh,byte ptr[ecx+edi-1]
cmp dh,48 ;=0 ?
jne H2
mov byte ptr[ecx+edi-1],57 ;'9'
mov dh,byte ptr[ecx+edi-2]
dec dh ;dizaine-1
mov byte ptr[ecx+edi-2],dh ; si xx=x0 alors xx=(x-1)9
jmp fin2
H2:
;sinon xx=x(x-1)
mov dh,byte ptr[ecx+edi-1]
dec dh
mov byte ptr[ecx+edi-1],dh
fin2:
.endif
.if compteur_chiffre==3 ;x1=ecx+edi-3 x2=ecx+edi-2 x3=ecx+edi-1
;xxx=100 ?
mov dh,byte ptr[ecx+edi-1]
cmp dh,48 ;x1=0 ?
jne M1
mov dh,byte ptr[ecx+edi-2]
cmp dh,48 ;x2=0 ?
jne M1
mov dh,byte ptr[ecx+edi-3]
cmp dh,48 ;x1=1?
jne M1
;oui c'est 100 d'ou 100= 99
mov byte ptr[ecx+edi-3],20h ;blanc
mov byte ptr[ecx+edi-2],57 ;9
mov byte ptr[ecx+edi-1],57 ;9
jmp fin3suite
M1: ;xxx=x00 ?
mov dh,byte ptr[ecx+edi-1]
cmp dh,48
jne M2
mov dh,byte ptr[ecx+edi-2]
cmp dh,48
jne M2
;oui c'est x00 d'ou xxx=(x-1)99
mov byte ptr[ecx+edi-1],57 ;9
mov byte ptr[ecx+edi-2],57 ;9
mov dh,byte ptr[ecx+edi-3]
dec dh
mov byte ptr[ecx+edi-3],dh
jmp fin3suite
M2:
;xxx=xx0 ?
mov dh,byte ptr[ecx+edi-1]
cmp dh,48 ;=0 ?
jne M3
;oui d'ou xx0=x(x-1)9
mov byte ptr[ecx+edi-1],57 ;9
mov dh,byte ptr[ecx+edi-2]
dec dh
mov byte ptr[ecx+edi-2],dh ;x2=x2-1
;x3 ne change pas,on s'en occupe pas
jmp fin3suite
M3: ;sinon xxx=xx(x-1)
mov dh,byte ptr[ecx+edi-1]
dec dh
mov byte ptr[ecx+edi-1],dh
fin3suite:
.endif
.if compteur_chiffre==4
;xxxx=1000 d'ou = 999
mov dh,byte ptr[ecx+edi-1]
cmp dh,48 ;=0 ?
jne O1
mov dh,byte ptr[ecx+edi-2]
cmp dh,48 ;=0 ?
jne O1
mov dh,byte ptr[ecx+edi-3]
cmp dh,48 ;=0 ?
jne O1
mov dh,byte ptr[ecx+edi-4]
cmp dh,49 ;=1 ?
;ok c'est 1000
mov byte ptr[ecx+edi-4],20h ;espace
mov byte ptr[ecx+edi-3],57 ;9
mov byte ptr[ecx+edi-2],57 ;9
mov byte ptr[ecx+edi-1],57 ;9
jmp fin4
O1: ;xxxx=x000 d'ou =(x-1)999
mov dh,byte ptr[ecx+edi-1]
cmp dh,48
jne O2
mov dh,byte ptr[ecx+edi-2]
cmp dh,48
jne O2
mov dh,byte ptr[ecx+edi-3]
cmp dh,48
jne O2
;ok c'est x000
mov dh,byte ptr[ecx+edi-4]
dec dh
mov byte ptr[ecx+edi-4],dh
mov byte ptr[ecx+edi-3],57 ;9
mov byte ptr[ecx+edi-2],57 ;9
mov byte ptr[ecx+edi-1],57 ;9
jmp fin4
O2: ;xxxx=xx00 d'ou =x(x-1)99
mov dh,byte ptr[ecx+edi-1]
cmp dh,48
jne O3
mov dh,byte ptr[ecx+edi-2]
cmp dh,48
jne O3
;ok c'est xx00
mov dh,byte ptr[ecx+edi-3]
dec dh
mov byte ptr[ecx+edi-3],dh
mov byte ptr[ecx+edi-2],57 ;9
mov byte ptr[ecx+edi-1],57 ;9
jmp fin4
O3: ;xxxx=xxx0 d'ou =xx(x-1)9
mov dh,byte ptr[ecx+edi-1]
cmp dh,48
jne O4
;ok c'est xxx0
mov dh,byte ptr[ecx+edi-2]
dec dh
mov byte ptr[ecx+edi-2],dh
mov byte ptr[ecx+edi-1],57 ;9
jmp fin4
O4: ;sinon xxxx=xxx(x-1)
mov dh,byte ptr[ecx+edi-1]
dec dh
mov byte ptr[ecx+edi-1],dh
fin4:
.endif
mov compteur_chiffre,0
inc compteur_sommet
inc esi
inc edi
jmp C0
stop:
;ici on teste le dernier paquet de chiffres (qui n'est pas suivi de virgules)
.if compteur_chiffre==1
mov dl,49
G1:
mov dh,byte ptr[ecx+edi-1]
cmp dh,dl
jne G2
dec dl
mov byte ptr[ecx+edi-1],dl
jmp G4
G2:
inc dl
cmp dl,58
je G4
jmp G1
G4:
.endif
.if compteur_chiffre==2
;xx='10' ?
mov dh,byte ptr[ecx+edi-2]
cmp dh,49
jne J1
mov dh,byte ptr[ecx+edi-1]
cmp dh,48
jne J1
mov byte ptr[ecx+edi-2],20h ;on met un blanc
mov byte ptr[ecx+edi-1],57 ;9 10-1=blanc+'9'
jmp fin2bis
J1:
;xx=x0 ?
mov dh,byte ptr[ecx+edi-1]
cmp dh,48 ;=0 ?
jne J2
mov byte ptr[ecx+edi-1],57 ;'9'
mov dh,byte ptr[ecx+edi-2]
dec dh ;dizaine-1
mov byte ptr[ecx+edi-2],dh ; si xx=x0 alors xx=(x-1)9
jmp fin2bis
J2:
;sinon xx=x(x-1)
mov dh,byte ptr[ecx+edi-1]
dec dh
mov byte ptr[ecx+edi-1],dh
fin2bis:
.endif
.if compteur_chiffre==3
;xxx=100 ?
mov dh,byte ptr[ecx+edi-1]
cmp dh,48 ;x1=0 ?
jne K1
mov dh,byte ptr[ecx+edi-2]
cmp dh,48 ;x2=0 ?
jne K1
mov dh,byte ptr[ecx+edi-3]
cmp dh,48 ;x1=1?
jne K1
;oui c'est 100 d'ou 100= 99
mov byte ptr[ecx+edi-3],20h ;blanc
mov byte ptr[ecx+edi-2],57 ;9
mov byte ptr[ecx+edi-1],57 ;9
jmp fin3
K1: ;xxx=x00 ?
mov dh,byte ptr[ecx+edi-1]
cmp dh,48
jne K2
mov dh,byte ptr[ecx+edi-2]
cmp dh,48
jne K2
;oui c'est x00 d'ou xxx=(x-1)99
mov byte ptr[ecx+edi-1],57 ;9
mov byte ptr[ecx+edi-2],57 ;9
mov dh,byte ptr[ecx+edi-3]
dec dh
mov byte ptr[ecx+edi-3],dh
jmp fin3
K2:
;xxx=xx0 ?
mov dh,byte ptr[ecx+edi-1]
cmp dh,48 ;=0 ?
jne K3
;oui d'ou xx0=x(x-1)9
mov byte ptr[ecx+edi-1],57 ;9
mov dh,byte ptr[ecx+edi-2]
dec dh
mov byte ptr[ecx+edi-2],dh ;x2=x2-1
;x3 ne change pas,on s'en occupe pas
jmp fin3
K3: ;sinon xxx=xx(x-1)
mov dh,byte ptr[ecx+edi-1]
dec dh
mov byte ptr[ecx+edi-1],dh
fin3:
.endif
.if compteur_chiffre==4
;xxxx=1000 d'ou = 999
mov dh,byte ptr[ecx+edi-1]
cmp dh,48 ;=0 ?
jne P1
mov dh,byte ptr[ecx+edi-2]
cmp dh,48 ;=0 ?
jne P1
mov dh,byte ptr[ecx+edi-3]
cmp dh,48 ;=0 ?
jne P1
mov dh,byte ptr[ecx+edi-4]
cmp dh,49 ;=1 ?
;ok c'est 1000
mov byte ptr[ecx+edi-4],20h ;espace
mov byte ptr[ecx+edi-3],57 ;9
mov byte ptr[ecx+edi-2],57 ;9
mov byte ptr[ecx+edi-1],57 ;9
jmp fin4suite
P1: ;xxxx=x000 d'ou =(x-1)999
mov dh,byte ptr[ecx+edi-1]
cmp dh,48
jne P2
mov dh,byte ptr[ecx+edi-2]
cmp dh,48
jne P2
mov dh,byte ptr[ecx+edi-3]
cmp dh,48
jne P2
;ok c'est x000
mov dh,byte ptr[ecx+edi-4]
dec dh
mov byte ptr[ecx+edi-4],dh
mov byte ptr[ecx+edi-3],57 ;9
mov byte ptr[ecx+edi-2],57 ;9
mov byte ptr[ecx+edi-1],57 ;9
jmp fin4suite
P2: ;xxxx=xx00 d'ou =x(x-1)99
mov dh,byte ptr[ecx+edi-1]
cmp dh,48
jne P3
mov dh,byte ptr[ecx+edi-2]
cmp dh,48
jne P3
;ok c'est xx00
mov dh,byte ptr[ecx+edi-3]
dec dh
mov byte ptr[ecx+edi-3],dh
mov byte ptr[ecx+edi-2],57 ;9
mov byte ptr[ecx+edi-1],57 ;9
jmp fin4suite
P3: ;xxxx=xxx0 d'ou =xx(x-1)9
mov dh,byte ptr[ecx+edi-1]
cmp dh,48
jne P4
;ok c'est xxx0
mov dh,byte ptr[ecx+edi-2]
dec dh
mov byte ptr[ecx+edi-2],dh
mov byte ptr[ecx+edi-1],57 ;9
jmp fin4suite
P4: ;sinon xxxx=xxx(x-1)
mov dh,byte ptr[ecx+edi-1]
dec dh
mov byte ptr[ecx+edi-1],dh
fin4suite:
.endif
mov compteur_chiffre,0
inc compteur_sommet
mov byte ptr[ecx+edi],0Dh
mov byte ptr[ecx+edi+1],0Ah
add curseur_blend,esi
add curseur_asm,edi
add compteur_octets,edi
jmp Y1
blabla:
inc curseur_blend
jmp Y1
Y1:
inc compteur_boucle
;cmp compteur_boucle,390 ;à determiner en fonction de la taille du fichier
mov ebx,taille_fichier_obj
dec ebx
dec ebx ;taille_fichier-2
cmp compteur_boucle,ebx ;à determiner en fonction de la taille du fichier(100 000)
jne face
;-------------------------------------
;fin du traitement du fichier blend
;-------------------------------------
;affichage du nombre de sommets total
mov byte ptr[ecx+edi+2],0Dh
mov byte ptr[ecx+edi+3],0Ah
mov byte ptr[ecx+edi+4],';'
;
add edi,18
add compteur_octets,18
.data
stocke qword 0
.code
fild compteur_sommet
fistp dword ptr[stocke]
;
cmp compteur_sommet,10
jae cont ;>=10 ? saut si gauche>=droit
xor edx,edx
mov dl,byte ptr compteur_sommet
add dl,030h
mov byte ptr[ecx+edi],dl
jmp bye
cont:
divise:
mov edx,dword ptr stocke+4
mov eax,dword ptr stocke
mov ebx,10
div ebx
mov dword ptr stocke,eax ;eax=resultat
add edx,030h ;edx=reste
mov byte ptr[ecx+edi],dl
;resultat=10 ?
cmp dword ptr stocke,10
jne cont1
;oui
mov byte ptr[ecx+edi],'0'
mov byte ptr[ecx+edi-1],'1'
jmp bye
cont1: ;resultat<10 ?
cmp dword ptr stocke,10
ja cont2 ;saut si gauche>droit
;oui
xor edx,edx
mov dl,byte ptr stocke
add dl,30h
mov byte ptr[ecx+edi-1],dl
jmp bye
cont2: ;resultat>10 on peut encore diviser
dec edi
jmp divise
bye:
add edi,10
add compteur_octets,10
mov byte ptr[ecx+edi+2],' '
mov byte ptr[ecx+edi+2],'S'
mov byte ptr[ecx+edi+3],'O'
mov byte ptr[ecx+edi+4],'M'
mov byte ptr[ecx+edi+5],'M'
mov byte ptr[ecx+edi+6],'E'
mov byte ptr[ecx+edi+7],'T'
mov byte ptr[ecx+edi+8],'S'
mov byte ptr[ecx+edi+9],0Dh
mov byte ptr[ecx+edi+10],0Ah
;nettoyage position inoccupée du bufferAsm
add compteur_octets,30
add curseur_asm,38
;mov eax,NbreOctetFichierBlend
mov eax,taille_fichier_obj
shl eax,1 ;eax=eax*2
sub eax,dword ptr compteur_octets
.data
x dword ?
.code
mov x,eax
mov eax,ID_BUFFER_ASM
add eax,curseur_asm
nettoie:
mov byte ptr[eax],0h
inc eax
dec x
cmp x,0
jne nettoie
ret
traduction endp
end debut
Conclusion
MasmBlend rend moins pénible l'inclusion d'objets 3d dans un prog masm Open GL.
Historique
- 01 août 2011 21:21:24 :
- simplification de la gestion de la mémoire et amélioration du code.
Sources du même auteur
Sources de la même categorie
Commentaires et avis
Discussions en rapport avec ce code source dans le forum
étapes pour compiler un programme masm sous dos? [ par samsara ]
salut les amis, je suis une vraie débutante et j'aimerais savoir comment compiler mon programme sur masm.Dans le dos je fais : "masm montre.asm " (mo
curseur personalisé masm [ par Cendra ]
je cherche a mettre un curseur personalisé ( curseur.cur ) dans un de mes programmes mais j'ai du mal a utiliser l'api LoadCursorA ....on m'a parler d
Hide Window sous Masm [ par Stormy ]
StormyJ'ai une application parfaitement fonctionnelle sous masm32. Je souhaite la rendre "cachée" soit en mode Hide. Celle-ci comporte plusieurs zones
Cherche site internet sur le Masm [ par flagyg ]
bonjours,je suis débutant en masm et j'aimerais un site inernet(ou un livre)pour commencer alors si vous connaissez ça,merci d'avance !!!!
DOCUMENTATION [ par bymo ]
Pourquoi sur ce site n'y a t il pas une bibliothèque en français de documentation sur les différents assembleurs:MASM, TASM, NASM, FASM... et autres.C
syntaxe Masm [ par Stormy ]
J'ai un code asm brut à établir selon les usages de Masm version 8. Cette ligne n'est pas reconnue par le compilateur:mov edx, dword ptr fs:[edx]Quell
bug masm? [ par vecchio56 ]
j'ai le code minimal suivant:.386.model flat, stdcall .data .code start: end startmais le pb c'est qu'au linkage il me met
MASM [ par LordBob ]
Bonjour a tous,voila je debute en Asm et j'essaie de me servir de MASM, mais j'ai un peu de mal, personne ne connaitrait un tutorial pour apprendre a
Petit probleme avec MASM [ par LordBob ]
Bonjour a tous,voila je debute en assembleur et en fait j'utilise MASM32 et je viens d'écrire un programme tout basique qui est simplement censé affic
[MASM] Chronomètre [ par ZogStriP ]
Je souhaiterais faire un chronomètre à la miliseconde prés ( au format : mm:ss:nn avec mm <=> minutes, ss <=> secondes, nn <=> mili
|
Derniers Blogs
IMAGINE CUP 2012, MAKE A SIGN EN FINALEIMAGINE CUP 2012, MAKE A SIGN EN FINALE par junarnoalg
Voilà qui est fait, la nouvelle est officielle ! L'équipe belge "Make a Sign" va au pays des kangourous défendre son projet dans la catégorie Software Design. http://www.imaginecup.com/CompetitionsContent/Competition/WorldwideFinalists.aspx V...
Cliquez pour lire la suite de l'article par junarnoalg KINECT 1.5 IS OUT !KINECT 1.5 IS OUT ! par Vko
La version 1.5 du Kinect For Microsoft vient tout juste de sortir ! Plein de nouveautés: Tracking de squelette en Near Mode Détection en position assise Détection faciale avec un SDK dédié Documentation et des guideline (enfin) Un out...
Cliquez pour lire la suite de l'article par Vko LES ACTUALITéS DE LA SEMAINE SUR C2I.FR (14 MAI - 20 MAI) LES ACTUALITéS DE LA SEMAINE SUR C2I.FR (14 MAI - 20 MAI) par richardc
Mise à jour des Web API du 14 Mai
Réservez dès maintenant votre journée du 20 juin pour le Windows Azure Dev Camp 2012 à Paris
Mise à jour de Team Foundation Service
MechCommander 2 sur Windows 8
Entity Framework 5 Release Candidate e...
Cliquez pour lire la suite de l'article par richardc REACTIVE EXTENSIONS : CONSOMMER DES SERVICES AVEC RX PARTIE 3, LES PIèGES à éVITERREACTIVE EXTENSIONS : CONSOMMER DES SERVICES AVEC RX PARTIE 3, LES PIèGES à éVITER par Groc
Une mauvaise utilisation de rx lors de l'écriture d'une couche d'accès à des services peut conduire à des cas embarassants avec des erreurs mal gérées, des appels qui ne partent lorsqu'ils le devraient, et même des résultats incorrects . le tout nuis...
Cliquez pour lire la suite de l'article par Groc SHAREPOINT BLOG SITE, PROBLèME D'ARCHIVESSHAREPOINT BLOG SITE, PROBLèME D'ARCHIVES par junarnoalg
Dernièrement, nous avons migré le site
myTIC
vers un nouveau serveur SharePoint 2010. Dans les contenus que nous vouloins récupérer, nous avions un certain nombre de blogs.
Nous avons utilisé les commandes Power...
Cliquez pour lire la suite de l'article par junarnoalg
Logiciels
974 Application Server (12.2.4.0)974 APPLICATION SERVER (12.2.4.0)Développez de puissantes applications dans un environnement de 'cloud computing', clusterisé, séc... Cliquez pour télécharger 974 Application Server vPicture (1.4.2.1)VPICTURE (1.4.2.1)Avec vPicture, hébergez vos images facilement et rapidement.
vPicture est un utilitaire simple, ... Cliquez pour télécharger vPicture Easy-Planning (2.2.1.6)EASY-PLANNING (2.2.1.6)Easy-Planning permet de créer des plannings sous la représentation de diagrammes et est adapté au... Cliquez pour télécharger Easy-Planning COM-BACKUP (2.0)COM-BACKUP (2.0)
COM-BACKUP est un logiciel de sauvegarde qui permet de planifier les sauvegardes de vos dossiers ...
Cliquez pour télécharger COM-BACKUP mySongBook Player (1.0.0)MYSONGBOOK PLAYER (1.0.0)mySongBook Player est un logiciel gratuit permettant l'accès à une archive de tablatures/partitio... Cliquez pour télécharger mySongBook Player
|