FTN4
      PROGRAM CTRAC (3,2),92082-16001 REV.2001 800129 
C 
C 
C 
C 
C 
C     DATE: 10-06-79
C     NAME: CTRAC 
C     SOURCE: 92082-18001 
C     RELOC:  92082-16001 
C     PGMR: C.M.M.
C 
C  ***************************************************************
C  * (C) COPYRIGHT HEWLETT-PACKARD COMPANY 1980.  ALL RIGHTS     *
C  * RESERVED.  NO PART OF THIS PROGRAM MAY BE PHOTOCOPIED,      *
C  * REPRODUCED OR TRANSLATED TO ANOTHER PROGRAM LANGUAGE WITHOUT*
C  * THE PRIOR WRITTEN CONSENT OF HEWLETT-PACKARD COMPANY.       *
C  ***************************************************************
C 
C 
C 
C 
C 
C     THE CTRAC PROGRAM ALONG WITH THE CPLOT PROGRAM PROVIDE THE USER 
C     WITH THE ABILITY TO PERFORM AN ANALYSIS OF ANY PROGRAM WRITTEN
C     IN ANY LANGUAGE RUNNING ON AN RTE4 SYSTEM.
C 
C     THE BASIC IDEA BEHIND THE PROGRAM IS TO SAMPLE THE POINT OF 
C     SUSPENSION WORD IN THE TEST PROGRAMS ID SEGMENT.  THIS IS DONE
C     EVERY 10 MILLISECONDS.  THE DATA IS GATHERED ALONG WITH THE 
C     CURRENTLY ACTIVE ID SEGMENT AND STORED OUT ON A DISC FILE.  THE 
C     DATA CAN THEN BE LOOKED AT LATER WITH THE CPLOT PROGRAM TO GET
C     AN EXECUTION TIME PROFILE OF THE PROGRAM. 
C 
C 
C 
C 
      DIMENSION ISTRNG(40),INAME(3),IDCB(528),IBUF(1024),IPBUF(10)
      DIMENSION IFILE(20),IYES(7),IEXIST(35),ISTATE(3),IDBUF(109) 
      DIMENSION IGO(5),ISS(5),ISTART(5),ISTOP(5),MYNAME(24) 
      INTEGER YESNO,BRKBIT(8) 
      LOGICAL IEXIT 
C 
      DATA ISTATE/1,2,3/
      DATA MYNAME/2H  ,2HEN,2HTE,2HR ,2HA ,2H' ,2HGO,2H, ,2H  ,2H  ,
     &            2H  ,2H  ,
     &            2H' ,2HTO,2H S,2HTA,2HRT,2H T,2HHE,2H A,2HNA,2HLY,
     &            2HSI,2HS./
C 
      DATA BRKBIT/2H  ,2H ',2H B,2HR,,2H  ,2H  ,2H  ,2H '/
      DATA IGO/2HGO,2H, ,2H  ,2H  ,2H  /
      DATA ISS/2HSS,2H, ,2H  ,2H  ,2H  /
      DATA IEXIST/2H  ,2HFI,2HLE,2H  ,2H  ,2H  ,2H  ,2H  ,2HEX,2HIS,
     &            2HTS,2H O,2HN ,2HLU,2H  ,2H  ,2H  ,2H  ,2H .,2H  ,
     &            2HOK,2H T,2HO ,2HOV,2HER,2HLA,2HY ,2HIT,2H ?/ 
      DATA IYES/  2H  ,2HYE,2HS ,2HOR,2H N,2HO ,2H?_/ 
C 
      ISPACE(IDUM) = EXEC(2,LU,2H  ,1)
      IKVT(IERR) = 2H00 + (IERR/10*256) + MOD(IERR,10)
C 
C     GET THE INTERACTIVE LU #
C 
      LU = LOGLU(LU)
      LUREAL = LUTRU(LU)
      LU = LU + 400B
