ibm:vm370-lib:cp:dmkpgt.assemble_src
Table of Contents
DMKPGT Source
References
- Fixes Applied : 3
- This Source Date : Thursday, December 7, 1978
- Last Fix ID : [HRC106DK]
Source Listing
- DMKPGT.ASSEMBLE.txt
- PGT TITLE 'DMKPGT (CP) VM/370 - RELEASE 6' 00001000
- ISEQ 73,80 VALIDATE SEQUENCING OF INPUT 00002000
- *. 00003000
- * MODULE NAME - 00004000
- * 00005000
- * DMKPGT 00006000
- * 00007000
- * CONTENTS - 00008000
- * 00009000
- * DMKPGTPG - ALLOCATE ONE DASD PAGE FOR SYSTEM PAGING 00010000
- * DMKPGTSG - ALLOCATE ONE DASD PAGE FOR SYSTEM SPOOLING 00011000
- * DMKPGTPR - RELEASE ONE DASD PAGE FOR PAGING USE 00012000
- * DMKPGTSP - RELEASE ONE DASD PAGE FOR SYSTEM USE 00013000
- * DMKPGTSD - RELEASE ONE DASD PAGE FOR SPOOLING USE 00014000
- * DMKPGTSR - RELEASE A GROUP OF DASD PAGES FOR SPOOLING USE 00015000
- * DMKPGTCG - ALLOCATE CONTIGUOUS SPOOL SPACE FOR 370X DUMP 00016000
- * DMKPGTVG - ALLOCATE ONE PAGE OF SYSTEM VIRTUAL STORAGE 00017000
- * DMKPGTVR - RELEASE ONE PAGE OF SYSTEM VIRTUAL STORAGE 00018000
- *. 00019000
- EJECT 00020000
- COPY OPTIONS 00021000
- COPY LOCAL OPTIONS 00022000
- SPACE 2 00023000
- DMKPGT CSECT 00024000
- SPACE 3 00025000
- EXTRN DMKSTKCP,DMKCKP @V200820 00026000
- EXTRN DMKPTRXX @V408246 00026100
- EXTRN DMKSYSOW 00027000
- ENTRY DMKPGTTM,DMKPGT90 00028000
- ENTRY DMKPGTTU 00029000
- ENTRY DMKPGTP5,DMKPGTP0,DMKPGTP4 00030000
- ENTRY DMKPGT4P,DMKPGT4T @V2A2029 00031000
- ENTRY DMKPGT5P,DMKPGT5T @V304498 00032000
- ENTRY DMKPGT7P,DMKPGT7T 00032020
- ENTRY DMKPGT8P,DMKPGT8T 00032040
- ENTRY DMKPGTPM ENTRY FOR PAGE ALLOCATION IN @V408246 00032100
- * SPOOL 00032200
- ENTRY DMKPGTT5,DMKPGTT0,DMKPGTT4 00033000
- ENTRY DMKPGTDF FLAGS AND COUNT FOR DRUM MAX. @V408246 00033500
- SPACE 00034000
- ENTRY DMKPGTPG,DMKPGTBN @VA00919 00035000
- SPACE 3 00036000
- USING PSA,R0 00037000
- USING RECBLOK,R6 00038000
- USING RDEVBLOK,R8 00039000
- USING ALOCBLOK,R10 00040000
- SPACE 00041000
- EJECT 00042000
- *. 00043000
- * 00044000
- * SUBROUTINE NAME - 00045000
- * 00046000
- * DMKPGTPG 00047000
- * 00048000
- * FUNCTION - 00049000
- * 00050000
- * TO ALLOCATE A PAGE OF DASD SPACE THAT IS TO BE USED FOR EITHER 00051000
- * VIRTUAL MEMORY PAGING OR FOR SPOOL FILE PAGE BUFFERS 00052000
- * 00053000
- * ATTRIBUTES - 00054000
- * 00055000
- * SERIALLY REUSABLE, RESIDENT, CALLED VIA BALR 00056500
- * 00057000
- * ENTRY POINTS - 00058000
- * 00059000
- * DMKPGTPG - TO OBTAIN A DASD PAGE FOR VIRTUAL MEMORY PAGING 00060000
- * DMKPGTSG - TO OBTAIN A DASD PAGE FOR A SPOOL FILE RECORD 00061000
- * 00062000
- * DMKPGTP5,DMKPGTP0,DMKPGT4P,DMKPGT5P,DMKPGTP4,DMKPGT7P HRC106DK 00062100
- * AND DMKPGT8P ARE ANCHOR CHAINS OF PREFERRED PAGING HRC106DK 00063100
- * DEVICES, THEY ARE INITIALIZED BY DMKCPI,DMKPGTT5, HRC106DK 00064100
- * DMKPGTT0,DMKPGT4T,DMKPGT5T,DMKPGTT4,DMKPGT7T AND HRC106DK 00065100
- * DMKPGT8T ARE ANCHORS FOR CHAINS CONNECTING ALL OTHER HRC106DK 00066100
- * DEVICE BLOKS WITH OWNED VOLUMES MOUNTED. HRC106DK 00067100
- * 00068000
- * DMKPGTTM,DMKPGTTU AND DMKPGT90 HOLD THE MAXIMUM, USED, AND 00069000
- * 90 PERCENT OF THE MAXIMUM NUMBER OF TEMPORARY CYLINDERS 00070000
- * THAT ARE AVAILABLE. THEY ARE INITIALIZED BY DMKCPI AND 00071000
- * MAINTAINED BY BY ATTACHED (DMKVDB). 00072000
- * 00073000
- * ENTRY CONDITIONS - 00074000
- * 00075000
- * GPR12 = DMKPGT BASE REGISTER 00076000
- * GPR13 = ADDRESS OF STANDARD SAVEAREA 00077000
- * 00078000
- * EXIT CONDITIONS - 00079000
- * 00080000
- * NORMAL - 00081000
- * IF A PAGE IS AVAILABLE, THE CALLER'S GPR1 WILL CONTAIN THE 00082000
- * COMPRESSED DASD ADDRESS OF THE PAGE IN THE FORM (CCPD), 00083000
- * WHERE CC IS THE CYLINDER NUMBER, P IS THE PAGE NUMBER ON THE 00084000
- * CYLINDER, AND D IS THE DEVICE CODE INDEX INTO THE OWNED LIST 00085000
- * 00086000
- * ERROR - 00087000
- * IF NO PAGE IS AVAILABLE, THE CALLER'S GPR1 IS SET TO ZERO 00088000
- * 00089000
- * CALLS TO OTHER ROUTINES - 00090000
- * 00091000
- * DMKFREE - TO OBTAIN FREE STORAGE IN WHICH TO CONSTRUCT NEW 00092000
- * RECORD ALLOCATION BLOKS 00093000
- * DMKQCNWT - TO WARN THE OPERATOR OF IMPENDING EXHAUSTION OF 00094000
- * SYSTEM SPOOL SPACE 00095000
- * 00096000
- * DMKSTKCP - TO STACK A CPEXBLOK 00097000
- EJECT 00098000
- * EXTERNAL REFERENCES - 00099000
- * 00100000
- * NONE 00101000
- * 00102000
- * TABLES / WORKAREAS 00103000
- * 00104000
- * NONE 00105000
- * 00106000
- * REGISTER USAGE - 00107000
- * 00108000
- * GPR0,1 ARE WORK REGISTERS 00109000
- * GPR2 = FUNCTION REGISTER FOR TRT 00110000
- * GPR3 = INDICATOR FOR SPOOLING OR PAGING ALLOCATION; FOR 00111000
- * VIRTUAL MEMORY PAGING, GPR3 = 0, FOR SPOOLING, 00112000
- * GPR3 = 4 00113000
- * GPR4 = ADDRESS OF POINTER TO CHAIN OF OWNED DEVICES 00114000
- * GPR5,6, AND 7 ARE WORK REGISTERS 00115000
- * GPR8 = ADDRESS OF RDEVBLOK FOR DEVICE ON WHICH SPACE IS 00116000
- * BEING ALLOCATED 00117000
- * GPR9 = BACKCHAIN POINTER FOR RECBLOKS 00118000
- * GPR10 = ADDRESS OF ALOCBLOK 00119000
- * GPR11 IS NOT USED 00120000
- * GPR12 = DMKPGT BASE REGISTER 00121000
- * GPR13 = ADDRESS OF STANDARD SAVEAREA 00122000
- * GPR14,15 USED FOR BALR LINKAGE TO FREE 00123000
- * 00124000
- * 00125000
- * NOTES - 00126000
- * 00127000
- * NONE 00128000
- * 00129000
- * OPERATION - 00130000
- * 00131000
- * 1. POINT TO FIRST DEVICE TYPE ANCHOR FOR OWNED DEVICES 00132000
- * 00133000
- * 2. LOCATE THE RDEVBLOK FOR THE NEXT DEVICE WITH TEMPSPACE 00134000
- * ALLOCATED ON IT 00135000
- * 00136000
- * 3. POINT TO THE PROPER RECBLOK ANCHOR (FOR EITHER PAGING OR 00137000
- * SPOOLING) AND LOCATE THE FIRST RECBLOK WITH AN AVAIL- 00138000
- * BLE PAGE. IF A RECBLOK IS FOUND, GO TO STEP 6 00139000
- * 00140000
- * 4. IF NO ALLOCATED CYLINDER HAS AN AVAILABLE PAGE, LOCATE THE 00141000
- * THE NEXT AVAILABLE CYLINDER, WORKING OUTWARD FROM THE 00142000
- * CENTER OF THE TEMPSPACE AREA. IF NO CYLINDER IS AVAILABLE, 00143000
- * GO TO STEP 2; OTHERWISE, CONTINUE 00144000
- * 00145000
- * 5. CONSTRUCT A NEW RECBLOK FOR THE ALLOCATED CYLINDER, AND 00146000
- * CHAIN IT TO THE END OF THE CURRENT CHAIN 00147000
- * 00148000
- * 6. CALCULATE THE ADDRESS OF THE ALLOCATED PAGE, MARK IT AS 00149000
- * ALLOCATED, AND PASS THE ADDRESS BACK TO THE CALLER 00150000
- * 00151000
- * MESSAGES - 00152000
- * DMKPGT401I SYSTEM TEMP SPACE 90 PERCENT FULL 00153000
- * DMKPGT400I SYSTEM TEMP SPACE FULL 00154000
- *. 00155000
- * 00156000
- SPACE 3 00157000
- USING *,R15 00158000
- DMKPGTPG STM R0,R15,BALRSAVE SAVE ALL REGS 00159000
- LR R12,R15 STANDARD ADDRESSABILITY 00160000
- DROP R15 00161000
- USING DMKPGT,R12 00162000
- SR R3,R3 CLEAR DEVICE CHAIN INDEX 00163000
- CLC CPID,=C'CPCP' ARE WE STILL WITHIN DMKCPI LOGIC 00164000
- BNE NOSPACE IF YES, DON'T INCREASE FREELIST PAGES 00165000
- LA R4,DMKPGTP5-4 POINT TO PAGING DEVICE CHAIN 00166000
- CLI DRMLIM,0 DRUM LIMITS? @V408246 00166100
- BE PGTINIT NO @V408246 00166200
- USING VMBLOK,R11 @V408246 00166300
- CLC VMPDRUM,DRMLIM+2 THIS USER AT LIMIT? @V408246 00166400
- BL PGTINIT NO @V408246 00166500
- DROP R11 @V408246 00166600
- LA R4,4(,R4) YES, BYPASS DRUM ALLOCATION @V408246 00166700
- B PGTINIT GO INITIALIZE BLOK REGS 00167000
- SPACE 3 00167100
- USING DMKPGTPM,R15 @V408246 00167200
- DMKPGTPM DS 0H @V408246 00167300
- STM R0,R15,BALRSAVE @V408246 00167400
- L R12,=A(DMKPGT) @V408246 00167500
- SR R3,R3 CLEAR FOR PAGE CHAIN @V408246 00167600
- B PGTINIX START SEARCH ON NON-PREFERED @V408246 00167700
- * DISKS 00167800
- SPACE 3 00168000
- ENTRY DMKPGTSG 00169000
- USING *,R15 00170000
- DMKPGTSG STM R0,R15,BALRSAVE ENTER HERE TO GET SPOOL SPACE 00171000
- L R12,=A(DMKPGT) STANDARD ADDRESSABILITY 00172000
- DROP R15 00173000
- USING DMKPGT,R12 00174000
- LA R3,4 SET DEVICE CHAIN INDEX FOR SPOOLING 00175000
- PGTINIX DS 0H PAGE ALLOCATION IN NON-PREFERED @V408246 00175100
- LA R4,DMKPGTT5-4 POINT TO START OF NON-PAGING SPACE 00176000
- PGTINIT EQU * HERE TO START ALLOCATING 00177000
- SR R15,R15 CLEAR 00178000
- SR R14,R14 RECBLOK SAVE REGISTERS 00179000
- EJECT 00180000
- NEXTYPE EQU * LOCATE THE NEXT AVAILABLE DEVICE WITH TEMPSPACE 00181000
- LA R4,4(,R4) INDEX TO NEXT DEVICE TYPE ANCHOR 00182000
- L R8,0(,R4) POINT TO RDEVBLOK 00183000
- LTR R8,R8 ANY DEVICES AVAILABLE ? 00184000
- BP CKREC YES -- GO FIND A PAGE 00185000
- BZ NEXTYPE NO -- GO CHECK NEXT SLOWER DEVICE TYPE 00186000
- B NOSPACE WE HIT THE FENCE AND ARE OUT OF SPACE 00187000
- SPACE 2 00188000
- NEXTDEV L R8,RDEVPNT POINT TO NEXT DEVICE OF THE SAME TYPE 00189000
- C R8,0(,R4) ALL DEVICES OF THIS TYPE FULL ? 00190000
- BNE CKREC @V408246 00191100
- LTR R3,R3 PAGING REQUEST? @V408246 00191200
- BNZ NEXTYPE NO @V408246 00191300
- C R4,=A(DMKPGTP5) FILLED UP 2305? @V408246 00191400
- BNE NEXTYPE NO @V408246 00191500
- L R8,=A(DMKPTRXX) POINTER TO FLAGS @V408246 00191600
- OI 1(R8),X'80' RAISE DRUM FULL FLAG @V408246 00191700
- B NEXTYPE @V408246 00191800
- SPACE 00192000
- CKREC LA R9,RDEVPAGE(R3) POINT TO START OF PAGING OR SPOOL 00193000
- * CHAIN (GPR3 SET AT ENTRY) 00194000
- LH R0,RDEVCYL GET POSITION OF ACCESS ARM @VA01629 00195000
- SPACE 00196000
- NEXTREC EQU * POINT TO NEXT RECORD ALLOCATION BLOK 00197000
- L R6,RECPNT-RECBLOK(,R9) POINT TO NEXT PAGE ALLOC. BLOK 00198000
- LTR R6,R6 ANY MORE BLOKS ? 00199000
- BZ CKCYL NO -- SEE IF A BLOK WAS FOUND 00200000
- LR R9,R6 SAVE BACK POINTER 00201000
- L R5,RDEVFIOB AND 1ST OF ANY CHAINED IOBLOKS 00202000
- B GETPAGE GO CHECK OUT THIS CYLINDER 00203000
- SPACE 00204000
- CKCYL LTR R6,R15 FIND AN ALLOCATION BLOK ON AN ACTIVE CYL 00205000
- BNZ GETREC YES -- ALLOCATE ON IT 00206000
- LTR R6,R14 FIND ANY AVAILABLE CYLINDER ?? 00207000
- BZ FINDCYL NO -- GO ALLOCATE ANOTHER CYLINDER 00208000
- SPACE 00209000
- GETREC SR R1,R1 CLEAR WORK REGISTER 00210000
- IC R1,RECUSED GET NUMBER OF RECORDS IN USE 00211000
- B UPREC AND GO ALLOCATE 00212000
- EJECT 00213000
- * HERE IF NO PAGE ALLOCATION BLOKS EXIST FOR THIS DEVICE -- 00214000
- * TRY TO ALLOCATE ANOTHER CYLINDER FOR THE REQUIRED FUNCTION 00215000
- SPACE 00216000
- FINDCYL EQU * 00217000
- L R10,RDEVALLN POINT TO ALLOCATION BLOK 00218000
- LH R1,ALOCUSED GET NUMBER OF CYLINDERS IN USE 00219000
- CH R1,ALOCMAX AND COMPARE TO MAX AVAILABLE 00220000
- BL FNDCYLA STILL SOME ROOM AVAILABLE @V408246 00221100
- TM RDEVFLAG,RDEVPREF PREFERED PAGING AREA? @V408246 00221200
- BZ NEXTDEV NO @V408246 00221300
- CLI RDEVTYPE,TYP2305 DRUM? @V408246 00221400
- BE NEXTDEV YES @V408246 00221500
- L R2,=A(DMKPTRXX) PAGING FLAGS @V408246 00221600
- OI 1(R2),X'40' RAISE PREFERRED PAGING FULL FLAG @V408246 00221700
- B NEXTDEV TRY NEXT DEVICE @V408246 00221800
- FNDCYLA DS 0H @V408246 00221900
- SPACE 00222000
- LA R1,1(,R1) BUMP NUMBER IN USE 00223000
- STH R1,ALOCUSED AND SAVE 00224000
- SPACE 00225000
- SR R2,R2 CLEAR TRT FUNCTION REGISTER 00226000
- SPACE 00227000
- SR R7,R7 CALCULATE LENGTH OF BIT MAP 00228000
- LH R6,ALOCMAX GET NUMBER OF CYLINDERS IN ALLOCATION MAP 00229000
- SRDL R6,3 NUMBER OF CYLINDERS/8 00230000
- LTR R7,R7 ANY REMAINDER ? 00231000
- BNZ *+6 YES -- 00232000
- BCTR R6,0 IF NOT, REDUCE LENGTH BY ONE 00233000
- SPACE 00234000
- LH R7,ALOCMAX Get ALOCMAX before altering R10 HRC106DK 00234100
- CH R6,=H'255' Length of ALOCMAP > 256 bytes? HRC106DK 00234200
- BNH SMALLDEV Dasd with 2048 or less cylinders HRC106DK 00234300
- TRT ALOCMAP(256),FREETABL Check first 256 bytes HRC106DK 00234400
- BNZ PGT1A Found a zero bit HRC106DK 00234500
- LA R10,256(,R10) Try 256 bytes further along HRC106DK 00234600
- SMALLDEV EQU * HRC106DK 00234700
- EX R6,GETCYL LOCATE AN UNUSED CYLINDER 00235000
- BNZ PGT1A MUST FIND ONE 00236000
- ABEND 1 OR DIE IN THE ATTEMPT 00237000
- PGT1A EQU * 00238000
- SPACE 2 00239000
- * MARK CYLINDER AS ALLOCATED, AND CALCULATE ITS ADDRESS 00240000
- IC R5,ALLOCTBL-1(R2) GET BIT MASK TO MARK CYL ALLOCATED 00241000
- EX R5,ALLOCATE AND DO IT 00242000
- LA R0,ALOCMAP GET ADDRESS OF START OF MAP 00243000
- SR R1,R0 GET DISPLACEMENT OF BYTE WITH 0 BIT 00244000
- SLL R1,3 TIMES 8 00245000
- AR R1,R2 GET BIT NUMBER ALLOCATED 00246000
- BCTR R1,0 RELATIVE TO 0 00247000
- EX R1,TESTODD SEE IF IT WAS ODD OR EVEN 00248000
- SRL R1,1 AND DIVIDE BY 2 00249000
- LR R5,R1 SAVE DISPLACEMEMT FROM CENTER 00250000
- BZ *+8 IF EVEN, LEAVE PLUS AND ZIG OUT 00251000
- LNR R1,R1 IF ODD, MAKE MINUS AND ZAG IN 00252000
- BCTR R1,R0 ONE EXTRA CYLINDER 00253000
- SPACE 00254000
- LR R6,R7 Retrieve saved ALOCMAX HRC106DK 00255100
- SRL R6,1 CALCULATE MIDDLE CYLINDER 00256000
- AR R6,R1 GET CYLINDER THAT WAS ALLOCATED 00257000
- SPACE 2 00258000
- * BUILD A NEW PAGE ALLOCATION BLOK FOR NEWLY ALLOCATED CYLINDER 00259000
- SPACE 2 00260000
- LA R10,FINDPAGE WHERE TO GO AFTER RECBLOK IS BUIL@V200820 00261000
- LA R7,24 NUMBER OF PAGES FOR A 2305 00262000
- CLI RDEVTYPE,TYP2305 IS IT A 2305?? 00263000
- BE GETCORE YES -- 00264000
- CLI RDEVTYPE,TYP3340 3340 DEVICE TYPE ? @V2A2029 00265000
- BE GETCORE YES - BRANCH (24 PAGES/CYL) @V2A2029 00266000
- LA R7,32 NUMBER OF PAGES/CYLINDER - 2314 00267000
- CLI RDEVTYPE,TYP2314 IS THAT RIGHT ?? 00268000
- BE GETCORE YES -- 00269000
- LA R7,120 NUMBER OF PAGES/CYLINDER - 3350 @V304498 00270000
- CLI RDEVTYPE,TYP3350 3350 DEVICE TYPE ? @V304498 00271000
- BE GETCORE YES, BUILD RECBLOK @V304498 00272000
- LA R7,96 Number of pages/cylinder - 3375 HRC106DK 00272100
- CLI RDEVTYPE,TYP3375 3375 device type ? HRC106DK 00272200
- BE GETCORE Yes, build RECBLOK HRC106DK 00272300
- LA R7,150 Number of pages/cylinder - 3380 HRC106DK 00272400
- CLI RDEVTYPE,TYP3380 3380 device type ? HRC106DK 00272500
- BE GETCORE Yes, build RECBLOK HRC106DK 00272600
- LA R7,57 NUMBER OF PAGES FOR A 3330 00273000
- SPACE 2 00274000
- GETCORE SLL R6,16 SHIFT CYLINDER INTO HIGH ORDER BYTES 00275000
- LR R2,R7 SAVE NUMBER OF PAGES AVAILABLE 00276000
- LA R7,X'100'(,R7) SET NUMBER IN USE TO ONE 00277000
- AR R7,R6 GET CYLINDER IN HIGH ORDER BYTES 00278000
- LA R0,RECSIZE GET LENGTH OF RECBLOK 00279000
- CALL DMKFREE OBTAIN NECESSARY STORAGE 00280000
- SR R6,R6 SET POINTER REGISTER 00281000
- STM R6,R7,RECPNT-RECBLOK(R1) SET UP POINTER, CYLINDER, U/M 00282000
- SPACE 00283000
- DROP R6 HRC106DK 00284100
- USING RECBLOK,R1 HRC106DK 00284300
- LM R6,R7,FFS Set R6 and R7 to all ones HRC106DK 00284500
- CH R2,=H'64' 'Small' no. of pages per cyl.? HRC106DK 00284700
- BL SMALLPPC Use the beginning of RECMAP HRC106DK 00284900
- CH R2,=H'128' 'Medium' no. of pages per cyl.? HRC106DK 00285100
- BL MIDPPC Use the middle of RECMAP HRC106DK 00285300
- SH R2,=H'128' Get rid of bits accounted for HRC106DK 00285500
- XC RECMAP(16),RECMAP Clear start, middle of RECMAP HRC106DK 00285700
- SRDL R6,0(R2) Insert one zero per avail. page HRC106DK 00285900
- STM R6,R7,RECMAP+16 Set up end of RECMAP HRC106DK 00286100
- B MAPFIN RECMAP completely set up HRC106DK 00286300
- MIDPPC SH R2,=H'64' Get rid of bits accounted for HRC106DK 00286500
- STM R6,R7,RECMAP+16 Set all bits at end of RECMAP HRC106DK 00286700
- SRDL R6,0(R2) Insert one zero per avail. page HRC106DK 00286900
- STM R6,R7,RECMAP+8 Set up middle of RECMAP HRC106DK 00287100
- XC RECMAP(8),RECMAP Clear beginning of RECMAP HRC106DK 00287300
- B MAPFIN RECMAP completely set up HRC106DK 00287500
- SMALLPPC STM R6,R7,RECMAP+16 Set all bits at end of RECMAP HRC106DK 00287700
- STM R6,R7,RECMAP+8 Set all bits in middle of RECMAP HRC106DK 00287900
- SRDL R6,0(R2) Insert one zero per avail. page HRC106DK 00288100
- STM R6,R7,RECMAP Set up beginning of RECMAP HRC106DK 00288300
- DROP R1 HRC106DK 00288500
- USING RECBLOK,R6 HRC106DK 00288700
- MAPFIN EQU * @V304498 00291000
- LR R6,R1 POINT TO NEW BLOK 00292000
- SPACE 00293000
- SR R1,R1 CLEAR WORK REGISTER 00294000
- CH R1,RECCYL ALLOCATING ON CYLINDER 0 ?? 00295000
- BNE CKPREF NO -- ALL SET THE WAY IT IS 00296000
- SPACE 00297000
- MVI RECMAP,B'11100000' FIRST 3 RECS ARE PERMANENTLY ALLOC. 00298000
- IC R1,RECMAX GET NUMBER OF AVAILABLE RECS 00299000
- CLI RECMAX,64 Is this a 'large' device? HRC106DK 00300100
- BH INITCYL0 Yes, initialise cyl 0 page map HRC106DK 00301100
- S R1,F3 DECREMENT BY 3 00302000
- CYLZERO EQU * @V304498 00303000
- STC R1,RECMAX AND SAVE 00304000
- SPACE 00305000
- CKPREF EQU * 00306000
- * CHAIN NEW RECBLOK TO ALLOCATION LIST AT PROPER POSITION, 00307000
- * BASED ON DISPLACEMENT FROM CENTER 00308000
- SPACE 00309000
- CLI RDEVTYPE,TYP2305 ALLOCATING ON FIXED HEAD DEVICE ? 00310000
- BE CHAINFXD YES -- 00311000
- B NONPREF NOT FIXED HEAD, SORT CHAIN @V408246 00312100
- SPACE 1 00322000
- INITCYL0 OI RECMAP,PAGE4 ALLOC FIRST 4 PAGES ON CYL 0 @V304498 00323000
- S R1,F4 DECREMENT BY 4 @V304498 00324000
- B CYLZERO COMPLETE UPDATE OF RECMAP @V304498 00325000
- SPACE 1 00326000
- NONPREF LA R9,RDEVPAGE(R3) POINT TO LIST ANCHOR @VA01097 00327000
- L R1,RDEVALLN GET POINTER TO ALLOCBLOK @VA04554 00328000
- LH R1,ALOCMAX-ALOCBLOK(R1) GET NUMBER OF CYL @VA03281 00329000
- SRL R1,1 GET MIDDLE CYLINDER 00330000
- SPACE 00331000
- CHAINLP L R2,RECPNT-RECBLOK(,R9) POINT TO NEXT BLOK ON LIST 00332000
- LTR R2,R2 AT THE END ?? 00333000
- BZ CHAINT YES 00334000
- LH R0,RECCYL-RECBLOK(,R2) GET CYLINDER OF NEXT BLOK 00335000
- SR R0,R1 GET DISPLACEMENT FROM CENTER 00336000
- LPR R0,R0 FORCE + 00337000
- CR R0,R5 COMPARE TO NEW BLOKS DISPLACEMENT 00338000
- BH CHAINT IF FARTHER FROM CENTER, CHAIN IN 00339000
- LR R9,R2 OTHERWISE, REMEMBER PREVIOUS BLOK 00340000
- B CHAINLP AND KEEP LOOKING 00341000
- SPACE 00342000
- CHAINFXD EQU * ALLOCATING ON FIXED HEAD DEVICE: 00343000
- L R2,RDEVPAGE(R3) GET TOP BLOK ON LIST 00344000
- LA R9,RDEVPAGE(R3) AND LIST ANCHOR 00345000
- * MAKE NEW (EMPTY) BLOK FIRST: 00346000
- SPACE 00347000
- CHAINT ST R2,RECPNT CHAIN NEXT BLOK 00348000
- CHAINP ST R6,RECPNT-RECBLOK(,R9) CHAIN IN PRIVIOUS 00349000
- SPACE 00350000
- * FIND OUT HOW CLOSE WE ARE TO RUNNING OUT OF SPACE 00351000
- * 00352000
- TM RDEVFLAG,RDEVPREF IF THIS DEVICE IS PREFERRED @VM01503 00353000
- * PAGING 00354000
- BCR 1,R10 THEN BYPASS SPACE ACCOUNTING @VM01503 00355000
- L R1,DMKPGTTU GET NUMBER OF CYLINDERS IN USE (TOTAL) 00356000
- A R1,F1 BUMP 00357000
- ST R1,DMKPGTTU AND SAVE 00358000
- C R1,DMKPGT90 COMPARE TO NUMBER THAT IS 90 PERCENT OF 00359000
- BCR 4,R10 (BL) TOTAL -- IF LOWER, CONTINUE@V200820 00360000
- TM MSGSW,X'80' OTHERWISE, SEE IF MESSAGE HAS BEEN GIVEN 00361000
- BCR 1,R10 (BO) WARNING ALREADY GIVEN @V200820 00362000
- SPACE 00363000
- LA R0,CPEXSIZE GET CORE FOR A CPEXBLOK 00364000
- CALL DMKFREE ... 00365000
- USING CPEXBLOK,R1 00366000
- LA R15,PGTMSG GET EXECUTION ADDRESS 00367000
- STM R15,R14,CPEXADD SAVE ALL REGS AND EXECUTION ADDRESS 00368000
- MVC CPEXR11(4),ASYSVM USER MAY LOG OFF BEFORE MSG. @VA08425 00368500
- CALL DMKSTKCP STACK FOR DELAYED EXECUTION 00369000
- OI MSGSW,X'80' INDICATE THAT MESSAGE HAS BEEN GIVEN 00370000
- BR R10 AND CONTINUE @V200820 00371000
- SPACE 2 00372000
- PGTMSG EQU * HERE TO GIVE MESSAGE 00373000
- MSG 'DMKPGT401I SYSTEM TEMP SPACE 90 PERCENT FULL' @VA04554 00374000
- CALL DMKQCNWT,PARM=OPERATOR+NORET+ALARM WARN THE OPERATOR 00375000
- GOTO DMKDSPCH WHEN FINISHED, EXIT TO DISPATCH @VA04554 00376000
- EJECT 00377000
- GETPAGE EQU * HERE TO ALLOCATE A PAGE ON THE CYLINDER 00378000
- SR R1,R1 CLEAR WORK REG 00379000
- IC R1,RECUSED GET NUMBER OF RECS IN USE 00380000
- EX R1,RECOMP ANY PAGES AVAILABLE ?? 00381000
- BE NEXTREC NO PAGES AVAILABLE -- 00382000
- SPACE 1 00382100
- TM APSTAT1,PROCIO EXECUTING ON AP @V4M0112 00382200
- BZ UPREC YES- BYPASS TRACKING ARM @V4M0112 00382300
- SPACE 00383000
- LTR R3,R3 SPOOL ALLOCATION ?? 00384000
- BNZ UPREC YES -- ALLOCATE HERE 00385000
- CLI RDEVTYPE,TYP2305 @V304498 00386000
- BE UPREC @V304498 00387000
- SPACE 00388000
- CH R0,RECCYL IS DEVICE POSITIONED AT THIS CYLINDER 00389000
- BE UPREC YES -- ALLOCATE HERE 00390000
- CLI RDEVTYPE,TYP3340 3340 DEVICE ? @V2A2029 00391000
- BNE CKACT NO -- CHECK FOR ACTIVE @V2A2029 00392000
- TM RDEVFTR,FTR70MB 3340 WITH 70MB DATA MODULE ? @V2A2029 00393000
- BZ CKACT NO - BRANCH @V2A2029 00394000
- X R0,F1 MAKE CYLINDER ODD OR EVEN @V2A2029 00395000
- CH R0,RECCYL IS DEVICE POSITIONED AT THIS @V2A2029 00396000
- * CYL ? 00397000
- BE UPREC YES -- @V2A2029 00398000
- CKACT LTR R15,R15 HAVE WE FOUND AN ACTIVE CYLINDER @V2A2029 00399000
- BNZ NEXTREC YES -- KEEP LOOKING FOR CURRENT 00400000
- LTR R14,R14 HAVE WE FOUND AN AVAILABLE CYLINDER 00401000
- BNZ CKIOB YES -- 00402000
- LR R14,R6 SAVE 1ST AVAILABLE CYLINDER 00403000
- SPACE 00404000
- CKIOB CR R5,R8 ANY MORE IOBLOKS QUEUED 00405000
- BE NEXTREC NO -- 00406000
- CLC IOBCYL-IOBLOK(2,R5),RECCYL IO ACTIVE FOR THIS CYL 00407000
- BE GETIOBR YES -- SAVE THIS BLOK 00408000
- L R5,IOBFPNT-IOBLOK(,R5) POINT TO NEXT BLOK 00409000
- B CKIOB AND KEEP LOOKING 00410000
- SPACE 00411000
- GETIOBR LR R15,R6 SAVE THIS RECBLOK 00412000
- B NEXTREC AND KEEP LOOKING 00413000
- SPACE 00414000
- UPREC LA R1,1(,R1) BUMP NUMBER OF RECORDS IN USE 00415000
- STC R1,RECUSED AND SAVE 00416000
- SPACE 00417000
- FINDPAGE EQU * CALCULATE NUMBER OF NEXT AVAILABLE PAGE ON CYLINDER 00418000
- SR R2,R2 CLEAR FUNCTION REGISTER FOR TRT 00419000
- TRT RECMAP,FREETABL FIND AN AVAILABLE PAGE 00420000
- BNZ PGT2A MUST BE ONE AVAILABLE 00421000
- ABEND 2 ELSE WE DIE HERE 00422000
- PGT2A EQU * 00423000
- SPACE 00424000
- IC R5,ALLOCTBL-1(R2) GET BIT MASK TO ALLOCATE PAGE 00425000
- EX R5,ALLOCATE AND DO IT 00426000
- LA R0,RECMAP POINT TO START OF BIT MAP 00427000
- SR R1,R0 GET DISPLACEMENT OF BYTE WITH 0 BIT 00428000
- SLL R1,3 TIMES 8 00429000
- AR R1,R2 GET RELATIVE PAGE NUMBER 00430000
- LH R2,RECCYL GET CYLINDER NUMBER 00431000
- SLL R2,8 SAVE 00432000
- AR R2,R1 INSERT PAGE NUMBER 00433000
- SLL R2,8 SAVE CYLINDER AND PAGE 00434000
- IC R2,RDEVCODE+1 INSERT DEVICE CODE 00435000
- L R8,RDEVPNT GET POINTER TO NEXT DEVICE ON CHAIN 00436000
- ST R8,0(,R4) AND ALLOCATE ON IT NEXT TIME 00437000
- LTR R3,R3 IS THIS A PAGING REQUEST? 00438000
- BNZ NOACNT1 NO, NO ACCOUNTING TO PERFORM 00439000
- TM RDEVTYPE,TYP2305 FAST PAGING DEVICE ? @V304498 00440000
- BZ ACNTDSK1 NOT A DRUM , ACCOUNT FOR DISK 00441000
- USING VMBLOK,R11 00442000
- LH R3,VMPDRUM ADD 1 TO COUNT OF USER PAGES 00443000
- LA R3,1(R3) ALLOCATED ON DRUM 00444000
- STH R3,VMPDRUM 00445000
- B NOACNT1 00446000
- ACNTDSK1 LH R3,VMPDISK ADD 1 TO COUNT OF USER PAGES 00447000
- LA R3,1(R3) ALLOCATED ON DISK 00448000
- STH R3,VMPDISK 00449000
- NOACNT1 EQU * 00450000
- SETADDR ST R2,BALR1 STORE IN CALLER'S GPR1 00451000
- LM R0,R15,BALRSAVE RESTORE REGS 00452000
- BR R14 AND EXIT 00453000
- SPACE 3 00454000
- NOSPACE EQU * HERE IF ALL TEMPSPACE IS GONE -- 00455000
- CLC CPID,=C'CPCP' RUNNING SYSTEM YET ?? 00456000
- BNE SET0 NO -- BYPASS MSG IF STILL IN CPINIT 00457000
- TM MSGSW,X'40' TEMP SPACE FULL MSG BEING SENT ? 00458000
- BO SET0 YES --FORGET IT THIS TIME 00459000
- OI MSGSW,X'40' INDICATE MSG BEING SENT 00460000
- LA R0,CPEXSIZE GET CORE FOR A CPEXBLOK 00461000
- CALL DMKFREE ... 00462000
- USING CPEXBLOK,R1 00463000
- LA R15,PGTMSG2 GET EXECUTION ADDRESS 00464000
- STM R15,R14,CPEXADD SAVE ALL REGS AND EXECUTION ADDRESS 00465000
- MVC CPEXR11(4),ASYSVM USER MAY LOG OFF BEFORE MSG. @VA08425 00465500
- CALL DMKSTKCP STACK BLOK FOR DEFERED EXECUTION 00466000
- SET0 SR R2,R2 SET ZERO ADDRESS 00467000
- B SETADDR AND EXIT 00468000
- SPACE 00469000
- PGTMSG2 EQU * HERE TO GIVE NO SPACE MESSAGE 00470000
- MSG 'DMKPGT400I SYSTEM TEMP SPACE FULL' @VA04554 00471000
- CALL DMKQCNWT,PARM=OPERATOR+ALARM WARN THE OPERATOR 00472000
- MSG2RET NI MSGSW,X'BF' RESET TEMP SPACE FULL MSG SWITCH 00473000
- GOTO DMKDSPCH AND LEAVE 00474000
- EJECT 00475000
- *. 00476000
- * 00477000
- * SUBROUTINE NAME - 00478000
- * 00479000
- * DMKPGTPR 00480000
- * 00481000
- * FUNCTION - 00482000
- * 00483000
- * TO DE-ALLOCATE A PAGE OF DASD SPACE THAT HAS BEEN USED FOR 00484000
- * VIRTUAL MEMORY PAGING 00485000
- * 00486000
- * ATTRIBUTES - 00487000
- * 00488000
- * SERIALLY REUSABLE, RESIDENT, CALLED VIA SVC 00489000
- * 00490000
- * ENTRY POINTS - 00491000
- * 00492000
- * DMKPGTPR 00493000
- * DMKPGTSD 00494000
- * DMKPGTSP 00495000
- * 00496000
- * ENTRY CONDITIONS - 00497000
- * 00498000
- * GPR5 = ADDRESS OF THE SWPTABLE ENTRY THAT CONTAINS THE COMP- 00499000
- * RESSED DASD ADDRESS OF THE PAGE TO BE RELEASED 00500000
- * GPR12 = DMKPGTPR BASE REGISTER 00501000
- * GPR13 = ADDRESS OF STANDARD SAVEAREA 00502000
- * 00503000
- * EXIT CONDITIONS - 00504000
- * 00505000
- * NORMAL - 00506000
- * THE PAGE IS MARKED AS DE-ALLOCATED, AND THE PROPER USE 00507000
- * COUNTS ARE UPDATED 00508000
- * 00509000
- * ERROR - 00510000
- * NONE 00511000
- * 00512000
- * CALLS TO OTHER ROUTINES - 00513000
- * 00514000
- * DMKFRET - TO RETURN TO FREE STORAGE ANY RECBLOKS WHOSE PAGES 00515000
- * ARE COMPLETELY DE-ALLOCATED 00516000
- * 00517000
- * EXTERNAL REFERENCES - 00518000
- * 00519000
- * THE SYSTEM OWNED VOLUME LIST (DMKSYSOW) IS REFERENCED TO 00520000
- * LOCATE THE RDEVBLOK FOR THE DEVICE ON WHICH A PAGE HAS BEEN 00521000
- * ALLOCATED 00522000
- * 00523000
- * TABLES / WORKAREAS - 00524000
- * 00525000
- * NONE 00526000
- EJECT 00527000
- * 00528000
- * REGISTER USAGE - 00529000
- * 00530000
- * GPR0,1,2,3, AND 4 ARE WORK REGISTERS 00531000
- * GPR5 = ADDRESS OF SWPTABLE ENTRY 00532000
- * GPR6 = ADDRESS OF RECBLOK 00533000
- * GPR7 IS NOT USED 00534000
- * GPR8 = ADDRESS OF RDEVBLOK 00535000
- * GPR9 IS NOT USED 00536000
- * GPR10 = ADDRESS OF ALLOCBLOK 00537000
- * GPR11 IS NOT USED 00538000
- * GPR12 = BASE ADDRESS FOR DMKPGTPG 00539000
- * GPR13 = ADDRESS OF STANDARD SAVEAREA 00540000
- * GPR14,15 ARE USED FOR BALR LINKAGE AND RETURN 00541000
- * 00542000
- * NOTES - 00543000
- * 00544000
- * NONE 00545000
- * 00546000
- * OPERATION - 00547000
- * 00548000
- * 1. IF THE PAGE HAS NOT YET BEEN ALLOCATED, SIMPLY RESET THE 00549000
- * SWPTABLE ENTRY TO ZERO; OTHERWISE, CONTINUE 00550000
- * 00551000
- * 2. LOCATE THE RDEVBLOK FOR THE DEVICE ON WHICH THE PAGE HAS 00552000
- * BEEN ALLOCATED BY INDEXING INTO THE OWNED LIST WITH THE 00553000
- * DEVICE CODE SUPPLIED IN THE DASD ADDRESS 00554000
- * 00555000
- * 3. LOCATE THE RECBLOK FOR THE CYLINDER ON WHICH THE PAGE IS 00556000
- * ALLOCATED 00557000
- * 00558000
- * 4. CALCULATE THE BIT WHICH REPRESENTS THE PAGE AND SET IT TO 00559000
- * ZERO; DECREMENT THE NUMBER OF PAGES IN USE 00560000
- * 00561000
- * 5. IF THE NUMBER IN USE IS ZERO, DE-ALLOCATE THE CYLINDER; 00562000
- * OTHERWISE CONTINUE 00563000
- * 00564000
- * 6. RESET THE SWPTABLE ENTRY TO ZERO, AND RETURN TO CALLER 00565000
- * 00566000
- *. 00567000
- EJECT 00568000
- USING SWPFLAG,R5 00569000
- ENTRY DMKPGTSD 00570000
- USING *,R15 00571000
- DMKPGTSD STM R0,R15,BALRSAVE ENTER AND SAVE REGS 00572000
- L R12,=A(DMKPGT) STANDARD ADDRESSABILITY 00573000
- DROP R15 00574000
- USING DMKPGT,R12 00575000
- LA R3,(RDEVRECS-RDEVPAGE) DISP TO RDEVRECS CHAIN 00576000
- B SPOOLDEL 00577000
- SPACE 2 00578000
- ENTRY DMKPGTSP @VM01002 00579000
- USING *,R15 @VM01002 00580000
- DMKPGTSP STM R0,R15,BALRSAVE ENTER AND SAVE REGISTERS @VM01002 00581000
- L R12,=A(DMKPGT) STANDARD ADDRESSABILITY @VM01002 00582000
- USING DMKPGT,R12 @VM01002 00583000
- SLR R3,R3 CLEAR INDEX FOR PAGING CHAIN @VM01002 00584000
- MVI UCTL,UCTLDR+UCTLSYS ACNT FOR PAGE+SYSTEM VMBLOK @VM01031 00585000
- B SPOOLDEL @VM01002 00586000
- SPACE 2 00587000
- ENTRY DMKPGTPR 00588000
- USING *,R15 00589000
- DMKPGTPR STM R0,R15,BALRSAVE ENTER AND SAVE REGS 00590000
- L R12,=A(DMKPGT) STANDARD ADDRESSABILITY 00591000
- DROP R15 00592000
- USING DMKPGT,R12 00593000
- SR R3,R3 CLEAR INDEX FOR PAGING CHAIN @VA04554 00594000
- OI UCTL,UCTLDR FLAG ENTRY FOR PAGING 00595000
- SPACE 2 00596000
- SPOOLDEL EQU * 00597000
- L R4,SWPCYL GET DASD ADDRESS 00598000
- BAL R14,FINDEVIC GO LOCATE RDEVBLOK FOR THIS PAGE 00599000
- SPACE 00600000
- LA R9,RDEVPAGE(R3) POINT TO PAGE OR SPOOL ALLOCATION CHAIN 00601000
- LR R15,R9 AND SAVE ADDRESS OF ANCHOR 00602000
- BAL R14,FINDREC AND GO FIND THE RECORD ALLOCATION BLOK 00603000
- SPACE 00604000
- SR R2,R2 CLEAR DIVIDEND REGISTER 00605000
- LR R7,R2 SAVE FOR CLEARING SWPTABLE 00606000
- IC R2,SWPDPAGE GET PAGE NUMBER 00607000
- BCTR R2,0 RELATIVE TO ZERO 00608000
- SRDL R2,3 DIVIDED BY 8 00609000
- SRL R3,29 GET REMAINDER 00610000
- LA R1,RECMAP(R2) POINT TO BYTE CONTAINING BIT FOR PAGE 00611000
- IC R3,ALLOCTBL(R3) GET BIT MASK TO DE-ALLOCATE 00612000
- EX R3,TEST IS PAGE ALLOCATED ?? 00613000
- BO PGT3A IT BETTER BE -- 00614000
- ABEND 3 OR WE ARE FATALLY ILL 00615000
- PGT3A EQU * 00616000
- SPACE 00617000
- EX R3,DEALLOC DE-ALLOCATE THE PAGE 00618000
- IC R3,RECUSED GET NUMBER OF PAGES IN USE 00619000
- S R3,F1 DECREMENT IN-USE COUNT 00620000
- STC R3,RECUSED AND SAVE IT 00621000
- BP RECLEFT IF SOME PAGES STILL IN USE, SKIP 00622000
- SPACE 00623000
- BAL R14,EMPTYCYL IF NO RECORDS IN USE, GO DEALLOCATE THE 00624000
- * CYLINDER 00625000
- B ZEROPAGE RESET SWPTABLE ENTRY 00626000
- SPACE 00627000
- RECLEFT EQU * AT LEAST ONE RECORD STILL IN USE: 00628000
- CLI RDEVTYPE,TYP2305 FIXED HEAD DEVICE ?? 00629000
- BNE ZEROPAGE NO -- LEAVE WELL ENOUGH ALONE 00630000
- L R0,RECPNT REMOVE PARTIALLY EMPTY BLOCK 00631000
- ST R0,RECPNT-RECBLOK(,R9) FROM CURRENT LIST POSITION 00632000
- L R0,0(,R15) AND PLACE IT 00633000
- ST R6,0(,R15) AT THE 00634000
- ST R0,RECPNT TOP OF THE LIST 00635000
- SPACE 00636000
- ZEROPAGE EQU * HERE TO CLEAR SWPTABLE ENTRY 00637000
- OI SWPFLAG,SWPRECMP PAGE MUST BE RE-ASSIGNED NEXT TIME 00638000
- ST R7,SWPCYL INDICATE ZERO PAGE 00639000
- TM UCTL,UCTLDR IS PAGE BEING RELEASED FOR PAGING? 00640000
- BZ NOACNT2 NO, SPOOLING, NO ACCOUNTING REQD. 00641000
- DROP R11 TEMPORALLY SWITCH VMBLOKS @VM01031 00642000
- USING VMBLOK,R4 @VM01031 00643000
- LR R4,R11 NORMAL CASE IS AGAINST THE USER @VM01031 00644000
- TM UCTL,UCTLSYS IS THIS THE NORMAL CASE? @VM01031 00645000
- BZ *+8 YES, BR. @VM01031 00646000
- L R4,ASYSVM NOPE, ACNT FOR PAGE AGAINST SYS @VM01031 00647000
- TM RDEVTYPE,TYP2305 FAST PAGING DEVICE ? @V304498 00648000
- BZ ACNTDSK2 NOT A DRUM, ACCOUNT FOR DISK 00649000
- LH R3,VMPDRUM SUBTRACT 1 FROM COUNT OF USER 00650000
- S R3,F1 PAGES ALLOCATED ON DRUM @VA04554 00651000
- BM NOACNT2 IF MINUS, LEAVE COUNT = 0 @VA04554 00651500
- STH R3,VMPDRUM 00652000
- B NOACNT2 00653000
- ACNTDSK2 LH R3,VMPDISK SUBTRACT 1 FROM COUNT OF USER 00654000
- S R3,F1 PAGES ALLOCATED ON DISK 00655000
- BM NOACNT2 IF MINUS, LEAVE COUNT = 0 @VA04554 00655500
- STH R3,VMPDISK 00656000
- NOACNT2 MVI UCTL,X'00' CLEAR FLAG @VM01031 00657000
- LM R0,R15,BALRSAVE RESTORE CALLER'S REGS 00658000
- BR R14 AND EXIT TO CALLER 00659000
- DROP R4 RETURN TO STANDARD VMBLOK USAGE @VM01031 00660000
- USING VMBLOK,R11 @VM01031 00661000
- EJECT 00662000
- *. 00663000
- * 00664000
- * SUBROUTINE NAME - 00665000
- * 00666000
- * DMKPGTSR 00667000
- * 00668000
- * FUNCTION - 00669000
- * 00670000
- * TO RELEASE A SET OF DASD PAGES THAT BELONG TO A SPOOL FILE 00671000
- * THAT IS NO LONGER NEEDED 00672000
- * 00673000
- * ATTRIBUTES - 00674000
- * 00675000
- * SERIALLY RE-USABLE, RESIDENT, CALLED VIA SVC 00676000
- * 00677000
- * ENTRY POINTS - 00678000
- * 00679000
- * DMKPGTSR 00680000
- * 00681000
- * ENTRY CONDITIONS - 00682000
- * 00683000
- * GPR1 = THE ADDRESS OF THE FIRST OF A CHAIN OF DUMMY 00684000
- * RECBLOKS. THE BIT MAP FOR EACH BLOK CONTAINS A 1 FOR 00685000
- * EVERY PAGE THAT IS TO BE RELEASED ON THE CYLINDER THAT 00686000
- * IT REPRESENTS 00687000
- * 00688000
- * EXIT CONDITIONS - 00689000
- * 00690000
- * NORMAL - 00691000
- * THE RELEASED PAGES ARE MARKED AS DE-ALLOCATED, AND THE 00692000
- * APPROPRIATE USED COUNTS ARE UPDATED 00693000
- * 00694000
- * ERROR - 00695000
- * NONE 00696000
- * 00697000
- * CALLS TO OTHER ROUTINES - 00698000
- * 00699000
- * DMKFRET - TO RETURN TO FREE STORAGE BOTH THE DUMMY RECBLOKS 00700000
- * AND ALSO ANY RECBLOKS WHOSE PAGES HAVE ALL BEEN DE- 00701000
- * ALLOCATED 00702000
- * 00703000
- * EXTERNAL REFERENCES - 00704000
- * 00705000
- * THE SYSTEM OWNED LIST (DMKSYSOW) IS REFERENCED TO LOCATE THE 00706000
- * THE RDEVBLOK FOR THE VOLUME CONTAINING THE PAGE 00707000
- * 00708000
- * TABLES / WORKAREAS - 00709000
- * 00710000
- * NONE 00711000
- EJECT 00712000
- * 00713000
- * REGISTER USAGE - 00714000
- * 00715000
- * SEE PROLOGUE TO DMKPGTPR ABOVE 00716000
- * 00717000
- * NOTES - 00718000
- * 00719000
- * NONE 00720000
- * 00721000
- * OPERATION - 00722000
- * 00723000
- * DMKPGTSR OPERATES IN ESSENTIALLY THE SAME MANNER AS DMKPGTPR, 00724000
- * WITH THE THE EXCEPTION THAT WHEN THE PROPER RDEVBLOK AND 00725000
- * RECBLOK HAVE BEEN LOCATED, THE BIT MASK IN THE DUMMY 00726000
- * RECBLOK IS EXCLUSIVE OR'ED AGAINST THE MAP IN THE 00727000
- * REAL BLOK TO ZERO OUT THE BITS FOR THE PAGES BEING DEALLOCATED 00728000
- * 00729000
- * DMKPGTPR AND DMKPGTSR USE SEVERAL COMMON SUBROUTINES TO LOCATE 00730000
- * THE RDEVBLOK FOR THE AFFECTED VOLUME, LOCATE THE RECBLOK 00731000
- * CONTAINING THE PAGE, AND TO DE-ALLOCATE A CYLINDER WHOSE 00732000
- * PAGES HAVE ALL BEEN FREED. 00733000
- * 00734000
- *. 00735000
- EJECT 00736000
- ENTRY DMKPGTSR 00737000
- USING *,R15 00738000
- DMKPGTSR STM R0,R15,BALRSAVE ENTER AND SAVE REGS 00739000
- L R12,=A(DMKPGT) STANDARD ADDRESSABILITY 00740000
- DROP R15 00741000
- USING DMKPGT,R12 00742000
- LR R5,R1 SAVE ADDRESS OF DUMMY BLOK 00743000
- SPACE 00744000
- SAVECYL L R4,RECCYL-RECBLOK(,R5) GET DASD PAGE ADDRESS 00745000
- LR R3,R4 AND SAVE IT 00746000
- BAL R14,FINDEVIC GO LOCATE THE PROPER RDEVBLOK 00747000
- SPACE 00748000
- LA R9,RDEVRECS POINT TO SPOOLING ALLOCATION CHAIN 00749000
- BAL R14,FINDREC GO LOCATE THE PROPER RECORD ALLOCATION 00750000
- SPACE 00751000
- XC RECMAP,RECMAP-RECBLOK(R5) REMOVE ALLOCATED PAGES 00752000
- N R3,=A(X'FF00') STRIP OUT ALL BUT NUMBER OF RECS DELETED 00753000
- SRL R3,8 PLACE IN LOW ORDER 00754000
- SR R2,R2 CLEAR WORK REGISTER 00755000
- IC R2,RECUSED GET NUMBER PREVIOUSLY IN USE 00756000
- SR R2,R3 DECREMENT 00757000
- STC R2,RECUSED AND SAVE 00758000
- BP NEXTSPL STILL RECORDS IN USE IN THIS BLOK 00759000
- BZ PGT4A ALL RECORDS DEALLOCATED 00760000
- ABEND 4 DE-ALLOCATE MORE THAN WE HAD 00761000
- PGT4A EQU * 00762000
- SPACE 00763000
- BAL R14,EMPTYCYL GO DE-ALLOCATE THE CYLINDER -- 00764000
- SPACE 00765000
- NEXTSPL LR R1,R5 POINT TO BLOK JUST USED 00766000
- L R5,RECPNT-RECBLOK(,R5) POINT TO NEXT BLOK TO DE-ALLOC. 00767000
- LA R0,RECSIZE GET LENGTH OF DUMMY BLOK 00768000
- CALL DMKFRET FRET IT 00769000
- LTR R5,R5 ANY MORE TO DO 00770000
- BNZ SAVECYL YES -- CONTINUE 00771000
- LM R0,R15,BALRSAVE RESTORE REGS 00772000
- BR R14 AND EXIT TO CALLER 00773000
- EJECT 00774000
- ***************************** 00775000
- * 00776000
- * COMMON SUBROUTINES FOR DMKPGTPR AND DMKPGTSR -- 00777000
- * 00778000
- ***************************** 00779000
- SPACE 3 00780000
- FINDEVIC EQU * HERE TO LOCATE THE RDEVBLOK WHICH HAS THE CHAIN 00781000
- * ANCHOR FOR THE PAGE TO BE DELETED -- AT ENTRY, 00782000
- * GPR4 MUST CONTAIN THE COMPRESSED DASD ADDRESS (CCPD) 00783000
- SPACE 00784000
- LA R8,X'FF' GET MASK TO STRIP ALL BUT DEVICE CODE 00785000
- NR R8,R4 GET DEVICE CODE IN GPR8 00786000
- SRL R4,16 SHIFT CYLINDER NUMBER TO LOW ORDER 00787000
- SLL R8,3 GET DEVICE CODE TIMES 8 00788000
- A R8,=A(DMKSYSOW) POINT TO CORRECT OWNED LIST ENTRY 00789000
- LH R8,OWNDRDEV-OWNDLIST(,R8) POINT TO RDEVLBOK 00790000
- SLL R8,3(0) CONVERT TO BYTE INDEX @V200820 00791000
- A R8,ARIODV --- 00792000
- BR R14 RETURN TO CALLER 00793000
- SPACE 3 00794000
- FINDREC EQU * HERE TO LOCATE THE PROPER RECORD ALLOCATION BLOK 00795000
- * AT ENTRY, GPR9 POINTS TO THE ALLOCATION CHAIN ANCHOR 00796000
- * AND GPR4 HAS THE CYLINDER NUMBER DESIRED -- 00797000
- L R6,RECPNT-RECBLOK(,R9) POINT TO NEXT BLOK ON CHAIN 00798000
- LTR R6,R6 IS THERE ONE ?? 00799000
- BNZ PGT5A YES-- 00800000
- ABEND 5 NO-- AARRRGGGHHHHH..... 00801000
- PGT5A EQU * 00802000
- SPACE 00803000
- CH R4,RECCYL IS THE BLOK FOR THIS CYLINDER ?? 00804000
- BCR 8,R14 YES -- EXIT TO CALLER 00805000
- LR R9,R6 SAVE BACK CHAIN 00806000
- B FINDREC AND KEEP LOOKING 00807000
- SPACE 3 00808000
- EMPTYCYL EQU * HERE TO DE-ALLOCATE AN EMPTY CYLINDER -- 00809000
- * AT ENTRY, GPR4 HAS THE CYLINDER TO DELETE -- 00810000
- * AND GPR6 AND 9 POINT TO CURRENT AND PREVIOUS BLOKS 00811000
- SPACE 00812000
- L R10,RDEVALLN GET POINTER TO ALOCBLOK 00813000
- LA R1,1 SET TENTATIVE DECREMENT 00814000
- LH R2,ALOCMAX GET NUMBER OF CYLINDERS 00815000
- SRL R2,1 DIVIDE BY 2 TO GET MIDDLE CYLINDER 00816000
- SPACE 2 00817000
- SR R2,R4 GET DISPLACEMENT FROM MIDDLE CYLINDER 00818000
- BP GETDISP IF DISPLACEMENT POSITIVE, BYPASS 00819000
- LPR R2,R2 FORCE POSITIVE DISPLACEMENT 00820000
- SR R1,R1 SET DECREMENT TO ZERO 00821000
- SPACE 2 00822000
- GETDISP EQU * CALCULATE BIT DISPLACEMENT IN MASK 00823000
- AR R2,R2 DOUBLE THE DISPLACEMENT FROM THE CENTER 00824000
- SR R2,R1 AND DECREMENT, IF NECESSARY 00825000
- SRDL R2,3 DIVIDE DISPLACEMENT BY 8 00826000
- SRL R3,29 AND SAVE REMAINDER 00827000
- IC R3,ALLOCTBL(R3) GET BIT MASK TO DE-ALLOCATE 00828000
- LA R1,ALOCMAP(R2) POINT TO BYTE TO TEST 00829000
- EX R3,TEST FIRST SEE IF CYLINDER IS ALLOCATED 00830000
- BO PGT6A IT HAD BETTER BE, 00831000
- ABEND 6 OR WE'RE IN TROUBLE 00832000
- PGT6A EQU * 00833000
- SPACE 00834000
- L R15,RECPNT GET POINTER TO NEXT BLOK ON LIST 00835000
- TM RDEVFLAG,RDEVPREF IS THIS A PREFERED VOLUME ? 00836000
- BZ UNCHAIN NO -- FREE THE CYLINDER 00837000
- LTR R15,R15 IF PREFERRED, UNCHAIN ONLY THE LAST BLOK 00838000
- BCR 7,R14 NOT THE LAST -- EXIT 00839000
- SPACE 00840000
- UNCHAIN EQU * HERE TO UNCHAIN THE BLOK AND DEALLOCATE 00841000
- EX R3,DEALLOC DE-ALLOCATE THE CYLINDER -- 00842000
- LH R3,ALOCUSED GET NUMBER OF CYLINDERS NOW IN USE -- 00843000
- BCTR R3,0 DECREMENT BY ONE 00844000
- STH R3,ALOCUSED AND SAVE 00845000
- TM RDEVFLAG,RDEVPREF IS THIS A PREFERED VOLUME ? @VA01097 00846000
- BO GETPNT YES - @VA01097 00847000
- SPACE 00848000
- L R1,DMKPGTTU GET NUMBER OF CYLINDERS INUSE 00849000
- BCTR R1,0 DECREMENT 00850000
- ST R1,DMKPGTTU AND SAVE 00851000
- C R1,DMKPGT90 LESS THAN 90 PERCENT IN USE ? 00852000
- BH GETPNT NO -- 00853000
- NI MSGSW,X'FF'-X'80' YES MAKE SURE MSG SWITCH IS OFF 00854000
- SPACE 00855000
- GETPNT EQU * 00856000
- ST R15,RECPNT-RECBLOK(,R9) UNCHAIN EMPTY BLOK 00857000
- LR R1,R6 GET POINTER TO EMPTY BLOK 00858000
- LA R0,RECSIZE GET ITS SIZE 00859000
- LR R3,R14 SAVE RETURN ADDRESS 00860000
- CALL DMKFRET RETURN THE BLOK TO FREE STORAGE 00861000
- BR R3 AND EXIT 00862000
- EJECT 00863000
- *. 00864000
- * SUBROUTINE NAME - 00865000
- * 00866000
- * DMKPGTCG - ALLOCATE CONTIGUOUS SPOOL AREA FOR 370X DUMP 00867000
- * 00868000
- * ENTRY CONDITIONS - 00869000
- * 00870000
- * GR0 = NUMBER OF SPOOL PAGES REQUESTED, MAX = 64 00871000
- * GR14 =RETURN ADDRESS 00872000
- * GR15 =ADDRESS OF DMKPGTCG 00873000
- * 00874000
- * EXIT CONDITIONS - 00875000
- * 00876000
- * GR0 = UNCHANGED 00877000
- * GR1 = COMPRESSED DASD ADDRESS OF FIRST PAGE ALLOCATED 00878000
- * GR8 = RDEVBLOK ADDRESS WHERE PAGES WERE ALLOCATED 00879000
- * OR 00880000
- * GR1 = 0 REQUESTED SPACE WAS NOT AVAILABLE 00881000
- * 00882000
- * CALLS TO OTHER ROUTINES - 00883000
- * 00884000
- * DMKFREE - TO BUILD RECBLOK'S FOR THE ALLOCATED CYLINDERS 00885000
- * DMKQCNWT - TO SEND WARNING MESSAGE IF TEMPSPACE FULL 00886000
- * DMKSTKCP - TO STACK CPEXBLOK FOR ABOVE CALL 00887000
- * 00888000
- * EXTERNAL REFERENCES - NONE 00889000
- * 00890000
- * TABLES / WORK AREAS - NONE 00891000
- * 00892000
- * REGISTER USAGE - 00893000
- * 00894000
- * GR14, 15 = WORK REGISTERS 00895000
- * GR13 = NUMBER OF CYLINDERS REQUIRED 00896000
- * GR12 = MODULE BASE REGISTER 00897000
- * GR11 = VMBLOK ADDRESSABILITY 00898000
- * GR10 = ALOCBLOK ADDRESSABILITY 00899000
- * GR9 = WORK REGISTER 00900000
- * GR8 = RDEVBLOK ADDRESSABILITY 00901000
- * GR7 = WORK REGISTER 00902000
- * GR6 = RECBLOK ADDRESSABILITY 00903000
- * GR0-5 = WORK REGISTERS 00904000
- * 00905000
- * NOTES - 00906000
- * 00907000
- * DMKPGTCG WILL ONLY ALLOCATE CONTIGUOUS AREAS WHICH FALL 00908000
- * IN THE CORRECT POSITION WITHIN AN ALOCMAP BYTE. THIS MAY 00909000
- * RESULT IN FALSE INDICATIONS OF NO AVAILABLE SPACE UNDER 00910000
- * CERTAIN CONDITIONS, BUT THIS SHOULD NOT BE A SIGNIFICANT 00911000
- * PERCENTAGE OF THE POSSIBLE SITUATIONS. (P < .05) 00912000
- * 00913000
- * OPERATION - 00914000
- * 00915000
- * 1. FIND A REAL DEVICE BLOCK WHICH HAS AT LEAST THE 00916000
- * REQUESTED NUMBER OF CYLINDERS AVAILABLE. 00917000
- * 2. SCAN THE ALOCBLOK FOR THE DEVICE TO DETERMINE IF 00918000
- * THE REQUEST CAN BE SATISFIED. IF NOT, REPEAT FROM 00919000
- * STEP 1. 00920000
- * 3. MARK THE CHOSEN CYLINDERS AS ALLOCATED, BUILD THE 00921000
- * 'CCPD' TO RETURN TO THE CALLER IN GR1. 00922000
- * 4. BUILD THE RECBLOK'S FOR THE ALLOCATED CYLINDERS 00923000
- * AND CHAIN THEM INTO THE RECBLOK CHAIN. 00924000
- * 5. CHECK TO SEE IF EITHER 90 PERCENT OF TEMP SPACE HAS 00925000
- * BEEN USED, OR IF ALL OF TEMPSPACE HAS BEEN USED. 00926000
- * IF YES, STACK A CPEXBLOK TO WARN THE SYSTEM OPERATOR. 00927000
- * 6. PASS RDEVBLOK ADDRESS AND 'CCPD' BACK TO CALLER, EXIT. 00928000
- *. 00929000
- SPACE 3 00930000
- ENTRY DMKPGTCG @V200820 00931000
- USING DMKPGTCG,R15 @V200820 00932000
- DMKPGTCG DS 0D ALLOCATE CONTIGUOUS DASD SPOOL SPACE @V200820 00933000
- STM R0,R15,BALRSAVE @V200820 00934000
- L R12,=A(DMKPGT) @V200820 00935000
- DROP R15 @V200820 00936000
- USING DMKPGT,R12 @V200820 00937000
- SPACE 00938000
- LTR R3,R0 KICK OUT INVALID REQUESTS @V200820 00939000
- BNP CONFAIL @V200820 00940000
- CH R3,=H'64' . . . @V200820 00941000
- BH CONFAIL @V200820 00942000
- LA R4,DMKPGTT5-4 ALLOCATE ON SPOOL DISKS ONLY @V200820 00943000
- CONEXTT EQU * NEXT DEVICE TYPE FOR ALLOCATION @V200820 00944000
- LA R4,4(0,R4) . . . @V200820 00945000
- L R8,0(0,R4) FIRST RDEVBLOK ON THIS CHAIN @V200820 00946000
- LTR R8,R8 @V200820 00947000
- BP CONXTDV FOUND AN RDEVBLOK @V200820 00948000
- BZ CONEXTT TRY THE NEXT DEVICE TYPE @V200820 00949000
- B CONFAIL RAN OUT OF TYPES TO TRY @V200820 00950000
- CONEXTD EQU * NEXT DEVICE OF THE SAME TYPE @V200820 00951000
- L R8,RDEVPNT . . . @V200820 00952000
- CL R8,0(0,R4) WRAP AROUND TO THE START ? @V200820 00953000
- BE CONEXTT YES -- NEXT DEVICE TYPE @V200820 00954000
- CONXTDV EQU * @V200820 00955000
- LA R7,57(0) PAGES / CYLINDER FOR 3330 @V200820 00956000
- CLI RDEVTYPE,TYP3330 . . . @V200820 00957000
- BE CONNCYL @V200820 00958000
- LA R7,120(0) PAGES / CYLINDER FOR 3350 @V304498 00959000
- CLI RDEVTYPE,TYP3350 . . . @V304498 00960000
- BE CONNCYL @V304498 00961000
- LA R7,96(0) Pages / cylinder for 3375 HRC106DK 00961100
- CLI RDEVTYPE,TYP3375 . . . HRC106DK 00961200
- BE CONNCYL HRC106DK 00961300
- LA R7,150(0) Pages / cylinder for 3380 HRC106DK 00961400
- CLI RDEVTYPE,TYP3380 . . . HRC106DK 00961500
- BE CONNCYL HRC106DK 00961600
- LA R7,32(0) PAGES / CYLINDER FOR 2314 @V200820 00962000
- CLI RDEVTYPE,TYP2314 . . . @V200820 00963000
- BE CONNCYL @V200820 00964000
- LA R7,24(0) PAGES / CYYLINDER FOR 2305/3340 @V2A2029 00965000
- CLI RDEVTYPE,TYP3340 . . . @V2A2029 00966000
- BE CONNCYL @V2A2029 00967000
- CLI RDEVTYPE,TYP2305 . . . @V200820 00968000
- BNE CONEXTT TRY NEXT DEVICE TYPE @V200820 00969000
- CONNCYL EQU * CALCULATE NUMBER OF CYLINDERS @V200820 00970000
- SLR R2,R2 @V200820 00971000
- L R3,BALR0 NUMBER OF PAGES REQUESTED @V200820 00972000
- DR R2,R7 DIVIDE BY PAGES / CYLINDER @V200820 00973000
- LTR R2,R2 REMAINDER ? @V200820 00974000
- BZ *+8 NO -- @V200820 00975000
- LA R3,1(0,R3) BUMP NUMBER OF CYLINDERS @V200820 00976000
- LA R6,0(R3,R3) GR6 = INDEX TO MASK BYTES @V200820 00977000
- LA R6,CONMASK-2(R6) POINT TO THE CORRECT MASKS @V200820 00978000
- L R10,RDEVALLN ALOCBLOK FOR THIS DEVICE @V200820 00979000
- LH R9,ALOCMAX MAXIMUM NUMBER OF AVAILABLE CYLS @V200820 00980000
- SH R9,ALOCUSED CHECK FOR ENOUGH REMAINING @V200820 00981000
- BNP CONEXTD NOPE - NEXT DEVICE, SAME TYPE @V200820 00982000
- CR R9,R3 ENOUGH TO FULFILL REQUEST ? @V200820 00983000
- BL CONEXTD NOPE - NEXT DEVICE, SAME TYPE @V200820 00984000
- LH R9,ALOCMAX MAXIMUM CYLINDERS AGAIN @V200820 00985000
- SRL R9,3(0) CONVERT TO BYTE INDEX LIMIT @V200820 00986000
- TM ALOCMAX+1,X'07' EVEN NUMBER OF BYTES IN MAP @V200820 00987000
- BNZ *+6 NO -- O.K. AS IS @V200820 00988000
- BCTR R9,0 STOP SHORT OF CYLINDER ZERO @V200820 00989000
- LA R10,ALOCMAP POINT TO FIRST MAP BYTE @V200820 00990000
- CONCYLF EQU * FIND THE UNUSED CYLINDERS @V200820 00991000
- SR R0,R0 EVEN / ODD INDICATOR @V200820 00992000
- IC R1,0(0,R6) PICK UP EVEN-BIT MASK @V200820 00993000
- EX R1,TESTCYL TEST FOR UNUSED CYLINDERS @V200820 00994000
- BZ CONFCYL FOUND THEM @V200820 00995000
- LA R0,1(0) NOW TRY THE ODD BITS @V200820 00996000
- IC R1,1(0,R6) . . . @V200820 00997000
- EX R1,TESTCYL @V200820 00998000
- BZ CONFCYL FOUND THEM @V200820 00999000
- LA R10,1(0,R10) NEXT BYTE IN THE MAP @V200820 01000000
- BCT R9,CONCYLF KEEP LOOKING @V200820 01001000
- B CONEXTD NEXT DEVICE OF THE SAME TYPE @V200820 01002000
- CONFCYL EQU * ALLOCATE OUR CYLINDERS @V200820 01003000
- EX R1,TAKECYL MARK CYLINDERS IN USE @V200820 01004000
- L R9,RDEVALLN RECOVER ALOCBLOK BASE ADDRESS @VM08819 01005000
- LH R15,ALOCUSED-ALOCBLOK(,R9) NO. CYLS USED @VM08819 01006000
- AR R15,R3 . . .WE TOOK THIS MANY @VM08819 01007000
- STH R15,ALOCUSED-ALOCBLOK(,R9) NEW CYLS USED @VM08819 01008000
- LH R5,ALOCMAX-ALOCBLOK(,R9) MAX. CYLINDER NUMBER @V200820 01009000
- SRL R5,1(0) COMPUTE MIDDLE CYLINDER NUMBER @V200820 01010000
- LA R9,ALOCMAP-ALOCBLOK(,R9) POINT TO START OF MAP @V200820 01011000
- SR R10,R9 GR10 = DISPLACEMENT TO BYTE USED @V200820 01012000
- SLL R10,2(0) . . .TIMES FOUR @VM08562 01013000
- LTR R0,R0 EVEN BIT OR ODD BIT USED ? @V200820 01014000
- BZ CONZGIN EVEN - OK AS IT IS @VM08562 01015000
- LNR R10,R10 MAKE DISPLACEMENT NEGATIVE @V200820 01016000
- SR R5,R3 R5 = LOWEST CYL USED. @VA01668 01017000
- CONZGIN EQU * @VM08562 01018000
- AR R5,R10 GR5 = CYLINDER NO. FOR BIT ZERO @V200820 01019000
- STH R5,BALR1 BUILD 'CCPD' FOR THE CALLER @V200820 01020000
- MVI BALR1+2,X'01' START AT PAGE ONE ON CYLINDER @V200820 01021000
- LH R0,RDEVCODE @V200820 01022000
- STC R0,BALR1+3 SET DEVICE CODE IN BALR1 @V200820 01023000
- ST R8,BALR8 PASS BACK THE RDEVBLOK ADDRESS @V200820 01024000
- LR R13,R3 NUMBER OF CYLINDERS USED @V200820 01025000
- LR R4,R2 SAVE REMAINDER FROM DIVIDE @V200820 01026000
- LR R6,R5 GR6 = FIRST CYLINDER USED @V200820 01027000
- LA R3,4(0,0) GR3 = RDEVRECS INDEX @V200820 01028000
- CONRBLD EQU * BUILD AND CHAIN RECBLOK'S @V200820 01029000
- L R10,RDEVALLN ALOCBLOK POINTER ONCE MORE @V200820 01030000
- LH R5,ALOCMAX CALCULATE MIDDLE CYLINDER @V200820 01031000
- SRL R5,1(0) . . . @V200820 01032000
- SR R5,R6 GR5 = DISPLACEMENT FROM CENTER @V200820 01033000
- LPR R5,R5 FORCE POSITIVE @V200820 01034000
- BAL R10,GETCORE BUILD AND CHAIN ONE RECBLOK @VM08534 01035000
- BCT R13,CONFULL BRANCH IF FULL CYLINDER USED @V200820 01036000
- LTR R4,R4 WAS THERE A REMAINDER ? @V200820 01037000
- BNZ *+8 YES - NOT QUITE FULL CYLINDER @V200820 01038000
- IC R4,RECMAX THIS ONE IS ALSO FULL @V200820 01039000
- STC R4,RECUSED SET THE NUMBER OF PAGES USED @V200820 01040000
- SLR R14,R14 CLEAR TWO REGS @V200820 01041000
- SLR R15,R15 @V200820 01042000
- ICM R14,8,=X'80' GET A HIGH-ORDER ONE BIT @V200820 01043000
- BCTR R4,0 DECREMENT RECORD COUNT @V200820 01044000
- CLM R4,B'0001',PAGE63 COUNT GREATER THAN 63 PAGES @V304498 01045000
- BH OVFL64PG YES, EXTEND ALLOCATION @V304498 01046000
- SRDA R14,0(R4) SHIFT TO PROPAGATE BITS @V200820 01047000
- O R14,RECMAP ALLOCATE THE PAGES @V200820 01048000
- O R15,RECMAP+4 . . . @V200820 01049000
- STM R14,R15,RECMAP @V200820 01050000
- CONEXIT EQU * @V200820 01051000
- LM R0,R15,BALRSAVE RESTORE REGISTERS @V200820 01052000
- BR R14 RETURN TO CALLER @V200820 01053000
- OVFL64PG MVC RECMAP(8),FFS Propagate first 64 bits HRC106DK 01054100
- S R4,=F'64' Determine middle (127-64) HRC106DK 01054200
- CLM R4,B'0001',PAGE63 Count still > than 63 Pages? HRC106DK 01054300
- BH OVF128PG Yes, extend allocation again HRC106DK 01054400
- SRDA R14,0(R4) SHIFT TO PROPAGATE BITS @V304498 01055000
- O R14,RECMAP+8 ALLOCATE THE BITS @V304498 01056000
- O R15,RECMAP+12 . . . @V304498 01057000
- STM R14,R15,RECMAP+8 . . . @V304498 01058000
- B CONEXIT RESTORE REGISTERS @V304498 01060000
- OVF128PG MVC RECMAP+8(8),FFS Propagate middle 64 bits HRC106DK 01060100
- S R4,=F'64' Determine remainder (191-128) HRC106DK 01060200
- SRDA R14,0(R4) Shift to propagate bits HRC106DK 01060300
- O R14,RECMAP+16 Allocate the bits HRC106DK 01060400
- O R15,RECMAP+20 . . . HRC106DK 01060500
- STM R14,R15,RECMAP+16 . . . HRC106DK 01060600
- B CONEXIT Restore registers HRC106DK 01060700
- SPACE 01061000
- CONFULL EQU * THIS CYLINDER IS COMPLETELY USED @V200820 01062000
- IC R0,RECMAX MAXIMUM NUMBER OF PAGES @V200820 01063000
- STC R0,RECUSED THEY ARE ALL IN USE @V200820 01064000
- MVI RECMAP,X'FF' FILL IN RECMAP @V304498 01065000
- MVC RECMAP+1(15),RECMAP PROPAGATE FOR 124 PAGES @V304498 01066000
- MVC RECMAP+1(23),RECMAP Propagate for 188 pages HRC106DK 01066100
- SLR R7,R7 .. @VM01056 01067000
- IC R7,RECMAX GR7 = PAGES / CYLINDER @VM01056 01068000
- LH R6,RECCYL CYLINDER FOR THIS RECBLOK @V200820 01069000
- LA R6,1(0,R6) ADD ONE FOR NEXT CYLINDER USED @V200820 01070000
- B CONRBLD GO BUILD ANOTHER RECBLOK @V200820 01071000
- SPACE 01072000
- CONFAIL EQU * TEMPSPACE IS NOT AVAILABLE @V200820 01073000
- SLR R1,R1 @V200820 01074000
- ST R1,BALR1 PASS CODE BACK TO CALLER @V200820 01075000
- B CONEXIT . . . @V200820 01076000
- SPACE 01077000
- TESTCYL TM 0(R10),*-* EXECUTED TO FIND CYLINDERS @V200820 01078000
- TAKECYL OI 0(R10),*-* EXECUTED TO ALLOCATE CYLINDERS @V200820 01079000
- SPACE 01080000
- CONMASK DC X'8040' EVEN / ODD MASKS FOR 1 CYLINDER @V200820 01081000
- DC X'A050' FOR 2 CYLINDERS @V200820 01082000
- DC X'A854' FOR 3 CYLINDERS @V200820 01083000
- DC X'AA55' FOR 4 CYLINDERS @V200820 01084000
- PAGE63 DC X'3F' CONSTANT - 63 PAGES @V304498 01085000
- EJECT 01086000
- *. 01087000
- * 01088000
- * SUBROUTINE NAME - 01089000
- * 01090000
- * DMKPGTVG 01091000
- * 01092000
- * FUNCTION - 01093000
- * 01094000
- * TO ALLOCATE A PAGE OF VIRTUAL STORAGE SPACE BELONGING 01095000
- * TO THE CP PAGING VMBLOK 01096000
- * 01097000
- * ATTRIBUTES - 01098000
- * 01099000
- * SERIALLY REUSABLE, RESIDENT, CALLED VIA SVC 01100000
- * 01101000
- * ENTRY POINTS - 01102000
- * 01103000
- * DMKPGTVG 01104000
- * 01105000
- * ENTRY CONDITIONS - 01106000
- * 01107000
- * GPR12 = DMKPGTVG BASE ADDRESS 01108000
- * GPR13 = ADDRESS OF STANDARD SAVEAREA 01109000
- * 01110000
- * EXIT CONDITIONS - 01111000
- * 01112000
- * NORMAL - 01113000
- * CALLER'S GPR1 CONTAINS THE ADDRESS OF THE VIRTUAL PAGE 01114000
- * THAT IS ALLOCATED 01115000
- * 01116000
- * ERROR - 01117000
- * NONE 01118000
- * 01119000
- * CALLS TO OTHER ROUTINES - 01120000
- * 01121000
- * NONE 01122000
- * 01123000
- * EXTERNAL REFERENCES - 01124000
- * 01125000
- * NONE 01126000
- * 01127000
- * TABLES / WORKAREAS - 01128000
- * 01129000
- * PAGETABL IS AN ALLOCATION TABLE CONTAINING 640 BITS, 1 BYTE 01130000
- * FOR EACH PAGE (DEPENDENT ON DMKPGTBN) AVAILABLE TO 01131000
- * DMKPGTVG FOR ALLOCATION. IT IS REFERENCED AND UPDATED 01132000
- * DURING ALLOCATION. 01133000
- * 01134000
- * DMKPGTBN IS A ONE BYTE COUNTER CONTAINING THE NUMBER 01135000
- * OF BYTES (1 BYTE EQUALS 8 PAGES) IN PAGETABL TO BE USED FOR 01136000
- * ALLOCATION. THIS COUNTER IS INITIALIZED TO 16 (128 PAGES) FOR 01137000
- * REAL STORAGE SIZE OF 256K TO 655,360 BYTES. 01138000
- * DMKCPI WILL MODIFY DMKPGTBN TO 40 (320 PAGES) FOR REAL 01139000
- * STORAGE OF 655,361 TO 1.1MEG AND TO 80 (640 PAGES) 01140000
- * FOR REAL STORAGE OVER 1.1MEG. 01141000
- * 01142000
- * NOTE - REAL STORAGE SIZE REFERS TO THE LOWEST VALUE 01143000
- * VM SYSGEN SIZE VALUE OR REAL MACHINE STORAGE VALUE. 01144000
- * 01145000
- * REGISTER USAGE - 01146000
- * 01147000
- * GPR0,1 ARE WORK REGISTERS 01148000
- * GPR2 = FUNCTION REGISTER FOR TRT 01149000
- * GPR3,4 ARE WORK REGISTERS 01150000
- * GPR5-11 ARE NOT USED 01151000
- * GPR12 = DMKPGT BASE REGISTER 01152000
- * GPR13 = ADDRESS OF STANDARD SAVEAREA 01153000
- * GPR14,15 USED FOR BALR LINKAGE 01154000
- * 01155000
- * NOTES - 01156000
- * 01157000
- * NONE 01158000
- * 01159000
- * OPERATION - 01160000
- * 01161000
- * 1. PAGETABL IS SCANNED FOR A ZERO BIT. IF NO BITS ARE 01162000
- * ARE ZERO, GO TO STEP 4; OTHERWISE, CONTINUE 01163000
- * 01164000
- * 2. MARK THE PAGE AS ALLOCATED BY SETTING THE BIT TO ONE 01165000
- * 01166000
- * 3. COMPUTE THE PAGE ADDRESS AND PASS IT BACK TO THE CALLER 01167000
- * 01168000
- *. 01169000
- EJECT 01170000
- ENTRY DMKPGTVG 01171000
- USING DMKPGTVG,R15 @V304498 01172000
- DMKPGTVG STM R0,R15,BALRSAVE ENTER AND SAVE REGS 01173000
- L R12,=A(DMKPGT) STANDARD ADDRESSABILITY 01174000
- DROP R15 01175000
- USING DMKPGT,R12 01176000
- SR R2,R2 CLEAR FUNCTION REGISTER FOR TRT 01177000
- SR R4,R4 CLEAR COUNT REG @VA00919 01178000
- IC R4,DMKPGTBN GET BUFFER NUMBER/8 VALUE @VA00919 01179000
- BCT R4,*+10 COUNT -1 FOR TRT EXECUTE @VA00919 01180000
- EXTRT TRT PAGETABL(0),FREETABL LOOK FOR AN UNUSED BUFFER @VA00919 01181000
- EX R4,EXTRT EXEUTE TRT INSTRUCTION @VA00919 01182000
- BNZ PGT8A GOOD IF WE HAVE ONE. @VA01261 01183000
- ABEND 8 ABEND - NO VIRTUAL PAGE BUFFERS. @VA01261 01184000
- PGT8A EQU * @VA01261 01185000
- IC R3,ALLOCTBL-1(R2) GET BIT MASK TO MARK PAGE 01186000
- * AS NOT AVAILABLE 01187000
- EX R3,ALLOCATE AND DO IT 01188000
- S R1,=A(PAGETABL) DISPLACEMENT OF BYTE IN PAGETABLE 01189000
- SLL R1,3 MULTIPLY BY 8 FOR PAGE NUMBER 01190000
- * R2 CONTAINS A VALUE 1 - 8 01191000
- ALR R1,R2 GET PAGE NUMBER WITHIN 256K BLOCK 01192000
- SLL R1,12 GET PAGE ADDRESS 01193000
- AL R1,=A(DMKCKP) GET START OF SYSTEM'S VIRTUAL MEMORY 01194000
- LTR R1,R1 SET CONDITION CODE 01195000
- ST R1,BALR1 PASS BACK ADDRESS OF PAGE 01196000
- B EXIT AND EXIT 01197000
- EJECT 01198000
- *. 01199000
- * 01200000
- * SUBROUTINE NAME - 01201000
- * 01202000
- * DMKPGTVR 01203000
- * 01204000
- * FUNCTION - 01205000
- * 01206000
- * TO RELEASE A PAGE OF VIRTUAL MEMORY SPACE 01207000
- * 01208000
- * ATTRIBUTES - 01209000
- * 01210000
- * SERIALLY REUSABLE, RESIDENT, CALLED VIA SVC 01211000
- * 01212000
- * ENTRY POINTS - 01213000
- * 01214000
- * DMKPGTVR 01215000
- * 01216000
- * ENTRY CONDITIONS - 01217000
- * 01218000
- * GPR1 = ADDRESS OF VIRTUAL PAGE TO BE RELEASED 01219000
- * GPR12 = DMKPGTVR BASE REGISTER 01220000
- * GPR14 = ADDRESS OF STANDARD SAVEAREA 01221000
- * 01222000
- * EXIT CONDITIONS - 01223000
- * 01224000
- * NORMAL - 01225000
- * PAGETABL IS UPDATED 01226000
- * 01227000
- * ERROR - 01228000
- * NONE 01229000
- * 01230000
- * CALLS TO OTHER ROUTINES - 01231000
- * 01232000
- * NONE 01233000
- * 01234000
- * EXTERNAL REFERENCES - 01235000
- * 01236000
- * NONE 01237000
- * 01238000
- * TABLES / WORKAREAS - 01239000
- * 01240000
- * PAGETABL IS UPDATED TO REFLECT THE AVAILABILITY OF THE 01241000
- * RELEASED PAGE, UNLESS IT HAS BEEN ASSIGNED TO A DEFERED 01242000
- * REQUEST 01243000
- * 01244000
- * REGISTER USAGE - 01245000
- * 01246000
- * GPR0-4 ARE WORK REGISTERS 01247000
- * GPR5-11 ARE NOT USED 01248000
- * GPR12 = DMKPGT BASE REGISTER 01249000
- * GPR13 = ADDRESS OF STANDARD SAVEAREA 01250000
- * GPR14,15 ARE USED FOR BALR LINKAGE AND RETURN 01251000
- EJECT 01252000
- * 01253000
- * NOTES - 01254000
- * 01255000
- * NONE 01256000
- * 01257000
- * OPERATION - 01258000
- * 01259000
- * 1. VERIFY THAT PAGE TO BE DE-ALLOCATED IS IN FACT ALLOCATED 01260000
- * 01261000
- * 2. IF ANY DEFERED REQUESTS ARE QUEUED FROM VPAGQST, GO TO 01262000
- * STEP 5; OTHERWISE, CONTINUE 01263000
- * 01264000
- * 3. LOCATE THE BIT THAT REPRESENTS THE PAGE BEING DEALLOCATED, 01265000
- * AND SET IT ZERO 01266000
- * 01267000
- * 4. RETURN TO CALLER 01268000
- * 01269000
- *. 01270000
- EJECT 01271000
- ENTRY DMKPGTVR 01272000
- USING *,R15 01273000
- DMKPGTVR STM R0,R15,BALRSAVE ENTER AND STORE REGS 01274000
- L R12,=A(DMKPGT) STANDARD ADDRESSABILITY 01275000
- DROP R15 01276000
- USING DMKPGT,R12 01277000
- SPACE 01278000
- LR R4,R1 SAVE PAGE ADDRESS 01279000
- SL R1,=A(DMKCKP+4096) GET START OF SYSTEM'S VIRTUAL MEMORY 01280000
- LR R2,R1 SET FOR DOUBLE REGISTER SHIFT 01281000
- SRDL R2,15 GET PAGE NUMBER/8 01282000
- SRL R3,29 AND REMAINDER 01283000
- IC R3,ALLOCTBL(R3) GET BIT MASK FOR ALLOCATED PAGE 01284000
- LA R1,PAGETABL(R2) POINT TO CORRECT BYTE TO TEST 01285000
- EX R3,TEST AND SEE IF PAGE IS ALLOCATED 01286000
- BNZ PGT7A PAGE IN USE -- 01287000
- ABEND 7 TRYING TO DE-ALLOCATE PAGE NOT IN USE 01288000
- PGT7A EQU * 01289000
- EX R3,DEALLOC DE-ALLOCATE THE PAGE BUFFER @VA01261 01290000
- EXIT LM R0,R15,BALRSAVE RESTORE REGS 01291000
- BR R14 AND EXIT TO CALLER 01292000
- EJECT 01293000
- ****************************** 01294000
- * 01295000
- * CONSTANTS, TABLES AND EXECUTED INSTRUCTIONS -- 01296000
- * 01297000
- ****************************** 01298000
- SPACE 3 01299000
- RECOMP CLI RECMAX,0 EXECUTED TO SEE IF ANY PAGES IN THE 01300000
- * REFERENCED BLOK ARE AVAILABLE 01301000
- SPACE 01302000
- GETCYL TRT ALOCMAP(*-*),FREETABL EXECUTED TO LOCATE AN UNUSED 01303000
- * CYLINDER IN AN ALOCBLOK 01304000
- SPACE 01305000
- ALLOCATE OI 0(R1),0 EXECUTED TO MARK A PAGE OR CYLINDER 01306000
- * ALLOCATED (IE, SET BIT = 1) 01307000
- SPACE 01308000
- TESTODD TM FREETABL,0 EXECUTED TO SEE IF THE NUMBER IN THE 01309000
- * EXECUTION REGISTER IS ODD (IF IT IS, 01310000
- * THE TM WILL RETURN A CONDITION CODE OF 1) 01311000
- SPACE 01312000
- TEST TM 0(R1),0 EXECUTED TO TEST IF THE PAGE OR CYLINDER 01313000
- * THAT IS ABOUT TO BE DE-ALLOCATED HAS 01314000
- * BEEN ALLOCATED (IF IT HAS, THE TM WILL 01315000
- * RETURN A CONDITION CODE OF 1) 01316000
- SPACE 01317000
- DEALLOC XI 0(R1),0 EXECUTED TO DE-ALLOCATE THE ALLOCATED 01318000
- * PAGE OR CYLINDER (IE, SET BIT = 0) 01319000
- SPACE 01320000
- FREETABL EQU * TRT FUNCTION TABLE USED TO LOCATE THE RELATIVE BIT 01321000
- * POSITION OF THE FIRST ZERO BIT IN AN ALLOCATION MAP 01322000
- DC 128X'01' FIRST BIT IS 0 01323000
- DC 64X'02' SECOND BIT IS 0 01324000
- DC 32X'03' AND SO ON -- 01325000
- DC 16X'04' 01326000
- DC 8X'05' 01327000
- DC 4X'06' 01328000
- DC 2X'07' 01329000
- DC X'08' 01330000
- DC X'00' NO BIT IS 0 -- 01331000
- SPACE 01332000
- ALLOCTBL EQU * BIT MAP TABLE WHOSE ENTRIES ARE LOCATED BY INDEXING 01333000
- * WITH THE FUNCTION RETURNED IN GPR2 AFTER TRTING 01334000
- * AGAINST FREETABL (ABOVE). EACH ENTRY CONTAINS THE 01335000
- * BIT TO BE TURNED ON (OR OFF) BY EXECUTING ONE OF 01336000
- * THE 'ALLOCATE' OR 'DEALLOC' INSTRUCTIONS ABOVE -- 01337000
- DC X'8040201008040201' 01338000
- SPACE 01339000
- PAGETABL EQU * VIRTUAL PAGE ALLOCATION TABLE - EACH BIT REPRESENTS 01340000
- * A PAGE OF VIRTUAL STORAGE BELONGING TO THE DUMMY 01341000
- * USERTHAT CONTROLS CP PAGING 01342000
- DC XL160'00' 1280 VIRTUAL PAGE MAX @VA06119 01343000
- DMKPGTBN DC AL1(16) NUMBER OF VIRTUAL BUFFERS/8 (128 @VA00919 01344000
- * DEFAULT VAULE - MODIFIED BY DMKCPI 01345000
- EJECT 01346000
- * PAGING AND SPOOLING ALLOCATION CHAIN ANCHORS 01347000
- SPACE 01348000
- DMKPGTP5 DC A(0) PREFERRED PAGING DEVICES - 2305 01349000
- DMKPGTP0 DC A(0) PREFERRED PAGING DEVICES - 3330 01350000
- DMKPGT4P DC A(0) PREFERRED PAGING DEVICES - 3340 @V2A2029 01351000
- DMKPGT5P DC A(0) PREFERRED PAGING DEVICES - 3350 @VA08602 01352000
- DMKPGT7P DC A(0) Preferred paging devices - 3375 HRC106DK 01352100
- DMKPGT8P DC A(0) Preferred paging devices - 3380 HRC106DK 01352200
- DMKPGTP4 DC A(0) PREFERRED PAGING DEVICES - 2314 01353000
- SPACE 01354000
- DMKPGTT5 DC A(0) GENERAL SPOOLING/PAGING DEVICES - 2305 01355000
- DMKPGTT0 DC A(0) GENERAL SPOOLING/PAGING DEVICES - 3330 01356000
- DMKPGT4T DC A(0) GENERAL SPOOLING/PAGING - 3340 @V2A2029 01357000
- DMKPGT5T DC A(0) GENERAL SPOOLING/PAGING - 3350 @VA08602 01358000
- DMKPGT7T DC A(0) General spooling/paging - 3375 HRC106DK 01358100
- DMKPGT8T DC A(0) General spooling/paging - 3380 HRC106DK 01358200
- DMKPGTT4 DC A(0) GENERAL SPOOLING/PAGING DEVICES - 2314 01359000
- SPACE 01360000
- DC F'-1' FENCE 01361000
- SPACE 3 01362000
- DMKPGTTU DC F'0' NUMBER OF TEMPORARY CYLINDERS IN USE 01363000
- SPACE 01364000
- DMKPGTTM DC F'0' MAXIMUM NUMBER OF CYLINDERS AVAILABLE 01365000
- SPACE 01366000
- DMKPGT90 DC F'0' 90 PERCENT OF AVAILABLE CYLINDERS 01367000
- SPACE 3 01368000
- MSGSW DC X'00' 01369000
- UCTL DC X'00' USER STORAGE ALLOCATION FLAGS 01370000
- UCTLDR EQU X'80' DO VMPDISK/VMPDRUM ACCOUNTING @VM01031 01371000
- UCTLSYS EQU X'40' USE SYS VMBLOK FOR THE ACCOUNTING@VM01031 01372000
- PAGE4 EQU X'10' 3350 CYLINDER 0 PAGE 4 SLOT @V304498 01373000
- SPACE 3 01374000
- * 01374400
- DRMLIM DS 0H @V408246 01374600
- DMKPGTDF DC XL2'0',H'0' DRUM LIMIT FLAGS AND COUNT @V408246 01374800
- SPACE 2 01375000
- LTORG 01376000
- EJECT 01377000
- COPY SAVE 01378000
- COPY ALLOC 01379000
- COPY CORE 01380000
- COPY RBLOKS 01381000
- PSA 01382000
- COPY IOBLOKS 01383000
- COPY VMBLOK 01384000
- COPY DEVTYPES 01385000
- COPY EQU 01386000
- END 01387000
ibm/vm370-lib/cp/dmkpgt.assemble_src.txt ยท Last modified: 2023/08/06 13:37 by Site Administrator