          IDENT  DSACYIF
          TITLE  DSA$CYBIL INTERFACE - COMPASS INTERFACE TO CYBIL
          ENTRY  ZSMRENT,ZSMRRET,PARSV,PXSAVE,PXRSTR,PXREST
          SPACE  4,10
*     THE PURPOSE OF THIS MODULE IS TO PROVIDE A MEANS BY WHICH
* RELEVANT REGISTERS ASSOCIATED WITH A CYBIL ENVIRONMENT CAN BE
* PRESERVED DURING A NON-CYBIL PROCESSING INTERLUDE.
*
* STACKFRAME SET UP FOR LINKAGE WORD AND B3/B4/B5 SAVEAREA
*
 SFSIZE   EQU    4
          SPACE  2
 ZSMRENT  BSSZ   1
          EQ     START
 PXSAVE   EQU    ZSMRENT
*copyc dsa$cybil_if_macros
 START    ENTR   SFSIZE
          SX6    B2
          BX7    X1          SAVE X1
          SA1    SAVEM
          SB1    1
          PL     X1,ERR1     RECURSIVE CALL
          BX1    X7          RESTORE X1
          SA6    A1
          BX6    X1
          SA6    A6+B1
          BX6    X2
          SA6    A6+B1
          BX6    X3
          SA6    A6+B1
          BX6    X4
          SA6    A6+B1
          BX6    X5
          SA6    A6+B1
          SX6    B3
          SA6    B2+B1
          SX6    B4
          SA6    A6+B1
          SX6    B5
          SA6    A6+B1
          EQ     ZSMRENT
*
*     THE PURPOSE OF THIS A170 COMPASS ROUTINE IS TO RESTORE
* THOSE REGISTERS NEEDED TO CONTINUE IN THE CYBIL PROCESS STATE
* AFTER A NON-CYBIL PROCESSING INTERLUDE.
*
 PXRSTR   BSSZ   1
 PXREST   EQU    PXRSTR
 ZSMRRET  SA1    SAVEM
          SB1    1
          MI     X1,ERR2     IF PXRSTR WITHOUT PXSAVE
          MX6    30D
          BX6    X6+X1
          SA6    A1          MINUS MEANS NEXT CALL MUST BE PXSAVE
          SB2    X1
          SA1    B2+B1
          SB3    X1
          SA1    A1+B1
          SB4    X1
          SA1    A1+B1
          SB5    X1
          DONE
*
* SAVEM IS USED TO SAVE THE STACKFRAME ADDRESS (B2) AND TO CHECK
* IF NO CALLING SEQUENCE ERROR TO PXSAVE/PXRSTR IS MADE.
* PARSV IS USED TO SAVE 5 PARAMETERS FROM CYBIL.
*
 SAVEM    VFD    6/77B,54/0
 PARSV    BSS    5
*
*     NEXT FOLLOW ERROR MESSAGES CAUSED BY IMPROPER CALLING
*       SEQUENCES (FATAL ERRORS)
*
 ERR1     BSS    0
          MESSAGE  (=C* RECURSIVE PXSAVE.*),3,R
          EQ     ERR2A
 ERR2     BSS    0
          MESSAGE  (=C* SPURIOUS PXREST.*),3,R
 ERR2A    ABORT
         END