C 
C     GET THE INTERACTIVE TTY EQT ADDRESS 
C 
      IEQT = IAND(IXGET(IXGET(1652B)+LUREAL -1),77B) - 1
      IEQT = (IEQT * 15) + IXGET(1650B) 
C 
C 
C 
      CALL REIO(2,LU,60H  THE RTE PROFILE MONITOR    -    DATA COLLECTIO
     &N SECTION !!,-60) 
      CALL REIO(2,LU,48H  ENTER ' EX ' AT ANY TIME TO EXIT THIS PROGRAM.
     &,-48) 
C 
C                   FIND OUT IF I'M GOING TO RUN THE PROGRAM
C                              OR IF HE IS. 
C 
C 
C 
5     IA = ISPACE(IDUM) 
      IA = ISPACE(IDUM) 
      CALL REIO(2,LU,70H  DO YOU WANT ME TO TAKE CARE OF ALL OF THE DETA
     &ILS OF SCHEDULING AND ,-70) 
      CALL REIO(2,LU,24H  RUNNING YOUR PROGRAM ?, -24)
      CALL REIO(2,LU,IYES,7)
      CALL REIO(1,LU,IFILE,2) 
      IF(IEXIT(IFILE)) GO TO 9999 
      IF(YESNO(IFILE).EQ.0)  GO TO 5
      IF(IFILE .EQ. 2HYE) GO TO 10
C 
C 
C                   HE WANTS TO SCHEDULE THE PROGRAM HIMSELF. 
C                   SET FLAGS AS :
C                                   MYRUN = 0  , HE RUNS PROGRAM HIMSELF
C                                         = 1  ,  I RUN THE PROGRAM 
C                                  IPAUSE = 0  , PAUSE MYSELF TO GIVE 
C                                                HIM A CHANCE TO START
C                                                HIS PROGRAM. 
C                                         = -1   START TAKING DATA
C                                                IMMEDIATELY
C 
C 
C 
      MYRUN = 0 
      IPAUSE = 0
C 
C 
C                   GET THE PROGRAM NAME
C 
      IA = ISPACE(IDUM) 
      CALL REIO(2,LU,54H  ENTER THE NAME OF THE PROGRAM YOU WISH TO PROF
     &ILE. _,-54) 
C 
      CALL REIO(1,LU,ISTRNG,-40)
      CALL ABREG(IA,IB) 
      IONE = 1
      GO TO 20
C 
C 
10    IA = ISPACE(IDUM) 
      MYRUN = 1 
      CALL REIO(2,LU,44H  ENTER PROGRAM RUN STRING AS:  RU,PROG,....,22)
      CALL REIO(1,LU,ISTRNG,-40)
      CALL ABREG(IA,IB) 
      IMLEN = IB
      IONE = 1
      CALL NAMR(IPBUF,ISTRNG,IB,IONE) 
      IF(IEXIT(IPBUF)) GO TO 9999 
      IF(IPBUF .NE. 2HRU) GO TO 10
C 
C     GET THE PROGRAM NAME
C 
20    IF(NAMR(IPBUF,ISTRNG,IB,IONE) .LT.0) GO TO  5 
      IF (MYRUN .EQ.1)  GO TO 25
      IF(IEXIT(IPBUF)) GO TO 23 
      GO TO 25
23    IF(IPBUF(2).EQ. 2H  ) GO TO 9999
25    INAME = IPBUF 
      INAME(2) = IPBUF(2) 
      INAME(3) = IPBUF(3) 
C 
C     NOW SEE IF THE PROGRAM EXISTS 
C 
      IDADR = IDSGA(INAME)
      IF((IDADR .GT. 0).AND. (IAND(IPBUF(4),3).EQ.3)) GO TO 100 
      CALL REIO(2,LU,18H  NO SUCH PROGRAM ,9) 
      GO TO 5 
