ASMB,R,L,C
      HED "LOPEN" ROUTINE TO DO CONTENTION FMP "OPEN"'S & "CLOSE"'S 
*     NAM LOPEN,7 PRE-REL 4-17-76 (DLB) 
*     NAM LOPEN,7 09570-16515 REV. A 761013 
      NAM LOPEN,7 PRE-REL 780327 (DLB) (RTE-IV) 
* 
*-------------------------------------------------------- 
* 
*     RELOC.       09570-16515
*     SOURCE       09570-18515
* 
*     D. BASKINS         13 OCT 76 REV. A 
* 
*---------------------------------------------------------
* 
      ENT LOPEN,LCLOS 
      EXT .ENTR,OPEN,CLOSE,EXEC,IDSGA 
      EXT .XLA
      SPC 1 
A     EQU 0 
B     EQU 1 
XEQT  EQU 1717B 
MXPRM EQU 10        MAX NUMBER OF PARAMETERS FOR OPEN ROUTINE 
      SUP PRESS MULTIPLE LISTINGS 
*  PURPOSE: 
*    TO OPEN OR CLOSE A FILE AND DO A CORE LOCK IF IT WILL NOT
*    CAUSE A DEAD LOCK IN AN RTE-II ENVIORNMENT.  THIS SUBROUTINE 
*    SHOULD BE USED INSTEAD OF THE FMP "OPEN" OR "CLOSE" ROUTINE
*    IF FASTER FILE OPEN'S AND CLOSES ARE DESIRED.  THE OVERHEAD
*    OF THIS ROUTINE IS APPROXIMENTLY ZERO, EXCEPT FOR THE CORE 
*    IT USES. 
*  CALLED:
*    THIS ROUTINE IS CALLED IN EXACTLY THE SAME WAY AS THE FMP
*    OPEN AND CLOSE SUBROUTINES ARE, EXCEPT FOR THE NAME. 
      SPC 1 
OPENI JSB OPEN      CALL OPEN OR CLOSE
DEFRN DEF *         TELL HOW MANY PASSED PARMS
      REP MXPRM     MAX PARAMETERS ABOUT 10 
      NOP 
JMPST JMP LASTP 
      SPC 1 
LOPEN NOP           ENTRY 
      JSB .ENTR     GET CALLERS PARAMETERS
      DEF DEFRN+1 
      CLA           ZERO THE UNPASSED PARAMETERS
      STB DEFRN     SAVE THE RETURN ADDRESS 
MORE  CPB RTNAD     DONE? 
      JMP CORLK     YES 
      STA B,I       NO, KEEP ON TRUCKING
      INB 
      JMP MORE
      SPC 1 
LASTP LDB OPNJS     GET OPEN JSB
      STB OPENI     RESTORE JSB OPEN INSTRUCTION
      STA LCLOS     SAVE A-REG FOR OPEN RETURN
      LDA SAVST     GET LOCK STATUS WORD
      LSR 6         POSITION CL BIT 
      SLA,RSS       SET?
      CLA           NO, DO CORE UNLOCK
      JSB CLOCK 
      LDA LCLOS     RESTORE A-REG 
      JMP LOPEN,I   RETURN
      SPC 1 
RTNAD DEF JMPST     LAST PARAMETER+1 ADDRESS
      SPC 1 
LCLOS NOP           CLOSE ENTRY 
      LDA LCLOS     GET RETURN ADDRESS
      STA LOPEN     FAKE OUT ALL
      LDA CLSJS     GET JSB CLOSE INSTRUCTION 
      STA OPENI     AND POSITION
      JMP LOPEN+1   AND DO THE THING
      SPC 1 
CORLK LDA XEQT      GET MY IDSEG ADDRESS
      ADA D14       CHECK MY OWN CORE LOCK BIT
      JSB .XLA      GET ID(15) WORD 
      DEF A,I       * LDA A,I 
      STA SAVST     SAVE THE LOCK STATUS
      JSB IDSGA     NOW CHECK D.RTR'S PARTITION 
      DEF *+2 
      DEF D.RTR     TO SEE IF SAME AS MY OWN
      ADA D14       BUMP TO IT'S TYPE 
      JSB .XLA
      DEF A,I       * LDA A,I 
      XOR SAVST     IF SAME TYPE AS ME, 
      AND O7        DO NOT CORE LOCK
      JSB CLOCK     DO CORE LOCK IF NOT = 0 
      JMP OPENI     NOW GO OPEN OR CLOSE THE FILE 
      SPC 1 
CLOCK NOP           ENTRY A=0>UNLOCK, ELSE LOCK 
      SZA           CHECK IF LOCK OR UNLOCK 
      CLA,INA 
      STA LFLAG 
      JSB EXEC
      DEF *+3 
      DEF NA22
      DEF LFLAG 
      NOP           IGNORE ABORT ERRORS 
      JMP CLOCK,I   RETURN
      SPC 1 
LFLAG NOP 
OPNJS JSB OPEN
CLSJS JSB CLOSE 
D.RTR ASC 3,D.RTR 
SAVST NOP           SAVE CORE LOCK BIT
O7    OCT 7 
D14   DEC 14
NA22  ABS 100000B+22
      END 
                                                                                                                                                