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