;  AUTHOR:- STEPHEN MENDES                                   FILE "EDITR.ASM"
;
;     void mainrtn (char *, int, char *, char *)
;
;     PARAMETERS:- FILE BUFFER, FILE SIZE, DATE TIME.
;
;  MAIN INPUT LOOP ASSOCIATED WITH MAIN SCREEN FOR ENTERING/VIEWING TEXT.


DISPCHR		MACRO			;DISPLAY CHARACTER IN AL
		MOV	AH,0AH		;AT CURRENT CURSOR LOCATION
		MOV	BH,00		;PAGE 0
		MOV	CX,01		;DISPLAY ONLY ONCE
		INT	10H
		ENDM
SETCURS		MACRO			;DESIRED CURSOR POSITION IN DX
		MOV	AH,02		;SET CURSOR FUNCTION
		MOV	BH,00		;PAGE 0
		INT	10H		;MOVE CURSOR
		ENDM
CLRSCR		MACRO			;CLEAR THE SCREEN
		MOV	AX,0600H	;SCROLL(06) & FULL SCREEN(00)
		MOV	BH,07		;ATTRIBUTE - WHITE(7) ON BLACK(0)
		MOV	CX,0000		;UPPER LEFT ROW - COLUMN
		MOV	DX,184FH	;LOWER RIGHT ROW - COLUMN
		INT	10H		;CLEAR THE SCREEN
		ENDM

		.MODEL SMALL
		.DATA
CUR_PAGE	DW	?
CUR_PNUM	DW	1
FIL_STR		DW	?
FIL_END		DW	?
		.CODE
		PUBLIC	_mainrtn
		EXTRN	_filtoscr:near, _scrtofil:near, _pnumdisp:near
		EXTRN	_mainscr:near, _newpass:near, _paswscr:near
_mainrtn	PROC	NEAR
		PUSH	BP
		MOV	BP,SP
		MOV	BX,[BP+4]	;ADDR OF START OF FIL_BUF
		MOV	FIL_STR,BX
		ADD	BX,53		;OFFSET OF START OF TEXT IN FIL_BUF
		MOV	CUR_PAGE,BX	;SET CURRENT PAGE PNTR TO START OF TXT
		MOV	BX,[BP+4]	;ADDR OF START OF FIL_BUF
		ADD	BX,[BP+6]	;FILE SIZE
		MOV	FIL_END,BX

;FIL_END NOW CONTAINS ADDR OF LAST BYTE OF FILE + 1
;FIL_SIZE IS CHOSEN AS A MULTIPLE OF SECTOR SIZE THEREFORE THERE
;MAY BE FREE SPACE BETWEEN THE LAST PAGE OF TEXT AND THE END OF THE FILE
;THE FOLLOWING CODE FINDS OUT THE ADDR OF THE LAST BYTE ON THE LAST PAGE
;OF TEXT BY MOVING TO THE START OF SUCCESSIVE PAGES UNTIL THE POINTER
;GOES BEYOND THE END OF FILE, IF THE POINTER EXACTLY EQUALS THE LAST + 1
;THEN THE PAGE BEFORE WILL FIT AND THERE IS NO FREE SPACE AT THE END
;THE LAST BYTE OF THE FILE IS ALSO THE LAST BYTE OF THE LAST PAGE.
;DECREMENTING BY ONE PLACES THE POINTER ON THE LAST BYTE OF BOTH FILE AND TXT.

;IF THE POINTER IS BEYOND THE LAST+1 THEN THE LAST PAGE WILL NOT FIT AND THERE
;WILL BE FREE SPACE. SUBTRACTING THE PAGE SIZE RETURNS US TO THE PREVIOUS PAGE
;(IE THE ONE THAT WILL NOT FIT) DECREMENTING BY ONE THEN PLACES US ON THE
;LAST BYTE OF THE PAGE BEFORE.

		MOV	BX,CUR_PAGE	;START OF TEXT
	MNR10:	ADD	BX,0500H	;START OF NEXT PAGE
		CMP	BX,FIL_END	;IS THIS A PAGE OF THE FILE?
		JS	MNR10		;YES - CHECK NEXT PAGE
		JZ	MNR20		;NO - BUT THE LAST PAGE IS OK
		SUB	BX,0500H	;LAST PAGE WILL NOT FIT
	MNR20:	DEC	BX		;LAST BYTE OF LAST VALID PAGE
		MOV	FIL_END,BX	;ADDR OF LAST BYTE ON LAST PAGE STORED

