*DECK DB$SFWR 
USETEXT CDGDFTX 
      PROC DB$SFWR((UCPA),(SCPA),(NUMBER)); 
      BEGIN 
 #
* *   DB$SFWR -- WRITE TO USER CONTROL POINT.    PAGE  1
* *   BOB MCALLESTER                             DATE  07/15/82 
* 
* DC  PURPOSE 
* 
*     WRITE LONG DATA BLOCKS TO THE USER CONTROL POINT. 
* 
* D   NOTE -
*     IF THERE IS NO CHANCE THAT THE DATA BLOCK WILL EXCEED 64 WORDS, 
*     DB$SFCL SHOULD BE CALLED DIRECTLY.
* 
* DC  ENTRY CONDITIONS
* 
* D   PARAMETERS
# 
      ITEM UCPA   I;         # USER CONTROL POINT ADDRESS              #
      ITEM SCPA   I;         # SYSTEM CONTROL POINT ADDRESS            #
      ITEM NUMBER I;         # NUMBER OF WORDS TO BE TRANSFERRED       #
# 
* DC  EXIT CONDITIONS 
* 
*     THE DATA TRANSFER HAS BEEN COMPLETED. 
*     EXCEPTION CONDITIONS ARE HANDLED BY DB$SFCL.
* 
* DC  CALLING ROUTINES
* 
*     THIS IS A UTILITY ROUTINE FOR GENERAL USE.
* 
* DC  CALLED ROUTINES 
# 
      XREF PROC DB$FLOP;     # ISSUE FLOW POINT                        #
      XREF PROC DB$POP;      # RESTORE A WORD FROM THE STACK           #
      XREF PROC DB$POP3;     # RESTORE THREE WORDS FROM THE STACK      #
      XREF PROC DB$PSH3;     # SAVE THREE WORDS ON THE STACK           #
      XREF PROC DB$PUSH;     # SAVE A WORD ON THE STACK                #
      XREF PROC DB$SFCL;     # ISSUE AN SFCALL                         #
# 
* DC  NON-LOCAL VARIABLES MODIFIED
* 
*     NONE
* 
* DC  DESCRIPTION 
* 
*     IF THE NUMBER OF WORDS TO BE TRANSFERRED IS GREATER THAN 64,
*     ONE BLOCK OF 64 IS TRANSFERRED ON EACH CALL TO DB$SFCL UNTIL
*     64 OR FEWER REMAINS.
*     ONE FINAL CALL TO DB$SFCL TRANSFERS THE REMAINDER OF THE BLOCK. 
 #
  
  
  
#     B E G I N   D B $ S F W R   E X E C U T A B L E   C O D E .      #
  
      CONTROL IFGR DFFLOP,0;
        DB$FLOP("SFWR");
      CONTROL ENDIF;
  
      DB$PUSH(DB$SFWR); 
  
      FOR NUMBER = NUMBER WHILE NUMBER GR 64
      DO
        BEGIN 
        DB$PSH3(SCPA,UCPA,NUMBER);
        DB$SFCL(DFSFWRIT,64,UCPA,SCPA); 
        DB$POP3(NUMBER,UCPA,SCPA);
        SCPA = SCPA + 64; 
        UCPA = UCPA + 64; 
        NUMBER = NUMBER - 64; 
        END 
  
      DB$SFCL(DFSFWRIT,NUMBER,UCPA,SCPA); 
  
      DB$POP(DB$SFWR);
  
      END 
      TERM