C 
C 
C     GET THE FILE NAME WHERE THE ANALYSIS DATA IS TO RESIDE. 
C         ALSO CONFIGURE THE  SS,PROG & GO, PROG COMMANDS.
C 
C 
C 
100   IGO(3) = INAME(1) 
      IGO(4) = INAME(2) 
      IGO(5) = INAME(3) 
      ISS(3) = INAME(1) 
      ISS(4) = INAME(2) 
      ISS(5) = INAME(3) 
C 
C                   CALCULATE A FEW ADDRESSES FOR LATER.
C 
C                   IDSTAT = ID SEG STATUS WORD ADDRESS 
C                   ISUSP  = ID SEG POINT OF SUSPENSION WORD ADDR 
C                   ISWP   = ID SEG SWAP ADDRESS WORD 
C 
C 
      IDSTAT = IDADR + 15 
      ISWP   = IDADR + 27 
      ISUSP  = IDADR + 8
C 
C                   SET UP THE BASE PAGE
C 
      CALL IXPUT(1740B,0) 
      CALL IXPUT(1741B,0) 
C 
C                   NOW GET THE FILE NAME FOR THE DATA. 
C 
105   IA = ISPACE(IDUM) 
      CALL REIO(2,LU,38H  ENTER FILE NAMR FOR ANALYSIS DATA  _,-38) 
      CALL REIO(1,LU,IFILE,-40) 
      CALL ABREG(IA,IB) 
      IA = ISPACE(IDUM) 
C 
C     OK, SO PARSE THE INPUT TO GET THE NAME
C 
      IONE = 1
      IF(NAMR(IPBUF,IFILE,IB,IONE).LT. 0) GO TO 100 
      IF(IAND(IPBUF(4),3) .NE. 3) GO TO 100 
C 
      IF(IEXIT(IPBUF)) 110, 115 
C 
110   IF(IPBUF(2) .NE. 2H  ) GO TO 115
      CALL REIO(2,LU,70H  PLEASE DO NOT USE ' EX, EN, /E, /A, OR AB ' FO
     &R FILE NAMES AS THESE ,-70) 
      CALL REIO(2,LU,42H  ARE ALSO USED FOR THE TERMINATE COMMAND.,-42) 
      IA = ISPACE(IDUM) 
      GO TO 105 
C 
C 
C 
C     GOT A NAMR SO GO SEE IF IT EXISTS & SET UP THE DEFAULTS 
C 
115   IF(IPBUF(8) .EQ.0) IPBUF(8) = 48
      CALL CREAT(IDCB,IER,IPBUF,IPBUF(8),4,IPBUF(5),IPBUF(6),528) 
      IF(IER .EQ. -2) GO TO 125 
      IF(IER .GE.0) GO TO 200 
C 
C     SOME SORT OF FMGR ERROR 
C 
      CALL FMPER(IER,IPBUF,LU)
      GO TO 100 
C 
C     THE FILE SPECIFIED ALREADY EXISTS ASK THE USER IF IT IS OK
C     TO USE THAT FILE. 
C 
C 
125   IEXIST(5) = IPBUF(1)
      IEXIST(6) = IPBUF(2)
      IEXIST(7) = IPBUF(3)
      IEXIST(14) = 2HLU 
      ILEN = 35 
      IF(IPBUF(6) .EQ. 0) ILEN = 11 
      IF(IPBUF(6) .LT. 1) GO TO 130 
C 
      IEXIST(14) = 2HCR 
C 
C     SEE IF THE CRT REF WAS SPECIFIED IN ASCII 
C 
      IF(IAND(IPBUF(4),60B) .NE. 60B) GO TO 130 
C 
C     IT WAS. 
C 
      IEXIST(16) = 2H 
      IEXIST(18) = 2H 
      IEXIST(17) = IPBUF(6) 
      GO TO 135 
C 
C 
130   CALL CNUMD(IABS(IPBUF(6)),IEXIST(16)) 
C 
C                   TELL THE USER THAT THE FILE ALREADY EXISTS
C                   AND ASK IF IT'S OK TO OVERLAY IT. 
C 
135   CALL REIO(2,LU,IEXIST,ILEN) 
      IF(ILEN .EQ.11) CALL REIO(2,LU,IEXIST(20),10) 
