C**********************************************************
      SUBROUTINE ERRPRC (SEVCOD,SUBNAM,ERRCOD,SUPLEN,SUPMSG,FILNAM)
C
C     ERRPRC IS THE ERROR MESSAGE HANDLER FOR STCSUB.
C
C     FATAL ERROR MESSAGES WILL BE OUTPUT TO LUN 1 OR LUN 2 DEPENDING
C     ON THE SETTING OF SENSE SWITCH 1. SETTING SENSE SWITCH 1
C     WILL ALLOW OUTPUT ON LUN 1, CLEARING SENSE SWITCH 1 WILL
C     ALLOW OUTPUT ON LUN 2.
C
C     NON-FATAL ERROR MESSAGES WILL BE OUTPUT TO LUN 1
C     WHICH WILL BE DYNAMICALLY ASSIGNED TO ITS TASK-BUILT
C     LUN OR TO MASS STORAGE FILE 'TASKNAME.ERR' DEPENDING ON
C     THE SETTING OF SENSE SWITCH 2. SETTING SENSE SWITCH
C     2 WILL ALLOW OUTPUT ON THE TASK-BUILT LUN, CLEARING
C     SENSE SWITCH 2 WILL ALLOW OUTPUT ON THE MASS STORAGE FILE
C     'TASKNAME.ERR'.
C
C     AT TASK BUILD TIME LUN 1 SHOULD BE ASSIGNED TO 'TI'
C                        LUN 2 SHOULD BE ASSIGNED TO 'CO'.
C
C     SEVCOD= SEVERITY CODE.
C     FOR SEVCOD='N' NON-FATAL, ERRPRC WILL RETURN TO ITS CALLER
C     OTHERWISE ERRPRC WILL EXIT.
C
C     SUBNAM= CALLING SUBROUTINE NAME.
C
C     ERRCOD= ERROR CODE.
C
C     SUPLEN= LENGTH OF SUPPLEMENTARY MESSAGE.
C     FOR SUPLEN=0 NO SUPPLEMENTARY MESSAGE IS OUTPUT.
C
C     SUPMSG= SUPPLEMENTARY MESSAGE ADDRESS.
C
C     FOR SUBNAM='FMSIO ' THE OPTIONAL SIXTH PARAMETER
C     WILL BE OUTPUT TO IDENTIFY THE MASS STORAGE FILE WHICH IS
C     INVOLVED IN THE ERROR.
C
      EXTERNAL THTASK
      BYTE SEVCOD,SUBNAM(6),SUPMSG(1)
      REAL FILNAM,THTASK,ERRFIL(7)
      INTEGER ERRCOD,SUPLEN,PUDARR(6,2),TTYLUN,TSW,SUPLMT,SUPSRT,SUPEND,
     1FIRST,OPLUN,SWT1,SWT2,COLUN,FALUN,ERROR(3),FILERR
      BYTE DATARR(9),TIMARR(8),TSKNAM(6),CFMS(6),CTHT(6),ERRFBY(28)
      EQUIVALENCE (ERRFIL,ERRFBY)
      DATA ERRFIL/'DB1:','[100',',100',']UDF','TSK.','ERR;','1   '/
      DATA ERRFBY(26)/"0/
