Création d'un cadre simple (mode graphique)

Description

Bon bah ce n'est pas super compliqué, ce petit programme assembleur affiche un cadre à l'écran.
Niveau qualité graphique, y'a pas grand chose, c'est pas du code super compliqué mais il a toute fois l'avantage d'être (je pense) bien expliqué et assez simple à lire.

Ce code est destiné surtout au novice de l'ASM et à ceux qui souhaiterais aborder l'aspect graphique en ASM (par graphique, j'entend MODE GRAPHIQUE)...

En espérant que la lecture du code ne soit pas trop compliqué... :S
Bonne lecture ;) et merci pour les commentaires

NOTE : Programmé sous WinXP (pro) en NASM (v. 0.98)

Source / Exemple :


;   +--------------------------------------------+
;  /                ASSEMBLEUR                    \
;  |            ------------------                |
;  |                                              |
;  |  par Benjamin DUPLEX  (Tripo)                |
;  |  le 25/01/2005                               |
;  |  > benjamin.du@wanadoo.fr                    |
;  |                                              |
;  |                                              |
;  |  * COMPILATEUR : NASM 0.98                   |
;  |  * VERSION : Windows                         |
;  |                                              |
;  |  * COMPILATION :                             |
;  |    nasm Cadre.asm -o Cadre.com               |
;  |                                              |
;  |  * LANCEMENT :                               |
;  |    Cadre.com                                 |
;  |                                              |
;  \+--------------------------------------------+/

; NOTE :
; ======
; Pour quitter le programme, vous n'avez qu'à appuyer sur une touche

bits 16						; programme 16 bits
[ORG 100h]					; commence à l'adresse 0x100 (.com)

[SECTION .data]					; zone de déclarations des constantes

	messageQuit db 'Au revoir',13,10,'$'	; msg utilisé lors de la fermeture du programme

[SECTION .text]					; zone de code du programme

	CALL	.MODE_AFF_MODE_GRAPH		; passage en mode graphique
	CALL	.CADRE				; affichage du cadre
	CALL	.TOUCHE				; attente d'une touche
	CALL	.MODE_AFF_MODE_TEXT		; passage en mode text
	MOV	DX, messageQuit
	CALL	.AFFICHAGE_MSG			; affichage du message à l'écran
	CALL	.QUIT				; quitte le programme

;  ------------------------------------------------------------
;	FONCTION QUI AFFICHE UN CADRE
;  ------------------------------------------------------------

.CADRE:
	MOV	AL, 90				; couleur du cadre

	; première ligne verticale (à gauche)
	MOV	BX, 0				; point de départ
	MOV	CX, 200				; point d'arrivé
	MOV	SI, 0				; colonne choisie
	MOV	DX, 0				; trait vertical
	CALL	.AFF_TRAIT			; affichage du trait

	; deuxième ligne verticale (à droite)
	MOV	BX, 0				; point de départ
	MOV	CX, 200				; point d'arrivé
	MOV	SI, 319				; colonne choisie
	MOV	DX, 0				; trait vertical
	CALL	.AFF_TRAIT			; affichage du trait

	; première ligne horizontale (en haut)
	MOV	BX, 0				; point de départ
	MOV	CX, 319				; point d'arrivé
	MOV	SI, 0				; ligne choisie
	MOV	DX, 1				; trait horizontal
	CALL	.AFF_TRAIT			; affichage du trait

	; deuxième ligne horizontale (en bas)
	MOV	BX, 0				; point de départ
	MOV	CX, 319				; point d'arrivé
	MOV	SI, 199				; ligne choisie
	MOV	DX, 1				; trait horizontal
	CALL	.AFF_TRAIT			; affichage du trait

	RET

;  ------------------------------------------------------------
;	FONCTION QUI AFFICHE UN TRAIT EN FONCTION DES PARAMETRES
;
;	-> BX : point de départ
;	-> CX : point d'arrivé
;	-> SI : ligne/colonne choisie
;	-> DX : vertical/horizontal
;
; 	APPEL LA FONCTION CONCERNEE SUIVANT DX
;  ------------------------------------------------------------

.AFF_TRAIT:
	CMP	DX, 0				; on compare DX à 0
	JZ	.AFF_TRAIT_VERTICAL		; si DX = 0 alors on affiche un trait vertical
	JNZ	.AFF_TRAIT_HORIZONTAL		; sinon on affiche un trait horizontal
	RET

