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 | <HOLD> | 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 <FORCED>' 00403000
* OR 00404000
* 'LINE DSC LOGOFF AS USERID USERS = NNN <FORCED>' 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 <BH> 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 <BL> 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 <BZ> 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'<SPLCHK>' 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 | <HOLD> | 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