
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; nettoyageEcran													;;
;;------------------------------------------------------------------;;
;; Colorie tout l'écran avec la couleur stockée dans couleurDefaut.	;;
;; ES doit contenir le descripteur de segment de l'écran.			;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
nettoyageEcran:
	push edi
	push eax
	push ecx
	
	xor eax, eax
	xor ecx, ecx
	xor edi, edi
	mov cx, [YResolution]
	mov ax, [XResolution]
	mul ecx	; Nombre de points total
	mov ecx, eax
	mov eax, [couleurDefaut]
	rep stosd

	pop ecx
	pop eax
	pop edi
	ret
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; Fin nettoyageEcran												;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; metPixel															;;
;;------------------------------------------------------------------;;
;; Colorie le pixel dont la position est dans EAX (mot haut : X,	;;
;; mot bas : Y) avec la couleur contenue dans couleurPoint			;;
;; ES doit contenir le descripteur de segment de l'écran.			;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
metPixel:
	push edi
	push ecx
	push eax
	push ebx
	push edx
	
	mov ebx, eax
	and eax, 0xFFFF
	shr ebx, 16
	xor ecx, ecx
	mov cx, [XResolution]
	mul ecx					; On fait une multiplication 32 bits à partir de valeurs de 16 bits.
	add eax, ebx
	shl eax, 2
	mov edi, eax
	mov eax, [couleurPoint]
	stosd

.retour:
	pop edx
	pop ebx
	pop eax
	pop ecx
	pop edi
	ret
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; Fin metPixel														;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; afficheLigne														;;
;;------------------------------------------------------------------;;
;; Dessine un segment de droite entre le point stocké dans EAX et 	;;
;; celui stocké dans EBX (mot haut : X,	mot bas : Y) avec la 		;;
;; couleur contenue dans couleurPoint								;;
;; ES doit contenir le descripteur de segment de l'écran.			;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
Y2: dd 0
afficheLigne:
	push esi
	push eax
	push ebx
	push ecx
	push edx
	push edi

	cmp 	eax, ebx	;On travaille dans le sens de abscisses positives
	jbe .ordreOK
	xchg 	eax, ebx	;On inverse si ce n'est pas le cas
.ordreOK:
	mov 	[Y2], ebx	;On stocke le point d'arrivée
	sub 	ebx, eax	;On calcule les longueur à parcourir en X et Y
	mov 	cx, bx		;deltaY
	shr 	ebx, 16		;deltaX
	or 		bx, bx		;Si deltaX est nul, on sera sur une ligne verticale
	jz .ligneVerticale
	or		cx, cx		;Si deltaY est nul, on sera sur une ligne horizontale
	jnz .test_deltaY
	mov 	cx, bx		;CX contient le nombre de pixels à afficher
	mov 	ebx, 0x10000;Incrément de 1 pixel vers la droite
	jmp .avance_H_V
.ligneVerticale:
	mov 	ebx, 0x00001;Incrément de 1 pixel vers le bas
.avance_H_V:
	call metPixel		;Affichage du pixel
	add eax, ebx		;Incrément
	loop .avance_H_V
.fin_afficheLigne:
	call metPixel		;Affichage du dernier pixel
	pop edi
	pop edx
	pop ecx
	pop ebx
	pop eax
	pop esi
	ret

.test_deltaY:
	push 0x10000		;Incrément de 1 pixel vers la droite
	push 1				;Incrément de 1 pixel vers le bas
	jns .suite			;Si deltaY est positif, on est standard
	neg cx				;Sinon, on l'oppose, ainsi que l'incrément en Y
	neg dword[esp]
.suite:
	cmp bx, cx			;Si deltaY>deltaX
	jae .principal
	xchg bx, cx			;On échange deltaY et deltaX
	mov edx, [esp + 4]	;Ainsi que les incréments
	xchg edx, [esp]
	mov [esp + 4], edx
.principal:				;Et on continue normalement
	mov dx, bx			;DX contient l'écart
.boucle:
	call metPixel
	sub dx, cx			;On enlève deltaY
	cmp dx, cx			;Si on est inférieur ou égal à deltaY
	ja .affichage
	add eax, [esp]		;On applique l'incrément en Y
	add dx, bx			;On ajoute deltaX à l'écart
.affichage:
	add eax, [esp + 4]	;On applique l'incrément en X
	cmp eax, [Y2]		;Sommes-nous arrivés ?
	jb .boucle
	pop edx				;On s'en va proprement
	pop edx
	jmp .fin_afficheLigne
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; Fin afficheLigne													;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; afficheCaractere													;;
;;------------------------------------------------------------------;;
;; Dessine un caractère au point stocké dans EAX (mot haut : X,		;;
;; mot bas : Y) avec la couleur contenue dans couleurPoint.			;;
;; ES doit contenir le descripteur de segment de l'écran.			;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
afficheCaractere:
	push es
	push edx
	push esi
	push edi
	push eax
	push ebx
	push ecx

	mov ecx, 7			;7 lignes par caractère
	mul ecx
	mov esi, Alphabet	; adresse de la lettre
	add esi, eax		; si contient l'adresse de la lettre

	mov eax, [curseur]
	mov bx, 8*3			;En route pour le 2ème segment
	mov es, bx
	mov ebx, eax		;EBX stocke le pixel courant
	and eax, 0xFFFF
	shr ebx, 16
	mov cx, [XResolution]
	mul ecx				; On fait une multiplication 32 bits à partir de valeurs de 16 bits.
	add eax, ebx
	shl eax, 2
	mov edi, eax
	mov ecx, 7

.colonne:
	push ecx
	mov dl, 0b10000000
	mov ecx, 8; On affiche 8 colonnes
	lodsb
	mov bl, al
.ligne:
	test bl, dl
	jnz .point
	mov eax, [couleurDefaut]
	jz .suite
.point:
	mov eax, [couleurPoint]
.suite:
	stosd
	shr dl, 1
	loop .ligne
	pop ecx
	xor eax, eax
	mov ax, [XResolution]
	shl eax, 2
	add edi, eax
	sub edi, 32
	loop .colonne
	add dword [curseur], 0x80000

	pop ecx
	pop ebx
	pop eax
	pop edi
	pop esi
	pop edx
	pop es
	ret
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; Fin afficheCaractere												;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
