.model small .stack 100h .386 .data nom_fich db "image.bmp",00h ; chemin du fichier image num dw ? ; numéro logique ou handle du fichier deb_fich dd ? ; offset du début de l'image dans le fichier palette db 1024 dup(?) ; composantes RVB de la palette coul db ? ; couleur d'un point de l'image x dw 0 ; coordonnée x d'un point de l'image y dw 0 ; coordonnée y d'un point de l'image cpt db ? ; numéro de registre d'une couleur .code mov ax,@data mov ds,ax mov ax,320 push ax mov ax,200 push ax call Lirebmp add sp,4 ;mov ax,0h ; repasse en mode texte ;int 21h mov ax,4C00h int 21h Lirebmp proc near push bp mov bp,sp push ax push bx push cx push dx mov ax,[bp+4] mov [y],ax dec y mov ax,013h ; initialisation mode 13h int 10h mov ax,3d00h ; ouverture de fichier en lecture seule lea dx,nom_fich ; adresse du nom du fichier int 21h setc cl cmp cx,0 jne fin mov [num],ax; ax=numéro logique ou handle du fichier ; on se déplace pour récupérer le début de l'image mov cx,0 ; Mot fort du déplacement mov dx,10 ; Mot faible du déplacement call deplacer_pointeur ; lecture début de l'image mov ax,3f00h ; fonction de lecture mov bx,[num] ; numéro logique ou handle du fichier mov cx,4 ; on lit 4 octets lea dx,deb_fich ; Adresse d'offset du buffer int 21h ; on se déplace pour récupérer la palette mov cx,0 mov dx,54 call deplacer_pointeur mov [cpt],0 ; compteur pour les 256 registres des 256 couleurs mov ax,3f00h ; lecture mov bx,[num] ; handle mov cx,1024 ; on lit 1024 octets mov dx,offset palette ; adresse de récupération de la lecture de la palette int 21h mov bx,0 mov dx,03C8h mov al,[cpt] out dx,al ; numéro de la couleur mov dx,03c9h ; lecture palette pal: ; initialisation palette mov al,byte ptr [palette+bx+2] sar al,2 out dx,al ; composante rouge mov al,byte ptr [palette+bx+1] sar al,2 out dx,al ; composante vert mov al,byte ptr [palette+bx] sar al,2 out dx,al ; composante bleu add bx,4 inc [cpt] ; on passe au registre de couleur suivant cmp [cpt],255 ; si on a pas atteind les 256 registres jne pal ; on refait un tour ; on se place au debut de l'image mov cx,word ptr deb_fich+2 ; poids forts mov dx,word ptr deb_fich ; poids faibles call deplacer_pointeur ; chargement de l'image (commence par la dernière ligne) mov cx,1 ; lit 1 octet lors de la lecture mov bx,[num] ; handle du fichier haut: mov [x],0 ; abscisse du point larg: ; lecture point mov ax,3f00h ; fonction de lecture lea dx,coul ; Adresse d'offset du buffer int 21h ; dx = octet lu call SetPixel inc x ; incrémente x cmp x,320 ; compare x et la largeur de l'image jne larg ; saute à larg si x différent de 320 dec y ; sinon : décrémente y jnz haut ; saute à haut si y différent de 0 mov ah,3eh ; fontion de fermeture de fichier int 21h fin: mov ah,3eh ; ferme le fichier mov bx,[num] int 21h pop dx pop cx pop bx pop ax pop bp ret Lirebmp endp deplacer_pointeur proc near ;Déplacer le pointeur de fichier mov bx,[num] ; numéro logique ou handle du fichier mov ah,42h ; fonction de modification de pointeur dans un fichier mov al,0 ; Le déplacement se rapporte au début du fichier int 21h ret deplacer_pointeur endp SetPixel proc near push bx mov ax,0a000h mov es,ax mov bx,x mov ax,320 mul y ; ax= 320y add bx,ax ; bx = x+320y mov al,coul ; couleur mov es:[bx],al pop bx ret SetPixel endp end