COMCMVE 
COMMON
          CTEXT  COMCMVE - MOVE BLOCK OF DATA.
 MVE      SPACE  4
          IF     -DEF,QUAL$,1 
          QUAL   COMCMVE
          BASE   D
*         COMMENT  COPYRIGHT CONTROL DATA SYSTEMS INC.  1992. 
 MVE      SPACE  4
***       MVE - MOVE BLOCK OF DATA. 
*         G. R. MANSFIELD.   70/10/09.
*         R. E. TATE.        73/11/04.
 MVE      SPACE  4
***              MVE MOVES A BLOCK OF DATA. 
* 
*         NOTE-  UPWARD MOVE MEANS TOWARD RA. 
* 
*         A *MOVE* REQUEST MAY ACCESS DATA FROM BEYOND THE END OF THE 
*         BUFFER, THUS CAUSING AN ABORT IF THE LAST WORD ADDRESS OF 
*         THE SOURCE BUFFER IS WITHIN 2 WORDS OF THE PROGRAM-S FIELD
*         LENGTH. 
* 
*         ENTRY  (X1) = WORD COUNT. 
*                (X2) = SOURCE ADDRESS. 
*                (X3) = DESTINATION ADDRESS.
* 
*         EXIT   (B1) = 1.
* 
*         USES   X - 1, 2, 3, 4, 6, 7.
*                B - 7. 
*                A - 2, 4, 6, 7.
  
  
*         COMPARE MOVE UNIT BUFFER AREA/PRESET. 
*         MVEB IS READ UP AND THEN RETURN JUMPED TO IN ORDER TO VOID
*         THE INSTRUCTION STACK.  LATER MVEB IS USED FOR THE CMU
*         DESCRIPTOR WORD.
  
 MVE11    BSS    0           ENTRY FOR PRESET 
 MVEB     IX4    X2-X3       CHECK DIRECTION OF MOVE  (NO CMU)
          MX7    59 
          JP     MVE13
  
 MVEC     BX7    X2          CHECK IF CMU AVAILABLE (BUFFER AREA FWA) 
          SA2    CMUR 
          PL     X2,MVE12    IF NO CMU
          SA4    MVED 
 MVE12    BX6    X4 
          LX2    X7          RESTORE X2 
          SA6    MVEA 
          JP     MVE1        RESTART LOOP 
  
 MVED     IX4    X2-X3       CHECK DIRECTION OF MOVE (CMU)
          BX7    X1          SET WORD COUNT 
          BX1    X0          SAVE X0
          LX2    30 
  
*         DETERMINE MOVE DIRECTION. 
  
 MVE13    BX6    -X7*X1 
          IX1    X1-X6       REDUCE WORD COUNT TO EVEN NUMBER 
          PL     X4,MVE15    IF MOVE UP 
  
*         BEGIN DOWNWARD MOVE.
  
          ZR     X6,MVE14    IF WORD COUNT EVEN 
          SB7    X1 
          SA4    X2+B7       MOVE INITIAL WORD
          BX6    X4 
          SA6    X3+B7
 MVE14    IX2    X2+X1
          IX3    X3+X1
          SB7    -2 
          EQ     MVE16
  
*         BEGIN UPWARD MOVE.
  
 MVE15    SB7    -2          UPWARD MOVE
          SX2    X2+B7
          SX3    X3+B7
          SB7    B1+B1
          ZR     X6,MVE16    IF WORD COUNT EVEN 
          SA4    X2+B7       MOVE INITIAL WORD
          IX2    X2+X6
          BX7    X4 
          SA7    X3+B7
          IX3    X3+X6
  
*         INITIALIZE MOVE LOOP. 
  
 MVE16    ZR     X1,MVE=     IF MOVE COMPLETE 
          SA2    X2+B7       MOVE FIRST 2 WORDS 
          SA4    A2+B1
          BX6    X2 
          LX7    X4 
          SA6    X3+B7
          SA7    A6+B1
          SX3    B1+B1
          IX1    X1-X3
          ZR     X1,MVE=     IF MOVE COMPLETE 
          SA2    A2+B7       NEXT 2 WORDS 
          SA4    A4+B7
  
