*DECK,DCMWD 
*#
* *    DC$MWD                                    PAGE 1 
* *   MOVE-WORDS PRIMITIVE   DC$MWD 
* *   J.W.PERRY                                  DATE  11/16/73 
* 
* DC  PURPOSE 
*     MOVE CONTIGUOUS FULL WORDS FROM IN-ARRAY TO OUT-ARRAY.
* DC  ENTRY CONDITIONS
*     (A1) = ADDRESS OF PARAMETER ADDRESS LIST (STANDARD CALLING SEQUEN)
*         PARAM 1 = FWA OF IN-ARRAY (SOURCE)
*         PARAM 2 = FWA OF OUT-ARRAY (TARGET) 
*         PARAM 3 = LENGTH (NUMBER OF WORDS TO BE MOVED) (INTEGER \ 0)
*       ALL PARAMS ARE FULL-WORD UNSIGNED INTEGERS. 
*         IN-ARRAY AND OUT-ARRAY CAN OVERLAP. 
* DC  EXIT CONDITIONS 
*     PARAMETERS AS ON ENTRY. 
*     REGISTERS USED
*            A1 A2 A3 A4 A5 A6 A7 
*            X1 X2 X3 X4 X5 X6 X7 
*               B2 B3 B4    B6 B7 
* DC  CALLING ROUTINES
*     DC$XFER  TRANSFER PRIMITIVE 
*     DC$BSCH  BUILD-SCHEMA-RECORD PRIMITIVE
*     DC$BSUB  BUILD-SUB-RECORD PRIMITIVE 
*     DC$CSI   COMPLETE SCHEMA ITEMS (INVOKE).
*     DC$BREL  BUILD RELATION TABLES (INVOKE) 
*     DC$NLFL  NULLFILL PRIMITIVE 
*     DC$PSLC PASS LOC SO INVOKE CAN CALL ROUTINE.
* DC  CALLED ROUTINES 
*     NONE
* DC  NON-LOCAL VARIABLES 
*     OUT-ARRAY IS OVERWRITTEN
* DC  DESCRIPTION 
*         MAIN PARAMETERS IN LOGIC ARE
*                B2 LWA+1 OF IN-ARRAY 
*                B3 FWA OF IN-ARRAY 
*                B4 DISPLACEMENT FROM IN-ARRAY TO OUT-ARRAY (+,-,OR 0)
*         THE MAIN LOOP MOVES WORDS FOUR AT A TIME, WITH REMAINING
*                0-3 WORDS MOVED AS SPECIAL CASES AFTER ENDLOOP.
*         IN THE MAIN LOOP, B3 IS INCREMENTED BY 4 AND TESTED AGAINST B2
*                BEFORE ANY WORDS ARE STORED.  IF B3 GREATER THAN B2, 
*                JUMP TO ENDLOOP. 
*#
          IDENT  DC$MWD 
          ENTRY  DC$MWD 
 DC$MWD   DATA   0           ENTRY/EXIT 
          SB7    1
          SA2    X1          (X2) = FWA OF IN-ARRAY 
          SA4    A1+B7
          SA3    X4          (X3) = FWA OF OUT-ARRAY
          SA5    A4+B7
          SA4    X5          (X4) = LENGTH
          SB3    X2          FWA OF IN-ARRAY
          IX1    X3-X2
          SB4    X1          DISPLACEMENT FROM IN-ARRAY FWA TO OUT-ARRAY
          SB2    X4+B3       LWA+1 OF IN-ARRAY
* 
          NG     B4,DOWN     JUMP IF SHUTTLING DOWN.
*                            PREPARE TO SHUTTLE UP. 
          SB6    -2 
          SA1    B2-B7       LOAD 1ST WORD PAIR TO BE MOVED.
          SA2    B2+B6
          EQ     LOOP 
*                            PREPARE TO SHUTTLE DOWN. 
 DOWN     SA1    B3 
          SB6    2           LOAD 1ST WORD PAIR TO BE MOVED.
          SA2    B3+B7
*                            MAIN LOOP
 LOOP     SA4    A1+B6
          SA5    A2+B6       LOAD 2ND WORD PAIR TO BE MOVED.
          BX6    X1 
          LX7    X2 
  
          SB3    B3+4              INCREMENT WORD-COUNT (FROM FWA) BY 4.
          LT     B2,B3,ENDLOOP     TOO FAR. TERMINATE LOOP. 
  
          SA6    A1+B4       STORE 1ST WORD PAIR
          SA7    A2+B4
          SA1    A4+B6             READ 1ST PAIR FROM NEXT SET. 
          SA2    A5+B6
          BX6    X4 
          LX7    X5 
  
          SA6    A4+B4       STORE 2ND WORD PAIR
          SA7    A5+B4
          EQ     LOOP 
  
 ENDLOOP  SB3    B3-3        B2-B3 = -1,0,1,2 IF 0,1,2,3 WORDS LEFT 
          LT     B2,B3,DC$MWD 
          SA6    A1+B4       MOVE 1ST OF LAST POSSIBLE 3 WORDS
          GE     B3,B2,DC$MWD 
          SA7    A2+B4       MOVE 2ND OF LAST POSSIBLE 3 WORDS
          SB3    B3+B7
          GE     B3,B2,DC$MWD 
          BX6    X4          MOVE 3RD OF LAST POSSIBLE 3 WORDS
          SA6    A4+B4
          EQ     DC$MWD 
          END 
