ASMB,R,L,C     ** RNRQ RESOURCE NUMBER MODULE **
      HED ** REAL-TIME EXECUTIVE  RNRQ RESOURCE NUMBER MODULE **
*     NAME:   MRNRQ 
*     SOURCE: 92064-18209 
*     RELOC:  92064-16081 
*     PGMR:   G.A.A.
* 
*  ***************************************************************
*  * (C) COPYRIGHT HEWLETT-PACKARD COMPANY 1975.  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 MRNRQ,6  92064-16081  REV.1709  741120  
* 
      EXT $ERAB,$RNTB,$IDNO,$SCD3,$DRAD 
      EXT $ALRN,$LIBR,$PVCN,$RNSU,$RNEX 
      ENT RNRQ
* 
      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 
*     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. 
*     RN01          NO RN'S IN THE SYSTEM (EVER). 
*     RN02          ILLEGAL RN NUMBER.
*     RN03          RELEASE OR UNLOCK OF UNOWNED RN.
*     RN REQUEST PROCESSOR
* 
      SKP 
RNRQ  NOP           ENTRY 
      JSB $LIBR     PRIVILEGED
      NOP 
      CLA           SINCE WE DON'T PLAN TO RETURN 
      STA $PVCN      VIA $LIBR, CLEAR CNTR
      LDA D$RN
      JSB $DRAD     GET DIRECT ADDR OF RN TABLE 
      STA D$RN
* 
      CCA 
      ADA RNRQ      SET CALLING ADDR IN SUSP. WORD
      STA XSUSP,I    IN CASE OF SUSPENSION
      LDA RNRQ,I    SET RETURN ADDR 
      JSB $DRAD     WORRY ABOUT FTN CALLS 
      STA RQRTN      IN CASE OF ABORT 
* 
      ISZ RNRQ
      LDB RNRQ,I
      LDA B,I       GET OPTION WORD 
      STA RQOP
      RAL,CLE,ELA   BIT14 TO E
      SEZ,RSS       NO ABORT OPTION?
      JMP ABCAL      NO, NORMAL CALL
* 
      LDB XSUSP 
      ADB D7        GET ADDR OF STATUS
      LDA B,I 
      RAL,ERA       PUT E IN BIT15
      STA B,I        OF STATUS WORD 
      ISZ RQRTN     BUMP RETURN ADDR
* 
ABCAL ISZ RNRQ
      LDA RNRQ,I
      JSB $DRAD     GET DIRECT ADDR 
      STA RQNO      ADDR OF RN NUMBER 
      ISZ RNRQ
      LDA RNRQ,I
      JSB $DRAD     GET DIRECT ADDR 
      STA RQST      GET ADDR OF RETURN STATUS 
      LDB RQRTN     IF RETURN ADDR
      CMB,INB        IS LESS THAN 
      ADB RNRQ       THIS NOW,
      SSB,RSS        THEN 
      JMP ERN02     ABORT WITH RN02 
* 
      LDB XEQT      GET THE ID SEGMENT NUMBER 
      JSB $IDNO     TO B
      STB IDNO      SAVE FOR EVERYBODY
      STB TEMP6      SAVE FOR ME
      LDA RQOP      GET THE OPTION WORD 
      AND B77       IF NO BITS SET THEN 
      CLB            SET B FOR ERROR EXIT 
      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 
      LDB B377
      SZA,RSS       GLOBAL ALLOCATE? (BIT 4)
      STB IDNO      YES, SET IDNO TO 377B 
      CCB           SET TO SCAN FROM TOP
      JSB $ALRN     ALLOC AN RN AND SET RNADR 
      STA RQNO,I    SET IN THE USER AREA
      SZA            SKIP IF ALLOCATION FAILED
      JMP DALX      ELSE GO TEST DALLOCATION
* 
      LDA D$RN      GET SUSPEND FLAG
      JMP $RNSU     CHECK IF NEED TO SUSPEND
* 
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 $RNTB     TABLE 
      CLE,SZA       IF ZERO OR
      SSB           BIGGER THAN LEGAL 
      JMP ERN02     GO BOOM!
* 
      ADA D$RN      INDEX INTO THE RN TABLE 
      STA RNADR     SET THE RN ADDRESS
      LDA A,I       GET THE RN ENTRY
      XOR RQNO,I    IS IT OWNED 
      AND C377      BY THE SAME USER HE THINKS? 
      CLE,SZA 
      JMP ERN03     NO TOO BAD ABOUT THAT!
