TITLE		SILENT		Accepts input of a code without displaying it.
;		AUTHOR		STEPHEN MENDES
;		OPERATION	This routine accepts up to 16 characters
;				(extended keys bypassed) from the keyboard
;				but the user may terminate input with the
;				enter key (which is not stored) after typing
;				4 or more characters (less than 4 characters
;                               sends a prompt to the user and restarts the
;				input cycle). An asterix replaces 1 of 16
;				hyphens for each key that the user presses.
;				These are displayed on line 21, center screen
;				and any prompts are displayed on line 22.
;				Pressing a key blanks any prompts displayed.
;				The input string is stored at the offset
;				passed to the program as a single parameter.

DISPCHR		MACRO			;DISPLAY CHARACTER IN AL
		MOV	AH,9		;AT CURRENT CURSOR LOCATION
		XOR	BH,BH		;PAGE 0
		INT	10H
		ENDM
SETCURS		MACRO			;DESIRED CURSOR POSITION IN DX
		MOV	AH,2		;SET CURSOR FUNCTION
		XOR	BH,BH		;PAGE 0
		INT	10H		;MOVE CURSOR
		ENDM

		.MODEL SMALL
		.CODE
		PUBLIC	_silent

_silent		PROC	NEAR
		PUSH	BP
		MOV	BP,SP		;SETUP STACK FRAME PNTR
		MOV	DX,1520H	;CURSOR POSITION POINTER
		SETCURS
		MOV	AL,'-'		;HYPHEN CHARACTER TO REPEAT
		MOV	CX,16		;NUMBER OF REPEATED CHARACTERS
		MOV	BL,9		;LIGHT BLUE ON BLACK
		DISPCHR			;DISPLAY-> ----------------
		MOV	BX,[BP+4]	;GET ADDR OF STORAGE FOR INPUT PASSWORD
		MOV	DX,1520H	;RESTORE CURSOR POSITION POINTER

; CLEAR THE KEYBOARD BUFFER

	PWI10:	MOV	AH,1		;KEYBOARD BUFFER EMPTY?
		INT	16H
		JZ	PWI20		;YES -- CONTINUE WITH SUBRTN
		XOR	AH,AH		;NO -- READ CHARACTER
		INT	16H
		JMP	PWI10		;AND TEST AGAIN

; CLEAR INPUT PASSWORD STORAGE AREA

	PWI20:	MOV	CX,0011H	;AREA SIZE 17 BYTES
		MOV	AL,' '		;FILL IT WITH SPACES
	PWI30:	MOV	[BX],AL
		INC	BX		;BUMP PW STORAGE PNTR
		LOOP	PWI30

; SET MAXIMUM PASSWORD LENGTH AND RESTORE PASSWORD STORAGE PNTR

		MOV	CX,0010H	;MAXIMUM PASSWORD LENGTH
		MOV	BX,[BP+4]	;GET ADDR OF STORAGE FOR INPUT PASSWORD

; SET THE CURSOR

	PWI40:	PUSH	BX		;SAVE PW STORAGE ADDR PNTR
		SETCURS
		POP	BX		;RESTORE PW STORAGE ADDR PNTR

; GET A VALID (NOT EXTENDED) KEY

	PWI50:	XOR	AH,AH		;READ A CHARACTER FROM KEYBOARD
		INT	16H
		CMP	AL,00		;IS IT AN EXTENDED KEY?
		JZ	PWI50		;YES -- GET ANOTHER CHARACTER

; BLANK OUT ANY PROMPTS THAT MIGHT BE PRESENT ON LINE 22 OF THE DISPLAY

		PUSH	AX		;SAVE REGISTERS -KEY JUST PRESSED IN AL
		PUSH	BX		;PW STORAGE ADDR PNTR
		PUSH	CX		;LOOP COUNTER
		PUSH	DX		;CURSOR POINTER
		MOV	DX,1612H	;CURSOR POSITION ON LINE 22
		SETCURS
		MOV	AL,' '		;SPACE CHARACTER
		MOV	CX,43		;REPEAT IT FOR 43 SPACES
		MOV	BL,8EH		;YELLOW ON BLACK BLINKING
		DISPCHR			;REMOVE ERR MSG (LINE 22) IF PRESENT
		POP	DX		;RESTORE CURSOR POINTER
		SETCURS			;AND THE CURSOR POSITION
		INC	DX		;BUMP CURSOR POINTER
		POP	CX		;RESTORE OTHER REGISTERS
		POP	BX
		POP	AX

; IF IT IS THE ENTER KEY THEN TERMINATE

		CMP	AL,0DH		;IS IT THE ENTER KEY?
		JZ	PWI60		;YES -- PW ENTRY COMPLETE

; STORE VALID PW KEY

		MOV	[BX],AL		;NO -- VALID PW KEY SO STORE IT
		INC	BX		;BUMP PW STORAGE ADDR PNTR
		PUSH	BX		;AND SAVE IT
		PUSH	CX		;SAVE LOOP COUNTER

; REPLACE A HYPHEN WITH AN ASTERIX AT CURSOR

		MOV	AL,'*'		;ASTERIX FOR EACH PW KEY PRESS
		MOV	CX,1		;ONLY 1 ASTERIX
		MOV	BL,0DH		;LIGHT MAGENTA ON BLACK
		DISPCHR			;DISPLAY IT
		POP	CX		;RESTORE LOOP COUNTER
		POP	BX		;RESTORE PW STORAGE ADDR PNTR
		LOOP	PWI40		;GET ANOTHER CHR IF < 16 ENTERED

; TERMINATE IF 16 CHARACTERS INPUT OR ENTER KEY PRESSED

	PWI60:	MOV	AX,CX		;RETURN COUNT (NEWPASS CHECKS PW LNGTH)
		POP	BP
		RET

_silent		ENDP
		END
