--- /dev/null
+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