* 
DALX  LDA RQOP      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,CLE,ALF   MAKE SURE HE OWNS IT
      AND B377      OWNER ID# TO A
      CPA B377      IF GLOBAL 
      RSS           OR
      CPA TEMP6      HE IS OWNER
      CLA,RSS       THEN SKIP THE 
      JMP ERN03     BAD NEWS SEND 'RN03' (WATCH E)
* 
      STA RNADR,I   CLEAR THE RN ASSIGNMENT 
      LDA D$RN      RESCHEDULE
      JSB $SCD3     ALLOCATION WAITERS
      JMP CLRN2     GO DO CLEAR SCHEDULING
* 
SET   LDA RNADR,I   GET THE RN
      AND B377      MASK TO CURRENT LOCK
      LDB RQOP      GET THE FLAG WORD 
      CCE,SLB,RSS   IF LOCK 
      ERB,SLB       THEN
      JMP LOKRN     GO DO LOCK
* 
CLRN  LDB RQOP      CHECK FOR CLEAR 
      RBR,RBR       FLAG.  IF NOT 
      CLE,SLB,RSS   SET JUST
      JMP EXRN      EXIT
* 
      SZA           IF NEVER LOCKED, THEN OK. 
      CPA B377      IF GLOBALLY LOCKED
      RSS 
      CPA TEMP6      OR LOCKED BY CALLER
      RSS           THEN OK, ELSE 
      JMP ERN03     SEND 'RN03'  (WATCH E)
* 
      XOR RNADR,I   CLEAR THE RN. 
      STA RNADR,I   RESTORE THE WORD
* 
CLRN2 JSB SRNW      SCHEDULE THE WAITERS
EXRN  CLB,INB       SET THE CLEAR FLAG
      JMP $RNEX     EXIT TO DISPATCHER PROPERLY 
* 
*     LOCK RN ROUTINE 
* 
LOKRN LDB B377      GET GLOBAL FLAG 
      SEZ           IF LOCAL
      LDB TEMP6      REPLACE WITH LOCAL 
      SZA           IF NOT LOCKED 
      CPA TEMP6      OR LOCKED TO CALLER
      CMA,INA,RSS   THEN OK  CONTINUE 
      JMP LKSUS     ELSE SUSPEND THIS GUY.
* 
LOKIT ADA B         SET LOCK FLAG LESS CURRENT ENTRY
      ADA RNADR,I   SET THE LOCK FLAG 
      STA RNADR,I   IN THE RN TABLE 
      LDA B         SET A=ID OF NEW LOCKER
      JMP CLRN      GO TEST FOR CLEAR OPTION
* 
LKSUS LDA RNADR     GET THE SUSPEND FLAG
      JMP $RNSU      AND GO SUSPEND 
      SPC 2 
*     SRNW SCHEDULES ANY PROGRAMS SUSPENDED IN THE '3' LIST 
*     WITH A FLAG = (RNADR)  (USUALLY RN LOCK REQUEST SUSPEND)
* 
SRNW  NOP 
      LDA RNADR     GET THE FLAG WORD 
      JSB $SCD3     SCHEDULE ALL SUCH WAITERS 
      JMP SRNW,I    RETURN
* 
* 
ERN02 LDB D2        RN02  ERROR 
      RSS 
ERN03 LDB D3        RN03  ERROR 
ERN00 LDA ASRN      USE RN
      JMP $ERAB     GO BOOM!#$#$%&'"
* 
ASRN  ASC 1,RN
      SKP 
*     LU UNLOCK REQUEST 
* 
* 
D$RN  DEF $RNTB 
D2    DEC 2 
D3    DEC 3 
D7    DEC 7 
B377  OCT 377 
C377  OCT 177400
B77   OCT 77
B10   OCT 10
B30   OCT 30
B40   OCT 40
* 
TEMP6 NOP 
* 
RQRTN EQU 1677B     RETURN POINT ADDRESS
IDNO  EQU 1704B      USERS ID SEG # 
RNADR EQU 1705B      RN ADDR IN RN TABLE
XEQT  EQU 1717B     ID SEGMENT ADDR. OF CURRENT PROG. 
XSUSP EQU 1730B        'POINT OF SUSPENSION'
* 
RQOP  EQU 1701B     RQP2 USED FOR RN OPTION NUMBER
RQNO  EQU 1702B     RQP3 USED FOR ADDR OF RN NUMBER 
RQST  EQU 1703B     RQP4 USED FOR ADDR OF RN STATUS 
      ORG *         PROGRAM LENGTH
      END 
                        