; ---------------------------------------------------------------------------
; S t r i n g   c o n v e r t e r   s u b r o u t i n e s
;
; Рабочие функции для String Converter-ов (StrConv.asm, StrConvR.asm)
;
; L2Upper - Конвертит строку в верхний регистр
; U2Lower - Конвертит строку в нижний  регистр
; 
; В момент вызова должны быть заданы исходные параметры:
; ds:[si]	- Строка-источник
; es:[di]	- Строка-приемник
; cx 		- Счетчик
;
; Любые не буквенные (lat/cyr by 866CP) символы остаются без изменений
;
; (с) WhiteUnicorn, 01.02.2000, Freeware, WhiteUnicorn@mail.ru
; ---------------------------------------------------------------------------

codeseg	segment para 'Code'
assume	cs:codeseg

; ---------------------------------------------------------------------------
; S u b r o u t i n e
; Конвертим строку в верхний регистр (ds:[si] -> es:[di], cx - счетчик)
; ---------------------------------------------------------------------------

L2Upper proc far
	Public L2Upper

	cld

 L2U_MakeszLine:
	xor	ax,ax
	lodsb

	cmp	al,061h	; до Z (не буква вообще или ужЕ заглавная)
	jb	L2U_Next
	cmp	al,0efh	; после я (не буква вообще)
	ja	L2U_Next
	cmp	al,07ah	; a...z
	ja	L2U_Above_az
	sub	al,020h
	jmp	L2U_Next
 L2U_Above_az:
	cmp	al,0a0h	; a cyr
	jb	L2U_Next
	cmp	al,0afh	; п cyr
	ja	L2U_LastReg
	sub	al,020h
	jmp	L2U_Next
 L2U_LastReg:
	cmp	al,0e0h	; р cyr
	jb	L2U_Next
	sub	al,050h
 L2U_Next:
	stosb
	loop	L2U_MakeszLine

;	mov	al,'$'
;	stosb
	
	ret

L2Upper	endp

; ---------------------------------------------------------------------------
; S u b r o u t i n e
; Конвертим строку в нижний регистр (ds:[si] -> es:[di], cx - счетчик)
; ---------------------------------------------------------------------------

U2Lower	proc far
	Public U2Lower

	cld

 U2L_MakeszLine:
	xor	ax,ax
	lodsb
	
	cmp	al,041h	; A lat
	jb	U2L_Next
	cmp	al,05ah	; Z lat
	ja	U2L_NonAZ
	add	al,020h
	jmp	U2L_Next
 U2L_NonAZ:
	cmp	al,080h	; A cyr
	jb	U2L_Next
	cmp	al,09fh	; Я cyr
	ja	U2L_Next
	cmp	al,08fh	; П cyr
	ja	U2L_AbovePCyr
	add	al,020h
	jmp	U2L_Next
 U2L_AbovePCyr:
	add	al,050h
 U2L_Next:
	stosb
	loop	U2L_MakeszLine

;	mov	al,'$'
;	stosb
	
	ret

U2Lower	endp
Codeseg  ENDS
END