;  ------------------------------------------------------------
;	FONCTION QUI AFFICHE UN TRAIT VERTICAL EN 
;	FONCTION DES PARAMETRES
;
;	-> BX : point de départ
;	-> CX : point d'arrivé
;	-> SI : ligne/colonne choisie
;	-> DX : vertical/horizontal
;
;  ------------------------------------------------------------

.AFF_TRAIT_VERTICAL:
	SUB	CX, BX				; calcul de la longueur du trait (arrivé - départ)
	MOV	DX, BX				; on place le curseur au premier point du trait
  .BOUCLE_TV:
	PUSH	CX				; on place la longueur restante à écrire en mémoire
	MOV	CX, SI				; on met dans DX la colonne choisie
	CALL	.AFF_POINT			; affichage du point
	INC	DX				; point suivant
	POP	CX				; on retire la longueur du trait qu'il reste à écrire de la mémoire
	DEC	CX				; on la décrémente (car on vient d'écrire un point)
	CMP	CX, 0				; on la compare à 0
	JNZ	.BOUCLE_TV			; si CX <> 0, alors on boucle
	RET					; sinon on quitte

;  ------------------------------------------------------------
;	FONCTION QUI AFFICHE UN TRAIT HORIZONTAL EN 
;	FONCTION DES PARAMETRES
;
;	-> BX : point de départ
;	-> CX : point d'arrivé
;	-> SI : ligne/colonne choisie
;	-> DX : vertical/horizontal
;
;  ------------------------------------------------------------

.AFF_TRAIT_HORIZONTAL:
	SUB	CX, BX				; calcul de la longueur du trait (arrivé - départ)
	MOV	DX, CX				; met dans DX la valeur de CX
	MOV	CX, BX				; on place le curseur au premier point du trait
  .BOUCLE_TH:
	PUSH	DX				; on place la longueur restante à écrire en mémoire
	MOV	DX, SI				; on met dans DX la ligne choisie
	CALL	.AFF_POINT			; affichage du point
	INC	CX				; point suivant
	POP	DX				; on retire la longueur du trait qu'il reste à écrire de la mémoire
	DEC	DX				; on la décrémente (car on vient d'écrire un point)
	CMP	DX, 0				; on la compare à 0
	JNZ	.BOUCLE_TH			; si DX <> 0, alors on boucle
	RET					; sinon on quitte

.AFF_POINT:
	MOV	AH, 0Ch				; fonction 0Ch
	INT	10h				; interruption 10h (BIOS)
	RET

;  ------------------------------------------------------------
;	FONCTION PERMETTANT DE METTRE L'ECRAN EN MODE GRAPHIQUE
;		-> 320x200x256
;  ------------------------------------------------------------

.MODE_AFF_MODE_GRAPH:
    	MOV	AX, 0013h  			; fonction 00h -> sous-fonction 13h (320x200)
	INT	10h				; interruption 10h (BIOS)
	RET

;  ------------------------------------------------------------
;	FONCTION PERMETTANT DE METTRE L'ECRAN EN MODE TEXTE
;		-> 80x25
;  ------------------------------------------------------------

.MODE_AFF_MODE_TEXT:
    	MOV	AX, 0003h  			; fonction 00h -> sous-fonction 03h (80x25)
	INT	10h				; interruption 10h (BIOS)
	RET

;  ------------------------------------------------------------
;	FONCTION QUI AFFICHE SE QUI SE TROUVE DANS LE REGISTRE
;	DX
;  ------------------------------------------------------------

.AFFICHAGE_MSG:
	MOV	AH, 09h				; fonction 09h (affichage d'une chaine de caractère)
	INT	21h				; interruption 21h (DOS)
	RET

;  ------------------------------------------------------------
;	FONCTION QUI ATTEND UNE TOUCHE
;  ------------------------------------------------------------

.TOUCHE:
	MOV	AH, 01h				; fonction 01h (lecture d'une touche)
	INT	21h        			; interruption 21h (DOS)
	RET

;  ------------------------------------------------------------
;	FONCTION QUI REND LA MAIN AU DOS
;  ------------------------------------------------------------

.QUIT:
	MOV	AX, 4C00h 			; fonction 4Ch (rend la main au DOS)
						; 00h correspond au code 'aucune erreur' et est retourné au programme appelant
	INT	21h				; interruption 21h (DOS)

Conclusion :


Je mettrais à jour au fur et à mesure donc n'hésitez surtout pas à critiquer que j'améliore le tout.
Pas encore en ligne, je verrais si je l'ajoute sur mon site (auquel cas j'ajouterais l'URL dans mon profil bien sûr).

Codes Sources

A voir également

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.