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

Obsah / Utility / TEXTFORM / FloatTrunc

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

Související:

FltToTextBuf   Zformátování desetinného čísla do bufferu
FltToTextBufN   Délka textu formátovaného desetinného čísla
ExpSToTextBuf   Zformátování čísla s exponentem do bufferu, malé "e"
ExpCToTextBuf   Zformátování čísla s exponentem do bufferu, velké "E"
ExpToTextBufN   Délka textu formátovaného čísla s exponentem

FloatTrunc - Odstranění koncových nul

Funkce FloatTrunc je interní funkce používaná funkcemi dekódujícími desetinné číslo na text. Zajistí ořezání nevýznamných koncových nul čísla.


; -----------------------------------------------------------------------------
;                    Internal - Truncate trailing zeros
; -----------------------------------------------------------------------------
; INPUT:	EDX = pointer to last byte of mantissa in BCD form
;			more significant digits are in lower address and bits
; OUTPUT:	ECX = real precision (0 to 19 digits)
; DESTROYS:	AL, EDX
; -----------------------------------------------------------------------------

Na vstupu funkce obsahuje registr EDX ukazatel na poslední bajt mantisy v BCD tvaru (tak, jak ji dekódovala funkce FloatMantBCD). Na výstupu funkce je navrácena v registru ECX skutečná přesnost, tj. skutečný počet desetinných míst pokud se odstraní nevýznamné koncové nuly. Funkce zničí obsah registrů AL a EDX.


; ------------- Prepare digit counter (-> ECX)

FloatTrunc:	xor	ecx,ecx		; ECX <- 0
		mov	cl,20		; ECX <- 20, digit counter

; ------------- Check second digit

FloatTrunc2:	mov	al,[edx]	; AL <- get 2 digits
		test	al,0f0h		; text high digit
		jnz	FloatTrunc4	; digit is not zero
		dec	ecx		; decrease digit counter

; ------------- Check first digit

		test	al,0fh		; text low digit
		jnz	FloatTrunc4	; digit is not zero
		dec	edx		; decrease pointer
		loop	FloatTrunc2	; next digit

; ------------- Without first (integer) digit

		inc	ecx		; number is zero, limit to 0 precision
FloatTrunc4:	dec	ecx		; ECX <- without integer digit
		ret

Funkce bude procházet číslice čísla od konce po jednotlivých číslicích. Maximální možný počet číslic v čísle je 20 (číslo zabírá 10 bajtů, každý bajt má 2 číslice), proto se čítač v registru ECX přednastaví na 20.

V cyklu se testuje nejdříve číslice ve vyšší tetrádě v bajtu - obsah bajtu se načte a testem maskou 0F0h se otestuje zda je nula - není-li, funkce se ukončí s registrem ECX nastaveným na nalezený počet desetinných míst.

Dále se maskou 0Fh testuje číslice v nižší tetrádě bajtu a funkce se opět ukončí při nalezení nenulového čísla. Je-li i druhá číslice nula, ukazatel v bufferu se sníží a pokračuje se dalším průchodem cyklu. Je-li dosaženo konce cyklu, jsou všechny číslice nulové, obsah registru se omezí na 0 jako minimální přesnost pro číslo 0.


Obsah / Utility / TEXTFORM / FloatTrunc