	TITLE	DosUtil
	PAGE	,132

CODE	SEGMENT	BYTE	PUBLIC
	ASSUME	CS:CODE
	PUBLIC	UpCase,LoCase,UpperStr,LowerStr,UCTAB,LCTAB
;	
; function UpCase(Ch : char) : char;		
;   returns the corresponding uppercase character to the character
;   specified as input parameter	
;
; function LoCase(Ch : char) : char;		
;   returns the corresponding lowercase character to the character
;   specified as input parameter	
;
; function UpperStr(Str : string) : string
;   converts the string specified as input parameter to a string
;   only containing Upper Case characters, where all lower case
;   characters from the input string are converted to their cor-
;   responding upper case equivalents
;
; function LowerStr(Str : string) : string
;   converts the string specified as input parameter to a string
;   only containing Lower Case characters, where all upper case
;   characters from the input string are converted to their cor-
;   responding lower case equivalents
;
	PUBLIC	CompStr,COLTAB


UCTAB:	DB	000H,001H,002H,003H,004H,005H,006H,007H
	DB	008H,009H,00AH,00BH,00CH,00DH,00EH,00FH
	DB	010H,011H,012H,013H,014H,015H,016H,017H
	DB	018H,019H,01AH,01BH,01CH,01DH,01EH,01FH
	DB	020H,021H,022H,023H,024H,025H,026H,027H
	DB	028H,029H,02AH,02BH,02CH,02DH,02EH,02FH
	DB	030H,031H,032H,033H,034H,035H,036H,037H
	DB	038H,039H,03AH,03BH,03CH,03DH,03EH,03FH
	DB	040H,041H,042H,043H,044H,045H,046H,047H
	DB	048H,049H,04AH,04BH,04CH,04DH,04EH,04FH
	DB	050H,051H,052H,053H,054H,055H,056H,057H
	DB	058H,059H,05AH,05BH,05CH,05DH,05EH,05FH
	DB	060H,041H,042H,043H,044H,045H,046H,047H
	DB	048H,049H,04AH,04BH,04CH,04DH,04EH,04FH
	DB	050H,051H,052H,053H,054H,055H,056H,057H
	DB	058H,059H,05AH,07BH,07CH,07DH,07EH,07FH
	DB	080H,09AH,045H,041H,08EH,041H,08FH,080H
	DB	045H,045H,045H,049H,049H,049H,08EH,08FH
	DB	090H,092H,092H,04FH,099H,04FH,055H,055H
	DB	059H,099H,09AH,09DH,09CH,09DH,09EH,09EH
	DB	0A0H,0A1H,0A2H,0A3H,0A4H,0A5H,0A7H,0A7H
	DB	0A8H,0AAH,0AAH,0ABH,0ACH,0ADH,0AEH,0AFH
	DB	0B0H,0B1H,0B2H,0B3H,0B4H,0B5H,0B6H,0B7H
	DB	0B8H,0B9H,0BAH,0BBH,0BCH,0BDH,0BEH,0BFH
	DB	0C0H,0C1H,0C2H,0C3H,0C4H,0C5H,0C6H,0C7H
	DB	0C8H,0C9H,0CAH,0CBH,0CCH,0CDH,0CEH,0CFH
	DB	0D0H,0D1H,0D2H,0D3H,0D4H,0D5H,0D6H,0D7H
	DB	0D8H,0D9H,0DAH,0DBH,0DCH,0DDH,0DEH,0DFH
	DB	0E0H,0E1H,0E2H,0E3H,0E4H,0E5H,0E6H,0E7H
	DB	0E8H,0E9H,0EAH,0EBH,0ECH,0EDH,0EEH,0EFH
	DB	0F0H,0F1H,0F2H,0F3H,0F4H,0F5H,0F6H,0F7H
	DB	0F8H,0F9H,0FAH,0FBH,0FCH,0FDH,0FEH,0FFH

