*COMDECK /MOVEDRM/
          TITLE     MOVE$RM                                              V2MISC 
*#
*0D   PURPOSE - 
*0        MOVE A STRING OF CHARACTERS.  PERFORMS MOVES FOR CRM. 
*         HAS ASSEMBLY MODES FOR CMU MOVES AND LCM MOVES. 
*0D   CALL -
*0        SB6       <RETURN ADDRESS>
*         EQ        =XGP.MOVE 
*0D   PARAMETERS -
*0        ALL INPUT IS IN REGISTERS:  
*0        X.TMP - DESTINATION ADDRESS                             (5) 
*         B.TMP - DESTINATION BCP (FRM 0 L TO R)           (5)           V2TEMP 
*         X.SRC - SOURCE ADDRESS                           (3)
*         B.SRC - SOURCE BCP                               (3)           V2TEMP 
*         B.CCT - NO. OF CHARACTERS IN MOVE                (4)           V2TEMP 
*0D   REGISTERS USED -
*0        INPUT      /A--------/X---3-5--/B-1-345--/
*         OUTPUT     /A--------/X---3-5-7/B----4---/
*         VOLATILE   /A-1-3-567/X-12345-7/B--2345--/
*         PRESERVED  /A0-2-4---/X0-----6-/B01----67/
*0D   RETURNS - 
*0        X.DST - ADDRESS OF LAST WORD STORED                  (7)
*         B.CCT - NUMBER OF CHARACTERS PUT IN LAST WORD    (4)           V2TEMP 
*                 0@ B.CCT @10, B.CCT=0 IF IT WAS INITIALLY 0            V2TEMP 
*         X.SRC - ADDRESS OF NEXT CHARACTER TO MOVE        (3)
*         X.TMP - ADDRESS OF NEXT CHARACTER POSITION TO STORE.  (5) 
*0D   RESTRICTIONS -
*0        2**17 - 1 IS THE MAXIMUM NUMBER OF CHARACTERS 
*         THAT CAN BE MOVED BY ANY CALL.                                 V2TEMP 
*#
 MSK  SET 1                                                              V2TEMP 
 XTR  SET 3                                                              V2TEMP 
 SRC  SET 3                                                              V2TEMP 
 SHF  SET 2                                                              V2TEMP 
 CCT  SET 4                                                              V2TEMP 
 TMP  SET 5                                                              V2TEMP 
 DST  SET 7                                                              V2TEMP 
ANO      SET     2                                                       V2TEMP 
 SBP     SET     4                                                       V2TEMP 
*                                                                        V2TEMP 
 MOVE$RM  BSS       0                                                    V2MISC 
 .MD      IFNE      #BETA#,0
          BX.MSK    X.TMP+X.SRC 
          LX.MSK    59-21 
          NG        X.MSK,BETA
 .MD      ENDIF 
          IF        DEF,#NOCMU#,3 
          IF        DEF,#CMU#,2 
          SA.MSK    RA.CMU         PICK UP CMU FLAG (BIT 59)
          PL        X.MSK,NOTCMU   IF NOT CMU MACHINE 
 CMU.RM   IF        DEF,#CMU# 
 DSC      SET    DST               DESCRIPTOR WORD                       V2TEMP 
 MAX      SET    SHF               MAX CHAR MOVE                         V2TEMP 
          SA.SRC X.SRC
          SA.TMP X.TMP
          SX.SRC B.CCT             HOLD COUNT                            V2TEMP 
          SX.DSC A.SRC                                                   V2TEMP 
          SX.ANO B.SRC             SOURCE ADDR                           V2TEMP 
          LX.DSC 8                                                       V2TEMP 
          BX.MSK X.DSC+X.ANO       SOURCE BIT                            V2TEMP 
          SX.ANO B.TMP                                                   V2TEMP 
          LX.MSK 4                                                       V2TEMP 
          BX.DSC X.MSK+X.ANO       DESTINATION BIT                       V2TEMP 
          SX.ANO A.TMP                                                   V2TEMP 
          LX.DSC 18                                                      V2TEMP 
          SB.MAX 8190                                                    V2TEMP 
          BX.DSC X.DSC+X.ANO       DESTINATION ADDRESS                   V2TEMP 
          BX.SBP X0                MOVE WILL CLOBBER X0                  V2TEMP 
          LE     B.CCT,B.MAX,SHORT                                       V2TEMP 
          SA.MSK LEN8190                                                 V2TEMP 
          BX.DSC X.DSC+X.MSK                                             V2TEMP 
          SA.TMP INC819                                                  V2TEMP 
          SA.DSC MVIWORD                                                 V2TEMP 
 MOVE     IM     MVIWORD           MOVE 8190 CHARACTERS                  V2TEMP 
 +        SB.CCT B.CCT-B.MAX                                             V2TEMP 
          IX.DSC X.DSC+X.TMP                                             V2TEMP 
          SA.DSC MVIWORD                                                 V2TEMP 
          GT     B.CCT,B.MAX,MOVE                                        V2TEMP 
          BX.DSC X.DSC-X.MSK                                             V2TEMP 
 SHORT    SX0    B.CCT                                                   V2TEMP 
          MX.MSK 60-4                                                    V2TEMP 
          BX.TMP X.MSK*X0          L(U)                                  V2TEMP 
          IX0    X0-X.TMP          L(L)                                  V2TEMP 
          LX.TMP 60-3-9-4                                                V2TEMP 
          BX.DSC X.DSC+X.TMP                                             V2TEMP 
          LX0    18+4+4                                                  V2TEMP 
          BX.DSC X.DSC+X0                                                V2TEMP 
          SA.DSC MVIWORD                                                 V2TEMP 
          IM     MVIWORD                                                 V2TEMP 
