ASMB,R,Q,C
*     NAME:   RNRQ
*     SOURCE: 92070-18214 
*     RELOC:  92070-1X214 
*     PGMR:   HLC 
* 
* 
*  **************************************************************** 
*  * (C) COPYRIGHT HEWLETT-PACKARD COMPANY 1979.  ALL RIGHTS      * 
*  * RESERVED.  NO PART OF THIS PROGRAM MAY BE PHOTOCOPIED,       * 
*  * REPRODUCED OR TRANSLATED TO ANOTHER PROGRAM LANGUAGE WITHOUT * 
*  * THE PRIOR WRITTEN CONSENT OF HEWLETT-PACKARD COMPANY.        * 
*  **************************************************************** 
* 
* 
      NAM RNRQ,6  92070-1X214  REV.1941  790331 
      ENT RNRQ
* 
      EXT $ERAB,$RNTA,$IDNO,$SCHD 
      EXT $LIBR,$PVCN,$ZPCN,.ENTP 
      EXT $LIST,$XEQ,$EXEX,$RQRT
      EXT $SUSP,$STAT,$XQT,$DVTA
      EXT $RQP1,$RQP2,$ERMG 
* 
      SUP 
A     EQU 0 
B     EQU 1 
* 
* 
* 
*     RESOURCE NUMBERS (RN'S) ARE ACCESSED BY USER
*      CALLS THAT CAN ALLOCATE, DEALLOCATE
*     SET AND CLEAR THE RN.  IF A RN REQUEST CAN NOT
*     BE GRANTED BECAUSE OF NONE AVAILABLE OR 
*     CONFLICT WITH OTHER PROGRAMS THE REQUESTER IS 
*     SUSPENDED UNTIL THE RN BECOMES AVAILABLE
* 
*     THE EXEC CALL IS: 
* 
*       EXT RNRQ
* 
*       JSB RNRQ
*       DEF *+4 
*       DEF OPTION    OPTION ADDRESS
*       DEF RN        RN NUMBER ADDRESS/RETURN
*       DEF STAT      RN STATUS RETURN ADDRESS
*       <RETURN LOCATION> 
* 
*     WHERE:
* OPTIN BSS 1       OPTION WORD 
* RN    BSS 1       RN WORD 
* STAT  BSS 1       RN STATUS 
* 
*     THE OPTION WORD DEFINES WHAT ACTION IS TO BE TAKEN ON THE 
*     REQUEST AS FOLLOWS: 
* 
*     BIT           MEANING IF SET
*     BIT 0         SET THE RN LOCALLY
*     BIT 1         SET THE RN GLOBALLY 
*     BIT 2         CLEAR THE RN
*     BIT 3         ALLOCATE AN RN LOCALLY
*     BIT 4         ALLOCATE AN RN GLOBALLY 
*     BIT 5         DEALLOCATE THE RN 
*     BIT 14        DON'T ABORT IF ERROR, RETURN ASCII CODE IN A,B
*     BIT 15        RETURN EVEN IF REQUEST NOT GRANTED
* 
*     A LOCALLY ALLOCATED RN MAY BE RELEASED ONLY BY THE ALLOCATOR
*     A LOCALLY SET RN MAY BE CLEARED ONLY BY THE SETER 
*     GLOBALLY ALLOCATED/SET RN'S MAY BE DEALLOCATE/CLEARED BY
*     ANY PROGRAM.
* 
*     IF MORE THAN ONE BIT IS SET IN THE OPTION WORD THE FOLLOWING
*     PRESEDENCE IS FOLLOWED: 
* 
*     1) LOCAL ALLOCATE (SKIP 2 IF DONE)
*     2) GLOBAL ALLOCATE
*     3) DEALLOCATE (SKIP 4, 5, & 6 IF DONE)
*     4) LOCAL SET (SKIP 5 IF DONE) 
*     5) GLOBAL SET 
*     6) CLEAR
* 
*     THIS IMPLIES THAT  RN MAY BE ALLOCATED,SET,AND CLEARED IN 
*     THE SAME REQUEST. 
*     A STATUS REQUEST WOULD BE A SET, CLEAR, WITHOUT WAIT. 
*     THERE ARE TWO RN CODE WORDS:
*     A) THE USER WORD (RETURN ON ALLOCATE/SUPPLIED FOR OTHER 
*          REQUESTS). 
*     B) THE RN TABLE CODE WORD.
* 
*     THE USER CODE WORD HAS THE RN NUMBER IN THE LOW HALF (8 BITS) 
*     AND THE OWNERS ID SEGMENT NUMBER IN THE HIGH 8 BITS 
* 
*     THE RN TABLE CODE WORD HAS THE LOCKERS ID SEGMENT NUMBER
*      IN THE LOW HALF AND THE OWNERS ID NUMBER IN THE HIGH OF
*      THE WORD.
* 
*     GLOBAL ALLOCATES/LOCKS ARE CODED AS 377 
*     AVAILABLE/UNLOCKED IS CODED AS 0. 
* 
*     RN STATUS IS AS FOLLOWS:
* 
*     VALUE         MEANING 
*     0              NORMAL DEALLOCATE RETURN 
*     1              RN IS CLEAR (UNLOCKED) 
*     2              RN IS LOCKED LOCALLY TO CALLER 
*     3              RN IS LOCKED GLOBALLY
*     4              NO RN AVAILABLE NOW
*     5              NOT DEFINED
*     6              RN IS LOCKED LOCALLY TO OTHER PROGRAM
*     7              RN WAS LOCKED GLOBALLY WHEN REQUEST WAS MADE.
* 
*     STATUS 4,6,7 ARE ONLY RETURNED IF THE REQUEST FAILED
*     AND THE NO WAIT BIT WAS SET 
* 
*     POSSIBLE ERRORS FROM THIS CODE ARE: 
* 
*     ERROR         MEANING 
* 
*     RN00          NO BITS SET IN THE OPTION WORD. 
*     RN02          ILLEGAL RN NUMBER.
*     RN03          RELEASE OR UNLOCK OF UNOWNED RN.
*     RN REQUEST PROCESSOR
* 
      SKP 
