Tvůrce webu je i pro tebe! Postav třeba web. Bez grafika. Bez kodéra. Hned.
wz

Obsah / Utility / TEXT / TextAdd2Dig

Zdrojový kód: INCLUDE\UTIL\TEXT.INC, UTIL\TEXT.ASM


TextAdd2Dig - Přidání dvou číslic na konec textového řetězce

Funkce TextAdd2Dig přidá dvě číslice (00 až 99) na konec textového řetězce.


; -----------------------------------------------------------------------------
;                   Add two digit characters to end of text
; -----------------------------------------------------------------------------
; INPUT:	AL = number (it must be in range 0 to 99)
;		EBX = pointer to TEXT variable
; OUTPUT:	CY = memory error or invalid number (text not changed)
; -----------------------------------------------------------------------------

Na vstupu funkce obsahuje registr AL hodnotu přidávaných dvou číslic v rozsahu 0 až 99. Platnost rozsahu číslic je kontrolována. Registr EBX obsahuje ukazatel na textovou proměnnou, ke které se mají číslice přidat. V případě chyby paměti nebo v případě hodnoty čísla ležící mimo rozsah 0 až 99 je navrácen chybový příznak CY a obsah textové proměnné se nezmění.


; ------------- Push registers

TextAdd2Dig:	push	eax		; push EAX
		push	ecx		; push ECX

; ------------- Check valid range of number

		cmp	al,100		; check valid range
		cmc			; CY = error
		jc	TextAdd2Dig2	; error, invalid number

Na začátku funkce je provedena kontrola platnosti čísla v registru AL. Pokud leží mimo povolený rozsah 0 až 99, funkce se ukončí s chybou a text zůstane nezměněn.


; ------------- Prepare digit characters (-> CX)

		aam			; AH <- first digit, AL <- second digit
		add	ax,'00'		; AX <- digit characters
		xchg	eax,ecx		; CX <- digit characters

Číslo se převede na dvě číslice pomocí instrukce AAM. Přičtením korekce '00' se převede na ASCII znaky a uloží se do registru ECX.


; ------------- Copy text on write

		call	TextCopyWrite	; copy text on write
		jc	TextAdd2Dig2	; memory error

Pomocí funkce TextCopyWrite se provede kopie textu před zápisem. Pokud nastane chyba paměti, funkce se ukončí s chybou a text zůstane nezměněn.


; ------------- Resize data buffer

		mov	eax,[ebx]	; EAX <- data buffer
		mov	eax,[eax+TEXT_Length] ; EAX <- length of data buffer
		inc	eax		; EAX <- length + 1
		inc	eax		; EAX <- new size of data buffer
		call	TextResize	; resize data buffer
		jc	TextAdd2Dig2	; memory error

Voláním funkce TextResize se nastaví nová velikost datového bufferu, tj. stará velikost zvýšená o 2 bajty. Pokud nastane chyba paměti, funkce se ukončí s chybou a text zůstane nezměněn.


; ------------- Store characters (it exits with NC)

		add	eax,[ebx]	; EAX <- end of data buffer
		mov	[eax+TEXT_Text-2],cx ; store characters into buffer

; ------------- Pop registers

TextAdd2Dig2:	pop	ecx		; pop ECX
		pop	eax		; pop EAX
		ret

Číslice z registrů CH a CL se uloží do datového bufferu za konec starého textu a funkce se úspěšně ukončí.


Obsah / Utility / TEXT / TextAdd2Dig