; AUTHOR:- STEPHEN MENDES                                   FILE "CIPHER.ASM"
;
;      void encrypt (char *, int)
;      void decrypt (char *, int)
;
;      PARAMETERS:- FILE BUFFER, FILE SIZE.
;
; ENCRYPT AND DECRYPT ARE COMPLEMENTARY FUNCTIONS

		.MODEL SMALL
		.CODE
		PUBLIC	_encrypt, _decrypt
_encrypt	PROC	NEAR
		PUSH	BP
		MOV	BP,SP		;SET UP STACK FRAME
		MOV	DH,11		;'COUNT' GOES FROM 11 TO 1
		MOV	DL,32		;INITIAL STATE OF 'REG'

; VALUE IN 'REG' IS ADDED TO DATA BYTE, THEN ROTATED 'COUNT' NUMBER OF
; BITS BEFORE IT IS ADDED TO THE NEXT DATA BYTE

		MOV	BX,[BP+4]	;FIL_BUF
		MOV	CX,[BP+6]	;FIL_SIZE

	EN10:	PUSH	CX
		MOV	CL,DH		;NUMBER OF BITS TO ROTATE = 'COUNT'
		CMP	CL,0		;MUST BE IN CL
		JNZ	EN20		;IF ZERO THEN SET IT
		MOV	CL,11		;TO 11
	EN20:	ADD	[BX],DL		;ADD 'REG' TO DATA BYTE
		INC	BX		;BUMP DATA POINTER

; ROTATE VALUE IN 'REG', 'COUNT' NUMBER OF TIMES
 
		ROL	DL,CL
		DEC	CL		;DECREMENT 'COUNT'
		MOV	DH,CL		;SAVE IT IN DH UNTIL NEXT TIME
		POP	CX		;NUMBER OF BYTES STILL TO PROCESS
		LOOP	EN10
		POP	BP
		RET
_encrypt	ENDP

_decrypt	PROC	NEAR
		PUSH	BP
		MOV	BP,SP
		MOV	DH,11		; MUST START WITH SAME VALUES IN
		MOV	DL,32		; ORDER TO DECRYPT

		MOV	BX,[BP+4]	;FIL_BUF
		MOV	CX,[BP+6]	;FIL_SIZE

	DE10:	PUSH	CX
		MOV	CL,DH		;SEE IF 'COUNT' IS ZERO AND
		CMP	CL,0		;IF SO, SET IT TO 11 (SAME AS ABOVE)
		JNZ	DE20
		MOV	CL,11
	DE20:	SUB	[BX],DL		;SUBTRACT TO RESTORE ORIGINAL DATA
		INC	BX

		ROL	DL,CL		;ROTATE 'REG' FOR 'COUNT' NUMBER
		DEC	CL		;OF BITS, DECREMENT 'COUNT', AND
		MOV	DH,CL		;STORE IN DH (SAME AS ABOVE)
		POP	CX
		LOOP	DE10
		POP	BP
		RET
_decrypt	ENDP
		END