*     ALL IS MOVED NOW, SETUP RETURN REGISTERS..                         V2TEMP 
 +        SA.MSK TENTH                                                   V2TEMP 
          FX.DST X.MSK*X.SRC       COUNT/10 
          BX0    X.SBP             RESTORE X0                            V2TEMP 
          SB.SHF X.DST             SAVE WORD COUNT                       V2TEMP 
          SX.TMP X.DST+B.SHF                                             V2TEMP 
          IX.SRC X.SRC-X.TMP       CHAR-2*WRD                            V2TEMP 
          LX.TMP 2                                                       V2TEMP 
          IX.DST X.SRC-X.TMP       CHAR-10*WRD (REMAINDER)               V2TEMP 
          SX.SBP B.SRC+X.DST                                             V2TEMP 
          SA.SRC A.SRC+B.SHF                                             V2TEMP 
          SX.TMP X.SBP-10                                                V2TEMP 
          NG     X.TMP,ADJSRC                                            V2TEMP 
          BX.SBP X.TMP                                                   V2TEMP 
          SA.SRC A.SRC+B1                                                V2TEMP 
 ADJSRC   SA.TMP X.ANO+B.SHF                                             V2TEMP 
          SB.CCT B.TMP+X.DST                                             V2TEMP 
          SB.SHF 10                                                      V2TEMP 
          LT        B.CCT,B.SHF,ADJDST                                   V2TEMP 
          SA.TMP A.TMP+B1                                                V2TEMP 
          SB.CCT B.CCT-B.SHF                                             V2TEMP 
 ADJDST   BSS    0                                                       V2TEMP 
          SX.SRC A.SRC
          SX.TMP A.TMP
          JP     B6                                                      V2TEMP 
 MVIWORD                                                                 V2TEMP 
 INC819   MD     0,819,0,819,0                                           V2TEMP 
 LEN8190  MD     8190                                                    V2TEMP 
* MD 8191                                                                V2TEMP 
 CMU.RM   ENDIF 
 CMU.RM   IF        DEF,#NOCMU# 
 NOTCMU   BSS       0              CONTROL COMES HERE FOR NONE CMU MOVE 
 STO      EQU       6                                                    V2TEMP 
          SA.TMP X.TMP
          SA.SRC X.SRC
          NE        B.SRC,B.TMP,CHRMOVE                                  V2TEMP 
*     START WORD MOVE                                                    V2TEMP 
          ZR        B.SRC,WRDBND   IF ON WORD BOUNDRY                    V2TEMP 
          SA.MSK    MSKTBL+B.SRC                                         V2TEMP 
          BX.TMP    X.MSK*X.TMP    PRESERVE PART OF DEST. WORD           V2TEMP 
          SB.CCT    B.CCT+B.TMP                                          V2TEMP 
          BX.SRC    -X.MSK*X.SRC                                         V2TEMP 
          SB.CCT    B.CCT-10       = NUMBER OF CHR LEFT                  V2TEMP 
          BX.DST    X.TMP+X.SRC                                          V2TEMP 
          SA.DST    A.TMP                                                V2TEMP 
          EQ        FIREUP                                               V2TEMP 
 WRDBND   BSS       0                                                    V2TEMP 
