;  AUTHOR:- STEPHEN MENDES                                FILE "STATDISP.ASM"
;
;    void statdp (char *)
;
;    PARAMETERS:- FILE BUFFER.
;
;  DISPLAYS THE STATUS SCREEN ASSOCIATED WITH THE PASSWORD SYSTEM.

		.MODEL SMALL
		.DATA
OPNCNT		DB	5 DUP(?)
FLSCNT		DB	5 DUP(?)
PSSCRN1		DB	'last pw change:-$'
PSSCRN2		DB	'# opens since last pw change:-$'
PSSCRN3		DB	'last opened:-$'
PSSCRN4		DB	'# fails since last open:-$'

		.CODE
		PUBLIC	_statdp
		EXTRN	_clrwin:near, _writeln:near
_statdp		PROC	NEAR

; THIS PROCEDURE DISPLAYS THE PASSWORD STATUS SCREEN UPON SUCCESSFUL ENTRY
; OF THE PASSWORD

		PUSH	BP
		MOV	BP,SP
		PUSH	SI
		MOV	SI,[BP+4]

		CALL	_clrwin		;CLEAR THE WINDOW (LINES 19 TO 22)
		MOV	AX,0601H	;NEED TO REMOVE BLINKING ATTIBUTE
		MOV	BH,0EH		;ON THE BOTTOM LINE OF THE WINDOW
		MOV	CX,1612H
		MOV	DX,163CH
		INT	10H

;PREPARE OPEN AND FAILS COUNTS THESE ARE IN BINARY IN THE FIL_BUF AREA
;THIS ROUTINE GETS THEM, CONVERTS THEM TO 5 DIGIT ASCII REPRESENTATION
;STORES THEM IN OPCNT AND FLSCNT

		CALL	STATCN

		INC	WORD PTR [SI+49]	;BUMP OPEN COUNT IN FIL_BUF
		LEA	BX,PSSCRN1	;STATIC MESSAGE
		MOV	DX,1313H	;LOCATION TO DISPLAY
		CALL	_writeln	;DISPLAY -> LAST PW CHANGE:-
		MOV	DX,132AH	;LOCATION TO PUT THE DATE OF PW CHANGE
		MOV	BX,SI		;ADDR OF START OF FIL_BUF
		ADD	BX,17		;OFFSET OF PW DATE IN FIL_BUF
		MOV	CX,8		;DATE IS 8 CHARACTERS LONG
		CALL	MOVSCRN		;PUT IT ON THE SCREEN
		INC	DX		;MOVE SCREEN POINTER 2 SPACES FOR
		INC	DX		;LOCATION TO PUT TIME OF PW CHANGE
		MOV	BX,SI		;ADDR START OF FIL_BUF
		ADD	BX,25		;OFFSET OF TIME IN FIL_BUF
		MOV	CX,8		;TIME IS ALSO 8 CHARACTERS LONG
		CALL	MOVSCRN		;PUT IT ON THE SCREEN

		LEA	BX,PSSCRN2
		MOV	DX,1413H	;SCREEN POSITION
		CALL	_writeln	;DISPLAY -> # OF OPENS SINCE PW CHANGE
		MOV	DX,1437H	;LOCATION TO PUT OPNCNT VARIABLE
		LEA	BX,OPNCNT
		MOV	CX,5		;NUMBER IS 5 CHARACTERS LONG
		CALL	MOVSCRN		;GET IT ON THE SCREEN

		LEA	BX,PSSCRN3
		MOV	DX,1513H
		CALL	_writeln	;DISPLAY -> LAST OPENED:-
		MOV	DX,152AH	;LOCATION TO DISPLAY OPEN DATE
		MOV	BX,SI		;ADDR OF START OF FIL_BUF
		ADD	BX,33		;OFFSET OF OPEN DATE IN FIL_BUF
		MOV	CX,8
		CALL	MOVSCRN
		INC	DX		;MOVE SCREEN POINTER 2 SPACES
		INC	DX		;FOR LOCATION TO PUT TIME
		MOV	BX,SI		;ADDR OF START OF FIL_BUF
		ADD	BX,41		;OFFSET OF OPEN TIME IN FIL_BUF
		MOV	CX,8
		CALL	MOVSCRN

		LEA	BX,PSSCRN4
		MOV	DX,1613H
		CALL	_writeln	;DISPLAY -> # OF FAILS SINCE LAST OPEN
		MOV	DX,1637H	;SCRN LOCATION TO PUT FLSCNT
		LEA	BX,FLSCNT
		MOV	CX,5		;COUNT IS 5 CHARACTERS LONG
		CALL	MOVSCRN

; THE FOLLOWING CODE TURNS OFF THE CURSOR DURING PASSWORD STATUS DISPLAY

		MOV	DX,3D4H		;6845 CRT CONTROLLER PORT ADDR REGISTER
		MOV	AL,10		;REQUEST ACCESS TO REGISTER 10
		OUT	DX,AL		;THIS IS CURSOR IMAGE START REGISTER
		MOV	DX,3D5H		;6845 CONNECTS REQ REG TO THIS I/O PORT
		MOV	AL,20H		;SET BIT 5 TO TURN OFF THE CURSOR IMAGE
		OUT	DX,AL		;SEND IT TO THE PORT

; NOTE: BITS 0-4 SPECIFY THE STARTING SCAN LINE, MUST BE SET APPROPRIATE FOR
;       MONITOR TYPE WHEN CURSOR IS TURNED BACK ON