LCTAB:	DB	000H,001H,002H,003H,004H,005H,006H,007H
	DB	008H,009H,00AH,00BH,00CH,00DH,00EH,00FH
	DB	010H,011H,012H,013H,014H,015H,016H,017H
	DB	018H,019H,01AH,01BH,01CH,01DH,01EH,01FH
	DB	020H,021H,022H,023H,024H,025H,026H,027H
	DB	028H,029H,02AH,02BH,02CH,02DH,02EH,02FH
	DB	030H,031H,032H,033H,034H,035H,036H,037H
	DB	038H,039H,03AH,03BH,03CH,03DH,03EH,03FH
	DB	040H,061H,062H,063H,064H,065H,066H,067H
	DB	068H,069H,06AH,06BH,06CH,06DH,06EH,06FH
	DB	070H,071H,072H,073H,074H,075H,076H,077H
	DB	078H,079H,07AH,05BH,05CH,05DH,05EH,05FH
	DB	060H,061H,062H,063H,064H,065H,066H,067H
	DB	068H,069H,06AH,06BH,06CH,06DH,06EH,06FH
	DB	070H,071H,072H,073H,074H,075H,076H,077H
	DB	078H,079H,07AH,07BH,07CH,07DH,07EH,07FH
	DB	087H,081H,082H,083H,084H,085H,086H,087H
	DB	088H,089H,08AH,08BH,08CH,08DH,084H,086H
	DB	090H,091H,091H,093H,094H,095H,096H,097H
	DB	098H,094H,081H,09BH,09CH,09BH,09FH,09FH
	DB	0A0H,0A1H,0A2H,0A3H,0A4H,0A5H,0A6H,0A6H
	DB	0A8H,0A9H,0A9H,0ABH,0ACH,0ADH,0AEH,0AFH
	DB	0B0H,0B1H,0B2H,0B3H,0B4H,0B5H,0B6H,0B7H
	DB	0B8H,0B9H,0BAH,0BBH,0BCH,0BDH,0BEH,0BFH
	DB	0C0H,0C1H,0C2H,0C3H,0C4H,0C5H,0C6H,0C7H
	DB	0C8H,0C9H,0CAH,0CBH,0CCH,0CDH,0CEH,0CFH
	DB	0D0H,0D1H,0D2H,0D3H,0D4H,0D5H,0D6H,0D7H
	DB	0D8H,0D9H,0DAH,0DBH,0DCH,0DDH,0DEH,0DFH
	DB	0E0H,0E1H,0E2H,0E3H,0E4H,0E5H,0E6H,0E7H
	DB	0E8H,0E9H,0EAH,0EBH,0ECH,0EDH,0EEH,0EFH
	DB	0F0H,0F1H,0F2H,0F3H,0F4H,0F5H,0F6H,0F7H
	DB	0F8H,0F9H,0FAH,0FBH,0FCH,0FDH,0FEH,0FFH

UpperRes	EQU	DWORD PTR [BP+10]
UpperInp	EQU	DWORD PTR [BP+6]

UpperStr	PROC	FAR
		PUSH	BP
		MOV	BP,SP
		PUSH	DS
		LDS	SI,UpperInp
		LES	DI,UpperRes
		CLD
		LODSB
		STOSB
		MOV	CL,AL
		XOR	CH,CH
		MOV	BX,OFFSET UCTAB
		JCXZ	U2
U1:		LODSB
		XLAT	CS:[BX]
		STOSB
		LOOP	U1
U2:		POP	DS
		POP	BP
		RET	4
UpperStr	ENDP

LowerRes	EQU	DWORD PTR [BP+10]
LowerInp	EQU	DWORD PTR [BP+6]

LowerStr	PROC	FAR
		PUSH	BP
		MOV	BP,SP
		PUSH	DS
		LDS	SI,LowerInp
		LES	DI,LowerRes
		CLD
		LODSB
		STOSB
		MOV	CL,AL
		XOR	CH,CH
		MOV	BX,OFFSET LCTAB
		JCXZ	L2
L1:		LODSB
		XLAT	CS:[BX]
		STOSB
		LOOP	L1
L2:		POP	DS
		POP	BP
		RET	4
LowerStr	ENDP

UpChar		EQU	BYTE PTR [BP+6]

UpCase		PROC	FAR
		PUSH	BP
		MOV	BP,SP
		MOV	AL,UpChar
		MOV	BX,OFFSET UCTAB
		XLAT	CS:[BX]
		POP	BP
		RET	2
UpCase		ENDP

LoChar		EQU	BYTE PTR [BP+6]

LoCase		PROC	FAR
		PUSH	BP
		MOV	BP,SP
		MOV	AL,LoChar
		MOV	BX,OFFSET LCTAB
		XLAT	CS:[BX]
		POP	BP
		RET	2
LoCase		ENDP