RQOP  NOP 
RQNO  NOP 
RQST  NOP 
RNRQ  NOP           ENTRY 
      JSB $LIBR     TURN OFF MEMORY PROTECT 
      NOP 
      JSB .ENTP     GET PARAMETER ADDRESSES 
      DEF RQOP
      STA $RQRT     COMPLETION ADDRESS
      ADA =D-5
      STA $SUSP,I   RETRY ADDRESS 
* 
      CCA 
      ADA $PVCN 
      STA $PVCN     SHOULD BE ZERO NOW
      IOR $ZPCN     NOT CALLABLE FROM PRIVILEGED ROUTINE
      SZA 
      JMP SRERR     ABORT CALLER
      LDB RQOP,I    GET THE OPTION WORD 
      RBL,CLE,ELB   BIT 14 TO E 
      LDA $STAT,I 
      AND =B137777  CLEAR 'NA' BIT
      SEZ,RSS 
      JMP ABCAL     NORMAL CALL 
      IOR =B40000   SET 'NA' BIT
      ISZ $RQRT     BUMP RETURN ADDRESS 
ABCAL STA $STAT,I 
* 
      LDB $XQT
      JSB $IDNO     GET THE ID SEGMENT NO.
      STB $RQP1 
* 
      LDA RQOP,I
      AND =B77
      SZA,RSS       TAKE
      JMP ERN00     ERROR EXIT
* 
      AND =B30       MASK TO THE ALLOCATE BITS
      SZA,RSS       IF NO ALLOCATION REQUESTED
      JMP DAL       GO TEST FOR DEALLOCATE
* 
      AND =B10
      SZA,RSS       GLOBAL ALLOCATE? (BIT 4)
      LDB =B377      YES, SET $IDNO TO 377B 
      BLF,BLF 
      STB $IDNO 
* 
      LDA $RNTA     START OF RN TABLE 
ALRN1 INA 
      CPA $DVTA 
      JMP NONE      END OF TABLE
      LDB A,I       RN TABLE ENTRY
      SZB 
      JMP ALRN1 
* 
      STA $RQP2     SAVE ADDRESS IN RN TABLE
      LDB $IDNO 
      STB A,I       SET OWNER ID NO. IN TABLE 
      LDB $RNTA 
      CMB,INB 
      ADA B         A=OFFSET IN TABLE 
      IOR $IDNO     ADD ID NO. IN HIGH BYTE 
      STA RQNO,I
* 
      JMP DALX      TEST FOR DEALLOCATION 
* 
NONE  CLA 
      STA RQNO,I    SET IN THE USER AREA
      STA $RQP2     CLEAR RN TABLE POINTER
      LDA $RNTA     ALLOCATION FLAG 
* 
RNSUS LDB RQOP,I      GET NO-WAIT OPTION FLAG 
      SSB           IF NO WAIT
      JMP EXRNW     THEN EXIT 
* 
      LDB $XQT
      JSB $LIST     AND PUT THE PROG IN LIST
      OCT 51
      JMP $XEQ      GO THE THE DISPATCHER 
