C**********************************************************************
C
C	MASTER ROUTINE TO MANIPULATE THE SCREEN
C
C**********************************************************************
	SUBROUTINE SCR_SCRIN(ISEC, IUNIT, FLAG, LOGMODE, LOGKEY)
C		---- ISEC = USER SECTION NUMBER
C		---- IUNIT = OPEN UNIT # FOR SECTION FILE
C		---- FLAG = RESPONCE TO CALLER IF ERROR HAS OCCURED
C		---- LOGMODE = .TRUE. IF IN REPLACE MODE
C		---- LOGKEY = .TRUE. IF IN KEYPAD MODE
	INCLUDE 'SCREEN.FOR'
	CHARACTER D_LINE*80,D_WORD*80, D_CHR*1, INSYMBOL*20,OUTSYMBOL*20
	LOGICAL*1 GOLD,DIRECT, FLAG, LOGMODE, LOGKEY
	INTEGER*4 DL_LEN, DW_LEN
	BYTE ICHR
	DATA ICHAN /-999/, IBOLD /2/
	PARAMETER MINCOL=1, MAXCOL=80, MINLIN=1, MAXLIN=24

C	---- SEE IF WE ARE IN BATCH OR A COMMAND FILE MODE
	CALL SCR_GETMODE(IMODE)
	IF (IMODE.NE. 1) THEN
		IF (ISEC .NE. ICURRENT_SECTION) THEN
			CALL SCR_RDSECT(FLAG,ISEC,IUNIT)
			IF (FLAG) RETURN
			ICURRENT_SECTION = ISEC
		ENDIF
		CALL SCR_RDBATCH
		RETURN
	ENDIF

C	---- IF FIRST TIME HERE, CHECK FOR VT100 AND INITIALIZE CHANNEL TO TT:
	IF (ICHAN .EQ. -999) THEN
		INSYMBOL = 'TERMINAL_TYPE'
		CALL SCR_GETSYMBOL(INSYMBOL,OUTSYMBOL)
		IF (OUTSYMBOL.NE.'VT100')THEN
			TYPE *,'YOUR TERMINAL MUST BE A VT100 AND'
			TYPE *,'YOU NEED TO DEFINE THE SYMBOL TERMINAL_TYPE'
			TYPE *,'TO EQUAL "VT100"'
			FLAG = .TRUE.
			RETURN
		ENDIF
		CALL SCR_IOCHAN(ICHAN)
	ENDIF

C	---- IF USER SECTION NUMBER HAS CHANGED, GET NEW SECTION
	IF (ISEC .LT. 0) THEN
		ILIN = IXY(1,1)
		ICOL = IXY(1,2)
		CALL SCR_ENCVAL	!ENCODE USER VALUES
		CALL SCR_WRTSECT	!WRITE FULL SCREEN

	ELSE IF (ISEC .NE. ICURRENT_SECTION ) THEN
		CALL SCR_RDSECT(FLAG, ISEC, IUNIT)
		IF (FLAG) RETURN
		ILIN = IXY(1,1)
		ICOL = IXY(1,2)
		CALL SCR_ENCVAL	!ENCODE USER VALUES
		CALL SCR_WRTSECT	!WRITE FULL SCREEN
		ICURRENT_SECTION = ISEC

	ELSE
C		---- SETUP USER VALUES ON SCREEN
		CALL SCR_ENCVAL	!ENCODE USER VALUES
		ILIN = IXY(1,1)
		ICOL = IXY(1,2)
		CALL SCR_WRTVALUE 	!WRITE USER VALUES TO SCREEN
	ENDIF

	CALL SCR_KEYPAD(LOGKEY)

	DIRECT=.TRUE.
1001	ILIN=IXY(1,1)
	ICOL=IXY(1,2)

C	---- MOVE THE CURSOR TO 1ST LOGICAL POSTION
1	ISTAT=LIB$SET_CURSOR(ILIN,ICOL)
		IF(.NOT.ISTAT)CALL LIB$STOP(%VAL(ISTAT))
10	GOLD=.FALSE.		!SETUP GOLD KEY TO FALSE
	CALL SCR_RDCHR(ICHAN,ICHR)	!READ CHARACTER FROM TT:

C	---- IF CONTROL-B THEN REPAINT VALUES WITH REVERSE VIDIO
	IF (ICHR.EQ.2) THEN
		IBOLD = 2	!INVERSE DISPLAY
		CALL SCR_WRTVALUE
		GOTO 10


C	---- BOMB ON CONTROL-C OR CONTROL-Y
	ELSE IF (ICHR.EQ.3 .OR. ICHR.EQ.25) THEN
		ISTAT = LIB$SET_CURSOR(24,1)
		TYPE *,'PROGRAM ABORTED ON CONTROL C OR Y'
		CALL EXIT

