*COMDECK COMCMNS
 MNS      CTEXT  COMCMNS - MOVE NON-OVERLAPPING STRING. 
 MNS      SPACE  4,10 
          IF     -DEF,QUAL$,1 
          QUAL   COMCMNS
          BASE   D
*         COMMENT COPYRIGHT CONTROL DATA CORPORATION 1978.
 MNS      SPACE  4,10 
***       MNS - MOVE NON-OVERLAPPING BIT STRING.
* 
*         R. E. JAMES.       77/09/09.
*         L. D. HARE.        78/04/12.
*         L. D. HARE.        79/11/15 (CMU CODE). 
* 
*         ******************************************************* 
*         * THIS COMMON DECK IS PART OF THE COMMON COMMON DECKS * 
*         * RESIDING ON THE COMPASS PROGRAM LIBRARY, AND BEING  * 
*         * MAINTAINED BY THE COMPASS PROJECT.  ANY CHANGES     * 
*         * REQUIRED SHOULD BE DIRECTED TO THE COMPASS PROJECT  * 
*         * THROUGH THE PROPER PROCEDURE.                       * 
*         ******************************************************* 
* 
* 
*         MNS WILL MOVE A BIT STRING FROM ONE CM LOCATION TO ANOTHER, 
*         NO-OVERLAP ALLOWED. 
 MNS      SPACE  4,10 
***       MNS WILL MOVE A SPECIFIED SOURCE STRING FROM ONE LOCATION 
*         TO ANOTHER IN CENTRAL MEMORY.  THE ONLY BITS DISTURBED IN 
*         THE DESTINATION FIELD WILL BE THOSE EXTRACTED TO ACCEPT 
*         THE SOURCE. THE DESTINATION FIELD MAY NOT OVERLAP THE SOURCE
*         FIELD IN ANY RESPECT, RESULTS ARE UNDEFINED IF THIS OCCURS. 
*         THE COMDECK *COMCMOS* IS PROVIDED FOR OVERLAPPING MOVES.
* 
*         ENTRY  (B1) = 1.
*                (B2) = SOURCE FIRST BIT (0,1,..,59). 
*                (B4) = DESTINATION FIRST BIT (0,1,..,59).
*                (X0) = NUMBER OF BITS TO MOVE. 
*                (X2) = SOURCE FIRST WORD ADDRESS.
*                (X4) = DESTINATION FIRST WORD ADDRESS. 
* 
*         EXIT   (B1) = 1.
*                (B2) = SOURCE NEXT BIT (0,1,..,59).
*                (B4) = DESTINATION NEXT BIT (0,1,..,59). 
*                (X2) = SOURCE NEXT WORD ADDRESS. 
*                (X4) = DESTINATION NEXT WORD ADDRESS.
* 
*         USES   X0, X1, X2, X3, X4, X5, X6, X7.
*                B1, B2, B3, B4, B5, B6.
*                A1, A2, A3, A5, A6, A7.
* 
*         CALLS  NONE.
  
*         THE COMMENTING SCHEME INVOLVED HEREIN COULD ALSO USE
*         SOME EXPLANATION.  IT IS BASED ON A SIX BIT WORD, EACH BIT
*         IDENTIFIED BY A LETTER IN THE 64 CHARACTER CHARACTER SET. 
*         THE OVERALL ASSUMPTION IS THAT THE SOURCE STARTS AT BIT 0,
*         (LEFT MOST), AND THE DESTINATION COMMENCES AT BIT 3 (THE
*         MIDDLE).  THIS ASSUMPTION IS MODIFIED FOR THE BIT ALIGNED 
*         MOVE (MNS10 ET SEQ.), AND FOR THE FIRST BIT SOURCE GREATER
*         THAN FIRST BIT DESTINATION CASE (MNS50 ET SEQ.).  THE 
*         COMMENTS EXPLAIN THE DIFFERENCE FOR THESE CASES.
 MNS      SPACE  4,10 
*         ONE TIME INITIALIZATION CODE BASED ON THE PRESENCE
*         OF *CMU*. 
  
 MNS32    SB5    60          BITS PER WORD
          SA1    MNSD        1S48/6 + 1 
  
          SA1    RA.CMU 
          SA5    MNSC 
          AX1    59          SIGN EXTEND CMU FLAG 
          BX6    X1*X3
          BX5    -X1*X5 
          IX7    X5+X6
          SA7    MNSB        SET CORRECT INITIALIZATION CODE
  
          RJ     *
  
          EQ     MNS02       RESTART
  
