Accueil > > > DESSIN DE RECTANGLES (POSITION, TAILLE, COULEUR, ÉPAISSEUR)
DESSIN DE RECTANGLES (POSITION, TAILLE, COULEUR, ÉPAISSEUR)
Information sur la source
Description
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
- 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)
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)
Historique
- 07 février 2009 11:21:30 :
- Découverte d'un bug sous Windows avec DosBox 0.72 (certains rectangles ne sont pas entiers).
Sources de la même categorie
Commentaires et avis
Discussions en rapport avec ce code source dans le forum
couleur d'un pixel [ par akina ]
IlyJe recherche une fonction en asm (rapide) pour récupérer la couleur d'un pixel de l'écran. Si quelqu'un connait une fonction plus rapide que celle
couleur en TASM ? [ par redwings ]
j'aimerai savoir les instructions qui permettent d'affiche un caractere en couleurAL contient le caractere ...MOV DL,AL MOV AH,02hINT 21h...merci
programmation graphique en mode 12h [ par masta_jigga ]
J'aimerai poser surement une bete question. Comment puis-je faire pour travailler dans le mode 12h (640x480 en 16 couleurs)en accedant directemen
[ASM] Ecrire en couleur un buffer [ par diaboloche ]
Slt, donc la question est dans le titre, j'aimerais ecrire en couleur certaines lettres en dehors d'un buffer... Ecrire une simple lettre j'y arrive s
Maitriser chaque petit pixel de l'écran [ par tntprog ]
Bonjour, J'aimerais pouvoir afficher ou éteindre le moindre petit pixel de mon écran avec la couleur que je désir. Est-ce que quelqu'un sait comment
help schema de carte graphique [ par busman ]
salut a tous j ai recup une " saphirre radeon x1900 xtx 512m dual - dvi/vivo"SKU#21082-00PN 102-A 52021-52-ATje recherche desesperement le chema elect
Impression d'une fenêtre [ par Nasman ]
Bonjour,Je suis à la recherche des méthodes à employer pour permettre d'imprimer une fenêtre graphique sur une imprimante sélectionnée. Je n'ai pas de
Graphisme 2D Plein écran avec Window [ par epineurien ]
Bonjour ! Voilà , j'ai un problême tout simple : je veux faire une application (qui utilise les api-window au passage) qui puisse passer en plein écra
luminance d'un pixel [ par raoulli ]
bonsoir.comme le titre l'indique, je cherche a connaitre la luminance d'un pixel a l'ecran.j'ai son RGB, mais je n'ai pas trouvé l'API pour pouvoir co
bug graphique [ par raoulli ]
salut.c'est encore moi.je suis collant hein !Cette fois ci c'est donc pour un bug graphique.Voila, je ne vois pas dutout la maniere de debuguer ce pro
|
Derniers Blogs
WP7 5K BELGIUM CHALLENGEWP7 5K BELGIUM CHALLENGE par junarnoalg
Microsoft Belgique a le plaisir de vous annoncer le lancement du
Challenge Windows Phone 7
. Celui-ci se déroule du 12 juillet au 30 novembre 2010 et vous donne l'opportunit...
Cliquez pour lire la suite de l'article par junarnoalg LES MONADES POUR LES NULSLES MONADES POUR LES NULS par mdufourneaudravel
Avec l'annonce de F#, je me suis intéressé de plus en plus à la programmation fonctionnelle, je suis donc rapidement tombé sur les " monades ", mais malgré la lecture de plusieurs articles, j'étais resté perméable à leur concept. C'est désormais fini, grâ...
Cliquez pour lire la suite de l'article par mdufourneaudravel [WP7] AJOUTER DES IMAGES DANS LA MEDIA LIBRARY D'UN WINDOWS PHONE 7[WP7] AJOUTER DES IMAGES DANS LA MEDIA LIBRARY D'UN WINDOWS PHONE 7 par Audrey
L'émulateur Windows Phone 7, fourni avec la version Beta des outils développeurs n'inclut aucune image dans sa bibliothèque. Pas très pratique de tester son application lorsque l'on souhaite que l'utilisateur puisse choisir une image présente dans le télé...
Cliquez pour lire la suite de l'article par Audrey VIVE LES MOCKS ET LES POCOSVIVE LES MOCKS ET LES POCOS par vLabz
J'observe régulièrement autour de moi de la confusion à propos de ces deux termes et j'aimerais juste rappeler ce qu'ils signifient. Je ne suis bien sûr pas le mieux placé pour faire une leçon mais je vais faire de mon mieux pour mettre en valeur ce q...
Cliquez pour lire la suite de l'article par vLabz [WF4] WORKFLOW AND CUSTOM ACTIVITIES - BEST PRACTICES (4/5)[WF4] WORKFLOW AND CUSTOM ACTIVITIES - BEST PRACTICES (4/5) par JeremyJeanson
Vendredi dernier Microsoft a publié le quatrième épisode des bonnes pratiques pour coder ses activités custom dans WF4 : endpoint.tv - Workflow and Custom Activities - Best Practices (Part 4) . Tout comme pour les précédents épisodes, j'ai pris le temps d...
Cliquez pour lire la suite de l'article par JeremyJeanson
Logiciels
Crystal Report (11)CRYSTAL REPORT (11)Crystal Reports est un outil de reporting souple et puissant, vous pouvez très facilement consult... Cliquez pour télécharger Crystal Report Academy System (12.0.2.0)ACADEMY SYSTEM (12.0.2.0)Logiciel de gestion des établissements.
- élèves/étudiants (inscription, dossier, absence...)
-... Cliquez pour télécharger Academy System Xilisoft iPod Vidéo Convertisseur 6 (6.0.3.0419)XILISOFT IPOD VIDéO CONVERTISSEUR 6 (6.0.3.0419)Xilisoft iPod Vidéo Convertisseur est un outil puissant de conversion d'iPod, facile à utiliser. ... Cliquez pour télécharger Xilisoft iPod Vidéo Convertisseur 6 Xilisoft iPhone Vidéo Convertisseur 6 (6.0.3.0419)XILISOFT IPHONE VIDéO CONVERTISSEUR 6 (6.0.3.0419)Xilisoft iPhone Vidéo Convertisseur est le meilleur logiciel de conversion iPhone qui peut facile... Cliquez pour télécharger Xilisoft iPhone Vidéo Convertisseur 6 Xilisoft iPad Vidéo Convertisseur 6 (6.0.3.0419)XILISOFT IPAD VIDéO CONVERTISSEUR 6 (6.0.3.0419)Il s'agit d'un logiciel polyvalent pour convertir les formats vidéo/audio populaires en formats p... Cliquez pour télécharger Xilisoft iPad Vidéo Convertisseur 6
|