* 
EXRN  CLB,INB,RSS 
EXRNW LDB =D5        ENTRY FOR 6/7 RETURN 
RNEX  LDA $RQP2     TEST THE RN LOCATION ADDRESS
      CMA,CLE,INA,SZA,RSS IF ZERO SET E, ELSE SKIP
      LDB =D4        NO RN STATUS 
      LDA $RQP2,I   GET THE RN
      SEZ,SZA,RSS   SKIP IF ALLOCATE PROBLEMS 
      CLB           ELSE SET DEALLOCATED FLAG IF RN IS ZERO 
      AND =B377      MASK TO LOCK BITS
      SZA           IF LOCKED 
      INB           STEP B TO SO INDICATE 
      CPA =B377      IF GLOBAL
      INB           STEP AGAIN
      STB RQST,I    SET THE STATUS WORD 
      JMP $EXEX      ** GO TO THE DISPATCHER ** 
* 
* 
* 
DAL   LDA RQNO,I    GET THE RN USER SUPLIED WORD
      AND =B377      ISOLATE THE RN#. 
      STA B         TEST THE RN 
      CMB,INB       TO SEE IF IN THE
      ADB $RNTA,I     TABLE 
      SZA           IF ZERO OR
      SSB           BIGGER THAN LEGAL 
      JMP ERN02     GO BOOM!
* 
      ADA $RNTA      INDEX INTO THE RN TABLE
      STA $RQP2     SET THE RN ADDRESS
      LDA A,I       GET THE RN ENTRY
      XOR RQNO,I    IS IT OWNED 
      AND =B177400      BY THE SAME USER HE THINKS? 
      SZA 
      JMP ERN03     NO TOO BAD ABOUT THAT!
* 
DALX  LDA RQOP,I      TEST FOR
      AND =B40       DEALLOCATE 
      SZA,RSS       BIT SET?
      JMP SET       NO GO DO THE SET THING
* 
      LDA RQNO,I    GET THE RN AND
      ALF,ALF       MAKE SURE HE OWNS IT
      AND =B377      OWNER ID# TO A 
      CPA =B377      IF GLOBAL
      RSS           OR
      CPA $RQP1      HE IS OWNER
      CLA,RSS       THEN SKIP THE 
      JMP ERN03     ABORT 
* 
      STA $RQP2,I   CLEAR THE RN ASSIGNMENT 
      LDA $RNTA      RESCHEDULE 
      JSB $SCHD     ALLOCATION WAITERS
      OCT 51
      JMP CLRN2     GO DO CLEAR SCHEDULING
* 
SET   LDA $RQP2,I   GET THE RN
      AND =B377      MASK TO CURRENT LOCK 
      LDB RQOP,I      GET THE FLAG WORD 
      CCE,SLB,RSS   IF LOCK 
      ERB,SLB       THEN
      JMP LOKRN     GO DO LOCK
* 
CLRN  LDB RQOP,I      CHECK FOR CLEAR 
      RBR,RBR       FLAG.  IF NOT 
      SLB,RSS       SET JUST
      JMP EXRN      EXIT
* 
      SZA           IF NEVER LOCKED, THEN OK. 
      CPA =B377      IF GLOBALLY LOCKED 
      RSS 
      CPA $RQP1      OR LOCKED BY CALLER
      RSS           THEN OK, ELSE 
      JMP ERN03     SEND 'RN03' 
* 
      XOR $RQP2,I   CLEAR THE RN. 
      STA $RQP2,I   RESTORE THE WORD
* 
CLRN2 LDA $RQP2     SCHEDULE THE WAITERS
      JSB $SCHD 
      OCT 51
      JMP EXRN      EXIT TO DISPATCHER PROPERLY 
* 
*     LOCK RN ROUTINE 
* 
LOKRN SZA           IF NOT LOCKED 
      CPA $RQP1      OR LOCKED TO CALLER
      RSS           THEN OK  CONTINUE 
      JMP LKSUS     ELSE SUSPEND THIS GUY.
* 
      XOR $RQP2,I   CLEAR THE PREVIOUS LOCK FLAG
      IOR $RQP1     ADD THE NEW ONE 
      SEZ,RSS 
      IOR =B377     GLOBAL SET
      STA $RQP2,I   STORE IN THE RN TABLE 
      AND =B377     SET A=ID OF NEW LOCKER
      JMP CLRN      GO TEST FOR CLEAR OPTION
* 
LKSUS LDA $RQP2     GET THE SUSPEND FLAG
      JMP RNSUS      AND GO SUSPEND 
      SPC 2 
*     SRNW SCHEDULES ANY PROGRAMS SUSPENDED IN THE '3' LIST 
*     WITH A FLAG = ($RQP2)  (USUALLY RN LOCK REQUEST SUSPEND)
* 
ERN00 CLB,RSS 
ERN02 LDB =D2        RN02  ERROR
      RSS 
ERN03 LDB =D3        RN03  ERROR
      LDA =ARN      USE RN
      JMP $ERAB     GO BOOM!#$#$%&'"
* 
SRERR LDA =ASR
      LDB =A
      JSB $ERMG     'PROGA ABORTED SR   45400'
      JMP $XEQ
* 
      ORG *         PROGRAM LENGTH
      END 
                              