C	---- IF BACKSPACE, DEL, OR CAN, BACKSPACE AND DELETE CHAR
	ELSE IF (ICHR.EQ.8 .OR.ICHR.EQ.127 .OR.ICHR.EQ.24) THEN
		IF (LOGSCREEN(ILIN,ICOL-1)) ICOL = ICOL - 1
		CALL SCR_DELC(D_CHR)
		GOTO 10

C	---- IF CONTROL-N THEN REPAINT VALUES WITH NORMAL VIDIO
	ELSE IF (ICHR.EQ.14) THEN
		IBOLD = 0	!NORMAL DISPLAY
		CALL SCR_WRTVALUE
		GOTO 10

C	---- IF CONTROL-V THEN REPAINT THE VALUES
	ELSE IF (ICHR.EQ.22) THEN
		CALL SCR_WRTVALUE
		GOTO 10

C	---- IF CONTROL-W THEN REPAINT THE SCREEN
	ELSE IF (ICHR.EQ.23) THEN
		CALL SCR_WRTSECT
		GOTO 10

C	---- IF CONTROL-Z THEN INPUT PHASE IS DONE, GET VALUES, BACK TO USER
	ELSE IF(ICHR.EQ.26)THEN
		ISTAT = LIB$SET_CURSOR(24,1)
		CALL SCR_DECVAL
		RETURN

	ELSE IF(ICHR.EQ.13) THEN 	!<CR>, TREAT AS "0" KEY
		GOTO 112 

C	---- NORMAL NON-ESCAPE CHARACTER
	ELSE IF(ICHR.NE.27)THEN
		IF (ICHR.LT.32 .OR. ICHR.GT.126) GOTO 10	!SKIP CONTROLS
		CALL SCR_PUTCHR(LOGMODE,ICHR)
		GOTO 10
	END IF

C	---- ESCAPE RECEIVED, GET THE REST OF THE ESCAPE SEQUENCE
	CALL SCR_RDCHR(ICHAN,ICHR)
	IF(ICHR.EQ.91)GOTO 2000		!ARROW KEY "ESC ["
	IF(ICHR.NE.79)GOTO 10		!UNKNOWN ESCAPE SEQUENCE ".NOT. ESC O"

C	---- READ THIRD CHAR FOR KEYPAD SEQUENCE
	CALL SCR_RDCHR(ICHAN,ICHR)
	IF(ICHR.EQ.77) GOTO 112 	!ENTER KEY, TREAT AS "0" KEY "ESC O M"

C	----	ESC O P THRU ESC O S IS PF KEYS
	IF(ICHR.LT.80.OR.ICHR.GT.83)GOTO 1000	!KEYPAD DECODING

C	---- PF KEYS
	GOTO (100,200,300,400)ICHR-79

C	--- PF1 KEY, SET GOLD ON
100	GOLD=.TRUE.
	IF(.NOT.LOGKEY)GOTO 10

C	---- GOLD FUNCTION PROCESSING
	CALL SCR_RDCHR(ICHAN,ICHR)
		IF(ICHR.NE.27)GOTO 10
	CALL SCR_RDCHR(ICHAN,ICHR)
		IF(ICHR.NE.79)GOTO 10
	CALL SCR_RDCHR(ICHAN,ICHR)
C
	IF (ICHR.EQ.80) GOTO 100	!GOLD GOLD, TREAT AS SINGLE GOLD

	IF(ICHR.EQ.81)THEN	!GOLD PF2, TREAT AS STRAIGHT HELP
		CALL SCR_KEYHELP(LOGMODE,LOGKEY)
		GOTO 10
	ENDIF
C
	IF(ICHR.EQ.82)THEN	!GOLD PF3, TREAT AS STRAIGHT TOGGLE KEYPAD
		LOGKEY=.FALSE.
		CALL SCR_KEYPAD(LOGKEY)
		GOTO 10
	ENDIF
C
	IF(ICHR.EQ.83)THEN	!GOLD PF4
		CALL SCR_UNDL(D_LINE,DL_LEN)	!UNDELETE LINE
		GOTO 10
	ENDIF
C
C	---- PROCESS KEYPAD KEYS
1000	IF (ICHR.EQ.77) GOTO 112	!GOLD ENTER IS JUST ENTER
	IF (ICHR.LT.108 .OR. ICHR.GT.121) GOTO 10	!SKIP OTHER KEY SEQ.
	GOTO(108,109,110,10,112,113,114,10,116,117,10,10,10,10)
     &		ICHR-107
C
C	---- "," KEY	ESC O l
108	IF(GOLD)CALL SCR_UNDC(D_CHR)
	IF(.NOT.GOLD)CALL SCR_DELC(D_CHR)
	GOTO 10
C
C	---- "-" KEY	ESC O m
109	IF(GOLD)CALL SCR_UNDL(D_WORD,DW_LEN)	!NOTE, WE USE UNDELETE LINE HERE
	IF(.NOT.GOLD)CALL SCR_DELW(D_WORD,DW_LEN)
	GOTO 10
