C	PROGRAM TO TEST HDS CONTROL SEQUENCES
	PARAMETER (NULL=0,IESC=27,ISUB=26,IENQ=5,IGS=29)
	REAL*4 XCURS,YCURS
	BYTE BUFF(80),B1,B2,BX(2),BY(2)
	CHARACTER*80 CBUFF,STRING,KEY*1
	LOGICAL DONE
	EQUIVALENCE (XCURS,BX),(YCURS,BY)
	DATA NBUFF/6/
	
	WRITE(6,*) 'TESTING HDS ESCAPE SEQUENCES'
!	Enter Tektronix 4014 Mode
	WRITE(*,FMT='(2A1,A)') NULL,IESC,'[?38h'	! Enter 4014 mode
100	FORMAT(10A1)
	WRITE(*,FMT='(2A1)') NULL,IGS		! Enter graphics mode

1	CONTINUE
	WRITE(*,FMT='(3A1)') NULL,IESC,ISUB	! Enter GIN mode
	nchar = 0
C  look for escape sequence back from terminal
	nchar = 0
	B2 = 0
	DONE = .FALSE.
	DO WHILE (.NOT. DONE )
		CALL INCHAR(B2,.FALSE.,.TRUE.,.FALSE.,IERR)
		IF(IERR .EQ. 0) THEN
			NCHAR = NCHAR + 1
			BUFF(NCHAR) = B2
		END IF
	  IF(NCHAR .GT. 1 .AND. B2 .EQ. 13) DONE = .TRUE.
	  IF(NCHAR .GT. NBUFF) DONE = .TRUE.
	END DO
	WRITE(1,*) 'inchar returned:',(BUFF(I),I=1,NCHAR)
	IF(BUFF(1) .GE. 32 .AND. BUFF(1) .LE. 126) THEN
	  KEY = CHAR(BUFF(1))
	  CALL STR$UPCASE(KEY,KEY)
	ELSE
	  KEY = ' '
	END IF
	XCURS = BUFF(2) - 32	! Convert to Integer*4
	XCURS = 32*(XCURS) + BUFF(3) - 32
	YCURS = BUFF(4) - 32	! Convert to INTEGER*4
	YCURS = 32*(YCURS) + BUFF(5) - 32
	WRITE(1,*) 'KEY, XCURS, YCURS =',KEY,XCURS,YCURS

!	Exit Graphics, Enter VT220, 7 bit Mode
C	WRITE(*,FMT='(2A1,A)') NULL,IESC,'[=25h'	! Blank GraphMemory
C	WRITE(*,FMT='(2A1,A)') NULL,IESC,'[?38l'	! Exit 4014 mode
C	WRITE(6,*) 'inchar returned:',(BUFF(I),I=1,NCHAR)
!	Enter Tektronix 4014 Mode
C	WRITE(*,FMT='(2A1,A)') NULL,IESC,'[?38h'	! Enter 4014 mode

	IF( KEY .EQ. 'Q' .OR. KEY .EQ. 'E') GOTO 900
	GOTO 1

!	Exit Graphics, Enter VT220, 7 bit Mode
900	WRITE(*,FMT='(2A1,A)') NULL,IESC,'[=25h'	! Blank GraphMemory
	WRITE(*,FMT='(2A1,A)') NULL,IESC,'[?38l'	! Exit 4014 mode
	STOP 'DONE'
	END
C---------------- INCHAR INFO
C
C------------------------------------------------------------------------
C      SUBROUTINE INCHAR (BUF,ECHO,WAIT,CHECK,ERR)
C------------------------------------------------------------------------
c
c- WAIT - logical - tell the routine whether to wait for the char
c- to be typed, or to simply setup the qio for later
c  wait = .true. means routine will no return until 
c
c- CHECK - logical - only makes sense when wait = .false.
c- if check = .true. will set up any required qio and look
c- to see if we have had a char
c- if check = .false. will set up required qio as necessary,-
c- but returns straight away
c
c- ERR i*2 0 if buf contains a character
c-        -2 if returned without char
c- uses local event flag 1