*         MNS - MOVE BIT STRING WITH NO OVERLAP.
* 
*         SITUATION:         /  X1  /  X2  /  X3  /  X5  /  X6  /  X7  /
*                            /ABCDEF/      /XXXXXX/  X4 =(XXX...)      /
  
 MNS40    GT     B2,B4,MNS50  IF 1*ST BIT SOURCE .GT. 1*ST BIT DEST.
          SB4    B3+B5       CORRECT SHIFT COUNT
          LX7    X1,B4       /      /      /      /      /      /DEFABC/
          BX6    -X6*X7      /      /      /      /      /...ABC/      /
          BX6    X4+X6       /      /      /      /      /XXXABC/      /
          MI     X0,MNS120   IF BOTH FINISH IN ONE WORD 
          SX1    B1 
          LX2    X1,B4
          SB3    B3+B5       CORRECT SHIFT COUNT
          IX4    X1-X2       MASK 
          BX3    X4*X7       /      /      /DEF.../      /      /      /
          EQ     MNS60       CONTINUE 
  
*         FIRST BIT SOURCE .GT. FIRST BIT DESTINATION.
* 
*         SITUATION FOR      /  X1  /  X2  /  X3  /  X5  /  X6  /  X7  /
*         THIS CASE IS:      /YYYYAB/      /XXXXXX/  X4 =(XXX...)      /
  
 MNS50    LX7    X1,B3       /      /      /      /      /      /YYYABY/
          BX6    -X6*X7      /      /      /      /      /...ABY/      /
          SX1    B1 
          LX2    X1,B3
          BX6    X4+X6       /      /      /      /      /XXXABY/      /
          IX4    X1-X2       MASK 
          SA1    A1+B1       /CDEFGH/      /      /      /      /      /
          BX2    X4*X6       /      /XXXAB./      /      /      /      /
          LX7    X1,B3       /      /      /      /      /      /DEFGHC/
          BX1    -X4*X7      /.....C/      /      /      /      /      /
          BX6    X2+X1       /      /      /      /      /XXXABC/      /
          MI     X0,MNS110   IF ALL FITS IN ONE WORD
          BX3    X4*X7       /      /      /DEFGH./      /      /      /
  
*         DESTINATION FIELD EXTENDS OVER A WORD BOUNDARY. 
*         NOTE: COMMENTS CONTINUE FROM *MNS40* CODE.
* 
*         SITUATION:         /  X1  /  X2  /  X3  /  X5  /  X6  /  X7  /
*                            /      /      /DEF.../      /XXXABC/      /
  
 MNS60    SX7    B5+B5
          SA6    A3          /      /      /      /      /*STOR*/      /
          IX0    X0-X7       /      /      /DEF.../      /      /      /
          SA1    A1+B1       /GHIJKL/      /      /      /      /      /
          MI     X0,MNS90    IF 2 WORD FIT
  
*         SITUATION:         /  X1  /  X2  /  X3  /  X5  /  X6  /  X7  /
*                            /GHIJKL/      /DEF.../      /      /      /
  
          SA2    A1+B1       /      /MNOPQR/      /      /      /      /
          LX5    X1,B3       /      /      /      /JKLGHI/      /      /
          SA1    A2+B1       /STUVWX/      /      /      /      /      /
          IX0    X0-X7
          BX7    -X4*X5      /      /      /      /      /      /...GHI/
          IX5    X5-X7       /      /      /      /JKL.../      /      /
          BX7    X3+X7       /      /      /      /      /      /DEFGHI/
          LX2    X2,B3       /      /PQRMNO/      /      /      /      /
          MI     X0,MNS80    IF 3 WORD FIT
  
*         SITUATION:         /  X1  /  X2  /  X3  /  X5  /  X6  /  X7  /
*                            /STUVWX/PQRMNO/DEF.../JKL.../      /DEFGHI/
  
 MNS70    SA7    A6+B1       /      /      /      /      /      /*STOR*/
          BX6    -X4*X2      /      /      /      /      /...MNO/      /
          LX1    X1,B3       /VWXSTU/      /      /      /      /      /
          SX7    B5+B5
          IX3    X2-X6       /      /      /PQR.../      /      /      /
          SA2    A1+B1       /      /YZ0123/      /      /      /      /
          BX6    X5+X6       /      /      /      /      /JKLMNO/      /
          IX0    X0-X7
          SA6    A7+B1       /      /      /      /      /*STOR*/      /
          BX7    -X4*X1      /      /      /      /      /      /...STU/
          IX5    X1-X7       /      /      /      /VWX.../      /      /
          SA1    A2+B1       /456789/      /      /      /      /      /
          LX2    X2,B3       /      /123WX0/      /      /      /      /
          BX7    X3+X7       /      /      /      /      /      /PQRSTU/
          PL     X0,MNS70    IF MORE TO GO
  
