*COMDECK  COMCSVR            SAVE REGISTERS.                             COMCSVR
 SVR      CTEXT  COMCSVR - SAVE ALL REGISTERS.                           COMCSVR
 SVR      SPACE  4,10                                                    COMCSVR
          IF     -DEF,QUAL$,1                                            COMCSVR
          QUAL   COMCSVR                                                 COMCSVR
          BASE   D                                                       COMCSVR
*         COMMENT COPYRIGHT CONTROL DATA CORPORATION. 1978.              COMCSVR
 SVR      SPACE  4,10                                                    COMCSVR
***       SVR - SAVE ALL REGISTERS.                                      COMCSVR
*                                                                        COMCSVR
*         AUTHOR UNKNOWN.    CIRCA 1971.                                 CPSA104
*         P. C. TAM.         77/06/18.                                   COMCSVR
*                                                                        COMCSVR
*         SVR SAVES ALL REGISTERS IN A SPECIFIED REGISTER SAVE AREA.     COMCSVR
* 
*         ******************************************************* 
*         * 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.                       * 
*         ******************************************************* 
* 
 SVR      SPACE  4,10                                                    COMCSVR
***       SVR SAVES ALL REGISTERS IN A SPECIFIED REGISTER SAVE AREA.     COMCSVR
*         THE REGISTERS ARE SAVED IN THE FOLLOWING ORDER -               COMCSVR
*         B0, B1, ..., B7, A0, A1, ..., A7, X0, X1, ..., X7.             COMCSVR
*         EACH REGISTER OCCUPIES A FULL WORD WITH B AND A REGISTER       COMCSVR
*         VALUES IN BITS 17-0. B AND A REGISTERS ARE SIGN EXTENDED.      COMCSVR
*         MINUS ZERO (-0) IS PRESERVED IN ALL REGISTERS.                 COMCSVR
*                                                                        COMCSVR
*         ENTRY  BITS 17-0 OF THE WORD FROM WHICH SVR= WAS CALLED        COMCSVR
*                CONTAIN THE ADDRESS OF THE REGISTER SAVE AREA.          COMCSVR
*                                                                        COMCSVR
*         EXIT   (SAVE - SAVE+7) = B REGISTERS.                          COMCSVR
*                (SAVE+8 - SAVE+15) = A REGISTERS.                       COMCSVR
*                (SAVE+16 - SAVE+23) = X REGISTERS.                      COMCSVR
*                                                                        COMCSVR
*         USES   A - 0, 1, 2, 3, 4, 5, 6, 7.                             COMCSVR
*                B - 1, 2, 3, 4, 5, 6, 7.                                COMCSVR
*                X - 0, 1, 2, 3, 4, 5, 6, 7.                             COMCSVR
*                                                                        COMCSVR
*         CALLS  NONE.                                                   COMCSVR
                                                                         COMCSVR
                                                                         COMCSVR
 SAVEB    EQU    0                                                       COMCSVR
 SAVEA    EQU    8                                                       COMCSVR
 SAVEX    EQU    16                                                      COMCSVR
                                                                         COMCSVR
 SVR      SUBR               ENTRY/EXIT                                  COMCSVR
                                                                         COMCSVR
*         CHECK FOR (B1) = 1. IF NOT, SAVE (B1) THE HARD WAY BY          COMCSVR
*         EXECUTING THE RJ SEQUENCE AT *SVR2*. IF BIT                    COMCSVR
*         2**N WAS ON IN (B1), THEN THE *RJ* AT (SVR2+2*N+1) WILL BE     COMCSVR
*         EXECUTED, RESULTING IN AN /EQ SVR2+2*N+1/. IF BIT 2**N WAS     COMCSVR
*         NOT ON IN (B1), THEN THE *RJ* WILL NOT BE EXECUTED. BY         COMCSVR
*         QUERYING (SVR2+2*N+1), ONE CAN DETERMINE WHETHER OR NOT THE    COMCSVR
*         BIT 2**N WAS ON IN (B1) BY THE PRESENCE OF AN *EQ* OR AN *RJ*  COMCSVR
*         INSTRUCTION.                                                   COMCSVR
                                                                         COMCSVR
          MI     B1,SVR2     IF (B1) .LE. 0 (PRESERVE -0)                COMCSVR
          SB1    B1-1                                                    COMCSVR
          ZR     B1,SVR4     IF (B1) = 1                                 COMCSVR
          SB1    B1+1        RESTORE (B1)                                COMCSVR
                                                                         COMCSVR
