Metropoli BBS
VIEWER: lst14-6.asm MODE: TEXT (ASCII)
;
; *** Listing 14-6 ***
;
; Searches for the first appearance of a character, in any
; case, in a byte-sized array by using JZ and LOOP.
;
	jmp	Skip
;
ByteArray	label	byte
	db	'Array Containing Both Upper and Lowercase'
	db	' Characters And Blanks'
ARRAY_LENGTH	equ	($-ByteArray)
;
; Finds the first occurrence of the specified character, in
; any case, in the specified byte-sized array.
;
; Input:
;	AL = character for which to perform a
;		case-insensitive search
;	CX = array length (0 means 64K long)
;	DS:SI = array to search
;
; Output:
;	SI = pointer to first case-insensitive match, or 0
;		if no match is found
;
; Registers altered: AX, CX, SI
;
; Direction flag cleared
;
; Note: Does not handle arrays that are longer than 64K
;	bytes or cross segment boundaries.
;
; Note: Do not pass an array that starts at offset 0 (SI=0),
;	since a match on the first byte and failure to find
;	the byte would be indistinguishable.
;
CaseInsensitiveSearch:
	cld
	cmp	al,'a'
	jb	CaseInsensitiveSearchBegin
	cmp	al,'z'
	ja	CaseInsensitiveSearchBegin
	and	al,not 20h	;make sure the search byte
				; is uppercase
CaseInsensitiveSearchBegin:
	mov	 ah,al		;put the search byte in AH
				; so we can use AL to hold
				; the bytes we're checking
CaseInsensitiveSearchLoop:
	lodsb			;get the next byte from the
				; array being searched
	cmp	al,'a'
	jb	CaseInsensitiveSearchIsUpper
	cmp	al,'z'
	ja	CaseInsensitiveSearchIsUpper
	and	al,not 20h	;make sure the array byte is
				; uppercase
CaseInsensitiveSearchIsUpper:
	cmp	al,ah		;do we have a
				; case-insensitive match?
	jz	CaseInsensitiveSearchMatchFound	;yes
	loop	CaseInsensitiveSearchLoop
				;check the next byte, if any
	sub	si,si		;no match found
	ret
CaseInsensitiveSearchMatchFound:
	dec	si		;point back to the matching
				; array byte
	ret
;
Skip:
	call	ZTimerOn
	mov	al,'K'		;character to search for
	mov	si,offset ByteArray ;array to search
	mov	cx,ARRAY_LENGTH	;# of bytes to search
				; through
	call	CaseInsensitiveSearch
				;perform a case-insensitive
				; search for 'K'
	call	ZTimerOff

[ RETURN TO DIRECTORY ]