GIO TITLE 'DMKGIO (CP) VM/370 - RELEASE 6' 00001000 ISEQ 73,80 VALIDATE SEQUENCING OF INPUT @V200020 00002000 *. 00003000 * MODULE NAME - 00004000 * DMKGIO 00005000 * 00006000 * FUNCTION - 00007000 * 00008000 * TO ALLOW CP TO DO ERROR RECOVERY FOR I/O OPERATIONS THAT 00009000 * WERE INITIATED BY CMS. 00010000 * 00011000 * ATTRIBUTES - 00012000 * REENTRANT, PAGEABLE, CALLED VIA SVC 00013000 * 00014000 * ENTRY POINT - 00015000 * DMKGIOEX 00016000 * 00017000 * ENTRY CONDITIONS - 00018000 * GPR 1=ADDRESS OF USER'S "R1" AND "R2" REGISTERS 00019000 * GPR 11=ADDRESS OF USER'S VMBLOK 00020000 * GPR 12=BASE ADDRESS OF DMKGIO 00021000 * 00022000 * USER'S "R1" REGISTER HOLDS THE VIRTUAL DEVICE ADDRESS 00023000 * USER'S "R2" REGISTER HOLDS THE VIRTUAL CAW ADDRESS * 00024000 * EXIT CONDITIONS - 00025000 * THE USER'S CONDITION CODE IN THE VIRTUAL PSW, AND GENERAL 00026000 * REGISTER 15 IS CHANGED BASED ON THE FOLLOWING CONDITIONS. 00027000 * 00028000 * CC=0 I/O COMPLETED SUCCESSFULLY 00029000 * 00030000 * CC=1 ERROR CONDITION, REG.15 CONTAINS RETURN CODE: 00031000 * R15=1 DEVICE NOT ATTACHED 00032000 * 00033000 * CC=2 EXCEPTION CONDITIONS; R15 CONTAINS RETURN CODE 00034000 * R15=2 UNIT EXCEPTION BIT IN DEV STATUS BYTE. 00035000 * R15=3 WRONG LENGTH RECORD DETECTED. 00036000 * 00037000 * CC=3 ERROR CONDITION, REG.15 CONTAINS RETURN CODE 00038000 * 00039000 * R15=13 A PERMANENT I/O ERROR OCCURRED. 00040000 * THE 2 LOW ORDER POS. OF THE USER'S CAW 00041000 * REGISTER CONTAINS THE FIRST 2 SENSE BYTES. 00042000 * 00043000 * 00044000 * CALLS TO OTHER ROUTINES - 00045000 * DMKFREE USED TO OBTAIN STORAGE FOR BUILDING IOBLOK. 00046000 * DMKFRET USED TO RETURN STORGE FOR IOBLOK. 00047000 * DMKIOSQV TO QUE THE I/O REQUEST. 00048000 * DMKCCWTR TO BUILD A REAL CHANNEL PROG. FROM VIRTUAL CCW'S. 00049000 * DMKDSPCH TO ALLOW OTHER ROUTINES TO RUN. 00050000 * DMKUNTRN TO TRANSLATE THE REAL CSW TO A VIRTUAL CSW. 00051000 * DMKUNTFR TO FREE STORAGE USED FOR BUILDING REAL CCW'S. 00052000 * DMKSCNVU - TO LOCATE A VIRTUAL DEVICE 00053000 * DMKSCNVD - TO GET THE DEVICE ADDRESS IN CCU FORM 00053500 * 00054000 * EXTERNAL REFERENCES - 00055000 * NONE 00056000 * 00057000 * 00058000 * TABLES AND WORK AREA'S - 00059000 * NONE 00060000 * 00061000 * 00062000 * REGISTER USAGE - 00063000 * GPR 4=VIRTUAL DEVICE 00064000 * GPR 5=VIRTUAL CAW 00065000 * GPR 6=ADDRESS OF VDEVBLOK 00066000 * GPR 7=SCRATCH 00067000 * GPR 8=ADDRESS OF VDEVBLOK 00068000 * GPR 9=SCRATCH 00069000 * GPR 10=ADDRESS OF IOBLOK 00070000 * GPR 11=ADDRESS OF VMBLOK 00071000 * GPR 12=BASE ADDRESS OF DMKGIO 00072000 * GPR 13=ADDRESS OF A SAVE AREA 00073000 * 00074000 * 00075000 * OPERATION - 00076000 * DMKGIO IS CALLED BY DMKHVC WHEN A USER HAS ISSUED A 00077000 * HYPERVISOR CALL FOR TAPE, UNIT RECORD, OR NON-STANDARD 00078000 * DISK I/O CHANNEL PROGRAMS. A CHECK IS MADE TO VALIDATE THAT 00079000 * THE DEVICE ADDRESS IS CORRECT AND, FOR MINIDISKS, THAT 00079500 * THE DEVICE IS NOT RESERVED BY ANOTHER USER. IF NO ERROR 00080000 * IS DETECTED, DMKGIO 00080500 * BUILDS AN IOBLOK AND CALLS DMKCCWTR. ON RETURN FROM DMKCCWTR 00081000 * A CALL IS MADE TO DMKIOSQV TO SCHEDULE A VIRTUAL DEVICE 00082000 * REQUEST. WHEN THE I/O OPERATION COMPLETES DMKGIO REGAINS 00083000 * CONTROL AT LABEL "DIAGRTN". THE IOBLOK IS CHECK FOR AN ERROR 00084000 * CONDITION AND IF NONE EXISTS,THE IOBLOK IS FRETTED, THE 00085000 * CONDITION CODE IS SET AND RETURN IS TO DMKDSPCH. 00086000 * 00087000 * OTHERWISE DMKUNTRN IS CALLED TO CONVERT THE REAL CSW TO A 00088000 * VIRTUAL CSW. THE USER'S PAGE 0 IS THEN READ IN AND THE 00089000 * CSW MOVE INTO IT. A RETURN CODE IS LOADED INTO REG.15 00090000 * AND THE PSW "CONDITION CODE" IS SET. FREE STORAGE IS 00091000 * RETURNED TO THE SYSTEMS POOL AND RETURN IS MADE TO DMKDSPCH. 00092000 * 00093000 * 00094000 * 00095000 *. 00096000 EJECT 00097000 COPY OPTIONS @V200020 00098000 COPY LOCAL @V200020 00099000 DMKGIO START 00100000 SPACE 00101000 DC CL8'DMKGIO' PAGEABLE MODULE IDENTIFIER @V200020 00102000 SPACE 00103000 EXTRN DMKCCWTR,DMKIOSQV @V200020 00104000 EXTRN DMKUNTRN,DMKUNTFR,DMKSCNVU @V200020 00105000 EXTRN DMKSCNVD @V407438 00105100 SPACE 00106000 USING *,R12 00107000 USING PSA,R0 00108000 USING VMBLOK,R11 00109000 USING SAVEAREA,R13 00110000 DMKGIOEX RELOC , VIRTUAL I/O WITHOUT INTERRUPTS @V200020 00111000 NI VMPSW+2,X'FF'-X'30' SET CC=0 00112000 NI VMPSW+4,X'FF'-X'30' SET CC=0 00113000 SPACE 1 00114000 L R4,0(,R1) LOAD REG1 W/ VIRTUAL DEV. ADDR. 00115000 L R5,0(,R2) LOAD REG5. W/ VIRTUAL CAW ADDRESS. 00116000 GIORST2 LR R1,R4 LOAD REG1 W/ VIRTUAL I/O ADDRESS @V407438 00117000 CALL DMKSCNVU 00118000 BNZ NOUNIT BRANCH IF DEVICE NO ATTACHED...CC= 1 00119000 LR R6,R8 SAVE VDEVBLOK ADDR. IN R6 00120000 USING VDEVBLOK,R8 00121000 TM VDEVSTAT,VDEVDED IS DEV. ATTACHED ? 00122000 BO DEVATTCH BRANCH IF YES 00123000 TM VDEVTYPC,CLASDASD IS DEVICE DASDI ? 00124000 BZ NOUNIT DEV MUST BE DASDI IF NOT ATTACHED. 00125000 DEVATTCH TM VDEVSTAT,VDEVCHAN+VDEVBUSY+VDEVPEND ANYTHING @VA01365 00126000 * HAPPENING? 00127000 BNZ NOPATH YES, CANT HANDLE THEN @VA01365 00128000 TM VDEVFLG2,VDEVRRF RES/REL FTR ON THIS MDISK? @V407438 00128020 BZ DEVFREE NOPE, BR. @V407438 00128040 L R9,VDEVRRB GET THE ADDRESS OF THE VRRBLOK @V407438 00128060 USING VRRBLOK,R9 ADDRESS THE VRRBLOK @V407438 00128080 TM VDEVFLG2,VDEVRES MDISK RESERVED FOR THIS USER @V407438 00128100 BO DEVFREE YES, LET HIM PASS, BR. @V407438 00128120 TM VRRSTAT,VRRRES ANYONE ELSE HAVE IT RESERVED? @V407438 00128140 BZ DEVFREE NOPE, CONTINUE. @V407438 00128160 LA R0,CPEXSIZE SIZE OF A CPEXBLOK @V407438 00128180 CALL DMKFREE GET ONE PLEASE @V407438 00128200 USING CPEXBLOK,R1 ADDRESS THE CPEXBLOK FROM R1 @V407438 00128220 STM R0,R15,CPEXR0 SAVE EVERYTHING JUST AS IT IS @V407438 00128240 LR R3,R1 SWITCH CPEXBLOK TO R3 @V407438 00128260 DROP R1 DROP USE OF CPEXBLOK FROM R1 @V407438 00128280 USING CPEXBLOK,R3 AND USE R3 INSTEAD @V407438 00128300 CALL DMKSCNVD GET DEVICE ADDRESS IN CCU FORM @V407438 00128320 ST R1,CPEXMISC SAVE IT IN MISC FOR DMKCFPRD @V407438 00128340 LA R0,GIORSTRT ADDRESS TO RESTART WITH PLEASE @V407438 00128360 ST R0,CPEXADD ... @V407438 00128380 L R1,VRRCPEX ADDRESS OF THE FIRST QED CPEXBLOK@V407438 00128400 ST R1,CPEXFPNT PUT THIS CPEXBLOK IN THE CHAIN @V407438 00128420 ST R3,VRRCPEX DITTO @V407438 00128440 OI VDEVFLG2,VDEVCPEX FLAG WAITING FOR "RELEASE" @V407438 00128460 OI VMRSTAT,VMIDLE DROP USER FROM QUEUE @V407438 00128480 GOTO DMKDSPCH COME BACK WHEN DEVICE IS FREE @V407438 00128500 * DROP FROM QUEUE, LEAVE IN EXECUTION WAIT @V407438 00128520 * IF DEVICE IS RESET, CPEXADD IS SET NEGATIVE, LTR'ED BY DMKDSP@V407438 00128540 GIORSTRT BM NOPATH DEVICE HAS BEEN RESET @V407438 00128560 NI VMRSTAT,X'FF'-VMIDLE ALLOW BACK IN QUEUE @V407438 00128580 NI VDEVFLG2,X'FF'-VDEVCPEX CFPRR - NOT WTNG ON CPEX@V407438 00128600 B GIORST2 NOW GO TRY IT AGAIN SAM @V407438 00128620 DROP R3,R9 NO MORE CPEXBLOK OR VRRBLOK @V407438 00128640 SPACE 00128660 DEVFREE EQU * HERE WHEN ACCESS TO MDISK IS FREE@V407438 00128680 STH R4,VMACTDEV SAVE VIRTUAL DEVICE ADDRESS @VM01016 00131000 LA R0,IOBSIZE GET AN IOB FOR THIS EVENT @VA01365 00132000 CALL DMKFREE GET STORAGE FOR BUILDING IOBLOK 00133000 LR R10,R1 LOAD REG10 W/ADDRESS OF IOBLOCK 00134000 USING IOBLOK,R10 SET UP ADDRESSABLITY FOR IOBLOCK 00135000 XC IOBLOK(IOBSIZE*8),IOBLOK CLEAR IOBLOK TO ZERO 00136000 ST R5,IOBCAW STORE VIRTUAL CAW ADDR. IN IOBLOK 00137000 OI IOBFLAG,IOBHVC SET ON IOBHVC BIT IN IOBLOK 00138000 LA R9,DIAGRTN LOAD REG9 W/ RETURN ADDR. FOR DISPATCHER 00139000 ST R9,IOBIRA SET RETURN ADDR. IN IRA 00140000 OI VMRSTAT,VMIOWAIT FORCE USER TO WAIT FOR I/O TO FINISH 00141000 ST R13,IOBMISC2 HANG ONTO SAVEAREA POINTER @V200020 00142000 LA R9,0 STORE INITIAL CCWADDR (0) @VA13292 00142300 ST R9,SAVEWRK8 OF CSW IN SAVEAREA @VA13292 00142600 L R2,IOBCAW CCWTRANS NEEDS CAW+KEY IN GPR2. 00143000 LA R9,0(,R2) CCWTRANS NEEDS CAW-KEY IN GPR9. 00144000 SL R8,VMDVSTRT MAKE GPR 8 FOR RELATIVE DISPLACEMENT. 00145000 ST R8,IOBMISC SAVE IT FOR LATER 00146000 CALL DMKCCWTR CALL CCWTR TO BUILD A REAL CCW LIST 00147000 AL R8,VMDVSTRT MAKE GPR 8 REAL ADDR. OF VDEVBLOK. 00148000 TM IOBSPEC2,IOBCLN TASK ABORTED BY DMKCCW? @V407438 00148100 BZ TRANSOK NOPE, CONTINUE @V407438 00148200 BAL R9,FRETIOB RETURN THE IOB @V407438 00148300 B NOPATH AND REFLECT TO USER @V407438 00148400 SPACE 00148500 TRANSOK EQU * HERE IF CCWTRANS WENT OK @V407438 00148600 ST R10,VDEVIOB STORE ADDRESS OF ACTIVE IOBLOK 00149000 XC VDEVCSW(8),VDEVCSW ZERO VDEVCSW @VA08386 00149500 OI VDEVSTAT,VDEVBUSY MAKE VIRTUAL DEVICE BUSY 00150000 LA R15,1 * ADD 1 TO THE VIRTUAL START I/O COUNT 00151000 AL R15,VMIOCNT * FOR ACCOUNTING. 00152000 ST R15,VMIOCNT * 00153000 CALL DMKIOSQV CALL IOSQV TO PUT THIS REQUEST ON THE LIS 00154000 GOTO DMKDSPCH DISPATCHER WILL RETURN WHEN I/O IS FINISH 00155000 SPACE 3 00156000 DIAGRTN DS 0H 00157000 USING *,R12 SET UP ADDRESSABLITY 00158000 SL R12,=A(DIAGRTN-DMKGIO) BACK UP TO MODULE START@V200020 00159000 USING DMKGIO,R12 @V200020 00160000 NI VMQLEVEL,X'FF'-(VMCOMP+VMLOPRI) UNFLAG COMPUTE BOUND 00161000 L R13,IOBMISC2 RESTORE SAVEAREA BASE ADDRESS @V200020 00162000 L R8,IOBMISC GET DISPLACEMENT TO VDEVBLOK 00165000 AL R8,VMDVSTRT POINT TO VDEVBLOK 00166000 CLI VDEVTYPC,CLASTAPE IS THIS A TAPE DEVICE? @VA12173 00166010 BNE COMPLETE NO- COMPLETE @VA12173 00166040 L R9,IOBCSW LOAD CCWADDRESS FROM CSW @VA13292 00166080 LA R9,0(R9) CLEAR HIGH ORDER BYTE @VA13292 00166095 LTR R9,R9 CCWADDRESS PRESENT @VA13292 00166110 BZ COMPLETE STORE IT FOR DMKTAP IF NOT ZERO @VA13292 00166125 MVC SAVEWRK8,IOBCSW @VA12173 00166130 COMPLETE DS 0H @VA12173 00166160 CL R10,IOBLINK FINAL INTERRUPT? @VA08386 00166300 BNE FRETCOPY NO, FRET COPIED IOB @VA08386 00166600 SR R0,R0 CLEAR VDEVIOB RIGHT NOW @VA03384 00167000 ST R0,VDEVIOB TO AVOID POSSIBLE RESET PROBLEM @VA03384 00168000 TM IOBSTAT,IOBCC3 REAL CC = 3 ON STARTIO OR DEVICE OFFLINE 00169000 BO GDSTATUS YES- BRANCH 00170000 ICM R7,15,IOBIOER IS THERE AN IOERBLOK @VA01599 00171000 BZ TESTWLR NO, CHECK FOR WRONG LENGTH RECORD@VA01599 00172000 TM VDEVTYPC,CLASDASD+CLASTAPE IS THIS A TAPE OR @VA01599 00173000 * DASD DEVICE 00174000 BZ GIOCONT NO, SET ERROR CONDITION @VA01599 00175000 TM IOBSTAT,IOBFATAL IS THIS AN UNCORRECTABLE ERROR @VA01599 00176000 BZ TESTWLR NO, TAKE NORMAL PATH @VA01599 00177000 GIOCONT EQU * @VA01599 00178000 LA R15,13 SET RETURN CODE TO 13. 00179000 BAL R9,RTNCC3 SET PSW CONDITION CODE =3 00180000 L R2,SAVER2 RESTORE POINTER TO USER'S 'R2' @V200020 00181000 ST R7,VDEVIOER STORE IN VIRTUAL DEV. BLOCK. 00182000 SR R1,R1 AND CLEAR IOBIOER 00184000 ST R1,IOBIOER (SINCE WE'VE HUNG IT ON ANOTHER HOOK) 00185000 USING IOERBLOK,R7 00186000 MVC VDEVCSW(8),IOERCSW MOVE IN THE ERROR CSW 00187000 CLC VDEVTYPC(2),=AL1(CLASDASD,TYP3340) 3340? @V56BDA8 00187050 BNE NOT3340 NO, RETURN (OR CONTINUE AT @V56BDA8 00187100 * GETRCAW) 00187150 TM IOERDATA+6,CECYL CE CYLINDER? @V56BDA8 00187200 BO NOT3340 YES, DONT TOUCH IT @V56BDA8 00187250 SR R0,R0 CLEAR OUT REGISTER @V56BDA8 00187300 IC R0,IOERDATA+6 0CCXHHHH @V56BDA8 00187350 SLL R0,3 GET C512 + C256 @V56BDA8 00187400 IC R0,IOERDATA+5 LOW ORDER CC @V56BDA8 00187450 SH R0,VDEVRELN MAKE POSITION VIRTUAL @V56BDA8 00187500 STH R0,VDEVPOSN STORE CC @V56BDA8 00187550 MVN VDEVPOSN+3(1),IOERDATA+6 COPY H @V56BDA8 00187600 NOT3340 EQU * @V56BDA8 00187650 L R7,IOERDATA LOAD UP SENSE BYTES 1-4 00188000 DROP R7 00189000 SRL R7,16 SHIFT OUT SENSE BYTES 3-4 00190000 ST R7,0(,R2) STORE SENSE BYTES 1-2 IN USER'S CAW REG. 00191000 LA R0,IOERSIZE GET IOERROR BLOK SIZE @VA10489 00191100 L R1,VDEVIOER GET ADDRESS OF IOERROR POINTER @VA10489 00191200 USING IOERBLOK,R1 LET ASSEMBLER KNOW @VA10489 00191300 AH R0,IOEREXT ADD EXTENSION IF NECCERARY @VA10489 00191400 DROP R1 @VA10489 00191500 CALL DMKFRET FREE THE BLOCK @VA10489 00191600 SLR R0,R0 ZERO R0 @VA10489 00191700 ST R0,VDEVIOER ZERO OUT POINTER TO ERROR BLOCK @VA10489 00191800 B UNTRAN GO UNTRANS THE CSW 00192000 TESTWLR TM IOBCSW+4,UE DID A UNIT EXCEPTION OCCUR ? 00193000 BO MOVECSW YES, SAVE THE CSW FOR THE USER 00194000 TM VDEVCSW+5,IL DID IL OCCUR IN 1ST INTERRUPT? @VA08386 00194200 BNO *+8 NO @VA08386 00194400 OI IOBCSW+5,IL PUT IN FINAL INTERRUPT @VA08386 00194600 TM IOBCSW+5,IL WAS IT A WRONG LENGTH RECORD ? 00195000 BZ MOVECSW NO,BRANCH @VA12728 00196100 LA R15,3 SET RETURN CODE TO 3 00197000 BAL R9,RTNCC2 SET PSW CONDITION CODE =2 00198000 MOVECSW MVC VDEVCSW,IOBCSW MOVE IOBCSW TO VIRTUAL CSW. 00199000 UNTRAN EQU * 00200000 CALL DMKUNTRN CALL UNTRN TO CONVERT CSW TO VIRTUAL 00201000 SL R8,VMDVSTRT CONVERT VDEVBLOK ADDR TO DISPL. 00202000 SR R1,R1 SET TO PAGE 0 00203000 TRANS 2,1,OPT=(BRING,DEFER) 00204000 AL R8,VMDVSTRT RESTORE VDEVBLOK ADDRESS 00205000 MVC CSW-PSA(8,R2),VDEVCSW MOVE CSW TO VIRTUAL USER'S CSW 00206000 SPACE 2 00207000 GDSTATUS EQU * HERE IF STATUS OK -- 00208000 CALL DMKUNTFR CALL UNTFR TO FREE STORAGE USED FOR 00209000 * BUILDING CCW STRING. 00210000 TM IOBCSW+4,UE DID A UNIT EXCEPTION OCCUR ?? 00211000 BZ FREEDEV NO -- 00212000 LA R15,2 SET RETURN CODE TO 2 00213000 BAL R9,RTNCC2 SET CONDITION CODE 2 IN VPSW 00214000 SPACE 00215000 FREEDEV EQU * MARK DEVICE FREE, RELEASE IOBLOK 00216000 NI VDEVSTAT,X'FF'-VDEVBUSY AND FLAG DEVICE NOT BUSY 00217000 TM IOBSTAT,IOBCC3 WAS THE DEVICE REALLY THERE ? 00218000 BO REALCC3 NO -- RETURN VIRTUAL CC = 3 00219000 BAL R9,FRETIOB RELEASE THE IOBLOK 00220000 B GIOEXIT REMOVE FROM WAIT, EXIT @V200020 00221000 SPACE 2 00222000 NOPATH LA R15,5 PATH NOT FREE, INT. PENDING @VA01365 00223000 LA R9,GIOEXIT SET CC1, ERROR 5... @VA01365 00224000 B RTNCC1 GO SET IT, THEN EXIT @VA01365 00225000 SPACE 00226000 REALCC3 EQU * REAL DEVICE DOES NOT EXIST @V200020 00227000 BAL R9,FRETIOB RELEASE IOBLOK, IOERBLOK @V200020 00228000 NOUNIT LA R15,1 SET RETURN CODE TO 1 00229000 BAL R9,RTNCC1 SET PSW CONDITION CODE =1 00230000 GIOEXIT EQU * @V200020 00231000 NI VMRSTAT,X'FF'-(VMIOWAIT+VMEXWAIT) @V200020 00232000 EXIT @V200020 00233000 EJECT 00234000 FRETCOPY EQU * RELEASE COPIED IOBLOK, WAIT FOR LAST 00235000 TM IOBCSW+5,IL GET AN IL ? @VA08386 00235200 BNO *+8 NO @VA08386 00235400 OI VDEVCSW+5,IL SAVE FOR FINAL INTERRUPT @VA08386 00235600 BAL R9,FRETIOB FRET IOBLOK, POSSIBLE IOERBLOK @V200020 00236000 GOTO DMKDSPCH WAIT FOR FINAL INTERRUPT @V200020 00237000 SPACE 00238000 RTNCC1 EQU * SET CONDITION CODE = ONE @V200020 00239000 LA R1,X'10' @V200020 00240000 B RTNCCS @V200020 00241000 RTNCC2 EQU * SET CONDITION CODE = TWO @V200020 00242000 LA R1,X'20' @V200020 00243000 B RTNCCS @V200020 00244000 RTNCC3 EQU * SET CONDITION CODE = THREE @V200020 00245000 LA R1,X'30' @V200020 00246000 * B RTNCCS @V200020 00247000 SPACE 00248000 RTNCCS EQU * SET VIRTUAL PSW CONDITION CODE @V200020 00249000 ST R15,VMGPRS+R15*4 RETURN CODE TO VIRTUAL GR15 @V200020 00250000 LA R2,VMPSW+4 BC-MODE COND. CODE LOCATION @V200020 00251000 TM VMESTAT,VMEXTCM IN EC-MODE NOW ? @V200020 00252000 BZ CLEARCC NO -- @VA13076 00253000 LA R2,VMPSW+2 EC-MODE COND. CODE LOCATION @V200020 00254000 CLEARCC NI 0(R2),X'FF'-X'30' CLEAR CONDITION CODE @VA13076 00254500 EX R1,RTNSCC SET VIRTUAL CONDITION CODE @V200020 00255000 BR R9 @V200020 00256000 RTNSCC OI 0(R2),*-* . . . @V200020 00257000 SPACE 00258000 FRETIOB EQU * RELEASE IOBLOK AND IOERBLOK @V200020 00259000 L R1,IOBIOER IS THERE AN IO ERROR BLOCK THERE @V200020 00260000 LTR R1,R1 ... @V200020 00261000 BZ FRETIOBL NOPE - PROCEED TO FRET THE IOBLOK@V200020 00262000 LA R0,IOERSIZE SIZE OF IOERBLOK @V200020 00263000 USING IOERBLOK,R1 @V200020 00264000 AH R0,IOEREXT ADD EXTRA SIZE (IF ANY) OF IOERBL@V200020 00265000 DROP R1 @V200020 00266000 CALL DMKFRET GIVE IT BACK (BEFORE IT'S TOO LAT@V200020 00267000 FRETIOBL LA R0,IOBSIZE GET SIZE OF IOBLOK @V200020 00268000 LR R1,R10 AND ITS ADDRESS @V200020 00269000 CALL DMKFRET RELEASE IT @V200020 00270000 BR R9 RETURN INTERNALLY @V200020 00271000 SPACE 1 00271100 CECYL EQU X'10' CE CYLINDER ON 3340/3344 @V56BDA8 00271200 SPACE 2 00272000 LTORG 00273000 EJECT 00274000 COPY DEVTYPES 00275000 COPY IOER 00276000 COPY SAVE @V200020 00277000 COPY VMBLOK 00278000 COPY IOBLOKS 00279000 COPY RBLOKS 00280000 COPY VBLOKS 00281000 COPY EQU 00282000 PSA 00283000 END DMKGIO @V200020 00284000