136   CALL REIO(2,LU,IYES,7)
      CALL REIO(1,LU,IFILE,2) 
      IF(IEXIT(IFILE)) GO TO 9999 
      IF(YESNO(IFILE) .EQ. 0) GO TO 136 
      IF(IFILE .NE. 2HYE) GO TO 100 
      CALL OPEN(IDCB,IER,IPBUF,IOPTN,IPBUF(5),IPBUF(6),528) 
      IF(IER .GT.0) GO TO 140 
C 
C     FILE OPEN ERROR 
C 
      CALL FMPER(IER,IPBUF,LU)
      GO TO 9999
C 
140   IF(IER .GT. 2) GO TO 200
C 
C     RANDOM ACCESS FILE. WE DON'T WANT THAT. 
C 
      CALL REIO(2,LU,50H  WRONG FILE TYPE.  FILE MUST BE TYPE 3 OR GREAT
     &ER,-50) 
      GO TO 105 
C 
C 
CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC 
C                                                                        C
C       THE 1ST RECORD OF THE DATA BUFFER IS THE INFORMATION             C
C       NEEDED BY THE GRAPH PROGRAM ABOUT THE PROGRAM UNDER              C
C       TEST AND ALL ITS ID SEGMENTS.                                    C
C       THE BUFFER IS SET UP AS FOLLOWS :                                C
C                                                                        C
C        WORDS   1 - 33      MAINS ID SEGMENT                            C
C        WORD      34        # OF SEGMENT LOADS PERFORMED                C
C        WORD      35        # OF SHORT SEGMENTS THE PROGRAM CALLED      C
C        WORDS  36 - 44      10 WORDS REPEATING. 1ST WORD = SEG ID ADDR  C
C                                NEXT 9 WORDS = CONTENTS OF ID SEG       C
C                                                                        C
CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC
C 
C 
C 
C 
C     FILL IN THE 1ST RECORD OF THE FILE
C 
C 
C 
200   DO 210 I = 1,33 
      IBUF(I) = IXGET(IDADR + I - 1)
210   CONTINUE
C 
      IBUF(23) = IBUF(23) + 42B 
C 
C 
C     GET SEGMENT FLAG & POST PART OF 1ST RECORD TO FILE
C     WE WILL COME BACK LATER & OPEN THE FILE IN THE UPDATE 
C     MODE TO PLACE THE REST OF THE INFO INTO THE 1ST RECORD. 
C     * NOTE I'VE CHANGED THE PROGRAM TO USE 128 WORD RECORDS.  HOWEVER,
C     * THE LOGICAL RECORD SIZE IS 1024 WORDS.
C 
C 
      ISEG    = IXGET(IDADR + 29) 
      ISEGN   = 0 
C 
C 
      DO 225 KK = 0,7 
      CALL WRITF(IDCB,IER,IBUF(1+KK*128),128) 
      IF(IER .GE. 0) GO TO 225
C 
C     SOME SORT OF WRITE ERROR
C 
      CALL FMPER(IER,IPBUF,LU)
      GO TO 9999
225   CONTINUE
C 
C 
C     OK, SO THE FILE IS ALL SET UP.  NOW GET THE INTERVAL AT WHICH 
C     WE TAKE SAMPLES OF THE PROGRAM'S POINT OF SUSPENSION. 
C     ACTUALLY I'VE HARD CODED THE INTERVAL TO 10MS.
C 
C 
C 
250   INTRVL = -1 
C 
C 
C 
C     NOW SEE IF THE USER WISHES TO COLLECT DATA WHILE
C     PROGRAM IS I/O SUSPENDED OR IN GENERAL WAIT 
C 
C                I/O SUSPEND
C 
C 
      IA = ISPACE(IDUM) 
      CALL REIO(2,LU,66H  DO YOU WANT ME TO TAKE DATA WHILE YOUR PROGRAM
     & IS I/O SUSPENDED ,-66) 
      CALL REIO(2,LU,40H  WAITING FOR INPUT FROM YOUR TERMINAL ?,-40) 