*     IF B.CCT=0 THE CODE BELOW IS BAD                                   V2TEMP 
          BX.DST    X.SRC                                                V2TEMP 
          SB.CCT    B.CCT-10                                             V2TEMP 
          SA.DST    A.TMP          MOVE FIRST WORD                       V2TEMP 
 FIREUP   BSS       0              1-10 CHR HAVE BEEN MOVED              V2TEMP 
          SB.TMP    10                                                   V2TEMP 
          LE        B.CCT,B.TMP,TOOSHORT  IF ENOUGH MOVED                V2TEMP 
          SA.TMP    A.SRC+B1                                             V2TEMP 
          BX.ANO    X.STO          SAVE X6                               V2TEMP 
          SA.SRC    A.TMP+B1                                             V2TEMP 
          SB.XTR    B1+B1          2                                     V2TEMP 
          SB.CCT    B.CCT-20                                             V2TEMP 
          LE        B.CCT,B.TMP,JUSTTWO                                  V2TEMP 
*     MAIN LOOP -- MOVE 2 WORDS AT A TIME                                V2TEMP 
 TWOLOOP  BSS       0                                                    V2TEMP 
          BX.STO    X.TMP                                                V2TEMP 
          LX.DST    X.SRC                                                V2TEMP 
          SA.TMP    A.TMP+B.XTR    +2                                    V2TEMP 
          SA.SRC    A.SRC+B.XTR    +2                                    V2TEMP 
          SA.STO    A.DST+B1                                             V2TEMP 
          SB.CCT    B.CCT-20                                             V2TEMP 
          SA.DST    A.DST+B.XTR    +2                                    V2TEMP 
          GT        B.CCT,B.TMP,TWOLOOP                                  V2TEMP 
*     END MAIN LOOP                                                      V2TEMP 
 JUSTTWO  BSS       0                                                    V2TEMP 
          BX.STO    X.TMP                                                V2TEMP 
          LX.DST    X.SRC                                                V2TEMP 
          SA.STO    A.DST+1        STORE ANOTHER PAIR                    V2TEMP 
          SA.DST    A.DST+2                                              V2TEMP 
          BX.STO    X.ANO          RESTORE X6                            V2TEMP 
 TOOSHORT LE        B.CCT,B0,NOMO                                        V2TEMP 
          SA.SRC    A.SRC+B1       JUST ONE MORE WORD                    V2TEMP 
          BX.DST    X.SRC                                                V2TEMP 
          SB.CCT    B.CCT-10                                             V2TEMP 
          SA.DST    A.DST+1                                              V2TEMP 
 NOMO     ZR        B.CCT,STOPWB   IF STOP ON WORD BOUNDRY               V2TEMP 
          SB.CCT    B.CCT+10                                             V2TEMP 
          SX.SBP    B.CCT                                                V2TEMP 
          SX.TMP A.DST
 STOPBTA  SX.DST A.DST
          SX.SRC A.SRC
          JP        B6             RETURN                                V2TEMP 
 STOPWB   SX.TMP A.DST+B1 
          SX.SRC A.SRC+B1 
          SX.DST A.DST
          BX.SBP    X.SBP-X.SBP                                          V2TEMP 
          SB.CCT    B0                                                   V2TEMP 
          JP        B6             RETURN                                V2TEMP 
 CHRMOVE  BSS       0                                                    V2TEMP 
          SA.MSK    MSKTBL+B.TMP                                         V2TEMP 
          SB.XTR    B.TMP-B.SRC                                          V2TEMP 
          SB.CCT    B.TMP+B.CCT                                          V2TEMP 
                                                                         V2TEMP 
         SB.SHF    -B.XTR                                                V2TEMP 
         BX.DST    X.MSK*X.TMP            MASK OUT LOW ORDER PART.       V2TEMP 
         SX.TMP    B.SHF+B.SHF          MULTIPLY B.SHF (THE DIFFERENCE   V2TEMP 
         SB.SHF    X.TMP+B.SHF            IN NUM CHAR) BY 6 TO GET A     V2TEMP 
         SB.SHF    B.SHF+B.SHF            BIT-SHIFT COUNT.               V2TEMP 
         PL        B.XTR,CATPL                                           V2TEMP 
         LX.SRC    X.SRC,B.SHF          SHIFT THE SOURCE WORD TO         V2TEMP 
         BX.TMP    -X.MSK*X.SRC           MOVE PART OF IT TO DEXT.       V2TEMP 
         SA.SRC    A.SRC+B1             LOAD NEXT SOURCE WORD.           V2TEMP 
         SA.MSK    MSKTBL+10+B.XTR      THE MASK FOR FUTURE SPLITTING.   V2TEMP 
         BX.TMP    X.DST+X.TMP          MOVE PART TO DEST.               V2TEMP 
         SX.SBP  B.XTR                                                   V2TEMP 
         LX.SRC    X.SRC,B.SHF          ROTATE SOURCE WORD.              V2TEMP 
         BX.DST    X.MSK*X.TMP          MOVE PART OF WORD.               V2TEMP 
         BX.TMP    -X.MSK*X.SRC                                          V2TEMP 
         EQ        REJOIN                                                V2TEMP 
