ASMB,R,L,C     ** LURQ LU LOCK REQUEST MODULE **
      HED ** REAL-TIME EXECUTIVE  LURQ LU LOCK REQUEST MODULE **
*     NAME:   LURQ
*     SOURCE: 92067-18038 
*     RELOC:  PART OF 92067-16035 
*     PGMR:   G.A.A.
* 
*  ***************************************************************
*  * (C) COPYRIGHT HEWLETT-PACKARD COMPANY 1978.  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 LURQ,6 92067-16035 REV.1805 771013  
* 
      EXT $ERAB,$RNTB,$IDNO,$SCD3,$LUSU,$DRAD 
      EXT $LUSW,$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 
* 
      CCA 
      ADA LURQ      SET CALLING ADDR IN SUSP. WORD
      XSA 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 
      RAL,CLE,ELA   BIT14 TO E
      RAR,RAR       RESTORE OPTION, LESS NO-ABORT BIT.
      STA RQOP      SAVE CALLER'S OPTIONS.
* 
      LDB XSUSP 
      ADB D7        GET ADDR OF STATUS
      XLA B,I 
      RAL,ERA       PUT E INTO BIT15
      XSA B,I        OF STATUS WORD 
      SSA           DID WE SET IT?
      ISZ RQRTN     YES, BUMP RTRN ADDR, NO ABORT BIT SET 
* 
ABCAL ISZ LURQ      NO
      LDA LURQ,I
      JSB $DRAD     GET DIRECT ADDR 
      STA RQTB      ADDR OF LU ARRAY
      STA RQP7      SAVE FOR FIRST LOOPS
      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
      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 
      XLA 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 JSB SWITH     SWITCH BATCH LU GET DRT ENTRY 
      SZA           IF AVAILABLE CONTINUE 
      CPA RQP8      OR HIS ALREADY
      RSS           ALL OK
      JMP LULK5     ELSE GO SUSPEND 
* 
      ISZ TEMP4     STEP THE COUNT  DONE??
      JMP LULK2     NO TRY NEXT LU. 
* 
      LDA RQP8      GET THE ALLOCATED FLAG
      SZA           IF AN RN ALREADY ALLOCATED
      JMP LULK3     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
      XSB RNADR,I   AND SET IN RN TABLE 
* 
LULK3 LDA RQTB      RESET THE ARRAY ADDRESS 
      STA RQP7      FOR SWITH 
LULK4 JSB SWITH     GET THE DRT ADDRESS 
      LDA B,I       GET DRT ENTRY 
      IOR RQP8      SET LOCK FLAG 
      STA B,I       RESET IN THE DRT
      ISZ TEMP5     IF NOT DONE 
      JMP LULK4     DO THE NEXT ONE 
* 
LULKS CLA           SET A TO SHOW 
LULKF XSA XA,I      SUCESSFUL COMPLETION
      JMP $LUEX     EXIT VIA LU-RN EXIT CODE
* 
* 
*     LOCKED TO SOME OTHER PROGRAM
* 
LULK5 ALF,ALF       IF LOCK IS TO CALLER
      RAL,RAL       THEN
      ADA D$RN      THE LOCK
      STA RNADR     IS TO BE IGNORED
      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,RSS       THEN
      JMP LULK9 
      XSB RNADR,I   RELEASE THE RN
LULK9 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 JSB SWITH     DO BATCH SWITCH GET LOCK ECT. 
      STA TEMP3     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
      XLA A,I       GET THE FLAG
      CPA TEMP6      HIS? 
      RSS           YES SKIP ERROR EXIT 
      JMP ELU03     NO- TOO BAD, YOU LOSE.
* 
      XLA B,I       UNLOCK THE
      XOR TEMP3     LU
      XSA B,I 
      ISZ TEMP4     DONE? 
      JMP LUUL1     NO  TRY NEXT ONE
* 
      LDA RNADR     SCHEDULE ANY WAITING PROGRAMS 
      JSB $SCD3 
* 
      ISZ TEMP9     TEST IF ANY LU'S
      LDB DRT       STILL LOCKED
LUUL2 LDA B,I       BY CALLER 
      AND B3700     IF SO 
      CPA TEMP3     JUST
      JMP LULKS     EXIT
* 
      INB           STEP DRT ADDRESS
      ISZ TEMP9     AN COUNT / DONE?
      JMP LUUL2     NO TRY NEXT 
* 
      CLA           NO LU'S LOCKED
      XSA 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 
* 
SWITH NOP           DO BATCH SWITCH IF REQUIRED 
      CCA           GET THE LU-1
      ADA RQP7,I    GET THE LU
      AND B77       ISOLATE IT
      STA RQP9      SAVE IN TEMP
      ISZ RQP7      STEP ADDRESS FOR NEXT TIME
      LDB XEQT      GET THE BATCH FLAG
      ADB D20 
      XLB B,I       TO B
      SSB,RSS       IF NOT IN BATCH MODE
      JMP SWEX      GO GET THE WORD FROM DRT. 
* 
      LDB DLUSW     GET ADDR OF THE LU SWITCH TABLE 
      XLA B,I       GET THE LENGTH
      CMA,INA        SET NEGATIVE FOR COUNTER 
      STA COUNT     SET COUNTER 
* 
SWNXT INB           START THE LOOP
      XLA B,I       GET THE ENTRY 
      AND B77       ISOLATE THIS ENTRY
      CPA RQP9      THIS IT?? 
      JMP SWIT      YES GO GET THE SWITCH 
* 
      ISZ COUNT     NO , END OF TABLE?
      JMP SWNXT     NO TRY NEXT ONE 
* 
      JMP SWEX      YES USE THE GIVEN LU
* 
SWIT  XLA B,I       GET THE SWITCH LU 
      ALF,ALF       TO LOW A
      AND B77       ISOLATE 
      STA RQP9      SET IN THE TEMP 
* 
SWEX  LDA RQP9      GET THE LU
      ADA TEMP9     TEST FOR LEGALITY 
      INA           ADJUST FOR -1 CONVENTION
      CCE,SSA,RSS   SKIP IF OK
      JMP ELU02     ELSE BAIL OUT WITH DIAGNOSTIC 
* 
      LDB RQP9      GET THE DRT ENTRY 
      ADB DRT 
      LDA B,I       TO A
      AND B3700     ISOLATE IT
      JMP SWITH,I   RETURN B= ADDRESS, A= ISOLATED LOCK FLAG
* 
COUNT NOP 
D$RN  DEF $RNTB+0   FORCE A DIRECT ADDRESS
D2    DEC 2 
D3    DEC 3 
D7    DEC 7 
D20   DEC 20
DLUSW DEF $LUSW+0   FORCE A DIRECT ADDRESS
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 
RQP9  EQU 1710B 
XEQT  EQU 1717B 
XSUSP EQU 1730B 
XA    EQU 1731B 
      ORG *         PROGRAM LENGTH
      END 
                                                          