C
C     INDIVIDUAL ELEMENTS OF ERRFIL MAY BE ALTERED BY SUPPLYING
C     DATA STATEMENTS FOR THE BYTE ARRAY ERRFBY.
C
      DATA FIRST/0/
      DATA FALUN/2/
      DATA ERRDAT/0/
      DATA CFMS/'F','M','S','I','O',' '/
      DATA CTHT/'T','H','T','A','S','K'/
      IF (FIRST.NE.0) GOTO 5
	FIRST=1  !  SET FIRST FLAG INCASE R50ASC HAS FATAL ERROR
      CALL R50ASC (6,THTASK (),ERRFBY(14))
      DO 3 I=14,19
      IF (ERRFBY(I).EQ.'.') ERRFBY(I)=' '
    3 CONTINUE
      CALL SSWTCH (1,SWT1)
      CALL SSWTCH (2,SWT2)
      IF (SWT1.EQ.1) FALUN=1
      CALL GETLUN (1,PUDARR(1,1))
      TTYLUN=IAND ("000377,PUDARR(2,1))
      CALL GETLUN (2,PUDARR(1,2))
      COLUN=IAND ("000377,PUDARR(2,2))
    5 CALL TIME (TIMARR)
      CALL DATE (DATARR)
      FILERR=0
      TSW=0
      DO 10 I=1,6
      IF (SUBNAM(I).EQ.CFMS(I)) TSW=TSW+1
      IF (SUBNAM(I).EQ.CTHT(I)) TSW=TSW+10
   10 TSKNAM(I)=' '
      IF (SWT2.EQ.1.OR.SEVCOD.NE.'N') GOTO 21
      IF (ERRDAT.EQ.1) CLOSE (UNIT=2,ERR=12)
   12 OPEN (UNIT=2,NAME=ERRFIL,TYPE='OLD',ACCESS='APPEND',
     1ERR=17)
      ERRDAT=2
      GOTO 41
   17 CALL ERRSNS (ERROR(1),ERROR(2),ERROR(3))
      IF (ERROR(1).EQ.29) GOTO 19
      IF (ERROR(3).EQ.0.AND.ERROR(2).EQ.-29) GOTO 18
      IF (ERROR(3).EQ.0.AND.ERROR(2).EQ.-27) GOTO 18
      FILERR=1
      ERRDAT=2
      GOTO 21
   18 CALL WAIT (250,1,ERROR(1))
      GOTO 17
   19 OPEN (UNIT=2,NAME=ERRFIL,RECORDSIZE=80,INITIALSIZE=100,
     1ERR=17)
      ERRDAT=2
      GOTO 41
   21 IF (ERRDAT.NE.2) GOTO 41
      CALL ASNLUN (2,PUDARR(1,2),COLUN)
      ERRDAT=1
   41 OPLUN=2
      IF (SWT2.EQ.1) OPLUN=1
      IF (SEVCOD.NE.'N'.OR.FILERR.EQ.1) OPLUN=FALUN
   42 IF (TSW.NE.60) CALL R50ASC (6,THTASK (),TSKNAM)
      WRITE (OPLUN,100) DATARR,TIMARR,PUDARR(1,1),TTYLUN,TSKNAM,SUBNAM,
     1ERRCOD
  100 FORMAT ('0STCSUB ',9A1,X,8A1,X,A2,O2,2(X,6A1),' ERROR=',I4)
      IF (TSW.NE.6) GOTO 20
      WRITE (OPLUN,200) FILNAM
  200 FORMAT (8X,'FILE=',A4,'DAT')
   20 IF (FILERR.NE.0) WRITE (OPLUN,400) ERRFIL
  400 FORMAT (8X,'MESSAGE DIVERTED FROM ',6A4,A1)
      IF (SUPLEN.LE.0) GOTO 40
      SUPLMT=SUPLEN
      SUPSRT=1
   30 SUPEND=SUPSRT+59
      IF (SUPEND.GT.SUPLMT) SUPEND=SUPLMT
      WRITE (OPLUN,300) (SUPMSG(I),I=SUPSRT,SUPEND)
  300 FORMAT (8X,60A1)
      SUPSRT=SUPSRT+60
      IF (SUPSRT.LE.SUPLMT) GOTO 30
   40 IF (ERRDAT.EQ.2) CLOSE (UNIT=2,ERR=50)
   50 IF (SEVCOD.NE.'N') CALL ABORT ()
      RETURN
      END	!OF ERRPRC

C**********************************************************
      SUBROUTINE SOTSER
C
C     SOTSER WILL CONDITIONALLY SUPPRESS THE PRINTING OF FORTRAN
C     OTS ERROR MESSAGES ON 'TI'. CLEARING SENSE SWITCH 0 WILL
C     CAUSE SOTSER TO SUPPRESS THE PRINTING OF ERROR MESSAGES.
C
      INTEGER SWT0
      CALL SSWTCH (0,SWT0)
      IF (SWT0.EQ.1) GOTO 60
      DO 10 I=1,14
      IF (I.EQ.3) GOTO 10
      CALL ERRSET (I,,,,.FALSE.,)
   10 CONTINUE
      DO 20 I=20,44
      IF (I.EQ.35.OR.I.EQ.36) GOTO 20
      CALL ERRSET (I,,,,.FALSE.,)
   20 CONTINUE
      DO 30 I=60,75
      IF (I.EQ.68.OR.I.EQ.69) GOTO 30
      CALL ERRSET (I,,,,.FALSE.,)
   30 CONTINUE
      DO 40 I=80,91
      IF (I.EQ.87.OR.I.EQ.88.OR.I.EQ.89) GOTO 40
      CALL ERRSET (I,,,,.FALSE.,)
   40 CONTINUE
      DO 50 I=100,101
      CALL ERRSET (I,,,,.FALSE.,)
   50 CONTINUE
   60 RETURN
      END	!OF SOTSER

C**********************************************************
      REAL FUNCTION THTASK 
C
C     THTASK WILL RETURN ITS CALLER'S TASK NAME IN RADIX-50 FORMAT.
C
C     CO ERROR CODES- GTSK$ DIRECTIVE STATUS CODE.
C
      REAL REC(8)
      INTEGER DSW
      CALL GETTSK (REC,DSW)
      THTASK=REC(1)
      IF (DSW.EQ.1) GOTO 10
      CALL ERRPRC ('F','THTASK',DSW,0)
   10 RETURN
      END	!OF THTASK

C**********************************************************
      INTEGER FUNCTION THTERM
C
C     THTERM WILL RETURN THE UNIT NUMBER FOR LUN 1 IN
C     INTEGER FORMAT.
C
C     LUN 1 SHOULD BE ASSIGNED TO 'TI' AT TASK BUILD TIME FOR
C     STCSUB SUPPORTED TASKS.
C
      INTEGER PUDARR(6)
      CALL GETLUN (1,PUDARR)
      THTERM=IAND ("000377,PUDARR(2))
      RETURN
      END	!OF THTERM

