ASMB,R,L,C     ** LURQ LU LOCK REQUEST MODULE **
      HED ** REAL-TIME EXECUTIVE  LURQ LU LOCK REQUEST MODULE **
*     NAME:   MLURQ 
*     SOURCE: 92064-18210 
*     RELOC:  92064-16081 
*     PGMR:   G.A.A.,E.J.W. 
* 
*  ***************************************************************
*  * (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 MLURQ,6  92064-16081  REV.1901  780719
      EXT $ERAB,$RNTB,$IDNO,$SCD3,$LUSU,$DRAD 
      EXT $LIBR,$PVCN,$ALRN,$LUEX,$ULLU 
      ENT LURQ
* 
      SUP 
A     EQU 0 
B     EQU 1 
* 
* 
* 
*     THE LU LOCK FEATURE ALLOWS A PROGRAM TO LOCK AN LU
*     TO HIS PROGRAM EXCULSIVELY.  ANY OTHER PROGRAM IS 
*     PUT IN THE WAIT LIST WHEN IT REQUESTS EITHER
*     A LOCK ON THE SAME LU OR WHEN IT ATTEMPTS I/O 
*     ON A LOCKED LU (ASSUMING IT IS NOT LOCKED TO HIM) 
* 
*     THE WAITING PROGRAM WILL BE RESTARTED WHEN THE
*     LU IS UNLOCKED.  ALL LU'S LOCKED TO A PROGRAM WILL BE 
*     UNLOCKED WHEN THE PROGRAM TERMINATES.  LU'S MAY 
*     ALSO BE UNLOCKED SELECTIVELY WITH THE FOLLOWING 
*     CALL. 
* 
*     CALL TO LOCK/UNLOCK AN LU 
* 
*     EXT LURQ
* 
*     JSB LURQ
*     DEF *+4 
*     DEF IOPT      ADDRESS OF OPTION FLAG WORD 
*     DEF LUARY     ADDRESS OF ARRAY OF LU'S
*     DEF NOLU      ADDRESS OF NUMBER OF LU'S TO LOCK/UNLOCK
*     RETURN - -
*      .
*      .
*      .
*LUARY DEC N1       ARRAY OF LU'S TO BE LOCKED
*      DEC N2       ONLY THE LEAST 6 BITS ARE USED. 
*       . 
*       . 
*       . 
*IOPT DEC OPTION    OPTIONS FOR THIS CALL SEE BELOW 
*NOLU DEC NO        NUMBER OF LU'S IN THE ARRAY 
* 
*     OPTIONS ARE:
*     IOPT          MEANING 
*     0             UNLOCK SPECIFIED LU'S 
*     100000B       UNLOCK ALL OWNED LOCKS
*     1             LOCK WITH WAIT THE SPECIFIED LU'S 
*     100001B       LOCK WITHOUT WAIT THE SPECIFIED LU'S. 
* 
*     TO PREVENT A DEAD LOCK AN ARRAY OF LU'S IS TO BE USED 
*     IT IS POSSIBLE TO RELEASE LOCKS ON AN LU AT ANY TIME. 
*     IF A NO WAIT LOCK REQUEST IS MADE AND THE CALLER ALREADY
*     HAS ONE OR MORE LU'S LOCKED HE WILL BE ABORTED 'LU01' 
* 
*     ON A NO WAIT RETURN THE A REGISTER INDICATES THE
*     STATUS AS FOLLOWS:
* 
*     A REGISTER    MEANING 
*     -1            NO RN AVAILABLE AT THIS TIME
*     0             REQUEST SUCESSFUL 
*     1             ONE OR MORE OF THE LU'S IS ALREADY LOCKED TO
*                   ANOTHER PROGRAM 
* 
*     POSSIBLE ABORT ERRORS ON THIS REQUEST ARE:
*     ERROR         MEANING 
*     LU01          HE HAS OTHERS LOCKED AND WAIT OPTION
*     LU02          ILLEGAL LU
*     LU03          NOT ENOUGH PRAMETERS
*     RN01          SYSTEM HAS NO RN'S
*     RN03          HE DOESN'T OWN THE LOCK HE IS TRYING TO RELEASE 
* 
*     INTERNAL FUNCTION:
* 
*     THE USER IS ASSIGNED AN RN WHICH IS LOCKED TO HIM.
*     THE DRT ENTRY FOR EACH LOCKED LU CONTAINS A POINTER 
*     TO THE RN USED TO DO THE LOCK.
* 
*     ALL A PROGRAMS LU LOCKS ARE CONNECTED WITH THE SAME RN
*     AND THE DRT FIELD IS 5 BITS WIDE, THUS A TOTAL
*     OF 31 (0 IS RESERVED FOR NO LOCK) PROGRAMS
*     MAY HAVE LU'S LOCKED AT THE SAME TIME.
*     THE DRT ENTRY IS IN BITS 6-10 OF THE DRT ENTRY. 
* 
      SKP 
LURQ  NOP 
      JSB $LIBR     PRIVILEGED ENTRY
      NOP 
      CLA            CLEAR CNTR SINCE WE DON'T
      STA $PVCN      PLAN TO RETURN VIA $LIBX 
      LDA D$RN
      JSB $DRAD     GET DIRECT ADDR OF RN TABLE 
      STA D$RN
* 
      CCA 
      ADA LURQ      SET CALLING ADDR IN SUSP. WORD
      STA XSUSP,I    IN CASE OF SUSPENSION
      LDA LURQ,I    SET RETURN ADDR 
      JSB $DRAD      (WORRY ABOUT FTN CALLS.) 
      STA RQRTN      IN CASE OF ABORT 
* 
      ISZ LURQ
      LDB LURQ,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 INTO BIT15
      STA B,I        OF STATUS WORD 
      ISZ RQRTN     BUMP RETURN ADDR
* 
ABCAL ISZ LURQ
      LDA LURQ,I
      JSB $DRAD     GET DIRECT ADDR 
      STA RQTB      ADDR OF LU ARRAY
      ISZ LURQ
      LDA LURQ,I
      JSB $DRAD     GET DIRECT ADDR 
      STA RQSZ      ADDR OF NUMBER OF LU'S
      LDA BIT15 
      CPA RQOP      IF REQ IS RELEASE ALL 
      JMP LUUL3      SKIP PARAMS CHECK
* 
      LDB RQRTN     MAKE SURE THERE ARE 
      CMB,INB        ENOUGH PARAMETERS
      ADB LURQ       ELSE 
      SSB,RSS        REJECT 
      JMP ELU03      WITH LU03 ERROR
* 
      LDB XEQT      HERE ON LU LOCK CALL
      JSB $IDNO     GET THE USERS ID NUMBER 
      STB IDNO      SET FOR ALLOCATE, ECT 
      BLF,BLF       PUT USER OWN/LOCK 
      ADB IDNO      FLAG IN 
      STB TEMP6      TEMP6
      LDA RQSZ,I    GET THE # OF LU'S 
      CMA,INA,SZA   IF NEG OR ZERO, 
      SSA,RSS 
      JMP ELU03             'LU03' ERROR
* 
      STA TEMP5     SET COUNTERS
      STA TEMP4     FOR THE TWO LOOPS 
      LDA LUMAX     GET THE DRT SIZE
      CMA           SET NEG OF MAX LU 
      STA TEMP3 
      STA TEMP9     SET FOR BOTH LOOPS
      LDB RQTB      GET THE LU ARRAY ADDRESS
      STB RQP7      AND SET 
      LDA RQOP      GET THE OPTION FLAG 
      SLA,RSS       IF THIS IS NOT LOCK REQ,
      JMP LUUL1      GO TO RELEASE CODE 
* 
*     CHECK IF AN RN HAS ALREADY BEEN ASSIGNED
*     FOR THIS PROGRAMS LU LOCKS. 
* 
      ISZ TEMP3     STEP LU COUNTER 
      LDB DRT       GET THE DRT ADDRESS 
LULK1 LDA B,I       GET LU ENTRY
      AND B3700     MASK TO LU LOCK FLAG
      STA RQP8      SAVE THE LOCK FLAG
      ALF,ALF       ROTATE TO 
      RAL,CLE,RAL   LOW AND USE TO
      ADA D$RN      INDEX INTO THE RN TABLE 
      LDA A,I       GET RN CODE 
      CPA TEMP6      IF OWNED AND LOCKED BY CALLER
      JMP LULK8     BY CALLER, JUMP 
* 
      CCE,INB       ELSE STEP DRT 
      ISZ TEMP3     ADDRESS IF NOT END
      JMP LULK1     CONTINUE SEARCH 
* 
      CLA           CLEAR ALLOCATED FLAG
      STA RQP8
* 
LULK2 CCB           TEST TO SEE IF ALL
      ADB DRT        THE LU'S HE  WANTS 
      LDA RQP7,I    ARE AVAILABLE 
      AND B77       GET THE LU FROM HIS ARRAY 
      SZA,RSS       .CHECK FOR LU 0 
      JMP ELU02     . REJECT AS ILLEGAL 
      ADB A         AND INDEX INTO THE DRT
      ADA TEMP9     IF GREATER THAN MAX.
      CCE,SSA,RSS   LU ON SYSTEM
      JMP ELU02     GO ISSUE 'LU02' ABORT 
* 
      LDA B,I       GET THE DRT ENTRY 
      AND B3700     MASK OUT THE LOCK CODE
      SZA           IF AVAILABLE CONTINUE 
      JMP LULK5     ELSE GO SUSPEND 
* 
LULK3 ISZ RQP7      STEP LU ARRAY 
      ISZ TEMP4     AND COUNT  DONE?
      JMP LULK2     NO TRY NEXT LU. 
* 
      LDA RQP8      GET THE ALLOCATED FLAG
      SZA           IF AN RN ALREADY ALLOCATED
      JMP LULK4     GO SET UP 
* 
*     NO RN ASSIGNED SO ALLOCATE ONE
* 
      CLB,INB       ASSIGN FROM LOW END OF TABLE
      JSB $ALRN 
      AND B377      SET RN NUMBER IN A
      STA B         AND B 
      AND B37       IF RN>37B 
      CPA B         OR ZERO 
      SZA,RSS       THEN GO 
      JMP LULK7     HANG HIM UP.
* 
      BLF,BLF       MOVE NUMBER TO
      RBR,RBR       BITS 6-10 
      STB RQP8      AND SET FOR LOCK LOOP 
      LDB TEMP6      GET THE LOCAL LOCK FLAG
      STB RNADR,I   AND SET IN RN TABLE 
* 
LULK4 CCB           SET ALL REQUESTED LU'S
      ADB DRT       LOCKED TO 
      LDA RQTB,I    THE CURRENT 
      AND B77       CALLER. 
      ADB A         DRT ADDRESS TO B
      LDA B,I       GET DRT ENTRY 
      IOR RQP8      SET LOCK FLAG 
      STA B,I       RESET IN THE DRT
      ISZ RQTB      STEP ARRAY ADDRESS
      ISZ TEMP5     IF NOT DONE 
      JMP LULK4     DO THE NEXT ONE 
* 
LULKS CLA           SET A TO SHOW 
LULKF STA XA,I      SUCESSFUL COMPLETION
      JMP $LUEX     EXIT VIA LU-RN EXIT CODE
* 
LULK5 ALF,ALF       IF LOCK IS TO CALLER
      RAL,RAL       THEN
      ADA D$RN      THE LOCK
      STA RNADR     IS TO 
      LDA A,I       BE IGNORED
      CPA TEMP6      TO CALLER? 
      JMP LULK3     YES OK
* 
*     LOCKED TO SOME OTHER PROGRAM
* 
      CLA,INA       SET FAILURE FLAG
LULK6 LDB RQOP      IF SUSPEND OPTION 
      SSB           SUSPEND OPTION? 
      JMP LULKF      YES, EXIT
      LDA RNADR      NO, SUSPEND PROGRAM
      JMP $LUSU 
* 
* 
*     ALLOCATION FAILED - 
* 
LULK7 CLB           IF BECAUSE >32B 
      SZA           THEN
      STB RNADR,I   RELEASE THE RN
      LDB D$RN      SET SUSP FLAG 
      STB RNADR     IN RNADR AND
      CCA            SET THE COMPLETION FLAG
      JMP LULK6     GO EXIT 
* 
*     HE HAS AT LEAST ONE LU LOCKED ALREADY 
*     TO PREVENT DEAD LOCK HE MUST NOT CODE 
*     WAIT ON SUBSEQUENT CALLS
* 
LULK8 LDA RQOP      GET THE OPTION FLAG 
ERN01 CME,SSA       AND THIS CALL WITH
      JMP LULK2     WAIT THEN 
* 
      CLB,INB,RSS   SEND 'LU01' 
ELU02 LDB D2        LU  ERROR 
      RSS 
ELU03 LDB D3        LU  ERROR 
      LDA ASLU      LU ERROR
      JMP $ERAB     GO BOOM!#$#$%&'"
* 
ASLU  ASC 1,LU
* 
* 
* 
LUUL1 CCB           ELSE
      ADB DRT       SCAN HIS
      LDA RQP7,I    ARRAY 
      AND B77       AND 
      SZA,RSS       .CHECK FOR  LU 0
      JMP ELU02     .  REJECT AS  ILLEGAL 
      ADB A         DO THE THING
      ADA TEMP3     IF ILLEGAL LU 
      CCE,SSA,RSS   SEND 'LU02' ERROR 
      JMP ELU02 
* 
      LDA B,I       GET THE DRT ENTRY 
      AND B3700     MASK LOCK FLAG
      STA TEMP9     SAVE IN CASE FOUND
      ALF,ALF       ROTATE TO 
      RAL,RAL       LOW A AND 
      ADA D$RN      USE TO INDEX THE RN TABLE 
      STA RNADR     SAVE THE ADDRESS
      LDA A,I       GET THE FLAG
      CPA TEMP6      HIS? 
      RSS           YES SKIP ERROR EXIT 
      JMP ELU03     NO- TOO BAD, YOU LOSE.
* 
      LDA B,I       UNLOCK THE
      XOR TEMP9     LU
      STA B,I 
      ISZ RQP7      STEP HIS ARRAY ADDRESS
      ISZ TEMP4     DONE? 
      JMP LUUL1     NO  TRY NEXT ONE
* 
      LDA RNADR     SCHEDULE ANY WAITING PROGRAMS 
      JSB $SCD3 
* 
      ISZ TEMP3     TEST IF ANY LU'S
      LDB DRT       STILL LOCKED
LUUL2 LDA B,I       BY CALLER 
      AND B3700     IF SO 
      CPA TEMP9     JUST
      JMP LULKS     EXIT
* 
      INB           STEP DRT ADDRESS
      ISZ TEMP3     AN COUNT / DONE?
      JMP LUUL2     NO TRY NEXT 
* 
      CLA           NO LU'S LOCKED
      STA RNADR,I   DEALLOCATE THE RN 
      LDA D$RN      SCHEDULE ANY ALLOCATION 
      JSB $SCD3     WAITERS AND 
      JMP LULKS     EXIT
* 
LUUL3 LDB XEQT      RELEASE ALL 
      JSB $ULLU     LU'S LOCKED BY
      JMP LULKS     CALLER AND RETURN 
* 
D$RN  DEF $RNTB 
D2    DEC 2 
D3    DEC 3 
D7    DEC 7 
BIT15 OCT 100000
B377  OCT 377 
B3700 OCT 3700
B77   OCT 77
B37   OCT 37
* 
TEMP3 NOP 
TEMP4 NOP 
TEMP5 NOP 
TEMP6 NOP 
TEMP9 NOP 
* 
DRT   EQU 1652B 
LUMAX EQU 1653B 
* 
RQOP  EQU 1701B 
RQTB  EQU 1702B 
RQSZ  EQU 1703B 
IDNO  EQU 1704B     RQP5 IS USERS ID SEG #
RNADR EQU 1705B     RQP6 IS RN ADDR IN RN TABLE 
* 
RQRTN EQU 1677B 
RQP7  EQU 1706B 
RQP8  EQU 1707B 
XEQT  EQU 1717B 
XSUSP EQU 1730B 
XA    EQU 1731B 
      ORG *         PROGRAM LENGTH
      END 
                                                                                          