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