C  CAG - COC ACTIVITY GRAPH                   PROGRAMMER - PAUL STENDAL CAG    1
C     CAG PERIODICALLY SAMPLES NUMEROUS COC-ORIENTED PARAMETERS, THEN   CAG    2
C     GENERATES HISTOGRAMS AND SUMMARIES OF THE FOLLOWING:              CAG    3
C        1  NUMBER OF LINES LOGGED ON                                   CAG    4
C        2  NUMBER OF LINES SLEEPING                                    CAG    5
C        3  ACTUAL (OBSERVED) SAMPLING PERIOD                           CAG    6
C        4  NUMBER OF COC BUFFERS IN USE                                CAG    7
C        5  NUMBER OF LINES WITH INPUT BUFFERS                          CAG    8
C        6  NUMBER OF LINES WITH READ PENDING                           CAG    9
C        7  NUMBER OF BUFFERS USED FOR INPUT                            CAG   10
C        8  NUMBER OF CHARACTERS INPUT PER SECOND                       CAG   11
C        9  NUMBER OF CHARACTERS PER READ CAL                           CAG   12
C        10 NUMBER OF LINES WITH OUTPUT BUFFERS                         CAG   13
C        11 NUMBER OF BUFFERS USED FOR OUTPUT                           CAG   14
C        12 NUMBER OF OUTPUT CHARACTERS IN BUFFERS                      CAG   15
C        13 NUMBER OF CHARACTERS PER WRITE CAL                          CAG   16
C        14 NUMBER OF CHARACTERS TRANSMITTED PER SECOND                 CAG   17
C        15 NUMBER OF USERS BLOCKED ON TERMINAL OUTPUT (STOB/STOBO)     CAG   18
C     THE USER SPECIFIES THE RANGE OF LINES TO SAMPLE, SAMPLE PERIOD,   CAG   19
C     NUMBER OF SAMPLES, AND NUMBER OF BUFFERS PER GRAPH DIVISION.      CAG   20
C     WHEN PROMPTED FOR THE RANGE OF LINE NUMBERS, ENTERING ONLY A COMMACAG   21
C     IMPLIES ALL LINES.  DEPRESSING THE BREAK KEY TERMINATES SAMPLING  CAG   22
C     AND STARTS THE GRAPHING PROCESS.                                  CAG   23
     *BUFCNT,LNOL,HRBA,COCBUF,SOUIS,COCIR,COCOR,COCOI,COCOC,CHDLI,CHDLO,CAG   25
     *SLTB,SLUB,SLONCB,MODE,CCTUN,COCBUFS,TL,STOB,STOBO                 CAG   26
      GLOBAL NO(0:255,13), TNO(13), SCL(13),                            CAG   27
     *TIMEBUF(24), MSM(3,13), SCHDLI(0:13), SCHDLO(0:13)                CAG   28
      DATA FIRST,NO,TNO/0/,SCL/1,1,1,1,1,25,5,10,1,1,1000,1,1/,         CAG   29
     *MSM/999999,0,-999999/                                             CAG   30
      OUTPUT 'LINE # RANGE (DEC OR , FOR ALL)  '; INPUT FIRST, LAST     CAG   31
      LAST=MIN(LI(LNOL)-1,LAST); IF(LAST.EQ.0) LAST=LI(LNOL)-1          CAG   32
      OUTPUT 'SAMPLE INTERVAL (IN 1.2 SEC UNITS)  '; INPUT PERIOD       CAG   33
   20 OUTPUT 'NUMBER OF SAMPLES  '; INPUT MAXSAMP                       CAG   34
      AVAIL=LI(HRBA)/4; SCL(11)=(PERIOD+1)*500                          CAG   35
   30 OUTPUT 'NUMBER OF BUFFERS PER GRAPH DIVISION  '; INPUT SCL(4)     CAG   36
      SCL(10)=SCL(5)=SCL(4)                                             CAG   37
      IF(AVAIL/SCL(4).GT.255) WRITE(108,1030) (AVAIL/256)+1; GOTO 30    CAG   38
      CALL INTTRC(100S); CALL TRUNCATE                                  CAG   39
      LTIM=FTIM=LW(CCTUN)-LW(CTINC)+LW(CTIC)                            CAG   40
      LCCI=FCCI=LW(CCI); LCCO=FCCO=LW(CCO)                              CAG   41
      DO 35 I=0,13; SCHDLI(I)=LH(CHDLI,I+2)                             CAG   42
   35 SCHDLO(I)=LH(CHDLO,I+2)                                           CAG   43
      DO 60 SMP=0,MAXSAMP-1; CALL WAIT(PERIOD)                          CAG   44
      CTIM=LW(CCTUN)-LW(CTINC)+LW(CTIC); TNO(11)=(DTIM=CTIM-LTIM)*2     CAG   45
      LTIM=CTIM; CCCI=LW(CCI); DCCI=CCCI-LCCI; LCCI=CCCI                CAG   46
      TNO(7)=TNO(7)+DCCI*500/DTIM; TNO(8)=TNO(8)+DCCO*500/DTIM          CAG   48
      TNO(4)=TNO(4)+LW(COCBUFS)                                         CAG   49
      DO 50 I=FIRST,LAST                                                CAG   50
      OUTCHARS=MAX(0,LH(COCOC,I)-1); TNO(6)=TNO(6)+OUTCHARS             CAG   51
      TNO(5)=TNO(5)+(OUTCHARS+11+IAND(LH(COCOR,I),1ZF))/14              CAG   52
      TNO(10)=TNO(10)+LB(BUFCNT,I); IF(LH(TL,I).GT.0) TNO(10)=TNO(10)+1 CAG   53
      UN=LB(LBUN,I); US=LB(UBUS,UN)                                     CAG   54
      IF(US.EQ.LI(SW)) TNO(9)=TNO(9)+1                                  CAG   55
      IF(US.EQ.LI(STOB).OR.US.EQ.LI(STOBO)) TNO(13)=TNO(13)+1           CAG   56
      IF(UN.NE.0) TNO(1)=TNO(1)+1                                       CAG   57
      IF(LH(COCIR,I).GT.0) TNO(2)=TNO(2)+1                              CAG   58
      IF(LH(COCOR,I).GT.0) TNO(3)=TNO(3)+1                              CAG   59
      IF(IAND(LB(MODE,I),2Z10).NE.0) TNO(12)=TNO(12)+1                  CAG   60
   50 CONTINUE                                                          CAG   61
      DO 60 J=1,13                                                      CAG   62
      CALL RECORD1(MAX(0,TNO(J)),NO(0,J),255,SCL(J),MSM(1,J))           CAG   63
   60 TNO(J)=0                                                          CAG   64
  100 CALL INTTRC(1040S);DO 120 I=0,13;SCHDLI(I)=LH(CHDLI,I+2)-SCHDLI(I)CAG   65
  120 SCHDLO(I)=LH(CHDLO,I+2)-SCHDLO(I)                                 CAG   66
      CALL ITIME(TIMEBUF); WRITE(108,1040) (TIMEBUF(I),I=1,16),         CAG   67
     *LW(SLTB), LW(SLUB), LW(SLONCB)                                    CAG   68
      CALL WRT('($ NUMBER OF LINES LOGGED ON$/)')                       CAG   69
      CALL WRT('($ NUMBER OF LINES SLEEPING$/)')                        CAG   71
      CALL GRAPH1(' # LINESSLEEPING',NO(0,9),255,SCL(9),MSM(1,9),SMP,0) CAG   72
      CALL WRT('($ ACTUAL (OBSERVED) SAMPLING PERIOD$/)')               CAG   73
      CALL GRAPH1('  PERIODMILLISEC',NO(0,11),255,SCL(11),MSM(1,11),SMP,CAG   74
     *0)                                                                CAG   75
      CALL WRT('($ NUMBER OF COC BUFFERS IN USE$/)')                    CAG   76
      CALL GRAPH1(' BUFFERS  IN USE',NO(0,4),255,SCL(4),MSM(1,4),SMP,0) CAG   77
  230 DO 240 I=LI(HRBA),4,-4                                            CAG   78
  240 IF(LW(COCBUF,I+1)+LW(COCBUF,I+2)+LW(COCBUF,I+3).NE.0) GOTO 250    CAG   79
  250 WRITE(108,1020) (W=(MAX(8,2*LOG10(MSM(3,4)+1)+4))), AVAIL, W, I/4 CAG   80
      CALL WRT('($ NUMBER OF LINES WITH INPUT BUFFERS$/)')              CAG   81
      CALL GRAPH1(' # LINES   INPUT',NO(0,2),255,SCL(2),MSM(1,2),SMP,0) CAG   82
      CALL WRT('($ NUMBER OF LINES WITH READ PENDING$/)')               CAG   83
      CALL GRAPH1('  # READ PENDING',NO(0,12),255,SCL(12),MSM(1,12),SMP,CAG   84
     *0)                                                                CAG   85
      CALL WRT('($ NUMBER OF BUFFERS USED FOR INPUT$/)')                CAG   86
      CALL GRAPH1(' # INPUT BUFFERS',NO(0,10),255,SCL(10),MSM(1,10),SMP,CAG   87
     *0)                                                                CAG   88
      CALL WRT('($ NUMBER OF CHARACTERS INPUT PER SECOND$/)')           CAG   89
      CALL GRAPH1(' # CHARS  IN/SEC',NO(0,7),255,SCL(7),MSM(1,7),SMP,0) CAG   90
      CALL WRT('($ NUMBER OF CHARACTERS PER READ CAL$/)')               CAG   91
      CALL GRAPH2('  IN REC  LENGTH',SCHDLI,13,5,0)                     CAG   92
      CALL GRAPH1(' # LINES  OUTPUT',NO(0,3),255,SCL(3),MSM(1,3),SMP,0) CAG   94
      CALL WRT('($ NUMBER OF BUFFERS USED FOR OUTPUT$/)')               CAG   95
      CALL GRAPH1('# OUTPUT BUFFERS',NO(0,5),255,SCL(5),MSM(1,5),SMP,0) CAG   96
      CALL WRT('($ NUMBER OF OUTPUT CHARACTERS IN BUFFERS$/)')          CAG   97
      CALL GRAPH1(' # CHARSBUFFERED',NO(0,6),255,SCL(6),MSM(1,6),SMP,0) CAG   98
      CALL WRT('($ NUMBER OF CHARACTERS PER WRITE CAL$/)')              CAG   99
      CALL GRAPH2(' OUT REC  LENGTH',SCHDLO,13,5,0)                     CAG  100
      CALL WRT('($ NUMBER OF CHARACTERS TRANSMITTED PER SECOND$/)')     CAG  101
      CALL GRAPH1(' # CHARS OUT/SEC',NO(0,8),255,SCL(8),MSM(1,8),SMP,0) CAG  102
      CALL WRT('($ NUMBER OF LINES BLOCKED ON OUTPUT (STOB/STOBO)$/)')  CAG  103
      CALL GRAPH1(' # LINESOUT BLKD',NO(0,13),255,SCL(13),MSM(1,13),SMP,CAG  104
     *0)                                                                CAG  105
      OUTPUT ' ',' '                                                    CAG  106
 1020 FORMAT(IN'   = # AVAILABLE'/IN'   = MAXIMUM # EVER IN USE')       CAG  107
 1030 FORMAT(' CAN''T BE GREATER THAN 'I4)                              CAG  108
 1040 FORMAT('1'//X16A1'   TB ='I4'   UB ='I3'   ONCB ='I4)             CAG  109
      SUBROUTINE WRT(FRMT); WRITE(108,1050); WRITE(108,FRMT); RETURN    CAG  110
 1050 FORMAT(//'1'); END                                                CAG  111
