	SUBROUTINE WRTSCR
C Routine to update dynamic areas of the screen
C This routine minimizes the number of characters sent to the terminal
C by comparing against the currently displayed screen
C This routine is called at the end of each update cycle
	IMPLICIT REAL*8 (A-Z)
	INCLUDE 'ARRAYS.INC/NOLIST'
	INTEGER*4 ISTAT,SYS$QIOW
	INTEGER*4 IPT,IX,IY
	LOGICAL*1 SET_CURSOR
	INTEGER*4 I
C
	IPT = 1
C
C See if any bells are to go in the output buffer
C If the user has enabled bells, then put them in the output buffer
C
	IF(BELL_COUNT.GT.0) THEN
	  IF(BELL_OK) THEN
	    DO I = 1,BELL_COUNT
	      VTBUFF(I) = CHAR_BELL
	    ENDDO
	    IPT = IPT + BELL_COUNT
	    BELL_COUNT = 0
	  ENDIF
	ENDIF
CD	WRITE(15,*) SCREEN_MINY,SCREEN_MAXY,SCREEN_MINX,SCREEN_MAXX
C Compare the new screen against the old
	DO IY = SCREEN_MINY,SCREEN_MAXY
	  SET_CURSOR = .TRUE.
	  DO IX = SCREEN_MINX,SCREEN_MAXX
CD	    WRITE(15,900) IX,IY,SCREEN_ARY(IX,IY,1),SCREEN_ARY(IX,IY,2)
CD900	    FORMAT(' ',4I10)
	    IF(SCREEN_ARY(IX,IY,POINT_NEW).NE.
     1	       SCREEN_ARY(IX,IY,POINT_OLD)) THEN
C This screen location has changed - store a 'set cursor' escape
C sequence if necessary (i.e. if this location is not exactly one
C position to the right of the previous changed location)
	      IF(SET_CURSOR) THEN
		CALL SETCUR(IPT,IY,IX,VTBUFF)
		SET_CURSOR = .FALSE.
	      ENDIF
C Store the displayable character in the buffer
	      VTBUFF(IPT) = SCREEN_ARY(IX,IY,POINT_NEW)
	      IF (IPT.GT.END_VTBUFF) THEN
C Buffer is full - send it and reset pointer for more
		ISTAT = SYS$QIOW(%VAL(EFN_WRITE),%VAL(ICHAN),
     1		    %VAL(WRITE_FUNC),,,,VTBUFF,%VAL(IPT),,
     2		    %VAL(NO_CARRIAGE_CONTROL),,)
		IPT = 0
	      ENDIF
	      IPT = IPT + 1
	    ELSE
	      SET_CURSOR = .TRUE.
	    ENDIF
	  ENDDO
	ENDDO
C See if the score has changed, and display it if so
	IF(SCORE(POINT_NEW).NE.SCORE(POINT_OLD)) THEN
	  CALL SETCUR(IPT,SCORE_VALU_Y,SCORE_VALU_X,VTBUFF)
	  ENCODE(5,902,VTBUFF(IPT)) SCORE(POINT_NEW)
902	  FORMAT(I5)
	  IPT = IPT + 5
	  SCORE(POINT_OLD) = SCORE(POINT_NEW)
	  IF(SCORE(POINT_NEW).GT.DIFV_SCORE(DIF_LEVEL)) THEN
C Increment difficulty - incrementing of lives and new life value
C occurs in INCRDIFF - so see if these have changed
	    CALL INCRDIFF
	  ENDIF
C See if the 'Bonus Life' value should change
	  IF(SCORE(POINT_NEW).GT.NEWLIFE(POINT_NEW)) THEN
	    NEWLIFE(POINT_NEW) = NEWLIFE(POINT_NEW) + DIF_NULIFE
	    IF(LIVES(POINT_NEW).LT.MAX_LIVES) THEN
	      LIVES(POINT_NEW) = LIVES(POINT_NEW) + 1
	    ENDIF
	  ENDIF
C See if the 'Bonus Life' value has changed, and display it if so
	  IF(NEWLIFE(POINT_NEW).NE.NEWLIFE(POINT_OLD)) THEN
	    CALL SETCUR(IPT,NULIF_VALU_Y,NULIF_TEXT_X,VTBUFF)
	    ENCODE(5,902,VTBUFF(IPT)) NEWLIFE(POINT_NEW)
	    IPT = IPT + 5
	    NEWLIFE(POINT_OLD) = NEWLIFE(POINT_NEW)
	  ENDIF
	ENDIF
C See if the 'Lives Left' has changed, and display it if so
	IF(LIVES(POINT_NEW).NE.LIVES(POINT_OLD)) THEN
	  CALL SETCUR(IPT,LIVES_VALU_Y,LIVES_VALU_X,VTBUFF)
	  ENCODE(5,903,VTBUFF(IPT)) LIVES(POINT_NEW)
903	  FORMAT(I1)
	  IPT = IPT + 1
	  LIVES(POINT_OLD) = LIVES(POINT_NEW)
	ENDIF
C Finally, set the cursor at the top line of the scroll region, which
C is at the bottom of the screen, and send the buffer to the terminal
	CALL SETCUR(IPT,SCROLL_TOP,1,VTBUFF)
	ISTAT = SYS$QIOW(%VAL(EFN_WRITE),%VAL(ICHAN),%VAL(WRITE_FUNC),
     1		,,,VTBUFF,%VAL(IPT-1),,%VAL(NO_CARRIAGE_CONTROL),,)
D	WRITE(16,*) 'NEW VTBUFF FOLLOWS'
D	DO 300 I = 1,IPT-1
D	WRITE(16,901) VTBUFF(I)
D901	FORMAT(' ',A1)
D300	CONTINUE
	RETURN
	END
