*DECK,DCXFER
      PROC DC$XFER (SOURCBWP,SOURCBBP,TARGTBWP,TARGTBBP,XFERSIZE);
      BEGIN 
 #
  *    DC$XFER                                   PAGE 1 
  *   TRANSFER PRIMITIVE   DC$XFER
  *   J.W.PERRY                                  DATE  12/05/73 
  DC  PURPOSE 
      MOVE DATA IN CORE FROM SOURCE TO TARGET 
      LEFT-JUSTIFIED, NO FILL.
      PERFORM MOVE WORD-WISE, IF POSSIBLE.
  DC  ENTRY CONDITIONS
        FORMAL PARAMETERS (ALL FULL-WORD UNSIGNED INTEGERS) 
          1) SOURCBWP  SOURCE FWA.
          2) SOURCBBP  SOURCE BEGIN BIT POSITION. 
          3) TARGTBWP  TARGET FWA.
          4) TARGTBBP  TARGET BEGIN BIT POSITION. 
          5) XFERSIZE  SIZE OF TRANSFER (BITS). 
  DC  EXIT CONDITIONS 
      TRANSFER COMPLETED.  ACTUAL PARAMETERS UNTOUCHED. 
  DC  CALLING ROUTINES
        BLKMOVE/DC$BRBI -- BUILD-RECORD-BY-ITEM PRIMITIVE 
        ITEMMAPPING/DC$BRBI -- BUILD-RECORD-BY-ITEM PRIMITIVE 
        DC$NLFL -- NULL-FILL PRIMITIVE
        DC$XKEY -- EXTRACT-KEY PRIMITIVE
  DC  CALLED ROUTINES 
        DC$MWD  MOVE-WORDS (PERFORMS MOVE WORD-WISE). 
        DC$MBIT  MOVE-BITS (MOVE ARBITRARY BIT-STRING). 
  DC  NON-LOCAL VARIABLES 
      NONE
  DC  DESCRIPTION 
      IF WORD MOVE IS POSSIBLE (SOURCBBP=0,TARGTBBP=0,XFERSIZE=MULT 60) 
        THEN CALL MOVE-WORDS AND EXIT 
        ELSE CALL MOVE-BIT-STRING AND EXIT. 
 #
# 
      DEFINE UPDATE SYMBOL DXFER TO TURN ON TRACE (USING SNATCH). 
      DEFINE UPDATE SYMBOL DXFER2 TO DUMP PARAMETERS. 
# 
      CONTROL EJECT;
  
      ITEM SOURCBWP U;       #SOURCE BEGIN WORD POS.  FORMAL PARAM 1   #
      ITEM SOURCBBP U;       #SOURCE BEGIN BIT POS.   FORMAL PARAM 2   #
      ITEM TARGTBWP U;       #TARGET BEGIN WORD POS.  FORMAL PARAM 3   #
      ITEM TARGTBBP U;       #TARGET BEGIN BIT POS.   FORMAL PARAM 4   #
      ITEM XFERSIZE U;       #TRANSFER SIZE (BITS)    FORMAL PARAM 5   #
  
  
      #DEFS FOR READABILITY                                            #
        DEF CALL     # #;    #CALL CAN BE USED WHEN CALLING PROCEDURES #
        DEF XCALL    # #;    #XCALL CAN BE USED WHEN CALLING PROCEDURES#
        DEF THRU     #STEP 1 UNTIL#; #SHORTHAND FOR FOR-LOOP USE       #
  
      XREF  BEGIN 
        PROC DC$MWD;
        PROC DC$MBIT; 
      END #XREF#
  
      ITEM MOVESTAT B;       #MOVE-STATUS (ACTUAL PARAM FOR MOVE-CMU)  #
      ITEM MOVESIZE U;       #SCRATCH CELL FOR MOVE SIZE.              #
      CONTROL EJECT;
*IF DEF,DXFER,2 
      XREF PROC SNATCHC;                    #IN IF DEF DXFER #
      SNATCHC("ENTER XFER",MOVESTAT,0);     #IN IF DEF DXFER #
*IF DEF,DXFER2,6
      XREF PROC SNATCHD;                    #IN IF DEF DXFER2 # 
      SNATCHD("SOURCBWP",SOURCBWP);         #IN IF DEF DXFER2 # 
      SNATCHD("SOURCBBP",SOURCBBP);         #IN IF DEF DXFER2 # 
      SNATCHD("TARGTBWP",TARGTBWP);         #IN IF DEF DXFER2 # 
      SNATCHD("TARGTBBP",TARGTBBP);         #IN IF DEF DXFER2 # 
      SNATCHD("XFERSIZE",XFERSIZE);         #IN IF DEF DXFER2 # 
  
      MOVESIZE = XFERSIZE / 60;   #NUMBER OF WORDS TO MOVE.            #
                             #CALL MOVE-WORDS IF WORD MOVE IS POSSIBLE.#
      IF (MOVESIZE * 60) - XFERSIZE EQ 0
        AND SOURCBBP EQ 0 
        AND TARGTBBP EQ 0 
        THEN
          BEGIN 
          XCALL DC$MWD(SOURCBWP,TARGTBWP,MOVESIZE); 
*IF DEF,DXFER,1 
      SNATCHC("EX XFR MWD",MOVESTAT,0);     #IN IF DEF DXFER #
          RETURN; 
          END 
  
                             #CALL MOVE-BIT-STRING.                    #
      XCALL DC$MBIT(SOURCBWP,SOURCBBP,TARGTBWP,TARGTBBP,XFERSIZE);
*IF DEF,DXFER,1 
      SNATCHC("EX XFR BIT",MOVESTAT,0);     #IN IF DEF DXFER #
      RETURN; 
      END  #OF PROC DC$XFER#
      TERM; 
