VCA TITLE 'DMKVCA (CP) VM/370 - RELEASE 6' 00001000
ISEQ 73,80 VALIDATE SEQUENCING OF SYSIN 00002000
COPY OPTIONS 00003000
COPY LOCAL 00004000
SPACE 3 00005000
*. 00006000
* MODULE NAME - 00007000
* 00008000
* DMKVCA 00009000
* 00010000
* CONTENTS - 00011000
* 00012000
* DMKVCAST -- START I/O SIMULATION 00013000
* DMKVCATS -- TEST I/O SIMULATION 00014000
* DMKVCASH -- HALT I/O SIMULATION 00015000
* DMKVCARD -- DEVICE RESET (WITHOUT DE-COUPLE) 00016000
* DMKVCARS -- RESET AND DROP CTCA CONNECTION 00017000
*. 00018000
SPACE 00019000
DMKVCA START 00020000
SPACE 00021000
USING SAVEAREA,R13 00022000
USING DMKVCA,R12 00023000
USING VMBLOK,R11 00024000
USING IOBLOK,R10 00025000
USING CHXBLOK,R7 00026000
USING CHYBLOK,R6 00027000
USING PSA,0 00028000
SPACE 2 00029000
DC CL8'DMKVCA' PAGEABLE MODULE IDENTIFIER 00030000
SPACE 2 00031000
EXTRN DMKSTKCP,DMKSTKIO 00032000
EXTRN DMKDIBSM,DMKVIOIN @V407510 00033100
EXTRN DMKCVTBH,DMKSCNVU 00034000
AIF (NOT &TRACE(6)).NTR1 **AIF** 00035000
EXTRN DMKTRDSI,DMKSYSRM @V4M0240 00036100
EXTRN DMKSCHDL @VA00998 00037000
.NTR1 ANOP 00038000
EJECT 00039000
*. 00040000
* SUBROUTINE NAME - 00041000
* 00042000
* DMKVCAST 00043000
* 00044000
* FUNCTION - 00045000
* 00046000
* TO SIMULATE THE CHANNEL AND DEVICE OPERATIONS OF THE 00047000
* CHANNEL-TO-CHANNEL ADAPTER (CTCA) CONNECTED BETWEEN TWO 00048000
* VIRTUAL MACHINES UNDER VM/370 00049000
* 00050000
* ATTRIBUTES - 00051000
* 00052000
* REENTRANT, PAGEABLE, CALLED VIA SVC 00053000
* 00054000
* ENTRY POINT - 00055000
* 00056000
* DMKVCAST - SIMULATE VIRTUAL START I/O INSTRUCTION 00057000
* 00058000
* ENTRY CONDITIONS - 00059000
* 00060000
* GPR 13 = ADDRESS OF STANDARD SAVE-AREA 00061000
* GPR 12 = ADDRESS OF ENTRY POINT 00062000
* GPR 11 = VMBLOK ADDRESS OF ACTIVE USER 00063000
* GPR 10 = IOBLOK ADDRESS OF ACTIVE I/O TASK 00064000
* GPR 8 = VDEVBLOK ADDRESS OF VIRTUAL CTCA 00065000
* 00066000
* EXIT CONDITIONS - 00067000
* 00068000
* GPRS 0-15 UNCHANGED 00069000
* 00070000
* CALLS TO OTHER ROUTINES - 00071000
* 00072000
* DMKFREE - TO OBTAIN FREE STORAGE 00073000
* DMKFRET - TO RELEASE FREE STORAGE OBTAINED FROM DMKFREE 00074000
* DMKDIBSM - TO SIMULATE STATUS FOR A NOT READY DEVICE @V407510 00075100
* DMKSCNVU - TO LOCATE VDEVBLOK, VCUBLOK, VCHBLOK 00076000
* DMKSTKCP - TO STACK CPEXBLOKS FOR DEFERRED EXECUTION 00077000
* DMKSTKIO - TO STACK IOBLOKS FOR THE SLIH 00078000
* DMKTRDSI - TO TRACE SIO'S AND CCW STRINGS TO VIRTUAL CTCA 00079100
* 00080000
* EXTERNAL REFERENCES - 00081000
* 00082000
* DMKVIOIN - USED TO SET 'IOBIRA' FOR ATTENTION INTERRUPTS 00083000
* 00084000
* TABLES / WORK AREAS - 00085000
* 00086000
* CHXBLOK, CHYBLOK, IOBLOK 00087000
* 00088000
* REGISTER USAGE - 00089000
* 00090000
* GPR 13 = SAVE AREA BASE ADDRESS 00091000
* GPR 12 = ADDRESS OF DMKVCA 00092000
* GPR 11 = VMBLOK OF CHANNEL X USER 00093000
* GPR 10 = IOBLOK FOR X-SIDE CHANNEL PROGRAM 00094000
* GPR 9 = ADDRESS OF ACTIVE CCW 00095000
* GPR 7 = CHXBLOK ADDRESSABILITY 00096000
* GPR 6 = CHYBLOK ADDRESSABILITY 00097000
* GPRS 0-5 = SCRATCH 00098000
* GPRS 14,15 = EXTERNAL LINKAGE 00099000
* 00100000
* OPERATION - 00101000
* 00102000
* DMKVCAST IS CALLED FROM DMKVIOEX AT THE SAME POINT WHERE 00103000
* DMKIOSQV IS CALLED FOR NON-SIMULATED DEVICES. AT ENTRY, 00104000
* DMKVCAST INITIALIZES THE IOBLOK AS DMKIOSQV WOULD, AND 00105000
* THEN TESTS THE VDEVBLOK TO DETERMINE IF THE VIRTUAL CTCA 00106000
* IS 'COUPLE'D TO ANOTHER CTCA. IF NOT, DMKDIASM IS CALLED 00107000
* TO INTERPRET THE CCW STRING AND SIMULATE THE CORRECT 00108000
* CSW AND SENSE STATUS. IF YES, START I/O SIMULATION 00109000
* PROCEEDS AS FOLLOWS: 00110000
* 00111000
* 1. THE 'CHXBLOK' AND 'CHYBLOK' ARE REFERENCED THRU THE 00112000
* X-SIDE AND Y-SIDE VDEVBLOK'S (IN THIS DISCUSSION, THE 00113000
* X-SIDE IS ALWAYS THE INITIATING CHANNEL). 00114000
* 2. THE FIRST REAL CCW AND THE IOBCAW ARE VALIDATED. IF 00115000
* ANY ERRORS ARE DETECTED, A CHANNEL PROGRAM CHECK IS 00116000
* GENERATED AND THE SIMULATION TERMINATES VIA STEP ?? 00117000
* 3. THE REAL CCW STRING PRODUCED BY DMKCCWTR IS INTERPRETED 00118000
* ONE CCW AT A TIME BASED ON THE OPERATION TYPE: 00119000
* 00120000
* TRANSFER IN CHANNEL: X'08' 00121000
* IF 'TIC' IS FIRST CCW, GENERATE CHANNEL PROGRAM CHK 00122000
* IF 'TIC' POINTS TO 'TIC', CAUSE CHANNEL PROGRAM CHK 00123000
* OTHERWISE, RESTART WITH NEW CCW STRING. 00124000
* 00125000
* SENSE ADAPTER STATE (EXTENDED MODE ONLY): X'14' 00126000
* TEST FOR A PREVIOUS Y-SIDE RESET NOT YET CLEARED 00127000
* AND PRESENT INTERVENTION REQUIRED IF YES. 00128000
* TEST FOR ATTENTION PENDING FROM Y-SIDE, PRESENT 00129000
* 'ATTN + BUSY' IN INITIAL STATUS IF YES. 00130000
* OTHERWISE, PRESENT SENSE BYTE ZERO. 00131000
* IN ALL CASES, SUPPRESS DATA TRANSFER IF 'SKIP' IN CCW. 00132000
* 00133000
* SENSE COMMAND BYTE: X'04' 00134000
* EXTENDED MODE: IF PREVIOUS X-SIDE RESET OR HALT I/O 00135000
* HAS NOT BEEN CLEARED, CLEAR RESET CONDITION, 00136000
* PRESENT DEVICE END TO Y-SIDE, AND STORE COMMAND 00137000
* BYTE OF ZERO. 00138000
* IF PREVIOUS Y-SIDE RESET OR HALT I/O HAS NOT BEEN 00139000
* CLEARED, PRESENT UNIT CHECK IN INITIAL STATUS. 00140000
* IF X-SIDE END-OF-FILE LATCH IS SET, RESET LATCH 00141000
* AND STORE COMMAND BYTE OF ZERO. 00142000
* OTHERWISE, STORE COMMAND BYTE FROM Y-SIDE ADAPTER 00143000
* BLOCK. IF THE Y-SIDE COMMAND WAS A CONTROL, PRESENT 00144000
* DEVICE END TO THE Y-SIDE CHANNEL. 00145000
* COMPATIBILITY MODE: STORE COMMAND BYTE FROM Y-SIDE 00146000
* ADAPTER BLOCK. IF THE Y-SIDE COMMAND WAS A CONTROL, 00147000
* PRESENT DEVICE END TO THE Y-SIDE CHANNEL. 00148000
* IN ALL CASES, SUPPRESS DATA TRANSFER IF 'SKIP' IN CCW. 00149000
* 00150000
* EXTENDED-MODE ONLY - WRITE, READ CONTROL: 00151000
* IF A PREVIOUS X-SIDE HALT I/O OR RESET HAS NOT BEEN 00152000
* CLEARED, CLEAR THE CONDITION AND PRESENT DEVICE END 00153000
* TO THE Y-SIDE CHANNEL. 00154000
* IF A PREVIOUS Y-SIDE HALT I/O OR RESET HAS NOT BEEN 00155000
* CLEARED, PRESENT UNIT CHECK IN INITIAL STATUS. 00156000
* OTHERWISE, CONTINUE WITH COMMAND PROCESSING. 00157000
* 00158000
* CONTROL IMMEDIATE: X'07' 00159000
* RESET THE X-SIDE END-OF-FILE LATCH IF SET. 00160000
* IF THE Y-SIDE HAS AN ACTIVE READ, WRITE OR CONTROL 00161000
* COMMAND, PRESENT 'ATTN + BUSY'. 00162000
* OTHERWISE, PRESENT ATTENTION TO THE Y-SIDE CHANNEL, 00163000
* CHANNEL END TO THE X-SIDE CHANNEL, AND WAIT FOR 00164000
* A 'SENSE COMMAND BYTE' FROM THE Y-SIDE. 00165000
* 00166000
* DISABLE COMPATIBILITY - MODIFIED NO-OP X'C3': 00167000
* SET THE INHIBIT COMPATIBILITY LATCH IN THE X-SIDE 00168000
* ADAPTER BLOCK, INIDCATE THAT BOTH SIDES OF THE 00169000
* ADAPTER ARE IN EXTENDED MODE, ADVANCE TO NEXT CCW. 00170000
* 00171000
* ENABLE COMPATIBILITY - MODIFIED NO-OP X'43': 00172000
* RESET THE X-SIDE INHIBIT COMPATIBILITY LATCH. 00173000
* IF THE Y-SIDE INHIBIT COMPATIBILITY LATCH IS SET, 00174000
* LEAVE ADAPTER IN EXTENDED MODE AND ADVANCE TO NEXT 00175000
* CCW. IF THE Y-SIDE LATCH IS NOT SET, FORCE THE 00176000
* ADAPTER INTO COMPATIBILITY MODE. 00177000
* 00178000
* WRITE: X'01' 00179000
* RESET THE X-SIDE END-OF-FILE LATCH IF SET. 00180000
* IF THE Y-SIDE HAS AN ACTIVE READ COMMAND, ENTER DATA 00181000
* TRANSFER MODE. 00182000
* IF THE Y-SIDE HAS AN ACTIVE WRITE OR CONTROL COMMAND, 00183000
* PRESENT 'ATTN + BUSY'. 00184000
* IF THERE IS NO ACTIVE Y-SIDE COMMAND, PRESENT 'ATTN' 00185000
* TO THE Y-SIDE CHANNEL AND WAIT FOR Y-SIDE ACTIVITY. 00186000
* 00187000
* WRITE END OF FILE: X'81' (EXTENDED MODE ONLY) 00188000
* RESET THE X-SIDE END-OF-FILE LATCH IF SET. 00189000
* IF THE Y-SIDE HAS NO ACTIVE COMMAND, SET THE Y-SIDE 00190000
* END-OF-FILE LATCH AND CONTINUE PROCESSING. 00191000
* IF THE Y-SIDE HAS AN ACTIVE READ COMMAND, PRESENT 00192000
* CHANNEL END, DEVICE END, UNIT EXCEPTION TO THE Y-SIDE. 00193000
* IF THE Y-SIDE HAS AN ACTIVE CONTROL OR WRITE COMMAND, 00194000
* PRESENT 'ATTN + BUSY' TO THE X-SIDE CHANNEL. 00195000
* 00196000
* READ X'02' OR READ BACKWARD X'0C': 00197000
* EXTENDED MODE: IF THE X-SIDE END-OF-FILE LATCH IS SET, 00198000
* RESET THE LATCH AND PRESENT UNIT EXCEPTION IN 00199000
* INITIAL STATUS. 00200000
* IF THE Y-SIDE HAS AN ACTIVE WRITE COMMAND, ENTER 00201000
* DATA TRANSFER MODE. 00202000
* IF THE Y-SIDE HAS AN ACTIVE WRITE OR CONTROL COMMAND, 00203000
* PRESENT 'ATTN + BUSY'. 00204000
* IF THERE IS NO ACTIVE Y-SIDE COMMAND, PRESENT 'ATTN' 00205000
* TO THE Y-SIDE CHANNEL AND WAIT FOR Y-SIDE ACTIVITY. 00206000
* 00207000
* WHENEVER IT IS NECESSARY TO WAIT FOR ACTIVITY FROM THE 00208000
* Y-SIDE CHANNEL, A CPEXBLOK IS BUILT AND THE ADDRESS STORED 00209000
* IN THE CHXBLOK FOR LATER RE-CONNECTION VIA A CALL TO 00210000
* DMKSTKCP. ANOTHER CPEXBLOK IS BUILT FOR AN EXIT TO THE 00211000
* CALLING ROUTINE WHILE PRESERVING THE ENTRY SAVE-AREA. 00212000
* AT APPROPRIATE PLACES DURING COMMAND PROCESSING, A CPEXBLOK 00213000
* EXIT FOLLOWED BY A CPEXBLOK RESTART IS TAKEN FOR SEQUENCING 00214000
* CONTROL AND TIMING CONSIDERATIONS. 00215000
* 00216000
* DATA TRANSFER MODE: 00217000
* 00218000
* UPON ENTERING DATA TRANSFER MODE, THE FOLLOWING INIT- 00219000
* IALIZATION STEPS ARE TAKEN: 00220000
* 1. RESET ANY PENDING ATTENTION INTERRUPTS OR FLAGS ON 00221000
* BOTH THE X-SIDE AND Y-SIDE ADAPTERS. 00222000
* 2. BUILD A CPEXBLOK FOR THE X-SIDE SUCH THAT BOTH X AND Y 00223000
* ADAPTERS ARE IN A SOFTWARE 'WAIT' STATUS. 00224000
* 3. PRESENT ZERO INITIAL STATUS TO THE X-SIDE CHANNEL. 00225000
* 4. EXCHANGE THE X-SIDE AND Y-SIDE IF NECESSARY SUCH THAT 00226000
* THE 'READ' OPERATION IS ALWAYS THE X-SIDE ADAPTER. 00227000
* 00228000
* DATA TRANSFER WILL PROCEED UNINTERRUPTIBLY TO COMPLETION, 00229000
* IN THE FOLLOWING MANNER: 00230000
* 1. EXAMINE THE Y-SIDE (WRITE) CCW TO DETERMINE THE 00231000
* MAXIMUM SEGMENT LENGTH FOR DATA TRANSFER. 00232000
* 2. EXAMINE THE X-SIDE (READ) CCW TO DETERMINE ITS 00233000
* MAXIMUM SEGMENT LENGTH FOR DATA TRANSFER. 00234000
* 3. EXAMINE THE 'CAW' PROTECTION KEY FOR THE READ CCW 00235000
* AND SIMULATE A PROTECTION CHECK IF IT DOES NOT MATCH 00236000
* THE REAL STORAGE KEY OF THE READ AREA. 00237000
* 4. COMPARE THE DATA SEGMENT LENGTHS FOR READ AND WRITE. 00238000
* 5. IF THE READ COUNT IS GREATER THAN THE WRITE COUNT, 00239000
* TRANSFER THE DATA SEGMENT AS SPECIFIED BY THE WRITE 00240000
* COUNT, AND UPDATE THE WRITE COUNT BY RESTARTING AT 00241000
* STEP 1. AND SKIPPING STEPS 2. AND 3. 00242000
* 6. IF THE WRITE COUNT IS GREATER THAN THE READ COUNT, 00243000
* TRANSFER THE DATA SEGMENT AS SPECIFIED BY THE READ 00244000
* COUNT AND UPDATE THE READ COUNT BY RESTARTING AT STEP 00245000
* 2. 00246000
* 7. IF THE READ COUNT EQUALS THE WRITE COUNT, TRANSFER 00247000
* THE DATA SEGMENT AND RESTART AT STEP 1. 00248000
* 8. WHEN EITHER THE READ OR WRITE CCW STRING HAS BEEN 00249000
* EXHAUSTED, DETERMINE IF INCORRECT LENGTH SHOULD BE 00250000
* INDICATED FOR EITHER OR BOTH CHANNELS AND RE-CONNECT 00251000
* BOTH SIDES VIA CALLS TO DMKSTKCP. 00252000
* 00253000
* THE MAXIMUM DATA SEGMENT LENGTH WHICH MAY BE TRANSFERRED 00254000
* IN A SINGLE STEP IS DETERMINED AS FOLLOWS: 00255000
* 1. NO MORE THAN 2048 BYTES AT ANY TIME - FOR PROTECTION 00256000
* KEY CHECKING. 00257000
* 2. NO MORE THAN THE LENGTH OF BUFFER FROM THE STARTING 00258000
* ADDRESS TO THE NEAREST 2048-BYTE STORAGE BOUNDARY. 00259000
* 3. NO MORE THAN THE TOTAL OR REMAINING CCW DATA COUNT. 00260000
* DATA TRANSFER WILL CONTINUE SO LONG AS THERE IS REMAINING 00261000
* CCW DATA COUNT OR DATA CHAINED CCW'S. COMMAND CHAINING WILL 00262000
* STOP DATA TRANSFER IF THE PREVIOUS CCW COUNT IS EXHAUSTED. 00263000
* 00264000
* READ BACKWARD DATA TRANSFER: 00265000
* THE READ BACKWARD COMMAND TO A CHANNEL-TO-CHANNEL 00266000
* ADAPTER RESULTS IN THE DATA BEING INVERTED ON A 00267000
* CHARACTER BASIS., SINCE THE WRITE-ING CHANNEL IS 00268000
* SENDING DATA IN FORWARD SEUENCE, BUT THE INDEPENDENT 00269000
* READ-ING CHANNEL IS READING IN BACKWARD SEQUENCE. 00270000
* DATA INVERSION IS PERFORMED IN THE FOLLOWING MANNER: 00271000
* 1. IF THE READ BUFFER STARTS AT A 7-BYTE BOUNDARY (I.E. AT 00272000
* THE LOW-ORDER BYTE OF A DOUBLE WORD), SKIP TO STEP 3. 00273000
* 2. MOVE DATA ONE BYTE AT A TIME UNTIL A 7-BYTE BOUNDARY IS 00274000
* REACHED, OR THE DATA COUNT IS EXHAUSTED. 00275000
* 3. LOAD INTO A REGISTER PAIR EIGHT BYTES OF WRITE DATA IN 00276000
* INVERTED ORDER, AND MOVE TO READ BUFFER VIA A DOUBLE- 00277000
* WORD STORE, UNTIL THE LAST DOUBLE-WORD-ALIGNED DATA HAS 00278000
* BEEN MOVED. 00279000
* 4. MOVE THE REMAINDER OF THE DATA SEGMENT A SINGLE CHARACTER 00280000
* AT A TIME UNTIL THE COUNT IS EXHAUSTED. 00281000
*. 00282000
EJECT 00283000
DMKVCAST RELOC , SIO TO VIRTUAL CHAN-TO-CHAN ADAPTER 00284000
USING VDEVBLOK,R8 TEMPORARILY 00285000
XC SAVEWRK1(4),SAVEWRK1 CLEAR A WORD FOR FLAGS 00286000
SPACE 00287000
ST R11,IOBUSER SET IOBLOK VMBLOK POINTER 00288000
ST R10,IOBLINK FORCE IOBLOK TO LINK TO ITSELF 00289000
SLR R0,R0 (ZERO CONSTANT) 00290000
ST R0,IOBIOER NO IOERBLOK 00291000
L R1,VDEVIOCT INCREMENT COUNT OF SIO'S TO THIS DEVICE 00292000
AL R1,F1 ... 00293000
ST R1,VDEVIOCT ... 00294000
MVC IOBCSW(8),ZEROES ZERO OUT THE CSW 00295000
MVI IOBSTAT,X'00' CLEAR IOBLOK STATUS 00296000
TM VDEVSTAT,VDEVNRDY IS THE CTCA COUPLED ? 00297000
BZ VCASTART YES -- START UP THE PROCESS 00298000
SPACE 00299000
SL R8,VMDVSTRT REDUCE VDEVBLOK ADDR. TO DISPLACEMENT 00300000
CALL DMKDIBSM,PARM=TYPCTCA SIMULATE I/O STATUS @V407510 00301100
B VCAEXIT ...AND RETURN TO DMKVIO 00302000
DROP R8 00303000
SPACE 00304000
* 00305000
* INTERNAL FLAGS USED IN 'SAVEWRK1': 00306000
* 00307000
* CPWAIT EQU X'80' DEFER ATTENTION UNTIL EOF LATCH RESET 00308000
* IOBRSTRT EQU X'40' RESTART PROCESSING AFTER CPEXBLOK 'EXIT' 00309000
* CPEX EQU X'20' EXIT TO DMKVIO VIA CPEXBLOK 00310000
* VDEVCCW1 EQU X'10' PROCESSING FIRST USER CCW 00311000
* VMRUN EQU X'08' CPEXBLOK HAS BEEN STACKED FOR EXECUTION 00312000
* CHBREAD EQU X'02' DATATRN - UPDATE READ DATA NEXT TIME 00313000
* CHBWRIT EQU X'01' DATATRN - UPDATE WRITE DATA NEXT TIME 00314000
* 00315000
* 'SAVEWRK1'+1 IS USED AS A SWITCH TO PREVENT DOUBLE EXIT TO DMKVIO 00316000
* 00317000
SPACE 00318000
USING CHXBLOK,R7 00319000
USING CHYBLOK,R6 00320000
VCASTART EQU * 'SIO' INITIAL PROCESSING 00321000
BAL R5,GETCTCA ACCESS CHXBLOK, CHYBLOK 00322000
STH R0,CHXSTAT SET X-SIDE STATUS INITIALLY ZERO 00323000
L R9,IOBCAW ADDRESS OF FIRST REAL CCW 00324000
USING RCWCCW,R9 ... 00325000
STCM R9,B'1000',CHXPKEY SAVE CAW PROTECTION KEY 00326000
LA R9,0(0,R9) STRIP OFF CAW KEY 00327000
OI SAVEWRK1,VDEVCCW1 WORKING ON FIRST CCW 00328000
B VCACCHK GO VALIDATE FIRST CCW 00329000
EJECT 00330000
VCACCWS EQU * CCW DECODING -- MAJOR LOOP 00331000
IC R1,RCWCOMND PICK UP REAL CCW COMMAND BYTE 00332000
STC R1,CHXCMDB ...PRESERVE IN CHXBLOK 00333000
SLR R5,R5 CCW DATA COUNT CARRIED IN GR5 00334000
ICM R5,B'0011',RCWCNT 'LOAD LOGICAL HALFWORD' 00335000
ST R5,CHXRCNT SAVE IT IN CHXBLOK FOR TRANSFER 00336000
SPACE 00337000
CLI RCWCOMND,X'08' TRANSFER IN CHANNEL ? 00338000
BE VCATIC YES - VALIDATE 00339000
TM RCWCOMND,B'00001011' SENSE-TYPE COMMAND ? 00340000
BZ VCASENS YES -- 00341000
TM CHXFLAG,CHBHIO+CHBREST PREVIOUS X-SIDE RESET ? 00342000
BZ VCADCOD NO -- CONTINUE PROCESSING 00343000
NI CHXFLAG,255-(CHBHIO+CHBREST) X-SIDE COMES READY AGAIN 00344000
OI CHXFLAG,CHBM370 BACK TO EXTENDED MODE 00345000
BAL R14,DECHANY DEVICE END TO CHANNEL Y 00346000
VCADCOD EQU * CONTINUE CCW INTERPRETATION 00347000
TM CHYFLAG,CHBREST HAS THE Y-SIDE BEEN RESET ? 00348000
BO VCAUCIR YES - UNIT CHECK, INT. REQ'D 00349000
TM CHYFLAG,CHBHIO MAYBE A Y-SIDE HALT I/O ? 00350000
BO VCASLRS YES - UNIT CHECK, SEL. RESET 00351000
TM RCWCOMND,B'00000011' CONTROL COMMAND ? 00352000
BO VCACNTL YES -- 00353000
TM RCWCOMND,B'00000001' WRITE-TYPE ? 00354000
BO VCAWRIT YES -- 00355000
B VCAREAD READ - 00356000
SPACE 00357000
VCATIC EQU * TRANSFER IN CHANNEL - X'08' 00358000
TM SAVEWRK1,VDEVCCW1 WORKING ON FIRST CCW ? 00359000
BO VCAPRGC YES -- CC = 1 PROGRAM CHECK 00360000
L R9,RCWADDR LOAD NEXT CCW ADDRESS 00361000
CLI RCWCOMND,X'08' TIC POINTING TO A TIC ? 00362000
BE VCAPRGC YES - CHANNEL PROGRAM CHECK 00363000
B VCACCHK ...AND VALIDATE IT 00364000
SPACE 00365000
VCANEXT EQU * ADVANCE TO NEXT CCW 00366000
L R9,CHXNCCW PICK UP ACTIVE CCW ADDRESS 00367000
TM RCWFLAG,CC COMMAND CHAINED ? 00368000
BZ VCACEDE NO -- STORE CSW AND EXIT 00369000
LA R9,8(0,R9) NEXT CCW FETCH 00370000
BAL R14,USRWAIT TAKE USER OUT OF WAIT IF FIRST CCW 00371000
OI SAVEWRK1,IOBRSTRT RESTART AFTER EXIT IF NECESSARY 00372000
BAL R3,VCAGOTO LET DMKVIO CONTINUE BEFORE WE FINISH 00373000
VCACCHK EQU * VALIDATE NEXT CCW 00374000
ST R9,CHXNCCW STORE ADDRESS IN CHXBLOK 00375000
BAL R14,CHANCHK TEST CCW FOR VALIDITY 00376000
BNZ VCAPRGC NO GOOD -- CHANNEL PROGRAM CHECK 00377000
TM SAVEWRK1,VDEVCCW1 HAVE WE ALREADY VALIDATED THE CAW ? 00378000
BZ VCACCWS YES - GO INTERPRET CCW STRING 00379000
TM CHXPKEY,X'0F' IS THE 'CAW' VALID ? 00380000
BZ VCACCWS YES - GO INTERPRET CCW STRING 00381000
B VCAPRGC NO -- CHANNEL PROGRAM CHECK 00382000
EJECT 00383000
VCAUCIR EQU * SET UNIT CHECK, INTERVENTION REQUIRED 00384000
OI CHXSTAT,UC CSW STATUS = UNIT CHECK 00385000
LA R8,INTREQ SENSE DATA = INTERVENTION REQUIRED 00386000
B VCACEDE TERMINATE CHANNEL PROGRAM 00387000
VCASLRS EQU * SET UNIT CHECK, SELECTIVE RESET 00388000
OI CHXSTAT,UC CSW STATUS = UNIT CHECK 00389000
LA R8,INTREQ+X'01' INTREQ + SELECTIVE RESET 00390000
B VCACEDE GO TERMINATE CHANNEL PROGRAM 00391000
VCAPRGC EQU * CHANNEL PROGRAM CHECK 00392000
OI CHXSTAT+1,PRGC CSW STATUS = PROGRAM CHECK 00393000
B VCACEDE GO STORE CSW 00394000
VCAPRTC EQU * CHANNEL PROTECTION CHECK 00395000
OI CHXSTAT+1,PRTC CSW STATUS = PROTECTION CHECK 00396000
B VCACEDE GO STORE CSW 00397000
ATNBUSY EQU * ATTENTION PLUS BUSY 00398000
OI CHXSTAT,ATTN+BUSY CSW STATUS = ATTN + BUSY 00399000
B VCASEND GO SET CSW STATUS ALONE 00400000
VCACEDE EQU * SET STATUS, ADD CHANNEL END, DEVICE END 00401000
TM SAVEWRK1,VDEVCCW1 IF THIS IS THE FIRST CCW... 00402000
BO VCASEND ...DO NOT INCLUDE CE, DE 00403000
OI CHXSTAT,DE SET DEVICE END AT LEAST 00404000
TM CHXFLAG,CHBCENT HAS CHANNEL END BEEN GIVEN YET ? 00405000
BO VCASEND YES - PRESENT DEVICE END ALONE 00406000
OI CHXSTAT,CE ADD CHANNEL END TO STATUS ALSO 00407000
VCASEND EQU * CLEAR COMMAND FROM X-SIDE 00408000
MVI CHXCMDB,X'00' ... 00409000
MVI CHXCMDT,X'00' ... 00410000
BAL R3,RESEOFL RESET END-OF-FILE IF SET 00411000
NI CHXFLAG,255-CHBCENT REMOVE CHANNEL-END-PRESENTED FLAG 00412000
VCASCSW EQU * STORE CSW IN IOBLOK, STACK IOBLOK 00413000
LH R1,CHXSTAT STATUS BITS FOR INTERRUPT 00414000
STH R1,IOBCSW+4 ...INTO IOBLOK CSW FIELD 00415000
TM SAVEWRK1,VDEVCCW1 IS THIS THE FIRST CCW ? 00416000
BO VCASTAT YES - STORE STATUS ONLY 00417000
TM IOBCSW+4,CE+BUSY CHANNEL CLASS INTERRUPT ? @VA02497 00418000
BZ VCASIOB YES -- DO NOT FILL IN CHANNEL DATA 00419000
L R9,CHXNCCW GET PREVIOUS CCW ADDRESS 00420000
LA R9,8(0,R9) GR9 = CSW ADDRESS 00421000
ST R9,IOBCSW ... 00422000
IC R1,CHXPKEY GET CAW PROTECTION KEY 00423000
STC R1,IOBCSW ...INTO CSW 00424000
L R5,CHXRCNT GET RESIDUAL COUNT FROM CHXBLOK 00425000
STH R5,IOBCSW+6 SET CSW RESIDUAL COUNT 00426000
NI IOBSTAT,X'FF'-IOBCC3 THIS IS AN INTERRUPT 00427000
B VCASIOB GO CLEAR STATUS + STACK IOBLOK 00428000
EJECT 00429000
VCASTAT EQU * SET CC = 1, STORE STATUS ONLY 00430000
MVI IOBSTAT,IOBCC1 CC = 1 TO SIO 00431000
CH R0,IOBCSW+4 IF WE LEFT THE STATUS ZERO... 00432000
BNE VCASIOB (NO -- JUST STACK THE IOBLOK) 00433000
OI IOBCSW+4,CE+DE ...WE REALLY MEANT 'CE+DE' 00434000
VCASIOB EQU * STACK IOBLOK FOR DMKVIO 00435000
STH R0,CHXSTAT CLEAR STATUS FROM X-SIDE 00436000
TM IOBCSW+4,UC WAS THERE A UNIT CHECK ? 00437000
BZ CALLSTK NO -- JUST STACK THE IOBLOK 00438000
LM R4,R5,IOBCSW GET SET TO BUILD AN IOERBLOK 00439000
LR R3,R8 SENSE DATA TO GR3 00440000
BAL R14,BLDIOER BUILD IOERBLOK FOR DMKVIO 00441000
ST R1,IOBIOER ...AND PASS BACK WITH IOBLOK 00442000
CALLSTK EQU * 00443000
CALL DMKSTKIO ... 00444000
NI SAVEWRK1,255-VDEVCCW1 NO LONGER ON FIRST CCW 00445000
TM SAVEWRK1,CPEX EXIT VIA CPEXBLOK ? 00446000
BO VCAGOTO YES - GO MODIFY THE SAVE-AREA 00447000
B VCAEXIT NORMAL SVC EXIT 00448000
SPACE 00449000
USRWAIT EQU * IF FIRST CCW, TAKE USER OUT OF IOWAIT 00450000
TM SAVEWRK1,VDEVCCW1 IS THIS THE FIRST CCW ? 00451000
BCR 8,R14 NO -- NOTHING NEEDS DOING 00452000
NI SAVEWRK1,255-VDEVCCW1 NO LONGER FIRST CCW 00453000
NI VMRSTAT,255-VMIOWAIT OUT OF IOWAIT 00454000
LR R3,R14 @VA00998 00455000
AIF (NOT &TRACE(6)).NTR2 **AIF** 00456000
TM VMTRCTL,VMTRSIO SIO TRACING TODAY ? 00457000
BZ USRSCHDL NO -- CHECK FOR SCHDL CALL @VA00998 00458000
OI VMRSTAT,VMIOWAIT BACK INTO IO-WAIT 00459000
LH R1,CHYXADD WHILE WE GET VIRTUAL ADDRESS 00460000
CALL DMKTRDSI ...AND TRACE THE SIO CC = 0 @V4M0240 00461100
NI VMRSTAT,255-VMIOWAIT OUT OF IOWAIT ONCE MORE 00462000
.NTR2 ANOP 00463000
USRSCHDL EQU * @VA00998 00464000
CL R11,RUNUSER WILL DISPATCH CALL DMKSCHDL? @VA00998 00465000
BCR 8,R3 YES - WE DON'T HAVE TO @VA00998 00466000
CALL DMKSCHDL ALTER USER DISPATCH STATUS @VA00998 00467000
BR R3 RETURN @VA00998 00468000
EJECT 00469000
GOCHANY EQU * RE-CONNECT Y-SIDE FOR EXECUTION 00470000
NI CHXFLAG,255-CHBATTN REMOVE ATTENTION FROM X-SIDE 00471000
NI CHYFLAG,255-CHBWAIT REMOVE WAIT FLAG FROM Y-SIDE 00472000
L R1,CHYCNCT CPEXBLOK FOR RE-CONNECT 00473000
CALL DMKSTKCP STACK IT FOR EXECUTION 00474000
ST R0,CHYCNCT CLEAR OUT CPEXBLOK POINTER 00475000
OI SAVEWRK1,VMRUN CPEXBLOK HAS BEEN STACKED 00476000
BR R3 RETURN TO CALLER 00477000
SPACE 2 00478000
RESEOFL EQU * RESET END-OF-FILE LATCH 00479000
TM CHXFLAG,CHBEOFL IS THE END-OF-FILE LATCH SET ? 00480000
BCR 8,R3 NO -- NOTHING NEEDS TO BE DONE 00481000
NI CHXFLAG,255-CHBEOFL RESET END-OF-FILE LATCH 00482000
LR R1,R10 SAVE CURRENT IOBLOK POINTER 00483000
L R10,CHYDATN CHECK FOR Y-SIDE DEFERRED 'ATTN' 00484000
LTR R10,R10 IS THERE A DEFERRED IOBLOK ? 00485000
BZ RESEOFR NO -- JUST RETURN 00486000
CALL DMKSTKIO STACK THE IOBLOK FOR DMKVIO 00487000
ST R0,CHYDATN CLEAR OUT THE POINTER WORD 00488000
OI CHXFLAG,CHBATTN SET ATTENTION PENDING, X-SIDE 00489000
RESEOFR EQU * RESTORE IOBLOK ADDRESS, RETURN 00490000
LR R10,R1 MUST HAVE PREVIOUS IOBLOK ADDRESS 00491000
BR R3 RETURN TO CALLER 00492000
EJECT 00493000
VCASENS EQU * SENSE COMMAND BYTE, SENSE ADAPTER STATUS 00494000
TM CHYFLAG,CHBREST Y-SIDE SYSTEM RESET ? 00495000
BZ SNSDCOD NO -- DECODE COMMAND 00496000
* 'CHBREST' FOR Y-SIDE IMPLIES NON-COMPATIBILITY MODE 00497000
TM CHXCMDB,X'10' SENSE STATUS OR SENSE COMMAND ? 00498000
BO VCAUCIR SENSE COMMAND - UNIT CHK, INTREQ 00499000
LA R4,INTREQ SENSE DATA = INTERVENTION REQUIRED 00500000
B SNSTORE GO STORE SENSE BYTE 00501000
SNSDCOD EQU * CHECK X-SIDE STATUS 00502000
TM CHXFLAG,CHBM370 CHECK ADAPTER OPERATING MODE 00503000
BZ SNSCOMD COMPATIBILITY MODE - SENSE CMD BYTE 00504000
TM CHXCMDB,X'10' SENSE STATUS OR SENSE COMMAND 00505000
BZ SNSADST SENSE ADAPTER STATUS - X'04' 00506000
TM CHXFLAG,CHBHIO+CHBREST X-SIDE HIO OR SYSTEM RESET ? 00507000
BZ SNSCRS1 NO -- CONTINUE 00508000
NI CHXFLAG,255-(CHBHIO+CHBREST) ADAPTER READY AGAIN 00509000
OI CHXFLAG,CHBM370 BACK INTO EXTENDED MODE 00510000
BAL R14,DECHANY DEVICE END TO Y-SIDE 00511000
SLR R4,R4 CMD BYTE ZERO 00512000
B SNSTORE ...GO STORE DATA 00513000
SNSCRS1 EQU * CONTINUE RESET CHECKING 00514000
TM CHYFLAG,CHBHIO HALT I/O ON Y-SIDE ? 00515000
BO VCASLRS YES - UNIT CHK, SEL. RESET 00516000
SLR R4,R4 00517000
TM CHXFLAG,CHBEOFL IF END-OF-FILE IS SET... 00518000
BZ SNSCOMD NO -- THAT'S NORMAL... 00519000
BAL R3,RESEOFL ...RESET LATCH FIRST 00520000
B SNSTORE ...BUT STORE COMMAND BYTE OF ZERO 00521000
SNSADST EQU * SENSE ADAPTER STATUS 00522000
TM CHXFLAG,CHBATTN IS THE Y-SIDE ACTIVE ? 00523000
BO ATNBUSY YES - GIVE 'ATTN + BUSY' 00524000
SLR R4,R4 SENSE BYTE ZERO IF WE GOT HERE 00525000
B SNSTORE GO STORE SENSE DATA 00526000
EJECT 00527000
SNSCOMD EQU * RELATIVELY ORDINARY SENSE CMD BYTE 00528000
IC R4,CHYCMDB COMMAND BYTE FROM Y-SIDE 00529000
TM CHYFLAG,CHBWAIT IS THE Y-SIDE WAITING ? 00530000
BZ SNSTORE NO -- JUST DO THE COMMAND 00531000
CLI CHYCMDT,CHBCNTL WAITING ON CONTROL COMMAND ? 00532000
BNE SNSTORE NO -- JUST DO THE COMMAND 00533000
BAL R3,GOCHANY RE-CONNECT THE Y-SIDE 00534000
SNSTORE EQU * STORE SENSE BYTE 00535000
BAL R14,USRWAIT FORCE ZERO INITIAL STATUS TO SENSE 00536000
TM RCWFLAG,SKIP SHOULD WE TRANSFER DATA ? 00537000
BO SNSFINS NO -- 00538000
L R2,RCWADDR PICK UP REAL DATA ADDRESS 00539000
LA R2,0(,R2) CLEAR OUT COMMAND CODE @VA03162 00540000
TM RCWFLAG,IDA IS IDA SET ? 00541000
BZ *+8 NO -- 00542000
L R2,0(0,R2) GET DATA ADDRESS FROM FIRST IDAW 00543000
L R14,=A(DMKSYSRM) GET REAL MACHINE @VA03162 00544000
L R14,0(,R14) SIZE @VA03162 00545000
CLR R2,R14 VALID ADDRESS ? @VA03162 00546000
BNL VCAPRGC NO..CHANNEL PROGRAM CHECK @VA03162 00547000
BAL R14,CHKPKEY TEST FOR PROTECTION VIOLATION 00548000
BNZ VCAPRTC OOPS...GENERATE PROTECTION CHECK 00549000
STC R4,0(0,R2) STORE THE SENSE BYTE 00550000
SNSFINS EQU * 00551000
L R5,CHXRCNT PICK UP CCW DATA COUNT 00552000
BCTR R5,0 DECREMENT DATA COUNT 00553000
ST R5,CHXRCNT SAVE RESIDUAL COUNT IN CHXBLOK 00554000
TM RCWFLAG,CD IF CHAIN DATA IS SET... 00555000
BO MARKILI ...INCORRECT LENGTH IS AUTOMATIC 00556000
LTR R5,R5 IS THE RESIDUAL COUNT ZERO ? 00557000
BZ CHEKRUN YES - CONTINUE WITHOUT IMPEDIMENT 00558000
TM RCWFLAG,SILI SUPPRESS INCORRECT LENGTH ? 00559000
BO CHEKRUN YES - JUST CONTINUE 00560000
MARKILI EQU * 00561000
OI CHXSTAT+1,IL SET INCORRECT LENGTH 00562000
B VCACEDE ...AND TERMINATE THE CHANNEL PROGRAM 00563000
CHEKRUN EQU * SEE IF DELAY IS RECOMMENDED 00564000
TM SAVEWRK1,VMRUN HAS A CPEXBLOK BEEN STACKED ? 00565000
BZ VCANEXT NO -- JUST CONTINUE 00566000
LA R3,VCANEXT CONTINUE AFTER SEQUENCE DELAY 00567000
OI SAVEWRK1,IOBRSTRT 00568000
B VCAGOTO EXIT VIA CPEXBLOK, RETURN LATER 00569000
EJECT 00570000
VCACNTL EQU * CONTROL OR NO-OP 00571000
BAL R3,RESEOFL RESET END-OF-FILE LATCH IF SET 00572000
TM CHXFLAG,CHBATTN IS THE Y-SIDE ACTIVE ? 00573000
BO ATNBUSY YES - 'BUSY + ATTN' 00574000
TM CHXCMDB,B'00000111' CONTROL OR NO-OP ? 00575000
BO CTLIMED CONTROL - X'07' 00576000
TM CHXCMDB,X'40' IS THIS A MODIFIED NO-OP ? 00577000
BZ VCANEXT NO -- JUST GO TO NEXT CCW 00578000
* MODIFIED NO-OPS: X'43' = ENABLE S/360 X'C3' = DISABLE S/360 00579000
TM CHXCMDB,X'80' DISABLE COMPATIBILITY ? 00580000
BO VCADSBL YES - BOTH SIDES GO EXTENDED 00581000
NI CHXFLAG,255-CHBMNOP FORGET THAT X-SIDE DID 'DISABLE' 00582000
TM CHYFLAG,CHBMNOP DID THE Y-SIDE DO A DISABLE ? 00583000
BO VCANEXT YES - NO CHANGE UNTIL HE DOES 'ENABLE' 00584000
NI CHXFLAG,255-CHBM370 ENABLE COMPATIBILITY 00585000
NI CHYFLAG,255-CHBM370 ... ... 00586000
B VCANEXT 00587000
VCADSBL EQU * SET CTCA IN S/370 EXTENDED MODE 00588000
OI CHXFLAG,CHBM370+CHBMNOP X-SIDE DID 'DISABLE' 00589000
OI CHYFLAG,CHBM370 BOTH SIDES GO EXTENDED 00590000
B VCANEXT 00591000
SPACE 00592000
CTLIMED EQU * CONTROL, OTHER THAN NO-OP 00593000
MVI CHXCMDT,CHBCNTL CONTROL ACTIVE 00594000
STH R0,CHXSTAT CLEAR X-SIDE STATUS 00595000
LA R3,CHKSTAT RETURN AFTER SENSE 00596000
BAL R14,BLDCPEX BUILD CPEXBLOK FOR RE-CONNECT 00597000
ST R1,CHXCNCT ... 00598000
OI CHXFLAG,CHBWAIT X-SIDE WAITING FOR ACTIVITY 00599000
BAL R14,ATTNCHY SET ATTENTION FOR Y-SIDE 00600000
LA R14,VCAGOTO EXIT VIA CPEXBLOK IF CHAINED @VA00998 00601000
TM RCWFLAG,CC MORE ON THIS SIO? @VA00998 00602000
BO USRWAIT YES. OUT OF I/O @VA00998 00603000
* BUILD IOBLOK FOR INITIAL CHANNEL END 00604000
LA R0,IOBSIZE 00605000
CALL DMKFREE GET AN IOBLOK 00606000
MVC 0(IOBSIZE*8,R1),IOBLOK COPY ACTIVE IOBLOK 00607000
LR R10,R1 USE THE NEW ONE NOW 00608000
SLR R0,R0 RESTORE ZERO CONSTANT 00609000
OI CHXSTAT,CE STATUS = CHANNEL END 00610000
OI CHXFLAG,CHBCENT REMEMBER THAT CHANNEL END IS DONE 00611000
OI SAVEWRK1,CPEX EXIT VIA CPEXBLOK 00612000
B VCASCSW GO SET IOBLOK PENDING 00613000
EJECT 00614000
VCAGOTO EQU * RETURN TO CALLER VIA CPEXBLOK 00615000
TS SAVEWRK1+1 HAVE WE ALREADY RETURNED ? 00616000
BNZ VCAWAIT YES -- SKIP THE CONVULSIONS 00617000
LA R0,CPEXSIZE 00618000
CALL DMKFREE GET CPEXBLOK 00619000
USING CPEXBLOK,R1 00620000
MVC CPEXR0(R12*4),SAVER0 MOVE REGS 0-11 00621000
MVC CPEXR12(8),SAVER12 MOVE REGS 12-13 00622000
L R0,SAVERETN RETURN ADDRESS... 00623000
ST R0,CPEXADD ...IS EXECUTION ADDRESS 00624000
MVC CPEXFPNT(12),ZEROES CLEAR FIRST WORDS 00625000
CALL DMKSTKCP STACK IT FOR LATER 00626000
L R15,ADSPCH FIX OUR SAVE-AREA FOR EXIT TO DMKDSPCH 00627000
ST R15,SAVERETN ... 00628000
ST R15,SAVER12 ... 00629000
TM SAVEWRK1,IOBRSTRT RESTART AFTER CPEXBLOK EXIT ? 00630000
BZ VCADSPCH NO -- JUST LET HIM GO 00631000
VCARSTRT EQU * FORCE SEQUENCING DELAY VIA CPEXBLOK 00632000
BAL R14,BLDCPEX EXECUTION ADDRESS IS IN GR3 00633000
CALL DMKSTKCP RETURN AFTER UNSTACK OF EXIT BLOCK 00634000
B VCADSPCH 00635000
VCAWAIT EQU * NO EXIT IS REQUIRED - CHECK RESTART 00636000
TM SAVEWRK1,IOBRSTRT RESTART REQUESTED ? 00637000
BZ VCADSPCH NO -- JUST WAIT FOR SOME ACTIVITY 00638000
TM SAVEWRK1,VMRUN ARE THERE BLOCKS ALREADY STACKED ? 00639000
BO VCARSTRT YES - FORCE THE DELAY 00640000
NI SAVEWRK1,255-(IOBRSTRT+CPEX) UNFLAG 00641000
BR R3 RESTART - NO EXIT NECESSARY 00642000
VCADSPCH EQU * WAIT FOR Y-SIDE ACTIVITY 00643000
NI SAVEWRK1,255-(CPEX+IOBRSTRT+VMRUN) RESET FLAGS 00644000
GOTO DMKDSPCH WE WILL BE BACK LATER 00645000
DROP R1 00646000
EJECT 00647000
ATTNCHY EQU * ATTENTION TO Y-SIDE 00648000
OI CHYFLAG,CHBATTN SET ATTENTION PENDING 00649000
LA R2,ATTN(,0) CSW STATUS 00650000
TM CHYFLAG,CHBEOFL END-OF-FILE LATCH ON Y-SIDE ? 00651000
BZ UNSOLIT NO -- JUST PRESENT THE ATTENTION 00652000
NI CHYFLAG,255-CHBATTN HOLD OFF ON THAT ATTENTION 00653000
OI SAVEWRK1,CPWAIT INDICATE 'ATTN' TO BE DEFERRED 00654000
B UNSOLIT GO PRESENT INTERRUPT 00655000
DECHANY EQU * DEVICE END TO Y-SIDE 00656000
NI CHXFLAG,255-(CHBHIO+CHBREST) X-SIDE NOW READY AGAIN 00657000
LA R2,DE(,0) CSW STATUS 00658000
UNSOLIT EQU * PRESENT UNSOLICITED INTERRUPT 00659000
LR R3,R14 SAVE INTERNAL RETURN 00660000
LA R0,IOBSIZE GET AN IOBLOK 00661000
CALL DMKFREE ... 00662000
LR R9,R10 SAVE ACTIVE IOBLOK 00663000
LR R10,R1 ...AND USE THE NEW ONE NOW 00664000
XC IOBLOK(IOBSIZE*8),IOBLOK CLEAR IT 00665000
ST R10,IOBLINK FORCE IOBLOK TO LINK TO ITSELF 00666000
LH R1,CHXYADD VADDR OF Y-SIDE 00667000
STH R1,IOBVADD ... 00668000
L R1,CHXOTHR VMBLOK FOR Y-SIDE USER 00669000
ST R1,IOBUSER ... 00670000
L R1,=A(DMKVIOIN) INTERRUPT RETURN ADDRESS 00671000
ST R1,IOBIRA ... 00672000
STC R2,IOBCSW+4 SET UNIT STATUS BYTE IN CSW 00673000
TM SAVEWRK1,CPWAIT PRESENT ATTENTION OR DEFER IT ? 00674000
BO DEFERAT OOPS -- MUST BE DEFERRED 00675000
CALL DMKSTKIO STACK IOBLOK FOR DMKVIO 00676000
UNSOLRET EQU * RESTORE REGISTERS AND RETURN 00677000
LR R10,R9 RESTORE IOBLOK POINTER 00678000
L R9,CHXNCCW ...AND GR9 00679000
SLR R0,R0 RESTORE CONVENIENT ZERO CONSTANT 00680000
BR R3 RETURN... 00681000
DEFERAT EQU * SAVE THE IOBLOK WHILE EOF LATCH IS SET 00682000
NI SAVEWRK1,255-CPWAIT RESET INDICATOR 00683000
ST R10,CHXDATN SAVE IOBLOK ADDRESS IN THE CHXBLOK 00684000
B UNSOLRET GO RESTORE AND RETURN 00685000
EJECT 00686000
VCAWRIT EQU * WRITE, WRITE END-OF-FILE 00687000
BAL R3,RESEOFL RESET END-OF-FILE LATCH IF SET 00688000
TM CHXFLAG,CHBATTN IS THE Y-SIDE ACTIVE ? 00689000
BZ WRITIDL NO -- WILL GIVE ATTN TO Y-SIDE 00690000
TM CHYCMDT,CHBREAD+CHBRDBK IS COMMAND PAIR O.K. ? 00691000
BZ ATNBUSY NO -- SET ATTN + BUSY 00692000
MVI CHXCMDT,CHBWRIT ASSUME NORMAL WRITE CMD 00693000
TM CHXFLAG,CHBM370 SHOULD WE DECODE FOR WRITE EOF ? 00694000
BZ DATATRN NO -- JUST TRANSFER DATA 00695000
TM CHXCMDB,X'80' IS THIS WRITE END-OF-FILE ? 00696000
BZ DATATRN NO -- DATA TRANSFER WRITE 00697000
MVI CHXCMDT,CHBWEOF THIS IS WRITE END-OF-FILE 00698000
OI CHYSTAT,CE+DE+UE SET ENDING STATUS FOR Y-SIDE 00699000
BAL R3,GOCHANY RE-ACTIVATE Y-SIDE 00700000
LA R3,CHKSTAT RETURN AFTER SEQUENCE DELAY 00701000
OI SAVEWRK1,IOBRSTRT RESTART AFTER SEQUENCING DELAY 00702000
B VCAGOTO ... 00703000
SPACE 2 00704000
WRITIDL EQU * X-SIDE WRITE, Y-SIDE IS IDLE 00705000
MVI CHXCMDT,CHBWRIT ASSUME NORMAL WRITE 00706000
TM CHXFLAG,CHBM370 DECODE FOR WRITE EOF ? 00707000
BZ RDWRITE NO -- GIVE ATTN TO Y-SIDE 00708000
TM CHXCMDB,X'80' IS THIS WRITE END-OF-FILE ? 00709000
BZ RDWRITE NO -- GIVE ATTN TO Y-SIDE 00710000
MVI CHXCMDT,CHBWEOF ... 00711000
OI CHYFLAG,CHBEOFL SET END-OF-FILE LATCH IN Y-SIDE 00712000
B VCANEXT CONTINUE -- EFFECTIVE NO-OP 00713000
EJECT 00714000
RDWRITE EQU * READ OR WRITE FOR DATA TRANSFER 00715000
L R1,RCWADDR GET CCW DATA OR IDAL ADDRESS 00717000
LA R1,0(0,R1) ...WITHOUT THE CCW OP-CODE 00718000
ST R1,CHXIDAW SET FOR DATA TRANSFER ROUTINE 00719000
LA R3,CHKSTAT RETURN AFTER TRANSFER IS COMPLETE 00720000
BAL R14,BLDCPEX BUILD CPEXBLOK FOR RE-CONNECT 00721000
ST R1,CHXCNCT ... 00722000
OI CHXFLAG,CHBWAIT INDICATE WAIT STATUS 00723000
BAL R14,ATTNCHY ATTENTION TO Y-SIDE 00724000
BAL R14,USRWAIT ZERO STATUS TO X-SIDE,DO TRACING @VA10302 00724100
B VCAGOTO EXIT, WAIT FOR SOMETHING TO HAPPEN 00725000
SPACE 2 00726000
VCAREAD EQU * READ, READ BACKWARD 00727000
LA R3,RDWRITE BRANCH VECTOR FOR COMMAND DECODER 00728000
TM CHXFLAG,CHBATTN+CHBEOFL IS THE Y-SIDE ACTIVE ? 00729000
BZ FWDBACK NO -- DECODE COMMAND TYPE 00730000
TM CHXFLAG,CHBEOFL PRESENT END-OF-FILE TO THIS READ ? 00731000
BO READEOF YES - SET IT UP 00732000
TM CHYCMDT,CHBWRIT IS COMMAND PAIR O.K. ? 00733000
BZ ATNBUSY NO -- GIVE ATTN + BUSY 00734000
LA R3,DATATRN BRANCH VECTOR FOR COMMAND DECODER 00735000
SPACE 00736000
FWDBACK EQU * DECIDE IF READ OR READ BACKWARD 00737000
MVI CHXCMDT,CHBREAD ASSUME FORWARD READ 00738000
TM CHXCMDB,X'02' IS IT ? 00739000
BCR 1,R3 YES - (BO) 00740000
MVI CHXCMDT,CHBRDBK SET READ BACKWARD 00741000
BR R3 ...AND CONTINUE PROCESS 00742000
SPACE 2 00743000
READEOF EQU * READ, EOF LATCH IS SET 00744000
BAL R3,RESEOFL RESET END-OF-FILE LATCH 00745000
OI CHXSTAT,UE SET EOF, UNIT EXCEPTION 00746000
B VCACEDE ...AND TERMINATE CHANNEL PROGRAM 00747000
EJECT 00748000
CHKSTAT EQU * RETURN AFTER DATA TRANSFER IS COMPLETE 00749000
TM SAVEWRK1+2,DEFCPX IS THERE A DEFERRED TASK @VA13548 00749070
BZ CPEXDONE NO, NOTHING TO DO ON OTHER SIDE @VA13548 00749140
NI SAVEWRK1+2,255-DEFCPX YES, WE'LL DO IT NOW @VA13548 00749210
L R1,CHYCNCT GET THE CPEXBLOK ON OTHER SIDE @VA13548 00749280
LTR R1,R1 IS IT THERE ... SHOULD BE @VA13548 00749350
BZ CPEXLOST NO, CLEAN UP AND CONTINUE @VA13548 00749420
CALL DMKSTKCP LET OTHER SIDE CONTINUE NOW @VA13548 00749490
SR R3,R3 ZERO POINTER TO CPEXBLOK @VA13548 00749560
ST R3,CHYCNCT RIGHT HERE @VA13548 00749630
CPEXLOST DS 0H @VA13548 00749700
NI CHYFLAG,255-CHBWAIT TAKE Y-SIDE OUT OF WAIT @VA13548 00749770
CPEXDONE DS 0H CONTINUE WITH X-SIDE PROCESSING @VA13548 00749840
L R10,SAVER10 ACCESS THE IOBLOK FOR A MOMENT 00750000
USING IOBLOK,R10 ,,, 00751000
TM IOBFLAG,IOBRES HAS THIS IOTASK BEEN RESET ? 00752000
BZ CHKYRES NO -- CHECK FOR OTHER RESET STATUS 00753000
MVI CHXFLAG,CHBREST WE CALL THIS SYSTEM RESET 00754000
LR R9,R10 SAVE IOBLOK ADDRESS IN GR9 00755000
TM CHYFLAG,CHBEOFL IS Y-SIDE EOF LATCH SET ? 00756000
BZ CHKXRES NO -- DON'T CHECK FOR 'CHXDATN' 00757000
L R10,CHXDATN THERE MIGHT BE A DEFERRED ATTENTION 00758000
LTR R10,R10 ... ? 00759000
BZ CHKXRES NO -- 00760000
BAL R3,FRETIOB RELEASE THE IOBLOK 00761000
ST R0,CHXDATN CLEAR OUT THE POINTER WORD 00762000
CHKXRES EQU * CONTINUE RESET PROCESSING 00763000
LR R10,R9 MAKE SURE WE HAVE THE RIGHT IOBLOK ADDR 00764000
TM CHYFLAG,CHBMNOP DID THE Y-SIDE SAY 'DISABLE' ? 00765000
BO CHKWAIT YES - LEAVE IN EXTENDED MODE 00766000
NI CHXFLAG,255-CHBM370 DROP OUT OF EXTENDED MODE 00767000
NI CHYFLAG,255-CHBM370 ... 00768000
CHKWAIT EQU * RE-ACTIVATE Y-SIDE IF HE IS WAITING 00769000
TM CHYFLAG,CHBWAIT IS THE Y-SIDE WAITING ? 00770000
BZ VCACEDE NO -- JUST TERMINATE X-SIDE 00771000
BAL R3,GOCHANY RE-CONNECT Y-SIDE 00772000
B VCACEDE TERMINATE X-SIDE CHANNEL PROGRAM 00773000
CHKYRES EQU * CHECK Y-SIDE RESET VIA 'HIO' OR 'HDV' 00774000
TM CHYFLAG,CHBREST HAS Y-SIDE BEEN RESET ? 00775000
BO CHKXCOM YES - CHECK ADAPTER MODE 00776000
TM CHXFLAG,CHBHIO WAS THIS A HALT I/O TO X-SIDE ? 00777000
BO CHKSHIO YES - TERMINATE X-SIDE 00778000
TM CHYFLAG,CHBHIO RUNNING UNDER Y-SIDE HIO ? 00779000
BZ CHKXCSW NO -- EXAMINE CSW STATUS 00780000
TM CHXFLAG,CHBM370 COMPATIBILITY MODE ? 00781000
BO VCASLRS NO -- UNIT CHECK, SEL. RESET 00782000
NI CHYFLAG,255-CHBHIO RESET AFTER RECOGNITION 00783000
B VCACEDE TERMINATE X-SIDE PROGRAM 00784000
CHKXCSW EQU * EXAMINE CSW STATUS FOR ERRORS 00785000
L R1,=AL1(255-(CE+DE),255-PCI,0,0) MASK FOR ERRORS 00786000
N R1,CHXSTAT CAN WE CONTINUE ? 00787000
BNZ VCACEDE NO -- TERMINATE CHANNEL PROGRAM 00788000
B VCANEXT CONTINUE UN-IMPEDED 00789000
CHKSHIO EQU * RESET HALT I/O BIT IF COMPATIBILITY 00790000
TM CHYFLAG,CHBM370 IS Y-SIDE STILL EXTENDED MODE ? 00791000
BO VCACEDE YES - LEAVE 'CHBHIO' SET 00792000
NI CHXFLAG,255-CHBHIO RESET AFTER RECOGNITION 00793000
B VCACEDE TERMINATE X-SIDE CHANNEL PROGRAM 00794000
CHKXCOM EQU * SEE IF WE SHOULD SET UNIT CHECK 00795000
TM CHXFLAG,CHBM370 STILL IN EXTENDED MODE ? 00796000
BO VCAUCIR YES - UNIT CHECK, INT REQ 00797000
NI CHYFLAG,255-CHBREST FORGET THAT THE RESET OCCURRED 00798000
B VCACEDE ...BUT TERMINATE ANYWAY 00799000
EJECT 00800000
DATATRN EQU * COMMON DATA TRANSFER SUBROUTINE 00801000
L R1,RCWADDR GET CCW DATA OR IDAL ADDRESS 00802000
LA R1,0(0,R1) ...WITHOUT THE CCW OP-CODE 00803000
ST R1,CHXIDAW SET FOR DATA TRANSFER ROUTINE 00804000
LA R3,CHKSTAT RETURN AFTER TRANSFER IS COMPLETE 00805000
BAL R14,BLDCPEX BUILD CPEXBLOK FOR RE-CONNECT 00806000
ST R1,CHXCNCT ... 00807000
OI CHXFLAG,CHBWAIT X-SIDE WAITING FOR GODOT 00808000
BAL R14,USRWAIT ZERO STATUS TO X-SIDE 00809000
LA R3,TRANSFER RETURN HERE VIA CPEXBLOK 00810000
OI SAVEWRK1,IOBRSTRT RESTART AFTER EXIT, IF NECESSARY 00811000
B VCAGOTO EXIT VIA CPEXBLOK, RETURN LATER 00812000
TRANSFER EQU * ACTUAL TRANSFER OF DATA 00813000
STM R6,R7,SAVEWRK6 SAVE CHXBLOK, CHYBLOK ORIGINS 00814000
LH R2,CHXYADD GET DEVICE ADDRESSES FOR BOTH SIDES 00815000
LH R1,CHYXADD ... 00816000
L R10,CHXOTHR AND Y-SIDE VMBLOK ADDRESS 00817000
CALL DMKSCNVU LOCATE VDEVBLOK (X-SIDE FIRST) 00818000
USING VDEVBLOK,R8 00819000
NI VDEVINTS,255-ATTN REMOVE POSSIBLE FALSE ATTENTION 00820000
LR R1,R2 NOW GET THE Y-SIDE DEVICE 00821000
LR R11,R10 (SWITCH VMBLOK'S MOMENTARILY) 00822000
CALL DMKSCNVU LOCATE VDEVBLOK (Y-SIDE NEXT) 00823000
NI VDEVINTS,255-ATTN REMOVE POSSIBLE FALSE ATTENTION 00824000
DROP R8 00825000
L R11,SAVER11 VMBLOK REGISTER BACK IN SHAPE 00826000
LM R6,R7,SAVEWRK6 RE-LOAD CHXBLOK, CHYBLOK REGS 00827000
TM CHXCMDT,CHBWRIT IS THE X-SIDE THE DATA SOURCE ? 00828000
BZ DATACPX NO -- THE DIRECTION IS CORRECT 00829000
LR R6,R7 MAKE THE X-SIDE THE 'READ'ING SIDE 00830000
L R7,SAVEWRK6 ...WHENEVER DATA TRANSFER OCCURRS 00831000
DATACPX EQU * SET UP FOR SYMMETRICAL STATUS 00832000
NI CHXFLAG,255-CHBATTN RESET STATUS BITS 00833000
NI CHYFLAG,255-CHBATTN ... ... 00834000
SPACE 00835000
FANGORN EQU * WHEN YOU CAN'T SEE THE FOREST FOR THE TREES, 00836000
* WATCH OUT FOR THE ENTS ! 00837000
* GR7 = 'CHXBLOK' => DATA SINK - 'READ'ING 00838000
* GR6 = 'CHYBLOK' => DATA SOURCE 'WRITE'ING 00839000
LR R8,R6 CHYBLOK TO GR8 - GET WRITE DATA 00840000
BAL R10,DATABLK ... 00841000
BC 8+1,ENDTRAN END DATA TRANSFER IF PROGRAM CHECK 00842000
ST R9,BALR9 SAVE CCW ADDRESS FOR UPDATE 00843000
STM R2,R5,BALRSAVE SAVE WRITE DATA FOR A MOMENT 00844000
LR R8,R7 CHXBLOK TO GR8 - GET READ DATA 00845000
BAL R10,DATABLK ... 00846000
BC 8+1,ENDTRAN END DATA TRANSFER IF PROGRAM CHECK 00847000
ST R9,CHXNCCW UPDATE X-SIDE CCW POINTER 00848000
L R9,BALR9 00849000
ST R9,CHYNCCW UPDATE Y-SIDE CCW POINTER 00850000
LM R14,R1,BALRSAVE GET WRITE DATA IN GR14-GR1 00851000
EJECT 00852000
* AT THIS POINT, WE HAVE THE FOLLOWING: 00853000
* X-SIDE (READ) Y-SIDE (WRITE) 00854000
* FIRST DATA ADDRESS GR4 GR0 00855000
* FIRST DATA LENGTH GR5 GR1 00856000
* NEXT DATA OR IDAW GR2 GR14 00857000
* REMAINING DATA COUNT GR3 GR15 00858000
* 00859000
* NOW, WE FIGURE OUT EXACTLY HOW MUCH DATA CAN BE MOVED AT ONCE, 00860000
* AND WHICH SIDE HAS THE CONTROLLING COUNT. 00861000
* 00862000
LA R10,UPDATEY FIRST TIME, UPDATE BOTH BLOCKS 00863000
UPDATEX EQU * ADVANCE X-SIDE CHANNEL PROGRAM 00864000
L R9,CHXNCCW ADDRESS OF ACTIVE X-SIDE CCW 00865000
TM RCWFLAG,SKIP SUPPRESS DATA TRANSFER ? 00866000
BO UPDATXE YES - SUPPRESS PROTECTION TEST ALSO 00867000
STM R14,R5,FREESAVE SAVE ALL DATA REGISTERS 00868000
LR R2,R4 DATA READ ADDRESS TO GR2 00869000
BAL R14,CHKPKEY TEST CAW PROTECTION KEY 00870000
LM R14,R5,FREESAVE RESTORE REGISTERS IMMEDIATELY 00871000
BNZ READPRTC PROTECTION CHECK ON READ 00872000
UPDATXE EQU * UPDATE WITHOUT TESTING PROTECTION 00873000
ST R3,CHXRCNT RESIDUAL COUNT 00874000
ST R2,CHXIDAW NEXT DATA OR IDAW ADDRESS 00875000
BR R10 GO WHERE NECESSARY 00876000
UPDATEY EQU * ADVANCE Y-SIDE CHANNEL PROGRAM 00877000
ST R15,CHYRCNT RESIDUAL COUNT 00878000
ST R14,CHYIDAW NEXT DATA OR IDAW ADDRESS 00879000
SPACE 00880000
GETBOSS EQU * WHICH SIDE HAS CONTROLLING COUNT ? 00881000
NI SAVEWRK1,255-(CHBREAD+CHBWRIT) CLEAR UPDATE FLAGS 00882000
CR R1,R5 WHICH COUNT CONTROLS THE TRANSFER ? 00883000
BL TRANWRT THE WRITER - Y-SIDE 00884000
BH TRANSRD THE READER - X-SIDE 00885000
* HIT IT ON THE NOSE - UNUSUAL 00886000
OI SAVEWRK1,CHBREAD+CHBWRIT UPDATE BOTH NEXT TIME 00887000
B DATAFLY GO MOVE SOME DATA 00888000
SPACE 00889000
TRANWRT EQU * READ COUNT .GT. WRITE COUNT 00890000
OI SAVEWRK1,CHBWRIT UPDATE WRITE ONLY NEXT TIME 00891000
SR R5,R1 GET REMAINING READ COUNT (THIS BLOCK) 00892000
LR R3,R5 ...INTO GR3 00893000
LR R5,R1 SET ACTUAL COUNT = WRITE COUNT 00894000
LR R2,R4 GET STARTING ADDRESS IN GR2 00895000
AR R2,R5 COMPUTE NEXT START ADDRESS 00896000
TM CHXCMDT,CHBRDBK DIFFERENT IF READ BACKWARD 00897000
BZ DATAFLY NO -- WE'VE GOT IT RIGHT 00898000
SR R2,R5 RE-ADJUST 00899000
SR R2,R5 ... 00900000
B DATAFLY GO MOVE SOME DATA 00901000
EJECT 00902000
TRANSRD EQU * WRITE COUNT .GT. READ COUNT 00903000
OI SAVEWRK1,CHBREAD UPDATE READ ONLY NEXT TIME 00904000
SR R1,R5 GET REMAINING WRITE COUNT (THIS BLOCK) 00905000
LR R15,R1 ...INTO GR15 00906000
LR R1,R5 SET ACTUAL COUNTS EQUAL 00907000
LR R14,R0 GET CURRENT START ADDRESS 00908000
AR R14,R1 COMPUTE NEXT START ADDRESS 00909000
STM R14,R15,BALR14 SAVE INFO - R14,15 DESTROYED 00910000
DATAFLY EQU * TRANSFER DATA 00911000
L R9,CHXNCCW ADDRESS OF ACTIVE READ CCW 00912000
TM RCWFLAG,SKIP SUPPRESS DATA TRANSFER ? 00913000
BO DATAUPD YES - JUST UPDATE AND MOVE ALONG 00914000
TM CHXCMDT,CHBRDBK IS THIS FORWARD OR BACKWARD ? 00915000
BO READBACK BACKWARD - MESSYTHING 00916000
* 00917000
MVCL R4,R0 TRANSFER DATA FORWARD 00918000
* 00919000
DATAUPD EQU * UPDATE ADDRESSES, LENGTHS 00920000
TM SAVEWRK1,CHBREAD+CHBWRIT BOTH SIDES TO BE UPDATED ? 00921000
BO FANGORN YES -- DO IT FROM THE TOP 00922000
TM SAVEWRK1,CHBREAD OTHERWISE, WHICH ONE ? 00923000
BO UPDREAD UPDATE READ - X-SIDE 00924000
* UPDATE WRITE - Y-SIDE 00925000
STM R2,R3,BALR2 SAVE READ DATA FOR A MOMENT 00926000
LR R8,R6 ...WHILE WE UPDATE THE WRITE SIDE 00927000
BAL R10,DATABLK ... 00928000
BC 8+1,UPDWRIT OOPS...FATAL ERROR OR NO MORE DATA 00929000
ST R9,CHYNCCW UPDATE CCW FETCH POINTER 00930000
LM R14,R1,TEMPR2 GET WRITE DATA IN GR14-GR1 00931000
LM R4,R5,BALR2 GET REST OF THE READ DATA 00932000
B UPDATEY ...AND CONTINUE FROM HERE 00933000
UPDWRIT EQU * ERROR, ADJUST RESIDUAL COUNTS 00934000
L R3,BALR3 GET READ COUNT UNUSED 00935000
L R1,CHXRCNT OLD RESIDUAL COUNT 00936000
AR R1,R3 ADD IN UNUSED COUNT 00937000
ST R1,CHXRCNT ...FOR ACCURATE CSW DATA 00938000
ST R5,CHYRCNT Y-SIDE RESIDUAL COUNT 00939000
B ENDTRAN END DATA TRANSFER 00940000
UPDREAD EQU * UPDATE READ-SIDE DATA 00941000
LR R8,R7 GET MORE X-SIDE DATA 00942000
BAL R10,DATABLK ... 00943000
BC 8+1,CSWREAD OOPS...FATAL ERROR OR NO MORE DATA 00944000
ST R9,CHXNCCW UPDATE CCW FETCH POINTER 00945000
LM R0,R1,BALR14 GET SAVED WRITE DATA 00946000
LA R10,GETBOSS UPDATE ONLY THE CHXBLOK 00947000
B UPDATEX ...AND CONTINUE FROM HERE 00948000
CSWREAD EQU * ERROR, ADJUST RESIDUAL COUNT 00949000
L R1,BALR15 GET REMAINING WRITE COUNT 00950000
L R8,CHYRCNT OLD RESIDUAL COUNT 00951000
AR R1,R8 UPDATE IT WITH UNUSED PORTION 00952000
ST R1,CHYRCNT ...FOR ACCURATE CSW DATA 00953000
ST R5,CHXRCNT X-SIDE RESIDUAL COUNT 00954000
B ENDTRAN END DATA TRANSFER 00955000
EJECT 00956000
READBACK EQU * INVERT THE DATA AS WE MOVE IT 00957000
STM R14,R9,FREESAVE FREE UP SOME REGISTERS 00958000
LR R9,R4 START ADDRESS FOR READ 00959000
SR R9,R5 GR9 = LOWER LIMIT FOR READ 00960000
L R6,FFS INCREMENT FOR MINOR LOOPS 00961000
LR R3,R0 START ADDRESS FOR WRITE 00962000
L R8,=F'-8' INCREMENT FOR MAJOR LOOP 00963000
LA R14,7(0,0) TEST FOR START AT 7-BYTE BOUNDARY 00964000
OR R14,R4 GR14 = HIGHER SEVEN-BYTE BOUNDARY 00965000
CR R14,R4 IF THESE ARE EQUAL, WE CAN MOVE DBL-WDS 00966000
BE RDBACK4 YES - USE THE FAST LOOP 00967000
LR R7,R8 ...INTO GR7 FOR A MASK 00968000
NR R7,R4 GR7 = LOWER DOUBLE-WORD BOUNDARY 00969000
CR R7,R9 WILL WE MOVE ALL THE DATA FIRST ? 00970000
BNL RDBACK1 NO -- LET IT GO THROUGH AS IS 00971000
LA R2,1(0) BUMP GR4 BY ONE FOR TRAILER LOOP 00972000
B RDBACK5 GO SET LOWER LIMIT, MOVE DATA FAST 00973000
RDBACK1 EQU * ONE AT A TIME TO A BOUNDARY 00974000
IC R1,0(0,R3) ONE CHARACTER WRITTEN 00975000
STC R1,0(0,R4) ONE CHARACTER READ 00976000
LA R3,1(0,R3) 00977000
BXH R4,R6,RDBACK1 CONTINUE 00978000
LA R4,1(,R4) RE-ADJUST READ ADDRESS @VM08637 00979000
RDBACK2 EQU * MAJOR LOOP - EIGHT BYTES AT A TIME 00980000
LA R2,8(0,0) COUNT FOR INSERTION IN REGISTERS 00981000
BXLE R4,R8,RDBACK5 JUMP OUT WHEN LAST DOUBLE-WORD MOVED 00982000
RDBACK3 EQU * FILL UP TWO REGISTERS - INVERTED 00983000
SRDL R0,8(0) THIS IS A FAST SHIFT 00984000
ICM R0,B'1000',0(R3) FASTEST 'ICM' IN THE WEST 00985000
LA R3,1(0,R3) NEXT CHARACTER FOR WRITE 00986000
BCT R2,RDBACK3 FILL UP TWO REGISTERS 00987000
STM R0,R1,0(R4) FILL UP A DOUBLE-WORD 00988000
B RDBACK2 ...AND REPEAT 00989000
RDBACK4 EQU * STARTED ON 7-BYTE BOUNDARY 00990000
LA R4,1(0,R4) BUMP UP ONE FOR 'BXLE' LOOP 00991000
B RDBACK2 GO MOVE DOUBLE-WORD AT A TIME 00992000
RDBACK5 EQU * FILL OUT THE UNEVEN TAIL 00993000
AR R4,R2 BUMP R4 BACK TO PREVIOUS VALUE 00994000
LR R7,R9 ACTUAL LIMIT FOR READING 00995000
RDBACK6 EQU * MOVE REMAINDER OF DATA 00996000
BXLE R4,R6,RDBACK7 JUMP OUT WHEN TRANSFER COMPLETE 00997000
IC R1,0(0,R3) 00998000
STC R1,0(0,R4) 00999000
LA R3,1(0,R3) 01000000
B RDBACK6 CONTINUE UNTIL COMPLETE 01001000
RDBACK7 EQU * TRANSFER OF THIS DATA BLOCK IS COMPLETE 01002000
LM R14,R9,FREESAVE RESTORE ALL THOSE REGISTERS 01003000
B DATAUPD ...AND GET SOME MORE DATA 01004000
EJECT 01005000
READPRTC EQU * PROTECTION CHECK DURING READ 01006000
OI CHXSTAT+1,PRTC CHANNEL PROTECTION CHECK 01007000
TM SAVEWRK1,CHBREAD+CHBWRIT ARE THE COUNTS CORRECT ? 01008000
BNM ENDTRAN YES -- BOTH SIDES ARE CORRECT 01009000
AR R5,R3 FIX THE READ-SIDE COUNT 01010000
B CSWREAD ...AND UPDATE THE CHXBLOK 01011000
SPACE 2 01012000
ENDTRAN EQU * END OF DATA TRANSFER 01013000
L R1,CHXRCNT GET X-SIDE RESIDUAL COUNT 01014000
L R2,CHYRCNT GET Y-SIDE RESIDUAL COUNT 01015000
SLR R3,R3 ZERO CONSTANT 01016000
L R9,CHXNCCW ACTIVE CCW, X-SIDE 01017000
TM RCWFLAG,CD IS CHAIN DATA SET ? 01018000
BZ *+8 NO -- 01019000
OI CHXSTAT+1,IL INCORRECT LENGTH IS AUTOMATIC IF YES 01020000
L R9,CHYNCCW ACTIVE CCW, Y-SIDE 01021000
TM RCWFLAG,CD IS CHAIN DATA SET ? 01022000
BZ *+8 NO -- 01023000
OI CHYSTAT+1,IL INCORRECT LENGTH IS AUTOMATIC IF YES 01024000
CR R1,R3 IS THE X-SIDE COUNT ZERO ? 01025000
BE ZEROREAD YES - CHECK FURTHER 01026000
LA R10,ILCHANY INCORRECT LENGTH TO BOTH SIDES 01027000
B ILCHANX ... 01028000
SPACE 2 01029000
ZEROREAD EQU * X-SIDE RESIDUAL COUNT EQUAL TO ZERO 01030000
CR R2,R3 Y-SIDE RESIDUAL COUNT ALSO ZERO ? 01031000
BE ILCHANY YES - INCORRECT LENGTH TO Y-SIDE ONLY 01032000
LA R10,ILCHANY PROBABLY 'IL' TO BOTH SIDES 01033000
C R2,F2 Y-SIDE COUNT MORE THAN TWO .GT. X ? 01034000
BH ILCHANX YES - INCORRECT LENGTH TO BOTH 01035000
BL CHKMODE Y-SIDE COUNT = X-SIDE COUNT PLUS ONE 01036000
TM CHXFLAG,CHBM370 IF WE ARE IN EXTENDED MODE... 01037000
BZ ILCHANX ...NOPE - BOTH GET IT 01038000
LA R10,RECONCT ...YES - X-SIDE ONLY 01039000
B ILCHANX 01040000
EJECT 01041000
CHKMODE EQU * O.K. IF IN COMPATIBILITY MODE 01042000
TM CHXFLAG,CHBM370 ARE WE IN COMPATIBILITY MODE ? 01043000
BO ILCHANX NO -- BOTH SIDES GET INCORRECT LEN 01044000
LA R10,RECONCT ONLY THE X-SIDE SEES IT 01045000
SPACE 2 01046000
ILCHANX EQU * SET INCORRECT LENGTH FOR X-SIDE CHANNEL 01047000
L R9,CHXNCCW GET ACTIVE CCW 01048000
TM RCWFLAG,SILI SUPPRESS INCORRECT LENGTH ? 01049000
BCR 1,R10 YES - CONTINUE WHERE DESTINED 01050000
OI CHXSTAT+1,IL SET INCORRECT LENGTH 01051000
BR R10 ...AND CONTINUE 01052000
ILCHANY EQU * SET INCORRECT LENGTH FOR Y-SIDE CHANNEL 01053000
L R9,CHYNCCW GET ACTIVE CCW 01054000
TM RCWFLAG,SILI SUPPRESS INCORRECT LENGTH ? 01055000
BO RECONCT YES - JUST FINISH UP 01056000
OI CHYSTAT+1,IL SET INCORRECT LENGTH 01057000
SPACE 2 01058000
RECONCT EQU * RECONNECT THE Y-SIDE AND DEFER @VA13548 01059000
* THE X-SIDE UNTIL Y-SIDE COMPLETES 01059300
L R1,CHYCNCT GET THE Y-SIDE CPEXBLOK @VA13548 01059600
LTR R1,R1 IS THERE ONE ? @VA13548 01059900
BZ NOCPEX1 NO, GO TAKE CARE OF X-SIDE @VA13548 01060200
CALL DMKSTKCP STACK THE Y-SIDE CPEXBLOK @VA13548 01060500
USING CPEXBLOK,R1 GET ADDRESSABILITY TO Y-SIDE @VA13548 01060800
L R3,CHXCNCT SEE IF THERE IS AN X-SIDE BLOK @VA13548 01061100
LTR R3,R3 IS THERE ONE ? @VA13548 01061400
BZ YEXIT1 NO, NO NEED TO DEFER IT THEN @VA13548 01061700
LR R3,R13 SAVE ADDR OF OUR SAVE AREA @VA13548 01062000
L R13,CPEXR13 GET Y-SIDE SAVEAREA ADDR @VA13548 01062300
OI SAVEWRK1+2,DEFCPX INDICATE WE'RE DEFERRING TASK @VA13548 01062600
LR R13,R3 RE-ESTABLISH OUR SAVE AREA ADDR @VA13548 01062900
YEXIT DS 0H @VA13548 01063200
NI CHYFLAG,255-CHBWAIT TAKE Y-SIDE OUT OF WAIT @VA13548 01063500
SR R3,R3 ZERO CONSTANT @VA13548 01063800
ST R3,CHYCNCT ZERO OUT THE Y-SIDE CPEX POINTER @VA13548 01064100
B VCADSPCH GO TO DISPATCHER @VA13548 01064400
DROP R1 DROP CPEXBLOK ADDRESSABILITY @VA13548 01064700
SPACE 2 01065000
NOCPEX1 DS 0H @VA13548 01065300
L R1,CHXCNCT GET THE X-SIDE CPEXBLOK @VA13548 01065600
LTR R1,R1 IS THERE ONE ? @VA13548 01065900
BZ YEXIT1 NO, GO RESET AND EXIT @VA13548 01066200
CALL DMKSTKCP YES, STACK THE X-SIDE CPEXBLOK @VA13548 01066500
SR R3,R3 GET A ZERO CONSTANT @VA13548 01066800
ST R3,CHXCNCT RESET THE X-SIDE CPEXBLOK POINTER@VA13548 01067100
YEXIT1 NI CHXFLAG,255-CHBWAIT TAKE X-SIDE OUT OF WAIT @VA13548 01067400
B YEXIT GO TO RESET THE Y-SIDE @VA13548 01067700
EJECT 01069000
* DATABLK - CALCULATE NEXT ADDRESS AND LENGTH FOR DATA TRANSFER 01070000
* GR8 = ADDRESS OF CHXBLOK OR CHYBLOK ON ENTRY 01071000
* ON EXIT: 01072000
* GR2 = NEXT DATA OR IDAW ADDRESS 01073000
* GR3 = TOTAL REMAINING CCW DATA COUNT 01074000
* GR4 = START DATA ADDRESS 01075000
* GR5 = DATA SEGMENT LENGTH 01076000
* CC = 0 --> END OF DATA TRANSFER 01077000
* CC = 1 --> DATA TO BE TRANSFERRED, AS ABOVE 01078000
* CC = 3 --> SIMULATE CHANNEL PROGRAM CHECK 01079000
* 01080000
DROP R6,R7 USE INDEPENDENT ADDRESSABILITY 01081000
DATABLK EQU * FIGURE OUT NEXT DATA SEGMENT FOR TRANSFER 01082000
USING CHXBLOK,R8 01083000
STM R0,R7,TEMPR0 SAVE SOME REGISTERS 01084000
L R9,CHXNCCW CURRENT CCW ADDRESS 01085000
L R5,CHXRCNT REMAINING DATA COUNT 01086000
LTR R5,R5 IS THERE MORE ON THIS CCW ? 01087000
BZ DATACHN THIS CCW IS DONE - TEST DATA CHAINING 01088000
L R4,CHXIDAW DATA ADDRESS OR IDAW ADDRESS 01089000
DATAGIN EQU * RE-ENTER FOR DATA-CHAINING 01090000
LA R2,2047(0) MASK CONSTANT IN GR2 01091000
LR R3,R2 ...AND IN GR3 01092000
TM RCWFLAG,IDA IS THERE AN IDAL ? 01093000
BO DATAIDA YES - SEPARATE TECHNIQUE 01094000
DATAFWD EQU * GET LENGTH OF NEXT DATA BLOCK 01095000
NR R3,R4 GR3 = DISP. WITHIN 2048-BYTE BLOCK 01096000
TM CHXCMDT,CHBRDBK IS THIS CCW GOING BACKWARDS ? 01097000
BO DATBACK YES - ADDRESS IS THE LENGTH 01098000
SR R2,R3 GR2 = (DISP. TO 2K BOUNDARY) - 1 01099000
LR R3,R2 ...INTO GR3 01100000
DATBACK EQU * GR3 = LENGTH-1 UP TO BOUNDARY 01101000
LA R3,1(0,R3) MAXIMUM LENGTH OF THIS MOVE 01102000
L R1,=A(DMKSYSRM) GET REAL MACHINE @VA03162 01103000
L R1,0(,R1) SIZE... @VA03162 01104000
CLR R4,R1 VALID ADDRESS ? @VA03162 01105000
BNL DATACC3 NO..EXIT... @VA03162 01106000
ST R4,TEMPR4 PASS BACK DATA START ADDRESS 01107000
CR R5,R3 WOULD WE HIT THE BOUNDARY ? 01108000
BL DATAEND NO -- USE CCW DATA COUNT 01109000
SR R5,R3 ADJUST COUNT FOR BYTES TO BE MOVED 01110000
ST R5,TEMPR3 ... 01111000
ST R3,TEMPR5 PASS BACK DATA SEGMENT LENGTH 01112000
TM RCWFLAG,IDA IF THE IDA FLAG IS SET... 01113000
BO DATACC1 ...'TEMPR2' HAS ALREADY BEEN UPDATED 01114000
ALR R4,R3 ASSUME FORWARD CCW 01115000
TM CHXCMDT,CHBRDBK ARE WE CORRECT ? 01116000
BZ DATAXIT YES - UPDATE TEMPR2 AND EXIT, CC = 1 01117000
SLR R4,R3 RE-ADJUST TO GET NEXT ADDRESS FOR RDBK 01118000
SLR R4,R3 ... 01119000
B DATAXIT GO UPDATE TEMPR2, EXIT CC = 1 01120000
DATAEND EQU * END OF THIS CCW 01121000
ST R5,TEMPR5 USE FULL REMAINING COUNT THIS TIME 01122000
SLR R4,R4 ... 01123000
ST R4,TEMPR3 NO MORE ON THIS CCW 01124000
DATAXIT EQU * UPDATE NEXT ADDRESS IN CHXBLOK, EXIT 01125000
ST R4,TEMPR2 NEXT DATA OR IDAW ADDRESS 01126000
DATACC1 EQU * CC = 1 IMPLIES DATA TO BE MOVED 01127000
TM *,X'FF' SET CONDITION MIXED - CC = 1 01128000
LM R0,R7,TEMPR0 RESTORE REGISTERS 01129000
BR R10 ...AND RETURN 01130000
SPACE 2 01131000
DATAIDA EQU * INDIRECT DATA ADDRESS LIST 01132000
LA R1,4(0,R4) UPDATE IDAW ADDRESS 01133000
ST R1,TEMPR2 ...FOR NEXT TIME THROUGH 01134000
CLM R4,B'0111',RCWADDR+1 FIRST IDAW IN IDAL ? 01135000
BNE DATATWO NO -- GO VALIDATE IT 01136000
L R4,0(0,R4) PICK UP FIRST DATA ADDRESS 01137000
B DATAFWD ...AND CALCULATE ACTUAL LENGTH 01138000
DATATWO EQU * VALIDATE OTHER THAN FIRST IDAW 01139000
CLI 0(R4),X'00' HIGH-ORDER MUST BE ZERO 01140000
BNE DATACC3 NOPE - CC = 3 IMPLIES PRGC 01141000
L R4,0(0,R4) PICK UP ACTUAL ADDRESS 01142000
TM CHXCMDT,CHBRDBK BACKWARDS OR FORWARDS TRANSFER ? 01143000
BO DATABID BACKWARDS IDAL 01144000
NR R2,R4 TEST ALIGNMENT ON 2048-BYTE BOUNDARY 01145000
BNZ DATACC3 NOT GOOD - PROGRAM CHECK 01146000
B DATBACK GR3 = 2047 AS REQUIRED 01147000
DATABID EQU * VALIDATE REAR-WARD MOVING IDAW 01148000
NR R3,R4 GR3 STILL = 2047 IF VALID IDAW 01149000
XR R2,R3 GR2 WILL BE ZERO IF VALID IDAW 01150000
BZ DATBACK O.K. - GO FIGURE ACTUAL TRANSFER LENGTH 01151000
DATACC3 EQU * SET PROGRAM CHECK, CC = 3 01152000
OI CHXSTAT+1,PRGC FATAL ERROR IN CHANNEL PROGRAM 01153000
ST R9,CHXNCCW REMEMBER WHICH CCW IS INVALID 01154000
TM *+1,X'FF' SET CONDITION ONES - CC = 3 01155000
DATACC0 EQU * EXIT, CC = 0 IMPLIES END OF CCW 01156000
LM R0,R7,TEMPR0 RESTORE REGISTERS 01157000
BR R10 ...AND RETURN 01158000
SPACE 01159000
DATACHN EQU * TEST FOR DATA CHAINED CCW STRINGS 01160000
ST R5,TEMPR5 PASS BACK ZERO COUNT IF NO MORE 01161000
TM RCWFLAG,CD IS THERE CHAIN DATA ? 01162000
BZ DATACC0 NO -- EXIT WITH CC = 0 01163000
LA R9,8(0,R9) ADVANCE TO NEXT CCW 01164000
DATATIC EQU * (RE-ENTER HERE IN CASE OF A TIC) 01165000
ICM R5,B'0011',RCWCNT PICK UP DATA COUNT 01166000
BAL R14,CHANCHK VALIDATE THE NEW CCW 01167000
BNZ DATACC3 OOPS -- PROGRAM CHECK ON THIS ONE 01168000
CLI RCWCOMND,X'18' IT MIGHT BE A 'TIC' AFTER CHAIN DATA 01169000
BNE DATANTC NO -- THAT'S SOMEWHAT EASIER 01170000
L R9,RCWADDR TAKE THE CCW TRANSFER 01171000
CLI RCWCOMND,X'18' 'TIC' TO ANOTHER 'TIC' ? 01172000
BE DATACC3 YES - CHANNEL PROGRAM CHECK 01173000
B DATATIC ...AND RE-VALIDATE 01174000
DATANTC EQU * CHAIN DATA, NOT A TIC - SET UP AGAIN 01175000
L R4,RCWADDR PICK UP DATA OR IDAL ADDRESS 01176000
LA R4,0(0,R4) ...WITHOUT THE OP-CODE, PLEASE 01177000
B DATAGIN GO HOME, CRASH, LOSE ONE TURN 01178000
DROP R8 01179000
USING CHXBLOK,R7 01180000
USING CHYBLOK,R6 01181000
EJECT 01182000
*. 01183000
* SUBROUTINE NAME - 01184000
* 01185000
* DMKVCATS 01186000
* 01187000
* FUNCTION - 01188000
* 01189000
* TO SIMULATE THE TEST I/O INSTRUCTION FOR A VIRTUAL CHANNEL- 01190000
* TO-CHANNEL ADAPTER WHICH HAS NO INTERRUPTS PENDING. 01191000
* 01192000
* ATTRIBUTES - 01193000
* 01194000
* RE-ENTRANT, PAGEABLE, CALLED VIA SVC 01195000
* 01196000
* ENTRY CONDITIONS - 01197000
* 01198000
* GPR 13 = ADDRESS OF STANDARD SAVE-AREA 01199000
* GPR 12 = ADDRESS OF DMKVCATS 01200000
* GPR 11 = VMBLOK ADDRESS OF ACTIVE USER 01201000
* GPR 8 = VDEVBLOK ADDRESS FOR X-SIDE COUPLED CTCA 01202000
* 01203000
* EXIT CONDITIONS - 01204000
* 01205000
* CC = 0 -> GPRS 0-15 UNCHANGED, RETURN CC = 0 TO TEST I/O 01206000
* CC = 1 -> RETURN CC = 1 TO TEST I/O, GPR 5 = CSW STATUS, 01207000
* GPRS 0-4, 6-15 UNCHANGED. 01208000
* 01209000
* CALLS TO OTHER ROUTINES - 01210000
* 01211000
* DMKSCNVU - TO LOCATE THE Y-SIDE VDEVBLOK 01212000
* DMKSTKIO - TO STACK AN IOBLOK FOR ATTENTION IF DEFERRED 01213000
* 01214000
* OPERATION - 01215000
* 01216000
* DMKVCATS IS CALLED FROM DMKVIOEX WHEN A TEST I/O INSTRUCTION 01217000
* IS ISSUED TO A VIRTUAL CHANNEL-TO-CHANNEL ADAPTER, THE 01218000
* ADAPTER HAS NO INTERRUPTS PENDING, AND THE ADAPTER IS MARKED 01219000
* AS READY. IF THE ADAPTER IS IN COMPATIBILITY MODE, THE 01220000
* Y-SIDE IS EXMAINED FOR AN ACTIVE READ, WRITE OR CONTROL 01221000
* COMMAND, AND CC = 1 WITH 'ATTN' IS PRESENTED IF YES, 01222000
* CC = 0 IF NO. 01223000
* IF THE ADAPTER IS IN EXTENDED MODE, THE FOLLOWING IS DONE: 01224000
* 1. IF A PREVIOUS X-SIDE RESET OR HALT I/O HAS NOT BEEN 01225000
* CLEARED, THE CONDITION IS CLEARED AND DEVICE END PRESENTED 01226000
* TO THE Y-SIDE CHANNEL. 01227000
* 2. IF A PREVIOUS Y-SIDE RESET OR HALT I/O HAS NOT BEEN 01228000
* CLEARED, CC = 1 WITH UNIT CHECK IS SET. 01229000
* 3. IF THE Y-SIDE HAS AN ACTIVE READ, WRITE, OR CONTROL, 01230000
* CC = 1 WITH 'ATTN' IS SET. 01231000
* 4. OTHERWISE, SET CC = 0 AND EXIT 01232000
*. 01233000
EJECT 01234000
DMKVCATS RELOC , SIMULATE TEST I/O TO VIRTUAL CTCA 01235000
BAL R5,GETCTCA GET CHXBLOK AND CHYBLOK REGISTERS 01236000
TM CHXFLAG,CHBM370 TEST FOR EXTENDED MODE 01237000
BO TIOCRES YES - DO RESET CHECKING 01238000
TIOCATN EQU * TEST FOR ATTENTION STILL PENDING 01239000
TM CHXFLAG,CHBATTN ATTENTION PENDING FROM Y-SIDE ? 01240000
BZ VCAEXC0 NO -- EXIT WITH CC = 0 01241000
L R5,=AL1(0,0,ATTN,0) CSW STATUS = ATTENTION 01242000
ST R5,SAVER5 PASS STATUS BACK TO DMKVIO 01243000
B VCAEXC1 EXIT, COND. CODE ONE => CSW STORED 01244000
TIOCRES EQU * CHECK FOR EXTENDED-MODE RESET SITUATION 01245000
TM CHYFLAG,CHBHIO+CHBREST Y-SIDE 'RESET' OR 'HIO' ? 01246000
BNZ TIOCSUC YES - SET UNIT CHECK 01247000
TM CHXFLAG,CHBEOFL IS THE END-OF-FILE LATCH SET ? 01248000
BZ TIOCATN NO -- CHECK FOR PENDING 'ATTN' 01249000
NI CHXFLAG,255-CHBEOFL RESET END-FO-FILE LATCH 01250000
L R10,CHYDATN IS THERE A DEFERRED 'ATTN' IOBLOK 01251000
LTR R10,R10 ... 01252000
BZ TIOCATN NO -- JUST CHECK PENDING 'ATTN' 01253000
CALL DMKSTKIO STACK THE IOBLOK FOR DMKVIO 01254000
ST R0,CHYDATN CLEAR THE HOLD WORD 01255000
OI CHXFLAG,CHBATTN SET ATTENTION PENDING IN X-SIDE 01256000
B VCAEXC0 ...AND EXIT WITH COND CODE ZERO 01257000
TIOCSUC EQU * SET UNIT CHECK IN CSW STATUS 01258000
LA R5,UC*256 CSW STATUS = UNIT CHECK 01259000
ST R5,SAVER5 PASS BACK TO DMKVIO 01260000
B VCAEXC1 SET CONDITION CODE ONE, UNIT CHECK 01261000
EJECT 01262000
*. 01263000
* SUBROUTINE NAME - 01264000
* 01265000
* DMKVCASH 01266000
* 01267000
* FUNCTION - 01268000
* 01269000
* TO SIMULATE THE EXECUTION OF A HALT I/O OR HALT DEVICE 01270000
* INSTRUCTION FOR A VIRTUAL CHANNEL-TO-CHANNEL ADAPTER. 01271000
* 01272000
* ATTRIBUTES - 01273000
* 01274000
* RE-ENTRANT, PAGEABLE, CALLED VIA SVC 01275000
* 01276000
* ENTRY CONDITIONS - 01277000
* 01278000
* GPR 13 = STANDARD SAVE-AREA ADDRESS 01279000
* GPR 12 = ADDRESS OF DMKVCASH 01280000
* GPR 11 = VMBLOK ADDRESS OF ACTIVE USER 01281000
* GPR 8 = VDEVBLOK ADDRESS OF X-SIDE VIRTUAL CTCA 01282000
* 01283000
* EXIT CONDITIONS - 01284000
* 01285000
* CC = 0 -> GPRS 0-15 UNCHANGED, SET CC = 0 FOR 'HIO', 'HDV' 01286000
* CC = 1 -> GPR 5 = CSW STATUS, SET CC = 1 FOR 'HIO', 'HDV' 01287000
* 01288000
* CALLS TO OTHER ROUTINES - 01289000
* 01290000
* DMKSTKCP - TO RE-CONNECT X-SIDE OR Y-SIDE IF ACTIVE 01291000
* DMKFRET - TO RELEASE FREE STORAGE IN DEFERRED IOBLOKS 01292000
* DMKSCNVU - TO LOCATE THE Y-SIDE CTCA VDEVBLOK 01293000
* 01294000
* OPERATION - 01295000
* 01296000
* DMKVCASH IS CALLED FROM DMKVIOEX WHENEVER A HALT I/O OR 01297000
* HALT DEVICE IS ISSUED AGAINST A VIRTUAL CHANNEL-TO-CHANNEL 01298000
* ADAPTER. IF THE ADAPTER HAS NOT YET BEEN COUPLED, 01299000
* CC = 1 (DEVICE HALTED) WITH CSW STATUS ZERO WILL BE 01300000
* INDICATED. IF THE ADAPTER IS COUPLED, THE Y-SIDE CHYBLOK 01301000
* IS LOCATED VIA CALLS TO DMKSCNVU AND POINTER PICK-UP. 01302000
* IF EITHER THE X-SIDE OR THE Y-SIDE HAS THE END-OF-FILE 01303000
* LATCH SET, THE LATCH IS RESET. IF THERE IS ALSO AN IOBLOK 01304000
* FOR A DEFERRED ATTENTION, THE IOBLOK IS RELEASED VIA A 01305000
* CALL TO DMKFRET. IF THE X-SIDE HAS AN ACTIVE COMMAND, 01306000
* THE COMMAND IS 'HALTED' BY A CALL TO DMKSTKCP FOR RE- 01307000
* CONNECTION OF THE DMKVCAST CODE, AND CC = 0 (INTERRUPTS 01308000
* PENDING) IS SET FOR THE HALT I/O. IF THE Y-SIDE HAS AN 01309000
* ACTIVE COMMAND, THE COMMAND IS 'HALTED' IN THE SAME MANNER, 01310000
* BUT CC = 1, CSW STATUS ZERO, IS SET UNLESS THE X-SIDE WAS 01311000
* ALSO ACTIVE AT THE TIME OF THE HALT I/O. IF NEITHER THE 01312000
* X-SIDE OR THE Y-SIDE WERE ACTIVE, CC = 1, CSW STATUS ZERO 01313000
* IS SET, AND THE HALT I/O OCCURRENCE IS INDICATED ONLY IF 01314000
* THE ADAPTER WAS RUNNING IN EXTENDED MODE. 01315000
*. 01316000
EJECT 01317000
DMKVCASH RELOC , HALT I/O OR HALT DEVICE TO VIRTUAL CTCA 01318000
USING VDEVBLOK,R8 USE THE VDEVBLOK TEMPORARILY 01319000
SLR R0,R0 (CONVENIENT CONSTANT) 01320000
ST R0,SAVER5 CSW STATUS USUALLY EQUALS ZERO 01321000
TM VDEVSTAT,VDEVNRDY IS THE CTCA COUPLED ? 01322000
BO VCAEXC1 NO -- CC = 1, CSW STORED 01323000
BAL R5,GETCTCA ACCESS CHXBLOK, CHYBLOK 01324000
BAL R5,RESATTN RESET DEFERRED ATTENTION IOBLOKS 01325000
LA R10,VCAEXC1 COND. CODE ONE NORMALLY 01326000
SPACE 01327000
TM CHXFLAG,CHBWAIT IS THE X-SIDE ACTIVE ? 01328000
BO SETHIOX YES -- INDICATE SO 01329000
LR R5,R10 SAVE RETURN ADDRESS 01330000
LA R0,IOBSIZE SET UP IOBLOK WITH 01331000
CALL DMKFREE CHANNEL END AND DEVICE END 01332000
LR R10,R1 FOR HALT DEVICE WITH CC=1 01333000
XC IOBLOK(IOBSIZE*8),IOBLOK CLEAR IOBLOK 01334000
ST R11,IOBUSER CALLER VMBLOK ADDRESS 01335000
MVI IOBCSW+4,CE+DE INDICATE CHANNEL AND DEVICE END 01336000
LH R1,SAVER1+2 GET ADDRESS OF CTCA DEVICE 01337000
STH R1,IOBVADD AND STORE IN IOBLOK 01338000
L R1,=A(DMKVIOIN) SET INTERRUPT RETURN ADDRESS 01339000
ST R1,IOBIRA .. 01340000
ST R10,IOBLINK FORCE IOBLOK TO LINK TOSELF 01341000
CALL DMKSTKIO STACK IOBLOK FOR DMKVIO 01342000
LR R10,R5 RESTORE RETURN ADDRESS 01343000
B VCAHIOX JUST HALT THE Y-SIDE 01344000
SETHIOX OI CHXFLAG,CHBHIO LET X-SIDE KNOW WHY IT STOPPED 01345000
NI CHYFLAG,255-CHBATTN X-SIDE WAS JUST HALTED 01346000
L R1,CHXCNCT CPEXBLOK FOR RE-CONNECT 01347000
ST R0,CHXCNCT ...CLEAR POINTER... 01348000
CALL DMKSTKCP STACK FOR EXECUTION 01349000
NI CHXFLAG,255-CHBWAIT X-SIDE WAS JUST HALTED 01350000
LA R10,VCAEXC0 SET COND. CODE ZERO ON EXIT 01351000
VCAHIOX EQU * HIO, X-SIDE IDLE 01352000
TM CHYFLAG,CHBWAIT IS Y-SIDE ACTIVE ? 01353000
BZ VCAHIOY NO -- CHECK IF 'HIO' REMEMBERED 01354000
OI CHXFLAG,CHBHIO LET Y-SIDE KNOW WHY IT STOPPED 01355000
LR R3,R10 HAVE 'GOCHANY' EXIT DIRECTLY 01356000
B GOCHANY RE-CONNECT THE Y-SIDE 01357000
VCAHIOY EQU * CHECK FOR COMPATIBILITY MODE 01358000
TM CHXFLAG,CHBM370 STILL IN EXTENDED MODE ? 01359000
BCR 8,R10 NO -- DON'T SET 'CHBHIO' IF IDLE 01360000
OI CHXFLAG,CHBHIO HALT I/O OR HALT DEVICE 01361000
BR R10 EXIT WITH CONDITION CODE 01362000
EJECT 01363000
*. 01364000
* SUBROUTINE NAME - 01365000
* 01366000
* DMKVCARD 01367000
* 01368000
* FUNCTION - 01369000
* 01370000
* TO PERFORM A SELECTIVE DEVICE RESET FOR A VIRTUAL 01371000
* CHANNEL-TO-CHANNEL ADAPTER WITHOUT DE-COUPLING THE 01372000
* CTCA FROM THE Y-SIDE ADAPTER 01373000
* 01374000
* ENTRY CONDITIONS - 01375000
* 01376000
* GPR 13 = ADDRESS OF STANDARD SAVE-AREA 01377000
* GPR 12 = ADDRESS OF DMKVCARD 01378000
* GPR 11 = VMBLOK ADDRESS FOR ACTIVE USER 01379000
* GPR 8 = VDEVBLOK ADDRESS OF VIRTUAL CTCA 01380000
* 01381000
* EXIT CONDITIONS - GPRS 0-15 UNCHANGED 01382000
* 01383000
* OPERATION - 01384000
* 01385000
* DMKVCARD IS CALLED VIA SVC FROM DMKCFPRD TO RESET A VIRTUAL 01386000
* CTCA, EITHER DUE TO THE 'RESET' COMMAND OR A VIRTUAL MACHINE 01387000
* LOGOUT. IF THE ADAPTER HAS NOT YET BEEN COUPLED, AN EXIT IS 01388000
* TAKEN IMMEDIATELY. IF THE ADAPTER IS COUPLED, ANY ACTIVE 01389000
* COMMAND IS 'HALTED' VIA A CALL TO DMKSTKCP FOR THE X-SIDE, 01390000
* THE Y-SIDE, OR BOTH, AS NEEDED. IF EITHER END-OF-FILE LATCH 01391000
* IS SET, THE LATCH IS RESET AND ANY DEFERRED ATTENTION 01392000
* IOBLOKS ARE RELEASED VIA A CALL TO DMKFRET. 01393000
* IF THE ADAPTER IS RUNNING IN EXTENDED MODE, CHECKS ARE MADE 01394000
* TO DETERMINE IF THE RESET CONDITION SHOULD BE RECORDED IN 01395000
* THE CHXBLOK, OR IF THE ADAPTER HAS BEEN FORCED INTO 01396000
* COMPATIBILITY MODE BY THE SELECTIVE RESET. 01397000
*. 01398000
EJECT 01399000
DMKVCARD RELOC , DEVICE RESET WITHOUT DE-COUPLE 01400000
SPACE 01401000
TM VDEVSTAT,VDEVNRDY IS THE CTCA COUPLED ? 01402000
BO VCAEXIT NO -- JUST EXIT QUIETLY 01403000
L R9,VDEVREAL ADDRESS OF CHXBLOK @VA09657 01403100
DROP R7 @VA09657 01403200
USING CHXBLOK,R9 @VA09657 01403300
L R11,CHXOTHR Y-SIDE VMBLOK @VA09657 01403400
TM VMRSTAT,VMLOGOFF IS Y-SIDE LOGGING OFF ? @VA09657 01403500
BZ FINDCTCA NO,THEN FIND THE CTCA FOR Y-SIDE@VA09657 01403600
L R11,SAVER11 OTHERWISE LOAD CORRECT VMBLOK @VA09657 01403700
B VCAEXIT AND EXIT @VA09657 01403800
FINDCTCA EQU * @VA09657 01403900
LH R1,CHXYADD Y-SIDE VADDR @VA09657 01404000
CALL DMKSCNVU GET Y-SIDE VDEVBLOK @VA09657 01404100
L R6,VDEVREAL ADDRESS OF CHYBLOK @VA09657 01404200
L R11,SAVER11 LOAD CORRECT VMBLOK ADDRESS @VA09657 01404300
LR R7,R9 ACCESS CHXBLOK VIA GR7 @VA09657 01404400
USING CHXBLOK,R7 @VA09657 01404500
DROP R9 @VA09657 01404600
TM CHYFLAG,CHBMNOP DID Y-SIDE INHIBIT COMPATIBILITY ? 01405000
BO RESMODE YES - LEAVE IN EXTENDED MODE 01406000
NI CHYFLAG,255-CHBM370 DROP INTO COMPATIBILITY MODE 01407000
RESMODE EQU * 01408000
BAL R5,RESATTN RESET EOF LATCHES 01409000
MVI CHXFLAG,0 ZERO X FLAG BYTE 01410000
TM CHYFLAG,CHBWAIT IS THE Y-SIDE WAITING ? 01411000
BZ VCAEXIT NO -- ALL DONE 01412000
OI CHXFLAG,CHBREST 'SYSTEM RESET' FOR X-SIDE 01413000
BAL R3,GOCHANY RE-CONNECT THE Y-SIDE 01414000
LA R3,VCAEXIT @VA01079 01415000
BAL R14,BLDCPEX GET CONTROL BACK AFTER Y-SIDE @VA01079 01416000
* RECONNECTED 01417000
CALL DMKSTKCP @VA01079 01418000
GOTO DMKDSPCH @VA01079 01419000
SPACE 2 01420000
RESATTN EQU * RESET EOF LATCHES, CLEAR DEFERRED 'ATTN' 01421000
TM CHYFLAG,CHBEOFL IS THE Y-SIDE EOF LATCH SET ? 01422000
BZ RESCTCB NO -- 01423000
NI CHYFLAG,255-CHBEOFL FIRST, WE RESET IT... 01424000
L R10,CHXDATN THEN CHECK FOR X-SIDE DEFERRED 'ATTN' 01425000
LTR R10,R10 IS THERE AN 'ATTN' IOBLOK ? 01426000
BZ RESCTCB NO -- 01427000
BAL R3,FRETIOB FRET THE IOBLOK - CANCEL ATTENTION 01428000
ST R0,CHXDATN CLEAR OUT POINTER WORD 01429000
RESCTCB EQU * CHECK X-SIDE END-OF-FILE LATCH 01430000
TM CHXFLAG,CHBEOFL IS THE X-SIDE EOF LATCH SET ? 01431000
BCR 8,R5 NO -- 01432000
NI CHXFLAG,255-CHBEOFL FIRST RESET THE LATCH 01433000
L R10,CHYDATN THEN CHECK FOR Y-SIDE DEFERRED 'ATTN' 01434000
LTR R10,R10 IS THERE AN 'ATTN' IOBLOK ? 01435000
BCR 8,R5 NO -- 01436000
BAL R3,FRETIOB FRET THE IOBLOK - CANCEL ATTENTION 01437000
ST R0,CHYDATN CLEAR OUT POINTER WORD 01438000
BR R5 RETURN 01439000
EJECT 01440000
*. 01441000
* SUBROUTINE NAME - 01442000
* 01443000
* DMKVCARS 01444000
* 01445000
* FUNCTION - 01446000
* 01447000
* TO PERFORM A FINAL RESET FOR A VIRTUAL CHANNEL-TO-CHANNEL 01448000
* ADAPTER AND TO DISCONNECT THE ADAPTER FROM ITS COUPLE'D 01449000
* TWIN ON THE Y-SIDE VIRTUAL MACHINE. 01450000
* 01451000
* ENTRY CONDITIONS - 01452000
* 01453000
* GPR 13 = ADDRESS OF STANDARD SAVE-AREA 01454000
* GPR 12 = ADDRESS OF DMKVCARS 01455000
* GPR 11 = VMBLOK ADDRESS OF X-SIDE USER 01456000
* GPR 8 = VDEVBLOK ADDRESS OF X-SIDE VIRTUAL CTCA 01457000
* 01458000
* EXIT CONDITIONS - GPRS 0-15 UNCHANGED 01459000
* 01460000
* OPERATION - 01461000
* 01462000
* DMKVCARS IS CALLED VIA SVC FROM DMKVDBRL WHEN THE VIRTUAL 01463000
* MACHINE EITHER DETACHES THE VIRTUAL CTCA OR ISSUES THE 01464000
* CP 'LOGOFF' COMMAND. DMKVCARD HAS BEEN CALLED PRIOR TO THE 01465000
* CALL TO DMKVCARS, SUCH THAT THE ADAPTER IS KNOWN TO BE IDLE. 01466000
* THE Y-SIDE VDEVBLOK IS LOCATED VIA A CALL TO DMKSCNVU, 01467000
* AND BOTH THE X-SIDE AND Y-SIDE VDEVBLOKS ARE MARKED 'NOT 01468000
* READY' (I.E. NOT COUPLED), AND THE CHXBLOK AND CHYBLOK 01469000
* POINTERS ARE CLEARED. THE MESSAGE: 01470000
* 01471000
* CTCA XXX DROP FROM USERID XXX 01472000
* 01473000
* IS BUILT FOR THE Y-SIDE USER, FROM INFORMATION IN THE 01474000
* CHXBLOK, AND IS SENT TO THE USER IF HE IS NOT IN THE LOGOFF 01475000
* PROCESS, OR IF THE X-SIDE AND Y-SIDE VIRTUAL MACHINES ARE 01476000
* IN FACT A SINGLE MACHINE. THE VIRTUAL ADDRESSES IN THE 01477000
* MESSAGE ARE EXCHANGED AND IT IS SENT TO THE X-SIDE USER IF 01478000
* HE IS NOT IN THE LOGOFF PROCESS. FINALLY, THE BASE ADDRESS 01479000
* OF THE CHXBLOK, CHYBLOK COMBINATION IS DETERMINED AND THE 01480000
* FREE STORAGE IS RELEASED VIA A CALL TO DMKFRET. 01481000
*. 01482000
EJECT 01483000
DROP R6,R7,R10 ABANDON STANDARD USAGES @VA09657 01484000
DMKVCARS RELOC , INTERNAL RESET FOR CHAN-TO-CHAN ADAPTER 01485000
USING VDEVBLOK,R8 01486000
USING CHXBLOK,R9 01487000
USING CHYBLOK,R10 01488000
SPACE 01489000
MVI SAVEWRK1,X'00' CLEAR A FLAG BYTE 01490000
TM VDEVSTAT,VDEVNRDY IS THE ADAPTER COUPLED ? 01491000
BO VCAEXIT NO -- JUST EXIT SMOOTHLY 01492000
OI VDEVSTAT,VDEVNRDY MARK NOT READY TO AVOID DOUBLE FRET 01493000
L R9,VDEVREAL ADDRESS OF CHXBLOK @VA08419 01494500
SLR R0,R0 ZERO REG0 @VA08419 01495000
ST R0,VDEVREAL UNPLUG @VA08419 01495500
L R11,CHXOTHR Y-SIDE VMBLOK @VA08419 01496000
LH R1,CHXYADD Y-SIDE VADDR @VA08419 01496500
CALL DMKSCNVU @VA08419 01497000
BZ CONTINUE NO, FRET BOTH CHBLOKS @VA13002 01497050
USING VCUBLOK,R7 Y, RESTORE Y VDEVBLOK ADDR @VA13002 01497100
LA R8,X'00F' BY ISOLATING DEVICE BIT @VA13002 01497150
NR R8,R1 @VA13002 01497200
AR R8,R8 @VA13002 01497250
LH R8,VCUDVTBL(R8) LOAD VDEVBLOK INDEX @VA13002 01497300
A R8,VMDVSTRT LOAD VDEVBLOK POINTER @VA13002 01497350
DROP R7 @VA13002 01497400
CONTINUE EQU * @VA13002 01497450
L R10,VDEVREAL ADDRESS OF CHYBLOK @VA08419 01497500
ST R0,VDEVREAL UNPLUG @VA08419 01498000
OI VDEVSTAT,VDEVNRDY MARK NOT READY @VA08419 01498500
L R11,SAVER11 VMBLOK NOW MATCHES CPU TIMER AGAIN 01506000
EJECT 01507000
* 01508000
* SEND DROP MESSAGES TO BOTH USERS 01509000
* 01510000
MVC SAVEWRK2(8),BLANKS BLANK OUT SAVE-AREA BUFFER 01511000
MVC SAVEWRK4(24),SAVEWRK2 ... 01512000
MVC SAVEWRK2(4),=C'CTCA' DEVICE NAME 01513000
MVC SAVEWRK4+1(9),=C'DROP FROM' ACTION CUE 01514000
LH R1,CHXYADD CONVERT THE ADDRESSES 01515000
CALL DMKCVTBH 01516000
LR R5,R1 GR5 = Y-SIDE VADDR 01517000
LH R1,CHYXADD ... 01518000
CALL DMKCVTBH 01519000
LR R4,R1 GR4 = X-SIDE VADDR 01520000
CL R11,CHXOTHR ARE THE CTCA'S WRAPPED ON ONE VM ? 01521000
BE VCAWRAP YES - GIVE ONLY ONE MESSAGE 01522000
MVC SAVEWRK6+3(8),VMUSER LOCAL USERID 01523000
STCM R5,B'0111',SAVEWRK3+1 REMOTE CTCA 01524000
STCM R4,B'0111',SAVEWRK9 LOCAL CTCA 01525000
BAL R2,VMYSIDE GET Y-SIDE VMBLOK IN R11 @V407510 01526100
TM VMRSTAT,VMLOGOFF IS USER IN LOGOFF PROCESS ? 01527000
BO VCAWRAP YES - SKIP THE DROP MESSAGE 01528000
LA R0,SAVEWRK9+4-SAVEWRK2 LENGTH 01529000
LA R1,SAVEWRK2 ADDRESS 01530000
CALL DMKQCNWT,PARM=NORET 01531000
VCAWRAP DS 0H BACK TO X-SIDE @V407510 01532100
BAL R2,VMXSIDE BACK TO X-SIDE VMBLOK @V407510 01532200
STCM R4,B'0111',SAVEWRK3+1 LOCAL CTCA 01534000
STCM R5,B'0111',SAVEWRK9 REMOTE CTCA 01535000
L R11,CHXOTHR MOMENTARILY GET OTHER VMBLOK 01536000
MVC SAVEWRK6+3(8),VMUSER ...FOR HIS USERID 01537000
L R11,SAVER11 NOW WE'RE BACK 01538000
TM VMRSTAT,VMLOGOFF IS USER IN LOGOOF PROCESS ? 01539000
BO RELEASE YES - SKIP THE DROP MESSAGE 01540000
LA R0,SAVEWRK9+4-SAVEWRK2 LENGTH 01541000
LA R1,SAVEWRK2 ADDRESS 01542000
CALL DMKQCNWT,PARM=NORET 01543000
EJECT 01544000
RELEASE EQU * RELEASE THE INTER-CONNECTOR BLOCK 01545000
LR R1,R9 ADDRESS OF CHXBLOK TO GR1 01546000
CLR R9,R10 WHICH ONE IS THE REAL ONE ? 01547000
BL FRETBLK CHXBLOK - O.K. AS IS 01548000
LR R1,R10 CHYBLOK - USE IT'S ADDRESS 01549000
FRETBLK EQU * RELEASE CHX, CHY BLOCKS 01550000
LA R0,CHBSIZE 01551000
CALL DMKFRET 01552000
SPACE 01553000
VCAEXC0 EQU * SET CONDITION CODE ZERO 01554000
SR R0,R0 ... 01555000
B VCAEXIT ...AND EXIT WITH COND. CODE SET 01556000
VCAEXC1 EQU * SET CONDITION CODE ONE => CSW STORED 01557000
TM *,X'FF' CONDITION MIXED => CC = 1 01558000
SPACE 01559000
VCAEXIT EQU * RETURN TO CALLER 01560000
EXIT 01561000
SPACE 4 01562000
VMXSIDE EQU * SWITCH TO X-SIDE VMBLOK 01563000
L R1,SAVER11 GET CALLER'S VMBLOK @V407510 01564100
SWTCHVM SWITCH TO CALLER @V407510 01564200
BR R2 RETURN TO CALLER @V407510 01564300
SPACE 01568000
VMYSIDE EQU * SWITCH TO Y-SIDE VMBLOK 01569000
L R1,CHXOTHR GET Y-SIDE VMBLOK @V407510 01570100
SWTCHVM SWITCH TO Y-SIDE @V407510 01570200
BR R2 RETURN TO CALLER @V407510 01570300
DROP R8,R9,R10 01574000
SPACE 01575000
FRETIOB EQU * RELEASE PENDING 'ATTN' IOBLOK 01576000
LR R1,R10 IOBLOK ADDRESS 01577000
LA R0,IOBSIZE ...AND SIZE 01578000
CALL DMKFRET RELEASE FREE STORAGE BLOCK 01579000
SLR R0,R0 RESTORE CONVENIENT CONSTANT 01580000
BR R3 ...RETURN 01581000
EJECT 01582000
USING CHXBLOK,R7 RE-ASSERT STANDARD USAGE 01583000
CHANCHK EQU * CCW ADDR IN GR9, RETURN IN GR14 01584000
USING RCWCCW,R9 VALIDATE CCW FROM CHANNEL VIEWPOINT 01585000
SLR R1,R1 ZERO STATUS ACCUMULATION 01586000
TM RCWCTL,RCWINVL IS THE CCW VALID ? 01587000
BCR 1,R14 NO -- RETURN WITH NON-ZERO COND. CODE 01588000
CLI RCWCOMND,X'08' IS THIS A TIC COMMAND @VM08638 01589000
BNE TST18 NO -- CHECK FOR CMD X'18' @VM08638 01590000
TICADD TM RCWCOMND+3,X'07' IS THE ADDR. DBL-WORD ALIGNED ?@VM08638 01591000
BR R14 IF YES, CC=ZERO AND NONZERO IF NO@VM08638 01592000
TST18 CLI RCWCOMND,X'18' MAYBE TIC AFTER CHAIN DATA @VM08638 01593000
BE TICADD YES, CHECK TIC ADDRESS @VM08638 01594000
CH R1,RCWCNT COUNT NON-ZERO FOR NON-TIC'S @VM08638 01595000
BNE CHANFLG YES - VALIDATE IDAW, IF ANY @VM08638 01596000
TM *,X'FF' SET COND. CODE = NONZERO @VM08638 01597000
BR R14 ...AND RETURN @VM08638 01598000
CHANFLG EQU * CHECK IDA FLAG, VALIDATE IDAW 01599000
TM RCWFLAG,X'03' ARE THE MUST-BE-ZERO BITS ZERO ? 01600000
BCR 7,R14 NO -- RETURN WITH COND. CODE NON-ZERO 01601000
TM RCWFLAG,IDA IS THE INDIRECT BIT ON ? 01602000
BZ CHANPCI NO -- GO TEST FOR 'PCI' 01603000
L R1,RCWADDR GET ADDRESS OF FIRST IDAW 01604000
TM 0(R1),X'FF' HIGH-ORDER MUST BE ZERO 01605000
BCR 7,R14 RETURN WITH COND. CODE IF NOT VALID 01606000
CHANPCI EQU * TEST FOR PCI IN CCW 01607000
TM RCWFLAG,PCIF SHOULD WE SET 'PCI' ? 01608000
BCR 8,R14 NO -- JUST EXIT WITH CC = 0 01609000
OI CHXSTAT+1,PCI USER WILL SEE THIS SOMEWHAT LATER 01610000
SR R1,R1 SET COND. CODE = ZERO 01611000
BR R14 ...AND RETURN 01612000
SPACE 01613000
BLDIOER EQU * CSW IN GR4-5, SENSE IN GR6 01614000
LR R2,R14 SAVE RETURN ADDRESS 01615000
LA R0,IOERSIZE GET AN IOERBLOK 01616000
CALL DMKFREE ... 01617000
USING IOERBLOK,R1 01618000
XC IOERBLOK(IOERSIZE*8),IOERBLOK 01619000
STM R4,R5,IOERCSW SET ERROR CSW IN IOERBLOK 01620000
LA R0,IOERDATA CONSTRUCT DUMMY SENSE CCW 01621000
ST R0,IOERCCW ...FOR ESTHETIC AND PRACTICAL REASONS 01622000
MVI IOERCCW,X'04' 01623000
MVI IOERLEN+1,1 SENSE DATA LENGTH 01624000
MVI IOERCCW+4,SILI 01625000
STC R3,IOERDATA SET SENSE DATA 01626000
BR R2 RETURN TO CALLER 01627000
SPACE 01628000
CHKPKEY EQU * TEST FOR PROTECTION VIOLATIONS 01629000
CLI CHXPKEY,X'00' IF HIS CAW KEY IS ZERO... 01630000
BCR 8,R14 ...HE CAN STORE ANYWHERE 01631000
L R1,=X'00FFFFF0' ALIGNMENT MASK 01632000
NR R1,R2 REAL ADDRESS IS IN GR2 01633000
ISK R1,R1 GET REAL STORAGE KEY 01634000
N R1,F240 REDUCE TO FOUR BIT KEY 01635000
CLM R1,B'0001',CHXPKEY TEST FOR KEY MATCH 01636000
BR R14 RETURN WITH COND. CODE SET 01637000
DROP R1,R7,R9 01638000
EJECT 01639000
BLDCPEX EQU * BUILD CPEXBLOK FOR DEFERRED EXECUTION 01640000
STM R14,R15,SAVEWRK2 SAVE GR14, 15 01641000
LA R0,CPEXSIZE SIZE OF CPEXBLOK 01642000
CALL DMKFREE 01643000
USING CPEXBLOK,R1 01644000
LM R14,R15,SAVEWRK2 RESTORE GR14, 15 01645000
SLR R0,R0 RESTORE CONVENIENT ZERO CONSTANT 01646000
STM R0,R15,CPEXR0 SET CPEXBLOK REGISTERS 01647000
ST R3,CPEXADD SET EXECUTION ADDRESS 01648000
MVC CPEXFPNT(12),ZEROES CLEAR FIRST THREE WORDS 01649000
BR R14 RETURN TO INTERNAL CALLER 01650000
DROP R1 01651000
SPACE 2 01652000
USING VDEVBLOK,R8 01653000
GETCTCA EQU * GET ADDRESSES FOR BOTH BLOCKS 01654000
L R9,VDEVREAL ADDRESS OF CHXBLOK 01655000
USING CHXBLOK,R9 TEMPORARILY 01656000
L R11,CHXOTHR Y-SIDE VMBLOK 01657000
LH R1,CHXYADD Y-SIDE VADDR 01658000
CALL DMKSCNVU GET Y-SIDE VDEVBLOK 01659000
L R6,VDEVREAL ADDRESS OF CHYBLOK 01660000
L R11,SAVER11 BACK TO CORRECT VMBLOK 01661000
LR R7,R9 ACCESS CHXBLOK VIA GR7 01662000
BR R5 RETURN INTERNAL 01663000
DROP R8,R9 01664000
SPACE 2 01665000
LTORG 01666000
EJECT 01667000
DEFCPX EQU X'80' FLAG INDICATING DEFERRED CPEXBLOK@VA13548 01667500
COPY VCTCA 01668000
COPY IOBLOKS 01669000
COPY IOER 01670000
COPY VMBLOK 01671000
COPY VBLOKS 01672000
COPY DEVTYPES 01673000
COPY EQU 01674000
COPY SAVE 01675000
PSA 01676000
END DMKVCA 01677000