CSQ TITLE 'DMKCSQ (CP) VM/370 - RELEASE 6' 00001000 ISEQ 73,80 VALIDATE SEQUENCING OF INPUT 00002000 *. 00003000 * MODULE NAME - 00004000 * 00005000 * DMKCSQ 00006000 * 00007000 * FUNCTION - 00008000 * 00009000 * DMKCSQ CONTAINS THE SPOOLING COMMAND FUNCTIONS AVAILABLE TO 00010000 * TO CLASS G USERS. SOME OF THE COMMANDS ARE ALSO PROCESSED 00011000 * FOR CLASS D USERS IN A SLIGHTLY DIFFERENT FORMAT 00012000 * 00013000 * ATTRIBUTES - 00014000 * 00015000 * REENTRANT, PAGEABLE, CALLED VIA SVC 00016000 * 00017000 * ENTRY POINTS - 00018000 * 00019000 * DMKCSQCL - CLOSE COMMAND 00020000 * DMKCSQHL - HOLD COMMAND 00021000 * DMKCSQFR - FREE COMMAND 00022000 * 00023000 * ENTRY CONDITIONS - 00024000 * 00025000 * GPR9 = ADDRESS OF THE COMMAND LINE BUFFER; MUST BE PRESERVED 00026000 * FOR CALLS TO DMKSCNFD 00027000 * GPR12 = ADDRESS OF ENTRY POINT 00028000 * GPR13 = ADDRESS OF SAVEAREA 00029000 * 00030000 * EXIT CONDITIONS - 00031000 * 00032000 * NORMAL - 00033000 * GPR2 = 0 00034000 * 00035000 * ERROR - 00036000 * 00037000 * GPR2 = CONTAINS THE BINARY MESSAGE NUMBER 00038000 * - EITHER AN OPTION IS ILLEGAL OR SOME CONDITION 00039000 * EXISTS THAT MAKES IT IMPOSSIBLE TO EXECUTE THE COMMAND 00040000 * A MESSAGE IS TYPED TO DESCRIBE THE ERROR; THE ERROR 00041000 * MESSAGES THAT MAY OCCUR ARE LISTED WITH EACH COMMAND 00042000 EJECT 00043000 * 00044000 * CALLS TO OTHER ROUTINES - 00045000 * 00046000 * DMKFREE - TO OBTAIN A BLOCK FROM FREE STORAGE 00047000 * DMKFRET - TO RETURN STORAGE 00048000 * DMKUDRFU - TO VERIFY A 'USERID' 00049000 * DMKCSOSD - TO START RDR, PRINTER OR PUNCH 00050000 * DMKSTKIO - TO STACK AN IOBLOK 00051000 * DMKSCNVU - LOCATE A VDEVBLOK 00052000 * DMKUDRRV - TO CLOSE THE DIRECTORY 00053000 * DMKSCNFD - SCAN THE COMMAND LINE BUFFER FOR OPTIONS 00054000 * DMKQCNWT - WRITE RESPONSE AND ERROR MESSAGES 00055000 * DMKVSPCO - CLOSE (AND OPTIONALLY PURGE) OUTPUT SPOOL FILES 00056000 * DMKVSPCR - CLOSE READER FILES 00057000 * DMKSPLDL - DELETE PURGED FILES FROM THE SYSTEM 00058000 * DMKCVTHB - CONVERT HEX ADDRESS OPTIONS TO BINARY 00059000 * DMKCVTDB - CONVERT DECIMAL SPOOLID NUMBERS TO BINARY 00060000 * DMKERMSG - WRITE ERROR MESSAGES 00061000 * DMKCKSPL - CHECKPOINT THE BLOCKS 00062000 * EXTERNAL REFERENCES - 00063000 * 00064000 * DMKRSPHQ - SPOOL HOLD QUEUE CHAIN ANCHOR 00065000 * DMKRSPRD - (ARSPRD) READER FILE CHAIN ANCHOR 00066000 * DMKRSPPR - (ARSPPR) PRINTER FILE CHAIN ANCHOR 00067000 * DMKRSPPU - (ARSPPU) PUNCH FILE CHAIN ANCHOR 00068000 * DMKRSPID - SYSTEM SPOOL ID COUNTER 00069000 * DMKRSPDL - SPOOL DELETE CHAIN ANCHOR 00070000 * DMKVIOIN - IOBIRA ADDRESS FOR IOBLOK 00071000 * 00072000 * TABLES / WORKAREAS - 00073000 * 00074000 * IOBLOK 00075000 * 00076000 * VDEVBLOK, VSPXBLOK, AND SFBLOKS ARE UPDATED OR DELETED 00077000 * 00078000 * THE SAVEWRK FIELDS IN THE STANDARD SAVEAREA ARE USED BY THE 00079000 * OPTION PROCESSING SUBROUTINES FOR THE FOLLOWING VALUES - 00080000 * 00081000 * SAVEWRK1 - FILE OUTPUT CLASS (1 BYTE) 00082000 * SAVEWRK1+1 - NUMBER OF COPIES (1 BYTE) 00083000 * SAVEWRK1+2 - SPOOLID NUMBER (HALF-WORD) 00084000 * SAVEWRK2,3 - USERID OF FILE'S OWNER 00085000 * SAVEWRK4 - ADDRESS OF FNAME FTYPE (24 BYTES) 00086000 * SAVEWRK5 - USE VARIES WITH COMMAND 00087000 * SAVEWRK6,7 - SAVE AREA FOR R0,R1 SCAN OPTIONS 00088000 * SAVEWRK8,9 - USE VARIES WITH COMMAND 00089000 * 00090000 * REGISTER USAGE - 00091000 * 00092000 * ALL SUBROUTINES IN THE MODULE CONFORM GENERALLY TO THIS USAGE; 00093000 * ANY INDIVIDUAL DEVIATIONS OR EXTENSIONS ARE LISTED WITH THE 00094000 * COMMAND DESCRIPTION 00095000 * 00096000 * GPR0 = LENGTH OF OPTION - RETURNED FROM DMKSCNFD 00097000 * GPR1 = ADDRESS OF OPTION - RETURNED FROM DMKSCNFD 00098000 * GPR2 = SCRATCH 00099000 * GPR3 = INTERNAL LINKAGE - 2ND LEVEL 00100000 * GPR4 = INTERNAL LINKAGE - 1ST LEVEL 00101000 * GPR5 = DEVICE TYPE FLAGS - LOGICAL SUM OF TYPES 00102000 * GPR6 = POINTER TO PREVIOUS SFBLOK ON CHAIN 00103000 * GPR7 = SFBLOK BASE 00104000 * GPR8 = VDEVBLOK BASE 00105000 * GPR9 = INPUT COMMAND LINE ADDRESS 00106000 * GPR10 = REMAINING DEVICE COUNT AND IOBLOK ADDRESS 00107000 * GPR11 = VMBLOK BASE 00108000 * GPR12 = DMKCSQ BASE 00109000 * GPR13 = SAVEAREA BASE 00110000 * GPR14 = EXTERNAL LINKAGE 00111000 * GPR15 = EXTERNAL LINKAGE 00112000 * 00113000 * NOTES - 00114000 * 00115000 * NONE 00116000 * 00117000 * OPERATION - 00118000 * 00119000 * EACH COMMAND PROCESSOR IS ENTERED VIA A CALL FROM DMKCFM. THE 00120000 * PROCESSING LOGIC IS EMBODIED IN A SERIES OF INTERNAL CALLS TO 00121000 * A SET OF OPTION PROCESSORS AND LIST SCANNERS. IN GENERAL, 00122000 * THE OPTION PROCESSORS ARE CALLED WHEN IT IS KNOWN, EITHER BY 00123000 * POSITION OR KEYWORD, WHAT TYPE OF OPERAND MUST APPEAR NEXT ON 00124000 * THE COMMAND LINE. THE OPTION PROCESSORS SCAN FOR THE NEXT 00125000 * FIELD, VERIFY ITS VALIDITY, AND SET UP INFORMATION FOR USE BY 00126000 * THE LIST SCANNERS. SINCE THE OPERATIONAL DESCRIPTION OF EACH 00127000 * OF EACH COMMAND PROCESSOR REFERENCES THESE SUBROUTINES, A LIST 00128000 * OF THEIR NAMES AND FUNCTIONS IS GIVEN HERE; A DESCRIPTION OF 00129000 * THE OPERATIONAL LOGIC AND REGISTER SETS FOR EACH SUBROUTINE 00130000 * APPEAR AT THE END OF THE MODULE 00131000 * 00132000 * OPTION PROCESSORS - 00133000 * 1. GETUSER - SAVE THE USER ID OF THE FILE'S OWNER 00134000 * 2. GETYPE - SAVE THE FILE TYPE (OR DEVICE TYPE) 00135000 * 3. GETCOPY - LOCATE AND SAVE THE NUMBER OF COPIES REQUESTED 00136000 * 4. GETNAME - LOCATE AND SAVE THE FILE NAME (AND TYPE) 00137000 * 5. GETCLASS - LOCATE AND VERIFY THE CLASS REQUESTED (2ND LEVEL 00138000 * ROUTINE) 00139000 * 00140000 * LIST SCANNING ROUTINES - 00141000 * 1. GETDEVIC - LOCATE THE NEXT VDEVBLOK OF THE APPROPRIATE 00142000 * ADDRESS, CLASS AND TYPE (2ND LEVEL ROUTINE) 00143000 * 2. GETFILE - LOCATE THE NEXT FILE OF THE CORRECT CLASS, ID, 00144000 * AND OWNER 00145000 * 3. GETCHAIN - LOCATE THE NEXT FILE CHAIN TO SEARCH (2ND 00146000 * LEVEL ROUTINE) 00147000 * 00148000 *. 00149000 EJECT 00150000 COPY OPTIONS 00151000 SPACE 2 00152000 COPY LOCAL OPTIONS 00153000 DMKCSQ CSECT 00154000 SPACE 3 00155000 EXTRN DMKSCNVU,DMKSCNFD 00156000 EXTRN DMKVSPCO,DMKVSPCR,DMKCVTHB 00157000 EXTRN DMKCVTDB,DMKRSPHQ 00158000 EXTRN DMKVIOIN,DMKSTKIO @VM01016 00159000 EXTRN DMKCSOSD,DMKUDRFU,DMKERMSG 00160000 EXTRN DMKUDRRV @V200930 00161000 EXTRN DMKCKSPL @V304298 00162000 SPACE 3 00163000 USING PSA,R0 00164000 USING SFBLOK,R7 00165000 USING VDEVBLOK,R8 00166000 USING BUFFER,R9 00167000 USING VMBLOK,R11 00168000 USING SAVEAREA,R13 00169000 SPACE 2 00170000 ID DC CL8'DMKCSQ' MODULE NAME 00171000 EJECT 00172000 *. 00173000 * SUBROUTINE NAME - 00174000 * 00175000 * DMKCSQCL 00176000 * 00177000 * FUNCTION - 00178000 * 00179000 * TO CLOSE A VIRTUAL INPUT FILE, OR TO CLOSE A VIRTUAL OUTPUT 00180000 * FILE. 00181000 * 00182000 * COMMAND LINE FORMAT - 00183000 * 00184000 * +-------+----------------------------------------------+ 00185000 * | CLOSE | READER | 00186000 * | C | VADDR | 00187000 * | | | 00188000 * | | CONSOLE | 00189000 * | | PRINTER | 00190000 * | | PUNCH || | 00191000 * | | VADDR |DIST DISTCODE|.....----- | 00192000 * | | --> | 00193000 * | | | 00194000 * +-------+----------------------------------------------+ 00195000 * 00196000 * READER PRINTER PUNCH CONSOLE HOLD NOHOLD 00197000 * R RDR P PRT PU PCH CON HO NOH 00198000 * 00199000 * PURGE DIST NAME 00200000 * PU DI NA 00201000 * 00202000 * 00203000 * OPERATION - 00204000 * 00205000 * 1. CALL GETYPE; IF TYPE = ALL, EXIT GIVING 00206000 * ERROR MSG006E. 00207000 * IF MISSING OR INVALID, EXIT GIVING MSG022E. 00208000 * 2. CL01- CALL DMKSCNFD TO LOCATE NEXT OPTION: 00209000 * IF NONE, GO TO STEP 8. 00210000 * 3. CL02- IF OUTPUT DEVICE, GO TO STEP 4. 00211000 * IF OPTION = 'HOLD' AND/OR 'NOHOLD' SET FLAG IN 00212000 * SAVEWRK1 AND GO TO STEP 2. 00213000 * OTHERWISE, EXIT GIVING ERROR MSG003E. 00214000 * 4. CL03- IF OPTION = 'PURGE' SET FLAG IN SAVEWRK1 00215000 * AND GO TO STEP 8. 00216000 * 5. CL04,CL06- IF OPTION = 'HOLD' AND/OR 'NOHOLD' SET 00217000 * FLAG IN SAVEWRK1 AND GO TO STEP 2. 00218000 * 6. CL05- IF OPTION = 'DIST', CALL DMKSCNFD TO LOCATE 00219000 * DIST-CODE: IF NONE OR INVALID, EXIT GIVING MSG032E. 00220000 * IF DIST-CODE VALID, SAVE IN SAVEWRK8,9 AND GO TO 00221000 * STEP 8. 00222000 * 7. IF OPTION = 'NAME', CLASS GETNAME: OTHERWISE EXIT 00223000 * GIVING MSG003E 00224000 * 8. CL-8,CL09,CL10,CL11- LOCATE SPOOL CONTROL AND SPOOL 00225000 * FILE BLOCKS- IF INPUT DEVICE, GO TO STEP 9. 00226000 * SET NEW INFORMATION IN SPOOL FILE BLOK. 00227000 * IF OUTPUT SPOOL CONTINOUS (VDEVCP), GO TO STEP 10: 00228000 * OTHERWISE, CALL DMKVSPCO TO CLOSE FILE AND 00229000 * GO TO STEP 10. 00230000 * 9. CLOSERDR- CALL DMKVSPCR TO CLOSE READER. 00231000 * 10. IF TYPE = VADDR, EXIT. OTHERWISE CALL GETDEVIC 00232000 * AND GO TO STEP 8. 00233000 * 00234000 * RESPONSE - 00235000 * 00236000 * PRT TO 00237000 * PUN FILE NNNN FOR USERID COPY NN NOHOLD 00238000 * CON FROM HOLD 00239000 * 00240000 * 00241000 * ERROR MESSAGES - 00242000 * 00243000 * DMKCSQ003E INVALID OPTION - (OPTION) 00244000 * DMKCSQ006E INVALID DEVICE TYPE - (ADDR) 00245000 * DMKCSQ013E CONFLICTING OPTION - (OPTION) 00246000 * DMKCSQ022E VADDR MISSING OR INVALID 00247000 * DMKCSQ029E FNAME FTYPE MISSING OR INVALID 00248000 * DMKCSQ032E DISTCODE MISSING OR INVALID 00249000 * DMKCSQ040E DEV (ADDR) DOES NOT EXIST 00250000 *. 00251000 EJECT 00252000 SPACE 3 00253000 DMKCSQCL RELOC 00254000 SPACE 00255000 USING VSPLCTL,R9 00256000 SPACE 00257000 BAL R4,CLEAR CLEAR SAVEWRK1,2-9 00258000 MVC SAVEWRK8(8),BLANKS PUT BLANKS IN DIST AREA 00259000 SR R6,R6 INDICATE POSSIBLE VADDR 00260000 BAL R4,GETYPE GET DEVICE TYPE @V200930 00261000 EX R5,CLIALL TYPE = ALL ?? 00262000 BE MSG006E YES - INVALID TYPE 00263000 SPACE 00264000 CL01 EQU * 00265000 CALL DMKSCNFD LOCATE NEXT OPTION 00266000 BNZ CL08 NONE -- GO PROCESS 00267000 SPACE 00268000 LR R14,R0 COUNT 00269000 BCTR R14,0 -1 00270000 C R0,F2 COUNT OF 1 00271000 BL MSG003E INVALID OPTION 00272000 BE CL02 -- 00273000 EX R14,CLCNOHLD NOHOLD ?? 00274000 BNE CL02 NO -- 00275000 TM SAVEWRK1,SFBNOHLD+SFBHOLD OPTION ERROR ? 00276000 BNZ MSG013E YES -- CONFLICTING OPTION 00277000 OI SAVEWRK1,SFBNOHLD SET NOHOLD 00278000 B CL01 GET NEXT - 00279000 SPACE 00280000 CL02 EQU * 00281000 EX R14,CLCHOLD HOLD ?? 00282000 BNE CL03 NO, TEST NEXT OPTION @V200930 00283000 TM SAVEWRK1,SFBNOHLD+SFBHOLD HOLD OR NOHOLD ?? 00284000 BNZ MSG013E YES -- CONFLICTING OPTION 00285000 OI SAVEWRK1,SFBHOLD SET HOLD ?? 00286000 B CL01 GET NEXT 00287000 SPACE 00288000 CL03 DS 0H @V200930 00289000 EX R14,CLCPURG PURGE ?? 00290000 BNE CL04 NO - 00291000 TM VDEVTYPC,CLASURI IS IT A READER ?? @V200930 00292000 BO MSG003E YES, INVALID OPTION @V200930 00293000 TM SAVEWRK1+1,VDEVPURG PURGE ALL READY SET ?? 00294000 BO MSG013E YES -- CONFLICTING OPTION 00295000 OI SAVEWRK1+1,VDEVPURG SAVE IT 00296000 CLI SAVEWRK1,X'00' HOLD OR NOHOLD OPTIONS ?? 00297000 BNE MSG003E INVALID OPTION 00298000 CLI SAVEWRK8,C' ' DIST CODE PRESENT ?? 00299000 BNE MSG003E YES -- INVALID OPTION 00300000 B CL08 GO - PROCESS 00301000 SPACE 00302000 CL04 EQU * 00303000 TM SAVEWRK1+1,VDEVPURG PURGE OPTION PRESENT ?? 00304000 BO MSG003E YES - INVALID OPTION 00305000 EX R14,CLCDIST DISTRIBUTION ?? 00306000 BNE CL07 NO, TEST FOR NAME @V200930 00307000 CLI SAVEWRK8,X'40' DIST CODE PRESENT ?? 00308000 BH MSG013E YES -- CONFLICTING OPTION 00309000 CALL DMKSCNFD GET DIST CODE 00310000 BNZ MSG032E DIST CODE MISSING 00311000 C R0,F8 OVER MAX LENGTH 00312000 BH MSG032E YES - INVALID 00313000 LR R14,R0 COUNT 00314000 BCTR R14,0 -1 00315000 EX R14,MVCDIST SAVE DISTCODE 00316000 B CL01 00317000 SPACE 00318000 CL07 EX R14,CLCNAME NAME ?? 00319000 BNE MSG003E NO - INVALID OPTION 00320000 BAL R4,GETNAME GET FILE NAME TYPE @V200930 00321000 SPACE 00322000 CL08 EQU * 00323000 CALL DMKSCNFD 00324000 BZ MSG003E TOO MANY OPTIONS 00325000 CL08A EQU * 00326000 L R9,VDEVSPL POINTER TO VSPLCTL BLOK 00327000 LTR R9,R9 VALID ADDRESS 00328000 BZ CL12 NO -- DO NEXT 00329000 L R7,VSPSFBLK ADDRESS OF SPOOL FILE BLOK 00330000 LTR R7,R7 FILE BLOK PRESENT ?? 00331000 BZ CL10 NO -- CLEAR VSPLCTL BLOK 00332000 SPACE 00333000 L R14,SAVEWRK4 ADDRESS OF NEW FNAME FTYPE 00334000 LTR R14,R14 ONE PRESENT ?? 00335000 BZ *+10 NO -- 00336000 MVC SFBFNAME(24),0(R14) MOVE NEW NAME TO SFBLOK 00337000 CLI SAVEWRK8,C' ' NEW DIST CODE PRESENT ?? 00338000 BE CL08B NO -- 00339000 MVC SFBDIST(8),SAVEWRK8 MOVE IN NEW DIST CODE 00340000 CL08B TM SAVEWRK1,SFBNOHLD NOHOLD TO BE SET ?? 00341000 BZ CL09 NO - 00342000 OI SFBFLAG2,SFBNOHLD YES - SET NOHOLD 00343000 NI SFBFLAG2,X'FF'-SFBHOLD RESET HOLD - 00344000 B CL10 00345000 SPACE 00346000 CL09 EQU * 00347000 TM SAVEWRK1,SFBHOLD HOLD TO BE SET 00348000 BZ CL10 NO - 00349000 OI SFBFLAG2,SFBHOLD SET HOLD BIT 00350000 NI SFBFLAG2,X'FF'-SFBNOHLD RESET NOHOLD BIT 00351000 SPACE 00352000 CL10 EQU * 00353000 L R1,=C'CLOS' PARM REG FOR DMKVSP @VA01460 00354000 TM VDEVTYPC,CLASURI INPUT DEVICE ?? 00355000 BO CLOSERDR YES -- CLOSE READERS 00356000 TM SAVEWRK1+1,VDEVPURG IS PURGE FLAG TO BE SET 00357000 BZ CL11 NO - 00358000 LA R2,VDEVPURG PURGE ACTIVE FILE @VA01460 00359000 B CL11A GO CLOSE AND PURGE @V200930 00360000 SPACE 00361000 CL11 EQU * 00362000 TM VDEVSFLG,VDEVCONT CONT OUTPUT ?? @V200930 00363000 BO CL12 YES -- DO NOT CLOSE 00364000 SR R2,R2 NO PARMS @VA01460 00365000 CL11A SL R8,VMDVSTRT VDEVBLOK DISPLACEMENT @VA01460 00366000 CALL DMKVSPCO CALL OUTPUT CLOSE ROUTINE 00367000 AL R8,VMDVSTRT VDEVBLOK ADDRESS @VA01460 00368000 B CL12 -- 00369000 SPACE 00370000 CLOSERDR SL R8,VMDVSTRT VDEVBLOK DISPLACEMENT @VA01460 00371000 CALL DMKVSPCR CLOSE READER @VA01460 00372000 AL R8,VMDVSTRT VDEVBLOK ADDRESS @VA01460 00373000 SPACE 00374000 CL12 EQU * 00375000 LTR R5,R5 VADDR ?? 00376000 BZ CL13 YES - EXIT 00377000 BAL R3,GETDEVIC GET NEXT DEVICE @V200930 00378000 LTR R10,R10 ALL DONE ?? 00379000 BNZ CL08A NO - DO NEXT DEVICE 00380000 SPACE 00381000 CL13 B CSQEXIT 00382000 EJECT 00383000 *. 00384000 * SUBROUTINE NAME - 00385000 * 00386000 * DMKCSQHL 00387000 * 00388000 * FUNCTION - 00389000 * 00390000 * TO HOLD THE PRINTER, PUNCH OR BOTH QUEUES FOR A PARTICULAR 00391000 * USER. THE COMMAND APPLIES TO CURRENT CLOSE SPOOL FILES 00392000 * AND IS ALSO REMEMBERED TO FILES AS THEY ARE CLOSED. 00393000 * THE FILES AND HOLD STATUS CAN BE RESET WITH THE FREE 00394000 * COMMAND. THIS IS A CLASS D COMMAND. 00395000 * 00396000 * COMMAND LINE FORMAT - 00397000 * 00398000 * +------+-----------------+ 00399000 * | HOLD | USERID PRINTER | 00400000 * | HO | PUNCH | 00401000 * | | ALL | 00402000 * | | --- | 00403000 * +------+-----------------+ 00404000 * 00405000 * PRINTER PUNCH ALL 00406000 * P PRT PU PCH ALL 00407000 * 00408000 * 00409000 * OPERATION - 00410000 * 00411000 * 1. CALL GETUSER 00412000 * 2. CALL GETYPE: IF READER OR VADDR, EXIT GIVING 00413000 * ERROR MSG006E. 00414000 * 3. IF TYPE = 'ALL', CALL GETCHAIN. 00415000 * 4. HL01A- LOCATE SPOOL HOLD QUEUE BLOK FOR 00416000 * THIS USER ON (DMKRSPHQ) CHAIN. IF NONE, 00417000 * CREATE AND CHAIN BLOK TO CHAIN. 00418000 * SET SHQFLAG FOR THIS DEVICE. 00419000 * 5. CALL GETFILE: IF NONE, GO TO STEP 6. 00420000 * SET SFBSHOLD FLAG IN SPOOL FILE FLOK AND GO TO STEP 5. 00421000 * 6. CALL GETCHAIN: IF ALL DONE, EXIT: OTHERWISE, GO TO STEP 5. 00422000 * 00423000 * RESPONSE - 00424000 * 00425000 * NONE 00426000 * 00427000 * ERROR MESSAGES - 00428000 * 00429000 * 00430000 * DMKCSQ006E INVALID DEVICE TYPE - (ADDR) 00431000 * DMKCSQ007E INVALID USERID - (USERID) 00432000 * DMKCSQ020E USERID MISSING OR INVALID 00433000 * DMKCSQ053E (USERID) NOT IN CP DIRECTORY 00434000 *. 00435000 SPACE 3 00436000 DMKCSQHL RELOC 00437000 SPACE 00438000 BAL R4,CLEAR CLEAR SAVEWRK1,2-9 00439000 BAL R4,GETUSER GET USERID @V200930 00440000 SPACE 00441000 L R6,FFS INDICATE NO VADDR POSSIBLE AND 00442000 * DO NOT GET VDEVBLOK ADDRESS 00443000 BAL R4,GETYPE GET DEVICE TYPE @V200930 00444000 LTR R5,R5 TYPE = VADDR ?? 00445000 BZ MSG006E YES INVALID 00446000 EX R5,TMCON TYPE EQUAL CONSOLE? @VA05854 00447000 BO MSG006E YES, INVALID @VA05854 00448000 SPACE 00449000 EX R5,TMRDR TYPE = READER ?? 00450000 BZ HL01 NO 00451000 EX R5,CLIALL TYPE = ALL ?? 00452000 BE *+8 YES 00453000 B MSG006E INVALID TYPE 00454000 * 00455000 * USE GETCHAIN TO TURN OFF RDR BIT 00456000 * 00457000 BAL R3,GETCHAIN GET NEXT FILE IN CHAIN @V200930 00458000 SPACE 00459000 HL01 EQU * 00460000 EJECT 00461000 USING SHQBLOK,R1 00462000 SPACE 00463000 L R2,=A(DMKRSPHQ) ADDRESS OF SPOOL HOLD QUEUE POINTER 00464000 SPACE 00465000 * 1ST TIME 2ND TO LAST TIME 00466000 * COMMENTS COMMENTS 00467000 SPACE 00468000 SHQLP L R1,0(R2) 1ST SHQBLOK NEXT SHQBLOK 00469000 * ADDRESS ADDRESS 00470000 LTR R1,R1 LIST EMPTY ?? END OF LIST ?? 00471000 BZ BUILDSHQ YES YES 00472000 SPACE 00473000 * SEARCH THE LIST FOR BLOK WITH THIS USER'S ID 00474000 SPACE 00475000 CLC SAVEWRK2(8),SHQUSER SHQBLOK BELONG TO THIS USER ?? 00476000 BE SHQEQUAL YES 00477000 LR R2,R1 SAVE SHQBLOK ADDRESS 00478000 B SHQLP TRY NEXT BLOK 00479000 SPACE 00480000 BUILDSHQ EQU * BUILD SHQBLOK FOR THIS USER 00481000 LA R0,SHQBSIZE LENGTH IN DOUBLE WORDS 00482000 SPACE 00483000 CALL DMKFREE GET STORAGE FOR BLOK 00484000 SPACE 00485000 ST R1,0(R2) CHAIN LAST BLOK TO THIS NEW BLOK 00486000 XC SHQBLOK(SHQBSIZE*8),SHQBLOK CLEAR TO ZEROES 00487000 MVC SHQUSER(8),SAVEWRK2 MOVE USER ID TO SHQBLOK 00488000 SPACE 00489000 SHQEQUAL EQU * 00490000 EX R5,OISUSER SET TYPE FLAGS FOR SYSTEM HOLDING 00491000 * USER 00492000 CALL DMKCKSPL,PARM=CHGSHQ+CHGSFB @V304298 00493000 SPACE 00494000 HL02 EQU * 00495000 LR R9,R7 SAVE CHAIN ANCHOR @V304298 00496000 HL02A DS 0H @V304298 00497000 BAL R4,GETFILE GET NEXT SPOOL FILE @V200930 00498000 LTR R7,R7 MORE FILES THIS CHAIN ?? 00499000 BZ HL03 NO TRY NEXT CHAIN 00500000 SPACE 00501000 * HERE TO SET HOLD FLAGS IN SFBLOK 00502000 SPACE 00503000 OI SFBFLAG,SFBSHOLD SET CLASS D USER HOLDING USER FILE 00504000 CALL DMKCKSPL,PARM=CHGSFB CHECKPOINT @V304298 00505000 LR R2,R7 SAVE CURRENT SFBLOK @V304298 00506000 LR R7,R9 RESTORE ANCHOR @V304298 00507000 HL02B L R7,0(R7) NEXT SFBLOK @V304298 00508000 LTR R7,R7 ANY MORE? @V304298 00509000 BZ HL03 XFER IF NOT @V304298 00510000 CR R7,R2 IS THIS THE CURRENT ONE? @V304298 00511000 BE HL02A XFER IF SO @V304298 00512000 B HL02B TRY AGAIN @V304298 00513000 SPACE 00514000 HL03 EQU * 00515000 BAL R3,GETCHAIN GET NEXT FILE CHAIN @V200930 00516000 SPACE 00517000 HL04 LTR R6,R6 ALL DONE ?? 00518000 BNZ HL02 NO - DO PUNCH CHAIN 00519000 B CSQEXIT 00520000 SPACE 00521000 * ***EXECUTED INSTRUCTIONS*** 00522000 OISUSER OI SHQSHOLD,X'00' SET TYPE BITS IN SYSTEM HOLD OF 00523000 * SHQBLOK 00524000 SPACE 00525000 EJECT 00526000 *. 00527000 * SUBROUTINE NAME - 00528000 * 00529000 * DMKCSQFR 00530000 * 00531000 * FUNCTION - 00532000 * 00533000 * TO FREE PREVIOUSLY HELD SPOOLING FILES. FILES MAY BE 00534000 * FREED BY FILE TYPE. THIS IS A CLASS D COMMAND. 00535000 * 00536000 * COMMAND LINE FORMAT - CLASS D 00537000 * 00538000 * +---------+------------------+ 00539000 * | FREE | USERID PRINTER | 00540000 * | FR | PUNCH | 00541000 * | | ALL | 00542000 * | | --- | 00543000 * +---------+------------------+ 00544000 * 00545000 * PRINTER PUNCH ALL 00546000 * P PRT PU PCH ALL 00547000 * 00548000 * OPERATION - 00549000 * 1. CALL GETUSER 00550000 * 2. CALL GETYPE: IF TYPE = VADDR OR READER, EXIT GIVING 00551000 * ERROR MSG006E. 00552000 * IF TYPE = ALL OR NONE, CALL GETCHAIN. 00553000 * 3. FR01- CALL GETFILE- IF NONE, GO TO STEP 4. 00554000 * RESET SFBSHOLD FLAG IN SFBLOK AND GO TO STEP 3. 00555000 * 4. LOCATE SPOOL HOLD QUEUE BLOK FOR THIS USER: 00556000 * IF NONE, GO TO STEP 6. 00557000 * RESET THE SHQSHOLD FLAG FOR THIS DEVICE TYPE. 00558000 * IF SHQFLAG = ZERO, UNCHAIN THE SHQBLOK AND CALL 00559000 * DMKFRET TO FRET THE BLOK. 00560000 * 5. IF TYPE NOT = TO 'ALL' GO TO STEP 6. 00561000 * OTHERWISE, CALL GETCHAIN: IF NOT LAST CHAIN, GO TO 00562000 * STEP 3. 00563000 * 6. CALL DMKCSOSD - TO GIVE DEVICE END INTERRUPT IF 00564000 * DEVICE NOT ACTIVE AND EXIT. 00565000 * 00566000 * 00567000 * RESPONSE - 00568000 * 00569000 * NONE 00570000 * 00571000 * ERROR MESSAGES - 00572000 * 00573000 * 00574000 * DMKCSQ006E INVALID DEVICE TYPE - (ADDR) 00575000 * DMKCSQ007E INVALID USERID - (USERID) 00576000 * DMKCSQ020E USERID MISSING OR INVALID 00577000 * DMKCSQ053E (USERID) NOT IN CP DIRECTORY 00578000 *. 00579000 EJECT 00580000 DMKCSQFR RELOC 00581000 SPACE 00582000 BAL R4,CLEAR CLEAR SAVEWRK1,2-9 00583000 BAL R4,GETUSER GET USERID @V200930 00584000 L R6,FFS INDICATE NO VADDR POSSIBLE 00585000 * AND DO NOT GET VDEVBLOK ADDRESS 00586000 BAL R4,GETYPE GET DEVICE TYPE @V200930 00587000 LTR R5,R5 TYPE = VADDR ?? 00588000 BZ MSG006E YES INVALID 00589000 EX R5,TMCON TYPE EQUAL CONSOLE? @VA05139 00590000 BO MSG006E YES, INVALID @VA05139 00591000 EX R5,CLIALL TYPE = ALL ?? 00592000 BNE TSTRDR NO TEST FOR READER TYPE 00593000 BAL R3,GETCHAIN GET NEXT FILE CHAIN @V200930 00594000 SPACE 00595000 TSTRDR EX R5,TMRDR TYPE = READER ?? 00596000 BO MSG006E YES INVALID 00597000 STC R5,SAVEWRK9+1 SAVE TYPE MASK 00598000 FR01 EQU * 00599000 LR R9,R7 SSAVE CURRENT ANCHOR @V304298 00600000 FR01A DS 0H @V304298 00601000 BAL R4,GETFILE GET NEXT SPOOL FILE @V200930 00602000 LTR R7,R7 SFBLOK PRESENT ?? 00603000 BZ FR03 NO - DO SHQBLOKS 00604000 FR02 NI SFBFLAG,X'FF'-SFBSHOLD RESET USER 'SYSTEM HOLD' FLAG 00605000 CALL DMKCKSPL,PARM=CHGSFB CHECKPOINT @V304298 00606000 LR R2,R7 SAVE CURRENT SFBLOK @V304298 00607000 LR R7,R9 RESTORE ANCHOR @V304298 00608000 FR02A L R7,0(R7) NEXT SFBLOK @V304298 00609000 LTR R7,R7 ANY MORE? @V304298 00610000 BZ FR03 XFER IF NOT @V304298 00611000 CR R2,R7 IS THIS THE CURRENT ONE? @V304298 00612000 BE FR01A XFER IF SO @V304298 00613000 B FR02A TRY AGAIN @V304298 00614000 SPACE 00615000 USING SHQBLOK,R1 00616000 FR03 L R2,=A(DMKRSPHQ) ADDRESS OF SPOOL HOLD QUEUE POINTER 00617000 LA R14,255 SET TO X'FF' 00618000 SR R14,R5 'NI' MASK TO RESET FLAGS IN SHQBLOK 00619000 NEXTSHQ L R1,0(R2) SHQBLOK ADDRESS 00620000 LTR R1,R1 LAST ENTRY ?? 00621000 BZ FR04A YES @V304298 00622000 CLC SAVEWRK2(8),SHQUSER BLOK FOR THIS USER OR USERID 00623000 BE SHQEQ YES 00624000 LR R2,R1 SET BASE TO NEXT BLOK 00625000 B NEXTSHQ TEST THIS BLOK 00626000 SPACE 00627000 SHQEQ EX R14,NIUSYS RESET SHQBLOK SYSTEM HOLD 00628000 SPACE 00629000 L R14,SHQFLAGS LOAD FLAGS 00630000 LTR R14,R14 ALL FLAGS EQUAL TO ZERO ?? 00631000 BNZ FR04 NO TEST FOR OTHER CHAIN 00632000 SPACE 00633000 MVC 0(4,R2),SHQPNT UNCHAIN CURRENT SHQBLOK 00634000 CALL DMKCKSPL,PARM=CHGSHQ+DELSFB CHECKPOINT @V304298 00635000 LA R0,SHQBSIZE LOAD SIZE OF BLOK IN DOUBLE WORDS 00636000 CALL DMKFRET FREE BLOK 00637000 B FR04A CONTINUE @V304298 00638000 SPACE 00639000 FR04 EQU * 00640000 CALL DMKCKSPL,PARM=CHGSHQ+CHGSFB CHECKPOINT @V304298 00641000 FR04A DS 0H @V304298 00642000 BAL R3,GETCHAIN GET NEXT FILE CHAIN @V200930 00643000 SPACE 00644000 LTR R6,R6 LAST FILE ?? 00645000 BNZ FR01 00646000 SPACE 00647000 FR05 EQU * 00648000 IC R5,SAVEWRK9+1 GET TYPE MASK 00649000 CALL DMKCSOSD CALL START ROUTINE TO GIVE INTERRUPT 00650000 B CSQEXIT 00651000 SPACE 3 00652000 * ***EXECUTED INSTRUCTIONS*** 00653000 NIUSYS NI SHQSHOLD,X'00' RESET USER 'SYSTEM HOLD' FLAG 00654000 CLIALL CLI =AL1(CSQRDR+TYPPRT+TYPPUN),X'00' MASK = READER PRINTER 00655000 * PUNCH 00656000 TMRDR TM =AL1(CSQRDR),X'00' MASK = READER 00657000 TMPRT TM =AL1(TYPPRT),X'00' MASK = PRINTER 00658000 TMPUN TM =AL1(TYPPUN),X'00' MASK = PUNCH 00659000 TMTYPE TM VDEVTYPE,X'00' TEST VDEV TYPE 00660000 TMCON TM =AL1(CSQCON),X'00' MASK = CONSOLE 00661000 EJECT 00662000 *. 00663000 **************************************** 00664000 * 00665000 * SUBROUTINES 00666000 * 00667000 **************************************** 00668000 * 00669000 * 00670000 * 00671000 * OPERATION OF GETUSER - 00672000 * 00673000 * 1. CALL DMKSCNFD TO LOCATE USERID: 00674000 * IF NONE, EXIT GIVING ERROR MSG020E. 00675000 * 2. CALL DMKUDRFU: VERIFY USERID. 00676000 * IF INVALID, EXIT GIVING ERROR MSG007E 00677000 * IF NOT IN CP DIRECTORY, EXIT GIVING ERROR MSG053E 00678000 * 3. MOVE USERID TO SAVEWRK2,3 AND RETURN TO CALLER. 00679000 *. 00680000 SPACE 3 00681000 GETUSER EQU * HERE TO MOVE USERID TO SAVEWRK2,3 00682000 SPACE 00683000 GU01 EQU * 00684000 CALL DMKSCNFD LOCATE USERID 00685000 BNZ MSG020E USERID MISSING 00686000 C R0,F8 LENGTH GREATER THAN 8 ? 00687000 BH MSG007E YES -- INVALID USERID 00688000 SPACE 00689000 GU02 MVC SAVEWRK2(8),BLANKS BLANK ID AREA 00690000 SR R2,R2 PARM REG 00691000 CALL DMKUDRFU VERIFY USER 00692000 BNZ MSG053E USERID NOT IN DIRECTORY 00693000 GU03 LR R14,R0 COUNT 00694000 BCTR R14,0 -1 00695000 EX R14,MVCID MOVE USER ID FROM COMMAND LINE TO 00696000 * SAVEWRK2,3 00697000 BR R4 RETURN TO CALLER 00698000 SPACE 00699000 MVCID MVC SAVEWRK2(0),0(R1) ***EXECUTED*** 00700000 SPACE 3 00701000 CLEAR XC SAVEWRK2(32),SAVEWRK2 CLEAR SAVEWRK AREA 00702000 XC SAVEWRK1(4),SAVEWRK1 00703000 BR R4 RETURN TO CALLER 00704000 EJECT 00705000 *. 00706000 * 00707000 * OPERATION OF GETYPE - 00708000 * 00709000 * 1. CALL DMKSCNFD TO LOCATE DEVICE TYPE FIELD 00710000 * 2. IF OPTION='READER','PRINTER','PUNCH','CONSOLE','ALL' ; SET 00711000 * GPR5 = APPROPRIATE DEVICE TYPE. IF OPTION = 'ALL', SET 00712000 * GPR5 EQUAL TO CSQRDR+TYPPRT+TYPPUN; THEN, GO TO STEP 4 00713000 * IF MISSING OR INVALID AND COMMAND IS SPOOL OR CLOSE, 00714000 * EXIT GIVING MSG022E. 00715000 * 3. IF OPTION = VADDR, CALL DMKSCNVU TO LOCATE THE VDEVBLOK, 00716000 * SET GPR5 AND GPR10 = 0, AND EXIT 00717000 * 4. IF TYPE WAS NOT VADDR, LOAD GPR8 WITH VMDVSTRT-VDEVSIZE, 00718000 * AND GPR10 WITH VMDVCNT, AND CALL GETDEVIC TO LOCATE THE 00719000 * FIRST DEVICE OF THE CORRECT TYPE 00720000 * 5. SET GPR6 TO FFS, CALL GETCHAIN (GPR6 WILL BE FILLED BY 00721000 * GETCHAIN WITH THE APPROPRIATE FILE CHAIN ANCHOR) 00722000 * 6. EXIT 00723000 *. 00724000 SPACE 3 00725000 GETYPE EQU * 00726000 SPACE 00727000 GT01 LA R5,CSQRDR+TYPPRT+TYPPUN SET FOR ALL TYPE 00728000 CALL DMKSCNFD LOCATE DEVICE TYPE FIELD 00729000 STM R0,R1,SAVEWRK6 SAVE COUNT AND ADDRESS OF TYPE 00730000 BZ GT02 -- 00731000 LTR R6,R6 VIRTUAL ADDRESS POSSIBLE ?? 00732000 BZ MSG022E YES -- VADDR MISSING 00733000 B DEVIC NO OPTION DEFAULT TO ALL 00734000 SPACE 00735000 GT02 EQU * 00736000 * GPR1 ADDRESS OF TYPE 00737000 LR R14,R0 GET OPTION COUNT 00738000 BCTR R14,0 -1 00739000 C R0,F2 COUNT LENGTH OF 2 00740000 BE GT02A VALID FOR PUNCH 00741000 BL GT02B VALID FOR READER PRINTER 00742000 EX R14,CLCALL ALL ?? 00743000 BE DEVIC YES 00744000 LA R5,CSQCON SET R5 TO CONSOLE TYPE 00745000 EX R14,CLCCONS CONSOLE ?? 00746000 BE DEVIC YES -- 00747000 LA R5,CSQRDR SET R5 TO READER TYPE 00748000 EX R14,CLCRDR RDR ?? 00749000 BE DEVIC YES 00750000 LA R5,TYPPRT PRINTER MASK 00751000 EX R14,CLCPRT PRT ?? 00752000 BE DEVIC YES - 00753000 SPACE 00754000 LA R5,TYPPUN SET GPR5 TO PUNCH TYPE 00755000 EX R14,CLCPCH PCH ?? 00756000 BE DEVIC YES 00757000 GT02A LA R5,TYPPUN PUNCH MASK 00758000 EX R14,CLCPUN PUNCH ?? 00759000 BE DEVIC YES - 00760000 SPACE 00761000 GT02B LA R5,TYPPRT SET GPR5 TO PRINTER TYPE 00762000 EX R14,CLCPRINT PRINTER ?? 00763000 BE DEVIC YES - 00764000 SPACE 00765000 LA R5,CSQRDR TYPE MASK FOR READER 00766000 EX R14,CLCREAD READER ?? 00767000 BE DEVIC 00768000 LTR R6,R6 POSSIBLE VADDR ?? 00769000 BZ GT03 YES -- 00770000 B MSG006E NO -- ERROR DMKCSQ006E 00771000 SPACE 00772000 GT03 EQU * MUST BE VADDR 00773000 SPACE 00774000 STM R0,R1,SAVEWRK6 SAVE COUNT AND DEVICE ADDRESS 00775000 C R0,F3 COUNT OF 3 OR LESS ?? 00776000 BH MSG022E VADDR INVALID 00777000 CALL DMKCVTHB CONVERT TO BINARY 00778000 BNZ MSG022E INVALID VADDRESS 00779000 CALL DMKSCNVU LOCATE VDEVBLOK 00780000 BNZ MSG040E NONEXISTENT UNIT 00781000 TM VDEVTYPC,CLASURO+CLASTERM OUTPUT OR CONSOLE CLASS ? 00782000 BZ GT03A NO - CHECK INPUT TYPE 00783000 TM VDEVTYPE,TYPPRT+TYPPUN PRINTER OR PUNCH ?? 00784000 BNZ GT03B YES -- 00785000 CLI VDEVTYPE,TYP3210 CONSOLE TYPE ? 00786000 BE GT03B YES -- 00787000 B MSG006E INVALID DEVICE TYPE 00788000 GT03A TM VDEVTYPC,CLASURI INPUT DEVICE TYPE ?? 00789000 BZ MSG006E NO -- 00790000 TM VDEVTYPE,TYPRDR READER ?? 00791000 BZ MSG006E NO -- INVALID DEVICE TYPE 00792000 GT03B EQU * 00793000 TM VDEVSTAT,VDEVDED DEDICATED TO REAL DEVICE ?? 00794000 BO MSG006E YES -- INVALID DEVICE TYPE 00795000 SR R5,R5 SET GPR5 TO ZERO 00796000 SR R10,10 SET GPR10 TO ZERO 00797000 B GT06 RETURN TO CALLER 00798000 SPACE 2 00799000 DEVIC EQU * HERE TO SET UP FOR GETDEVIC 00800000 C R6,FFS DO WE NEED VDEVBLOK ADDRESS ?? 00801000 BE GT05 NO -- MUST BE HOLD OR FREE CMD 00802000 GT04 L R8,VMDVSTRT POINTER TO VDEVBLOK TABLE 00803000 S R8,=A(VDEVSIZE*8) SUBSTRACT BLOK SIZE 00804000 LH R10,VMDVCNT VDEVICE COUNT 00805000 LTR R10,R10 ANY DEVICES FOR THIS USER ?? 00806000 BP GT04A YES -- 00807000 MSG040 LA R2,40 NO -- DOES NOT EXIST 00808000 B EXIT8 ERROR MSG DMKCSQ040E 00809000 GT04A EQU * 00810000 A R10,F1 INCREASE DEVICE COUNT BY ONE 00811000 BAL R3,GETDEVIC GET NEXT DEVICE @V200930 00812000 LTR R10,R10 ANY MORE VDEVBLOKS ?? 00813000 BZ MSG040 NO -- ERROR DMKCSQ040E 00814000 B GT06 SET ZERO COND @V200930 00815000 SPACE 00816000 GT05 L R6,FFS SET 1ST TIME SWITCH FOR GETCHAIN 00817000 BAL R3,GETCHAIN GET NEXT FILE CHAIN @V200930 00818000 SPACE 00819000 GT06 CR R2,R2 SET CC = ZERO 00820000 BR R4 RETURN TO CALLER 00821000 SPACE 3 00822000 SPACE 3 00823000 CLCALL CLC 0(0,R1),=C'ALL ' COMPARE FOR ALL 00824000 CLCRDR CLC 0(0,R1),=C'RDR ' COMPARE FOR RDR 00825000 CLCPCH CLC 0(0,R1),=C'PCH ' COMPARE FOR PCH 00826000 CLCPRT CLC 0(0,R1),=C'PRT ' COMPARE FOR PRT 00827000 CLCPRINT CLC 0(0,R1),=C'PRINTER ' COMPARE FOR PRINTER 00828000 CLCPUN CLC 0(0,R1),=C'PUNCH ' COMPARE FOR PUNCH 00829000 CLCREAD CLC 0(0,R1),=C'READER ' COMPARE FOR READER 00830000 CLCHOLD CLC 0(0,R1),=C'HOLD ' COMPARE FOR HOLD 00831000 CLCNOHLD CLC 0(0,R1),=C'NOHOLD ' COMPARE FOR NOHOLD 00832000 CLCNAME CLC 0(0,R1),=C'NAME ' COMPARE FOR NAME 00833000 CLCPURG CLC 0(0,R1),=C'PURGE ' COMPARE FOR PURGE 00834000 CLCDIST CLC 0(0,R1),=C'DIST ' COMPARE FOR DIST 00835000 CLCCONS CLC 0(0,R1),=C'CONSOLE ' COMPARE FOR CONSOLE 00836000 MVCDIST MVC SAVEWRK8(0),0(R1) MOVE DIST CODE 00837000 EJECT 00838000 *. 00839000 * 00840000 * OPERATION OF GETFILE - 00841000 * 00842000 * 1. UPON ENTRY, GPR6 = ADDRESS OF A POINTER TO THE NEXT SFBLOK 00843000 * TO TEST 00844000 * 2. LOAD GPR7 WITH POINTER TO NEXT BLOK; IF ZERO, EXIT 00845000 * 3. IF SAVEWRK2,3 EQUALS ZERO OR SFBUSER, GO TO STEP 4; 00846000 * OTHERWISE GO TO STEP 6 00847000 * 4. IF SAVEWRK1(1) EQUALS ZERO OR SFBCLAS,GO TO STEP 5; 00848000 * OTHERWISE GO TO STEP 6 00849000 * 5. IF SAVEWRK1+2(2) EQUALS ZERO OR SFBFILID, EXIT 00850000 * 6. IF NO MATCH, GO TO STEP 2 00851000 *. 00852000 SPACE 00853000 GETFILE EQU * HERE TO LOCATE THE REQUESTED FILE 00854000 SPACE 00855000 GF01 EQU * GPR7 = POINTER TO NEXT SFBLOK 00856000 GF02 LR R6,R7 SFBLOK PRESENT ?? 00857000 L R7,0(R7) 00858000 LTR R7,R7 00859000 BCR 8,R4 NO -RETURN TO CALLER WITH GPR7 ZERO 00860000 SPACE 00861000 GF03 TM SFBFLAG,SFBINUSE FILE IN USE ?? 00862000 BO GF02 GET NEXT FILE 00863000 CLI SAVEWRK2,X'40' USERID PRESENT ?? 00864000 BNH GF04 NO -- USE ALL FILES 00865000 CLC SAVEWRK2(8),SFBUSER USERID EQUALS ?? 00866000 BNE GF02 NO 00867000 SPACE 00868000 GF04 CLI SAVEWRK1,X'00' SEARCH BY CLASS ?? 00869000 BE GF05 NO 00870000 CLI SAVEWRK1,C'*' ALL CLASS DEVICE ?? @VM01016 00871000 BE GF05 YES, @VM01016 00872000 CLC SAVEWRK1(1),SFBCLAS CLASS EQUALS ?? 00873000 BNE GF02 NO - 00874000 SPACE 00875000 GF05 CLC SAVEWRK1+2(2),ZEROES SEARCH BY SPOOLID 00876000 BE GF06 YES 00877000 CLC SAVEWRK1+2(2),SFBFILID SPOOLID EQUAL ?? 00878000 BNE GF02 NO - 00879000 SPACE 00880000 GF06 EQU * 00881000 BR R4 RETURN TO CALLER 00882000 EJECT 00883000 *. 00884000 * OPERATION OF GETDEVIC - 00885000 * 00886000 * 1. UPON ENTRY, THE FOLLOWING REGISTERS MUST BE LOADED - 00887000 * GPR5 = THE DEVICE TYPE TO SEARCH FOR 00888000 * GPR8 = ADDRESS OF VDEVBLOK AT WHICH TO START SEARCH 00889000 * GPR10 = NUMBER OF VDEVBLOKS TO SEARCH 00890000 * 2. ADD VDEVSIZE TO GPR8 AND DECREMENT GPR10; IF GPR10 = 0,EXIT 00891000 * 3. TEST FOR DEVICE CLASS OF UNIT RECORD; IF NOT U/R, GO TO 2 00892000 * 4. EXECUTE TM USING MASK IN GPR5 AGAINST VDEVTYPE; BRANCH 00893000 * ON ONES BACK TO CALLER; OTHERWISE, GO TO STEP 2 00894000 * 5. NOTE THAT GETDEVIC IS A 2ND LEVEL ROUTINE; LINKAGE IS VIA 00895000 * GPR3 00896000 *. 00897000 SPACE 3 00898000 GETDEVIC EQU * HERE TO LOCATE NEXT DEVICE FOR THIS TYPE 00899000 SPACE 00900000 * GPR5 = DEVICE TYPE TO SEARCH FOR 00901000 * GPR8 = ADDRESS OF VDEVBLOK TO START SEARCH 00902000 * GPR10 = NUMBER OF VDEVBLOKS TO SEARCH 00903000 SPACE 00904000 GD02 A R8,=A(VDEVSIZE*8) POINT TO NEXT DEVBLOK 00905000 BCT R10,GD03 DECREMENT COUNT 00906000 BR R3 COUNT IS ZERO, RETURN TO CALLER 00907000 SPACE 00908000 GD03 CLC VDEVADD,FFS ACTIVE DEVICE 00909000 BE GD02 NO -- 00910000 TM VDEVSTAT,VDEVDED DEDICATED TO REAL DEVICE ?? 00911000 BO GD02 YES -- TRY NEXT 00912000 TM VDEVTYPC,CLASURI INPUT UNIT RECORD ?? 00913000 BZ GD04 NO - CHECK OUTPUT 00914000 TM VDEVTYPE,TYPRDR IS IT A READER? @VA03722 00915000 BZ GD02 NO, TRY NEXT BLOCK @VA03722 00916000 EX R5,TMRDR VALID READER ?? 00917000 BCR 7,R3 YES - 00918000 B GD02 NO - TRY NEXT BLOK 00919000 SPACE 00920000 GD04 EQU * 00921000 CLI VDEVTYPC,CLASURO OUTPUT CLASS ?? 00922000 BNE GD05 NO -- 00923000 TM VDEVTYPE,TYPPUN+TYPPRT TYPE PUNCH OR PRINTER 00924000 BZ GD02 NO - 00925000 EX R5,TMTYPE MATCH SEARCH DEVICE PUNCH OR PRINTER 00926000 BZ GD02 NO 00927000 BR R3 YES - 00928000 SPACE 00929000 GD05 CLI VDEVTYPC,CLASTERM CONSOLE CLASS ? 00930000 BNE GD02 NO -- GET NEXT DEVICE 00931000 CLI VDEVTYPE,TYP3210 CONSOLE TYPE ? 00932000 BNE GD02 NO -- GET NEXT DEVICE 00933000 EX R5,TMCON CONSOLE TYPE REQUESTED ? 00934000 BZ GD02 NO -- GET NEXT DEVICE 00935000 BR R3 RETURN TO CALLER 00936000 SPACE 00937000 EJECT 00938000 *. 00939000 * OPERATION OF GETNAME - 00940000 * 00941000 * 1. CALL DMKFREE FOR A 24 BYTE AREA FOR FNAME AND FTYPE 00942000 * AND SAVE IN SAVEWRK4 00943000 * 2. CALL DMKSCNFD TO LOCATE FNAME. IF MISSING OR INVALID, 00944000 * EXIT GIVING MSG029E. OTHERWISE MOVE FNAME TO 00945000 * THE ADDRESS IN SAVEWRK4. IF FNAME IS GREATER THAN 00946000 * 8 BYTES RETURN TO CALLER. 00947000 * 3. CALL DMKSCNFD TO LOCATE FTYPE, IF NONE, RETURN; 00948000 * IF INVALID, EXIT GIVING MSG029E. 00949000 * MOVE FTYPE TO ADDRESS IN SAVEWRK4+11 AND RETURN. 00950000 * 00951000 *. 00952000 SPACE 3 00953000 GETNAME EQU * HERE TO LOCATE FNAME FTYPE 00954000 SPACE 00955000 GN01 LA R0,3 LENGTH FOR 24 BYTE AREA 00956000 CALL DMKFREE GET STORAGE FOR NEW FNAME FTYPE 00957000 ST R1,SAVEWRK4 SAVE ADDRESS IN SAVEWRK4 00958000 LR R2,R1 00959000 MVI 0(R2),C' ' CLEAR 00960000 MVC 1(23,R2),0(R2) AREA TO BLANKS 00961000 SPACE 00962000 GN02 CALL DMKSCNFD LOCATE FNAME 00963000 BNZ MSG029E FNAME MISSING 00964000 LR R14,R0 GET LENGTH COUNT 00965000 BCTR R14,R0 -1 FOR MOVE 00966000 CH R14,=H'23' LENGTH OVER 24 BYTES ?? 00967000 BH MSG029E YES - INVALID 00968000 SPACE 00969000 EX R14,MVCFNAME MOVE FNAME AND MAYBE FTYPE 00970000 C R14,F7 LENGTH OVER 8 BYTES ?? 00971000 BCR 2,R4 YES - RETURN NO FTYPE 00972000 SPACE 00973000 GN03 CALL DMKSCNFD LOCATE FTYPE 00974000 BCR 7,R4 NO FTYPE PRESENT - RETURN 00975000 EJECT 00976000 LR R14,R0 GET LENGTH OF FTYPE 00977000 BCTR R14,R0 -1 FOR MOVE 00978000 C R14,F7 OVER 8 CHARACTERS ?? 00979000 BH MSG029E YES - INVALID FOR FTYPE 00980000 EX R14,MVCFTYPE MOVE FTYPE 00981000 BR R4 RETURN TO CALLER 00982000 SPACE 2 00983000 MVCFNAME MVC 0(0,R2),0(R1) MOVE FNAME 00984000 MVCFTYPE MVC 12(0,R2),0(R1) MOVE FTYPE 00985000 EJECT 00986000 *. 00987000 * OPERATION OF GETCHAIN - 00988000 * 00989000 * 1. IF GPR5 = 0, SET GPR6 = 0 AND EXIT; 00990000 * 2. IF GPR6 = FFS, GO TO STEP 6; 00991000 * 3. IF GPR5 HAS CSQRDR BIT ON,REMOVE BIT, GO TO STEP 7; 00992000 * 4. IF GPR5 HAS TYPPRT BIT ON,REMOVE BIT, GO TO STEP 8; 00993000 * 5. REMOVE TYPPUN BIT IN GPR5, SET GPR6 TO ZERO, EXIT 00994000 * 6. IF GPR5 HAS CSQRDR BIT ON, LOAD GPR6 WITH ARSPRD, EXIT; 00995000 * 7. IF GPR5 HAS TYPPRT BIT ON, LOAD GPR6 WITH ARSPPR, EXIT; 00996000 * 8. IF GPR5 HAS TYPPUN BIT ON, LOAD GPR6 WITH ARSPPU,EXIT; 00997000 * 9. SET GPR6 = 0, EXIT 00998000 *. 00999000 SPACE 3 01000000 GETCHAIN EQU * HERE TO GET NEXT FILE CHAIN ANCHOR POINTER 01001000 SPACE 01002000 GC01 LTR R5,R5 FILE TYPE ZERO ?? 01003000 BNZ GC02 NO-- 01004000 SR R6,R6 YES - ZERO GPR6 01005000 BR R3 RETURN TO CALLER 01006000 SPACE 01007000 GC02 C R6,FFS 1ST TIME SWITCH ON ?? 01008000 LR R6,R5 SAVE DEVICE TYPE FOR CHANGE COMPARE 01009000 BE GC06 YES - DO NOT RESET ANY BITS, JUST 01010000 * LOAD GPR6 01011000 SPACE 01012000 GC03 N R5,=A(255-CSQRDR) REMOVE READER BIT 01013000 CR R6,R5 WAS IT ON ?? 01014000 BNE GC07 NO 01015000 SPACE 01016000 GC04 N R5,=A(255-TYPPRT) REMOVE PRINTER BIT 01017000 CR R6,R5 WAS IT ON ?? 01018000 BNE GC08 NO 01019000 SPACE 01020000 GC05 SR R5,R5 REMOVE PUNCH BIT 01021000 SR R6,R6 SET GPR6 TO ZERO 01022000 BR R3 RETURN TO CALLER - END OF CHAIN 01023000 SPACE 01024000 GC06 L R7,ARSPRD LOAD READER FILE CHAIN POINTER 01025000 * ANCHOR 01026000 EX R5,TMRDR READER BIT ON ?? 01027000 BCR 7,R3 YES - RETURN TO CALLER 01028000 SPACE 01029000 GC07 L R7,ARSPPR LOAD PRINTER FILE CHAIN POINTER 01030000 * ANCHOR 01031000 EX R5,TMPRT PRINTER BIT ON ?? 01032000 BCR 7,R3 YES - RETURN TO CALLER 01033000 SPACE 01034000 GC08 L R7,ARSPPU LOAD PUNCH FILE CHAIN POINTER ANCHOR 01035000 EX R5,TMPUN PUNCH BIT ON ?? 01036000 BCR 7,R3 YES - RETURN TO CALLER 01037000 SPACE 01038000 GC09 SR R6,R6 SET GPR6 = ZERO - ALL DONE 01039000 SR R7,R7 01040000 BR R3 RETURN TO CALLER 01041000 EJECT 01042000 **************************************** 01043000 * 01044000 * ERROR EXITS FROM DMKCSQ 01045000 * 01046000 **************************************** 01047000 SPACE 2 01048000 MSG003E EQU * HERE IF INVALID OPTION FOR THIS COMMAND 01049000 LA R2,003 ERROR MSG DMKCSQ003E 01050000 B EXIT8 EXIT TO ERROR MODULE 01051000 SPACE 2 01052000 MSG006E EQU * HERE IF DEVICE TYPE IS INVALID 01053000 LA R2,006 ERROR MSG DMKCSQ006E 01054000 LM R0,R1,SAVEWRK6 COUNT AND ADDRESS OF INVALID TYPE 01055000 B EXIT8 EXIT TO ERROR MODULE 01056000 SPACE 2 01057000 MSG007E EQU * HERE IF USERID IS INVALID 01058000 LA R2,007 ERROR MSG DMKCSQ007E 01059000 B EXIT8 01060000 SPACE 2 01061000 MSG013E EQU * HERE IF CONFLICTING OPTIONS 01062000 LA R2,013 ERROR MSG DMKCSQ013E 01063000 B EXIT8 01064000 SPACE 2 01065000 MSG020E EQU * HERE IF USERID IS MISSING OR INVALID 01066000 LA R2,020 ERROR MSG DMKCSQ020E 01067000 B EXIT8R1 EXIT TO ERROR MODULE 01068000 SPACE 2 01069000 MSG022E EQU * HERE IF VIRTUAL ADDRESS MISSING OR 01070000 * INVALID 01071000 LA R2,022 ERROR MSG DMKCSQ022E 01072000 B EXIT8R1 .. 01073000 SPACE 01074000 MSG028E EQU * HERE IF CLASS IS MISSING OR INVALID 01075000 LA R2,028 ERROR MSG DMKCSQ028E 01076000 B EXIT8R1 01077000 SPACE 01078000 MSG029E EQU * HERE IF FNAME FTYPE MISSING OR INVALID 01079000 LA R2,029 ERROR MSG DMKCSQ029E 01080000 B EXIT8R1 EXIT TO ERROR MODULE 01081000 SPACE 2 01082000 MSG030E EQU * HERE IF COPIES IS MISSING OR INVALID 01083000 LA R2,030 ERROR MSG DMKCSQ030E 01084000 B EXIT8R1 EXIT TO ERROR MODULE 01085000 SPACE 2 01086000 MSG032E EQU * HERE IF DISTCODE IS MISSING OR INVALID 01087000 LA R2,032 ERROR MSG DMKCSQ032E 01088000 B EXIT8R1 EXIT TO ERROR MODULE 01089000 SPACE 2 01090000 MSG040E EQU * HERE IF DEVICE DOES NOT EXIST 01091000 LA R2,040 ERROR MSG DMKCSQ040E 01092000 LM R0,R1,SAVEWRK6 COUNT AND ADDRESS OF OPTION 01093000 B EXIT8 01094000 SPACE 2 01095000 MSG053E EQU * HERE IF USERID NOT IN CP DIRECTORY 01096000 LA R2,053 ERROR MSG DMKCSQ053E 01097000 B EXIT8 01098000 EJECT 01099000 **************************************** 01100000 * 01101000 * FINAL EXIT BACK TO DMKCFM 01102000 * 01103000 **************************************** 01104000 SPACE 3 01105000 CSQEXIT EQU * HERE FOR NORMAL EXIT FROM DMKCSQ 01106000 SR R2,R2 CLEAR ERROR REGISTER 01107000 B EXIT1 NOW EXIT 01108000 SPACE 2 01109000 EXIT8R1 SR R1,R1 01110000 SR R0,R0 01111000 EXIT8 ICM R0,14,ID+3 MOVE IN MODULE ID 01112000 EXIT1 STM R0,R2,SAVEWRK5 SAVE CALL GPRS 01113000 L R1,SAVEWRK4 ADDRESS OF 24 BYTE AREA 01114000 LTR R1,R1 ADDRESS PRESENT ?? 01115000 BZ EXIT2 NO --- 01116000 LA R0,3 LENGTH OF AREA 01117000 CALL DMKFRET RETURN AREA TO FREE STORAGE 01118000 EXIT2 LM R0,R2,SAVEWRK5 RESTORE GPRS 01119000 LTR R2,R2 ERROR CODE PRESENT ?? 01120000 BNZ ERREXIT YES -- 01121000 EXIT EXIT NO ERROR 01122000 SPACE 01123000 ERREXIT CALL DMKERMSG EXIT TO MESSAGE MODULE 01124000 SPACE 01125000 * MODULE DMKERMSG WILL GIVE SVC16 AND RETURN CONTROL TO DMKCFM 01126000 EJECT 01127000 **************************************** 01128000 * 01129000 * MESSAGES AND CONSTANTS 01130000 * 01131000 **************************************** 01132000 SPACE 2 01133000 LTORG 01134000 EJECT 01135000 CSQRDR EQU X'20' 01136000 CSQCON EQU X'10' 01137000 SPACE 01138000 PSA , @V306638 01139000 COPY CONBUF @V306638 01140000 COPY DEVTYPES @V306638 01141000 COPY EQU @V306638 01142000 COPY IOBLOKS @V306638 01143000 COPY RBLOKS @V306638 01144000 COPY SAVE @V306638 01145000 COPY SPOOL @V306638 01146000 COPY UDIRECT @V306638 01147000 COPY VBLOKS @V306638 01148000 COPY VMBLOK @V306638 01149000 END 01150000