C
C	---- "." KEY	ESC O n
110	IF(LOGMODE)THEN
		LOGMODE=.FALSE.
		GOTO 10
	ENDIF
	LOGMODE=.TRUE.
	GOTO 10
C
C	---- "0" KEY	ESC O p
112	CALL SCR_NEXTFLD(DIRECT)
	GOTO 10
C
C	---- "1" KEY	ESC O q
113	CALL SCR_NEXTWD(DIRECT)
	GOTO 10
C
C	---- "2" KEY	ESC O r
114	IF(GOLD)CALL SCR_DELL(D_LINE,DL_LEN)
	IF(.NOT.GOLD)CALL SCR_EOL(DIRECT)
	GOTO 10
C
C	---- "4" KEY	ESC O t
116	IF(GOLD)CALL SCR_BOTTOM
	IF(.NOT.GOLD)DIRECT=.TRUE.
	GOTO 10
C
C	---- "5" KEY	ESC O u
117	IF(GOLD)GOTO 1001
	IF(.NOT.GOLD)DIRECT=.FALSE.
	GOTO 10
C
C	---- PF2 KEY
200	CALL SCR_KEYHELP(LOGMODE,LOGKEY)
	GOTO 10
C
C	---- PF3 KEY
300	IF(LOGKEY)THEN
		LOGKEY=.FALSE.
		CALL SCR_KEYPAD(LOGKEY)
		GOTO 10
	ENDIF
	LOGKEY=.TRUE.
	CALL SCR_KEYPAD(LOGKEY)
	GOTO 10
C
C	---- PF4 KEY
400	IF(.NOT.LOGKEY)GOTO 10
	CALL SCR_DELL(D_LINE,DL_LEN)
	GOTO 10
C
C	---- ARROW KEY PROCESSING
2000	CALL SCR_RDCHR(ICHAN,ICHR)
	IF(ICHR.LT.65.OR.ICHR.GT.68)GOTO 10
	GOTO(2111,2113,2115,2117)ICHR-64

C	---- UP ARROW
2111	NLIN=ILIN-1
	IF(NLIN.LT.MINLIN)GOTO 1
	IF(LOGSCREEN(NLIN,ICOL))THEN
	  ILIN=NLIN
	  GOTO 1
	END IF
2112	DO I=ICOL,1,-1
	  IF(LOGSCREEN(NLIN,I))THEN
		ILIN=NLIN
		ICOL=I
		GOTO 1
	  END IF
	END DO
	DO I=ICOL,80,1
	  IF(LOGSCREEN(NLIN,I))THEN
		ILIN=NLIN
		ICOL=I
		GOTO 1
	  END IF
	END DO
	IF(NLIN-1.LT.MINLIN)GOTO 1
	NLIN=NLIN-1
	GOTO 2112

C	---- DOWN ARROR
2113	NLIN=ILIN+1
	IF(NLIN.GT.MAXLIN)GOTO 1
	IF(LOGSCREEN(NLIN,ICOL))THEN
	  ILIN=NLIN
	  GOTO 1
	END IF
2114	DO I=ICOL,1,-1
	  IF(LOGSCREEN(NLIN,I))THEN
		ILIN=NLIN
		ICOL=I
		GOTO 1
	  END IF
	END DO
	DO I=ICOL,80,1
	  IF(LOGSCREEN(NLIN,I))THEN
		ILIN=NLIN
		ICOL=I
		GOTO 1
	  END IF
	END DO
	IF(NLIN+1.GT.MAXLIN)GOTO 1
	NLIN=NLIN+1
	GOTO 2114

C	---- RIGHT ARROW
2115	NCOL=ICOL+1
	NLIN = ILIN
	IF(NCOL.GT.MAXCOL)THEN
		IF(ILIN+1.GT.MAXLIN)GOTO 1
		NLIN=ILIN+1
		NCOL=MINCOL
	END IF
2116	DO I=NCOL,80
	  IF(LOGSCREEN(NLIN,I))THEN
		ILIN=NLIN
		ICOL=I
		GOTO 1
	  END IF
	END DO
	IF(NLIN+1.GT.MAXLIN)GOTO 1
	NLIN=NLIN+1
	NCOL=MINCOL
	GOTO 2116

C	---- LEFT ARROW
2117	NCOL=ICOL-1
	NLIN = ILIN
	IF(NCOL.LT.MINCOL)THEN
		IF(ILIN-1.LT.MINLIN)GOTO 1
		NLIN=ILIN-1
		NCOL=MAXCOL
	END IF
2118	DO I=NCOL,1,-1
	  IF(LOGSCREEN(NLIN,I))THEN
		ILIN=NLIN
		ICOL=I
		GOTO 1
	  END IF
	END DO
	IF(NLIN-1.LT.MINLIN)GOTO 1
	NLIN=NLIN-1
	NCOL=MAXCOL
	GOTO 2118
	END