; THE FOLLOWING CODE GIVES US TIME TO PERUSE THE STATUS DISPLAY, PRESSING
; ANY KEY CONTINUES THE SUBRTN


; CLEAR THE KEYBOARD BUFFER & GET ANY CHARACTER PRESSED

	STD10:	MOV	AH,1		;KEYBOARD BUFFER EMPTY?
		INT	16H
		JZ	STD20		;YES -- CONTINUE WITH SUBRTN
		XOR	AH,AH		;NO -- READ CHARACTER
		INT	16H
		JMP	STD10		;AND TEST AGAIN
	STD20:	XOR	AH,AH		;READ A CHARACTER FROM KEYBOARD
		INT	16H

; THIS CODE TURNS BACK ON THE CURSOR IMAGE AND SETS STARTING SCAN LINE
; TO DEFAULT FOR VGA SYSTEMS

		MOV	DX,3D4H		;ADDRESS SELECTION PORT
		MOV	AL,10		;REQUEST REGISTER 10
		OUT	DX,AL		;SEND REQUEST
		MOV	DX,3D5H		;6845 DATA I/O PORT
		MOV	AL,0DH		;RESET BIT 5 AND SET STARTING SCAN LINE
		OUT	DX,AL		;SEND IT TO THE PORT

		CALL	_clrwin		;CLEAR WINDOW
		POP	SI		;RESTORE REGISTERS
		POP	BP
		RET			;AND GO HOME
_statdp		ENDP

CNVWRD		PROC	NEAR

; THIS PROCEDURE CONVERTS A BINARY VALUE IN THE AX TO ITS DECIMAL EQUIVALENT
; ASCII VALUE (WHICH REQUIRES 5 DECIMAL DIGITS).
; THIS IS DONE BY SUCCESSIVE DIVISION BY 10, CONVERTING THE REMAINDER TO ASCII
; AND STORING IT. THE OFFSET OF THE STORAGE AREA IS IN THE BX.
; SINCE THE QUOTIENT CAN BE LARGER THAN 1 BYTE AFTER THE FIRST DIVIDE
; THE 32-BIT FORM OF THE DIV INSTRUCTION IS USED
; DIVIDEND IN DX:AX WITH DX SET TO ZERO
; QUOTIENT IS RETURNED IN AX AND REMAINDER IN DX AFTER EACH DIVIDE
; THE DIVISOR (10) IS PLACED IN THE CX
; THE BX MUST FIRST BE SET TO POINT TO THE LAST BYTE OF THE FIELD
; SINCE THE BYTES ARE GENERATED LEAST SIGNIFICANT DIGIT FIRST
; THE BX IS DECREMENTED AFTER EACH BYTE IS PRODUCED

		ADD	BX,4		;SET DATA PNTR TO END OF FIELD
		XOR	DX,DX		;ZERO HIGH ORDER DIVIDEND
		MOV	CX,5		;LOOP 5 TIMES FOR 5 DIGITS
	NEXTD:	PUSH	CX		;CX MUST DO DOUBLE DUTY
		MOV	CX,10		;DIVIDE BY TEN
		DIV	CX		;DO IT
		ADD	DL,30H		;LOW ORDER REMAIN 0-9 CONVERT TO ASCII
		MOV	[BX],DL		;MOVE IT TO DATA AREA
		DEC	BX		;SET DATA POINTER NEXT HIGHER SIG DIGIT
		XOR	DX,DX		;REMAIN BECOMES MSB DIVIDEND SO ZERO IT
		POP	CX		;PUT LOOP COUNTER BACK IN CX
		LOOP	NEXTD
		RET
CNVWRD		ENDP

STATCN		PROC	NEAR

; THIS PROCEDURE GETS THE OPEN AND FAIL COUNTS FROM THE FIL_BUF AND
; CALLS CNVWRD (CONVERT WORD) TO CONVERT THE BINARY VALUES TO DECIMAL
; DIGITS WHICH IT ALSO CONVERTS TO ASCII. THE ASCII DECIMAL FORM OF
; THESE 2 NUMBERS ARE STORED IN VARIABLES OPNCNT (OPEN COUNT)
; AND FLSCNT (FAILS COUNT) FOR USE BY PROCEDURE STATDP (STATUS DISPLAY)

		LEA	BX,OPNCNT
		MOV	AX,[SI+49]	;OFFSET OF OPEN COUNT IN FIL_BUF
		CALL	CNVWRD
		LEA	BX,FLSCNT
		MOV	AX,[SI+51]	;OFFSET OF FAILS COUNT IN FIL_BUF
		CALL	CNVWRD
		RET
STATCN		ENDP

MOVSCRN		PROC	NEAR

; THIS PROCEDURE WRITES A STRING TO THE DISPLAY (CX= LENGTH OF STRING)

; BX= STRING ADDRESS  DX= POSITION ON DISPLAY (DH= ROW  DL= COL)


	MVS10:	PUSH	CX
		PUSH	BX
		MOV	AH,2		;SET CURSOR FUNCTION
		XOR	BH,BH		;PAGE 0
		INT	10H		;MOVE CURSOR
		INC	DX
		POP	BX
		MOV	AL,[BX]
		INC	BX
		PUSH	BX
		MOV	AH,9		;DISPLAY CHARACTER IN AL
		MOV	BL,0BH		;COLOR - LIGHT CYAN
		XOR	BH,BH		;PAGE 0
		MOV	CX,1		;DISPLAY ONLY ONCE
		INT	10H
		POP	BX
		POP	CX
		LOOP	MVS10
		RET
MOVSCRN		ENDP
		END
