TITLE 'ICATS TERMINAL INTERRUPT HANDLING ROUTINE' TER00010 *********************************************************************** TER00020 * * TER00030 * MODULE NAME = TERMIOIH * TER00040 * * TER00050 * FUNCTION = HANDLE TERMINAL I/O INTERRUPTS. FROM THE MOMENT WHEN * TER00060 * SOMEBODY DIALS THIS VIRTUAL MACHINE, WE START SEEING * TER00070 * EVERY INTERRUPT FROM THAT TERMINAL. THIS ROUTINE * TER00080 * POSTS THAT INTERRUPT IN THAT TERMINAL'S CONTROL BLOCK. * TER00090 * * TER00100 * ENTRY POINTS = TERMIOIH * TER00110 * * TER00120 * LINKAGE = FROM CMS (ROUTINE ADDRESS SPECIFIED IN THE HNDINT * TER00130 * MACRO ISSUED IN THE CONFIG ROUTINE). * TER00140 * * TER00150 * REGISTER CONTENTS UPON ENTRY = * TER00160 * R0-R1 = I/O OLD PSW * TER00170 * R2-R3 = CHANNEL STATUS WORD (CSW). * TER00180 * R4 = DEVICE ADDRESS. * TER00190 * R14 = RETURN ADDRESS BACK TO CMS. * TER00200 * R15 = ENTRY POINT TO THIS MODULE * TER00210 * * TER00220 * REGISTER USAGE = * TER00230 * R0-R1 = USED TO PASS PARAMETERS TO SUBROUTINES. * TER00240 * R2 = USED TO ADDRESS THE ICATS COMMON DATA AREA. * TER00250 * R3 = USED TO ADDRESS THE TERM CONTROL BLOCKS. * TER00260 * R4-R10 = FREE * TER00270 * R11 = MY BASE REGISTER * TER00280 * R14 = MY RETURN ADDRESS WHEN I CALL SOMEBODY * TER00290 * R15 = SUBROUTINE ADDRESS * TER00300 * * TER00310 * * TER00320 * MODULE LOGIC: * TER00330 * 1) GO THROUGH THE TERMINAL CONTROL BLOCK CHAIN AND FIND * TER00340 * THE CONTROL BLOCK FOR THIS INTERRUPTING TERMINAL. IF * TER00350 * NOT FOUND, THEN THIS INTERRUPTING DEVICE MUST NOT BE * TER00360 * A TERMINAL I'M HANDLING. I DON'T KNOW WHAT IT IS, SO * TER00370 * JUST IGNORE IT. * TER00380 * 2) IF A CORRESPONDING TERMINAL CONTROL BLOCK IS FOUND, * TER00390 * POST THIS INTERRUPT AND SET THE BIT THAT SAYS A TERMINAL * TER00400 * INTERRUPT IS IN. THE DISPATCHER WILL LOOK AT THAT * TER00410 * BIT LATER AND FIND OUT THAT THIS INTERRUPT NEEDS TO BE * TER00420 * TAKEN CARE OF. * TER00430 * * TER00440 * NORMAL EXIT = * TER00450 * R15 = 0 * TER00460 * * TER00470 * EXTERNAL REFERENCES = NONE * TER00480 * * TER00490 * MACROS = ICDATA = ICATS COMMON DATA AREA * TER00500 * ETTE = ENTER TRACE TABLE ENTRY SUBROUTINE * TER00510 * * TER00520 * CHANGE ACTIVITY * TER00530 * DATE NAME REASON FOR CHANGE * TER00540 * 05/26/83 RICK JASPER ORIGINAL PROGRAM CREATION. * TER00550 * * TER00560 *********************************************************************** TER00570 PRINT GEN,NODATA TER00580 TERMIOIH CSECT TER00590 USING ICDATA,R2 ADDRESS ICATS COMMON DATA AREA TER00600 USING CBTERM,R3 ADDRESS TERMINAL CONTROL BLOCK TER00610 USING *,R15 USE R15 FOR NEXT INSTRUCTION ONLY TER00620 STM R0,R14,TERMREGS SAVE ALL THE REGISTERS TER00630 DROP R15 TER00640 USING TERMIOIH,R11 SWITCH BASE REGISTER TO R11 TER00650 LR R11,R15 TER00660 L R2,=V(ICDATA) RELOAD ICDATA BASE REGISTER TER00670 * START OUT BY PUTTING AN ENTRY INTO THE TRACE TABLE RECORDING TER00680 TM FLAGC,TRACEMOD THE FACT WE SAW AN INTERRUPT TER00690 BNO SKIPTTE DO ONLY IF TRACE MODE IS ON. TER00700 LH R1,TERMREGS+18 TER00710 L R15,ACONEHEX TER00720 BALR R14,R15 TER00730 STCM R1,B'0111',TTECUU TER00740 L R1,TERMREGS PUT 1ST HALF OF I/O OLD PSW IN TTE TER00750 L R15,ACONEHEX TER00760 BALR R14,R15 TER00770 STCM R0,B'1111',TTEOLDA TER00780 STCM R1,B'1111',TTEOLDA+4 TER00790 L R1,TERMREGS+4 PUT 2ND HALF OF I/O OLD PSW IN TTE TER00800 L R15,ACONEHEX TER00810 BALR R14,R15 TER00820 STCM R0,B'1111',TTEOLDB TER00830 STCM R1,B'1111',TTEOLDB+4 TER00840 L R1,TERMREGS+8 PUT 1ST HALF OF CSW IN TTE TER00850 L R15,ACONEHEX TER00860 BALR R14,R15 TER00870 STCM R0,B'1111',TTECSWA TER00880 STCM R1,B'1111',TTECSWA+4 TER00890 L R1,TERMREGS+12 PUT 2ND HALF OF CSW IN TTE TER00900 L R15,ACONEHEX TER00910 BALR R14,R15 TER00920 STCM R0,B'1111',TTECSWB TER00930 STCM R1,B'1111',TTECSWB+4 TER00940 ETTE IOTTE TER00950 SKIPTTE EQU * TER00960 TM TEST0916,TEST10 TER00970 BNO SKIPMSG TER00980 LH R8,TERMREGS+18 GET TERMINAL ADDRESS TER00990 LH R9,TERMREGS+12 GET CSW STATUS TER01000 LINEDIT TEXT='GOT A TERMINAL INTERRUPT FROM ..., CSW STATUS = -TER01010 ....',SUB=(HEX,(R8),HEX,(R9)),RENT=NO TER01020 SKIPMSG EQU * TER01030 * GO FIND THIS TERMINAL MACHINE'S CONTROL BLOCK IN THE TERMCB CHAIN TER01040 * R3 = THE ADDRESS OF THE CURRENT TERMINAL CONTROL BLOCK TER01050 L R3,TERM1ST GET ADDRESS OF FIRST TERMINAL CB TER01060 LTR R3,R3 ARE THERE ANY ?? TER01070 BZ IOIGNORE IF NOT, IGNORE THIS INTERRUPT TER01080 IOLOOP CLC TERMREGS+18(2),CBTERMHA IS THIS THE INTERRUPTING TERM?? TER01090 BE IOCONA YES, GO TAKE CARE OF IT. TER01100 L R3,CBTERMFP GET POINTER TO NEXT TERMINAL CB. TER01110 LTR R3,R3 ARE WE AT THE END OF THE CHAIN ?? TER01120 BNE IOLOOP NOPE, GO CHECK THIS UTSCB TER01130 B IOIGNORE IF UTS NOT FOUND, IGNORE INTERRUPT TER01140 * TER01150 * NOW R3 IS POINTING TO THE CORRECT TERMINAL CONTROL BLOCK. TER01160 * TURN ON THE I-NEED-SERVICING FLAG FOR THIS TERMINAL & TER01170 * TURN ON THE A-TERMINAL-NEEDS-SERVICING FLAG. TER01180 * SAVE THE CSW TO LATER PASS IT ON TO THE UTS. TER01190 * REMEMBER THE DATE AND TIME THIS INTERRUPT CAME IN. TER01200 * BUT FIRST OF ALL, SINCE CP RETURNS RIGHT AWAY WHEN DOING AN I/O TER01210 * OPERATION TO A TUBE WITH DIAGNOSE X'0058', I SEE ALL THE TER01220 * CHANNEL END & DEVICE END INTERRUPTS AFTER I COME BACK FROM TER01230 * THE DIAGNOSE (UNLIKE GENERAL I/O WITH DIAGNOSE X'0020'). TER01240 * SO, I'M GOING TO IGNORE ALL TERMINAL INTERRUPTS WITH CHANNEL TER01250 * END OR DEVICE END ONLY, UNLESS THIS TERMINAL ISN'T LOOKING AT TER01260 * A MENU RIGHT NOW OR PLUGGED IN (I.E. HE HAS JUST DIALED TO ME). TER01270 IOCONA DS 0H TER01280 TM CBTERMFA,MENUUP+PLUGGED IF BOTH BITS ARE OFF, TER01290 BZ IOCON DON'T IGNORE THIS INTERRUPT. TER01300 TM TERMREGS+12,X'F3' CHECK FOR ANY BITS OTHER THAN CHANNEL TER01310 * END AND DEVICE END IN THE UNIT STATUS TER01320 BNZ IOCON IF ANY ARE ON, DON'T IGNORE INTERRUPT TER01330 CLI TERMREGS+13,X'00' CHECK CHANNEL STATUS FOR ANY BITS ON TER01340 BE IOIGNORE IF NONE THERE, IGNORE THIS INTERRUPT TER01350 IOCON DS 0H TER01360 OI CBTERMFA,INTISIN TER01370 OI FLAGA,TERMINT TER01380 MVC CBTERMCS,TERMREGS+8 SAVE CSW (WAS IN R2 & R3) TER01390 *-------------------------------------------------------------* TER01400 * GET THE TIME AND DATE FROM CP * TER01410 *-------------------------------------------------------------* TER01420 LA R1,CPDATA ADDRESS OF DATA FROM DIAG TER01430 DIAG R1,R0,X'000C' REQUEST DATE AND TIME FROM CP TER01440 *-------------------------------------------------------------* TER01450 * CPDATA IS NOW IN THE FORMAT OF * TER01460 * DC CL8'MM/DD/YY' * TER01470 * DC CL8'HH:MM:SS' * TER01480 * DS 2D THE REST IS JUNK * TER01490 *-------------------------------------------------------------* TER01500 MVC CBTERMDA,CPDATA TER01510 MVC CBTERMTI,CPDATA+8 TER01520 ETTE OKINTTTE TER01530 TERMBYE DS 0H TER01540 LM R0,R14,TERMREGS TER01550 SR R15,R15 RETURN CODE = 0 TER01560 BR R14 BYE TER01570 * TER01580 IOIGNORE DS 0H TER01590 ETTE BADINTTE TER01600 B TERMBYE TER01610 * TER01620 CPDATA DS 4D TER01630 TERMREGS DS 15F TER01640 * TER01650 IOTTE DC AL1(IOTTEQU) TER01660 DC C'TERMINAL INTERRUPT RECEIVED FROM ' TER01670 TTECUU DS CL3 TER01680 DC C'. I/O OLD PSW = ' TER01690 TTEOLDA DS CL8 TER01700 DC C' ' TER01710 TTEOLDB DS CL8 TER01720 DC C'. CSW = ' TER01730 TTECSWA DS CL8 TER01740 DC C' ' TER01750 TTECSWB DS CL8 TER01760 DC C'.' TER01770 IOTTEQU EQU *-IOTTE-1 TER01780 * TER01790 OKINTTTE DC AL1(OKEQU) TER01800 DC C'INTERRUPT DULY RECORDED' TER01810 OKEQU EQU *-OKINTTTE-1 TER01820 * TER01830 BADINTTE DC AL1(BADEQU) TER01840 DC C'INTERRUPT IGNORED' TER01850 BADEQU EQU *-BADINTTE-1 TER01860 LTORG TER01870 ICDATA TER01880 END TER01890