*         SITUATION:         /  X1  /  X2  /  X3  /  X5  /  X6  /  X7  /
*         JUMPED:            /STUVWX/PQRMNO/      /JKL.../      /DEFGHI/
*         FALL THROUGH:      /456789/123YZ0/      /VWX.../      /PQRSTU/
  
 MNS80    BX6    -X4*X2      /      /      /      /      /...YZ0/      /
          IX3    X2-X6       /      /      /123.../      /      /      /
          SA7    A6+1        /      /      /      /      /      /*STOR*/
          BX6    X5+X6       /      /      /      /      /VWXYZ0/      /
          MX5    1
          SA6    A7+1        /      /      /      /      /*STOR*/      /
  
*         SITUATION:         /  X1  /  X2  /  X3  /  X5  /  X6  /  X7  /
*         JUMPED:            /GHIJKL/      /DEF.../      /      /      /
*         FALL THROUGH:      /456789/      /123.../      /      /      /
  
 MNS90    SX0    X0+60
          MI     X0,MNS100   IF NO MORE SOURCE WORDS
          LX2    X1,B3       /      /789456/      /      /      /      /
          SA1    A1+B1       /+-*/()/      /      /      /      /      /
          BX7    -X4*X2      /      /      /      /      /      /...456/
          BX6    X3+X7       /      /      /      /      /123456/      /
          SX0    X0-60
          IX3    X2-X7       /      /      /789.../      /      /      /
          SA6    A6+B1       /      /      /      /      /*STOR*/      /
  
*         SITUATION:         /  X1  /  X2  /  X3  /  X5  /  X6  /  X7  /
*         JUMPED:            /456789/      /123.../      /      /      /
*         FALL THROUGH:      /+-*/()/      /789.../      /      /      /
  
 MNS100   LX7    X1,B3       /      /      /      /      /      //()+-*/
          BX2    -X4*X7      /      /...+-*/      /      /      /      /
          BX6    X3+X2       /      /      /      /      /789+-*/      /
          SA3    A6+B1       /      /      /XXXXXX/      /      /      /
  
*         SITUATION:         /  X1  /  X2  /  X3  /  X5  /  X6  /  X7  /
*         JUMPED:            /      /      /XXXXXX/      /XXXABC/DEFABC/
*         FALL THROUGH:      /+-*/()/...+-*/XXXXXX/      /789+-*//()+-*/
  
 MNS110   SB2    X0+B3
          SX2    A1-B1       COMPENSATE FOR READ AHEAD
          LT     B2,MNS120   IF LAST WORD WAS FROM READ AHEAD 
          SX2    A1 
          SB3    B3-B5
 MNS120   SB4    X0+B5       DESTINATION BIT POSITION 
          SX4    A3          DESTINATION WORD ADDRESS 
          SB2    B4+B3       SOURCE BIT POSITION
          ZR     B4,MNS      IF FINISHED
          SB3    B4-B1
          AX0    X5,B3       MASK 
          BX1    X0*X6       /789.../      /      /      /      /      /
          BX7    -X0*X3      /      /      /      /      /      /...XXX/
          BX6    X1+X7       /      /      /      /      /789XXX/      /
          SA6    A3          /      /      /      /      /*STOR*/      /
  
*         ENTER HERE, DETERMINE PRESENCE OF *CMU*.
  
 MNS      SUBR               ENTRY/EXIT.. 
  
 MNS02    SA3    MNSA        INITIAL *WITH CMU* CODE
          RJ     MNS32       PERFORM ONE TIME INITIALIZATION
  
