IOF TITLE 'DMKIOF (CP) VM/370 - RELEASE 6' 00001000 ISEQ 73,80 @VA03358 00002000 *************************************************************** 00003000 * 00004000 * MODULE NAME - 00005000 * 00006000 * DMKIOF 00007000 * 00008000 * CONTENTS - 00009000 * 00010000 * DMKIOFOB - RECORD OUTBOARD AND MISCELLENOUS DATA RECORDS 00011000 * DMKIOFVR - RECORD SVC 76 REQUEST RECORDS 00012000 * DMKIOFM1 - RECORD MACHINE CHECK RECORDS 00013000 * DMKIOFC1 - RECORD CHANNEL CHECK RECORDS 00014000 * DMKIOFIN - INITIALIZE POINTERS TO AVAILABLE RECORDING PAGES 00015000 * 00016000 * FUNCTION - 00017000 * 00018000 * THIS PAGABLE MODULE PROVIDES SUPPORT FOR RECORDING OUTBOARD 00019000 * (OBR), INBOARD (CCH), MACHINE CHECK (MCH) AND MISCELLANEOUS 00020000 * DATA (MDR) RECORDS TO THE PREDEFINED ERROR RECORDING 00021000 * CYLINDERS. IT ALSO INITIALIZE POINTERS TO THE AVAILABLE 00022000 * RECORDING PAGES AT IPL TIME AND WHEN THE RECORDING CYLINDERS 00023000 * ARE ERASE. 00024000 * 00025000 COPY OPTIONS @VA12116 00025100 SPACE 3 00026000 DMKIOF CSECT @VA03358 00027000 MODID DC CL8'DMKIOF' MODULE IDENTIFIER @V305435 00028000 SPACE 2 00029000 EXTRN DMKPGTVR,DMKRPAPT,DMKRPAGT,DMKPGTVG @VA03358 00030000 EXTRN DMKIOEES,DMKIOERP,DMKIOEMX,DMKSYSER @V5088AA 00031100 EXTRN DMKIOEIQ,DMKIOEMQ,DMKIOERQ,DMKIOENQ @VA03358 00032000 EXTRN DMKIOEVQ,DMKIOENI,DMKIOEEP,DMKIOECT @V5088AA 00033100 EXTRN DMKPTRUL,DMKIOECQ,DMKSTKCP @VA03358 00034000 EXTRN DMKERMSG,DMKIOESQ,DMKIOCVT @VA03757 00035000 SPACE 2 00036000 USING PSA,R0 SETUP ADDRESSABILITY FOR LOWCORE @VA03358 00037000 USING RECPAG,R2 SETUP ADDRESSABILITY FOR HEADER @VA03358 00038000 USING RDEVBLOK,R8 SETUP ADDRESSABILITY FOR RDEVBLOK@VA03358 00039000 USING SAVEAREA,R13 SETUP ADDRESSABILITY FOR SAVEAREA@VA03358 00040000 USING *,R12 SETUP ADDRESSABILITY FOR MODULE @VA03358 00041000 EJECT 00042000 ********************************************************************** 00043000 * 00044000 * SUBROUTINE NAME - 00045000 * 00046000 * DMKIOFOB 00047000 * 00048000 * FUNCTION - 00049000 * 00050000 * THIS SUBROUTINE BUILDS, FORMATS AND RECORDS OUTBOARD (OBR) 00051000 * AND MISCELLANEOUS DATA (MDR) RECORDS ONTO THE ERROR 00052100 * RECORDING CYLINDERS. 00053100 * 00054000 * ATTRIBUTES - 00055000 * 00056000 * SERIALLY REUSEABLE, PAGABLE, ENTERED VIA SVC 00057000 * 00058000 * ENTRY CONDITIONS - 00059000 * 00060000 * GR 6 = ADDRESS OF ERRBLOK 00061000 * GR 7 = SIZE OF ERRBLOK RECORD IN DOUBLEWORDS 00062000 * GR 8 = ADDRESS OF RDEVBLOK 00063000 * GR 11 = ADDRESS OF VMBLOK 00064000 * GR 12 = ADDRESS OF DMKIOFOB 00065000 * GR 13 = ADDRESS OF SAVE AREA 00066000 * 00067000 * EXIT CONDITIONS - 00068000 * 00069000 * NONE 00070000 * 00071000 * CALL TO OTHER ROUTINES - 00072000 * 00073000 * DMKFRET - TO RETURN ALLOCATED STORAGE FOR RECORD/CPEXBLOK 00074000 * DMKPGTVG - GET A VIRTUAL BUFFER PAGE 00075000 * DMKQCNWT - WRITE A MESSAGE TO THE OPERATOR 00076000 * DMKPGTVR - RELEASE A VIRTUAL BUFFER PAGE 00077000 * DMKRPAGT - READ A PAGE FROM THE RECORDING CYLINDER 00078000 * DMKRPAPT - WRITE PAGE RECORD TO RECORDING CYLINDER 00079000 * DMKPTRUL - UNLOCK RECORDING PAGE 00080000 * DMKPTRAN - LOCK RECORDING PAGE IN STORAGE 00081000 * DMKSTKCP - STACK CPEXBLOK TO GET NEXT REQUEST 00082000 * DMKERMSG - WRITE ERROR MESSAGES 00083000 * DMKIOCVT - CONVERT VM/370 DEVICE TYPE TO OS/VS DEVICE TYPE 00084000 * 00085000 * EXTERNAL REFERENCES - 00086000 * 00087000 * DMKIOERP - RECORDING IN PROGRESS FLAG 00088000 * DMKIOEMX - NO. OF PAGES (MAX) ON A CYLINDER 00089000 * DMKIOENI - NO. OF PAGES ON LAST CYL WHICH CORRESPONDS 00090100 * TO RECORDING AREA 90% FULL 00090200 * DMKIOEIQ - RECORDING QUE CHAIN FOR OBR/MDR RECORDS 00091000 * DMKIOESQ - QUE CHAIN FOR UPDATE REQUESTS 00092000 * DMKIOEES - ERROR RECORDING CYLINDERS FULL FLAG 00093100 * DMKIOERQ - RECORDING QUE CHAIN FOR ERASE REQUEST 00094000 * DMKIOEMQ - RECORDING QUE CHAIN FOR MCH RECORDS 00095000 * DMKIOECQ - RECORDING QUE CHAIN FOR CCH RECORDS 00096000 * DMKIOENQ - RECORDING QUE CHAIN FOR MDR SYNCHRONOUS RECORDS 00097000 * DMKIOEVQ - RECORDING QUE CHAIN FOR SVC 76 REQUESTS 00098000 * 00099000 * TABLES /WORK AREAS - 00100000 * 00101000 * ERRBLOK - CONTAINS DATA TO BUILD OBR/MDR 00102000 * 00103000 * NOTES - 00104000 * 00105000 * NONE 00106000 * 00107000 * REGISTER USAGE - 00108000 * 00109000 * GR14,15 LINKAGE REGISTERS 00110000 * GR12 = MODULE BASE REGISTER 00111000 * GR11 = VMBLOK ADDRESSABILITY 00112000 * GR 9 = WORK REGISTER 00113000 * GR 8 = RDEVBLOK ADDRESSABILITY 00114000 * GR 7 = SIZE OF THE RECORD IN DOUBLEWORDS 00115000 * GR 6 = ADDRESS OF THE RECORD 00116000 * GR 5 = SUBROUTINE BAL REGISTER 00117000 * GR0-4= WORK REGISTERS 00118000 * 00119000 * OPERATION - 00120000 * 00121000 * I. HANDLE RECORDING FOR OBR/MDR RECORDS 00122000 * 00123000 * 1. IF THE RECORDING CYLINDER IS FULL, RELEASE THE 00124000 * OBR/MDR RECORD AND SEND THE FULL CYLINDER ERROR 00125000 * MESSAGE (DMKIOF553E/DMKIOF551E) TO THE OPERATOR IF 00126000 * ONE HAS NOT BEEN SENT BEFORE. AFTERWARD, GO CHECK 00127000 * RECORDING QUES FOR OTHER REQUESTS. 00128000 * 00129000 * 2. IF THERE IS ALREADY A RECORDING PAGE IN STORAGE, 00130000 * BYPASS GETTING A VIRTUAL BUFFER PAGE AND RECORDING 00131000 * PAGE. IF RECORDING PAGE IS NOT IN STORAGE, CALL 00132000 * DMKPGTVG TO OBTAIN A VIRTUAL BUFFER PAGE, CALL 00133000 * DMKRPAGT TO READ A PAGE FROM THE RECORDING CYLINDER 00134000 * INTO STORAGE AND CALL DMKPTRAN TO LOCK RECORDING PAGE 00135000 * IN STORAGE. 00136000 * 00137000 * 3. DETERMINE IF ENOUGH SPACE IS AVAILABLE ON THE 00138000 * RECORDING PAGE FOR THE RECORD. IF NOT, GET ANOTHER 00139000 * PAGE FROM RECORDING CYLINDER AND TRY AGAIN. 00140000 * 00141000 * 4. FOR AN OBR RECORD, THE DEVICE TYPE WILL BE ALTERED 00142000 * TO AN OS DEVICE TYPE IN ORDER TO ALLOW DECODING BY 00143000 * CPEREP (A CALL TO DMKIOC) . 00144000 * 00145000 * 5. BUILD OBR/MDR RECORD USING THE ERRBLOK THEN 00146000 * MOVE THE OBR/MDR RECORD INTO AVAILABLE AREA 00147000 * IN THE RECORDING PAGE AND RELEASE THE ERRBLOK.. 00148000 * 00149000 * 6. IF RUNNING IN A VIRTUAL MACHINE, ISSUE AN SVC 76 00150000 * TO HAVE THE OBR/MDR RECORD ON THE REAL MACHINE 00151000 * RECORDING CYLINDER. IF THIS IS NOT A VIRTUAL 00152000 * MACHINE, UPDATE THE CONTROL HEADER IN THE RECORDING 00153000 * PAGE, TO POINT TO NEXT AVAILABLE AREA ON PAGE. 00154000 * 00155000 * 7. MOVE PAGE NUMBER INTO THE OBR/MDR PAGE FIELD AND 00156000 * RELEASE THE OBR/MDR RECORD. 00157000 * 00158000 * 8. ERASE QUE - IF AN ERASE REQUEST IS ON THE QUE, 00159000 * WRITE OUT LAST RECORDING PAGE TO RECORDING CYLINDER 00160000 * (IF NECESSARY), PUT NEXT REQUEST ON TOP OF QUE AND 00161000 * CALL DMKSTKCP TO STACK A CPEXBLOK TO RETURN TO 00162000 * DMKIOEFM. AFTERWARD, EXIT FROM RECORDER. IF ERASE QUE 00163000 * IS EMPTY, GO CHECK NEXT RECORDING QUE. 00164000 * 00165000 * 9. MACHINE CHECK RECORDING QUE - IF THERE IS A MACHINE 00166000 * CHECK REQUEST ON THE QUE, WRITE OUT LAST RECORDING 00167000 * PAGE (IF NECESSARY), PUT NEXT REQUEST ON TOP OF QUE 00168000 * AND CALL DMKSTKCP TO STACK A CPEXBLOK TO RETURN 00169000 * TO DMKIOEMC. AFTERWARD, EXIT FROM RECORDER. 00170000 * IF MACHINE CHECK QUE IS EMPTY, GO CHECK NEXT 00171000 * RECORDING QUE. 00172000 * 00173000 * 10. CHANNEL CHECK RECORDING QUE - IF THERE IS A CHANNEL 00174000 * CHECK REQUEST ON THE QUE, WRITE OUT LAST RECORDING 00175000 * PAGE TO RECORDING CYLINDER (IF NECESSARY), PUT 00176000 * NEXT REQUEST ON TOP OF QUE, GET POINTERS FOR THE 00177000 * NEXT RECORD, RELEASE THE CPEXBLOK AND GO TO CHANNEL 00178000 * CHECK'S SECTION OF RECORDER. IF CHANNEL CHECK QUE 00179000 * IS EMPTY, GO CHECK NEXT RECORDING QUE. 00180000 * 00181000 * 11. OBR/MDR RECORDING QUE - IF THERE IS A OBR/MDR 00182000 * REQUEST ON THE QUE, PUT THE NEXT REQUEST ON TOP OF 00183000 * QUE, GET POINTERS TO NEXT ERRBLOK, RELEASE 00184000 * THE CPEXBLOK AND GO TO OBR/MDR SECTION OF 00185000 * RECORDER. IF OBR/MDR QUE IS EMPTY, GO CHECK NEXT 00186000 * RECORDING QUE. 00187000 * 00188000 * 12. ENVIRONMENTAL RECORDING QUE - IF THERE AN MDR REQUEST 00189000 * ON THE QUE, PUT THE NEXT REQUEST ON TOP OF QUE 00190000 * AND CALL DMKSTKCP TO STACK CPEXBLOK TO RETURN TO 00191000 * DMKIOESD. AFTERWARD, EXIT FROM THE RECORDER. 00192000 * 00193000 * 13. SVC 76 RECORDING QUE - IF THERE IS AN SVC 76 00194000 * REQUEST ON THE QUE, PUT THE NEXT REQUEST ON TOP OF 00195000 * QUE, GET POINTERS TO THE NEXT RECORD, RELEASE 00196000 * THE CPEXBLOK AND GO TO SVC 76 SECTION OF 00197000 * RECORDER. IF THE SVC 76 QUE IS EMPTY, GO WRITE 00198000 * RECORDING PAGE BACK TO THE RECORDING CYLINDER BY 00199000 * CALLING DMKRPAPT (IF NECESSARY). AFTERWARD, 00200000 * UNLOCK AND RELEASE RECORDING PAGE 00201000 * AND VIRTUAL BUFFER PAGE. 00202000 * 00203000 * 14. STATISTICAL UPDATE QUE - IF THERE IS A UPDATE 00204000 * REQUEST ON THE QUE, PUT THE NEXT REQUEST ON THE TOP 00205000 * OF THE QUE, GET POINTERS TO NEXT ERRBLOK, RELEASE THE 00206000 * THE CPEXBLOK AND GO TO THE STATISTICAL UPDATE SECTION 00207000 * IF SDR QUEUE IS EMPTY GO CHECK 90% FULL CONDITION. 00208000 * 00209000 * 15. DETERMINE IF THE RECORDING CYLINDER IS 90% FULL. 00210000 * IF 90 % FULL, WRITE AN ERROR MESSAGE TO THE 00211000 * OPERATOR (DMKIOF552E/DMKIOF550E). 00212000 * 00213000 * 16. CLEAR THE MCH/CCH ENTRY FLAG AND THE RECORDING IN 00214000 * PROGRESS FLAG AND RETURN TO CALLER. 00215000 * 00216000 * ERROR MESSAGES - 00217000 * 00218000 * DMKIOF550E ERROR RECORDING AREA 90 PERCENT FULL; RUN CPEREP 00219100 * DMKIOF551E ERROR RECORDING AREA FULL; RUN CPEREP 00220100 * 00221000 **************************************************************** 00222000 EJECT 00223000 DMKIOFOB RELOC @VA03358 00224000 IOFOB EQU * HANDLE OBR/MDR RECORDS @VA03358 00225000 MVI MCCHFLAG,X'00' CLEAR MCH/CCH ENTRY FLAG @V5088AA 00225100 BAL R5,CHEKFULL CHECK CYLINDER FULL CONDITION @VA03358 00226000 BAL R5,OBRMDRBL GO BUILD OBR/MDR RECORD @VA03757 00227000 LR R3,R0 SAVE SIZE OF OBR/MDR @VA03757 00228000 LR R4,R1 SAVE ADDRESS OF OBR/MDR @VA03757 00229000 BAL R5,REGSETUP GET READY TO FRET ERRBLOK @VA03757 00230000 BAL R5,FRETRECD GO FRET ERRBLOK @VA03757 00231000 LR R6,R4 ADDRESS OF OBR/MDR @VA03757 00232000 LR R7,R3 GET SIZE IN DOUBLEWORDS @VA03757 00233000 SLL R7,3 CONVERT DOUBLEWORDS TO BYTES @VA03757 00234000 BAL R5,PAGEIN GET VIRT. BUFFER PAGE (IF NEEDED)@VA03358 00235000 BAL R5,CKOBROOM CHECK FOR ENOUGH ROOM FOR RECORD @VA03358 00236000 CLI 4(R6),X'91' IS THIS A MDR RECORD @VA03358 00237000 BE SKIPCALL YES, BYPASS GETTING DEVICE TYPE @VA03757 00238000 SPACE 00239000 CALL DMKIOCVT @VA03757 00240000 SPACE 00241000 SKIPCALL EQU * GO MOVE OBR/MDR @VA03757 00242000 BAL R5,SETUPOBR MOVE OBR/MDR REC. INTO VIRT. PAGE@VA03358 00243000 EJECT 00244000 ********************************************************************** 00245000 * 00246000 * SUBROUTINE NAME - 00247000 * 00248000 * DMKIOFVR 00249000 * 00250000 * FUNCTION - 00251000 * 00252000 * THIS SUBROUTINE RECORD OUTBOARD (OBR) AND MISCELLANEOUS DATA 00253000 * (MDR) RECORDS ONTO THE ERROR RECORDING CYLINDERS 00254100 * SVC 76 REQUESTS. 00255000 * 00256000 * ATTRIBUTES - 00257000 * 00258000 * SERIALLY REUSEABLE, PAGABLE, ENTERED VIA SVC 00259000 * 00260000 * ENTRY CONDITIONS - 00261000 * 00262000 * GR 6 = ADDRESS OF OBR/MDR RECORD 00263000 * GR 7 = SIZE OF OBR/MDR RECORD IN DOUBLEWORDS 00264000 * GR 8 = ADDRESS OF RDEVBLOK 00265000 * GR 11 = ADDRESS OF VMBLOK 00266000 * GR 12 = ADDRESS OF DMKIOFVR 00267000 * GR 13 = ADDRESS OF SAVE AREA 00268000 * 00269000 * EXIT CONDITIONS - 00270000 * 00271000 * NONE 00272000 * 00273000 * CALL TO OTHER ROUTINES - 00274000 * 00275000 * DMKFRET - TO RETURN ALLOCATED STORAGE FOR RECORD/CPEXBLOK 00276000 * DMKPGTVG - GET A VIRTUAL BUFFER PAGE 00277000 * DMKQCNWT - WRITE A MESSAGE TO THE OPERATOR 00278000 * DMKPGTVR - RELEASE A VIRTUAL BUFFER PAGE 00279000 * DMKRPAGT - READ A PAGE FROM THE RECORDING CYLINDER 00280000 * DMKRPAPT - WRITE PAGE RECORD TO RECORDING CYLINDER 00281000 * DMKPTRUL - UNLOCK RECORDING PAGE 00282000 * DMKPTRAN - LOCK RECORDING PAGE IN STORAGE 00283000 * DMKSTKCP - STACK CPEXBLOK TO GET NEXT REQUEST 00284000 * 00285000 * EXTERNAL REFERENCES - 00286000 * 00287000 * DMKIOERP - RECORDING IN PROGRESS FLAG 00288000 * DMKIOEMX - NO. OF PAGES (MAX) ON A CYLINDER 00289000 * DMKIOENI - NO. OF PAGES ON LAST CYL WHICH CORRESPONDS 00290100 * TO RECORDING AREA 90% FULL 00290200 * DMKIOEIQ - RECORDING QUE CHAIN FOR OBR/MDR RECORDS 00291000 * DMKIOEES - ERROR RECORDING CYLINDERS FULL FLAG 00292100 * DMKIOERQ - RECORDING QUE CHAIN FOR ERASE REQUEST 00293000 * DMKIOEMQ - RECORDING QUE CHAIN FOR MCH RECORDS 00294000 * DMKIOECQ - RECORDING QUE CHAIN FOR CCH RECORDS 00295000 * DMKIOENQ - RECORDING QUE CHAIN FOR MDR SYNCHRONOUS RECORDS 00296000 * DMKIOEVQ - RECORDING QUE CHAIN FOR SVC 76 REQUESTS 00297000 * 00298000 * TABLES /WORK AREAS - 00299000 * 00300000 * NONE 00301000 * 00302000 * NOTES - 00303000 * 00304000 * NONE 00305000 * 00306000 * REGISTER USAGE - 00307000 * 00308000 * GR14,15 LINKAGE REGISTERS 00309000 * GR12 = MODULE BASE REGISTER 00310000 * GR11 = VMBLOK ADDRESSABILITY 00311000 * GR 9 = WORK REGISTER 00312000 * GR 8 = RDEVBLOK ADDRESSABILITY 00313000 * GR 7 = SIZE OF THE RECORD IN DOUBLEWORDS 00314000 * GR 6 = ADDRESS OF THE RECORD 00315000 * GR 5 = SUBROUTINE BAL REGISTER 00316000 * GR0-4= WORK REGISTERS 00317000 * 00318000 * OPERATION - 00319000 * 00320000 * I. HANDLE RECORDING FOR SVC 76 REQUEST RECORDS 00321000 * 00322000 * 1. THE OPERATION SECTION FOR SVC76 REQUEST IS THE 00323000 * SAME AS THE OPERATIONS THAT ARE DESCRIBED 00324000 * UNDER DMKIOFOB OPERATIONS SECTION. 00325000 * 00328000 * ERROR MESSAGES - 00329000 * 00330000 * DMKIOF550E ERROR RECORDING AREA 90 PERCENT FULL; RUN CPEREP 00331100 * DMKIOF551E ERROR RECORDING AREA FULL; RUN CPEREP 00332100 * 00333000 **************************************************************** 00334000 EJECT 00335000 DMKIOFVR RELOC @VA03358 00336000 IOFVR EQU * HANDLE SVC 76 REQUESTS @VA03358 00337000 MVI MCCHFLAG,X'00' CLEAR MCH/CCH ENTRY FLAG @V5088AA 00337100 BAL R5,CHEKFULL CHECK CYLINDER FULL CONDITION @VA03358 00338000 BAL R5,PAGEIN GET VIRT. BUFFER PAGE (IF NEEDED)@VA03358 00339000 BAL R5,CKOBROOM CHECK FOR ENOUGH ROOM FOR RECORD @VA03358 00340000 CLI 4(R6),X'30' IS THIS AN OBR RECORD? @VA07413 00340110 BNE SETUPOBR NO, DO NOT CALL DMKIOCVT @VA07413 00340160 * CURRENTLY DMKIOCVT CAN ONLY HANDLE OBR-TYPE RECORDS 00340210 CALL DMKIOCVT @VA06287 00340300 SETUPOBR EQU * HANDLE OBR/MDR RECORDS @VA03358 00341000 BAL R3,MOVEREC MOVE OBR/MDR REC. INTO VIRT. PAGE@VA03358 00342000 BAL R5,SVC76FTN DETERMINE IF SVC 76 IS REQUIRED @VA03358 00343000 * IF YES BYPASS UPDATING CONTROL HEADER 00344000 BAL R5,UPDTHDR UPDATE CONTROL HEADER IN PAGE @VA03358 00345000 MVC CECYL(3),WORKCYL SAVE THE UPDATED CCP @V5088AA 00346100 BAL R5,FRETRECD RELEASE OBR/MDR RECORD @VA03358 00347000 BAL R5,RECDQUE GET NEXT REC. FROM RECORDING QUE @VA03358 00348000 EJECT 00349000 ********************************************************************** 00350000 * 00351000 * SUBROUTINE NAME - 00352000 * 00353000 * DMKIOFM1 00354000 * 00355000 * FUNCTION - 00356000 * 00357000 * THIS SUBROUTINE RECORD MACHINE CHECK (MCH) RECORDS ONTO THE 00358000 * ERROR RECORDING CYLINDERS 00359100 * 00360000 * ATTRIBUTES - 00361000 * 00362000 * SERIALLY REUSEABLE, PAGABLE, ENTERED VIA SVC 00363000 * 00364000 * ENTRY CONDITIONS - 00365000 * 00366000 * GR 6 = ADDRESS OF MCH RECORD 00367000 * GR 7 = SIZE OF OMCH RECORD IN DOUBLEWORDS 00368000 * GR 11 = ADDRESS OF VMBLOK 00369000 * GR 12 = ADDRESS OF DMKIOFM1 00370000 * GR 13 = ADDRESS OF SAVE AREA 00371000 * 00372000 * EXIT CONDITIONS - 00373000 * 00374000 * NONE 00375000 * 00376000 * CALL TO OTHER ROUTINES - 00377000 * 00378000 * DMKPGTVG - GET A VIRTUAL BUFFER PAGE 00379000 * DMKQCNWT - WRITE A MESSAGE TO THE OPERATOR 00380000 * DMKPGTVR - RELEASE A VIRTUAL BUFFER PAGE 00381000 * DMKRPAGT - READ A PAGE FROM THE RECORDING CYLINDER 00382000 * DMKRPAPT - WRITE PAGE RECORD TO RECORDING CYLINDER 00383000 * DMKPTRUL - UNLOCK RECORDING PAGE 00384000 * DMKPTRAN - LOCK RECORDING PAGE IN STORAGE 00385000 * DMKSTKCP - STACK CPEXBLOK TO GET NEXT REQUEST 00386000 * DMKERMSG - WRITE ERROR MESSAGES 00387000 * 00388000 * EXTERNAL REFERENCES - 00389000 * 00390000 * DMKIOERP - RECORDING IN PROGRESS FLAG 00391000 * DMKIOEMX - NO. OF PAGES (MAX) ON A CYLINDER 00392000 * DMKIOENI - NO. OF PAGES ON LAST CYL WHICH CORRESPONDS 00393100 * TO RECORDING AREA 90% FULL 00393200 * DMKIOEIQ - RECORDING QUE CHAIN FOR OBR/MDR RECORDS 00394000 * DMKIOEES - ERROR RECORDING CYLINDERS FULL FLAG 00395100 * DMKIOERQ - RECORDING QUE CHAIN FOR ERASE REQUEST 00396000 * DMKIOEMQ - RECORDING QUE CHAIN FOR MCH RECORDS 00397000 * DMKIOECQ - RECORDING QUE CHAIN FOR CCH RECORDS 00398000 * DMKIOENQ - RECORDING QUE CHAIN FOR MDR SYNCHRONOUS RECORDS 00399000 * DMKIOEVQ - RECORDING QUE CHAIN FOR SVC 76 REQUESTS 00400000 * 00401000 * TABLES /WORK AREAS - 00402000 * 00403000 * NONE 00404000 * 00405000 * NOTES - 00406000 * 00407000 * NONE 00408000 * 00409000 * REGISTER USAGE - 00410000 * 00411000 * GR14,15 LINKAGE REGISTERS 00412000 * GR12 = MODULE BASE REGISTER 00413000 * GR11 = VMBLOK ADDRESSABILITY 00414000 * GR 9 = WORK REGISTER 00415000 * GR 7 = SIZE OF THE RECORD IN DOUBLEWORDS 00416000 * GR 6 = ADDRESS OF THE RECORD 00417000 * GR 5 = SUBROUTINE BAL REGISTER 00418000 * GR0-4= WORK REGISTERS 00419000 * 00420000 * OPERATION - 00421000 * 00422000 * I. HANDLE RECORDING FOR MCH/CCH RECORDS 00423000 * 00424000 * 1. IF THE RECORDING CYLINDER IS FULL, RELEASE THE 00425000 * CCH RECORD AND SEND THE FULL CYLINDER ERROR 00426000 * MESSAGE (DMKIOF553E/DMKIOF551E) TO THE OPERATOR IF 00427000 * ONE HAS NOT BEEN SENT BEFORE. AFTERWARD, GO CHECK 00428000 * RECORDING QUES FOR OTHER REQUESTS. 00429000 * 00430000 * 2. IF THERE IS ALREADY A RECORDING PAGE IN STORAGE, 00431000 * BYPASS GETTING A VIRTUAL BUFFER PAGE AND RECORDING 00432000 * PAGE. IF RECORDING PAGE IS NOT IN STORAGE, CALL 00433000 * DMKPGTVG TO OBTAIN A VIRTUAL BUFFER PAGE, CALL 00434000 * DMKRPAGT TO READ A PAGE FROM THE RECORDING CYLINDER 00435000 * INTO STORAGE AND CALL DMKPTRAN TO LOCK RECORDING PAGE 00436000 * IN STORAGE. 00437000 * 00438000 * 3. DETERMINE IF ENOUGH SPACE IS AVAILABLE ON THE 00439000 * RECORDING PAGE FOR THE RECORD. IF NOT, GET ANOTHER 00440000 * PAGE FROM RECORDING CYLINDER AND TRY AGAIN. 00441000 * 00442000 * 4. MOVE THE MCH/CCH RECORD INTO AVAILABLE AREA 00443000 * IN THE RECORDING PAGE. 00444000 * 00445000 * 5. MOVE PAGE NUMBER INTO THE MCH/CCH PAGE FIELD AND 00446000 * RELEASE THE CCH RECORD. 00447000 * 00448000 * 6. WRITE RECORDING PAGE BACK TO THE RECORDING CYLINDER 00449000 * BY CALLING DMKRPAPT. AFTERWARD, UNLOCK AND RELEASE 00450000 * RECORDING PAGE AND VIRTUAL BUFFER PAGE. 00451000 * 00452000 * 7. ERASE QUE - IF AN ERASE REQUEST IS ON THE QUE, 00453000 * WRITE OUT LAST RECORDING PAGE TO RECORDING CYLINDER 00454000 * (IF NECESSARY), PUT NEXT REQUEST ON TOP OF QUE AND 00455000 * CALL DMKSTKCP TO STACK A CPEXBLOK TO RETURN TO 00456000 * DMKIOEFM. AFTERWARD, EXIT FROM RECORDER. IF ERASE QUE 00457000 * IS EMPTY, GO CHECK NEXT RECORDING QUE. 00458000 * 00459000 * 8. MACHINE CHECK RECORDING QUE - IF THERE IS A MACHINE 00460000 * CHECK REQUEST ON THE QUE, WRITE OUT LAST RECORDING 00461000 * PAGE (IF NECESSARY), PUT NEXT REQUEST ON TOP OF QUE 00462000 * AND CALL DMKSTKCP TO STACK A CPEXBLOK TO RETURN 00463000 * TO DMKIOEMC. AFTERWARD, EXIT FROM RECORDER. 00464000 * IF MACHINE CHECK QUE IS EMPTY, GO CHECK NEXT 00465000 * RECORDING QUE. 00466000 * 00467000 * 9. CHANNEL CHECK RECORDING QUE - IF THERE IS A CHANNEL 00468000 * CHECK REQUEST ON THE QUE, WRITE OUT LAST RECORDING 00469000 * PAGE TO RECORDING CYLINDER (IF NECESSARY), PUT 00470000 * NEXT REQUEST ON TOP OF QUE, GET POINTERS FOR THE 00471000 * NEXT RECORD, RELEASE THE CPEXBLOK AND GO TO CHANNEL 00472000 * CHECK'S SECTION OF RECORDER. IF CHANNEL CHECK QUE 00473000 * IS EMPTY, GO CHECK NEXT RECORDING QUE. 00474000 * 00475000 * 10. OBR/MDR RECORDING QUE - IF THERE IS A OBR/MDR 00476000 * REQUEST ON THE QUE, PUT THE NEXT REQUEST ON TOP OF 00477000 * QUE, GET POINTERS TO NEXT OBR/MDR RECORD, RELEASE 00478000 * THE CPEXBLOK AND GO TO OBR/MDR SECTION OF 00479000 * RECORDER. IF OBR/MDR QUE IS EMPTY, GO CHECK NEXT 00480000 * RECORDING QUE. 00481000 * 00482000 * 11. ENVIRONMENTAL RECORDING QUE - IF THERE AN MDR REQUEST 00483000 * ON THE QUE, PUT THE NEXT REQUEST ON TOP OF QUE 00484000 * AND CALL DMKSTKCP TO STACK CPEXBLOK TO RETURN TO 00485000 * DMKIOESD. AFTERWARD, EXIT FROM THE RECORDER. 00486000 * 00487000 * 12. SVC 76 RECORDING QUE - IF THERE IS AN SVC 76 00488000 * REQUEST ON THE QUE, PUT THE NEXT REQUEST ON TOP OF 00489000 * QUE, GET POINTERS TO THE NEXT RECORD, RELEASE 00490000 * THE CPEXBLOK AND GO TO SVC 76 SECTION OF 00491000 * RECORDER. IF THE SVC 76 QUE IS EMPTY, GO WRITE 00492000 * RECORDING PAGE BACK TO THE RECORDING CYLINDER BY 00493000 * CALLING DMKRPAPT (IF NECESSARY). AFTERWARD, 00494000 * UNLOCK AND RELEASE RECORDING PAGE 00495000 * AND VIRTUAL BUFFER PAGE. 00496000 * 00497000 * 13. DETERMINE IF THE RECORDING CYLINDER IS 90 % FULL. 00498000 * IF 90 % FULL, WRITE AN ERROR MESSAGE TO THE 00499000 * OPERATOR (DMKIOF552E/DMKIOF550E). 00500000 * 00501000 * 14. CLEAR THE MCH/CCH ENTRY FLAG AND THE RECORDING IN 00502000 * PROGRESS FLAG AND RETURN TO CALLER. 00503000 * 00504000 * ERROR MESSAGES - 00505000 * 00506000 * DMKIOF550E ERROR RECORDING AREA 90 PERCENT FULL; RUN CPEREP 00507100 * DMKIOF551E ERROR RECORDING AREA FULL; RUN CPEREP 00508100 * 00509000 **************************************************************** 00510000 EJECT 00511000 DMKIOFM1 RELOC @VA03358 00512000 MVI MCCHFLAG,MCHFLAG SET MCH ENTRY INDICATOR @VA03358 00513000 BAL R5,SETUPMCH MOVE MCH/CCH REC. INTO VIRT. PAGE@VA03358 00514000 EJECT 00515000 ********************************************************************** 00516000 * 00517000 * SUBROUTINE NAME - 00518000 * 00519000 * DMKIOFC1 00520000 * 00521000 * FUNCTION - 00522000 * 00523000 * THIS SUBROUTINE RECORD CHANNEL CHECK (CCH) RECORDS ONTO THE 00524000 * ERROR RECORDING CYLINDERS 00525100 * 00526000 * ATTRIBUTES - 00527000 * 00528000 * SERIALLY REUSEABLE, PAGABLE, ENTERED VIA SVC 00529000 * 00530000 * ENTRY CONDITIONS - 00531000 * 00532000 * GR 6 = ADDRESS OF CCH RECORD 00533000 * GR 7 = SIZE OF CCH RECORD IN DOUBLEWORDS 00534000 * GR 11 = ADDRESS OF VMBLOK 00535000 * GR 12 = ADDRESS OF DMKIOFC1 00536000 * GR 13 = ADDRESS OF SAVE AREA 00537000 * 00538000 * EXIT CONDITIONS - 00539000 * 00540000 * NONE 00541000 * 00542000 * CALL TO OTHER ROUTINES - 00543000 * 00544000 * DMKFRET - TO RETURN ALLOCATED STORAGE FOR RECORD/CPEXBLOK 00545000 * DMKPGTVG - GET A VIRTUAL BUFFER PAGE 00546000 * DMKQCNWT - WRITE A MESSAGE TO THE OPERATOR 00547000 * DMKPGTVR - RELEASE A VIRTUAL BUFFER PAGE 00548000 * DMKRPAGT - READ A PAGE FROM THE RECORDING CYLINDER 00549000 * DMKRPAPT - WRITE PAGE RECORD TO RECORDING CYLINDER 00550000 * DMKPTRUL - UNLOCK RECORDING PAGE 00551000 * DMKPTRAN - LOCK RECORDING PAGE IN STORAGE 00552000 * DMKSTKCP - STACK CPEXBLOK TO GET NEXT REQUEST 00553000 * DMKERMSG - WRITE ERROR MESSAGES 00554000 * 00555000 * EXTERNAL REFERENCES - 00556000 * 00557000 * DMKIOERP - RECORDING IN PROGRESS FLAG 00558000 * DMKIOEMX - NO. OF PAGES (MAX) ON A CYLINDER 00559000 * DMKIOENI - NO. OF PAGES ON LAST CYL WHICH CORRESPONDS 00560100 * TO RECORDING AREA 90% FULL 00560200 * DMKIOEIQ - RECORDING QUE CHAIN FOR OBR/MDR RECORDS 00561000 * DMKIOEES - ERROR RECORDING CYLINDERS FULL FLAG 00562100 * DMKIOERQ - RECORDING QUE CHAIN FOR ERASE REQUEST 00563000 * DMKIOEMQ - RECORDING QUE CHAIN FOR MCH RECORDS 00564000 * DMKIOECQ - RECORDING QUE CHAIN FOR CCH RECORDS 00565000 * DMKIOENQ - RECORDING QUE CHAIN FOR MDR SYNCHRONOUS RECORDS 00566000 * DMKIOEVQ - RECORDING QUE CHAIN FOR SVC 76 REQUESTS 00567000 * 00568000 * TABLES /WORK AREAS - 00569000 * 00570000 * NONE 00571000 * 00572000 * NOTES - 00573000 * 00574000 * NONE 00575000 * 00576000 * REGISTER USAGE - 00577000 * 00578000 * GR14,15 LINKAGE REGISTERS 00579000 * GR12 = MODULE BASE REGISTER 00580000 * GR11 = VMBLOK ADDRESSABILITY 00581000 * GR 9 = WORK REGISTER 00582000 * GR 7 = SIZE OF THE RECORD IN DOUBLEWORDS 00583000 * GR 6 = ADDRESS OF THE RECORD 00584000 * GR 5 = SUBROUTINE BAL REGISTER 00585000 * GR0-4= WORK REGISTERS 00586000 * 00587000 * OPERATION - 00588000 * 00589000 * I. HANDLE RECORDING FOR CCH RECORDS 00590000 * 00591000 * 1. THE OPERATION SECTION FOR CHANNEL CHECK RECORDING IS 00592000 * THE SAME AS THE OPERATIONS DESCRIBE UNDER DMKIOFM1 00593000 * OPERATION'S SECTION. 00594000 * 00595000 * ERROR MESSAGES - 00596000 * 00597000 * DMKIOF550E ERROR RECORDING AREA 90 PERCENT FULL; RUN CPEREP 00598100 * DMKIOF551E ERROR RECORDING AREA FULL; RUN CPEREP 00599100 * 00600000 **************************************************************** 00601000 EJECT 00602000 DMKIOFC1 RELOC @VA03358 00603000 IOFC1 EQU * HANDLE CHANNEL CHECK RECORDS @VA03358 00604000 MVI MCCHFLAG,CCHFLAG SET CCH ENTRY INDICATOR @VA03358 00605000 SETUPMCH EQU * HANDLE MCH/CCH RECORD @VA03358 00606000 BAL R5,CHEKFULL CHECK FOR RECORDING AREA FULL @V5088AA 00607100 BAL R5,PAGEIN GET VIRT. BUFFER PAGE (IF NEEDED)@VA03358 00608000 BAL R5,CKOBROOM CHECK FOR ENOUGH ROOM FOR RECORD @VA03358 00609000 BAL R3,MOVEREC MOVE MCH/CCH REC. INTO VIRT. PAGE@VA03358 00610000 BAL R5,UPDTHDR UPDATE CONTROL HEADER IN PAGE @VA03358 00611000 CLI MCCHFLAG,CCHFLAG IS THIS A CCH ENTRY @VA03358 00612000 BNE *+8 NO, BYPASS RELEASING THE RECORD @VA03358 00613000 BAL R5,FRETRECD RELEASE CCH RECORD SPACE @VA03358 00614000 MVC CECYL(3),WORKCYL SET RECORDING CCP VALUE @V5088AA 00615100 BAL R9,REALWRT WRITE VIRTUAL PAGE BACK TO DISK @VA03358 00616000 BAL R3,PAGREL UNLOCK AND RELEASE VIRTUAL PAGE @VA03358 00617000 SPACE 3 00618000 * 00619000 * CHECK THE RECORDING QUES FOR ANY OUTSTANDING REQUESTS FROM 00620000 * MCH / CCH / OBR / MDR / ERASE REQUEST OR SVC 76 REQUEST. 00621000 * 00622000 SPACE 1 00623000 RECDQUE EQU * CHECK RECORDING QUES @VA03358 00624000 BAL R5,WRITPAG WRITE RECORD PAGE BACK TO DISK @VA05146 00624100 BAL R5,ERASEQ CHECK THE ERASE REQUEST QUE @VA03358 00625000 BAL R5,MCHQ CHECK MACHINE CHECK RECORDING QUE@VA03358 00626000 BAL R5,CCHQ CHECK CHANNEL CHECK RECORDING QUE@VA03358 00627000 BAL R5,OBRQ CHECK THE OUTBOARD RECORDING QUE @VA03358 00628000 BAL R5,ENVQ CHECK ENVIRONMENTAL RECORDING QUE@VA03358 00629000 BAL R5,SVC76Q CHECK THE SVC 76 RECORDING QUE @VA03358 00630000 BAL R5,STATQ CHECK COUNTER UPDATE QUEUE @VA03757 00632000 CLC WORKCYL(3),AREA90PC IS RECORDING AREA 90% FULL? @V5088AA 00633100 BNE *+8 NO, BYPASS SENDING MSG. TO OPER. @VA03358 00634000 BAL R4,MSG90PC CHECK CYLINDER FOR 90 % FULL @VA03358 00635000 RESETERP EQU * @VA04803 00636100 MVI MCCHFLAG,X'00' RESET MCH/CCH ENTRY FLAG @VA04803 00636200 L R5,=V(DMKIOERP) ADDR OF REC. IN PROGRESS FLAG @VA04803 00636300 MVI 0(R5),X'00' CLEAR RECORDING IN PROGRESS FLAG @VA04803 00636400 RETEXIT EQU * EXIT TO CALLER @VA04803 00636500 EXIT @VA04803 00636600 EJECT 00637000 ********************************************************************** 00638000 * 00639000 * SUBROUTINE NAME - 00640000 * 00641000 * DMKIOFIN 00642000 * 00643000 * FUNCTION - 00644000 * 00645000 * THIS SUBROUTINE INITIALIZE POINTERS TO AVAILABLE RECORDING 00646000 * PAGES AT IPL TIME AND AFTER AN ERASE HAS BEEN COMPLETED. 00647000 * 00648000 * ATTRIBUTES - 00649000 * 00650000 * SERIALLY REUSEABLE, PAGABLE, ENTERED VIA SVC 00651000 * 00652000 * ENTRY CONDITIONS - 00653000 * 00654000 * GR 12 = ADDRESS OF DMKIOFOB 00655000 * GR 13 = ADDRESS OF SAVE AREA 00656000 * 00657000 * EXIT CONDITIONS - 00658000 * 00659000 * NONE 00660000 * 00661000 * CALL TO OTHER ROUTINES - 00662000 * 00663000 * NONE 00664000 * 00665000 * EXTERNAL REFERENCES - 00666000 * 00667000 * DMKIOERP - RECORDING IN PROGRESS FLAG 00668000 * DMKIOEMX - NO. OF PAGES (MAX) ON A CYLINDER 00669000 * DMKIOENI - NO. OF PAGES ON LAST CYL. WHICH CORRESPONDS 00670100 * TO RECORDING AREA 90% FULL 00670200 * DMKIOEEP - ERROR RECORDING CCP (CYL + PAGE) 00671100 * DMKIOERP - RECORDING IN PROGRESS FLAG 00673000 * 00674000 * TABLES /WORK AREAS - 00675000 * 00676000 * NONE 00677000 * 00678000 * NOTES - 00679000 * 00680000 * NONE 00681000 * 00682000 * REGISTER USAGE - 00683000 * 00684000 * GR14,15 LINKAGE REGISTERS 00685000 * GR12 = MODULE BASE REGISTER 00686000 * GR0-5= WORK REGISTERS 00687000 * 00688000 * OPERATION - 00689000 * 00690000 * I. HANDLE INITIALIZING INCORE POINTERS IN RECORDER 00691000 * 00692000 * 1. PICK UP THE ERROR RECORDING CYLINDER THAT WAS 00693000 * SPECIFIED AT SYSTEM GENERATION TIME AND THE DEVICE 00694000 * CODE TYPE FOR THE ERROR RECORDING DEVICE FROM 00695000 * DMKIOEEP. 00696100 * 00697000 * 2. PICK UP THE NUMBER OF CYLINDERS FROM DMKIOECT 00698100 * AND CALCULATE THE ENDING CYLINDER ADDRESS. 00699100 * 00700000 * 3. PICK UP MAXIMUN PAGE NUMBER FOR RECORDING CYLINDER 00701000 * FROM DMKIOEMX. 00702000 * 00703000 * 4. PICK UP PAGE VALUE FOR 90% AREA FULL 00704100 * FROM DMKIOENI. 00705000 * 00706000 * 5. INITIALIZE ALL CONSTANTS IN RECORDER. 00707000 * 00708000 * 6. RETURN TO CALLER. 00709000 * 00710000 **************************************************************** 00711000 EJECT 00712000 DMKIOFIN RELOC @VA03358 00713000 L R5,=V(DMKIOEEP) GET @ OF RECORDING AREA CCPD @V5088AA 00714100 MVC CECYL(4),0(R5) MOVE CCPD VALUE IN OBR/MDR FIELD @VA03358 00715000 IC R5,CECYLTYP GET PAGING DEVICE CODE TYPE @VA03358 00716000 STC R5,WORKTYP SAVE DEV. CODE TYPE IN WORK AREA @VA03358 00717000 L R5,=V(DMKIOECT) GET @ OF COUNT OF RECORDING CYLS@V5088AA 00717100 LH R5,0(R5) RETRIEVE NUMBER OF RECORDING CYLS@V5088AA 00717200 L R3,=V(DMKSYSER) GET ADDRESS OF REC. AREA START @V5088AA 00717300 LH R3,0(R3) RETRIEVE REC. AREA STARTING CYL. @V5088AA 00717400 AR R5,R3 ADD STARTING CYLINDER + NO. CYLS @V5088AA 00718100 BCTR R5,0 SUBTRACT ONE FOR END ADDRESS @V5088AA 00719100 STH R5,LASTCYL SAVE ADDRESS OF LAST CYLINDER @V5088AA 00720100 L R5,=V(DMKIOEMX) ADDR. OF MAX. NO. OF PAGES-CYL @VA03358 00721000 MVC MAXPAGE(1),0(R5) SAVE MAX. NO. OF PAGES/CYL @VA03358 00722000 L R5,=V(DMKIOENI) GET NUMBER OF PAGES/CYLINDER @VA03358 00723000 MVC PAG90PC(1),0(R5) THAT REPRESENTS 90 % OF MAX. @VA03358 00724000 MVI FLAG90PC,X'00' RESET FLAGS FOR MCH/CCH & OBR/MDR@VA03358 00725000 BAL R5,RECDQUE GET NEXT RECORD FROM RECORDING @VA04803 00731500 * QUEUE 00731600 EJECT 00732000 ****************************************************************** 00733000 * 00734000 * SUBROUTINE NAME 00735000 * 00736000 * DMKIOFST 00737000 * 00738000 * FUNCTION 00739000 * 00740000 * GET STORAGE FOR SDRBLOK, UPDATE STATISTICAL COUNTERS 00741000 * IN THE SDRBLOK 00742000 * 00743000 * ATTRIBUTES 00744000 * 00745000 * SERIALLY REUSABLE, PAGABLE, ENTERED VIA SVC 00746000 * 00747000 * ENTRY CONDITIONS 00748000 * 00749000 * GR 6 = ADDRESS OF ERRBLOK 00750000 * GR 7 = SIZE OF ERRBLOK 00751000 * GR 8 = ADDRESS OF RDEVBLOK 00752000 * GR 13 = ADDRESS OF SAVE AREA 00753000 * 00754000 * EXIT CONDITIONS 00755000 * 00756000 * NONE 00757000 * 00758000 * EXTERNAL REFERENCES 00759000 * 00760000 * DMKIOERP - RECORDING IN PROGRESS FLAG 00761000 * DMKIOESQ - RECORDING QUEUE FOR UPDATE REQUESTS 00762000 * 00763000 * CALLS TO OTHER ROUTINES 00764000 * 00765000 * DMKFREE - TO ALLOCATE FREE STORAGE FOR SDRBLOK 00766000 * 00767000 * NOTES 00768000 * 00769000 * THIS ROUTINE GETS CONTROL FOR THE PURPOSE OF UPDATING 00770000 * THE SDR COUNTERS. THE FOLLOWING MODULES ARE RESPONSIBILE 00771000 * FOR THE CALL TO THIS ROUTINE.. 00772000 * 00773000 * DMKBSC 00774000 * DMKCNS 00775000 * DMKDAS 00776000 * DMKGRF 00777000 * DMKTAP 00778000 * DMKRSE 00779000 * 00780000 * TABLES/WORK AREAS 00781000 * 00782000 * ERRBLOK - CONTAIN INFORMATION NEEDED TO UPDATE COUNTERS 00783000 * SDRCTRS - KEEP COUNT OF SPECIFIC ERRORS 00784000 * BITABL - THE MASK TABLE 00785000 * 00786000 * OPERATION 00787000 * 00788000 * 00789000 * 00790000 * 00791000 * 00792000 * 00793000 * 00794000 ********************************************************************** 00795000 EJECT 00796000 DMKIOFST RELOC HANDLE @VA03757 00797000 USING IOERBLOK,R4 ADDRESSIBILITY FOR IOERBLOK @VA03757 00798000 USING SDRBLOK,R9 ADDRESSABILITY FOR SDRBLOK @VA03757 00799000 USING ERRBLOK,R10 ADDRESSABILITY FOR ERRBLOK @VA03757 00800000 USING VMBLOK,R11 ADDRESSIBILITY FOR VMBLOK @VA03757 00801000 IOFST EQU * DO COUNTER UPDATE FUNCTION @VA03757 00802000 LR R10,R6 GET ADDRESS OF PASSED BLOCK @VA03757 00803000 LA R10,4(0,R10) POINT TO REAL ERRBLOK @VA03757 00804000 LA R4,ERRIOER GET ADDRESS OF IOERBLOK @VA03757 00805000 LA R8,0(,R8) BE SURE OF HI-ORDER BYTE @VA03757 00806000 ICM R9,15,RDEVCTRS GET ADDRESS OF SDRBLOK @VA03757 00807000 BZ GETSDRBK BRANCH IF WE DON'T HAVE ONE @VA03757 00808000 C R8,SDRRDEV DOES THE SDRBLOK POINT BACK TO @VA03757 00809000 * THE RDEVBLOK ??? IT BETTER 00810000 BE CKPARM IT DOES @VA03757 00811000 ENTRYERR BAL R5,ERREXIT EXIT FROM MODULE @VA03757 00812000 CKPARM LA R6,ERRPARM GET ADDRESS OF PARAMETER STRING @VA03757 00813000 CLI 0(R6),ZERO WAS A PARM STRING PASSED ?? @VA03757 00814000 BE SDRDASD NO, SO GO GET ONE @VA03757 00815000 SPACE 00816000 SETUPSDR EQU * @VA03757 00817000 LA R5,IOERDATA GET ADDRESS OF SENSE INFO @VA03757 00818000 LA R7,SDRCTRS GET ADDRESS OF COUNTERS @VA03757 00819000 USING IOERDATA,R5 ADDRESSABILITY FOR SENSE INFO @VA03757 00820000 USING PARMLST,R6 ADDRESSABILITY FOR PARAMETER LIST@VA03757 00821000 USING SDRCTRS,R7 ADDRESSABILITY FOR COUNTERS @VA03757 00822000 NI ERRSDR,X'FF'-(SDRMAX+SDRSHRT+SDRRECD) RESET FLG @VA03757 00823000 MVI SDRPRMCT,ZERO CLEAR PARAMETER COUNTER @VA03757 00824000 MVI SDROVFWK,OVFLMSK SET UP OVERFLOW MASK @VA03757 00825000 ANALPARM EQU * @VA03757 00826000 MVI SDRFLCT,ZERO RESET FULL BYTE COUNTER SWITCH @VA03757 00827000 SR R1,R1 *** CLEAR THE *** @VA03757 00828000 SR R2,R2 *** WORK REGS *** @VA03757 00829000 SPACE 00830000 * EXAMINE THE PARAMETER LIST, ONE BYTE AT A TIME, 00831000 * FIRST CHECKING TO SEE IF IT IS A SPECIAL CHARACTER, 00832000 * IF NOT ,IT WILL BE HANDLED AS SENSE DATA.. 00833000 SPACE 00834000 CLI PARMLST,X'FF' LAST PARAMETER IN THE LIST ?? @VA03757 00835000 BE STATEXIT YES, WE ARE ALL DONE @VA03757 00836000 CLI ERRSDR,SDRMAX MAX NO. OF COUNTERS REACHED @VA03757 00837000 BO COUNTERR YES, GO TO ERROR EXIT @VA03757 00838000 CLI PARMLST,X'3F' CHECK FOR CHANNEL DATA CHECK ? @VA03757 00839000 BE CHLDATCK YES, GO CHECK FOR C D C @VA03757 00840000 CLI PARMLST,X'1F' FULL BYTE COUNTER ?? @VA03757 00841000 BNE BYPASS04 NO,CONTINUE CHECKING @VA03757 00842000 BAL R3,FULBYTEN GO UPDATE POINTERS AND TURN ON @VA03757 00843000 * FULL BYTE SWITCH 00844000 BYPASS04 LA R3,ANALPARM SET UP RETURN @VA03757 00845000 CLI PARMLST,X'0F' NOP PARM ?? @VA03757 00846000 BE UPDTEPTR YES, UPDATE POINTERS @VA03757 00847000 CLI PARMLST,X'2F' DEVICE DEPENDENT COUNTER UPDATE??@VA03757 00848000 BE UPDTECNT YES, UPDATE COUNTERS @VA03757 00849000 SPACE 00850000 *** THE PARAMETER BYTE HAS THE SENSE BYTE INDEX 00851000 *** IN THE FOUR HI-ORDER BITS, THE FOUR LO-ORDER BITS 00852000 *** WILL HAVE THE SENSE BIT THAT WE ARE TESTING FOR, 00853000 *** IT IS USED AS AN INDEX TO GET THE SENSE BYTE MASK. 00854000 SPACE 00855000 SENTST EQU * @VA03757 00856000 IC R1,PARMLST GET THE PARAMETER BYTE @VA03757 00857000 SRL R1,4 CLEAR THE BIT INDEX @VA03757 00858000 AR R1,R5 REG 1 WILL HAVE THE ADDR OF THE @VA03757 00859000 * SENSE BYTE FOR THE EXECUTED INSTRUCTION 00860000 IC R2,PARMLST USE SENSE BIT INDEX THIS TIME @VA03757 00861000 N R2,F15 SAVE 4 LO-ORDER BITS @VA03757 00862000 CL R2,F7 A VALID PARM ??? @VA03757 00863000 BNH PARMOK YES, CONTINUE @VA03757 00864000 BAL R5,ERREXIT NO, EXIT @VA03757 00865000 PARMOK EQU * @VA03757 00866000 IC R2,BITABL(R2) REG 2 WILL CONTAIN THE MASK BYTE@VA03757 00867000 * FOR THE EXECUTED INSTRUCTION 00868000 EX R2,TSTSENSE GO TEST DESIRED SENSE BIT @VA03757 00869000 BZ UPDTEPTR BRANCH, IF THE SENSE BIT IS OFF, @VA03757 00870000 * TO UPDATE THE POINTERS, THEN 00871000 * EXAMINE THE NEXT PARAMETER BYTE.. 00872000 SPACE 00873000 SPACE 00874000 * *** THE SENSE BIT IS ON *** 00875000 SENBITON EQU * @VA03757 00876000 CLI PARMLST,DATCHK IS IT A DATA CHECK ?? @VA03757 00877000 BE DATACK YES, GO CHECK WHETHER A @VA03757 00878000 * READ/WRITE 00879000 SPACE 00880000 * *** INCREMENT THE COUNTER *** 00881000 SPACE 00882000 UPDTECNT EQU * @VA03757 00883000 IC R2,SDRCTRS PICK UP THE COUNTER @VA03757 00884000 IC R1,SDROVFWK PICK UP OVERFLOW MASK @VA03757 00885000 N R1,ANDMASK ANDMASK = '00000011' @VA03757 00886000 AR R1,R2 UPDATE THE COUNTER @VA03757 00887000 STC R1,SDRCTRS PUT IT BACK @VA03757 00888000 SPACE 00889000 * *** CHECK FOR OVERFLOW *** 00890000 SPACE 00891000 OC SDRFLCT(1),SDROVFWK OR THE OVERFLOW MASK @VA03757 00892000 * AND THE FULL BYTE SWITCH 00893000 IC R2,SDRFLCT PICK UP NEW MASK @VA03757 00894000 EX R2,TSTOVFL GO TEST FOR OVERFLOW @VA03757 00895000 BNO BYPASS01 BRANCH IF NO OVERFLOW @VA03757 00896000 OI ERRSDR,SDRRECD TURN ON OVERFLOW SWITCH @VA03757 00897000 BYPASS01 B UPDTEPTR GO UPDATE POINTERS @VA03757 00898000 SPACE 00899000 * *** EXECUTED INSTRUCTIONS *** 00900000 SPACE 00901000 TSTSENSE TM 0(R1),ZERO TEST SENSE BIT @VA03757 00902000 TSTOVFL TM SDRCTRS,ZERO @VA03757 00903000 SPACE 3 00904000 FULBYTEN EQU * @VA03757 00905000 MVI SDRFLCT,FULLBYTE TURN ON FULL BYTE SWITCH @VA03757 00906000 SPACE 00907000 * *** UPDATE POINTERS FOR NEXT PARAMETER BYTE *** 00908000 SPACE 00909000 UPDTEPTR EQU * @VA03757 00910000 TM SDROVFWK,FIFTEEN RIGHT HAND COUNTER ?? @VA03757 00911000 BNO BYPASS02 NO, DON'T INCREMENT COUNTER REG @VA03757 00912000 LA R7,1(,R7) INCREMENT COUNTER REG @VA03757 00913000 BYPASS02 LA R6,1(,R6) POINT TO NEXT PARAMETER BYTE @VA03757 00914000 IC R2,SDRPRMCT PICK UP PARAMETER BYTE COUNTER @VA03757 00915000 LA R2,1(R2) INCREMENT IT @VA03757 00916000 SLR R1,R1 CLEAR WORK REG @VA03757 00917000 IC R1,SDRLNGTH PICK UP SDR WORK AREA LENGTH @VA03757 00918000 SLL R1,1 GET MAX NO. OF SDR COUNTERS @VA03757 00919000 CLR R1,R2 COMPARE PARAMETER BYTE COUNT @VA03757 00920000 BL COUNTERR TOO MANY COUNTERS---EXIT @VA03757 00921000 BNE BYPASS05 TO CONTINUE PROCESS @VA03757 00922000 OI ERRSDR,SDRMAX MAX NO. OF COUNTERS REACHED @VA03757 00923000 BYPASS05 EQU * CONTINUE PROCESS @VA03757 00924000 STC R2,SDRPRMCT STORE UPDATED COUNT @VA03757 00925000 XI SDROVFWK,FOXES CHANGE TO OTHER MASK @VA03757 00926000 SR R1,R1 *** CLEAR THE *** @VA03757 00927000 SR R2,R2 *** WORK REGS *** @VA03757 00928000 BR R3 RETURN @VA03757 00929000 COUNTERR BAL R5,ERREXIT EXIT VIA ERROR EXIT @VA03757 00930000 SPACE 1 00931000 DROP R5 @VA03757 00932000 DROP R6 @VA03757 00933000 DROP R7 @VA03757 00934000 SPACE 2 00935000 CHLDATCK EQU * @VA03757 00936000 LA R3,STATEXIT RESET THE RETURN REG @VA03757 00937000 TM IOERCSW+5,CDC CHANNEL DATA CHECK ?? @VA03757 00938000 BNO STATEXIT NO CDC , SO ALL DONE @VA03757 00939000 LA R7,SDRCTRS RESET THE COUNTER POINTER @VA03757 00940000 LA R7,7(,R7) POINT AT CORRECT COUNTER @VA03757 00941000 MVI SDROVFWK,FIFTEEN RESET THE OVER FLOW MASK @VA03757 00942000 B UPDTECNT NOW GO UPDATE THE COUNTER @VA03757 00943000 SPACE 1 00944000 DATACK EQU * @VA03757 00945000 CLI SDRPRMCT,ONE SECOND PARAMETER BYTE ?? @VA03757 00946000 BH UPDTECNT NO,ITS HIGHER,SO UPDATE COUNTER @VA03757 00947000 BE TSTREAD SECOND BYTE,GO CHECK FOR READ @VA03757 00948000 TM IOERFLG3,IOERREAD FIRST BYTE,WAS IT A READ OP ? @VA03757 00949000 BO UPDTECNT YES,UPDATE READ DATA CK COUNTER @VA03757 00950000 B UPDTEPTR NO,SO GO LOOK AT NEXT BYTE @VA03757 00951000 TSTREAD TM IOERFLG3,IOERREAD WAS IT A READ OP ?? @VA03757 00952000 BO UPDTEPTR YES,BUT WE ARE LOOKING FOR A @VA03757 00953000 * WRITE DATA CK, GO TO NEXT BYTE 00954000 B UPDTECNT IT WAS A WRITE,UPDATE COUNTER @VA03757 00955000 SPACE 2 00956000 GETSDRBK EQU * GET SDRBLOK, IF IT IS USED!! @VA03757 00957000 SPACE 1 00958000 CKFORTAP LA R1,SDRSIZE SET UP FOR SMALL SDRBLOK @VA03757 00959000 CLI RDEVTYPC,CLASTAPE A TAPE DRIVE ?? @VA03757 00960000 BNE GETSDR NO, NOT TAPE , GET SMALL SDR @VA03757 00961000 TM RDEVTYPE,TYP3410+TYP3420 IS IT A 3400 ?? @VA03757 00962000 BZ GETSDR NOT EITHER ONE @VA03757 00963000 LA R1,SDRSIZE1 SET UP FOR LARGE SDRBLOK @VA03757 00964000 GETSDR BAL R3,CALLFRE GO GET SDRBLOK @VA03757 00965000 BAL R3,OBRMDRCL NOW CLEAR IT WITH ZEROES @VA03757 00966000 LR R9,R1 PUT SDRBLOK ADDRESS IN BASE REG @VA03757 00967000 LA R9,0(,R9) BE SURE (CLEAR HI-ORDER BYTE) @VA03757 00968000 ST R9,RDEVCTRS SAVE SDRBLOK ADDRESS @VA03757 00969000 SPACE 2 00970000 *** BUILD SDRBLOK *** 00971000 SPACE 1 00972000 ST R8,SDRRDEV SAVE ADDRESS OF RELATED RDEVBLOK @VA03757 00973000 MVI SDRLNGTH,SDRCNTLN SET LENGTH OF SDR COUNTERS @VA03757 00974000 LR R7,R0 GET LENGTH OF RECORD(DOUBLEWORDS)@VA03757 00975000 C R7,F4 DID WE GET LARGE SDRBLOK ?? @VA03757 00976000 BL SDRLNOK NO,LENGTH IS OK @VA03757 00977000 MVI SDRLNGTH,SDRCTLN1 CHANGE SDR COUNTER LENGTH @VA03757 00978000 * FOR 3400 TAPE DRIVES 00979000 SDRLNOK EQU * @VA03757 00980000 MVC SDRCUA+1(2),ERRIOB GET PRIMARY DEVICE @VA03757 00981000 B CKPARM GO LOOK FOR PARAMETERS @VA03757 00982000 SPACE 2 00983000 SDRDASD CLI RDEVTYPC,CLASDASD DASD ?? @VA03757 00984000 BNE SDRTAPE NOT DASD,GO CHECK TAPE @VA03757 00985000 LA R6,PARMDAS SET UP PARAMETER REG @VA03757 00986000 IC R3,IOERDATA+4 GET PHYSICAL DRIVE ADDRESS @VA03757 00987000 N R3,F15 SAVE 4 LOW ORDER BITS @VA04586 00988000 LH R7,ERRIOB GET LOGICAL DEVICE ADDRESS @VA03757 00989000 N R7,=X'0000FFF0' CLEAR LOW ORDER 4 BITS @VA03757 00990000 OR R7,R3 TOGETHERNESS @VA03757 00991000 STCM R7,7,SDRCUA STORE PRIMARY DEVICE ADDRESS @VA03757 00992000 B SETUPSDR GO LOOK AT PARAMETER LIST @VA03757 00993000 SPACE 1 00994000 SDRTAPE EQU * @VA03757 00995000 CLI RDEVTYPC,CLASTAPE IS IT A TAPE DRIVE ?? @VA03757 00996000 BNE SDRTERM NO, GO CHECK FOR TERMINAL @VA03757 00997000 LA R6,PARMTAP1 SET PARAMETER LIST FOR 3410 @VA03757 00998000 TM RDEVTYPE,TYP3410 3410 TAPE DRIVE ?? @VA03757 00999000 BO SETUPSDR YES,CONTINUE PROCESSING @VA03757 01000000 LA R6,PARMTAP2 SET PARAMETER LIST FOR 3420 @VA03757 01001000 CLI RDEVTYPE,TYP3420 3420 TAPE DRIVE ?? @VA03757 01002000 BE SETUPSDR YES ,CONTINUE PROCESSING @VA03757 01003000 * NOTE: WE SHOULD HAVE PASSED A 01004000 * PARAMETER LIST FOR 2400 DRIVE.. 01005000 BAL R5,ERREXIT DONT KEEP STATS FOR THIS DEVICE. @VA03757 01006000 SPACE 1 01007000 SDRTERM EQU * @VA03757 01008000 CLI RDEVTYPC,CLASTERM IS IT A TERMINAL ?? @VA03757 01009000 BNE SDRGRAF NO, GO TRY GRAPHICS @VA03757 01010000 LA R6,PARMCNS SET PARAMETER LIST FOR 3210 ETC..@VA03757 01011000 CLI RDEVTYPE,TYP3210 3210,3215,2150 OR1052 ?? @VA03757 01012000 BE SETUPSDR YES,CONTINUE PROCESSING @VA03757 01013000 LA R6,PARMBSC SET UP PARAMETER LIST FOR BI-SYNC@VA03757 01014000 TM RDEVTYPE,TYP2700+TYPTTY 2700 OR TTY ?? @VA03757 01015000 BM SETUPSDR YES,CONTINUE PROCESSING @VA03757 01016000 CLI RDEVTYPE,TYPSDLC IS IT SDLC @V67CDF1 01016100 BM SETUPSDR YES,CONTINUE PROCESSING @V67CDF1 01016200 TM RDEVTYPE,TYPBSC REMOTE 3270? @VA07662 01016300 BO SETUPSDR YES,CONTINUE PROCESSING @VA07662 01016600 CLI RDEVTYPE,TYP1050 IS IT A 1050 ?? @VA03757 01017000 BE SETUPSDR YES,CONTINUE PROCESSING @VA03757 01018000 CLI RDEVTYPE,TYP2741 HOW ABOUT A 2741 ?? @VA03757 01019000 BE SETUPSDR IT IS,CONTINUE PROCESSING @VA03757 01020000 BAL R5,ERREXIT DONT KNOW WHAT WE HAVE, @VA03757 01021000 * ITS NOT SUPPORTED!! EXIT 01022000 SPACE 1 01023000 SDRGRAF EQU * @VA03757 01024000 CLI RDEVTYPC,CLASGRAF COULD IT BE GRAPHICS ?? @VA03757 01025000 BNE SDRRSE NO,TRY UNIT RECORD @VA03757 01026000 LA R6,PARMGRF SET PARAMETER LIST FOR GRAPHICS @VA03757 01027000 TM RDEVTYPE,TYP3066 IS IT A 168 ?? @VA03757 01028000 BO SETUPSDR YES,CONTINUE PROCESSING @VA03757 01029000 * NOTE: WE SHOULD HAVE PASSED A 01030000 * PARAMETER LIST FOR 3277 DEVICE 01031000 GRAFERR BAL R5,ERREXIT NO PARAMETER LIST, ERROR EXIT @VA03757 01032000 SPACE 1 01033000 SDRRSE EQU * @VA03757 01034000 TM RDEVTYPC,CLASURI+CLASURO UNIT RECORD,EITHER ONE?@VA03757 01035000 BZ RSEERR UNKNOWN CLASS -- EXIT @VA03757 01036000 LA R6,PARMRSE SET UP PARAMETER LIST @VA03757 01037000 TM RDEVTYPE,TYP2501 IS IT A 2501 ?? @VA03757 01038000 BO SETUPSDR YES,CONTINUE PROCESSING @VA03757 01039000 TM RDEVTYPE,TYP2520R IS IT 2520 READER ?? @VA03757 01040000 BO SETUPSDR YES,CONTINUE PROCESSING @VA03757 01041000 LA R6,PARMRSE1 CHANGE PARAMETER LIST POINTER @VA03757 01042000 TM RDEVTYPE,TYP2540R IS IT A 2540 READER ?? @VA03757 01043000 BO SETUPSDR YES,CONTINUE PROCESSING @VA03757 01044000 LA R6,PARMRSE2 SET PARAMETER LIST FOR 1403 @VA03757 01045000 CLI RDEVTYPE,TYP1403 IS IT A 1403 PRINTER?? @V386298 01046000 BE SETUPSDR YES, CONTINUE PROCESSING @V386298 01047000 LA R6,PARMRSE3 SET UP FOR 1443 @VA03757 01048000 TM RDEVTYPE,TYP1443 IS IT A 1443 ?? @VA03757 01049000 BO SETUPSDR YES,CONTINUE PROCESSING @VA03757 01050000 LA R6,PARMRSE4 SET UP FOR 3211 OR 3203 @V386298 01051000 TM RDEVTYPE,TYP3211 IS IT A 3211 PRINTER ?? @VA03757 01052000 BO SETUPSDR YES,CONTINUE PROCESSING @VA03757 01053000 * NOTE: WE SHOULD HAVE PASSED A PARAMETER 01053100 * LIST FOR THE 3800 PRINTER 01053200 RSEERR BAL R5,ERREXIT UNIT RECORD TYPE, NOT SUPPORTED @VA03757 01054000 SPACE 2 01055000 ERREXIT EQU * ERROR EXIT @VA03757 01056000 MVI RDEVCTRS,FOXES SUSPEND SDR FOR THIS DEVICE @VA03757 01057000 STM R5,R6,SDRCTRS SAVE ERROR DATA @VA03757 01058000 STC R2,SDRCTRS SAVE ONE MORE BYTE @VA03757 01059000 B STAEXIT1 RETURN TO CALLER @VA03757 01060000 SPACE 2 01061000 STATEXIT EQU * @VA03757 01062000 TM ERRSDR,SDRRECD TEST FOR COUNTER OVERFLOW @VA03757 01063000 BNO STAEXIT1 NOT ON , SO EXIT @VA03757 01064000 SPACE 2 01065000 * CHECK THE OBR QUEUE FOR ANY REQUESTS FOR THIS DEVICE, IF THERE 01066000 * IS ONE, JUST EXIT, IF NONE--- QUEUE THIS ERRBLOK ON THE 01067000 * OBR QUEUE SO AN OBR RECORD WILL BE WRITTEN FOR COUNTER OVERFLOW.. 01068000 SPACE 01069000 L R6,=V(DMKIOEIQ) GET ADDRESS OF OBR QUEUE @VA03757 01070000 QUESRCH ICM R6,15,0(R6) GET POINTER TO FIRST REQUEST @VA03757 01071000 BZ QUERRBLK IF ZERO, GO QUEUE THIS ERRBLOK @VA03757 01072000 L R5,CPEXR6-CPEXBLOK(R6) GET ADD OF QUE'ED BLOK @VA03757 01073000 CLC ERRIOB(2),ERRIOB-ERRBLOK+4(R5) SAME DEVICE ??? @VA03757 01074000 BE STAEXIT1 YES, NO NEED TO QUEUE ANOTHER ONE@VA03757 01075000 B QUESRCH CONTINUE DOWN THE QUEUE.. @VA03757 01076000 SPACE 01077000 QUERRBLK EQU * FIRST, DETERMINE OBR SIZE. @VA03757 01078000 CLI SDRLNGTH,SDRCNTLN SHORT OBR TO BE BUILT??? @VA03757 01079000 BNE QUEBLOK NO, BUILD LONG OBR @VA03757 01080000 OI ERRSDR,SDRSHRT SET FLAG FOR SHORT OBR @VA03757 01081000 QUEBLOK EQU * NOW QUEUE THE ERRBLOK @VA03757 01082000 BAL R5,REGSETUP GET REGS READY @VA03757 01083000 SRL R7,3 CONVERT BYTES TO DOUBLE WORDS @VA04748 01084000 GCPEX EQU * GET SPACE FOR CPEXBLOK @VA03757 01085000 LA R0,CPEXSIZE GET SIZE IN DOUBLEWORDS @VA03757 01086000 CALL DMKFREE GET STORAGE FOR CPEXBLOK @VA03757 01087000 USING CPEXBLOK,R1 SET UP ADDRESSABILITY FOR CPEXBLK@VA03757 01088000 STM R0,R15,CPEXREGS SAVE ALL REGISTERS IN CPEXBLOK @VA03757 01089000 SLR R4,R4 CLEAR REGISTER R4 @VA03757 01090000 ST R4,CPEXFPNT CLEAR POINTER TO NEXT CPEXBLOK @VA03757 01091000 L R3,=V(DMKIOEIQ) GET POINTER TO QUEUE @VA03757 01092000 DROP R1 DROP CPEXBLOK BASE REGISTER @VA03757 01093000 SPACE 2 01094000 QCPEX EQU * QUE CPEXBLOK OFF RECORDING QUE @VA03757 01095000 LR R4,R3 GET POINTER TO RECORDING QUE @VA03757 01096000 ICM R3,15,0(R3) GET POINTER TO NEXT CPEXBLOK @VA03757 01097000 BNZ QCPEX YES, GET POINTER TO NEXT CPEXBLOK@VA03757 01098000 ST R1,0(,R4) QUE CPEXBLOK AT THE END OF CHAIN @VA03757 01099000 B RECDQUE GO CHECK THE QUEUES @VA03757 01100000 SPACE 2 01101000 DROP R10 @VA03757 01102000 SPACE 2 01103000 STAEXIT1 EQU * EXIT, FIRST CHECKING OTHER QUEUES@VA03757 01104000 BAL R5,REGSETUP GET REGS READY @VA03757 01105000 BAL R5,FRETRECD RELEASE THE RECORD @VA03757 01106000 B RECDQUE GET NEXT REC. FROM RECORDING QUE @VA03757 01107000 SPACE 2 01108000 DROP R4 @VA03757 01109000 DROP R9 @VA03757 01110000 EJECT 01111000 SPACE 01112000 * 01113000 * SUBROUTINES FOR RECORDING ERROR RECORDS ONTO THE ERROR 01114000 * RECORDING CYLINDERS. 01115000 * 01116000 SPACE 2 01117000 PAGEIN EQU * PUT REAL PAGE ADDRESS IN REG. 2 @VA03358 01118000 SR R4,R4 CLEAR WORK REGISTER @VA03358 01119000 C R4,IOEREALA IS THERE A RECORDING PAGE ADDR @VA03358 01120000 BNE RECREST YES, GET REAL PAGE ADDRESS @VA03358 01121000 CALL DMKPGTVG ALLOCATE PAGE OF VIRTUAL STORAGE @VA03358 01122000 ST R1,IOEVMPAD SAVE VIRTUAL PAGE ADDRESS @VA03358 01123000 BAL R9,REALREAD GET A RECORDING PAGE FOR RECORD @VA03358 01124000 RECREST EQU * @VA03358 01125000 L R1,IOEVMPAD GET VIRTUAL PAGE ADDRESS @VA03358 01126000 L R2,IOEREALA GET RECORDING PAGE ADDRESS @VA03358 01127000 BR R5 RETURN TO IN LINE CODE @VA03358 01128000 SPACE 2 01129000 REALWRT EQU * WRITE RECORDING PAGE BACK TO DASD@VA03358 01130000 L R1,IOEVMPAD GET VIRTUAL BUFFER ADDRESS @VA03358 01131000 REALWRTS EQU * WRITE RECORDING PAGE TO DISK @VA03358 01132000 L R0,WORKCYL GET CCPD (CYL,CYL,PAGE,DEV TYPE) @VA03358 01133000 CALL DMKRPAPT,PARM=SYSTEM MOVE RECORDING PAGE TO DISK@VA03358 01134000 BZ RLWREXIT IF ZERO, SUCCESSFUL WRITE @VA03358 01135000 L R2,IOEREALA GET ADDRESS OF REAL PAGE @VA03358 01136000 BAL R3,UPPAG UPDATE THE PAGE NUMBER @VA03358 01137000 STC R14,WORKPAGE SAVE PAGE NO. IF NOT AT MAXIMUN @VA03358 01138000 MVC RECCCPD(2),WORKCYL UPDATE CCPD FIELD IN HEADER @VA03358 01139000 B REALWRTS TRY WRITING PAGE OUT TO DISK @VA03358 01140000 RLWREXIT EQU * @VA03358 01141000 L R2,IOEREALA GET THE REAL PAGE ADDRESS @VA03358 01142000 BR R9 RETURN TO IN LINE CODE @VA03358 01143000 SPACE 2 01144000 REALREAD EQU * GET ADDRESS OF RECORDING PAGE @VA03358 01145000 L R0,WORKCYL GET RECORDING PAGE CCPD VALUE @VA03358 01146000 L R1,IOEVMPAD GET RECORDING PAGE VIRTUAL ADDR @VA03358 01147000 CALL DMKRPAGT,PARM=SYSTEM GET REC. PAGE REAL ADDRESS @VA03358 01148000 LA R2,(BRING+LOCK+DEFER+SYSTEM) GET OPTIONS @VA03358 01149000 CALL DMKPTRAN BRING IN RECORDING PAGE @VA03358 01150000 BNZ RLRDERR IF ERROR , GET ANOTHER PAGE @VA03358 01151000 ST R2,IOEREALA SAVE RECORDING PAGE REAL ADDRESS @VA03358 01152000 TM RECFLAG1,RECPAGFL IS RECORDING PAGE FULL @VA03358 01153000 BO RLRDERR YES, GET ANOTHER RECORDING PAGE @VA03358 01154000 MVI RECFLAG1,RECPAGIU SET RECORDING PAGE IN USE FLAG@VA03358 01155000 BR R9 RETURN TO IN LINE CODE @VA03358 01156000 SPACE 1 01157000 RLRDERR EQU * UPDATE TO NEXT RECORDING PAGE @VA03358 01158000 BAL R3,UPPAG UPDATE RECORDING PAGE NUMBER @VA03358 01159000 STC R14,WORKPAGE SAVE PAGE NO. IF NOT AT MAXIMUN @VA03358 01160000 BAL R3,REALREAD GET REAL ADDR FOR RECORDING PAGE @VA03358 01161000 SPACE 2 01162000 PAGREL EQU * RELEASE THE VIRTUAL PAGE @VA03358 01163000 L R2,IOEREALA GET ADDRESS OF RECORDING PAGE @VA03358 01164000 L R1,IOEVMPAD GET ADDRESS OF VIRTUAL PAGE @VA03358 01165000 CALL DMKPTRUL UNLOCK THE VIRTUAL PAGE @VA03358 01166000 XC IOEREALA,IOEREALA CLEAR THE REAL PAGE ADDRESS @VA03358 01167000 SR R0,R0 FORCE SWAP CCPD ENTRY TO ZERO @VA03358 01168000 CALL DMKRPAGT,PARM=SYSTEM RELEASE BACKUP VIRTUAL PAGE@VA03358 01169000 CALL DMKPGTVR RELEASE VIRTUAL MEMORY PAGE @VA03358 01170000 BR R3 RETURN TO IN LINE CODE @VA03358 01171000 SPACE 2 01172000 UPPAG EQU * UPDATE TO NEXT RECORDING PAGE NO.@VA03358 01173000 ICM R14,B'0111',WORKCYL CURRENT RECORDING CYL & PAGE@V5088AA 01174100 LA R14,1(,R14) UPDATE RECORDING PAGE NO. BY ONE @VA03358 01175000 CLM R14,B'0111',AREA90PC IS RECORDING AREA 90% FULL?@V5088AA 01176100 BNE UPPAGMAX NO, CHECK FOR MAX. NO. PAGES @VA03358 01177000 ST R14,PAGNOUPD SAVE UPDATED PAGE NUMBER @VA11472 01178500 BAL R4,MSG90PC WRITE 90 % MESSAGE TO OPERATOR @VA03358 01179000 L R14,PAGNOUPD GET UPDATED PAGE NUMBER @VA11472 01180500 UPPAGMAX EQU * CHECK MAX. PAGE NO. VALUE FOR CYL@VA03358 01181000 CLM R14,1,MAXPAGE IS IT = TO MAX. PAGE NO. VALUE @VA03358 01182000 BNER R3 NO, RETURN TO IN LINE CODE @VA03358 01183000 CLM R14,B'0110',LASTCYL IS IT LAST PAGE ON LAST CYL?@V5088AA 01183100 BNE UPCYL IF NOT, UPDATE TO NEXT CYL NO. @V5088AA 01183600 BAL R4,MSGFULL WRITE CYL. FULL MSG. TO OPERATOR @VA03358 01184000 SPACE 2 01185000 UPDTHDR EQU * UPDATE CONTROL HEADER INDEX VALUE@VA03358 01186000 L R2,IOEREALA GET ADDRESS OF RECORDING PAGE @VA03358 01187000 LH R4,RECNXT GET INDEX VALUE TO AVAILABLE AREA@VA03358 01188000 LA R4,0(R4,R7) UPDATE TO AVAILABLE SPACE ON PAGE@VA03358 01189000 TM MCCHFLAG,MCHFLAG IS THIS A MCH/CCH ENTRY @VA03358 01190000 BZ *+8 NO, BYPASS UPDATING INDEX VALUE @VA03358 01191000 LA R4,4(,R4) ADD LENGTH FIELD TO INDEX VALUE @VA03358 01192000 STH R4,RECNXT SAVE NEW INDEX VALUE @VA03358 01193000 LA R4,0(R4,R2) GET ADDR TO NEW AVAILABLE SPACE @VA03358 01194000 L R3,FFS STORE ENDING INDICATOR (FFFFFFFF)@VA03358 01195000 ST R3,0(,R4) AT BEGINNING OF AVAILABLE SPACE @VA03358 01196000 BR R5 RETURN TO IN LINE CODE @VA03358 01197000 UPCYL EQU * UPDATE WORKCYL TO NEXT CYL. NO. @V5088AA 01197100 SRL R14,8 ISOLATE CC PORTION OF CCP @V5088AA 01197200 LA R14,1(R14) UPDATE RECORDING CYL BY 1 @V5088AA 01197300 STH R14,WORKCYL UPDATE CURRENT RECORDING CYL NO. @V5088AA 01197400 SLL R14,8 MAKE ROOM FOR PAGE NUMBER @V5088AA 01197500 LA R14,1(R14) INITIALIZE TO 1ST PAGE ON NEW CYL@V5088AA 01197600 BR R3 RETURN TO INLINE CODE @V5088AA 01197700 SPACE 2 01198000 CKOBROOM EQU * ENOUGH SPACE ON RECORDING PAGE @VA03358 01199000 LH R4,RECNXT INDEX VALUE TO AVAILABLE SPACE @VA03358 01200000 LA R3,4095-L'INITFMT MAXIMUM SIZE OF RECORDING PAGE@VA03358 01201000 LA R4,4(R4) UPDATE INDEX FOR LENGTH FIELD @VA03358 01202000 SR R3,R4 GET THE REMAINING SPACE ON PAGE @VA03358 01203000 CR R7,R3 CAN ERROR RECORD FIX ON REC PAGE @VA03358 01204000 BLR R5 YES, RETURN TO IN LINE CODE @VA03358 01205000 MVI RECFLAG1,RECPAGFL SET RECORDING PAGE FULL FLAG @VA03358 01206000 BAL R9,REALWRT WRITE RECORDING PAGE BACK TO DISK@VA03358 01207000 BAL R3,UPPAG UPDATE RECORDING PAGE NUMBER @VA03358 01208000 STC R14,WORKPAGE SAVE PAGE NO. IF NOT AT MAXIMUN @VA03358 01209000 BAL R9,REALREAD GET REAL ADDR FOR RECORDING PAGE @VA03358 01210000 MVC RECNXT(8),INITFMT INITIALIZE CONTROL HEADER @VA03358 01211000 BR R5 RETURN TO IN LINE CODE @VA03358 01212000 SPACE 2 01213000 ERASEQ EQU * CHECK THE ERASE REQUEST QUE @VA03358 01214000 L R9,=V(DMKIOERQ) GET POINTER TO ERASE REQUEST QUE@VA03358 01215000 ICM R4,15,0(R9) GET FIRST ENTRY IN ERASE QUE @VA03358 01216000 BZR R5 IF ZERO, NO REQUEST AVAILABLE @VA03358 01217000 BAL R5,WRITPAG WRITE RECORDING PAGE BACK TO DISK@VA03358 01218000 L R9,=V(DMKIOERQ) GET POINTER TO ERASE REQUEST QUE@VA03358 01219000 L R4,0(,R9) GET FIRST ENTRY IN ERASE QUE @VA03358 01220000 BAL R5,STACKREQ STACK CPEXBLOK AND EXIT TO CALLER@VA03358 01221000 SPACE 2 01222000 MCHQ EQU * CHECK MACHINE CHECK RECORDING QUE@VA03358 01223000 L R9,=V(DMKIOEMQ) GET POINTER TO MCH RECORDING QUE@VA03358 01224000 ICM R4,15,0(R9) GET FIRST ENTRY IN MCH QUE @VA03358 01225000 BZR R5 IF ZERO, NO REQUEST AVAILABLE @VA03358 01226000 BAL R5,WRITPAG WRITE RECORDING PAGE BACK TO DISK@VA03358 01227000 L R9,=V(DMKIOEMQ) GET POINTER TO MCH RECORDING QUE@VA03358 01228000 L R4,0(,R9) GET FIRST ENTRY IN MCH QUE @VA03358 01229000 BAL R5,STACKREQ STACK CPEXBLOK AND EXIT TO CALLER@VA03358 01230000 SPACE 2 01231000 CCHQ EQU * CHECK CCH RECORDING QUE @VA03358 01232000 L R9,=V(DMKIOECQ) GET POINTER TO CCH RECORDING QUE@VA03358 01233000 ICM R4,15,0(R9) GET FIRST ENTRY IN CCH QUE @VA03358 01234000 BZR R5 IF ZERO, NO REQUEST AVAILABLE @VA03358 01235000 BAL R5,WRITPAG WRITE BACK RECORDING PAGE ON DISK@VA03358 01236000 L R9,=V(DMKIOECQ) GET POINTER TO CCH RECORDING QUE@VA03358 01237000 L R4,0(,R9) GET FIRST ENTRY IN CCH QUE @VA03358 01238000 L R2,0(,R4) GET POINTER TO SECOND CCH REQUEST@VA03358 01239000 ST R2,0(,R9) PUT REQUEST AT BEGINNING OF QUE @VA03358 01240000 LM R6,R8,CPEXR6-CPEXBLOK(R4) GET SET UP REGISTERS @VA03358 01241000 BAL R5,FRETCPEX RELEASE STORAGE FOR CPEXBLOK @VA03358 01242000 BAL R5,IOFC1 GO RECORD CCH RECORDS @VA03358 01243000 SPACE 2 01244000 OBRQ EQU * CHECK OUTBOARD RECORDING QUE @VA03358 01245000 L R9,=V(DMKIOEIQ) GET PTR TO OUTBOARD REC. QUE @VA03358 01246000 ICM R4,15,0(R9) GET FIRST ENTRY IN OUTBOARD QUE @VA03358 01247000 BZR R5 IF ZERO, NO REQUEST AVAILABLE @VA03358 01248000 L R2,0(,R4) PTR TO SECOND OUTBOARD REQUEST @VA03358 01249000 ST R2,0(,R9) PUT REQUEST AT BEGINNING OF QUE @VA03358 01250000 LM R6,R8,CPEXR6-CPEXBLOK(R4) GET SET UP REGISTERS @VA03358 01251000 BAL R5,FRETCPEX RELEASE CPEXBLOK @VA03358 01252000 BAL R5,IOFOB GO RECORD OBR/MDR RECORDS @VA03358 01253000 SPACE 2 01254000 ENVQ EQU * CHECK ENVIRONMENTAL RECORDING QUE@VA03358 01255000 L R9,=V(DMKIOENQ) GET PTR TO ENVIRON. REQUEST QUE @VA03358 01256000 ICM R4,15,0(R9) GET FIRST ENTRY IN MDR QUE @VA03358 01257000 BZR R5 IF ZERO, NO REQUEST AVAILABLE @VA03358 01258000 STACKREQ EQU * STACK CPEXBLOK AND EXIT TO CALLER@VA03358 01259000 L R2,0(,R4) GET POINTER TO SECOND MDR REQUEST@VA03358 01260000 ST R2,0(,R9) PUT REQUEST AT BEGINNING OF QUE @VA03358 01261000 BAL R5,STKCPEX GO STACK CPEXBLOK AND EXIT @VA03358 01262000 SPACE 2 01263000 SVC76Q EQU * CHECK SVC 76 RECORDING QUE @VA03358 01264000 L R9,=V(DMKIOEVQ) GET PTR TO SVC 76 REQUEST QUE @VA03358 01265000 ICM R4,15,0(R9) GET FIRST ENTRY IN SVC 76 QUE @VA03358 01266000 BZR R5 IF ZERO, NO REQUEST AVAILABLE @VA03358 01267000 L R2,0(,R4) GET PTR TO SECOND SVC 76 REQUEST @VA03358 01268000 ST R2,0(,R9) PUT REQUEST AT BEGINNING OF QUE @VA03358 01269000 LM R6,R8,CPEXR6-CPEXBLOK(R4) GET SET UP REGISTERS @VA03358 01270000 BAL R5,FRETCPEX RELEASE CPEXBLOK @VA03358 01271000 BAL R5,IOFVR GO RECORD ALL SVC 76 REQUESTS @VA03358 01272000 SPACE 2 01273000 STATQ EQU * CHECK COUNTER UPDATE QUEUE @VA03757 01274000 L R9,=V(DMKIOESQ) GET POINTER TO UPDATE QUEUE @VA03757 01275000 ICM R4,15,0(R9) GET FIRST ENTRY ON UPDATE QUEUE @VA03757 01276000 BZR R5 IF ZERO, NO REQUEST AVAILABLE @VA03757 01277000 L R2,0(,R4) PTR TO SECOND UPDATE REQUEST @VA03757 01278000 ST R2,0(R9) PUT REQUEST AT BEGINNING OF QUEUE@VA03757 01279000 LM R6,R8,CPEXR6-CPEXBLOK(R4) SET UP REGISTERS @VA03757 01280000 BAL R5,FRETCPEX RELEASE CPEXBLOK @VA03757 01281000 B IOFST GO UPDATE STATISTICAL COUNTERS @VA03757 01282000 SPACE 2 01283000 STKCPEX EQU * STACK CPEXBLOK AND EXIT TO CALLER@VA03358 01284000 LR R1,R4 GET ADDRESS OF CPEXBLOK @VA03358 01285000 CALL DMKSTKCP STACK CPEXBLOK @VA03358 01286000 MVI MCCHFLAG,X'00' RESET MCH/CCH ENTRY FLAG @VA03358 01287000 BAL R5,RETEXIT GO EXIT TO CALLER @VA03358 01288000 SPACE 2 01289000 CHEKFULL EQU * CHECK CYLINDER FOR FULL CONDITION@VA03358 01290000 MVC WORKCYL(3),CECYL MOVE CYL AND PAGE NO. IN AREA @VA03358 01292000 SLL R7,3 CONVERT DOUBWORDS TO ACTUAL SIZE @VA03358 01293000 L R4,=V(DMKIOEES) RECORDING AREA FULL INDICATOR @V5088AA 01294100 CLI 0(R4),X'FF' IS RECORDING AREA FULL? @V5088AA 01295100 BE MSGFULL YES, GO WRITE AREA FULL MESSAGE @V5088AA 01296100 BR R5 RETURN TO IN LINE CODE @VA03358 01297000 SPACE 2 01298000 SPACE 2 01306000 WRITPAG EQU * WRITE RECORDING PAGE BACK ON DISK@VA03358 01307000 SR R3,R3 CLEAR WORK REGISTER @VA03358 01308000 C R3,IOEREALA DOES AN ADDRESS EXIST FOR PAGE @VA03358 01309000 BER R5 NO, RETURN TO IN LINE CODE @VA03358 01310000 BAL R9,REALWRT WRITE RECORDING PAGE BACK TO DISK@VA03358 01311000 BAL R3,PAGREL RELEASE VIRTUAL RECORDING PAGE @VA03358 01312000 BR R5 RETURN TO IN LINE CODE @VA03358 01313000 SPACE 2 01314000 MSG90PC EQU * HANDLE CYLINDER 90 % FULL MESSAGE@VA03358 01315000 TM FLAG90PC,ERRCYL90 WAS 90% FLAG ON? @V5088AA 01318100 BOR R4 YES, RETURN TO IN LINE CODE @VA03358 01319000 OI FLAG90PC,ERRCYL90 SET 90% FULL FLAG @V5088AA 01320100 LA R2,550 DMKIOF550E MESSAGE NUMBER @V305435 01322000 BAL R10,CALLERM WRITE ERROR MESSAGE @V305435 01323000 BR R4 RETURN TO LINE CODE @V305435 01324000 SPACE 1 01325000 SPACE 2 01334000 MSGFULL EQU * HANDLE CYLINDER FULL CONDITION @VA03358 01335000 TM MCCHFLAG,CCHFLAG IS THIS A MCH/CCH ENTRY @VA03358 01336000 BM *+8 IF MCH ENTRY, BYPASS RECORD FRET @VA07990 01338100 BAL R5,FRETRECD RELEASE STORAGE FOR CCH RECORD @VA03358 01339000 L R3,=V(DMKIOEES) GET PTR. TO AREA FULL FLAG @V5088AA 01340100 CLI 0(R3),X'FF' WAS RECORDING AREA FULL FLAG ON? @V5088AA 01341100 BE SKIPMSG YES, BYPASS SENDING MSG TO OPER. @VA03358 01342000 MVI 0(R3),X'FF' SET RECORDING AREA FULL FLAG ON @V5088AA 01343100 LA R2,551 DMKIOF551E MESSAGE NUMBER @V305435 01345000 BAL R10,CALLERM WRITE ERROR MESSAGE @V305435 01346000 SPACE 1 01347000 SKIPMSG EQU * ... @VA03358 01357000 ICM R2,15,IOEREALA GET ADDR OF REAL RECORDING PAGE @VA03358 01358000 BZ RECDQUE IF ZERO, GO CHECK QUES @VA03358 01359000 BAL R3,PAGREL RELEASE RECORDING PAGE @VA03358 01360000 B RECDQUE CHECK RECORDING QUEUES @V305435 01361000 SPACE 1 01362000 CALLERM SLR R0,R0 CLEAR LENGTH BYTE @V305435 01363000 ICM R0,B'1110',MODID+3 GET MODULE IDENTIFIER @V305435 01364000 * NOTE - R1 = TEXT INFORMATION 01365000 SLR R1,R1 NO VARIABLE TEXT @V5088AA 01365100 * R2 = MESSAGE ERROR NUMBER 01366000 ICM R2,B'1000',ERMPARM INSERT PARAMETER FLAGS @V305435 01367000 CALL DMKERMSG CALL MESSAGE WRITTER @V305435 01368000 L R1,IOEVMPAD GET RECORDING PAGE VIRTUAL ADDR @VA03358 01369000 L R2,IOEREALA GET RECORDING PAGE REAL ADDRESS @VA03358 01370000 BR R10 RETURN TO IN LINE CODE @VA03358 01371000 SPACE 2 01372000 FRETRECD EQU * RELEASE STORAGE FOR ERROR RECORD @VA03358 01373000 SRL R7,3 PUT LENGTH ON DOUBLEWORDS @VA03358 01374000 LR R0,R7 GET SIZE OF RECORD IN DOUBLEWORDS@VA03358 01375000 LTR R1,R6 IS THERE AN ERROR RECORD ADDRESS @VA03358 01376000 BZR R5 NO, RETURN TO IN LINE CODE @VA03358 01377000 CALL DMKFRET RELEASE RECORD STORAGE @VA03358 01378000 SR R6,R6 CLEAR ERROR RECORD ADDRESS @VA03358 01379000 BR R5 RETURN TO IN LINE CODE @VA03358 01380000 SPACE 2 01381000 FRETCPEX EQU * RELEASE THE CPEXBLOK @VA03358 01382000 LR R1,R4 GET ADDRESS OF CPEXBLOK @VA03358 01383000 LA R0,CPEXSIZE GET SIZE IN DOUBLEWORDS @VA03358 01384000 CALL DMKFRET RELEASE THE STORAGE @VA03358 01385000 BR R5 RETURN TO IN LINE CODE @VA03358 01386000 SPACE 2 01387000 USING ERRBLOK,R6 CHANGE ADDRESSABILITY FOR ERRBLOK@VA03757 01388000 REGSETUP EQU * GET REGS SET UP TO REFLECT BLOCK @VA03757 01389000 LR R6,R10 GET ADDRESS OF RECORD @VA03757 01390000 S R6,F4 GET BEGINNING ADDRESS @VA03757 01391000 L R7,ERRBLOK GET SIZE OF RECORD @VA03757 01392000 LA R7,4(0,R7) GET ORIGINAL SIZE @VA03757 01393000 BR R5 RETURN TO IN LINE CODE @VA03757 01394000 DROP R6 @VA03757 01395000 SPACE 2 01396000 MOVEREC EQU * MOVE RECORD INTO RECORDING PAGE @VA03358 01397000 LR R15,R7 GET LENGTH OF ERROR RECORD @VA03358 01398000 LR R14,R6 GET ADDRESS OF ERROR RECORD @VA03358 01399000 L R2,IOEREALA GET ADDRESS OF RECORDING PAGE @VA03358 01400000 LH R4,RECNXT GET INDEX TO AVAILABLE SPACE @VA03358 01401000 AR R4,R2 GET ADDRESS OF AVAILABLE SPACE @VA03358 01402000 TM MCCHFLAG,MCHFLAG IS THIS A MCH/CCH ENTRY @VA03358 01403000 BZ *+12 NO, BYPASS SAVING RECORD SIZE @VA03358 01404000 ST R7,0(,R4) SAVE LENGTH OF MCH/CCH RECORD @VA03358 01405000 LA R4,4(,R4) UPDATE PASS LENGTH FIELD @VA03358 01406000 LR R5,R15 GET LENGTH OF MOVE DATA @VA03358 01407000 MVCL R4,R14 MOVE RECORD INTO RECORDING PAGE @VA03358 01408000 BR R3 RETURN TO IN LINE CODE @VA03358 01409000 SPACE 2 01410000 SVC76FTN EQU * SVC 76 INTERFACE'S FUNCTION @VA03358 01411000 CLI CPUVERSN,X'FF' IS THIS A VIRTUAL MACHINE @VA03358 01412000 BNER R5 NO, RETURN TO IN LINE CODE @VA03358 01413000 LR R3,R6 GET ADDRESS OF ERROR RECORD @VA03358 01414000 LA R4,0(R7,R6) GET ADDRESS AT END OF RECORD @VA03358 01415000 LA R1,4 ISSUE THE FOLLOWING DIAGNOSE @VA09952 01415010 DC X'83120048' X'48' TO SWITCH ON VMCPSV76 BIT @VA09952 01415020 SVCINFAC EQU * ISSUE SVC 76 INSTRUCTION @VA03358 01416000 LA R1,4(,R3) UPDATE PASS RECORD LENGTH FIELD @VA03358 01417000 L R0,0(,R3) GET LENGTH OF ERROR RECORD @VA03358 01418000 LR R2,R0 SAVE LENGTH OF RECORD @VA03358 01419000 LCR R0,R0 GET COMPLIMENT OF LENGTH VALUE @VA03358 01420000 SVC 76 ISSUE SVC 76 @VA03358 01421000 LA R3,0(R1,R2) GET ENDING ADDR OF ERROR RECORD @VA03358 01422000 CR R3,R4 DOES ENDING ADRESSES EQUAL @VA03358 01423000 BNE SVCINFAC NO, HANDLE MDR REC FOR 3211/3203 @V386298 01424000 L R2,IOEREALA GET ADDRESS OF RECORDING PAGE @VA03358 01425000 L R1,IOEVMPAD GET ADDR OF VIRTUAL BUFFER PAGE @VA03358 01426000 B 4(R5) RETURN TO IN LINE CODE PLUS 4 @VA03358 01427000 SPACE 2 01428000 SPACE 3 01429000 USING IOERBLOK,R4 ADDRESSABILITY FOR IOERBLOK @VA03757 01430000 USING OBRRECN,R6 ADDRESSABILITY FOR OBR RECORD @VA03757 01431000 USING SDRBLOK,R9 ADDRESSABILITY FOR SDRBLOK @VA03757 01432000 USING ERRBLOK,R10 ADDRESSABILITY FOR ERRBLOK @VA03757 01433000 SPACE 01434000 *** EXECUTED MOVE INSTRUCTIONS *** 01435000 MOVESDR MVC 0(0,R14),SDRCTRS MOVE SDR COUNTERS INTO OBR @VA03757 01436000 MOVESEN MVC 0(0,R14),IOERDATA MOVE SENSE INFO INTO OBR @VA03757 01437000 CLRSDR MVC SDRCTRS+1(0),SDRCTRS RESET SDR COUNTERS @VA03757 01438000 MVESDR MVC OBRSSDR1(0),SDRCTRS MOVE COUNTERS TO SHORT OBR @VA03757 01439000 SPACE 2 01440000 OBRMDRBL EQU * TEST WHAT TO BUILD OBR OR MDR @VA03757 01441000 SWITCH SWITCH TO MAIN PROCESSOR @VA12116 01441100 LR R10,R6 GET ADDRESS OF PASSED BLOCK @VA03757 01442000 LA R10,4(0,R10) POINT TO REAL ERRBLOK @VA03757 01443000 CLI ERRBLOK,X'91' BUILD MDR RECORD ?? @VA03757 01444000 BE MDRREC YES @VA03757 01445000 OBRREC EQU * BUILD AND FORMAT OUTBOARD RECORD @VA03757 01446000 LA R4,ERRIOER GET ADDRESS OF IOERBLOK @VA03757 01447000 BAL R3,SPACE GET SPACE FOR THE OBR RECORD @VA03757 01448000 BAL R3,OBRMDRCL CLEAR OUTBOARD RECORD AREA @VA03757 01449000 MVC OBRKEYN(16),ERRKEY CLASS/SYSTEM/REL. NO./TIME @VA03757 01450000 MVC OBRCPIDN(8),CPUID SET UP CPU SERIAL NO. & ID. @VA03757 01451000 ICM R9,15,RDEVCTRS PICK UP SDRBLOK ADDRESS @VA03757 01452000 BZ BYPASS1 BRANCH IF NO SDRBLOK @VA03757 01453000 TM ERRSDR,SDRSHRT SHORT OBR TO BE WRITTEN ?? @VA03757 01454000 BO SHORTOBR YES @VA03757 01455000 BYPASS1 TM ERRIOB+3,IOBFATAL PERMANENT ERROR ?? @VA03757 01456000 BO BYPASS2 YES @VA03757 01457000 OI OBRSWSN+1,OBRTEMP TURN ON TEMPORARY FLAG @VA03757 01458000 TM ERRSDR,SDRRECD TEST FOR COUNTER OVERFLOW @VA03757 01459000 BZ BYPASS2 BR, IF NO OVERFLOW @VA03757 01460000 OI OBRSWSN+1,OBREOD COUNTER OVERFLOW RECORD @VA03757 01461000 BYPASS2 EQU * @VA03757 01462000 L R2,ERRIOB+24 GET ADDRESS OF VMBLOK ADDRESS @VA03757 01463000 LTR R2,R2 IS THIS A VALID ADDRESS? @VA14701 01463100 BZ *+10 NO, SKIP RECORDING OF USER ID @VA14701 01463200 MVC OBRPGMN(8),VMUSER-VMBLOK(R2) GET USER IDENT. @VA03757 01464000 MVC OBRCSWN(8),IOERCSW SAVE FAILING CSW @VA03757 01465000 MVC OBRFCCWN(8),ERRCCW MOVE IN FAILING CCW @VA03757 01466000 MVC OBRCUAIN+1(2),ERRIOB GET SECONDARY DEVICE ADDR @VA03757 01467000 MVC OBRCUAPR+1(2),ERRIOB GET PRIMARY DEVICE ADDRESS @VA03757 01468000 MVI OBRSDRCT,X'0A' SET STATISTICAL DATA AREA LENGTH @VA03757 01469000 OBRSENSE EQU * MOVE SENSE INFORMATION INTO REC @VA03757 01470000 LH R2,IOERLEN GET NUMBER OF SENSE BYTES @VA03757 01471000 STH R2,OBRSNSCT SAVE SENSE BYTE COUNT @VA03757 01472000 LTR R2,R2 IS SENSE BYTE COUNT ZERO ?? @VA03757 01473000 BZ *+6 YES, BYPASS SUBTRACTING ONE @VA03757 01474000 BCTR R2,R0 SUBTRACT ONE FOR EXECUTE INST. @VA03757 01475000 CLI RDEVTYPC,CLASDASD IS THIS A DASD DEVICE CLASS @VA03757 01476000 BNE OBRTAPE NO, CHECK FOR TAPE DEVICE @VA03757 01477000 SPACE 01478000 OBRDASD EQU * DASD TYPE DEVICE @VA03757 01479000 MVI OBRDDCNT,X'03' NO. OF DOUBLEWORDS FOR DEP. AREA @VA03757 01480000 MVC OBRVOLN(6),ERRVOLID GET THE VOLID LABEL @VA03757 01481000 MVC OBRHAN+2(4),IOERADR+4 GET HOME ADDRESS @VA03757 01482000 MVC OBRLSKN+3(4),IOERADR GET LAST SEEK ADDRESS @VA03757 01483000 TM RDEVFTR,FTREXTSN EXTENDED SENSE DASD ??? @VA03757 01484000 BO OBRNSDR YES, GO MOVE SENSE DATA INTO REC @VA03757 01485000 BAL R3,MVSDRSEN MOVE SDR AND SENSE INFO @VA03757 01486000 IC R2,IOERDATA+4 GET PHYSICAL DRIVE ADDRESS @VA03757 01487000 N R2,F15 SAVE 4 LOW ORDER BITS @VA04586 01488000 B OBRPRDEV GET THE PRIMARY DEVICE ADDRESS @VA03757 01489000 OBRNSDR EQU * SDR COUNTER AREA NOT AVAILABLE @VA03757 01490000 MVI OBRSDRCT,X'00' CLEAR SDR LENGTH FIELD @VA03757 01491000 MVC OBRIORTY(2),ERRIOB+18 GET RETRY COUNT @VA03757 01492000 BAL R3,MVSDRSEN MOVE SDR AND SENSE INFO @VA03757 01493000 IC R2,IOERDATA+4 GET PHYSICAL DRIVE ADDRESS @VA03757 01494000 CLI RDEVTYPE,TYP3330 IS DASD A 3330 DEVICE ?? @VA03757 01495000 BNER R5 NO, (TRUE IOB ADDR) RETURN @VA04586 01496000 TM OBR33SNS+2,X'08' TEST FOR EMULATED 3330 DEVICE @VA04586 01497000 BOR R5 YES,ADDRESS OK - RETURN @VA11982 01498010 BLDPHA N R2,F7 ZAP ALL BUT THREE LOW BITS @VA04586 01500000 TM OBR33SNS+4,X'40' IS THIS 2ND OR 4TH CONTROL UNIT@VA04586 01501000 BNO OBRPRDEV IF NOT, BRANCH @VA04586 01502000 A R2,F8 BUMP ADDRESS IF 2ND OR 4TH @VA04586 01503000 * CONTROL UNIT 01504000 OBRPRDEV EQU * FIND PRIMARY DEVICE ADDRESS @VA03757 01505000 LH R14,ERRIOB GET LOGICAL DEVICE ADDRESS @VA03757 01506000 N R14,=X'0000FFF0' CLEAR LOW ORDER FOUR BITS @VA03757 01507000 OR R14,R2 GET PRIMARY DEVICE ADDRESS @VA03757 01508000 STCM R14,7,OBRCUAPR PUT PRIMARY ADDRESS IN RECORD @VA03757 01509000 BR R5 RETURN TO IN LINE CODE @VA03757 01510000 SPACE 1 01511000 * CODE DISABLED BY VM11982. REMAIN FOR FUTURE DEVELOPMENT. 01511100 EMULCODE LA R14,1 INITIAL SHIFT COUNTER @VA03757 01512000 LR R15,R2 OBTAIN 1 OF 8 CODE (EMUL 3330) @VA03757 01513000 SHIFT SRA R15,1 START TO COUNT NO OF SHIFTS @VA03757 01514000 BZ EMULDONE FINISHED SHIFT COUNT @VA03757 01515000 LA R14,1(0,R14) INCREASE SHIFT COUNT BY ONE @VA03757 01516000 B SHIFT CONTINUE TO COUNT 1 OF 8 CODE @VA03757 01517000 EMULDONE LA R15,7 INITIALIZE TO CREATE 3 OF 6 CODE @VA03757 01518000 MR R14,R14 CREATE 3 OF 6 CODE @VA03757 01519000 LR R2,R15 CONTINUE WITH 3 OF 6 CODE @VA03757 01520000 BR R3 RETURN TO DEVICE ADDRESS PROCESS @VA03757 01521000 SPACE 01522000 OBRTAPE EQU * DETERMINE TYPE OF TAPE DEVICE @VA03757 01523000 CLI RDEVTYPC,CLASTAPE IS THIS A TAPE CLASS @VA03757 01524000 BNE OBRUNRX NO, CHECK FOR UNIT RECORD DEVICE @VA03757 01525000 CH R2,=H'23' IF THE SENSE IS NOT 24 MAKE IT HRC105DK 01525100 BNH OBRTAPE2 HRC105DK 01525200 LA R2,24 MAKE IT 24 HRC105DK 01525300 STH R2,OBRSNSCT SAVE SENSE BYTE COUNT HRC105DK 01525400 BCTR R2,0 FOR LATER HRC105DK 01525500 OBRTAPE2 EQU * HRC105DK 01525600 MVC OBRVOLN(6),ERRVOLID GET THE VOLID LABEL @VA03757 01526000 MVI OBRDDCNT,X'01' NO. OF DWORDS IN DEPENDENT AREA @VA03757 01527000 TM RDEVTYPE,TYP3410+TYP3420 3400 TAPE SERIES @VA03757 01528000 BZ COMMOVE NO, MUST BE 2400 TAPE SERIES @VA03757 01529000 MVI OBRDDCNT,X'03' NO. OF DWORDS IN DEPENDENT AREA @VA03757 01530000 MVI OBRSDRCT,X'14' SET THE LENGTH OF SDR AREA @VA03757 01531000 B COMMOVE MOVE SDR AND SENSE INTO RECORD @VA03757 01532000 SPACE 1 01533000 OBRUNRX EQU * MOVE SENSE DATA AFTER SDR DATA @VA03757 01534000 TM RDEVTYPC,CLASGRAF+CLASTERM+CLASSPEC CHK CLASSES @VA03757 01535000 BNZ COMMOVE YES, MOVE SDR AND SENSE INTO REC @VA03757 01536000 TM RDEVTYPE,TYP3211 IS IT A 3203/3211 PRINTER?? @V386298 01537000 BO MOVE3211 YES--HANDLE SPECIAL @V386298 01538000 CLI RDEVTYPE,TYP3505 IS THIS A 3505 DEVICE @VA03757 01539000 BNE COMMOVE NO, MOVE SDR AND SENSE INTO REC @VA03757 01540000 MVI OBRSDRCT,X'00' CLEAR SDR LENGTH FIELD @VA03757 01541000 B COMMOVE MOVE JUST SENSE INFO INTO REC @VA03757 01542000 SPACE 1 01543000 MOVE3211 EQU * BUILD 3211/3203 MDR REC @V386298 01544000 MVI OBRDDCNT,X'01' DATA COUNT IS ONE DOUBLEWORD @VA03757 01545000 LH R15,IOEREXT IS THERE AN EXTENSION TO IOERBLOK@VA03757 01546000 LTR R15,R15 ... @VA03757 01547000 BNZ OBRMDR YES, BUILD MDR RECORD FOR 3211 @VA03757 01548000 * OR 3203 PRINTER 01548100 SPACE 01549000 COMMOVE EQU * COMMON MOVE ENTRY @VA03757 01550000 BAL R3,MVSDRSEN MOVE SDR AND SENSE INTO RECORD @VA03757 01551000 BR R5 RETURN TO IN LINE CODE @VA03757 01552000 EJECT 01553000 *********************************************************** 01554000 * MOVE SDR COUNTERS AND SENSE * 01555000 * INFORMATION INTO RECORD * 01556000 SPACE 01557000 *** SET UP WORK REGS *** 01558000 SPACE 01559000 MVSDRSEN EQU * @VA03757 01560000 LR R14,R6 MOVE OBR ADDR TO WORKREG @VA03757 01561000 SLR R7,R7 CLEAR IT @VA03757 01562000 IC R7,OBRDDCNT GET DEVICE DEPENDENT LENGTH @VA03757 01563000 SLL R7,3 CONVERT LENGTH TO BYTES @VA03757 01564000 LA R7,X'40'(,R7) INCREMENT TO SDR AREA @VA03757 01565000 AR R14,R7 UPDATE OBR RECORD BASE @VA03757 01566000 SPACE 2 01567000 *** SET UP FOR SDR AREA *** 01568000 SPACE 01569000 ICM R7,1,OBRSDRCT GET SDR LENGTH @VA03757 01570000 BZ NOSDR BRANCH IF SDR COUNTERS DO NOT @VA03757 01571000 * EXIST FOR THIS DEVICE CLASS 01572000 LTR R9,R9 ANY COUNTERS FOR THIS DEVICE ? @VA03757 01573000 BZ NOSDRNOW BR IF NONE,MOVE JUST SENSE TO OBR@VA03757 01574000 BCTR R7,R0 SUBTRACT ONE FOR EXECUTE INSTR. @VA03757 01575000 EX R7,MOVESDR GO MOVE SDR COUNTERS @VA03757 01576000 LA R14,1(,R14) ADD ONE TO OBR REG @VA03757 01577000 AR R14,R7 FINISH ADDING SDR LGTH TO OBR REG@VA03757 01578000 EX R2,MOVESEN GO MOVE SENSE INTO OBR @VA03757 01579000 SPACE 2 01580000 *** CLEAR SDR COUNTERS AND FLAGS 01581000 SPACE 01582000 LTR R9,R9 ANY SDRBLOK ?? @VA03757 01583000 BZR R3 NO, FORGET CLEARING IT @VA03757 01584000 IC R7,OBRSDRCT GET SIZE OF SDR WORK AREA @VA03757 01585000 BCTR R7,R0 *** SUBTRACT TWO *** @VA03757 01586000 CLEARSHT BCTR R7,R0 *** FOR EXECUTE MOVE *** @VA03757 01587000 MVI SDRCTRS,ZERO SET UP FOR RESET @VA03757 01588000 EX R7,CLRSDR GO RESET SDR COUNTERS @VA03757 01589000 MVI SDRFLAGS,X'00' CLEAR SDR FLAGS @VA03757 01590000 BR R3 RETURN TO SUBROUTINE @VA03757 01591000 SPACE 2 01592000 * NO SDR INFORMATION, FINISH OBR BY MOVING JUST SENSE 01593000 SPACE 01594000 NOSDRNOW AR R14,R7 ADD SDR LENGTH TO OBR BASE @VA03757 01595000 NOSDR EX R2,MOVESEN GO MOVE SENSE INTO OBR @VA03757 01596000 BR R3 RETURN TO SUBROUTINE @VA03757 01597000 SPACE 2 01598000 * ROUTINE TO BUILD SHORT OBR , DONE AT SDR COUNTER 01599000 * OVERFLOW , SHUTDOWN AND VARY OFFLINE COMMAND 01600000 SPACE 01601000 SHORTOBR EQU * @VA03757 01602000 OI OBRSWSN+1,OBRTEMP+OBRSHOBR TURN ON SHORT AND @VA03757 01603000 * TEMPORARY OBR FLAGS 01604000 MVC OBRSDRSH(4),SDRLNGTH MOVE LENGTH OF SDR @VA03757 01605000 * COUNTERS AND CUA 01606000 SLR R7,R7 CLEAR WORK REG @VA03757 01607000 IC R7,SDRLNGTH GET SDR COUNTERS LENGTH @VA03757 01608000 BCTR R7,R0 SUBTRACT ONE FOR EXECUTED MOVE @VA03757 01609000 EX R7,MVESDR GO MOVE SDR COUNTERS INTO OBR @VA03757 01610000 BAL R3,CLEARSHT OK LETS RESET THE SDRBLOK @VA03757 01611000 BR R5 RETURN FROM WHENCE WE CAME @VA03757 01612000 SPACE 2 01613000 OBRMDR EQU * BUILD MDR FOR 3211/3203 ERROR @V386298 01614000 MVC OBRCORL(1),ERRCORR SAVE CORRELATION NUMBER @VA03757 01615000 OI OBRSWSN,X'80' TURN ON MULTIPE RECORD FLAG @VA03757 01616000 BAL R3,MVSDRSEN MOVE SDR AND SENSE INTO RECORD @VA03757 01617000 LA R2,RECDLEN GET LENGTH OF OBR RECORD @VA03757 01618000 ST R2,0(,R1) SAVE LENGTH OF OBR RECORD IN REC @VA03757 01619000 LA R6,LENGOBR(,R1) GET ADDRESS OF AVAILABLE AREA @VA03757 01620000 USING TNSREC,R6 SET UP ADDRESSABILITY FOR MDR @VA03757 01621000 TM XOBRFLAG,XOBRT1+XOBRT3 TEST FOR TYPE 1 & 3 MDR @VA03757 01622000 BZ MDRREC2 NO, MUST BE TYPE 2 MDR RECORD @VA03757 01623000 BO MDRREC1 YES, BUILD TYPE 1 & 3 MDR RECORDS@VA03757 01624000 TM XOBRFLAG,XOBRT1 IS THIS A TYPE 1 MDR RECORD @VA03757 01625000 BO MDRREC1 YES, BUILD TYPE 1 MDR RECORD @VA03757 01626000 MDRREC3 EQU * BUILD & FORMAT TYPE 3 MDR RECORD @VA03757 01627000 LA R2,TYP3SIZE GET SIZE OF TYPE 3 MDR RECORD @VA03757 01628000 BAL R3,MDR3211 FORMAT HEADER FOR MDR RECORD @VA03757 01629000 MVI TNSDEVAD+3,X'03' INSERT 3211/3203 BUFFER TYPE @V386298 01630000 CLI RDEVTYPE,TYP3203 IS IT A 3203 PRINTER?? @V386298 01630100 BE MDR33203 YES--HANDLE TYPE 3 MDR RECORD @V386298 01630200 MVC TNSDEVAD+4(150),XOBR150 MOVE PRINT LINE BUFFER @VA03757 01631000 MVC TNSDEVAD+154(10),XOBR010 INTO MDR RECORD @VA03757 01632000 BR R5 RETURN TO IN LINE CODE @VA03757 01633000 MDR33203 MVC TNSDEVAD+4(132),XOBR150 MOVE 3203 PLB @V386298 01633100 MVC TNSDEVAD+136(10),XOBR010 1ST 10 EROR CHAR @V386298 01633200 BR R5 RETURN TO IN LINE CODE @V386298 01633300 SPACE 1 01634000 MDRREC2 EQU * BUILD & FORMAT TYPE 2 MDR RECORD @VA03757 01635000 LA R2,TYP2SIZE GET SIZE OF TYPE 2 MDR RECORD @VA03757 01636000 BAL R3,MDR3211 FORMAT HEADER FOR MDR RECORD @VA03757 01637000 MVI TNSDEVAD+3,X'02' INSERT 3211/3203 BUFFER TYPE @V386298 01638000 MVC TNSDEVAD+4(180),XOBR180 FORM CONTRL BUFFER (FCB)@VA03757 01639000 BR R5 RETURN TO IN LINE CODE @VA03757 01640000 SPACE 1 01641000 MDRREC1 EQU * BUILD & FORMAT TYPE 1 MDR RECORD @VA03757 01642000 LA R2,TYP1SIZE GET SIZE OF TYPE 1 MDR RECORD @VA03757 01643000 BAL R3,MDR3211 FORMAT HEADER FOR MDR RECORD @VA03757 01644000 MVI TNSDEVAD+3,X'01' INSERT 3211/3203 BUFFER TYPE @V386298 01645000 MVC TNSDEVAD+4(256),XOBR512 MOVE UNIVERSAL CHAR. SET@VA03757 01646000 CLI RDEVTYPE,TYP3203 IS IT A 3203 PRINTER?? @V386298 01646100 BE MDR13203 YES--HANDLE TYPE 1 MDR RECORD @V386298 01646200 MVC TNSDEVAD+260(256),XOBR512+256 BUFFER INTO RECORD@VA03757 01647000 B CHMDR1N3 GO CHECK MDR RECORDS 1 & 3 @V386298 01647100 MDR13203 MVC TNSDEVAD+260(148),XOBR512+256 INTO RECORD @V386298 01647200 CHMDR1N3 EQU * @V386298 01647300 TM XOBRFLAG,XOBRT1+XOBRT3 IS THIS TYPE 1 & 3 MDR @VA03757 01648000 BNOR R5 NO, RETURN TO IN LINE CODE @VA03757 01649000 LA R6,0(R2,R6) UPDATE TO NEXT AVAILABLE AREA @VA03757 01650000 BAL R3,MDRREC3 GO BUILD TYPE 3 MDR RECORD @VA03757 01651000 SPACE 2 01652000 MDR3211 EQU * SET UP HEADER FOR MDR RECORD @VA03757 01653000 S R2,F4 SUBTRACT LENGTH FIELD FROM SIZE @VA03757 01654000 ST R2,0(,R6) SAVE LENGTH OF MDR RECORD @VA03757 01655000 LA R6,4(R6) UPDATE PASS LENGTH FIELD @VA03757 01656000 MVC TNSREC(24),4(R1) MOVE OBR HEADER INTO MDR HEADER@VA03757 01657000 MVI TNSKEYN,X'91' INDICATE MDR CLASS TYPE @VA03757 01658000 MVI TNSSWS3,X'04' SET 3211/3203 PRINTER FLAG @V386298 01659000 MVC TNSDEVAD(2),ERRIOB MOVE DEVICE ADDR INTO REC @VA03757 01660000 MVC TNSDEVAD+2(1),ERRCORR PUT CORRELATION CT. IN REC@VA03757 01661000 BR R3 RETURN TO IN LINE CODE @VA03757 01662000 SPACE 2 01663000 MDRREC EQU * BUILD MISCELLANEOUS DATA RECORD @VA03757 01664000 LA R4,ERRMIOER GET ADDRESS OF FIRST IOERBLOK @VA03757 01665000 BAL R3,GETSPACE GET SPACE FOR THE MDR RECORD @VA03757 01666000 USING TNSREC,R6 SETUP ADDRESSABILITY FOR MDR REC @VA03757 01667000 BAL R3,OBRMDRCL CLEAR MISCELLANEOUS DATA RECORD @VA03757 01668000 MVC TNSKEYN(16),ERRKEY CLASS/SYSTEM/REL. NO./TIME @VA03757 01669000 MVC TNSCPIDN(8),CPUID SET UP CPU SERIAL NO. & IDENT.@VA03757 01670000 MVI TNSSWS3,X'03' SET 3270 REMOTE STATION FLAG @VA03757 01671000 CLI RDEVTYPC,CLASTERM IS THIS A REMOTE BISYNC LINE @VA03757 01672000 BE MDRCONTK YES, MOVE DEVICE DEPENDENT DATA @VA03757 01673000 TM RDEVTYPC,CLASURO IS IT A 3800 PRINTER ? @V60B9BA 01673100 BZ MDRREC4 XFER IF NOT @V60B9BA 01673200 CLI RDEVTYPE,TYP3800 IS IT REALLY A 3800? @V60B9BA 01673300 BNE MDRREC4 XFER IF NOT @V60B9BA 01673400 MVI TNSSWS3,X'0C' 3800 DEVICE TYPE @V60B9BA 01673500 MVC TNSDEVAD(2),ERRMIOB DEVICE ADDRESS @V60B9BA 01673600 MVC TNS3800(136),IOERDATA ENVIRONMENTAL DATA @VA09396 01673750 BR R5 RETURN TO INLINE CODE @V60B9BA 01673800 MDRREC4 MVI TNSSWS3,X'05' SET 3705 TERMINAL FLAG @V60B9BA 01674000 CLI RDEVTYPC,CLASDASD IS THIS A DASD DEVICE CLASS @VA03757 01675000 BNE MDRCONTK NO, MOVE 3705 DEPENDENT DATA @VA03757 01676000 MVI TNSSWS3,X'09' SET 3340 DEVICE TYPE FLAG @VA03757 01677000 CLI RDEVTYPE,TYP3340 IS THIS A 3340 DEVICE TYPE @VA03757 01678000 BE MDRDASD YES, GET DEVICE ADDRESS @VA03757 01679000 MVI TNSSWS3,X'11' INDICATE 3350 TYPE @VA03757 01680000 CLI RDEVTYPE,TYP3350 IS THIS A 3350 ?? @VA03757 01681000 BE MDRDASD YES , BRANCH @VA03757 01682000 MVI TNSSWS3,X'01' SET 3330 DEVICE TYPE FLAG @VA03757 01683000 CLI RDEVTYPE,TYP2305 IS THIS A 2305 DEVICE TYPE @VA03757 01684000 BE MDR2305 YES, SET UP DEVICE TYPE FOR 2305 @VA03757 01685000 CLI RDEVMDL,X'0B' IS THIS A 3330 MODEL 11 DEVICE @VA03757 01686000 BNE MDRDASD NO, MUST BE 3330 DEVICE @VA03757 01687000 MVI TNSSWS3,X'0A' SET 3330-11 DEVICE TYPE FLAG @VA03757 01688000 B MDRDASD GET DEVICE ADDRESS @VA03757 01689000 MDR2305 EQU * GET CORRECT DEVICE TYPE @VA03757 01690000 MVI TNSSWS3,X'02' SET 2305 MODEL 2 DEVICE TYPE FLAG@VA03757 01691000 TM RDEVMDL,X'01' IS THIS A 2305 MODEL 1 DEVICE @VA03757 01692000 BZ MDRDASD NO, GET DEVICE ADDRESS @VA03757 01693000 OI TNSSWS3,X'10' SET 2305 MODEL 1 DEVICE TYPE FLAG@VA03757 01694000 MDRDASD EQU * MOVE DASD DEPENDENT DATA INTO REC@VA03757 01695000 MVC TNSDEVAD(2),ERRMIOB PUT DEVICE ADDRESS IN REC @VA03757 01696000 MVC TNSVOLID(6),IOERVSER MOVE IN VOLUME SERIAL NO. @VA03757 01697000 CLI RDEVTYPE,TYP2305 IS THIS A 2305 DEVICE TYPE @VA03757 01698000 BNE MDR33SEN NO, GET 3330 SENSE INFORMATION @VA03757 01699000 MVC TNSVOLID(128),IOERDATA GET ENVIRONMENTAL DATA @VA03757 01700000 BR R5 RETURN TO IN LINE CODE @VA03757 01701000 SPACE 1 01702000 MDR33SEN EQU * MOVE DEPENDENT DATA INTO RECORD @VA03757 01703000 LA R3,TNSSNS1 GET ADDRESS OF DEPENDENT AREA @VA03757 01704000 LR R2,R4 GET ADDRESS OF IOERBLOK @VA03757 01705000 MDRMOVE EQU * ... @VA03757 01706000 LH R15,IOERLEN-IOERBLOK(R2) GET IOERBLOK EXT. SIZE @VA03757 01707000 BCTR R15,R0 SUBTRACT ONE - EXECUTE INST. @VA03757 01708000 EX R15,MOVENV MOVE DATA INTO RECORD @VA03757 01709000 CLC 0(4,R2),ZEROES ANY MORE IOERBLOKS TO PROCESS @VA03757 01710000 BE MDRDEVTY NO, GO CHECK IF DEVICE ADDRESS OK@VA03757 01711000 LA R3,1(R15,R3) UPDATE DEPENDENT AREA POINTER @VA03757 01712000 LA R15,IOERSIZE GET SIZE OF IOERBLOK @VA03757 01713000 AH R15,IOEREXT-IOERBLOK(R2) ADD TO IT EXT SIZE @VA03757 01714000 SLL R15,3 CONVERT TO BYTES @VA03757 01715000 AR R2,R15 POINT TO NEXT IOERBLOK @VA03757 01716000 B MDRMOVE GO MOVE DATA FROM NEXT IOERBLOK @VA03757 01717000 MDRDEVTY SR R2,R2 CLEAR OUT A WORK REG @VA06173 01718100 IC R2,TNSSNS1+4 GET THE DRIVE ID BYTE @VA06173 01718200 TM RDEVTYPE,TYP3340+TYP3350 1 OF 8 DEVICE TYPE ?? @VA03757 01720000 BNZR R5 YES, DEVICE ADDRESS OK, RETURN @VA03757 01721000 CLI RDEVTYPE,TYP3330 IS DASD A 3330 DEVICE ?? @VA03757 01722000 BNE MDRDEV NO, BYPASS 3330 EMULATION TEST @VA03757 01723000 TM TNSSNS1+2,X'08' TEST FOR EMULATED 3330 DEV @VA03757 01724000 BOR R5 YES, ADDRESS OK - RETURN @VA11982 01725010 MDRPHA N R2,F7 ISOLATE 3-BIT ID @VA05891 01727100 TM TNSSNS1+4,X'40' 2ND OR 4TH CU ?? @VA05891 01727200 BNO MDRDEV IF NOT, BRANCH @VA04586 01728000 A R2,F8 BUMP ADDRESS IF 2ND OR 4TH @VA04586 01729000 * CONTROL UNIT 01730000 MDRDEV EQU * @VA04586 01731000 LH R3,ERRMIOB GET LOGICAL DEVICE ADDRESS @VA04586 01732000 N R3,=X'0000FFF0' CLEAR MODULE/DRIVE ID. @VA03757 01733000 OR R3,R2 GET PHYSICAL DEVICE ADDRESS @VA03757 01734000 STCM R3,3,TNSDEVAD SAVE PHYSICAL ADDRESS IN MDR REC @VA03757 01735000 BR R5 RETURN TO IN LINE CODE @VA03757 01736000 SPACE 1 01737000 MOVENV MVC 0(0,R3),IOERDATA-IOERBLOK(R2) MOVE DATA INTO REC@VA03757 01738000 SPACE 1 01739000 MDRCONTK EQU * MOVE DEPENDENT DATA FROM CONTASK @VA03757 01740000 SR R2,R2 CLEAR WORK REG @VA03757 01741000 LH R2,ERRCCNT GET LENGTH OF DEPENDENT BUFFER @VA03757 01742000 BCTR R2,R0 SUBTRACT ONE - EXECUTE INST. @VA03757 01743000 EX R2,MOVCONT MOVE BUFFER INTO MDR RECORD @VA03757 01744000 BR R5 RETURN TO IN LINE CODE @VA03757 01745000 SPACE 1 01746000 MOVCONT MVC 24(0,R6),ERRCONT MOVE BUFFER INTO MDR RECORD @VA03757 01747000 SPACE 2 01748000 SPACE EQU * GET SIZE AND STORAGE FOR OBR REC @VA03757 01749000 USING SDRBLOK,R9 ADDRESSABILITY FOR SDRBLOK @VA03757 01750000 LA R1,LENGOBR GET SIZE OF OBR RECORD @VA03757 01751000 ICM R9,15,RDEVCTRS PICK UP SDRBLOK @VA03757 01752000 BZ BYPASS03 BRANCH IF NO SDRBLOK @VA03757 01753000 TM ERRSDR,SDRSHRT SHORT OBR ?? @VA03757 01754000 BZ BYPASS03 NO, ITS A LONG OBR @VA03757 01755000 IC R1,SDRLNGTH GET LENGTH OF SDR COUNTERS @VA03757 01756000 LA R1,36(,R1) ADD OBR HEADER SIZE @VA03757 01757000 B CONVDWD GO CONVERT TO DOUBLEWORDS @VA03757 01758000 BYPASS03 EQU * @VA03757 01759000 CLC RDEVTYPC(2),P3203 IS IT A 3203 PRINTER?? @V386298 01759100 BE EXTNDLEN YES--GO GET LEN OF EXTNSN BLOK @V386298 01759600 CLC RDEVTYPC(2),P3211 IS THIS A 3211 (PRINTER) @VA03757 01760000 BNE CONVDWD NO, CONVERT LENGTH TO DOUBLEWORDS@VA03757 01761000 EXTNDLEN EQU * @V386298 01761500 LH R15,IOEREXT GET LENGTH OF EXTENSION BLOCK @VA03757 01762000 LTR R15,R15 IS THE EXTENSION LENGTH ZERO @VA03757 01763000 BZ CONVDWD YES, CONVERT LENGTH TO DWORDS @VA03757 01764000 LA R1,TYP2SIZE+LENGOBR GET SIZE OF TYPE 2 MDR REC. @VA03757 01765000 TM XOBRFLAG,XOBRT1+XOBRT3 IS THIS TYPE 1 & 3 MDR @VA03757 01766000 BZ CONVDWD YES, GO CONVERT TO DOUBLEWORDS @VA03757 01767000 LA R1,TYP1SIZE+TYP3SIZE+LENGOBR SIZE OF TYPE 1 & 3 @VA03757 01768000 BO CONVDWD GO CONVERT TO DOUBLEWORDS @VA03757 01769000 LA R1,TYP1SIZE+LENGOBR GET SIZE OF TYPE 1 MDR REC. @VA03757 01770000 TM XOBRFLAG,XOBRT1 IS THIS A TYPE 1 MDR RECORD @VA03757 01771000 BO CONVDWD YES, GO CONVERT TO DOUBLEWORDS @VA03757 01772000 LA R1,TYP3SIZE+LENGOBR GET SIZE OF TYPE 3 MDR REC. @VA03757 01773000 BAL R2,CONVDWD GO CONVERT LENGTH TO DOUBLEWORDS @VA03757 01774000 DROP R9 @VA03757 01775000 SPACE 2 01776000 GETSPACE EQU * GET SPACE FOR MDR RECORD @VA03757 01777000 TM RDEVTYPC,CLASURO IS IT A 3800 PRINTER ? @V60B9BA 01777100 BZ GTSP2 XFER IF NOT @V60B9BA 01777200 CLI RDEVTYPE,TYP3800 IS IT REALLY A 3800? @V60B9BA 01777300 BNE GTSP2 XFER IF NOT @V60B9BA 01777400 LA R1,172 LENGTH OF 3800 MDR RECD @V60B9BA 01777500 B CONVDWD CONVERT TO DOUBLE WORDS @V60B9BA 01777600 GTSP2 CLI RDEVTYPC,CLASDASD IS THIS A DASD DEVICE CLASS @V60B9BA 01778000 BE STGDASD YES, GET SPACE FOR DASD RECORD @VA03757 01779000 LA R1,28 LENGTH OF HEADER & LENGTH FIELD @VA03757 01780000 AH R1,ERRCCNT ADD BUFFER LENGTH TO HEADER @VA03757 01781000 B CONVDWD GO CONVERT LENGTH TO DOUBLEWORDS @VA03757 01782000 SPACE 1 01783000 STGDASD EQU * GET SPACE FOR DASD MDR RECORD @VA03757 01784000 LA R1,128+(TNSVOLID-TNSREC) GET SIZE OF 2305 MDR @VA09736 01785010 CLI RDEVTYPE,TYP2305 IS THIS A 2305 DEVICE TYPE @VA03757 01786000 BE CONVDWD YES, CONVERT LENGTH TO DWORDS @VA03757 01787000 LA R1,36 LENGTH OF HEADER & LENGTH FIELD @VA03757 01788000 LR R7,R4 GET CURRENT IOERBLOK POINTER @VA03757 01789000 DEPSTG EQU * GET LENGTH OF DEPENDENT DATA @VA03757 01790000 AH R1,IOERLEN-IOERBLOK(R7) ADD LENGTH OF EXTENSION @VA03757 01791000 ICM R6,15,IOERPNT-IOERBLOK(R7) PTR. TO NEXT IOERBLOK@VA03757 01792000 BZ CONVDWD NO MORE IOERBLOKS, GO GET BLOK @VA03757 01793000 LA R6,IOERSIZE IOERBLOK SIZE IN DOUBLEWORDS @VA03757 01794000 AH R6,IOEREXT-IOERBLOK(R7) ADD EXTENTION SIZE @VA03757 01795000 SLL R6,3 CONVERT TO BYTES @VA03757 01796000 AR R7,R6 IOER POINTER NOW UPDATED TO NEXT @VA03757 01797000 B DEPSTG CONTINUE COMPUTING SIZE @VA03757 01798000 CONVDWD EQU * CONVERT LENGTH TO DOUBLEWORDS @VA03757 01799000 A R1,F7 UPDATE BY ONE DOUBLEWORD @VA03757 01800000 SRL R1,3 GET NUMBER OF DOUBLEWORDS @VA03757 01801000 CALLFRE EQU * @VA03757 01802000 LR R0,R1 ... @VA03757 01803000 CALL DMKFREE GET STORAGE FOR MDR RECORD @VA03757 01804000 BR R3 RETURN TO IN LINE CODE @VA03757 01805000 SPACE 2 01806000 OBRMDRCL EQU * CLEAR OBR/MDR RECORD AREA @VA03757 01807000 LR R7,R0 LENGTH IN DOUBLEWORDS OF RECORD @VA03757 01808000 SLL R7,3 GET ACTUAL LENGTH OF RECORD @VA03757 01809000 S R7,F4 SUBTRACT LENGTH FIELD FROM SIZE @VA03757 01810000 ST R7,0(,R1) SAVE LENGTH OF RECORD IN RECORD @VA03757 01811000 LA R6,4(,R1) GET ADDRESS OF RECORD BUILD AREA @VA03757 01812000 BCTR R7,R0 SUBTRACT TWO BYTES FROM SIZE, @VA03757 01813000 BCTR R7,R0 BECAUSE OF EXECUTE INSTRUCTION @VA03757 01814000 MVI 0(R6),X'00' SET FIRST BYTE IN RECORD TO ZERO @VA03757 01815000 C R7,F255 DOES COUNT EXCEEDS 255 @VA03757 01816000 BNH *+8 NO, BYPASS SETTING COUNT TO 255 @VA03757 01817000 LA R7,255 SET COUNT VALUE TO MAXIMUM @VA03757 01818000 EX R7,OBMDRCLR CLEAR OBR/MDR RECORD AREA @VA03757 01819000 BR R3 RETURN TO IN LINE CODE @VA03757 01820000 SPACE 1 01821000 OBMDRCLR MVC 1(0,R6),0(R6) CLEAR OBR/MDR RECORD AREA @VA03757 01822000 SPACE 2 01823000 IOEREALA DC F'00' REAL ADDRESS OF RECORDING PAGE @VA03358 01824000 IOEVMPAD DC F'00' ADDRESS OF VIRTUAL MEMORY PAGE @VA03358 01825000 CECYL DC H'00' OBR/MDR CYLINDER NO. FOR PAGING @VA03358 01826000 CEPAGE DC X'01' OBR/MDR PAGE NO. (INITIALIZE 1) @VA03358 01827000 CECYLTYP DC X'00' OBR/MDR SYSRES DEVICE TYPE @VA03358 01828000 * NOTE: WORKCYL AND WORKPAGE MUST REMAIN CONTIGUOUS @V5088AA 01828100 WORKCYL DC H'00' WORK CYLINDER NUMBER FOR PAGING @VA03358 01832000 WORKPAGE DC X'01' WORK PAGE NO. (INITIALIZE 1) @VA03358 01833000 WORKTYP DC X'00' WORK SYSRES DEVICE TYPE @VA03358 01834000 MAXPAGE DC X'00' NO. OF PAGES (MAX) ON A CYLINDER @VA03358 01835000 PAGNOUPD DC F'00' SAVE UPDATED PAGE NUMBER @VA11472 01836010 * NOTE: AREA90PC, LASTCYL, AND PAG90PC MUST REMAIN CONTIGUOUS @V5088AA 01836100 AREA90PC DS 0H CCP VALUE OF 90% FULL MARK OF @V5088AA 01836200 * ERROR RECORDING AREA @V5088AA 01836300 LASTCYL DC H'0000' CYL ADDRESS OF RECORDING AREA END@V5088AA 01836400 PAG90PC DC X'00' NO. OF PAGES (90 % FULL) ON A CYL@VA03358 01837000 FLAG90PC DC X'00' FLAG FOR 90 % CYL FULL CONDITION @VA03358 01838000 MCCHFLAG DC X'00' MCH/CCH ENTRY INDICATOR @VA03358 01839000 SPACE 1 01840000 MCHFLAG EQU X'80' MCH ENTRY FLAG @VA03358 01841000 CCHFLAG EQU X'C0' CCH ENTRY FLAG @VA03358 01842000 ERRCYL90 EQU X'80' 90% FULL FLAG FOR RECORDING AREA @V5088AA 01843100 SPACE 1 01845000 INITFMT DC X'00088000FFFFFFFF' INITIALIZE CONTROL HEADER @VA03358 01846000 SPACE 1 01847000 DS 0F @VA03757 01848000 ANDMASK DC X'00000011' @VA03757 01849000 P3211 DC X'1042' 3211 PRINTER @VA03757 01850000 P3203 DC X'1043' 3203 PRINTER @V386298 01850100 BITABL DC X'8040201008040201' MASK TABLE @VA03757 01851000 PARMLST EQU * @VA03757 01852000 PARMBSC DC X'04040102030506073FFF' @VA03757 01853000 PARMCNS DC X'0F0F0102033FFF' @VA03757 01854000 PARMCNS1 EQU PARMBSC @VA03757 01855000 PARMGRF DC X'04040F02030F06073FFF' @VA03757 01856000 PARMDAS DC X'0404010203050607200F2223240F163FFF' @VA03757 01857000 PARMTAP1 DC X'0F0F1F101F301F311F331F3405320F0F0F0F0F0F' @VA03757 01858000 PARMCNT DC X'525455560F810F8384850F0F0F0F0F0F1F360240FF' @VA03757 01859000 PARMTAP2 DC X'0F0F1F101F301F311F331F34053237430F0F0F0F' @VA03757 01860000 PARMCNT1 DC X'5254555680810F83848586870F910F0F1F360240FF' @VA03757 01861000 PARMRSE DC X'04040102033FFF' @VA03757 01862000 PARMRSE1 DC X'0404010203063FFF' @VA03757 01863000 PARMRSE2 DC X'0F04010203053FFF' @VA03757 01864000 PARMRSE3 DC X'0F040102033FFF' @VA03757 01865000 PARMRSE4 DC X'04040F020305060F101112130F153FFF' @VA03757 01866000 ERMPARM DC X'B0' PARM=OPERATOR+ALARM+RETURN @V305435 01867000 D2311 EQU X'11' 2311 DASD DEVICE @V304498 01868000 D2303 EQU X'03' 2303 DASD DEVICE @V304498 01869000 D2301 EQU X'01' 2301 DASD DEVICE @V304498 01870000 ZERO EQU 00 @VA03757 01871000 ONE EQU 01 @VA03757 01872000 DATCHK EQU 04 @VA03757 01873000 SDRCNTLN EQU 10 @VA03757 01874000 FIFTEEN EQU 15 @VA03757 01875000 SDRCTLN1 EQU 20 @VA03757 01876000 RECDLEN EQU 132 LENGTH OF OBR RECORD @VA03757 01877000 LENGOBR EQU 136 SIZE OF OBR RECORD & LENGTH FIELD@VA03757 01878000 TYP3SIZE EQU 200 SIZE TYPE3 3211/3203 MDR @V386298 01879000 TYP2SIZE EQU 216 SIZE TYPE2 3211/3203 MDR @V386298 01880000 OVFLMSK EQU 240 @VA03757 01881000 FULLBYTE EQU 255 @VA03757 01882000 FOXES EQU FULLBYTE @VA03757 01883000 TYP1SIZE EQU 552 SIZE TYPE1 3211/3203 MDR @V386298 01884000 EJECT 01885000 LTORG @VA03358 01886000 EJECT 01887000 COPY OBRRECN @VA03358 01888000 COPY IOBLOKS @VA03757 01889000 COPY IOER @VA03757 01890000 EJECT 01891000 COPY ERRBLOK @VA03757 01892000 EJECT 01893000 COPY SDRBLOK @VA03757 01894000 COPY TNSREC @VA03757 01895000 COPY VMBLOK @VA03757 01896000 COPY RECPAG @VA03358 01897000 COPY DEVTYPES @VA03358 01898000 COPY EQU @VA03358 01899000 COPY RBLOKS @VA03358 01900000 PSA @VA03358 01901000 COPY SAVE @VA03358 01902000 END 01903000