*DECK S$P 
          IDENT  S$P
          TITLE  S$P -  WRITE PERFORMANCE DATA
          COMMENT  WRITE PERFORMANCE DATA 
          LIST   F
          SPACE  4
**        S$P -  WRITE PERFORMANCE DATA 
* 
*     CALLING SEQUENCE: 
*         RJ S$P
* 
*     GIVEN:  
*         X1 = ADDRESS OF (10H_CAPSULE-NAME)
*         X6 = 1 FOR STARTING TO LOAD A CAPSULE 
*              2 FOR FINISHING LOADING A CAPSULE
*              3 FOR STARTING TO UNLOAD A CAPSULE 
*              4 FOR FINISHING UNLOADING A CAPSULE
*              5 FOR OTHER
* 
*     DOES: 
*         SETS UP A WORD IN THIS FORMAT:  
*           3/X6, 
*           27/ELAPSED TIME IN MILLISECONDS,
*           6/CODE FOR CAPSULE NAME,
*           24/CP TIME IN MILLISECONDS
*         INSERTS THE WORD IN THE BUFFER VIA S$ZZZ3U. 
*         IF THE S$ZZZ3U BUFFER IS FULL,
*             FLUSHES THE BUFFER
*             RESETS THE BUFFER POINTERS. 
*         (S$PF MUST BE CALLED AT THE END TO FLUSH THE BUFFER 
*          AND TO WRITE THE TABLE OF CAPSULE NAMES.)
* 
*     PRESERVES X1 AND A1.
  
  
          ENTRY  S$P
S$P       SUBR
        IFPERFM              IF PERFORMANCE MEASUREMENT WANTED, 
          SB1    1           CONSTANT 1 
          SX7    A1          SAVE ORIGINAL VALUE OF A1
          SA7    SAVEA1 
          BX7    X1          SAVE ORIGINAL VALUE OF X1
          SA7    SAVEX1 
  
*     SET WORD := 3/CODE, 27/0, 6/0, 24/0 
  
          LX6    -3 
          SA6    WORD 
  
*     DETERMINE THE CAPSULE NUMBER
  
          SA5    X1          10H_CAPSULE-NAME 
          SA2    NCAPS       NUMBER OF UNIQUE CAPSULES SEEN SO FAR
          SB7    X2 
          ZR     B7,P2       IF NONE, SKIP
 P1       SA4    S$CAPS-1+B7   EXAMINE S$CAPSULE NAME FROM TABLE
          IX0    X4-X5       COMPARE AGAINST TARGET 
          ZR     X0,P3       IF TARGET MATCHES TABLE, JUMP
          SB7    B7-B1       DECREMENT INDEX TO NAME TABLE
          NZ     B7,P1       IF MORE NAMES IN TABLE, LOOP 
 P2       BSS    0           NAME NOT IN TABLE; X2 = NCAPS
          BX6    X5          10H_CAPSULE-NAME 
          SA6    S$CAPS+X2   STORE AT S$CAPS + NCAPS
          SX6    X2+B1       NCAPS := NCAPS + 1 
          SA6    A2 
          SB7    X6 
          SB6    MAXCAPS
          GT     B7,B6,400000B+3RS$P  IF TOO MANY, ABORT
 P3       BSS    0           B7 = CAPSULE NUMBER
  
*     SET WORD := 3/CODE, 27/0, 6/CAPSULE-NUMBER, 24/0
  
          SA5    WORD 
          SX6    B7 
          LX6    24 
          BX6    X5+X6
          SA6    WORD 
  
*     SET WORD := 3/CODE, 27/ELAPSED TIME, 6/CAPSULE-NUMBER, 24/0 
  
          MX6    0           CLEAR STATUS WORD
          SA6    STAT 
          RTIME  STAT        STAT := 24/SECS, 36/MILLISECONDS 
                             ALTHOUGH THE REFERENCE MANUAL DESCRIBES
                             THE *TIME* AND *RTIME* MACROS SIMILARLY
                             AND THE *TIME* MACRO IMPLIES CP TIME IS
                             'SECONDS' SECONDS PLUS 'MILLISECONDS'
                             MILLISECONDS, THE *RTIME* MACRO
                             ACTUALLY RETURNS 'SECONDS' SECONDS -OR-
                             'MILLISECONDS' MILLISECONDS. 
          SA1    STAT 
          MX0    -27         77777777777000000000B
          BX6    -X0*X1      KEEP ONLY RIGHT 27 BITS
  
          SA5    WORD 
          LX6    3+27 
          BX6    X5+X6
          SA6    A5 
  
*     SET WORD := 3/CODE, 27/ELAPSED TIME, 6/CAPSULE-NUMBER, 24/CP TIME 
  
          MX6    0           CLEAR STATUS WORD
          SA6    STAT 
          TIME   STAT        STAT := 12/2000B, 12/0, 24/SECS, 12/MILLISECONDS 
          SA1    STAT 
          MX0    -12         77777777777777770000B
          BX6    -X0*X1      MILLISECONDS 
          AX1    12          24/2000B, 12/0, 24/SECS
          MX0    -24         77777777777700000000B
          BX1    -X0*X1      SECS 
          SX2    1000 
          IX1    X2*X1       1000*SECS
          IX6    X1+X6       1000*SECS + MILLISECONDS 
  
          SA5    WORD 
          BX6    X5+X6
          SA6    A5 
  
*     INSERT THE WORD INTO THE BUFFER 
  
          SA1    S$ZZZ3U+2   IN 
          SA6    X1          (IN) := WORD 
          SX6    A6+B1       IN := IN + 1 
          SA6    A1 
  
*     IF THE BUFFER IS FULL,
*         FLUSH THE BUFFER. 
  
          SA2    S$ZZZ3U+4   LIMIT
          SX2    X2-1      LIMIT - 1
          IX0    X6-X2       IN - (LIMIT - 1) 
          IFTHEN X0=0        IF IN = (LIMIT - 1)
            WRITE  S$ZZZ3U,RECALL  FLUSH THE BUFFER 
            SA1    S$ZZZ3U+1   FIRST
            SX6    X1 
            SA6    S$ZZZ3U+2 IN := FIRST
            SA6    S$ZZZ3U+3 OUT := FIRST 
            ENDIF.
  
*     RESTORE ORIGINAL A1/X1 AND EXIT 
  
          SA5    SAVEA1      X5 := ORIGINAL VALUE OF A1 
          SA1    X5          A1 := ORIGINAL VALUE OF A1 
          SA5    SAVEX1      X5 := ORIGINAL VALUE OF X1 
          BX1    X5          X1 := ORIGINAL VALUE OF X1 
          EXIT
  
  
*CALL MAXCAPS 
          ENTRY  S$CAPS 
 S$CAPS   BSS    MAXCAPS     TABLE OF CAPSULE-NAMES 
 NCAPS    DATA   0           NUMBER OF CAPSULE-NAMES IN *CAPS*
 SAVEA1   BSS    1           ORIGINAL VALUE OF A1 
 SAVEX1   BSS    1           ORIGINAL VALUE OF X1 
 STAT     BSS    1           STATUS WORD FOR *TIME* AND *RTIME* 
 S$ZZZ3U  EXTERNAL           FET FOR PERFORMANCE FILE 
 WORD     BSS    1           WORD TO WRITE TO PERFORMANCE FILE
  
          ENDIF 
  
  
          END 