*         *RJ* SEQUENCE FOR SAVING (B1).                                 COMCSVR
                                                                         COMCSVR
 SVR2     PL     B1,*+2                                                  COMCSVR
 +        RJ     *                                                       COMCSVR
 B.NE.1   DUP    17                                                      COMCSVR
 +        SB1    B1+B1                                                   COMCSVR
          NO                                                             COMCSVR
          PL     B1,*+2                                                  COMCSVR
 +        RJ     *                                                       COMCSVR
 B.NE.1   ENDD                                                           COMCSVR
                                                                         COMCSVR
*         FILLER BECAUSE RJ-S MUST BE 2 WORDS APART FOR RESTORE.         COMCSVR
                                                                         COMCSVR
 +        SB0    B0+                                                     COMCSVR
 SVR3     RJ     *           (B1) = 1/(B1) .NE. 1 FLAG                   COMCSVR
                                                                         COMCSVR
*         SAVE   (A) - 4,5,6,7.                                          COMCSVR
*                (X) - 4,5,6,7.                                          COMCSVR
                                                                         COMCSVR
 SVR4     SB1    A7-B0       SAVE (A7) TEMPORARILY.                      COMCSVR
          SA7    SVRA        SAVE (X7) TEMPORARILY                       COMCSVR
          SX7    A5-B0                                                   COMCSVR
          SA7    SVRB        SAVE (A5) TEMPORARILY                       COMCSVR
          BX7    X5                                                      COMCSVR
          SA7    SVRC        SAVE (X5) TEMPORARILY                       COMCSVR
          SA5    SVRX        (X5) = 30/EQ CALLER+1, 30/0                 COMCSVR
          LX5    30                                                      COMCSVR
          SA5    X5-1        (X5) = 30/RJ SVR=, 30/FWA OF RSA            COMCSVR
          SX7    B1-B0                                                   COMCSVR
          SB1    1                                                       COMCSVR
          SA7    X5+SAVEA+7  (A7) TO SAVE AREA                           COMCSVR
          SX7    A6-B0                                                   COMCSVR
          SA6    X5+SAVEX+6  (X6) TO SAVE AREA                           COMCSVR
          SA7    A7-B1       (A6) TO SAVE AREA                           COMCSVR
          BX6    X4                                                      COMCSVR
          SX7    A4-B0                                                   COMCSVR
          SA6    A6-2        (X4) TO SAVE AREA                           COMCSVR
          SA7    A7-2        (A4) TO SAVE AREA                           COMCSVR
                                                                         COMCSVR
*         SAVE   (A) - 0,1,2,3.                                          COMCSVR
*                (X) - 0,1,2,3.                                          COMCSVR
                                                                         COMCSVR
 SV=AX    ECHO   ,N=(3,2,1,0)                                            COMCSVR
          BX6    X.N                                                     COMCSVR
          SX7    A.N-B0                                                  COMCSVR
          SA6    A6-B1       (X.N) TO SAVE AREA                          COMCSVR
          SA7    A7-B1       (A.N) TO SAVE AREA                          COMCSVR
 SV=AX    ENDD                                                           COMCSVR
                                                                         COMCSVR
*         SAVE (X7), (A5), (X5) FINALLY.                                 COMCSVR
                                                                         COMCSVR
          SA2    SVRA        (X2) = SAVED (X7)                           COMCSVR
          SA3    SVRB        (X3) = SAVED (A5)                           COMCSVR
          SA4    SVRC        (X4) = SAVED (X5)                           COMCSVR
          BX6    X2                                                      COMCSVR
          LX7    X3                                                      COMCSVR
          SA6    X5+SAVEX+7  (X7) TO SAVE AREA                           COMCSVR
          SA7    X5+SAVEA+5  (A5) TO SAVE AREA                           COMCSVR
          BX6    X4                                                      COMCSVR
          SA6    X5+SAVEX+5  (X5) TO SAVE AREA                           COMCSVR
                                                                         COMCSVR