*         THE ABOVE INSTRUCTIONS WILL BE REPLACED BY: 
* 
*         WITH CMU:-  SB5  60     BITS PER WORD 
*                     SA1  MNSC   1S48/6 + 1
* 
*         NO CMU:-    SB5  60 
*                     EQ   MNS06  IGNORE CMU CODE 
  
          SX3    3*60 
          SA5    X4 
          SX7    B2          SF = FIRST SOURCE BIT
          IX5    X3-X0
          FX3    X0*X1       L6 = LENGTH / 6
          PL     X5,MNS06    IF QUICKER NOT TO USE CMU
          SX6    B4          DF = DESTINATION FIRST BIT 
          FX5    X7*X1       S6 = SF / 6 = SOURCE FIRST CHARACTER 
          SB3    X3 
          SB6    X5 
          SB3    B3+B3       L2 = L6 * 2
          SB6    B6+B6       S2 = S6 * 2
          FX1    X6*X1       D6 = DF / 6 = DESTINATION FIRST CHARACTER
          LX7    X5 
          BX6    X3 
          LX7    2           S4 = S6 * 4
          LX6    2           L4 = L6 * 4
          SB6    B6+X7       SX = S2 + S4 
          SB5    X1 
          SX6    B3+X6       LX = L2 + L4 
          SB5    B5+B5       D2 = D6 * 2
          IX7    X0-X6       ML = LENGTH - LX = MOD(LENGTH,6) 
          SB3    B5+B5       D4 = D2 + D2 
          SX6    B2-B6       MS = SF - SX = MOD(SF,6) 
          SB5    B3+B5       DX = D4 + D2 
          BX7    X7+X6       REMAINDER = ML .OR. MS 
          SX6    B4-B5       MD = DF - DX = MOD(DF,6) 
          SB5    60          BITS PER WORD
          BX7    X6+X7       REMAINDER = REMAINDER .OR. MD
          NO
          NZ     X7,MNS06    IF NOT CHARACTER ORIENTED
  
          SA2    X2 
  
*         SET UP CMU INSTRUCTION AND EXECUTE IT.
  
 MNS04    SX2    8191        MAX CMU CHARACTERS TRANSFERABLE
          SX7    A2          SA = SOURCE ADDRESS
          IX0    X3-X2
          LX7    30          POSITION SOURCE ADDRESS
          AX0    60 
          SX6    A5          DA = DESTINATION ADDRESS 
          BX4    -X0*X2 
          IX7    X6+X7       SA + DA
          BX0    X0*X3
          SX6    X1          DF = D6
          IX4    X0+X4       CHARS TO TRANSMIT = MIN(8191,L6) 
          LX6    18          POSITION DF
          MX0    -4 
          BX7    X6+X7       SA + DF + DA 
          BX2    -X0*X4      LO BITS L6 
          LX6    X5          SF = S6
          BX0    X0*X4       HI BITS L6 
          LX6    22          POSITION SF
          LX2    26          POSITION LO L6 
          IX7    X6+X7       SA + SF + DF + DA
          LX0    48-4        POSITION HI L6 
          BX7    X2+X7       SA + LO L6 + SF + DF + DA
          IX2    X3-X4
          BX6    X0+X7       HI L6 + SA + LO L6 + SF + DF + DA
          SB5    X2          REMAINING CHARACTERS 
          SA6    MNSF 
  
          IM     MNSF        INDIRECT CMU MOVE
  
*         SET UP EXIT CONDITION IN CHARACTERS.
  
          IX1    X1+X4       D6 + TRANSMITTED CHARACTERS
          SA3    MNSE        IS48E-1 + 1
          IX5    X5+X4       S6 + TRANSMITTED CHARACTERS
          FX6    X1*X3       D10 = D6 / 10
          FX7    X5*X3       S10 = S6 / 10
          LX0    B1,X6       D10 * 2
          LX2    B1,X7       S10 * 2
          BX4    X0 
          BX3    X2 
          LX4    2           D10 * 8
          SB6    X6 
          LX3    2           S10 * 8
          SB2    X7 
          IX4    X0+X4       D10 * 10 
          BX7    X5 
          IX3    X2+X3       S10 * 10 
          SA2    A2+B2       NEW FWA SOURCE 
          SA5    A5+B6       NEW FWA DESTINATION
          IX1    X1-X4       NEW FIRST CHARACTER DESTINATION
          IX5    X7-X3       NEW FIRST CHARACTER SOURCE 
          SX3    B5          CHARACTERS LEFT TO TRANSMIT
  
          GT     B5,B0,MNS04 IF MORE TO TRANSMIT
  
