TITLE 'ICATS UTS I/O ROUTINES' REA00010
*********************************************************************** REA00020
* * REA00030
* MODULE NAME = UTS I/O ROUTINES (READ REQUEST CONTROL BLOCK, * REA00040
* READ DATA, WRITE DATA, AND INTERRUPT THE UTS). * REA00050
* * REA00060
* FUNCTION = PERFORM THE REAL UTS I/O. IF THIS REQUEST GOT * REA00070
* INITIATED BY THE FAKIT COMMAND, THEN DON'T DO * REA00080
* REAL UTS I/O, RATHER FAKE IT WITH CMS FILES. * REA00090
* * REA00100
* ENTRY POINTS = READUTS, WRITEUTS, READRCB, OR INTERUTS. * REA00110
* * REA00120
* LINKAGE = TO READ A REQUEST CONTROL BLOCK FROM THE UTS * REA00130
* IDENTIFIED BY THISUTS, DO * REA00140
* LA R0,128 HOW MANY BYTES YOU WANT * REA00150
* LA R1,BUFFER WHERE YOU WANT IT * REA00160
* L R15,AREADRCB * REA00170
* BALR R14,R15 * REA00180
* * REA00190
* TO READ SOME DATA FROM THE UTS IDENTIFIED BY * REA00200
* THISUTS (FOR EXAMPLE, AS WITH A WRITE REQUEST), DO * REA00210
* LA R0,XXX HOW MANY BYTES YOU WANT * REA00220
* LA R1,BUFFER WHERE YOU WANT IT * REA00230
* L R15,AREADUTS * REA00240
* BALR R14,R15 * REA00250
* * REA00260
* TO WRITE SOME DATA TO THE UTS IDENTIFIED BY THISUTS * REA00270
* (FOR EXAMPLE, THE REPLY CONTROL BLOCK AND ACCOMPANYING * REA00280
* DATA IF ANY), DO * REA00290
* LA R0,XXX HOW MANY BYTES TO PASS * REA00300
* LA R1,BUFFER BUFFER ADDRESS * REA00310
* L R15,AWRITUTS * REA00320
* BALR R14,R15 * REA00330
* * REA00340
* TO PROVIDE AN ASYNCHRONOUS INTERRUPT TO THE UTS * REA00350
* IDENTIFIED BY THISUTS, DO * REA00360
* LA R0,XXX HOW MANY BYTES TO PASS * REA00370
* LA R1,BUFFER BUFFER ADDRESS * REA00380
* L R15,AINTUTS * REA00390
* BALR R14,R15 * REA00400
* * REA00410
* REGISTER CONTENTS UPON ENTRY = * REA00420
* R0 = HOW MANY BYTES THE CALLER WANTS FROM THE UTS. * REA00430
* R1 = THE BUFFER ADDRESS. * REA00440
* R2 = POINTS TO THE ICATS COMMON DATA AREA AS ALWAYS. * REA00450
* R4 = POINTS THIS UTS'S CONTROL BLOCK. * REA00460
* R14 = RETURN ADDRESS BACK TO THE UTS I/O ROUTINE. * REA00470
* R15 = ADDRESS OF THIS SUBROUTINE (USED FOR BASE REG). * REA00480
* * REA00490
* REGISTER USAGE: * REA00500
* R0 = FREE * REA00510
* R1 = FREE * REA00520
* R2 = ICATS COMMON DATA AREA BASE REGISTER (ICDATA) * REA00530
* R3-R7 = FREE * REA00540
* R8 = UTS VIRTUAL ADDRESS IN HEX (USED IN THE DIAGNOSE INSTR). * REA00550
* R9 = CAW (USED IN THE DIAGNOSE INSTRUCTION). * REA00560
* R10 = USED AS A BASE REGISTER UNTIL BRANCH TO SIOSUB. * REA00570
* R11 = BASE REGISTER FOR THIS ROUTINE STARTING AT SIOSUB. * REA00580
* R12 = SIO LOOP COUNTER. * REA00590
* R13 = TEMPORARY HOLD REGISTER FOR MY RETURN CODE. * REA00600
* R14 = TEMPORARY WORK REGISTER AND RETURN ADDRESS FOR WHEN * REA00610
* CALL SUBROUTINES * REA00620
* R15 = SUBROUTINE ADDRESS * REA00630
* * REA00640
* MODULE LOGIC = * REA00650
* I) FOR EACH ENTRY POINT, * REA00660
* 1) SAVE REGISTERS * REA00670
* 2) SET UP SECONDARY BASE REGISTER * REA00680
* 3) IF THIS IS TO BE A FAKE OPERATION, BRANCH TO THE * REA00690
* APPROPRIATE FAKE I/O MODULE. * REA00700
* 4) ELSE DO THE REAL I/O TO THE UTS. * REA00710
* A) SET THE CORRECT CCW OP CODE, * REA00720
* 01 = WRITE NORMAL DATA (WRITE UTS) * REA00730
* 05 = WRITE SPECIAL DATA (INTERRUPT THE UTS) * REA00740
* 02 = READ NORMAL DATA (READ UTS) * REA00750
* 06 = READ SPECIAL DATA (READ REQUEST CONTROL BLOCK)* REA00760
* B) GO TO THE COMMON REAL I/O ROUTINE. * REA00770
* - BUILD THE REST OF THE CCW. * REA00780
* - CLEAR THE CSW & THE SENSE BYTE IN THE UTSCB. * REA00790
* - DO THE DIAGNOSE X'20' TO DO THE REAL I/O. * REA00800
* - RETRY UTS BUSY 200 TIMES. * REA00810
* * REA00820
* RETURN CODES = * REA00830
* R15 = 0 = I/O OPERATION WORKED O.K. * REA00840
* R15 = 4 = UNIT CHECK. SENSE BYTE 0 (SENSE0) IN * REA00850
* ICDATA IS VALID. * REA00860
* R15 = 8 = INCORRECT LENGTH INDICATION POSTED IN CSW. * REA00870
* R15 = 12 = UNIT EXCEPTION BIT POSTED IN CSW. * REA00880
* R15 = 16 = DEVICE IS NOT ATTACHED. SHOULD NEVER HAPPEN. * REA00890
* R15 = 20 = DEVICE IS NOT SYS-GEN'ED CORRECTLY. * REA00900
* SHOULD BE DEVTYPE=TEST,CLASS=DASD. * REA00910
* R15 = 24 = DEVICE IS NOT RESPONDING. HAPPENS WHEN THE UTS * REA00920
* WENT DOWN AND ISN'T COMING BACK UP. * REA00930
* * REA00940
* RETURN CODES (FOR FAKED I/O) = * REA00950
* R15 = 0 = EVERYTHING WENT OK. * REA00960
* OR R15 = 4 = THE FILE ICATS INDATA A DOES NOT EXIST. * REA00970
* OR R15 = 8 = INCORRECT BUFFER LENGTH (NOT POSITIVE). * REA00980
* * REA00990
* EXTERNAL REFERENCES = NONE * REA01000
* * REA01010
* CONTROL BLOCKS = ICDATA (ICATS COMMON DATA AREA) * REA01020
* * REA01030
* NON-STANDARD MACROS (FOUND IN ICATS MACLIB) * REA01040
* ICDATA = ICATS COMMON DATA AREA DSECT. * REA01050
* * REA01060
* CHANGE ACTIVITY * REA01070
* DATE NAME REASON FOR CHANGE * REA01080
* 04/21/83 RICK JASPER BROKEN AWAY FROM ICATS MAINLINE INTO * REA01090
* SEPARATE SUBROUTINE * REA01100
* 04/28/83 RICK JASPER REAL I/O ROUTINE WRITTEN. * REA01110
* 08/17/83 RICK JASPER ADDED RETRY IF UTS IS BUSY. * REA01120
* 08/23/83 RICK JASPER BUMPED NUMBER OF RETRIES TO 1000. * REA01130
* 09/06/83 RICK JASPER REDUCED NUMBER OF RETRIES TO 200. * REA01140
* * REA01150
*********************************************************************** REA01160
EJECT REA01170
PRINT GEN,NODATA REA01180
READUTS CSECT REA01190
ENTRY WRITEUTS,READRCB,INTERUTS ADDITIONAL ENTRY POINTS REA01200
USING ICDATA,R2 ADDRESS ICATS COMMON DATA AREA REA01210
USING CBUTS,R4 USE R4 TO ADDRESS UTS CONTROL BLOCK REA01220
USING READUTS,R15 USE R15 FOR NEXT INSTRUCTION ONLY REA01230
STM R1,R14,UTSIOREG SAVE CALLERS REGISTERS REA01240
DROP R15 REA01250
USING READUTS,R10 USE R10 FOR RIGHT NOW REA01260
LR R10,R15 SWITCH BASE REGISTER TO R10 REA01270
LA R11,SIOSUB PREPARE OTHER BASE REGISTER REA01280
TM FLAGC,FAKEINT IS THIS A FAKE REQUEST ?? REA01290
BO FAKEARD THEN, GO FAKE A READ FROM THE UTS REA01300
* PREPARE FOR THE REAL UTS I/O ROUTINE. REA01310
MVI UTSCCW,X'02' CCW OP CODE = X'02' = READ REA01320
B SIOSUB REA01330
FAKEARD DS 0H REA01340
L R15,=V(FAKEREAD) REA01350
BALR R14,R15 REA01360
B ALLBYE GO RETURN TO CALLER REA01370
DROP R10 REA01380
*********************************************************************** REA01390
*********************************************************************** REA01400
INTERUTS DS 0H REA01410
USING INTERUTS,R15 USE R15 FOR NEXT INSTRUCTION ONLY REA01420
STM R1,R14,UTSIOREG SAVE CALLERS REGISTERS REA01430
DROP R15 REA01440
USING INTERUTS,R10 USE R10 FOR RIGHT NOW REA01450
LR R10,R15 SWITCH BASE REGISTER TO R10 REA01460
LA R11,SIOSUB PREPARE OTHER BASE REGISTER REA01470
TM FLAGC,FAKEINT IS THIS A FAKE REQUEST ?? REA01480
BO FAKEAINT THEN, GO FAKE A UTS INTERRUPT REA01490
* PREPARE FOR THE REAL UTS I/O ROUTINE. REA01500
MVI UTSCCW,X'05' CCW OP CODE = X'01' = ASYNCH INTERRUPT REA01510
B SIOSUB REA01520
FAKEAINT DS 0H REA01530
L R15,=V(FAKEWRIT) REA01540
BALR R14,R15 REA01550
B ALLBYE GO RETURN TO CALLER REA01560
DROP R10 REA01570
*********************************************************************** REA01580
*********************************************************************** REA01590
WRITEUTS DS 0H REA01600
USING WRITEUTS,R15 USE R15 FOR NEXT INSTRUCTION ONLY REA01610
STM R1,R14,UTSIOREG SAVE CALLERS REGISTERS REA01620
DROP R15 REA01630
USING WRITEUTS,R10 USE R10 FOR RIGHT NOW REA01640
LR R10,R15 SWITCH BASE REGISTER TO R10 REA01650
LA R11,SIOSUB PREPARE OTHER BASE REGISTER REA01660
TM FLAGC,FAKEINT IS THIS A FAKE REQUEST ?? REA01670
BO FAKEAWRT THEN, GO FAKE A WRITE TO THE UTS REA01680
* PREPARE FOR THE REAL UTS I/O ROUTINE. REA01690
MVI UTSCCW,X'01' CCW OP CODE = X'01' = WRITE REA01700
B SIOSUB REA01710
FAKEAWRT DS 0H REA01720
L R15,=V(FAKEWRIT) REA01730
BALR R14,R15 REA01740
B ALLBYE GO RETURN TO CALLER REA01750
DROP R10 REA01760
*********************************************************************** REA01770
*********************************************************************** REA01780
READRCB DS 0H REA01790
USING READRCB,R15 USE R15 FOR NEXT INSTRUCTION ONLY REA01800
STM R1,R14,UTSIOREG SAVE CALLERS REGISTERS REA01810
DROP R15 REA01820
USING READRCB,R10 USE R10 FOR RIGHT NOW REA01830
LR R10,R15 SWITCH BASE REGISTER TO R10 REA01840
LA R11,SIOSUB PREPARE OTHER BASE REGISTER REA01850
TM FLAGC,FAKEINT IS THIS A FAKE REQUEST ?? REA01860
BO FAKEARR THEN, GO FAKE THE READ REQUEST REA01870
* PREPARE FOR THE REAL UTS I/O ROUTINE. REA01880
MVI UTSCCW,X'06' CCW OP CODE = X'06' = READ REQUEST REA01890
B SIOSUB CONTROL BLOCK REA01900
FAKEARR DS 0H REA01910
L R15,=V(FAKERRCB) REA01920
BALR R14,R15 REA01930
B ALLBYE GO RETURN TO CALLER REA01940
DROP R10 REA01950
*********************************************************************** REA01960
*********************************************************************** REA01970
SIOSUB DS 0H REA01980
USING SIOSUB,R11 REA01990
USING CBUTS,R4 REA02000
L R4,THISUTS GET MY VIRTUAL ADDRESS OF THE UTS REA02010
LH R8,CBUTSVAD MACHINE I'M CURRENTLY SERVICING REA02020
LA R9,UTSCCW SET UP CAW REA02030
MVI SENSE0,0 REA02040
STCM R1,B'0111',UTSCCW+1 SET DATA ADDRESS IN CCW REA02050
MVI UTSCCW+4,X'00' SET CCW FLAGS REA02060
STCM R0,B'0111',UTSCCW+5 SET BYTE COUNT IN CCW REA02070
L R4,THISUTS REA02080
* REA02090
SSM NONE DISABLE INTERRUPTS REA02100
* PUT AN ENTRY INTO THE TRACE TABLE. INCLUDE R8 = VAD, R9 = CAW, REA02110
* AND THE CCW. REA02120
LR R1,R8 PUT THE DEVICE ADDRESS IN THE TTE REA02130
L R15,ACONEHEX REA02140
BALR R14,R15 REA02150
STCM R1,B'0111',TTECUU REA02160
LR R1,R9 PUT THE CAW IN THE TTE REA02170
L R15,ACONEHEX REA02180
BALR R14,R15 REA02190
STCM R0,B'1111',TTECAWA REA02200
STCM R1,B'1111',TTECAWB REA02210
L R1,0(R9) PICK UP THE 1ST HALF OF THE CCW REA02220
L R15,ACONEHEX REA02230
BALR R14,R15 REA02240
STCM R0,B'1111',TTECCWA REA02250
STCM R1,B'1111',TTECCWB REA02260
L R1,4(R9) PICK UP THE 1ST HALF OF THE CCW REA02270
L R15,ACONEHEX REA02280
BALR R14,R15 REA02290
STCM R0,B'1111',TTECCWC REA02300
STCM R1,B'1111',TTECCWD REA02310
ETTE TTE1 REA02320
* NOW BACK TO BUSINESS REA02330
SR R12,R12 CLEAR SIO LOOP COUNTER REA02340
SIOAGN DS 0H REA02350
LA R12,1(R12) BUMP SIO LOOP COUNTER REA02360
C R12,=F'1000' ONLY LOOP 1000 TIMES REA02370
BL SKIP2 REA02380
LA R13,24 UTS HAS GONE DOWN REA02390
B ERETURN REA02400
SKIP2 LH R8,CBUTSVAD R8 = UTS ADDRESS REA02410
LA R9,UTSCCW R9 = CCW ADDRESS REA02420
OI 4(R9),X'20' REA02430
*********************************************************************** REA02440
* POSSIBLE RETURNS FROM THE DIAGNOSE INSTRUCTION ARE; * REA02450
* CC = 0 R15 = ?? I/O COMPLETED WITH NO ERRORS. * REA02460
* CC = 1 R15 = 1 DEVICE IS NOT ATTACHED OR * REA02470
* VIRTUAL CHANNEL IS DEDICATED * REA02480
* R15 = 5 VIRTUAL DEVICE IS BUSY OR * REA02490
* HAS AN INTERRUPT PENDING. * REA02500
* CC = 2 R15 = 2 UNIT EXCEPTION BIT IN CCW DEVICE STATUS IS ON. * REA02510
* R15 = 3 WRONG LENGTH RECORD DETECTED. * REA02520
* CC = 3 R15 = 13 A PERMANENT I/O ERROR OCCURRED OR * REA02530
* UNSUPPORTED DEVICE TYPE (I.E. NOT SYS-GEN'ED * REA02540
* AS DEVTYPE=TEST,CLASS=DASD) * REA02550
* FOR THIS LAST CASE ONLY, R9 = SENSE BYTES 0-3 (IN THIS * REA02560
* SCREWY ORDER 2,3,0,1). IF R9 = ALL ZEROS, ASSUME NO I/O * REA02570
* WAS DONE, OUR I/O REQUEST GOT REJECTED 'CAUSE OF AN * REA02580
* UNSUPPORTED DEVICE TYPE. IN ETF HERE, JOHN FISH MODIFIED * REA02590
* THE DIAGNOSE 20 CODE TO DO I/O TO TEST DEVICES (TEST * REA02600
* DEVICES, OF COURSE, AREN'T PART OF THE STANDARD VM CODE). * REA02610
* IF SOMETHING HAPPENS TO THIS MOD, THEN THIS ROUTINE WILL * REA02620
* STOP WORKING. * REA02630
*********************************************************************** REA02640
DIAG R8,R9,X'0020' GENERAL I/O DIAGNOSE REA02650
******** L R15,=V(MYIORTN) ** TO USE YOUR OWN SIO ROUTINE, COMMENT REA02660
******** BALR R14,R15 ** THE DIAG & UNCOMMENT THESE 3 LINES REA02670
******** LTR R15,R15 ******** (DON'T DO IT - IT DOESN'T WORK AND REA02680
******** ******** IT USES DIFFERENT RETURN CODES REA02690
MVC CBUTSCSW,68 SAVE LAST CSW STATUS REA02700
BZ SIOTOOK BRANCH IF SIO WORKED REA02710
CH R15,=H'5' COMPARE FOR BUSY OR INT. PENDING REA02720
BE SIOAGN YES GO DO AGAIN REA02730
CH R15,=H'3' COMPARE FOR WRONG LENGTH RECORD REA02740
BNE SIOCONA NOPE, THAT WASN'T IT. REA02750
LA R13,8 REA02760
B ERETURN REA02770
SIOCONA CH R15,=H'2' UNIT EXCEPTION BIT ON IN CSW ?? REA02780
BNE SIOCONB NOPE REA02790
LA R13,12 REA02800
B ERETURN REA02810
SIOCONB CH R15,=H'1' DEVICE NOT ATTACHED ?? REA02820
* BNE SIOCONC NOPE REA02830
BE SIOAGN ASSUME IT'S VIRTUAL CHANNEL DEDICATED REA02840
* LA R13,16 REA02850
* B ERETURN REA02860
SIOCONC EQU * R15 MUST BE = 13 REA02870
LTR R9,R9 DO WE HAVE ANY SENSE DATA ?? REA02880
BZ SIOCOND NOPE, MUST NOT BE SYS-GEN'ED RIGHT REA02890
* JEFF DOBBEK WANTED ME TO RETRY THE FOLLOWING BUSY INDICATION. REA02900
* IF HIS UTS DOES NOT RESPOND IN X AMOUNT OF TIME, THEN HIS REA02910
* DOBBOX (CONTROL UNIT) RETURNS UNIT CHECK WITH INTERVENTION REA02920
* REQUIRED (X'80') ON IN THE SENSE BYTE. RAJ 08/17/83 REA02930
CH R12,=H'200' REA02940
BL SIOAGN RETRY BUSY 200 TIMES OR SO REA02950
* RETRIED TOO MANY TIMES, AND STILL THE UTS IS DOWN. I GIVE UP. REA02960
STCM R9,B'0010',SENSE0 SAVE SENSE BYTE 0 REA02970
LA R13,4 REA02980
B ERETURN REA02990
SIOCOND LA R13,20 DEVICE IS NOT SYS-GEN'ED CORRECTLY REA03000
B ERETURN SHOULD BE DEVTYPE=TEST,CLASS=DASD REA03010
SIOTOOK DS 0H REA03020
SR R13,R13 I/O WORKED O.K. RETURN CODE = 0 REA03030
ERETURN DS 0H REA03040
SSM ALLOW REA03050
LR R1,R8 REA03060
L R15,ACONEHEX REA03070
BALR R14,R15 REA03080
STCM R1,B'0111',TTE2CUU REA03090
CVD R13,WORKA REA03100
OI WORKA+7,X'0F' REA03110
UNPK WORKB,WORKA+6(2) REA03120
MVC TTE2RC,WORKB+1 REA03130
MVC TTE2CSW,64 REA03140
MVC TTE2SNS0,SENSE0 REA03150
ETTE TTE2 REA03160
LR R15,R13 TRANSFER RETURN CODE TO R15 REA03170
ALLBYE DS 0H REA03180
LM R1,R14,UTSIOREG REA03190
BR R14 BYE REA03200
* REA03210
UTSIOREG DS 15F REA03220
WORKA DS D REA03230
WORKB DS F REA03240
NONE DC X'00' SYSTEM MASK TO DISALLOW INTERRUPTS REA03250
ALLOW DC X'FF' SYSTEM MASK TO ALLOW INTERRUPTS REA03260
* REA03270
TTE1 DC AL1(TTE1QU) REA03280
DC C'DOING AN I/O OPERATION TO DEVICE ' REA03290
TTECUU DS CL3 REA03300
DC C'. CAW = ' REA03310
TTECAWA DS CL4 REA03320
TTECAWB DS CL4 REA03330
DC C'. CCW = ' REA03340
TTECCWA DS CL4 REA03350
TTECCWB DS CL4 REA03360
DC C' ' REA03370
TTECCWC DS CL4 REA03380
TTECCWD DS CL4 REA03390
DC C'.' REA03400
TTE1QU EQU *-TTE1-1 REA03410
* REA03420
TTE2 DC AL1(TTE2QU) REA03430
DC C'I/O DONE TO DEVICE ' REA03440
TTE2CUU DS CL3 REA03450
DC C'. RC = ' REA03460
TTE2RC DS CL3 REA03470
DC C'. CSW = ' REA03480
TTE2CSW DS CL8 REA03490
DC C'. SENSE0 = ' REA03500
TTE2SNS0 DS CL1 REA03510
DC C'.' REA03520
TTE2QU EQU *-TTE2-1 REA03530
CC0 EQU 8 REA03540
CC1 EQU 4 REA03550
CC2 EQU 2 REA03560
CC3 EQU 1 REA03570
LTORG REA03580
ICDATA REA03590
END REA03600