VMD TITLE 'DMKVMD (CP) VM/370 - RELEASE 6' 00001000 ISEQ 73,80 @V67CAH7 00002000 *. 00003000 * 00004000 * MODULE NAME - 00005000 * 00006000 * DMKVMD 00007000 * 00008000 * FUNCTION - 00009000 * 00010000 * DMKVMD DUMPS VIRTUAL MACHINES TO SPOOL BLOCKS IN BINARY FORM. 00011000 * THE OUTPUT IS READ BY DIAGNOSE X14. 00012000 * THE PRIMARY USER IS IPCS. 00013000 * 00014000 * ORIGIN/S&D CODE - @V67CAH7 00015000 * 00016000 * COMMAND - 00017000 * 00018000 * VMDUMP (FORMAT VMTYPE) (TO * ) (( )(-|:(HEXLOC2))) 00019000 * (TO USERID) (( )( ( END ))) 00020000 * (SYSTEM ) ((HEXLOC1) ) 00021000 * (( 0 )( . (BYTECNT))) 00022000 * (( )( ( END ))) 00023000 * (DSS) (*DUMPID) 00024000 * 00025000 * ATTRIBUTES - 00026000 * 00027000 * REENTRANT, PAGEABLE, CALLED VIA SVC 8 00028000 * 00029000 * ENTRY POINT - 00030000 * 00031000 * DMKVMDEP - ENTRY POINT 00032000 * 00033000 * ENTRY CONDITIONS - 00034000 * 00035000 * GPR9 - ADDRESS OF THE COMMAND LINE. 00036000 * GPR11 - ADDRESS OF THE USERS VMBLOK. 00037000 * GPR12 - ADDRESS OF THE ENTRY POINT. 00038000 * GPR13 - ADDRESS OF THE STANDARD SAVE AREA. 00039000 * 00040000 * EXIT CONDITIONS - 00041000 * 00042000 * NORMAL - GPR2 = 0 00043000 * ERROR - GPR2 = ERROR MESSAGE CODE NUMBER 00044000 EJECT 00045000 * 00046000 * CALLS TO OTHER ROUTINES - 00047000 * 00048000 * DMKCKSPL - CHECKPOINT DUMP FILE 00049000 * DMKCVTBH - CREATE PRINTABLE HEX FROM BINARY FOR ERROR MSG 00050000 * DMKCVTDT - GET CURRENT DATE AND TIME FOR SFBLOK 00051000 * DMKCVTHB - TO CONVERT COMMAND LINE PRINTABLE HEX TO BINARY 00052000 * DMKERMSG - WRITE ERROR MESSAGES 00053000 * DMKFREE - TO GET STORAGE FOR SFBLOK AND BIT MAP 00054000 * DMKFRET - TO FREE STORAGE...BIT MAP, IF ERROR ALSO SFBLOK 00055000 * DMKPGTSG - TO GET SPOOL SPACE 00056000 * DMKPGTVG - GET A VIRTUAL PAGE 00057000 * DMKPGTVR - RELEASE VIRTUAL PAGES 00058000 * DMKPTRAN - TO BRING USER AND SYSTEM PAGES INTO STORAGE 00059000 * DMKPTRUL - UNLOCK PAGES IN REAL STROAGE 00060000 * DMKRPAGT - READ IN SPOOL RECORDS 00061000 * DMKRPAPT - WRITE OUT SPOOL RECORDS 00062000 * DMKRSPDP - NEW DUMP QUEUE 00063000 * DMKRSPID - OBTAIN SFBLOK ID 00064000 * DMKRSPRD - ADD DUMP TO READER QUEUE 00065000 * DMKSCNFD - TO LOCATE THE NEXT ARGUMENT IN THE COMMAND LINE 00066000 * DMKSPLDL - DELETE SPOOL FILES 00067000 * DMKSYSDU - USERID OF SYSTEM DUMP DISPOSITION 00068000 * DMKUDRFU - TO CHECK THE VALIDITY OF A USERID 00069000 * 00070000 * TABLES/WORKAREAS 00071000 * 00072000 * SFBLOK 00073000 * SAVEAREA 00074000 * PSA 00075000 * VMBLOK 00076000 * BITMAP - CREATED TEMPORARILY IN STORAGE 00077000 * KEY MAP - CREATED TEMPORARILY IN SYSTEM VIRTUAL PAGES IN STOR 00078000 * OUTPUT BUFFER WHERE SPOOL BLOCKS ARE BUILT PRIOR TO WRITING 00079000 * TO DASD STORAGE 00080000 * 00081000 * REGISTER USAGE - 00082000 * 00083000 * R0 = WORK REGISTER 00084000 * R1 = SOMETIME BASE OF BITMAP...LOTS OF TIME WORK REG 00085000 * R2 = VIRTUAL PAGES BASE...IT'S A REAL ADDRESS 00086000 * R3 = RANGE POINTER ...POINTS TO RANGE SPECIFICATION BEING PROCESSED 00087000 * R4 = CURRENT ADDRESS OF VIRTUAL PAGE, BEING DUMPED 00088000 * R5 = SFBLOK POINTER 00089000 * R6 = VIRTUAL PAGES INDEX INTO R2 00090000 * R7 = PROGRAMS BAL REGISTER 00091000 * R8 = SPOOL INDEX INTO R10 00092000 * R9 = BUFFER POINTER...LATER BASE FOR BITMAP AND WORKAREA 00093000 * R10 = SPOOL RECORD BASE OR SPLINK BASE 00094000 * R11 = VMBLOK POINTER 00095000 * R12 = PROGRAMS BASE REGISTER 00096000 * R13 = PROGRAMS SAVEAREA AND SAVEWRK'S 00097000 * R14 = WORK REGISTER 00098000 * R15 = WORK REGISTER 00099000 EJECT 00100000 * 00101000 * NOTES - NONE 00102000 * 00103000 * OPERATION - 00104000 * 00105000 * THIS MODULE IS CALLED BY THE COMMAND ANALYSIS ROUTINE DMKCFM. 00106000 * INITIALLY THE PARAMETERS OF THE COMMAND ARE EXAMINED, AND 00107000 * INDICATORS OR ADDRESSES STORED. THEN THREE PAGES OF SPOOL 00108000 * SPACE ARE RESERVED FOR THE DMPINREC AND DMPKEY1 AND 2 RECORDS. 00109000 * NEXT, THE ADDRESSES REQUESTED ARE DUMPED TO SPOOL SPACE, WHILE 00110000 * THE KEYS ARE SAVED AND A BIT MAP CREATED. AFTER ALL ADDRESSES 00111000 * ARE DUMPED, THE DMPINREC AND KEY RECORDS ARE BUILT. LAST, THE 00112000 * SPACES ARE FREED UP AND A RETURN IS ISSUED. 00113000 * 00114000 * DETAILED OPERATION - 00115000 * 00116000 * 1. ZERO WORK AREAS. 00117000 * 2. GET SFBLOK SPACE, ZERO IT, MOVE SFBFNAME 'VMDUMP' IN. 00118000 * 3. GET NEXT ENTRY ON COMMAND LINE, IF NONE PRESENT GO TO 9. 00119000 * 4. CHECK IF ENTRY IS 'TO', IF NOT CONTINUE. ELSE, VERIFY 00120000 * 'TO' AND NEXT PARAMETER AS ITS SPECIFICATION AND GO TO 3. 00121000 * 5. CHECK IF ENTRY IS 'SYSTEM', IF NOT CONTINUE. ELSE, VERIFY 00122000 * AND GO TO 3. 00123000 * 6. CHECK IF ENTRY IS 'FORMAT', IF NOT CONTINUE. ELSE, VERIFY 00124000 * 'FORMAT' AND ITS PARAMETER, AND GO TO 3. 00125000 * 7. CHECK IF ENTRY IS 'DSS', IF NOT CONTINUE. ELSE SET 00126000 * INDICATOR AND GO TO 3. 00127000 * 8. CHECK IF ENTRY IS '*', IF NOT GO TO 10. ELSE, TAKE REST OF 00128000 * COMMAND LINE UP TO 100 CHARACTERS AS COMMENT. 00129000 * 9. FULL LINE IS SEARCHED. VERIFY THAT 'TO' IS SPECIFIED OR 00130000 * TAKE DEFAULT. VERIFY THAT A RANGE IS SPECIFIED OR DEFAULT 00131000 * TO 0-END. GO TO 11. 00132000 * 10.1 ENTRY IS ASSUMED TO BE A RANGE. DETERMINE IF ENTRY IS 00133000 * SINGLE ENTRY, ADDRESS AND BYTECOUNT, OR ADDRESS TO 00134000 * ANOTHER ADDRESS. 00135000 * 10.2 VERIFY NUMBERS AND TAKE DEFAULTS IF NECESSARY. 00136000 * 10.3 ROUND ADDRESSES TO PAGE BOUNDARIES AND SAVE THEM. GO TO 3. 00137000 * 11. ORDER ADDRESS RANGES IN ASCENDING ORDER. MERGE ADDRESS 00138000 * RANGES TOGETHER IF POSSIBLE. 00139000 * 12. FINISH BUILDING SFBLOK AND ADD IT TO DUMP IN PROCESS QUEUE. 00140000 * 13. GET BITMAP SPACE AND ZERO IT OUT. 00141000 * 14. GET SPACE FOR BUILDING SPOOL RECORDS IN MAIN STORAGE, AND 00142000 * ZERO IT OUT. GET MAIN STORAGE SPACE FOR 2 KEY PAGES AND 00143000 * ZERO THEM OUT. 00144000 * 15. WRITE 3 DUMMY SPOOL BLOCKS. THESE WILL LATER BE BUILT INTO 00145000 * DMPINREC, DMPKYREC 1 AND 2. 00146000 * 16. DUMP ADDRESS RANGES IN SPOOL BLOCK FORM. UPDATING BIT MAP 00147000 * (INDICATOR OF PAGES DUMPED) AND KEY MAPS CONCURRENTLY. 00148000 * SEVERAL BAL ROUTINES ARE USED TO ASSIST: 17, 18, 19. 00149000 * 17. GETPAGE ROUTINE, BRINGS PAGE INTO STORAGE, GETS KEYS FOR 00150000 * PAGE, UPDATES KEY MAPS, AND RETURNS. 00151000 * 18. WRSPOOL ROUTINE, UPDATES SPLINK AND WRITES SPOOL RECORD 00152000 * OUT TO DASD. 00153000 * 19. GETCCPD ROUTINE, GETS CCPD FOR NEXT SPOOL RECORD, AND 00154000 * RETURNS IF CCPD IS AVAILABLE. ELSE, COMPLETE SPLINK CHAIN 00155000 * WITH CURRENT RECORD POINTING BACK TO FIRST RECORD, TAKE 00156000 * SFBLOK OFF DUMP QUEUE AND ADD IT TO DELETE QUEUE. GO TO 24. 00157000 * 20. ALL DONE DUMPING USERS DEFINED STORAGE. IF VMDUMP REQUESTED 00158000 * 'DSS', DUMP DISCONTIGUOUS SAVED SEGMENTS IF EXISTANT. 00159000 * 21. READ IN RECORD 1, BUILD DMPINREC IN IT, WRITE IT OUT. 00160000 * BUILDING MUST WAIT TILL HERE BECAUSE IT CONTAINS BITMAP. 00161000 * 22. READ IN RECORDS 2, 3, AND 4, PUT KEY DATA IN THEM, WRITE 00162000 * THEM OUT. DMPKYREC 1 AND 2. 00163000 * 23. REMOVE COMPLETED DUMPS SFBLOK FROM DUMP IN PROGRESS QUEUE 00164000 * AND ADD IT TO END OF READER QUEUE. 00165000 * 24. FREE UP GOTTEN MAIN STORAGE SPACE, IF ENTERED HERE FROM 19, 00166000 * GO TO 25. ELSE END PROGRAM. 00167000 * 25. ERROR ROUTINES... 00168000 * 00169000 * ERROR MESSAGES - 00170000 * 00171000 * DMKVMD009E - INVALID RANGE - 'RANGE' 00172000 * DMKVMD013E - CONFLICTING OPTIONS - 'OPTION' 00173000 * DMKVMD020E - USERID MISSING OR INVALID 00174000 * DMKVMD033E - HEXLOC MISSING OR INVALID 00175000 * DMKVMD038E - PARAMETER FOR 'OPTION' OPTION MISSING OR INVALID 00176000 * DMKVMD053E - 'USERID' NOT IN CP DIRECTORY 00177000 * DMKVMD146E - DUMP FAILED, SPOOLING ERROR 00178000 * DMKVMD160E - HEXLOC 'HEXLOC' EXCEEDS STORAGE 00179000 * 00180000 *. 00181000 EJECT 00182000 COPY OPTIONS @V67CAH7 00183000 COPY LOCAL @V67CAH7 00184000 DMKVMD CSECT @V67CAH7 00185000 MODID DC C'DMKVMD ' @V67CAH7 00186000 SPACE 2 00187000 USING PSA,R0 @V67CAH7 00188000 USING RANGES,R3 @V67CAH7 00189000 USING VMBLOK,R11 @V67CAH7 00190000 USING SAVEAREA,R13 @V67CAH7 00191000 USING BUFFER,R9 @V67CAH7 00192000 SPACE 2 00193000 EXTRN DMKCKSPL,DMKCVTBH,DMKCVTDT,DMKCVTHB,DMKERMSG @V67CAH7 00194000 EXTRN DMKFREE,DMKFRET,DMKPGTSG,DMKPGTVG,DMKPGTVR @V67CAH7 00195000 EXTRN DMKPTRUL,DMKRPAGT,DMKRPAPT,DMKRSPDP,DMKRSPID @V67CAH7 00196000 EXTRN DMKRSPRD,DMKSCNFD,DMKSPLDL,DMKSYSDU,DMKUDRFU @V67CAH7 00197000 EJECT 00198000 *********************************************************************** 00199000 * * 00200000 * 1.2.3. ENTRY * 00201000 * * 00202000 *********************************************************************** 00203000 SPACE 2 00204000 DMKVMDEP RELOC @V67CAH7 00205000 SPACE 2 00206000 XC SAVEWRK1,SAVEWRK1 * ZERO WORK @V67CAH7 00207000 XC SAVEWRK2(32),SAVEWRK2 * AREA @V67CAH7 00208000 LA R3,SAVEWRK2 ESTABLISH RANGE POINTER @V67CAH7 00209000 SPACE 2 00210000 LA R0,SFBSIZE * GET SPACE FOR @V67CAH7 00211000 CALL DMKFREE * SFBLOK @V67CAH7 00212000 LR R5,R1 SAVE POINTER TO SFBLOK @V67CAH7 00213000 USING SFBLOK,R5 @V67CAH7 00214000 XC SFBLOK(SFBSIZE*8),SFBLOK ZERO GOTTEN AREA @V67CAH7 00215000 MVC SFBFNAME(7),=C'VMDUMP ' PUT DEFAULT NAME IN @V67CAH7 00216000 MVC SFBFNAME+7(17),SFBFNAME+6 * TYPE AREA @V67CAH7 00217000 MVC SFBUSER,BLANKS BLANK OUT USERID FIELD @V67CAH7 00218000 SPACE 2 00219000 GETNEXT DS 0H @V67CAH7 00220000 CALL DMKSCNFD GET NEXT FIELD 00221000 SPACE 00222000 * DMKSCNFD FINDS THE ENTRIES WITHIN THE COMMAND LINE, AT EXIT R0 HAS 00223000 * LENGTH OF ENTRY AND R1 POINTS TO ENTRYS FIRST BYTE 00224000 SPACE 00225000 BNZ LINEDONE IF LINE COMPLETELY READ...BRANCH @V67CAH7 00226000 EJECT 00227000 *********************************************************************** 00228000 * * 00229000 * 4. IS PARAMETER = TO ? * 00230000 * * 00231000 *********************************************************************** 00232000 SPACE 2 00233000 * 00234000 CHKTO DS 0H @V67CAH7 00235000 C R0,F2 COMPARE LENGTH TO 2 @V67CAH7 00236000 BNE CHKSYSTM NO...NOT 'TO' @V67CAH7 00237000 CLC 0(2,R1),=C'TO' * IS THIS 'TO' PARAMETER @V67CAH7 00238000 BNE CHKSYSTM * NO...CHECK FOR FORMAT @V67CAH7 00239000 TM SAVEWRK1,SETTO * 'TO' BEEN FOUND BEFORE @V67CAH7 00240000 BO VMD013 * YES...ERROR ROUTINE @V67CAH7 00241000 OI SAVEWRK1,SETTO SET 'TO' FOUND INDICATOR ON @V67CAH7 00242000 CALL DMKSCNFD * GET THE 'TO' REQUEST 00243000 BNZ VMD020 * IF NO ENTRY..ERROR @V67CAH7 00244000 * R0 HAS LENGTH..R1 HAS ADDRESS OF ENTRY FOLLOWING 'TO' 00245000 C R0,F1 * IS ENTRY'S LENGTH 1 BYTE? @V67CAH7 00246000 BNE NOTSELF * NO..BRANCH AROUND * CHECK @V67CAH7 00247000 CLI 0(R1),C'*' * IS ENTRY = '*' @V67CAH7 00248000 BNE NOTSELF * NO...BRANCH AROUND @V67CAH7 00249000 * ENTRY IS '*' 00250000 MVC SFBUSER,VMUSER GET THIS USERS ID @V67CAH7 00251000 B GETNEXT BRANCH BACK @V67CAH7 00252000 * CONTINUE CHECK OF FIELD..IT'S NOT THIS USER...(*) 00253000 NOTSELF DS 0H @V67CAH7 00254000 C R0,F8 * IS LENGTH GT 8 BYTES? @V67CAH7 00255000 BH VMD020 * YES..ERROR BRANCH @V67CAH7 00256000 SPACE 00257000 SLR R2,R2 * INDICATE ONLY WANT CC SET @V67CAH7 00258000 CALL DMKUDRFU CHECK VALIDITY OF USERID 00259000 BNZ VMD053 NOGOOD..BR TO ERROR ROUTINE @V67CAH7 00260000 LR R8,R0 SETUP FOR EXECUTE...R0=NONO @V67CAH7 00261000 BCTR R8,0 -1 FOR MVC LENGTH @V67CAH7 00262000 EX R8,EXMOVE1 MOVE 'TO' USERID TO SFBUSER @V67CAH7 00263000 B GETNEXT @V67CAH7 00264000 SPACE 00265000 EXMOVE1 MVC SFBUSER(*-*),0(R1) MOVE IT...VIA EXECUTE @V67CAH7 00266000 EJECT 00267000 *********************************************************************** 00268000 * * 00269000 * 5. IS PARAMETER = 'SYSTEM'? * 00270000 * * 00271000 *********************************************************************** 00272000 SPACE 2 00273000 CHKSYSTM DS 0H @V67CAH7 00274000 C R0,F6 * IS LENGTH = 6 @V67CAH7 00275000 BNE CHKFORM * NO...BRANCH @V67CAH7 00276000 CLC 0(6,R1),=C'SYSTEM' * YES...IS PARAMETER=SYSTEM @V67CAH7 00277000 BNE CHKFORM * NO...BRANCH @V67CAH7 00278000 TM SAVEWRK1,SETTO * YES...* IS THIS FIRST @V67CAH7 00279000 * * 'SYSTEM' OR 'TO' 00280000 BO VMD013 * NO..ERROR,BRANCH @V67CAH7 00281000 OI SAVEWRK1,SETTO * YES..SET IND ON @V67CAH7 00282000 L R1,=A(DMKSYSDU) GET POINTER TO SYSTEM USERID @V67CAH7 00283000 MVC SFBUSER,0(R1) MOVE SYSTEM CPDUMP USERID IN @V67CAH7 00284000 B GETNEXT GO BACK, NEXT NEXT PARAMETER @V67CAH7 00285000 EJECT 00286000 *********************************************************************** 00287000 * * 00288000 * 6. IS PARAMETER = FORMAT ? * 00289000 * * 00290000 *********************************************************************** 00291000 SPACE 2 00292000 * R0 HAS LENGTH, R1 HAS ADDRESS OF ENTRY 00293000 CHKFORM DS 0H @V67CAH7 00294000 C R0,F6 * IS ENTRY 6 BYTES LONG? @V67CAH7 00295000 BNE CHKDSS * NO...CHECK FOR ASTERISK @V67CAH7 00296000 CLC 0(6,R1),=C'FORMAT' * IS ENTRY = FORMAT @V67CAH7 00297000 BNE CHKDSS * NO,BR TO ASTERISK CHECK @V67CAH7 00298000 SPACE 00299000 TM SAVEWRK1,SETFORM * IS THIS 2ND FORMAT? @V67CAH7 00300000 BO VMD013 * YES..ERROR, BRANCH @V67CAH7 00301000 OI SAVEWRK1,SETFORM SET FORMAT FOUND INDICATOR @V67CAH7 00302000 SPACE 00303000 CALL DMKSCNFD * GET FORMAT'S ENTRY 00304000 BNZ VMD038 * DOESN'T EXIST...ERROR @V67CAH7 00305000 SPACE 00306000 * R0 HAS LENGTH, R1 HAS ADDRESS OF ENTRY FOLLOWING 'FORMAT' 00307000 C R0,F8 * IS ENTRY GT 8 BYTES @V67CAH7 00308000 BH VMD038 * YES...ERROR,BRANCH @V67CAH7 00309000 FORMOK DS 0H @V67CAH7 00310000 LR R8,R0 * NO...ENTRY OK @V67CAH7 00311000 BCTR R8,0 -1 FOR MVC INST @V67CAH7 00312000 EX R8,EXMOVE2 MOVE IT INTO SFBFTYPE @V67CAH7 00313000 B GETNEXT AND GET NEXT PARAMETER @V67CAH7 00314000 SPACE 2 00315000 EXMOVE2 MVC SFBFTYPE(*-*),0(R1) MOVE VIA EXECUTE..TO SFBLOK @V67CAH7 00316000 EJECT 00317000 *********************************************************************** 00318000 * * 00319000 * 7. IS PARAMETER = DSS ? * 00320000 * * 00321000 *********************************************************************** 00322000 SPACE 2 00323000 CHKDSS DS 0H @V67CAH7 00324000 C R0,F3 * IS LENGTH 3 BYTES @V67CAH7 00325000 BNE CHKASTER * NO...BRANCH @V67CAH7 00326000 CLC 0(3,R1),=C'DSS' YES...* IS ENTRY 'DSS'? @V67CAH7 00327000 BNE CHKASTER * NO...BRANCH @V67CAH7 00328000 L R8,VMSIZE * IS VMSIZE GT @V67CAH7 00329000 C R8,VMSTOR * VMSTOR? @V67CAH7 00330000 BNH VMD013 * NO...ERROR,BRANCH @V67CAH7 00331000 * * YES...USER HAS SOME 00332000 * * TYPE OF SAVED SYSTEM 00333000 OI SAVEWRK1,SETDSS * ...INDICATE DSS FOUND @V67CAH7 00334000 B GETNEXT GO GET NEXT ENTRY @V67CAH7 00335000 EJECT 00336000 *********************************************************************** 00337000 * * 00338000 * 8. IS PARAMETER = * (ASTERISK) ? * 00339000 * * 00340000 *********************************************************************** 00341000 SPACE 2 00342000 * R0 HAS LENGTH, R1 HAS ADDRESS OF ENTRY 00343000 CHKASTER DS 0H @V67CAH7 00344000 CLI 0(R1),C'*' * IS THIS A COMMENT? @V67CAH7 00345000 BNE CHKRANGE * NO..GO CHECK RANGE @V67CAH7 00346000 SPACE 00347000 * ***DETERMINE MESSAGE LENGTH FROM * TO END 00348000 * R9 POINTS TO BUFFER 00349000 * BYTES LEFT = (BUFFER LEFT + THIS FIELD) 00350000 L R14,BUFCNT * GET LENGTH LEFT IN BUFFER @V67CAH7 00351000 AR R0,R14 * ADD TO FIELD WORKING WITH @V67CAH7 00352000 BCTR R0,0 -1 FOR * @V67CAH7 00353000 LA R1,1(,R1) MOVE POINTER PAST * @V67CAH7 00354000 SPACE 00355000 LA R14,L'DMPDMPID * ESTABLISH 100 FOR COMPARE @V67CAH7 00356000 CR R0,R14 * IS LENGTH GT 100? @V67CAH7 00357000 BNH COMMOK * NO...LENGTH IS OK, BRANCH @V67CAH7 00358000 LR R0,R14 * YES..SET LENGTH TO 100=MAX @V67CAH7 00359000 SPACE 00360000 * SAVE R0,R1 FOR BUILDING OF COMMENT IN DMPINREC 00361000 COMMOK DS 0H @V67CAH7 00362000 ST R0,SAVEWRK8 * SAVE LENGTH OF ENTRY @V67CAH7 00363000 ST R1,SAVEWRK9 * SAVE ADDRESS OF ENTRY @V67CAH7 00364000 EJECT 00365000 *********************************************************************** 00366000 * * 00367000 * 9. HAVE THE USERID AND RANGE DEFAULTS BEEN SATISFIED? * 00368000 * * 00369000 *********************************************************************** 00370000 SPACE 2 00371000 * ROUTINE TO ENTER WHEN FULL LINE IS SEARCHED OR COMMENT FOUND 00372000 SPACE 00373000 LINEDONE DS 0H @V67CAH7 00374000 TM SAVEWRK1,SETTO * HAS TO/SYSTEM BEEN FOUND @V67CAH7 00375000 BO GOTTO * YES...SKIP GETTING USERID @V67CAH7 00376000 MVC SFBUSER,VMUSER * NO...PUT USER INTO SFBLOK @V67CAH7 00377000 GOTTO DS 0H @V67CAH7 00378000 LA R14,SAVEWRK2 ESTABLISH ADDR OF FIRST RANGE @V67CAH7 00379000 CR R3,R14 * HAS A RANGE BEEN BUILT? @V67CAH7 00380000 BH ORDERANG * YES...BRANCH @V67CAH7 00381000 OI SAVEWRK1+1,DSSONLY TEMPORARLY SET @V67CAH7 00382000 TM SAVEWRK1,SETDSS IF 'DSS' REQUESTED @V67CAH7 00383000 * DON'T DEFAULT TO 0-END 00384000 BO DSSHUH DSS REQUESTED...BRANCH @V67CAH7 00385000 NI SAVEWRK1+1,X'FF'-DSSONLY TURN OFF IF NOT ALONE @V67CAH7 00386000 SLR R14,R14 ZERO FOR LOW RANGE @V67CAH7 00387000 ST R14,RANGELOW PUT IT IN LOW POSITION @V67CAH7 00388000 L R14,VMSTOR USE VMSTOR FOR HIGH RANGE @V67CAH7 00389000 BCTR R14,0 -1 @V67CAH7 00390000 ST R14,RANGEHI PUT IN HIGH POSITION @V67CAH7 00391000 LA R3,RANGENXT UPDATE RANGE POINTER @V67CAH7 00392000 B ORDERANG @V67CAH7 00393000 EJECT 00394000 *********************************************************************** 00395000 * * 00396000 * 10. RANGE ROUTINE * 00397000 * * 00398000 *********************************************************************** 00399000 SPACE 2 00400000 * ASSUMING PARAMETER IS A RANGE OF ADDRESSES 00401000 * HERE DETERMINE TYPE OF RANGE SPECIFICATION 00402000 CHKRANGE DS 0H @V67CAH7 00403000 LA R14,SAVEWRK8 SET END OF RANGES ADDRESS @V67CAH7 00404000 CR R3,R14 * HAVE THREE RANGES BEEN FOUND @V67CAH7 00405000 BNL VMD009 * YES...BR TO ERROR ROUTINE @V67CAH7 00406000 * R0 HAS LENGTH, R1 HAS ADDRESS OF FIELD...SAVE THESE ORIGINAL NUMBERS 00407000 ST R0,SFBDATE * SAVED LENGTH @V67CAH7 00408000 ST R1,SFBDATE+4 * SAVED ADDRESS @V67CAH7 00409000 RANGLOOP DS 0H @V67CAH7 00410000 NI SAVEWRK1,X'FF'-DOT-DASH-BLANK TURN OFF SWITCHS @V67CAH7 00411000 * IS RANGE DASH 00412000 OI SAVEWRK1,DASH * TURNON DASH FOUND INDICATOR @V67CAH7 00413000 CLI 0(R1),C'-' * IS THIS A SET OF RANGES? @V67CAH7 00414000 BE RANGESET * YES...BRANCH @V67CAH7 00415000 CLI 0(R1),COLON * IS THIS A SET OF RANGES? @V67CAH7 00416000 BE RANGESET * YES...BRANCH @V67CAH7 00417000 NI SAVEWRK1,X'FF'-DASH * NO...TURN DASH OFF @V67CAH7 00418000 SPACE 00419000 * IS RANGE DOT...ADDRESS.BYTECOUNT 00420000 OI SAVEWRK1,DOT * TURN DOT FOUND ON @V67CAH7 00421000 CLI 0(R1),C'.' * IS THIS RANGE.BYTECOUNT? @V67CAH7 00422000 BE RANGESET * YES...BRANCH @V67CAH7 00423000 NI SAVEWRK1,X'FF'-DOT * NO...TURN DOT OFF @V67CAH7 00424000 SPACE 00425000 * IS THIS SINGLE ADDRESS OR END OF INPUT LINE? 00426000 OI SAVEWRK1,BLANK * TURN BLANK FOUND 'ON' @V67CAH7 00427000 CLI 0(R1),C' ' * IS THIS BLANK @V67CAH7 00428000 BE RANGESET * YES...BRANCH @V67CAH7 00429000 CLI 0(R1),X'15' * IS THIS LINE END @V67CAH7 00430000 BE RANGESET * YES...BRANCH @V67CAH7 00431000 * FAILED ON FINDING ADDRESS SEPARATOR 00432000 * UPDATE POINTERS TO NEXT POSITION 00433000 LA R1,1(,R1) ADD ONE TO POSITION POINTER @V67CAH7 00434000 BCT R0,RANGLOOP DECREMENT FIELD LENGTH BY 1 @V67CAH7 00435000 * AND CONTINUE CHECK IF ANY FIELD LEFT 00436000 * IF NONE LEFT...DEFAULT TO BLANK 00437000 EJECT 00438000 * NOW VERIFY RANGE NUMBERS OR TAKE DEFAULTS 00439000 SPACE 00440000 RANGESET DS 0H @V67CAH7 00441000 ST R0,SFBTIME * SAVE LENGTH OF 2ND PART @V67CAH7 00442000 ST R1,SFBTIME+4 * SAVE ADDRESS OF 2ND PART @V67CAH7 00443000 * RESOLVE LENGTH AND ADDRESS OF FIRST ADDRESS OF FIELD 00444000 L R0,SFBDATE THIS GETS ORIGINAL COUNT @V67CAH7 00445000 S R0,SFBTIME ORIG COUNT - RESIDUAL COUNT @V67CAH7 00446000 L R1,SFBDATE+4 ORIGINAL ADDRESS.. @V67CAH7 00447000 * R0 NOW HAS LENGTH OF 1ST FIELD, R1 HAS ADDRESS OF 1ST FIELD 00448000 LTR R0,R0 IS LENGTH = 0 (DUE TO DOT @V67CAH7 00449000 * OR DASH AS FIRST CHARACTER) 00450000 BNZ CHKNUM NO...BRANCH TO VERIFY NUMBER @V67CAH7 00451000 SLR R1,R1 YES..SET LOW RANGE TO DEFAULT=0 @V67CAH7 00452000 B DONTCHK SKIP VERIFY @V67CAH7 00453000 CHKNUM DS 0H @V67CAH7 00454000 BAL R7,FIELDCHK VERIFY ADDR...ON RETURN R1 HAS @V67CAH7 00455000 * ADDRESS IN BINARY 00456000 DONTCHK DS 0H @V67CAH7 00457000 ST R1,RANGELOW SAVE LOW ADDRESS OF RANGE @V67CAH7 00458000 TM SAVEWRK1,BLANK IS THIS SINGLE FIELD? @V67CAH7 00459000 BO STROUND * YES...R1 SET TO LOW ADDRESS @V67CAH7 00460000 * * MAKE THIS HIGH ADDRESS ALSO 00461000 L R0,SFBTIME RESTORE POINTERS TO @V67CAH7 00462000 L R1,SFBTIME+4 SECOND ADDRESS @V67CAH7 00463000 * R0,R1 RANGE INCLUDES SEPARATION CHARACTER...NOW ELIMINATE IT 00464000 LA R1,1(,R1) ADD 1 TO ADDRESS POINTER @V67CAH7 00465000 BCTR R0,0 SUBTRACT ONE FROM LENGTH @V67CAH7 00466000 LTR R0,R0 * IS THERE NO SECOND OPERAND @V67CAH7 00467000 BNH SYSSIZE * YES...GET SYSTEM SIZE FOR HIGH @V67CAH7 00468000 C R0,F3 * IS 2ND ADDR 3 BYTES LONG @V67CAH7 00469000 BNE VERIFY2 * NO...BRANCH @V67CAH7 00470000 CLC 0(3,R1),=C'END' * YES...IS 2ND ADDRESS='END' @V67CAH7 00471000 BNE VERIFY2 * NO...BRANCH TO VERIFY 2ND @V67CAH7 00472000 SYSSIZE DS 0H @V67CAH7 00473000 L R1,VMSTOR SET HIGH TO SYSTEM SIZE @V67CAH7 00474000 BCTR R1,0 SUBTRACT 1 FROM SYSTEM SIZE @V67CAH7 00475000 B STROUND GO STORE HIGH/ROUND BOTH @V67CAH7 00476000 VERIFY2 DS 0H @V67CAH7 00477000 BAL R7,FIELDCHK VERIFY 2ND ADDRESS @V67CAH7 00478000 * ON RETURN R1= BINARY ON THE 2ND ADDRESS 00479000 EJECT 00480000 * CHECK RANGE TYPES 00481000 SPACE 00482000 TM SAVEWRK1,DOT * IS THIS ADDRESS.BYTECOUNT? @V67CAH7 00483000 BO CHKDOT * YES...BRANCH @V67CAH7 00484000 * THIS IS DASH TYPE RANGE 00485000 C R1,RANGELOW * IS HEXLOC2 LT HEXLOC1? @V67CAH7 00486000 BNL STROUND * NO...BRANCH @V67CAH7 00487000 SPACE 00488000 * * YES...SET UP FOR ERROR 009 00489000 L R8,RANGELOW SAVE RANGELOW IN REGISTER @V67CAH7 00490000 CALL DMKCVTBH R1 HAS BINARY NUMBER ALREADY 00491000 STCM R0,3,SAVEWRK2+7 * SAVE SECOND @V67CAH7 00492000 STCM R1,15,SAVEWRK2+9 * PRINTABLE ADDRESS @V67CAH7 00493000 MVI SAVEWRK2+6,C'-' MOVE DASH BETWEEN @V67CAH7 00494000 LR R1,R8 GET FIRST RANGE @V67CAH7 00495000 CALL DMKCVTBH CONVERT YE OF LITTLE FAITH 00496000 STCM R0,3,SAVEWRK2 * SAVE FIRST @V67CAH7 00497000 STCM R1,15,SAVEWRK2+2 * PRINTABLE ADDRESS @V67CAH7 00498000 LA R0,13 * SETUP FOR @V67CAH7 00499000 LA R1,SAVEWRK2 * DMKERMSG @V67CAH7 00500000 B VMD009 * NOW READY TO BRANCH @V67CAH7 00501000 SPACE 2 00502000 * THIS IS DOT TYPE RANGE 00503000 CHKDOT DS 0H @V67CAH7 00504000 A R1,RANGELOW ADD BYTECOUNT TO ADDRESS @V67CAH7 00505000 BCTR R1,0 -1 FOR NON-COUNTED 1ST BYTE @V67CAH7 00506000 C R1,VMSTOR * IS RESULT GT SYSTEMSIZE @V67CAH7 00507000 BL STROUND * LOW...OK, BRANCH @V67CAH7 00508000 BH VMD160 * HIGH...ERROR, BRANCH @V67CAH7 00509000 BCTR R1,0 * EQUAL...SUBTRACT ONE @V67CAH7 00510000 EJECT 00511000 *********************************************************************** 00512000 * * 00513000 * 10.3 STORE AND ROUND OFF RANGES * 00514000 * * 00515000 *********************************************************************** 00516000 SPACE 2 00517000 * AT ENTRY R1 HAS HIGH NUMBER OF RANGE 00518000 STROUND DS 0H @V67CAH7 00519000 N R1,XPAGNUM ROUND TO PAGE BOUNDARY @V67CAH7 00520000 * BY THE WAY XPAGNUM = X00FFF000 00521000 ST R1,RANGEHI STORE HIGH ADDRESS @V67CAH7 00522000 NC RANGELOW,XPAGNUM ROUND LOW TO PAGE BOUND @V67CAH7 00523000 LA R3,RANGENXT UPDATE RANGE POINTER @V67CAH7 00524000 B GETNEXT BRANCH TO GET NEXT PARAMETER @V67CAH7 00525000 SPACE 3 00526000 *********************************************************************** 00527000 * * 00528000 * FIELD CHECK * 00529000 * * 00530000 *********************************************************************** 00531000 SPACE 2 00532000 * FIELDCHK VERIFIES A FIELD OF PRINTABLE HEX CHARACTERS DEFINED BY 00533000 * R0 AS LENGTH AND R1 AS POINTER TO FIELD...EITHER BRANCHES TO 00534000 * ERROR MESSAGES FOR BAD DATA OR RETURNS R1 WITH BINARY OF THE 00535000 * NUMBER FOR GOOD DATA 00536000 FIELDCHK DS 0H @V67CAH7 00537000 C R0,F6 * MORE THAN 6 CHARACTERS @V67CAH7 00538000 BH VMD033 * YES...ERROR, BRANCH @V67CAH7 00539000 CALL DMKCVTHB CONVERT TO BINARY, R1 HAS BINARY 00540000 * ON RETURN 00541000 BNZ VMD033 NUMBER BAD...ERROR BRANCH @V67CAH7 00542000 SPACE 00543000 C R1,VMSTOR * IS NUMBER GT USERS SYSTEM SIZE @V67CAH7 00544000 BLR R7 * LOW...GOOD NUMBER, RETURN @V67CAH7 00545000 BH VMD160 * HIGH...ERROR, BRANCH @V67CAH7 00546000 BCTR R1,0 * EQUAL...SUBTRACT 1 @V67CAH7 00547000 BR R7 * AND RETURN @V67CAH7 00548000 EJECT 00549000 SPACE 2 00550000 *********************************************************************** 00551000 * * 00552000 * 11. CONSOLIDATE RANGES ROUTINE * 00553000 * * 00554000 *********************************************************************** 00555000 SPACE 2 00556000 * ORDER...ORDER RANGE GROUPS TO BE IN ASCENDING ORDER 00557000 SPACE 00558000 ORDERANG DS 0H @V67CAH7 00559000 S R3,F8 POINT TO LAST RANGE BUILT @V67CAH7 00560000 LA R6,SAVEWRK2 POINTER1 TO POINT TO FIRST ENTRY @V67CAH7 00561000 P2SET DS 0H @V67CAH7 00562000 LR R7,R6 POINTER2 EQUALS POINTER1 @V67CAH7 00563000 UPP2 DS 0H @V67CAH7 00564000 LA R7,RANGENXT-RANGES(,R7) POINTER2 TO NEXT RANGE @V67CAH7 00565000 CR R7,R3 * IS POINTER2 PAST LAST RANGE @V67CAH7 00566000 BH UPPOINT1 * YES...BRANCH @V67CAH7 00567000 CLC RANGELOW-RANGES(4,R6),RANGELOW-RANGES(R7) @V67CAH7 00568000 * SHOULD THE RANGES BE REVERSED? 00569000 BNH UPP2 NO...BRANCH @V67CAH7 00570000 * POINTER1'S DATA IS GT POINTER2'S...REVERSE THEM 00571000 XC RANGELOW-RANGES(8,R6),RANGELOW-RANGES(R7) @V67CAH7 00572000 XC RANGELOW-RANGES(8,R7),RANGELOW-RANGES(R6) @V67CAH7 00573000 XC RANGELOW-RANGES(8,R6),RANGELOW-RANGES(R7) @V67CAH7 00574000 B UPP2 @V67CAH7 00575000 UPPOINT1 DS 0H @V67CAH7 00576000 LA R6,RANGENXT-RANGES(,R6) UPDATE P1 TO NEXT RANGE @V67CAH7 00577000 CR R6,R3 * POINTER1 PAST END OF RANGES @V67CAH7 00578000 BL P2SET * NO...BRANCH BACK @V67CAH7 00579000 EJECT 00580000 * MERGE...MERGE THE RANGES TOGETHER IF POSSIBLE 00581000 SPACE 00582000 LA R6,SAVEWRK2-8 ESTABLISH P1 TO BEFORE 1ST RGE @V67CAH7 00583000 LR R8,R3 ESTABLISH MOVABLE END PTR = R8 @V67CAH7 00584000 MUPP1 DS 0H @V67CAH7 00585000 LA R6,RANGENXT-RANGES(,R6) UPDATE PTR1=NEXT RANGE @V67CAH7 00586000 LA R7,RANGENXT-RANGES(,R6) RANGE FOLLOWING PTR1 @V67CAH7 00587000 * IN POINTER2 00588000 ENDCHK DS 0H @V67CAH7 00589000 CR R6,R8 * IS POINTER1 AT LAST RANGE @V67CAH7 00590000 BNL MERGDONE * YES...DONE,BRANCH @V67CAH7 00591000 * REMEMBER THEY ARE ALREADY IN ASCENDING ORDER 00592000 L R14,RANGELOW-RANGES(,R7) *ESTABLISH ABUTTING @V67CAH7 00593000 S R14,F4096 *PAGE ADDRESS IN R14 @V67CAH7 00594000 C R14,RANGEHI-RANGES(,R6) *RANGES ABUT/OVERLAP? @V67CAH7 00595000 BH MUPP1 *NO..BRANCH @V67CAH7 00596000 CLC RANGEHI-RANGES(4,R6),RANGEHI-RANGES(R7) DOES @V67CAH7 00597000 * FIRST RANGE ENCOMPASS RANGE 2 00598000 BNL MERGED * YES...BRANCH @V67CAH7 00599000 MVC RANGEHI-RANGES(4,R6),RANGEHI-RANGES(R7) MERGE @V67CAH7 00600000 SPACE 2 00601000 * NOW MOVE FOLLOWING RANGES UP BEHIND MERGED ONE 00602000 SPACE 00603000 * DETERMINE LENGTH OF DATA TO MOVE 00604000 MERGED DS 0H @V67CAH7 00605000 LA R0,RANGENXT-RANGES(,R7) POINT R0 TO NEXT RANGE @V67CAH7 00606000 LA R14,RANGENXT-RANGES-1(,R8) @V67CAH7 00607000 * POINT TO LAST CHAR OF RANGES 00608000 SR R14,R0 * HOW MANY BYTES TO MOVE? @V67CAH7 00609000 BNP UPMEND * NONE...BRANCH @V67CAH7 00610000 EX R14,EXMOVE3 EXECUTE A MOVE TO BRING @V67CAH7 00611000 * FOLLOWING RANGES UP AGAINST MERGED ONE 00612000 UPMEND DS 0H @V67CAH7 00613000 S R8,F8 MOVE MOVABLE END POINTER TO @V67CAH7 00614000 * POINT TO LAST RANGE 00615000 B ENDCHK CHECK IF AT LAST RANGE @V67CAH7 00616000 SPACE 00617000 * MERGE RANGES 00618000 EXMOVE3 MVC RANGELOW-RANGES(*-*,R7),RANGENXT-RANGES(R7) @V67CAH7 00619000 SPACE 00620000 MERGDONE DS 0H @V67CAH7 00621000 LA R3,SAVEWRK2 REESTABLISH RANGE POINTER @V67CAH7 00622000 DROP R9 DON'T NEED BUFFER ANYMORE...IT WILL BE @V67CAH7 00623000 * RELOADED CORRECTLY FROM SAVEAREA AT EXIT 00624000 SPACE 2 00625000 * R3 IS RANGE POINTER POINTING TO FIRST RANGE 00626000 * R8 IS END POINTER STILL...KEEP IT TILL GET BITMAP STORAGE 00627000 SPACE 00628000 *********************************************************************** 00629000 * * 00630000 * DONE ANALYZING COMMAND * 00631000 * * 00632000 *********************************************************************** 00633000 EJECT 00634000 *********************************************************************** 00635000 * * 00636000 * 12. BUILD SFBLOK AND PUT ON DUMP IN PROGRESS QUEUE (DMKRSPDP). * 00637000 * RESERVE 3 PAGES FOR DMPINREC AND DMPKEYS...THEN BUILD RECORDS OF * 00638000 * DUMP, RETURN AND BUILD DMPINREC AND KEY RECORDS. * 00639000 * BUILD BIT MAP AND KEYMAP IN STORAGE (2 PAGES FOR KEYMAP). * 00640000 * * 00641000 *********************************************************************** 00642000 SPACE 2 00643000 * SET UP SFBLOK 00644000 SPACE 00645000 MVI SFBTYPE,TYP1403 PRINTER FILE TYPE @V67CAH7 00646000 * THIS ROUTINE GETS THE TIME AND DATE 00647000 LA R1,SFBDATE * SETUP DATE @V67CAH7 00648000 LA R2,SFBTIME * AND TIME @V67CAH7 00649000 CALL DMKCVTDT * AND FILL THEM IN 00650000 MVC SFBCOPY,F1+2 SET NUMBER COPIES TO 1 @V67CAH7 00651000 OI SFBFLAG,SFBDUMP SET DUMP INDICATOR ON @V67CAH7 00652000 MVC SFBORIG,VMUSER DEFINE WHOSE DUMP IT IS @V67CAH7 00653000 MVC SFBRECSZ,F4096+2 RECSIZE=X1000 (2 BYTES) @V67CAH7 00654000 MVI SFBCLAS,C'V' SET CLASS TO BE 'V' @V67CAH7 00655000 MVI SFBMISC1+1,C'V' USE THIS TO DISTINGUISH @V67CAH7 00656000 * BETWEEN CP DUMPS AND VM DUMPS 00657000 MVC SFBDIST,VMDIST PICK UP DIST FROM DUMPER @V67CAH7 00658000 SPACE 2 00659000 * THIS ROUTINE IS A COPY OF DMKSPL'S (GETID) 00660000 GETID DS 0H @V67CAH7 00661000 L R14,=A(DMKRSPID) ADDR OF UNIQUE SPOOLID @V67CAH7 00662000 LH R1,0(,R14) NEXT AVAILABLE SPOOLID @V67CAH7 00663000 STH R1,SFBFILID SAVE IN SFBLOK @V67CAH7 00664000 LA R1,1(,R1) UPDATE BY ONE @V67CAH7 00665000 CH R1,MAXFILE ID REACHED MAX NUMBER? @V67CAH7 00666000 BNH STOREID * NO @V67CAH7 00667000 LA R1,1 * YES...START AT ONE @V67CAH7 00668000 STOREID DS 0H STORE NEXT SPOOLID @V67CAH7 00669000 STH R1,0(,R14) BACK IN RSPID @V67CAH7 00670000 SPACE 00671000 * HERE ADD SFBLOK TO DUMP QUEUE 00672000 L R14,=A(DMKRSPDP) * ROUTINE @V67CAH7 00673000 L R1,0(,R14) * TO ADD @V67CAH7 00674000 ST R1,SFBPNT * SFBLOK TO @V67CAH7 00675000 ST R5,0(,R14) * DUMP Q AS FIRST ENTRY @V67CAH7 00676000 EJECT 00677000 *********************************************************************** 00678000 * * 00679000 * 13. GET BITMAP * 00680000 * * 00681000 *********************************************************************** 00682000 SPACE 2 00683000 * GET SPACE FOR BIT MAP 00684000 SPACE 2 00685000 LA R0,BITMAPSZ * GET BIT MAP SIZE @V67CAH7 00686000 CALL DMKFREE * AND RESERVE SPACE 00687000 LR R9,R1 * AND MAKE R9=BASE OF BITMAP @V67CAH7 00688000 USING BITMAP,R9 @V67CAH7 00689000 SPACE 2 00690000 * ZERO OUT BITMAP 00691000 SPACE 00692000 LR R0,R1 'TO' ADDRESS @V67CAH7 00693000 LA R1,BITMAPSZ*8 'TO' LENGTH @V67CAH7 00694000 SLR R7,R7 * ZERO 2ND BYTE COUNT... @V67CAH7 00695000 * SINCE THE COUNT IS ZERO..THE ADDRESS ISN'T 00696000 * CHECKED...SO REG6 NEEDN'T BE SET 00697000 MVCL R0,R6 ZERO BITMAP @V67CAH7 00698000 SPACE 00699000 ST R8,LASTRANG SAVE LAST RANGE POINTER @V67CAH7 00700000 EJECT 00701000 *********************************************************************** 00702000 * * 00703000 * 14. GET MAIN STORAGE SPACE * 00704000 * * 00705000 *********************************************************************** 00706000 SPACE 2 00707000 * GET AND LOCK IN REAL STORAGE A VIRTUAL PAGE 00708000 SPACE 00709000 CALL DMKPGTVG GET VIRTUAL PAGE... X00710000 R1 ON RETURN IS VIRTUAL ADDRESS 00711000 ST R1,SPOLADDR SAVE VIRT ADDR OF INT SPOOLREC @V67CAH7 00712000 TRANS 2,1,OPT=(BRING,LOCK,DEFER,SYSTEM) 00713000 * NOW HAVE 4K SPACE TO BUILD SPOOL BLOCKS IN...REAL ADDR POINTER=R2 00714000 LR R10,R2 USE R10 AS SPLINK BASE @V67CAH7 00715000 USING SPLINK,R10 @V67CAH7 00716000 * ZERO OUT PAGE 00717000 LR R0,R10 POINTER TO 1ST OPERAND @V67CAH7 00718000 L R1,F4096 LENGTH OF 1ST FIELD @V67CAH7 00719000 SLR R7,R7 * ZERO SECOND OPERAND COUNT @V67CAH7 00720000 MVCL R0,R6 ZERO WHOLE PAGE @V67CAH7 00721000 SPACE 00722000 LA R1,1 * SET NUMBER OF RECORDS @V67CAH7 00723000 ST R1,SPRECNUM * TO 1 FOR ALL RECORDS @V67CAH7 00724000 EJECT 00725000 * GET SPACE FOR KEYS...2 PAGES 00726000 CALL DMKPGTVG GET A PAGE OF SYSTEM VIRTUAL 00727000 ST R1,KEYVIRT1 SAVE VIRTUAL ADDR OF KEY PAGE1 @V67CAH7 00728000 TRANS 2,1,OPT=(BRING,LOCK,DEFER,SYSTEM) LOCK IT 00729000 ST R2,BITKEY1 SAVE LOCKED 4K PAGES' REAL ADDR @V67CAH7 00730000 * NOW ZERO THAT PAGE 00731000 LR R0,R2 ADDRESS OF PAGE TO R0 @V67CAH7 00732000 L R1,F4096 LENGTH OF FIRST FIELD @V67CAH7 00733000 SLR R15,R15 * ZERO SECOND OPERAND COUNT @V67CAH7 00734000 MVCL R0,R14 ZERO WHOLE PAGE @V67CAH7 00735000 SPACE 00736000 CALL DMKPGTVG GET A PAGE OF SYSTEM VIRTUAL 00737000 ST R1,KEYVIRT2 SAVE VIRT ADDR OF KEY PAGE 2 @V67CAH7 00738000 TRANS 2,1,OPT=(BRING,LOCK,DEFER,SYSTEM) LOCK IT 00739000 ST R2,BITKEY2 SAVE LOCKED 4K PAGES' REAL ADDR @V67CAH7 00740000 * NOW ZERO THAT PAGE 00741000 LR R0,R2 ADDRESS OF PAGE TO R0 @V67CAH7 00742000 L R1,F4096 LENGTH OF FIRST FIELD @V67CAH7 00743000 SLR R15,R15 * ZERO SECOND OPERAND COUNT @V67CAH7 00744000 MVCL R0,R14 ZERO WHOLE PAGE @V67CAH7 00745000 EJECT 00746000 *********************************************************************** 00747000 * * 00748000 * 15,16 DO ACTUAL DUMPING * 00749000 * * 00750000 *********************************************************************** 00751000 SPACE 2 00752000 * WRITE 3 BLANK SPOOL RECORDS 00753000 * 00754000 BAL R7,GETCCPD GET FIRST CCPD... @V67CAH7 00755000 * ON RETURN R1 CONTAINS IT 00756000 ST R1,SFBSTART SAVE ORIGINAL POINTER @V67CAH7 00757000 * 00758000 ST R1,SPNXTPAG TEMPORARILY PUT CCPD @V67CAH7 00759000 * IN FORWARD SPLINK POINTER 00760000 SLR R6,R6 * ZERO FIRST @V67CAH7 00761000 ST R6,CURRENT * BACKWARD POINTER @V67CAH7 00762000 SPACE 00763000 LA R6,3 COUNTER TO CREATE 3 BLANK BLOCKS @V67CAH7 00764000 BLKSPOOL DS 0H @V67CAH7 00765000 BAL R7,GETCCPD GET NEXT SPOOL RECORD CCPD @V67CAH7 00766000 BAL R7,WRSPOOL GO UPDATE SPLINK/WRITE SPOOL REC @V67CAH7 00767000 BCT R6,BLKSPOOL IF NOT THREE WRITTEN..RETURN @V67CAH7 00768000 SPACE 2 00769000 * GET LOW PAGE RANGE AND PUT ADDRESS IN R4 00770000 SPACE 00771000 L R4,RANGELOW FIRST PAGE ADDRESS TO BRING IN @V67CAH7 00772000 BAL R7,GETPAGE @V67CAH7 00773000 SR R6,R6 VIRTUAL PAGE INDEX = 0 @V67CAH7 00774000 * R2 AND R6 DEFINE VIRTUAL PAGE POSITIONS...R2= BASE, R6=INDEX 00775000 * R10 AND R8 DEFINE SPOOL BLOCK POSITION...R10 = BASE, R8 = INDEX 00776000 LA R8,4*SPSIZE+TAGSIZE @V67CAH7 00777000 * * STARTING DISPLACEMENT INTO RECORD 4 EQUALS 00778000 * * THE FOUR SPLINKS AND TAGSIZE 00779000 SPACE 2 00780000 * BEFORE ENTERING FOLLOWING CODE...REMEMBER THAT R6 IS VIRTUAL PAGE 00781000 * INDEX INDICATING THE NUMBER OF BYTES ALREADY TAKEN FROM THE PAGE. 00782000 * R8, THE SPOOL INDEX, INDICATES THE NUMBER OF BYTES WRITTEN TO THE 00783000 * 4K SPOOL RECORD. 00784000 MOVECHK DS 0H @V67CAH7 00785000 L R1,F4096 SET SUBTRACTION REGISTER UP @V67CAH7 00786000 * * IS VIRTUAL PAGE INDEX GT SPOOL INDEX? 00787000 CR R6,R8 @V67CAH7 00788000 BH FILSPOOL * YES...BRANCH @V67CAH7 00789000 * * NO...SPOOL INDEX IS GREATER OR EQUAL 00790000 * * INDICATING THERE ARE FEWER 00791000 * * OR EQUAL BYTES LEFT IN SPOOL 00792000 * * THAN BYTES AVAILABLE IN 00793000 * * VIRTUAL PAGE. 00794000 SR R1,R8 * SUB SPOOL INDEX FROM 4096 @V67CAH7 00795000 * * THIS WILL BE HOW MUCH TO MOVE. 00796000 B MOVE4 * BRANCH AND DO MOVE @V67CAH7 00797000 EJECT 00798000 FILSPOOL DS 0H * YES... @V67CAH7 00799000 * * PAGE INDEX GREATER INDICATING 00800000 * * LESS BYTES ARE AVAILABLE ON THE 00801000 * * VIRT PAGE THAN SPOOL COULD USE. 00802000 SR R1,R6 * SUBT PAGE INDEX FROM 4096 @V67CAH7 00803000 * * THIS IS MAXIMUM BYTE COUNT THAT 00804000 * * THAT CAN BE MOVED 00805000 MOVE4 DS 0H @V67CAH7 00806000 LA R14,0(R6,R2) THIS IS 'FROM' ADDRESS FOR MOVE @V67CAH7 00807000 LR R15,R1 LENGTH OF MOVE FOR MVCL 2ND PARM @V67CAH7 00808000 LA R0,0(R8,R10) THIS IS 'TO' ADDRESS @V67CAH7 00809000 SPACE 00810000 * R1 ALREADY HAS LENGTH IN IT...FOR MVCL 1ST LENGTH PARAMETER 00811000 SPACE 00812000 AR R6,R1 * ADD MOVED LENGTH @V67CAH7 00813000 AR R8,R1 * TO BOTH INDEXES @V67CAH7 00814000 MVCL R0,R14 THIS IS IT...BUILD SPOOL RECORD @V67CAH7 00815000 C R6,F4096 * IS VIRT PAGE COMPLETELY MOVED? @V67CAH7 00816000 BNE FULLSPOL * NO...BRANCH @V67CAH7 00817000 SPACE 00818000 * AT THIS POINT VIRTUAL PAGE IS EXPENDED...GET A NEW OR END 00819000 SPACE 00820000 CALL DMKPTRUL UNLOCK PAGE R2 POINTS AT...R2=REAL ADDR 00821000 SLR R6,R6 ZERO VIRTUAL PAGE INDEX @V67CAH7 00822000 SPACE 2 00823000 * UPDATE BIT MAP ROUTINE 00824000 SPACE 00825000 LR R15,R4 * GET CURRENT PAGE DUMPED @V67CAH7 00826000 SRL R15,12 PAGE NUMBER @V67CAH7 00827000 LA R14,7 * GET LOW ORDER 3 BITS @V67CAH7 00828000 NR R14,R15 * OF PAGE NUMBER @V67CAH7 00829000 SRL R15,3 GET BYTE DISPLACEMENT IN BITMAP @V67CAH7 00830000 IC R14,BITTRANS(R14) GET CORRECT MASK TO 'OR' @V67CAH7 00831000 LA R15,BITMAP(R15) GET PROPER INDEX INTO BITMAP @V67CAH7 00832000 EX R14,BITSET SET BIT FOR PROPER PAGE @V67CAH7 00833000 SPACE 00834000 * DONE WITH BITMAP UPDATE 00835000 EJECT 00836000 * NOW UPDATE CURRENT PAGE AND RANGE POINTERS 00837000 SPACE 00838000 UPADDR DS 0H @V67CAH7 00839000 A R4,F4096 UPDATE CURRENT POINTER @V67CAH7 00840000 C R4,RANGEHI * IS CURRENT ADDRESS PTR @V67CAH7 00841000 * * GT HIGH RANGE 00842000 BNH PRESPCHK * NO...BRANCH @V67CAH7 00843000 LA R3,RANGENXT * YES...UPDATE RANGE PTR @V67CAH7 00844000 UPRANGE DS 0H @V67CAH7 00845000 L R4,RANGELOW UPDATE CURRENT PAGE DUMP POINTER @V67CAH7 00846000 C R3,LASTRANG * IS RANGE PTR PAST ALL RANGES @V67CAH7 00847000 BH ALLDUMP1 * YES..BRANCH @V67CAH7 00848000 PRESPCHK DS 0H @V67CAH7 00849000 BAL R7,GETPAGE * NO...GET NEXT VIRTUAL PAGE @V67CAH7 00850000 SPACE 00851000 FULLSPOL DS 0H @V67CAH7 00852000 C R8,F4096 * IS SPOOL RECORD FILLED? @V67CAH7 00853000 BL MOVECHK * NO...BRANCH @V67CAH7 00854000 SPACE 00855000 * THE SPOOL BLOCK IS BUILT...UPDATE SPLINK...WRITE OUT 00856000 SPACE 00857000 BAL R7,GETCCPD * YES..GET NEXT CCPD @V67CAH7 00858000 BAL R7,WRSPOOL * ..UPDATE SPLINK,WRITE OUT @V67CAH7 00859000 B MOVECHK * AND GO GET NEXT @V67CAH7 00860000 SPACE 00861000 * BELOW IS A BRANCHED AROUND AREA 00862000 SPACE 00863000 * SET PROPER BIT TO INDICATE PAGE IS DUMP 00864000 * THE IMMEDIATE FIELD IS REPLACED BY 'EX' 00865000 BITSET OI 0(R15),X'00' @V67CAH7 00866000 EJECT 00867000 GETPAGE DS 0H @V67CAH7 00868000 SPACE 00869000 * BRING PAGE POINTED TO BY CURPAGE INTO STORAGE AND LOCK, THEN 00870000 * PUT IT'S REAL ADDRESS INTO R2 00871000 SPACE 00872000 LR R1,R4 LOAD CURRENT PAGE TO DUMP INTO R1 @V67CAH7 00873000 TRANS 2,1,OPT=(BRING,LOCK,DEFER) GET USERS VIRT PAGE 00874000 * AT EXIT OF TRANS...R2 WILL BE REAL STORAGE ADDRESS OF VIRTUAL PAGE 00875000 BZ GETKEY GOT PAGE....BRANCH @V67CAH7 00876000 SPACE 00877000 * THE ONLY INCORRECT CODE THAT CAN HAPPEN IS CC=2 DUE TO DSS PROCESSING 00878000 * AND INDICATES THAT THE SEGMENT IS INVALID BUT STILL WITHIN 'VMSIZE' 00879000 SPACE 00880000 B UPADDR BRANCH TO TRY NEXT PAGE OF RANGE @V67CAH7 00881000 SPACE 00882000 * ROUTINE TO GET KEYS FOR EACH 2K AND PUT THEM INTO KEYMAP 00883000 * FIRST GET SWAPTABLE KEYS 00884000 GETKEY DS 0H @V67CAH7 00885000 L R1,VMSEG OBTAIN SEGMENT TABLE BASE @V67CAH7 00886000 LR R14,R4 VIRTUAL ADDR TO WORK REG @V67CAH7 00887000 SRDL R14,16 GET SEGMENT NUMBER ONLY @V67CAH7 00888000 SLL R14,2 SEGMENT NUMBER * 4 @V67CAH7 00889000 LA R1,0(R14,R1) POINT TO CORRECT SEG ENTRY @V67CAH7 00890000 * SEGMENT IS ALWAYS VALID BECAUSE ITS PAGE IS IN STORAGE 00891000 L R1,0(,R1) PAGE TABLE POINTER @V67CAH7 00892000 LA R1,16*L'PAGCORE+(SWPFLAG-SWPVM)(,R1) @V67CAH7 00893000 * GET SWAPTABLE ORIGIN 00894000 SR R14,R14 ZERO WORK REGISTER @V67CAH7 00895000 SLDL R14,4 MOVE PAGE NUMBER IN @V67CAH7 00896000 SLL R14,3 MULTIPLY BY 8 (SIZE OF EACH @V67CAH7 00897000 * SWAPTABLE ENTRY) 00898000 * R14 NOW HAS CORRECT DISPLACEMENT INTO SWAPTABLE FOR THIS 00899000 * VIRTUAL PAGE... R1 HAS BASE TO SWAPTABLE 00900000 IC R15,SWPKEY1-SWPFLAG(R14,R1) 1ST SWAPTABLE KEY @V67CAH7 00901000 SLL R15,8 MOVE IT TO HIGHER ORDER @V67CAH7 00902000 IC R15,SWPKEY2-SWPFLAG(R14,R1) 2ND SWAPTABLE KEY @V67CAH7 00903000 * R15 NOW HAS BOTH SWAPTABLE KEYS 00904000 EJECT 00905000 * NOW GET REAL STORAGE KEYS 00906000 SPACE 00907000 SLR R1,R1 ZERO WORK REGISTER @V67CAH7 00908000 ISK R1,R2 PUT STORAGE KEY INTO R1 @V67CAH7 00909000 SLL R1,8 SAVE KEY IN HIGHER ORDER @V67CAH7 00910000 LA R14,2048(,R2) GET NEXT 2K ADDRESS AND @V67CAH7 00911000 ISK R1,R14 PUT 2ND 2K'S KEY IN R1 LOW ORDER @V67CAH7 00912000 * NOW R1 HAS KEYS TO REAL STORAGE 00913000 TM VMOSTAT,VMSHR * IS THIS A SHARE SYSTEM? @V67CAH7 00914000 BZ NONSHR * NO...BRANCH @V67CAH7 00915000 N R1,=A(X'0E0E') SHUT OFF PHONY KEY OF SHARED @V67CAH7 00916000 NONSHR DS 0H @V67CAH7 00917000 OR R1,R15 PUT REAL AND VIRT KEY TOGETHER @V67CAH7 00918000 L R14,=A(X'FEFE') SET UP FOR 'ECMODE' @V67CAH7 00919000 TM VMPSTAT,VMV370R * IS THIS MACHINE ECMODE ON? @V67CAH7 00920000 BO MODESET * YES...BRANCH @V67CAH7 00921000 L R14,=A(X'F8F8') SET FOR BCMODE @V67CAH7 00922000 MODESET DS 0H @V67CAH7 00923000 NR R1,R14 SHUTOFF WHATEVER IS NECESSARY @V67CAH7 00924000 * R1 NOW HAS TWO CORRECT KEYS AS HALFWORD 00925000 SPACE 00926000 * NOW GET PLACE IN KEY MAP TO PUT KEYS 00927000 LR R14,R4 * GET PAGE NUMBER @V67CAH7 00928000 SRL R14,11 * TIMES 2 IN WORK REG @V67CAH7 00929000 * * OK SINCE R4 IS ALWAYS 00930000 * * ROUNDED TO PAGE BOUNDARY 00931000 * R14 NOW HAS PROPER INDEX INTO KEYMAP..IF IT WAS CONTIGUOUS FOR 2PAGES 00932000 * ALSO, REMEMBER THAT WE ARE WORKING WITH HALFWORDS 00933000 CH R14,F4096+2 * IS THIS FOR 2ND KEY PAGE? @V67CAH7 00934000 BL FIRSTPG * NO...BRANCH @V67CAH7 00935000 * * YES... 00936000 SECONDPG DS 0H @V67CAH7 00937000 S R14,F4096 FORCE SECOND PAGE TO BEGINNING @V67CAH7 00938000 L R15,BITKEY2 GET KEYMAP2 ADDRESS @V67CAH7 00939000 B UPKEYMAP BRANCH @V67CAH7 00940000 SPACE 00941000 FIRSTPG DS 0H @V67CAH7 00942000 L R15,BITKEY1 GET KEYMAP1 ADDRESS @V67CAH7 00943000 UPKEYMAP DS 0H @V67CAH7 00944000 STH R1,0(R14,R15) STORE KEYS GOTTEN @V67CAH7 00945000 BR R7 RETURN @V67CAH7 00946000 EJECT 00947000 SPACE 2 00948000 WRSPOOL DS 0H @V67CAH7 00949000 SPACE 00950000 * THIS ROUTINE UPDATES SPLINK BY: 00951000 * 1.MOVING CURRENT TO SPLINK BACKWARD POINTER 00952000 * 2.MOVE FORWARD SPLINK POINTER TO CURRENT 00953000 * 3.MOVE NEXTCCPD TO FORWARD SPLINK POINTER 00954000 * THEN WRITE OUT SPOOL RECORD TO CURRENT'S POSITION AND UPDATE SFBLAST, 00955000 * AND RESET SPOOL INDEX TO 16 (RIGHT AFTER SPLINK) 00956000 SPACE 00957000 ST R2,SVREG2 PRESERVE VIRT PAGE PTR @V67CAH7 00958000 MVC SPPREPAG,CURRENT CURRENT TO BACKWARD @V67CAH7 00959000 MVC CURRENT,SPNXTPAG FORWARD TO CURRENT @V67CAH7 00960000 MVC SPNXTPAG,NEXTCCPD NEXT TO FORWARD @V67CAH7 00961000 L R0,CURRENT * SETUP FOR WRITE TO DASD @V67CAH7 00962000 * * PUT CCPD INTO R0 00963000 L R1,SPOLADDR * SYSTEM VIRT ADDRESS, @V67CAH7 00964000 * * THIS GETS RESOLVED TO 00965000 * * THE REAL ADDRESS 00966000 * * (NOW IN R10) BY DMKRPAPT 00967000 CALL DMKRPAPT,PARM=(SYSTEM) WRITE OUT SPOOL RECORD 00968000 MVC SFBLAST,CURRENT UPDATE SFBLOK @V67CAH7 00969000 L R8,SFBRECNO * ROUTINE TO @V67CAH7 00970000 LA R8,1(R8) * ADD ONE TO @V67CAH7 00971000 ST R8,SFBRECNO * RECORD COUNTER @V67CAH7 00972000 LA R8,16 INITIALIZE SPOOL INDEX @V67CAH7 00973000 * AFTER SPLINK 00974000 L R2,SVREG2 RESET POINTER... @V67CAH7 00975000 BR R7 RETURN @V67CAH7 00976000 EJECT 00977000 GETCCPD DS 0H @V67CAH7 00978000 SPACE 00979000 * THIS ROUTINE RESERVES A SPOOL AREA PAGE AND PUTS ITS CCPD IN NEXTCCPD 00980000 * IF NO SPOOL AREA SPACE IS AVAILABLE THE DUMP IS PURGED AND AN ERROR 00981000 * MESSAGE ISSUED. 00982000 SPACE 00983000 CALL DMKPGTSG GET NEW CCPD 00984000 ST R1,NEXTCCPD ON RETURN R1 HAS CCPD, SAVE @V67CAH7 00985000 LTR R1,R1 * IF R1=0, CCPD NOT AVAIL @V67CAH7 00986000 BNZR R7 * OK...RETURN @V67CAH7 00987000 * CAN'T GET SPOOL BLOCK, APPEND DUMP TO DELETE CHAIN 00988000 SPACE 00989000 * MUST MAKE LAST SPLINK FORWARD POINTER (SPNXTPT) POINT TO FIRST 00990000 * SPLINK RECORD SO IT CAN BE PROPERLY DELETED 00991000 ICM R14,15,SFBSTART PICK UP FIRST SPLINK PTR @V67CAH7 00992000 BZ ERROR146 IF THIS IS 1ST TRY TO GET @V67CAH7 00993000 * CCPD...DON'T WRITE ANY SPLINKS 00994000 ST R14,NEXTCCPD NOT FIRST ATTEMPT... @V67CAH7 00995000 * POINT LAST TO FIRST SPLINK REC 00996000 BAL R7,WRSPOOL WRITE LAST RECORD CORRECTLY @V67CAH7 00997000 * SO DMKSPLCR CAN DELETE ALL SPOOLRECS 00998000 SPACE 00999000 * FIND SFBLOK ON DMKRSPDP 01000000 ERROR146 DS 0H @V67CAH7 01001000 L R14,=A(DMKRSPDP) GET PTR TO DUMP ANCHOR @V67CAH7 01002000 NEXTSF DS 0H @V67CAH7 01003000 ICM R1,15,SFBPNT-SFBLOK(R14) GET NEXT SFBLOK PTR @V67CAH7 01004000 BZ BLOWUP1 NONEXISTANT...ERROR, BRANCH @V67CAH7 01005000 CR R1,R5 * IS THIS DESIRED SFBLOK? @V67CAH7 01006000 BE UPCHAIN * YES...BRANCH @V67CAH7 01007000 LR R14,R1 * NO...SAVE OLD POINTER @V67CAH7 01008000 B NEXTSF GO GET NEXT SFBLOK @V67CAH7 01009000 * FOUND PROPER SFBLOK... R1 POINTS TO IT, R14 POINTS TO PREVIOUS SFBLOK 01010000 UPCHAIN DS 0H @V67CAH7 01011000 L R1,SFBPNT PUT SFBLOKS FORWARD PTR IN R1 @V67CAH7 01012000 ST R1,SFBPNT-SFBLOK(,R14) GO AROUND DESIRED SFBLOK @V67CAH7 01013000 * DESIRED SFBLOK NOW REMOVED FROM DUMP IN PROGRESS CHAIN 01014000 * DELETE IT 01015000 LR R7,R5 SFBLOK POINTER TO REG 7 @V67CAH7 01016000 CALL DMKSPLDL CALL FUMIGATOR 01017000 B VMD146 GET OUT...AND GIVE MESSAGE @V67CAH7 01018000 EJECT 01019000 *********************************************************************** 01020000 * * 01021000 * 20. PROCESS DISCONTIGIOUS SAVED SEGMENTS * 01022000 * AND ANY SAVED SYSTEM WHICH EXCEEDS VMSTOR * 01023000 * * 01024000 *********************************************************************** 01025000 SPACE 2 01026000 * SAFE TO WAIT TILL NOW TO DUMP DSS..IT'S ALWAYS ABOVE DEFINED STORAGE 01027000 SPACE 01028000 ALLDUMP1 DS 0H @V67CAH7 01029000 TM SAVEWRK1,SETDSS * WAS 'DSS' SPECIFIED @V67CAH7 01030000 BNO ALLDUMP2 * NO...FINISHED, BRANCH @V67CAH7 01031000 SPACE 2 01032000 * 'DSS' BEING SPECIFIED MEANS THAT DISCONTIGUOUS SAVED SEGMENTS (DSS), 01033000 * OR ANY SAVED SYSTEMS MUST BE DUMPED 01034000 SPACE 01035000 S R3,F8 BACK UP, OVERLAY LAST RANGE @V67CAH7 01036000 DSSHUH DS 0H @V67CAH7 01037000 NI SAVEWRK1,X'FF'-SETDSS TURN OFF DSS INDICATOR @V67CAH7 01038000 L R1,VMSIZE * IS VMSIZE GT VMSTOR @V67CAH7 01039000 SPACE 01040000 * ROUND VMSIZE TO IT'S PAGE BOUNDARY 01041000 BCTR R1,0 REDUCE VALUE BY 1 @V67CAH7 01042000 N R1,XPAGNUM AND ROUND TO PAGE BOUNDARY @V67CAH7 01043000 ST R1,RANGEHI SAVE HIGH VALUE @V67CAH7 01044000 SPACE 01045000 * ROUND VMSTOR TO PAGE AFTER 'END' REQUEST 01046000 L R1,VMSTOR GET VMSTOR IN A REGISTER @V67CAH7 01047000 BCTR R1,0 AND REDUCE BY 1 @V67CAH7 01048000 N R1,XPAGNUM AND ROUND DOWN TO PREV PAGE @V67CAH7 01049000 A R1,F4096 AND ADD ONE PAGE @V67CAH7 01050000 ST R1,RANGELOW SAVE LOW VALUE @V67CAH7 01051000 SPACE 01052000 TM SAVEWRK1+1,DSSONLY * HERE DUE TO DSS ONLY? @V67CAH7 01053000 BO ORDERANG * YES...BRANCH @V67CAH7 01054000 B UPRANGE * NO...GO TO DUMP ROUTINE @V67CAH7 01055000 SPACE 2 01056000 EJECT 01057000 ALLDUMP2 DS 0H @V67CAH7 01058000 MVC NEXTCCPD,SFBSTART CREATE LOOP OF SPOOLRECS @V67CAH7 01059000 BAL R7,WRSPOOL WRITE OUT LAST RECORD @V67CAH7 01060000 * ALL DONE DUMPING VIRTUAL PAGES 01061000 SPACE 01062000 * FREE UP VIRTUAL PAGE FOR SPOOL BLOCK...R10 POINTS TO REAL ADDRESS 01063000 LR R2,R10 GET REAL ADDR IN R2 @V67CAH7 01064000 CALL DMKPTRUL UNLOCK PAGE 01065000 SPACE 01066000 DROP R10 NOW UNLOCKED.. @V67CAH7 01067000 * R2 WILL BE FLOATING BASE 01068000 USING SPLINK,R2 R2 AS SPOOL BASE @V67CAH7 01069000 SPACE 3 01070000 *********************************************************************** 01071000 * * 01072000 * 21. BUILD DMPINREC * 01073000 * * 01074000 *********************************************************************** 01075000 SPACE 2 01076000 MVC NEXTCCPD(4),SFBSTART SET TO GET DMPINREC @V67CAH7 01077000 BAL R7,GETSPOOL GET DMINREC @V67CAH7 01078000 * R2 HAS REAL ADDRESS OF PAGE 01079000 LA R3,SPSIZE+TAGSIZE(R2) ESTABLISH R3 AS BASE @V67CAH7 01080000 * FOR BUILDING DMPINREC 01081000 USING DMPINREC,R3 @V67CAH7 01082000 * ACTUAL BUILDING STARTS HERE 01083000 MVC DMPGPRS(16*4),VMGPRS MOVE GENERAL REGISTERS @V67CAH7 01084000 TM VMPSTAT,VMV370R * IS ECMODE 'ON' @V67CAH7 01085000 BO ECMODEON * YES... BRANCH @V67CAH7 01086000 MVC DMPCRS(4),VMVCR0 * NO...GET SINGLE REG @V67CAH7 01087000 B BLDDUMP2 * AND BRANCH @V67CAH7 01088000 ECMODEON DS 0H @V67CAH7 01089000 L R1,VMECEXT ECMODE = ON... @V67CAH7 01090000 * GET ECBLOK POINTER 01091000 USING ECBLOK,R1 ECBLOK ADDRESSABILITY @V67CAH7 01092000 MVC DMPCRS(16*4),EXTCR0 GET CONTROL REGISTERS @V67CAH7 01093000 DROP R1 DONE USING ECBLOK @V67CAH7 01094000 EJECT 01095000 BLDDUMP2 DS 0H @V67CAH7 01096000 CLI SFBFTYPE,C' ' * IS SFBFTYPE UNFILLED? @V67CAH7 01097000 BNE BLDDUMP3 * NO...IS FILLED..BRANCH @V67CAH7 01098000 MVC SFBFTYPE(4),=C'FILE' * YES...FILL WITH 'FILE' @V67CAH7 01099000 B BLDDUMP4 SKIP MOVING TO DMPIN @V67CAH7 01100000 SPACE 01101000 BLDDUMP3 DS 0H @V67CAH7 01102000 MVC DMPVMTYP,SFBFTYPE PUT REQUESTED NAME IN @V67CAH7 01103000 SPACE 01104000 BLDDUMP4 DS 0H @V67CAH7 01105000 MVC DMPFPRS(4*8),VMFPRS FLOATING POINT REGS @V67CAH7 01106000 MVC DMPCPUID,CPUID HARDWARE CPUID @V67CAH7 01107000 STCK DMPTODCK TIME FOR DMPINREC @V67CAH7 01108000 MVC DMPSYSRV,VMSTOR VIRT MACH DEFINED SIZE @V67CAH7 01109000 MVC DMPSYSRM,VMSIZE VIRT MACHINE REAL SIZE, @V67CAH7 01110000 * INCLUDES ANY DSS 01111000 MVC DMPPSW,VMPSW GET VIRTUAL MACHINE PSW @V67CAH7 01112000 MVC DMPPGMAP(256),BITBYTES * MOVE BITMAP @V67CAH7 01113000 MVC DMPPGMAP+256(256),BITBYTES+256 * IN TWO PARTS @V67CAH7 01114000 SPACE 2 01115000 * MOVE COMMENT TO DMPINREC 01116000 SPACE 01117000 ICM R8,15,SAVEWRK8 * IS THERE A COMMENT? @V67CAH7 01118000 BNH BLDDUMP5 * NO...BRANCH @V67CAH7 01119000 MVI DMPDMPID,C' ' * YES... BLANK OUT @V67CAH7 01120000 * * FULL COMMENT AREA 01121000 MVC DMPDMPID+1(L'DMPDMPID-1),DMPDMPID @V67CAH7 01122000 BCTR R8,0 * SET LENGTH FOR MVC @V67CAH7 01123000 L R1,SAVEWRK9 * SET PTR TO COMMENT @V67CAH7 01124000 EX R8,EXMOVE5 * MOVE TO DMPINREC @V67CAH7 01125000 SPACE 2 01126000 * WRITE OUT DMPINREC, SINCE UPPER 256 BYTES AREN'T USED IGNORE THEM 01127000 SPACE 01128000 BLDDUMP5 DS 0H @V67CAH7 01129000 L R0,NEXTCCPD CCPD ADDRESS @V67CAH7 01130000 MVC NEXTCCPD,SPNXTPAG GET CCPD OF RECORD 2 @V67CAH7 01131000 L R1,SPOLADDR VIRTUAL ADDRESS @V67CAH7 01132000 CALL DMKRPAPT,PARM=(SYSTEM) WRITE OUT DMPINREC 01133000 EJECT 01134000 *********************************************************************** 01135000 * * 01136000 * 22. BUILD KEY PAGES ON SPOOL * 01137000 * * 01138000 *********************************************************************** 01139000 SPACE 2 01140000 * THIS ROUTINE BUILDS THE DMPKYREC'S FROM THE IN STORAGE KEY DATA 01141000 * R8 = SPOOL RECORD INDEX...R2 = SPOOL RECORD BASE 01142000 * R3 = KEY RECORD INDEX 01143000 * BITKEY1 IS POINTER TO FIRST PAGE OF KEYS 01144000 * BITKEY2 IS POINTER TO SECOND PAGE OF KEYS 01145000 BAL R7,GETSPOOL GET REC 2...R2 AS BASE @V67CAH7 01146000 * IF ANY DMPINREC IS LEFT TO BUILD...HERE IS WHERE TO PUT INTO REC2 01147000 LA R8,2*SPSIZE+TAGSIZE SPOOL REC INDEX SETTING @V67CAH7 01148000 SPACE 01149000 * FILL RECORD 2 WITH KEY DATA 01150000 SPACE 01151000 L R15,F4096 * DETERMINE LENGTH @V67CAH7 01152000 SR R15,R8 * OF MOVE @V67CAH7 01153000 LR R3,R15 SAVE MOVE LENGTH @V67CAH7 01154000 LA R14,0(R8,R2) TO ADDRESS FOR MVCL @V67CAH7 01155000 L R0,BITKEY1 FROM ADDRESS FOR MVCL @V67CAH7 01156000 LR R1,R15 FROM LENGTH @V67CAH7 01157000 MVCL R14,R0 MOVE IT... @V67CAH7 01158000 SPACE 01159000 * WRITE OUT RECORD 2 01160000 SPACE 01161000 L R0,NEXTCCPD RECORD 2'S CCPD @V67CAH7 01162000 MVC NEXTCCPD,SPNXTPAG GET CCPD OF RECORD 3 @V67CAH7 01163000 L R1,SPOLADDR VIRT ADDR IN STORAGE @V67CAH7 01164000 CALL DMKRPAPT,PARM=(SYSTEM) PUT RECORD 2 ON DASD 01165000 SPACE 01166000 * RECORD 3 01167000 BAL R7,GETSPOOL READ IN REC3..R2=BASE @V67CAH7 01168000 SPACE 01169000 * THE FIRST INTERNAL PAGE OF KEY DATA ISN'T WRITTEN YET, WRITE REST NOW 01170000 * R8 HAS NUMBER OF BYTES LEFT TO WRITE. 01171000 SPACE 01172000 LA R14,SPSIZE(R2) 'TO' ADDRESS @V67CAH7 01173000 L R0,BITKEY1 * 'FROM' @V67CAH7 01174000 AR R0,R3 * ADDRESS @V67CAH7 01175000 * LENGTH OF MOVE IS EQUAL TO AMOUNT NOT MOVED INTO RECORD 2 01176000 LR R1,R8 LENGTH OF MOVE @V67CAH7 01177000 LR R15,R8 TO LENGTH OF MOVE @V67CAH7 01178000 MVCL R14,R0 MOVE REMAINDER OF @V67CAH7 01179000 * INTERNAL KEY PAGE 1 01180000 SPACE 2 01181000 * KEY 1 PAGE BUILT ON SPOOL RECORDS 01182000 EJECT 01183000 * NOW MOVE INTERNAL KEY PAGE 2 01184000 LA R8,SPSIZE(R8) ESTABLISH SPOOL INDEX @V67CAH7 01185000 LA R14,0(R8,R2) TO ADDRESS @V67CAH7 01186000 L R0,BITKEY2 FROM ADDRESS @V67CAH7 01187000 L R15,F4096 * DETERMINE LENGTH @V67CAH7 01188000 SR R15,R8 * TO MOVE @V67CAH7 01189000 LR R1,R15 FROM LENGTH @V67CAH7 01190000 LR R3,R15 SAVE LENGTH OF BITKEY2 @V67CAH7 01191000 MVCL R14,R0 FILL REMAINDER OF REC3 @V67CAH7 01192000 L R0,NEXTCCPD RECORD 3'S CCPD @V67CAH7 01193000 MVC NEXTCCPD,SPNXTPAG GET CCPD OF RECORD 4 @V67CAH7 01194000 L R1,SPOLADDR REAL ADDR IN STORAGE @V67CAH7 01195000 CALL DMKRPAPT,PARM=(SYSTEM) WRITE RECORD 3 TO DASD 01196000 SPACE 01197000 * RECORD 4 01198000 BAL R7,GETSPOOL GET RECORD 4 @V67CAH7 01199000 L R15,F4096 * LENGTH OF MOVE @V67CAH7 01200000 SR R15,R3 * TO RECORD 4 @V67CAH7 01201000 LA R14,SPSIZE(R2) TO ADDRESS @V67CAH7 01202000 L R0,BITKEY2 * FROM @V67CAH7 01203000 AR R0,R3 * ADDRESS @V67CAH7 01204000 LR R1,R15 FROM LENGTH @V67CAH7 01205000 MVCL R14,R0 MOVE DATA TO RECORD 4 @V67CAH7 01206000 * ALL KEY DATA MOVED NOW... 01207000 L R0,NEXTCCPD GET RECORD4'S CCPD @V67CAH7 01208000 L R1,SPOLADDR VIRT ADDRESS OF REC 4 @V67CAH7 01209000 CALL DMKRPAPT,PARM=(SYSTEM) WRITE RECORD4 TO DASD 01210000 EJECT 01211000 *********************************************************************** 01212000 * * 01213000 * 23. MOVE BUILT DUMP TO READER QUEUE * 01214000 * * 01215000 *********************************************************************** 01216000 SPACE 2 01217000 * SFBLOK NOW EXISTS ON DUMP IN PROGRESS QUEUE (DMKRSPDP). 01218000 * MOVE IT TO RDR QUEUE ON DMKRSPRD. 01219000 * R5 POINTS TO SFBLOK ON DMKRSPDP CHAIN...FOLLOW CHAIN UNTIL GET TO 01220000 * CORRECT SFBLOK (EQUAL ADDRESS TO R5), REMOVE IT FROM CHAIN, 01221000 * ADD IT TO RDR CHAIN. 01222000 L R14,=A(DMKRSPDP) POINT TO ANCHOR @V67CAH7 01223000 GETSF DS 0H @V67CAH7 01224000 ICM R1,15,SFBPNT-SFBLOK(R14) GET 1ST SFBLOK PTR @V67CAH7 01225000 BNZ GETSF2 NO PTR PRESENT..BOMB @V67CAH7 01226000 BLOWUP1 DS 0H @V67CAH7 01227000 ABEND 1 ...THIS SHOULDN'T HAPPEN 01228000 GETSF2 DS 0H @V67CAH7 01229000 CR R1,R5 * IS THIS DESIRED SFBLOK? @V67CAH7 01230000 BE GOTSF * YES...BRANCH @V67CAH7 01231000 LR R14,R1 * NO...UPDATE PTR TO PREV SFBLOK @V67CAH7 01232000 B GETSF BRANCH TO TRY AGAIN @V67CAH7 01233000 SPACE 01234000 GOTSF DS 0H @V67CAH7 01235000 * NOW R14=POINTER TO SFBLOK BEFORE DESIRED ONE, R1=POINTER TO SFBLOK 01236000 MVC SFBPNT-SFBLOK(L'SFBPNT,R14),SFBPNT-SFBLOK(R1) @V67CAH7 01237000 * REMOVES SFBLOK FROM QUEUE 01238000 SPACE 01239000 * ADD SFBLOK TO BACK OF READER QUEUE...FIND LAST ENTRY 01240000 L R14,ARSPRD ANCHOR TO READER CHAIN @V67CAH7 01241000 NEXTRDR DS 0H @V67CAH7 01242000 LR R2,R14 SAVE LAST ADDRESS @V67CAH7 01243000 ICM R14,15,SFBPNT-SFBLOK(R2) GET FORWARD POINTER @V67CAH7 01244000 BNZ NEXTRDR IF NOT PAST END...GET NEXT @V67CAH7 01245000 * R2 HAS LAST ENTRY ON RDR CHAIN 01246000 ST R5,SFBPNT-SFBLOK(,R2) ADD SFBLOK TO RDR CHAIN @V67CAH7 01247000 ST R14,SFBPNT-SFBLOK(,R5) 0 FORWARD PTR... @V67CAH7 01248000 * MIGHT HAVE PICKED POINTER UP IN DUMP QUEUE 01249000 SPACE 2 01250000 * CHECKPOINT DUMP FILE 01251000 SPACE 01252000 LR R7,R5 SET SFBLOK PTR AS DMKCKS WANTS @V67CAH7 01253000 CALL DMKCKSPL,PARM=ADDSFB+RDRCHN 01254000 EJECT 01255000 *********************************************************************** 01256000 * * 01257000 * 24. FREE WORK AREAS * 01258000 * * 01259000 *********************************************************************** 01260000 SPACE 01261000 * SPOLADDR POINTS TO SYSTEM VIRTUAL ADDRESS OF SPOOL PAGE 01262000 FREEALL DS 0H @V67CAH7 01263000 L R1,SPOLADDR GET VIRTUAL ADDRESS IN R1 @V67CAH7 01264000 CALL DMKPGTVR RELEASE PAGE (SPOOL BLOCK) 01265000 SPACE 01266000 * FREE UP TWO PAGES FOR KEYS 01267000 L R2,BITKEY1 REAL ADDRESS OF FIRST KEY PAGE @V67CAH7 01268000 CALL DMKPTRUL UNLOCK IT 01269000 L R1,KEYVIRT1 GET VIRTUAL ADDRESS TO RELEASE @V67CAH7 01270000 CALL DMKPGTVR RELEASE FIRST KEY PAGE 01271000 SPACE 01272000 L R2,BITKEY2 REAL ADDRESS OF 2ND KEY PAGE @V67CAH7 01273000 CALL DMKPTRUL UNLOCK IT 01274000 L R1,KEYVIRT2 VIRTUAL ADDRESS OF 2ND KEY PAGE @V67CAH7 01275000 CALL DMKPGTVR RELEASE 2ND KEY PAGE 01276000 SPACE 01277000 * FREE BITMAP SPACE 01278000 LA R0,BITMAPSZ GET NUMBER OF DOUBLE WORDS @V67CAH7 01279000 LR R1,R9 ADDR OF AREA TO BE GIVENUP @V67CAH7 01280000 CALL DMKFRET RID THY SELF OF EXCESSES 01281000 TM SAVEWRK1,ER146PRO * THIS FOR ERROR61 PROCESS @V67CAH7 01282000 BO VMD146B * YES...BR TO ISSUE MESSAGE @V67CAH7 01283000 SPACE 01284000 * COMMAND COMPLETE 01285000 MSG 'COMMAND COMPLETE' * ISSUE MESSAGE THAT 01286000 CALL DMKQCNWT,PARM=NORET * COMMAND IS COMPLETED 01287000 * END PROGRAM 01288000 EXIT 01289000 EJECT 01290000 SPACE 2 01291000 GETSPOOL DS 0H @V67CAH7 01292000 SPACE 01293000 * GETS SPOOL BLOCK WHOSE CCPD IS IN NEXTCCPD 01294000 SPACE 01295000 L R0,NEXTCCPD * SETUP FOR @V67CAH7 01296000 L R1,SPOLADDR * DMKRPA @V67CAH7 01297000 CALL DMKRPAGT,PARM=(SYSTEM+BRING) GET DMPINREC 01298000 BZR R7 RETURN @V67CAH7 01299000 OI SAVEWRK1+1,FLOATSP IND SPOOL BLOCK=UNLOCK @V67CAH7 01300000 B ERROR146 PROB GETIN PAGE...ERROR @V67CAH7 01301000 SPACE 4 01302000 EXMOVE5 MVC DMPDMPID(*-*),0(R1) MOVE COMMENT TO DMPINREC @V67CAH7 01303000 EJECT 01304000 *********************************************************************** 01305000 * * 01306000 * 25. ERROR ROUTINES * 01307000 * * 01308000 *********************************************************************** 01309000 SPACE 2 01310000 VMD009 DS 0H THIS ERROR IS PREVIOUSLY SETUP WITHIN PROG @V67CAH7 01311000 LA R2,009 SET ERROR CODE FOR INVALID RANGE @V67CAH7 01312000 B CALLERM @V67CAH7 01313000 SPACE 2 01314000 VMD013 DS 0H @V67CAH7 01315000 LA R2,13 ERROR CODE, CONFLICTING OPTION @V67CAH7 01316000 * REGS 0,1 ALREADY SETUP AT ENTRY 01317000 B CALLERM BRANCH TO ERROR WRITER @V67CAH7 01318000 SPACE 2 01319000 VMD020 DS 0H @V67CAH7 01320000 LA R2,20 ERROR CODE,USERID MISSING/INVALID @V67CAH7 01321000 B NOVAR BRANCH TO ERROR WRITER @V67CAH7 01322000 SPACE 2 01323000 VMD033 DS 0H @V67CAH7 01324000 LA R2,33 ERROR CODE, HEXLOC MISSING/INVALID @V67CAH7 01325000 B NOVAR BRANCH @V67CAH7 01326000 SPACE 2 01327000 VMD038 DS 0H @V67CAH7 01328000 LA R2,38 ERROR CODE, PARAMETER MISSING @V67CAH7 01329000 MVC SAVEWRK2(8),MSG38 BUILD MESSAGE MODIFIER @V67CAH7 01330000 LA R1,SAVEWRK2 POINT TO DATA @V67CAH7 01331000 LA R0,8 LENGTH OF DATA @V67CAH7 01332000 B CALLERM BRANCH @V67CAH7 01333000 SPACE 2 01334000 VMD053 DS 0H @V67CAH7 01335000 LA R2,53 ERROR CODE, USERID NOT IN DIRECT @V67CAH7 01336000 * REGS 0,1 ALREADY SETUP AT ENTRY 01337000 B CALLERM BRANCH TO WRITE ERROR MSG @V67CAH7 01338000 EJECT 01339000 VMD146 DS 0H @V67CAH7 01340000 TM SAVEWRK1+1,FLOATSP * SPOOL BLOCK BEEN FREED @V67CAH7 01341000 BO VMD146A * YES...BRANCH @V67CAH7 01342000 * FREE UP VIRTUAL PAGE FOR SPOOL BLOCK...R10 POINTS TO REAL ADDRESS 01343000 LR R2,R10 GET REAL ADDR IN R2 @V67CAH7 01344000 CALL DMKPTRUL UNLOCK PAGE 01345000 VMD146A DS 0H @V67CAH7 01346000 OI SAVEWRK1,ER146PRO SET ER146 PROCESSING IND @V67CAH7 01347000 B FREEALL GO FREE AREAS @V67CAH7 01348000 VMD146B DS 0H @V67CAH7 01349000 LA R2,146 ERROR CODE, SPOOLING ERROR @V67CAH7 01350000 B NOVAR BRANCH @V67CAH7 01351000 SPACE 2 01352000 VMD160 DS 0H @V67CAH7 01353000 LA R2,160 ERROR CODE, HEXLOC EXCEEDS STORAGE @V67CAH7 01354000 CALL DMKCVTBH R1 POINTS TO ADDR GT STORAGE SIZE 01355000 STCM R0,3,SAVEWRK2 * BUILD BUFFER @V67CAH7 01356000 STCM R1,15,SAVEWRK2+2 * AREA @V67CAH7 01357000 LA R0,6 * ESTABLISH LENGTH @V67CAH7 01358000 LA R1,SAVEWRK2 * AND POINTER @V67CAH7 01359000 B CALLERM BRANCH TO WRITE ERROR MSG @V67CAH7 01360000 SPACE 4 01361000 NOVAR DS 0H @V67CAH7 01362000 SR R1,R1 ZERO PARM REGISTER @V67CAH7 01363000 SPACE 2 01364000 * SETUP AND EXECUTE ERROR MESSAGE 01365000 CALLERM DS 0H @V67CAH7 01366000 ICM R0,14,MODID+3 INSERT MODULE ID @V67CAH7 01367000 TM SAVEWRK1,ER146PRO IS THIS DUE TO ERROR61 @V67CAH7 01368000 BO PUTERMSG YES...SKIP MOST OF SETUP @V67CAH7 01369000 ICM R2,B'1000',X40FFS FLAG TO FRET BUFFER @V67CAH7 01370000 LA R3,SFBSIZE LENGTH OF SFBLOK @V67CAH7 01371000 SLL R3,24 SHIFT NUMB TO HI ORDER BYTE @V67CAH7 01372000 AR R3,R5 ADD ADDR OF SFBLOK @V67CAH7 01373000 * TO LOW ORDER 01374000 PUTERMSG DS 0H @V67CAH7 01375000 CALL DMKERMSG 01376000 EJECT 01377000 SPACE 2 01378000 * DEFINED STORAGE 01379000 SPACE 01380000 BITTRANS DC X'8040201008040201' @V67CAH7 01381000 MAXFILE DC H'9900' @V67CAH7 01382000 MSG38 DS 0CL8 @V67CAH7 01383000 DC C' ' 1ST OPTIONAL FIELD=IGNORE IT @V67CAH7 01384000 DC X'00' FIELD DELIMITER @V67CAH7 01385000 DC C'FORMAT' 2ND OPTIONAL FIELD @V67CAH7 01386000 SPACE 2 01387000 * MY EQUATES 01388000 SPACE 01389000 * SAVEWRK1 SETTINGS 01390000 * INDICATES: 01391000 SPACE 01392000 SETTO EQU X'01' A 'TO' OR 'SYSTEM' ENTRY FOUND @V67CAH7 01393000 SETFORM EQU X'02' A 'FORMAT' ENTRY FOUND @V67CAH7 01394000 ER146PRO EQU X'04' ERROR 146 PROCESSING HAPPENING @V67CAH7 01395000 DASH EQU X'10' A DASH FOUND FOR THIS ENTRY @V67CAH7 01396000 DOT EQU X'20' A DOT FOUND FOR THIS ENTRY @V67CAH7 01397000 BLANK EQU X'40' A BLANK FOUND FOR THIS ENTRY @V67CAH7 01398000 * DASH,DOT,BLANK ARE RESET FOR EACH RANGE ENTRY 01399000 SETDSS EQU X'80' 'DSS' SPECIFIED ON VMDUMP, @V67CAH7 01400000 * REQUESTS DUMPING DISCONTIGIOUS SAVED SEGMENTS 01401000 SPACE 2 01402000 * SAVEWRK1+1 SETTINGS 01403000 * INDICATES: 01404000 SPACE 01405000 FLOATSP EQU X'01' FLOATING INTERNAL SPOOL BLOCK @V67CAH7 01406000 DSSONLY EQU X'02' DSS SPECIFIED ALONE...DON'T @V67CAH7 01407000 * FORCE 0-END DEFAULT 01408000 SPACE 2 01409000 TAGSIZE EQU 240 SIZE OF TAG SPACE TO SAVE @V67CAH7 01410000 COLON EQU X'7A' A 'COLON' @V67CAH7 01411000 EJECT 01412000 SPACE 2 01413000 * MY DSECTS 01414000 SPACE 01415000 RANGES DSECT DSECT TO BUILD INSTORAGE RANGES IN SEQUENCE @V67CAH7 01416000 RANGELOW DS 1F RANGE LOW ADDRESS @V67CAH7 01417000 RANGEHI DS 1F RANGE HIGH ADDRESS @V67CAH7 01418000 RANGENXT EQU * UPDATE MECHANISM @V67CAH7 01419000 SPACE 01420000 BITMAP DSECT MAP PUT IN DMPINREC TO INDICATE PAGES @V67CAH7 01421000 BITBYTES DS 512X DUMPED...EACH BIT INDICATES ONE PAGE. @V67CAH7 01422000 * 0 = NOT DUMPED, 1 = DUMPED 01423000 * FIRST BIT OF FIRST BYTE IS FOR PAGE 0, 01424000 * AND THEY GO SEQUENTIALLY FROM THERE. 01425000 BITKEY1 DS F REAL ADDRESS OF KEY PAGE 1 @V67CAH7 01426000 BITKEY2 DS F REAL ADDRESS OF KEY PAGE 2 @V67CAH7 01427000 CURRENT DS F HOLDS THE CURRENT SPOOL RECS CCPD @V67CAH7 01428000 NEXTCCPD DS F HOLDS THE NEXT SPOOL RECORDS CCPD @V67CAH7 01429000 SPOLADDR DS F HOLDS THE SPOOL RECS,SYSTEM VIRT. ADDR @V67CAH7 01430000 KEYVIRT1 DS F SYSTEM VIRTUAL ADDR OF FIRST KEY PAGE @V67CAH7 01431000 KEYVIRT2 DS F SYSTEM VIRTUAL ADDR OF 2ND KEY PAGE @V67CAH7 01432000 LASTRANG DS F END OF RANGE POINTER...POINTER TO @V67CAH7 01433000 * LAST RANGE REALLY 01434000 SVREG2 DS F STORAGE FOR REG2 WHEN ITS NEEDED @V67CAH7 01435000 BITMAPSZ EQU ((*-BITMAP)+7)/8 @V67CAH7 01436000 EJECT 01437000 SPACE 2 01438000 COPY EQU @V67CAH7 01439000 COPY DEVTYPES @V67CAH7 01440000 PSA 01441000 COPY VMBLOK @V67CAH7 01442000 COPY SAVE @V67CAH7 01443000 COPY SPOOL @V67CAH7 01444000 COPY CONBUF @V67CAH7 01445000 COPY DMPBLOKS @V67CAH7 01446000 COPY CORE @V67CAH7 01447000 END DMKVMD @V67CAH7 01448000