Split up files.
[pdp10-muddle.git] / sumex / interr.mcr239
diff --git a/sumex/interr.mcr239 b/sumex/interr.mcr239
new file mode 100644 (file)
index 0000000..b71bf2d
--- /dev/null
@@ -0,0 +1,2261 @@
+TITLE INTERRUPT HANDLER FOR MUDDLE\r
+\r
+RELOCATABLE\r
+\r
+;C. REEVE  APRIL 1971\r
+\r
+.INSRT MUDDLE >\r
+\r
+SYSQ\r
+\r
+IF1,[\r
+IFE ITS,.INSRT MUDSYS;STENEX >\r
+]\r
+\r
+PDLGRO==10000  ;AMOUNT TO GROW A PDL THAT LOSES\r
+NINT==72.      ;MAXIMUM NUMBER OF INTERRUPTS POSSIBLE\r
+\r
+IFN ITS,[\r
+;SET UP LOCATION 42 TO POINT TO TSINT\r
+\r
+RMT [\r
+\r
+ZZZ==$.        ;SAVE CURRENT LOCATION\r
+\r
+LOC 42\r
+\r
+       JSR     MTSINT          ;GO TO HANDLER\r
+\r
+LOC ZZZ\r
+]\r
+]\r
+\r
+; GLOBALS NEEDED BY INTERRUPT HANDLER\r
+\r
+.GLOBAL        ONINT   ; FUDGE INS EXECUTED IF NON ZERO AT START OF INTERRUPT\r
+.GLOBA GCFLG   ;TELLS WHETHER OR NOT GARBAGE COLLECTOR IS RUNNING\r
+.GLOBAL GCFLCH ; FLUSH CHARS IMMEDIATE SO GC CAN SEE THEM\r
+.GLOBAL CORTOP ; TOP OF CORE\r
+.GLOBA GCINT   ;TELLS GARBAGE COLLECTOR TO SIMULATE AN INTERRUPT\r
+.GLOBAL INTNUM,INTVEC  ;TV ENTRIES CONCERNING INTERRUPTS\r
+.GLOBAL AGC    ;CALL THE GARBAGE COLLECTOR\r
+.GLOBAL VECNEW,PARNEW,GETNUM   ;GC PSEUDO ARGS\r
+.GLOBAL GCPDL  ;GARBAGE COLLECTORS PDL\r
+.GLOBAL VECTOP,VECBOT  ;DELIMIT VECTOR SPACE\r
+.GLOBAL PURTOP\r
+.GLOBAL PDLBUF ;AMOUNT OF  PDL GROWTH\r
+.GLOBAL PGROW  ;POINTS TO DOPE WORD OF NEXT PDL TO GROW\r
+.GLOBAL TPGROW ;POINTS TO NEXT MUDDLE PDL TO GROW\r
+.GLOBAL TOPLEV,ERROR%,N.CHNS,CHNL1\r
+.GLOBAL BUFRIN,CHNL0,SYSCHR    ;CHANNEL GLOBALS\r
+.GLOBAL IFALSE,TPOVFL,1STEPR,INTOBL,INCHAR,CURPRI,RDEVIC,RDIREC,GFALS,STATUS\r
+.GLOBAL PSTAT,NOTRES,IOIN2,INAME,INTFCN,CHNCNT,CHANNO,GIBLOK,ICONS,INCONS\r
+.GLOBAL IEVECT,INSRTX,ILOOKC,IPUT,IREMAS,IGET,CSTAK,EMERGE\r
+.GLOBAL MTSINT ;BEGINNING OF INTERRUPT HANDLER\r
+.GLOBAL INTINT ;CALLED BY INITIALIZER TO TAKE CARE OF INT PCS\r
+.GLOBAL FRMSTK,APPLY,CHUNW\r
+.GLOBAL IPCGOT,DIRQ    ;HANDLE BRANCHING OFF TO IPC KLUDGERY\r
+\r
+; GLOBALS FOR GC\r
+.GLOBAL        GCTIM,GCCAUS,GCCALL\r
+\r
+; GLOBALS FOR MONITOR ROUTINES\r
+\r
+.GLOBAL MONCH,MONCH0,RMONCH,RMONC0,LOCQ,SMON,BAPT,APLQ,MAKACT,NAPT\r
+.GLOBAL PURERR,BUFRIN,INSTAT\r
+\r
+MONITOR\r
+\r
+.GLOBAL MSGTYP,MTYI,UPLO,IFLUSH,OCLOS,ERRET,MASK1,MASK2        ;SUBROUTINES USED\r
+.GLOBAL ERROR,LISTEN,ECHO,RRESET,MTYO,GCHAPN,P.CORE,P.TOP,QUEUES,NOTTY,TTYOP2,TTICHN\r
+.GLOBAL INTHLD,BNDV,SPECBE\r
+;BEGINNING OF ACTUAL INTERRUPT HANDLER (MUST BE IMPURE)\r
+\r
+\r
+;***** TEMP FUDGE *******\r
+\r
+QUEUES==INTVEC\r
+\r
+\f\r
+; DECLARATIONS ASSOCIATED WITH INTERRUPT HANDERS AND HEADERS\r
+\r
+; SPECIAL TABLES\r
+\r
+SPECIN:        IRP A,,[CHAR,CLOCK,MPV,ILOPR,WRITE,READ,IOC,PURE,SYSDOWN,INFERIOR,RUNT,REALT\r
+PARITY]\r
+       MQUOTE A,[A]INTRUP\r
+       TERMIN\r
+SPECLN==.-SPECIN\r
+\r
+; TABLE OF SPECIAL FINDING ROUTINES\r
+\r
+FNDTBL:        IRP A,,[GETCHN,0,0,0,LOCGET,LOCGET,0,0,0,0,0,0,0]\r
+       A\r
+       TERMIN\r
+\r
+; TABLE OF SPECIAL SETUP ROUTINES\r
+\r
+INTBL: IRP A,,[S.CHAR,S.CLOK,S.MPV,S.ILOP,S.WMON,S.RMON,S.IOC,S.PURE,S.DOWN,S.INF\r
+S.RUNT,S.REAL,S.PAR]\r
+       A\r
+       S!A==.IRPCNT\r
+       TERMIN\r
+\r
+IFN ITS,[\r
+\r
+; EXTERNAL INTERRUPT TABLE\r
+\r
+EXTINT:        REPEAT NINT-36.,0\r
+       REPEAT 16.,HCHAR\r
+       0\r
+       0\r
+       REPEAT 8.,HINF\r
+       REPEAT NINT-62.,0\r
+EXTEND:\r
+\r
+IRP A,,[[HCLOCK,13.],[HMPV,14.],[HILOPR,6],[HIOC,9],[HPURE,26.],[HDOWN,7],[HREAL,35.]\r
+[HRUNT,34.],[HPAR,28.]]\r
+       IRP B,C,[A]\r
+       LOC EXTINT+C\r
+       B\r
+       .ISTOP\r
+       TERMIN\r
+TERMIN\r
+\r
+\r
+LOC EXTEND\r
+]\r
+\f\r
+IFE ITS,[\r
+\r
+; TABLES FOR TENEX INTERRUPT SYSTEM\r
+\r
+LEVTAB:        P1              ; POINTS TO INT PC HOLDERS FOR LEVS 1,2 AND 3\r
+       P2\r
+       P3\r
+\r
+CHNMSK==0                      ; WILL BE MASK WORD FOR INT SET UP\r
+MFORK==400000\r
+NNETS==10.             ; ALLOW 10 NETWRK INTERRUPTS\r
+NETCHN==36.-NNETS\r
+\r
+CHNTAB:                        ; LOCATION OF INT ROUTINES FOR VARIOUS "CHANNELS"\r
+       BLOCK   36.-NNETS       ; THERE AR 36. TENEX INT CHANNELS\r
+\r
+REPEAT NNETS, 1,,INTNET+3*.RPCNT\r
+\r
+IRP A,,[[0,CNTLG],[1,CNTLS],[9.,TNXPDL]]\r
+       IRP B,C,[A]\r
+       LOC CHNTAB+B\r
+       1,,C\r
+       CHNMSK==CHNMSK+<1_<35.-B>>\r
+       .ISTOP\r
+       TERMIN\r
+TERMIN\r
+LOC CHNTAB+36.\r
+\r
+EXTINT:        BLOCK NINT-NNETS\r
+\r
+REPEAT NNETS,HNET\r
+\r
+IRP A,,[[HCNTLG,36.],[HCNTLS,37.]]\r
+       IRP B,C,[A]\r
+       LOC EXTINT+C\r
+       B\r
+       .ISTOP\r
+       TERMIN\r
+TERMIN\r
+LOC EXTINT+NINT\r
+]\r
+\r
+\r
+; HANDLER/HEADER PARAMETERS\r
+\r
+; HEADER BLOCKS\r
+\r
+IHDRLN==4              ; LENGTH OF HEADER BLOCK\r
+\r
+INAME==0               ; NAME OF INTERRUPT\r
+ISTATE==2              ; CURRENT STATE\r
+IHNDLR==4              ; POINTS TO LIST OF HANDLERS\r
+INTPRI==6              ; CONTAINS PRIORITY OF INTERRUPT\r
+\r
+IHANDL==4              ; LENGTH OF A HANDLER BLOCK\r
+\r
+INXT==0                        ; POINTS TO NEXTIN CHAIN\r
+IPREV==2               ; POINTS TO PREV IN CHAIN\r
+INTFCN==4              ; FUNCTION ASSOCIATED WITH THIS HANDLER\r
+INTPRO==6              ; PROCESS TO RUN INT IN\r
+\r
+IFN ITS,[\r
+RMT [\r
+IMPURE\r
+TSINT:\r
+MTSINT:        0                       ;INTERRUPT BITS GET STORED HERE\r
+TSINTR:        0                       ;INTERRUPT PC WORD STORED HERE\r
+       JRST    TSINTP          ;GO TO PURE CODE\r
+\r
+; SOFTWARE INTERNAL INTERRUPTS JSR TO HERE\r
+\r
+LCKINT:        0\r
+       JRST    DOINT\r
+\r
+PURE\r
+]\r
+]\r
+IFE ITS,[\r
+RMT [\r
+; JSR HERE FOR SOFTWARE INTERNAL INTERRUPTS\r
+\r
+LCKINT:        0\r
+       JRST    DOINT\r
+]\r
+]\r
+\f\r
+\r
+IFN ITS,[\r
+\r
+;THE REST OF THIS CODE IS PURE\r
+\r
+TSINTP:        SOSGE   INTFLG          ; SKIP IF ENABLED\r
+       SETOM   INTFLG          ;DONT GET LESS THAN -1\r
+\r
+       MOVEM   A,TSAVA         ;SAVE TWO ACS\r
+       MOVEM   B,TSAVB\r
+       MOVE    A,TSINT         ;PICK UP INT BIT PATTERN\r
+       JUMPL   A,2NDWORD       ;DONT CHECK FOR PDL OVERFLOW ETC. IF SIGN BIT ON\r
+\r
+       TRZE    A,200000        ;IS THIS A PDL OVERFLOW?\r
+       JRST    IPDLOV          ;YES, GO HANDLE IT FIRST\r
+\r
+IMPCH: MOVEI   B,0\r
+       TRNE    A,20000         ;IS IT A MEMORY PROTECTION VIOLATION?\r
+       MOVEI   B,1             ; FLAG SAME\r
+\r
+       TRNE    A,40            ;ILLEGAL OP CODE?\r
+       MOVEI   B,2             ; ALSO FLAG\r
+       TRNN    A,400           ; IOC?\r
+       JRST    .+3\r
+       SOS     TSINTR\r
+       MOVEI   B,3\r
+       TLNE    A,200           ; PURE?\r
+       MOVEI   B,4\r
+       SOJGE   B,DO.NOW                ; CANT WAIT AROUND\r
+\r
+;DECODE THE REST OF THE INTERRUPTS USING A TABLE\r
+\r
+2NDWORD:\r
+       JUMPL   A,GC2           ;2ND WORD?\r
+       IORM    A,PIRQ          ;NO, INTO WORD 1\r
+       JRST    GCQUIT          ;AND DISMISS INT\r
+\r
+GC2:   TLZ     A,400000        ;TURN OFF SIGN BIT\r
+       IORM    A,PIRQ2\r
+       TRNE    A,177777        ;CHECK FOR CHANNELS\r
+       JRST    CHNACT          ;GO IF CHANNEL ACTIVITY\r
+]\r
+GCQUIT:        SKIPGE  INTFLG          ;SKIP IF INTERRUPTS ENABLED\r
+       JRST    INTDON          ;NO, DEFER REAL HANDLING UNTIL LATER\r
+\r
+       MOVE    A,TSINTR        ;PICKUP RETURN WORD\r
+IFE ITS,[\r
+       TLON    A,10000         ; EXEC PC?\r
+       SUBI    A,1             ; YES FIXUP PC\r
+]\r
+       MOVEM   A,LCKINT        ;STORE ELSEWHERE\r
+       MOVEI   A,DOINTE        ;CAUSE DISMISS TO HANDLER\r
+       HRRM    A,TSINTR        ;STORE IN INT RETURN\r
+       PUSH    P,INTFLG        ;SAVE INT FLAG\r
+       SETOM   INTFLG          ;AND DISABLE\r
+\r
+\r
+INTDON:        MOVE    A,TSAVA         ;RESTORE ACS\r
+       MOVE    B,TSAVB\r
+IFN ITS,       .DISMISS        TSINTR          ;AND DISMISS THE INTERRUPT\r
+IFE ITS,       DEBRK\r
+\r
+\r
+DO.NOW:        SKIPE   GCFLG\r
+       JRST    DLOSER          ; HANDLE FATAL GC ERRORS\r
+       MOVSI   B,1\r
+       SKIPGE  INTFLG          ; IF NOT ENABLED\r
+       MOVEM   B,INTFLG        ; PRETEND IT IS\r
+       JRST    2NDWORD\r
+\r
+IFE ITS,[\r
+\r
+; HERE FOR TENEX PDL OVER FLOW INTERRUPT\r
+\r
+TNXPDL:        SOSGE   INTFLG\r
+       SETOM   INTFLG\r
+       MOVEM   A,TSAVA\r
+       MOVEM   B,TSAVB\r
+       JRST    IPDLOV          ; GO TO COMMON HANDLER\r
+\r
+; HERE FOR TENEX ^G AND ^S INTERRUPTS\r
+\r
+CNTLG: MOVEM   A,TSAVA\r
+       MOVEI   A,1\r
+       JRST    CNTSG\r
+\r
+CNTLS: MOVEM   A,TSAVA\r
+       MOVEI   A,2\r
+\r
+CNTSG: MOVEM   B,TSAVB\r
+       IORM    A,PIRQ2         ; SAY FOR MUDDLE LEVEL\r
+       SOSGE   INTFLG\r
+       SETOM   INTFLG\r
+       JRST    GCQUIT\r
+INTNET:\r
+REPEAT NNETS,[\r
+       MOVEM   A,TSAVA\r
+       MOVE    A,[1_<.RPCNT+NETCHN>]\r
+       JRST    CNTSG\r
+]\r
+]\r
+\f\r
+; HERE TO PROCESS INTERRUPTS\r
+\r
+DOINT: SKIPE   INTHLD          ; GLOBAL LOCK ON INTS\r
+       JRST    @LCKINT\r
+       SETOM   INTHLD          ; DONT LET IT HAPPEN AGAIN\r
+       PUSH    P,INTFLG\r
+DOINTE:        SKIPE   ONINT           ; ANY FUDGE?\r
+       XCT     ONINT           ; YEAH, TRY ONE\r
+       EXCH    0,LCKINT        ; RELATIVIZE PC IF FROM RSUBR\r
+       PUSH    P,0             ; AND SAVE\r
+       ANDI    0,-1\r
+       CAMG    0,PURTOP\r
+       CAMGE   0,VECBOT\r
+       JRST    DONREL\r
+       SUBI    0,(M)           ; M IS BASE REG\r
+       HLL     0,(P)           ; GET FLAGS\r
+       TLO     0,M             ; INDEX IT OFF M\r
+       EXCH    0,(P)           ; AND RESTORE TO STACK\r
+DONREL:        EXCH    0,LCKINT        ; GET BACK SAVED 0\r
+       SETZM   INTFLG          ;DISABLE\r
+       AOS     -1(P)           ;INCR SAVED FLAG\r
+\r
+;NOW SAVE WORKING ACS\r
+\r
+       PUSHJ   P,SAVACS\r
+       HLRZ    A,-1(P)         ; HACK FUNNYNESS FOR MPV/ILOPR\r
+       SKIPE   A\r
+       SETZM   -1(P)           ; REALLY DISABLED\r
+\r
+DIRQ:  MOVE    A,PIRQ          ;NOW SATRT PROCESSING\r
+       JFFO    A,FIRQ          ;COUNT BITS AND GO\r
+       MOVE    A,PIRQ2         ;1ST DONE, LOOK AT 2ND\r
+       JFFO    A,FIRQ2\r
+\r
+INTDN1:        SKIPN   GCHAPN          ; SKIP IF MUST DO GC INT\r
+       JRST    .+3\r
+       SETZM   GCHAPN\r
+       PUSHJ   P,INTOGC        ; AND INTERRUPT\r
+\r
+       PUSHJ   P,RESTAC\r
+\r
+IFN ITS,[\r
+       .SUSET  [.SPICLR,,[0]]  ; DISABLE INTS\r
+]\r
+       POP     P,LCKINT\r
+       POP     P,INTFLG\r
+       SETZM   INTHLD          ; RE-ENABLE THE WORLD\r
+IFN ITS,[\r
+       EXCH    0,LCKINT\r
+       HRRI    0,@0            ; EFFECTIVIZE THE ADDRESS\r
+       TLZ     0,37            ; KILL IND AND INDEX\r
+       EXCH    0,LCKINT\r
+       .DISMIS LCKINT\r
+]\r
+IFE ITS,       JRST    @LCKINT\r
+FIRQ:  PUSHJ   P,GETBIT        ;SET UP THE BIT TO CLOBBER IN PIRQ\r
+       ANDCAM  A,PIRQ          ;CLOBBER IT\r
+       ADDI    B,36.           ;OFSET INTO TABLE\r
+       JRST    XIRQ            ;GO EXECUTE\r
+\r
+FIRQ2: PUSHJ   P,GETBIT        ;PREPARE TO CLOBBER BIT\r
+       ANDCAM  A,PIRQ2         ;CLOBBER IT\r
+       ADDI    B,71.           ;AGAIN OFFSET INTO TABLE\r
+XIRQ:\r
+       CAIE    B,21            ;PDL OVERFLOW?\r
+       JRST    FHAND           ;YES, HACK APPROPRIATELY\r
+\r
+PDL2:  SKIPN   A,PGROW\r
+       SKIPE   A,TPGROW\r
+       JRST    .+2\r
+       JRST    DIRQ            ; NOTHING GROWING, FALSE ALARM\r
+       MOVEI   B,PDLGRO_-6     ;GET GROWTH SPEC\r
+       DPB     B,[111100,,-1(A)]       ;STORE GROWTH SPEC\r
+REAGC: MOVE    C,[10.,,1]      ; INDICATOR FOR AGC\r
+       SKIPE   PGROW           ; P IS GROWING\r
+       ADDI    C,6\r
+       SKIPE   TPGROW          ; TP IS GROWING\r
+       ADDI    C,1\r
+       PUSHJ   P,AGC           ;COLLECT GARBAGE\r
+       SETZM   PGROW\r
+       SETZM   TPGROW\r
+       AOJL    A,REAGC         ; IF NO CORE, RETRY\r
+       JRST    DIRQ\r
+\r
+SAVACS:\r
+IRP A,,[0,A,B,C,D,E]\r
+       PUSH    TP,A!STO(PVP)\r
+       SETZM   A!STO(PVP)      ;NOW ZERO TYPE\r
+       PUSH    TP,A\r
+       TERMIN\r
+       POPJ    P,\r
+\r
+RESTAC:\r
+IRP A,,[E,D,C,B,A,0]\r
+       POP     TP,A\r
+       POP     TP,A!STO(PVP)\r
+       TERMIN\r
+       POPJ    P,\r
+\r
+; HERE TO DO GC INTERRUPT AND CLOSE ANY DEAD CHANNELS\r
+\r
+INTOGC:        PUSH    P,[N.CHNS-1]\r
+       MOVE    A,TVP\r
+       ADD     A,[CHNL1,,CHNL1]\r
+       PUSH    TP,$TVEC\r
+       PUSH    TP,A\r
+\r
+INTGC1:        MOVE    A,(TP)          ; GET POINTER\r
+       SKIPN   B,1(A)          ; ANY CHANNEL?\r
+       JRST    INTGC2\r
+       HRRE    0,(A)           ; INDICATOR\r
+       JUMPGE  0,INTGC2\r
+       PUSH    TP,$TCHAN\r
+       PUSH    TP,B\r
+       MCALL   1,FCLOSE\r
+\r
+       MOVE    A,(TP)\r
+\r
+INTGC2:        HLLZS   (A)\r
+       ADD     A,[2,,2]\r
+       MOVEM   A,(TP)\r
+       SOSE    (P)\r
+       JRST    INTGC1\r
+\r
+       SUB     P,[1,,1]\r
+       SUB     TP,[2,,2]\r
+       PUSH    TP,$TCHSTR\r
+       PUSH    TP,CHQUOTE GC\r
+       PUSH    TP,$TFLOAT      ; PUSH  ON TIME ARGUMENT\r
+       PUSH    TP,GCTIM\r
+       PUSH    TP,$TFIX        ; PUSH ON THE CAUSE ARGUMENT\r
+       PUSH    TP,GCCAUS\r
+       PUSH    TP,$TATOM       ; PUSH ON THE CALL ARGUMENT\r
+       MOVE    A,GCCALL\r
+       PUSH    TP,@GCALLR(A)\r
+       MCALL   4,INTERR\r
+       POPJ    P,\r
+\r
+\r
+GCALLR:        0\r
+       MQUOTE BLOAT\r
+       MQUOTE GROW\r
+       MQUOTE LIST\r
+       MQUOTE VECTOR\r
+       MQUOTE SET\r
+       MQUOTE  SETG\r
+       MQUOTE FREEZE\r
+       MQUOTE PURE-PAGE-LOADER\r
+       MQUOTE GC\r
+       MQUOTE INTERRUPT-HANDLER\r
+       MQUOTE NEWTYPE\r
+\r
+\f; OLD "ON"  SETS UP EVENT AND HANDLER\r
+\r
+MFUNCTION ON,SUBR\r
+\r
+       ENTRY\r
+\r
+       HLRE    0,AB            ; 0=> -2*NUM OF ARGS\r
+       ASH     0,-1            ; TO -NUM\r
+       CAME    0,[-5]\r
+       JRST    .+3\r
+       MOVEI   B,10(AB)        ; LAST MUST BE CHAN OR LOC\r
+       PUSHJ   P,CHNORL\r
+       ADDI    0,3\r
+       JUMPG   0,TFA           ; AT LEAST 3\r
+       MOVEI   A,0             ; SET UP IN CASE NO PROC\r
+       AOJG    0,ONPROC        ; JUMP IF NONE\r
+       GETYP   C,6(AB)         ; CHECK IT\r
+       CAIE    C,TPVP\r
+       JRST    TRYFIX\r
+       MOVE    A,7(AB)         ; GET IT\r
+ONPROC:        PUSH    P,A             ; SAVE AS A FLAG\r
+       GETYP   A,(AB)          ; CHECK PREV EXISTANCE\r
+       PUSH    P,0\r
+       CAIN    A,TATOM\r
+       JRST    .+3\r
+       CAIE    A,TCHSTR\r
+       JRST    WTYP1\r
+       MOVEI   B,(AB)          ; FIND IT\r
+       PUSHJ   P,FNDINT\r
+       POP     P,0             ; REST NUM OF ARGS\r
+       JUMPN   B,ON3           ; ALREADY THERE\r
+       SKIPE   C               ; SKIP IF NOTHING TO FLUSH\r
+       SUB     TP,[2,,2]\r
+       PUSH    TP,(AB)         ; GET NAME\r
+       PUSH    TP,1(AB)\r
+       PUSH    TP,4(AB)\r
+       PUSH    TP,5(AB)\r
+       MOVEI   A,2             ; # OF ARGS TO EVENT\r
+       AOJG    0,ON1           ; JUMP IF NO LAST ARG\r
+       PUSH    TP,10(AB)\r
+       PUSH    TP,11(AB)\r
+       ADDI    A,1\r
+ON1:   ACALL   A,EVENT\r
+\r
+ON3:   PUSH    TP,A\r
+       PUSH    TP,B\r
+       PUSH    TP,2(AB)        ; NOW FCN\r
+       PUSH    TP,3(AB)\r
+       MOVEI   A,3             ; NUM OF ARGS\r
+       SKIPN   (P)\r
+       SOJA    A,ON2           ; NO PROC\r
+       PUSH    TP,$TPVP\r
+       PUSH    TP,7(AB)\r
+ON2:   ACALL   A,HANDLER\r
+       JRST    FINIS\r
+\r
+\r
+TRYFIX:        SKIPN   A,7(AB)\r
+       CAIE    C,TFIX\r
+       JRST    WRONGT\r
+       JRST    ONPROC\r
+\f\r
+; ROUTINE TO BUILD AN EVENT\r
+\r
+MFUNCTION EVENT,SUBR\r
+\r
+       ENTRY\r
+\r
+       HLRZ    0,AB\r
+       CAIN    0,-2            ; IF JUST 1\r
+       JRST    RE.EVN          ; COULD BE EVENT\r
+       CAIL    0,-3            ; MUST BE AT LEAST 2 ARGS\r
+       JRST    TFA\r
+       GETYP   A,2(AB)         ; 2ND ARG MUST BE FIXED POINT PRIORITY\r
+       CAIE    A,TFIX\r
+       JRST    WTYP2\r
+       GETYP   A,(AB)          ; FIRST ARG SHOULD BE CHSTR\r
+       CAIN    A,TATOM         ; ALLOW ACTUAL ATOM\r
+       JRST    .+3\r
+       CAIE    A,TCHSTR\r
+       JRST    WTYP1\r
+       CAIL    0,-5\r
+       JRST    GOTRGS\r
+       CAIG    0,-7\r
+       JRST    TMA\r
+       MOVEI   B,4(AB)\r
+       PUSHJ   P,CHNORL        ; CHANNEL OR LOCATIVE (PUT ON STACK)\r
+\r
+GOTRGS:        MOVEI   B,(AB)          ; NOW TRY TO FIND HEADER FOR THIS INTERRUPT\r
+       PUSHJ   P,FNDINT        ; CALL INTERNAL HACKER\r
+       JUMPN   B,FINIS         ; ALREADY ONE OF THIS NAME\r
+       PUSH    P,C\r
+       JUMPE   C,.+3           ; GET IT OFF STACK\r
+       POP     TP,B\r
+       POP     TP,A\r
+       PUSHJ   P,MAKINT        ; MAKE ONE FOR ME\r
+       MOVSI   0,TFIX\r
+       MOVEM   0,INTPRI(B)     ; SET UP PRIORITY\r
+       MOVE    0,3(AB)\r
+       MOVEM   0,INTPRI+1(B)\r
+CH.SPC:        POP     P,C             ; GET CODE BACK\r
+       SKIPGE  C\r
+       PUSHJ   P,DO.SPC        ; DO ANY SPECIAL HACKS\r
+       JRST    FINIS\r
+\r
+RE.EVN:        GETYP   0,(AB)\r
+       CAIE    0,TINTH\r
+       JRST    TFA             ; ELSE SAY NOT ENOUGH\r
+       MOVE    B,1(AB)         ; GET IT\r
+       SETZM   ISTATE+1(B)     ; MAKE SURE ENABLED\r
+       SETZB   D,C\r
+       GETYP   A,INAME(B)      ; CHECK FOR CHANNEL\r
+       CAIN    A,TCHAN         ; SKIP IF NOT\r
+       HRROI   C,SS.CHA        ; SET UP CHANNEL HACK\r
+       HRLZ    E,INTPRI(B)     ; GET POSSIBLE READ/WRITE BITS\r
+       TLNE    E,.WRMON+.RDMON ; SKIP IF NOT MONITORS\r
+       PUSHJ   P,GETNM1\r
+       JUMPL   C,RE.EV1\r
+       MOVE    B,INAME+1(B)    ; CHECK FOR SPEC\r
+       PUSHJ   P,SPEC1\r
+       MOVE    B,1(AB)         ; RESTORE IHEADER\r
+RE.EV1:        PUSH    TP,INAME(B)\r
+       PUSH    TP,INAME+1(B)\r
+       PUSH    P,C\r
+       MOVSI   C,TATOM\r
+       PUSH    TP,$TATOM\r
+       SKIPN   D\r
+       MOVE    D,MQUOTE INTERRUPT\r
+       PUSH    TP,D\r
+       MOVE    A,INAME(B)\r
+       MOVE    B,INAME+1(B)    ; GET IT\r
+       PUSHJ   P,IGET          ; LOOK FOR IT\r
+       JUMPN   B,FINIS         ; RETURN IT\r
+       MOVE    A,(TB)\r
+       MOVE    B,1(TB)\r
+       POP     TP,D\r
+       POP     TP,C\r
+       PUSH    TP,(AB)\r
+       PUSH    TP,1(AB)\r
+       PUSHJ   P,IPUT          ; REESTABLISH IT\r
+       MOVE    A,(AB)\r
+       MOVE    B,1(AB)\r
+       JRST    CH.SPC\r
+\r
+\f\r
+; FUNCTION TO GENERATE A HANDLER FOR A GIVEN INTERRUPT\r
+\r
+MFUNCTION HANDLER,SUBR\r
+\r
+       ENTRY\r
+\r
+       HLRZ    0,AB\r
+       CAIL    0,-2            ; MUST BE 2 OR MORE ARGS\r
+       JRST    TFA\r
+       GETYP   A,(AB)\r
+       CAIE    A,TINTH         ; EVENT?\r
+       JRST    WTYP1\r
+       GETYP   A,2(AB)\r
+       CAIN    0,-4            ; IF EXACTLY 2\r
+       CAIE    A,THAND         ; COULD BE HANDLER\r
+       JRST    CHEVNT\r
+\r
+       MOVE    B,3(AB)         ; GET IT\r
+       SKIPN   IPREV+1(B)      ; SKIP IF ALREADY IN USE\r
+       JRST    HNDOK\r
+       MOVE    D,1(AB)         ; GET EVENT\r
+       SKIPN   D,IHNDLR+1(D)   ; GET FIRST HANDLER\r
+       JRST    BADHND\r
+       CAMN    D,B             ; IS THIS IT?\r
+       JRST    HFINIS          ; YES, ALREADY "HANDLED"\r
+       MOVE    D,INXT+1(D)     ; GO TO NEXT HANDLER\r
+       JUMPN   D,.-3\r
+BADHND:        PUSH    TP,$TATOM\r
+       PUSH    TP,EQUOTE HANDLER-ALREADY-IN-USE\r
+       JRST    CALER1\r
+\r
+CHEVNT:        CAIG    0,-7            ; SKIP IF LESS THAN 4\r
+       JRST    TMA\r
+       PUSH    TP,$TPVP                ; SLOT FOR PROCESS\r
+       PUSH    TP,[0]\r
+       CAIE    0,-6            ; IF 3, LOOK FOR PROC\r
+       JRST    NOPROC\r
+       GETYP   0,4(AB)\r
+       CAIE    0,TPVP\r
+       JRST    WTYP3\r
+       MOVE    0,5(AB)\r
+       MOVEM   0,(TP)\r
+\r
+NOPROC:        PUSHJ   P,APLQ\r
+       JRST    NAPT\r
+       PUSHJ   P,MHAND         ; MAKE THE HANDLER\r
+       MOVE    0,1(TB)         ; GET PROCESS\r
+       MOVEM   0,INTPRO+1(B)   ; AND PUT IT INTO HANDLER\r
+       MOVSI   0,TPVP          ; SET UP TYPE\r
+       MOVEM   0,INTPRO(B)\r
+       MOVE    0,2(AB)         ; SET UP FUNCTION\r
+       MOVEM   0,INTFCN(B)\r
+       MOVE    0,3(AB)\r
+       MOVEM   0,INTFCN+1(B)\r
+\r
+HNDOK: MOVE    D,1(AB)         ; PICK UP EVEENT\r
+       MOVE    E,IHNDLR+1(D)   ; GET POINTER TO HANDLERS\r
+       MOVEM   B,IHNDLR+1(D)   ; PUT NEW ONE IN\r
+       MOVSI   0,TINTH         ; GET INT HDR TYPE\r
+       MOVEM   0,IPREV(B)      ; INTO BACK POINTER\r
+       MOVEM   D,IPREV+1(B)    ; AND POINTER ITSELF\r
+       MOVEM   E,INXT+1(B)     ; NOW NEXT POINTER\r
+       MOVSI   0,THAND         ; NOW HANDLER TYPE\r
+       MOVEM   0,IHNDLR(D)     ; SET TYPE IN HEADER\r
+       MOVEM   0,INXT(B)\r
+       JUMPE   E,HFINIS        ; JUMP IF HEADER WAS EMPTY\r
+       MOVEM   0,IPREV(E)      ; FIX UP ITS PREV\r
+       MOVEM   B,IPREV+1(E)\r
+HFINIS:        MOVSI   A,THAND\r
+       JRST    FINIS\r
+\r
+\f\r
+\r
+; FUNCTIONS TO SET TIME LIMITS FOR REALTIME AND RUNTIME INTS\r
+\r
+MFUNCTION RUNTIMER,SUBR\r
+\r
+       ENTRY   1\r
+\r
+       GETYP   0,(AB)\r
+       JFCL    10,.+1\r
+       MOVE    A,1(AB)\r
+       CAIE    0,TFIX\r
+       JRST    RUNT1\r
+       IMUL    A,[245761.]\r
+       JRST    RUNT2\r
+\r
+RUNT1: CAIE    0,TFLOAT\r
+       JRST    WTYP1\r
+       FMPR    A,[245760.62]\r
+       MULI    A,400           ; FIX IT\r
+       TSC     A,A\r
+       ASH     B,(A)-243\r
+       MOVE    A,B\r
+RUNT2: JUMPL   A,OUTRNG        ; NOT FOR NEG #\r
+       JFCL    10,OUTRNG\r
+       .SUSET  [.SRTMR,,A]\r
+       MOVE    A,(AB)\r
+       MOVE    B,1(AB)\r
+       JRST    FINIS\r
+\r
+MFUNCTION REALTIMER,SUBR\r
+\r
+       ENTRY   1\r
+\r
+       JFCL    10,.+1\r
+       GETYP   0,(AB)\r
+       MOVE    A,1(AB)\r
+       CAIE    0,TFIX\r
+       JRST    REALT1\r
+       IMULI   A,60.   ; TO 60THS OF SEC\r
+       JRST    REALT2\r
+\r
+REALT1:        CAIE    0,TFLOAT\r
+       JRST    WTYP1\r
+       FMPRI   A,(60.0)\r
+       MULI    A,400\r
+       TSC     A,A\r
+       ASH     B,(A)-243\r
+       MOVE    A,B\r
+\r
+REALT2:        JUMPL   A,OUTRNG\r
+       JFCL    10,OUTRNG\r
+       MOVE    B,[200000,,A]\r
+       .REALT  B,\r
+       JFCL\r
+       MOVE    A,(AB)\r
+       MOVE    B,1(AB)\r
+       JRST    FINIS\r
+\r
+; FUNCTIONS TO ENABLE AND DISABLE INTERRUPTS\r
+\r
+MFUNCTION %ENABL,SUBR,ENABLE\r
+\r
+       PUSHJ   P,GTEVNT\r
+       SETZM   ISTATE+1(B)\r
+       JRST    FINIS\r
+\r
+MFUNCTION %DISABL,SUBR,DISABLE\r
+\r
+\r
+       PUSHJ   P,GTEVNT\r
+       SETOM   ISTATE+1(B)\r
+       JRST    FINIS\r
+\r
+GTEVNT:        ENTRY   1\r
+       GETYP   0,(AB)\r
+       CAIE    0,TINTH\r
+       JRST    WTYP1\r
+       MOVE    A,(AB)\r
+       MOVE    B,1(AB)\r
+       POPJ    P,\r
+\r
+DO.SPC:        HRRZ    C,INTBL(C)      ; POINT TO SPECIAL CODE\r
+       HLRZ    0,AB            ; - TWO TIMES NUM ARGS\r
+       PUSHJ   P,(C)           ; CALL ROUTINE\r
+       JUMPE   E,CPOPJ         ; NO BITS TO ENABLE, LEAVE\r
+IFE ITS,[\r
+       PUSH    TP,A\r
+       PUSH    TP,B\r
+       MOVE    B,1(TB)         ; CHANNEL\r
+       MOVE    0,CHANNO(B)\r
+       MOVEM   0,(E)           ; SAVE IN TABLE\r
+       MOVEI   E,(E)\r
+       SUBI    E,NETJFN-NETCHN\r
+       MOVE    A,0             ; SETUP FOR MTOPR\r
+       MOVEI   B,24\r
+       MOVSI   C,(E)\r
+       TLO     C,770000        ; DONT SETUP INR/INS\r
+       MTOPR\r
+       MOVEI   0,1\r
+       MOVNS   E\r
+       LSH     0,35.(E)\r
+       IORM    0,MASK1\r
+       MOVE    B,MASK1\r
+       MOVEI   A,MFORK\r
+       AIC\r
+       \r
+       POP     TP,B\r
+       POP     TP,A\r
+       POPJ    P,              ; ***** TEMP ******\r
+]\r
+IFN ITS,[\r
+       CAILE   E,35.           ; SKIP IF 1ST WORD BIT\r
+       JRST    SETW2\r
+       LSH     0,-1(E)\r
+\r
+       IORM    0,MASK1         ; STORE IN PROTOTYPE MASK\r
+       .SUSET  [.SMASK,,MASK1]\r
+       POPJ    P,\r
+\r
+SETW2: LSH     0,-36.(E)\r
+       IORM    0,MASK2         ; SET UP PROTO MASK2\r
+       .SUSET  [.SMSK2,,MASK2]\r
+       POPJ    P,\r
+]\r
+\r
+; ROUTINE TO CHECK FOR CHANNEL OR LOCATIVE\r
+\r
+CHNORL:        GETYP   A,(B)           ; GET TYPE\r
+       CAIN    A,TCHAN         ; IF CHANNEL\r
+       JRST    CHNWIN\r
+       PUSH    P,0\r
+       PUSHJ   P,LOCQ          ; ELSE LOOCATIVE\r
+       JRST    WRONGT\r
+       POP     P,0\r
+CHNWIN:        PUSH    TP,(B)\r
+       PUSH    TP,1(B)\r
+       POPJ    P,\r
+\f\r
+; SUBROUTINE TO FIND A HANDLER OF A GIVEN NAME\r
+\r
+FNDINT:        PUSHJ   P,FNDNM\r
+       JUMPE   B,CPOPJ\r
+       PUSHJ   P,SPEC1         ; COULD BE FUNNY\r
+\r
+INTASO:        PUSH    P,C             ; C<0 IF SPECIAL\r
+       PUSH    TP,A\r
+       PUSH    TP,B\r
+       MOVSI   C,TATOM\r
+       SKIPN   D               ; COULD BE CHANGED FOR MONITOR\r
+       MOVE    D,MQUOTE INTERRUPT\r
+       PUSH    TP,C\r
+       PUSH    TP,D\r
+       PUSHJ   P,IGET\r
+       MOVE    D,(TP)\r
+       SUB     TP,[2,,2]\r
+       POP     P,C             ; AND RESTOR SPECIAL INDICATOR\r
+       SKIPE   B               ; IF FOUND\r
+       SUB     TP,[2,,2]       ; REMOVE CRUFT\r
+CPOPJ: POPJ    P,              ; AND RETURN\r
+\r
+; CHECK FOR SPECIAL INTERNAL INTERRUPT HACK\r
+\r
+SPEC1: MOVSI   C,-SPECLN       ; BUILD AOBJN PNTR\r
+SPCLOP:        CAME    B,@SPECIN(C)    ; SKIP IF SPECIAL\r
+       AOBJN   C,.-1           ; UNTIL EXHAUSTED\r
+       JUMPGE  C,.+3\r
+       SKIPE   E,FNDTBL(C)\r
+       JRST    (E)\r
+       MOVEI   0,-1(TB)        ; SEE IF OK\r
+       CAIE    0,(TP)\r
+       JRST    TMA\r
+       POPJ    P,\r
+\r
+; ROUTINE TO CREATE A NEW INTERRUPT (INTERNAL ONLY--NOT ITS FLAVOR)\r
+\r
+MAKINT:        JUMPN   C,GOTATM        ; ALREADY HAVE NAME, GET THING\r
+       MOVEI   B,(AB)          ; POINT TO STRING\r
+       PUSHJ   P,CSTAK         ; CHARS TO STAKC\r
+       MOVE    B,INTOBL+1(TVP)\r
+       PUSHJ   P,INSRTX\r
+       MOVE    D,MQUOTE INTERRUPT\r
+GOTATM:        PUSH    TP,$TINTH       ; MAKE SLOT FOR HEADER BLOCK\r
+       PUSH    TP,[0]\r
+       PUSH    TP,A\r
+       PUSH    TP,B            ; SAVE ATOM\r
+       PUSH    TP,$TATOM\r
+       PUSH    TP,D\r
+       MOVEI   A,IHDRLN*2\r
+       PUSHJ   P,GIBLOK\r
+       MOVE    A,-3(TP)                ; GET NAME AND STORE SAME\r
+       MOVEM   A,INAME(B)\r
+       MOVE    A,-2(TP)\r
+       MOVEM   A,INAME+1(B)\r
+       SETZM   ISTATE+1(B)\r
+       MOVEM   B,-4(TP)        ; STASH HEADER\r
+       POP     TP,D\r
+       POP     TP,C\r
+       EXCH    B,(TP)\r
+       MOVSI   A,TINTH\r
+       EXCH    A,-1(TP)        ; INTERNAL PUT CALL\r
+       PUSHJ   P,IPUT\r
+       POP     TP,B\r
+       POP     TP,A\r
+       POPJ    P,\r
+\r
+; FIND NAME OF INTERRUPT\r
+\r
+FNDNM: GETYP   A,(B)           ; TYPE\r
+       CAIE    A,TCHSTR        ; IF STRING\r
+       JRST    FNDATM          ; DONT HAVE ATOM, OTHERWISE DO\r
+       PUSHJ   P,IILOOK\r
+       JRST    .+2\r
+FNDATM:        MOVE    B,1(B)\r
+       SETZB   C,D             ; PREVENT LOSSAGE LATER\r
+       MOVSI   A,TATOM\r
+\r
+; THE NEXT 2 INSTRUCTIONS ARE A KLUDGE TO GET THE RIGHT ERROR ATOM\r
+\r
+       CAMN    B,IMQUOTE ERROR\r
+       MOVE    B,MQUOTE ERROR,ERROR,INTRUP\r
+       POPJ    P,\r
+\r
+IILOOK:        PUSHJ   P,CSTAK         ; PUT CHRS ON STACK\r
+       MOVE    B,INTOBL+1(TVP)\r
+       JRST    ILOOKC  ; LOOK IT UP\r
+\f\r
+; ROUTINE TO MAKE A HANDLER BLOCK\r
+\r
+MHAND: MOVEI   A,IHANDL*2\r
+       JRST    GIBLOK          ; GET BLOCK\r
+\r
+; HERE TO GET CHANNEL FOR "CHAR" INTERRUPT\r
+\r
+GETCHN:        GETYP   0,(TB)          ; GET TYPE\r
+       CAIE    0,TCHAN         ; CHANNL IS WINNER\r
+       JRST    WRONGT\r
+       MOVE    A,(TB)          ; USE THE CHANNEL TO NAME THE INTERRUPT\r
+       MOVE    B,1(TB)\r
+       SKIPN   CHANNO(B)       ; SKIP IF WINNING CHANNEL\r
+       JRST    CBDCHN          ; LOSER\r
+       POPJ    P,\r
+\r
+LOCGET:        GETYP   0,(TB)          ; TYPE\r
+       CAIN    0,TCHAN         ; SKIP IF LOCATIVE\r
+       JRST    WRONGT\r
+       MOVE    D,B\r
+       MOVE    A,(TB)\r
+       MOVE    B,1(TB)         ; GET LOCATIVE\r
+       POPJ    P,\r
+\r
+; FINAL MONITOR SETUP ROUTINES\r
+\r
+S.RMON:        SKIPA   E,[.RDMON,,]\r
+S.WMON:        MOVSI   E,.WRMON\r
+       PUSH    TP,A\r
+       PUSH    TP,B\r
+       HLRM    E,INTPRI(B)     ; SAVE BITS\r
+       MOVEI   B,(TB)          ; POINT TO LOCATIVE\r
+       HRRZ    A,FSAV(TB)\r
+       CAIN    A,OFF\r
+       MOVSI   D,(ANDCAM E,)   ; KILL INST\r
+       CAIN    A,EVENT\r
+       MOVSI   D,(IORM E,)\r
+       PUSHJ   P,SMON          ; GO DO IT\r
+       POP     TP,B\r
+       POP     TP,A\r
+       MOVEI   E,0\r
+       POPJ    P,\r
+\f\r
+\r
+; SPECIAL SETUP ROUTINES FOR INITIAL INTERRUPTS\r
+\r
+IFN ITS,[\r
+S.CHAR:        MOVE    E,1(TB)         ; GET CHANNEL\r
+       MOVE    E,CHANNO(E)\r
+       ADDI    E,36.           ; GET CORRECT MASK BIT\r
+ONEBIT:        MOVEI   0,1             ; BIT FOR INT TO RET\r
+       POPJ    P,\r
+]\r
+IFE ITS,[\r
+S.CHAR:        MOVE    E,1(TB)\r
+       MOVE    0,RDEVIC(E)\r
+       ILDB    0,0             ; 1ST CHAR\r
+       PUSH    P,A\r
+       CAIE    0,"N            ; NET ?\r
+       JRST    S.CHA1\r
+\r
+       MOVEI   A,0\r
+       HRRZ    0,CHANNO(E)\r
+       MOVE    E,[-NNETS,,NETJFN]\r
+       CAMN    0,(E)\r
+       JRST    S.CHA2\r
+       SKIPN   (E)\r
+       MOVE    A,E             ; REMEMBER WHERE\r
+       AOBJN   E,.-5\r
+       TLNN    A,-1    \r
+       FATAL   NO MORE NETWORK\r
+       MOVE    E,A\r
+S.CHA1:        MOVEI   E,0\r
+S.CHA2:        POP     P,A\r
+       POPJ    P,\r
+]\r
+\r
+\r
+; SPECIAL FOR CLOCK\r
+\r
+S.DOWN:        SKIPA   E,[7]\r
+S.CLOK:        MOVEI   E,13.           ; FOR NOW JUST GET BIT #\r
+       JRST    ONEBIT\r
+\r
+S.PAR: MOVEI   E,28.\r
+       JRST    ONEBIT\r
+\r
+; RUNTIME AND REALTIME INTERRUPTS\r
+\r
+S.RUNT:        SKIPA   E,[34.]\r
+S.REAL:        MOVEI   E,35.\r
+       JRST    ONEBIT\r
+\r
+S.IOC: SKIPA   E,[9.]          ; IO CHANNEL ERROR\r
+S.PURE:        MOVEI   E,26.\r
+       JRST    ONEBIT\r
+\r
+; MPV AND ILOPR\r
+\r
+S.MPV: SKIPA   E,[14.]         ; BIT POS\r
+S.ILOP:        MOVEI   E,6\r
+       JRST    ONEBIT\r
+\r
+; HERE TO TURN ALL INFERIOR INTS\r
+\r
+S.INF: MOVEI   E,36.+16.+2     ; START OF BITS\r
+       MOVEI   0,37            ; 8 BITS WORTH\r
+       POPJ    P,\r
+\f\r
+\r
+; HERE TO HANDLE ITS INTERRUPTS\r
+\r
+FHAND: SKIPN   D,EXTINT(B)     ; SKIP IF HANDLERS ARE POSSIBLE\r
+       JRST    DIRQ\r
+       JRST    (D)\r
+\r
+IFN ITS,[\r
+; SPECIAL CHARACTER HANDLERS\r
+\r
+HCHAR: MOVEI   D,CHNL0+1(TVP)\r
+       ADDI    D,(B)           ; POINT TO CHANNEL SLOT\r
+       ADDI    D,(B)\r
+       SKIPN   D,-72.(D)       ; PICK UP CHANNEL\r
+       JRST    IPCGOT          ;WELL, IT GOTTA BEE THE THE IPC THEN\r
+       PUSH    TP,$TCHAN\r
+       PUSH    TP,D\r
+       LDB     0,[600,,STATUS(D)]      ; GET DEVICE CODE\r
+       CAILE   0,2             ; SKIP IF A TTY\r
+       JRST    HNET            ; MAYBE NETWORK CHANNEL\r
+       CAMN    D,TTICHN+1(TVP)\r
+       SKIPN   NOTTY\r
+       JRST    HCHR11\r
+       MOVE    B,D             ; CHAN TO B\r
+       PUSHJ   P,TTYOP2        ; RE-GOBBLE TTY\r
+       MOVE    D,(TP)\r
+HCHR11:        MOVE    D,CHANNO(D)     ; GET ITS CHANNEL\r
+       PUSH    P,D             ; AND SAVE IT\r
+       .CALL   HOWMNY          ; GET # OF CHARS\r
+       MOVEI   B,0             ; IF TTY GONE, NO CHARS\r
+RECHR: ADDI    B,1             ; BUMP BY ONE FOR SOSG\r
+       MOVEM   B,CHNCNT(D)     ; AND SAVE\r
+       IORM    A,PIRQ2         ; LEAVE THE INT ON\r
+\r
+CHRLOO:        MOVE    D,(P)           ; GET CHNNAEL NO.\r
+       SOSG    CHNCNT(D)       ; GET COUNT\r
+       JRST    CHRDON\r
+\r
+       MOVE    B,(TP)\r
+       MOVE    D,BUFRIN(B)     ; GET EXTRA BUFFER\r
+       XCT     IOIN2(D)        ; READ CHAR\r
+       PUSH    TP,$TCHSTR\r
+       PUSH    TP,CHQUOTE CHAR\r
+       PUSH    TP,$TCHRS       ; SAVE CHAR FOR CALL    \r
+       PUSH    TP,A\r
+       PUSH    TP,$TCHAN       ; SAVE CHANNEL\r
+       PUSH    TP,B\r
+       PUSHJ   P,INCHAR        ; PUT CHAR IN USERS BUFFER\r
+       MCALL   3,INTERRUPT     ; RUN THE HANDLERS\r
+       JRST    CHRLOO          ; AND LOOP\r
+\r
+CHRDON:        .CALL   HOWMNY\r
+       MOVEI   B,0\r
+       MOVEI   A,1             ; SET FOR PI WORD CLOBBER\r
+       LSH     A,(D)\r
+       JUMPG   B,RECHR         ; ANY MORE?\r
+       ANDCAM  A,PIRQ2\r
+       SUB     P,[1,,1]\r
+       SUB     TP,[2,,2]\r
+       JRST    DIRQ\r
+\r
+\r
+\f\r
+; HERE FOR NET CHANNEL INTERRUPT\r
+\r
+HNET:  CAIE    0,26            ; NETWORK?\r
+       JRST    HSTYET          ; HANDLE PSEUDO TTY ETC.\r
+       PUSH    TP,$TATOM\r
+       PUSH    TP,MQUOTE CHAR,CHAR,INTRUP\r
+       PUSH    TP,$TUVEC\r
+       PUSH    TP,BUFRIN(D)\r
+       PUSH    TP,$TCHAN\r
+       PUSH    TP,D\r
+       MOVE    B,D             ; CHAN TO B\r
+       PUSHJ   P,INSTAT        ; UPDATE THE NETWRK STATE\r
+       MCALL   3,INTERRUPT\r
+       SUB     TP,[2,,2]\r
+       JRST    DIRQ\r
+\r
+HSTYET:        PUSH    TP,$TATOM\r
+       PUSH    TP,MQUOTE CHAR,CHAR,INTRUP\r
+       PUSH    TP,$TCHAN\r
+       PUSH    TP,D\r
+       MCALL   2,INTERRUPT\r
+       SUB     TP,[2,,2]\r
+       JRST    DIRQ\r
+\r
+]\r
+CBDCHN:        PUSH    TP,$TATOM\r
+       PUSH    TP,EQUOTE BAD-CHANNEL\r
+       JRST    CALER1\r
+\r
+IFN ITS,[\r
+\r
+HCLOCK:        PUSH    TP,$TCHSTR\r
+       PUSH    TP,CHQUOTE CLOCK\r
+       MCALL   1,INTERRUPT\r
+       JRST    DIRQ\r
+\r
+HRUNT: PUSH    TP,$TATOM\r
+       PUSH    TP,MQUOTE RUNT,RUNT,INTRUP\r
+       MCALL   1,INTERRUPT\r
+       JRST    DIRQ\r
+\r
+HREAL: PUSH    TP,$TATOM\r
+       PUSH    TP,MQUOTE REALT,REALT,INTRUP\r
+       MCALL   1,INTERRUPT\r
+       JRST    DIRQ\r
+\r
+HPAR:  MOVE    A,MQUOTE PARITY,PARITY,INTRUP\r
+       JRST    HMPV1\r
+\r
+HMPV:  MOVE    A,MQUOTE MPV,MPV,INTRUP\r
+       JRST    HMPV1\r
+\r
+HILOPR:        MOVE    A,MQUOTE ILOPR,ILOPR,INTRUP\r
+       JRST    HMPV1\r
+\r
+HPURE: MOVE    A,MQUOTE PURE,PURE,INTRUP\r
+HMPV1: PUSH    TP,$TATOM\r
+       PUSH    TP,A\r
+       PUSH    P,LCKINT        ; SAVE LOCN\r
+       PUSH    TP,$TATOM\r
+       PUSH    TP,A\r
+       PUSH    TP,$TWORD\r
+       PUSH    TP,LCKINT\r
+       MCALL   2,EMERGENCY\r
+       POP     P,A\r
+       MOVE    C,(TP)\r
+       SUB     TP,[2,,2]\r
+       JUMPN   B,DIRQ\r
+\r
+       PUSH    TP,$TATOM\r
+       PUSH    TP,EQUOTE DANGEROUS-INTERRUPT-NOT-HANDLED\r
+       PUSH    TP,$TATOM\r
+       PUSH    TP,C\r
+       PUSH    TP,$TWORD\r
+       PUSH    TP,A\r
+       MCALL   3,ERROR\r
+       JRST    DIRQ\r
+\r
+\f\r
+\r
+; HERE TO HANDLE SYS DOWN INTERRUPT\r
+\r
+HDOWN: PUSH    TP,$TATOM\r
+       PUSH    TP,MQUOTE SYSDOWN,SYSDOWN,INTRUP\r
+       .DIETI  A,              ; HOW LONG?\r
+       PUSH    TP,$TFIX\r
+       PUSH    TP,A\r
+       PUSH    P,A             ; FOR MESSAGE\r
+       MCALL   2,INTERRUPT\r
+       POP     P,A\r
+       JUMPN   B,DIRQ\r
+       .SUSET  [.RTTY,,B]      ; DO WE NOW HAVE A TTY AT ALL?\r
+       JUMPL   B,DIRQ          ; DONT HANG AROUND\r
+       PUSH    P,A\r
+       MOVEI   B,[ASCIZ /\r
+Excuse me, SYSTEM going down in /]\r
+       SKIPG   (P)             ; SKIP IF REALLY GOING DOWN\r
+       MOVEI   B,[ASCIZ /\r
+Excuse me, SYSTEM has been REVIVED!\r
+/]\r
+       PUSHJ   P,MSGTYP\r
+       POP     P,B\r
+       JUMPE   B,DIRQ\r
+       IDIVI   B,30.           ; TO SECONDS\r
+       IDIVI   B,60.           ; A/ SECONDS B/ MINUTES\r
+       JUMPE   B,NOMIN\r
+       PUSH    P,C\r
+       PUSHJ   P,DECOUT\r
+       MOVEI   B,[ASCIZ / minutes /]\r
+       PUSHJ   P,MSGTYP\r
+       POP     P,B\r
+       JRST    .+2\r
+NOMIN: MOVEI   B,(C)\r
+       PUSHJ   P,DECOUT\r
+       MOVEI   B,[ASCIZ / seconds.\r
+/]\r
+       PUSHJ   P,MSGTYP\r
+       JRST    DIRQ\r
+\r
+; TWO DIGIT DEC OUT FROM B/\r
+\r
+DECOUT:        IDIVI   B,10.\r
+       JUMPE   B,DECOU1        ; NO TEN\r
+       MOVEI   A,60(B)\r
+       PUSHJ   P,MTYO\r
+DECOU1:        MOVEI   A,60(C)\r
+       JRST    MTYO\r
+\f\r
+; HERE TO HANDLE I/O CHANNEL ERRORS\r
+\r
+HIOC:  .SUSET  [.RAPRC,,A]     ; CONTAINS CHANNEL OF MOST RECENT LOSSAGE\r
+       LDB     A,[330400,,A]   ; GET CHAN #\r
+       MOVEI   C,(A)           ; COPY\r
+       PUSH    TP,$TATOM       ; PUSH ERROR\r
+       PUSH    TP,EQUOTE FILE-SYSTEM-ERROR\r
+\r
+       PUSH    TP,$TCHAN       \r
+       ASH     C,1             ; GET CHANNEL\r
+       ADDI    C,CHNL0+1(TVP)  ; GET CHANNEL VECTOR\r
+       PUSH    TP,(C)\r
+       LSH     A,23.           ; DO A .STATUS\r
+       IOR     A,[.STATUS A]\r
+       XCT     A\r
+       PUSHJ   P,GFALS         ; GEN NAMED FALSE\r
+       PUSH    TP,A\r
+       PUSH    TP,B\r
+       PUSH    TP,$TATOM\r
+       PUSH    TP,MQUOTE IOC,IOC,INTRUP\r
+\r
+       PUSH    TP,A\r
+       PUSH    TP,B\r
+       PUSH    TP,-7(TP)\r
+       PUSH    TP,-7(TP)\r
+       MCALL   3,EMERGENCY\r
+       JUMPN   B,DIRQ1         ; JUMP IF HANDLED\r
+       MCALL   3,ERROR\r
+       JRST    DIRQ\r
+\r
+DIRQ1: SUB     TP,[6,,6]\r
+       JRST    DIRQ\r
+\r
+; HANDLE INFERIOR KNOCKING AT THE DOOR\r
+\r
+HINF:  SUBI    B,36.+16.+2     ; CONVERT TO INF #\r
+       PUSH    TP,$TATOM\r
+       PUSH    TP,MQUOTE INFERIOR,INFERIOR,INTRUP\r
+       PUSH    TP,$TFIX\r
+       PUSH    TP,B\r
+       MCALL   2,INTERRUPT\r
+       JRST    DIRQ\r
+]\f\r
+IFE ITS,[\r
+\r
+; HERE FOR TENEX INTS (FIRST CUT)\r
+\r
+HCNTLG:        MOVEI   A,7\r
+       JRST    HCNGS\r
+\r
+HCNTLS:        MOVEI   A,23\r
+\r
+HCNGS: PUSH    TP,$TATOM\r
+       PUSH    TP,MQUOTE CHAR,CHAR,INTRUP\r
+       PUSH    TP,$TCHRS\r
+       PUSH    TP,A\r
+       PUSH    TP,$TCHAN\r
+       PUSH    TP,TTICHN+1(TVP)\r
+       MCALL   3,INTERRUPT\r
+       JRST    DIRQ\r
+\r
+HNET:  MOVE    A,NETJFN-NINT+NNETS(B)\r
+       JUMPE   A,DIRQ\r
+       ASH     A,1\r
+       ADDI    A,CHNL0+1(TVP)\r
+       MOVE    B,(A)\r
+       PUSH    TP,$TATOM\r
+       PUSH    TP,MQUOTE CHAR,CHAR,INTRUP\r
+       PUSH    TP,$TUVEC\r
+       PUSH    TP,BUFRIN(B)\r
+       PUSH    TP,$TCHAN\r
+       PUSH    TP,B\r
+       PUSHJ   P,INSTAT\r
+       MCALL   3,INTERRUPT\r
+       JRST    DIRQ\r
+]\r
+\r
+\f\r
+MFUNCTION OFF,SUBR\r
+       ENTRY\r
+\r
+       JUMPGE  AB,TFA\r
+       HLRZ    0,AB\r
+       GETYP   A,(AB)          ; ARG TYPE\r
+       MOVE    B,1(AB)         ; AND VALUE\r
+       CAIN    A,TINTH         ; HEADER, GO HACK\r
+       JRST    OFFHD           ; QUEEN OF HEARTS\r
+       CAIN    A,TATOM\r
+       JRST    .+3\r
+       CAIE    A,TCHSTR\r
+       JRST    TRYHAN          ; MAYBE INDIVIDUAL HANDLER\r
+       CAIN    0,-2            ; MORE THAN 1 ARG?\r
+       JRST    OFFAC1          ; NO, GO ON\r
+       CAIG    0,-5            ; CANT BE MORE THAN 2\r
+       JRST    TMA\r
+       MOVEI   B,2(AB)         ; POINT TO 2D\r
+       PUSHJ   P,CHNORL\r
+OFFAC1:        MOVEI   B,(AB)\r
+       PUSHJ   P,FNDINT\r
+       JUMPGE  B,NOHAN1        ; NOT HANDLED\r
+\r
+OFFH1: PUSH    P,C             ; SAVE C FOR BIT CLOBBER\r
+       MOVSI   C,TATOM\r
+       SKIPN   D\r
+       MOVE    D,MQUOTE INTERRUPT\r
+       MOVE    A,INAME(B)\r
+       MOVE    B,INAME+1(B)\r
+       PUSHJ   P,IREMAS\r
+       SKIPE   B               ; IF NO ASSOC, DONT SMASH\r
+       SETOM   ISTATE+1(B)     ; DISABLE IN CASE QUEUED\r
+       POP     P,C             ; SPECIAL?\r
+       JUMPGE  C,FINIS         ;  NO, DONE\r
+\r
+       HRRZ    C,INTBL(C)      ; POINT TO SPECIAL CODE\r
+       PUSHJ   P,(C)           ; GO TO SAME\r
+       JUMPE   E,OFINIS        ; DONE\r
+IFN ITS,[\r
+       CAILE   E,35.           ; SKIP IF 1ST WORD\r
+       JRST    CLRW2           ; CLOBBER 2D WORD BIT\r
+       LSH     0,-1(E)         ; POSITION BIT\r
+       ANDCAM  0,MASK1         ; KILL BIT\r
+       .SUSET  [.SMASK,,MASK1]\r
+]\r
+IFE ITS,[\r
+       MOVE    D,B\r
+       SETZM   (E)\r
+       MOVEI   E,(E)\r
+       SUBI    E,NETJFN-NETCHN\r
+       MOVEI   0,1\r
+       MOVNS   E\r
+       LSH     0,35.(E)\r
+       ANDCAM  0,MASK1\r
+       MOVEI   A,MFORK\r
+       SETCM   B,MASK1\r
+       DIC\r
+       ANDCAM  0,PIRQ          ; JUST IN CASE\r
+       MOVE    B,D\r
+]\r
+OFINIS:        MOVSI   A,TINTH\r
+       JRST    FINIS\r
+\r
+IFN ITS,[\r
+CLRW2: LSH     0,-36.(E)       ; POS BIT FOR 2D WORD\r
+       ANDCAM  0,MASK2\r
+       .SUSET  [.SMSK2,,MASK2]\r
+       JRST    OFINIS\r
+]\r
+\r
+TRYHAN:        CAIE    A,THAND         ; HANDLER?\r
+       JRST    WTYP1\r
+       CAIE    0,-2\r
+       JRST    TMA\r
+       GETYP   0,IPREV(B)      ; GET TYPE OF PREV\r
+       MOVE    A,INXT+1(B)\r
+       MOVE    C,IPREV+1(B)\r
+       MOVE    D,IPREV(B)\r
+       CAIE    0,THAND\r
+       JRST    DOHEAD          ; PREV HUST BE HDR\r
+       MOVEM   A,INXT+1(C)\r
+       JRST    .+2\r
+DOHEAD:        MOVEM   A,IHNDLR+1(C)   ; INTO HDR\r
+       JUMPE   A,OFFINI\r
+       MOVEM   D,IPREV(A)\r
+       MOVEM   C,IPREV+1(A)\r
+OFFINI:        SETZM   IPREV+1(B)\r
+       SETZM   INXT+1(B)\r
+       MOVSI   A,THAND\r
+       JRST    FINIS\r
+\r
+OFFHD: CAIE    0,-2\r
+       JRST    TMA\r
+       PUSHJ   P,GETNMS                ; GET INFOR ABOUT INT\r
+       JUMPE   C,OFFH1\r
+       PUSH    TP,INAME(B)\r
+       PUSH    TP,INAME+1(B)\r
+       JRST    OFFH1\r
+\r
+GETNMS:        GETYP   A,INAME(B)      ; CHECK FOR SPECIAL\r
+       SETZB   C,D\r
+       CAIN    A,TCHAN\r
+       HRROI   C,SS.CHA\r
+       PUSHJ   P,LOCQ          ; LOCATIVE?\r
+       JRST    CHGTNM\r
+\r
+       MOVEI   B,INAME(B)      ; POINT TO LOCATIVE\r
+       MOVSI   D,(MOVE E,)\r
+       PUSHJ   P,SMON          ; GET MONITOR\r
+       MOVE    B,1(AB)\r
+GETNM1:        HRROI   C,SS.WMO        ; ASSUME WRITE\r
+       TLNN    E,.WRMON\r
+       HRROI   C,SS.RMO\r
+       MOVE    D,MQUOTE WRITE,WRITE,INTRUP\r
+       TLNN    E,.WRMON\r
+       MOVE    D,MQUOTE READ,READ,INTRUP\r
+       POPJ    P,\r
+\r
+CHGTNM:        JUMPL   C,CPOPJ\r
+       MOVE    B,INAME+1(B)\r
+       PUSHJ   P,SPEC1\r
+       MOVE    B,1(AB)         ; RESTORE IHEADER\r
+       POPJ    P,\r
+\f\r
+; EMERGENCY, CANT DEFER ME!!\r
+\r
+MQUOTE INTERRUPT\r
+\r
+EMERGENCY:\r
+       PUSH    P,.\r
+       JRST    INTERR+1\r
+\r
+MFUNCTION INTERRUPT,SUBR\r
+\r
+       PUSH    P,[0]\r
+\r
+       ENTRY\r
+\r
+       SETZM   INTHLD          ; RE-ENABLE THE WORLD\r
+       JUMPGE  AB,TFA\r
+       MOVE    B,1(AB)         ; GET HANDLER/NAME\r
+       GETYP   A,(AB)          ; CAN BE HEADER OR NAME\r
+       CAIN    A,TINTH         ; SKIP IF NOT HEADER\r
+       JRST    GTHEAD\r
+       CAIN    A,TATOM\r
+       JRST    .+3\r
+       CAIE    A,TCHSTR        ; SKIP IF CHAR STRING\r
+       JRST    WTYP1\r
+       MOVEI   B,(AB)          ; LOOK UP NAME\r
+       PUSHJ   P,FNDNM         ; GET NAME\r
+       JUMPE   B,IFALSE\r
+       MOVEI   D,0\r
+       CAMN    B,MQUOTE CHAR,CHAR,INTRUP\r
+       PUSHJ   P,CHNGT1\r
+       CAME    B,MQUOTE READ,READ,INTRUP\r
+       CAMN    B,MQUOTE WRITE,WRITE,INTRUP\r
+       PUSHJ   P,GTLOC1\r
+       PUSHJ   P,INTASO\r
+       JUMPE   B,IFALSE\r
+\r
+GTHEAD:        SKIPE   ISTATE+1(B)     ; ENABLED?\r
+       JRST    IFALSE          ; IGNORE COMPLETELY\r
+       MOVE    A,INTPRI+1(B)   ; GET PRIORITY OF INTERRUPT\r
+       CAMLE   A,CURPRI        ; SEE IF MUST QUEU\r
+       JRST    SETPRI          ; MAY RUN NOW\r
+       SKIPE   (P)             ; SKIP IF DEFER OK\r
+       JRST    DEFERR\r
+       MOVEM   A,(P)\r
+       PUSH    TP,$TINTH       ; SAVE HEADER\r
+       PUSH    TP,B\r
+       MOVEI   A,1             ; SAVE OTHER ARGS\r
+PSHARG:        ADD     AB,[2,,2]\r
+       JUMPGE  AB,QUEU1        ; GO MAKE QUEU ENTRY\r
+       PUSH    TP,(AB)\r
+       PUSH    TP,1(AB)\r
+       AOJA    A,PSHARG\r
+QUEU1: PUSHJ   P,IEVECT        ; GET VECTOR\r
+       PUSH    TP,$TVEC\r
+       PUSH    TP,[0]          ; WILL HOLD QUEUE HEADER\r
+       PUSH    TP,A\r
+       PUSH    TP,B\r
+\r
+       POP     P,A             ; RESTORE PRIORITY\r
+\r
+       MOVE    B,QUEUES+1(TVP) ; GET INTERRUPT QUEUES\r
+       MOVEI   D,0\r
+       JUMPGE  B,GQUEU         ; MAKE A QUEUE HDR\r
+\r
+NXTQU: CAMN    A,1(B)          ; GOT PRIORITY?\r
+       JRST    ADDQU           ; YES, ADD TO THE QUEU\r
+       CAMG    A,1(B)          ; SKIP IF SPOT NOT FOUND\r
+       JRST    GQUEU\r
+       MOVE    D,B\r
+       MOVE    B,3(B)          ; GO TO NXT QUEUE\r
+       JUMPL   B,NXTQU\r
+\r
+GQUEU: PUSH    TP,$TVEC        ; SAVE NEXT POINTER\r
+       PUSH    TP,D\r
+       PUSH    TP,$TFIX\r
+       PUSH    TP,A            ; SAVE PRIORITY\r
+       PUSH    TP,$TVEC\r
+       PUSH    TP,B\r
+       PUSH    TP,$TLIST\r
+       PUSH    TP,[0]\r
+       PUSH    TP,$TLIST\r
+       PUSH    TP,[0]\r
+       MOVEI   A,4\r
+       PUSHJ   P,IEVECT\r
+       MOVE    D,(TP)          ; NOW SPLICE\r
+       SUB     TP,[2,,2]\r
+       JUMPN   D,GQUEU1\r
+       MOVEM   B,QUEUES+1(TVP)\r
+       JRST    .+2\r
+GQUEU1:        MOVEM   B,3(D)\r
+\r
+ADDQU: MOVEM   B,-2(TP)        ; SAVE QUEU HDR\r
+       POP     TP,D\r
+       POP     TP,C\r
+       PUSHJ   P,INCONS        ; CONS IT\r
+       MOVE    C,(TP)          ;GET QUEUE HEADER\r
+       SKIPE   D,7(C)          ; IF END EXISTS\r
+       HRRM    B,(D)           ; SPLICE\r
+       MOVEM   B,7(C)\r
+       SKIPN   5(C)            ; SKIP IF START EXISTS\r
+       MOVEM   B,5(C)\r
+\r
+IFINI: MOVSI   A,TATOM\r
+       MOVE    B,MQUOTE T\r
+       JRST    FINIS\r
+\r
+SETPRI:        EXCH    A,CURPRI\r
+       MOVEM   A,(P)\r
+\r
+       PUSH    TP,$TAB         ; PASS AB TO HANDLERS\r
+       PUSH    TP,AB\r
+\r
+       PUSHJ   P,RUNINT        ; RUN THE HANDLERS\r
+       POP     P,A             ; UNQUEU ANY WAITERS\r
+       PUSHJ   P,UNQUEU\r
+\r
+       JRST    IFINI\r
+\r
+; HERE TO UNQUEUE WAITING INTERRUPTS\r
+\r
+UNQUEU:        PUSH    P,A             ; SAVE NEW LEVEL\r
+\r
+UNQUE1:        MOVE    A,(P)           ; TARGET LEVEL\r
+       CAMLE   A,CURPRI        ; CHECK RUG NOT PULLED OUT\r
+       JRST    UNDONE\r
+       SKIPE   B,QUEUES+1(TVP)\r
+       CAML    A,1(B)          ; RIGHT LEVEL?\r
+       JRST    UNDONE          ; FINISHED\r
+\r
+       SKIPN   C,5(B)          ; ON QUEUEU?\r
+       JRST    UNXQ\r
+       HRRZ    D,(C)           ; CDR THE LIST\r
+       MOVEM   D,5(B)\r
+       SKIPN   D               ; SKIP IF NOT LAST\r
+       SETZM   7(B)            ; CLOBBER END POINTER\r
+       MOVE    A,1(B)          ; GET THIS PRIORITY LEVEL\r
+       MOVEM   A,CURPRI        ; MAKE IT THE CURRENT ONE\r
+       MOVE    D,1(C)          ; GET SAVED VECTOR OF INF\r
+\r
+       MOVE    B,1(D)          ; INT HEADER\r
+       PUSH    TP,$TVEC\r
+       PUSH    TP,D            ; AND ARGS\r
+\r
+       PUSHJ   P,RUNINT        ; RUN THEM\r
+       JRST    UNQUE1\r
+\r
+UNDONE:        POP     P,CURPRI        ; SET CURRENT LEVEL\r
+       MOVE    A,CURPRI\r
+       POPJ    P,\r
+\r
+UNXQ:  MOVE    B,3(B)          ; GO  TO NEXT QUEUE\r
+       MOVEM   B,QUEUES+1(TVP)\r
+       JRST    UNQUE1\r
+\r
+\r
+\r
+; SUBR TO CHANGE INTERRUPT LEVEL\r
+\r
+MFUNCTION INTLEV,SUBR,[INT-LEVEL]\r
+       ENTRY\r
+       JUMPGE  AB,RETLEV       ; JUST RETURN CURRENT\r
+       GETYP   A,(AB)\r
+       CAIE    A,TFIX\r
+       JRST    WTYP1           ; LEVEL IS FIXED\r
+       SKIPGE  A,1(AB)\r
+       JRST    OUTRNG"\r
+       CAMN    A,CURPRI        ; DIFFERENT?\r
+       JRST    RETLEV          ; NO RETURN\r
+       PUSH    P,CURPRI\r
+       CAMG    A,CURPRI        ; SKIP IF NO UNQUEUE NEEDED\r
+       PUSHJ   P,UNQUEU\r
+       MOVEM   A,CURPRI        ; SAVE\r
+       POP     P,A\r
+       SKIPA   B,A\r
+RETLEV:        MOVE    B,CURPRI\r
+       MOVSI   A,TFIX\r
+       JRST    FINIS\r
+\r
+RUNINT:        PUSH    TP,$THAND       ; SAVE HANDLERS LIST\r
+       PUSH    TP,IHNDLR+1(B)\r
+\r
+       SKIPN   ISTATE+1(B)     ; SKIP IF DISABLED\r
+       SKIPN   B,(TP)\r
+       JRST    SUBTP4\r
+NXHND: MOVEM   B,(TP)          ; SAVE CURRENT HDR\r
+       MOVE    A,-2(TP)                ; SAVE ARG POINTER\r
+       PUSHJ   P,CHSWAP        ; SEE IF MUST SWAP\r
+       PUSH    TP,[0]\r
+       PUSH    TP,[0]\r
+       MOVEI   C,1             ; COUNT ARGS\r
+       PUSH    TP,$TSP\r
+       PUSH    TP,SP\r
+       MOVE    D,PVP\r
+       ADD     D,[1STEPR,,1STEPR]\r
+       PUSH    TP,BNDV\r
+       PUSH    TP,D\r
+       PUSH    TP,$TPVP\r
+       PUSH    TP,[0]\r
+       MOVE    E,TP\r
+       PUSH    TP,INTFCN(B)\r
+       PUSH    TP,INTFCN+1(B)\r
+       ADD     A,[2,,2]\r
+       JUMPGE  A,DO.HND\r
+       PUSH    TP,(A)\r
+       PUSH    TP,1(A)\r
+       AOJA    C,.-4\r
+DO.HND:        PUSH    P,C\r
+       PUSHJ   P,SPECBE        ; BIND 1 STEP FLAG\r
+       POP     P,C\r
+       ACALL   C,INTAPL\r
+       MOVE    SP,-4(TP)\r
+       MOVE    C,(TP)          ; RESET 1 STEP\r
+       MOVEM   C,1STEPR+1(PVP)\r
+       SUB     TP,[6,,6]\r
+       PUSHJ   P,CHUNSW\r
+       CAMN    E,PVP\r
+       SUB     TP,[4,,4]       ; NO PROCESS CHANGE, POP JUNK\r
+       CAMN    E,PVP\r
+       JRST    .+4\r
+       MOVE    D,TPSTO+1(E)\r
+       SUB     D,[4,,4]\r
+       MOVEM   D,TPSTO+1(E)    ; FIXUP HIS STACK\r
+DO.H1: GETYP   A,A             ; CHECK FOR A DISMISS\r
+       CAIN    A,TDISMI\r
+       JRST    SUBTP4\r
+       MOVE    B,(TP)          ; TRY FOR NEXT HANDLER\r
+       SKIPE   B,INXT+1(B)\r
+       JRST    NXHND\r
+SUBTP4:        SUB     TP,[4,,4]\r
+       POPJ    P,\r
+\r
+MFUNCTION INTAPL,SUBR,[RUNINT]\r
+       JRST    APPLY\r
+\r
+\r
+NOHAND:        JUMPE   C,NOHAN1\r
+       PUSH    TP,$TATOM\r
+       PUSH    TP,EQUOTE INTERNAL-INTERRUPT\r
+NOHAN1:        PUSH    TP,(AB)\r
+       PUSH    TP,1(AB)\r
+       PUSH    TP,$TATOM\r
+       PUSH    TP,EQUOTE NOT-HANDLED\r
+       SKIPE   A,C\r
+       MOVEI   A,1\r
+       ADDI    A,2\r
+       JRST    CALER\r
+\r
+DEFERR:        PUSH    TP,$TATOM\r
+       PUSH    TP,EQUOTE ATTEMPT-TO-DEFER-UNDEFERABLE-INTERRUPT\r
+       PUSH    TP,$TINTH\r
+       PUSH    TP,B\r
+       PUSH    TP,$TATOM\r
+       PUSH    TP,MQUOTE INTERRUPT\r
+       MCALL   3,RERR          ; FORCE REAL ERROR\r
+       JRST    FINIS\r
+\r
+; FUNCTION TO DISMISS AN INTERRUPT TO AN ARBITRARY ACTIVATION\r
+\r
+MFUNCTION DISMISS,SUBR\r
+\r
+       HLRZ    0,AB\r
+       JUMPGE  AB,TFA\r
+       CAIGE   0,-6\r
+       JRST    TMA\r
+       MOVNI   D,1\r
+       CAIE    0,-6\r
+       JRST    DISMI3\r
+       GETYP   0,4(AB)\r
+       CAIE    0,TFIX\r
+       JRST    WTYP\r
+       SKIPGE  D,5(AB)\r
+       JRST    OUTRNG\r
+\r
+DISMI3:        MOVEI   A,(TB)\r
+\r
+DISMI0:        HRRZ    B,FSAV(A)\r
+       HRRZ    C,PCSAV(A)\r
+       CAIE    B,INTAPL\r
+       JRST    DISMI1\r
+\r
+       MOVE    E,OTBSAV(A)\r
+       MOVEI   0,(A)           ; SAVE FRAME\r
+       MOVEI   A,DISMI2\r
+       HRRM    A,PCSAV(E)      ; GET IT BACK HERE\r
+       MOVE    A,(AB)\r
+       MOVE    B,1(AB)\r
+       MOVE    C,TPSAV(E)\r
+       MOVEM   A,-7(C)\r
+       MOVEM   B,-6(C)\r
+       MOVEI   C,0\r
+       CAMGE   AB,[-3,,]\r
+       MOVEI   C,2(AB)\r
+       MOVE    B,0             ; DEST FRAME\r
+       JUMPL   D,.+3\r
+       MOVE    A,PSAV(E)       ; NOW MUNG SAVED INT LEVEL\r
+       MOVEM   D,-1(A)         ; ZAP YOUR MUNGED\r
+       PUSHJ   P,CHUNW         ; CHECK ON UNWINDERS\r
+       JRST    FINIS           ; FALL DOWN\r
+\r
+DISMI1:        MOVEI   E,(A)\r
+       HRRZ    A,OTBSAV(A)\r
+       JUMPN   A,DISMI0\r
+\r
+       MOVE    A,(AB)\r
+       MOVE    B,1(AB)\r
+\r
+       PUSH    TP,A\r
+       PUSH    TP,B\r
+       SKIPGE  A,D\r
+       JRST    .+4\r
+       CAMG    A,CURPRI\r
+       PUSHJ   P,UNQUEU\r
+       MOVEM   A,CURPRI\r
+       CAML    AB,[-3,,]\r
+       JRST    .+5\r
+       PUSH    TP,2(AB)\r
+       PUSH    TP,3(AB)\r
+       MCALL   2,ERRET\r
+       JRST    FINIS\r
+\r
+       POP     TP,B\r
+       POP     TP,A\r
+       JRST    FINIS\r
+\r
+DISMI2:        MOVE    C,(TP)\r
+       MOVEM   C,1STEPR+1(PVP)\r
+       MOVE    SP,-4(TP)\r
+       SUB     TP,[6,,6]\r
+       PUSHJ   P,CHUNSW        ; UNDO ANY PROCESS HACKING\r
+       MOVE    C,TP\r
+       CAME    E,PVP           ; SWAPED?\r
+       MOVE    C,TPSTO+1(E)\r
+       MOVE    D,-1(C)\r
+       MOVE    0,(C)\r
+       SUB     TP,[4,,4]\r
+       SUB     C,[4,,4]        ; MAYBE FIXUP OTHER STACK\r
+       CAME    E,PVP\r
+       MOVEM   C,TPSTO+1(E)\r
+       PUSH    TP,D\r
+       PUSH    TP,0\r
+       PUSH    TP,A\r
+       PUSH    TP,B\r
+       MOVE    A,-1(P)         ; SAVED PRIORITY\r
+       CAMG    A,CURPRI\r
+       PUSHJ   P,UNQUEU\r
+       MOVEM   A,CURPRI\r
+       SKIPN   -1(TP)\r
+       JRST    .+3\r
+       MCALL   2,ERRET\r
+       JRST    FINIS\r
+\r
+       SUB     TP,[4,,4]\r
+       MOVSI   A,TDISMI\r
+       MOVE    B,MQUOTE T\r
+       JRST    DO.H1\r
+       \r
+CHNGT1:        HLRE    B,AB\r
+       SUBM    AB,B\r
+       GETYP   0,-2(B)\r
+       CAIE    0,TCHAN\r
+       JRST    WTYP3\r
+       MOVE    B,-1(B)\r
+       MOVSI   A,TCHAN\r
+       POPJ    P,\r
+\r
+GTLOC1:        GETYP   A,2(AB)\r
+       PUSHJ   P,LOCQ\r
+       JRST    WTYP2\r
+       MOVE    D,B             ; RET ATOM FOR ASSOC\r
+       MOVE    A,2(AB)\r
+       MOVE    B,3(AB)\r
+       POPJ    P,\r
+\f; MONITOR CHECKERS\r
+\r
+MONCH0:        HLLZ    0,(B)           ; POTENTIAL MONITORS\r
+MONCH: TLZ     0,TYPMSK        ; KILL TYPE\r
+       IOR     C,0             ; IN NEW TYPE\r
+       PUSH    P,0\r
+       MOVEI   0,(B)\r
+       CAIL    0,HIBOT\r
+       JRST    PURERR\r
+       POP     P,0\r
+       TLNN    0,.WRMON        ; SKIP IF WRITE MONIT\r
+       POPJ    P,\r
+\r
+; MONITOR IS ON, INVOKE HANDLER\r
+\r
+       PUSH    TP,A            ; SAVE OBJ\r
+       PUSH    TP,B\r
+       PUSH    TP,C\r
+       PUSH    TP,D            ; SAVE DATUM\r
+       MOVSI   C,TATOM         ; PREPARE TO FIND IT\r
+       MOVE    D,MQUOTE WRITE,WRITE,INTRUP\r
+       PUSHJ   P,IGET\r
+       JUMPE   B,MONCH1        ; NOT FOUND IGNORE FOR NOW\r
+       PUSH    TP,A            ; START SETTING UP CALL\r
+       PUSH    TP,B\r
+       PUSH    TP,-5(TP)\r
+       PUSH    TP,-5(TP)\r
+       PUSH    TP,-5(TP)\r
+       PUSH    TP,-5(TP)\r
+       PUSHJ   P,FRMSTK        ; PUT FRAME ON STAKC\r
+       MCALL   4,EMERGE        ; DO IT\r
+MONCH1:        POP     TP,D\r
+       POP     TP,C\r
+       POP     TP,B\r
+       POP     TP,A\r
+       HLLZ    0,(B)           ; UPDATE MONITORS\r
+       TLZ     0,TYPMSK\r
+       IOR     C,0\r
+       POPJ    P,\r
+\r
+; NOW FOR READ MONITORS\r
+\r
+RMONC0:        HLLZ    0,(B)\r
+RMONCH:        TLNN    0,.RDMON\r
+       POPJ    P,\r
+       PUSH    TP,A\r
+       PUSH    TP,B\r
+       MOVSI   C,TATOM\r
+       MOVE    D,MQUOTE READ,READ,INTRUP\r
+       PUSHJ   P,IGET\r
+       JUMPE   B,RMONC1\r
+       PUSH    TP,A\r
+       PUSH    TP,B\r
+       PUSH    TP,-3(TP)\r
+       PUSH    TP,-3(TP)\r
+       PUSHJ   P,FRMSTK        ; PUT FRAME ON STACK\r
+       MCALL   3,EMERGE\r
+RMONC1:        POP     TP,B\r
+       POP     TP,A\r
+       POPJ    P,\r
+\r
+; PUT THE CURRENT FRAME ON THE STACK\r
+\r
+FRMSTK:        PUSHJ   P,MAKACT\r
+       HRLI    A,TFRAME\r
+       PUSH    TP,A\r
+       PUSH    TP,B\r
+       POPJ    P,\r
+\r
+; HERE TO COMPLAIN ABOUT ATTEMPTS TO MUNG PURE CODE\r
+\r
+PURERR:        PUSH    TP,$TATOM\r
+       PUSH    TP,EQUOTE ATTEMPT-TO-MUNG-PURE-STRUCTURE\r
+       PUSH    TP,A\r
+       PUSH    TP,B\r
+       MOVEI   A,2\r
+       JRST    CALER\r
+\f\r
+; PROCESS SWAPPING CODE\r
+\r
+CHSWAP:        MOVE    E,PVP           ; GET CURRENT\r
+       POP     P,0\r
+       SKIPE   D,INTPRO+1(B)   ; SKIP IF NO PROCESS GIVEN\r
+       CAMN    D,PVP           ; SKIP IF DIFFERENT\r
+       JRST    PSHPRO\r
+       \r
+       PUSHJ   P,SWAPIT        ; DO SWAP\r
+\r
+PSHPRO:        PUSH    TP,$TPVP\r
+       PUSH    TP,E\r
+       JRST    @0\r
+\r
+CHUNSW:        MOVE    E,PVP           ; RET OLD PROC\r
+       MOVE    D,-2(TP)        ; GET SAVED PROC\r
+       CAMN    D,PVP           ; SWAPPED?\r
+       POPJ    P,\r
+\r
+SWAPIT:        PUSH    P,0\r
+       MOVE    0,PSTAT+1(D)    ; CHECK STATE\r
+       CAIE    0,RESMBL\r
+       JRST    NOTRES\r
+       MOVEM   0,PSTAT+1(PVP)\r
+       MOVEI   0,RUNING\r
+       MOVEM   0,PSTAT+1(D)    ; SAVE NEW STATE\r
+       POP     P,0\r
+       POP     P,C\r
+       JRST    SWAP"\r
+\f\r
+\r
+;SUBROUTINE TO GET BIT FOR CLOBBERAGE\r
+\r
+GETBIT:        MOVNS   B               ;NEGATE\r
+       MOVSI   A,400000        ;GET THE BIT\r
+       LSH     A,(B)           ;SHIFT TO POSITION\r
+       POPJ    P,              ;AND RETURN\r
+\r
+;HERE TO HANDLE PDL OVERFLOW.  ASK FOR A GC\r
+\r
+IPDLOV:\r
+IFN ITS,[\r
+       MOVEM   A,TSINT         ;SAVE INT WORD\r
+]\r
+\r
+       SKIPE   GCFLG           ;IS GC RUNNING?\r
+       JRST    GCPLOV          ;YES, COMPLAIN GROSSLY\r
+\r
+       MOVEI   A,200000        ;GET BIT TO CLOBBER\r
+       IORM    A,PIRQ          ;LEAVE A MESSAGE FOR HIGHER LEVEL\r
+\r
+       EXCH    P,GCPDL         ;GET A WINNING PDL\r
+       HRRZ    B,TSINTR        ;GET POINTER TO LOSING INSTRUCTION\r
+       SKIPG   GCPDL           ; SKIP IF NOT P\r
+       LDB     B,[270400,,-1(B)]       ;GET AC FIELD\r
+       SKIPL   GCPDL           ; SKIP IF P\r
+       MOVEI   B,P\r
+       MOVEI   A,(B)           ;COPY IT\r
+       LSH     A,1             ;TIMES 2\r
+       ADDI    A,0STO(PVP)     ;POINT TO THIS ACS CURRENT TYPE\r
+       HLRZ    A,(A)           ;GET THAT TYPE INTO A\r
+       CAIN    B,P             ;IS IT P\r
+       MOVEI   B,GCPDL         ;POINT TO SAVED P\r
+\r
+       CAIN    B,B             ;OR IS IT B ITSELF\r
+       MOVEI   B,TSAVB\r
+       CAIN    B,A             ;OR A\r
+       MOVEI   B,TSAVA\r
+\r
+       CAIN    B,C             ;OR C\r
+       MOVEI   B,1(P)          ;C WILL BE ON THE STACK\r
+\r
+       PUSH    P,C\r
+       PUSH    P,A\r
+\r
+       MOVE    A,(B)           ;GET THE LOSING POINTER\r
+       MOVEI   C,(A)           ;AND ISOLATE RH\r
+\r
+       CAMG    C,VECTOP        ;CHECK IF IN GC SPACE\r
+       CAMG    C,VECBOT\r
+       JRST    NOGROW          ;NO, COMPLAIN\r
+\r
+; FALL THROUGH\r
+\f\r
+\r
+       HLRZ    C,A             ;GET -LENGTH\r
+       SUBI    A,-1(C)         ;POINT TO A DOPE WORD\r
+       POP     P,C             ;RESTORE TYPE INTO C\r
+       PUSH    P,D             ; SAVE FOR GROWTH HACKER\r
+       MOVEI   D,0\r
+       CAIN    C,TPDL          ; POIN TD TO APPROPRIATE DOPE WORD\r
+       MOVEI   D,PGROW\r
+       CAIN    C,TTP\r
+       MOVEI   D,TPGROW\r
+       JUMPE   D,BADPDL        ; IF D STILL 0, THIS PDL IS WEIRD\r
+       MOVEI   A,PDLBUF(A)     ; POINT TO ALLEGED REAL DOPE WORD\r
+       SKIPN   (D)             ; SKIP IF PREVIOUSLY BLOWN\r
+       MOVEM   A,(D)           ; CLOBBER IN\r
+       CAME    A,(D)           ; MAKE SURE IT IS THE SAME\r
+       JRST    PDLOSS\r
+       POP     P,D             ; RESTORE D\r
+\r
+\r
+PNTRHK:        MOVE    C,(B)           ;RESTORE PDL POINTER\r
+       SUB     C,[PDLBUF,,0]   ;FUDGE THE POINTER\r
+       MOVEM   C,(B)           ;AND STORE IT\r
+\r
+       POP     P,C             ;RESTORE THE WORLD\r
+       EXCH    P,GCPDL         ;GET BACK ORIG PDL\r
+IFN ITS,[\r
+       MOVE    A,TSINT         ;RESTORE INT WORD\r
+\r
+       JRST    IMPCH           ;LOOK FOR MORE INTERRUPTS\r
+]\r
+IFE ITS,       JRST    GCQUIT\r
+\r
+TPOVFL:        SETOM   INTFLG          ;SIMULATE PDL OVFL\r
+       PUSH    P,A\r
+       MOVEI   A,200000        ;TURN ON THE BIT\r
+       IORM    A,PIRQ\r
+       SUB     TP,[PDLBUF,,0]  ;HACK STACK POINTER\r
+       HLRE    A,TP            ;FIND DOPEW\r
+       SUBM    TP,A            ;POINT TO DOPE WORD\r
+       MOVEI   A,1(A)          ; ZERO LH AND POINT TO DOPEWD\r
+       SKIPN   TPGROW\r
+       HRRZM   A,TPGROW\r
+       CAME    A,TPGROW        ; MAKE SURE WINNAGE\r
+       JRST    PDLOSS\r
+       POP     P,A\r
+       POPJ    P,\r
+\r
+\r
+; GROW CORE IF PDL OVERFLOW DURING GC\r
+\r
+GCPLOV:        MOVE    A,P.TOP ; GET TOP OF IMPURE\r
+       ASH     A,-10.          ; TO BLOCKS\r
+       EXCH    P,GCPDL         ; NEED A PDL TO CALL P.CORE\r
+       ADDI    A,1             ; GO TO NEXT BLOCK\r
+GRECOR:        PUSHJ   P,P.CORE        ; GET CORE\r
+       JRST    SLPCOR          ; HANG GETTING THE CORE\r
+       EXCH    P,GCPDL         ; BPDLS BACK\r
+       ADD     P,[-2000,,0]\r
+IFE ITS,       JRST    GCQUIT\r
+IFN ITS,[\r
+       MOVE    A,TSINT\r
+       JRST    IMPCH\r
+\r
+\r
+SLPCOR:        MOVEI   B,1\r
+       .SLEEP  B,\r
+       JRST    GRECOR\r
+\r
+]\r
+\f\r
+IFN ITS,[\r
+\r
+;HERE TO HANDLE LOW-LEVEL CHANNELS\r
+\r
+\r
+CHNACT:        SKIPN   GCFLG           ;GET A WINNING PDL\r
+       EXCH    P,GCPDL\r
+       ANDI    A,177777        ;ISOLATE CHANNEL BITS\r
+       PUSH    P,0             ;SAVE\r
+\r
+CHNA1: MOVEI   B,0             ;BIT COUNTER\r
+       JFFO    A,.+2           ;COUNT\r
+       JRST    CHNA2\r
+       SUBI    B,35.           ;NOW HAVE CHANNEL\r
+       MOVMS   B               ;PLUS IT\r
+       MOVEI   0,1\r
+       LSH     0,(B)\r
+       ANDCM   A,0\r
+       MOVEI   0,(B)           ; COPY TO 0\r
+       LSH     0,23.           ;POSITION FOR A .STATUS\r
+       IOR     0,[.STATUS 0]\r
+       XCT     0               ;DO IT\r
+       ANDI    0,77            ;ISOLATE DEVICE\r
+       CAILE   0,2\r
+       JRST    CHNA1\r
+\r
+PMIN4: MOVE    0,B             ; CHAN TO 0\r
+       .ITYIC  0,              ; INTO 0\r
+       JRST    .+2             ; DONE, GO ON\r
+       JRST    PMIN4\r
+       SETZM   GCFLCH          ; LEAVE GC MODE\r
+       JRST    CHNA1\r
+\r
+CHNA2: POP     P,0\r
+       SKIPN   GCFLG\r
+       EXCH    P,GCPDL\r
+       JRST    GCQUIT\r
+\r
+HOWMNY:        SETZ\r
+       SIXBIT /LISTEN/\r
+       D\r
+       402000,,B\r
+]\r
+\r
+MFUNCTION GASCII,SUBR,ASCII\r
+       ENTRY   1\r
+\r
+       GETYP   A,(AB)\r
+       CAIE    A,TCHRS\r
+       JRST    TRYNUM\r
+\r
+       MOVE    B,1(AB)\r
+       MOVSI   A,TFIX\r
+       JRST    FINIS\r
+\r
+TRYNUM:        CAIE    A,TFIX\r
+       JRST    WTYP1\r
+       SKIPGE  B,1(AB)         ;GET NUMBER\r
+       JRST    TOOBIG\r
+       CAILE   B,177           ;CHECK RANGE\r
+       JRST    TOOBIG\r
+       MOVSI   A,TCHRS\r
+       JRST    FINIS\r
+\r
+TOOBIG:        PUSH    TP,$TATOM\r
+       PUSH    TP,EQUOTE ARGUMENT-OUT-OF-RANGE\r
+       JRST    CALER1\r
+\r
+\f\r
+;HERE IF PDL OVERFLOW DURING GARBAGE COLLECTION\r
+\r
+BADPDL:        FATAL   NON PDL OVERFLOW\r
+\r
+NOGROW:        FATAL   PDL OVERFLOW ON NON EXPANDABLE PDL\r
+\r
+PDLOSS:        FATAL   PDL OVEFLOW BUFFER EXHAUSTED\r
+\r
+DLOSER:        PUSH    P,LOSRS(B)\r
+       MOVE    A,TSAVA\r
+       MOVE    B,TSAVB\r
+       POPJ    P,\r
+\r
+LOSRS: IMPV\r
+       ILOPR\r
+       IOC\r
+       IPURE\r
+\r
+\r
+;MEMORY PROTECTION INTERRUPT\r
+\r
+IOC:   FATAL   IO CHANNEL ERROR IN GARBAGE COLLECTOR\r
+IMPV:  FATAL   MPV IN GARBAGE COLLECTOR\r
+\r
+IPURE: FATAL   PURE WRITE IN GARBAGE COLLECTOR\r
+ILOPR: FATAL   ILLEGAL OPEREATION IN GARBAGE COLLECTOR\r
+\r
+IFN ITS,[\r
+\r
+;SUBROUTINE TO BE CALLED AT INITIALIZE TIME TO SETUP INTS\r
+\r
+INTINT:        SETZM   CHNCNT\r
+       MOVE    A,[CHNCNT,,CHNCNT+1]\r
+       BLT     A,CHNCNT+16.\r
+       SETZM   INTFLG\r
+       .SUSET  [.SPICLR,,[-1]]\r
+       MOVE    A,MASK1         ;SET MASKS\r
+       MOVE    B,MASK2\r
+       .SETM2  A,              ;SET BOTH MASKS\r
+       MOVSI   A,TVEC\r
+       MOVEM   A,QUEUES(TVP)\r
+       SETZM   QUEUES+1(TVP)   ;UNQUEUE ANY OLD INTERRUPTS\r
+       SETZM   CURPRI\r
+       POPJ    P,\r
+]\r
+IFE ITS,[\r
+\r
+; INITIALIZE TENEX INTERRUPT SYSTEM\r
+\r
+INTINT:        CIS                     ; CLEAR THE INT WORLD\r
+       SETZM   INTFLG          ; IN CASE RESTART\r
+       MOVSI   A,TVEC          ; FIXUP QUEUES\r
+       MOVEM   A,QUEUES(TVP)\r
+       SETZM   QUEUES+1(TVP)\r
+       SETZM   CURPRI          ; AND PRIORITY LEVEL\r
+       MOVEI   A,MFORK         ; TURN ON MY INTERRUPTS\r
+       MOVE    B,[LEVTAB,,CHNTAB]      ; POINT TO TABLES\r
+       SIR                     ; TELL SYSTEM ABOUT THEM\r
+       MOVE    B,MASK1         ; SET UP FOR INT BITS\r
+       AIC                     ; TURN THEM ON\r
+       MOVSI   A,7             ; CNTL G AND CHANNEL 0\r
+       ATI                     ; ACTIVATE IT\r
+       MOVE    A,[23,,1]       ; CNTL S AND CHANNEL 1\r
+       ATI                     ; ACTIVATE IT\r
+       MOVEI   A,MFORK         ; DO THE ENABLE\r
+       EIR\r
+       POPJ    P,\r
+]\r
+\f\r
+\r
+; CNTL-G HANDLER\r
+\r
+MFUNCTION QUITTER,SUBR\r
+\r
+       ENTRY   2\r
+       GETYP   A,(AB)\r
+       CAIE    A,TCHRS\r
+       JRST    WTYP1\r
+       GETYP   A,2(AB)\r
+       CAIE    A,TCHAN\r
+       JRST    WTYP2\r
+       MOVE    B,1(AB)\r
+       MOVE    A,(AB)\r
+       CAIN    B,^S            ; HANDLE CNTL-S\r
+       JRST    RETLIS\r
+       CAIE    B,7\r
+       JRST    FINIS\r
+\r
+       PUSHJ   P,CLEAN         ; CLEAN UP I/O CHANNELS\r
+       PUSH    TP,$TATOM\r
+       PUSH    TP,EQUOTE CONTROL-G?\r
+       MCALL   1,ERROR\r
+       JRST    FINIS\r
+\r
+RETLIS:        MOVEI   D,(TB)          ; FIND A LISTEN OR ERROR TO RET TO\r
+\r
+RETLI1:        HRRZ    A,OTBSAV(D)\r
+       HRRZ    C,FSAV(A)       ; CHECK FUNCTION\r
+       CAIE    C,LISTEN\r
+       CAIN    C,ERROR         ; FOUND?\r
+       JRST    FNDHIM          ; YES, GO TO SAME\r
+       CAIN    C,ERROR%        ; FUNNY ERROR\r
+       JRST    FNDHIM\r
+       CAIN    C,TOPLEV        ; NO ERROR/LISTEN\r
+       JRST    FINIS\r
+       MOVEI   D,(A)\r
+       JRST    RETLI1\r
+\r
+FNDHIM:        PUSH    TP,$TTB\r
+       PUSH    TP,D\r
+       PUSHJ   P,CLEAN\r
+       MOVE    B,(TP)          ; NEW FRAME\r
+       SUB     TP,[2,,2]\r
+       MOVEI   C,0\r
+       PUSHJ   P,CHUNW         ; UNWIND?\r
+       MOVSI   A,TATOM\r
+       MOVE    B,MQUOTE T\r
+       JRST    FINIS\r
+\r
+CLEAN: MOVE    B,3(AB)         ; GET IN CHAN\r
+       PUSHJ   P,RRESET\r
+       MOVE    B,3(AB)         ; CHANNEL BAKC\r
+       MOVE    C,BUFRIN(B)\r
+       SKIPN   C,ECHO(C)       ; GET ECHO\r
+       JRST    CLUNQ\r
+IFN ITS,[\r
+       MOVEI   A,2\r
+       CAMN    C,[PUSHJ P,MTYO]\r
+       JRST    TYONUM\r
+       LDB     A,[270400,,C]\r
+TYONUM:        LSH     A,23.\r
+       IOR     A,[.RESET]\r
+       XCT     A\r
+]\r
+IFE ITS,[\r
+       MOVEI   A,101           ; OUTPUT JFN\r
+       CFOBF\r
+]\r
+\r
+CLUNQ: SETZB   A,CURPRI\r
+       JRST    UNQUEU\r
+\r
+\f\r
+IMPURE\r
+ONINT: 0               ; INT FUDGER\r
+IFN ITS,[\r
+;RANDOM IMPURE CRUFT NEEDED\r
+CHNCNT:        BLOCK   16.     ; # OF CHARS IN EACH CHANNEL\r
+\r
+TSAVA: 0\r
+TSAVB: 0\r
+PIRQ:  0                       ;HOLDS REQUEST BITS FOR 1ST WORD\r
+PIRQ2: 0                       ;SAME FOR WORD 2\r
+PCOFF: 0\r
+MASK1: 1200,,220540                    ;FIRST MASK\r
+MASK2: 0                       ;SECOND THEREOF\r
+CURPRI:        0               ; CURRENT PRIORITY\r
+]\r
+IFE ITS,[\r
+NETJFN:        BLOCK   NNETS\r
+MASK1: CHNMSK\r
+TSINTR:\r
+P1:    0                       ; PC INT LEVEL 1\r
+P2:    0                       ; PC INT LEVEL 2\r
+P3:    0                       ; PC INT LEVEL 3\r
+CURPRI:        0\r
+TSAVA: 0\r
+TSAVB: 0\r
+PIRQ:  0\r
+PIRQ2: 0\r
+]\r
+PURE\r
+\r
+END\r
+\f
\ No newline at end of file