;
; Converts strings to Lower Case
; First parameter = String to Convert to lower case
;
StrLCase:
	push	edi
	push	eax
	mov	edi, [esp+4+2*4]
_lowercaseloop:
	mov	al, [edi]
	cmp	al, 'A'
	jc	@F
	cmp	al, 'Z'
	ja	@F
	or	byte[edi], 20h
@@:
	cmp	byte[edi],0
	lea	edi, [edi+1]
	jnz	_lowercaseloop
	pop	eax
	pop	edi
	retn	4

;
; Converts strings to Upper Case
; First parameter = String to Convert to upper case
;
StrUCase:
	push	edi
	push	eax
	mov	edi, [esp+4+2*4]
_uppercaseloop:
	mov	al, [edi]
	cmp	al, 'a'
	jc	@F
	cmp	al, 'z'
	ja	@F
	and	byte[edi], 20h
@@:
	cmp	byte[edi], 0
	lea	edi, [edi+1]
	jnz	_uppercaseloop
	pop	eax
	pop	edi
	retn	4

;
; String copy mmx version for long strings does by copying qword at a time
; First parameter = String destination
; Second parameter = String source
;
StrCopyMMX:
	push	ebx
	push	eax
	push	ecx
	push	edx
	xor	eax, eax
	pxor	mm7, mm7
	mov	edx, [esp+4+4*4]
	mov	ebx, [esp+8+4*4]
MMX_loop:
	movq	mm0, [ebx]
	mvoq	mm1, mm0
	pcmpeqb	MM0, MM7
        packsswb MM0, MM0
        movd	eax, MM0
        test	eax, eax
        jnz 	normal_copy
        movq	[edx+ecx], MM1
        add	ecx, 8
        jmp	MMX_loop
normal_copy:
        mov	al, [ebx+ecx]
        mov	[edx+ecx], al
        inc	ecx
        test	al, al
        jnz	normal_copy
	pop	edx
	pop	ecx
	pop	eax
	pop	ebx
	retn	8