*DECK DB$PUSH 
          IDENT  DB$PUSH
          TITLE  DB$PUSH AND DB$POP 
          COMMENT PUSH AND POP RCB STACK
DB$PUSH   TITLE  DB$PUSH, DB$PSH2, DB$PSH3 - SAVE ITEM(S) ON RCB STACK. 
*#
* *   DB$PUSH DB$PSH2 DB$PSH3                    PAGE  1
* *   SAVE SINGLE WORD ITEM(S) ON THE RCB STACK 
* *   BOB MCALLESTER                             DATE  04/20/81 
* 
* DC  PURPOSE 
* 
*     DB$PUSH SAVES ONE WORD ON THE RCB PUSH-DOWN STACK.
*     DB$PSH2 SAVES TWO WORDS.
*     DB$PSH3 SAVES THREE WORDS.
* 
* DC  ENTRY CONDITIONS
* 
* D   PARAMETERS
* 
*     PROC DB$PUSH(A);
*     PROC DB$PSH2(A,B);
*     PROC DB$PSH3(A,B,C);
* 
*     A - THE FIRST WORD TO BE STORED.
*     B - THE SECOND WORD TO BE STORED (DB$PSH2 AND DB$PSH3). 
*     C - THE THIRD WORD TO BE STORED (DB$PSH3 ONLY). 
* 
* D   ASSUMPTIONS 
* 
*     DB$ORCB POINTS TO THE RCB POINTER (P<RCB>). 
*     P<RCB> POINTS TO THE RCB THAT CONTAINS THE PUSH-DOWN STACK. 
* 
* DC  EXIT CONDITIONS 
* 
*     NORMAL -
*       THE WORDS HAVE BEEN SAVED.
*       THE POINTER 'RCSTACKX' POINTS TO THE LAST WORD SAVED. 
* 
*     ABNORMAL -
*       EXIT TO DB$PUNT ON AN OVERFLOW OF THE STACK.
* 
* DC  CALLING ROUTINES
* 
*     THIS IS A UTILITY PROCEDURE THAT IS CALLED BY MANY ROUTINES.
* 
* DC  CALLED ROUTINES 
* 
*     DB$PUNT                CDCS INTERNAL ERROR PROCESSOR
* 
* DC  DESCRIPTION 
* 
*     EACH OF THE PARAMETER WORDS IS TRANSFERRED INTO THE RCB AREA
*     RESERVED FOR THE PUSH DOWN STACK. 
*     THE STACK POINTER 'RCSTACKX' IS UPDATED TO POINT TO THE WORD
*     MOST RECENTLY SAVED.
*     THE PARAMETERS ARE SAVED IN THE ORDER A,B,C.
* 
*     IF THE TRANSFERS WOULD OVERFLOW THE STACK AREA, THE TRANSFERS 
*     ARE NOT MADE.  DB$PUNT IS CALLED TO ABORT CDCS. 
*#
DB$PUSH   SPACE  4,8
*         CALL   DEFMACRO 
  
*CALL DEFMACRO
  
*CALL RCBOSDCLS 
DB$PUSH   SPACE  4,8
*         PROC   DB$PUSH     PUSH ONE WORD ON PUSH-DOWN STACK 
  
          ENTRY  DB$PUSH
  
PSH1      BSS    0
          SA6    A5          UPDATE THE POINTER 
          BX7    X1 
          SA7    B4          SAVE THE PARAMETER IN THE STACK
  
DB$PUSH   EQ     *+1S17      ENTRY
          SA5    =XDB$ORCB   (X5) = LOCATION OF RCB POINTER 
          SA1    X1          (X1) = PARAMETER TO BE SAVED 
          SA5    X5          (X5) = LOCATION OF RCB 
          MX6    -1 
          SA5    X5+DFRCSTAK   (X5) = STACK POINTER 
          IX6    X5+X6       (X6) = DECREMENTED STACK POINTER 
          SB3    A5          (B3) = LOCATION OF STACK POINTER 
          SB4    X6          (B4) = DECREMENTED STACK POINTER 
          LT     B3,B4,PSH1  NO OVERFLOW
  
          SA1    PSHERR      OVERFLOW ERROR 
          RJ     =XDB$PUNT   NO RETURN
