LAD TITLE 'DMSLAD (CMS) VM/370 - RELEASE 6' 00001000 SPACE 2 00002000 *. 00003000 * MODULE NAME: 00004000 * 00005000 * DMSLAD 00006000 * 00007000 * CONTENTS: 00008000 * 00009000 * DMSLADP 00010000 * DMSLADN 00011000 * DMSLADW 00012000 * 00013000 * SUBROUTINE NAME: 00014000 * 00015000 * DMSLADP (ADTLKP) 00016000 * 00017000 * FUNCTION: 00018000 * 00019000 * FIND THE ACTIVE DISK TABLE BLOCK WHOSE MODE MATCHES 00020000 * THE ONE SUPPLIED BY THE CALLER. 00021000 * 00022000 * ATTRIBUTES: 00023000 * 00024000 * NUCLEUS RESIDENT, REENTRANT 00025000 * 00026000 * ENTRY POINTS: 00027000 * 00028000 * DMSLAD 00029000 * 00030000 * L R15,AADTLKP WHERE AADTLKP=V(DMSLAD) 00031000 * BALR R14,15 00032000 * 00033000 * R1 MUST POINT TO PARAMETER LIST AS USUAL: 00034000 * DS OF 00035000 * PLIST DC CL24' ' IMMATERIAL 00036000 * DC CL2' ' MODE LETTER 00037000 * 00038000 * EXIT CONDITIONS: 00039000 * 00040000 * ______ ____ _____ _____ _____ 00041000 * ACTIVE_DISK_TABLE_BLOCK_FOUND 00042000 * R1 =ADDRESS OF MATCHIN ACTIVE DISK TABLE BLOCK 00043000 * R15=0 (AND CONDITION-CODE = 0) 00044000 * ______ ____ _____ _____ ___ _____ 00045000 * ACTIVE_DISK_TABLE_BLOCK_NOT_FOUND 00046000 * R1 SAME AS AT ENTRY 00047000 * R15=1 (AND CONDITION-CODE =2) 00048000 * 00049000 * CALLS TO OTHER ROUTINES: 00050000 * 00051000 * NONE 00052000 * 00053000 * EXTERNAL REFERENCES: 00054000 * 00055000 * ADTSECT 00056000 * 00057000 * TABLES/WORKAREAS 00058000 * 00059000 * ADTFVS WORK STORAGE 00060000 * ADTSECT 00061000 * 00062000 * REGISTER USAGE: 00063000 * 00064000 * R15 ADTFVS AREA 00065000 * R9 BASE 00066000 * R10 ADTSECT 00067000 * R1,14 WORK 00068000 * 00069000 * OPERATION: 00070000 * 00071000 * DMSLAD SEARCHES THROUGH THE ACTIVE DISK TABLE 00072000 * STARTING AT IADT TO FIND 00073000 * AN ADT BLOCK WHOSE MODE-LETTER, IS GIVEN BY ADTM, 00074000 * MATCHES THAT OF THE CALLER. IF A MATCHING ADT BLOCK 00075000 * IS FOUND, ITS ADDRESS IS RETURNED IN R1 AS INDICATED 00076000 * ABOVE. IF NOT, AN ERROR-RETURN IS GIVEN. IN EITHER 00077000 * EVENT, THE CONDITION-CODE IS SET PER R15, FOR 00078000 * CONVENIENCE OF THE CALLER (WHO CAN OMIT THE USUAL LTR 00079000 * INSTRUCTION BEFORE CHECKING THE RETURN-CODE). 00080000 * 00081000 * DMSLAD IS CALLED BY MANY PROGRAMS AND FUNCTIONS TO 00082000 * DETERMINE THE 00083000 * ADDRESS OF THE ACTIVE DISK TABLE PERTAINING TO A 00084000 * GIVEN DISK. 00085000 * 00086000 * SUBROUTINE NAME: 00087000 * 00088000 * DMSLADNX (ADTNXT) 00089000 * 00090000 * FUNCTION: 00091000 * 00092000 * FIND THE NEXT (OR FIRST) ADT BLOCK IN THE ACTIVE DISK 00093000 * TABLE. 00094000 * 00095000 * ATTRIBUTES: 00096000 * 00097000 * NUCLEUS RESIDENT, REENTRANT 00098000 * 00099000 * ENTRY POINTS: 00100000 * 00101000 * DMSLADN 00102000 * 00103000 * ENTRY CONDITIONS: 00104000 * 00105000 * L R15,AADTNXT WHERE AADTNXT = V(ADTNXT) 00106000 * BALR R14,R15 00107000 * 00108000 * R1=0: FIND FIRST ACTIVE DISK TABLE BLOCK 00109000 * OR 00110000 * R1=NONZERO: GIVEN PRESENT ACTIVE DISK TABLE BLOCK, 00111000 * FIND NEXT ADT BLOCK (IF ANY) 00112000 * 00113000 * EXIT CONDITIONS: 00114000 * 00115000 * ______ ____ _____ _____ _____ 00116000 * ACTIVE_DISK_TABLE_BLOCK_FOUND 00117000 * R1 =ADDRESS OF MATCHING ACTIVE DISK TABLE BLOCK 00118000 * R15=0 (AND CONDITION-CODE=0) 00119000 * 00120000 * ______ ____ _____ _____ ___ _____ (____ ____) 00121000 * ACTIVE DISK TABLE BLOCK NOT FOUND _NONE_LEFT_ 00122000 * R1 =0 00123000 * R15=1 (AND CONDITION-CODE=2) 00124000 * 00125000 * CALLS TO OTHER ROUTINES: 00126000 * 00127000 * NONE 00128000 * 00129000 * EXTERNAL REFERENCES: 00130000 * 00131000 * ADTSECT, FVSECT 00132000 * 00133000 * TABLES/WORKAREAS 00134000 * 00135000 * NONE 00136000 * 00137000 * REGISTER USAGE: 00138000 * 00139000 * R12 BASE 00140000 * R13 FVSECT 00141000 * R1 ADTSECT 00142000 * REST WORK 00143000 * 00144000 * OPERATION: 00145000 * 00146000 * IF R1=0 AT ENTRY, THE ADDRESS OF THE FIRST ACTIVE 00147000 * DISK TABLE BLOCK AT IADT IS RETURNED. 00148000 * 00149000 * IF R1=NONZERO AT ENTRY, THE GIVEN VALUE IN R1 IS 00150000 * TAKEN AS THE ADDRESS OF THE PRESENT ADT BLOCK, AND 00151000 * THE POINTER TO THE NEXT ADT BLOCK (IF ANY) IS LOADED 00152000 * INTO R1. IF THERE IS NO ADT BLOCK LEFT, ERROR CODE 1 00153000 * IS GIVEN IN R15 AS SHOWN UNDER EXIT CONDTIONS ABOVE. 00154000 * 00155000 * IN ANY EVENT, NO CHECK IS MADE WHETHER ANY DISK IS 00156000 * CURRENTLY LOGGED IN FOR THE DISK TABLE RETURNED 00157000 * (THESE CHECKS BEING PERFORMED BY THE CALLER). 00158000 * 00159000 * DMSLADN IS USED BY VARIOUS ROUTINES AND COMMANDS FOR 00160000 * SCANNING THROUGH 00161000 * THE CHAIN OF ACTIVE DISKS FOR CONDITIONS TO BE 00162000 * SATISFIED, FOR EXAMPLE 00163000 * DMSLST AND DMSSTT. DMSLADN IS ALSO USED BY DMSLFS TO 00164000 * CHECK FOR A DISK 00165000 * WHICH MAY B EREAD-ONLY EXTENSION OF ANOTHER. 00166000 * 00167000 * ____: DMSLADN IS AN ENTRY-POINT IN THE DMSLAD 00168000 * NOTE 00169000 * ROUTINE. 00170000 * 00171000 * SUBROUTINE NAME: 00172000 * 00173000 * DMSLADW (ADTLKW) 00174000 * 00175000 * FUNCTION: 00176000 * 00177000 * FIND READ/WRITE DISK ACCORDING TO INPUT PARAMETER. 00178000 * 00179000 * ENTRY POINT: 00180000 * 00181000 * DMSLADW (ADTLKW) 00182000 * 00183000 * ENTRY CONDITIONS: 00184000 * 00185000 * 24(GPR1) = MODE LETTER 00186000 * 00187000 * 24(GPR1) = X 00188000 * GPR0 = 0: START SEARCH A FIRST R/W DISK (A(ADT): 00189000 * RESUME SEARCH AT NEXT ADT BLOCK 00190000 * 00191000 * 24(GPR1) = ? 00192000 * GPR0 = NUMBER OF 800 BYTE DATA BLOCKS TO BE WRITTEN 00193000 * 00194000 * 24(GPR1) = ??: SEARCH FOR R/W DISK WITH THE MOST ROOM 00195000 * 00196000 * EXIT CONDITIONS: 00197000 * 00198000 * NORMAL - 00199000 * GPR15 = 0 00200000 * GPR0 = NUMBER OF 800 BYTE RECORDS LEFT ON DISK 00201000 * GPR1 = A(ADT BLOCK FOR THIS DISK) 00202000 * 00203000 * ERROR - 00204000 * GPR15 = 1 AND CONDITION CODE = 2: 00205000 * ENTRY CONDITIONS NOT MET 00206000 * 00207000 * CALLS TO OTHER ROUTINES: 00208000 * 00209000 * NONE 00210000 * 00211000 * EXTERNAL REFERENCES: 00212000 * 00213000 * ADTSECT 00214000 * FVSECT 00215000 * 00216000 * TABLES/WORKAREAS: 00217000 * 00218000 * SEE EXTERNAL REFERENCES 00219000 * 00220000 * REGISTER USAGE: 00221000 * 00222000 * GPR12 = BASE REGISTER 00223000 * GPR13 = A(FVS) 00224000 * GPR1 = A(ADT BLOCK FOUND) 00225000 * 00226000 * NOTES: 00227000 * 00228000 * NONE 00229000 * 00230000 * OPERATION: 00231000 * 00232000 * 1. CHECK TO MAKE SURE THE MODE LETTER IS VALID, I.E. 00233000 * A-Z, *, ?, ?? 00234000 * 00235000 * 2. IF THE MODE LETTER = *, GO TO 10. IF IT EQUALS ?, 00236000 * GO TO 20. IF IT'S ??, GO TO 30. 00237000 * 00238000 * 3. BRANCH TO DMSLAD TO FIND THE DESIRED DISK. 00239000 * 00240000 * 4. UPON RETURN, IF CONDITION CODE = 7, EXIT WITH 00241000 * RETURN CODE = 1 AND CONDITION CODE = 2. 00242000 * 00243000 * 5. ELSE REFERENCE THE ADT BLOCK FOUND AND CHECK 00244000 * ADTFLG1 FOR THE WRITE BIT ON. 00245000 * 00246000 * 00247000 * 00248000 * 00249000 * 00250000 * 00251000 * 00252000 * 00253000 * 00254000 * 00255000 * 00256000 * 00257000 * 00258000 * 6. IF IT'S NOT ON, EXIT AS IN #3. 00259000 * 00260000 * 7. ELSE COMPUTE THE NUMBER OF 800 BYTE RECORDS LEFT 00261000 * AND PUT IT IN GPR0. 00262000 * 00263000 * 8. RESTORE THE REGISTERS, SET THE RETURN CODE TO 0, 00264000 * AND EXIT. 00265000 * 00266000 * 10. CALL DMSLADNX AND CHECK THE R/W FLAG. IF IT'S ON, 00267000 * GO TO 7. IF NOT, CONTINUE WITH 10. 00268000 * 00269000 * 20. CALL DMSLADNX AND COMPUTE THE NUMBER OF 800 BYTE 00270000 * RECORDS AVAILABLE. IF THERE ARE ENOUGH, SAVE THE 00271000 * VALUE IN GPR) AND GO TO 8. IF NOT, CONTINUE WITH 00272000 * 20. 00273000 * 00274000 * 30. CALL DMSLADNX AND COMPUTE THE NUMBER OF 800 BYTE 00275000 * RECORDS AVAILABLE. COMPARE THIS VALUE AGAINST 00276000 * THAT COMPUTED THE LAST TIME THROUGH. IF IT IS 00277000 * GREATER, SAVE IT, AND THE DISK IT BELONGED TO. 00278000 * CONTINE WITH 30 UNTIL CHECKED EVER DSIK IN THE ADT 00279000 * CHAIN. WHEN FINISHED, CHECK THE SAVED VALUES, IF 00280000 * NOTHING EXIT AS IN #3. ELSE LOAD GPR0, GPR1 WITH 00281000 * THE SAVED VALUES AND GO TO 8. 00282000 * 00283000 * SUBROUTINE NAME: V0742 00284000 * V0742 00285000 * DMSLADAD V0742 00286000 * V0742 00287000 * FUNCTION: V0742 00288000 * V0742 00289000 * TO MODIFY THE FILE STATUS TABLE CHAIN TO INCLUDE AN V0742 00290000 * AUXILIARY DIRECTORY, OR TO CLEAR THE AUXILIARY DIRECTORY V0742 00291000 * FROM THE CHAIN. V0742 00292000 * V0742 00293000 * ATTRIBUTES: V0742 00294000 * V0742 00295000 * NUCLEUS RESIDENT, REENTRANT V0742 00296000 * V0742 00297000 * ENTRY POINT: V0742 00298000 * V0742 00299000 * DMSLADAD V0742 00300000 * V0742 00301000 * ENTRY CONDITIONS: V0742 00302000 * V0742 00303000 * L R1,PLIST SET PLIST ADDRESS V0742 00304000 * SVC 202 V0742 00305000 * V0742 00306000 * R1 POINTS TO A PARAMETER LIST OF THE FOLLOWING FORMAT: V0742 00307000 * V0742 00308000 * DS 0F V0742 00309000 * PLIST DC CL8'DMSLADAD' V0742 00310000 * AUXDIRT DC A(AUXILIARY DIRECTORY) V0742 00311000 * DC F'0' V0742 00312000 * OR V0742 00313000 * DC X'80',AL3(AUX. DIRT. NUCLEUS COPY ADDR.) V0742 00314000 * V0742 00315000 * EXIT CONDITIONS: V0742 00316000 * V0742 00317000 * R15 = 0 ADT FOR DISK CONTAINING THE AUXILIARY DIRECTORY V0742 00318000 * AS SPECIFIED AT DIRECTORY GENERATION TIME VIA V0742 00319000 * GENDIRT, WAS FOUND AND THE FILE STATUS TABLE V0742 00320000 * CHAIN WAS MODIFIED TO INCLUDE THE AUXILIARY V0742 00321000 * DIRECTORY; OR THE FILE STATUS TABLE CHAIN V0742 00322000 * PREVIOUSLY MODIFIED HAS BEEN RESTORED BY V0742 00323000 * REMOVING THE AUXILIARY DIRECTORY. V0742 00324000 * V0742 00325000 * R15 = 1 AUXILIARY DIRECTORY ADDRESS NOT SPECIFIED IN V0742 00326000 * THE PLIST, OR NO DISK HAS BEEN ACCESSED AS THE V0742 00327000 * MODE SPECIFIED AT DIRECTORY GENERATION TIME. V0742 00328000 * CONDITION CODE = 2. V0742 00329000 * V0742 00330000 * R15 = 2 CALL TO RESET THE FILE STATUS TABLE CHAIN (LAST V0742 00331000 * WORD OF PLIST HAS HIGH ORDER BYTE = X'80') DID V0742 00332000 * NOT SPECIFY THE ADDRESS OF THE NUCLEUS COPY OF V0742 00333000 * THE AUXILIARY DIRECTORY. THE HIGH ORDER BYTE V0742 00334000 * IS SET TO X'80' AND THE ADDRESS OF THE NUCLEUS V0742 00335000 * COPY ARE STORED INTO THE LAST WORD OF THE PLIST V0742 00336000 * WHEN DMSLADAD IS CALLED TO SET THE AUXILIARY V0742 00337000 * DIRECTORY INTO THE FILE STATUS TABLE CHAIN. V0742 00338000 * CONDITION CODE = 2. V0742 00339000 * V0742 00340000 * CALLS TO OTHER ROUTINES: V0742 00341000 * V0742 00342000 * DMSFREE, DMSFRET V0742 00343000 * V0742 00344000 * EXTERNAL REFERENCES: V0742 00345000 * V0742 00346000 * FSTD, ADTSECT, NUCON V0742 00347000 * V0742 00348000 * TABLES/WORKARES: V0742 00349000 * V0742 00350000 * NONE V0742 00351000 * V0742 00352000 * REGISTER USAGE: V0742 00353000 * V0742 00354000 * R0 NUCON BASE V0742 00355000 * R1 INPUT PLIST AND ADTSECT BASE V0742 00356000 * R2 INPUT PLIST V0742 00357000 * R3 FSTD BASE V0742 00358000 * R4-R9 WORK REGISTERS V0742 00359000 * R10 LINKAGE V0742 00360000 * R11 WORK REGISTERS V0742 00361000 * R12 BASE V0742 00362000 * R13 WORK REGISTERS V0742 00363000 * R14 LINKAGE V0742 00364000 * R15 RETURN CODE V0742 00365000 * V0742 00366000 * OPERATION: V0742 00367000 * V0742 00368000 * TO SET AUXILIARY DIRECTORY INTO FILE STATUES CHAIN, V0742 00369000 * (LAST WORD OF PLIST ZERO): V0742 00370000 * V0742 00371000 * THE PLIST IS CHECKED TO VERIFY THAT AN AUX. DIRT. ADDR. V0742 00372000 * WAS SPECIFIED, IF NOT, RETURN WITH R15 = 1 AND CONDITION V0742 00373000 * CODE = 2. V0742 00374000 * V0742 00375000 * THE SIZE OF THE AUX. DIRT. IS DETERMAINED AND DMSFREE IS V0742 00376000 * CALLED TO GET THAT AMOUNT OF NUCLEUS FREE STORAGE. V0742 00377000 * V0742 00378000 * THE AUX. DIRT. IS THEN COPIED TO THE GOTTON STORAGE. V0742 00379000 * V0742 00380000 * THE INPUT PLIST IS THEN MODIFIED BY SETTING THE HIGH V0742 00381000 * ORDER BYTE TO X'80', AND STORING THE ADDRESS OF THE V0742 00382000 * NUCLEUS COPY INTO THE LOW ORDER THREE BYTES. V0742 00383000 * V0742 00384000 * ADTLKP IS THEN CALLED TO CHECK IF THE DISK MODE V0742 00385000 * SPECIFIED AT DIRECTORY GENERATION TIME IS ACCESSED. V0742 00386000 * IF NOT RETURN WITH REGISTER 15 = 1 AND CONDITION V0742 00387000 * CODE = 2. V0742 00388000 * V0742 00389000 * THE FILE STATUS TABLE CHAIN IS THEN MODIFIED SO THAT V0742 00390000 * THE AUXILIARY DIRECTORY IS SEARCHED BEFORE THE MAIN V0742 00391000 * DIRECTORY FOR THE DISK. V0742 00392000 * V0742 00393000 * V0742 00394000 * TO RESET THE FILE STATUS TABLE CHAIN, V0742 00395000 * (LAST WORD OF THE PLIST HIGH ORDER BYTE = X'80' V0742 00396000 * AND THE LOW ORDER THREE BYTES = ADDR. NUCLEUS COPY): V0742 00397000 * V0742 00398000 * IF THE LAST WORD OF THE PLIST DOES NOT CONTAIN AN ADDRESSV0742 00399000 * RETURN WITH REGISTER 15 = 2 AND CONDITION CODE = 2. V0742 00400000 * V0742 00401000 * ADTLKP IS CALLED TO CHECK THAT A DISK IS ACCESSED AS THE V0742 00402000 * MODE SPECIFIED IN THE AUX. DIRT. V0742 00403000 * IF NOT, CALL DMSFRET TO FREE THE NUCLEUS COPY AND RETURN V0742 00404000 * WITH REGISTER 15 = 1 AND CONDITION CODE = 2. V0742 00405000 * V0742 00406000 * A CHECK IS MADE TO SEE IF THE FILE STATUS TABLE HAS BEEN V0742 00407000 * MODIFIED, IF NOT, RETURN WITH REGISTER 15 = 2 AND V0742 00408000 * CONDITION CODE = 2. V0742 00409000 * V0742 00410000 * THE FILE STATUS TABLE CHAIN IS THEN RESTORED BY REMOVING V0742 00411000 * FROM THE CHAIN THE AUX. DIRT. V0742 00412000 * V0742 00413000 * DMSFRET IS THEN CALLED TO FREE THE NUCLEUS COPY OF THE V0742 00414000 * AUX. DIRT. V0742 00415000 * V0742 00416000 * AND CONTROL IS RETURNED TO THE CALLING ROUTINE WITH V0742 00417000 * REGISTER 15 = 0 V0742 00418000 * V0742 00419000 * V0742 00420000 *. 00421000 EJECT 00422000 * 00423000 * 00424000 * SEARCH ADT FOR BLOCK WITH MATCHING MODE 00425000 * 00426000 * R1 PLM(R1) IS ADDRESS OF FILE MODE CHARACTER 00427000 * R14 RETURN ADDRESS 00428000 * 00429000 * R1 POINTS TO ADT BLOCK IF FOUND, IS UNCHANGED OTHERWISE 00430000 * R15 = 0 (AND C.C. = 0) IF ADT BLOCK WAS FOUND 00431000 * R15 = 1 (AND C.C. = 2) IF ADT BLOCK WAS NOT FOUND 00432000 * 00433000 DMSLAD CSECT 00434000 ENTRY ADTLKP,ADTLKW,ADTNXT ***** REMOVE ***** 00435000 ENTRY DMSLADN,DMSLADW,DMSLADAD V0742 00436000 USING *,R15 00437000 B LKP 00438000 SPACE 3 00439000 DMSLADO EQU * 00440000 ADTLKP EQU * 00441000 SVCENT LKP,SVLAD 00442000 SPACE 3 00443000 DMSLADON EQU * 00444000 ADTNXT EQU * 00445000 SVCENT DMSLADN,SVLAD 00446000 SPACE 3 00447000 DMSLADOW EQU * 00448000 ADTLKW EQU * 00449000 SVCENT DMSLADW,SVLADW 00450000 SPACE 00451000 LKP EQU * 00452000 BALR R15,0 00453000 * 00454000 * ENTER 'ADTLKP' HERE ... 00455000 USING *,R15 00456000 L R15,AADTFVS LOAD POINTER TO FIXED VARIABLE STORAGE 00457000 USING ADLSECT,R15 00458000 STM R9,R10,ADLREGS SAVE REGISTERS 00459000 BALR R9,0 LOAD R9 FOR ADDRESSABILITY 00460000 USING *,R9 00461000 L R10,ADLPTR LOAD POINTER TO THE ACTIVE DISK TABLE 00462000 L R10,0(,R10) NOW LET R10 POINT TO FIRST ADT-BLOCK JS 00463000 USING ADTSECT,R10 00464000 * 00465000 * LOOP TO FIND ADT BLOCK WITH MATCHING MODE LETTER 00466000 * 00467000 ADTLKP1 EQU * 00468000 CLC ADTM,PLM(R1) BRANCH IF MATCHING MODE 00469000 BE ADTLKP2 ... 00470000 L R10,ADTPTR ADVANCE POINTER TO NEXT BLOCK IN CHAIN 00471000 LTR R10,R10 TEST FOR END OF CHAIN 00472000 BNZ ADTLKP1 BRANCH IF NOT END OF CHAIN 00473000 * 00474000 * ERROR 1 MEANS NO ADT BLOCK FOUND FOR GIVEN MODE LETTER 00475000 * 00476000 B ERROR1 ... 00477000 * 00478000 * MATCHING MODE FOUND 00479000 * 00480000 ADTLKP2 EQU * 00481000 LR R1,R10 ADDRESS OF ADT BLOCK INTO R1 00482000 LM R9,R10,ADLREGS RESTORE NECESSARY REGISTERS 00483000 SR R15,R15 CLEAR GPR 15 FOR STANDARD RETURN 00484000 BR R14 00485000 DROP R9 00486000 DROP R10 00487000 EJECT 00488000 * 00489000 * FIND NEXT ACTIVE DISK TABLE BLOCK IN CHAIN 00490000 * 00491000 * R1 NONZERO - POINTS TO ACTIVE DISK TABLE BLOCK 00492000 * R1 ZERO - POINTER TO FIRST ADT BLOCK IN CHAIN RETURNED 00493000 * 00494000 DMSLADN EQU * 00495000 * 00496000 USING *,R15 00497000 LTR R1,R1 TEST FOR ZERO ADT POINTER 00498000 BNZ ADTNXT1 BRANCH IF POINTER NONZERO 00499000 L R1,ADLPTR LOAD POINTER TO FIRST ADT BLOCK IN CHAIN 00500000 L R1,0(,R1) NOW LET R1 POINT TO FIRST ADT-BLOCK JS 00501000 SR R15,R15 SUCCESSFUL RETURN CODE 00502000 BR R14 AND RETURN TO CALLER. 00503000 * 00504000 * LOAD POINTER TO NEXT ACTIVE DISK TABLE BLOCK IN CHAIN 00505000 * 00506000 USING ADTSECT,R1 00507000 ADTNXT1 L R1,ADTPTR LOAD POINTER TO NEXT ADT BLOCK IN CHAIN 00508000 LTR R1,R1 CHECK TO MAKE SURE TABLE EXISTS 00509000 BZ ADTNXT2 ERROR IF NO TABLE(S) ARE LEFT 00510000 SR R15,R15 SUCCESSFUL RETURN CODE 00511000 BR R14 AND RETURN TO CALLER. 00512000 * 00513000 DROP R1 00514000 USING ADLSECT,R15 ... 00515000 ERROR1 LM R9,R10,ADLREGS RESTORE REGISTERS (FOR ADTLKP ONLY) 00516000 * 00517000 ADTNXT2 LA R15,1 ERROR 1 = NOT FOUND OR TABLES EXHAUSTED 00518000 LTR R15,R15 SET CONDITION-CODE FOR CONVENIENCE OF CALLER 00519000 BR R14 AND RETURN TO CALLER. 00520000 * 00521000 DROP R15 00522000 EJECT 00523000 DMSLADAD EQU * V0742 00524000 BALR R15,0 V0742 00525000 USING *,R15 V0742 00526000 STM R0,R15,0(R13) SAVE REGS. V0742 00527000 L R12,ALAD SET BASE V0742 00528000 USING DMSLAD,R12 V0742 00529000 DROP R15 V0742 00530000 LR R2,R1 SAVE PLIST ADDR. V0742 00531000 L R5,8(,R1) GET AUX. DIRECTORY ADDR. V0742 00532000 LTR R5,R5 AUX. DIRECTORY SPECIFIED? V0742 00533000 BZ ADERR1 NO, ERROR V0742 00534000 BM ABNCLR IF NEGATIVE, CALLED FROM ABN @VA00985 00535000 CLI 12(R2),X'80' IS THIS A CLEAR REQUEST? V0742 00536000 BE LADADCLR YES, GO TO CLEAR CODE V0742 00537000 LA R1,8(,R5) FIRST FST IN AUX. @VM03224 00538000 BAL R14,LKP GO GET ADT @VM03224 00539000 BC 2,ADERR1 ERROR RETURN @VM03224 00540000 LR R7,R1 @VM03224 00541000 USING ADTSECT,R7 @VM03224 00542000 TM ADTFLG1,ADTFRO+ADTFRW IS DISK ACCESSED? @VM03224 00543000 BZ ADERR1 NO, ERROR @VM03224 00544000 TM ADTFLG2,ADTFROS SHOLUD NOT BE ACC. AS SUCH @VM03224 00545000 BO ADERR1 ERROR IF SO @VM03224 00546000 TM ADTFLG1,ADTFFSTV IS THIS A VAR. FST @VM03224 00547000 BO SETVAR YES @VM03224 00548000 LA R0,101 DMSFREE SIZE @VM03224 00549000 DMSFREE DWORDS=(0),TYPE=NUCLEUS,TYPCALL=BALR V0742 00550000 ST R1,12(,R2) MODIFY USER PLIST FOR CLEAR @VM03224 00551000 MVI 12(R2),X'80' @VM03224 00552000 L R6,4(,R5) GET AUX. LENGTH @VM03224 00553000 S R6,=F'08' SUBSTRACT HEADER @VM03224 00554000 LA R5,8(R5) GET PAST AUX HEADER @VM03224 00555000 MOVE EQU * @VM03224 00556000 LR R3,R1 GOTTON CORE IN R3 @VM03224 00557000 LA R4,20 NO. OF FST PER BLOCK @VM03224 00558000 MOVELOOP EQU * @VM03224 00559000 LTR R6,R6 END OF AUX.? @VM03224 00560000 BZ PADZERO YES, GO PAD REST @VM03224 00561000 MVC 0(40,R1),0(R5) MOVE FIRST/NEXT FST @VM03224 00562000 LA R1,40(R1) INCREMENT COPY ADDR. @VM03224 00563000 LA R5,40(R5) AND AUX ADDR. @VM03224 00564000 S R6,=F'40' DECREMENT AUX LENGTH @VM03224 00565000 BCT R4,MOVELOOP LOOP @VM03224 00566000 B CHAIN DONE WITH BLOCK @VM03224 00567000 PADZERO EQU * @VM03224 00568000 MVI 0(R1),X'00' PAD REST OF BLOCK WITH 0 @VM03224 00569000 MVC 1(39,R1),0(R1) @VM03224 00570000 LA R1,40(R1) INCREMENT COPY ADDR @VM03224 00571000 BCT R4,PADZERO @VM03224 00572000 CHAIN EQU * @VM03224 00573000 L R8,ADTFDA GET FIRST FST BLOCK ADDR @VM03224 00574000 LA R8,8(R8) PLUS HEADER @VM03224 00575000 CKNEXT EQU * @VM03224 00576000 LR R10,R8 PUT ADDR IN R10 @VM03224 00577000 LA R8,800(R8) DOWN TO NEXT POINTER @VM03224 00578000 L R9,0(,R8) LOAD NEXT POINTER @VM03224 00579000 LTR R9,R9 IS THERE ONE @VM03224 00580000 BZ ENDOFCH NO, END OF CHAIN @VM03224 00581000 LR R8,R9 YES, NEXT IN R8 @VM03224 00582000 B CKNEXT @VM03224 00583000 ENDOFCH EQU * @VM03224 00584000 ST R3,0(,R8) SET NEXT POINTER @VM03224 00585000 ST R10,4(,R1) SET PREVIOUS POINTER IN COPY @VM03224 00586000 SR R10,R10 ZERO R10 @VM03224 00587000 ST R10,0(,R1) ZERO NEXT POINTER IN COPY @VM03224 00588000 LTR R6,R6 AUX DONE? @VM03224 00589000 BZ FINI YES @VM03224 00590000 LA R0,101 NEXT DMSFREE LENGTH @VM03224 00591000 DMSFREE DWORDS=(0),TYPE=NUCLEUS,TYPCALL=BALR @VM03224 00592000 B MOVE GO MOVE NEXT BLOCK @VM03224 00593000 SETVAR EQU * @VM03224 00594000 L R3,4(,R5) GET AUX LENGTH @VM03224 00595000 LA R3,8(R3) PLUS HEADER @VM03224 00596000 LR R4,R3 SAVE REAL LENGTH IN R4 @VM03224 00597000 LA R3,7(R3) ROUND TO DOUBLE WORD @VM03224 00598000 SRL R3,3 MAKE DOUBLE WORDS @VM03224 00599000 LR R0,R3 @VM03224 00600000 DMSFREE DWORDS=(0),TYPE=NUCLEUS,TYPCALL=BALR @VM03224 00601000 ST R1,12(,R2) @VM03224 00602000 MVI 12(R2),X'80' INDICATE NEXT CALL CLEAR @VM03224 00603000 LR R3,R1 GOTTON CORE IN R3 @VM03224 00604000 LA R6,255 MOVE LENGTH @VM03224 00605000 ADLOOP EQU * @VM03224 00606000 CR R4,R6 AUX < 255 @VM03224 00607000 BH ADLOOP2 NO @VM03224 00608000 LR R6,R4 YES, REAL LENGTH IN R6 @VM03224 00609000 BCTR R6,0 @VM03224 00610000 ADLOOP2 EQU * @VM03224 00611000 EX R6,DIRTMOVE @VM03224 00612000 LA R3,1(R6,R3) INCREMENT COPY ADDR. @VM03224 00613000 LA R5,1(R6,R5) AND COPY ADDR. @VM03224 00614000 SR R4,R6 DECREMENT LENGTH @VM03224 00615000 BCTR R4,0 @VM03224 00616000 LTR R4,R4 ANY LEFT? @VM03224 00617000 BNZ ADLOOP @VM03224 00618000 ST R1,12(,R2) SET COPY ADDR IN USER PLIST @VM03224 00619000 MVI 12(R2),X'80' @VM03224 00620000 L R8,ADTFDA GET FST BLOCK ADDR @VM03224 00621000 L R9,4(,R8) GET LENGTH @VM03224 00622000 LA R9,0(R9) ZERO HIGH ORDER BYTE @VM03224 00623000 LA R8,8(R8) SKIP HEADER @VM03224 00624000 AR R8,R9 POINT TO EXT. POINTER @VM03224 00625000 ST R1,0(,R8) SET EXT. POINTER @VM03224 00626000 FINI EQU * @VM03224 00627000 OI ADTFLG2,ADTPSTM SET PSTAT CHAIN MODIFIED @VM03224 00628000 DROP R7 @VM03224 00629000 LADADRET EQU * V0742 00630000 SR R15,R15 V0742 00631000 LADADERT EQU * V0742 00632000 LM R0,R14,0(R13) RESTORE REGS. V0742 00633000 BR R14 RETURN V0742 00634000 SPACE 2 V0742 00635000 LADADCLR EQU * @VM03224 00636000 ABNCLR EQU * @VM03224 00637000 SR R1,R1 @VM03224 00638000 CLEAR2 EQU * @VM03224 00639000 LA R15,DMSLADN GET FIRST OR NEXT ADT @VM03224 00640000 BALR R14,R15 @VM03224 00641000 BC 2,LADADRET @VM03224 00642000 USING ADTSECT,R1 @VM03224 00643000 TM ADTFLG2,ADTPSTM HAS FST CHAIN BEEN MODIFIED? @VM03224 00644000 BNO CLEAR2 NOT THIS ONE, CHECK NEXT @VM03224 00645000 DROP R1 @VM03224 00646000 LR R7,R1 MAKE R7 ADT BASE @VM03224 00647000 USING ADTSECT,R7 @VM03224 00648000 TM ADTFLG1,ADTFFSTV IS THIS VAR. FST @VM03224 00649000 BO CLEARVAR YES @VM03224 00650000 SR R4,R4 @VM03224 00651000 L R5,ADTHBCT GET HYPER BLOCK COUNT @VM03224 00652000 L R3,ADTFDA LOAD FIRST FST ADDR @VM03224 00653000 LA R3,8(R3) PLUS HEADER @VM03224 00654000 CLOOP EQU * @VM03224 00655000 BCT R5,CLOOP2 LOOP THROUGH MAIN FSTS @VM03224 00656000 L R4,800(,R3) LOAD ADDR FIRST AUX FST @VM03224 00657000 LTR R4,R4 IS THERE ONE? @VM03224 00658000 BZ ADERR2 NO, ERROR NO AUX FST @VM03224 00659000 B FNDAUX FOUND AUX, GO FRET IT @VM03224 00660000 CLOOP2 EQU * @VM03224 00661000 L R4,800(,R3) LOAD NEXT FST ADDR @VM03224 00662000 LR R3,R4 PUT IT IN R3 @VM03224 00663000 B CLOOP AND LOOP @VM03224 00664000 FNDAUX EQU * @VM03224 00665000 LA R5,800(,R3) SAVE ADDR. LAST NON-AUX FST @VM03224 00666000 FNDAUX2 EQU * @VM03224 00667000 L R3,800(,R4) LOAD NEXT AUX POINTER @VM03224 00668000 LR R1,R4 FRET ADDR IN R1 @VM03224 00669000 LA R0,101 LENGTH IN R0 @VM03224 00670000 DMSFRET DWORDS=(0),LOC=(1),TYPCALL=BALR @VM03224 00671000 LTR R3,R3 ANY MORE AUX FSTS? @VM03224 00672000 BZ AUXFREED NO @VM03224 00673000 LR R4,R3 NEXT FST ADDR IN R4 @VM03224 00674000 B FNDAUX2 YES, FRET NEXT @VM03224 00675000 AUXFREED EQU * @VM03224 00676000 ST R3,0(,R5) ZERO NEXT POINTER IN LAST @VM03224 00677000 NI ADTFLG2,255-ADTPSTM TURN OFF FST MOD. BIT @VM03224 00678000 B LADADRET RETURN @VM03224 00679000 CLEARVAR EQU * @VM03224 00680000 L R3,ADTFDA LOAD FST POINTER @VM03224 00681000 L R4,4(,R3) LOAD LENGTH @VM03224 00682000 LA R4,0(R4) CLEAR HIGH ORDER BYTE @VM03224 00683000 LA R5,8(R4,R3) SAVE NEXT POINTER IN MAIN FST@VM03224 00684000 L R3,8(R4,R3) LOAD NEXT POINTER @VM03224 00685000 LTR R3,R3 THIS SHOULD BE AUX FST @VM03224 00686000 BZ ADERR2 IF ZERO, AUX NOT SET @VM03224 00687000 L R1,4(,R3) LOAD AUX FST LENGTH @VA02287 00688300 LA R0,15(R1) PLUS HEADER & ROUND TO DBLWD. @VA02287 00688600 SRL R0,3 DOWN TO DOUBLE WORDS @VM03224 00689000 LR R1,R3 ADDR IN R1 @VM03224 00690000 DMSFRET DWORDS=(0),LOC=(1),TYPCALL=BALR @VM03224 00691000 SR R3,R3 ZERO R3 @VM03224 00692000 ST R3,0(,R5) ZERO NEXT POINTER IN FST @VM03224 00693000 NI ADTFLG2,255-ADTPSTM TURN OFF FST MOD. BIT @VM03224 00694000 B LADADRET RETURN @VM03224 00695000 DROP R7 @VM03224 00696000 SPACE 2 @VA00985 00697000 ADERR1 EQU * @VA00985 00698000 LA R15,1 SET RETURN CODE V0742 00699000 LTR R15,R15 SET CONDITION CODE V0742 00700000 B LADADERT GO TO RETURN V0742 00701000 SPACE 1 V0742 00702000 ADERR2 EQU * V0742 00703000 LA R15,2 SET RETURN CODE V0742 00704000 LTR R15,R15 SET CONDITION CODE V0742 00705000 B LADADERT RETURN V0742 00706000 SPACE 3 V0742 00707000 DIRTMOVE MVC 0(0,R3),0(R5) USED TO COPY AUX. DIRT. V0742 00708000 EJECT V0742 00709000 *********************************************************************** 00710000 * 00711000 * "ADTLKW" 00712000 * 00713000 * 24(R1) MUST IN EACH ENTRY CASE POINT TO DISK MODE LETTER(S) 00714000 * 00715000 * ENTRY OPTIONS ARE AS FOLLOWS: 00716000 * 00717000 * 1. 24(R1) ALPHABETIC (A TO Z): 00718000 * 00719000 * SEARCHES FOR LOGGED-IN READ-WRITE DISK 00720000 * CORRESPONDING TO GIVEN MODE-LETTER. 00721000 * 00722000 * ENTRY CONDITIONS: 00723000 * R0 IMMATERIAL 00724000 * R1 SUCH THAT 24(R1) IS MODE LETTER (A TO Z) 00725000 * 00726000 * CALLING SEQUENCE: 00727000 * L R15,AADTLKW WHERE AADTLKW = V(ADTLKW) 00728000 * BALR R14,R15 ... 00729000 * 00730000 * COMMON EXIT CONDITIONS (FOR ALL ENTRY OPTIONS): 00731000 * 00732000 * DESIRED CONDITION(S) MET = "NORMAL RETURN": 00733000 * 00734000 * R15 = 0 (AND CONDITION-CODE = 0) 00735000 * R0 = NUMBER OF 800-BYTE RECORDS LEFT ON DISK 00736000 * ("ADTLEFT" LESS "ADTRES" RESERVE-COUNT) 00737000 * R1 = POINTER TO (ADDRESS OF) ADT BLOCK FOR THIS DISK. 00738000 * R2-R14 SAME AS AT ENTRY. 00739000 * 00740000 * DESIRED CONDITION(S) NOT MET (OR INVALID CALL): 00741000 * 00742000 * R15 = 1 (AND CONDTION-CODE = 2) 00743000 * R0-R14 SAME AS AT ENTRY. 00744000 * 00745000 * 00746000 * 2. 24(R1) = '*' 00747000 * 00748000 * SEARCHES FOR "FIRST" OR "NEXT" LOGGED-IN READ/WRITE DISK 00749000 * 00750000 * ENTRY CONDITIONS: 00751000 * R0 = 0 TO START SEARCH AT "FIRST" R/W DISK. 00752000 * R0 = NONZERO ADDRESS - RESUME SEARCH AT "NEXT" ADT BLOCK 00753000 * R1 SUCH THAT 24(R1) = '*' 00754000 * 00755000 * (USING CALLING SEQUENCE & RETURN CODES, AS ABOVE). 00756000 * 00757000 * 00758000 EJECT 00759000 * 00760000 * 00761000 * 3. 24(R1) = '?' 00762000 * 00763000 * SEARCHES FOR FIRST READ-WRITE DISK WITH "ENOUGH ROOM" 00764000 * TO WRITE A FILE CONSISTING OF NUMBER OF DATA-BLOCKS 00765000 * SPECIFIED BY CALLER. 00766000 * 00767000 * ENTRY CONDITIONS: 00768000 * R0 = NUMBER OF 800-BYTE DATA BLOCKS 00769000 * DESIRED TO BE WRITTEN. 00770000 * R1 SUCH THAT 24(R1) = '?' 00771000 * 00772000 * (USING CALLING SEQUENCE & RETURN CODES, AS ABOVE). 00773000 * 00774000 * 4. 24-25(R1) = '??' 00775000 * 00776000 * SEARCHES FOR READ-WRITE DISK WITH THE MOST ROOM 00777000 * 00778000 * ENTRY CONDITIONS: 00779000 * R0 IMMATERIAL 00780000 * R1 SUCH THAT 24-25(R1) = '??' 00781000 * 00782000 * (USING CALLING SEQUENCE & RETURN CODES, AS ABOVE). 00783000 * 00784000 *********************************************************************** 00785000 * 00786000 * 00787000 DMSLADW FSENTR REGSAV0 "ADTLKW" -- USE LOW-LEVEL SAVE AREA 00788000 LA R4,ADTW04 SET FOR MANY BCR'S - TO SAVE SPACE 00789000 LA R5,ADTW06 SET R5-SWITCH TO TRF TO ADTW06. 00790000 LA R6,ADTW02 SET R6-SWITCH TO TRF TO ADTW02 00791000 CLI 24(R1),C'A' IS IT A-Z ? 00792000 BL ADTW03 TRF IF LESS THAN A. 00793000 CLI 24(R1),C'Z' ... 00794000 BCR 2,R6 "BH ADTW02" (ERROR) IF GREATER THAN Z. 00795000 L R15,=A(DMSLAD) CALL 'ADTLKP' 00796000 BALR R14,R15 LET HIM FIND THE DISK 00797000 BCR 7,R6 "BNZ ADTW02" (ERROR) IF NOT FOUND. 00798000 USING ADTSECT,R1 REFERENCE ADT-BLOCK FOUND 00799000 TM ADTFLG1,ADTFRW LOGGED IN R/W DISK THERE ? 00800000 BO ADTW05 TRF IF YES (GOOD SHOW). 00801000 DROP R1 00802000 ADTW02 LA R15,1 ERROR 1 FOR CONDITION(S) NOT MET. 00803000 LM R0,R14,REGSAV0 RESTORE R0 THRU R14, 00804000 LTR R15,R15 SET CONDITION-CODE FOR CONVENIENCE OF CALLER 00805000 BR R14 AND EXIT. 00806000 * 00807000 ADTW03 CLI 24(R1),C'*' IS IT AN ASTERISK ? 00808000 BNE ADTW07 IF NOT, TRY QUESTION-MARK. 00809000 LR R1,R0 SET UP R1 FOR USE BY ADTNXT, 00810000 * 00811000 ADTW04 L R15,=A(DMSLADN) CALL 'ADTNXT' TO FIND NEXT ADT 00812000 BALR R14,R15 ... 00813000 BCR 7,R6 "BNZ" IF NO ADT BLOCK(S) ARE LEFT. 00814000 USING ADTSECT,R1 REFERENCE BLOCK FOUND 00815000 TM ADTFLG1,ADTFRW LOGGED-IN R/W DISK THERE ? 00816000 BCR 8,R4 "BZ ADTW04" IF NOT, KEEP LOOKING. 00817000 ADTW05 L R0,ADTLEFT GET NUMBER OF 800-BYTE BLOCKS LEFT 00818000 SH R0,ADTRES LESS THE RESERVE-COUNT 00819000 DROP R1 00820000 BR R5 BRANCH TO ADTW06, ADTW08, OR ADTW10. 00821000 * 00822000 ADTW08 CR R0,R3 FOR '?' ENTRY, ARE THERE ENOUGH RECORDS ? 00823000 BCR 4,R4 "BL ADTW04" IF NOT; IF YES, DROP THRU. 00824000 * 00825000 ADTW06 LM R2,R14,REGSAV0+8 RESTORE R2 THRU R14 00826000 SR R15,R15 CLEAR R15 (AND C.C. = 0) 00827000 BR R14 RETURN TO CALLER 00828000 * 00829000 ADTW07 CLI 24(R1),C'?' MUST BE A QUESTION-MARK, THEN. 00830000 BCR 7,R6 "BNE" IF IT ISN'T (AN ERROR). 00831000 SR R2,R2 CLEAR R2, 00832000 CLI 25(R1),C'?' IS IT DOUBLE QUESTION-MARK ?? 00833000 BE ADTW09 TRF IF YES. 00834000 LTR R3,R0 GET NO. OF RECORDS WANTED, 00835000 BCR 13,R6 "BNP ADTW02" (AN ERROR) IF NOT > 0. 00836000 LA R3,739(,R3) ADD SPECIAL ADJUSTER ("JUST RIGHT") JS 00837000 D R2,F400 COMPUTE HOW MANY CHAIN-LINKS NEEDED 00838000 AR R3,R0 ADD ORIGINAL BLOCK COUNT 00839000 LA R5,ADTW08 SET R5-SWITCH FOR '?' HANDLING 00840000 SR R1,R1 SET TO START WITH FIRST BLOCK 00841000 BR R4 "B ADTW04" TO CHECK AVAILABLE ADT-BLOCKS 00842000 * 00843000 ADTW09 LA R5,ADTW10 SET R5-SWITCH AND 00844000 LA R6,ADTW11 R6-SWITCH 00845000 SR R1,R1 SET TO START WITH FIRST BLOCK, 00846000 BR R4 "B ADTW04" TO SEARCH ADT BLOCKS. 00847000 * 00848000 ADTW10 CR R0,R2 BIGGER THAN PREVIOUS BIGGEST ONE ? 00849000 BCR 13,R4 "BNH ADTW04" IF NOT, KEEP LOOKING. 00850000 LR R2,R0 REMEMBER NEW SIZE, 00851000 LR R3,R1 REMEMBER DISK IT BELONGS TO, 00852000 BR R4 KEEP LOOKING FOR A BIGGER ONE AT ADTW04. 00853000 ADTW11 LTR R0,R2 DID WE HAVE ANYTHING AT ALL ? 00854000 BNP ADTW02 ERROR IF NOT (BAD NEWS). 00855000 LR R1,R3 SIZE & DISK IN R0-R1, 00856000 B ADTW06 AND GO EXIT (WE'VE GOT IT). 00857000 EJECT 00858000 * 00859000 * CONSTANTS: 00860000 * 00861000 AADTFVS DC V(ADTFVS) POINTER TO ADTLKP FIXED VARIABLE STORAGE 00862000 ADLPTR DC V(IADT) POINTS TO ACTIVE DISK TABLE 00863000 F400 DC F'400' 00864000 ALAD DC A(DMSLAD) V0742 00865000 * 00866000 * 00867000 * PARAMETER LIST DEFINITION 00868000 * 00869000 PLM EQU 24 FILE MODE 00870000 * 00871000 * FIXED VARIABLE STORAGE 00872000 * 00873000 ADLSECT DSECT 00874000 ADLREGS DS 2F SAVE AREA FOR TWO REGISTERS 00875000 EJECT 00876000 FSTD V0742 00877000 ADT 00878000 EJECT 00879000 FVS 00880000 NUCON 00881000 SVCSECT 00882000 * 00883000 REGEQU 00884000 * 00885000 END 00886000