; ; INTRUP - C INTERRUPT SYSTEM ; ; This file is ITS dependent. ; TITLE INTRUP .INSRT NC .INSRT NM .GLOBAL UUOH,USAVEA,USAVEB,USAVEC,USAVED .GLOBAL PDLTOP ; SOME C INTERRUPT NUMBERS CH0I==16. ; CHANNEL 0 INTERRUPT IN0I==32. ; INFERIOR 0 INTERRUPT MPV==1. ; MPV INTERRUPT CTRSI==41. ; CONTROL-S INTERRUPT CTRGI==42. ; CONTROL-G INTERRUPT NINT==42. ; NUMBER OF INTERRUPTS ; TAB1 - CONVERTS FIRST WORD INTERRUPTS TO C INTERRUPT NUMBER .PDATA MDATA TAB1 0 ? 0 ? 10. ? 0 ? 0 ? 0 0 ? 0 ? 0 ? 15. ? 7. ? 6. 5. ? 0 ? 0 ? 0 ? 0 ? 0 13. ? 0 ? 0 ? 4. ? 1. ? 9. 0 ? 0 ? 0 ? 2. ? 0 ? 8. 3. ? 0 ? 14. ? 0 ? 0 ? 12. ; TAB2 - CONTAINS HANDLERS FOR AND INFORMATION ABOUT C INTERRUPTS ; BITS 0-17 HANDLER (0 => DEFAULT, 1 => IGNORE, OTHER => ROUTINE ADDR) ; BITS 18-23 BIT NUMBER IN ITS MASK WORD ; BIT 24 ITS MASK WORD NUMBER .IDATA MDATA TAB2 0 ; NOT USED 15,,0 ; MPV 10,,0 ; IOC 5,,0 ; ILOPR 16,,0 ; MAR 27,,0 ; UTRAP 30,,0 ; PURE 31,,0 ; WIRO 6,,0 ; SYSDOWN 14,,0 ; CLOCK 41,,0 ; TIMER 0 ; PDLOV (NOT USED) 0,,0 ; TTYI 21,,0 ; CLI 3,,0 ; OVERFLOW 32,,0 ; FLOATING OVERFLOW 100,,0 ; CHANNEL 0 101,,0 ; CHANNEL 1 102,,0 ; CHANNEL 2 103,,0 ; CHANNEL 3 104,,0 ; CHANNEL 4 105,,0 ; CHANNEL 5 106,,0 ; CHANNEL 6 107,,0 ; CHANNEL 7 110,,0 ; CHANNEL 10 111,,0 ; CHANNEL 11 112,,0 ; CHANNEL 12 113,,0 ; CHANNEL 13 114,,0 ; CHANNEL 14 115,,0 ; CHANNEL 15 116,,0 ; CHANNEL 16 117,,0 ; CHANNEL 17 122,,0 ; INFERIOR 0 123,,0 ; INFERIOR 1 124,,0 ; INFERIOR 2 125,,0 ; INFERIOR 3 126,,0 ; INFERIOR 4 127,,0 ; INFERIOR 5 130,,0 ; INFERIOR 6 131,,0 ; INFERIOR 7 0 ; NOT USED 0 ; CONTROL-S INTERRUPT 0 ; CONTROL-G INTERRUPT ; ; ON - SPECIFY AN ACTION FOR A C INTERRUPT ; .CODE CENTRY ON,[INTNO,NEWH] MOVE B,INTNO ; INTERRUPT # JUMPLE B,ON2 ; BAD # CAILE B,NINT ; NINT = HIGHEST VALID # GO ON2 ; BAD # HRRZ A,NEWH ; NEW HANDLER CAIL B,CTRSI GO ON1 ; SOFTWARE INTERRUPT LDB D,[220600,,TAB2(B)] ; BIT # MOVEI C,1 LSH C,(D) ; MASK LDB D,[300100,,TAB2(B)] ; WORD # CAIN B,CTRGI JUMPE A,TURNON JUMPE A,TURNOF CAIE A,1 GO TURNON CAIGE B,8. GO TURNON TURNOF: .SUSET [.SAMASK,,C ? .SAMSK2,,C](D) GO ON1 TURNON: .SUSET [.SIMASK,,C ? .SIMSK2,,C](D) ON1: HRRZ C,TAB2(B) ; OLD HANDLER HRRM A,TAB2(B) ; NEW HANDLER MOVE A,C ; RETURN OLD HANDLER ONRET: RETURN ON2: CROAK ON: INVALID INTERRUPT NUMBER MOVEI A,1 GO ONRET ; ; SIGNAL - SIGNAL A C INTERRUPT ; CENTRY SIGNAL,[SIGNO] MOVE A,SIGNO ; INTERRUPT # JUMPLE A,S3 ; BAD # CAILE A,NINT ; NINT = HIGHEST VALID # GO S3 ; BAD # HRRZ B,TAB2(A) ; HANDLER CAIN B,1 GO SIGRET ; 1 => IGNORE JUMPN B,S1 ; SPECIFIED HANDLER CAIN A,CTRGI GO S4 ; HANDLE ^G INTERRUPT GO SIGRET ; OTHERWISE IGNORE S1: CAIGE A,CH0I GO S2 ; NO ARG CAILE A,IN0I+7 GO S2 ; NO ARG CAIGE A,IN0I SUBI A,CH0I ; ARG IS CHANNEL # CAIL A,IN0I SUBI A,IN0I ; ARG IS INFERIOR # VCALL (B),[A] GO SIGRET S2: CAIN A,CTRSI CL CTRSIH ; SPECIAL ^S ACTION CAIN A,CTRGI CL CTRGIH ; SPECIAL ^G ACTION VCALL (B) GO SIGRET S3: CROAK INVALID INTERRUPT SIGNALLED GO SIGRET S4: CL CTRGIH CALL STKDMP CROAK -- ^G -- SIGRET: RETURN ; SPECIAL HANDLER FOR CONTROL-S INTERRUPT IENTRY CTRSIH PPUSH A PPUSH B CTRS1: SETO B, SYSCAL IOT,[5000,,%TIACT+%TIINT+%TINWT ? TYICHN" ? 2000,,B] JUMPLE B,CTRS2 CAIE B,^S GO CTRS1 CTRS2: PPOP B PPOP A RTN ; SPECIAL HANDLER FOR CONTROL-G INTERRUPT IENTRY CTRGIH PPUSH A PPUSH B CTRG1: SETO B, SYSCAL IOT,[5000,,%TIACT+%TIINT+%TINWT ? TYICHN ? 2000,,B] JUMPLE B,CTRG2 CAIE A,^G GO CTRG1 CTRG2: PPOP B PPOP A RTN ; ; DISMISS - DISMISS INTERRUPT AND RETURN TO CALLER ; MENTRY DISMISS SYSCAL DISMIS,[5000,,T%CTL ? INTPTR ? 1000,,.+2] RETURN ; ; GETPC - GET INTERRUPTED PC ; CENTRY GETPC MOVE D,INTPTR ; TOP OF INTERRUPT STACK MOVEI D,-T%SIZ+1(D) ; BOTTOM OF FRAME HRRZ A,T%OPC(D) RETURN ; ; SETPC - SET INTERRUPTED PC ; CENTRY SETPC,[PC] MOVE D,INTPTR ; TOP OF INTERRUPT STACK MOVEI D,-T%SIZ+1(D) ; BOTTOM OF FRAME MOVE A,PC HRRM A,T%OPC(D) RETURN ; ; INTERRUPT HANDLING SPECIFICATONS ; T%NRG==4 ; NUMBER OF REGISTERS PUSHED T%IW1==0 ; OFFSET OF 1ST INTERRUPT WORD T%IW2==1 ; OFFSET OF 2ND INTERRUPT WORD T%DF1==2 ; OFFSET OF 1ST OLD DEFER WORD T%DF2==3 ; OFFSET OF 2ND OLD DEFER WORD T%OPC==4 ; OFFSET OF OLD PC T%REG==5 ; OFFSET OF FIRST SAVED REGISTER T%SIZ==T%REG+T%NRG ; SIZE OF INTERRUPT FRAME T%CTL==A*100+T%NRG ; CONTROL ARG FOR PUSHING REGS MDATA TSINT T%CTL,,INTPTR ; PUSH REGISTERS ON INTERRUPT STACK %PIPDL ? 0 ; HANDLE PDL-OVERFLOW -1 ? -1 ; DEFER ALL INTERRUPTS PDLOVH ; PDL-OVERFLOW HANDLER %PIMPV ? 0 ; HANDLE MPV #%PIPDL ? -1 ; DEFER ALL BUT PDL-OVERFLOW MPVH ; MPV HANDLER #<%PIMPV+%PIPDL> ? 0 ; HANDLE ALL OTHER FIRST WORDERS #<%PIMPV+%PIPDL> ? -1 ; DEFER ALL BUT MPV AND PDLOV TSINT1 ; INTERRUPT HANDLER 0 ? -1 ; HANDLE ALL SECOND WORDERS #<%PIMPV+%PIPDL> ? -1 ; DEFER ALL BUT MPV AND PDLOV TSINT2 ; INTERRUPT HANDLER TSINTL"==21. ; .-TSINT DOESN'T WORK DUE TO MIDAS BUG ; ; INTERRUPT STACK ; INTPSZ==2*TSINTL ; SIZE OF INTERRUPT STACK .IDATA MDATA INTPTR -INTPSZ,,INTPDL MDATA INTPDL BLOCK INTPSZ-1 -1 ; THIS PAGE MUST NOT BE DELETED! .CODE ; ; MPV HANDLER ; IENTRY MPVH .SUSET [.RMPVA,,B] ; GET LOSING ADDRESS ; NOTE THAT ON KA-10 THIS ADDRESS ; IS ROUNDED DOWN TO FIRST WORD ; OF PAGE TRZ B,1777 ; ROUND DOWN ANYWAY (FOR KL-10) CAMGE B,SEG0LO" ; MAYBE IN SEGMENT 0? GO MPV$0 ; NO CAMG B,SEG0HI" ; IN SEGMENT 0? GO MPV$1 ; YES MPV$0: CAMGE B,SEG1LO" ; MAYBE IN SEGMENT 1? GO TSINT1 ; NO CAMLE B,SEG1HI" ; IN SEGMENT 1? GO TSINT1 ; NO ; HERE IF ADDRESS IS IN SEGMENT 1 MOVE C,PDLTOP ; TOP END OF STACK SUBI C,2000 TRZ C,1777 ; LAST FULL PAGE OF STACK CAME B,C ; REFERENCE TO LAST PAGE OF STACK? GO MPV$1 ; NO CROAK IMMINENT STACK OVERFLOW MPV$1: LSH B,-10. ; PAGE NUMBER SYSCAL CORTYP,[B ? SETZM C] ; GET PAGE INFO JUMPN C,TSINT1 ; PAGE EXISTS => MPV ON ANOTHER JOB MPV$2: SYSCAL CORBLK,[1000,,%CBNDW ? 1000,,-1 ? B ? 1000,,%JSNEW],MPVLOS GO INTDIS MPVLOS: CROAK UNABLE TO GET ZERO PAGE GO MPV$2 ; ; HANDLER FOR FIRST WORD INTERRUPTS ; IENTRY TSINT1 MOVE D,INTPTR ; TOP OF INTERRUPT STACK MOVEI D,-T%SIZ+1(D) ; BOTTOM OF FRAME MOVE A,T%IW1(D) ; GET INTERRUPT WORD JFFO A,.+2 ; GET FIRST BIT GO INTDIS ; NONE (?) MOVE A,TAB1(B) ; C INTERRUPT NUMBER JUMPE A,IGNORE ; NOT HANDLED HRRZ B,TAB2(A) ; HANDLER CAIN B,1 GO IGNORE ; 1 MEANS IGNORE JUMPN B,TS1 ; HANDLER SPECIFIED CAIN A,MPV GO FATMPV CAIN A,CTRGI GO TS1 ; DEFAULT IS NOT TO IGNORE IGNORE: AOS T%OPC(D) ; OTHERWISE - THE DEFAULT GO INTDIS ; IS TO CONTINUE WITH THE ; NEXT INSTRUCTION ; HERE IF FATAL MPV OCCURS FATMPV: MOVEI A,%PIMPV IORM A,T%DF1(D) ; MAKE MPV DEFFERED GO INTDIS ; NOW DISMISS - WILL MAKE FATAL ; ; SECOND WORD INTERRUPT HANDLER ; IENTRY TSINT2 MOVE D,INTPTR ; TOP OF INTERRUPT STACK MOVEI D,-T%SIZ+1(D) ; BOTTOM OF FRAME MOVE A,T%IW2(D) ; GET INTERRUPT WORD JFFO A,.+2 GO INTDIS CAILE B,17. GO CHANI CAIGE B,10. GO INTDIS MOVN A,B ADDI A,17.+IN0I GO TS1 CHANI: CAIGE B,19. GO INTDIS MOVN A,B ADDI A,35.+CH0I GO TS1 ; ; HERE TO SIGNAL SOMETHING WITH ARG IN A ; DEFINE PUSHL LIST IRP X,,[LIST] PPUSH X TERMIN!TERMIN DEFINE POPL LIST IRP X,,[LIST] PPOP X TERMIN!TERMIN TS1: ADDI P,20 ; IN CASE EPILOG INTERRUPTED PUSHL [0,5,6,7,10,11,12,13,14,15,16] PUSHL [40,USAVEA,USAVEB,USAVEC,USAVED,UUOH] CALL SIGNAL,[A] POPL [UUOH,USAVED,USAVEC,USAVEB,USAVEA,40] POPL [16,15,14,13,12,11,10,7,6,5,0] SUBI P,20 PDLOVH: INTDIS: SYSCAL DISMIS,[5000,,T%CTL ? INTPTR] IENTRY ETSINT END