ASMB,R,L,C,Q ** LURQ LU LOCK REQUEST MODULE ** HED ** REAL-TIME EXECUTIVE LURQ LU LOCK REQUEST MODULE ** * NAME: LURQ * SOURCE: 92067-18270 * RELOC: PART OF 92067-16268 * PGMR: G.A.A.,G.L.M. * * *************************************************************** * * (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-1X270 REV.2013 791024 * EXT $ERAB,$RNTB,$IDNO,$SCD3,$LUSU,$DRAD EXT $LIBR,$PVCN,$ALRN,$LUEX,$ULLU EXT LUTRU * 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 * . UNLESS BIT 13 OF THE OPTION WORD IS * . SET. THIS CAUSES THE LEAST 8 BITS TO BE 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. * * NOTE: IF BIT 14 IS SET, NO ABORT IS IN EFFECT * NOTE: IF BIT 13 IS SET, 8 BITS ARE USED FOR THE LU DEFINITION. * NOTE: IF BIT 12 IS SET, LU SWITCHING IS NOT PERFORMED. * NOTE: IF BIT 11 IS SET, LU LOCKS ARE ALLOWED ON DISCS * IF BIT 11 IS CLEAR, LU LOCKS TO DISC CAUSE LU02 ERRORS * * 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 * LU04 LU NOT DEFINED FOR SESSION * 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 STA RQP6 *CLEAR LU COUNTER * 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 * 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 RQOP FETCH REQUEST OPTION SSA IF REQ SLA IS RELEASE RSS ALL JMP LUUL3 SKIP PARAMS CHECK (BIT 15=1,0=0) * 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 * * SWITH RETURNS (A)=0 AND (B)<0 IF REQUEST LU WAS ZERO. * 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 * * MAKE SURE AT LEAST ONE NON-ZERO LU WAS SPECIFIED * LDB RQP6 FETCH VALID LU COUNTER SZB,RSS IF NONE JMP LULKS DON'T ALLOCATE AN RN (EXITS WITH OK STATUS) * * 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 SSB IF THIS LU WAS ZERO JMP LUL.5 SKIP DRT SETUP * LDA B,I GET DRT ENTRY IOR RQP8 SET LOCK FLAG STA B,I RESET IN THE DRT LUL.5 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 RSS ELU04 LDB D4 LDA ASLU LU ERROR JMP $ERAB GO BOOM!#$#$%&'" * ASLU ASC 1,LU * * * LUUL1 JSB SWITH DO BATCH SWITCH GET LOCK ECT. SSB IF SPECIFIED LU WAS A ZERO JMP LUL.1 SKIP RELEASE WORK * 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 LUL.1 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 * SKP * * * * SWITH RESOLVES ANY LU SWITCHING (SESSION OR BATCH) AND * CHECKS THE VALIDITY OF THE SPECIFIED LU. * * CALLING SEGUENCE: RQP7=ADDR OF LOGICAL UNIT * * JSB SWTIH * * ON RETURN : RQP7=RQP7+1 * (A)=ISOLATED LOCK FLAG * (B)=DRT ADDRESS * * OR ** IF SPECIFIED LU WAS ZERO, * * (A)=0 * (B)<0 * * POSSIBLE ERROR EXITS: IO04 = LU NOT DEFINED FOR THIS SESSION * IO02 = LU GREATER THAN MAX LU * * * * SWITH NOP DO LU SWITCH IF REQUIRED LDA RQP7,I GET THE LU LDB RQOP GET THE OPTION BLF,RBR MOVE EXT LU BIT (13) TO LSB & NO SWT TO SIGN SLB,RSS IF WE WANT TO USE 8 BITS, SKIP 6 BIT MASK AND B77 ISOLATE LU TO 6 BITS AND B377 MAKE SURE REST OF WORD IS CLEAN STA RQP9 SAVE IN TEMP ISZ RQP7 STEP ADDRESS FOR NEXT TIME * SZA IF REQUEST LU IS ZERO, OR SSB IF NO-SWITCH OPTION SELECTED (BIT 12 CONWD) JMP LU.2 SKIP LU SWITCH * * CALL LUTRU TO SWITCH SESSION OR BATCH LU (MASKS TO 8 BITS). * NOTE: $PVCN MUST FIRST BE SET=1 SO THE RETURN FROM LUTRU * WILL BE PERMITTED (IF WE ARE IN THE RESIDENT LIBRARY). * $PVCN MUST THEN BE CLEARED UPON RETURN FROM LUTRU SO * LURQ MAY EXIT VIA THE OP SYS. * * ISZ $PVCN SHOW US AS A PRIV ROUTINE * JSB LUTRU GO DEF LU.1 GET THE DEF RQP9 REAL LU LU.1 CLB RESET PRIV COUNTER STB $PVCN SO LURQ MAY EXIT VIA THE SYSTEM SSA IF NOT DEFINED FOR SESSION JMP ELU04 GO ISSUE ERROR * LU.2 CCB ADJUST ADB A LU FOR INTERNAL FORMAT (LU-1) STB RQP9 FOR DRT WORK. * SZA,RSS IF SPECIFIED OR SWITCHED LU = 0 JMP SWITH,I RETURN (A)=0,(B)<0 * * A="TRUE" SYSTEM LU * ISZ RQP6 BUMP LU COUNTER ADA TEMP9 TEST FOR LEGALITY CCE,SSA,RSS SKIP IF OK JMP ELU02 ELSE BAIL OUT WITH DIAGNOSTIC * * CAN'T LOCK A DISK LU UNLESS BIT 11 OF OPTION WORD IS SET * LDB RQP9 GET THE DRT ENTRY ADB DRT ADDRESS AND SAVE STB TEMP1 IT FOR LATER LDA RQOP PICK UP THE OPTION WORD SLA,RSS IS THIS A LOCK REQUEST ? JMP LU.03 NO, UNLOCK ANY DEVICE YOU WANT * YES, ONLY LOCK DISCS IF BIT 11 IS SET ALF "DISK TOO" BIT 11 TO MSB SSA IF CLEAR MAKE SURE LU IS NOT A DISK JMP LU.03 LU LOCKS ALLOWED ON ALL DEVICES * * MAKE SURE THE DEVICE IS NOT A DISK, BIT 11 IS CLEARED * LDA B,I GET THE LU'S DRT ENTRY AND B77 ISOLATE THE EQT ENTRY NUMBER ADA N1 0 ORIGIN IT MPY D15 15 WORDS PER EQT ENTRY ADA EQTA OFFSET BY BASE OF EQT ENTRIES ADA D4 THE 5TH WORD CONTAINS DEVICE TYPE LDA A,I PICK UP THE 5TH WORD AND B36K ISOLATE THE DRIVER TYPE CPA B14K IS IT DISK (DVR30, 31, 32, 33) JMP ELU02 -YES, CAN'T LET HIM LOCK DISK * LDB TEMP1 RESTORE THE DRT ENTRY ADDRESS LU.03 LDA B,I GET THE LU'S DRT ENTRY AND B3700 AND ISOLATE THE LOCK BITS JMP SWITH,I RETURN B= ADDRESS, A= ISOLATED LOCK FLAG * D$RN DEF $RNTB+0 FORCE A DIRECT ADDRESS D2 DEC 2 D3 DEC 3 D4 DEC 4 D7 DEC 7 D15 DEC 15 N1 DEC -1 B377 OCT 377 B3700 OCT 3700 B77 OCT 77 B37 OCT 37 B36K OCT 36000 DRIVER TYPE CODE MASK B14K OCT 14000 DRIVER TYPE DISKS (30,31,32,33) * TEMP1 NOP TEMP3 NOP TEMP4 NOP TEMP5 NOP TEMP6 NOP TEMP9 NOP * DRT EQU 1652B EQTA EQU 1650B 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 RQP6 EQU 1705B RQP7 EQU 1706B RQP8 EQU 1707B RQP9 EQU 1710B XEQT EQU 1717B XSUSP EQU 1730B XA EQU 1731B ORG * PROGRAM LENGTH END