Metropoli BBS
VIEWER: lst11-4.asm MODE: TEXT (ASCII)
;
; *** Listing 11-4 ***
;
; Converts all characters in a string to uppercase,
; using a loop containing non-string instructions
; and using only one pointer.
;
	jmp	Skip
;
SourceString	label	word
	db	'This space intentionally left not blank',0
;
; Converts a string to uppercase.
;
; Input:
;	DS:SI = start of string
;
; Output:
;	none
;
; Registers altered: AL, BX, SI
;
; Note: Does not handle strings that are longer than 64K
;	bytes or cross segment boundaries.
;
StringToUpper:
	mov	bl,'a'	;set up for fast register-register
	mov	bh,'z'	; comparisons
StringToUpperLoop:
	mov	al,[si]	;get the next character
	cmp	al,bl	;below 'a'?
	jb	IsUpper	;yes, not lowercase
	cmp	al,bh	;above 'z'?
	ja	IsUpper	;yes, not lowercase
	and	al,not 20h ;is lowercase-make uppercase
IsUpper:
	mov	[si],al	;put the uppercase character back
	inc	si	; into the string and point to the
			; following character
	and	al,al	;is this the zero that marks the
			; end of the string?
	jnz	StringToUpperLoop ;no, do the next character
	ret
;
Skip:
	call	ZTimerOn
	mov	si,offset SourceString	;point to the string
					; to convert
	call	StringToUpper		;convert it to
					; uppercase
	call	ZTimerOff

[ RETURN TO DIRECTORY ]