251   CALL REIO(2,LU,IYES,7)
      CALL REIO(1,LU,IBUF(1000),1)
      IF(IEXIT(IBUF(1000))) GO TO 9999
      IF(YESNO(IBUF(1000)).EQ. 0) GO TO 251 
      ITTY = 0
      IF(IBUF(1000) .EQ. 2HYE) ITTY = -1
C 
C 
      IA = ISPACE(IDUM) 
      CALL REIO(2,LU,72H  COLLECT DATA WHILE PROGRAM IS IN I/O SUSPEND S
     &TATE ON OTHER DEVICES  ?,-72) 
C 
275   CALL REIO(2,LU,IYES,7)
      CALL REIO(1,LU,IBUF(1000),1)
      IF(IBUF(1000) .NE.2HYE) ISTATE(2) = 10
      IF(IEXIT(IBUF(1000))) GO TO 9999
      IF(YESNO(IBUF(1000)).EQ. 0) GO TO 275 
C 
C 
C                GENERAL WAIT STATE 
C 
C 
      IA = ISPACE(IDUM) 
      CALL REIO(2,LU,56H  COLLECT DATA WHILE PROGRAM IS IN GENERAL WAIT 
     & STATE ?,-56) 
C 
280   CALL REIO(2,LU,IYES,7)
      CALL REIO(1,LU,IBUF(1000),1)
      IF(IBUF(1000) .NE. 2HYE) ISTATE(3) = 10 
      IF(IEXIT(IBUF(1000))) GO TO 9999
      IF(YESNO(IBUF(1000)).EQ. 0) GO TO 280 
C 
C 
C                   SEE IF HE WANTS PROGRAM TO START IMEDIATELY 
C 
C 
      IF(MYRUN .EQ. 0) GO TO 530
      IA = ISPACE(IDUM) 
      CALL REIO(2,LU,68H  DO YOU WANT ME TO START TAKING DATA IMMEDIATEL
     &Y AFTER THE PROGRAM ,-68) 
      CALL REIO(2,LU,20H  STARTS EXECUTING ?,-20) 
285   CALL REIO(2,LU,IYES,7)
      CALL REIO(1,LU,IBUF(1000),1)
      IF(IEXIT(IBUF(1000))) GO TO 9999
      IF(YESNO(IBUF(1000)).EQ. 0) GO TO 285 
      IPAUSE = 0
      IF(IBUF(1000) .EQ. 2HYE) IPAUSE = -1
C 
C 
C 
C 
C               SO WE'VE GOT THE DATA WE NEED LETS
C                   SEE IF THE USER IS READY. 
C 
C 
300   IA = ISPACE(IDUM) 
      CALL REIO(2,LU,49H  I'M READY TO RUN YOUR PROGRAM.  ARE YOU READY 
     &?,-49)
290   CALL REIO(2,LU,IYES,7)
      CALL REIO(1,LU,IBUF(1000),1)
      IF(IEXIT(IBUF(1000))) GO TO 9999
      IF(YESNO(IBUF(1000)) .EQ. 0) GO TO 290
      IF(IBUF(1000) .NE. 2HYE) GO TO 300
C 
C 
CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC
C                                                                      C
C           OK, EVERYTHING IS SET UP.  LETS INVOKE THE                 C
C           PROGRAM AND START TAKING THE DATA POINTS.                  C
C                                                                      C
CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC
C 
C 
C     INVOKE THE PROGRAM
C 
400   I = MESSS(ISTRNG,IMLEN,LU)
C 
      IF(I .EQ. 0) GO TO 450
