1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116
| ; ***** INTIALISATIONS (MODE VGA, OUVERTURE FICHIER,...) *****
org 100h
.lireBmp:
pusha
; es = début de la mémoire vidéo
mov ax, 0A000h
mov es,ax
; Initialisation du mode 13h
mov ax,13h
int 10h
; Ouverture du fichier
mov ax,3D00h ; ouverture de fichier en lecture seule
mov dx,nom_fich ; adresse du nom du fichier
int 21h
jc fin
mov bx,ax ; bx = numéro logique ou handle du fichier
; On se déplace pour récupérer la taille du BITMAPINFOHEADER
xor cx,cx
mov dx,14
mov ax,4200h ; fonction de modification de pointeur dans un fichier
int 21h
mov ax,3F00h ; fonction de lecture
mov cx,4 ; on lit 4 octets (double word)
mov dx,taille_header ; Adresse d'offset du buffer
int 21h
; On se déplace pour récupérer la palette
xor cx,cx
mov edx,14
add edx,[taille_header]
mov ax,4200h ; fonction de modification de pointeur dans un fichier
int 21h
mov ax,3F00h ; fonction de lecture
mov cx,1024 ; on lit 4 octets (double word)
mov dx,palette ; Adresse d'offset du buffer
int 21h
; ***** INITIALISATION DE LA PALETTE DE COULEURS *****
push bx ; Sauvegarde du handle du fichier
mov bp,palette ; bp = adresse de la palette
xor di,di ; di = offest courant pour le parcours de la palette
xor bx,bx ; bx = n° du registre DAC
pal:
mov ch,[bp+di+1]
mov cl,[bp+di]
mov dh,[bp+di+2]
mov ax,1010h ; Chargement registre DAC
int 10h
add di,4
inc bx
cmp bx,256 ; Dernier registre ?
jb pal
; On se déplace au début de l'image
pop bx ; Restauration du handle du fichier
mov ecx,14
add ecx,[taille_header]
add ecx,1024
mov dx,cx
shr ecx,16
mov ax,4200h ; fonction de modification de pointeur dans un fichier
int 21h
; ***** CHARGEMENT DE L'IMAGE (en commençant par la dernière ligne) *****
mov cx,1 ; lit 1 octet dans le fichier
haut:
mov [x],0 ; abscisse du point
larg:
mov ax,3F00h ; fonction de lecture
mov dx,coul ; Adresse d'offset du buffer couleur
int 21h ; lecture du pixel dans le fichier
mov ebp,[x]
mov eax,320
mul [y] ; ax = 320 * y
add ebp,eax ; bp = x + 320 * y
mov al,[coul] ; couleur
mov [es:bp],al ; Affichage du pixel
inc [x] ; colonne suivante
cmp [x],320 ; fin de ligne ?
jb larg
dec [y] ; ligne précédente
jns haut ; continue tant que ligne >= 0
fin:
; fermeture du fichier
mov ah,3eh
int 21h
; Presser une touche
mov ah,01h
int 21h
; Retour en mode texte
mov ax,0003h
int 10h
popa
ret
; ***** DECLARATION DES DONNEES *****
nom_fich: db 'image.bmp',0 ; chemin du fichier image
taille_header dd ? ; taille du BITMAPINFOHEADER
palette: times 1024 db 0 ; composantes RVB de la palette
coul db ? ; couleur d'un point de l'image
x dd 0 ; coordonnée x d'un point de l'image
y dd 199 ; coordonnée y d'un point de l'image |
Partager