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

Obsah / Utility / TEXT / TextLast, TextPrev

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


TextLast - Posun ukazatele textu na poslední znak textu

Funkce TextLast posune ukazatel v textu na poslední znak textu.


; -----------------------------------------------------------------------------
;                    Shift position to last character
; -----------------------------------------------------------------------------
; INPUT:	EBX = pointer to TEXT
; OUTPUT:	EDX = position of last character (or start of text if CY)
;		CY = text is empty (EDX = start of text)
; -----------------------------------------------------------------------------

TextLast:	mov	edx,TEXTBIGPOS	; EDX <- maximal position

; TextPrev must follow.

Na vstupu funkce obsahuje registr EBX ukazatel na textovou proměnnou, ve které se ukazatel pozice nastavuje. Na výstupu funkce obsahuje registr EDX offset posledního znaku v textu. Pokud je text prázdný (nebo obsahuje pouze detekční bajty), navrátí funkce nastavený příznak chyby CY a registr EDX ukazuje na začátek textu.

Funkce přednastaví obsah registru na velkou hodnotu a pokračuje funkcí TextPrev, která ukazatel posune na poslední znak v textu.

TextPrev - Posun ukazatele textu na předešlý znak textu

Funkce TextPrev posune ukazatel v textu na předešlý znak textu.


; -----------------------------------------------------------------------------
;                    Shift position to previous character
; -----------------------------------------------------------------------------
; INPUT:	EBX = pointer to TEXT
;		EDX = character position (it can be out of range)
; OUTPUT:	EDX = position of previous character (or start of text if CY)
;		CY = no previous character (EDX = start of text)
; -----------------------------------------------------------------------------

Na vstupu funkce obsahuje registr EBX ukazatel na textovou proměnnou, ve které se ukazatel pozice nastavuje. Registr EDX obsahuje vstupní ukazatel pozice (offset v textu), ukazatel může být mimo platný rozsah znaků. Na výstupu funkce obsahuje registr EDX offset předešlého znaku v textu. Pokud není k dispozici žádný předešlý znak, navrátí funkce nastavený příznak chyby CY a registr EDX ukazuje na začátek textu.


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

TextPrev:	push	eax		; push EAX
		push	ecx		; push ECX
		push	esi		; push ESI

; ------------- Get data and length of text

		mov	esi,[ebx]	; ESI <- data buffer
		mov	ecx,[esi+TEXT_Length] ; ECX <- length of text

; ------------- Check character position

		cmp	edx,ecx		; check character position
		ja	TextPrev6	; position is not valid

Do registru ESI se připraví ukazatel na datový buffer textu a do registru ECX délka textu. Porovnáním délky se zadanou výchozí pozicí se ověří, zda zadaná výchozí pozice leží mimo platný rozsah.


; ------------- Check character position

TextPrev2:	or	edx,edx		; check character position
		stc			; CY = invalid position
		jz	TextPrev5	; position is not valid

; ------------- Decrease character position

		dec	edx		; EDX <- decrease character position

; ------------- Check character if it is start of previous character

		mov	al,[esi+TEXT_Text+edx] ; AL <- current byte
		cmp	al,0feh		; detection bytes?
		jae	TextPrev2	; skip detection bytes
		and	al,0c0h		; mask bits
		cmp	al,80h		; is it first byte of character?
		je	TextPrev2	; it is not first byte of character

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

		clc			; clear error flag
TextPrev5:	pop	esi		; pop ESI
		pop	ecx		; pop ECX
		pop	eax		; pop EAX
		ret

Pokud ukazatel pozice v registru EDX dosáhl nulové pozice, funkce se ukončí s chybou. Jinak se ukazatel pozice v registru EDX sníží o 1. Do registru AL se načte bajt textu z dané pozice. Pokud má hodnotu 0FEh nebo 0FFh, jedná se o detekční bajt, který bude přeskočen, funkce pokračuje posunem na předešlou pozici v textu. Jedná-li se o bajt, jehož nejvyšší 2 bity mají hodnotu 80h, jsou to vnitřní datové bajty znaku a funkce také pokračuje posunem na předešlý znak. Jinak byl nalezen začátek předešlého platného znaku a funkce se úspěšně ukončí.


; ------------- Check minimal character position

TextPrev6:	or	edx,edx		; is character position negative?
		jns	TextPrev8	; character position is not negative

; ------------- Character position is before start of text

                xor	edx,edx		; EDX <- shift to first position
		stc			; set error flag
		jmp	short TextPrev5

; ------------- Character position is behind end of text

TextPrev8:	mov	edx,ecx		; EDX <- limit character position
		jmp	short TextPrev2

Pokud byla pozice textu na začátku funkce neplatná, pokračuje se rozlišením, zda ukazatel ukazuje za konec textu nebo před začátek textu. Pokud ukazuje před začátek textu, nastaví se ukazatel na začátek textu a funkce se ukončí s nastaveným příznakem chyby CY. Pokud ukazuje ukazatel textu za konec textu, nastaví se pozice textu na konec textu (tj. délka textu) a funkce pokračuje posunem na předešlou pozici.


Obsah / Utility / TEXT / TextLast, TextPrev