USO TITLE 'DMKUSO (CP) VM/370 - RELEASE 6' 00001000 ISEQ 73,80 VALIDATE SEQUENCING OF SYSIN 00002000 *. 00003000 * MODULE NAME - 00004000 * 00005000 * DMKUSO 00006000 * 00007000 * CONTENTS - 00008000 * 00009000 * DMKUSOLG - 'LOGOFF' COMMAND 00010000 * DMKUSOFL - 'FORCE' COMMAND 00011000 * DMKUSOFF - ROUTINE TO LOGOFF A USER 00012000 * DMKUSODS - 'DISCONNECT' COMMAND 00013000 *. 00014000 EJECT 00015000 COPY OPTIONS 00016000 COPY LOCAL 00017000 SPACE 3 00018000 DMKUSO CSECT 00019000 SPACE 00020000 DC CL8'DMKUSO' PAGEABLE MODULE IDENTIFIER @V200820 00021000 SPACE 00022000 EXTRN DMKACOTM,DMKACOFF,DMKVATBC,DMKBLDRL @V200820 00023000 EXTRN DMKCFPRR,DMKPGSPO,DMKPTRRU,DMKPTRRL @V200820 00024000 EXTRN DMKCVTBD,DMKCVTBH,DMKCVTDT,DMKERMSG @V200820 00025000 EXTRN DMKSSSUS,DMKSSSVM @V60B6B8 00025010 EXTRN DMKSCNFD,DMKSCNAU,DMKSCNRD,DMKSCNRN @V200820 00026000 EXTRN DMKSCNVD @VA07859 00026500 EXTRN DMKSCHDL,DMKSCHRT,DMKSYSTI,DMKPTRPW @VA08037 00027200 EXTRN DMKSCHAU @V408246 00027300 EXTRN DMKSTKCP,DMKTRCND,DMKPERT @VM08908 00028000 EXTRN DMKPAGSK @V408246 00028100 EXTRN DMKSCNVU,DMKVDREL @VA03351 00029000 EXTRN DMKVMASH @V60BC11 00030000 EXTRN DMKPTRUL @VA05738 00030100 EXTRN DMKCPE,DMKCKP @V408246 00030200 EXTRN DMKPGSPP @V408246 00030400 SPACE 00031000 USING PSA,R0 FOR ALL ENTRIES 00032000 USING VMBLOK,R11 ... 00033000 USING SAVEAREA,R13 ... 00034000 * 00035000 EJECT 00036000 *. 00037000 * SUBROUTINE NAME - 00038000 * 00039000 * DMKUSOLG - 'LOGOFF' COMMAND 00040000 * 00041000 * FUNCTION - 00042000 * 00043000 * FOR A USER, TO LOGOFF FROM CP370 WHEN HIS 00044000 * TERMINAL SESSION IS COMPLETED 00045000 * 00046000 * COMMAND LINE FORMAT - 00047000 * 00048000 * +--------+---------------------------------------------+ 00049000 * | LOGOUT | | 00050000 * | LOGOFF | | 00051000 * | LOG | | 00052000 * +--------+---------------------------------------------+ 00053000 * 00054000 * SEE "NOTES" BELOW. 00055000 * 00056000 * ATTRIBUTES - 00057000 * 00058000 * REENTRANT, PAGEABLE, CALLED VIA SVC 00059000 * 00060000 * ENTRY POINT - 00061000 * 00062000 * DMKUSOLG 00063000 * 00064000 * ENTRY CONDITIONS - 00065000 * 00066000 * GPR 2 = 0 00067000 * GPR 9 = ADDRESS OF 'LOGOFF' COMMAND 00068000 * GPR 11 = ADDRESS OF CALLER'S VMBLOK 00069000 * GPR 12 = ADDRESS OF DMKUSOLG 00070000 * GPR 13 = ADDRESS OF STANDARD SAVE AREA 00071000 * 00072000 * EXIT CONDITIONS - 00073000 * 00074000 * RETURNS TO THE CALLER IF AN ERROR IN THE COMMAND LINE 00075000 * 00076000 * WHEN A USER HAS LOGGED HIMSELF OFF, RETURNS TO CP370 00077000 * WITH THE USER DELETED FROM THE RUNNING SYSTEM. 00078000 * 00079000 * CALLS TO OTHER ROUTINES - 00080000 * 00081000 * DMKSCNFD - TO SCAN COMMAND LINE 00082000 * DMKERMSG - TO SEND ERROR MESSAGE TO CALLER IF NECESSARY 00083000 * DMKUSOFF - INVOKED TO DO ACTUAL 'LOGOFF' PROCESS 00084000 EJECT 00085000 * EXTERNAL REFERENCES - 00086000 * 00087000 * NONE 00088000 * 00089000 * TABLES / WORK AREAS - 00090000 * 00091000 * NONE 00092000 * 00093000 * REGISTER USAGE - 00094000 * 00095000 * GPR 9 = ADDRESS OF 'LOGOFF' COMMAND BUFFER 00096000 * GPR 10 = ADDRESS OF VMBLOK OF USER TO BE LOGGED OFF 00097000 * GPR 11 = ADDRESS OF CALLER'S / USER'S VMBLOK 00098000 * GPR 12 = BASE REGISTER 00099000 * GPR 13 = ADDRESS OF STANDARD SAVE AREA 00100000 * 00101000 * OTHER REGISTERS ARE USED FOR WORK REGISTERS 00102000 * 00103000 * NOTES - 00104000 * 00105000 * 1. 'LOGOUT' MAY ALSO BE USED AS WELL AS 'LOGOFF' 00106000 * FOR THIS COMMAND, BUT IN ANY EVENT AT LEAST 00107000 * THREE CHARACTERS ('LOG') MUST BE GIVEN. 00108000 * 00109000 * 2. THE 'HOLD' OPTION IS USED TO KEEP A 2701/2702/2703 00110000 * LINE ENABLED AFTER THE LOGOFF IS COMPLETE. 00111000 * 00112000 * OPERATION - 00113000 * 00114000 * 1. CALLS DMKSCNFD TO DETERMINE IF AN OPTION IS PRESENT ON THE 00115000 * COMMAND LINE. IF YES, IT MUST BE 'HOLD' (ERROR IF NOT). 00116000 * 00117000 * 2. THEN SETS REGISTERS AND FLAGBITS AS NEEDED, AND 00118000 * BRANCHES TO THE DMKUSOFF ROUTINE AT STEP 2 TO 00119000 * ACCOMPLISH THE ACTUAL LOGOFF FROM THE SYSTEM. 00120000 * 00121000 * MESSAGES - 00122000 * 00123000 * RESPONSES - 00124000 * 00125000 * SEE DMKUSOFF ROUTINE FOR THE RESPONSES SENT TO THE USER 00126000 * AND THE SYSTEM OPERATOR IN THE LOGOFF PROCESS. 00127000 * 00128000 * ERROR MESSAGES FOR 'LOGOFF' COMMAND: 00129000 * 00130000 * DMKUSO003E INVALID OPTION - XXXX 00131000 *. 00132000 EJECT 00133000 *********************************************************************** 00134000 * 00135000 * DMKUSOLG - 'LOGOFF' COMMAND 00136000 * 00137000 *********************************************************************** 00138000 SPACE 00139000 DMKUSOLG RELOC ENTER 'LOGOFF' COMMAND. 00140000 TM VMRSTAT,VMLOGOFF IS USER ALREADY IN LOGOFF? @VA01827 00141000 BO USO99X YES--EXIT @VA04404 00142000 TM VMRSTAT,VMEXWAIT IS USER IN EXECUTION WAIT ? @VA13025 00142100 BZ USO06 NO, CONTINUE LOGOFF PROCESS @VA13025 00142200 BAL R8,USOSUB CHECK CMD LINE @VA13025 00142300 LR R10,R11 SET UP R10 FOR DELAYED LOGOFF @VA13025 00142400 OI VMOSTAT,VMKILL DELAY THE LOGOFF UNTIL COMPLETE @VA13025 00142500 B DELAYOFF GO SET UP TO DELAY THE LOGOFF @VA13025 00142600 USO06 MVI SAVEWRK1,ELOGOFF SIGNAL: LOGOFF ENTERED. 00143000 BAL R8,USOSUB AND CALL SUBROUTINE TO CHECK COMMAND LINE 00144000 * COMMAND LINE WAS OK, PROCEED: 00145000 USO08 OI VMRSTAT,VMLOGOFF SYNCHRONIZE LOGOFF @VA05705 00145650 LA R15,8 SAVERETN+8 = DONT READ, DONT RUN @VA04404 00146200 AL R15,SAVERETN MODIFY RETURN 00147000 ST R15,SAVERETN AND STORE IT BACK. 00148000 MC 5,1 TELL MONITOR USER LOGGING OFF @V4M0129 00148110 LA R0,CPEXSIZE GET STORAGE FOR CPEXBLOK @VA02805 00149000 CALL DMKFREE @VA02805 00150000 USING CPEXBLOK,R1 @VA02805 00151000 STM R0,R15,CPEXR0 SAVE ALL REGS @VA02805 00152000 LA R3,USOJOIN RETURN TO USOJOIN IN DMKUSOFF... @VA02805 00153000 ST R3,CPEXADD ...WHEN CPEXBLOK IS UNSTACKED @VA02805 00154000 CALL DMKSTKCP STACK CPEXBLOK @VA02805 00155000 GOTO DMKDSPCH CAUSE SYNCRONIZATION OF CPEXBLOKS@VA02805 00156000 DROP R1 @VA02805 00157000 EJECT 00158000 *. 00159000 * SUBROUTINE NAME - 00160000 * 00161000 * DMKUSOFL - 'FORCE' COMMAND 00162000 * 00163000 * FUNCTION - 00164000 * 00165000 * TO FORCE THE LOGOFF OF A SPECIFIC USER FROM THE SYSTEM 00166000 * 00167000 * COMMAND LINE FORMAT - 00168000 * 00169000 * +---------+---------------------------------------+ 00170000 * | | | 00171000 * | FORCE | USERID | 00172000 * | | | 00173000 * +---------+---------------------------------------+ 00174000 * 00175000 * SEE "NOTES" BELOW. 00176000 * 00177000 * ATTRIBUTES - 00178000 * 00179000 * REENTRANT, PAGEABLE, CALLED VIA SVC 00180000 * 00181000 * ENTRY POINT - 00182000 * 00183000 * DMKUSOFL 00184000 * 00185000 * ENTRY CONDITIONS - 00186000 * 00187000 * GPR 2 = 0 00188000 * GPR 9 = ADDRESS OF 'FORCE' COMMAND 00189000 * GPR 11 = ADDRESS OF CALLER'S VMBLOK 00190000 * GPR 12 = ADDRESS OF DMKUSOFL 00191000 * GPR 13 = ADDRESS OF STANDARD SAVE AREA 00192000 * 00193000 * EXIT CONDITIONS - 00194000 * 00195000 * RETURNS TO THE CALLER IF AN ERROR IN THE COMMAND LINE 00196000 * 00197000 * RETURNS TO THE CALLER WHEN THE SPECIFIED USER HAS BEEN 00198000 * LOGGED OFF THE SYSTEM (UNLESS THE CALLER WAS THE USER) 00199000 * 00200000 * IF THE CALLER FORCED HIMSELF OFF, RETURNS TO CP370 00201000 * WITH THE CALLER DELETED FROM THE RUNNING SYSTEM. 00202000 * 00203000 * CALLS TO OTHER ROUTINES - 00204000 * 00205000 * DMKSCNFD - TO SCAN COMMAND LINE 00206000 * DMKSCNAU - TO CHECK FOR ACTIVE USER 00207000 * DMKERMSG - TO SEND ERROR MESSAGE TO CALLER IF NECESSARY 00208000 EJECT 00209000 * EXTERNAL REFERENCES - 00210000 * 00211000 * DMKSYSOP - SYSTEM OPERATOR'S VMBLOK 00212000 * 00213000 * TABLES / WORK AREAS - 00214000 * 00215000 * NONE 00216000 * 00217000 * REGISTER USAGE - 00218000 * 00219000 * GPR 9 = ADDRESS OF 'FORCE' COMMAND BUFFER 00220000 * GPR 10 = ADDRESS OF VMBLOK OF USER TO BE LOGGED OFF 00221000 * GPR 11 = ADDRESS OF CALLER'S / USER'S VMBLOK 00222000 * GPR 12 = BASE REGISTER 00223000 * GPR 13 = ADDRESS OF STANDARD SAVE AREA 00224000 * 00225000 * OTHER REGISTERS ARE USED FOR WORK REGISTERS 00226000 * 00227000 * NOTES - 00228000 * 00229000 * 1. 'FORCE USERID' IS A PRIVILEGED COMMAND VALID ONLY 00230000 * FOR A USER WITH PRIVILEGE CLASS A (SYSTEM OPERATOR). 00231000 * 00232000 * OPERATION - 00233000 * 00234000 * 1. CALLS DMKSCNFD TO OBTAIN THE USERID FROM THE COMMAND LINE. 00235000 * (ERROR IF MISSING OR > 8 BYTES IN LENGTH.) IF OK, CALLS 00236000 * DMKSCNAU TO DETERMINE IF THE GIVEN USERID IS CURRENTLY 00237000 * LOGGED ON THE SYSTEM (ERROR IF NOT). 00238000 * 00239000 * 2. CHECKS TO SEE IF THE USERID TO BE LOGGED OFF IS THE 00240000 * CALLER OF THE FORCE COMMAND (POSSIBLE IF PERHAPS UNLIKELY); 00241000 * IF YES, HANDLES LIKE A NORMAL 'LOGOFF'. 00242000 * 00243000 * 3. SET THE 'VMKILL' FLAG IN VMOSTAT FOR THE FORCED USER. 00244000 * BUILD A CPEXBLOK TO ENTER DMKDSPCH POINTING TO THE VMBLOK 00245000 * OF THE FORCED USER, SO THAT DMKDSPCH WILL CALL DMKUSOFF. 00246000 * 00247000 * ERROR MESSAGES - 00248000 * 00249000 * DMKUSO020E USERID MISSING OR INVALID 00250000 * DMKUSO045E USERID NOT LOGGED ON 00251000 * DMKUSO003E INVALID OPTION - XXXX 00252000 *. 00253000 EJECT 00254000 *********************************************************************** 00255000 * 00256000 * DMKUSOFL - 'FORCE' COMMAND - FORCE LOGOFF OF A USER 00257000 * 00258000 *********************************************************************** 00259000 SPACE 00260000 DMKUSOFL RELOC ENTER 'FORCE' COMMAND. 00261000 MVI SAVEWRK1,EFORCE FLAG 'FORCE' COMMAND ENTERED@V200820 00262000 CALL DMKSCNFD PICK UP USERID FROM COMMAND LINE @V200820 00263000 BNZ ERROR20 ERROR IF MISSING. 00264000 CL R0,F8 CHECK BYTE COUNT 00265000 BH ERROR20 ERROR IF INVALID (> 8 CHARS) 00266000 STM R0,R1,SAVEWRK2 REMEMBER R0/R1 (FROM DMKSCNFD) 00267000 CALL DMKSCNAU SEE IF USERID IS ON THE SYSTEM 00268000 BC 4+2,ERROR45 CALLING ERROR OR NOT ON. 00269000 LR R10,R1 REMEMBER VMBLOK ADDR OF FORCEE @VA03806 00270000 TM VMRSTAT-VMBLOK(R10),VMLOGOFF IN LOGOFF NOW? @VA03806 00271000 BO ERROR45 YES, BR 00272000 TM VMOSTAT-VMBLOK(R10),VMKILL MAKE DOUBLE SURE... @VA04404 00272300 BO ERROR45 DONT DOIT TWICE. @VA04404 00272600 CLR R10,R11 IS THE CALLER = THE USER (NOT ILLEGAL) 00273000 BNE FRCUSER NO, THEN GO FORCE THE USER @VA13025 00274000 TM VMRSTAT,VMEXWAIT IS USER IN EXECUTION WAIT @VA13025 00274100 BZ USO08 NO, JUST TREAT LIKE NORMAL LOGOFF@VA13025 00274200 OI VMOSTAT,VMKILL TURN ON KILL BIT @VA13025 00274300 B DELAYOFF AND GO TO DELAY THE LOGOFF @VA13025 00274400 FRCUSER DS 0H HERE TO FORCE A USER @VA13025 00274500 SPACE 00275000 OI VMOSTAT-VMBLOK(R10),VMKILL LOGOFF THIS USER A@V200820 00276000 OI VMSVSTAT-VMBLOK(R10),VMLGFORC FORCE @VA13026 00276500 SPACE 00277000 DELAYOFF DS 0H DELAY THE FORCE/LOGOFF @VA13025 00277500 LA R0,CPEXSIZE @V200820 00278000 CALL DMKFREE GET FREE STORAGE FOR A CPEXBLOK @V200820 00279000 USING CPEXBLOK,R1 @V200820 00280000 XC CPEXBLOK(16),CPEXBLOK CLEAR HEADER PORTION @V200820 00281000 ST R10,CPEXR11 SET GR11 = FORCED USER VMBLOK @V200820 00282000 L R2,ADSPCH ENTRY TO DMKDSP @VA13026 00283100 ST R2,CPEXR12 ...SET FOR 'GOTO DMKDSPCH' @V200820 00284000 ST R2,CPEXADD ... @V200820 00285000 CALL DMKSTKCP STACK THE CPEXBLOK @V200820 00286000 SPACE 00287000 EXIT , RETURN TO DMKCFM @V200820 00288000 DROP R1 @V200820 00289000 EJECT 00290000 *. 00291000 * SUBROUTINE NAME - 00292000 * 00293000 * DMKUSOFF - ROUTINE TO LOGOFF A USER 00294000 * 00295000 * FUNCTION - 00296000 * 00297000 * TO PERFORM THE APPROPRIATE INTERNAL FUNCTIONS 00298000 * NECESSARY TO DELETE A USER FROM THE RUNNING SYSTEM. 00299000 * 00300000 * ATTRIBUTES - 00301000 * 00302000 * REENTRANT, PAGEABLE, CALLED VIA SVC 00303000 * 00304000 * ENTRY POINT - 00305000 * 00306000 * DMKUSOFF 00307000 * 00308000 * ENTRY CONDITIONS - 00309000 * 00310000 * GPR 11 = ADDRESS OF USER'S VMBLOK 00316000 * GPR 12 = ADDRESS OF DMKUSOFF 00317000 * GPR 13 = ADDRESS OF STANDARD SAVE AREA 00318000 * 00319000 * EXIT CONDITIONS - 00320000 * 00321000 * NONE 00322000 * 00323000 * CALLS TO OTHER ROUTINES - 00324000 * 00325000 * DMKCVTDT - COMPUTE DATE-TIME 00326000 * DMKACOTM - GET ACCOUNTING TIME 00327000 * DMKQCNWT - WRITE MESSAGE TO USER & OPERATOR 00328000 * DMKSCHDL - SCHEDULE RUNNING USER 00329000 * DMKSCHRT - RESET AN OUTSTANDING CLOCK COMPARATOR REQUEST 00330000 * DMKPGSPO - RESET PAGES 00331000 * DMKACOFF - DO FINAL ACCOUNTING 00332000 * DMKCFPRR - RESET VIRTUAL MACHINE & RELEASE ALL VIRTUAL DEVICES 00333000 * DMKSCNRN - TO GET DEVICE NAME 00334000 * DMKFRET - RETURN VMBLOK TO FREE STORAGE 00335000 * DMKFREE - OBTAIN STORAGE FOR MESSAGES. 00336000 * DMKVATBC - RELEASE SHADOW TABLES. 00337000 * DMKBLDRL - RELEASE SEGMENT, PAGE, AND SWAP TABLES. 00338000 * DMKSCNRD - TO GET TERMINAL DEVICE ADDRESS. 00339000 * DMKCVTBH - TO CONVERT A BINARY ADDRESS TO HEX. 00340000 * DMKCVTBD - TO CONVERT A BINARY NUMBER TO DECIMAL. 00341000 * DMKPERT - TO TERMINATE "PER" TRACING 00342000 * DMKTRCND - TO TERMINATE "TRACE" TRACING 00343000 * DMKPGSPP RELEASE PAGES 00343100 * 00344000 * EXTERNAL REFERENCES - 00345000 * 00346000 * DMKSYSOP - SYSTEM OPERATOR'S VMBLOK 00347000 * DMKSYSVM - SYSTEM VMBLOK 00348000 * 00349000 * TABLES / WORK AREAS - 00350000 * 00351000 * VMBLOK 00352000 * TERMINAL REAL DEVICE BLOCK 00353000 * 00354000 * REGISTER USAGE - 00355000 * 00356000 * GPR 9 = 0 00358000 * GPR 11 = ADDRESS OF USER'S VMBLOK 00359000 * GPR 12 = BASE REGISTER 00360000 * GPR 13 = ADDRESS OF STANDARD SAVE AREA 00361000 * 00362000 * GPRS 0-1, 3-8, 10, AND 14-15 ARE WORK REGISTERS. 00363000 * 00364000 * NOTES - 00365000 * 00366000 * DMKUSOFF CALLED DIRECTLY BY DMKDSPCH IF 00367500 * NECESSARY TO LOGOFF A USER BECAUSE OF A DROPPED LINE OR 00368000 * BECAUSE HIS VIRTUAL MACHINE STOPPED RUNNING WHEN IN THE 00369000 * DISCONNECTED MODE. 00370000 * 00371000 * OPERATION - 00372000 * 00373000 * 1. SETS R9 = 0 (TO INDICATE NOT INVOKED FROM DMKUSOLG) 00374000 * 00376000 * 2. BY CALLING APPROPRIATE SUBROUTINES, COMPUTES NEEDED 00377000 * INFORMATION FOR MESSAGES SENT TO USER AND SYSTEM OPERATOR, 00378000 * ACCOUNTING DATA, ETC. WHEN ALL I/O ACTIVITY FOR THE USER 00379000 * HAS QUIESCED, CALLS ROUTINES TO RELEASE SHADOW SEGMENT AND 00380000 * PAGE TABLES (IF IN USE), RELEASE ALL PAGES ASSIGNED TO THE 00381000 * USER, RELEASE VIRTUAL CHANNEL, CONTROL UNIT, AND 00382000 * DEVICE BLOCKS, AND ASSOCIATED OTHER BLOCKS. FINALLY, 00383000 * THE USER'S VMBLOK IS DETACHED FROM THE CHAIN AND GIVEN 00384000 * BACK TO FREE STORAGE, AND EXIT IS MADE TO CP370 WITH THE 00385000 * USER DELETED FROM THE CHAIN OF USERS ON THE SYSTEM. 00386000 * IF THE USER WAS OCCUPYING THE VIRTUAL = REAL REGION, THE 00387000 * MEMORY RELEASE SUBROUTINE (DMKBLDRL) IS CALLED WITH A PARM 00388000 * OF 1 IN GPR2 TO INDICATE THAT THE REGION IS NOW FREE, AND TO 00389000 * INDICATE THAT THERE ARE NO SWAPTABLES TO BE RELEASED. 00390000 EJECT 00391000 * MESSAGES - 00392000 * 00393000 * NORMAL RESPONSES TO USER: 00394000 * 00395000 * 'CONNECT= HH:MM:SS VIRTCPU= MMM:SS.00 TOTCPU= MMM:SS.00' 00396000 * 'LOGOFF AT HH:MM:SS TID WEEKDAY MM/DD/YY' 00397000 * OQ 00398000 * 'LOGOFF AT HH:MM:SS TID WEEKDAY MM/DD/YY BY SYSTEM' 00399000 * 00400000 * MESSAGES SENT TO SYSTEM OPERATOR: 00401000 * 00402000 * 'TYPE RADDR LOGOFF AS USERID USERS = NNN ' 00403000 * OR 00404000 * 'LINE DSC LOGOFF AS USERID USERS = NNN ' 00405000 * 00406000 * ERROR MESSAGES - NONE 00407000 *. 00408000 EJECT 00409000 *********************************************************************** 00410000 * 00411000 * DMKUSOFF - ROUTINE TO LOGOFF A USER 00412000 * 00413000 *********************************************************************** 00414000 SPACE 00415000 DMKUSOFF RELOC 00416000 SR R2,R2 CLEAR REG FOR INSERT OF PARMS @VA13026 00416200 TM VMSVSTAT,VMLGFORC FORCE? @VA13026 00416280 BZ NOFORCE @VA13026 00416360 O R2,=A(FORCE) INDICATE FORCE @VA13026 00416440 NOFORCE DS 0H @VA13026 00416520 TM VMSVSTAT,VMLGNMSG NO OPERATOR MESSAGE PARM SET @VA13026 00416600 BZ NONMSG PARM NOT SET, DON'T SUPPRESS @VA13026 00416680 O R2,=A(NOOPMSG) SUPPRESS OPERATOR MESSAGE @VA13026 00416760 NONMSG DS 0H @VA13026 00416840 STC R2,SAVEWRK1 AND STORE PARM FROM CALLER IN R2 @VA13026 00416920 N R2,F15 ENSURE USE OF ONLY THE LOW 4 BITS OF R2 00417000 STC R2,SAVEWRK1 AND STORE PARM FROM CALLER IN R2 00418000 USOJOIN SR R9,R9 R9=0 MEANS NO FREE STORAGE IN USE FOR MSG 00419000 ST R9,SAVEWRK4 CLEAR WORK AREA @VA04579 00419500 LA R0,8 LENGTH OF USERID @VA13441 00420000 LA R1,VMUSER POINT TO USERID @VA13441 00420100 CALL DMKSCNAU SEE IF VMBLOK STILL VALID @VA13441 00420200 BZ LOGOFF STILL THERE - LOG HIM OFF @VA13441 00420300 BM USO96 ALREADY GONE - EXIT @VA13441 00420400 LOGOFF DS 0H @VA13441 00420700 OI VMRSTAT,VMLOGOFF SIGNAL: IN LOGOFF PROCESS @VA13441 00420800 NI VMOSTAT,VMSYSOP+VMDISC+VMSHR SAVE ONLY THESE FL@V200820 00421000 LA R0,CPEXSIZE @V408246 00421010 CALL DMKFREE @V408246 00421060 USING CPEXBLOK,R1 @V408246 00421110 STM R0,R15,CPEXR0 @V408246 00421160 LA R0,USOSCH SCHEDULAR RETURN @V408246 00421210 ST R0,CPEXADD @V408246 00421260 CALL DMKSTKCP STACK CPEXBLOK @V408246 00421310 GOTO DMKDSPCH MAKE SURE LAST IN THE QUEUE @V408246 00421360 * 00421410 USOSCH DS 0H @V408246 00421460 CALL DMKSCHDL REMOVE FROM QUEUE @V408246 00421510 LA R4,VMDELAY POINT TO TRQBLOK HOLD FIELD @V200820 00422000 BAL R7,FRETRQB DEQUEUE AND FRET TRQBLOK @V200820 00423000 TM VMPERFLG,VMPERUSE "PER" TRACING ACTIVE? PER001 00424000 BZ USO04 NO -- @V200820 00425000 CALL DMKPERT RESET PER TRACING @V200820 00426000 USO04 EQU * CHECK FOR VIRTUAL TRACE @V200820 00428000 CLI VMTRCTL,X'00' TRACING VIA DMKTRC ? @V200820 00429000 BE USO05 NO -- @V200820 00430000 CALL DMKTRCND RESET VIRTUAL MACHINE TRACE @V200820 00431000 USO05 EQU * @V200820 00432000 L R4,=V(DMKSSSVM) ADDR OF THE DMKMSS VIRT MACH @V60B6B8 00432010 * NAME 00432020 LTR R4,R4 IS VCON EQUAL TO ZERO? @VA09319 00432022 BZ USO05A YES, INDICATES DMKSSS NOT IN SYS @VA09319 00432024 OC 0(8,R4),0(R4) IS MSS INIT ? @VA13088 00432026 BZ USO05A BRANCH, INDICATES MSS NOT INIT.@VA13088 00432028 CLC VMUSER,0(R4) IS HE LOGGING OFF @V60B6B8 00432030 BNE USO05A NO @V60B6B8 00432040 CALL DMKSSSUS GO PURGE MSS QUEUES, IF ANY @V60B6B8 00432050 NI PSAMSS,X'FF'-MSSPRES SET MSS FLAG OFF @V60B6B8 00432060 USO05A EQU * @V60B6B8 00432070 TM VMOSTAT,VMDISC IS THIS USER DISCONNECTED ? 00433000 BZ US009 NO, CONTINUE @VA09408 00434050 LH R8,VMVTERM YES, MAY BE CONSOLE SPOOLED @VA09408 00434100 LTR R8,R8 VIRTUAL CONSOLE AVAILABLE? @VA09408 00434150 BM DISCUSER NO, HE CAN'T HEAR US @VA09408 00434200 AL R8,VMDVSTRT YES, GET VDEVBLOK POINTER @VA09408 00434250 USING VDEVBLOK,R8 FOR ADDRESSABILITY @VA09408 00434300 TM VDEVFLAG,VDEVCSPL CONSOLE SPOOLING ACTIVE? @VA09408 00434350 BZ DISCUSER NO, GO TELL OPERATOR @VA09408 00434400 DROP R8 @VA09408 00434450 US009 EQU * @VA09408 00434500 TM VMRSTAT,VMLOGON IF THE USER WAS LOGGING ON, 00435000 BO USO11 DO NOT CALL THE ACCOUTNING ROUTINE 00436000 CALL DMKACOTM CALL ACCOUNTING ROUTINE FOR CONNECT MSG 00437000 USO11 LA R0,(LNR5+7)/8 GET ENOUGH FREE STORAGE FOR LONGEST MSG 00438000 CALL DMKFREE ... 00439000 LR R9,R1 REMEMBER THE ADDRESS IN R9 00440000 LA R1,NR2 POINT TO 'LOGOFF AT' MSG 00441000 LA R2,L'NR2-1 LENGTH - 1 IN R2 00442000 BAL R3,MSGSUBR FILL IN MSG TO BE SENT TO THE USER 00443000 SPACE 00444000 CALL DMKQCNWT SEND MESSAGE, WAIT FOR IT @V200820 00445000 TM VMOSTAT,VMDISC IS USER DISCONNECTED? @VA09408 00445020 BO DISCUSER YES, RDEVBLOK ALREADY CLEARED @VA09408 00445040 L R8,VMTERM GET TERM RDEVBLOK @VA04579 00445100 ST R8,SAVEWRK4 SAVE IT FOR LATER USE @VA04579 00445200 SR R15,R15 @VA04579 00445300 ST R15,VMTERM CLEAR VMTERM @VA04579 00445400 OI VMOSTAT,VMDISC SIGNAL USER NOW DISCONNECT @VA04579 00445500 SPACE 1 00445530 DISCUSER BAL R4,MSGOP GO TELL OPERATOR HE'S GONE @VA05738 00445560 SPACE 1 00445590 LA R0,CPEXSIZE WE'LL NEED ONE MORE CPEXBLOK @VA05738 00445620 CALL DMKFREE ASK FOR THE STORAGE @VA05738 00445650 USING CPEXBLOK,R1 TELL THE ASSEMBLER ABOUT IT @VA05738 00445680 STM R0,R15,CPEXR0 SAVE REGS FOR LATER @VA05738 00445710 LA R3,USOCONT THIS IS WHERE WE'LL CONTINUE @VA05738 00445740 ST R3,CPEXADD INSERT INTO THE BLOCK @VA05738 00445770 CALL DMKSTKCP ENSURE THAT EVERYONES DONE WITH @VA05738 00445800 * THIS USER BEFORE WE PURGE HIM. 00445830 GOTO DMKDSPCH @VA08501 00445910 EJECT 00446000 USOCONT DS 0H CONTINUE AFTER MSG TO USER (IF ANY) HAS BEEN GIVEN: 00447000 NI VMMLEVEL,255-(VMMSGON+VMWNGON) NO SPOOL MSGS@VM08714 00448000 OI VMQSTAT,VMINHMIG PREVENT MIGRATION @V408246 00449300 USO20A TM VMOSTAT,VMSHR WAS USER RUNNING A SHARED SYSTEM @V304735 00454000 BZ USO21 IF NOT - RESET THE VIRTUAL @V304735 00455000 * MACHINE 00456000 CL R11,LASTUSER WAS HE THE CURRENT RUNUSER @V304735 00457000 BNE USO21 NO - CONTINUE @V304735 00458000 CALL DMKVMASH CHECK IF ANY SHARED PAGES WERE @V304735 00459000 * CHANGED 00460000 SPACE 1 00464000 USO21 CL R11,LASTUSER WAS USER THE LAST ONE DISPATCHED @V304735 00465000 BNE *+10 NO - @V304735 00466000 MVC LASTUSER,ASYSVM OTHERWISE SWITCH TO SYSTEM @V304735 00467000 * VMBLOK 00468000 TM VMRSTAT,VMPGWAIT VIRTUAL MACHINE IN PAGE WAIT? @V408246 00468100 BO USOPRST YES, PRELIMINARY PAGE RESET @V408246 00468200 ICM R2,B'0011',VMNDCNT ANY OTHER PAGING ACTIVE? @V408246 00468300 BZ USO21A NO, CONTINUE @V408246 00468400 USOPRST DS 0H PRELIMINARY RESET OF VIRTUAL @V408246 00468500 * PAGES 00468600 CALL DMKPTRPW @VA08037 00468710 USO21A DS 0H @V408246 00468800 CALL DMKCFPRR RESET THE VIRTUAL MACHINE @V304735 00469000 TM VMRSTAT,VMLOGON VIRTUAL MACHINE LOGGING ON ? 00470000 BNO USO21C NO....BRANCH @VA13304 00471150 * ERROR WHEN USER LOGGING ON 00471300 TM VMSPMFLG,VMLOGON2 HAD THE LOGON GOTTEN VEDV ? @VA13304 00471450 BNO USO22 NO....BRANCH AROUND @VA13304 00471600 USO21C DS 0H @VA13304 00471750 SR R2,R2 TELL PAGE OUT TO CLEAR 00472000 CALL DMKPGSPO AND RESET USERS PAGES 00473000 * NOTE - ALSO CLEARS AN ADSTOP IF ANY THERE 00474000 LH R8,VMVTERM CHECK FOR VIRT CONSOLE @VA03351 00475000 LTR R8,R8 IS THERE A VIRT CONSOLE? @VA03351 00476000 BM USO22 NO, FORGET IT @VA03351 00477000 AL R8,VMDVSTRT GET VDEVBLOK ADDRESS @VA03351 00478000 USING VDEVBLOK,R8 @VA03351 00479000 CALL DMKSCNVD FIND VCUBLOCK AND VCHBLOCK @VA07859 00481000 BNZ USO22 FORGET IT @VA03351 00482000 USING VCHBLOK,R6 @VA03351 00483000 USING VCUBLOK,R7 @VA03351 00484000 * WE ARE NOW READY TO GET RID 00485000 * OF THE VIRTUAL CONS BLOKS 00486000 CALL DMKVDREL RESET AND RELEASE THE DEVICE @VA03351 00487000 L R2,FFS X'FFFFFFFF' @VA03351 00488000 STH R2,VCUDVTBL MARK DEVICE DETACHED @VA03351 00489000 STH R2,VDEVADD @VA03351 00490000 DROP R6,R7,R8 ADDRESSABILITY NO LONGER REQD @VA03351 00491000 USO22 EQU * 00492000 TM VMQLEVEL,VMAEXP FAVORED PERCENTAGE USER ? 00493000 BZ USO22N NO -- 00494000 L R2,=A(DMKSCHAU) GET ADDRESS OF VMBLOK POINTER 00495000 SLR R0,R0 CLEAR OUT 00496000 ST R0,0(,R2) VMBLOK POINTER 00497000 USO22N EQU * 00498000 TM VMRSTAT,VMLOGON ARE WE LOGGED ON @VM01168 00499000 BO USOA BR, IF NO - BYPASS ACCOUNTING @VM01168 00500000 CALL DMKACOFF CALL USER ACCOUNTING @VM01168 00501000 USOA EQU * @VM01168 00502000 TM VMPSTAT,VMV370R DO WE HAVE AN EXTENSION BLOCK? 00503000 BZ USO24 NO 00504000 CALL DMKVATBC RELEASE ALL SHADOW TABLES, IF ANY 00505000 L R2,VMECEXT EXTENSION BLOCK ADDRESS 00506000 USING ECBLOK,R2 00507000 LA R4,EXTCPTRQ CPU TIMER TRQBLOK @V200820 00508000 BAL R7,FRETRQS FRET TRQBLOK @V200820 00509000 LA R4,EXTCCTRQ CLOCK COMPARATOR TRQBLOK @V200820 00510000 BAL R7,FRETRQB RESET AND FRET THE BLOCK @V200820 00511000 LR R1,R2 GET BLOK TO FRET 00512000 DROP R2 ABANDON ADDRESSABILITY 00513000 LA R0,EXTSIZE AND 00514000 CALL DMKFRET 'FRET' THE CONTROL BLOCK ITSELF. 00515000 USO24 L R1,VMSEG POINT TO SEGMENT TABLE 00516000 LTR R1,R1 WE WOULD NORMALLY HAVE ONE 00517000 BZ USO27 IF WE DO NOT HAVE ONE DONOT RELEASE IT 00518000 ICM R0,B'0111',VMSWPMIG+1 PSUEDO MEMORY @V408246 00518010 BZ USO25 NO @V408246 00518060 L R1,VMSEG GET STO @V408246 00518110 L R4,0(,R1) SAVE FIRST STE @VA07591 00518170 STCM R0,B'0111',1(R1) REPLACE 1ST STE WITH PSUEDO @V408246 00518210 * MEMORY 00518260 MVI 0(R1),X'70' SIMULATE LENGTH OF 8 PAGES @V408246 00518310 SR R1,R1 ADDRESS OF 1ST PAGE TO RELEASE @V408246 00518360 L R2,=A(X'7000') ADDRESS OF LAST PAGE TO RELEASE @V408246 00518410 CALL DMKPGSPP DO PARTIAL PAGE RESET ON PSUEDO @V408246 00518460 * MEM. 00518510 L R1,VMSEG RELOAD STO @V408246 00518560 ST R4,0(,R1) RESTORE SAVED STE @VA07591 00518620 USO25 DS 0H @V408246 00518660 L R1,VMSIZE STORGE SIZE OF VM @V304635 00519000 SRL R1,12 RELEASE TOTAL VM TABLES @V304635 00520000 BCTR R1,R0 MINUS 1 PAGE. @V304635 00521000 CALL DMKBLDRL,PARM=DELPAGES+DELSEGS GET RIDE OF ALL. @V304635 00522000 ICM R1,B'0111',VMSWPMIG+1 PSUEDO MEMORY? @V408246 00522100 BZ USO26 NO @V408246 00522200 ICM R1,B'1000',=X'70' SIMULATE TABLE LENGTH OF 8 @V408246 00522300 CALL DMKBLDRL,PARM=PAGTONLY+DELPAGES @V408246 00522400 USO26 DS 0H @V408246 00522500 CL R11,RUNUSER DOES RUNUSER POINT TO US @VA02869 00523000 BNE USO27 NO--GO AHEAD @VA02869 00524000 L R2,ASYSVM ADDR OF SYSTEM VMBLOK @VA02869 00525000 ST R2,RUNUSER LET RUNUSER PT TO SYSTEM VMBLOK @VA02869 00526000 USO27 LM R6,R8,VMCHSTRT POINT TO CHANNEL, CONTROL UNIT DEV BLOKS 00527000 LA R0,VCHSIZE SIZE OF ONE CHANNEL BLOCK, 00528000 MH R0,VMCHCNT * NO. OF BLOCKS = NO. DBL-WORDS 00529000 LTR R1,R6 ADDRESS OF VCHBLOK INTO R1, 00530000 BZ USO28 IF NOTHING THERE, FORGET THE WHOLE THING. 00531000 CALL DMKFRET RETURN TABLE OF CHANNEL BLOCKS 00532000 LA R0,VCUSIZE SIZE OF ONE CONTROL UNIT BLOCK, 00533000 MH R0,VMCUCNT * NO. OF BLOCKS, 00534000 LR R1,R7 ADDRESS OF VCUBLOK TABLE, 00535000 CALL DMKFRET GIVE IT BACK; 00536000 LA R0,VDEVSIZE DITTO VDEVBLOK TABLE 00537000 MH R0,VMDVCNT ... 00538000 LR R1,R8 ... 00539000 CALL DMKFRET ... 00540000 USO28 EQU * CHANNEL, CONTROL UNIT, DEVBLOKS GONE ... 00541000 LA R4,VMTRQBLK TRQBLOK FOR REAL TIMER @V200820 00542000 BAL R7,FRETRQS FRET THE TRQBLOK IF IT'S THERE @V200820 00543000 L R1,VMMICRO GET ADDRESS OF MICBLOK @V201537 00544000 LA R1,0(R1) CLEAR ANY FLAG BITS @V201537 00545000 LTR R1,R1 IS THERE ONE? IE.,MICRO ASST ON? @V201537 00546000 BE USO30 BRANCH IF NOT @V201537 00547000 LA R0,MICSIZE GET MICBLOK SIZE @V201537 00548000 CALL DMKFRET RELEASE MICBLOK STORAGE @V201537 00549000 USO30 EQU * @V201537 00550000 TM VMPSTAT,VMRPAGE RESERVED PAGES ??? 00551000 BZ USO31 NOPE --- 00552000 L R1,=A(DMKPTRRL) ADDRESS OF THE PAGE LIMIT COUNT 00553000 L R2,=A(DMKPTRRU) ADDRESS OF THE VMBLOK POINTER 00554000 SR R0,R0 . . . 00555000 ST R0,0(,R1) CLEAR LIMIT 00556000 ST R0,0(,R2) CLEAR VMBLOK POINTER 00557000 USO31 L R2,VMPFUNC GET FUNC TABLE @V200730 00558000 LTR R2,R2 IS THERE ONE ?? @V200730 00559000 BZ USO80 NO, CONT @V200730 00560000 SR R0,R0 CLEAR SIZE REG 00561000 LA R3,24 TABLE ENTRY COUNT HRC029DK 00562490 USO33 L R1,4(R2) GET ENTRY BUFFER @V200730 00563000 LTR R1,R1 IS THER A FUNC ?? @V200730 00564000 BZ USO32 NO, LOOP FOR ALL @V200730 00565000 IC R0,1(R2) GET BUFFER SIZE @V200730 00566000 CALL DMKFRET FRET IT @V200730 00567000 USO32 LA R2,8(R2) POINT TO NEXT ENTRY @V200730 00568000 BCT R3,USO33 LOOP FOR 12 ENTRIES @V200730 00569000 L R1,VMPFUNC FUNC TABLE @V200730 00570000 LA R0,24 SIZE HRC029DK 00571490 CALL DMKFRET FRET IT @V200730 00572000 B USO80 CONT @V200730 00573000 EJECT 00574000 * NOW SEND MESSAGE TO SYSTEM OPERATOR (AS A RULE): 00575000 MSGOP L R10,ASYSOP GET THE OPERATOR'S VMBLOK @VA05738 00576100 CLR R10,R11 IS HE THE ONE LOGGING OFF ? @VA05738 00576200 BE OPOFF YES, DECREMENT NUMBER OF USERS @VA11749 00576300 TM VMRSTAT,VMLOGON NOT COMPLETELY LOGGED ON? @VA11389 00576320 BOR R4 YES, NO MESSAGE TO OPERATOR @VA11389 00576340 TM SAVEWRK1,NOOPMSG SHOULD WE SKIP THE OP MSG? @VM03066 00579000 BOR R4 YES, NO MESSAGE.. @VA05738 00580100 LTR R9,R9 DO WE HAVE ANY FREE STORAGE FOR A MSG ? 00581000 BNZ USO82 OK - GO. 00582000 LA R0,(LNR5+7)/8 GET STORAGE FOR LONGEST MSG 00583000 CALL DMKFREE ... 00584000 LR R9,R1 REMEMBER WHERE WE GOT IT 00585000 USO82 MVC 0(LMOP2345,R9),MOP2 MOVE COMPLETE MESSAGE TO STORAGE 00586000 L R8,SAVEWRK4 SAVED RDEVBLOK PTR @VA04579 00587500 LTR R8,R8 (HE SHOULD NORMALLY HAVE ONE) 00590000 BZ USO84 BUT LEAVE WELL ENOUGH ALONE IF NOT 00591000 CLI RDEVTYPC-RDEVBLOK(R8),CLASTERM A TERMINAL CLASS 00592000 BNE *+12 NO, CHECK FOR 370X 00593000 CLI RDEVTYPE-RDEVBLOK(R8),TYPBSC A BISYNC LINE 00594000 BE USORESID YES, GET RESOURCE ID. 00595000 LA R1,CLASSPEC*256+TYP3705 CLASS SPECIAL, TYPE 370@V200820 00596000 CH R1,RDEVTYPC-RDEVBLOK(,R8) WIERD TERMINAL ? @V200820 00597000 BNE USO83 NO - HANDLE EASILY@V200820 00598000 USORESID EQU * GET RESOURCE ID. 00599000 LH R1,VMTRMID TERMINAL IDENTIFICATION @V200820 00600000 CALL DMKCVTBH CONVERT TO EBCDIC @V200820 00601000 ST R1,4(0,R9) FOUR-CHARACTER I.D. @V200820 00602000 MVC 0(4,R9),=C'DEV ' MNEMONIC @V200820 00603000 B USO84 @V200820 00604000 * 00604100 USO83LDF EQU * HRC065DK 00604200 MVC 0(5,R9),=C'GRF L' Short name if LDEV HRC065DK 00604300 LH R1,RDEVADD-RDEVBLOK(,R8) Get the LDEV address HRC065DK 00604400 N R1,F4095 Keep only the dev num HRC065DK 00604500 CALL DMKCVTBH Make it displayable HRC065DK 00604600 STCM R1,7,5(R9) Put dev addr in message HRC065DK 00604700 B USO84 Continue normal process HRC065DK 00604800 USO83 EQU * @V200820 00605000 TM RDEVADD-RDEVBLOK(R8),RDEVLDEV Is this an LDEV? HRC065DK 00605100 BO USO83LDF Yes, special handling HRC065DK 00605200 CALL DMKSCNRD CONVERT TO CCU FORM, 00606000 CALL DMKCVTBH AND BINARY TO HEX, 00607000 STCM R1,7,5(R9) STORE TERMINAL DEVICE ADDRESS IN MSG 00608000 CALL DMKSCNRN GET DEVICE NAME @V200930 00609000 STCM R1,15,0(R9) PUT IN MESSAGE @V200930 00610000 USO84 MVC DMOP3(8,R9),VMUSER STORE USERID IN THE MSG, 00611000 OPOFF L R3,ASYSLC REFERENCE SYSLOCS INFORMATION @VA11749 00612000 USING SYSLOCS,R3 ... 00613000 L R1,DMKSYSNM PICK UP NO. OF USERS, 00614000 TM VMRSTAT,VMLOGON WAS THIS GUY 'NOT YET LOGGED ON' ? 00616000 BO USO85 YES 00617000 BCTR R1,0 LESS ONE (IN THE REGISTER ONLY) 00618000 ST R1,DMKSYSNM @VA09339 00618050 DROP R3 @VA09339 00618100 CLR R10,R11 OPERATOR LOGGING OFF ?? @VA11749 00618200 BER R4 YES, HE ALREADY KNOWS HE'S GONE @VA11749 00618300 USO85 CALL DMKCVTBD BINARY TO DECIMAL PLEASE, 00619000 STCM R1,7,DMOP4(R9) STORE IN MSG 00620000 LA R0,LMOP234 LENGTH OF MESSAGE, 00621000 TM SAVEWRK1,FORCE FORCED LOGOFF ? @V200820 00622000 BZ USO85A NOT THIS TIME. 00623000 LA R0,LMOP2345 IF YES, USE 'FORCED' INCLUDED IN MSG. 00624000 USO85A LR R1,R9 ADDRESS OF MESSAGE, 00625000 CALL DMKQCNWT,PARM=OPERATOR+NORET SEND MESSAGE TO OPERATOR 00626000 BR R4 RETURN TO MAIN LINE @VA05738 00626100 SPACE 1 00626200 USO80 EQU * CONTINUE @VA05738 00626300 USO86 EQU * CONTINUE ... 00627000 EJECT 00628000 AIF (NOT &TRACE(6)).NOTRA1 **AIF** 00629000 L R1,VMTREXT ANY TREXT BLOCK THERE ? 00630000 LTR R1,R1 ... 00631000 BZ USO88 NOPE - NO PROBLEM. 00632000 LA R0,TREXSIZE YES - GIVE IT BACK 00633000 CALL DMKFRET ... 00634000 .NOTRA1 ANOP 00635000 * NOW DELETE THIS USER FROM THE CHAIN OF USERS: 00636000 USO88 L R2,ASYSVM LET R2 START FROM THE SYSTEM VMBLOK 00637000 USO90 L R3,VMPNT-VMBLOK(,R2) LET R3 START WITH THE FIRST USER 00638000 L R7,VMPNT GET POINTER TO NEXT VMBLOK, 00639000 CLR R7,R11 DOES USER PERCHANCE POINT TO HIMSELF ? 00640000 BNE USO92 TRF IF NOT (ONLY HAPPENS IF ONE GUY LEFT) 00641000 SLR R4,R4 IF HE WAS THE LAST MAN ON EARTH, LET THE 00642000 B USO92A SYSVM HAVE A VMPNT=0 FOR NO USERS AT ALL 00643000 USO92 LR R4,R3 REMEMBER PREVIOUS BLOCK, 00644000 L R3,VMPNT-VMBLOK(,R3) GET PNTR TO NEXT BLOCK, 00645000 CLR R3,R11 IS IT US ? 00646000 BE USO92AA YES, PATCH OUT OF CHAIN @V408246 00647100 C R3,VMPNT-VMBLOK(,R2) COME FULL CIRCLE? @V408246 00647200 BNE USO92 NO @V408246 00647300 B USO92B YES, MUST BE ABORTIVE LOGON @V408246 00647400 USO92AA DS 0H @V408246 00647500 ST R7,VMPNT-VMBLOK(,R4) PATCH CHAIN TO LEAVE US OUT 00648000 USO92A ST R4,VMPNT-VMBLOK(,R2) STORE NEW ANCHOR FOR CHAIN IN SYSVM 00649000 USO92B DS 0H @V408246 00649100 TM VMRSTAT,VMLOGON WAS THIS GUY 'NOT YET LOGGED ON' ? 00650000 BO USO93 YES 00651000 TM VMPSTAT,VMACCOUN IS THE ACCOUNTING OPTION SET ? @VA00881 00658000 BZ USO93 NO, GO CHECK FOR OPERATOR @VA00881 00659000 ICM R1,15,VMACOUNT GET THE ADDRESS OF THE @VA00881 00660000 * ACCOUNTING BLOCK 00661000 BZ USO93 IF ZERO, GO CHECK FOR OPERATOR @VA00881 00662000 LA R0,ACCTLENG GET LENGTH OF BLOCK IN @VA00881 00663000 * DOUBLEWORDS 00664000 CALL DMKFRET RELEASE THE ACCOUNTING BLOCK @VA00881 00665000 USO93 EQU * 00666000 C R11,ASYSOP IS THIS THE OPERATOR'S VMBLOK ? 00667000 BNE USO94 NOT THIS TIME. 00668000 SPACE 00669000 * FOR OPERATOR'S VMBLOK, RESET IT INSTEAD OF RETURNING TO FREE STORAGE: 00670000 LM R2,R3,VMCOMND REMEMBER LAST COMMAND ('LOGOFF') 00671000 L R0,VMDFTPNT SAVE DEFER TASK POINTER @V4M0148 00671100 MVC VMBLOK(8),ZEROES CLEAR ENTIRE VMBLOK 00672000 MVC VMBLOK+8(256),VMBLOK ... 00673000 MVC VMBLOK+264(VMBSIZE*8-264),VMBLOK ... 00674000 MVC VMCHTBL(8),FFS FFFF-FILL THE VM CHANNEL TABLE 00675000 MVC VMCHTBL+8(24),VMCHTBL ... 00676000 STM R2,R3,VMCOMND RESTORE THE LAST COMMAND ('LOGOFF') 00677000 ST R0,VMDFTPNT RESTORE FOR LOGON. @V4M0148 00677100 MVC VMACNT,BLANKS BLANK OUT THE ACCOUNTING NUMBER 00678000 MVC VMUSER(8),BLANKS BLANK OUT THE USERID @VM08592 00679000 MVC VMVTERM(2),FFS NO VIRTUAL CONSOLE DEFINED @VM08592 00680000 MVI VMOSTAT,VMSYSOP IT'S STILL THE OPERATOR'S VMBLOK 00681000 MVI VMPSW+1,WAIT SET VMPSW = DISABLED WAIT STATE 00682000 B USO96 GO STORE NEW R11 AND THEN EXIT. 00683000 SPACE 00684000 USO94 L R1,VMDFTPNT LOAD DEFERRED TASK POINTER @V407594 00685000 LTR R1,R1 IS THERE ONE @V407594 00685100 BZ USO95 NO @V407594 00685200 LA R0,CPEXSIZE SIZE OF BLOCK @V407594 00685300 CALL DMKFRET RETURN TO FREE STORAGE @V407594 00685400 USO95 LA R4,VMDELAY GET POSSIBLE TRQBLOK POINTER @VA12770 00685502 BAL R7,FRETRQB RETURN IT IF IT'S THERE @VA12770 00685504 LR R1,R11 RESTORE VMBLOK POINTER @VA12770 00685506 C R11,STACKVM IS VMBLOK=STACKVM @VA08126 00685510 BNE USO95A NO-DONT CLEAR STACKVM @VA08126 00685520 MVC STACKVM,ZEROES CLEAR OUT STACKVM @VA08126 00685530 USO95A EQU * @VA08126 00685540 LA R0,VMBSIZE SIZE IN DBL-WORDS 00686000 MVI VMUSER-VMBLOK+7(R1),X'00' NULLIFY USERID @VA13441 00686500 CALL DMKFRET GIVE IT BACK TO FREE STORAGE. 00687000 * 00688000 USO96 L R11,ASYSVM IF NOT, POINT R11 TO SYSTEM VMBLOK, AND 00689000 CHARGE START CHARGE OVERHEAD TO SYSTEM @V407594 00691000 * 00692000 USO98 LTR R1,R9 DID WE HAVE A FREE STORAGE BUFFER ? 00693000 BZ USO99 NOPE - REALLY EXIT. 00694000 USO98A LA R0,(LNR5+7)/8 THIS WAS THE NO. DBL-WORDS WE USED 00695000 CALL DMKFRET GIVE IT BACK (WE DIDN'T FORGET) 00696000 USO99 EQU * ALMOST DONE ... @VA00881 00697000 CALL DMKUSOFM DO FREE STORAGE CLEAN UP @VA05738 00699100 TM SAVEWRK1,ELOGOFF+EFORCE FORCE/LOGOFF VIA CFM? @VA08501 00699250 BZ USO99X NO, NO COMMAND BUFFER TO FRET @VA08501 00699300 LA R0,BUFSIZE SIZE OF COMMAND BUFFER @VA08501 00699350 L R1,SAVER9 GET ITS ADDRESS FROM CFM @VA08501 00699400 CALL DMKFRET THROW IT AWAY @VA08501 00699450 SVC 16 ELIMINATE RETURN TO CFM @VA08501 00699500 LTR R13,R13 DID CFM HAVE A CALLER? @VA08501 00699550 BNZ USO99X YES, RETURN TO HIM @VA08501 00699600 GOTO DMKDSPCH NO, NEXT BATTER UP, PLEASE @VA08501 00699650 SPACE 1 00699700 USO99X DS 0H @VA08501 00699750 ST R11,SAVER11 PASS SYSTEM'S VMBLOK BACK @VA08501 00699800 EXIT @VA08501 00699850 SPACE 2 00701000 FRETRQB EQU * RESET AND FRET A TRQBLOK @V200820 00702000 L R1,0(0,R4) POINTER TO THE BLOCK @V200820 00703000 LTR R1,R1 IS THERE ONE ? @V200820 00704000 BCR 8,R7 NO -- RETURN @V200820 00705000 CLC TRQBFPNT-TRQBLOK(4,R1),ZEROES QUEUED ? @V200820 00706000 BE FRETRQC NO -- @V200820 00707000 CALL DMKSCHRT RESET TIMER REQUEST BLOCK @V200820 00708000 B FRETRQC @V200820 00709000 FRETRQS EQU * RETURN TRQBLOK TO FREE STORAGE @V200820 00710000 L R1,0(0,R4) PICK UP TRQBLOK ADDRESS @V200820 00711000 LTR R1,R1 MAKE SURE THERE IS ONE @V200820 00712000 BCR 8,R7 NOPE - JUST RETURN @V200820 00713000 FRETRQC EQU * @V200820 00714000 LA R0,TRQBSIZE SIZE IN DOUBLE-WORDS @V200820 00715000 CALL DMKFRET RETURN IT TO FREE STORAGE @V200820 00716000 SLR R0,R0 @V200820 00717000 ST R0,0(0,R4) CLEAR OUT THE HOLD FIELD @V200820 00718000 BR R7 RETURN @V200820 00719000 EJECT 00720000 *. 00721000 * SUBROUTINE NAME - 00722000 * 00723000 * DMKUSOFM - FREE STORAGE MAINTENANCE SUBROUTINE 00724000 * 00725000 * FUNCTION - 00726000 * 00727000 * TO "CLEAN UP" THE FREE STORAGE SUBPOOLS AND FREE STORAGE 00728000 * CHAIN INSOFAR AS PRACTICABLE, BY RETURNING SUBPOOLS 00729000 * TO THE FREE STORAGE CHAIN, AND BY REMOVING SPOOL FILE 00730000 * BLOCKS AND ALLOCATION BLOCKS FROM THE DYNAMIC PAGING 00731000 * AREA (INSOFAR AS FEASIBLE). 00732000 * 00733000 * ATTRIBUTES - 00734000 * 00735000 * REENTRANT, PAGEABLE 00736000 * 00737000 * ENTRY POINTS - 00738000 * 00739000 * DMKUSOFM - EXTERNALLY REFERENCED NAME - CALLED VIA SVC 00740000 * FREMSUBR - INTERNAL CODE - CALLED VIA BALR (FROM DMKUSOFF) 00741000 * 00742000 * ENTRY CONDITIONS - 00743000 * 00744000 * GPR 12 = ADDRESS OF ENTRY POINT 00745000 * GPR 13 = ADDRESS OF STANDARD SAVE AREA 00746000 * 00747000 * EXIT CONDITIONS - 00748000 * 00749000 * ALL GPR'S UNCHANGED 00750000 * 00751000 * CALLS TO OTHER ROUTINES - 00752000 * 00753000 * DMKFRERS - TO RETURN SUBPOOLS TO THE FREE STORAGE CHAIN 00754000 * DMKFREE - TO OBTAIN A NEW STORAGE BLOCK 00755000 * DMKFRET - TO RETURN AN OLD STORAGE BLOCK 00756000 * 00757000 * EXTERNAL REFERENCES - 00758000 * 00759000 * DMKFRENP = NPAGFREE & NPAGFRET 00760000 * DMKFRELO (&DMKFREHI) 00761000 * DMKSLC = END OF V=R AREA (IF GENERATED) 00762000 * DMKPGTP5 - ANCHOR FOR FIRST ALLOCATION CHAIN 00763000 * DMKVSPWA - ADDRESS OF 3211 INDEX WORK AREA (IF ANY) 00764000 * 00765000 * TABLES / WORK AREAS 00766000 * 00767000 * SAVEWRK1 = HOLDS RETURN REGISTER (R14) 00768000 * SAVEWRK2 = HOLDS "DMKFRELO" 00769000 * SAVEWRK3 = HOLDS "DMKFREHI" 00770000 EJECT 00771000 * REGISTER USAGE - 00772000 * 00773000 * GPR 0 - SIZE OF FREE STORAGE BLOCK 00774000 * GPR 1 - ADDRESS OF FREE STORAGE BLOCK 00775000 * GPR 4 - DMKFRELO MINUS LENGTH OF BLOCK 00776000 * GPR 6 - LINKING REGISTER 00777000 * GPR 12 - ADDRESSABILITY 00778000 * GPR 13 - ADDRESS OF STANDARD SAVE AREA 00779000 * GPR 14 - LINK REGISTER TO DMKFREE / DMKFRET 00780000 * 00781000 * GPR 11 IS NOT USED 00782000 * 00783000 * OTHER REGISTERS = WORK REGISTERS 00784000 * 00785000 * NOTES - 00786000 * 00787000 * THIS CODE WAS DEBUGGED IN THE CP NUCLEUS WITH STATISTICAL 00788000 * COUNTERS, WHICH INDICATED THE VARIOUS PATHS WERE SUCCESSFUL. 00789000 * (THE COUNTERS ARE NOT INCLUDED HEREIN - DMKUSO IS REENTRANT) 00790000 * 00791000 * OPERATION - 00792000 * 00793000 * 1. INVOKES CODE IN DMKFRE (DMKFRERS ENTRY POINT) 00794000 * TO RETURN ALL SUBPOOLS TO THE FREE STORAGE CHAIN. 00795000 * 00796000 * 2. IF NO FREE STORAGE AREAS ARE PRESENTLY IN USE IN THE 00797000 * DYNAMIC PAGING AREA, RETURNS FORTHWITH TO CALLER. 00798000 * 00799000 * 3. EXAMINES SPOOL FILE BLOCKS FOR READER, PRINTER, AND PUNCH; 00800000 * IF ANY INACTIVE BLOCK THEREIN IS IN THE DYNAMIC PAGING AREA, 00801000 * RELOCATES THE DATA TO A NEW FREE STORAGE BLOCK NOT WITHIN THE 00802000 * DYNAMIC PAGING AREA (IF FEASIBLE), AND PATCHES THE CHAIN. 00803000 * 00804000 * 4. PERFORMS SIMILAR LOGIC FOR ALLOCATION BLOCKS. 00805000 * 00806000 * 5. PERFORMS SIMILAR LOGIC FOR 3211 INDEX WORK AREA (IF ANY) 00807000 * 00808000 * 6. RETURNS TO CALLER. 00809000 *. 00810000 EJECT 00811000 * EXTERNALLY AVAILABLE ENTRY POINT TO TO INVOKE "FREMSUBR": 00812000 DMKUSOFM RELOC @VA00881 00813000 BAL R14,FREMSUBR "CALL" THE INTERNAL ROUTINE @VA00881 00814000 EXIT AND EXIT - THAT'S ALL, FOLKS. @VA00881 00815000 SPACE 00816000 EXTRN DMKFRENP "NPAGFREE" & "NPAGFRET" @VA00881 00817000 EXTRN DMKFREHI BEG. ADDRESS OF FIXED FREE SPACE @V3M4000 00817500 EXTRN DMKFRELO ADDRESS OF LOWEST PAGEABLE PAGE @V3M4000 00818000 EXTRN DMKPGTP5 POINT TO FIRST ALLOCATION CHAIN @VA00881 00819000 EXTRN DMKVSPWA ADDR OF 3211 INDEX WORK AREA @VA00881 00820000 EXTRN DMKSLC END OF V=R AREA (IF GENERATED) @VA00881 00821000 EXTRN DMKFRERS RETURNS SUBPOOLS TO FREE STORAGE @VA00881 00822000 EXTRN DMKLOCKQ,DMKLOCKD SERIALIZE WITH DMKCKS @V304298 00823000 SPACE 00824000 * INTERNAL ROUTINE (CALLED VIA R14) TO CLEAN UP FREE STORAGE BLOCKS: 00825000 FREMSUBR ST R14,SAVEWRK1 ENTER, SAVE RETURN REGISTER @VA00881 00826000 CALL DMKFRERS RETURN SUBPOOLS TO FREE STORAGE @VA00881 00827000 * CHAIN 00828000 L R15,=A(DMKFRENP) REFERENCE NPAGFREE & NPAGFRET @VA00881 00829000 L R0,0(,R15) NPAGFREE - NPAGFRET = NUMBER OF @VA00881 00830000 S R0,4(,R15) PAGES IN DYNAMIC PAGING AREA @VA00881 00831000 BNP FREMREX1 IF NOT > 0, JUST EXIT @V304298 00832000 LA R1,CKSLOCK SERIALIZE WITH DMKCKS @V304298 00833000 CALL DMKLOCKQ @V304298 00834000 L R15,=A(DMKFRELO) REFERENCE DMKFRELO @V3M4000 00834500 L R4,0(R15) DMKFRELO --> R4 @V3M4000 00835000 L R15,=A(DMKFREHI) REFERENCE DMKFREHI @V3M4000 00835500 L R5,0(R15) DMKFREHI --> R5 @V3M4000 00836000 STM R4,R5,SAVEWRK2 REMEMBER THESE IN SAVEWRK2/3 @VA00881 00837000 LA R0,SFBSIZE SET TO FIX UP SPOOL FILE BLOCKS @VA00881 00838000 LA R15,SFBSIZE*8 COMPUTE DMKFRELO - BLOCK LENGTH @VA00881 00839000 SR R4,R15 ... @VA00881 00840000 L R7,ARSPRD POINT TO SYSTEM READER FILE CHAIN@VA00881 00841000 LA R10,FREMRSP5 SET R10 SWITCH FOR SPOOL FILE @VA00881 00842000 LA R9,FREMR02 AND SET "ERROR-RETURN-VECTOR" @VA00881 00843000 BAL R6,FREMRSP1 FIX READER SPOOL FILE CHAIN IF @VA00881 00844000 * NEEDED 00845000 L R7,ARSPPR POINT TO SYSTEM PRINTER FILE @VA00881 00846000 * CHAIN 00847000 BAL R6,FREMRSP2 FIX PRINTER SPOOL FILE CHAIN @VA00881 00848000 L R7,ARSPPU AND THE SYSTEM PUNCH FILE CHAIN @VA00881 00849000 BAL R6,FREMRSP2 FIX IT TOO @VA00881 00850000 FREMR02 LR R1,R3 ADDR. OF "NEW" (UNUSED) SPOOL @VA00881 00851000 * FILE BLOCK 00852000 CALL DMKFRET GIVE BACK UNUSED SPOOL FILE BLOCK@VA00881 00853000 * NOW DO SIMILAR LOGIC FOR PAGING / SPOOLING ALLOCATION BLOCKS: 00854000 LA R0,RECSIZE NOW SET R0 TO FIX UP ALLOC BLOCKS@VA00881 00855000 L R4,SAVEWRK2 COMPUTE DMKFRELO MINUS BLOCK @VA00881 00856000 * LENGTH AGAIN 00857000 LA R15,RECSIZE*8 ... @VA00881 00858000 SR R4,R15 ... @VA00881 00859000 LA R10,FREMRSP6 SET R10 SWITCH FOR "ALLOC" BLOCKS@VA00881 00860000 LA R9,FREMR08 AND SET "ERROR-RETURN-VECTOR" @VA00881 00861000 L R5,=A(DMKPGTP5) POINT TO FIRST ALLOCATION CHAIN @VA00881 00862000 FREMR03 ICM R8,15,0(R5) ... @VA00881 00863000 BP FREMR04 IF PLUS - GET STARTED. @VA00881 00864000 LA R5,4(,R5) IF NOT, GET NEXT ONE. @VA00881 00865000 BZ FREMR03 SHOULD BE ZERO. @VA00881 00866000 B FREMREX VERY STRANGE IF MINUS. @VA00881 00867000 USING RDEVBLOK,R8 REFERENCE REAL DEVICE BLOCKS @VA00881 00868000 FREMR04 LA R7,RDEVPAGE POINT TO FIRST PAGING CHAIN @VA00881 00869000 BAL R6,FREMRSP1 START FIXING ALLOC BLOCKS @VA00881 00870000 B FREMR06 JOIN LOOP AT "THE RIGHT PLACE". @VA00881 00871000 SPACE 00872000 * LOOP TO "FIX UP" PAGING / SPOOLING ALLOCATION BLOCKS: 00873000 FREMR05 LA R7,RDEVPAGE POINT TO PAGING CHAIN @VA00881 00874000 BAL R6,FREMRSP2 FIX UP PAGING CHAIN @VA00881 00875000 FREMR06 LA R7,RDEVRECS POINT TO SPOOLING CHAIN @VA00881 00876000 BAL R6,FREMRSP2 FIX UP SPOOLING CHAIN @VA00881 00877000 L R8,RDEVPNT POINT TO NEXT RDEVBLOK @VA00881 00878000 CL R8,0(,R5) ARE WE BACK AT THE BEGINNING ? @VA00881 00879000 BNE FREMR05 ITERATE IF STILL SOME LEFT. @VA00881 00880000 FREMR07 LA R5,4(,R5) POINT TO "NEXT" ALLOCATION CHAIN @VA00881 00881000 L R8,0(,R5) ... @VA00881 00882000 LTR R8,R8 0 = NONE; MINUS = ALL FINISHED. @VA00881 00883000 BP FREMR05 PLUS = GO TO IT. @VA00881 00884000 BZ FREMR07 ZERO = GET NEXT ONE. @VA00881 00885000 DROP R8 MINUS = WE'RE ALL DONE... @VA00881 00886000 FREMR08 LR R1,R3 WHEN THRU, GET ADDR OF UNUSED @VA00881 00887000 * ALLOC BLOCK 00888000 CALL DMKFRET AND GIVE BACK UNUSED BLOCK @VA00881 00889000 * NOW DO SIMILAR LOGIC FOR 3211 INDEX WORK AREA BUFFER (IF ANY): 00890000 SLR R2,R2 R2 = 0 @VA00881 00891000 L R7,=A(DMKVSPWA) ADDR OF 3211 INDEX WORK AREA @VA00881 00892000 L R1,0(,R7) ADDR OF ACTUAL BUFFER (IF ANY) @VA00881 00893000 CL R1,SAVEWRK3 AT OR ABOVE DMKFREHI ? @VA00881 00894000 BNL FREMREX YES - OK - NOTHING TO DO. @VA00881 00895000 CLR R2,R1 MAYBE NONEXISTENT (ADDR = 0) ? @VA00881 00896000 BE FREMREX YES - OK - NOTHING TO DO. @VA00881 00897000 LA R0,184/8 SIZE OF BUFFER (23 DBL WORDS) @VA00881 00898000 L R4,SAVEWRK2 COMPUTE DMKFRELO MINUS @VA00881 00899000 LA R15,184 BLOCK LENGTH @VA00881 00900000 SR R4,R15 ... @VA00881 00901000 LA R10,FREMRSP8 SET R10 "SWITCH" @VA00881 00902000 LA R9,FREMR09 AND R9 ERROR-RETURN-VECTOR @VA00881 00903000 BAL R6,FREMRSP1 CALL MAGIC SUBROUTINE ONCE AGAIN @VA00881 00904000 FREMR09 LR R1,R3 ADDRESS OF UNUSED BLOCK TO R1 @VA00881 00905000 FREMR10 CALL DMKFRET GIVE BACK OLD OR NEW BLOCK @VA00881 00906000 FREMREX LA R1,CKSLOCK UNLOCK US BEFORE WE EXIT @V304298 00907000 CALL DMKLOCKD @V304298 00908000 FREMREX1 DS 0H @V408246 00909010 L R10,=A(DMKPAGSK) AVAILABLE PAGE I/O BLOCKS @V408246 00909060 PGSKL DS 0H @VA10137 00909139 ICM R1,B'1111',0(R10) 1ST ON THE CHAIN? @V408246 00909160 BNP FRMXIT NONE @V408246 00909210 MVC 0(4,R10),IOBMISC-IOBLOK(R1) UNCHAIN 1ST @V408246 00909260 LA R0,PAGESIZE BLOCK SIZE @V408246 00909310 CALL DMKFRET RETURN TO FREE STORAGE POOL @V408246 00909360 B PGSKL LOOK FOR MORE @V408246 00909410 FRMXIT DS 0H @V408246 00909460 L R14,SAVEWRK1 RESTORE R14 = RETURN-REG @V408246 00909510 BR R14 AND RETURN TO CALLER. @VA00881 00910000 EJECT 00911000 * FREMRSP1 (& FREMRSP2) = FIX UP SYSTEM READER, PRINTER, & PUNCH 00912000 * CHAINS OF SPOOL FILE BLOCKS (IF NEEDED & FEASIBLE) SO NO SPOOL FILE 00913000 * BLOCKS ARE IN THE DYNAMIC PAGING AREA. 00914000 * R0 = SIZE IN DOUBLE WORDS OF BLOCK 00915000 * R4 = DMKFRELO - BLOCK LENGTH 00916000 * R6 = RETURN-REGISTER 00917000 * R7 = ANCHOR FOR CHAIN 00918000 * R9 = "ERROR-RETURN VECTOR" = A(FREMR02) OR A(FREMR08) 00919000 * R10 = "SWITCH" = A(FREMRSP5) OR A(FREMRSP6) 00920000 SPACE 00921000 FREMRSP1 DS 0H GET A "NEW" SPOOL FILE BLOCK SO @VA00881 00922000 * WE HAVE IT 00923000 CALL DMKFREE (IN ADVANCE SO WE DON'T LOSE @VA00881 00924000 * CONTROL) 00925000 LR R3,R1 REMEMBER ITS ADDRESS IN R3 @VA00881 00926000 CL R3,SAVEWRK3 IS BLOCK AT OR ABOVE DMKFREHI ? @VA00881 00927000 BNL FREMRSP2 YES - OK FOR US TO USE IT. @VA00881 00928000 CLR R3,R4 NO, CHECK AGAINST DMKFRELO @VA00881 00929000 BCR 2,R9 IF > DMKFRELO, GIVE IT @VA00881 00930000 * BACK & GIVE UP. 00931000 AIF (NOT &VIRREAL).J7 **AIF** 00932000 CL R3,=A(DMKSLC) BEWARE OF BLOCK IN UNLOCKED V=R @VA00881 00933000 * AREA 00934000 BCR 4,R9 IF < DMKSLC, GIVE IT @VA00881 00935000 * BACK & GIVE UP. 00936000 .J7 ANOP NEW BLOCK OK TO USE - NOT IN DYNAMIC PAGING AREA: 00937000 FREMRSP2 LR R1,R7 START FROM ANCHOR FOR SPOOL @VA00881 00938000 * FILE CHAIN (OR EQUIVALENT) 00939000 CL R7,=A(DMKVSPWA) IS THIS 3211 INDEX WORK AREA ? @VA00881 00940000 BNE FREMRSP3 NOPE - REGULAR CHAIN HANDLING @VA00881 00941000 L R15,0(,R7) YES - GET ADDRESS OF REAL BUFFER @VA00881 00942000 ST R2,0(,R15) AND CLEAR 1ST WORD (R2 STILL 0) @VA00881 00943000 * TO HANDLE ONE AND ONLY ONE BLOCK BELOW 00944000 FREMRSP3 LR R2,R1 REMEMBER OLD POINTER @VA00881 00945000 L R1,0(,R1) GET POINTER TO "NEXT" BLOCK @VA00881 00946000 CL R1,SAVEWRK3 > DMKFREHI ? @VA00881 00947000 BNL FREMRSP3 YES (OK) - CHECK THE NEXT ONE @VA00881 00948000 LTR R1,R1 0 = END OF CHAIN ? @VA00881 00949000 BCR 8,R6 YES - EXIT TO MAIN @VA00881 00950000 * FREMR CODE. 00951000 CLR R1,R4 < DMKFRELO ? @VA00881 00952000 AIF (&VIRREAL).J7A **AIF** 00953000 BNH FREMRSP3 YES (OK) - CHECK THE NEXT ONE @VA00881 00954000 AGO .J7B 00955000 .J7A BH FREMRSP4 NOPE - GO RELOCATE IT. 00956000 CL R1,=A(DMKSLC) BEWARE OF BLOCK IN UNLOCKED V=R @VA00881 00957000 * AREA 00958000 BNL FREMRSP3 IF NOT BELOW "DMKSLC" IT'S OK @VA00881 00959000 * AS IS. 00960000 .J7B ANOP 00961000 FREMRSP4 BR R10 "SWITCH" - GO TO FREMRSP5 FOR @VA00881 00962000 * SPOOL FILE BLOCKS 00963000 * OR TO FREMRSP6 FOR ALLOC BLOCKS 00964000 * OR TO FREMRSP8 FOR 3211 INDEX WORK AREA 00965000 USING SFBLOK,R1 SPOOL FILE BLOCK IN DYNAMIC @VA00881 00966000 * PAGING AREA: 00967000 FREMRSP5 TM SFBFLAG,SFBINUSE IS THIS BLOCK ACTIVE ? @VA00881 00968000 BO FREMRSP3 YES - LEAVE WELL ENOUGH ALONE. @VA00881 00969000 DROP R1 @VA00881 00970000 MVC 0(SFBSIZE*8,R3),0(R1) NO - MOVE THE DATA @VA00881 00971000 B FREMRSP7 AND CONTINUE BELOW. @VA00881 00972000 FREMRSP6 MVC 0(RECSIZE*8,R3),0(R1) MOVE ALLOCATION BLOCK @VA00881 00973000 FREMRSP7 ST R3,0(,R2) PATCH THE CHAIN USING THE NEW @VA00881 00974000 * BLOCK 00975000 CALL DMKFRET RETURN THE OLD BLOCK @VA00881 00976000 B FREMRSP1 AND START ALL OVER AGAIN TO BE @VA00881 00977000 * SAFE. 00978000 SPACE 00979000 * OLD BLOCK WAS A 3211 INDEX WORK AREA: 00980000 FREMRSP8 ST R3,0(,R7) STORE ADDRESS OF NEW BLOCK @VA00881 00981000 B FREMR10 AND GO FRET THE OLD BLOCK @VA00881 00982000 * NOTE: NOT NECESSARY TO MOVE ANY DATA. 00983000 SPACE 2 00984000 CKSLOCK DC CL8'' LOCK FOR DMKCKS @V304298 00985000 EJECT 00986000 *. 00987000 * SUBROUTINE NAME - 00988000 * 00989000 * DMKUSODS - 'DISCONNECT' COMMAND 00990000 * 00991000 * FUNCTION - 00992000 * 00993000 * TO DISCONNECT A USER'S TERMINAL FROM HIS RUNNING VIRTUAL 00994000 * MACHINE, ALLOWING HIM TO CONTINUE TO RUN IN 'DISCONNECT' MODE. 00995000 * 00996000 * COMMAND LINE FORMAT - 00997000 * 00998000 * +------------+-----------------------------------------+ 00999000 * | | | 01000000 * | DISCONN | | 01001000 * | ---- | | 01002000 * +------------+-----------------------------------------+ 01003000 * 01004000 * SEE "NOTES" BELOW. 01005000 * 01006000 * ATTRIBUTES - 01007000 * 01008000 * REENTRANT, PAGEABLE, CALLED VIA SVC 01009000 * 01010000 * ENTRY POINT - 01011000 * 01012000 * DMKUSODS 01013000 * 01014000 * ENTRY CONDITIONS - 01015000 * 01016000 * GPR 2 = 0 01017000 * GPR 9 = ADDRESS OF 'DISCONNECT' COMMAND 01018000 * GPR 11 = ADDRESS OF CALLER'S VMBLOK 01019000 * GPR 12 = ADDRESS OF DMKUSODS 01020000 * GPR 13 = ADDRESS OF STANDARD SAVE AREA 01021000 * 01022000 * EXIT CONDITIONS - 01023000 * 01024000 * RETURNS TO THE CALLER IF AN ERROR IN THE COMMAND LINE 01025000 * 01026000 * UPON A SUCCESSFUL DISCONNECT, RETURNS TO CP370 TO 01027000 * CONTINUE TO RUN THE USER, BUT WITH HIS TERMINAL DISCONNECTED. 01028000 * 01029000 * CALLS TO OTHER ROUTINES - 01030000 * 01031000 * DMKSCNFD - TO SCAN COMMAND LINE 01032000 * DMKSCNRD - TO COMPUTE TERMINAL REAL DEVICE ADDRESS IN CCU FORM 01033000 * DMKCVTDT - TO GET DATE/TIME FOR DISCONNECT MESSAGE 01034000 * DMKCVTBH - TO GET NEEDED FIELD(S) IN PRINTABLE HEX FORM 01035000 * DMKCVTBD - TO GET NNN USERS IN PRINTABLE DECIMAL FORM 01036000 * DMKQCNWT - TO SEND DISCONNECT MSG TO USER & SYSTEM OPERATOR 01037000 * DMKERMSG - TO SEND ERROR MESSAGE TO CALLER IF NECESSARY 01038000 * DMKFREE - OBTAIN STORAGE FOR MESSAGES. 01039000 * DMKFRET - RETURN MESSAGE BUFFER TO FREE STORAGE. 01040000 EJECT 01041000 * EXTERNAL REFERENCES - 01042000 * 01043000 * DMKSYSVM - SYSTEM VMBLOK 01044000 * DMKSYSOP - OPERATOR'S VMBLOK 01045000 * 01046000 * TABLES / WORK AREAS - 01047000 * 01048000 * NONE 01049000 * 01050000 * REGISTER USAGE - 01051000 * 01052000 * GPR 9 = ADDRESS OF COMMAND BUFFER 01053000 * GPR 10 = ADDRESS OF VMBLOK OF USER TO BE DISCONNECTED 01054000 * GPR 11 = ADDRESS OF CALLER'S / USER'S VMBLOK 01055000 * GPR 12 = BASE REGISTER 01056000 * GPR 13 = ADDRESS OF STANDARD SAVE AREA 01057000 * 01058000 * GPRS 0-1, 3-8, AND 14-15 ARE WORK REGISTERS. 01059000 * 01060000 * NOTES - 01061000 * 01062000 * 1. THE 'HOLD' OPTION IS USED TO KEEP A 2701/2702/2703 LINE 01063000 * ENABLED AFTER THE DISCONNECT HAS BEEN PERFORMED. 01064000 * 01065000 * 2. IF THE USER IS NOT YET LOGGED ON, "DISCONN" IS TREATED 01066000 * EXACTLY THE SAME AS A "LOGOFF" COMMAND. 01067000 * 01068000 * OPERATION - 01069000 * 01070000 * 1. CHECKS COMMAND LINE FOR PRESENCE OF 'HOLD'. IF PRESENT, 01071000 * CALLS DMKQCNWT WITH THE 'HOLD' OPTION WHEN SENDING THE 01072000 * DISCONNECT MESSAGE TO THE USER. IF A FIELD WAS PRESENT 01073000 * BUT WAS NOT 'HOLD', GIVES ERROR MESSAGE AND RETURN TO 01074000 * THE CALLER. 01075000 * 01076000 * 2. OBTAINS DATE-TIME FROM DMKCVTDT, AND SENDS A FILLED-IN 01077000 * DISCONNECT MESSAGE TO THE USER VIA DMKQCNWT (WITH 'HOLD' 01078000 * OPTION IF 'DISCONNECT HOLD' WAS SPECIFIED), THEN TRANSFERS 01079000 * TO DMKDSPCH. 01080000 * 01081000 * 3. UPON COMPLETION OF THE MESSAGE (RETURN FROM DMKDSPCH), 01082000 * SENDS FILLED-IN MESSAGE TO THE SYSTEM OPERATOR THAT THE 01083000 * USER HAS BEEN DISCONNECTED. SETS APPROPRIATE BITS IN 01084000 * USER'S VMBLOK AND TERMINAL DEVICE BLOCKS TO INDICATE THAT 01085000 * HE IS DISCONNECTED (AND CANNOT RECEIVE ANY MESSAGES 01086000 * OR WARNINGS), AND EXITS INDICATING THAT THE VIRTUAL MACHINE 01087000 * CAN BE RUN, BUT THAT A READ SHOULD NOT BE PUT UP TO THE 01088000 * TERMINAL. 01089000 EJECT 01090000 * MESSAGES - 01091000 * 01092000 * NORMAL RESPONSES TO USER: 01093000 * 01094000 * 'DISCONNECT AT HH:MM:SS TID WEEKDAY MM/DD/YY' 01095000 * 01096000 * MESSAGES SENT TO SYSTEM OPERATOR: 01097000 * 01098000 * 'LINE XXX DSCONNECT USERID USERS = NNN' 01099000 * 01100000 * ERROR MESSAGES (DISCONNECT NOT ACCOMPLISHED): 01101000 * 01102000 * DMKUSO003E INVALID OPTION - XXXX 01103000 *. 01104000 EJECT 01105000 *********************************************************************** 01106000 * 01107000 * DMKUSODS - 'DISCONNECT' COMMAND 01108000 * 01109000 *********************************************************************** 01110000 SPACE 01111000 DMKUSODS RELOC 01112000 TM VMOSTAT,VMDISC IS USER ALREADY DISCONNECTED 01113000 BO USO99X YES, EXIT WITH HASTE @VA00881 01114000 TM VMRSTAT,VMLOGON USER NOT YET LOGGED ON ? 01115000 BO USO06 YES - TREAT SAME AS "LOGOFF". 01116000 MVI SAVEWRK1,EDISCON SIGNAL: DISCONNECT ENTERED. 01117000 BAL R8,USOSUB AND CALL SUBROUTINE TO CHECK COMMAND LINE 01118000 * COMMAND LINE WAS OK, PROCEED: 01119000 LA R0,(LNR5+7)/8 GET ENOUGH FREE STORAGE FOR LONGEST MSG 01120000 CALL DMKFREE ... 01121000 LR R9,R1 ADDRESS INTO R9 PLEASE 01122000 LA R1,NR1 POINT TO 'DISCONNECT AT' MSG 01123000 LA R2,L'NR1-1 LENGTH - 1 IN R2 01124000 BAL R3,MSGSUBR FILL IN MSG TO BE SENT TO THE USER 01125000 SPACE 01126000 CALL DMKQCNWT PARMS ARE ALREADY IN GR2 @VM01017 01127000 * 01128000 L R15,SAVERETN GET RETURN-ADDRESS, 01129000 LA R15,4(,R15) +4 = LET VM RUN, DON'T POST READ. 01130000 ST R15,SAVERETN STORE CORRECTED RETURN-ADDRESS 01131000 L R8,VMTERM POINT R8 TO TERMINAL RDEVBLOK 01132000 SR R15,R15 CLEAR 'VMTERM' SLOT IN VMBLOK 01133000 ST R15,VMTERM ... 01134000 OI VMOSTAT,VMDISC SIGNAL USER NOW DISCONNECTED 01135000 LTR R8,R8 DISCONNECTED DURING QCN CALL? @VA02771 01136000 BZ DISCEXIT NO TERM --DONT SEND OPERATOR MSG @VA02771 01137000 * SEND MESSAGE TO SYSTEM OPERATOR RE DISCONNECTED USERID: 01138000 MVC 0(L'MOP1,R9),MOP1 1ST SKELETON TO MSG BUFFER 01139000 CLI RDEVTYPC-RDEVBLOK(R8),CLASGRAF 3277/3077 @VM08872 01140000 BNE *+10 NO - @VM08872 01141000 MVC 0(4,R9),=C'GRAF' CHANGE 'LINE' TO 'GRAF' @VM08872 01142000 MVC DMOP3(L'MOP3,R9),MOP3 2ND SKELETON TO MSG BUFFER 01143000 MVC DMOP3(8,R9),VMUSER PUT IN THE USERID 01144000 CLI RDEVTYPC-RDEVBLOK(R8),CLASTERM A TERMINAL CLASS 01145000 BNE *+12 NO, CHECK FOR 370X 01146000 CLI RDEVTYPE-RDEVBLOK(R8),TYPBSC A BISYNC LINE 01147000 BE USORESD YES, GET RESOURCE ID. 01148000 LA R1,CLASSPEC*256+TYP3705 3705 DESCRIPTION @V200820 01149000 CH R1,RDEVTYPC-RDEVBLOK(,R8) TERMINAL ON A 3705@V200820 01150000 BNE DISCTERM NO - THAT'S SIMPLE@V200820 01151000 USORESD EQU * GET RESOURCE ID. 01152000 LH R1,VMTRMID TERMINAL IDENTIFICATION @V200820 01153000 CALL DMKCVTBH CONVERT TO EBCDIC @V200820 01154000 ST R1,4(0,R9) SET IN MESSAGE @V200820 01155000 MVC 0(4,R9),=C'DEV ' MNEMONIC @V200820 01156000 B DISCMSG GO SEND MESSAGE TO OPERATOR @V200820 01157000 SPACE 2 01158000 DISCTERM EQU * @V200820 01159000 TM RDEVADD-RDEVBLOK(R8),RDEVLDEV Is this an LDEV? HRC065DK 01159100 BZ DISCNLDF No, its GRAF HRC065DK 01159150 MVC 0(5,R9),=C'GRF L' Short name if LDEV 01159200 LH R1,RDEVADD-RDEVBLOK(,R8) Get the LDEV address HRC065DK 01159250 N R1,F4095 Keep only the dev num HRC065DK 01159300 CALL DMKCVTBH Make it displayable HRC065DK 01159350 STCM R1,7,5(R9) Put dev addr in message HRC065DK 01159400 B DISCMSG Go display msg HRC065DK 01159450 * 01159500 DISCNLDF EQU * Here if not LDEV HRC065DK 01159550 CALL DMKSCNRD GET 'CCU' ADDRESS @V200820 01160000 CALL DMKCVTBH CONVERT THAT TO EBCDIC @V200820 01161000 STCM R1,B'0111',5(R9) @V200820 01162000 DISCMSG EQU * @V200820 01163000 L R15,ASYSLC REFERENCE SYSLOCS INFO 01164000 USING SYSLOCS,R15 ... 01165000 L R1,DMKSYSNM GET NUMBER OF USERS 01166000 DROP R15 01167000 CALL DMKCVTBD BINARY TO DECIMAL PLEASE 01168000 STCM R1,7,DMOP4(R9) AND STORE IN THE MESSAGE 01169000 LA R0,LMOP234 LENGTH OF MESSAGE 01170000 LR R1,R9 ADDRESS, AND ... 01171000 CALL DMKQCNWT,PARM=OPERATOR+NORET SEND MESSAGE TO OPERATOR 01172000 DISCEXIT LR R1,R9 ADDRESS OF MSG BUFFER 01173000 LA R0,(LNR5+7)/8 LENGTH OF MESSAGE BLOCK @VA00881 01174000 CALL DMKFRET GIVE IT BACK @VA00881 01175000 B USO99X AND GO EXIT WITHOUT FURTHER ADO. @VA00881 01176000 EJECT 01177000 * SUBROUTINE TO ANAYLZE THE COMMAND LINE 01178000 * (CALLED BY 'LOGOFF' AND 'DISCONNECT') 01179000 * R8 = RETURN-REGISTER 01180000 * R9 POINTS TO USUAL COMMAND BUFFER 01181000 * DMKSCNFD USED TO PICK UP ARGUMENTS IN THE USUAL WAY. 01182000 * 01183000 USOSUB DS 0H CHECK FOR POSSIBLE 'HOLD' OPTION: 01184000 CALL DMKSCNFD ANY ADDITIONAL FIELDS AT ALL ? 01185000 BCR 7,R8 NOPE - PROCEED WITH LOGOUT OR DISCONNECT. 01186000 LR R15,R0 SAVE BYTE COUNT 01187000 BCTR R15,0 LESS ONE FOR EXECUTED COMPARE 01188000 EX R15,CKHOLD IS IT HOLD ?? 01189000 BNE ERROR3 NOT EVEN CLOSE 01190000 LA R15,1 MINIMUM ABBREVIATION IS 'HO' 01191000 EX R15,CKHOLD CHECK FOR AT LEAST THAT .. 01192000 BNE ERROR3 CLOSE, BUT NO CIGAR 01193000 OI VMSVSTAT,VMLGHOLD SET FLAG BIT IF IT WAS 'HOLD' @VA13025 01194100 BR R8 AND EXIT. 01195000 SPACE 2 01196000 CKHOLD CLC HOLD(*-*),0(R1) EXECUTED FOR OPTION TEST 01197000 SPACE 01198000 HOLD DC CL6'HOLD' VALID OPTION .. 01199000 EJECT 01200000 * MSGSUBR = SUBROUTINE TO CONSTRUCT RESPONSE TO BE SENT TO USER: 01201000 * AT ENTRY: 01202000 * R1 = ADDRESS OF INITIAL CHUNK OF MESSAGE 01203000 * R2 = LENGTH (MINUS 1) OF INITIAL CHUNK OF MESSAGE 01204000 * R3 = RETURN-REGISTER 01205000 * R9 = ADDRESS OF MESSAGE BUFFER (LNR5 BYTES LONG) 01206000 * SAVEWRK1 FLAG HAS ADDITIONAL NEEDED INFO 01207000 * AT EXIT: 01208000 * R0 = BYTE-COUNT OF FINISHED MESSAGE 01209000 * R1 = R9 = ADDRESS OF FINISHED MESSAGE 01210000 * R2 = 'PRIORITY+LOGDROP' OR 'PRIORITY+LOGHOLD' FOR DMKQCNWT 01211000 * 01212000 MSGSUBR MVC 0(8,R9),BLANKS BLANK-FILL THE MSG BUFFER 01213000 MVC 8(LNR5-8,R9),0(R9) ... 01214000 EX R2,MVCHUNK MOVE THE FIRST CHUNK TO MSG BUFFER 01215000 LA R2,1(R9,R2) POINT TO WHERE THE TIME WILL GO 01216000 L R15,=A(DMKSYSTI) GET ADDR OF TIME ZONE IDENTIFIER 01217000 MVC 9(3,R2),0(R15) MOVE TO THE MESSAGE 01218000 LA R1,13(,R2) POINT TO WHERE THE WEEKDAY WILL GO 01219000 L R14,ASYSLC REFERENCE SYSLOCS INFO 01220000 USING SYSLOCS,R14 ... 01221000 SLR R15,R15 GET NUMBER OF BYTES (LESS 1) IN WEEKDAY 01222000 IC R15,DMKSYSDW+1 ... 01223000 LA R14,DMKSYSDW+2 POINT AT THE WEEKDAY 01224000 DROP R14 01225000 EX R15,MVCWKDAY MOVE TO OUR MESSAGE BUFFER 01226000 LA R1,2(R1,R15) NOW POINT TO WHERE TO PUT THE DATE 01227000 CALL DMKCVTDT MOVE DATE AND TIME TO THE RIGHT PLACES 01228000 TM SAVEWRK1,EFORCE+FORCE FORCED LOGOFF ? @V200820 01229000 BZ MSGSUBR8 NOPE - NOTHING TO ADD. 01230000 MVC 9(L'NR5,R1),NR5 ADD 'BY SYSTEM' 01231000 MSGSUBR8 LR R1,R9 R1 = R9 = ADDRESS OF MESSAGE 01232000 LA R0,LNR5 SET R0 FOR LENGTH OF WORST CASE MESSAGE 01233000 LA R15,LNR5-1(,R1) POINT TO LAST BYTE OF MESSAGE 01234000 LA R2,PRIORITY+LOGDROP SET TENTATIVE PARM FOR DMKQCNWT 01235000 TM VMSVSTAT,VMLGHOLD DID CALLER WANT 'HOLD' ? @VA13025 01236100 BCR 8,R3 NOPE - GR2 HAS THE RIGHT PAR@V200820 01237000 LA R2,PRIORITY+LOGHOLD YES - SET HOLD OPTION INSTEAD. 01238000 BR R3 RETURN @V200820 01239000 SPACE 01240000 MVCHUNK MVC 0(*-*,R9),0(R1) TO MOVE INITIAL CHUNK TO MSG BUFFER 01241000 MVCWKDAY MVC 0(*-*,R1),0(R14) TO MOVE WEEKDAY TO MSG BUFFER 01242000 EJECT 01243000 ERROR3 LA R2,3 ERROR 3 = INVALID OPTION 01244000 B ERRJOIN ... 01245000 SPACE 01246000 ERROR20 LA R2,20 ERROR 20 = USERID MISSING OR INVALID 01247000 SLR R1,R1 NO DATA PASSED TO ERROR HANDLER 01248000 B ERRJOIN ... 01249000 SPACE 01250000 ERROR45 LA R2,45 ERROR 45 = USERID NOT LOGGED ON 01251000 LM R0,R1,SAVEWRK2 RECOVER R0/R1 (LOST BY CALL TO DMKSCNAU) 01252000 * 01253000 ERRJOIN ICM R0,B'1110',DMKUSO+3 IDENTIFIER INTO R0 HIGH 3 BYTES 01254000 CALL DMKERMSG CALL ERROR MESSAGE HANDLER 01255000 * 01256000 * NOTE: DMKERMSG STORES R2 ERROR-CODE FOR 01257000 * MY CALLER, AND RETURNS TO MY CALLER. 01258000 SPACE 1 01259000 LTORG 01260000 SPACE 2 01261000 * VARIOUS MESSAGES, RESPONSES, AND SKELETONS FOR SAME: 01262000 * 01263000 * NORMAL RESPONSES: 01264000 *** 'CONNECT= HH:MM:SS VIRTCPU= MMM:SS.00 TOTCPU= MMM:SS.00' 01265000 NR1 DC C'DISCONNECT AT ' 01266000 NR2 DC C'LOGOFF AT ' 01267000 * DS C'HH:MM:SS ' TIME 01268000 * DS C'TID ' TIME ZONE = 'EST' OR 'EDT' ETC. 01269000 * DS C'WEEKDAY ' E.G. WEDNESDAY (WORST CASE) 01270000 * DS C'DD/MM/YY' DATE 01271000 NR5 DC C'BY SYSTEM' @V200820 01272000 SPACE 01273000 * LONGEST POSSIBLE MESSAGE ISSUED BY LOGOFF/FORCE/DISCONNECT: 01274000 * 'LOGOFF AT HH:MM:SS EST WEDNESDAY MM/DD/YY BY SYSTEM' 01275000 LNR5 EQU 52 LENGTH OF ABOVE WORST-CASE MSG @V200820 01276000 SPACE 01277000 * MESSAGES SENT TO SYSTEM OPERATOR: 01278000 MOP1 DC C'LINE XXX DSCONNECT ' NOTE: 8-BYTE USERID ADDED. 01279000 MOP2 DC C'USER DSC LOGOFF AS ' @V200930 01280000 MOP3 DC C'USERID USERS = ' 01281000 MOP4 DC C'NNN' 01282000 LMOP234 EQU *-MOP2 (LENGTH) 01283000 MOP5 DC C' FORCED' ADDED FOR FORCED LOGOUT CASES 01284000 LMOP2345 EQU *-MOP2 (LENGTH) 01285000 DMOP3 EQU MOP3-MOP2 DISP. OF USERID FROM BEGINNING OF MSG 01286000 DMOP4 EQU MOP4-MOP2 DISP. OF NNN FROM BEGINNING OF MSG 01287000 EJECT 01288000 COPY CORE 01289000 COPY SAVE 01290000 * FLAG-BITS USED IN SAVEWRK1: 01291000 * 01292000 ELOGOFF EQU X'80' LOGOFF ENTRY 01293000 EDISCON EQU X'40' DISCONNECT ENTRY 01294000 EFORCE EQU X'20' FORCE ENTRY 01295000 FORCE EQU X'02' FORCED LOGOFF BY THE SYSTEM @V200820 01297000 NOOPMSG EQU X'01' SKIP MESSAGE TO OPERATOR @VM03066 01298000 EJECT 01299000 COPY EQU 01300000 COPY VMBLOK 01301000 COPY TREXT 01302000 COPY ACCOUNT @VA00881 01303000 COPY RBLOKS 01304000 COPY IOBLOKS @V408246 01304100 IOBLOK DSECT CONTINUE THE DSECT @V408246 01304200 ORG , LOCATE END OF BLOCK @V408246 01304300 * ANY CHANGES IN PAGESIZE MUST ALSO BE REFLECTED 01304325 * IN DMKPAG AND DMKMON 01304375 * FOLLOWING SIZE MUST CORRESPOND WITH DMKPAG 01304400 DS 7D SIZE OF PAGE EXTENDED I/O BLOCK @V408246 01304500 PAGESIZE EQU (*-IOBLOK)/8 SIZE OF EXTENDED BLOCK @V408246 01304600 COPY SPOOL @VA00881 01305000 COPY ALLOC @VA00881 01306000 COPY VBLOKS 01307000 COPY TIMER 01308000 COPY DEVTYPES 01309000 PSA 01310000 SYSLOCS 01311000 COPY MICBLOK 01312000 COPY CONBUF @VA08501 01312100 END DMKUSO 01313000