C 
C     OPS WE GOT A MESSAGE BACK.  MUST BE AN ERROR
C 
      CALL REIO(2,LU,ISTRNG,I)
      GO TO 9999
C 
C 
C     DO A CORE LOCK SO WE CON'T GET SWAPPED !! 
C 
450   CALL EXEC(22,1) 
C 
C                   DON'T TAKE ANY DATA UNTIL THE PROGRAM GETS
C                          INTO MEMORY. 
C 
C 
500   CALL EXEC(12,0,1,0,INTRVL)
      K = K + 1 
      IF(K .EQ. 1000) GO TO 10000 
      IF(IFBRK(IDUM)) 9999,510
C 
C     WAIT TILL THE PROGRAM GETS INTO MEMORY
C 
510   IF(IXGET(IDADR + 8) .EQ. 0)  GO TO 500
C 
C 
C 
C                WE MADE IT ! THE PROGRAM GOT INTO
C                MEMORY.  GET THE START TIME &
C                 START TAKING DATA.
C 
C 
      IF(IPAUSE .EQ.-1) I = MESSS(ISS,10) 
      CALL EXEC(11,ISTART)
      IF(I .EQ. 0) GO TO 525
C 
      CALL REIO(2,LU,ISS,I) 
      GO TO 9999
C 
C 
C 
525   IF(IPAUSE)540,530 
C 
530   IA = ISPACE(IDUM) 
      I = 0 
      CALL REIO(2,LU,48H  OK !  I'M READY TO TAKE DATA ON YOUR PROGRAM. 
     &,-48) 
      CALL PNAME(MYNAME(9)) 
      CALL REIO(2,LU,MYNAME,24) 
      CALL EXEC(22,1) 
      CALL EXEC(7)
      CALL EXEC(11,ISTART)
      IF(IAND(IXGET(IDSTAT),7).NE.0) GO TO 540
      CALL REIO(2,LU,26HYOUR PROGRAM IS DORMANT ??,-26) 
      GO TO 9999
C 
C 
C 
540   IA = ISPACE(IDUM) 
      IA = ISPACE(IDUM) 
      IA = ISPACE(IDUM) 
      CALL REIO(2,LU,60H  I'VE STARTED TAKING DATA ON YOUR PROGRAM.  YOU
     & MAY ENTER A,-60) 
C 
       CALL PNAME(BRKBIT(5))
       CALL REIO(2,LU,BRKBIT,8) 
       CALL REIO(2,LU,36H  TO STOP THE ANALYSIS IF YOU WISH. ,-36)
C 
C 
       IA = ISPACE(IDUM)
       IA = ISPACE(IDUM)
C 
C 
       IF(IPAUSE) 550,560 
C 
C 
CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC 
C                                                                           C 
C           THIS SECTION TAKES THE READINGS & SUSPENDS ITSELF               C 
C                                                                           C 
CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC 
C 
550   I = MESSS(IGO,10) 
560   K = 0 
      IF(I .EQ. 0) GO TO 600
      CALL REIO(2,LU,IGO,I) 
      GO TO 9999
C 
C                   SUSPEND THYSELF.  COME BACK IN 10 MS. 
C 
600   CALL EXEC(12,0,1,0,INTRVL)
      IF(IFBRK(IDUM)) 9000,610
610   ISTAT = IAND(IXGET(IDSTAT),7) 
C 
C 
C                   GOT THE PROGRAM STATUS.  LETS SEE WHAT TO DO
C 
C 
C 
      IF(ISTAT .EQ. 1) GO TO 690
      IF(ISTAT .EQ. 2) GO TO 650
      IF(ISTAT .EQ. ISTATE(3)) GO TO 700
      IF(ISTAT .EQ. 0) GO TO 9000 
C 
C     MUST BE STATE 4, 5, OR 6  SO DON'T TAKE DATA. 
C 
      GO TO 600 