DB$PSH2   SPACE  4,8
*         PROC   DB$PSH2     PUSH TWO WORDS ON THE PUSH-DOWN STACK
  
          ENTRY  DB$PSH2
  
PSH2      BSS    0
          SA7    B4          SAVE B 
          BX6    X1          (X6) = PARAMETER A 
          SA6    B4+1        SAVE A 
  
DB$PSH2   EQ     *+1S17      (X1) = POINTER TO PARAMETER A
          SA5    =XDB$ORCB   (X5) = LOCATION OF RCB POINTER 
          SA2    A1+1        (X2) = POINTER TO PARAMETER B
          SA1    X1          (X1) = PARAMETER A 
          SA5    X5          (X5) = LOCATION OF RCB 
          SX6    2
          SA5    X5+DFRCSTAK   (X5) = STACK POINTER 
          SA2    X2          (X2) = PARAMETER B 
          IX6    X5-X6       (X6) = STACK POINTER LESS 2
          SB3    A5          (B3) = LOCATION OF STACK POINTER 
          SB4    X6          (B4) = LOCATION OF LAST STACK ENTRY
          BX7    X2          (X7) = PARAMETER B 
          SA6    A5          UPDATE THE POINTER 
          LT     B3,B4,PSH2 
  
          SA1    PSHERR      OVERFLOW ERROR 
          RJ     =XDB$PUNT   NO RETURN
DB$PSH3   SPACE  4,8
*         PROC   DB$PSH3     PUSH THREE WORDS ON THE PUSH-DOWN STACK
  
          ENTRY  DB$PSH3
  
PSH3      BSS    0
          SA3    X3          (X3) = PARAMETER C 
          SA2    X2          (X2) = PARAMETER B 
          BX6    X3 
          BX7    X2 
          SA6    B4          SAVE C 
          SA7    A6+B1       SAVE B 
          BX6    X1 
          SA6    A7+B1       SAVE A 
  
DB$PSH3   EQ     *+1S17      (X1) = POINTER TO PARAMETER A
          SB1    1
          SA5    =XDB$ORCB   (X5) = LOCATION OF RCB POINTER 
          SA2    A1+B1       (X2) = POINTER TO PARAMETER B
          SA3    A2+B1       (X3) = POINTER TO PARAMETER C
          SA5    X5          (X5) = LOCATION OF RCB 
          SA1    X1          (X1) = PARAMETER A 
          SA5    X5+DFRCSTAK   (X5) = STACK POINTER 
          MX6    58          (X6) = -3
          IX6    X5+X6       (X6) = STACK POINTER LESS THREE
          SB3    A5          (B3) = LOCATION OF STACK POINTER 
          SB4    X6          (B4) = LOCATION OF LAST STACK ENTRY (C)
          SA6    A5          UPDATE THE STACK POINTER 
          LT     B3,B4,PSH3 
          SA1    PSHERR      OVERFLOW ERROR 
          RJ     =XDB$PUNT   NO RETURN
  