*         SAVE   (B) - 0,1,2,3,4,5,6,7.                                  COMCSVR
                                                                         COMCSVR
          BX6    X6-X6                                                   COMCSVR
          SA6    X5+SAVEB+0  (B0) = 0 TO SAVE AREA                       COMCSVR
          SX7    B1                                                      COMCSVR
          SA7    A6+B1                                                   COMCSVR
 SV=B     ECHO   ,U=(2,4,6),L=(3,5,7)                                    COMCSVR
          SX6    B.U-B0                                                  COMCSVR
          SX7    B.L-B0                                                  COMCSVR
          SA6    A7+B1                                                   COMCSVR
          SA7    A6+B1                                                   COMCSVR
 SV=B     ENDD                                                           COMCSVR
                                                                         COMCSVR
*         SAVE (B1).                                                     COMCSVR
                                                                         COMCSVR
          SA5    SVR3        (X5) = (B1) = 1/(B1) .NE. 1 FLAG            COMCSVR
          SX4    0100B       (X4) = *RJ* OP CODE                         COMCSVR
          SX3    B1                                                      COMCSVR
          LX3    42-0-1      BIT FOR RECONSTRUCTION OF B1                COMCSVR
          SX6    A5                                                      COMCSVR
          LX4    29-11                                                   COMCSVR
          BX6    X4+X6       (X6) = 30/0, 30/RJ *                        COMCSVR
          LX6    59-29                                                   COMCSVR
          SA6    A5          RESTORE RJ    *                             COMCSVR
          LX5    59-56                                                   COMCSVR
          BX7    X7-X7                                                   COMCSVR
          PL     X5,SVRX     IF (B1) = 1, RETURN                         COMCSVR
          SB2    B1+B1                                                   COMCSVR
                                                                         COMCSVR
*         ASSEMBLE ORIGINAL (B1) INTO (X7).                              COMCSVR
                                                                         COMCSVR
 SVR5     SA5    A5-B2                                                   COMCSVR
          IX3    X3+X3                                                   COMCSVR
          SX6    A5                                                      COMCSVR
          LX5    59-56                                                   COMCSVR
          BX6    X4+X6       (X6) = 30/0, 30/RJ *                        COMCSVR
          PL     X5,SVR6     IF BIT WAS CLEAR                            COMCSVR
          BX7    X7+X3                                                   COMCSVR
 SVR6     LX6    59-29       RESTORE RJ *                                COMCSVR
          SA6    A5                                                      COMCSVR
          PL     X3,SVR5     IF MORE BITS TO ASSEMBLE                    COMCSVR
                                                                         COMCSVR
*         FINALLY SAVE (B1).                                             COMCSVR
                                                                         COMCSVR
          AX7    42          SIGN EXTEND                                 COMCSVR
          SA7    A7-7+1      (B1) TO SAVE AREA                           COMCSVR
          EQ     SVRX        RETURN                                      COMCSVR
                                                                         COMCSVR
*         TEMPORARY SAVE AREAS.                                          COMCSVR
                                                                         COMCSVR
 SVRA     BSS    1           SAVE FOR (X7)                               COMCSVR
 SVRB     BSS    1           SAVE FOR (A5)                               COMCSVR
 SVRC     BSS    1           SAVE FOR (X5)                               COMCSVR
 SVR      SPACE  4,10                                                    COMCSVR
          BASE   *                                                       COMCSVR
 QUAL$    IF      -DEF,QUAL$                                             COMCSVR
          QUAL   *                                                       COMCSVR
 SVR      EQU    /COMCSVR/SVR                                            COMCSVR
 SVR=     EQU    /COMCSVR/SVR 
 QUAL$    ENDIF                                                          COMCSVR
 SVR      ENDX                                                           COMCSVR
