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