TITLE 'PERFORM A TERMINAL I/O OPERATION FOR A UTS' TER00010
*********************************************************************** TER00020
* * TER00030
* MODULE NAME = ICATS TERMINAL I/O DO-ER * TER00040
* * TER00050
* FUNCTION = DO A TERMINAL I/O OPERATION ON BEHALF OF A UTS * TER00060
* MACHINE FOR ONE OF HIS DIALED TERMINALS. * TER00070
* * TER00080
* ENTRY POINTS = TERMIO * TER00090
* * TER00100
* LINKAGE = BALR R14,R15 FROM ICATS MAINLINE. * TER00110
* * TER00120
* REGISTER CONTENTS UPON ENTRY = * TER00130
* R2 = POINTS TO THE ICATS COMMON DATA AREA, AS ALWAYS. * TER00140
* R4 = POINTS TO THE UTS CONTROL BLOCK FOR THIS UTS. * TER00150
* R14 = RETURN ADDRESS BACK TO ICATS MAINLINE * TER00160
* R15 = ENTRY POINT TO THIS MODULE * TER00170
* * TER00180
* REGISTER USAGE = * TER00190
* R0-R1 = USED TO PASS PARAMETERS TO SUBROUTINES. * TER00200
* R2 = USED TO ADDRESS THE ICATS COMMON DATA AREA. * TER00210
* R3 = USED TO ADDRESS THE TERMINAL CONTROL BLOCK. * TER00220
* R4 = USED TO ADDRESS THE UTS CONTROL BLOCK. * TER00230
* R5 = USED TO ADDRESS THE OUTPUT BUFFER. * TER00240
* R11 = MY BASE REGISTER * TER00250
* R14 = MY RETURN ADDRESS WHEN I CALL SOMEBODY * TER00260
* R15 = SUBROUTINE ADDRESS * TER00270
* * TER00280
* * TER00290
* MODULE LOGIC: * TER00300
* 1) LOCATE THE CORRECT TERMINAL CONTROL BLOCK. * TER00310
* 2) MAKE SURE IT'S PLUGGED IN TO THIS UTS. * TER00320
* IF NOT, REPORT AN ERROR BY FAKING THE I/O OPERATION * TER00330
* BY INDICATING UNIT CHECK IN THE CSW UNIT STATUS * TER00340
* AND INTERVENTION REQUIRED IN THE SENSE BYTE. THIS * TER00350
* IS HOW A REAL TERMINAL WOULD REACT IF NOT THERE. * TER00360
* 3) CHECK THE CCW OP CODE. IF THIS ISN'T A READ MODIFIED * TER00370
* OPERATION, GO TO 4). ELSE, SEE IF THE DATA IN THIS * TER00380
* TERMINAL CONTROL BLOCK'S BUFFER IS VALID. IF NOT, * TER00390
* GO TO 4). ELSE, WE'LL HANDLE THE READ MODIFIED HERE. * TER00400
* A) APPEND THE READ MODIFIED DATA TO THE END OF THE * TER00410
* REPLY CONTROL BLOCK. * TER00420
* B) SET THE RETURN CODE = 0, THE SENSE BYTE = 0, * TER00430
* THE UNIT AND CHANNEL STATUS = CE & DE, * TER00440
* AND SET THE LENGTH TO HOWEVER MUCH DATA WE'VE GOT. * TER00450
* D) GO TO 5). * TER00460
* 4) HANDLE THIS NON-READ-MODIFIED CCW. * TER00470
* A) IF THIS IS A WRITE OPERATION (CCW OP CODE = * TER00480
* B'XXXX XX01') THEN GO GET THE DATA WE'RE TO WRITE * TER00490
* TO THE TERMINAL WITH, FROM THE UTS MACHINE. THIS * TER00500
* IS A SEPARATE SIO THAN THE ONE USED TO GET THE * TER00510
* REQUEST CONTROL BLOCK. PUT THE DATA RIGHT AFTER * TER00520
* THE REQUEST CONTROL BLOCK. * TER00530
* B) ADJUST THE CCW DATA ADDRESS TO POINT TO RIGHT AFTER * TER00540
* THE REQUEST CONTROL BLOCK. IF THIS IS A WRITE, * TER00550
* THAT'S WHERE THE DATA IS. IF THIS IS A READ, THAT'S * TER00560
* WHERE I WANT THE DATA TO BE READ IN TO. * TER00570
* C) DO THE TERMINAL I/O. * TER00580
* D) PUT THE RETURN CODE, SENSE, AND UNIT AND CHANNEL * TER00590
* STATUS IN THE REPLY CONTROL BLOCK. * TER00600
* E) IF THIS WAS A WRITE OPERATION, SET THE LENGTH = 0. * TER00610
* ELSE, MAKE THE LENGTH = HOWEVER MUCH DATA I READ. * TER00620
* 5) GIVE A REPLY TO THE UTS MACHINE TELLING WHAT HAPPENED. * TER00630
* * TER00640
* NORMAL EXIT = * TER00650
* R15 = 0 * TER00660
* * TER00670
* EXTERNAL REFERENCES = NONE * TER00680
* * TER00690
* MACROS = ICDATA = ICATS COMMON DATA AREA * TER00700
* ETTE = ENTER TRACE TABLE ENTRY SUBROUTINE * TER00710
* * TER00720
* CHANGE ACTIVITY * TER00730
* DATE NAME REASON FOR CHANGE * TER00740
* 06/22/83 RICK JASPER INITIAL PROGRAM CREATION * TER00750
* * TER00760
*********************************************************************** TER00770
PRINT GEN,NODATA TER00780
TERMIO CSECT TER00790
USING ICDATA,R2 ADDRESS ICATS COMMON DATA AREA TER00800
USING CBTERM,R3 USE R3 TO ADDRESS TERM CONTROL BLOCK TER00810
USING CBUTS,R4 USE R4 TO ADDRESS UTS CONTROL BLOCK TER00820
USING *,R15 USE R15 FOR BASE REG NEXT INSTRUCTION ONLY TER00830
STM R0,R14,REGSAVE SAVE CALLER'S REGISTERS TER00840
DROP R15 TER00850
USING TERMIO,R11 R11 WILL BE BASE REGISTER TER00860
LR R11,R15 ESTABLISH BASE REGISTER TER00870
* TER00880
* TERMIO COMMANDS CAN ONLY COME FROM A UTS MACHINE TER00890
TM FLAGB,UTSCMD DID THIS COMMAND COME FROM A UTS ?? TER00900
BO CON50 YES IT DID. GOOD. CONTINUE ON. TER00910
L R15,AREJECT GO TO REJECT-THIS-COMMAND ROUTINE TER00920
BALR R14,R15 TER00930
B TERMBYE TER00940
CON50 DS 0H TER00950
* PUT AN ENTRY INTO THE TRACE TABLE IF TRACE MODE IS ON. TER00960
TM FLAGC,TRACEMOD THE FACT WE SAW AN INTERRUPT TER00970
BNO SKIPTTE DO ONLY IF TRACE MODE IS ON. TER00980
L R1,PARM2 PUT 1ST HALF OF CCW IN TTE TER00990
L R15,ACONEHEX TER01000
BALR R14,R15 TER01010
STCM R0,B'1111',TTECCWA TER01020
STCM R1,B'1111',TTECCWA+4 TER01030
L R1,PARM2+4 PUT 2ND HALF OF CCW IN TTE TER01040
L R15,ACONEHEX TER01050
BALR R14,R15 TER01060
STCM R0,B'1111',TTECCWB TER01070
STCM R1,B'1111',TTECCWB+4 TER01080
ETTE IOTTE TER01090
SKIPTTE DS 0H TER01100
MVI TERMFLAG,X'00' INITIALIZE MY LOCAL FLAG TER01110
L R5,ABUFFER SET UP TO ADDRESS THE OUTPUT BUFFER. TER01120
MVC 0(128,R5),PARM0 SET UP THE REPLY CONTROL BLOCK. TER01130
* LOCATE THE CORRECT TERMINAL CONTROL BLOCK. TER01140
L R3,TERM1ST GET ADDRESS OF FIRST TERMINAL CB TER01150
LTR R3,R3 IF NO TERMINAL CONTROL BLOCKS, TER01160
BZ ERROR1 ABORT WITH AN ERROR. TER01170
CON55 CLC CBTERMEA,PARM0 IS THIS THE CORRECT TERM CB ?? TER01180
BE GOTIT YEP, CONTINUE ON. TER01190
L R3,CBTERMFP ELSE GET NEXT TERMINAL CB. TER01200
LTR R3,R3 TER01210
BNZ CON55 TER01220
ERROR1 DS 0H COULD NOT FIND A TERM CB FOR THIS TERMINAL. TER01230
* GIVE THE UTS AN ERROR BY SIMULATING UNIT CHECK AND INTERVENTION TER01240
* REQUIRED IN THE SENSE. THIS IS HOW A REAL TERMINAL WOULD RESPOND TER01250
MVC 122(6,R5),=X'00400E000000' IF NOT CONNECTED. TER01260
LA R10,0 RETURN CODE = 0 TER01270
B GIVE2UTS TER01280
GOTIT DS 0H GOT THE TERM CB FOR THIS TERMINAL. TER01290
TM CBTERMFA,PLUGGED IS THIS TERMINAL PLUGGED IN ?? TER01300
BNO ERROR1 ERROR IF NOT. TER01310
C R4,CBTERMUP PLUGGED IN TO THIS UTS ?? TER01320
BNE ERROR1 ERROR IF NOT. TER01330
* THIS TERMINAL IS PLUGGED IN TO THIS UTS. EVERYTHING'S COOL SO TER01340
* FAR. IS THIS A READ MODIFIED CCW ?? IF SO, WE CAN PROBABLY TER01350
* HANDLE IT WITHOUT DOING ANY REAL I/O. TER01360
CLI PARM2,X'06' PARM2 = CCW. X'06' = READ MODIFIED. TER01370
BNE CON100 NOT READ MODIFIED. DO THE REAL I/O. TER01380
TM CBTERMFA,DATAVALD IS THE READ MODIFIED BUFFER VALID ?? TER01390
BNO CON100 NOPE, WE'LL HAVE TO DO THE REAL I/O. TER01400
* THIS IS A READ MODIFIED THAT WE CAN FAKE, SINCE WE HAVE ALREADY TER01410
* DONE ONE (WHEN THE AYNCHROUNOUS TERMINAL INTERRUPT CAME IN, IN TER01420
* THE DOTERM MODULE). MOVE THE READ MODIFIED DATA TER01430
MVC 128(100,R5),CBTERMRM IN PLACE AFTER THE REPLY CB. TER01440
MVC 122(4,R5),=X'00000C00' CLEAR OUT END OF REPLY CB. TER01450
MVC 126(2,R5),CBTERMDC MOVE IN LENGTH OF READ DATA TER01460
LA R10,0 SET RETURN CODE = 0 TER01470
B GIVE2UTS TER01480
CON100 DS 0H TER01490
* WE'RE GOING TO HAVE TO DO THE REAL I/O OPERATION TO THIS TERMINAL TER01500
* (IT'S NOT A READ MODIFIED CCW OR, IF IT IS, THEN THE DATA IN THIS TER01510
* TERMINAL'S CONTROL BLOCK BUFFER IS NOT VALID). TER01520
* SEE IF THIS IS A WRITE CCW OR NOT. IF IT IS, THEN WE'VE GOT TO TER01530
* FIRST GO GET THE DATA FROM THE UTS TO WRITE TO THE TERMINAL. TER01540
TM PARM2,X'01' ALL WRITE CCW OP CODES HAVE BIT 7 TER01550
BNO CON300 TURNED ON AND BIT 6 TURNED OFF. TER01560
TM PARM2,X'02' I.E. B'XXXX XX01' TER01570
BO CON300 TER01580
OI TERMFLAG,WRITECCW REMEMBER THIS IS A WRITE CCW TER01590
* GO GET THE TERMINAL WRITE DATA FROM THE UTS. TER01600
SR R0,R0 GET CCW BYTE COUNT IN R0 TER01610
ICM R0,B'0111',PARM2+5 TER01620
LA R1,128(R5) PUT DATA AFTER REPLY CONTROL BLOCK TER01630
L R15,AREADUTS TER01640
BALR R14,R15 GO GET THE DATA TER01650
LTR R15,R15 READ WENT OK, DIDN'T IT ?? TER01660
BNZ TERMBYE ABORT IF UTS DIED - WILL RETURN TO TER01670
* ICATS MAINLINE TER01680
CON300 DS 0H TER01690
* NOW SET UP TO DO THE REAL I/O. TER01700
LA R6,128(R5) PUT THE DATA ADDRESS IN THE CCW TER01710
STCM R6,B'0111',PARM2+1 TER01720
LA R1,PARM2 GET THE CCW ADDRESS IN R1 TER01730
L R15,ATERMIO TER01740
BALR R14,R15 DO THE REQUESTED I/O TO THE TERMINAL TER01750
CH R15,=H'8' IS THE TERMINAL STILL THERE ?? TER01760
BE ERROR1 IF NOT, FAKE A UNIT CHECK. TER01770
MVI 122(R5),X'00' TER01780
MVC 123(1,R5),CBTERMSN MOVE SENSE BYTE IN PLACE TER01790
MVC 124(2,R5),CBTERMCS+4 MOVE CSW STATUS IN PLACE TER01800
MVC 126(2,R5),=X'0000' CLEAR DATA LENGTH TER01810
TM TERMFLAG,WRITECCW IF THIS WAS A WRITE CCW, THEN TER01820
BO CON350 THERE'S NO DATA TO BE GIVEN TO THE TER01830
STH R0,126(R5) UTS. ELSE REMEMBER DATA LENGTH. TER01840
B CON355 THERE'S NO DATA TO BE GIVEN TO THE TER01850
CON350 DS 0H TER01860
LA R10,0 RETURN CODE = 0 TER01870
CON355 DS 0H TER01880
LA R10,0 RETURN CODE = 0 TER01890
GIVE2UTS DS 0H TER01900
* GIVE A REPLY TO THE UTS MACHINE TELLING WHAT HAPPENED. TER01910
* PUT THE RETURN CODE NOW SITTING IN R10 IN THE REPLY CONTROL BLOCK. TER01920
* | | | | | | | | | TER01930
* | | | | | | | | | TER01940
* | | | | | | | | | TER01950
* |---------------------------------------------------------------| TER01960
* | RETURN | EXTRA | SENSE | UNIT |CHANNEL| # OF DATA | TER01970
* | CODE | X'00' | DATA | STATUS|STATUS |BYTES FOLLOWING| TER01980
* |---------------------------------------------------------------| TER01990
STH R10,120(R5) PUT RETURN CODE IN REPLY CB TER02000
LA R0,128 REPLY CONTROL BLOCK = 128 BYTES BIG TER02010
AH R0,126(R5) PLUS NUMBER OF DATA BYTES FOLLOWING TER02020
LR R1,R5 START OF REPLY CONTROL BLOCK TER02030
L R15,AWRITUTS TER02040
BALR R14,R15 GO GIVE THE REPLY TO THE UTS MACHINE TER02050
TERMBYE EQU * IGNORE ANY ERRORS TER02060
LM R0,R14,REGSAVE RESTORE CALLER'S REGISTERS TER02070
BR R14 TER02080
EJECT TER02090
REGSAVE DS 15F READ ROUTINE SAVE AREA TER02100
TERMFLAG DC X'00' STATUS FLAG FOR TERMINAL I/O ROUTINE TER02110
WRITECCW EQU X'80' 1 = THIS IS A WRITE CCW TER02120
* TER02130
IOTTE DC AL1(IOTTEQU) TER02140
DC C'DOING TERMINAL I/O. CCW = ' TER02150
TTECCWA DS CL8 TER02160
DC C' ' TER02170
TTECCWB DS CL8 TER02180
DC C'.' TER02190
IOTTEQU EQU *-IOTTE-1 TER02200
* TER02210
LTORG TER02220
ICDATA TER02230
END TER02240