*         MOVE LOOP.
  
 MVE17    BX6    X2 
          SA2    A2+B7
          LX7    X4 
          SA4    A4+B7
          IX1    X1-X3
          NO
          SA6    A6+B7
          SA7    A7+B7
          NZ     X1,MVE17 
  
 MVEE     BSS    0           END OF CMU BUFFER AREA 
 MVELL    EQU    MVEE-MVEC   NUMBER OF WORDS IN BUFFER
  
 MVE=     PS                 ENTRY/EXIT 
          R=     B1,1 
 MVEA     BSS    0
 MVE1     SA4    MVEB        INITIALIZE FOR CMU 
          RJ     MVE11
*         IX4    X2-X3       CHECK DIRECTION OF MOVE (NO CMU) 
*         MX7    59          (NO CMU) 
*         JP     MVE13       (NO CMU) 
* 
*         IX4    X2-X3       CHECK DIRECTION OF MOVE (CMU)
*         BX7    X1          (CMU)
*         BX1    X0          SAVE X0 (CMU)
*         LX2    30          (CMU)
  
*         MOVE DATA WITH CMU. 
  
          ZR     X7,MVE=     IF NO DATA TO MOVE 
          SX6    X7-819 
          BX0    X4 
          NG     X4,MVE2     IF MOVE DOWNWARD 
          BX0    -X4
 MVE2     IX0    X0+X7
          BX6    X0*X6
          PL     X6,MVE3     IF BLOCK TOO LONG FOR 1 MOVE OR BLOCKS LAP 
          BX0    X7          SET UP FOR 1 MOVE
          BX2    X2+X3
          BX7    X7-X7       SET TO FORCE EXIT
          MX4    -4 
          SB7    MVE9 
          JP     MVE10
  
 MVE3     SX6    MVEC        SET INTERMEDIATE BUFFER ADDRESS
          NG     X4,MVE6     IF MOVE DOWNWARD 
  
*         MOVE UPWARD.
  
          BX2    X2+X6
          LX6    30 
          BX3    X3+X6
 MVE4     BX0    X7 
          SX7    X7-MVELL    DECREMENT WORD COUNT 
          MX4    -4 
          NG     X7,MVE5     IF LAST BLOCK TO MOVE
          SX0    MVELL
 MVE5     SB7    *+1         SET TO RETURN HERE 
          JP     MVE10
          IM     MVEB 
          SB7    X7 
          BX0    X1          RESTORE X0 
          LT     B7,B1,MVE=  IF MOVE COMPLETE 
          SX4    -MVELL      UPDATE ADDRESSES 
          IX3    X3-X4
          LX4    30 
          IX2    X2-X4
          JP     MVE4 
  
*         MOVE DOWNWARD.
  
 MVE6     LX6    30          SET LAST WORD ADDRESSES OF DATA AREAS
          BX6    X7+X6
          IX3    X3+X6
          LX6    30 
          IX2    X2+X6
 MVE7     SX6    MVELL
          SX0    X7 
          IX7    X7-X6
          MX4    -4 
          NG     X7,MVE8     IF LAST BLOCK TO MOVE
          BX0    X6 
 MVE8     BX6    X0          ADJUST DESTINATION AND SOURCE ADDRESSES
          IX3    X3-X0
          LX6    30 
          IX2    X2-X6
          SB7    *+1         SET TO RETURN HERE 
          JP     MVE10
          IM     MVEB        MOVE DATA TO DESTINATION BUFFER
 MVE9     SB7    X7 
          BX0    X1          RESTORE X0 
          LT     B7,B1,MVE=  IF MOVE COMPLETE 
          JP     MVE7        LOOP 
  
*         SETUP MOVE WORD.
*         (X0) = NUMBER OF WORDS TO MOVE. 
*         (X4) = 56 BIT MASK. 
  
 MVE10    LX6    X0,B1       10 * WORD COUNT = CHARACTER COUNT
          LX0    3
          IX6    X0+X6
          BX0    -X4*X6      EXTRACT LOWER PORTION
          BX4    X4*X6       EXTRACT UPPER PORTION
          LX0    26 
          LX4    48-4 
          BX0    X4+X0
          BX6    X2+X0
          SA6    MVEB        STORE FIRST DESCRIPTOR WORD
          BX6    X3+X0
          IM     MVEB        MOVE DATA TO INTERMEDIATE BUFFER 
          SA6    A6          STORE SECOND DESCRIPTOR WORD 
          JP     B7 
          SPACE  4
          BASE   *
 QUAL$    IF     -DEF,QUAL$ 
          QUAL   *
 MVE=     EQU    /COMCMVE/MVE=
 QUAL$    ENDIF 
          ENDX