C 
C 
C                   PROGRAM IS I/O SUSPENDED
C              SEE IF WE ARE SUPPOSED TO TAKE DATA. 
C 
C 
C 
650   IF(IXGET(IEQT) .EQ. IDADR) GO TO 675
C 
      IF(ISTATE(2) .EQ. 10) GO TO 600 
      GO TO 700 
C 
675   IF(ITTY) 700,600
C 
C              STATUS IS SCHEDULED.  MAKE SURE THAT TARGET
C              PROGRAM WAS THE ONE WE INTERUPTED AND THAT 
C              HE IS NOT CURRENTLY SWAPPED OUT. 
C 
C 
690   IF(IXGET(IXGET(1717B)).NE.IDADR) GO TO 600
      IF(IXGET(ISWP) .NE. 0) GO TO 600
C 
C                   ALLS WELL.  SO TAKE THE DATA. 
C 
700   K = K + 1 
      IBUF(K) = IXGET(ISUSP)
C 
C     OK, NOW DO ALL THE PAINFUL THINGS REQUIRED FOR SEGMENTED
C     PROGRAMS. 
C 
C                   ANY SEGMENTS LOADED YET ? 
C 
      IF(ISEG .EQ. 0) GO TO 750 
      K = K + 1 
C 
C     YES, SO SET UP
C     ITHIS = THIS SEGMENTS ID ADDRESS , IOLD = LAST SEGMENT ID ADDRESS 
C 
C                   SEE IF ANY SEGMENTS LOADED IN THE LAST
C                   10 MS.
C 
      ITHIS = IXGET(1740B)
      IBUF(K) = ITHIS 
      IF(ITHIS .EQ. IOLD) GO TO 750 
      IOLD = ITHIS
C 
C                   A SEGMENT WAS LOADED !! 
C                   SEE IF THIS IS A NEW SEG OR HAS BEEN LOADED BEFORE. 
C 
C 
      DO 725 I = 1,ISEGN
      IF(ITHIS .EQ. IDBUF(I)) GO TO 750 
725   CONTINUE
C 
C                   NEW SEGMENT.  WE HAVEN'T SEEN THIS ONE BEFORE.
C                   SO GET THE INFO ON THE SEGMENT AND CONTINUE.
C 
C 
      IF(ISEGN .NE. 108) ISEGN = ISEGN + 1
      IDBUF(ISEGN) = ITHIS
750   IF(K .NE.1024) GO TO 600
C 
C 
C     INTERNAL BUFFER IS FULL SO POST IT TO THE DISC BUT SUSPEND
C     THE PROGRAM WERE INTERESTED IN FIRST. 
C 
C 
      I = MESSS(ISS,10) 
      IF(I. EQ. 0) GO TO 775
      CALL REIO(2,LU,ISS,I) 
      GO TO 9999
C 
C                   WRITE THE INFO TO THE DISC. 
C 
775   DO 800 KK = 0,7 
      CALL WRITF(IDCB,IER,IBUF(1+KK*128),128) 
      IF(IER .GE. 0) GO TO 800
C 
C     SOME SORT OF WRITE ERROR
C 
      CALL FMPER(IER,IPBUF,LU)
      GO TO 9000
800   CONTINUE
C 
C              RESCHEDULE THE PROGRAM & START TAKING DATA AGAIN.
C 
      GO TO 550 
C 
C 
C 
C 
C 
C 
C 
CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC
C                                                                          C
C          TARGET PROGRAM IS DORMANT.  SO POST LAST BUFFER AND             C
C                  SET UP TO CLOSE THE DATA FILE                           C
C                   ALSO GET THE END TIME                                  C
C                                                                          C
CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC
C 
C 
C 
9000  CALL EXEC(11,ISTOP) 
      IF(K .EQ. 1024) GO TO 9200
      DO 9100 I = K+1,1024
      IBUF(I) = 0 
9100  CONTINUE
C 
C 
C 
      DO 9250 KK = 0,7
