*COMDECK QEXIT
          NAM    QEXIT
* 
*      CALLING SEQUENCE 
*         ENQ    NON-INTERRUPTIBLE FLAG (0 = OFF, 1 = ON) 
*         JMP    QEXIT
* 
*      GIF = GLOBAL INTERRUPT FLAG (1ST WORD IN STACK AREA HEADER)
*      NAW = NEXT AVAILABLE WORD POINTER (2ND WORD IN STACK AREA HEADER)
* 
*      NOTE THAT THE A-REGISTER IS NOT USED AS IT MAY CONTAIN A 
*      FUNCTION VALUE 
* 
          ENT    QEXIT
         EXT   PBHALT 
          EXT    J0INTCNT    INTERRUPT COUNT < 0 HALT CODE
          EXT    QTOPSK 
* 
QEXIT     IIN    0            INHIBIT INTERRUPTS
          XFQ    3            TRANSFER Q-REG TO R3-REG
          LDQ*   TOP          LOAD POINTER TO TOP OF STACK AREA 
          SRI-   1,Q          RESET NAW 
          LDQ-   3,I          LOAD RETURN ADDRESS 
          STQ*   RETADR       SET EXIT JUMP 
          LR1-   4,I          RESTORE R1-REG
          LR2-   5,I          RESTORE R2-REG
          LRI*   (ZERO),I     RESET I-REG 
          LDQ*   (TOP)        LOAD GIF
          S3Z    Q020-*-1     SKIP IF QEXIT NOT CALLED BY NON-INT PROC
          INQ    -1           DECREMENT GIF 
          SQP    Q010         SKIP IF GIF GREATER THAN OR EQUAL TO ZERO 
         RTJ   PBHALT 
         ADC   HALT 
Q010      STQ*   (TOP)        UPDATE GIF
Q020      XFQ    3            TRANSFER GIF TO R3-REG
          LDQ*   RETADR       LOAD RETURN ADDRESS INTO Q-REG
          S3N    Q030-*-1     SKIP IF GIF IS NON-ZERO 
          EIN    0            ENABLE INTERRUPTS 
Q030      JMP*   (ZERO),Q     EXIT JUMP 
* 
TOP       ADC    QTOPSK       POINTER TO TOP OF STACK AREA
ZERO      NUM    0            CONSTANT ZERO 
RETADR    NUM    0            RETURN ADDRESS
HALT      ADC    J0INTCNT 
          END 