*         EXIT PROCESSING, CONVERT CHARACTERS TO BITS 
*         AND RESET ADDRESS REGISTERS.
  
          LX6    B1,X1       D6 * 2 
          IX7    X5+X5       S6 * 2 
          LX1    2           D6 * 4 
          LX5    2           S6 * 4 
          IX6    X6+X1       D6 * 6 
          SX2    A2 
          SB4    X6 
          IX7    X7+X5       S6 * 6 
          SX4    A5 
          SB2    X7 
  
          EQ     MNS         EXIT.. 
  
*         DETERMINE IF A BIT ALIGNED MOVE IS POSSIBLE (DESTINATION
*         STRING WILL OCCUPY SAME WORD RELATIVE POSITION AS SOURCE
*         STRING).
* 
*         SITUATION:         /  X1  /  X2  /  X3  /  X5  /  X6  /  X7  /
*                            /      /      /      /      /      /      /
  
 MNS06    MX5    1
          SA3    X4          /      /      /XXXXXX/      /      /      /
          SA1    X2          /ABCDEF/      /      /      /      /      /
          SX7    B4-B5
          AX6    X5,B4
          SB3    B2-B4       SHIFT COUNT
          BX4    -X5*X6 
          LX6    X4,B1       MASK FOR FIRST DESTINATION WORD
          IX0    X7+X0
          BX4    X6*X3       /      /  X4 =(XXX...)      /      /      /
          NE     B2,B4,MNS40 IF NOT A BIT ALIGNED MOVE
  
*         PROCESS BIT ALIGNED MOVE.  NOTE THAT FOR OUR COMMENTING 
*         EXAMPLE A BIT ALIGNED MOVE WOULD IMPLY A ZERO BIT MASK, 
*         HENCE:  
* 
*         SITUATION:         /  X1  /  X2  /  X3  /  X5  /  X6  /  X7  /
*                            /ABCDEF/  X4 =(......)      /....../      /
  
          BX7    -X6*X1      /      /      /      /      /      /ABCDEF/
          BX6    X7+X4       /      /      /      /      /ABCDEF/      /
          MI     X0,MNS120   IF ALL FITS IN ONE WORD
          SA1    A1+B1       /GHIJKL/      /      /      /      /      /
          SA6    A3          /      /      /      /      /*STOR*/      /
          SX4    B5+B5
          SA3    A1+B1       /      /      /MNOPQR/      /      /      /
          IX0    X0-X4
          BX7    X1          /      /      /      /      /      /GHIJKL/
          MI     X0,MNS20    IF ALL FITS IN TWO WORDS 
 MNS10    SA7    A6+B1       /      /      /      /      /      /*STOR*/
          BX6    X3          /      /      /      /      /MNOPQR/      /
          IX0    X0-X4
          SA1    A3+B1       /STUVWX/      /      /      /      /      /
          SA3    A3+2        /      /      /Z01234/      /      /      /
          BX7    X1          /      /      /      /      /      /STUVWX/
          SA6    A7+B1       /      /      /      /      /*STOR*/      /
          PL     X0,MNS10    IF NEXT WORD IS A 60 BIT MOVE
 MNS20    SX0    X0+60
          SX2    A1 
          BX6    X7          /      /      /      /      /STUVWX/      /
          MI     X0,MNS30    IF LAST WORD FETCHED NOT LAST TO MOVE
          SA6    A6+1        /      /      /      /      /*STOR*/      /
          SX0    X0-60
          SX2    A3 
          BX6    X3          /      /      /      /      /Z01234/      /
 MNS30    SA3    A6+B1       FETCH LAST DESTINATION WORD
          EQ     MNS120      GO TO HANDLE THE MASKING 
 MNS      SPACE  4,10 
*         STORAGE.
  
 MNSA     EQU    MNS32
 MNSB     EQU    MNS02
 MNSC     SB5    60 
          EQ     MNS06       IGNORE CMU CODE
 MNSD     CON    1252525252525253B  1S48/6 + 1
 MNSE     CON    1S48E-1+1   ONE TENTH + 1
 MNSF     BSS    1           CMU *IM* INDIRECT WORD 
 MNS      SPACE  4,10 
          BASE   *
 QUAL$    IF     -DEF,QUAL$ 
          QUAL   *
 MNS      EQU    /COMCMNS/MNS 
 MNS=     EQU    MNS
 QUAL$    ENDIF 
 MNS      ENDX
