TITLE 'ICATS TERMINAL INTERRUPT HANDLER' DOT00010 *********************************************************************** DOT00020 * * DOT00030 * MODULE NAME = ICATS TERMINAL INTERRUPT HANDLER * DOT00040 * * DOT00050 * FUNCTION = PROCESS AN INTERRUPT FROM A DIAL-ABLE TERMINAL. * DOT00060 * * DOT00070 * ENTRY POINTS = DOTERM * DOT00080 * * DOT00090 * LINKAGE = BALR R14,R15 FROM ICATS MAINLINE. * DOT00100 * * DOT00110 * REGISTER CONTENTS UPON ENTRY = * DOT00120 * R2 = POINTS TO THE ICATS COMMON DATA AREA AS ALWAYS. * DOT00130 * R14 = RETURN ADDRESS BACK TO ICATS MAINLINE. * DOT00140 * R15 = ENTRY POINT TO THIS MODULE * DOT00150 * * DOT00160 * REGISTER USAGE = * DOT00170 * R0 = USED TO PASS PARAMETERS TO SOME SUBROUTINES. * DOT00180 * R1 = USED TO PASS PARAMETERS TO SUBROUTINES. * DOT00190 * R2 = USED TO ADDRESS THE ICATS COMMON DATA AREA. * DOT00200 * R3 = FREE * DOT00210 * R4 = USED TO ADDRESS THE UTS CONTROL BLOCKS. * DOT00220 * R5 = USED TO ADDRESS THE USER CONTROL BLOCKS. * DOT00230 * R6 = USED TO ADDRESS THE DISK CONTROL BLOCKS. * DOT00240 * R7 = MOSTLY FREE, BUT USED TO ADDRESS THE SMSG BUFFER QUEUE. * DOT00250 * R8-R10 = FREE * DOT00260 * R11 = FIRST BASE REGISTER * DOT00270 * R12 - R13 = FREE * DOT00280 * R14 = MY RETURN ADDRESS WHEN I CALL SOMEBODY * DOT00290 * R15 = SUBROUTINE ADDRESS * DOT00300 * * DOT00310 * MODULE LOGIC = * DOT00320 * COME HERE FROM THE DISPATCHER ROUTINE WITH INTERRUPTS STILL * DOT00330 * DISABLED WHEN WE'VE RECEIVED AN INTERRUPT FROM ONE OF THE * DOT00340 * TERMINALS WE'RE SERVICING. * DOT00350 * 1) LOOP THROUGH THE TERMINAL CONTROL BLOCK CHAIN AND FIND * DOT00360 * THE ONE THAT INTERRUPTED US (IF ANY). * DOT00370 * A) IF NO TERMINAL NEEDS SERVICING, THEN * DOT00380 * 1) TURN OFF THE A-TERMINAL-NEEDS-SERVICING FLAG. * DOT00390 * 2) TURN INTERRUPTS BACK ON. * DOT00400 * 3) RETURN TO THE DISPATCHER. * DOT00410 * B) IF ONE IS FOUND, THEN TURN INTERRUPTS BACK ON AND * DOT00420 * SEE WHICH STATE THIS TERMINAL IS IN. A TERMINAL * DOT00430 * SHOULD BE IN ANY ONE OF THREE STATES. * DOT00440 * 1) IF HE'S PLUGGED INTO A UTS ALREADY, THEN * DOT00450 * A) DO A READ MODIFIED. SAVE THE DATA IN HIS * DOT00460 * TERMINAL BLOCK FOR FUTURE USE (THE UTS WILL * DOT00470 * PROBABLY DO A READ MODIFIED). * DOT00480 * B) SEE IF ANY OF THE MODIFIED FIELDS IS HIS * DOT00490 * SESSION TERMINATE STRING (USUALLY "$$$$"). * DOT00500 * IF IT IS, THEN HE WANTS OUT FROM THE UTS * DOT00510 * AND BACK TO THE ORIGINAL MENU. TURN OFF * DOT00520 * PLUGGED-IN BIT AND GO TO STEP 1) B) 2). * DOT00530 * C) IF HE DIDN'T WANT OUT, THEN GO AHEAD AND * DOT00540 * PASS THIS INTERRUPT ON TO THE UTS. DON'T * DOT00550 * WAIT AROUND FOR THE UTS TO RESPOND, JUST * DOT00560 * RETURN TO THE DISPATCHER. WHEN THE UTS * DOT00570 * GETS AROUND TO DOING A READ MODIFIED OR * DOT00580 * WHATEVER, I'LL DO THAT I/O THEN. * DOT00590 * IF YOU GET AN ERROR PASSING THE INTERRUPT * DOT00600 * ON TO THE UTS, ASSUME THE UTS WENT DOWN * DOT00610 * AND BOUNCE THIS GUY BACK TO THE MENU WITH * DOT00620 * AN APPROPRIATE MESSAGE. * DOT00630 * 2) IF HE'S NOT ALREADY PLUGGED INTO A UTS, THEN * DOT00640 * SEE IF HE'S SEEN A MENU YET. IF NOT, * DOT00650 * A) DO A WRITE TO HIS SCREEN AND GIVE HIM A MENU. * DOT00660 * B) RETURN TO THE DISPATCHER. * DOT00670 * 3) IF HE'S NOT ALREADY PLUGGED INTO A UTS AND HAS * DOT00680 * ALREADY GOTTEN A MENU, THEN SEE WHAT HE WANTS * DOT00690 * TO DO. DO A READ MODIFIED. * DOT00700 * A) IF HE HIT PA1, THEN HE WANTS OUT COMPLETELY. * DOT00710 * DO A CP DETACH XXX (WHATEVER ADDRESS HE'S AT) * DOT00720 * AND REDEFINE THAT TERMINAL (CP DEFINE GRAF XXX).* DOT00730 * B) CHECK HIS SESSION TERMINATE STRING. STORE * DOT00740 * WHATEVER VALUE IS IN THAT FIELD. * DOT00750 * C) SEE IF HE SELECTED A VALID UTS. IF SO, * DOT00760 * GIVE THE UTS AN ASYNCHRONUOUS, DEVICE END * DOT00770 * INTERRUPT FROM THIS TERMINAL. IT'LL APPEAR * DOT00780 * TO THE UTS THAT THIS TERMINAL WAS JUST * DOT00790 * POWERED ON. * DOT00800 * D) IF THE UTS HE'S SELECTED IS OFFLINE, THEN * DOT00810 * CALL THE ATTACH MODULE TO TRY TO BRING IT * DOT00820 * ONLINE. THEN GO BACK TO 1) B) 3) C). * DOT00830 * E) RETURN TO THE DISPATCHER. * DOT00840 * * DOT00850 * EXTERNAL REFERENCES = NONE * DOT00860 * * DOT00870 * CONTROL BLOCKS = ICDATA ICATS COMMON DATA AREA * DOT00880 * UTSCB UTS MACHINE CONTROL BLOCK * DOT00890 * USERCB USER FOR THIS UTS CONTROL BLOCK * DOT00900 * DISKCB DISK FOR THIS USER CONTROL BLOCK * DOT00910 * TERMCB DIAL-ABLE TERMINALS CONTROL BLOCK * DOT00920 * * DOT00930 * * DOT00940 * NON-STANDARD MACROS (FOUND IN ICATS MACLIB) * DOT00950 * ICDATA = ICATS COMMON DATA AREA DSECT. * DOT00960 * ETTE = ENTER TRACE TABLE ENTRY SUBROUTINE * DOT00970 * * DOT00980 * CHANGE ACTIVITY * DOT00990 * DATE NAME REASON FOR CHANGE * DOT01000 * 05/31/83 RICK JASPER INITIAL PROGRAM CREATION * DOT01010 * 01/30/84 RICK JASPER GOT A UNIT CHECK WRITING TO A 3278-5 * DOT01020 * TERMINAL. PROBLEM WAS I WAS COMPUTING * DOT01030 * THE SET BUFFER ADDRESSES BASED ON A 132 * DOT01040 * CHARACTER LINE WIDTH, BUT WRITING THE * DOT01050 * SCREEN IN STANDARD MODE (80-CHARACTER * DOT01060 * LINE WIDTH). THAT MEANS ALL MY EXTRA * DOT01070 * EXTRA PROGRAMMING I DID TO HANDLE * DOT01080 * NON-STANDARD LINE WIDTHS WENT TO NAUGHT. * DOT01090 * I NOW ASSUME ALL TERMINALS SUPPORT THE * DOT01100 * STANDARD 80 CHARACTER LINE WIDTH AND * DOT01110 * WRITE THE MENU ACCORDINGLY. * DOT01120 * * DOT01130 *********************************************************************** DOT01140 EJECT DOT01150 PRINT GEN,NODATA DOT01160 DOTERM CSECT DOT01170 USING ICDATA,R2 USE R2 TO ADDRESS ICATS COMMON DATA AREA DOT01180 USING CBTERM,R3 USE R3 TO ADDRESS TERMINAL CONTROL BLOCK DOT01190 USING CBUTS,R4 USE R4 TO ADDRESS UTS CONTROL BLOCK DOT01200 USING *,R15 USE R15 FOR BASE REG NEXT INSTRUCTION ONLY DOT01210 STM R0,R14,REGSAVE SAVE CALLER'S REGISTERS DOT01220 DROP R15 DOT01230 USING DOTERM,R11 R11 WILL BE BASE REGISTER DOT01240 LR R11,R15 ESTABLISH BASE REGISTER DOT01250 * DOT01260 * LOOP THROUGH THE TERMCB CHAIN TO SEE WHICH TERMINAL NEEDED DOT01270 * SERVICING. IT'LL BE THE ONE WITH THE INTERRUPT-IS-IN FLAG DOT01280 * TURNED ON. DOT01290 L R3,TERM1ST GET ADDRESS OF FIRST TERMCB DOT01300 LOOPA LTR R3,R3 ARE WE PAST THE END-OF-CHAIN ?? DOT01310 BZ NOTFOUND YEP, A NEEDY TERMINAL WASN'T FOUND DOT01320 TM CBTERMFA,INTISIN ELSE, SEE IF THIS ONE'S IN NEED DOT01330 BO GOTIT YEP, IT IS. GO SERVICE HIM. DOT01340 L R3,CBTERMFP HAVEN'T FOUND A NEEDY UTS YET. DOT01350 B LOOPA GO CHECK THE NEXT ONE. DOT01360 * DOT01370 * COME HERE WHEN THERE'S NO TERMINAL OUT THERE THAT NEEDS TO BE DOT01380 * SERVICED. THIS'LL HAPPEN AFTER WE'VE JUST GOT THROUGH SERVICING DOT01390 * ONE AND AN INTERRUPT FROM ANOTHER TERMINAL HAS NOT COME IN YET DOT01400 * (NORMAL CASE). DOT01410 NOTFOUND DS 0H DOT01420 NI FLAGA,ALL-TERMINT RESET TERMINAL INTERRUPT IS IN FLAG DOT01430 SSM ENABSSM TURN INTERRUPTS BACK ON DOT01440 B TERMQUIT RETURN TO ICATS MAINLINE DOT01450 * DOT01460 * WE'VE FOUND A TERMINAL THAT NEEDS SERVICING. THE ADDRESS OF DOT01470 * HIS TERMINAL CONTROL BLOCK IS IN R3. LET'S GO SERVICE HIM. DOT01480 * FIRST LET'S PUT AN ENTRY INTO THE TRACE TABLE. DOT01490 * SEE WHICH STATE THIS TERMINAL IS IN RIGHT NOW. DOT01500 GOTIT DS 0H DOT01510 LA R8,CBTERMEA DOT01520 LA R9,CBTERMCS DOT01530 LINEDIT TEXT='SERVICING TERMINAL ..., CSW = .................'-DOT01540 ,SUB=(CHARA,(R8),HEX4A,(R9)),DISP=NONE,BUFFA=MENUUTS,REN-DOT01550 T=NO DOT01560 * LINEDIT TEXTA=MENUUTS DEBUG CODE DOT01570 ETTE MENUUTS DOT01580 SSM ENABSSM TURN INTERRUPTS BACK ON DOT01590 OI CBTERMFA,IGOTIT I'M GETTING SERVICED DOT01600 MVI CBTERMSN,X'00' INITIALIZE SENSE BYTE DOT01610 TM CBTERMCS+4,X'02' UNIT CHECK POSTED ?? DOT01620 BNO CON50 NO, DIDN'T THINK IT WOULD BE. DOT01630 LA R5,CBTERMSN INSERT ADDRESS OF WHERE TO DOT01640 STCM R5,B'0111',SENSECCW+1 PUT THE SENSE DATA INTO DOT01650 LA R1,SENSECCW GET ADDRESS OF SENSE CCW DOT01660 L R15,ATERMIO GET ADDRESS OF TERMINAL I/O ROUTINE DOT01670 BALR R14,R15 DO THE SENSE TO THE TERMINAL DOT01680 LA R9,CBTERMEA DOT01690 LA R10,CBTERMSN-3 DOT01700 LINEDIT TEXT='I GOT AN ASYNCHROUNOUS UNIT CHECK INTERRUPT FROM-DOT01710 A DIALED TERMINAL. ADDRESS = ..., SENSE DATA = ..',SUB-DOT01720 =(CHARA,(R9),HEXA,(R10)),RENT=NO DOT01730 B DROPHIM DOT01740 CON50 TM CBTERMFA,PLUGGED IS HE PLUGGED IN TO A UTS ALREADY ?? DOT01750 BNO NOTPLUGD NOPE, GO TRY TO PLUG HIM IN. DOT01760 * DOT01770 * THIS TERMINAL IS ALREADY PLUGGED IN TO A UTS (NORMAL CASE). DOT01780 * BEFORE WE PASS THE INTERRUPT ON TO THE UTS, LET'S SEE IF HE DOT01790 * WANTS OUT. DO A READ MODIFIED AND CHECK FOR HIS SESSION DOT01800 * TERMINATE STRING (USUALLY 4 POUND SIGNS UNLESS HE CHANGED IT). DOT01810 XC CBTERMDC,CBTERMDC DOT01820 NI CBTERMFA,ALL-DATAVALD RESET DATA IS VALID SWITCH DOT01830 L R5,ABUFFER INSERT ADDRESS OF WHERE TO PUT THE DOT01840 STCM R5,B'0111',READMCCW+1 READ MODIFIED DATA INTO DOT01850 LA R1,READMCCW GET ADDRESS OF READ MODIFIED CCW DOT01860 L R15,ATERMIO GET ADDRESS OF TERMINAL I/O ROUTINE DOT01870 BALR R14,R15 DO THE PLUGGED-IN READ MODIFIED I/O DOT01880 LTR R10,R15 DOT01890 BZ CON100 IF ALL OK, CONTINUE ON DOT01900 LINEDIT TEXT='I GOT A BAD RETURN CODE DOING THE READ MODIFIED -DOT01910 CCW. RC = ....',SUB=(DEC,(R10)),RENT=NO DOT01920 B DROPHIM EXIT DOT01930 CON100 DS 0H DOT01940 CH R0,=H'100' DID I GET TOO MUCH READ MODIFIED DATA TO DOT01950 BH CON120 FIT INTO THE TERMINAL CB'S BUFFER ?? DOT01960 * IF SO, DON'T MOVE DATA INTO TERM CB. DOT01970 OI CBTERMFA,DATAVALD BUFFER DATA IS NOW VALID DOT01980 STH R0,CBTERMDC SAVE LENGTH FOR FUTURE READ MOD FROM UTS DOT01990 LA R6,CBTERMRM DOT02000 LA R7,100 LENGTH OF READ MODIFIED BUFFER IN TERM CB DOT02010 L R8,ABUFFER DOT02020 LR R9,R0 DOT02030 LA R9,0(R9) CLEAR PAD BYTE TO HEX ZERO DOT02040 MVCL R6,R8 MOVE READ MODIFIED DATA TO TERM CB BUFFER DOT02050 CON120 DS 0H DOT02060 * NOW SEE IF ANY OF THE MODIFIED FIELDS DOT02070 * CONTAIN HIS SESSION TERMINATE STRING. DOT02080 L R6,ABUFFER GET END OF READ MODIFIED DATA DOT02090 AR R6,R0 DOT02100 L R5,ABUFFER GET BEGINNING OF READ MODIFIED DATA DOT02110 LA R5,2(R5) BUMP PAST FIRST FEW GARBAGE BYTES DOT02120 CH R0,=H'7' MUST HAVE AT LEAST 7 BYTES OF DATA ELSE DOT02130 BL GIVE2UTS NO WAY CAN WE HAVE THE TERMINATE STRING. DOT02140 * THERE IS A CASE WHERE THE READ MODIFIED DATA CAN CONTAIN THE DOT02150 * SESSION TERMINATE STRING WITHOUT A SET BUFFER ADDRESS (X'11') DOT02160 * ORDER IN FRONT OF IT. THAT'S WHEN THE SCREEN IS CLEARED AND DOT02170 * THE GUY TYPES IN HIS S.T.S. THEN THE S.T.S. IS RIGHT AFTER DOT02180 * THE AID BYTE AND THE CURSOR ADDRESS. DOT02190 CLC CBTERMST,1(R5) IS IT SPECIAL CASE DESCRIBED ABOVE ?? DOT02200 BE CON180 YEP, BRANCH. DOT02210 LOOPB DS 0H DOT02220 CR R5,R6 DOT02230 BNL GIVE2UTS GET OUT OF THIS LOOP DOT02240 LA R5,1(R5) GO TO NEXT CHARACTER DOT02250 CLI 0(R5),X'11' IS IT THE START FIELD CHARACTER ?? DOT02260 BNE LOOPB NOPE, CHECK NEXT CHARACTER DOT02270 LA R5,3(R5) BUMP PAST START FIELD & BUFFER ADDRESS DOT02280 CLC CBTERMST,0(R5) IS THIS HIS SESSION TERMINATE STRING ?? DOT02290 BNE LOOPB NOPE, CONTINUE ON 'TILL END OF DATA DOT02300 CON180 DS 0H DOT02310 * THIS TERMINAL WAS PLUGGED IN TO A UTS AND WE FOUND HIS SESSION DOT02320 * TERMINATE STRING IN A MODIFIED FIELD. THIS USER MUST WANT TO BE DOT02330 * BE DROPPED FROM THE UTS AND SENT BACK TO THE MENU. DOT02340 * 1) INFORM THE UTS THAT WE'RE DROPPING THIS TERMINAL BY FAKING DOT02350 * A UNIT CHECK AND INTERVENTIO DOT02360 * 2) RESET BITS IN HIS TERMINAL FLAG. DOT02370 * 3) SET THE MENU MESSAGE = "YOU WANTED OUT, YOU GOT OUT." DOT02380 * 4) GO GIVE HIM THE MENU DOT02390 XC PARM0(128),PARM0 INITIALIZE REPLY CONTROL BLOCK. DOT02400 MVC PARM0(3),CBTERMEA GIVE THIS TERMINAL'S EBCDIC ADDRESS DOT02410 MVC PARM0+3(5),=CL5' ' PAD THE REST WITH BLANKS DOT02420 MVC PARM1,=CL8'TERMIO' IDENTIFY AS A TERMINAL INTERRUPT DOT02430 MVC PARM15+3(2),=X'4006' GIVE SENSE BYTE & CSW STATUS DOT02440 LA R0,128 DOT02450 LA R1,PARM0 DOT02460 L R4,CBTERMUP DOT02470 ST R4,THISUTS THE UTS WRITE ROUTINE EXPECTS THIS DOT02480 * TO BE SET, SO ....... DOT02490 L R15,AINTUTS TELL THE UTS THAT THIS TERMINAL IS DOT02500 BALR R14,R15 BEING DROPPED. IGNORE ANY ERRORS. DOT02510 NI CBTERMFA,ALL-INTISIN-PLUGGED-DATAVALD DOT02520 MVC MENUMSG,=CL40'YOU WANTED OUT, YOU GOT OUT.' DOT02530 B GIVEMENU DOT02540 * WE DIDN'T FIND HIS SESSION TERMINATE STRING (NORMAL CASE), SO DOT02550 * WE'VE GO TO GO AHEAD AND PASS THIS INTERRUPT ALONG TO THE UTS. DOT02560 * OR WE BRANCHED HERE FROM DOWN BELOW TO PASS A DEVICE END DOT02570 * INTERRUPT ON TO THE UTS WHEN THIS GUY FIRST PLUGS IN. DOT02580 GIVE2UTS DS 0H DOT02590 XC PARM0(128),PARM0 INITIALIZE REPLY CONTROL BLOCK. DOT02600 MVC PARM0(3),CBTERMEA GIVE THIS TERMINAL'S EBCDIC ADDRESS DOT02610 MVC PARM0+3(5),=CL5' ' PAD THE REST WITH BLANKS DOT02620 MVC PARM1,=CL8'TERMIO' IDENTIFY AS A TERMINAL INTERRUPT DOT02630 TM CBTERMFA,PLUGGED DOT02640 BNO CON190 DOT02650 MVI PARM15+3,X'00' FAKE ZERO SENSE BYTE DOT02660 MVC PARM15+4(2),=X'8000' FAKE ATTENTION CSW STATUS DOT02670 B CON195 DOT02680 CON190 DS 0H DOT02690 OI CBTERMFA,PLUGGED REMEMBER THIS TERMINAL IS PLUGGED IN DOT02700 MVI PARM15+3,X'00' FAKE ZERO SENSE DOT02710 MVC PARM15+4(2),=X'0400' FAKE DEVICE END STATUS DOT02720 CON195 DS 0H DOT02730 LA R0,128 DOT02740 LA R1,PARM0 DOT02750 L R15,AINTUTS DOT02760 L R4,CBTERMUP DOT02770 ST R4,THISUTS THE UTS WRITE ROUTINE EXPECTS THIS DOT02780 * TO BE SET, SO ....... DOT02790 * FOR NOW, JUST FAKE GIVING THE INTERRUPT TO THE UTS. DOT02800 * OI FLAGC,FAKEINT DOT02810 BALR R14,R15 DOT02820 * NI FLAGC,ALL-FAKEINT RESET FAKE INTERRUPT BIT. DOT02830 LTR R15,R15 DID THE WRITE GO OK ?? DOT02840 BZ TERMBYE YEP, IT BETTER HAVE. DOT02850 MVC MENUMSG,=CL40'SORRY, UTS WRITE ERROR. CSW = XXXX' DOT02860 LH R1,CBUTSCSW CONVERT THE LAST CSW STATUS FROM DOT02870 L R15,ACONEHEX THIS UTS INTO HEXADECIMAL EBCDIC DOT02880 BALR R14,R15 AND PUT IT INTO THE MENU MESSAGE DOT02890 STCM R1,B'1111',MENUMSG+31 DOT02900 NI CBTERMFA,ALL-PLUGGED-DATAVALD RESET THIS TERMINAL. DOT02910 B GIVEMENU DOT02920 EJECT DOT02930 *********************************************************************** DOT02940 * THIS TERMINAL IS NOT PLUGGED IN YET. IT MUST BE IN ONE TWO * DOT02950 * STATES. EITHER HE HASN'T SEEN A MENU, IN WHICH CASE WE'LL * DOT02960 * THROW ONE UP FOR HIM, OR HE'S LOOKING AT A MENU NOW, AND HE'S * DOT02970 * JUST HIT ENTER (OR SOMETHING) AND NOW WE'VE GOT TO FIGURE OUT * DOT02980 * WHAT HE WANTS US TO DO. * DOT02990 *********************************************************************** DOT03000 NOTPLUGD DS 0H DOT03010 MVC MENUMSG,=CL40' ' BLANK OUT MENU MESSAGE JUST IN CASE DOT03020 TM CBTERMFA,MENUUP IS HE LOOKING AT A MENU RIGHT NOW ?? DOT03030 BO CON200 YEP, GO SEE WHAT HE WANTS TO DO. DOT03040 * THIS TERMINAL MUST HAVE BEEN JUST DIALED UP TO US. LET'S SEE DOT03050 * WHAT KIND OF TERMINAL IT IS - SPECIFICALLY, HOW WIDE IT IS. DOT03060 LH R5,CBTERMHA DOT03070 DIAG R5,R6,X'0024' DOT03080 LA R5,80 ASSUME 80 CHARACTER LINE WIDTH DOT03090 * C R7,=X'40010500' 3278-5 IS THE ONLY TERMINAL WITH DOT03100 * BNE SKIPONE 132 CHARACTERS PER LINE. DOT03110 * LA R5,132 DOT03120 SKIPONE STH R5,CBTERMLL DOT03130 B GIVEMENU NOW GO GIVE HIM A MENU. DOT03140 * DOT03150 CON200 DS 0H DOT03160 L R5,ABUFFER INSERT ADDRESS OF WHERE TO PUT THE DOT03170 STCM R5,B'0111',READMCCW+1 READ MODIFIED DATA INTO DOT03180 LA R1,READMCCW GET ADDRESS OF READ MODIFIED CCW DOT03190 L R15,ATERMIO GET ADDRESS OF TERMINAL I/O ROUTINE DOT03200 BALR R14,R15 DO THE MENU READ MODIFIED I/O DOT03210 LTR R10,R15 DOT03220 BZ CON210 IF ALL OK, CONTINUE ON DOT03230 LINEDIT TEXT='I GOT A BAD RETURN CODE DOING THE READ MENU CCW.-DOT03240 RC = ....',SUB=(DEC,(R10)),RENT=NO DOT03250 B DROPHIM DOT03260 CON210 DS 0H DOT03270 L R5,ABUFFER DOT03280 CLI 0(R5),X'6C' SEE IF HE HIT PA1 = LET ME OUT DOT03290 BE DROPHIM IF SO, UN-DIAL THIS TERMINAL DOT03300 MVC MENUMSG,=CL40'ONLY THE PA1 OR ENTER KEYS WORK' DOT03310 CLI 0(R5),X'7D' SEE IF HE HIT THE ENTER KEY DOT03320 BNE GIVEMENU IF NOT, HE HIT AN INVALID KEY. DOT03330 * CHECK FOR 1ST MODIFIED FIELD BEING THE SESSION TERMINATE STRING. DOT03340 CH R0,=H'6' INSURE WE GOT AT LEAST 6 BYTES DATA DOT03350 BL CON300 IF NOT, THERE WERE NO MODIFIED FIELDS. DOT03360 CLC 3(3,R5),=X'11C14A' DOT03370 * X'11' = SET BUFFER ADDRESS. X'C14A' = WHERE THE STS WAS PUT. DOT03380 BNE CON300 IF IT'S NOT, CONTINUE ON. DOT03390 * VALIDATE THE SESSION TERMINATE STRING. DON'T LET IT BE LESS THAN DOT03400 * FOUR CHARACTERS LONG. DOT03410 MVC MENUMSG,=CL40'TERMINATE STRING MUST BE EXACTLY 4 CHARS' DOT03420 CH R0,=H'10' INSURE WE GOT AT LEAST 10 BYTES DATA DOT03430 BL GIVEMENU IF NOT, GIVE HIM AN ERROR MESSAGE. DOT03440 CLI 6(R5),X'11' DOT03450 BE GIVEMENU DOT03460 CLI 7(R5),X'11' DOT03470 BE GIVEMENU DOT03480 CLI 8(R5),X'11' DOT03490 BE GIVEMENU DOT03500 CLI 9(R5),X'11' DOT03510 BE GIVEMENU DOT03520 * OK, IT'S GOOD. LET'S SAVE THE NEW SESSION TERMINATE STRING. DOT03530 MVC CBTERMST,6(R5) DOT03540 CON300 DS 0H DOT03550 * NOW LET'S DETERMINE WHICH UTS HE WANTS TO CONNECT TO. DOT03560 * THE CURSOR POSITION IS IN THE SECOND AND THIRD BYTES OF THE DOT03570 * READ MODIFIED BUFFER. IT'S COMPRISED OF 2 NUMBERS IN BIT DOT03580 * POSITIONS X'3F' OF BOTH BYTES (I.E. THE TWO HIGH ORDER BITS OF DOT03590 * BOTH BYTES ARE JUNK). THIS ALGORITHM TAKES THOSE 2 BYTES AND DOT03600 * CONVERTS THEM INTO ROW NUMBER (0-23) AND COLUMN NUMBER (0-79). DOT03610 SR R8,R8 DOT03620 ICM R8,B'0011',1(R5) GET CURSOR ADDRESS DOT03630 N R8,=X'00003F3F' STRIP OFF EXTRA BITS DOT03640 SRDL R8,8 SEPARATE THE 2 HALVES DOT03650 SLL R9,2 DOT03660 SRDL R8,26 COMBINE 2 HALVES AGAIN IN R9 DOT03670 LH R1,CBTERMLL DIVIDE CURSOR POSITION BY THE LINE DOT03680 DR R8,R1 LENGTH. R8 = COLUMN, R9 = ROW. DOT03690 * LET'S NOW TRY TO CORRESPOND THIS LINE NUMBER TO A REAL UTS. DOT03700 L R4,CBFIRST GET ADDRESS OF FIRST UTS CB DOT03710 LTR R4,R4 LOAD DOESN'T SET THE CONDITION CODE DOT03720 BZ CON400 CHECK FOR NO UTS'S AT ALL DOT03730 LA R8,2 DOT03740 B CON350 SKIP THE NEXT 3 INSTRUCTIONS FIRST TIME THROUGH DOT03750 UTSLOOP DS 0H DOT03760 L R4,CBUTSFP POINT TO NEXT UTS CONTROL BLOCK DOT03770 LTR R4,R4 LOAD DOESN'T SET THE CONDITION CODE DOT03780 BZ BADLINE ERROR IF NO MORE. DOT03790 CON350 DS 0H DOT03800 LA R8,2(R8) DOT03810 CH R8,=H'23' CHECK FOR OFF THE SCREEN. DOT03820 BH BADLINE DOT03830 CR R8,R9 IS THIS THE UTS HE WANTED ?? DOT03840 BE GOTIT2 YEP, CONTINUE ON. DOT03850 BL UTSLOOP IF NOT PAST CURSOR POSITION, KEEP CHECKING DOT03860 BADLINE DS 0H DOT03870 MVC MENUMSG,=CL40'INVALID CURSOR POSITION.' DOT03880 B GIVEMENU DOT03890 * HIS CURSOR WAS ON A VALID LINE AND R3 IS POINTING TO THE UTS DOT03900 * CONTROL BLOCK OF THE UTS HE WANTS TO GET PLUGGED INTO. LET'S DOT03910 * SEE IF THAT UTS WAS ONLINE LAST TIME I CHECKED. DOT03920 GOTIT2 DS 0H DOT03930 TM CBUTSFGA,ONLINE IF IT'S PLUGGED IN, THEN DOT03940 BO PLUGIMIN GO PLUG HIM IN TO THIS UTS. DOT03950 L R15,=V(ATTACH) ELSE GO TRY TO GET HIM ONLINE. DOT03960 BALR R14,R15 DOT03970 TM CBUTSFGA,ONLINE DID THAT WORK ?? IF SO, THEN DOT03980 BO PLUGIMIN GO PLUG HIM IN TO THE UTS. DOT03990 MVC MENUMSG,=CL40'SORRY, THAT UTS WON''T COME ONLINE.' DOT04000 B GIVEMENU ELSE GIVE MSG THAT WE FAILED DOT04010 PLUGIMIN DS 0H DOT04020 ST R4,CBTERMUP REMEMBER WHICH UTS THIS DOT04030 * TERMINAL IS PLUGGED IN TO. DOT04040 B GIVE2UTS DOT04050 *********************************************************************** DOT04060 GIVEMENU DS 0H DOT04070 MVC MENUSTS,CBTERMST DOT04080 SR R0,R0 DOT04090 LA R1,1 SECOND LINE, FIRST POSITION DOT04100 BAL R14,CONVSBA DOT04110 STCM R1,B'0011',MENUSBA1 DOT04120 SR R0,R0 DOT04130 LA R1,2 THIRD LINE, FIRST POSITION DOT04140 BAL R14,CONVSBA DOT04150 STCM R1,B'0011',MENUSBA2 DOT04160 LA R0,50 DOT04170 LA R1,23 LAST (24TH) LINE, FAR RIGHT DOT04180 BAL R14,CONVSBA DOT04190 STCM R1,B'0011',MENUSBA3 DOT04200 LA R0,1 DOT04210 LA R1,4 CURSOR ON 5TH LINE, SECOND POSITION DOT04220 BAL R14,CONVSBA DOT04230 STCM R1,B'0011',MENUSBA4 DOT04240 LA R5,MENUMSGL INITIALIZE LENGTH OF MENU DATA DOT04250 LA R6,MENUUTS BEGINNING OF UTS DATA ON MENU DOT04260 LA R7,4 PUT FIRST UTS ON SCREEN LINE 5 (0-N) DOT04270 L R4,CBFIRST DOT04280 LTR R4,R4 CHECK FOR NO UTS'S AT ALL DOT04290 BNZ CON500 DOT04300 CON400 MVC MENUMSG,=CL40'SORRY, BUT THERE ARE NO UTS''S TO GO TO.' DOT04310 B DOMENUIO DOT04320 CON500 DS 0H DOT04330 * WE'VE GOT A UTS TO PUT ON THE SCREEN. CONVERT THIS LINE NUMBER DOT04340 * TO A SCREEN BUFFER ADDRESS. DOT04350 MVI 0(R6),X'11' DOT04360 SR R0,R0 FIRST POSITION ON LINE DOT04370 LR R1,R7 THIS LINE NUMBER DOT04380 BAL R14,CONVSBA DOT04390 STCM R1,B'0011',1(R6) STORE BUFFER ADDRESS DOT04400 MVC 3(2,R6),=X'1D40' ASSUME IT'S OFFLINE DOT04410 TM CBUTSFGA,ONLINE DID I GUESS RIGHT ?? DOT04420 BNO SKIP1 YEP. BRANCH IF IT'S OFFLINE. DOT04430 MVI 4(R6),X'C8' REPLACE WITH HIGHLIGHT ATTRIBUTE DOT04440 SKIP1 MVC 5(8,R6),CBUTSUID DOT04450 MVC 13(12,R6),=C' AT ADDRESS ' DOT04460 LH R1,CBUTSRAD DOT04470 L R15,ACONEHEX DOT04480 BALR R14,R15 DOT04490 STCM R1,B'0111',25(R6) DOT04500 MVC 28(2,R6),=X'1D60' DELIMIT THIS LINE DOT04510 LA R5,30(R5) BUMP TOTAL BYTES IN MENU BUFFER DOT04520 LA R6,30(R6) BUMP MENU BUFFER POINTER DOT04530 LA R7,2(R7) PUT NEXT UTS 2 LINES DOWN DOT04540 C R7,=F'23' ARE WE AT THE END OF THE SCREEN ?? DOT04550 BH DOMENUIO IF SO, DON'T ADD ANYMORE UTS'S. DOT04560 L R4,CBUTSFP ELSE, GET POINTER TO NEXT UTS CB DOT04570 LTR R4,R4 IF THERE'S ANOTHER UTS TO PUT DOT04580 BNZ CON500 ON THE SCREEN, GO DO IT. DOT04590 DOMENUIO DS 0H DOT04600 OI CBTERMFA,MENUUP REMEMBER THAT HE'S SEEN A MENU DOT04610 STCM R5,B'0111',LENGTH DOT04620 LR R7,R5 DOT04630 SH R7,=H'258' DOT04640 C R7,=X'000000FF' DOT04650 BNH RICK2 DOT04660 LA R7,255 DOT04670 RICK2 IC R8,MENUUTS-1 DOT04680 STC R7,MENUUTS-1 DOT04690 ETTE MENUUTS-1 DOT04700 STC R8,MENUUTS-1 DOT04710 LA R1,WRITECCW GET ADDRESS OF WRITE CCW DOT04720 L R15,ATERMIO GET ADDRESS OF TERMINAL I/O ROUTINE DOT04730 BALR R14,R15 DO THE WRITE MENU I/O DOT04740 LTR R10,R15 DOT04750 BZ TERMBYE IF ALL OK, RETURN TO DISPATCHER DOT04760 LINEDIT TEXT='I GOT A BAD RETURN CODE DOING THE WRITE MENU CCW-DOT04770 . RC = ....',SUB=(DEC,(R10)),RENT=NO DOT04780 LM R9,R10,CBTERMCS DOT04790 LINEDIT TEXT='CSW = ........ ........',SUB=(HEX,(R9),HEX,(R10)-DOT04800 ),RENT=NO DOT04810 * DOT04820 DROPHIM DS 0H DOT04830 * ACCORDING TO A PHONE CONVERSATION WITH JEFF DOBBEK (6/22/83 AT DOT04840 * 3:30), HE WANTS TO SEE AN ASYNCHRONOUS INTERRUPT WHENEVER I DROP DOT04850 * A TERMINAL. PUT DEVICE END AND UNIT CHECK IN THE CSW STATUS AND DOT04860 * INTERVENTION REQUIRED IN THE SENSE BYTE. DOT04870 TM CBTERMFA,PLUGGED WAS THIS TERMINAL PLUGGED IN ?? DOT04880 BNO CON600 NO, DON'T HAVE TO TELL THE UTS. DOT04890 XC PARM0(128),PARM0 INITIALIZE REPLY CONTROL BLOCK. DOT04900 MVC PARM0(3),CBTERMEA GIVE THIS TERMINAL'S EBCDIC ADDRESS DOT04910 MVC PARM0+3(5),=CL5' ' PAD THE REST WITH BLANKS DOT04920 MVC PARM1,=CL8'TERMIO' IDENTIFY AS A TERMINAL INTERRUPT DOT04930 MVC PARM15+3(2),=X'4006' GIVE SENSE BYTE & CSW STATUS DOT04940 LA R0,128 DOT04950 LA R1,PARM0 DOT04960 L R4,CBTERMUP DOT04970 ST R4,THISUTS THE UTS WRITE ROUTINE EXPECTS THIS DOT04980 * TO BE SET, SO ....... DOT04990 L R15,AINTUTS TELL THE UTS THAT THIS TERMINAL IS DOT05000 BALR R14,R15 BEING DROPPED. IGNORE ANY ERRORS. DOT05010 CON600 DS 0H DOT05020 MVI CBTERMFA,X'00' DOT05030 MVC CBTERMST,=CL4'$$$$' DEFAULT SESSION TERMINATE STRING DOT05040 MVC DROPCUU(3),CBTERMEA DOT05050 LA R1,DROPCMD DOT05060 SVC 202 DOT05070 DC AL4(*+4) DOT05080 TERMBYE DS 0H DOT05090 NI CBTERMFA,ALL-INTISIN-IGOTIT THIS INTERRUPT TAKEN CARE OF DOT05100 TERMQUIT LM R0,R14,REGSAVE DOT05110 BR R14 RETURN TO CALLER DOT05120 * DOT05130 * LOCAL SUBROUTINE TO CONVERT A SCREEN LINE NUMBER TO A SET DOT05140 * BUFFER ADDRESS. EXAMPLE: UPON ENTRY, IF R0 = 0 & R1 = 4, DOT05150 * THAT MEANS WHAT SET BUFFER ADDRESS DO I NEED TO USE TO START DOT05160 * THIS FIELD ON THE FIFTH LINE OF THE SCREEN (STARTS WITH DOT05170 * LINE 0), THE FIRST POSITION (ALSO STARTS WITH 0). THE DOT05180 * ANSWER IS DEPENDENT ON THE SCREEN WIDTH (IN CBTERMLL) WHICH DOT05190 * IS USUALLY 80. ASSUMING 80, THIS ROUTINE RETURNS R1 = 'C540'. DOT05200 CONVSBA DS 0H DOT05210 MH R1,CBTERMLL DOT05220 AR R1,R0 DOT05230 SR R0,R0 DOT05240 D R0,=F'64' R0 = LOW & R1 = HIGH ORDER DIGIT DOT05250 LR R15,R0 USE R15 FOR IC INSTRUCTION-R0 WON'T WORK DOT05260 IC R0,FUNNYTBL(R15) TRANSLATE LOW TO FUNNY DIGIT DOT05270 IC R1,FUNNYTBL(R1) TRANSLATE HIGH TO FUNNY DIGIT DOT05280 SLL R1,8 COMBINE HIGH AND LOW DIGITS DOT05290 OR R1,R0 DOT05300 BR R14 RETURN TO CALLER DOT05310 * TERMINAL CCW'S. ADDRESSES WILL BE FILLED IN LATER. DOT05320 DS 0D DOT05330 SENSECCW DC X'0400000020000001' SENSE CCW DOT05340 READMCCW DC X'0600000020000FFF' READ MODIFIED CCW DOT05350 WRITECCW DC X'05',AL3(MENUDATA),X'20' WRITE CCW DOT05360 LENGTH DC X'000000' WRITE LENGTH DOT05370 WORKA DS D TEMPORARY WORK AREAS DOT05380 WORKB DS D DOT05390 DROPCMD DC CL8'CP' DOT05400 DC CL8'RESET' DOT05410 DROPCUU DC CL8' ' DOT05420 DC 8X'FF' DOT05430 REGSAVE DS 15F DOT05440 MENUDATA DC X'C21140401D60' DOT05450 MENUMSG DC CL40' ' DOT05460 DC X'11406F' DOT05470 DC C'SESSION TERMINATE STRING =' DOT05480 DC X'1DC8' (X'1DC9' FOR MODIFIED) DOT05490 MENUSTS DC C'$$$$' DOT05500 DC X'11' DOT05510 MENUSBA1 DC X'0000' DOT05520 DC X'1D60' DOT05530 DC C'POSITION THE CURSOR TO SELECT WHICH UTS TO CONNECT ' DOT05540 DC C'TO, THEN PRESS THE ENTER KEY' DOT05550 DC X'11' DOT05560 MENUSBA2 DC X'0000' DOT05570 DC X'1D60' DOT05580 DC C'THE HIGHLIGHTED ONES WERE ONLINE LAST TIME I CHECKED' DOT05590 DC X'11' DOT05600 MENUSBA3 DC X'0000' DOT05610 DC C'TO LEAVE THIS SCREEN, HIT PA1' DOT05620 DC X'11' DOT05630 MENUSBA4 DC X'0000' DOT05640 DC X'13' DOT05650 MENUMSGL EQU *-MENUDATA DOT05660 MENUUTS DS 10CL30 X'1100001DC8',C'UTS1 AT ADDRESS XXX',X'1D60' DOT05670 * 40 IF OFFLINE DOT05680 * END OF MENU SCREEN DATA DOT05690 FUNNYTBL DC X'40C1C2C3C4C5C6C7C8C94A4B4C4D4E4F' DOT05700 DC X'50D1D2D3D4D5D6D7D8D95A5B5C5D5E5F' DOT05710 DC X'6061E2E3E4E5E6E7E8E96A6B6C6D6E6F' DOT05720 DC X'F0F1F2F3F4F5F6F7F8F97A7B7C7D7E7F' DOT05730 ENABSSM DC X'FF' MASK TO ENABLE I/O & EXT. INTERRUPTS DOT05740 ICDATA DOT05750 END DOT05760