2 TITLE INTERRUPT HANDLER FOR MUDDLE
19 IFE ITS,.INSRT STENEX >
22 PDLGRO==10000 ;AMOUNT TO GROW A PDL THAT LOSES
23 NINT==72. ;MAXIMUM NUMBER OF INTERRUPTS POSSIBLE
26 ;SET UP LOCATION 42 TO POINT TO TSINT
30 ZZZ==$. ;SAVE CURRENT LOCATION
34 JSR MTSINT ;GO TO HANDLER
40 ; GLOBALS NEEDED BY INTERRUPT HANDLER
42 .GLOBAL ONINT ; FUDGE INS EXECUTED IF NON ZERO AT START OF INTERRUPT
43 .GLOBAL INTBCK ; "PC-LOSER HACK "
44 .GLOBA GCFLG ;TELLS WHETHER OR NOT GARBAGE COLLECTOR IS RUNNING
45 .GLOBAL GCFLCH ; FLUSH CHARS IMMEDIATE SO GC CAN SEE THEM
46 .GLOBAL CORTOP ; TOP OF CORE
47 .GLOBA GCINT ;TELLS GARBAGE COLLECTOR TO SIMULATE AN INTERRUPT
48 .GLOBAL INTNUM,INTVEC ;TV ENTRIES CONCERNING INTERRUPTS
49 .GLOBAL AGC ;CALL THE GARBAGE COLLECTOR
50 .GLOBAL VECNEW,PARNEW,GETNUM ;GC PSEUDO ARGS
51 .GLOBAL GCPDL ;GARBAGE COLLECTORS PDL
52 .GLOBAL VECTOP,VECBOT ;DELIMIT VECTOR SPACE
53 .GLOBAL PURTOP,CISTNG,SAGC
54 .GLOBAL PDLBUF ;AMOUNT OF PDL GROWTH
55 .GLOBAL PGROW ;POINTS TO DOPE WORD OF NEXT PDL TO GROW
56 .GLOBAL TPGROW ;POINTS TO NEXT MUDDLE PDL TO GROW
57 .GLOBAL TOPLEV,ERROR%,N.CHNS,CHNL1
58 .GLOBAL BUFRIN,CHNL0,SYSCHR ;CHANNEL GLOBALS
59 .GLOBAL IFALSE,TPOVFL,1STEPR,INTOBL,INCHAR,CURPRI,RDEVIC,RDIREC,GFALS,STATUS
60 .GLOBAL PSTAT,NOTRES,IOIN2,INAME,INTFCN,CHNCNT,CHANNO,GIBLOK,ICONS,INCONS
61 .GLOBAL IEVECT,INSRTX,ILOOKC,IPUT,IREMAS,IGET,CSTAK,EMERGE,CHFSWP
62 .GLOBAL MTSINT ;BEGINNING OF INTERRUPT HANDLER
63 .GLOBAL INTINT ;CALLED BY INITIALIZER TO TAKE CARE OF INT PCS
64 .GLOBAL FRMSTK,APPLY,CHUNW,TGFALS
65 .GLOBAL IPCGOT,DIRQ ;HANDLE BRANCHING OFF TO IPC KLUDGERY
69 .GLOBAL GCTIM,GCCAUS,GCCALL,GPDLOV
71 ; GLOBALS FOR MONITOR ROUTINES
73 .GLOBAL MONCH,MONCH0,RMONCH,RMONC0,LOCQ,SMON,BAPT,APLQ,MAKACT,NAPT
74 .GLOBAL PURERR,BUFRIN,INSTAT,REALTV,DSTORE
78 .GLOBAL MSGTYP,MTYI,UPLO,IFLUSH,OCLOS,ERRET,MASK1,MASK2 ;SUBROUTINES USED
79 .GLOBAL ERROR,LISTEN,ECHO,RRESET,MTYO,GCHAPN,P.CORE,P.TOP,QUEUES,NOTTY,TTYOP2,TTICHN
80 .GLOBAL INTHLD,BNDV,SPECBE,DEMFLG,PLODR
82 ; GLOBALS FOR PRE-AGC INTERRUPT
84 .GLOBAL FRETOP,GCSTOP,FREMIN,CORTOP,P.CORE,PURBOT,GETNUM,GCKNUM,GCHPN,INTAGC
85 .GLOBAL SPECBIND,SSPEC1,ILVAL
88 ; GLOBALS FOR COPY/WRITE HACK FOR GCDUMP AND PURIFY
90 .GLOBAL GCDFLG,%CWINF,BUFGC,WNDBOT,WIND,WNDP,%SHWND,GPURFL,%FDBUF,PURMNG,RPURBT
91 .GLOBAL NPWRIT,PVSTOR,SPSTOR,OPSYS
95 ;BEGINNING OF ACTUAL INTERRUPT HANDLER (MUST BE IMPURE)
98 ;***** TEMP FUDGE *******
103 ; DECLARATIONS ASSOCIATED WITH INTERRUPT HANDERS AND HEADERS
107 SPECIN: IRP A,,[CHAR,CLOCK,MPV,ILOPR,WRITE,READ,IOC,PURE,SYSDOWN,INFERIOR,RUNT,REALT
113 ; TABLE OF SPECIAL FINDING ROUTINES
115 FNDTBL: IRP A,,[GETCHN,0,0,0,LOCGET,LOCGET,0,0,0,0,0,0,0]
119 ; TABLE OF SPECIAL SETUP ROUTINES
121 INTBL: IRP A,,[S.CHAR,S.CLOK,S.MPV,S.ILOP,S.WMON,S.RMON,S.IOC,S.PURE,S.DOWN,S.INF
129 ; EXTERNAL INTERRUPT TABLE
131 EXTINT: REPEAT NINT-36.,0
139 IRP A,,[[HCLOCK,13.],[HMPV,14.],[HILOPR,6],[HIOC,9],[HPURE,26.],[HDOWN,7],[HREAL,35.]
140 [HRUNT,34.],[HPAR,28.]]
154 ; TABLES FOR TENEX INTERRUPT SYSTEM
156 LEVTAB: P1 ; POINTS TO INT PC HOLDERS FOR LEVS 1,2 AND 3
160 CHNMSK==700000,,7 ; WILL BE MASK WORD FOR INT SET UP
162 NNETS==7 ; ALLOW 7 NETWRK INTERRUPTS
164 NETCHN==36.-NNETS-UINTS-1
166 RLCHN==36.-NNETS-UINTS
169 IMPURE ; IMPURE BECAUSE IT CHANGES IN MULTI-SECTION MODE
170 CHNTAB: ; LOCATION OF INT ROUTINES FOR VARIOUS "CHANNELS"
172 REPEAT NCHRS, 1,,INTCHR+3*.RPCNT
173 BLOCK 36.-NNETS-NCHRS-UINTS-1 ; THERE ARE 36. TENEX INT CHANNELS
175 REPEAT NNETS+UINTS, 1,,INTNET+3*.RPCNT
177 IRP A,,[[9.,TNXPDL],[17.,PWRIT],[10.,TNXEOF],[11.,TNXIOC],[12.,TNXFUL]
178 [RLCHN,TNXRLT],[19.,TNXINF]]
182 CHNMSK==CHNMSK+<1_<35.-B>>
191 REPEAT NCHRS,SETZ HCHAR
192 BLOCK NINT-NNETS-NCHRS-UINTS-36.-1
193 REPEAT NNETS,SETZ HNET
194 REPEAT UINTS,SETZ USRINT
197 LOC EXTINT+NINT-RLCHN-1
199 LOC EXTINT+NINT-19.-1
205 ; HANDLER/HEADER PARAMETERS
209 IHDRLN==4 ; LENGTH OF HEADER BLOCK
211 INAME==0 ; NAME OF INTERRUPT
212 ISTATE==2 ; CURRENT STATE
213 IHNDLR==4 ; POINTS TO LIST OF HANDLERS
214 INTPRI==6 ; CONTAINS PRIORITY OF INTERRUPT
216 IHANDL==4 ; LENGTH OF A HANDLER BLOCK
218 INXT==0 ; POINTS TO NEXTIN CHAIN
219 IPREV==2 ; POINTS TO PREV IN CHAIN
220 INTFCN==4 ; FUNCTION ASSOCIATED WITH THIS HANDLER
221 INTPRO==6 ; PROCESS TO RUN INT IN
227 MTSINT: 0 ;INTERRUPT BITS GET STORED HERE
228 TSINTR: 0 ;INTERRUPT PC WORD STORED HERE
229 JRST TSINTP ;GO TO PURE CODE
231 ; SOFTWARE INTERNAL INTERRUPTS JSR TO HERE
241 ; JSR HERE FOR SOFTWARE INTERNAL INTERRUPTS
253 ;THE REST OF THIS CODE IS PURE
255 TSINTP: SOSGE INTFLG ; SKIP IF ENABLED
256 SETOM INTFLG ;DONT GET LESS THAN -1
258 SKIPE INTBCK ; ANY INT HACKS?
259 JRST PCLOSR ; DO A PC-LOSR ON THE PROGRAM
260 MOVEM A,TSAVA ;SAVE TWO ACS
262 MOVE A,TSINT ;PICK UP INT BIT PATTERN
263 JUMPL A,2NDWORD ;DONT CHECK FOR PDL OVERFLOW ETC. IF SIGN BIT ON
265 TRZE A,200000 ;IS THIS A PDL OVERFLOW?
266 JRST IPDLOV ;YES, GO HANDLE IT FIRST
269 TRNE A,20000 ;IS IT A MEMORY PROTECTION VIOLATION?
270 MOVEI B,1 ; FLAG SAME
272 TRNE A,40 ;ILLEGAL OP CODE?
273 MOVEI B,2 ; ALSO FLAG
279 JRST GCPWRT ; CHECK FOR PURE WRITE FOR POSSIBLE C/W
280 NOPUGC: SOJGE B,DO.NOW ; CANT WAIT AROUND
282 ;DECODE THE REST OF THE INTERRUPTS USING A TABLE
285 JUMPL A,GC2 ;2ND WORD?
286 IORM A,PIRQ ;NO, INTO WORD 1
287 JRST GCQUIT ;AND DISMISS INT
289 GC2: TLZ A,400000 ;TURN OFF SIGN BIT
291 TRNE A,177777 ;CHECK FOR CHANNELS
292 JRST CHNACT ;GO IF CHANNEL ACTIVITY
294 GCQUIT: SKIPGE INTFLG ;SKIP IF INTERRUPTS ENABLED
295 JRST INTDON ;NO, DEFER REAL HANDLING UNTIL LATER
297 MOVE A,TSINTR ;PICKUP RETURN WORD
301 TLON A,10000 ; EXEC PC?
302 SOJA A,MLTEX1 ; YES FIXUP PC
308 MLTEX1: MOVEM A,LCKINT ;STORE ELSEWHERE
309 MOVEI A,DOINTE ;CAUSE DISMISS TO HANDLER
310 IFN ITS, HRRM A,TSINTR ;STORE IN INT RETURN
317 PUSH P,INTFLG ;SAVE INT FLAG
318 SETOM INTFLG ;AND DISABLE
321 INTDON: MOVE A,TSAVA ;RESTORE ACS
323 IFN ITS, .DISMISS TSINTR ;AND DISMISS THE INTERRUPT
327 PCLOSR: MOVEM A,TSAVA
328 HRRZ A,TSINTR ; WHERE FROM
330 CAILE A,INTBEN ; AVOID TIMING ERRORS
346 JRST DLOSER ; HANDLE FATAL GC ERRORS
348 SKIPGE INTFLG ; IF NOT ENABLED
349 MOVEM B,INTFLG ; PRETEND IT IS
350 IFN ITS, JRST 2NDWORD
355 ; HERE FOR TENEX PDL OVER FLOW INTERRUPT
361 JRST IPDLOV ; GO TO COMMON HANDLER
363 ; HERE FOR REAL TIMER
365 TNXRLT: MOVEM A,TSAVA
366 IFG <RLCHN-18.>, MOVEI A,<1_<35.-<RLCHN>>>
367 IFLE <RLCHN-18.> MOVSI A,(<1_<35.-<RLCHN>>>)
371 ; HERE FOR TENEX ^G AND ^S INTERRUPTS
380 IORM A,PIRQ2 ; SAY FOR MUDDLE LEVEL
387 MOVE A,[1_<.RPCNT+NETCHN>]
390 TNXINF: MOVEM A,TSAVA
391 MOVEI A,<1_<35.-19.>>
394 ; LOW LEVEL HANDLERS FOR 10X IOC INTERRUPTS
396 TNXEOF: MOVEM A,TSAVA
397 MOVSI A,(1_<35.-10.>)
400 TNXIOC: MOVEM A,TSAVA
401 MOVSI A,(1_<35.-11.>)
404 TNXFUL: MOVEM A,TSAVA
407 FATAL DISK FULL IN PURE FIXUP, CONTINUE TO RETRY
410 TNXFU1: MOVSI A,(1_<35.-12.>)
414 HRRZ A,TSAVA ; ASSUME JFN IS IN A (PRETTY FLAKEY BUT ...)
419 ; HERE TO PROCESS INTERRUPTS
421 DOINT: SKIPE INTHLD ; GLOBAL LOCK ON INTS
423 SETOM INTHLD ; DONT LET IT HAPPEN AGAIN
425 DOINTE: SKIPE ONINT ; ANY FUDGE?
426 XCT ONINT ; YEAH, TRY ONE
429 EXCH 0,LCKINT ; RELATIVIZE PC IF FROM RSUBR
430 IFE ITS, TLZ 0,777740 ; KILL EXCESS BITS
436 SUBI 0,(M) ; M IS BASE REG
437 IFN ITS, TLO 0,400000+M ; INDEX IT OFF M
445 EXCH 0,(P) ; AND RESTORE TO STACK
446 DONREL: EXCH 0,LCKINT ; GET BACK SAVED 0
447 SETZM INTFLG ;DISABLE
448 AOS -2(P) ;INCR SAVED FLAG
450 ;NOW SAVE WORKING ACS
453 HLRZ A,-2(P) ; HACK FUNNYNESS FOR MPV/ILOPR
455 SETZM -2(P) ; REALLY DISABLED
457 DIRQ: MOVE A,PIRQ ;NOW SATRT PROCESSING
458 JFFO A,FIRQ ;COUNT BITS AND GO
459 MOVE A,PIRQ2 ;1ST DONE, LOOK AT 2ND
462 INTDN1: SKIPN GCHAPN ; SKIP IF MUST DO GC INT
465 PUSHJ P,INTOGC ; AND INTERRUPT
470 .SUSET [.SPICLR,,[0]] ; DISABLE INTS
475 SETZM INTHLD ; RE-ENABLE THE WORLD
478 HRRI 0,@0 ; EFFECTIVIZE THE ADDRESS
479 TLZ 0,37 ; KILL IND AND INDEX
486 XJRST .+1 ; MAKE SURE OUT OF SECTION 0
495 FIRQ: PUSHJ P,GETBIT ;SET UP THE BIT TO CLOBBER IN PIRQ
496 ANDCAM A,PIRQ ;CLOBBER IT
497 ADDI B,36. ;OFSET INTO TABLE
498 JRST XIRQ ;GO EXECUTE
500 FIRQ2: PUSHJ P,GETBIT ;PREPARE TO CLOBBER BIT
501 ANDCAM A,PIRQ2 ;CLOBBER IT
502 ADDI B,71. ;AGAIN OFFSET INTO TABLE
504 CAIE B,21 ;PDL OVERFLOW?
505 JRST FHAND ;YES, HACK APPROPRIATELY
513 JRST (E) ; NOTHING GROWING, FALSE ALARM
514 MOVEI B,PDLGRO_-6 ;GET GROWTH SPEC
515 DPB B,[111100,,-1(A)] ;STORE GROWTH SPEC
516 REAGC: MOVE C,[10.,,1] ; INDICATOR FOR AGC
517 SKIPE PGROW ; P IS GROWING
519 SKIPE TPGROW ; TP IS GROWING
521 PUSHJ P,AGC ;COLLECT GARBAGE
524 AOJL A,REAGC ; IF NO CORE, RETRY
530 IRP A,,[0,A,B,C,D,E,TVP,SP]
532 SETZM A!STO(PVP) ;NOW ZERO TYPE
542 MOVEM D,-13(TP) ; USE AS DSTO
552 IRP A,,[SP,TVP,E,D,C,B,A,0]
561 ; HERE TO DO GC INTERRUPT AND CLOSE ANY DEAD CHANNELS
563 INTOGC: PUSH P,[N.CHNS-1]
565 MOVE TVP,REALTV+1(PVP)
573 INTGC1: MOVE A,(TP) ; GET POINTER
574 SKIPN B,1(A) ; ANY CHANNEL?
576 HRRE 0,(A) ; INDICATOR
594 PUSH TP,$TFLOAT ; PUSH ON TIME ARGUMENT
596 PUSH TP,$TFIX ; PUSH ON THE CAUSE ARGUMENT
598 PUSH TP,$TATOM ; PUSH ON THE CALL ARGUMENT
604 ; PRE AGC INTERRUPT. CAUSED WHEN FREE STORAGE REQUEST CAN BE SATISFIED BY
605 ; EXTENDING CORE. IT IS CALLED "AGC" AND THE HANDLER IS PASSED THE CALLER,
606 ; AND THE PENDING REQUEST.
609 INTAGC: MOVE A,GETNUM
610 MOVEM A,GCKNUM ; SET UP TO CAUSE INTERRUPT
611 PUSH P,C ; SAVE ARGS TO GC
612 MOVEI A,2000 ; GET WORKING SPACE
613 PUSHJ P,INTCOR ; GET IT
614 MOVSI A,TATOM ; EXAMINE BINDING OF FLAG
615 MOVE B,IMQUOTE AGC-FLAG
618 JRST INAGCO ; JUMP TO GET CORE FOR INTERRUPT
620 ADD A,P.TOP ; SEE IF WE CAN POSSIBLY WIN
623 JRST AGCCAU ; WORLD IS IN BAD SHAPE, CALL AGC
624 PUSH TP,$TTP ; BIND FLAG
625 PUSH TP,TP ; FOR UNBINDING PURPOSES
626 PUSH TP,[TATOM,,-1] ; SPECBINDS ARGS
627 PUSH TP,IMQUOTE AGC-FLAG
634 ; SET UP CALL TO HANDLER
636 PUSH TP,$TCHSTR ; STRING INDICATING INTERRUPT
637 PUSH TP,CHQUOTE DIVERT-AGC
638 PUSH TP,$TFIX ; PENDING REQUEST
644 MCALL 3,INTERR ; ENABLE INTERRUPT
645 GETYP A,A ; CHECK TO SEE IF INTERRUPT WAS ENABLED
646 HRRZ E,-6(TP) ; GET ARG FOR UNBINDING
648 SUB TP,[8,,8] ; CLEAN OFF STACK
649 CAIE A,TFALSE ; SKIP IF NOT
652 ; CAUSE AN AGC TO HAPPEN
654 AGCCAU: MOVE C,(P) ; INDICATOR
655 PUSHJ P,SAGC ; CALL AGC
658 ; SEE WHETHER ENOUGH CORE WAS ALLOCATED
659 CHKWIN: MOVE A,FRETOP
661 SUB A,GCKNUM ; AMOUNT NEEDED OR IN EXCESS
662 JUMPGE A,FINAGC ; JUMP IF DONE
664 MOVEM A,GETNUM ; SET UP REQUEST
671 ; ROUTINE TO HANDLE INTERRUPT WHILE INTERRUPT IS RUNNING
672 ; IT TRIES TO ALLOCATE FOR REQUEST+ AT LEAST ONE CORE BLOCK
674 INAGCO: MOVE A,GETNUM ; GET REQUEST
675 SUB A,GCKNUM ; CALCULATE REAL CURRENT REQUEST
677 ANDCMI A,1777 ; AMOUNT WANTED
678 PUSHJ P,INTCOR ; GET IT
682 ; ROUTINE TO GET CORE FOR PRE-AGC INTERRUPT. REQUEST IN A
685 INTCOR: ADD A,P.TOP ; ADD TOP TO REQUEST
686 CAML A,PURBOT ; SKIP IF BELOW PURE
688 MOVEM A,CORTOP ; STORE POSSIBLE CORE TOP
689 ASH A,-10. ; TO PAGES
690 PUSHJ P,P.CORE ; GET THE CORE
691 JRST AGCCA1 ; LOSE,LOSE,LOSE
703 AGCCA1: MOVE C,-1(P) ; GET ARGS FOR AGC
704 SUB P,[1,,1] ; FLUSH RETURN ADDRESS
709 GCALLR: MQUOTE GC-READ
717 MQUOTE PURE-PAGE-LOADER
719 MQUOTE INTERRUPT-HANDLER
723 \f; OLD "ON" SETS UP EVENT AND HANDLER
729 HLRE 0,AB ; 0=> -2*NUM OF ARGS
733 MOVEI B,10(AB) ; LAST MUST BE CHAN OR LOC
736 JUMPG 0,TFA ; AT LEAST 3
737 MOVEI A,0 ; SET UP IN CASE NO PROC
738 AOJG 0,ONPROC ; JUMP IF NONE
739 GETYP C,6(AB) ; CHECK IT
742 MOVE A,7(AB) ; GET IT
743 ONPROC: PUSH P,A ; SAVE AS A FLAG
744 GETYP A,(AB) ; CHECK PREV EXISTANCE
750 MOVEI B,(AB) ; FIND IT
752 POP P,0 ; REST NUM OF ARGS
753 JUMPN B,ON3 ; ALREADY THERE
754 SKIPE C ; SKIP IF NOTHING TO FLUSH
756 PUSH TP,(AB) ; GET NAME
760 MOVEI A,2 ; # OF ARGS TO EVENT
761 AOJG 0,ON1 ; JUMP IF NO LAST ARG
769 PUSH TP,2(AB) ; NOW FCN
771 MOVEI A,3 ; NUM OF ARGS
780 TRYFIX: SKIPN A,7(AB)
785 ; ROUTINE TO BUILD AN EVENT
792 CAIN 0,-2 ; IF JUST 1
793 JRST RE.EVN ; COULD BE EVENT
794 CAIL 0,-3 ; MUST BE AT LEAST 2 ARGS
796 GETYP A,2(AB) ; 2ND ARG MUST BE FIXED POINT PRIORITY
799 GETYP A,(AB) ; FIRST ARG SHOULD BE CHSTR
800 CAIN A,TATOM ; ALLOW ACTUAL ATOM
809 PUSHJ P,CHNORL ; CHANNEL OR LOCATIVE (PUT ON STACK)
811 GOTRGS: MOVEI B,(AB) ; NOW TRY TO FIND HEADER FOR THIS INTERRUPT
812 PUSHJ P,FNDINT ; CALL INTERNAL HACKER
813 JUMPN B,FINIS ; ALREADY ONE OF THIS NAME
815 JUMPE C,.+3 ; GET IT OFF STACK
818 PUSHJ P,MAKINT ; MAKE ONE FOR ME
820 MOVEM 0,INTPRI(B) ; SET UP PRIORITY
823 CH.SPC: POP P,C ; GET CODE BACK
825 PUSHJ P,DO.SPC ; DO ANY SPECIAL HACKS
830 JRST TFA ; ELSE SAY NOT ENOUGH
831 MOVE B,1(AB) ; GET IT
832 SETZM ISTATE+1(B) ; MAKE SURE ENABLED
834 GETYP A,INAME(B) ; CHECK FOR CHANNEL
835 CAIN A,TCHAN ; SKIP IF NOT
836 HRROI C,SS.CHA ; SET UP CHANNEL HACK
837 HRLZ E,INTPRI(B) ; GET POSSIBLE READ/WRITE BITS
838 TLNE E,.WRMON+.RDMON ; SKIP IF NOT MONITORS
841 MOVE B,INAME+1(B) ; CHECK FOR SPEC
843 MOVE B,1(AB) ; RESTORE IHEADER
844 RE.EV1: PUSH TP,INAME(B)
850 MOVE D,MQUOTE INTERRUPT
853 MOVE B,INAME+1(B) ; GET IT
854 PUSHJ P,IGET ; LOOK FOR IT
855 JUMPN B,FINIS ; RETURN IT
862 PUSHJ P,IPUT ; REESTABLISH IT
868 ; FUNCTION TO GENERATE A HANDLER FOR A GIVEN INTERRUPT
870 MFUNCTION HANDLER,SUBR
875 CAIL 0,-2 ; MUST BE 2 OR MORE ARGS
878 CAIE A,TINTH ; EVENT?
881 CAIN 0,-4 ; IF EXACTLY 2
882 CAIE A,THAND ; COULD BE HANDLER
885 MOVE B,3(AB) ; GET IT
886 SKIPN IPREV+1(B) ; SKIP IF ALREADY IN USE
888 MOVE D,1(AB) ; GET EVENT
889 SKIPN D,IHNDLR+1(D) ; GET FIRST HANDLER
891 CAMN D,B ; IS THIS IT?
892 JRST HFINIS ; YES, ALREADY "HANDLED"
893 MOVE D,INXT+1(D) ; GO TO NEXT HANDLER
895 BADHND: ERRUUO EQUOTE HANDLER-ALREADY-IN-USE
897 CHEVNT: CAIG 0,-7 ; SKIP IF LESS THAN 4
899 PUSH TP,$TPVP ; SLOT FOR PROCESS
901 CAIE 0,-6 ; IF 3, LOOK FOR PROC
911 PUSHJ P,MHAND ; MAKE THE HANDLER
912 MOVE 0,1(TB) ; GET PROCESS
913 MOVEM 0,INTPRO+1(B) ; AND PUT IT INTO HANDLER
914 MOVSI 0,TPVP ; SET UP TYPE
916 MOVE 0,2(AB) ; SET UP FUNCTION
921 HNDOK: MOVE D,1(AB) ; PICK UP EVEENT
922 MOVE E,IHNDLR+1(D) ; GET POINTER TO HANDLERS
923 MOVEM B,IHNDLR+1(D) ; PUT NEW ONE IN
924 MOVSI 0,TINTH ; GET INT HDR TYPE
925 MOVEM 0,IPREV(B) ; INTO BACK POINTER
926 MOVEM D,IPREV+1(B) ; AND POINTER ITSELF
927 MOVEM E,INXT+1(B) ; NOW NEXT POINTER
928 MOVSI 0,THAND ; NOW HANDLER TYPE
929 MOVEM 0,IHNDLR(D) ; SET TYPE IN HEADER
931 JUMPE E,HFINIS ; JUMP IF HEADER WAS EMPTY
932 MOVEM 0,IPREV(E) ; FIX UP ITS PREV
934 HFINIS: MOVSI A,THAND
939 ; FUNCTIONS TO SET TIME LIMITS FOR REALTIME AND RUNTIME INTS
943 MFUNCTION RUNTIMER,SUBR
965 RUNT2: JUMPL A,OUTRNG ; NOT FOR NEG #
971 RNTLFT: .SUSET [.RRTMR,,B]
972 JUMPL B,IFALSE ; RETURN FALSE IF NONE SET
973 IDIV B,[245761.] ; TO SECONDS
981 MFUNCTION REALTIMER,SUBR
993 IFN ITS, IMULI A,60. ; TO 60THS OF SEC
994 IFE ITS, IMULI A,1000. ; TO MILLI
997 REALT1: CAIE 0,TFLOAT
999 IFN ITS, FMPRI A,(60.0)
1000 IFE ITS, FMPRI A,(1000.0)
1006 REALT2: JUMPL A,OUTRNG
1017 MOVE A,[MFORK,,.TIMAL] ; FLUSH CURRENT FIRST
1035 RLTPER: SKIPGE B,RLTSAV
1037 IFN ITS, IDIVI B,60. ; BACK TO SECONDS
1038 IFE ITS, IDIVI B,1000.
1043 ; FUNCTIONS TO ENABLE AND DISABLE INTERRUPTS
1045 MFUNCTION %ENABL,SUBR,ENABLE
1051 MFUNCTION %DISABL,SUBR,DISABLE
1066 DO.SPC: HRRO C,INTBL(C) ; POINT TO SPECIAL CODE
1067 HLRZ 0,AB ; - TWO TIMES NUM ARGS
1068 PUSHJ P,(C) ; CALL ROUTINE
1069 JUMPE E,CPOPJ ; NO BITS TO ENABLE, LEAVE
1073 MOVE B,1(TB) ; CHANNEL
1075 MOVEM 0,(E) ; SAVE IN TABLE
1077 SUBI E,NETJFN-NETCHN
1078 MOVE A,0 ; SETUP FOR MTOPR
1081 TLO C,770000 ; DONT SETUP INR/INS
1093 POPJ P, ; ***** TEMP ******
1096 CAILE E,35. ; SKIP IF 1ST WORD BIT
1100 IORM 0,MASK1 ; STORE IN PROTOTYPE MASK
1101 .SUSET [.SMASK,,MASK1]
1104 SETW2: LSH 0,-36.(E)
1105 IORM 0,MASK2 ; SET UP PROTO MASK2
1106 .SUSET [.SMSK2,,MASK2]
1110 ; ROUTINE TO CHECK FOR CHANNEL OR LOCATIVE
1112 CHNORL: GETYP A,(B) ; GET TYPE
1113 CAIN A,TCHAN ; IF CHANNEL
1116 PUSHJ P,LOCQ ; ELSE LOOCATIVE
1123 ; SUBROUTINE TO FIND A HANDLER OF A GIVEN NAME
1125 FNDINT: PUSHJ P,FNDNM
1127 PUSHJ P,SPEC1 ; COULD BE FUNNY
1129 INTASO: PUSH P,C ; C<0 IF SPECIAL
1133 SKIPN D ; COULD BE CHANGED FOR MONITOR
1134 MOVE D,MQUOTE INTERRUPT
1140 POP P,C ; AND RESTOR SPECIAL INDICATOR
1142 SUB TP,[2,,2] ; REMOVE CRUFT
1143 CPOPJ: POPJ P, ; AND RETURN
1145 ; CHECK FOR SPECIAL INTERNAL INTERRUPT HACK
1147 SPEC1: MOVSI C,-SPECLN ; BUILD AOBJN PNTR
1148 SPCLOP: CAME B,@SPECIN(C) ; SKIP IF SPECIAL
1149 AOBJN C,.-1 ; UNTIL EXHAUSTED
1153 MOVEI 0,-1(TB) ; SEE IF OK
1158 ; ROUTINE TO CREATE A NEW INTERRUPT (INTERNAL ONLY--NOT ITS FLAVOR)
1160 MAKINT: JUMPN C,GOTATM ; ALREADY HAVE NAME, GET THING
1161 MOVEI B,(AB) ; POINT TO STRING
1162 PUSHJ P,CSTAK ; CHARS TO STAKC
1165 MOVE D,MQUOTE INTERRUPT
1166 GOTATM: PUSH TP,$TINTH ; MAKE SLOT FOR HEADER BLOCK
1169 PUSH TP,B ; SAVE ATOM
1174 MOVE A,-3(TP) ; GET NAME AND STORE SAME
1179 MOVEM B,-4(TP) ; STASH HEADER
1184 EXCH A,-1(TP) ; INTERNAL PUT CALL
1190 ; FIND NAME OF INTERRUPT
1192 FNDNM: GETYP A,(B) ; TYPE
1193 CAIE A,TCHSTR ; IF STRING
1194 JRST FNDATM ; DONT HAVE ATOM, OTHERWISE DO
1198 SETZB C,D ; PREVENT LOSSAGE LATER
1201 ; THE NEXT 2 INSTRUCTIONS ARE A KLUDGE TO GET THE RIGHT ERROR ATOM
1203 CAMN B,IMQUOTE ERROR
1204 MOVE B,MQUOTE ERROR,ERROR,INTRUP
1207 IILOOK: PUSHJ P,CSTAK ; PUT CHRS ON STACK
1210 JRST ILOOKC ; LOOK IT UP
1212 ; ROUTINE TO MAKE A HANDLER BLOCK
1214 MHAND: MOVEI A,IHANDL*2
1215 JRST GIBLOK ; GET BLOCK
1217 ; HERE TO GET CHANNEL FOR "CHAR" INTERRUPT
1219 GETCHN: GETYP 0,(TB) ; GET TYPE
1220 CAIE 0,TCHAN ; CHANNL IS WINNER
1222 MOVE A,(TB) ; USE THE CHANNEL TO NAME THE INTERRUPT
1224 SKIPN CHANNO(B) ; SKIP IF WINNING CHANNEL
1228 LOCGET: GETYP 0,(TB) ; TYPE
1229 CAIN 0,TCHAN ; SKIP IF LOCATIVE
1233 MOVE B,1(TB) ; GET LOCATIVE
1236 ; FINAL MONITOR SETUP ROUTINES
1238 S.RMON: SKIPA E,[.RDMON,,]
1239 S.WMON: MOVSI E,.WRMON
1242 HLRM E,INTPRI(B) ; SAVE BITS
1243 MOVEI B,(TB) ; POINT TO LOCATIVE
1246 MOVSI D,(ANDCAM E,) ; KILL INST
1249 PUSHJ P,SMON ; GO DO IT
1256 ; SPECIAL SETUP ROUTINES FOR INITIAL INTERRUPTS
1259 S.CHAR: MOVE E,1(TB) ; GET CHANNEL
1261 ILDB 0,0 ; 1ST CHAR TO 0
1265 XORM 0,-2(E) ; IN CASE OUTPUT
1267 ADDI E,36. ; GET CORRECT MASK BIT
1268 ONEBIT: MOVEI 0,1 ; BIT FOR INT TO RET
1272 S.CHAR: MOVE E,1(TB)
1274 XORM 0,-2(E) ; IN CASE OUTPUT
1283 MOVE E,[-NNETS,,NETJFN]
1287 MOVE A,E ; REMEMBER WHERE
1290 FATAL NO MORE NETWORK
1301 S.CLOK: MOVEI E,13. ; FOR NOW JUST GET BIT #
1307 ; RUNTIME AND REALTIME INTERRUPTS
1309 S.RUNT: SKIPA E,[34.]
1313 S.IOC: SKIPA E,[9.] ; IO CHANNEL ERROR
1319 S.MPV: SKIPA E,[14.] ; BIT POS
1323 ; HERE TO TURN ALL INFERIOR INTS
1325 S.INF: MOVEI E,36.+16.+2 ; START OF BITS
1326 MOVEI 0,37 ; 8 BITS WORTH
1338 S.RUNT: ERRUUO EQUOTE INTERRUPT-UNAVAILABLE-ON-TENEX
1339 S.IOC: MOVEI 0,7 ; 3 BITS FOR EOF/FULL/ERROR
1349 ; HERE TO HANDLE ITS INTERRUPTS
1351 FHAND: SKIPN D,EXTINT(B) ; SKIP IF HANDLERS ARE POSSIBLE
1356 ; SPECIAL CHARACTER HANDLERS
1358 HCHAR: MOVEI D,CHNL0+1
1359 ADDI D,(B) ; POINT TO CHANNEL SLOT
1361 SKIPN D,-72.(D) ; PICK UP CHANNEL
1362 JRST IPCGOT ;WELL, IT GOTTA BEE THE THE IPC THEN
1365 LDB 0,[600,,STATUS(D)] ; GET DEVICE CODE
1366 CAILE 0,2 ; SKIP IF A TTY
1367 JRST HNET ; MAYBE NETWORK CHANNEL
1372 SKIPE DEMFLG ; SKIP IF NOT DEMON
1376 MOVE B,D ; CHAN TO B
1378 PUSHJ P,TTYOP2 ; RE-GOBBLE TTY
1381 HCHR11: MOVE D,CHANNO(D) ; GET ITS CHANNEL
1382 PUSH P,D ; AND SAVE IT
1383 .CALL HOWMNY ; GET # OF CHARS
1384 MOVEI B,0 ; IF TTY GONE, NO CHARS
1385 RECHR: ADDI B,1 ; BUMP BY ONE FOR SOSG
1386 MOVEM B,CHNCNT(D) ; AND SAVE
1387 IORM A,PIRQ2 ; LEAVE THE INT ON
1389 CHRLOO: MOVE D,(P) ; GET CHNNAEL NO.
1390 SOSG CHNCNT(D) ; GET COUNT
1394 MOVE D,BUFRIN(B) ; GET EXTRA BUFFER
1395 XCT IOIN2(D) ; READ CHAR
1396 JUMPL A,CHRDON ; NO CHAR THERE, FORGET IT
1398 PUSH TP,CHQUOTE CHAR
1399 PUSH TP,$TCHRS ; SAVE CHAR FOR CALL
1401 PUSH TP,$TCHAN ; SAVE CHANNEL
1403 PUSHJ P,INCHAR ; PUT CHAR IN USERS BUFFER
1404 MCALL 3,INTERRUPT ; RUN THE HANDLERS
1405 JRST CHRLOO ; AND LOOP
1407 CHRDON: .CALL HOWMNY
1409 MOVEI A,1 ; SET FOR PI WORD CLOBBER
1411 JUMPG B,RECHR ; ANY MORE?
1419 ; HERE FOR NET CHANNEL INTERRUPT
1421 HNET: CAIE 0,26 ; NETWORK?
1422 JRST HSTYET ; HANDLE PSEUDO TTY ETC.
1424 PUSH TP,MQUOTE CHAR,CHAR,INTRUP
1429 MOVE B,D ; CHAN TO B
1430 PUSHJ P,INSTAT ; UPDATE THE NETWRK STATE
1436 HSTYET: PUSH TP,$TATOM
1437 PUSH TP,MQUOTE CHAR,CHAR,INTRUP
1445 CBDCHN: ERRUUO EQUOTE BAD-CHANNEL
1449 HCLOCK: PUSH TP,$TCHSTR
1450 PUSH TP,CHQUOTE CLOCK
1454 HRUNT: PUSH TP,$TATOM
1455 PUSH TP,MQUOTE RUNT,RUNT,INTRUP
1459 HREAL: PUSH TP,$TATOM
1460 PUSH TP,MQUOTE REALT,REALT,INTRUP
1464 HPAR: MOVE A,MQUOTE PARITY,PARITY,INTRUP
1467 HMPV: MOVE A,MQUOTE MPV,MPV,INTRUP
1470 HILOPR: MOVE A,MQUOTE ILOPR,ILOPR,INTRUP
1473 HPURE: MOVE A,MQUOTE PURE,PURE,INTRUP
1474 HMPV1: PUSH TP,$TATOM
1476 PUSH P,LCKINT ; SAVE LOCN
1488 PUSH TP,EQUOTE DANGEROUS-INTERRUPT-NOT-HANDLED
1498 ; HERE TO HANDLE SYS DOWN INTERRUPT
1500 HDOWN: PUSH TP,$TATOM
1501 PUSH TP,MQUOTE SYSDOWN,SYSDOWN,INTRUP
1502 .DIETI A, ; HOW LONG?
1505 PUSH P,A ; FOR MESSAGE
1509 .SUSET [.RTTY,,B] ; DO WE NOW HAVE A TTY AT ALL?
1510 JUMPL B,DIRQ ; DONT HANG AROUND
1513 Excuse me, SYSTEM going down in /]
1514 SKIPG (P) ; SKIP IF REALLY GOING DOWN
1516 Excuse me, SYSTEM has been REVIVED!
1521 IDIVI B,30. ; TO SECONDS
1522 IDIVI B,60. ; A/ SECONDS B/ MINUTES
1526 MOVEI B,[ASCIZ / minutes /]
1532 MOVEI B,[ASCIZ / seconds.
1537 ; TWO DIGIT DEC OUT FROM B/
1540 JUMPE B,DECOU1 ; NO TEN
1543 DECOU1: MOVEI A,60(C)
1547 ; HERE TO HANDLE I/O CHANNEL ERRORS
1551 .SUSET [.RAPRC,,A] ; CONTAINS CHANNEL OF MOST RECENT LOSSAGE
1552 LDB A,[330400,,A] ; GET CHAN #
1555 PUSH TP,$TATOM ; PUSH ERROR
1556 PUSH TP,EQUOTE FILE-SYSTEM-ERROR
1557 IFE ITS, MOVE C,IOCLOS ; GET JFN
1559 ASH C,1 ; GET CHANNEL
1560 ADDI C,CHNL0+1 ; GET CHANNEL VECTOR
1563 LSH A,23. ; DO A .STATUS
1568 MOVNI A,1 ; GET "MOST RECENT ERROR"
1571 IFN ITS, PUSHJ P,GFALS ; GEN NAMED FALSE
1572 IFE ITS, PUSHJ P,TGFALS
1576 PUSH TP,MQUOTE IOC,IOC,INTRUP
1583 JUMPN B,DIRQ1 ; JUMP IF HANDLED
1587 DIRQ1: SUB TP,[6,,6]
1590 ; HANDLE INFERIOR KNOCKING AT THE DOOR
1593 IFN ITS, SUBI B,36.+16.+2 ; CONVERT TO INF #
1596 PUSH TP,MQUOTE INFERIOR,INFERIOR,INTRUP
1604 ; HERE FOR TENEX INTS (FIRST CUT)
1606 MFUNCTION %ACCHRS,SUBR,[ACTIVATE-CHARS]
1617 HRRZ D,(AB) ; CHECK LENGTH
1618 MOVEI C,0 ; SEE IF ANY NET CHANS IN USE
1619 MOVE A,[-NNETS,,NETJFN]
1624 CAILE D,NCHRS+NNETS(C)
1627 MOVEI 0,(D) ; CHECK THEM
1636 MOVSI E,-<NCHRS+NNETS> ; ZAP CURRENT
1642 MOVE A,[-NNETS,,NETJFN] ; IN CASE USED NET INTS FOR CHARS
1649 SETZB C,F ; C WILL BE MASK, F OFFSET INTO TABLE
1650 MOVSI 0,400000 ; 0 WILL BE THE BIT FOR INT MASK OR'ING
1651 JUMPE D,ALP1 ; JUMP IF NONE
1652 MOVNS D ; BUILD AOBJN POINTER TO CHRS TABLE
1654 MOVEI B,0 ; B COUNTS NUMBER DONE
1656 ALP: ILDB A,E ; GET CHR
1662 ADDI A,(F) ; POSSIBLE OFFSET FOR MORE CHANS
1668 SKIPE NETJFN-NCHRS(B)
1671 MOVEI F,36.-NNETS-UINTS-NCHRS(B)
1674 LSH 0,(G) ;NEW MASK FOR INT MASKS
1681 MOVE B,MASK1 ; SET UP FOR INT BITS
1687 RETCHR: MOVE C,[-NCHRS-NNETS,,CHRS]
1698 RETDON: PUSHJ P,CISTNG
1701 HCHAR: HRRZ A,CHRS-36.(B)
1703 PUSH TP,MQUOTE CHAR,CHAR,INTRUP
1711 HNET: SKIPLE A,NETJFN-NINT+NNETS+UINTS+1(B)
1713 SUBI B,36.-NNETS-UINTS-NCHRS
1720 PUSH TP,MQUOTE CHAR,CHAR,INTRUP
1731 PUSH TP,MQUOTE USERINT,USERINT,INTRUP
1744 GETYP A,(AB) ; ARG TYPE
1745 MOVE B,1(AB) ; AND VALUE
1746 CAIN A,TINTH ; HEADER, GO HACK
1747 JRST OFFHD ; QUEEN OF HEARTS
1751 JRST TRYHAN ; MAYBE INDIVIDUAL HANDLER
1752 CAIN 0,-2 ; MORE THAN 1 ARG?
1753 JRST OFFAC1 ; NO, GO ON
1754 CAIG 0,-5 ; CANT BE MORE THAN 2
1756 MOVEI B,2(AB) ; POINT TO 2D
1758 OFFAC1: MOVEI B,(AB)
1760 JUMPGE B,NOHAN1 ; NOT HANDLED
1762 OFFH1: PUSH P,C ; SAVE C FOR BIT CLOBBER
1765 MOVE D,MQUOTE INTERRUPT
1769 SKIPE B ; IF NO ASSOC, DONT SMASH
1770 SETOM ISTATE+1(B) ; DISABLE IN CASE QUEUED
1772 JUMPGE C,FINIS ; NO, DONE
1774 HRRZ C,INTBL(C) ; POINT TO SPECIAL CODE
1775 PUSHJ P,(C) ; GO TO SAME
1776 JUMPE E,OFINIS ; DONE
1778 CAILE E,35. ; SKIP IF 1ST WORD
1779 JRST CLRW2 ; CLOBBER 2D WORD BIT
1780 LSH 0,-1(E) ; POSITION BIT
1781 ANDCAM 0,MASK1 ; KILL BIT
1782 .SUSET [.SMASK,,MASK1]
1788 SUBI E,NETJFN-NETCHN
1796 ANDCAM 0,PIRQ ; JUST IN CASE
1799 OFINIS: MOVSI A,TINTH
1803 CLRW2: LSH 0,-36.(E) ; POS BIT FOR 2D WORD
1805 .SUSET [.SMSK2,,MASK2]
1809 TRYHAN: CAIE A,THAND ; HANDLER?
1813 GETYP 0,IPREV(B) ; GET TYPE OF PREV
1815 SKIPN C,IPREV+1(B) ; dont act silly if already off! (TT)
1819 JRST DOHEAD ; PREV HUST BE HDR
1822 DOHEAD: MOVEM A,IHNDLR+1(C) ; INTO HDR
1826 OFFINI: SETZM IPREV+1(B) ; Leave NXT slot intact for RUNINT (BKD)
1832 PUSHJ P,GETNMS ; GET INFOR ABOUT INT
1838 GETNMS: GETYP A,INAME(B) ; CHECK FOR SPECIAL
1842 PUSHJ P,LOCQ ; LOCATIVE?
1845 MOVEI B,INAME(B) ; POINT TO LOCATIVE
1847 PUSHJ P,SMON ; GET MONITOR
1849 GETNM1: HRROI C,SS.WMO ; ASSUME WRITE
1852 MOVE D,MQUOTE WRITE,WRITE,INTRUP
1854 MOVE D,MQUOTE READ,READ,INTRUP
1857 CHGTNM: JUMPL C,CPOPJ
1860 MOVE B,1(AB) ; RESTORE IHEADER
1863 ; EMERGENCY, CANT DEFER ME!!
1871 MFUNCTION INTERRUPT,SUBR
1877 SETZM INTHLD ; RE-ENABLE THE WORLD
1879 MOVE B,1(AB) ; GET HANDLER/NAME
1880 GETYP A,(AB) ; CAN BE HEADER OR NAME
1881 CAIN A,TINTH ; SKIP IF NOT HEADER
1885 CAIE A,TCHSTR ; SKIP IF CHAR STRING
1887 MOVEI B,(AB) ; LOOK UP NAME
1888 PUSHJ P,FNDNM ; GET NAME
1891 CAMN B,MQUOTE CHAR,CHAR,INTRUP
1893 CAME B,MQUOTE READ,READ,INTRUP
1894 CAMN B,MQUOTE WRITE,WRITE,INTRUP
1899 GTHEAD: SKIPE ISTATE+1(B) ; ENABLED?
1900 JRST IFALSE ; IGNORE COMPLETELY
1901 MOVE A,INTPRI+1(B) ; GET PRIORITY OF INTERRUPT
1902 CAMLE A,CURPRI ; SEE IF MUST QUEU
1903 JRST SETPRI ; MAY RUN NOW
1904 SKIPE (P) ; SKIP IF DEFER OK
1907 PUSH TP,$TINTH ; SAVE HEADER
1909 MOVEI A,1 ; SAVE OTHER ARGS
1910 PSHARG: ADD AB,[2,,2]
1911 JUMPGE AB,QUEU1 ; GO MAKE QUEU ENTRY
1915 QUEU1: PUSHJ P,IEVECT ; GET VECTOR
1917 PUSH TP,[0] ; WILL HOLD QUEUE HEADER
1921 POP P,A ; RESTORE PRIORITY
1923 MOVE B,QUEUES+1 ; GET INTERRUPT QUEUES
1925 JUMPGE B,GQUEU ; MAKE A QUEUE HDR
1927 NXTQU: CAMN A,1(B) ; GOT PRIORITY?
1928 JRST ADDQU ; YES, ADD TO THE QUEU
1929 CAML A,1(B) ; SKIP IF SPOT NOT FOUND
1932 MOVE B,3(B) ; GO TO NXT QUEUE
1935 GQUEU: PUSH TP,$TVEC ; SAVE NEXT POINTER
1938 PUSH TP,A ; SAVE PRIORITY
1947 MOVE D,(TP) ; NOW SPLICE
1952 GQUEU1: MOVEM B,3(D)
1954 ADDQU: MOVEM B,-2(TP) ; SAVE QUEU HDR
1957 PUSHJ P,INCONS ; CONS IT
1958 MOVE C,(TP) ;GET QUEUE HEADER
1959 SKIPE D,7(C) ; IF END EXISTS
1962 SKIPN 5(C) ; SKIP IF START EXISTS
1965 IFINI: MOVSI A,TATOM
1969 SETPRI: EXCH A,CURPRI
1972 PUSH TP,$TAB ; PASS AB TO HANDLERS
1975 PUSHJ P,RUNINT ; RUN THE HANDLERS
1976 POP P,A ; UNQUEU ANY WAITERS
1981 ; HERE TO UNQUEUE WAITING INTERRUPTS
1983 UNQUEU: PUSH P,A ; SAVE NEW LEVEL
1985 UNQUE1: MOVE A,(P) ; TARGET LEVEL
1986 CAMLE A,CURPRI ; CHECK RUG NOT PULLED OUT
1989 CAML A,1(B) ; RIGHT LEVEL?
1990 JRST UNDONE ; FINISHED
1992 SKIPN C,5(B) ; ON QUEUEU?
1994 HRRZ D,(C) ; CDR THE LIST
1996 SKIPN D ; SKIP IF NOT LAST
1997 SETZM 7(B) ; CLOBBER END POINTER
1998 MOVE A,1(B) ; GET THIS PRIORITY LEVEL
1999 MOVEM A,CURPRI ; MAKE IT THE CURRENT ONE
2000 MOVE D,1(C) ; GET SAVED VECTOR OF INF
2002 MOVE B,1(D) ; INT HEADER
2004 PUSH TP,D ; AND ARGS
2006 PUSHJ P,RUNINT ; RUN THEM
2009 UNDONE: POP P,CURPRI ; SET CURRENT LEVEL
2013 UNXQ: MOVE B,3(B) ; GO TO NEXT QUEUE
2019 ; SUBR TO CHANGE INTERRUPT LEVEL
2021 MFUNCTION INTLEV,SUBR,[INT-LEVEL]
2023 JUMPGE AB,RETLEV ; JUST RETURN CURRENT
2026 JRST WTYP1 ; LEVEL IS FIXED
2029 CAMN A,CURPRI ; DIFFERENT?
2030 JRST RETLEV ; NO RETURN
2032 CAMG A,CURPRI ; SKIP IF NO UNQUEUE NEEDED
2034 MOVEM A,CURPRI ; SAVE
2037 RETLEV: MOVE B,CURPRI
2041 RUNINT: PUSH TP,$THAND ; SAVE HANDLERS LIST
2044 SKIPN ISTATE+1(B) ; SKIP IF DISABLED
2047 NXHND: MOVEM B,(TP) ; SAVE CURRENT HDR
2048 MOVE A,-2(TP) ; SAVE ARG POINTER
2049 PUSHJ P,CHSWAP ; SEE IF MUST SWAP
2052 MOVEI C,1 ; COUNT ARGS
2053 PUSH TP,SPSTOR ; SAVE INITIAL BINDING POINTER
2056 ADD D,[1STEPR,,1STEPR]
2062 NBIND: PUSH TP,INTFCN(B)
2069 DO.HND: MOVE PVP,PVSTOR+1
2070 SKIPN 1STEPR+1(PVP) ; NECESSARY TO DO 1STEP BINDING ?
2071 JRST NBIND1 ; NO, DON'T BOTHER
2073 PUSHJ P,SPECBE ; BIND 1 STEP FLAG
2075 NBIND1: ACALL C,INTAPL ; RUN HAND WITH POSSIBLY BOUND 1STEP FLAG
2076 MOVE SP,SPSTOR+1 ; GET CURRENT BINDING POINTER
2077 CAMN SP,-4(TP) ; SAME AS SAVED BINDING POINTER ?
2078 JRST NBIND2 ; YES, 1STEP FLAG NOT BOUND
2079 MOVE C,(TP) ; RESET 1 STEP
2081 MOVEM C,1STEPR+1(PVP)
2082 MOVE SP,-4(TP) ; RESTORE SAVED BINDING POINTER
2084 NBIND2: SUB TP,[6,,6]
2087 SUB TP,[4,,4] ; NO PROCESS CHANGE, POP JUNK
2092 MOVEM D,TPSTO+1(E) ; FIXUP HIS STACK
2093 DO.H1: GETYP A,A ; CHECK FOR A DISMISS
2096 MOVE B,(TP) ; TRY FOR NEXT HANDLER
2099 SUBTP4: SUB TP,[4,,4]
2102 MFUNCTION INTAPL,SUBR,[RUNINT]
2106 NOHAND: JUMPE C,NOHAN1
2108 PUSH TP,EQUOTE INTERNAL-INTERRUPT
2109 NOHAN1: PUSH TP,(AB)
2112 PUSH TP,EQUOTE NOT-HANDLED
2118 DEFERR: PUSH TP,$TATOM
2119 PUSH TP,EQUOTE ATTEMPT-TO-DEFER-UNDEFERABLE-INTERRUPT
2123 PUSH TP,MQUOTE INTERRUPT
2124 MCALL 3,RERR ; FORCE REAL ERROR
2127 ; FUNCTION TO DISMISS AN INTERRUPT TO AN ARBITRARY ACTIVATION
2129 MFUNCTION DISMISS,SUBR
2144 DISMI3: MOVEI A,(TB)
2146 DISMI0: HRRZ B,FSAV(A)
2152 MOVEI 0,(A) ; SAVE FRAME
2154 HRRM A,PCSAV(E) ; GET IT BACK HERE
2163 MOVE B,0 ; DEST FRAME
2165 MOVE A,PSAV(E) ; NOW MUNG SAVED INT LEVEL
2166 MOVEM D,-1(A) ; ZAP YOUR MUNGED
2167 PUSHJ P,CHUNW ; CHECK ON UNWINDERS
2168 JRST FINIS ; FALL DOWN
2195 DISMI2: CAMN SP,-4(TP) ; 1STEP FLAG BEEN BOUND ?
2199 MOVEM C,1STEPR+1(PVP)
2201 NDISMI: SUB TP,[6,,6]
2202 PUSHJ P,CHUNSW ; UNDO ANY PROCESS HACKING
2204 CAME E,PVSTOR+1 ; SWAPED?
2209 SUB C,[4,,4] ; MAYBE FIXUP OTHER STACK
2216 MOVE A,-1(P) ; SAVED PRIORITY
2239 GTLOC1: GETYP A,2(AB)
2242 MOVE D,B ; RET ATOM FOR ASSOC
2246 \f; MONITOR CHECKERS
2248 MONCH0: HLLZ 0,(B) ; POTENTIAL MONITORS
2249 MONCH: TLZ 0,TYPMSK ; KILL TYPE
2250 IOR C,0 ; IN NEW TYPE
2256 TLNN 0,.WRMON ; SKIP IF WRITE MONIT
2259 ; MONITOR IS ON, INVOKE HANDLER
2261 PUSH TP,A ; SAVE OBJ
2264 PUSH TP,D ; SAVE DATUM
2265 MOVSI C,TATOM ; PREPARE TO FIND IT
2266 MOVE D,MQUOTE WRITE,WRITE,INTRUP
2268 JUMPE B,MONCH1 ; NOT FOUND IGNORE FOR NOW
2269 PUSH TP,A ; START SETTING UP CALL
2275 PUSHJ P,FRMSTK ; PUT FRAME ON STAKC
2276 MCALL 4,EMERGE ; DO IT
2281 HLLZ 0,(B) ; UPDATE MONITORS
2286 ; NOW FOR READ MONITORS
2289 RMONCH: TLNN 0,.RDMON
2294 MOVE D,MQUOTE READ,READ,INTRUP
2301 PUSHJ P,FRMSTK ; PUT FRAME ON STACK
2307 ; PUT THE CURRENT FRAME ON THE STACK
2309 FRMSTK: PUSHJ P,MAKACT
2315 ; HERE TO COMPLAIN ABOUT ATTEMPTS TO MUNG PURE CODE
2317 PURERR: PUSH TP,$TATOM
2318 PUSH TP,EQUOTE ATTEMPT-TO-MUNG-PURE-STRUCTURE
2324 ; PROCESS SWAPPING CODE
2326 CHSWAP: MOVE E,PVSTOR+1 ; GET CURRENT
2328 SKIPE D,INTPRO+1(B) ; SKIP IF NO PROCESS GIVEN
2329 CAMN D,PVSTOR+1 ; SKIP IF DIFFERENT
2332 PUSHJ P,SWAPIT ; DO SWAP
2334 PSHPRO: PUSH TP,$TPVP
2338 CHUNSW: MOVE E,PVSTOR+1 ; RET OLD PROC
2339 MOVE D,-2(TP) ; GET SAVED PROC
2340 CAMN D,PVSTOR+1 ; SWAPPED?
2344 MOVE 0,PSTAT+1(D) ; CHECK STATE
2348 MOVEM 0,PSTAT+1(PVP)
2350 MOVEM 0,PSTAT+1(D) ; SAVE NEW STATE
2356 ;SUBROUTINE TO GET BIT FOR CLOBBERAGE
2358 GETBIT: MOVNS B ;NEGATE
2359 MOVSI A,400000 ;GET THE BIT
2360 LSH A,(B) ;SHIFT TO POSITION
2363 ; HERE TO HANDLE PURE WRITE AND CHECK FOR POSSIBLE C/W
2366 GCPWRT: SKIPN GCDFLG ; SEE IF IN DUMPER OR PURIFYER
2369 MOVEI B,4 ; INDICATE PURE WRITE
2370 JRST NOPUGC ; CONTINUE
2372 MOVEM A,TSINT ; SVE A
2376 CAML A,RPURBT ; SKIP IF NOT PURE
2377 CAIL A,HIBOT ; DONT MARK IF TOUCHING INTERPRETER
2379 SETOM PURMNG ; MUNGING PURENESS INDICATE
2380 MOVE B,BUFGC ; GET BUFFER
2381 JUMPL B,GCPW1 ; JUMP IF WINDOW IS BUFFER
2383 PUSHJ P,%CWINF ; GO DO COPY/WRITE
2385 MOVE A,TSINT ; RESTORE A
2386 JRST 2NDWORD ; CONTINUE
2388 MOVEI B,WIND ; START OF BUFFER
2389 PUSHJ P,%CWINF ; C/W
2390 MOVEI B,WNDP ; RESTORE WINDOW
2391 MOVE A,WNDBOT ; BOTTOM OF WINDOW
2392 ASH A,-10. ; TO PAGES
2394 PUSHJ P,%SHWND ; SHARE IT
2399 ; HERE TO HANDLE BUFFERING FOR GC-DUMP AND PURIFY FOR TENEX
2401 PWRIT: SKIPN GCDFLG ; SEE IF IN DUMPER OR PURIFYER
2405 EXCH P,GCPDL ; GET A GOOD PDL
2406 MOVEM A,TSAVA ; SAVE AC'S
2408 MOVEI A,MFORK ; FOR TWENEX THIS IS A MOVEI
2409 SKIPE OPSYS ; SKIP IF TOPS20
2410 MOVSI A,MFORK ; FOR A TENEX IT SHOULD BE A MOVSI
2411 GTRPW ; GET TRAP WORDS
2412 PUSH P,A ; SAVE ADDRESS AND WORD
2415 CAML A,RPURBT ; SKIP IF NOT PURE
2416 CAIL A,HIBOT ; DONT MARK IF TOUCHING INTERPRETER
2418 SETOM PURMNG ; MUNGING PURENESS INDICATE
2419 MOVE B,BUFGC ; GET BUFFER
2420 ANDCMI A,1777 ; TO PAGE BOUNDRY
2421 JUMPL B,PWRIT2 ; USE WINDOW AS BUFFER
2422 PWRIT3: PUSHJ P,%CWINF ; FIX UP
2423 PWRIT4: POP P,B ; RESTORE AC'S
2425 TLNN A,10 ; SEE IF R/W CYCLE
2426 MOVEM B,(A) ; FINISH WRITE
2429 PWRIT2: MOVEI B,WIND
2430 PUSHJ P,%CWINF ; GO TRY TO WIN
2432 MOVE A,WNDBOT ; BOTTOM OF WINDOW
2433 ASH A,-10. ; TO PAGES
2435 PUSHJ P,%SHWND ; SHARE IT
2439 ;HERE TO HANDLE PDL OVERFLOW. ASK FOR A GC
2443 MOVEM A,TSINT ;SAVE INT WORD
2446 SKIPE GCFLG ;IS GC RUNNING?
2447 JRST GCPLOV ;YES, COMPLAIN GROSSLY
2449 MOVEI A,200000 ;GET BIT TO CLOBBER
2450 IORM A,PIRQ ;LEAVE A MESSAGE FOR HIGHER LEVEL
2452 EXCH P,GCPDL ;GET A WINNING PDL
2453 HRRZ B,TSINTR ;GET POINTER TO LOSING INSTRUCTION
2458 SKIPG GCPDL ; SKIP IF NOT P
2459 LDB B,[270400,,-1(B)] ;GET AC FIELD
2460 SKIPL GCPDL ; SKIP IF P
2462 MOVEI A,(B) ;COPY IT
2465 ADDI A,0STO(PVP) ;POINT TO THIS ACS CURRENT TYPE
2467 HLRZ A,(A) ;GET THAT TYPE INTO A
2469 MOVEI B,GCPDL ;POINT TO SAVED P
2471 CAIN B,B ;OR IS IT B ITSELF
2477 MOVEI B,1(P) ;C WILL BE ON THE STACK
2482 MOVE A,(B) ;GET THE LOSING POINTER
2483 MOVEI C,(A) ;AND ISOLATE RH
2485 CAMG C,VECTOP ;CHECK IF IN GC SPACE
2487 JRST NOGROW ;NO, COMPLAIN
2492 HLRZ C,A ;GET -LENGTH
2493 SUBI A,-1(C) ;POINT TO A DOPE WORD
2494 POP P,C ;RESTORE TYPE INTO C
2495 PUSH P,D ; SAVE FOR GROWTH HACKER
2497 CAIN C,TPDL ; POINT TD TO APPROPRIATE DOPE WORD
2501 JUMPE D,BADPDL ; IF D STILL 0, THIS PDL IS WEIRD
2502 MOVEI A,PDLBUF(A) ; POINT TO ALLEGED REAL DOPE WORD
2503 SKIPN (D) ; SKIP IF PREVIOUSLY BLOWN
2504 MOVEM A,(D) ; CLOBBER IN
2505 CAME A,(D) ; MAKE SURE IT IS THE SAME
2510 PNTRHK: MOVE C,(B) ;RESTORE PDL POINTER
2511 SUB C,[PDLBUF,,0] ;FUDGE THE POINTER
2512 MOVEM C,(B) ;AND STORE IT
2514 POP P,C ;RESTORE THE WORLD
2515 EXCH P,GCPDL ;GET BACK ORIG PDL
2517 MOVE A,TSINT ;RESTORE INT WORD
2519 JRST IMPCH ;LOOK FOR MORE INTERRUPTS
2521 IFE ITS, JRST GCQUIT
2523 TPOVFL: SETOM INTFLG ;SIMULATE PDL OVFL
2525 MOVEI A,200000 ;TURN ON THE BIT
2527 HLRE A,TP ;FIND DOPEW
2528 SUBM TP,A ;POINT TO DOPE WORD
2529 MOVEI A,PDLBUF+1(A) ; ZERO LH AND POINT TO DOPEWD
2532 CAME A,TPGROW ; MAKE SURE WINNAGE
2534 SUB TP,[PDLBUF,,0] ; HACK STACK POINTER
2539 ; GROW CORE IF PDL OVERFLOW DURING GC
2541 GCPLOV: EXCH P,GCPDL ; NEED A PDL TO CALL P.CORE
2542 PUSHJ P,GPDLOV ; HANDLE PDL OVERFLOW
2556 ;HERE TO HANDLE LOW-LEVEL CHANNELS
2559 CHNACT: SKIPN GCFLG ;GET A WINNING PDL
2561 ANDI A,177777 ;ISOLATE CHANNEL BITS
2564 CHNA1: MOVEI B,0 ;BIT COUNTER
2567 SUBI B,35. ;NOW HAVE CHANNEL
2572 MOVEI 0,(B) ; COPY TO 0
2573 LSH 0,23. ;POSITION FOR A .STATUS
2576 ANDI 0,77 ;ISOLATE DEVICE
2580 PMIN4: MOVE 0,B ; CHAN TO 0
2582 JRST .+2 ; DONE, GO ON
2584 SETZM GCFLCH ; LEAVE GC MODE
2598 MFUNCTION GASCII,SUBR,ASCII
2611 SKIPGE B,1(AB) ;GET NUMBER
2613 CAILE B,177 ;CHECK RANGE
2618 TOOBIG: ERRUUO EQUOTE ARGUMENT-OUT-OF-RANGE
2621 ;HERE IF PDL OVERFLOW DURING GARBAGE COLLECTION
2623 BADPDL: FATAL NON PDL OVERFLOW
2625 NOGROW: FATAL PDL OVERFLOW ON NON EXPANDABLE PDL
2627 PDLOS1: MOVEI D,TPGROW
2628 PDLOSS: MOVSI A,(GENERAL) ; FIX UP TP DOPE WORD JUST IN CASE
2629 HRRZ D,(D) ; POINT TO POSSIBLE LOSING D.W.
2633 MOVEI A,(TP) ; SEE IF REL STACK SIZE WINS
2637 PDLOS2: MOVSI A,.VECT.
2640 SUB P,[2,,2] ; TRY TO RECOVER GRACEFULLY
2642 MOVEI A,DOAGC ; SET UP TO IMMEDIATE GC
2652 IFN ITS, .DISMIS TSINTR
2656 SUB P,[2,,2] ; ALLOW ROOM FOR CALL
2657 JSP E,PDL3 ; CLEANUP
2658 ERRUUO EQUOTE PDL-OVERFLOW-BUFFER-EXHAUSTED
2661 DLOSER: PUSH P,LOSRS(B)
2672 ;MEMORY PROTECTION INTERRUPT
2674 IOC: FATAL IO CHANNEL ERROR IN GARBAGE COLLECTOR
2675 IMPV: FATAL MPV IN GARBAGE COLLECTOR
2677 IPURE: FATAL PURE WRITE IN GARBAGE COLLECTOR
2678 ILOPR: FATAL ILLEGAL OPEREATION IN GARBAGE COLLECTOR
2682 ;SUBROUTINE TO BE CALLED AT INITIALIZE TIME TO SETUP INTS
2684 INTINT: SETZM CHNCNT
2685 MOVE A,[CHNCNT,,CHNCNT+1]
2688 .SUSET [.SPICLR,,[-1]]
2689 MOVE A,MASK1 ;SET MASKS
2691 .SETM2 A, ;SET BOTH MASKS
2694 SETZM QUEUES+1 ;UNQUEUE ANY OLD INTERRUPTS
2700 ; INITIALIZE TENEX INTERRUPT SYSTEM
2702 INTINT: CIS ; CLEAR THE INT WORLD
2703 SETZM INTFLG ; IN CASE RESTART
2704 MOVSI A,TVEC ; FIXUP QUEUES
2707 SETZM CURPRI ; AND PRIORITY LEVEL
2708 MOVEI A,MFORK ; TURN ON MY INTERRUPTS
2711 PUSHJ P,@[DOSIR] ; HACK TO TEMP GET TO SEGMENT 0
2714 INTINM: MOVE B,[-36.,,CHNTAB]
2719 MOVE B,[LEVTAB,,CHNTAB] ; POINT TO TABLES
2720 SIR ; TELL SYSTEM ABOUT THEM
2722 INTINX: MOVSI D,-NCHRS
2726 INTILP: SKIPN A,CHRS(D)
2735 DPB C,[360600,,MASK1]
2736 MOVE B,MASK1 ; SET UP FOR INT BITS
2739 MOVEI A,MFORK ; DO THE ENABLE
2744 DOSIR: MOVE B,[-36.,,CHNTAB]
2745 MOVSI 0,<1_12.>+FSEG
2749 MOVEI B,..ARGB ; WILL RUN IN SEGMENT 0
2758 XJRST C ; GET BACK TO CALLING SEGMENT
2764 MFUNCTION QUITTER,SUBR
2776 CAIN B,^S ; HANDLE CNTL-S
2781 PUSHJ P,CLEAN ; CLEAN UP I/O CHANNELS
2783 PUSH TP,EQUOTE CONTROL-G?
2787 RETLIS: MOVE B,IMQUOTE LER,[LERR ]INTRUP
2788 PUSHJ P,ILVAL ; GET CURRENT VALUE
2794 MOVEI D,(TB) ; FIND A LISTEN OR ERROR TO RET TO
2796 RETLI1: HRRZ A,OTBSAV(D)
2797 CAIN A,(B) ; CHECK FOR WINNER
2799 HRRZ C,FSAV(A) ; CHECK FUNCTION
2801 CAIN C,ERROR ; FOUND?
2802 JRST FNDHIM ; YES, GO TO SAME
2803 CAIN C,ERROR% ; FUNNY ERROR
2805 CAIN C,TOPLEV ; NO ERROR/LISTEN
2810 FNDHIM: PUSH TP,$TTB
2813 MOVE B,(TP) ; NEW FRAME
2816 PUSHJ P,CHUNW ; UNWIND?
2821 CLEAN: MOVE B,3(AB) ; GET IN CHAN
2823 MOVE B,3(AB) ; CHANNEL BAKC
2825 SKIPN C,ECHO(C) ; GET ECHO
2829 CAMN C,[PUSHJ P,MTYO]
2837 MOVEI A,101 ; OUTPUT JFN
2841 CLUNQ: SETZB A,CURPRI
2846 ONINT: 0 ; INT FUDGER
2847 INTBCK: 0 ; GO BACK TO THIS PC AFTER INTERRUPT
2848 MOVEM TP,TPSAV(TB) ; SAVE STUFF
2850 INTBEN: SKIPL INTFLG ; PENDING INTS?
2861 ;RANDOM IMPURE CRUFT NEEDED
2862 CHNCNT: BLOCK 16. ; # OF CHARS IN EACH CHANNEL
2866 PIRQ: 0 ;HOLDS REQUEST BITS FOR 1ST WORD
2867 PIRQ2: 0 ;SAME FOR WORD 2
2869 MASK1: 200,,200100 ;FIRST MASK
2870 MASK2: 0 ;SECOND THEREOF
2871 CURPRI: 0 ; CURRENT PRIORITY
2885 0 ; PC INT LEVEL 1 (1ST WORD IN 1 SEG MODE, 2D
2886 ; IN MULTI SEG MODE)
2896 IOCLOS: 0 ; HOLDS LOSING JFN IN TNX IOC