PSHERR    CON    PSHEM
PSHEM     CON    10HDB$PUSH 
DB$POP    TITLE  DB$POP, DB$POP2, DB$POP3 - RESTORE PUSHED ITEMS
*#
* *   DB$POP DB$POP2 DB$POP3                     PAGE  1
* *   RESTORE DATA ITEMS FROM THE PUSH-DOWN STACK 
* *   BOB MCALLESTER                             DATE  04/20/81 
* 
* DC  PURPOSE 
* 
*     DB$POP RETURNS ONE WORD FROM THE RCB PUSH-DOWN STACK. 
*     DB$POP2 RETURNS TWO WORDS FROM THE RCB PUSH-DOWN STACK. 
*     DB$POP3 RETURNS THREE WORDS FROM THE RCB PUSH-DOWN STACK. 
* 
* DC  ENTRY CONDITIONS
* 
* 
* D   PARAMETERS
* 
*     PROC DB$POP(A); 
*     PROC DB$POP2(A,B);
*     PROC DB$POP3(A,B,C);
* 
*     A - VARIABLE TO RECEIVE THE FIRST (TOP) WORD FROM THE STACK.
*     B - VARIABLE TO RECEIVE THE SECOND WORD (DB$POP2 AND DB$POP3).
*     C - VARIABLE TO RECEIVE THE THIRD WORD (DB$POP3 ONLY).
* 
* D   ASSUMPTIONS 
* 
*     DB$ORCB POINTS TO THE RCB POINTER (P<RCB>). 
*     P<RCB> POINTS TO THE RCB THAT CONTAINS THE PUSH-DOWN STACK. 
* 
* DC  EXIT CONDITIONS 
* 
*     NORMAL -
*       THE WORDS HAVE BEEN RETURNED. 
*       THE POINTER 'RCSTACK' IS LEFT POINTING TO THE NEXT STACK ENTRY
*         OR IF THE STACK IS EMPTY IT POINTS TO THE WORD BEYOND THE 
*         STACK.
* 
*     ABNORMAL -
*       EXIT TO DB$PUNT ON AN UNDERFLOW OF THE STACK. 
*       (AN ATTEMPT TO RETURN MORE WORDS THAN HAVE BEEN SAVED)
* 
* DC  CALLING ROUTINES
* 
*     THIS IS A UTILITY PROCEDURE THAT IS CALLED BY MANY ROUTINES.
* 
* DC  CALLED ROUTINES 
* 
*     DB$PUNT                CDCS INTERNAL ERROR PROCESSOR
* 
* DC  DESCRIPTION 
* 
*     EACH PARAMETER HAS RECEIVED A WORD FROM THE RCB PUSH-DOWN STACK.
*     THE STACK POINTER 'RCSTACKX' IS ADJUSTED. 
* 
*     NOTE THAT DB$POP3 PARAMETERS MUST BE IN THE REVERSE ORDER 
*     OF DB$PSH3 PARAMETERS.
*#
DB$POP    SPACE  4,8
*         PROC   DB$POP      RETURN ONE WORD FROM THE PUSH-DOWN STACK.
  
          ENTRY  DB$POP 
  
POP1      BSS    0
          BX6    X2 
          SA6    X1          RETURN STACK WORD TO PARAMETER LOCATION
  
  
*         IT MIGHT BE NECESSARY TO VOID THE INSTRUCTION STACK BECAUSE 
*         THE RETURNED WORD IS OFTEN A PROCEDURE ENTRY/EXIT WORD THAT 
*         IS ABOUT TO BE EXECUTED.
  
          RJ     POP1A       VOID THE INSTRUCTION STACK.
POP1A     EQ     *+1S17 
  
DB$POP    EQ     *+1S17      (X1) = OUTPUT PARAMETER ADDRESS
          SA5    =XDB$ORCB   (X5) = LOCATION OF RCB POINTER 
          SA5    X5          (X5) = RCB POINTER 
          MX6    -1          (X6) = -1
          SB4    X5+DFRCIR0  (B4) = LOCATION OF 1ST WORD BEYOND STACK 
          SA5    X5+DFRCSTAK (X5) = STACK POINTER 
          IX6    X5-X6       (X6) = STACK POINTER INCREMENTED BY ONE
          SA2    X5          (X2) = WORD FROM STACK 
          SB3    X6          (B3) = LOCATION NEXT STACK WORD AFTER POP
          SA6    A5          REWRITE THE STACK POINTER
          GE     B4,B3,POP1 
  
          SA1    POPERR      UNDERFLOW ERROR
          RJ     =XDB$PUNT   NO RETURN
DB$POP2   SPACE  4,8
*         PROC   DB$POP2     RETURN TWO WORDS FROM THE PUSH-DOWN STACK. 
  
          ENTRY  DB$POP2
  
POP2      BSS    0
          SA2    A1+B1       (X2) = LOCATION FOR PARAMETER B
          SA3    A4+B1       (X3) = STACK ENTRY FOR PARAMETER B 
          BX7    X4          (X7) = PARAMETER A RETURN VALUE
          BX6    X3          (X6) = PARAMETER B RETURN VALUE
          SA7    X1          RETURN A 
          SA6    X2          RETURN B 
  
          RJ     POP2A       VOID THE INSTRUCTION STACK 
