ASMB,R,L,C     ** RTE-M II/III $MRN  RN-LU SYSTEM ROUTINES ** 
*     NAME  : $MRN  
*     SOURCE: 92064-18143 
*     RELOC:  92064-16031 
*     PROGMR: E.J.W.  BASED ON RTE-III VERSIONS G.A.A.
* 
*  **************************************************************** 
*  * (C) COPYRIGHT HEWLETT-PACKARD COMPANY 1976.  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 $MRN,0  92064-16031  REV.1650  761020 
* 
      EXT $RNTB,$IDNO,$SCD3,$SCLK 
      ENT $TRRN,$CGRN,$ULLU 
* 
      SUP 
A     EQU 0 
B     EQU 1 
* 
* 
*     $TRRN IS THE RN/LU LOCK CLEAN UP ROUTINE. 
*     IT IS CALLED BY THE DISPATCHER WHEN EVER A PROGRAM COMPLETES
*     (THE CALL IS BY WAY OF THE REENTRENT CLEAN UP ROUTINE.
* 
*     ITS FUNCTION IS TO RELEASE ANY LOCAL LOCKS AND ANY LOCAL
*     ALLOCATIONS THE PROGRAM HAS.  IT ALSO RELEASES ANY LU 
*     LOCKS THE PROGRAM HAS.
* 
*     CALLING SEQUENCE: 
* 
*     LDB ID-SEGMENT ADDRESS
*     JSB $TRRN 
*     NORMAL RETURN   REGISTERS MEANING LESS
* 
* 
$TRRN NOP 
      JSB $ULLU     RELEASE ANY LU LOCKS / SET UP TEMPS 
      LDA D$RN      SET THE TABLE ADDRESS FOR 
      STA TEMP1     BOTH LOOPS
      STA TEMP2 
      LDA A,I       GET THE TABLE SIZE
      CMA,INA,SZA,RSS SET NEGATIVE / IF ZERO EXIT 
      JMP $TRRN,I 
* 
      STA TEMP3     SET LOOP COUNTERS 
      STA RQP8      FOR BOTH LOOPS
* 
TRRN1 ISZ TEMP2     DALLOCATE LOOP
      LDA TEMP2,I   GET THE RN
      ALF,ALF       PUT OWNER FLAG IN LOW A 
      AND B377      MASK
      CPA RQP5      IF OWNED BY COMPLETING
      STA TEMP2,I   PROGRAM FLAG FOR NEXT LOOP
      ISZ RQP8      STEP COUNTER
      JMP TRRN1     LOOP IF NOT DONE
* 
TRRN3 ISZ TEMP1     LOCAL LOCK LOOP 
      LDA TEMP1,I   GET THE RN
      AND B377      IF LOCAL LOCK 
      CPA RQP5      TO COMPLETING PROGRAM 
      JMP TRRN6     GO RELEASE THE LOCK 
* 
TRRN4 ISZ TEMP3     STEP COUNT
      JMP TRRN3     IF NOT DONE LOOP
* 
      LDB TEMP2     GET THE DEALLOCATE FLAG 
      LDA D$RN      AND THE ALLOCATE SUSPEND FLAG 
      SZB,RSS       IF ANY DEALLOCATED
      JSB $SCD3     SCHEDULE ANY WAITING PROGRAMS 
      JMP $TRRN,I   RETURN
* 
TRRN6 XOR TEMP1,I   CLEAR THE LOCK
      STA TEMP1,I   FLAG AND RESET
      SZA,RSS       IF DEALLOCATED
      STA TEMP2     SET FLAG FOR END OF LOOP
      JSB SRNW      SCHEDULE ANY WAITERS FOR THIS RN
      JMP TRRN4     RETURN TO LOOP
      SKP 
*     $CGRN IS THE CLEAR GLOBAL RN ROUTINE FOR USE BY DRIVERS 
*     AND OTHER SUCH USER WRITTEN SYSTEM PROGRAMS 
* 
*     CALLING SEQUENCE: 
* 
*     LDA RN        SET A TO USER RN WORD 
*     JSB $CGRN     CALL THIS ROUTINE 
*     RETURN        REGISTERS MEANING LESS. 
* 
$CGRN JMP TEMP1     INITILIZE ON FIRST JUMP TO HERE.
      STA B         SAVE THE RN NUMBER
      AND B377      CACULATE THE TABLE
      ADA D$RN      ADDRESS 
      STA TEMP1     AND SET IT
      LDA B         GET RN WORD AGAIN 
      IOR B377      SET THE GLOBAL FLAG 
      CPA TEMP1,I   IS THIS A LEGAL RN? 
      RSS           YES  SKIP 
      JMP $CGRN,I   NO RETURN NO ACTION 
      AND C377      CLEAR THE RN
      STA TEMP1,I   AND RESET IT
      JSB SRNW      SCHEDULE ANY WAITING PROGRAMS 
      JMP $CGRN,I   RETURN
      SPC 3 
*     SRNW SCHEDULES ANY PROGRAMS SUSPENDED IN THE '3' LIST 
*     WITH A FLAG = (TEMP1)  (USUALLY RN LOCK REQUEST SUSPEND)
* 
SRNW  NOP 
      LDA TEMP1     GET THE FLAG WORD 
      JSB $SCD3     SCHEDULE ALL SUCH WAITERS 
      JMP SRNW,I    RETURN
      SKP 
* 
*     THIS SUBROUTINE RELEASES ALL LU'S LOCKED BY A PROGRAM 
*     AND SCHEDULES ANY PROGRAMS WAITING FOR AN 
*     LU OR AN RN.
* 
*     CALLING SEQUENCE: 
* 
*     LDB ID ADDRESS
*     JSB $ULLU 
*     RETURN - REGISTERS MEANNINGLESS 
* 
$ULLU NOP 
      JSB $IDNO     GET THE ID NUMBER 
      STB RQP5      SET FOR $TRRN 
      BLF,BLF       PUT THE FLAG WORD 
      STB RQP6      IN HIGH END 
      ADB RQP5      AND IN BOTH ENDS
      STB RQP7      SET IN RQP7 
      LDA LUMAX     SET UP TO SCAN THE
      CMA,CLE,INA   DRT 
      STA TEMP2 
* 
      LDA DRT       GET THE DRT ADDRESS 
      STA TEMP3     AND SET FOR LOOP
ULLU1 LDA TEMP3,I   SEARCH FOR ALL
      AND B3700     LOCKED LU'S 
      SZA           THIS ONE LOCKED?
      JMP ULLU4     YES - GO TEST 
* 
ULLU2 ISZ TEMP3     NO / YES  STEP TO NEXT ENTRY
      ISZ TEMP2     IF NOT DONE 
      JMP ULLU1     TRY NEXT ONE
* 
      CLB,SEZ,RSS   IF NONE RELEASED
      JMP $ULLU,I   JUST EXIT 
* 
      STB TEMP1,I   CLEAR THE RN
      JSB SRNW      SCHEDULE RN WAITERS 
      LDA D$RN      AND ALLOCATION
      JSB $SCD3     WAITERS 
      JMP $ULLU,I   EXIT
* 
ULLU4 CLB 
      LSL 10        SHIFT LOCK FLAG TO LOW B
      ADB D$RN      AND INDEX INTO THE RN TABLE 
      LDA B,I       GET THE RN FLAG 
      CPA RQP7      CURRENT PROGRAM?
      CCE,RSS       YES SKIP
      JMP ULLU2     NO CONTINUE SEARCH
* 
      STB TEMP1     YES SET ADDRESS FOR SCHEDULE
      LDA TEMP3,I   GET THE DRT ENTRY 
      AND C3700     CLEAR THE FLAG
      STA TEMP3,I   RESET IT AND
      JMP ULLU2     CONTINUE SEARCH 
* 
D$RN  DEF $RNTB 
B377  OCT 377 
C377  OCT 177400
B3700 OCT 3700
C3700 OCT 174077
      SPC 2 
TEMP1 STA D$RN      INITIALIZE CODE 
TEMP2 LDB B,I       GET ADDRESS OF
TEMP3 JMP $SCLK     D.RTR AND GO START CLOCK
* 
DRT   EQU 1652B 
LUMAX EQU 1653B 
RQP5  EQU 1704B 
RQP6  EQU 1705B 
RQP7  EQU 1706B 
RQP8  EQU 1707B 
* 
      ORG *         PROGRAM LENGTH
      END $TRRN 
                                                          