;**************************************
;
;   ENCODE - file encryption utility
;
;**************************************
;1.0 16-May-84 DFP written by D. Pallmann.
;1.1 05-Sep-84 DFP encoding algorithm corrected;  added auto-help.

	VMAJOR=1
	VMINOR=1

	SEARCH	SYS
	SEARCH	SYSSYM

	.OFINI
	.OFDEF	IN,D.DDB		;input file
	.OFDEF	OUT,D.DDB		;output file
	.OFDEF	KEY,512.		;encryption key
	.OFSIZ	MEMSIZ

START:	PHDR	-1,0,PH$REE!PH$REU	;program header
	GETIMP	MEMSIZ,A5		;allocate impure area

HELP:	BYP				;bypass leading white space
	LIN				;end of line?			1.1
	JNE	GETIN			; no				1.1
	TYPECR	<Function: encodes and decodes files.>
	TYPECR	<Usage:    .ENCODE file,key>
	TYPECR	<Example:  .ENCODE TEST.BAS,HOWARD>
	CRLF				;newline			1.1
	EXIT				;exit				1.1

GETIN:	MOV	A2,A3			;save line index
	FSPEC	IN(A5),TXT		;process filespec
	INIT	IN(A5)			;load driver, allocate buffer

GETOUT:	MOV	A3,A2			;restore line index
	FSPEC	OUT(A5),TXT		;process filespec
	INIT	OUT(A5)			;load driver, allocate buffer
	MOVW	#[$$$],OUT+D.EXT(A5)	;set output extension to .$$$

GETKEY:	BYP				;bypass leading white space
	LEA	A0,KEY(A5)		;index key storage area
10$:	LIN				;end of line?			1.1
	BEQ	20$			; yes - end-of-key		1.1
	MOVB	(A2)+,D1		;get next char of key
	BEQ	20$			;branch if end-of-key
	MOVB	D1,(A0)+		;store byte
	BR	10$			;loop till entire line processed
20$:	CLRB	@A0			;terminate key buffer
	LEA	A0,KEY(A5)		;reset key buffer index

OPNIN:	OPENI	IN(A5)			;open input file

OPNOUT:	LOOKUP	OUT(A5)			;check for existence of output file
	BNE	10$			;not found
	DSKDEL	OUT(A5)			;delete output file
10$:	OPENO	OUT(A5)			;open output file

GETBYT:	CTRLC	ENDFIL			;branch on ^C
	FILINB	IN(A5)			;read byte
	TST	IN+D.SIZ(A5)		;test for end-of-file
	BEQ	ENDFIL			;branch on end-of-file

CRYPT:	MOVB	(A0)+,D0		;D0 := next char of key
	BNE	10$			;branch if not end-of-key
	LEA	A0,KEY(A5)		;else reset key index
	BR	CRYPT			;and loop back to start of key	1.1
10$:	XORB	D0,D1			;XOR char with key byte

PUTBYT:	FILOTB	OUT(A5)			;output encrypted byte
	BR	GETBYT			;loop till end of file

ENDFIL:	CLOSE	IN(A5)
	CLOSE	OUT(A5)
	CTRLC	ABORT

DELIN:	DSKDEL	IN(A5)

RENOUT:	MOV	IN+D.FIL(A5),OUT+D.DDB(A5)
	MOVW	IN+D.EXT(A5),OUT+D.DDB+4(A5)
	DSKREN	OUT(A5)
	EXIT

ABORT:	DSKDEL	OUT(A5)
	EXIT

	END