ibm:vm370-lib:cp:dmkscn.assemble_src
Table of Contents
DMKSCN Source
References
- Fixes Applied : 2
- This Source Date : Thursday, December 14, 1978
- Last Fix ID : [R11217DK]
Source Listing
- DMKSCN.ASSEMBLE.txt
- SCN TITLE 'DMKSCN (CP) VM/370 - RELEASE 6' 00001000
- ISEQ 73,80 VALIDATE SEQUENCING OF INPUT @V200820 00002000
- DMKSCN CSECT 00003000
- SPACE 00004000
- USING PSA,R0 00005000
- SPACE 1 00006000
- *. 00007000
- * MODULE NAME - 00008000
- * 00009000
- * DMKSCN 00010000
- * 00011000
- * CONTENTS - 00012000
- * 00013000
- * DMKSCNRU - FIND THE BLOCKS FOR A GIVEN REAL DEVICE ADDRESS 00014000
- * DMKSCNVU - FIND THE BLOCKS FOR A GIVEN VIRTUAL DEVICE ADDRESS 00015000
- * DMKSCNVS - SEARCH FOR A DEVICE WITH A GIVEN SERIAL NUMBER 00016000
- * DMKSCNRD - COMPUTE FULL REAL DEVICE ADDRESS (IN CCU FORM) 00017000
- * DMKSCNVD - COMPUTE VIRTUAL DEVICE ADDRESS ETC. FROM VDEVBLOK 00018000
- * DMKSCNAU - FIND THE VMBLOK WITH A GIVEN USERID 00019000
- * DMKSCNFD - FIND THE NEXT FIELD IN THE INPUT BUFFER 00020000
- * DMKSCNLI - SEARCH VIRTUAL MACHINES FOR LINKS TO GIVEN MINIDISK 00021000
- * DMKSCNRN - FIND DEVICE NAME FOR GIVEN REAL DEV ADDRESS 00022000
- * DMKSCNVN - FIND DEVICE NAME FOR GIVEN VIRT DEV ADDRESS 00023000
- EJECT 00024000
- * SUBROUTINE NAME - 00025000
- * 00026000
- * DMKSCNRU - FIND THE BLOCKS FOR A GIVEN REAL DEVICE ADDRESS 00027000
- * 00028000
- * FUNCTION - 00029000
- * 00030000
- * TO RETURN TO THE CALLER THE ADDRESSES OF THE REAL CHANNEL, 00031000
- * CONTROL UNIT, AND DEVICE BLOCKS FOR A GIVEN REAL DEVICE. 00032000
- * 00033000
- * ATTRIBUTES - 00034000
- * 00035000
- * REENTRANT, RESIDENT, CALLED VIA BALR 00036000
- * 00037000
- * ENTRY POINT - 00038000
- * 00039000
- * DMKSCNRU 00040000
- * 00041000
- * ENTRY CONDITIONS - 00042000
- * 00043000
- * GPR 1 CONTAINS THE REAL DEVICE ADDRESS 00044000
- * GPR 14 = RETURN ADDRESS 00045000
- * GPR 15 = ADDRESS OF DMKSCNRU 00046000
- * 00047000
- * EXIT CONDITIONS - 00048000
- * 00049000
- * CC = 0 IF ALL BLOCKS ARE FOUND (GPR 6, 7, & 8 ARE VALID) 00050000
- * CC = 1 IF CHANNEL BLOCK NOT FOUND (NO REGISTERS VALID) 00051000
- * CC = 2 IF CONTROL UNIT BLOCK NOT FOUND (GPR 6 IS VALID) 00052000
- * CC = 3 IF DEVICE BLOCK NOT FOUND (GPR 6 AND 7 ARE VALID) 00053000
- * NOTE: IF GPR 6, 7 OR 8 ARE NOT VALID THEY WILL BE SET TO -1 00054000
- * 00055000
- * GPR 1 STILL CONTAINS THE REAL DEVICE ADDRESS 00056000
- * GPR 6 POINTS TO THE REAL CHANNEL BLOCK (RCHBLOK) 00057000
- * GPR 7 POINTS TO THE REAL CONTROL UNIT BLOCK (RCUBLOK) 00058000
- * GPR 8 POINTS TO THE REAL DEVICE BLOCK (RDEVBLOK) 00059000
- * 00060000
- * CALLS TO OTHER ROUTINES - 00061000
- * 00062000
- * NONE 00063000
- * 00064000
- * EXTERNAL REFERENCES - 00065000
- * 00066000
- * DMKRIOCT - REAL CHANNEL TABLE (INDEX TO REAL CHANNEL BLOCKS) 00067000
- * DMKRIOCH - START OF REAL CHANNEL BLOCKS 00068000
- * DMKRIOCU - START OF REAL CONTROL UNIT BLOCKS 00069000
- * DMKRIODV - START OF REAL DEVICE BLOCKS 00070000
- * 00071000
- * TABLES / WORK AREAS - 00072000
- * 00073000
- * NONE 00074000
- EJECT 00075000
- * REGISTER USAGE - 00076000
- * 00077000
- * GPR 1 = DEVICE ADDRESS 00078000
- * GPR 6 = CHANNEL BLOCK ADDRESS 00079000
- * GPR 7 = CONTROL UNIT BLOCK ADDRESS 00080000
- * GPR 8 = DEVICE BLOCK ADDRESS 00081000
- * GPR 14 = RETURN ADDRESS 00082000
- * GPR 15 = BASE ADDRESS 00083000
- * 00084000
- * GPR 0, 2-5, & 9-13 ARE NOT USED. 00085000
- * 00086000
- * NOTES - 00087000
- * 00088000
- * THE CHANNEL, CONTROL UNIT, AND DEVICE TABLES CONTAIN HALFWORD 00089000
- * INDICES INTO THE STRINGS OF CHANNEL, CONTROL UNIT, AND DEVICE 00090000
- * BLOCKS RESPECTIVELY. A NEGATIVE INDEX VALUE INDICATES THAT 00091000
- * THE UNIT DOES NOT EXIST. 00092000
- * 00093000
- * SINCE DMKSCNRU DOES NOT USE TEMPSAVE OR BALRSAVE, IT CAN BE 00094000
- * CALLED BY A ROUTINE WHICH IS ITSELF CALLED VIA BALR, AS LONG 00095000
- * AS THAT ROUTINE PRESERVES GPR 14 AND 15 WHEN CALLING DMKSCNRU. 00096000
- * 00097000
- * OPERATION - 00098000
- * 00099000
- * 1. THE CHANNEL BITS OF THE REAL DEVICE ARE INDEXED BY 00100000
- * DMKRIOCT AND DMKRIOCH TO PRODUCE THE ADDRESS OF THE REAL 00101000
- * CHANNEL BLOCK (RCHBLOK) IN GPR 6 (IF IT EXISTS). 00102000
- * 00103000
- * 2. THE CONTROL UNIT BITS OF THE REAL DEVICE ARE INDEXED BY THE 00104000
- * RCHBLOK (FROM STEP 1) AND DMKRIOCU TO PRODUCE THE ADDRESS OF 00105000
- * THE REAL CONTROL UNIT BLOCK (RCUBLOK) IN GPR 7 (IF IT EXISTS). 00106000
- * 00107000
- * 3. THE DEVICE BITS OF THE REAL DEVICE ARE INDEXED BY THE 00108000
- * RCUBLOK (FROM STEP 2) AND DMKRIODV TO PRODUCE THE ADDRESS OF 00109000
- * THE REAL DEVICE BLOCK (RDEVBLOK) IN GPR 8 (IF IT EXISTS). 00110000
- *. 00111000
- EJECT 00112000
- *********************************************************************** 00113000
- * * 00114000
- * FIND THE REAL CHANNEL, CONTROL UNIT, AND DEVICE BLOCKS * 00115000
- * * 00116000
- *********************************************************************** 00117000
- SPACE 00118000
- *. 00119000
- *********************************************************************** 00120000
- * 00121000
- * 00122000
- * CP ASSIST INSTRUCTION "SCNRU" - GET REAL I/O CONTROL BLOCKS 00123000
- * 00124000
- * 00125000
- * OPERANDS: 00126000
- * 1 = REAL DEVICE ADDRESS (RIGHT JUSTIFIED) 00127000
- * 2 = ADDRESS OF 'ARIOCT' (START OF 16-BYTE DATA LIST) 00128000
- * 00129000
- * REGISTER INPUT: 00130000
- * GPR 14 = EXIT ADDRESS 00131000
- * 00132000
- * SYSTEM DATA AREAS REFERENCED (BY MODULE): 00133000
- * DMKPSA - 'ARIOCT', 'ARIOCH', 'ARIOCU', AND 'ARIODV' 00134000
- * DMKRIO - 'DMKRIOCT', RCHBLOK, RCUBLOK 00135000
- * 00136000
- * 00137000
- * EXITS: 00138000
- * 00139000
- * 1. ADDRESS IN GPR 14 (NORMAL COMPLETION) 00140000
- * 00141000
- * REGISTER OUTPUT: 00142000
- * GPR 6 = ADDRESS OF RCHBLOK (OR -1 IF NO RCHBLOK) 00143000
- * GPR 7 = ADDRESS OF RCUBLOK (OR -1 IF NO RCUBLOK) 00144000
- * GPR 8 = ADDRESS OF RDEVBLOK (OR -1 IF NO RDEVBLOK) 00145000
- * NOTE: THE CONDITION CODE IS SET TO 0, 1, 2, OR 3. 00146000
- * 00147000
- * 2. NEXT SEQUENTIAL INSTRUCTION (ABNORMAL COMPLETION) 00148000
- * 00149000
- * NOTE: THIS EXIT IS FUNCTIONALLY EQUIVALENT TO A NO-OP. 00150000
- * 00151000
- *********************************************************************** 00152000
- *. 00153000
- SPACE 00154000
- ENTRY DMKSCNRU 00155000
- DMKSCNRU DS 0D (DBL-WORD-ALIGNED FOR BEST PERF) %V3M4038 00156000
- USING *,R15 %V3M4038 00157000
- SPACE 00158000
- DS 0H EXECUTE CP ASSIST "SCNRU" @V3M4026 00159000
- DC X'E60E',S(0(R1),ARIOCT) ***@V386198 00160000
- SPACE 00161000
- LA R6,X'F00' ISOLATE THE CHANNEL BITS %V3M4038 00162000
- NR R6,R1 FROM THE DEVICE-ADDRESS %V3M4038 00163000
- SRL R6,7 CHANNEL ADDRESS * 2 %V3M4038 00164000
- A R6,ARIOCT ADD CHANNEL TABLE ADDRESS %V3M4038 00165000
- LH R6,0(,R6) LOAD RCHBLOK INDEX %V3M4038 00166000
- LTR R7,R6 DOES CHANNEL EXIST ? %V3M4038 00167000
- BM FFR8 RETURN CC = 1 AND REG 6,7,8 = -1 %V3M4038 00168000
- A R6,ARIOCH COMPUTE RCHBLOK ADDRESS %V3M4038 00169000
- USING RCHBLOK,R6 %V3M4038 00170000
- LA R7,X'0F8' ISOLATE THE CONTROL-UNIT BITS %V3M4038 00171000
- NR R7,R1 FROM THE DEVICE-ADDRESS %V3M4038 00172000
- SRL R7,2 CU ADDRESS * 2 %V3M4038 00173000
- LH R7,RCHCUTBL(R7) LOAD CONTROL UNIT INDEX %V3M4038 00174000
- LTR R7,R7 DOES CONTROL UNIT EXIST ? %V3M4038 00175000
- BNM COMPRCUB YES %V3M4038 00176000
- LA R7,X'0F0' ISOLATE THE CONTROL-UNIT BITS %V3M4038 00177000
- NR R7,R1 FROM THE DEVICE-ADDRESS %V3M4038 00178000
- SRL R7,2 ALTERNATE CU ADDRESS * 2 %V3M4038 00179000
- LH R7,RCHCUTBL(R7) LOAD CONTROL UNIT INDEX %V3M4038 00180000
- LTR R8,R7 DOES CONTROL UNIT EXIST ? %V3M4038 00181000
- BM SETCC2 BRANCH IF NO %V3M4038 00182000
- COMPRCUB A R7,ARIOCU COMPUTE RCUBLOK ADDRESS %V3M4038 00183000
- USING RCUBLOK,R7 %V3M4038 00184000
- LA R8,X'00F' ISOLATE THE DEVICE BITS %V3M4038 00185000
- NR R8,R1 FROM THE DEVICE-ADDRESS %V3M4038 00186000
- AR R8,R8 DEVICE ADDRESS * 2 %V3M4038 00187000
- LH R8,RCUDVTBL(R8) LOAD RDEVBLOK INDEX %V3M4038 00188000
- TM RCUTYPE,RCUSUB IS THIS A SUBORDINATE CU %V3M4038 00189000
- BZ *+8 NO- BRANCH %V3M4038 00190000
- L R7,RCUPRIME YES- POINT TO THE PRIME CU %V3M4038 00191000
- LTR R8,R8 DOES DEVICE EXIST ? %V3M4038 00192000
- BM SETCC3 BRANCH IF NO %V3M4038 00193000
- SLL R8,3(0) CONVERT TO BYTE INDEX %V3M4038 00194000
- A R8,ARIODV COMPUTE RDEVBLOK ADDRESS %V3M4038 00195000
- SR R15,R15 SET CC = 0 (AND CLEAR R15) %V3M4038 00196000
- BR R14 AND RETURN TO CALLER. %V3M4038 00197000
- DROP R6,R7 00198000
- EJECT 00199000
- *. 00200000
- * SUBROUTINE NAME - 00201000
- * 00202000
- * DMKSCNVU - FIND THE BLOCKS FOR A GIVEN VIRTUAL DEVICE ADDRESS 00203000
- * 00204000
- * FUNCTION - 00205000
- * 00206000
- * TO RETURN TO THE CALLER THE ADDRESSES OF THE VIRTUAL CHANNEL, 00207000
- * CONTROL UNIT, AND DEVICE BLOCKS FOR A GIVEN VIRTUAL DEVICE. 00208000
- * 00209000
- * ATTRIBUTES - 00210000
- * 00211000
- * REENTRANT, RESIDENT, CALLED VIA BALR 00212000
- * 00213000
- * ENTRY POINT - 00214000
- * 00215000
- * DMKSCNVU 00216000
- * 00217000
- * ENTRY CONDITIONS - 00218000
- * 00219000
- * GPR 1 CONTAINS THE VIRTUAL DEVICE ADDRESS 00220000
- * GPR 11 CONTAINS THE VMBLOK ADDRESS 00221000
- * GPR 14 = RETURN ADDRESS 00222000
- * GPR 15 = ADDRESS OF DMKSCNVU 00223000
- * 00224000
- * EXIT CONDITIONS - 00225000
- * 00226000
- * CC = 0 IF ALL BLOCKS ARE FOUND (GPR 6, 7, & 8 ARE VALID) 00227000
- * CC = 1 IF CHANNEL BLOCK NOT FOUND (NO REGISTERS VALID) 00228000
- * CC = 2 IF CONTROL UNIT BLOCK NOT FOUND (GPR 6 IS VALID) 00229000
- * CC = 3 IF DEVICE BLOCK NOT FOUND (GPR 6 AND 7 ARE VALID) 00230000
- * NOTE: IF GPR 6, 7 OR 8 ARE NOT VALID THEY WILL BE SET TO -1 00231000
- * 00232000
- * GPR 1 STILL CONTAINS THE VIRTUAL DEVICE ADDRESS 00233000
- * GPR 6 POINTS TO THE VIRTUAL CHANNEL BLOCK (VCHBLOK) 00234000
- * GPR 7 POINTS TO THE VIRTUAL CONTROL UNIT BLOCK (VCUBLOK) 00235000
- * GPR 8 POINTS TO THE VIRTUAL DEVICE BLOCK (VDEVBLOK) 00236000
- * 00237000
- * CALLS TO OTHER ROUTINES - 00238000
- * 00239000
- * NONE 00240000
- * 00241000
- * EXTERNAL REFERENCES - 00242000
- * 00243000
- * NONE 00244000
- EJECT 00245000
- * TABLES / WORK AREAS - 00246000
- * 00247000
- * NONE 00248000
- * THE UNIT DOES NOT EXIST. 00249000
- * 00250000
- * SINCE DMKSCNVU DOES NOT USE TEMPSAVE OR BALRSAVE, IT CAN BE 00251000
- * CALLED BY A ROUTINE WHICH IS ITSELF CALLED VIA BALR, AS LONG 00252000
- * AS THAT ROUTINE PRESERVES GPR 14 AND 15 WHEN CALLING DMKSCNVU. 00253000
- * 00254000
- * OPERATION - 00255000
- * 00256000
- * 1. THE CHANNEL BITS OF THE VIRTUAL DEVICE ARE INDEXED BY 00257000
- * THE CHANNEL TABLE (VMCHTBL) AND VMCHSTRT (BOTH IN THE USER'S 00258000
- * VMBLOK) TO PRODUCE THE ADDRESS OF THE VIRTUAL CHANNEL BLOCK 00259000
- * (VCHBLOK) IN GPR 6 (IF IT EXISTS). 00260000
- * 00261000
- * 2. THE CONTROL UNIT BITS OF THE VIRTUAL DEVICE ARE INDEXED BY 00262000
- * THE VCHBLOK (FROM STEP 1) AND VMCUSTRT (IN THE VMBLOK) TO 00263000
- * PRODUCE THE ADDRESS OF THE VIRTUAL CONTROL UNIT BLOCK 00264000
- * (VCUBLOK) IN GPR 7 (IF IT EXISTS). 00265000
- * 00266000
- * 3. THE DEVICE BITS OF THE VIRTUAL DEVICE ARE INDEXED BY THE 00267000
- * VCUBLOK (FROM STEP 2) AND VMDVSTRT (IN THE VMBLOK) TO 00268000
- * PRODUCE THE ADDRESS OF THE VIRTUAL DEVICE BLOCK 00269000
- * (VDEVBLOK) IN GPR 8 (IF IT EXISTS). 00270000
- *. 00271000
- EJECT 00272000
- *********************************************************************** 00273000
- * * 00274000
- * FIND THE VIRTUAL CHANNEL, CONTROL UNIT, AND DEVICE BLOCKS * 00275000
- * * 00276000
- *********************************************************************** 00277000
- SPACE 00278000
- *. 00279000
- *********************************************************************** 00280000
- * 00281000
- * 00282000
- * CP ASSIST INSTRUCTION "SCNVU" - GET VIRTUAL I/O CONTROL BLOCKS 00283000
- * 00284000
- * 00285000
- * OPERANDS: 00286000
- * 1 = ADDRESS OF 'VMCHTBL' FROM USER'S VMBLOK 00287000
- * 2 = ADDRESS OF 'VMCHSTRT' (START OF 12-BYTE DATA LIST) 00288000
- * 00289000
- * REGISTER INPUT: 00290000
- * GPR 1 = VIRTUAL DEVICE ADDRESS (RIGHT JUSTIFIED) 00291000
- * GPR 14 = EXIT ADDRESS 00292000
- * 00293000
- * SYSTEM DATA AREAS REFERENCED: 00294000
- * VCHBLOK, VCUBLOK, VDEVBLOK, VMBLOK 00295000
- * 00296000
- * 00297000
- * EXITS: 00298000
- * 00299000
- * 1. ADDRESS IN GPR 14 (NORMAL COMPLETION) 00300000
- * 00301000
- * REGISTER OUTPUT: 00302000
- * GPR 6 = ADDRESS OF VCHBLOK (OR -1 IF NO VCHBLOK) 00303000
- * GPR 7 = ADDRESS OF VCUBLOK (OR -1 IF NO VCUBLOK) 00304000
- * GPR 8 = ADDRESS OF VDEVBLOK (OR -1 IF NO VDEVBLOK) 00305000
- * NOTE: THE CONDITION CODE IS SET TO 0, 1, 2, OR 3. 00306000
- * 00307000
- * 2. NEXT SEQUENTIAL INSTRUCTION (ABNORMAL COMPLETION) 00308000
- * 00309000
- * NOTE: THIS EXIT IS FUNCTIONALLY EQUIVALENT TO A NO-OP. 00310000
- * 00311000
- *********************************************************************** 00312000
- *. 00313000
- SPACE 00314000
- ENTRY DMKSCNVU 00315000
- DMKSCNVU DS 0D (DBL-WORD-ALIGNED FOR BEST PERF) %V3M4038 00316000
- USING *,R15 %V3M4038 00317000
- USING VMBLOK,R11 %V3M4038 00318000
- SPACE 00319000
- DS 0H EXECUTE CP ASSIST "SCNVU" %V3M4038 00320000
- DC X'E606',S(VMCHTBL,VMCHSTRT) ***%V3M4038 00321000
- SPACE 00322000
- LA R6,X'F00' ISOLATE THE CHANNEL BITS %V3M4038 00323000
- NR R6,R1 FROM THE DEVICE-ADDRESS %V3M4038 00324000
- SRL R6,7 CHANNEL ADDRESS * 2 %V3M4038 00325000
- LH R6,VMCHTBL(R6) LOAD VCHBLOK INDEX %V3M4038 00326000
- LTR R7,R6 DOES CHANNEL EXIST ? %V3M4038 00327000
- BM FFR8 RETURN CC = 1 AND REG 6,7,8 = -1 %V3M4038 00328000
- A R6,VMCHSTRT COMPUTE VCHBLOK ADDRESS %V3M4038 00329000
- USING VCHBLOK,R6 %V3M4038 00330000
- LA R7,X'0F0' ISOLATE THE CONTROL-UNIT BITS %V3M4038 00331000
- NR R7,R1 FROM THE DEVICE-ADDRESS %V3M4038 00332000
- SRL R7,3 CU ADDRESS * 2 %V3M4038 00333000
- LH R7,VCHCUTBL(R7) LOAD CONTROL UNIT INDEX %V3M4038 00334000
- LTR R8,R7 DOES CONTROL UNIT EXIST ? %V3M4038 00335000
- BM SETCC2 BRANCH IF NO %V3M4038 00336000
- A R7,VMCUSTRT COMPUTE VCUBLOK ADDRESS %V3M4038 00337000
- USING VCUBLOK,R7 %V3M4038 00338000
- LA R8,X'00F' ISOLATE THE DEVICE BITS %V3M4038 00339000
- NR R8,R1 FROM THE DEVICE-ADDRESS %V3M4038 00340000
- AR R8,R8 DEVICE ADDRESS * 2 %V3M4038 00341000
- LH R8,VCUDVTBL(R8) LOAD VDEVBLOK INDEX %V3M4038 00342000
- LTR R8,R8 DOES DEVICE EXIST ? %V3M4038 00343000
- BM SETCC3 BRANCH IF NO %V3M4038 00344000
- A R8,VMDVSTRT COMPUTE VDEVBLOK ADDRESS %V3M4038 00345000
- USING VDEVBLOK,R8 %V3M4038 00346000
- TM VDEVFLAG,VDEVDET IS VIR DEV BEING DETACHED? %V3M4038 00347000
- BO SETCC3A YES - CC3 DEV DOES NOT EXIST %VA05925 00348000
- SR R15,R15 SET CC = 0 (AND CLEAR R15) %V3M4038 00349000
- BR R14 AND RETURN TO CALLER. %V3M4038 00350000
- DROP R6,R7,R8,R11 %V3M4038 00351000
- SPACE 00352000
- FFR8 LR R8,R7 SET R8 TO -1 %V3M4038 00353000
- BR R14 RETURN TO CALLER (CC = 1) %V3M4038 00354000
- EJECT 00355000
- *. 00356000
- * SUBROUTINE NAME - 00357000
- * 00358000
- * DMKSCNVS - SEARCH FOR A DEVICE WITH A GIVEN SERIAL NUMBER 00359000
- * 00360000
- * FUNCTION - 00361000
- * 00362000
- * TO SEARCH ALL THE REAL DEVICE BLOCKS FOR A DEVICE WHOSE VOLUME 00363000
- * SERIAL NUMBER MATCHES THE ONE POINTED TO BY REGISTER 1. 00364000
- * 00365000
- * ATTRIBUTES - 00366000
- * 00367000
- * REENTRANT, RESIDENT, CALLED VIA BALR 00368000
- * 00369000
- * ENTRY POINT - 00370000
- * 00371000
- * DMKSCNVS 00372000
- * 00373000
- * ENTRY CONDITIONS - 00374000
- * 00375000
- * GPR 0 CONTAINS THE LENGTH OF THE SERIAL NUMBER 00376000
- * GPR 1 POINTS TO THE VOLUME SERIAL NUMBER TO BE SEARCHED FOR 00377000
- * GPR 14 = RETURN ADDRESS 00378000
- * GPR 15 = ADDRESS OF DMKSCNVS 00379000
- * 00380000
- * EXIT CONDITIONS - 00381000
- * 00382000
- * CC = 0 IF A MATCH IS FOUND (GPR 1 IS VALID) 00383000
- * CC = 1 IF NO MATCH IS FOUND (GPR 1 IS ZERO) 00384000
- * CC = 2 IF LENGTH OF SERIAL NUMBER < 1 OR > 6 (CALLING ERROR) 00385000
- * (GPR 1 IS UNCHANGED) 00386000
- * 00387000
- * GPR 1 POINTS TO THE RDEVBLOK WITH THE SPECIFIED SERIAL NUMBER 00388000
- * 00389000
- * CALLS TO OTHER ROUTINES - 00390000
- * 00391000
- * NONE 00392000
- * 00393000
- * EXTERNAL REFERENCES - 00394000
- * 00395000
- * DMKRIODV - START OF REAL DEVICE BLOCKS 00396000
- * DMKRIODC - COUNT OF REAL DEVICE BLOCKS 00397000
- * 00398000
- * TABLES / WORK AREAS - 00399000
- * 00400000
- * THE FIRST 6 BYTES OF BALRSAVE ARE USED TO STORE THE VOLUME 00401000
- * SERIAL NUMBER TO BE SEARCHED FOR. 00402000
- * 00403000
- * BALR2 (WITHIN BALRSAVE) IS USED TO SAVE REGISTER 2 00404000
- EJECT 00405000
- * REGISTER USAGE - 00406000
- * 00407000
- * GPR 1 = POINTER TO REAL DEVICE BLOCK 00408000
- * GPR 2 = COUNT OF REAL DEVICE BLOCKS 00409000
- * GPR 14 = RETURN ADDRESS 00410000
- * GPR 15 = BASE REGISTER 00411000
- * 00412000
- * GPRS 3-13 ARE NOT USED. 00413000
- * 00414000
- * NOTES - 00415000
- * 00416000
- * NONE 00417000
- * 00418000
- * OPERATION - 00419000
- * 00420000
- * 1. CHECKS NUMBER OF BYTES IN VOLUME SERIAL NUMBER 00421000
- * (ERROR IF NOT 1 TO 6 - CONDITION-CODE 2 RETURNED). 00422000
- * 00423000
- * 2. CHECKS ALL REAL DEVICE BLOCKS FOR AN RDEVBLOK WHOSE 00424000
- * VOLUME SERIAL NUMBER MATCHES THAT SPECIFIED; IF THE 00425000
- * DEVICE IS OFFLINE, HOWEVER, IT IS NOT CHECKED. 00426000
- * 00427000
- * 3. RETURNS TO CALLER WITH ADDRESS OF MATCHING RDEVBLOK 00428000
- * (IF FOUND), OR ERROR RETURN (CONDITION-CODE 1) IF NOT FOUND. 00429000
- *. 00430000
- EJECT 00431000
- *********************************************************************** 00432000
- * * 00433000
- * FIND A DEVICE WITH A MATCHING SERIAL NUMBER * 00434000
- * * 00435000
- *********************************************************************** 00436000
- SPACE 00437000
- ENTRY DMKSCNVS 00438000
- DMKSCNVS DS 0D (DBL-WORD-ALIGNED FOR BEST PERFORMANCE) 00439000
- USING *,R15 00440000
- ST R2,BALR2 SAVE REGISTER 2 00441000
- MVC BALRSAVE(6),BLANKS BLANK OUT FIELD BEFORE MOVE 00442000
- LR R2,R0 LOAD LENGTH OF SERIAL NUMBER 00443000
- BCTR R2,0 SUBTRACT 1 FOR MVC INSTRUCTION 00444000
- CL R2,F5 LENGTH-1 MUST NOT EXCEED 5 00445000
- BH VSEREXIT ERROR (CONDITION-CODE 2) IF IT DOES. 00446000
- EX R2,BALRMVC MOVE SERIAL NUMBER TO BALRSAVE 00447000
- L R1,ARIODV LOAD 1ST RDEVBLOK ADDRESS 00448000
- L R2,ARIODC LOAD RDEVBLOK COUNT ADDRESS 00449000
- LH R2,0(,R2) LOAD COUNT OF REAL DEVICE BLOCKS 00450000
- USING RDEVBLOK,R1 00451000
- VSERLOOP TM RDEVSTAT,RDEVDISA+RDEVDED OFFLINE OR DEDICATED ? 00452000
- BNZ VSERNEXT YES - DO NOT CHECK IT 00453000
- TM RDEVFLAG,RDEVMOUT VOLUME MOUNTED AND NOT ATTACHED ?? 00454000
- BO VSERNEXT YES -- CHECK NEXT 00455000
- CLC RDEVSER,BALRSAVE DO THE SERIAL NUMBERS MATCH ? 00456000
- BE VSEREXIT YES, CC = 0, RETURN TO CALLER 00457000
- VSERNEXT LA R1,RDEVSIZE*8(,R1) POINT TO NEXT REAL DEVICE BLOCK 00458000
- BCT R2,VSERLOOP LOOP IF MORE BLOCKS 00459000
- LR R1,R2 ZERO REGISTER 1 00460000
- CLI F0,X'FF' SET CC = 1 00461000
- VSEREXIT L R2,BALR2 RESTORE REGISTER 2 00462000
- BR R14 RETURN TO CALLER 00463000
- DROP R1 00464000
- EJECT 00465000
- *. 00466000
- * SUBROUTINE NAME - 00467000
- * 00468000
- * DMKSCNRD 00469000
- * 00470000
- * FUNCTION - 00471000
- * 00472000
- * TO COMPUTE A FULL REAL DEVICE ADDRESS (IN CCU FORM) FROM THE 00473000
- * RDEVADD, RCUADD, AND RCHADD ENTRIES IN THE REAL DEVICE, 00474000
- * CONTROL UNIT, AND CHANNEL BLOCKS. 00475000
- * 00476000
- * ATTRIBUTES - 00477000
- * 00478000
- * REENTRANT, RESIDENT, CALLED VIA BALR 00479000
- * 00480000
- * ENTRY POINT - 00481000
- * 00482000
- * DMKSCNRD 00483000
- * 00484000
- * ENTRY CONDITIONS - 00485000
- * 00486000
- * GPR 8 = ADDRESS OF REAL DEVICE BLOCK 00487000
- * GPR 14 = RETURN REGISTER 00488000
- * GPR 15 = ADDRESS OF DMKSCNRD 00489000
- * 00490000
- * EXIT CONDITIONS - 00491000
- * 00492000
- * GPR 1 HOLDS REAL DEVICE ADDRESS IN CCU FORM (IN BITS 16-31) 00493000
- * 00494000
- * CALLS TO OTHER ROUTINES - 00495000
- * 00496000
- * NONE 00497000
- * 00498000
- * EXTERNAL REFERENCES - 00499000
- * 00500000
- * NONE 00501000
- * 00502000
- * TABLES / WORK AREAS 00503000
- * 00504000
- * 00505000
- * BALR2-BALR3 OF BALRSAVE USED TO SAVE GPR2 & GPR 3 00506000
- * 00507000
- * REGISTER USAGE - 00508000
- * 00509000
- * GPR 1 = COMPUTED CCU DEVICE ADDRESS 00510000
- * GPR 2 = CONTROL UNIT BITS / CHANNEL BITS 00511000
- * GPR 3 = ADDRESS OF CONTROL UNIT BLOCK / CHANNEL BLOCK 00512000
- * GPR 14 = RETURN REGISTER 00513000
- * 00514000
- * GPRS 0, 4-13, AND 15 ARE NOT USED. 00515000
- EJECT 00516000
- * NOTES - 00517000
- * 00518000
- * IF IF IS DESIRED TO HAVE THE REAL DEVICE ADDRESS IN 00519000
- * PRINTABLE HEX FORM, THE CALL TO DMKSCNRD MAY BE FOLLOWED 00520000
- * IMMEDIATELY BY A CALL TO DMKCVTBH. 00521000
- * 00522000
- * OPERATION - 00523000
- * 00524000
- * THE RDEVADD BITS ARE OBTAINED FROM RDEVBLOK; THE RCUADD BITS 00525000
- * FROM RCUBLOK (POINTED TO BY RDEVCUA) ARE OR'D WITH RCHADD; 00526000
- * FINALLY, THE RCHADD BITS FROM RCHBLOK (POINTED TO BY RCUCHA) 00527000
- * ARE OR'D WITH RDEVADD/RCUADD TO FORM THE COMPLETE CCU DEVICE 00528000
- * ADDRESS. 00529000
- *. 00530000
- EJECT 00531000
- *********************************************************************** 00532000
- * 00533000
- * COMPUTE REAL DEVICE ADDRESS IN CCU FORM 00534000
- * 00535000
- *********************************************************************** 00536000
- SPACE 2 00537000
- USING RDEVBLOK,R8 00538000
- USING DMKSCNRD,R15 @VA01081 00539000
- SPACE 00540000
- ENTRY DMKSCNRD 00541000
- DMKSCNRD STM R2,R3,BALR2 SAVE R2-R3 IN BALRSAVE AREA 00542000
- LH R1,RDEVADD GET DEVICE BITS FROM RDEVBLOK 00543000
- L R3,RDEVCUA POINT TO CONTROL UNIT BLOCK 00544000
- USING RCUBLOK,R3 ... 00545000
- LH R2,RCUADD GET CONTROL UNIT BITS FROM RCUBLOK 00546000
- OR R1,R2 ADD CONTROL UNIT BITS TO DEVICE BITS 00547000
- TM RCUTYPE,RCUSUB IS THIS A SUBORDINATE CU @VA01081 00548000
- BZ *+8 NO- BRANCH @VA01081 00549000
- L R3,RCUPRIME YES- POINT TO THE PRIME CU @VA01081 00550000
- L R3,RCUCHA POINT TO CHANNEL BLOCK 00551000
- USING RCHBLOK,R3 ... 00552000
- LH R2,RCHADD GET CHANNEL BITS FROM RCHBLOK 00553000
- OR R1,R2 ADD TO DEVICE/CONTROL UNIT BITS 00554000
- LM R2,R3,BALR2 RESTORE R2-R3 AND 00555000
- BR R14 RETURN TO CALLER (THAT'S ALL, FOLKS). 00556000
- SPACE 00557000
- DROP R3,R8 00558000
- EJECT 00559000
- *. 00560000
- * SUBROUTINE NAME - 00561000
- * 00562000
- * DMKSCNRA 00563000
- * 00564000
- * FUNCTION - 00565000
- * TO COMPUTE A FULL REAL DEVICE ADDRESS (IN CUU FORM) FROM THE 00566000
- * RDEVADD, RCUADD, AND RCHADD ENTRIES IN THE REAL DEVICE, 00567000
- * CONTROL UNIT, AND CHANNEL BLOCKS. 00568000
- * 00569000
- * ATTRIBUTES - 00570000
- * 00571000
- * REENTRANT, RESIDENT, CALLED VIA BALR 00572000
- * 00573000
- * ENTRY POINT - 00574000
- * 00575000
- * DMKSCNRA 00576000
- * 00577000
- * ENTRY CONDITIONS - 00578000
- * 00579000
- * GPR 6 = ADDRESS OF THE REAL CHANNEL BLOCK 00580000
- * GPR 7 = ADDRESS OF THE PRIME OR ALTERNATE CONTROL UNIT BLOCK 00581000
- * GPR 8 = ADDRESS OF REAL DEVICE BLOCK 00582000
- * GPR 14 = RETURN REGISTER 00583000
- * GPR 15 = ADDRESS OF DMKSCNRA 00584000
- * 00585000
- * EXIT CONDITIONS - 00586000
- * 00587000
- * CC = 0 00588000
- * GPR 1 HOLDS REAL DEVICE ADDRESS IN CCU FORM (IN BITS 16-31) 00589000
- * 00590000
- * CC = 1 00591000
- * CONTROL UNIT BLOCK COULD NOT BE FOUND 00592000
- * ALL REGISTERS ARE UNMODIFIED 00593000
- * 00594000
- * CALLS TO OTHER ROUTINES - 00595000
- * 00596000
- * NONE 00597000
- * 00598000
- * EXTERNAL REFERENCES - 00599000
- * 00600000
- * NONE 00601000
- * 00602000
- * TABLES / WORK AREAS 00603000
- * 00604000
- * BALR2 OF BALRSAVE USED TO SAVE GPR2 00605000
- * 00606000
- EJECT 00607000
- * REGISTER USAGE - 00608000
- * 00609000
- * GPR 1 = COMPUTED CCU DEVICE ADDRESS 00610000
- * GPR 2 = CONTROL UNIT BLOCK ADDRESS / CONTROL UNIT ADDRESS 00611000
- * GPR 6 = RCHBLOK ADDRESS 00612000
- * GPR 7 = RCUBLOK ADDRESS 00613000
- * GPR 8 = RDEVBLOK ADDRESS 00614000
- * GPR 14 = RETURN REGISTER 00615000
- * 00616000
- * GPRS 0, 3-5, 9-13, AND 15 ARE NOT USED. 00617000
- * NOTES - 00618000
- * 00619000
- * IF IT IS DESIRED TO HAVE THE REAL DEVICE ADDRESS IN 00620000
- * PRINTABLE HEX FORM, THE CALL TO DMKSCNRA MAY BE FOLLOWED 00621000
- * IMMEDIATELY BY A CALL TO DMKCVTBH. 00622000
- * 00623000
- * OPERATION - 00624000
- * 00625000
- * THE RDEVADD BITS ARE OBTAINED FROM THE RDEVBLOK (R8). 00626000
- * THE RCHADD BITS ARE OBTAINED FROM THE RCHBLOK (R6). 00627000
- * THE RCUADD BITS ARE OBTAINED FROM THE RCUBLOK WHICH 00628000
- * REPRESENTS THE PATH TO THE R7 RCUBLOK. IF THE RDEVBLOK 00629000
- * POINTS TO A SUBORDINATE CONTROL UNIT, THEN THE SUBORDINATE 00630000
- * CONTROL UNIT BLOCK RDEVADD BITS WILL BE USED TO CONSTRUCT 00631000
- * THE ADDRESS. 00632000
- * THE RDEVADD BITS ARE OR'D WITH THE RCUADD BITS WHICH ARE 00633000
- * OR'D WITH THE RCHADD BITS TO FORM THE CCU ADDRESS RETURNED 00634000
- * IN R1. 00635000
- * 00636000
- *. 00637000
- EJECT 00638000
- *********************************************************************** 00639000
- * 00640000
- * COMPUTE REAL DEVICE ADDRESS IN CCU FORM 00641000
- * 00642000
- *********************************************************************** 00643000
- SPACE 2 00644000
- USING RCHBLOK,R6 @V407438 00645000
- USING RCUBLOK,R7 @V407438 00646000
- USING RDEVBLOK,R8 @V407438 00647000
- USING DMKSCNRA,R15 @V407438 00648000
- SPACE 00649000
- ENTRY DMKSCNRA @V407438 00650000
- DMKSCNRA ST R2,BALR2 SAVE R2 IN BALRSAVE AREA @V407438 00651000
- CL R7,RDEVCUA IS R7 FROM THE 'A' PATH? @V407438 00652000
- BNE RACKCUAS NOT PRIME, GO CHECK SUBORDINATE @V407438 00653000
- LH R2,RCUADD GET CONTROL UNIT ADDRESS @V407438 00654000
- B SETADDR AND CONTINUE. @V407438 00655000
- RACKCUAS L R2,RDEVCUA GET ADDRESS OF CONTROL UNIT @V407438 00656000
- CL R7,RCUPRIME-RCUBLOK(R2) IS THIS THE R7 CUBLOK? @V407438 00657000
- BNE RACKCUB NOPE, GO TRY THE 'B' PATH(S) @V407438 00658000
- LH R2,RCUADD-RCUBLOK(R2) YES, GET ADDR OF CU @V407438 00659000
- B SETADDR AND CONTINUE @V407438 00660000
- RACKCUB CL R7,RDEVCUB IS R7 FROM THE 'B' PATH? @V407438 00661000
- BNE RACKCUBS NOPE, GO CKECK FOR SUBORDINATE @V407438 00662000
- LH R2,RCUADD YES, GET CONTROL UNIT ADDRESS @V407438 00663000
- B SETADDR AND CONTINUE @V407438 00664000
- RACKCUBS L R2,RDEVCUB GET ADDR OF CONTROL UNIT @V407438 00665000
- LTR R2,R2 DOES IT EXIST? @V407438 00666000
- BZ RACC1 NOPE, BAD BLOCKS, NO ADDR TODAY @V407438 00667000
- CL R7,RCUPRIME-RCUBLOK(R2) IS THIS THE R7 CUBLOK? @V407438 00668000
- BNE RACC1 NOPE, BAD BLOCKS, NO ADDR TODAY @V407438 00669000
- LH R2,RCUADD-RCUBLOK(R2) YES, GET ADDR OF CU @V407438 00670000
- SETADDR LH R1,RDEVADD GET DEVICE ADDRESS @V407438 00671000
- OR R1,R2 ADD IN THE CONTROL UNIT @V407438 00672000
- LH R2,RCHADD GET CHANNEL ADDRESS @V407438 00673000
- OR R1,R2 ADD IN THE CHANNEL ADDRESS @V407438 00674000
- CLR R1,R1 SET CONDITION CODE 0 @V407438 00675000
- B RAXIT DONE, BR. @V407438 00676000
- SPACE 00677000
- RACC1 TM *,X'FF' SET CONDITION CODE 1 @V407438 00678000
- RAXIT L R2,BALR2 RESTORE REGISTER @V407438 00679000
- BR R14 AND RETURN @V407438 00680000
- DROP R6,R7,R8 NO MORE RBLOKS @V407438 00681000
- EJECT 00682000
- *. 00683000
- * SUBROUTINE NAME - 00684000
- * 00685000
- * DMKSCNNP 00686000
- * 00687000
- * FUNCTION - 00688000
- * 00689000
- * FIND THE RCHBLOK AND RCUBLOK WHICH REPRESENTS THE NEXT 00690000
- * LOGICAL PATH TO THE DEVICE 00691000
- * 00692000
- * ATTRIBUTES - 00693000
- * 00694000
- * REENTRANT, RESIDENT, CALLED VIA BALR 00695000
- * 00696000
- * ENTRY POINT - 00697000
- * 00698000
- * DMKSCNNP 00699000
- * 00700000
- * ENTRY CONDITIONS - 00701000
- * 00702000
- * GPR 6 = ADDRESS OF THE REAL CHANNEL BLOCK 00703000
- * GPR 7 = ADDRESS OF THE PRIME OR ALTERNATE CONTROL UNIT BLOCK 00704000
- * GPR 8 = ADDRESS OF REAL DEVICE BLOCK 00705000
- * GPR 14 = RETURN REGISTER 00706000
- * GPR 15 = ADDRESS OF DMKSCNNP 00707000
- * 00708000
- * EXIT CONDITIONS - 00709000
- * 00710000
- * CC = 0 00711000
- * GPR 6 HOLDS THE RCHBLOK ADDRESS OF THE NEXT PATH 00712000
- * GPR 7 HOLDS THE RCUBLOK ADDRESS FOR THE NEXT PATH 00713000
- * 00714000
- * CC = 1 00715000
- * THERE ARE NO MORE PATHS FOR THIS DEVICE 00716000
- * 00717000
- * CALLS TO OTHER ROUTINES - 00718000
- * 00719000
- * NONE 00720000
- * 00721000
- * EXTERNAL REFERENCES - 00722000
- * 00723000
- * NONE 00724000
- * 00725000
- * TABLES / WORK AREAS 00726000
- * 00727000
- * BALR3-BALR7 OF BALRSAVE USED TO SAVE GPR3-GPR7 00728000
- * 00729000
- * REGISTER USAGE - 00730000
- * 00731000
- * GPR 3 = BEGINNING OF CHANNEL SEARCH ADDRESS 00732000
- * GPR 4 = INCREMENT 00733000
- * GPR 5 = ENDING OF CHANNEL SEARCH ADDRESS 00734000
- * GPR 6 = RCHBLOK ADDRESS 00735000
- * GPR 7 = RCUBLOK ADDRESS 00736000
- * GPR 8 = RDEVBLOK ADDRESS 00737000
- * GPR 14 = RETURN REGISTER 00738000
- * 00739000
- * GPRS 0-2, 9-13 AND 15 ARE NOT USED. 00740000
- EJECT 00741000
- * 00742000
- * OPERATION - 00743000
- * 00744000
- * THE R7 RCUBLOK IS SEARCHED TO FIND THE CURRENT R6 RCHBLOK. 00745000
- * IF IT IS FOUND, THE NEXT RCUCHX FIELD IS EXAMINED FOR A 00746000
- * POSSIBLE PATH. IF THERE IS A PATH, EXIT WITH CONDITION 00747000
- * CODE 0. IF THERE IS NO RCUCHX (VALUE = 0) OR ALL RCUCHX 00748000
- * FIELDS ARE EXAMINED AND THE CURRENT R6 IS NOT FOUND (MEANING 00749000
- * EITHER R6 REPRESENTS RCUCHD OR IT DOES NOT APPEAR IN THE 00750000
- * R7 RCUBLOK) THEN THE RDEVBLOK IS SEARCHED TO FIND WHICH 00751000
- * RCUBLOK THE CURRENT R7 POINTS TO. IF R7 REPRESENTS THE 00752000
- * RDEVCUA PATH AND THERE IS NO RDEVCUB, EXIT WITH CONDITION 00753000
- * CODE 1. IF R7 REPRESENTS THE RDEVCUB ALREADY, EXIT WITH 00754000
- * CONDITON CODE 1. IF R7 REPRESENTS THE RDEVCUA PATH AND 00755000
- * THERE EXISTS AN RDEVCUB PATH, RETURN WITH THE FIRST CHANNEL 00756000
- * PATH ON THE NEW CONTROL UNIT. 00757000
- * 00758000
- *. 00759000
- EJECT 00760000
- *********************************************************************** 00761000
- * 00762000
- * FIND THE NEXT LOGICAL PATH TO THE DEVICE 00763000
- * 00764000
- *********************************************************************** 00765000
- SPACE 2 00766000
- USING RCHBLOK,R6 @V407438 00767000
- USING RCUBLOK,R7 @V407438 00768000
- USING RDEVBLOK,R8 @V407438 00769000
- USING DMKSCNNP,R15 @V407438 00770000
- SPACE 00771000
- ENTRY DMKSCNNP @V407438 00772000
- DMKSCNNP STM R3,R7,BALR3 SAVE REGS IN BALRSAVE AREA @V407438 00773000
- LA R3,RCUCHA ADDRESS OF FIRST EXAMINED CHAN @V407438 00774000
- LA R4,4 INCREMENT @V407438 00775000
- LA R5,RCUCHC ADDRESS OF THE LAST EXAMINED CHAN@V407438 00776000
- CL R6,0(R3) IS THIS THE CURRENT CHANNEL? @V407438 00777000
- BE NXTCH YES, BR @V407438 00778000
- BXLE R3,R4,*-8 KEEP LOOKING @V407438 00779000
- CHKNXTCU CL R7,RDEVCUA DOES R7 REPRESENT 1ST CTL UNIT? @V407438 00780000
- BE NXTCU YES, GO GET NEXT CTL UNIT @V407438 00781000
- L R3,RDEVCUA MAKE SURE PLEASE... @V407438 00782000
- CL R7,RCUPRIME-RCUBLOK(R3) ... @V407438 00783000
- BE NXTCU FOUND IT, GO GET NEXT CTL UNIT @V407438 00784000
- NPCC1 TM *,X'FF' NO MORE PATHS, BR. @V407438 00785000
- LM R3,R7,BALR3 RESTORE REGS @V407438 00786000
- BR R14 RETURN TO CALLER @V407438 00787000
- SPACE 00788000
- NXTCU L R7,RDEVCUB GET NEXT CTL UNIT @V407438 00789000
- LTR R7,R7 IS IT REALLY THERE? @V407438 00790000
- BZ NPCC1 NOPE, NO MORE PATHS, BR. @V407438 00791000
- TM RCUTYPE,RCUSUB IS THIS A SUBORDINATE? @V407438 00792000
- BZ *+8 NOPE, BR. @V407438 00793000
- L R7,RCUPRIME ADDRESS THE PRIME CTL UNIT @V407438 00794000
- L R6,RCUCHA GET THE NEXT PATH CHANNEL BLOCK @V407438 00795000
- NPCC0 LM R3,R5,BALR3 RESTORE CLOBBERED REGS @V407438 00796000
- TM *+1,X'00' SET CC0 @V407438 00797000
- BR R14 RETURN TO CALLER @V407438 00798000
- SPACE 00799000
- NXTCH L R6,4(R3) GET THE NEXT CHANNEL @V407438 00800000
- LTR R6,R6 DOES THIS CHANNEL EXIST? @V407438 00801000
- BZ CHKNXTCU NOPE, TRY FOR NEXT CU @V407438 00802000
- B NPCC0 YES, EXIT WITH CC0 (R7 UNCHANGED)@V407438 00803000
- DROP R6,R7,R8 NO MORE RBLOKS @V407438 00804000
- EJECT 00805000
- *. 00806000
- * SUBROUTINE NAME - 00807000
- * 00808000
- * DMKSCNVD 00809000
- * 00810000
- * FUNCTION - 00811000
- * 00812000
- * TO COMPUTE A FULL VIRTUAL DEVICE ADDRESS (IN CCU FORM), PLUS 00813000
- * THE ADDRESSES OF THE VIRTUAL CHANNEL AND CONTROL UNIT BLOCKS, 00814000
- * FROM A SPECIFIED VIRTUAL DEVICE BLOCK. 00815000
- * 00816000
- * ATTRIBUTES - 00817000
- * 00818000
- * REENTRANT, RESIDENT, CALL VIA BALR 00819000
- * 00820000
- * ENTRY POINT - 00821000
- * 00822000
- * DMKSCNVD 00823000
- * 00824000
- * ENTRY CONDITIONS - 00825000
- * 00826000
- * GPR 8 = ADDRESS OF VIRTUAL DEVICE BLOCK 00827000
- * GPR 11 = ADDRESS OF USER'S VMBLOK 00828000
- * GPR 14 = RETURN REGISTER 00829000
- * GPR 15 = ADDRESS OF DMKSCNVD 00830000
- * 00831000
- * EXIT CONDITIONS - 00832000
- * 00833000
- * IF SUCCESSFUL: 00834000
- * 00835000
- * CC = 0 00836000
- * 00837000
- * GPR 1 HOLDS VIRTUAL DEVICE ADDRESS IN CCU FORM (BITS 16-31) 00838000
- * GPR 6 = ADDRESS OF VIRTUAL CHANNEL BLOCK 00839000
- * GPR 7 = ADDRESS OF VIRTUAL CONTROL UNIT BLOCK 00840000
- * GPR 8 = ADDRESS OF VIRTUAL DEVICE BLOCK (SAME AS AT ENTRY) 00841000
- * GPR 15 = 0 00842000
- * 00843000
- * IF NOT FOUND: 00844000
- * 00845000
- * CC = 1, AND ALL REGISTERS SAME AS AT ENTRY. 00846000
- * 00847000
- * CALLS TO OTHER ROUTINES - 00848000
- * 00849000
- * NONE 00850000
- * 00851000
- * EXTERNAL REFERENCES - 00852000
- * 00853000
- * NONE 00854000
- EJECT 00855000
- * TABLES / WORK AREAS 00856000
- * 00857000
- * 00858000
- * BALR1-BALR8 OF BALRSAVE USED TO SAVE GPR 1 - 8 00859000
- * 00860000
- * REGISTER USAGE - 00861000
- * 00862000
- * GPR 1 = WORK REGISTER, & FINALLY COMPUTED CCU DEVICE ADDRESS 00863000
- * GPRS 2-5 = INDEXING REGISTERS FOR BXLE LOOPS 00864000
- * GPR 6 = ADDRESS OF VCHBLOK 00865000
- * GPR 7 = ADDRESS OF VCUBLOK 00866000
- * GPR 8 = ADDRESS OF VDEVBLOK 00867000
- * GPR 11 = ADDRESS OF USER'S VMBLOK 00868000
- * GPR 14 = RETURN REGISTER 00869000
- * GPR 15 = BASE REGISTER 00870000
- * 00871000
- * GPRS 0, 9-10, AND 12-13 ARE NOT USED. 00872000
- * 00873000
- * NOTES - 00874000
- * 00875000
- * NONE 00876000
- * 00877000
- * OPERATION - 00878000
- * 00879000
- * INDEXES THRU THE VIRTUAL CHANNEL AND CONTROL UNIT BLOCKS 00880000
- * LOOKING FOR AN INDEX WHICH MATCHES THE GIVEN DEVICE ADDRESS; 00881000
- * IF FOUND, COMPUTES VIRTUAL DEVICE BLOCK FOR THAT COMBINATION; 00882000
- * IF IT MATCHES GPR 8 AT INPUT, THE DESIRED CCU DEVICE ADDRESS 00883000
- * IS COMPUTED, AND EXIT MADE. IF NOT, THE REMAINING 00884000
- * VIRTUAL BLOCKS ARE SEARCHED UNTIL A MATCH IS FOUND, OR UNTIL 00885000
- * ALL BLOCKS HAVE BEEN EXHAUSTED (AN ERROR CONDITION). 00886000
- *. 00887000
- EJECT 00888000
- *********************************************************************** 00889000
- * 00890000
- * COMPUTE VIRTUAL DEVICE ADDRESS IN CCU FORM, ETC. 00891000
- * 00892000
- *********************************************************************** 00893000
- SPACE 3 00894000
- USING VDEVBLOK,R8 00895000
- USING VMBLOK,R11 00896000
- USING DMKSCNVD,R15 00897000
- ENTRY DMKSCNVD 00898000
- DMKSCNVD STM R1,R8,BALR1 ENTER, SAVE NEEDED REGISTERS 00899000
- LH R3,VDEVADD VIRTUAL DEVICE ADDRESS BITS INTO R3, 00900000
- ALR R3,R3 DOUBLE IT TO FORM CU/DEV INDEX HALFWORD 00901000
- LA R4,2 LOAD INDEX INCREMENT 00902000
- LA R5,30 LOAD INDEX COMPARAND 00903000
- SR R1,R1 ZERO VMCHTBL INDEX 00904000
- SCNNCH LH R6,VMCHTBL(R1) LOAD NEXT CHANNEL BLOK INDEX 00905000
- LTR R6,R6 DOES CHANNEL EXIST ? 00906000
- BM SCNXCH NO, INDEX TO NEXT ONE 00907000
- A R6,VMCHSTRT POINT TO VCHBLOK 00908000
- USING VCHBLOK,R6 00909000
- SR R2,R2 ZERO VCHCUTBL INDEX 00910000
- SCNNCU LH R7,VCHCUTBL(R2) LOAD NEXT CU BLOK INDEX 00911000
- LTR R7,R7 DOES CONTROL UNIT EXIST 00912000
- BM SCNXCU NO, INDEX TO NEXT ONE 00913000
- A R7,VMCUSTRT POINT TO VCUBLOK 00914000
- USING VCUBLOK,R7 00915000
- LH R8,VCUDVTBL(R3) LOAD DEVICE BLOK INDEX 00916000
- LTR R8,R8 DOES DEVICE EXIST ? 00917000
- BM SCNXCU NO, INDEX TO NEXT CONTROL UNIT 00918000
- A R8,VMDVSTRT POINT TO VDEVBLOK 00919000
- C R8,BALR8 IS IT THE ONE WE WERE LOOKING FOR? 00920000
- BE SCNFOUND YES - GOOD SHOW. 00921000
- SCNXCU BXLE R2,R4,SCNNCU BRANCH IF MORE CONTROL UNITS ON THIS CHAN 00922000
- SCNXCH BXLE R1,R4,SCNNCH BRANCH IF MORE CHANNELS ON THIS MACHINE 00923000
- LM R1,R8,BALR1 NOT FOUND - SOMEBODY GOOFED; RESTORE REGS 00924000
- B SETCC1 GO SET CONDITION-CODE 1 AND EXIT. 00925000
- SPACE 00926000
- * WE HAVE FOUND ALL THREE BLOCKS ASSOCIATED WITH THE DEVICE: 00927000
- SCNFOUND LH R1,VCHADD GET CHANNEL BITS, 00928000
- AH R1,VCUADD 'OR' IN CONTROL UNIT BITS, 00929000
- AH R1,VDEVADD AND DEVICE BITS 00930000
- LM R2,R5,BALR2 RESTORE R2 THRU R5, 00931000
- SR R15,R15 CLEAR CONDITION-CODE, 00932000
- BR R14 AND RETURN TO CALLER. 00933000
- * 00934000
- DROP R6,R7,R8,R11 00935000
- EJECT 00936000
- *. 00937000
- * SUBROUTINE NAME - 00938000
- * 00939000
- * DMKSCNAU - FIND THE VMBLOK WITH A GIVEN USERID 00940000
- * 00941000
- * FUNCTION - 00942000
- * 00943000
- * TO SEARCH THE CHAIN OF VMBLOKS FOR ONE WHOSE USERID MATCHES 00944000
- * THE ONE POINTED TO BY REGISTER 1. 00945000
- * 00946000
- * ATTRIBUTES - 00947000
- * 00948000
- * REENTRANT, RESIDENT, CALLED VIA BALR 00949000
- * 00950000
- * ENTRY POINT - 00951000
- * 00952000
- * DMKSCNAU 00953000
- * 00954000
- * ENTRY CONDITIONS - 00955000
- * 00956000
- * GPR 0 CONTAINS THE LENGTH OF THE USERID 00957000
- * GPR 1 POINTS TO A USERID WHOSE VMBLOK IS TO BE FOUND 00958000
- * GPR 14 = RETURN ADDRESS 00959000
- * GPR 15 = ADDRESS OF DMKSCNAU 00960000
- * 00961000
- * EXIT CONDITIONS - 00962000
- * 00963000
- * CC = 0 IF A MATCHING VMBLOK IS FOUND (GPR 1 IS VALID) 00964000
- * CC = 1 IF NO MATCH IS FOUND (GPR 1 NOT VALID) 00965000
- * CC = 2 IF LENGTH OF USERID < 1 OR > 8 (CALLING ERROR) 00966000
- * CC = 3 IF VMBLOK FOUND BUT IN LOGON OR LOGOFF, 00967000
- * (GPR1 IS VALID). 00968000
- * 00969000
- * GPR 1 POINTS TO THE VMBLOK WITH THE SPECIFIED USERID 00970000
- * 00971000
- * CALLS TO OTHER ROUTINES - 00972000
- * 00973000
- * NONE 00974000
- * 00975000
- * EXTERNAL REFERENCES - 00976000
- * 00977000
- * ASYSVM - ADDRESS OF SYSTEM VMBLOK 00978000
- * 00979000
- * TABLES / WORK AREAS - 00980000
- * 00981000
- * THE FIRST 8 BYTES OF BALRSAVE ARE USED TO SAVE THE USERID 00982000
- * TO BE SEARCHED FOR. 00983000
- * 00984000
- * BALR2 - BALR4 (WITHIN BALRSAVE) ARE USED 00985000
- * TO SAVE REGISTERS 2 THRU 4. 00986000
- EJECT 00987000
- * REGISTER USAGE - 00988000
- * 00989000
- * GPR 1 = VMBLOK BASE REGISTER 00990000
- * GPR 2 = ADDRESS OF SYSTEM VMBLOK (STARTING/ENDING POINT) 00991000
- * GPR 3-4 USERID WHILE SEARCH IS BEING MADE 00992000
- * GPR 14 = RETURN ADDRESS 00993000
- * GPR 15 = BASE REGISTER 00994000
- * 00995000
- * GPRS 5-13 ARE NOT USED. 00996000
- * 00997000
- * NOTES - 00998000
- * 00999000
- * NONE 01000000
- * 01001000
- * OPERATION - 01002000
- * 01003000
- * 1. CHECKS NUMBER OF BYTES IN USERID 01004000
- * (ERROR IF NOT 1 TO 8 - CONDITION-CODE 2 RETURNED). 01005000
- * 01006000
- * 2. STARTING FROM THE SYSTEM VMBLOK, CHECKS ALL ACTIVE VMBLOKS 01007000
- * FOR A USERID WHICH MATCHES THAT SPECIFIED. RETURNS ADDRESS 01008000
- * OF MATCHING VMBLOK IF FOUND, BUT SETS CONDITION-CODE 3 01009000
- * IF THE USER IS IN LOGOFF STATUS (CONDITION-CODE 0 IF NOT). 01010000
- * 01011000
- * 3. RETURNS CONDITION-CODE 1 IF USERID WAS NOT FOUND. 01012000
- *. 01013000
- EJECT 01014000
- *********************************************************************** 01015000
- * * 01016000
- * FIND THE VMBLOK WITH A GIVEN USERID * 01017000
- * * 01018000
- *********************************************************************** 01019000
- SPACE 01020000
- ENTRY DMKSCNAU 01021000
- DMKSCNAU DS 0D (DBL-WORD-ALIGNED FOR BEST PERFORMANCE) 01022000
- USING *,R15 01023000
- STM R2,R4,BALR2 SAVE REGISTERS 2 THRU 4 01024000
- MVC BALRSAVE(8),BLANKS BLANK OUT FIELD BEFORE MOVE 01025000
- LR R2,R0 LOAD LENGTH OF USERID 01026000
- BCTR R2,0 SUBTRACT 1 FOR MVC INSTRUCTION 01027000
- CL R2,F7 LENGTH-1 MUST NOT EXCEED 7 01028000
- BH FINDEXIT ERROR (CONDITION-CODE 2) IF IT DOES. 01029000
- EX R2,BALRMVC MOVE USERID TO BALRSAVE 01030000
- L R1,ASYSVM START FROM SYSTEM VMBLOK 01031000
- USING VMBLOK,R1 01032000
- L R1,VMPNT START WITH 1ST USER POINTED TO BY SYSVM, 01033000
- LTR R2,R1 SAVE (& CHECK) STARTING VMBLOK ADDRESS 01034000
- BZ FINDREST IF NOBODY HOME AT ALL, EXIT WITH CC = 1. 01035000
- LM R3,R4,BALRSAVE USERID WE WANT TO MATCH INTO R3-R4 01036000
- FINDLOOP CL R3,VMUSER DOES 1ST HALF OF USERID MATCH ? 01037000
- BE FIND2ND YES, CHECK 2ND HALF (PROBABLY OK). 01038000
- FINDNEXT L R1,VMPNT LOAD NEXT VMBLOK ADDRESS 01039000
- CR R1,R2 ARE WE BACK AT THE BEGINNING ? 01040000
- BNE FINDLOOP NO, CONTINUE SEARCH 01041000
- FINDREST LM R2,R4,BALR2 IF NOT FOUND, RESTORE REGISTERS 2 THRU 4 01042000
- B SETCC1 SET CC = 1 AND RETURN TO CALLER 01043000
- SPACE 01044000
- FIND2ND CL R4,VMUSER+4 DOES 2ND HALF OF USERID MATCH ? 01045000
- BNE FINDNEXT IF NOT, GO CHECK NEXT VMBLOK. 01046000
- TM VMRSTAT,VMLOGOFF USER IN LOGOFF STATUS ? 01047000
- * NO, CC = 0 - YES, CC = 3 01048000
- BO FINDEXIT YES, GOOD ENOUGH. 01049000
- TM VMRSTAT,VMLOGON NOPE, THEN TRY LOGON TOO. 01050000
- FINDEXIT LM R2,R4,BALR2 RESTORE REGISTERS 2 THRU 4 01051000
- BR R14 RETURN TO CALLER 01052000
- DROP R1 01053000
- EJECT 01054000
- *. 01055000
- * SUBROUTINE NAME - 01056000
- * 01057000
- * DMKSCNFD - FIND THE NEXT FIELD IN THE INPUT BUFFER 01058000
- * 01059000
- * FUNCTION - 01060000
- * 01061000
- * TO FIND THE NEXT FIELD IN AN INPUT MESSAGE BUFFER. 01062000
- * 01063000
- * ATTRIBUTES - 01064000
- * 01065000
- * REENTRANT, RESIDENT, CALLED VIA BALR 01066000
- * 01067000
- * ENTRY POINT - 01068000
- * 01069000
- * DMKSCNFD 01070000
- * 01071000
- * ENTRY CONDITIONS - 01072000
- * 01073000
- * GPR 9 POINTS TO AN 18 DOUBLE WORD INPUT BUFFER. 01074000
- * GPR 11 CONTAINS THE USER'S VMBLOK ADDRESS 01075000
- * GPR 14 = RETURN ADDRESS 01076000
- * GPR 15 = ADDRESS OF DMKSCNFD 01077000
- * 01078000
- * THE LAST DOUBLE WORD OF THE INPUT BUFFER MUST CONTAIN THE 01079000
- * ADDRESS OF THE NEXT BYTE TO BE LOOKED AT AND A COUNT OF THE 01080000
- * REMAINING BYTES IN THE BUFFER. 01081000
- * 01082000
- * EXIT CONDITIONS - 01083000
- * 01084000
- * CC = 0 IF A FIELD IS FOUND 01085000
- * CC = 1 IF A LOGICAL CARRIAGE RETURN IF FOUND 01086000
- * CC = 2 IF THE END OF THE BUFFER IS REACHED 01087000
- * 01088000
- * GPR 0 CONTAINS THE NUMBER OF BYTES IN THE FIELD 01089000
- * GPR 1 POINTS TO THE FIRST BYTE OF THE FIELD 01090000
- * 01091000
- * THE LAST DOUBLE WORD OF THE INPUT BUFFER CONTAINS 01092000
- * THE UPDATED LOCATION POINTER AND COUNT. 01093000
- * 01094000
- * CALLS TO OTHER ROUTINES - 01095000
- * 01096000
- * NONE 01097000
- * 01098000
- * EXTERNAL REFERENCES - 01099000
- * 01100000
- * NONE 01101000
- * 01102000
- * TABLES / WORK AREAS - 01103000
- * 01104000
- * BALR2 - BALR5 (WITHIN BALRSAVE) ARE USED 01105000
- * TO SAVE REGISTERS 2 THRU 5. 01106000
- EJECT 01107000
- * REGISTER USAGE - 01108000
- * 01109000
- * GPR 0 = FIELD LENGTH 01110000
- * GPR 1 = START OF FIELD 01111000
- * GPR 2 = NEXT BYTE LOCATION 01112000
- * GPR 3 = BUFFER BYTE COUNT 01113000
- * GPR 4 = RDEVBLOK BASE REGISTER 01114000
- * GPR 5 = 1 01115000
- * GPR 9 = ADDRESS OF INPUT BUFFER 01116000
- * GPR 11 = ADDRESS OF VMBLOK 01117000
- * GPR 14 = RETURN ADDRESS 01118000
- * GPR 15 = BASE REGISTER 01119000
- * 01120000
- * GPRS 6-8, 10, & 12-13 ARE NOT USED. 01121000
- * 01122000
- * NOTES - 01123000
- * 01124000
- * NONE 01125000
- * 01126000
- * OPERATION 01127000
- * 01128000
- * 1. CHECKS TO SEE IF ANY BYTES AT ALL ARE LEFT IN INPUT BUFFER 01129000
- * (ERROR IF NOT - CONDITION-CODE 2 IS RETURNED). 01130000
- * 01131000
- * 2. SCANS REMAINING BYTES IN INPUT BUFFER FOR A NON-BLANK 01132000
- * CHARACTER. (CONDITION-CODE 2 IS RETURNED IF NO NON-BLANK 01133000
- * FIELD IS FOUND). 01134000
- * 01135000
- * 3. SCANS FIELD WHERE NON-BLANK CHARACTER WAS FOUND FOR A 01136000
- * LOGICAL CARRIAGE RETURN (DEFINED IN TERMINAL VDEVBLOK) 01137000
- * OR UNTIL NUMBER OF BYTES IS EXHAUSTED (WHICHEVER OCCURS 01138000
- * FIRST). 01139000
- * 01140000
- * 4. CHECKS NUMBER OF BYTES FOUND IN NON-BLANK FIELD. 01141000
- * (IF ZERO - ONLY POSSIBLE IF A LOGICAL CARRIAGE RETURN 01142000
- * WAS THE ONLY CHARACTER - RETURNS A CONDITION-CODE 1). 01143000
- * 01144000
- * 5. OTHERWISE, RETURNS ADDRESS OF NON-BLANK FIELD (IN GPR 1) 01145000
- * AND NUMBER OF BYTES IN FIELD (IN GPR 0) TO CALLER 01146000
- * (WITH CONDITION-CODE = 0). 01147000
- *. 01148000
- EJECT 01149000
- *********************************************************************** 01150000
- * * 01151000
- * SCAN FOR THE NEXT FIELD IN THE INPUT BUFFER * 01152000
- * * 01153000
- *********************************************************************** 01154000
- SPACE 01155000
- ENTRY DMKSCNFD 01156000
- DMKSCNFD DS 0D (DBL-WORD-ALIGNED FOR BEST PERFORMANCE) 01157000
- USING *,R15 01158000
- USING BUFFER,R9 01159000
- USING VMBLOK,R11 01160000
- STM R2,R5,BALR2 SAVE REGISTERS 2 THRU 5 01161000
- LM R2,R3,BUFNXT LOAD BUFFER POINTER AND COUNT 01162000
- LTR R3,R3 IS THE COUNT ZERO ? 01163000
- BNP SCANZERO YES, INDICATE END OF BUFFER 01164000
- LA R5,1 SET R5 = 1 FOR INCREMENTING USE 01165000
- LA R2,0(,R2) CLEAR HIGH ORDER BYTE 01166000
- SCANFRST CLI 0(R2),C' ' IS THIS THE START OF A FIELD ? 01167000
- BNE SCANSTRT BRANCH IF YES 01168000
- AR R2,R5 POINT TO NEXT BYTE 01169000
- BCT R3,SCANFRST SUBTRACT 1 FROM COUNT - BRANCH IF MORE 01170000
- STM R2,R3,BUFNXT SAVE NEW BUFFER POINTER AND COUNT 01171000
- SCANZERO LM R2,R5,BALR2 RESTORE REGISTERS 2 THRU 5 01172000
- B SETCC2 GO SET CC = 2 AND RETURN TO CALLER. 01173000
- CNOP 2,8 DBL-WORD-ALIGN 'SCANLAST' LOOP BELOW 01174000
- SCANSTRT LR R1,R2 SAVE POINTER TO START OF FIELD 01175000
- SCANLAST CLI 0(R2),C' ' IS THIS THE END OF THE FIELD ? 01176000
- BE SCANLEND BRANCH IF YES 01177000
- CLI 0(R2),X'15' IS THIS THE END OF THE LOGICAL LINE ? 01178000
- BE SCANLEND BRANCH IF YES 01179000
- AR R2,R5 POINT TO NEXT BYTE 01180000
- BCT R3,SCANLAST SUBTRACT 1 FROM COUNT - BRANCH IF MORE 01181000
- SCANLEND STM R2,R3,BUFNXT SAVE NEW BUFFER POINTER AND COUNT 01182000
- SR R2,R1 COMPUTE THE LENGTH OF THE FIELD 01183000
- LR R0,R2 SAVE IN GPR 0 01184000
- LM R2,R5,BALR2 RESTORE REGISTERS 2 THRU 5 01185000
- BZ SETCC1 BRANCH IF ZERO LENGTH 01186000
- SR R15,R15 SET CC = 0 (AND CLEAR R15) 01187000
- BR R14 AND RETURN TO CALLER. 01188000
- SPACE 01189000
- DROP R9,R11 01190000
- EJECT 01191000
- *. 01192000
- * SUBROUTINE NAME - 01193000
- * 01194000
- * DMKSCNLI - SEARCH VIRTUAL MACHINES FOR LINKS TO GIVEN MINIDISK 01195000
- * 01196000
- * FUNCTION - 01197000
- * 01198000
- * TO SEARCH THE LOGGED ON VIRTUAL MACHINES FOR ANY LINKS TO 01199000
- * A SPECIFIED MINIDISK. A LINK IS ANY VIRTUAL DEVICE WHOSE 01200000
- * RDEVBLOK POINTER & RELOCATION FACTOR MATCH THOSE SPECIFIED. 01201000
- * 01202000
- * ATTRIBUTES - 01203000
- * 01204000
- * REENTRANT, RESIDENT, CALLED VIA BALR 01205000
- * 01206000
- * ENTRY POINT - 01207000
- * 01208000
- * DMKSCNLI 01209000
- * 01210000
- * ENTRY CONDITIONS - 01211000
- * 01212000
- * GPR 1 CONTAINS THE ADDRESS OF THE RDEVBLOK 01213000
- * GPR 2 CONTAINS ADDRESS OF UDEVBLOK FOR DEVICE 01214000
- * GPR 11 CONTAINS THE VMBLOK ADDRESS OF CURRENT USER 01215000
- * GPR 14 = RETURN ADDRESS 01216000
- * GPR 15 = ADDRESS OF DMKSCNLI 01217000
- * 01218000
- * EXIT CONDITIONS - 01219000
- * 01220000
- * CC = 0 IF NO LINKS ARE FOUND. 01221000
- * CC = 1 IF ANY READ/ONLY LINKS ARE FOUND BUT NO WRITE LINKS. 01222000
- * CC = 2 IF ANY WRITE LINKS ARE FOUND. 01223000
- * 01224000
- * GPR 0 = NUMBER OF READ/ONLY LINKS. 01225000
- * GPR 1 = NUMBER OF WRITE LINKS. 01226000
- * GPR 2 = ADDRESS OF VDEVBLOK FOR A WRITE LINK, OR IF NONE, 01227000
- * ADDRESS OF VDEVBLOK FOR A READ/ONLY LINK, IF ANY. 01228000
- * GPR 3 = ADDRESS OF VMBLOK OF A R/O USER (IF ANY), OR ZERO 01229000
- * 01230000
- * CALLS TO OTHER ROUTINES - 01231000
- * 01232000
- * NONE 01233000
- * 01234000
- * EXTERNAL REFERENCES - 01235000
- * 01236000
- * NONE 01237000
- * 01238000
- * TABLES / WORK AREAS - 01239000
- * 01240000
- * BALR3 - BALR10 (WITHIN BALRSAVE) ARE USED 01241000
- * TO SAVE REGISTERS 3 THRU 10. 01242000
- EJECT 01243000
- * REGISTER USAGE - 01244000
- * 01245000
- * GPR 2 = POINTER TO VDEVBLOK FOR WRITE LINK 01246000
- * GPR 3 = NUMBER OF READ/ONLY LINKS FOUND 01247000
- * GPR 4 = NUMBER OF WRITE LINKS FOUND 01248000
- * GPR 5 = POINTER TO VDEVBLOK FOR 1ST LINK FOUND 01249000
- * GPR 6 = RELOCATION FACTOR OF VDEVBLOK BEING CHECKED 01250000
- * GPR 7 = SIZE IN BYTES OF ONE VDEVBLOK 01251000
- * GPR 8 = VIRTUAL DEVICE BLOCK ADDRESS 01252000
- * GPR 9 = SCRATCH 01253000
- * GPR 10 = VMBLOK ADDRESSES OF OTHER USERS BEING CHECKED 01254000
- * GPR 11 = VMBLOK ADDRESS OF CURRENT USER 01255000
- * GPR 14 = RETURN ADDRESS 01256000
- * GPR 15 = BASE REGISTER 01257000
- * 01258000
- * GPR 12-13 ARE NOT USED. 01259000
- * 01260000
- * NOTES - 01261000
- * 01262000
- * NONE 01263000
- * 01264000
- * OPERATION - 01265000
- * 01266000
- * 1. STARTS WITH VMBLOK SPECIFIED BY CALLER - GO TO STEP 2. 01267000
- * 01268000
- * 2. FOR EACH VMBLOK, SEARCHES ALL VIRTUAL DEVICE BLOCKS 01269000
- * FOR A VDEVREAL POINTER AND VDEVRELN RELOCATION FACTOR 01270000
- * MATCHING THAT SUPPLIED BY THE CALLER (IGNORING ANY DEDICATED 01271000
- * DASD DEVICES). IF FOUND, GO TO STEP 4. 01272000
- * 01273000
- * 3. IF NOT FOUND, REPEATS STEP 2 FOR ALL VMBLOKS UNTIL 01274000
- * THE CHAIN OF VMBLOKS IS EXHAUSTED. RETURNS CONDITION CODE 0 01275000
- * AND A ZERO VALUE IN GPR'S 0 THRU 3 IF NO LINKS WERE FOUND. 01276000
- * 01277000
- * 4. IF A LINK WAS FOUND (FROM STEP 2), REMEMBERS THE 01278000
- * VDEVBLOK CURRENTLY POINTED TO AS THE ANCHOR FOR THE CHAIN 01279000
- * OF LINKS, AND GO TO STEP 5. 01280000
- * 01281000
- * 5. CHECKS ALL LINKS IN THE CHAIN, COUNTING WRITE LINKS AND 01282000
- * READ LINKS. REMEMBERS WHERE ANY READ OR WRITE LINK WAS FOUND 01283000
- * (MOST RECENT ONE TAKING PRIORITY). 01284000
- * 01285000
- * 6. REPEATS STEP 5 UNTIL CHAIN HAS BEEN COMPLETELY SEARCHED. 01286000
- * IF THE CHAIN ANCHOR IS NOT FOUND, I.E., THE ANCHOR POINTS 01287000
- * INTO THE CHAIN BUT IS NOT PART OF IT, AN ABEND 1 IS ISSUED. 01288000
- * IF ANY WRITE LINKS WERE FOUND IN STEP 5, RETURNS THE ADDRESS 01289000
- * OF THE VDEVBLOK FOR THE MOST RECENT ONE FOUND, IN GPR 2. IF 01290000
- * NOT, RETURNS THE ADDRESS OF THE VDEVBLOK FOR THE FIRST READ 01291000
- * LINK FOUND, IN GPR 2 (ALSO RETURNING THE OWNER'S VMBLOK 01292000
- * ADDRESS IN GPR 3). IN ANY EVENT, RETURNS THE COUNT OF READ 01293000
- * LINKS IN GPR 0, AND WRITE LINKS IN GPR 1, AND THE CONDITION- 01294000
- * CODE 1 OR 2 AS APPROPRIATE (SEE EXIT CONDITIONS). 01295000
- *. 01296000
- EJECT 01297000
- *********************************************************************** 01298000
- * * 01299000
- * FIND ALL THE LINKS TO A GIVEN MINIDISK * 01300000
- * * 01301000
- *********************************************************************** 01302000
- SPACE 01303000
- ENTRY DMKSCNLI 01304000
- DMKSCNLI DS 0D (DBL-WORD-ALIGNED FOR BEST PERFORMANCE) 01305000
- USING *,R15 01306000
- STM R3,R10,BALR3 SAVE REGISTERS 3 THRU 10 01307000
- LR R6,R2 ACCESS UDEVBLOK VIA GPR 6 01308000
- USING UDEVBLOK,R6 01309000
- LM R2,R5,ZEROES CLEAR R2 THRU R5 01310000
- ST R3,BALR3 CLEAR R3 TO BE RETURNED TO CALLER 01311000
- LA R7,VDEVSIZE*8 R7 = SIZE IN BYTES OF ONE VDEVBLOK 01312000
- LR R10,R11 START WITH OURSELVES 01313000
- USING VMBLOK,R10 ... 01314000
- LINKLCNT LH R9,VMDVCNT COUNT OF HOW MANY VDEVBLOKS 01315000
- LTR R9,R9 (IF ANY) 01316000
- BNP LINKNUSR TRF IF NONE AT ALL - TRY NEXT USER. 01317000
- L R8,VMDVSTRT POINT TO BLOCK OF VIRTUAL DEVICE(S) 01318000
- USING VDEVBLOK,R8 ... 01319000
- LINKCKAD TM VDEVADD,X'80' BEWARE OF NULL BLOCK (MINUS SIGN THERE) 01320000
- BO LINKNVDV TRF IF YES - LOOK AT NEXT ONE. 01321000
- TM VDEVTYPC,CLASDASD IT IT A DASD DEVICE @VA01026 01322000
- BZ LINKNVDV NO, SKIP THIS ONE @VA01026 01323000
- CL R1,VDEVREAL DOES CALLER'S R1 MATCH REAL DEV. BLOCK ? 01324000
- BE LINKFIND TRF IF YES - CHECK IT. 01325000
- LINKNVDV AR R8,R7 ADVANCE TO NEXT BLOCK IN THE GROUP 01326000
- BCT R9,LINKCKAD ITERATE THRU BLOCKS IN THE GROUP. 01327000
- LINKNUSR L R10,VMPNT GET NEXT USER IN CHAIN OF VMBLOKS 01328000
- CR R10,R11 END? 01329000
- BNE LINKLCNT NO 01330000
- LINKRETN LR R0,R3 COUNT OF R/O LINK(S) INTO R0, 01331000
- LTR R1,R4 COUNT OF WRITE LINK(S) INTO R1 01332000
- BP LINKEXIT IF PLUS, EXIT WITH COND. CODE = 2 01333000
- LR R2,R5 POINTER TO VDEVBLOK (IF ANY) INTO R2, 01334000
- LCR R3,R0 IF 0, SET COND. CODE 0 OR 1 PER R0 01335000
- LINKEXIT LM R3,R10,BALR3 RESTORE NECESSARY REGISTERS 01336000
- BR R14 AND EXIT TO CALLER. 01337000
- SPACE 01338000
- LINKFIND LH R0,VDEVRELN RELOCATION FACTOR INTO R0 01339000
- CH R0,UDEVRELN DOES IT MATCH CALLER'S ? 01340000
- BNE LINKNVDV TRF IT NOT - FORGET IT. 01341000
- TM VDEVSTAT,VDEVDED IS THIS A DEDICATED DEVICE ? 01342000
- BO LINKNVDV IF YES, FORGET IT. 01343000
- TM VDEVFLAG,VDEVTDSK @VA11217 01343300
- BO LINKNVDV @VA11217 01343600
- CLI VDEVTYPE,TYP2311 MIGHT THIS BE A PSEUDO-2311 ? 01344000
- BNE LINKFUND NO - FOUND A LINK 01345000
- IC R0,UDEVFTR GET 'FTR2311T,FTR2311B' BITS, IF ANY 01346000
- N R0,=A(FTR2311T+FTR2311B) ...AND ONLY THOSE BITS 01347000
- BZ LINKFUND IT'S A REAL 2311 01348000
- N R0,VDEVFLAG-3 SAME DEVICE IF FLAGS MATCH... 01349000
- BZ LINKNVDV NO MATCH - DIFFERENT DEVICE 01350000
- LINKFUND EQU * FOUND A LINK TO SAME MDISK 01351000
- USING RDEVBLOK,R1 @VA03170 01352000
- LH R1,RDEVLNKS SET UPPER LIMIT ON LOOP @VA03170 01353000
- DROP R1 @VA03170 01354000
- LR R5,R8 REMEMBER WHERE WE FOUND THE FIRST ONE 01355000
- LA R9,1 1 INTO R9 FOR BUMPING COUNTS 01356000
- ALR R1,R9 BUMP LIMIT FOR EXTRA MEASURE @VA03170 01357000
- LINKNEXT TM VDEVFLAG,VDEVRDO IS IT READ-ONLY? 01358000
- BO LINKREAD TRF IF YES. 01359000
- LR R2,R8 REMEMBER WHERE WRITE DISK WAS 01360000
- AR R4,R9 BUMP COUNT OF WRITE LINK(S) FOUND 01361000
- B LINKCONT GO LOOK FOR NEXT VDEVBLOK. 01362000
- SPACE 01363000
- LINKREAD AR R3,R9 BUMP COUNT OF READ LINK(S) FOUND 01364000
- MVC BALR3(4),VDEVUSER RETURN VMBLOK ADDR OF R/O USER IN R3 01365000
- LINKCONT L R8,VDEVLINK POINT TO NEXT VDEVBLOK 01366000
- CR R8,R5 ARE WE BACK WHERE WE STARTED ? 01367000
- BE LINKRETN FOUND THE START OF THE CHAIN @VA03170 01368000
- BCT R1,LINKNEXT CHECK THE NEXT LINK @VA03170 01369000
- ABEND 1 @VA03170 01370000
- DROP R8,R10 01371000
- EJECT 01372000
- * COMMON CODE TO SET THE CONDITION-CODE TO 1, 2, OR 3 01373000
- * AND RETURN TO THE CALLER VIA R14: 01374000
- SPACE 01375000
- DROP R15 (ADDRESSABILITY DOES NOT MATTER) 01376000
- SPACE 2 01377000
- SETCC1 CLI F0,X'FF' SET CC = 1 01378000
- BR R14 RETURN TO CALLER 01379000
- SPACE 3 01380000
- SETCC2 CLI FFS,X'00' SET CC = 2 %V3M4038 01381000
- BR R14 RETURN TO CALLER %V3M4038 01382000
- SPACE 3 01383000
- SETCC3A L R8,FFS MAKE REG 8 NEG. %VA05925 01384000
- SETCC3 TM FFS,X'FF' SET CC = 3 %V3M4038 01385000
- BR R14 RETURN TO CALLER %V3M4038 01386000
- SPACE 3 01387000
- BALRMVC MVC BALRSAVE(0),0(R1) EXECUTED TO MOVE STUFF TO BALRSAVE 01388000
- SPACE 3 01389000
- LTORG - IF ANY - 01390000
- EJECT 01391000
- *. SUBROUTINE NAME - 01392000
- * 01393000
- * DMKSCNRN 01394000
- * 01395000
- * FUNCTION - 01396000
- * 01397000
- * RETURN TO THE CALLER THE NAME OF THE DEVICE IN GPR 1 01398000
- * 01399000
- * ENTRY POINT - 01400000
- * 01401000
- * DMKSCNRN - DEVICE NAME FOR A GIVEN REAL DEVICE 01402000
- * DMKSCNVN - DEVICE NAME FOR A GIVEN VIRTUAL DEVICE 01403000
- * 01404000
- * ENTRY CONDITIONS - 01405000
- * 01406000
- * GPR 8 ADDRESS OF THE RDEVBLOK (DMKSCNRN) 01407000
- * GPR 8 ADDRESS OF THE VDEVBLOK (DMKSCNVN) 01408000
- * GPR 14 RETURN ADDRESS 01409000
- * GPR 15 ADDRESS OF DMKSCNRN 01410000
- * 01411000
- * EXIT CONDITION 01412000
- * 01413000
- * GPR 8 UNCHANGED 01414000
- * GPR 14 UNCHANGED 01415000
- * GPR 1 CONTAINS THE NAME OF THE DEVICE 01416000
- * 01417000
- * CALLS TO OTHER ROUTINES - 01418000
- * 01419000
- * NONE 01420000
- * 01421000
- * EXTERNAL REFERENCES - 01422000
- * 01423000
- * NONE 01424000
- * 01425000
- * TABLES / WORK AREAS 01426000
- * 01427000
- * BALR2-BALR4 OF BALRSAVE USED FOR GPRS 2 - 4 01428000
- * 01429000
- * REGISTER USAGE - 01430000
- * 01431000
- * GPR 2 = INDEX REG 01432000
- * GPR 3 = INDEX REG 01433000
- * GPR 8 = ADDRESS OF RDEVBLOK OR VDEVBLOK 01434000
- * GPR 14 = RETURN ADDRESS 01435000
- * GPR 15 = BASE REG. 01436000
- * 01437000
- * 01438000
- * NOTES - 01439000
- * 01440000
- * NONE 01441000
- EJECT 01442000
- * 01443000
- * OPERATION - 01444000
- * 01445000
- * USES THE DEVICE CLASS AND TYPE FIELDS IN THE DEVICE BLOCK 01446000
- * TO LOCATE THE CORRESPONDING DEVICE NAME. REGISTER 1 01447000
- * IS THEN LOADED WITH THIS NAME AND EXITS TO THE CALLER. 01448000
- *. 01449000
- SPACE 2 01450000
- ENTRY DMKSCNRN,DMKSCNVN 01451000
- SPACE 01452000
- USING DMKSCNRN,R15 COMMON BASE FOR SCNVN, SCNRN 01453000
- USING VDEVBLOK,R8 01454000
- SPACE 01455000
- DMKSCNVN STM R2,R4,BALR2 SAVE VOLATILE REGISTERS 01456000
- LA R4,VDEVTYPC POINT TO DEVICE CLASS, TYPE FIELDS 01457000
- LA R15,DMKSCNRN-DMKSCNVN(0,R15) ADJUST ADDRESSABILITY 01458000
- B SCNRNINT JOIN COMMON LOGIC 01459000
- SPACE 01460000
- USING RDEVBLOK,R8 SWITCH TO REAL DEVICE BLOCK 01461000
- DMKSCNRN STM R2,R4,BALR2 SAVE VOLATILE REGISTERS 01462000
- LA R4,RDEVTYPC POINT TO DEVICE CLASS, TYPE FIELDS 01463000
- DROP R8 01464000
- SCNRNINT SR R2,R2 CLEAR WORK REGISTER 01465000
- SR R3,R3 ZERO 01466000
- ICM R2,B'1000',0(R4) INSERT DEVICE CLASS 01467000
- SRL R2,1 CORRECTION FACTOR 01468000
- SCNRNDEV BXLE R2,R2,SCNRNFND BRANCH WHEN BIT IS SHIFTED OUT . 01469000
- LA R3,1(0,R3) COUNT NUMBER OF SHIFTS 01470000
- B SCNRNDEV LOOP THRU ALL POSSIBILITIES 01471000
- SCNRNFND TM 0(R4),CLASTERM LINE OR CONSOLE DEVICE ? 01472000
- BO SCNRNTRM IF LINE OR CONS BRANCH 01473000
- CLI 0(R4),CLASSPEC SPECIAL DEVICE CLASS ? 01474000
- BE SCNRNSPC YES - CHECK FOR CTCA 01475000
- TM 0(R4),CLASURO+CLASURI SPECIAL CASE FOR RDR/PRT/PUN 01476000
- BZ SCNRNEXT IF NOT UNIT RECORD, EXIT 01477000
- TM 0(R4),CLASURO CHECK FOR OUTPUT SPOOL DEVICE 01478000
- BNZ SCNRNURO BRANCH IF EITHER. 01479000
- TM 1(R4),TYPRDR IS DEVICE A CARD READER ? 01480000
- BO SCNRNEXT IF YES, BRANCH 01481000
- LA R3,4(0,R3) RE-ADJUST, UNSUPPORTED DEVICE 01482000
- B SCNRNEXT EXIT 01483000
- EJECT 01484000
- SCNRNTRM TM 1(R4),TYP2700+TYPTELE2+TYPIBM1+TYPSDLC @V67CDF1 01485000
- * IS IT A TP USAGE LINE ? 01485500
- BNZ SCNRNEXT YES, EXIT .INDEX POINTER IS CORRECT. 01486000
- CLI 1(R4),TYP3210 VIRTUAL MACHINE CONSOLE ? 01487000
- BNE SCNRNEXT BRANCH ON UNDEFINED TERMINALS. 01488000
- LA R3,8(0,R3) ADJUST INDEX FOR CONSOLE 01489000
- B SCNRNEXT EXIT. 01490000
- SCNRNURO TM 1(R4),TYPPUN TEST FOR PUNCH 01491000
- BO SCNRNEXT IF ITS A PUNCH, EXIT 01492000
- LA R3,3(0,R3) RE-ADJUST FOR 'DEV' UNSUPPORTED 01493000
- TM 1(R4),TYPPRT IS IT A PRINTER ? 01494000
- BZ SCNRNEXT NO - INDEX IS CORRECT 01495000
- LA R3,1(0,R3) ADJUST FOR SPOOL PRINTER 01496000
- B SCNRNEXT 01497000
- SCNRNSPC TM 1(R4),TYPCTCA+TYP3705+TYP3851 SUPPORTED DEVICE @V407466 01498000
- BZ SCNRNEXT NO -- R3 IS SET ALREADY@V200820 01499000
- LA R3,3(0,R3) POINT TO 'CTCA' @V200820 01500000
- CLI 1(R4),TYPCTCA IS THAT RIGHT ? @V200820 01501000
- BE SCNRNEXT YES - LET IT BE SO @V200820 01502000
- LA R3,1(0,R3) MUST BE A 3705 'CTLR' @V200820 01503000
- CLI 1(R4),TYP3705 3705 'CTLR' @V407466 01504000
- BE SCNRNEXT YES, LET IT BE SO @V407466 01505000
- LA R3,1(0,R3) POINT TO 'MSC ' @V407466 01506000
- SCNRNEXT SLL R3,2 MULTI INDEX VALUE BY 4 01507000
- L R1,SCNRNTBL(R3) LOAD DEVICE NAME INTO R 1 01508000
- LM R2,R4,BALR2 RESTORE REGS 2 - 4 01509000
- BR R14 RETURN TO CALLER. 01510000
- SPACE 2 01511000
- * THE FOLLOWING TABLE IS POSITIONAL AND SHOULD NOT BE CHANGED 01512000
- * 01513000
- SCNRNTBL DS 0F ALIGN 01514000
- DC CL4'LINE' CONSTANT 01515000
- DC CL4'GRAF' CONSTANT 01516000
- DC CL4'RDR ' CONSTANT 01517000
- DC CL4'PUN ' CONSTANT 01518000
- DC CL4'TAPE' CONSTANT 01519000
- DC CL4'DASD' CONSTANT 01520000
- DC CL4'DEV ' CONSTANT 01521000
- DC CL4'PRT ' CONSTANT 01522000
- DC CL4'CONS' CONSTANT 01523000
- DC CL4'CTCA' CONSTANT 01524000
- DC CL4'CTLR' CONSTANT @V200820 01525000
- DC CL4'MSC ' CONSTANT @V407466 01526000
- EJECT 01527000
- COPY DEVTYPES 01528000
- PSA 01529000
- COPY CONBUF 01530000
- COPY EQU 01531000
- COPY VMBLOK 01532000
- COPY RBLOKS 01533000
- COPY VBLOKS 01534000
- COPY UDIRECT 01535000
- END 01536000
ibm/vm370-lib/cp/dmkscn.assemble_src.txt ยท Last modified: 2023/08/06 13:37 by Site Administrator