		.MODEL SMALL
		.DATA
PASS_WRD	DB	17 DUP(?)
PWSCRN1		DB	'Please enter your password:-$'
PWSCRN2		DB	'Please enter your NEW password:-$'
PWSCRN3		DB	'Please re-enter your password:-$'
PWSCRN4		DB	'INVALID PASSWORD$'
PWSCRN5		DB	'PASSWORD MUST BE AT LEAST 4 CHARACTERS LONG$'
PWSCRN6		DB	'Passwords do not match. Try again.$'
		.CODE
		PUBLIC	_oldpass, _newpass
		EXTRN	_silent:near, _beepit:near, _writeln:near, _clrwin:near

; THIS PROCEDURE GETS A PW FROM THE USER AND COMPARES IT TO AN EXISTING PW
; IN THE FILE BUFFER (FIL_BUF). THE USER IS ALLOWED 3 ATTEMPTS AT THE PW.
; IF THE AX CONTAINS ZERO ON RETURN THE USER HAS FAILED TO ENTER THE CORRECT
; PW

; NO INPUT REGISTER VALUES USED
; AX THRU DX DESTROYED

_oldpass	PROC	NEAR

		PUSH	BP
		MOV	BP,SP
		PUSH	ES
		MOV	AX,DS
		MOV	ES,AX
		PUSH	SI
		PUSH	DI
		MOV	SI,[BP+4]

; REQUEST PASSWORD

		CALL	_clrwin
		MOV	CX,3		;USER GETS 3 TRIES
	ODP10:	PUSH	CX		;SAVE LOOP COUNTER
		LEA	BX,PWSCRN1
		MOV	DX,131AH
		CALL	_writeln		;DISPLAY-> PLEASE ENTER YOUR PW

; GET USERS ENTRY

		LEA	BX,PASS_WRD
		PUSH	BX
		CALL	_silent
		ADD	SP,2

; COMPARE IT TO RESIDENT PW (IN FIL_BUF)

		CALL	PWCHECK
		JNE	ODP20		;PASSWORDS DONT MATCH - CONTINUE SUBRTN
		POP	CX		;YES THEY DO - RESTORE LOOP COUNTER
		JMP	SHORT ODP30	;AND EXIT

; PASSWORDS DONT MATCH - INFORM USER, TEST LOOP CNTR AND EXIT OR REPEAT

	ODP20:	INC	WORD PTR [SI+51]	;BUMP FAIL ATTEMPTS
		LEA	BX,PWSCRN4
		MOV	DX,1620H
		CALL	_writeln		;DISPLAY-> INVALID PASSWORD
		CALL	_beepit
		POP	CX
		LOOP	ODP10
	ODP30:	MOV	AX,CX
		POP	DI
		POP	SI
		POP	ES
		POP	BP
		RET

_oldpass	ENDP

;------------------------------------------------------------------------------

; THIS PROCEDURE GETS A NEW PASSWORD INTO THE FIL_BUF AREA AND DOES NOT
; EXIT UNTIL THE USER CAN RE-ENTER IT CORRECTLY

; NO INPUT REGISTER VALUES USED
; AX THRU DX DESTROYED

_newpass	PROC	NEAR

		PUSH	BP
		MOV	BP,SP
		PUSH	ES
		MOV	AX,DS
		MOV	ES,AX
		PUSH	SI
		PUSH	DI
		MOV	SI,[BP+4]

; REQUEST NEW PASSWORD

		CALL	_clrwin
	NWP10:	LEA	BX,PWSCRN2
		MOV	DX,1318H
		CALL	_writeln		;DISPLAY-> PLEASE ENTER YOUR NEW PASSWRD

; GET USERS ENTRY AND MAKE SURE IT IS AT LEAST 4 CHARACTERS LONG

	NWP20:	LEA	BX,PASS_WRD
		PUSH	BX
		CALL	_silent
		ADD	SP,2
		CMP	AX,000DH	;PASSWORD LESS THAN 4 CHARACTERS?
		JS	NWP30		;NO -- CONTINUE WITH SUBRTN
		LEA	BX,PWSCRN5
		MOV	DX,1612H
		CALL	_writeln		;DISPLAY-> PW MUST BE AT LEAST 4 CHR
		CALL	_beepit
		JMP	NWP20

; MOVE NEW PASSWORD TO FILE BUFFER

	NWP30:	PUSH	SI
		CLD			;CLEAR DIRECTION FLAG
		MOV	CX,11H		;MAX LENGTH OF PW + $ TERMINATOR
		MOV	DI,[BP+4]		;PW AREA IN FILE BUFFER
		LEA	SI,PASS_WRD	;PW INPUT AREA
		REP MOVSB
		POP	SI

; REQUEST USER TO RE-ENTER PW, GET IT AND COMPARE WITH PW ENTERED ABOVE

		CALL	_clrwin
		LEA	BX,PWSCRN3
		MOV	DX,1318H
		CALL	_writeln		;DISPLAY-> PLEASE RE-ENTER YOUR PW
		LEA	BX,PASS_WRD
		PUSH	BX
		CALL	_silent
		ADD	SP,2
		CALL	PWCHECK
		JNE	NWP40		;NOT THE SAME - NEED TO GET ANOTHER PW

; RECORD DATE AND TIME OF PASSWORD CHANGE

		MOV	BX,SI
		PUSH	SI
		ADD	BX,17
		CLD			;CLEAR DIRECTION FLAG
		MOV	CX,8		;LENGTH OF DATE
		MOV	DI,BX		;FILE BUFFER
		MOV	SI,[BP+6]	;CURRENT DATE
		REP MOVSB
		ADD	BX,8
		MOV	CX,8		;LENGTH OF TIME
		MOV	DI,BX		;FILE BUFFER
		MOV	SI,[BP+8]	;CURRENT TIME
		REP MOVSB
		POP	SI
		MOV	WORD PTR [SI+49],0

		POP	DI
		POP	SI
		POP	ES
		POP	BP
		RET			;OK TO EXIT SUBRTN

; IF PW'S NOT THE SAME, TELL THE USER AND START SUBRTN AGAIN

	NWP40:	CALL	_clrwin
		LEA	BX,PWSCRN6
		MOV	DX,1617H
		CALL	_writeln		;DISPLAY-> PW DOES NOT MATCH TRY AGAIN
		CALL	_beepit
		JMP	NWP10

_newpass	ENDP

;------------------------------------------------------------------------------

; THIS PROCEDURE COMPARES THE RESIDENT PASSWORD (IN FIL_BUF) WITH THE
; PASSWORD IN THE INPUT AREA (PASS_WRD) IT SETS THE ZERO FLAG BEFORE
; RETURNING IF THE PASSWORDS ARE IDENTICAL

PWCHECK		PROC	NEAR
		PUSH	SI
		CLD			;CLEAR DIRECTION FLAG
		MOV	CX,11H		;MAX LENGTH OF PW + $ TERMINATOR
		MOV	DI,[BP+4]
		LEA	SI,PASS_WRD
		REPE CMPSB
		POP	SI
		RET
PWCHECK		ENDP
		END