COLTAB:	DB	000H,001H,002H,003H,004H,005H,006H,007H
	DB	008H,009H,00AH,00BH,00CH,00DH,00EH,00FH
	DB	010H,011H,012H,013H,014H,015H,016H,017H
	DB	018H,019H,01AH,01BH,01CH,01DH,01EH,01FH
	DB	020H,021H,022H,023H,024H,025H,026H,027H
	DB	028H,029H,02AH,02BH,02CH,02DH,02EH,02FH
	DB	030H,031H,032H,033H,034H,035H,036H,037H
	DB	038H,039H,03AH,03BH,03CH,03DH,03EH,03FH
	DB	040H,041H,042H,043H,044H,045H,046H,047H
	DB	048H,049H,04AH,04BH,04CH,04DH,04EH,04FH
	DB	050H,051H,052H,053H,054H,055H,056H,057H
	DB	058H,059H,05AH,028H,02FH,029H,05EH,05FH
	DB	060H,041H,042H,043H,044H,045H,046H,047H
	DB	048H,049H,04AH,04BH,04CH,04DH,04EH,04FH
	DB	050H,051H,052H,053H,054H,055H,056H,057H
	DB	058H,059H,05AH,028H,02FH,029H,07EH,07FH
	DB	043H,059H,045H,041H,05BH,041H,05DH,043H
	DB	045H,045H,045H,049H,049H,049H,05BH,05DH
	DB	045H,05BH,05BH,04FH,05CH,04FH,055H,055H
	DB	059H,05CH,059H,05CH,024H,05CH,024H,024H
	DB	041H,049H,04FH,055H,04EH,04EH,041H,04FH
	DB	03FH,0A9H,0AAH,0ABH,0ACH,021H,022H,024H
	DB	0B0H,0B1H,0B2H,0B3H,0B4H,0B5H,0B6H,0B7H
	DB	0B8H,0B9H,0BAH,0BBH,0BCH,0BDH,0BEH,0BFH
	DB	0C0H,0C1H,0C2H,0C3H,0C4H,0C5H,0C6H,0C7H
	DB	0C8H,0C9H,0CAH,0CBH,0CCH,0CDH,0CEH,0CFH
	DB	0D0H,0D1H,0D2H,0D3H,0D4H,0D5H,0D6H,0D7H
	DB	0D8H,0D9H,0DAH,0DBH,0DCH,0DDH,0DEH,0DFH
	DB	0E0H,053H,0E2H,0E3H,0E4H,0E5H,0E6H,0E7H
	DB	0E8H,0E9H,0EAH,0EBH,0ECH,0EDH,0EEH,0EFH
	DB	0F0H,0F1H,0F2H,0F3H,0F4H,0F5H,0F6H,0F7H
	DB	0F8H,0F9H,0FAH,0FBH,0FCH,0FDH,0FEH,0FFH

KeyLng		EQU	BYTE PTR [BP+6]
KeyPos		EQU	BYTE PTR [BP+8]
CompStr2	EQU	DWORD PTR [BP+10]
CompStr1	EQU	DWORD PTR [BP+14]
	
CompStr		PROC	FAR	
		PUSH	BP
		MOV	BP,SP
		PUSH	DS
		XOR	BX,BX
		XOR	CX,CX
		XOR	DX,DX
		CLD			; string ops forward
		LDS	SI,CompStr1
		LES	DI,CompStr2
		MOV	BL,KeyPos
		DEC	BL
		JGE	LCSTR1
		INC	BL
LCSTR1:		MOV	BH,KeyLng
		LODSB	
		MOV	AH,ES:[DI]
		INC	DI
		CMP	BL,AL
		JBE	LCSTR2
		CMP	BL,AH
		JA	LCSTR6
		DEC	DL
		JMP	LCSTR6
LCSTR2:		CMP	BL,AH
		JBE	LCSTR3
		INC	DL
		JMP	LCSTR6
LCSTR3:		SUB	CL,BL
		CMP	AL,AH
		JBE	LCSTR4
		ADD	CL,AH
		JMP	LCSTR5
LCSTR4:		ADD	CL,AL						
LCSTR5:		MOV	DL,AL
		SUB	DL,AH
		CMP	BH,CL
		JA	LCSTR6
		MOV	CL,BH
		XOR	DX,DX
LCSTR6:		CMP	CL,0
		JE	OneEmpty
		XOR	BH,BH
		ADD	SI,BX
		ADD	DI,BX
		MOV	BX,OFFSET COLTAB
LoopEnt:	LODSB
		XLAT	CS:[BX]
		MOV	AH,AL
		MOV	AL,ES:[DI]
		INC	DI
		XLAT	CS:[BX]
		CMP	AH,AL
		LOOPE	LoopEnt
		JA	Larger
		JB	Less
OneEmpty:	MOV	AL,1
		CMP	DL,0
		JE	Finish
		JG	Larger
Less:		MOV	AL,0
		JMP	Finish
Larger:		MOV	AL,2
		JMP	Finish
Finish:		POP	DS
		POP	BP
		RET	12								
CompStr		ENDP

CODE		ENDS

		END


