	.TITLE	HASH - HASH PASSWORD INTO 32BIT NON-REVERSABLE WORD
	.IDENT	/01.00/
;
; SUBROUTINE FOR FORTRAN PROGRAM TO HASH THE PASSWORD INTO A 32 BIT QUANTITY
;
TABLE=4
RESULT=8
PASDDSC=12
LENGTH=16
HASH::
	.WORD	0
	MOVL	TABLE(AP),R1	;PUT ADRESS OF TABLE IN R1
	MOVL	PASDDSC(AP),R2	;PUT ADDRESS OF PWD DESCR. IN R2
	MOVL	4(R2),R3	;PUT STRING ADDRESS IN R3
	MOVL	LENGTH(AP),R2
	MOVZWL	(R2),R2		;PUT LENGTH OF STRING IN R2
	MNEGL	#1,R0
;	CRC	TABLE(AP),R0,R2,,R3
; I HAVE IT ON GOOD AUTHORITY THAT THE CRC MICROCODE DOES NOT WORK
;IN THIS CASE I WILL USE A SUPPLIED MACRO SUBROUTINE THAT SIMULATES
;THE CALL.
	BSBB	CALC_CRC
	MOVL	RESULT(AP),R1
	MOVL	R0,(R1)
	RET
; ROUTINE TO SIMULATE THE CRC INSTRUCTION.
CALC_CRC:
; INITIAL REGISTER CONTENTS:
;	R0 - INITIAL CRC VALUE
;	R1 - TABLE ADDRESS
;	R2 - STRING LENGTH
;	R3 - STRING LENGTH
	MOVZWL	R2,R2		;CUT TO LONGWORD
	PUSHL	R4		;SAVE A TEMP REGISTER
	CLRL	R4		;CLEAR JUNK FOR INDEXING
	INCW	R2		;ADVANCE COUNTER FOR SOBGTR
	BRB	20$		;START WITH END TEST
10$:	XORB2	(R3)+,R0	;INCLUDE NEXT BYTE
	BICB3	#^XF0,R0,R4	;GET RIGHT 4 BITS
	EXTZV	#4,#28,R0,R0	;SHIFT RESULT RIGHT 4 BITS
	XORL2	(R1)[R4],R0	;INCLUDE TABLE ENTRY
	BICB3	#^XF0,R0,R4	;GET RIGHT 4 BITS
	EXTZV	#4,#28,R0,R0	;SHIFT RESULT RIGHT 4 BITS
	XORL2	(R1)[R4],R0	;INCLUDE TABLE ENTRY
20$:	SOBGTR	R2,10$		;COUNTDOWN LOOP
	POPR	#^M<R4>		;RESTORE TEMP
	CLRL	R1		;CLEAR R1 PER SPECS
	BICPSW	#^X3		;CLEAR V,C CONDITION CODES
	TSTL	R0		;SET N,Z CONDITION CODES
	RSB			;RETURN TO CALLER
	.END