9200  CALL WRITF(IDCB,IER,IBUF(1+KK*128),128) 
      IF(IER .GE. 0 ) GO TO 9250
      CALL FMPER(IER,IPBUF,LU)
      GO TO 9300
9250  CONTINUE
C 
C 
9300  CALL CLOSE(IDCB,IER)
      IF(IER .GE. 0) GO TO 9350 
C 
C     SOME SORT OF CLOSE ERROR
C 
      CALL FMPER(IER,IPBUF,LU)
C 
C 
CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC
C                                                                          C
C                     SET UP THE 1ST RECORD FOR THE                        C
C                          GRAPHING PROGRAM                                C
C                                                                          C
CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC
C 
C 
C     REOPEN THE FILE IN THE UPDATE MODE
C 
9350  CALL OPEN(IDCB,IER,IPBUF,2,IPBUF(5),IPBUF(6),528) 
      IF(IER .GE.0) GO TO 9375
C 
C     SOME SORT OF OPEN ERROR 
C 
      CALL FMPER(IER,IPBUF,LU)
      GO TO 9999
C 
9375  DO 9380 KK =0,7 
      CALL READF(IDCB,IER,IBUF(1+KK*128),128) 
      IF(IER .GE.0) GO TO 9380
C 
C     READ ERROR
C 
      CALL FMPER(IER,IPBUF,LU)
      GO TO 9999
9380  CONTINUE
C 
9400  CALL RWNDF(IDCB,IER)
      IF(IER .GE. 0) GO TO 9425 
C 
C     REWIND ERROR ? OH COME NOW !
C 
      CALL FMPER(IER,IPBUF,LU)
      GO TO 9999
C 
9425  IBUF(34) = IXGET(1741B) 
      IBUF(35) = ISEGN
      IF(ISEGN .EQ. 0) GO TO 9460 
      ICOUNT = 35 
C 
      DO 9450 I = 1,ISEGN 
      ICOUNT = ICOUNT + 1 
      IBUF(ICOUNT) = IDBUF(I) 
      IOFFST = 0
      DO 9430 J = 1,9 
      ICOUNT = ICOUNT + 1 
      IBUF(ICOUNT) = IXGET(IDBUF(I) + 10 + J + IOFFST)
C 
C     WATCH OUT FOR LONG ID SEG 
C 
      IF((J .EQ. 4) .AND. (IAND(IBUF(ICOUNT),20B).EQ.  0 )) IOFFST = 7
9430  CONTINUE
9450  CONTINUE
C 
C 
C     POST START & STOP TIME
C 
C 
9460  DO 9475 I = 1,4 
      IBUF(1016 + I) = ISTART(I)
      IBUF(1020 + I) = ISTOP(I) 
9475  CONTINUE
C 
C 
C 
C     POST ID INFO TO THE DISC
C 
      DO 9600 KK = 0,7
9500  CALL WRITF(IDCB,IER,IBUF(1+KK*128),128) 
      IF(IER .GE. 0) GO TO 9600 
C 
C     WRITE ERROR 
C 
      CALL FMPER(IER,IPBUF,LU)
      GO TO 9999
9600  CONTINUE
C 
C 
9999  IA = ISPACE(IDUM) 
      CALL REIO(2,LU,22H  ANALYSIS COMPLETE !!,11)
      CALL CLOSE(IDCB,IER)
      CALL EXEC(6,0)
10000 IF(IAND(IXGET(IDSTAT),7).NE. 0) GO TO 10001 
      CALL REIO(2,LU,43H YOUR PROGRAM RUNS TOO FAST TO BE ANALIZED.,-43)
      GO TO 9999
C 
C 
10001 CALL REIO(2,LU,60H  PARTITION CONFLICT !  ASSIGN THIS PROGRAM AND 
     &THE PROGRAM ,-60) 
      CALL REIO(2,LU,42H  TO BE ANALIZED TO DIFFERENT PARTITIONS. ,-42) 
      GO TO 9999
      END 
      END$
                                                              