ibm:vm370-lib:cp:dmkudr.assemble_src
Table of Contents
DMKUDR Source
References
- Fixes Applied : 6
- This Source Date : Thursday, December 7, 1978
- Last Fix ID : [HRC028DK]
Source Listing
- DMKUDR.ASSEMBLE.txt
- UDR TITLE 'DMKUDR (CP) VM/370 - RELEASE 6' 00001000
- ISEQ 73,80 VALIDATE SEQUENCING OF INPUT 00002000
- *. 00003000
- * 00004000
- * MODULE NAME 00005000
- * 00006000
- * DMKUDR USER DIRECTORY MODULE 00007000
- * 00008000
- * FUNCTION 00009000
- * 00010000
- * THE USER DIRECTORY IS WRITTEN USING A PAGEABLE ACCESS 00011000
- * METHOD. TO MINIMIZE THE PAGEING ACTIVITY SEVERAL 00012000
- * CONCIDERATIONS SHOULD BE NOTED. FIRST THE USER 00013000
- * DIRECTORY BLOCKS ARE IN A SEPERATE PAGE OR PAGES AND 00014000
- * THE PAGES ARE ASSIGNED A VIRTUAL ADDRESS AT IPL 00015000
- * TIME. SO NO SPECIAL CONCIDERATIONS ARE NECESSARY 00016000
- * WHEN CALLING DMKUDRFU. THE USER MACHINE AND DEVICE 00017000
- * BLOCKS, ON THE OTHER HAND, ARE NOT ASSIGNED 00018000
- * PERMANENT VIRTUAL ADDRESSES. THE VIRTUAL ADDRESS IS 00019000
- * ASSIGNED THE FIRST TIME A PAGE IS REFERENCED AND 00020000
- * MUST BE REMEMBERED UNTIL THE CALLER IS FINISHED 00021000
- * WITH THAT USER. TO FACILITATE THIS THE USER MUST 00022000
- * PROVIDE A BUFFER, SEVEN DOUBLE WORDS LONG, WITH 00023000
- * THE LAST DOUBLE WORD RESERVED FOR THE DMKUDRRD, 00024000
- * DMKUDRFD AND DMKUDRRV ROUTINES. THE SAME BUFFER 00025000
- * MUST BE PROVIDED FOR EACH SUBSEQUENT RETRIEVAL. 00026000
- * A SECOND BUFFER MUST BE PROVIDED IF INNESTED LINKS 00027000
- * ARE INCOUNTERED. A MAXIMUM OF TWO BUFFERS ARE TO 00028000
- * BE USED AND THE BUFFER MUST HAVE THE LAST DOUBLE 00029000
- * WORD ZERO'S, AT ENTRY TO ANY ROUTINE FOR THE FIRST 00030000
- * TIME. ALL SUBSEQUENT ENTRIES TO ANY ROUTINE MUST 00031000
- * NOT CHANGE THIS DOUBLE WORD. AFTER A BUFFER HAS 00032000
- * BEEN USED FOR THE LAST TIME THE USER MUST CALL 00033000
- * DMKUDRRV TO RETURN THE VIRTUAL PAGE AND THEN THE 00034000
- * USER CAN FRET HIS BUFFER. 00035000
- * 00036000
- * CONTENTS 00037000
- * 00038000
- * DMKUDRFU USER DIRECTORY FIND USER 00039000
- * 00040000
- * DMKUDRFD USER DIRECTORY FIND DEVICE 00041000
- * 00042000
- * DMKUDRRD USER DIRECTORY READ 00043000
- * 00044000
- * DMKUDRRV USER DIRECTORY RETURN VIRTUAL PAGE 00045000
- * 00046000
- * DMKUDRBV USER DIRECTORY BUILD VIRTUAL LIST 00047000
- * 00048000
- * DMKUDRDS USER DIRECTORY DYNAMIC SWAP 00049000
- * 00050000
- *. 00051000
- SPACE 5 00052000
- DMKUDR CSECT 00053000
- USING PSA,R0 00054000
- USING SYSLOCS,R10 00055000
- USING SAVEAREA,R13 00056000
- USING DMKUDR,R12 @VA02644 00057000
- USING VMBLOK,R11 00058000
- SPACE 3 00059000
- EXTRN DMKPGTVG,DMKPGTVR,DMKRPAGT @V200820 00060000
- EXTRN DMKIOSQR,DMKSYSOW,DMKSYSOC 00061000
- EXTRN DMKLOCKQ,DMKLOCKD 00062000
- EXTRN DMKPTRFT @VA02644 00063000
- SPACE 2 00064000
- DC CL8'DMKUDR' 00065000
- EJECT 00066000
- *. 00067000
- * 00068000
- * SUBROUTINE NAME 00069000
- * 00070000
- * DMKUDRFU USER DIRECTORY FIND USER 00071000
- * 00072000
- * FUNCTION 00073000
- * 00074000
- * TO FIND A GIVEN USER ID,IN THE USER DIRECTORY, 00075000
- * AND MOVE THE USERS DIRECTORY ENTRY INTO THE 00076000
- * CALLERS BUFFER. 00077000
- * 00078000
- * ATTRIBUTES 00079000
- * 00080000
- * REENTRANT,PAGEABLE 00081000
- * 00082000
- * ENTRY POINT 00083000
- * 00084000
- * DMKUDRFU USER DIRECTORY FIND USER 00085000
- * 00086000
- * ENTRY CONDITIONS 00087000
- * 00088000
- * R0 IS THE LENGTH OF THE USER ID 00089000
- * 00090000
- * R1 POINTS TO THE USER ID WHOSE ENTRY IS TO BE FOUND. 00091000
- * 00092000
- * R2 POINTS TO A BUFFER TO RECEIVE THE USER 00093000
- * DIRECTORY BLOCK,OR IF R2 = 0 ONLY THE 00094000
- * CC IS SET. 00095000
- * 00096000
- * EXIT CONDITIONS 00097000
- * 00098000
- * CC = 0 USER ID FOUND 00099000
- * 00100000
- * CC = 1 USER ID NOT FOUND 00101000
- * 00102000
- * CC = 3 FATAL IO ERROR TRYING TO READ DIRECTORY 00103000
- * 00104000
- * CALLS TO OTHER ROUTINES 00105000
- * 00106000
- * DMKLOCKQ - TO LOCK (QUEQE) THE USER DIRECTORY 00107000
- * DMKPTRAN - TO BRING A PAGE INTO STORAGE 00108000
- * DMKLOCKD - TO DEQUEUE THE USER DIRECTORY 00109000
- * DMKPTRFT - TO RELEASE A REAL STORAGE PAGE FRAME 00110000
- * 00111000
- * EXTERNAL REFERENCES 00112000
- * 00113000
- * DMKSYSPL = POINTER TO THE START OF THE 00114000
- * USER DIRECTORY ON THE SYSRES VOLUME 00115000
- * 00116000
- * TABLES / WORK AREAS 00117000
- * 00118000
- * 00119000
- EJECT 00120000
- * REGISTER USAGE 00121000
- * 00122000
- * R0 - R2 = INPUT POINTERS 00123000
- * R3 = POINTER TO LIST OF DIRECTORY PAGES 00124000
- * R4 = POINTER TO THE LAST UDIRBLOK IN PAGE 00125000
- * R5 = WORK REGISTER 00126000
- * R6 = REAL ADDRESS OF BUFFER PAGE 00127000
- * R7 - R8 WORK REGISTERS 00128000
- * R9 = INTERNAL LINKAGE 00129000
- * R10 = POINTER TO SYSLOCS 00130000
- * R11 = VMBLOK 00131000
- * R12 = BASE 00132000
- * R13 = SAVE 00133000
- * R14 - R15 = SYSTEM USE 00134000
- * 00135000
- * OPERATION 00136000
- * 00137000
- * 1. CALL DMKLOCKQ TO LOCK THE NAME ' DIRCT '. 00138000
- * 00139000
- * 2. MASK THE USERID, FROM THE CALLER, OFF AND 00140000
- * SET UP TO SCAN THE UDIRBLOK'S. 00141000
- * 00142000
- * 3. TRANS TO BRING IN EACH PAGE FROM THE 00143000
- * PAGE LIST (DMKSYSPL) UNTIL THE USERID IS 00144000
- * FOUND. 00145000
- * 00146000
- * 4. IF THE USERID IS NOT FOUND CALL DMKLOCKD TO UNLOCK 00147000
- * C' DIRCT ' AND EXIT CC = 1. 00148000
- * 00149000
- * 5. WHEN FOUND TEST IF THE USER PROVIDED 00150000
- * A BUFFER. IF NOT GO TO STEP 7. 00151000
- * 00152000
- * 6. MOVE THE UDIRBLOK INTO THE USERS BUFFER AND 00153000
- * UNMASK THE BLOCK. 00154000
- * 00155000
- * 7. CALL DMKLOCKD TO UNLOCK C' DIRECT ' AND EXIT CC = 0. 00156000
- * 00157000
- * MESSAGES 00158000
- * 00159000
- * DMKUDR475I FATAL IO ERROR TRYING TO READ DIRECTORY 00160000
- * DMKUDR476I SYSTEM DIRECTORY LOADED FROM VOLUME XXXXXX HRC028DK 00160500
- *. 00161000
- SPACE 3 00162000
- DMKUDRFU RELOC 00163000
- USING UDBFBLOK,R3 00164000
- USING UDIRBLOK,R2 00165000
- EJECT 00166000
- L R10,ASYSLC POINT TO SYSLOCS 00167000
- LTR R2,R0 IS LENGTH EQ ZERO 00168000
- BZ EXITCC1 YES- ERROR RETURN CC = 1 (USER NOT FOUND) 00169000
- CL R2,F8 IS IT OVER 8 00170000
- BH EXITCC1 YES- ERROR RETURN CC = 1 (USER NOT FOUND) 00171000
- BCTR R2,0 -1 00172000
- MVC SAVEWRK2(8),BLANKS BLANK OUT SAVEWRK2 AND 3 00173000
- EX R2,MOVEUID MOVE IN USER ID 00174000
- XC SAVEWRK2(8),MASK MASK OFF THE USER ID 00175000
- LA R1,=CL8' DIRCT' POINT AT NAME TO LOCK 00176000
- CALL DMKLOCKQ LOCK SO DMKUDRBV CAN'T CHANGE DMKSYSPL 00177000
- L R3,DMKSYSPL PICK UP POINTER TO DIRECTORY 00178000
- B NXTPAGE START SEARCH OF DIRECTORY PAGES @VA02644 00179000
- SPACE 00180000
- FREPAGE EQU * CLEAR AND RELEASE LAST PAGE @VA02644 00181000
- LA R3,4(0,R3) NEXT ENTRY IN BUFFER LIST @VA02644 00183000
- NXTPAGE EQU * GET NEXT DIRECTORY BUFFER PAGE @VA02644 00184000
- ICM R1,15,0(R3) LOAD AND TEST FOR LAST ENTRY @VA02644 00185000
- BM UNLOCK END OF LIST -- USERID NOT FOUND @VA02644 00186000
- BZ UNLKCC3 SEE IF THERE WAS EVER AN I/O @VA09628 00186100
- * ERROR AND INFORM THE USER 00186200
- TRANS 2,1,OPT=(BRING,DEFER,SYSTEM),IOER=UNLKCC3 @VA04993 00187000
- LH R4,UDIRDISP PICK UP DISPLACEMENT TO END OF DIR PAGE 00188000
- AR R4,R2 SET R4 EQ TO THE REAL ADD OF DIR PAGE 00189000
- LR R6,R2 SAVE REAL ADDR OF BUFFER START @VA02644 00190000
- FINDUSER LA R2,UDIRSIZE*8(,R2) POINT TO NEXT BLOCK 00191000
- CLR R2,R4 HAVE WE REACHED THE END ? @VA02644 00192000
- BH FREPAGE YES -- GET THE NEXT BUFFER @VA02644 00193000
- CLC SAVEWRK2(8),UDIRUSER IS THIS THE USERID ? @VA02644 00194000
- BNE FINDUSER 00195000
- EJECT 00196000
- L R3,SAVER2 POINT TO USER BUFFER 00197000
- LTR R3,R3 DO I HAVE A BUFFER 00198000
- BZ CLREXIT NO -- CLEAR THE PAGE AND EXIT @VA02644 00199000
- MVC UDBFWORK(UDIRSIZE*8),UDIRBLOK MOVE BLOCK TO CALLER 00200000
- XC UDBFWORK+8,MASK MASK ON THE BUFFER (USERID) 00201000
- XC UDBFWORK+16,MASK MASK ON THE BUFFER (PASSWORD) 00202000
- CLREXIT EQU * CLEAR PAGE, UNLOCK DIRECTORY @VA02644 00203000
- LA R1,=CL8' DIRCT' DIRECTORY LOCK NAME @VA02644 00205000
- CALL DMKLOCKD UNLOCK THE DIRECTORY @VA02644 00206000
- B EXITCC0 SET CC EQ 0 00207000
- UNLKCC3 DS 0H @VA04993 00207200
- SR R1,R1 CLEAR R1,TO INDICATE I/O ERROR @VA09628 00207300
- ST R1,0(,R3) AND STORE IN THE UDBFBLOK @VA09628 00207350
- LA R1,=CL8' DIRCT' POINT TO NAME @VA04993 00207400
- CALL DMKLOCKD UNLOCK THE DIRECTORY @VA04993 00207600
- B EXITCC3 RETURN WITH CC=3 @VA04993 00207800
- SPACE 2 00208000
- UNLOCK LA R1,=CL8' DIRCT' POINT TO NAME 00209000
- CALL DMKLOCKD UNLOCK THE DIRECTORY 00210000
- B EXITCC1 RETURN TO CALLER CC=1 00211000
- DROP R2,R3 @VA02644 00212000
- SPACE 00213000
- MOVEUID MVC SAVEWRK2(0),0(R1) SET UP USER ID 00214000
- ABEND 2 VMPAGES TO GO NEGATIVE - TERM CP @VA07224 00232100
- EJECT 00233000
- *. 00234000
- * 00235000
- * SUBROUTINE NAME 00236000
- * 00237000
- * DMKUDRFD USER DIRECTORY FIND DEVICE 00238000
- * 00239000
- * FUNCTION 00240000
- * 00241000
- * TO ALLOW THE USER TO READ A SPECIFIC DEVICE 00242000
- * BLOCK INTO THE CALLER'S BUFFER 00243000
- * 00244000
- * ATTRIBUTES 00245000
- * 00246000
- * REENTRANT,PAGEABLE 00247000
- * 00248000
- * ENTRY POINTS 00249000
- * 00250000
- * DMKUDRFD USER DIRECTORY FIND DEVICE 00251000
- * 00252000
- * ENTRY CONDITIONS 00253000
- * 00254000
- * R0 IS THE DEVICE ADD 00255000
- * 00256000
- * R1 POINTS TO THE DISPLACEMENT FOLLOWED BY THE DASD 00257000
- * ADD OF THE USER'S ''USER MACHINE BLOCK'' . 00258000
- * THE DASD ADD IS ON A WORD BOUNDRY. 00259000
- * 00260000
- * R2 POINTS TO THE BUFFER TO RECEIVE THE USER DEVICE 00261000
- * BLOCK. THE BUFFER MUST BE AS DESCRIBED IN THE DSECT 00262000
- * UDBFWORK. (SEVEN DOUBLE WORDS LONG WITH THE 00263000
- * LAST DOUBLE WORD USED BY THIS ROUTINE ) 00264000
- * 00265000
- * EXIT CONDITIONS 00266000
- * 00267000
- * CC = 0 DEVICE FOUND 00268000
- * 00269000
- * CC = 1 DEVICE NOT FOUND 00270000
- * 00271000
- * CC = 3 FATAL IO ERROR TRYING TO READ DIRECTORY 00272000
- * 00273000
- * CALLS TO OTHER ROUTINES 00274000
- * 00275000
- * DMKPGTVG - TO GET A VIRTUAL PAGE BUFFER 00276000
- * DMKRPAGT - TO POINT TO A PAGE ON DASD DEVICE 00277000
- * DMKPTRAN - TO BRING A PAGE INTO STORAGE 00278000
- * DMKQCNWT - WRITE ERROR MSG 00279000
- * 00280000
- * EXTERNAL REFERENCES 00281000
- * 00282000
- * NONE 00283000
- * 00284000
- * TABLES / WORK AREAS 00285000
- * 00286000
- * UDBFBLOK - TO POINT TO PROPER PAGE 00287000
- * 00288000
- EJECT 00289000
- * REGISTER USAGE 00290000
- * 00291000
- * R0 - R2 INPUT POINTERS 00292000
- * R3 = DISPLACEMENT OF UDEVBLOK 00293000
- * R4 = REALADD = REAL ADDRESS OF THE PAGE BUFFER 00294000
- * R5 = LINK TO GETBUFF SUBROUTINE 00295000
- * R6 = DATA FROM UDEVBLOK 00296000
- * 00297000
- * OPERATION 00298000
- * 00299000
- * 1. GET THE POINTER TO THE UMACBLOK FROM THE CALLER. 00300000
- * 00301000
- * 2. BRING THE PAGE INTO CORE CALLING DMKPGTVG,DMKRPAGT 00302000
- * AND/OR DMKPTRAN AS NEEDED. 00303000
- * 00304000
- * 3. SCAN THE UDEVBLOK'S UNTIL THE DEVICE IS FOUND, 00305000
- * IF NOT FOUND RETURN CC = 1. 00306000
- * 00307000
- * 4. MOVE THE UDEVBLOK INTO THE USERS BUFFER 00308000
- * AND UNMASK IT. 00309000
- * 00310000
- * 5. EXIT CC = 0. 00311000
- * 00312000
- * MESSAGES 00313000
- * 00314000
- * DMKUDR475I FATAL IO ERROR TRYING TO READ DIRECTORY 00315000
- *. 00316000
- EJECT 00317000
- DMKUDRFD RELOC 00318000
- USING USERDISP,R1 00319000
- USING UDBFBLOK,R2 00320000
- L R10,ASYSLC POINT TO SYSLOCS 00321000
- LH R3,USERDISP GET DISPLACEMENT FROM USER 00322000
- L R0,USERDASD GET DASD ADD FROM USER 00323000
- BAL R5,GETBUFF GET PAGE IN CORE AND RETURN WITH REAL ADD 00324000
- USING UMACBLOK,R3 @VA03188 00325000
- LH R6,UMACDVCT(R4) GET USER DEVICE COUNT @VA07491 00325100
- LTR R6,R6 CHECK FOR ZERO @VA07491 00325200
- BZ EXITCC1 IF ZERO, RETURN TO CALLER @VA07491 00325300
- L R6,UMACDASD(R4) GET DASD ADDR OF 1ST DEVBLOK @VA03188 00326000
- LTR R6,R6 ANY DEVICES? @VA03188 00327000
- BZ EXITCC1 NO, CONDITIONAL RETURN @VA03188 00328000
- LH R3,UMACDISP(R4) GET OFFSET TO NEXT BLOCK @VA03188 00329000
- DROP R3 @VA03188 00330000
- LA R5,FINDDEV SET GETBUFF RETURN REGISTER @VA03188 00331000
- CL R6,UDBFDASD IS PAGE IN BUFFER? @VA03188 00332000
- BER R5 YES, GO FIND UDEVBLOK @VA03188 00333000
- LR R0,R6 POINT TO NEW DASD ADDRESS @VA03188 00334000
- B GETBUFF BRING NEW PAGE IN (RETURN VIA R5)@VA03188 00335000
- SPACE 1 00336000
- FINDDEV EQU * (GETBUFF RETURNS HER ON R5) @VA03188 00337000
- USING UDEVBLOK,R3 @VA03188 00338000
- CH R0,UDEVADD(R4) IS THIS THE DEVICE? @VA03188 00339000
- BE DEVFOUND YES GET OUT 00340000
- L R6,UDEVDASD(R4) DASD ADDRESS @VA02644 00341000
- LTR R6,R6 IS THIS THE END OF THE LIST 00342000
- BZ EXITCC1 YES- RETURN TO CALLER 00343000
- CL R6,UDBFDASD IS PAGE IN BUFFER 00344000
- LH R3,UDEVDISP(R4) POINTER TO NEXT BLOCK @VA02644 00345000
- BE FINDDEV YES- GO FIND DEVICE 00346000
- LR R0,R6 POINT TO NEW DASD ADDRESS 00347000
- B GETBUFF BRING NEW PAGE IN (RETURN ON REG 5) 00348000
- DEVFOUND EQU * @VA02644 00349000
- AR R3,R4 GR3 = REAL ADDRESS OF UDEVBLOK @VA02644 00350000
- TM UDEVSTAT,UDEVLONG IS IT A LONG UDEVBLOK? @VA11292 00350150
- BZ LONGDEV YES, BRANCH @VA11292 00350300
- MVC UDBFWORK(UDEVSIZE*8/2),UDEVBLOK SHORT @VA11292 00350450
- B MASKON GO MASK THE BUFFER ON @VA11292 00350600
- LONGDEV DS 0H @VA11292 00350750
- MVC UDBFWORK(UDEVSIZE*8),UDEVBLOK MOVE BLOCK TO CALLER 00351000
- B MASKON GO MASK THE BUFFER ON 00352000
- DROP R1,R2,R3 @VA02644 00353000
- EJECT 00354000
- *. 00355000
- * 00356000
- * SUBROUTINE NAME 00357000
- * 00358000
- * DMKUDRRD USER DIRECTORY READ 00359000
- * 00360000
- * FUNCTION 00361000
- * 00362000
- * TO ALLOW THE USER TO READ THE NEXT USER DIRECTORY 00363000
- * BLOCK INTO THE CALLERS BUFFER. 00364000
- * 00365000
- * ATTRIBUTES 00366000
- * 00367000
- * REENTRANT,PAGEABLE 00368000
- * 00369000
- * ENTRY POINTS 00370000
- * 00371000
- * DMKUDRRD USER DIRECTORY READ 00372000
- * 00373000
- * ENTRY CONDITIONS 00374000
- * 00375000
- * R1 POINTS TO THE DISPLACEMENT FOLLOWED BY THE ADD 00376000
- * OF THE NEXT BLOCK TO BE READ. 00377000
- * THE DASD ADD IS ON A WORD BOUNDARY. 00378000
- * 00379000
- * R2 POINTS TO A BUFFER TO RECEIVE THE MACHINE OR DEVICE 00380000
- * BLOCK. THE BUFFER MUST BE AS DESCRIBED IN THE DSECT 00381000
- * UDBFWORK. ( SEVEN DOUBLE WORDS LONG WITH THE 00382000
- * LAST DOUBLE WORD USED BY THIS ROUTINE ) 00383000
- * 00384000
- * EXIT CONDITIONS 00385000
- * 00386000
- * CC = 0 BLOCK READ INTO BUFFER 00387000
- * 00388000
- * CC = 1 INVALID DISPLACEMENT OR DASD ADD 00389000
- * 00390000
- * CC = 3 FATAL IO ERROR TRYING TO READ DIRECTORY 00391000
- * 00392000
- * CALLS TO OTHER ROUTINES 00393000
- * 00394000
- * DMKPGTVG - TO GET A VIRTUAL PAGE BUFFER 00395000
- * DMKRPAGT - TO POINT TO A PAGE ON DASD DEVICE 00396000
- * DMKPTRAN - TO BRING A PAGE INTO STORAGE 00397000
- * DMKQCNWT - TO WRITE ERROR MSG 00398000
- * 00399000
- * EXTERNAL REFERENCES 00400000
- * 00401000
- * NONE 00402000
- * 00403000
- * TABLES / WORK AREAS 00404000
- * 00405000
- * UDBFBLOK - POINT TO PROPER PAGE 00406000
- * 00407000
- EJECT 00408000
- * REGISTER USAGE 00409000
- * 00410000
- * R0 = DASD ADDRESS OF UDEVBLOK 00411000
- * R1 - R2 = INPUT POINTERS 00412000
- * R3 = DISPLACEMENT OF UDEVBLOK 00413000
- * R4 = REALADD = REAL ADDRESS OF PAGE BUFFER 00414000
- * R5 = LINK TO GETBUFF SUBROUTINE 00415000
- * 00416000
- * OPERATION 00417000
- * 00418000
- * 1. GET THE POINTER TO THE UDEVBLOK FROM THE CALLER. 00419000
- * 00420000
- * 2. IF THE POINTER IS INVALED EXIT CC = 1. 00421000
- * (EOF LAST DEVICE FOUND) 00422000
- * 00423000
- * 3. BRING THE PAGE INTO CORE CALLING DMKPGTVG, DMKRPAGT 00424000
- * AND/OR DMKPTRAN AS NEEDED. 00425000
- * 00426000
- * 4. MOVE THE UDEVBLOK INTO THE CALLERS BUFFER AND 00427000
- * EXIT CC = 0. 00428000
- * 00429000
- * MESSAGES 00430000
- * 00431000
- * DMKUDR475I FATAL IO ERROR TRYING TO READ DIRECTORY 00432000
- *. 00433000
- SPACE 3 00434000
- DMKUDRRD RELOC 00435000
- USING UDBFBLOK,R2 00436000
- USING UDEVBLOK,R3 00437000
- USING USERDISP,R1 00438000
- L R10,ASYSLC POINT TO SYSLOCS 00439000
- LH R3,USERDISP GET DISPLACEMENT FROM USER 00440000
- L R0,USERDASD GET DASD ADD FROM USER 00441000
- LTR R0,R0 IS IT 0 (LAST DASD ADD) 00442000
- BE EXITCC1 00443000
- LA R6,4095 SET TO 4K - 1 00444000
- CLR R3,R6 IS IT 4K UP 00445000
- BH EXITCC1 YES- GET OUT SET CC EQ 1 00446000
- BAL R5,GETBUFF GET PAGE IN CORE AND RETURN WITH REAL ADD 00447000
- AR R3,R4 GR3 = REAL ADDRESS OF DIR PAGE @VA02644 00448000
- TM UDEVSTAT,UDEVLONG IS IT A LONG UDEVBLOK? @VA10088 00448150
- BZ DEVLONG YES, BRANCH @VA10088 00448300
- MVC UDBFWORK(UDEVSIZE*8/2),UDEVBLOK SHORT @VA10088 00448450
- B MASKON GO MASK THE BUFFER ON @VA10088 00448600
- DEVLONG DS 0H @VA10088 00448750
- MVC UDBFWORK(UDEVSIZE*8),UDEVBLOK GIVE BLOCK TO USER 00449000
- B MASKON GO MASK THE BUFFER ON 00450000
- EJECT 00450020
- * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 00450040
- * DMKUDRMD PERFORMS THE SAME FUNCTION AS DMKUDRRD EXCEPT THAT THE * 00450060
- * UMACBLOK IS READ IN INSTEAD OF THE UDEVBLOK. * 00450080
- * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 00450100
- SPACE 2 00450120
- DMKUDRMD RELOC @V407466 00450140
- USING UDBFBLOK,R2 @V407466 00450160
- USING UMACBLOK,R3 @V407466 00450180
- USING USERDISP,R1 @V407466 00450200
- L R10,ASYSLC POINT TO SYSLOCS @V407466 00450220
- LH R3,USERDISP GET DISPLACEMENT FROM USER @V407466 00450240
- L R0,USERDASD GET DASD ADD FROM USER @V407466 00450260
- LTR R0,R0 IS IT 0? (LAST DASD ADD) @V407466 00450280
- BE EXITCC1 YES @V407466 00450300
- LA R6,4095 SET TO 4K-1 @V407466 00450320
- CLR R3,R6 IS IT 4K UP @V407466 00450340
- BH EXITCC1 YES, GET OUT SET CC EQ 1 @V407466 00450360
- BAL R5,GETBUFF GET PAGE IN & RETURN W/ REAL ADD @V407466 00450380
- AR R3,R4 GR3 = REAL ADDR OF DIR PAGE @V407466 00450400
- MVC UDBFWORK(UMACSIZE*8),UMACBLOK GIVE BLOCK TO USER@V407466 00450420
- B MASKON GO MASK THE BUFFER ON @V407466 00450440
- EJECT 00451000
- ************************************************** 00452000
- * 00453000
- * GET BUFFER SUBROUTINE 00454000
- * 00455000
- ************************************************** 00456000
- SPACE 2 00457000
- GETBUFF L R1,UDBFVADD GET VIRTUAL ADD 00458000
- LTR R1,R1 DO I HAVE A BUFFER 00459000
- BNZ GETPAGE YES- BRANCH 00460000
- CALL DMKPGTVG 00461000
- ST R1,UDBFVADD SAVE BUFFER ADD 00462000
- GETPAGE CL R0,UDBFDASD IS PAGE IN STORAGE 00463000
- BE GETRADD YES- BRANCH 00464000
- ST R0,UDBFDASD POINT TO THE NEW DASD PAGE ADDRESS 00465000
- IC R0,DMKSYSUD+3 POINT TO PROPER DEVICE IN OWNED LIST 00466000
- LA R2,SYSTEM SET SYSTEM OPTION ON 00467000
- CALL DMKRPAGT 00468000
- GETRADD TRANS 2,1,OPT=(BRING,DEFER,SYSTEM),IOER=EXITCC3 00469000
- LR R4,R2 RETURN PAGE ADDRESS IN GR4 @VA02644 00470000
- LM R0,R2,SAVER0 RETURN REGS 00471000
- BR R5 RETURN TO CALLER 00472000
- DROP R1,R2,R3 @VA02644 00473000
- EJECT 00474000
- *. 00475000
- * SUBROUTINE NAME 00476000
- * 00477000
- * DMKUDRRV USER DIRECTORY RETURN VIRTUAL PAGE 00478000
- * 00479000
- * FUNCTION 00480000
- * 00481000
- * TO ALLOW THE USER TO RETURN A VIRTUAL PAGE USED 00482000
- * BY THE DIRECTORY PROGRAMS AS A BUFFER. 00483000
- * 00484000
- * ATTRIBUTES 00485000
- * 00486000
- * REENTRANT , PAGEABLE 00487000
- * 00488000
- * ENTRY POINTS 00489000
- * 00490000
- * DMKUDRRV USER DIRECTORY RETURN VIRTUAL PAGE 00491000
- * 00492000
- * ENTRY CONDITIONS 00493000
- * 00494000
- * R2 POINTS TO THE BUFFER AS DESCRIBED IN THE DSECT 00495000
- * UDBFWORK. (SEVEN DOUBLE WORDS LONG WITH THE 00496000
- * LAST DOUBLE WORD USED BY THIS ROUTINE ) 00497000
- * 00498000
- * EXIT CONDITIONS 00499000
- * 00500000
- * NONE 00501000
- * 00502000
- * CALLS TO OTHER ROUTINES 00503000
- * 00504000
- * DMKPGTVR - TO RETURN A VIRTUAL PAGE BUFFER 00505000
- * 00506000
- * EXTERNAL REFERENCES 00507000
- * 00508000
- * NONE 00509000
- * 00510000
- * TABLES / WORK AREAS 00511000
- * 00512000
- * UDBFBLOK - POINT TO VIRTUAL PAGE BUFFER 00513000
- * 00514000
- * REGISTER USAGE 00515000
- * 00516000
- * R2 = POINTER TO BUFFER 00517000
- * 00518000
- * OPERATION 00519000
- * 00520000
- * 1. TEST IF A VIRTUAL PAGE WAS USED. 00521000
- * 00522000
- * 2. IF NOT USED EXIT CC = 0. 00523000
- * 00524000
- * 3. CALL DMKRPAGT AND DMKPGTVR TO RETURN PAGE. 00525000
- * 00526000
- * 4. EXIT CC = 0 00527000
- *. 00528000
- EJECT 00529000
- DMKUDRRV RELOC 00530000
- USING UDBFBLOK,R2 00531000
- L R1,UDBFVADD GET ADD OF PAGE BUFFER 00532000
- LTR R1,R1 DO I HAVE A BUFFER 00533000
- BZ EXITCC1 NO- GET OUT 00534000
- SR R0,R0 SET UP TO ZERO DASD PAGE ADD 00541000
- CALL DMKRPAGT,PARM=SYSTEM RELEASE THE PAGE @VA02644 00542000
- CALL DMKPGTVR RETURN VIRTUAL PAGE 00543000
- B EXITCC0 RETURN TO THE CALLER 00544000
- EJECT 00545000
- ****************************************************************** 00546000
- * 00547000
- * EXIT SUBROUTINE 00548000
- * 00549000
- ****************************************************************** 00550000
- SPACE 2 00551000
- MASKON XC UDBFBLOK+8(8),MASK * MASK THE BUFFER ON 00552000
- XC UDBFBLOK+16(8),MASK * 00553000
- XC UDBFBLOK+24(8),MASK * 00554000
- XC UDBFBLOK+32(8),MASK * 00555000
- XC UDBFBLOK+40(8),MASK * 00556000
- B EXITCC0 EXIT WITH CONDITION CODE 0 HRC028DK 00556060
- SPACE 2 , HRC028DK 00556120
- DRCTOK EQU * HRC028DK 00556180
- L R10,ASYSLC POINTER TO SYSLOCS TABLE HRC028DK 00556240
- USING SYSLOCS,R10 HRC028DK 00556300
- SR R1,R1 CLEAR R1 HRC028DK 00556360
- IC R1,DMKSYSUD+3 DISPLACEMENT IN SYSOWN LIST HRC028DK 00556420
- DROP R10 HRC028DK 00556480
- SLL R1,3 MULTIPLE BY 8 HRC028DK 00556540
- A R1,=A(DMKSYSOW) HRC028DK 00556600
- MVC DIRVOL,0(R1) HRC028DK 00556660
- LA R0,DIROKL HRC028DK 00556720
- LA R1,DIROK HRC028DK 00556780
- CALL DMKQCNWT,PARM=NORET+NOTIME HRC028DK 00556840
- SPACE 2 , HRC028DK 00556900
- EXITCC0 SR R0,R0 SET CC = 0 00557000
- B EXIT RETURN TO CALLER CC EQ 0 00558000
- EXITCC1 TM *,X'FF' SET CC EQ 1 00559000
- B EXIT RETURN TO CALLER CC = 1 00560000
- EXITCC2 CLI *,X'00' SET CC = 2 00561000
- B EXIT RETURN TO CALLER CC EQ 2 00562000
- EXITCC3 EQU * SET CONDITION CODE THREE, EXIT @V200820 00563000
- LA R1,FATALIO DMKUDR475I MESSAGE FOR OPERATOR @V200820 00564000
- LA R0,L'FATALIO ...LENGTH @V200820 00565000
- CALL DMKQCNWT,PARM=NORET+OPERATOR+ALARM @V200820 00566000
- TM *+1,X'FF' SET CC = 3 @V200820 00567000
- EXIT EXIT RETURN TO CALLER 00568000
- DROP R2 @VA02644 00569000
- SPACE 2 00570000
- FATALIO DC C'DMKUDR475I FATAL I/O ERROR TRYING TO READ DIRECTORY' 00571000
- DIROK DC C'DMKUDR476I System Directory loaded from ' HRC028DK 00572090
- DC C'volume ' HRC028DK 00572180
- DIRVOL DC C' ' HRC028DK 00572270
- DC X'15' HRC028DK 00572360
- DIROKL EQU *-DIROK HRC028DK 00572450
- DS 0H HRC028DK 00572540
- EJECT 00573000
- *. 00574000
- * 00575000
- * SUBROUTINE NAME 00576000
- * 00577000
- * DMKUDRBV USER DIRECTORY BUILD VIRTUAL LIST 00578000
- * 00579000
- * FUNCTION 00580000
- * 00581000
- * TO ALLOW THE DMKDIRCT PROGRAM OR DMKCPINT PROGRAM TO 00582000
- * BUILD A LIST OF VIRTUAL PAGE BUFFERS. ONE FOR EACH 00583000
- * UDIRBLOK PAGE ON DISK. 00584000
- * 00585000
- * ATTRIBUTES 00586000
- * 00587000
- * REENTRANT , PAGEABLE 00588000
- * 00589000
- * ENTRY POINTS 00590000
- * 00591000
- * DMKUDRBV USER DIRECTORY BUILD VIRTUAL LIST 00592000
- * 00593000
- * ENTRY CONDITIONS 00594000
- * R0 CONTAINS THE DASD ADDRESS OF THE START OF THE 00595000
- * USER DIRECTORY FROM THE VOL1 LABEL ON THE 00596000
- * DIRECTORY DEVICE. THE DASD ADDRESS MUST POINT 00597000
- * TO THE PROPER DEVICE IN THE OWNED LIST. 00598000
- * ON THE DIRECTORY DEVICE. 00599000
- * 00600000
- * EXIT CONDITIONS 00601000
- * 00602000
- * CC = 0 LIST BUILT 00603000
- * 00604000
- * CC = 3 FATAL IO ERROR TRYING TO READ DIRECTORY 00605000
- * 00606000
- * CALLS TO OTHER ROUTINES 00607000
- * 00608000
- * DMKFREE - TO GET FREE STORAGE 00609000
- * DMKFRET - TO RETURN THE STORAGE 00610000
- * DMKRPAGT - GET A PAGE INTO STORAGE 00611000
- * DMKPGTVG - GET A VIRTUAL BUFFER 00612000
- * DMKLOCKQ - LOCK THE DIRECTORY C' DIRCT ' TO SWAP 00613000
- * DMKLOCKD - UNLOCK THE DIRECTORY 00614000
- * DMKPGTVR - TO RETURN A VIRTUAL PAGE BUFFER 00615000
- * 00616000
- * EXTERNAL REFERENCES 00617000
- * 00618000
- * DMKSYSPL - USER DIRECTORY PAGE LIST 00619000
- * DMKSYSUD - POINTER TO THE USER DIRECTORY 00620000
- * 00621000
- * TABLES / WORK AREAS 00622000
- * 00623000
- * USER DIRECTORY LIST 00624000
- * 00625000
- EJECT 00626000
- * REGISTER USAGE 00627000
- * 00628000
- * R4 = POINTER TO OLD LIST 00629000
- * R5 = DASD ADD 00630000
- * R6 = DISPLACEMENT OF END OF LIST - 4 00631000
- * R7 = POINTER TO LIST 00632000
- * R8 = DISPLACEMENT INTO LIST 00633000
- * R9 = LENGTH OF LIST ( IN DUBBLE WORDS ) 00634000
- * R10 = POINTER TO SYSLOCS 00635000
- * 00636000
- * OPERATION 00637000
- * 00638000
- * 1. CALL DMKFREE TO GET A PAGE LIST BUFFER. 00639000
- * 00640000
- * 2. CALL DMKPGTVR TO GET A VIRTUAL PAGE, AND SAVE 00641000
- * ITS ADDRESS IN THE LIST. 00642000
- * 00643000
- * 3. CALL DMKRPAGT TO BRING IN THE PAGE. 00644000
- * 00645000
- * 4. IF THIS IS THE LAST PAGE CONT. ELSE GO TO STEP 2. 00646000
- * 00647000
- * 5. CALL DMKLOCKQ TO QUEQE UNTIL THE DIRECTORY IS FREE 00648000
- * THEN SWAP PAGE LIST AND CALL DMKLOCKD TO UNLOCK 00649000
- * THE USER DIRECTORY. 00650000
- * 00651000
- * 6. POINT TO OLD LIST. IF NO OLD LIST EXIT CC = 0. 00652000
- * 00653000
- * 7. CALL DMKRPAGE AND DMKPGTVR TO RETURN PAGES IN LIST. 00654000
- * 00655000
- * 8. CALL DMKFRET TO RETURN THE LIST. 00656000
- * 00657000
- * 9. IF THE NEW LIST WAS RETURNED THEN EXIT CC = 1 . 00658000
- * 00659000
- * 10. POINT TO THE NEW LIST (DMKSYSPL) AND EXIT CC = 0. 00660000
- * 00661000
- * MESSAGES 00662000
- * 00663000
- * DMKUDR475I FATAL IO ERROR TRYING TO READ DIRECTORY 00664000
- *. 00665000
- EJECT 00666000
- DMKUDRBV RELOC 00667000
- USING UDIRBLOK,R2 00668000
- USING SYSLOCS,R10 00669000
- L R10,ASYSLC POINT TO SYSLOCS 00670000
- LM R6,R9,ZEROES ZERO OUT REGS 00671000
- LR R5,R0 SAVE DASD ADD FROM USER 00672000
- LA R6,4(,R6) POINT TO END OF LIST - 4 00673000
- LOOP1 LA R9,1(,R9) POINT TO LENGTH OF LIST IN DUBBLE WORDS 00674000
- LR R0,R9 SET UP TO GET STORAGE 00675000
- CALL DMKFREE 00676000
- XR R1,R7 * REVERSE POINTERS TO OLD AND 00677000
- XR R7,R1 * NEW LIST 00678000
- XR R1,R7 * 00679000
- LTR R8,R8 IS THIS THE FIRST TIME 00680000
- BZ GETVPAGE YES- BRANCH 00681000
- CL R8,F256 IS THE BLOCK TO BIG TO MOVE? 00682000
- BNH MOVEIT NO- GO DO IT 00683000
- ABEND 1 LOOPING (DATA ON DISK BAD OR THE *00684000
- DIRECTORY CONTANES OVER 10,816 USERS) 00685000
- MOVEIT EX R8,MOVE MOVE THE OLD BLOCK+1 INTO THE NEW BLOCK 00686000
- SL R0,F1 SUBTRACT 1 FROM LENGTH COUNT 00687000
- CALL DMKFRET 00688000
- GETVPAGE CALL DMKPGTVG GET A VIRTUAL BUFFER 00689000
- LR R0,R5 POINT TO DASD PAGE 00690000
- ST R1,0(R7,R8) SAVE VIRTUAL ADD IN LIST 00691000
- O R9,NOADD SET UP END OF LISTING, @VA02223 00692000
- * X'FF000000' + SIZE 00693000
- ST R9,4(R7,R8) SAVE FLAG AND SIZE @VA02223 00694000
- LA R2,BRING+SYSTEM SET UP PARM. 00695000
- CALL DMKRPAGT BRING PAGE IN 00696000
- BNZ FRETLIST FATAL IO ERROR GO FRET THE BUFFER 00697000
- ICM R5,14,UDIRDASD GET THE DASD ADD OF THE NEXT PAGE 'CCR' *00698000
- SAVING THE POINTER TO THE PROPER DEVICE *00699000
- IN THE OWNED LIST. 00700000
- BZ ENDLIST BRANCH IF ZERO ( LAST UDIR PAGE ) 00701000
- LA R8,4(,R8) POINT TO NEXT ENTRY IN LIST 00702000
- CLR R8,R6 DO I NEED ADDITIONAL STORAGE 00703000
- BL GETVPAGE NO- GO BRING PAGE IN 00704000
- LA R6,8(,R6) UPDATE POINTER TO END OF LIST 00705000
- B LOOP1 YES- GO GET STORAGE FIRST 00706000
- ENDLIST LA R1,=CL8' DIRCT' POINT TO USER, @VA02223 00707000
- * DIRECTORY LOCK VALUE 00708000
- L R4,DMKSYSPL POINT TO OLD LIST 00709000
- CALL DMKLOCKQ WAIT FOR THE DIRECTORY TO FREE UP 00710000
- ST R7,DMKSYSPL POINT TO THE NEW DIRECTORY 00711000
- CALL DMKLOCKD UNLOCK THE USER DIRECTORY 00712000
- LTR R7,R4 SET UP TO FRET OLD LIST 00713000
- BZ DRCTOK RETURN IF NO OLD LIST HRC028DK 00714490
- FRETLIST SR R8,R8 SET DISPLACEMINT TO ZERO 00715000
- LOOP2 L R1,0(R8,R7) GET VIRTUAL ADD FROM LIST 00716000
- LTR R1,R1 IS IT THE END OF THE LIST 00717000
- BM RETLIST YES- GO RETURN STORAGE 00718000
- SR R0,R0 SET UP TO ZERO DASD PAGE ADDRESS 00719000
- LA R2,SYSTEM SET UP PARM 00720000
- CALL DMKRPAGT RETURN REAL PAGE TO THE SYSTEM 00721000
- CALL DMKPGTVR RETURN VIRTUAL PAGE ADD 00722000
- LA R8,4(,R8) POINT TO NEXT VIRTUAL ADD IN LIST 00723000
- B LOOP2 DO IT AGAIN 00724000
- RETLIST LH R0,2(R8,R7) GET LENGTH FROM LIST 00725000
- LR R1,R7 POINT TO STORAGE TO FRET 00726000
- CALL DMKFRET 00727000
- CLR R4,R7 DID THE DIRECTORY SWAP 00728000
- BNE EXITCC3 NO- RETURN CC = 3 (FATAL IO ERROR) 00729000
- MVC DMKSYSUD,SAVER0 SAVE THE POINTER TO THE START X00730000
- OF THE USER DIRECTORY 00731000
- B DRCTOK YES, NEW DIRECTORY IS ONLINE HRC028DK 00732490
- MOVE MVC 0(0,R7),0(R1) MOVE OLD LIST TO NEW LIST 00733000
- EJECT 00734000
- *. 00735000
- * 00736000
- * SUBROUTINE NAME 00737000
- * 00738000
- * DMKUDRDS USER DIRECTORY DYNAMIC SWAP 00739000
- * 00740000
- * FUNCTION 00741000
- * 00742000
- * TO ALLOW THE DMKDIRCT PROGRAM TO DYNAMICALLY SWAP 00743000
- * THE ACTIVE DIRECTORY TO THE NEWLY CREATED DIRECTORY. 00744000
- * 00745000
- * ENTRY POINTS 00746000
- * 00747000
- * DMKUDRDS USER DIRECTORY DYNAMIC SWAP 00748000
- * 00749000
- * ENTRY CONDITIONS 00750000
- * 00751000
- * CALLED BY SVC FROM DMKHVC ( X'83XY003C' ) 00752000
- * 00753000
- * R5 WILL POINT TO THE CALLERS VIRTUAL GP REGISTER 'X' 00754000
- * X = GPR CONTAINING THE FIRST 4 BYTES OF THE VOLUME 00755000
- * SERIAL NUMBER OF THE USER DIRECTORY VOLUME. 00756000
- * 00757000
- * R6 WILL POINT TO THE CALLERS VIRTUAL GP REGISTER 'Y' 00758000
- * Y = GPR CONTAINING THE LAST 2 BYTES OF THE SAME 00759000
- * VOLUME SERIAL NUMBER. 00760000
- * 00761000
- * 00762000
- * EXIT CONDITIONS 00763000
- * 00764000
- * CC = 0 LIST BUILT 00765000
- * 00766000
- * CC = 2 INVALID VOLUME SPECIFIED BY THE CALLER 00767000
- * 00768000
- * CC = 3 FATAL IO ERROR TRYING TO READ DIRECTORY 00769000
- * 00770000
- * CALLS TO OTHER ROUTINES 00771000
- * 00772000
- * DMKFREE - GET FREE STORAGE 00773000
- * DMKFRET - TO RETURN FREE STORAGE 00774000
- * DMKIOSQR - TO READ THE DIRECTORY VOLUME 00775000
- * DMKDSPCH - TO WAIT 00776000
- * DMKUDRBV - TO BUILD A VIRTUAL PAGE LIST 00777000
- * DMKQCNWT - TO WRITE ERROR MSG 00778000
- * 00779000
- * EXTERNAL REFERENCES 00780000
- * 00781000
- * DMKSYSOW - OWNED LIST 00782000
- * DMKSYSOC - OWNED LIST COUNT 00783000
- * DMKSYSUD - POINTER TO THE USER DIRECTORY 00784000
- * 00785000
- * TABLES / WORK AREAS 00786000
- * 00787000
- * USER DIRECTORY LIST 00788000
- * OWND LIST 00789000
- * 00790000
- * REGISTER USAGE 00791000
- * 00792000
- * R0 - R4 = WORK 00793000
- * R5 = THE VOLUME SERIAL NUMBER FROM THE CALLER (4 BYTES) 00794000
- * R6 = THE VOLUME SERIAL NUMBER FROM THE CALLER (2 BYTES) 00795000
- * R8 = POINTER TO THE RDEVBLOK OF THE DIRECTORY VOL 00796000
- * R9 = DISPLACEMENT INTO THE OWNDLIST OF THE DIRECTORY VOL 00797000
- * R10 = POINTER TO OWNDLIST AND IOBLOK 00798000
- * R14 - R15 = WORK 00799000
- * 00800000
- * OPERATION 00801000
- * 00802000
- * 1. SET CALLERS VMPSW CC TO 0 AND ZERO DMKHVC'S REG2. 00803000
- * 00804000
- * 2. SCAN THE OWNDLIST FOR THE VOLUME PASSED BY THE 00805000
- * CALLER. IF NOT FOUND OR MOUNTED RETURN CC = 2. 00806000
- * 00807000
- * 3. CALL DMKFREE TO GET A BUFFER FOR THE 00808000
- * IOB+CCW'S+DATA AND FILL IT IN. 00809000
- * 00810000
- * 4. CALL DMKIOSRQ TO READ THE VOL1 AND ALLOCATION 00811000
- * RECORDS (R3 AND R4) AND GO TO DMKDSPCH. 00812000
- * 00813000
- * 5. CHECK TO SEE IF THIS IS A VALID DIRECTORY VOLUME. 00814000
- * IF NOT EXIT CC = 2. 00815000
- * 00816000
- * 6. CALL DMKUDRBV TO BUILD A VIRTUAL LIST OF UDIRBLOK'S. 00817000
- * 00818000
- * 7. SET CC RETURNED BY DMKUDRBV INTO CALLERS VMPSW 00819000
- * AND EXIT USING THE SAME CC. 00820000
- * 00821000
- * MESSAGES 00822000
- * 00823000
- * DMKUDR475I FATAL IO ERROR TRYING TO READ DIRECTORY 00824000
- *. 00825000
- EJECT 00826000
- DMKUDRDS RELOC 00827000
- USING OWNDLIST,R10 00828000
- MVC SAVER2,ZEROES ZERO OUT THE RETURN REG TO DMKHVC 00829000
- NI VMPSW+4,X'CF' SET THE VIRTUAL MACHINE STANDARD PSW'S *00830000
- CONDITION CODE TO ZERO 00831000
- NI VMPSW+2,X'CF' CLEAR EC-MODE CC AS WELL. @VA03299 00832000
- L R5,0(,R5) * GET THE VOL SER NO FROM THE REG'S 00833000
- L R6,0(,R6) * PROVIDED BY THE USER. 00834000
- L R10,=A(DMKSYSOW) GET THE POINT TO THE OWNED LIST 00835000
- L R9,=A(DMKSYSOC) GET POINTER TO THE OWNDLIST COUNT 00836000
- L R9,0(,R9) AND PICK UP THE COUNT 00837000
- LR R8,R9 SAVE THE COUNT 00838000
- NEXT CL R5,OWNDVSER IS THIS THE VSN THE DIRECTORY IS ON 00839000
- BE TESTR6 YES- GO TEST THE NEXT REG 00840000
- POINTOL LA R10,8(,R10) POINT TO THE NEXT BLOCK 00841000
- BCT R8,NEXT GO TEST THE NEXT BLOCK 00842000
- B SETCC2 NOT FOUND SET CC = 2 AND RETURN TO CALLER 00843000
- TESTR6 CLM R6,12,OWNDVSER+4 IS THIS THE VOL 00844000
- BNE POINTOL NO- GO POINT TO THE NEXT BLOCK 00845000
- SR R9,R8 GET THE DISP IN THE OWNDLIST OF THIS X00846000
- BLOCK (NUMBER OF BLOCKS INTO THE LIST) 00847000
- LH R8,OWNDRDEV GET THE POINTER TO THE REAL DEV 00848000
- LTR R8,R8 IS IT MOUNTED 00849000
- BM SETCC2 NO- RETURN TO THE CALLER CC = 2 00850000
- SLL R8,3(0) CONVERT TO BYTE INDEX @V200820 00851000
- A R8,ARIODV POINT TO THE REAL DEV BLOCK 00852000
- LA R0,IOBSIZE+6+10+128 GET A BUFFER FOR THE IOB+CCW'S+DATA 00853000
- CALL DMKFREE 00854000
- LR R10,R1 POINT TO THE IOB IN FREE ST. 00855000
- DROP R10 00856000
- USING IOBLOK,R10 00857000
- XC IOBLOK(IOBSIZE*8),IOBLOK CLEAR THE BLOCK 00858000
- MVI IOBFLAG,IOBCP SET UP THE CP IO FLAG 00859000
- LA R1,(IOBSIZE+1)*8(,R10) POINT TO THE FIRST CCW 00860000
- ST R1,IOBCAW AND SAVE THE ADD IN THE IOB 00861000
- LA R1,IORETURN SET UP THE RETURN ADD 00862000
- ST R1,IOBIRA AND SAVE IT 00863000
- ST R11,IOBUSER POINT TO THE USER 00864000
- ST R13,IOBMISC SAVE THE SAVE AREA ADD 00865000
- ST R9,IOBMISC2 SAVE THE POINTER TO THE OWNED LIST ALSO 00866000
- MVC IOBSIZE*8(8,R10),CHANPROG MOVE IN THE BB CC HH RR 00867000
- LM R14,R7,CCW1 * RELOCATE THE CCW STRING 00868000
- ALR R14,R10 * AND SAVE IT IN THE FREE 00869000
- ALR R0,R10 * ST. BLOCK AFTER THE IOB 00870000
- ALR R2,R10 * 00871000
- ALR R4,R10 * 00872000
- ALR R6,R10 * 00873000
- STM R14,R7,(IOBSIZE+1)*8(R10) 00874000
- CALL DMKIOSQR 00875000
- GOTO DMKDSPCH WAIT FOR IO TO COMPLETE 00876000
- IORETURN EQU * RETURN POINT FROM IOS 00877000
- USING *,R12 TEMP ADDRESSABILITY 00878000
- S R12,=A(IORETURN-DMKUDR) RESTORE BASE ADDRESS 00879000
- USING DMKUDR,R12 00880000
- L R13,IOBMISC RESTORE ADD OF SAVE AREA 00881000
- L R9,IOBMISC2 GET THE POINTER TO THE OWNED LIST 00882000
- L R11,IOBUSER POINT TO THE USER 00883000
- TM IOBSTAT,IOBFATAL DID I HAVE AN ERROR 00884000
- BO FRETCC3 YES- FRET IOB AND RETURN CC 3 TO CALLER 00885000
- ICM R9,14,((IOBSIZE+6)*8)+52(R10) INSERT THE DASD ADD (CCR-) 00886000
- BNP FRETCC2 RETURN TO THE CALLER IF THE POINTER TO X00887000
- DIRECTORY IS ZERO OR MINUS X00888000
- (THE USER DIRECTORY POINTER IS NOT VALID) 00889000
- LH R2,((IOBSIZE+6)*8)+52(,R10) GET THE CYLINDER NUMBER 00890000
- CH R2,=H'1024' IS IT LARGER THAN THE ALLOCATION TABLE 00891000
- BH FRETCC2 NO- FRET THE IOB AND RETURN CC = 2 00892000
- LA R1,(IOBSIZE+6+10)*8(R2,R10) ADD THE LOCATION OF *00893000
- THE ALLOCATION TABLE TO THE *00894000
- CYLINDER LOCATION 00895000
- CLI 0(R1),X'0C' IS THIS AN ALLOCATED DIRECTORY CYLINDER 00896000
- BNE FRETCC2 NO- RETURN TO THE CALLER CC = 2 00897000
- BAL R5,FRETIOB RETURN THE IOBLOK TO SYSTEM 00898000
- DROP R10 00899000
- USING SYSLOCS,R10 00900000
- L R10,ASYSLC POINT TO THE SYSLOCS TABLE 00901000
- CL R9,DMKSYSUD IS THIS DIRECTORY IN USE BY THE SYSTEM? 00902000
- BE SETCC2 YES- RETURN TO THE CALLER CC = 2. THIS *00903000
- USER IS UPDATING A VIRTUAL DIRECTORY. 00904000
- LR R0,R9 POINT TO THE PAGE ON DISK (CCRD) 00905000
- CALL DMKUDRBV GO BUILD A LIST OF PAGE BUFFERS X00906000
- FOR THE NEW USER DIRECTORY 00907000
- BC 1,SETCC3 SET CC = 3 AND RETURN TO THE CALLER 00908000
- SETCC0 B EXITCC0 RETURN CC = 0 TO CALLER 00909000
- SETCC1 LA R2,X'10' INDICATE COND CODE = 1. @VA03299 00910000
- BAL R5,SETALLCC USE CODE INDICATOR TO SET THE CC.@VA03299 00911000
- B EXITCC1 RETURN TO CALLER 00912000
- FRETCC2 BAL R5,FRETIOB RETURN THE IOBLOK TO SYSTEM 00913000
- SETCC2 LA R2,X'20' INDICATE COND CODE = 2. @VA03299 00914000
- BAL R5,SETALLCC USE CODE INDICATOR TO SET THE CC.@VA03299 00915000
- B EXITCC2 RETURN TO CALLER 00916000
- FRETCC3 BAL R5,FRETIOB RETURN THE IOBLOK TO SYSTEM 00917000
- SETCC3 LA R2,X'30' INDICATE COND CODE = 3. @VA03299 00918000
- BAL R5,SETALLCC USE CODE INDICATOR TO SET THE CC.@VA03299 00919000
- B EXITCC3 RETURN TO CALLER @VA03299 00920000
- SPACE 1 00921000
- SETALLCC LA R1,VMPSW+4 ASSUME A BC MODE PSW IS CORRECT @VA03299 00922000
- TM VMESTAT,VMEXTCM IS THIS AN ECMODE MACHINE? @VA03299 00923000
- BZ SET12OR3 NO, PSW INDEX IS ALREADY CORRECT @VA03299 00924000
- LA R1,VMPSW+2 GET PROPER OFFSET FOR EC-MODE PSW@VA03299 00925000
- SET12OR3 EX R2,CCSETTER SET CONDITION CODE IN VMPSW @VA03299 00926000
- BR R5 RETURN TO CALLER @VA03299 00927000
- SPACE 1 00928000
- CCSETTER OI 0(R1),*-* EXECUTED CONDITION CODE SETTER @VA03299 00929000
- SPACE 00930000
- FRETIOB LA R0,IOBSIZE+6+10+128 SET UP SIZE OF IOB+CCW'S+DATA 00931000
- LR R1,R10 POINT AT ST TO FRET 00932000
- CALL DMKFRET 00933000
- BR R5 RETURN TO THE CALLER 00934000
- SPACE 2 00935000
- DS 0D 00936000
- CHANPROG DC X'0000000000000300' 00937000
- CCW1 CCW 07,IOBSIZE*8,CC+SILI,6 SEEK TO REC 3 (THE CP VOL1 REC) 00938000
- CCW2 CCW 49,(IOBSIZE*8)+2,CC+SILI,5 SEARCH FOR REC NO 3 00939000
- CCW3 CCW 08,(IOBSIZE+2)*8,0,0 TIC - 8 00940000
- CCW4 CCW 06,(IOBSIZE+6)*8,CC+SILI,80 READ IN THE VOL1 REC 00941000
- CCW5 CCW 06,(IOBSIZE+6+10)*8,SILI,1024 READ IN THE ALLOCATION REC 00942000
- SPACE 2 00943000
- MASK DC XL8'AAAAAAAAAAAAAAAA' THE MASK FOR THE USER DIRECTORY 00944000
- SPACE 2 00945000
- LTORG 00946000
- SPACE 2 00947000
- USER DSECT 00948000
- CNOP 2,4 00949000
- USERDISP DS 1H 00950000
- USERDASD DS 1F 00951000
- EJECT 00952000
- COPY EQU 00954000
- COPY SAVE 00955000
- COPY VMBLOK 00956000
- COPY UDIRECT 00957000
- SYSLOCS 00958000
- PSA 00959000
- COPY ALLOC @V306638 00960000
- COPY IOBLOKS 00961000
- END DMKUDR 00962000
ibm/vm370-lib/cp/dmkudr.assemble_src.txt ยท Last modified: 2023/08/06 13:37 by Site Administrator