Comme l'indique le titre, c'est un petit programme permettant de dessiner des rectangles dont on peut définir la position, la taille, la couleur (parmi 16), et l'épaisseur de trait.
C'est programmé en NASM.
J'ai utilisé la pile pour les arguments des fonctions.
C'est ma première source donc c'est possible qu'il y ait des incohérences, des erreurs ou autre... :)
Le code est un peu commenté.
Après avoir testé ce code sous Windows Vista (via DosBOX), j'ai remarqué que certains rectangles ne sont pas entiers... (alors que via xdosemu sous Linux il n'y a pas ce problème).
Source / Exemple :
bits 16
org 0x100
section .text
;Mode vidéo VGA (640 * 480 16 couleurs)
mov ah, 00h
mov al, 12h
int 10h
;Codes couleurs en hexadécimal
;00h : noir
;01h : bleu
;02h : vert
;03h : cyan
;04h : rouge
;05h : mangenta
;06h : brun
;07h : gris clair
;08h : gris foncé
;09h : bleu clair
;0Ah : vert clair
;0Bh : cyan clair
;0Ch : rouge clair
;0Dh : mangenta clair
;0Eh : jaune
;0Fh : blanc
;On dessine un rectangle épais
push 0Dh
push 24
push 130
push 234
push 139
push 56
call drawRectWithWidth
;On dessine un rectangle plein (épaisseur de trait = minimum(largeur, hauteur) / 2)
push 0Ch
push 350
push 130
push 76
push 167
push 76 / 2
call drawRectWithWidth
;On dessine un rectangle qui superpose les autres
push 02h
push 55
push 237
push 471
push 167
push 19
call drawRectWithWidth
;On dessine un rectangle encadrant la fenêtre
push 06h
push 0
push 0
push 640
push 480
push 12
call drawRectWithWidth
;On quitte le programme
mov ch, 0
mov ah, 4Ch
int 21h
;Fonction de dessin de ligne
;Prend en paramètres :
;- Couleur [bp + 12]
;- Longueur [bp + 10]
;- Abscisse [bp + 8]
;- Ordonnée [bp + 6]
;- Direction (0 : horizontale, 1 : verticale) [bp + 4]
drawLine:
push bp
mov bp, sp
mov bx, -1 ;Pour un coin superieur gauche non biseauté
whileDrawLine:
cmp bx, [bp + 10]
je _whileDrawLine
inc bx
;On dessine un pixel
mov ah, 0Ch
mov al, [bp + 12]
;On dessine le pixel en fonction de la direction (horizontale ou verticale)
mov cx, [bp + 4]
cmp cx, 1
je vertical
horizontal:
mov cx, bx
add cx, [bp + 8]
mov dx, [bp + 6]
jmp draw
vertical:
mov cx, [bp + 8]
mov dx, bx
add dx, [bp + 6]
draw:
int 10h
jmp whileDrawLine
_whileDrawLine:
pop bp
ret 10 ;2 * le nombre de paramètres (important)
;Fonction de dessin de rectangle
;Prend en paramètres :
;- Couleur [bp + 12]
;- Abcsse [bp + 10]
;- Ordonnée [bp + 8]
;- Largeur [bp + 6]
;- Hauteur [bp + 4]
drawRect:
push bp
mov bp, sp
mov ax, [bp + 12]
push ax
mov ax, [bp + 6]
push ax
mov ax, [bp + 10]
push ax
mov ax, [bp + 8]
push ax
push 0
call drawLine ;Ligne horizontale haute
mov ax, [bp + 12]
push ax
mov ax, [bp + 4]
push ax
mov ax, [bp + 10]
push ax
mov ax, [bp + 8]
push ax
push 1
call drawLine ;Ligne verticale gauche
mov ax, [bp + 12]
push ax
mov ax, [bp + 6]
push ax
mov ax, [bp + 10]
push ax
mov ax, [bp + 4]
add ax, [bp + 8]
push ax
push 0
call drawLine ;Ligne horizontale basse
mov ax, [bp + 12]
push ax
mov ax, [bp + 4]
push ax
mov ax, [bp + 10]
add ax, [bp + 6]
push ax
mov ax, [bp + 8]
push ax
push 1
call drawLine ;Ligne verticale droite
pop bp
ret 10 ;2 * le nombre de paramètres (important)
;Fonction de dessin de rectangle avec une épaisseur de trait
;Prend en paramètres :
;- Couleur [bp + 14]
;- Abcsse [bp + 12]
;- Ordonnée [bp + 10]
;- Largeur [bp + 8]
;- Hauteur [bp + 6]
;- Epaisseur de trait [bp + 4]
drawRectWithWidth:
push bp
mov bp, sp
;On annule l'épaisseur de trait si elle est plus grande que la largeur ou la hauteur du rectangle divisée par 2
;Car sinon le programme plante et/ou dessine n'importe quoi
mov bx, [bp + 8]
mov dx, [bp + 6]
mov cx, [bp + 4]
add cx, [bp + 4]
cmp cx, bx
ja disableWidth
cmp cx, dx
ja disableWidth
mov dx, [bp + 4]
jmp _disableWidth
disableWidth:
mov dx, 1
_disableWidth:
mov bx, 0
;Boucle qui dessine dx rectangles d'épaisseur simple (grâce à la fonction drawRect) afin d'avoir une épaisseur
whileDrawRectWithWidth:
cmp bx, dx
je _whileDrawRectWithWidth
inc bx
push bx
push dx
mov ax, [bp + 14]
push ax
mov ax, [bp + 12]
add ax, bx
dec ax
push ax
mov ax, [bp + 10]
add ax, bx
dec ax
push ax
mov ax, [bp + 8]
sub ax, bx
sub ax, bx
inc ax
push ax
mov ax, [bp + 6]
sub ax, bx
sub ax, bx
inc ax
push ax
call drawRect
pop dx
pop bx
jmp whileDrawRectWithWidth
_whileDrawRectWithWidth:
pop bp
ret 12 ;2 * le nombre de paramètres (important)
Vous n'êtes pas encore membre ?
inscrivez-vous, c'est gratuit et ça prend moins d'une minute !
Les membres obtiennent plus de réponses que les utilisateurs anonymes.
Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.
Le fait d'être membre vous permet d'avoir des options supplémentaires.