;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; Synopsis: Affiche une chaîne de caractères se terminant par NULL	;;
; Entree:   SI -> pointe sur la chaîne à afficher					;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
afficheChaine:
	push	eax
	xor		eax, eax
.caractereSuivant:
	lodsb			; ds:esi -> al
	or		al, al	; fin chaine ?
	jz		.fin
	cmp		al, 112
	jne 	.ligneOK
	add		dword [curseur], 8
	mov		dword [curseur + 2], 0
	jmp		.caractereSuivant
.ligneOK:
	call afficheCaractere
	jmp 	.caractereSuivant
.fin:
	pop 	eax
	ret

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; nombreVersChaine													;;
;;------------------------------------------------------------------;;
;; Ecrit dans la chaîne pointée par EDI le nombre contenu dans EAX	;;
;; si CL est à un, on écrit un caractère terminal					;;
;; CH contient le nombre minimal de caractères à utiliser			;;
;; EBX contient la base												;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
nombreVersChaine:
	push 	edx
	push 	ecx
	xor		cl, cl
.stocke_digit:
	xor 	edx, edx
	div 	ebx
	push 	edx 			; Sauve le reste dans la pile
	inc 	cl
	or 		eax, eax		; Si le quotient n'est pas nul
	jne 	.stocke_digit	; on recommence
;Les digits sont stockés dans la pile
.ajout_zero:
	cmp 	ch, cl
	jbe		.clearCH
	push 	0				; Identifiant du caractère de remplissage moins 1
	inc 	cl
	jmp 	.ajout_zero
.clearCH:
	xor 	ch, ch
;Affichage du chiffre : On en affiche au moins un : zéro
.affiche_digit:
	pop 	eax
	add 	al, 1
	stosb 					; met AL dans l'octet pointé par EDI et incrémente EDI
	loop 	.affiche_digit
	pop 	ecx 			; on récupère le paramètre cx
	test 	cl, 0b1 		; s'il est à 1, on écrit un caractère terminal
	jz 		.depile
	mov 	byte [edi], 0
.depile:
	pop 	edx
ret

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;	Fin nombreVersChaine											;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; litChaine														;;
;;------------------------------------------------------------------;;
;; Ecrit dans la chaîne pointée par EDI les caractères écrits au 	;;
;; clavier, jusqu'à un retour chariot. 								;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
litChaine:
	push 	eax
	push 	ebx

	mov 	byte [derniereTouche], 0
.attend_clavier:
	xor 	eax, eax
	cmp 	byte [derniereTouche], 0
	jz .attend_clavier
	mov 	al, [derniereTouche]
	mov 	byte [derniereTouche], 0

	mov 	ebx, traductionASCII
	add 	ebx, eax
	mov 	al, [ebx]

	cmp 	al, 110			;Traitement de l'espace arrière
	jne .testTab
	dec 	edi
	mov al, 51
	call afficheCaractere
	sub	dword [curseur], 0x100000
	jmp .attend_clavier

.testTab:
	cmp 	al, 111			;Traitement de la tabulation avant
	jne .testEntree
	dec		edi
	mov 	eax, (51<<24)+(51<<16)+(51<<8)+51
	stosd
	add		word [curseur+2], 3

.testEntree:
	cmp 	al, 112
	je .fin_attend_clavier

	test byte[touchesActives + 5], 0b100 ;On teste le shift gauche enfoncé
	jnz .shift
	test byte[touchesActives + 6], 0b1000000 ;On teste le shift droit enfoncé
	jz .RAS
.shift:
	cmp al, 114			;On ne stocke pas un Shift gauche comme touche
	je .attend_clavier
	cmp al, 115			;On ne stocke pas un Shift droit comme touche
	je .attend_clavier

	add al, 73
.RAS:
	stosb

	call afficheCaractere

	jmp .attend_clavier
.fin_attend_clavier:
	stosb				;Stocke le saut de ligne
	xor 	al, al		;Stocke une fin de chaîne
	stosb
	mov al, 51			;Supprime le curseur à la fin de la ligne
	call afficheCaractere
	add		word [curseur], 7
	mov		word [curseur+2], 0
	dec 	edi

    pop 	ebx
    pop 	eax
    ret
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; Fin litChaine													;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