; START OF MAINRTN CODE IS HERE

	ML05:	PUSH	CUR_PAGE
		CALL	_filtoscr
		ADD	SP,2
		PUSH	CUR_PNUM
		CALL	_pnumdisp
		ADD	SP,2
		MOV	DX,0400H
		SETCURS

; CLEAR THE KEYBOARD BUFFER & GET ANY CHARACTER PRESSED


	ML10:	MOV	AH,01		;KEYBOARD BUFFER EMPTY?
		INT	16H
		JZ	ML20		;YES -- CONTINUE WITH SUBRTN
		MOV	AH,00		;NO -- READ CHARACTER
		INT	16H
		JMP	ML10		;AND TEST AGAIN
	ML20:	MOV	AH,00		;READ A CHARACTER FROM KEYBOARD
		INT	16H
		CMP	AL,00		;IS IT AN EXTENDED KEY?
		JZ	MN40		;YES -- WHICH ONE?
		DISPCHR
		CALL	CURIGHT
		JMP	ML20

	MN40:	CMP	AH,3BH
		JZ	MN50		;F1 PRESSED - CHANGE PASSWORD
		CMP	AH,3CH
		JZ	MN60		;F2 PRESSED - SAVE & EXIT
		CMP	AH,51H
		JZ	MN70		;PAGE DOWN PRESSED - NEXT PAGE
		CMP	AH,49H
		JZ	MN80		;PAGE UP PRESSED - PREVIOUS PAGE
		CMP	AH,52H
		JZ	MN90		;INSERT PRESSED
		CMP	AH,53H
		JZ	MN100		;DELETE PRESSED
		CMP	AH,48H
		JZ	MN110		;UP ARROW PRESSED
		CMP	AH,4BH
		JZ	MN120		;LEFT ARROW PRESSED
		CMP	AH,4DH
		JZ	MN130		;RIGHT ARROW PRESSED
		CMP	AH,50H
		JZ	MN140		;DOWN ARROW PRESSED
		CMP	AH,47H
		JZ	MN150		;HOME PRESSED
		CMP	AH,4FH
		JZ	MN160		;END PRESSED
		JMP	ML20

	MN50:	CALL	GNPRTN
		JMP	ML05
	MN60:	PUSH	CUR_PAGE
		CALL	_scrtofil
		ADD	SP,2
		MOV	AX,0600H
		MOV	BH,7
		XOR	CX,CX
		MOV	DX,184FH
		INT	10H
		MOV	AH,2
		XOR	BH,BH
		XOR	DX,DX
		INT	10H
		POP	BP
		RET
	MN70:	CALL	PAGEDOWN
		JMP	ML20
	MN80:	CALL	PAGEUP
		JMP	ML20
	MN90:	CALL	INSCHR
		JMP	ML20
	MN100:	CALL	DELCHR
		JMP	ML20
	MN110:	CALL	CURUP
		JMP	ML20
	MN120:	CALL	CURLEFT
		JMP	ML20
	MN130:	CALL	CURIGHT
		JMP	ML20
	MN140:	CALL	CURDOWN
		JMP	ML20
	MN150:	CALL	CURHOME
		JMP	ML20
	MN160:	CALL	CUREND
		JMP	ML20

_mainrtn	ENDP
GNPRTN		PROC	NEAR
		CLRSCR
		CALL	_paswscr
		PUSH	[BP+10]
		PUSH	[BP+8]
		PUSH	[BP+4]
		CALL	_newpass
		ADD	SP,6
		CALL	_mainscr
		RET