CATPL    BSS      0                                                      V2TEMP 
         SB.SHF    B.SHF+60                                              V2TEMP 
         LX.SRC    X.SRC,B.SHF          SHIFT THE SOURCE WORD TO         V2TEMP 
         BX.TMP    -X.MSK*X.SRC           MOVE PART OF IT TO             V2TEMP 
         SA.MSK    MSKTBL+00+B.XTR      THE MASK FOR FUTURE SPLITTING.   V2TEMP 
         SX.SBP  B.XTR+0                                                 V2TEMP 
REJOIN   BSS       0                                                     V2TEMP 
         BX.DST    X.DST+X.TMP            THE DESTINATION WROD.          V2TEMP 
         SB.XTR    10                   TEN CHARACTERS PER WORD.         V2TEMP 
         SA.DST    A.TMP                STORE DEST AND SET A.DST.        V2TEMP 
         LE        B.CCT,B.XTR,QUIT     SEE IF WE ARE ALREADY THROUGH.   V2TEMP 
         BX.ANO    X.MSK*X.SRC                                           V2TEMP 
         SA.SRC    A.SRC+B1                                              V2TEMP 
         SB.CCT    B.CCT-B.XTR                                           V2TEMP 
         LX.TMP    X.SRC,B.SHF                                           V2TEMP 
         LE      B.CCT,B.XTR,QUIT1                                       V2TEMP 
                                                                         V2TEMP 
LOOP     BSS       0                                                     V2TEMP 
         BX.DST   -X.MSK*X.TMP                                           V2TEMP 
         IX.TMP    X.TMP-X.DST                                           V2TEMP 
         SA.SRC    A.SRC+B1                                              V2TEMP 
         BX.DST    X.DST+X.ANO                                           V2TEMP 
         LX.ANO    X.TMP                                                 V2TEMP 
         SB.CCT    B.CCT-B.XTR                                           V2TEMP 
         SA.DST    A.DST+B1                                              V2TEMP 
         LX.TMP    X.SRC,B.SHF                                           V2TEMP 
         GT        B.CCT,B.XTR,LOOP                                      V2TEMP 
 QUIT1   BSS     0                                                       V2TEMP 
         BX.SRC    -X.MSK*X.TMP                                          V2TEMP 
         BX.DST    X.ANO+X.SRC                                           V2TEMP 
          SA.DST A.DST+B1                                                V2TEMP 
          SA.TMP A.DST                                                   V2TEMP 
 QUIT     BSS    0                                                       V2TEMP 
          PL     X.SBP,QQ22                                              V2TEMP 
          SX.SBP X.SBP+10                                                V2TEMP 
 QQ22     BSS    0                                                       V2TEMP 
          BX.ANO -X.SBP                                                  V2TEMP 
          SX.SBP X.ANO+B.CCT                                             V2TEMP 
          PL     X.SBP,MJPB6                                             V2TEMP 
          SA.SRC A.SRC-1                                                 V2TEMP 
          SX.SBP X.SBP+10                                                V2TEMP 
 MJPB6    BSS    0                                                       V2TEMP 
          NE     B.CCT,B.XTR,QQ11                                        V2TEMP 
          SA.TMP A.TMP+B1                                                V2TEMP 
          SB.CCT B0                                                      V2TEMP 
 QQ11     BSS    0                                                       V2TEMP 
          SX.ANO X.SBP-10                                                V2TEMP 
          NZ     X.ANO,WW33                                              V2TEMP 
          SA.SRC A.SRC+1                                                 V2TEMP 
          SX.SBP 0                                                       V2TEMP 
 WW33     BSS    0                                                       V2TEMP 
          SX.TMP A.TMP
          EQ     STOPBTA
*CALL /MOVELCM/ 
                                                                         V2TEMP 
MSKTBL   DATA      0                                                     V2TEMP 
XMSK     MICRO     1,,*00000000000000000000*                             V2TEMP 
         DUP       10,2                                                  V2TEMP 
XMSK     MICRO     1,20,*77"XMSK"*                                       V2TEMP 
         DATA      "XMSK"B                                               V2TEMP 
 CMU.RM   ENDIF                                                          V2TEMP 
* END /MOVEDRM/ 