POP2A     EQ     *+1S17 
  
DB$POP2   EQ     *+1S17      (X1) = LOCATION FOR PARAMETER A
          SA5    =XDB$ORCB   (X5) = LOCATION OF RCB POINTER 
          SB1    1
          SA5    X5          (X5) = RCB POINTER 
          SX6    B1+B1       (X6) = 2 
          SB4    X5+DFRCIR0  (B4) = LOCATION OF FIRST WORD BEYOND STACK 
          SA5    X5+DFRCSTAK (X5) = STACK POINTER 
          IX6    X5+X6       (X6) = STACK POINTER PLUS TWO
          SA4    X5          (X4) = STACK ENTRY FOR PARAMETER A 
          SB3    X6          (B3) = LOCATION NEXT STACK WORD AFTER POPS 
          SA6    A5          REWRITE THE STACK POINTER
          GE     B4,B3,POP2 
  
          SA1    POPERR      UNDERFLOW ERROR
          RJ     =XDB$PUNT   NO RETURN
DB$POP3   SPACE  4,8
*         PROC   DB$POP3     RETURN THREE WORDS FROM PUSH-DOWN STACK. 
  
          ENTRY  DB$POP3
  
POP3      BSS    0
          SA2    A1+B1       (X2) = LOCATION FOR PARAMETER B
          SA3    A2+B1       (X3) = LOCATION FOR PARAMETER C
          BX7    X4          (X7) = PARAMETER A 
          SA5    A4+B1       (X5) = STACK ENTRY FOR B 
          SA4    A5+B1       (X4) = STACK ENTRY FOR C 
          BX6    X5          (X6) = PARAMETER B 
          SA7    X1          RETURN A 
          SA6    X2          RETURN B 
          BX7    X4          (X7) = PARAMETER C 
          SA7    X3          RETURN C 
  
          RJ     POP3A       VOID THE INSTRUCTION STACK 
POP3A     EQ     *+1S17 
  
DB$POP3   EQ     *+1S17      (X1) = LOCATION FOR PARAMETER A
          SA5    =XDB$ORCB   (X5) = LOCATION OF RCB POINTER 
          SB1    1
          SA5    X5          (X5) = RCB POINTER 
          MX6    58          (X6) = -3
          SB4    X5+DFRCIR0  (B4) = LOCATION OF FIRST WORD BEYOND STACK 
          SA5    X5+DFRCSTAK (X5) = STACK POINTER 
          IX6    X5-X6       (X6) = STACK POINTER PLUS THREE
          SA4    X5          (X4) = STACK ENTRY FOR PARAMETER A 
          SB3    X6          (B3) = LOCATION NEXT STACK WORD AFTER POPS 
          SA6    A5          REWRITE THE STACK POINTER
          GE     B4,B3,POP3 
  
          SA1    POPERR      UNDERFLOW ERROR
          RJ     =XDB$PUNT   NO RETURN
DB$POP3   SPACE  2,2
POPERR    CON    POPEM
POPEM     CON    10HDB$POP
DB$POPF   SPACE  4,8
*#
* 
* DC      DB$POPF 
* 
*         DB$POPF IS IDENTICAL TO DB$POP EXCEPT THE STACK WORD IS 
*         RETURNED AS A FUNCTION VALUE (X6) INSTEAD OF BEING PASSED 
*         BACK AS A PARAMETER VALUE.
*#
DB$POPF   SPACE  4,8
*         PROC   POPF        RETURN WORD AS FUNCTION VALUE
  
          ENTRY  DB$POPF
  
DB$POPF   EQ     *+1S17 
          SA5    =XDB$ORCB
          SA5    X5 
          MX6    -1 
          SB4    X5+DFRCIR0 
          SA5    X5+DFRCSTAK
          IX6    X5-X6
          SA2    X5 
          SB3    X6 
          SA6    A5 
          BX6    X2 
          GE     B4,B3,DB$POPF
  
          SA1    POPERR 
          RJ     =XDB$PUNT
          END 