GNPRTN		ENDP
CURIGHT		PROC	NEAR
		INC	DL
		CMP	DL,80
		JNZ	CR10
		INC	DH
		MOV	DL,0
		CMP	DH,14H
		JNZ	CR10
		DEC	DH
		MOV	DL,79
; ISERT SOUND CALL HERE
		RET
	CR10:	SETCURS
		RET
CURIGHT		ENDP
CURLEFT		PROC	NEAR
		DEC	DL
		JNS	CL10
		DEC	DH
		MOV	DL,79
		CMP	DH,3
		JNZ	CL10
		INC	DH
		MOV	DL,0
; ISERT SOUND CALL HERE
		RET
	CL10:	SETCURS
		RET
CURLEFT		ENDP
CURUP		PROC	NEAR
		DEC	DH
		CMP	DH,3
		JNZ	CU10
		INC	DH
; ISERT SOUND CALL HERE
		RET
	CU10:	SETCURS
		RET
CURUP		ENDP
CURDOWN		PROC	NEAR
		INC	DH
		CMP	DH,14H
		JNZ	CD10
		DEC	DH
; ISERT SOUND CALL HERE
		RET
	CD10:	SETCURS
		RET
CURDOWN		ENDP
CURHOME		PROC	NEAR
		MOV	AH,2
		INT	16H
		AND	AL,00000011B
		JZ	CRH20
		MOV	DX,0400H
		SETCURS
		RET
	CRH20:	MOV	DL,0
		SETCURS
		RET
CURHOME		ENDP
CUREND		PROC	NEAR
		PUSH	DX
		MOV	AH,2
		INT	16H
		AND	AL,00000011B
		POP	DX
		JZ	CRE20
		MOV	DX,134FH
		SETCURS
		RET
	CRE20:	MOV	DL,79
		SETCURS
		RET
CUREND		ENDP
INSCHR		PROC	NEAR
		RET
INSCHR		ENDP
DELCHR		PROC	NEAR
		RET
DELCHR		ENDP
PAGEDOWN	PROC	NEAR
		PUSH	CUR_PAGE	;CUR_PAGE
		CALL	_scrtofil	;SCREEN TO FILE TRANSFER
		ADD	SP,2
		MOV	AX,CUR_PAGE	;CUR_PAGE
		ADD	AX,0500H	;SET INDEX TO POINT TO NEXT PAGE
		CMP	FIL_END,AX	;COMPARE TO FIL_END DOES PAGE EXIST?
		JNS	PD10
		RET			;NO -- RETURN TO CALLER
	PD10:	MOV	CUR_PAGE,AX	;YES -- NEXT PAGE BECOMES CURRENT PAGE
		PUSH	AX		;CUR_PAGE
		CALL	_filtoscr	;FILE TO SCREEN TRANSFER
		ADD	SP,2
		INC	CUR_PNUM	;BUMP PAGE NUMBER
		PUSH	CUR_PNUM
		CALL	_pnumdisp	;AND DISPLAY IT
		ADD	SP,2
		RET
PAGEDOWN	ENDP
PAGEUP		PROC	NEAR
		PUSH	CUR_PAGE
		CALL	_scrtofil
		ADD	SP,2
		MOV	AX,CUR_PAGE
		SUB	AX,0500H	;SET INDEX TO POINT TO PREVIOUS PAGE
		CMP	AX,FIL_STR	;DOES PAGE EXIST?
		JNS	PU10
		RET
	PU10:	MOV	CUR_PAGE,AX	;PREVIOUS PAGE NOW BECOMES CURRENT
		PUSH	AX
		CALL	_filtoscr
		ADD	SP,2
		DEC	CUR_PNUM
		PUSH	CUR_PNUM
		CALL	_pnumdisp	;SHOW CURRENT PAGE NUMBER
		ADD	SP,2
		RET
PAGEUP		ENDP
		END
