1 TITLE INTERRUPT HANDLER FOR MUDDLE
\r
12 IFE ITS,.INSRT MUDSYS;STENEX >
\r
15 PDLGRO==10000 ;AMOUNT TO GROW A PDL THAT LOSES
\r
16 NINT==72. ;MAXIMUM NUMBER OF INTERRUPTS POSSIBLE
\r
19 ;SET UP LOCATION 42 TO POINT TO TSINT
\r
23 ZZZ==$. ;SAVE CURRENT LOCATION
\r
27 JSR MTSINT ;GO TO HANDLER
\r
33 ; GLOBALS NEEDED BY INTERRUPT HANDLER
\r
35 .GLOBAL ONINT ; FUDGE INS EXECUTED IF NON ZERO AT START OF INTERRUPT
\r
36 .GLOBA GCFLG ;TELLS WHETHER OR NOT GARBAGE COLLECTOR IS RUNNING
\r
37 .GLOBAL GCFLCH ; FLUSH CHARS IMMEDIATE SO GC CAN SEE THEM
\r
38 .GLOBAL CORTOP ; TOP OF CORE
\r
39 .GLOBA GCINT ;TELLS GARBAGE COLLECTOR TO SIMULATE AN INTERRUPT
\r
40 .GLOBAL INTNUM,INTVEC ;TV ENTRIES CONCERNING INTERRUPTS
\r
41 .GLOBAL AGC ;CALL THE GARBAGE COLLECTOR
\r
42 .GLOBAL VECNEW,PARNEW,GETNUM ;GC PSEUDO ARGS
\r
43 .GLOBAL GCPDL ;GARBAGE COLLECTORS PDL
\r
44 .GLOBAL VECTOP,VECBOT ;DELIMIT VECTOR SPACE
\r
46 .GLOBAL PDLBUF ;AMOUNT OF PDL GROWTH
\r
47 .GLOBAL PGROW ;POINTS TO DOPE WORD OF NEXT PDL TO GROW
\r
48 .GLOBAL TPGROW ;POINTS TO NEXT MUDDLE PDL TO GROW
\r
49 .GLOBAL TOPLEV,ERROR%,N.CHNS,CHNL1
\r
50 .GLOBAL BUFRIN,CHNL0,SYSCHR ;CHANNEL GLOBALS
\r
51 .GLOBAL IFALSE,TPOVFL,1STEPR,INTOBL,INCHAR,CURPRI,RDEVIC,RDIREC,GFALS,STATUS
\r
52 .GLOBAL PSTAT,NOTRES,IOIN2,INAME,INTFCN,CHNCNT,CHANNO,GIBLOK,ICONS,INCONS
\r
53 .GLOBAL IEVECT,INSRTX,ILOOKC,IPUT,IREMAS,IGET,CSTAK,EMERGE
\r
54 .GLOBAL MTSINT ;BEGINNING OF INTERRUPT HANDLER
\r
55 .GLOBAL INTINT ;CALLED BY INITIALIZER TO TAKE CARE OF INT PCS
\r
56 .GLOBAL FRMSTK,APPLY,CHUNW
\r
57 .GLOBAL IPCGOT,DIRQ ;HANDLE BRANCHING OFF TO IPC KLUDGERY
\r
60 .GLOBAL GCTIM,GCCAUS,GCCALL
\r
62 ; GLOBALS FOR MONITOR ROUTINES
\r
64 .GLOBAL MONCH,MONCH0,RMONCH,RMONC0,LOCQ,SMON,BAPT,APLQ,MAKACT,NAPT
\r
65 .GLOBAL PURERR,BUFRIN,INSTAT
\r
69 .GLOBAL MSGTYP,MTYI,UPLO,IFLUSH,OCLOS,ERRET,MASK1,MASK2 ;SUBROUTINES USED
\r
70 .GLOBAL ERROR,LISTEN,ECHO,RRESET,MTYO,GCHAPN,P.CORE,P.TOP,QUEUES,NOTTY,TTYOP2,TTICHN
\r
71 .GLOBAL INTHLD,BNDV,SPECBE
\r
72 ;BEGINNING OF ACTUAL INTERRUPT HANDLER (MUST BE IMPURE)
\r
75 ;***** TEMP FUDGE *******
\r
80 ; DECLARATIONS ASSOCIATED WITH INTERRUPT HANDERS AND HEADERS
\r
84 SPECIN: IRP A,,[CHAR,CLOCK,MPV,ILOPR,WRITE,READ,IOC,PURE,SYSDOWN,INFERIOR,RUNT,REALT
\r
90 ; TABLE OF SPECIAL FINDING ROUTINES
\r
92 FNDTBL: IRP A,,[GETCHN,0,0,0,LOCGET,LOCGET,0,0,0,0,0,0,0]
\r
96 ; TABLE OF SPECIAL SETUP ROUTINES
\r
98 INTBL: IRP A,,[S.CHAR,S.CLOK,S.MPV,S.ILOP,S.WMON,S.RMON,S.IOC,S.PURE,S.DOWN,S.INF
\r
99 S.RUNT,S.REAL,S.PAR]
\r
106 ; EXTERNAL INTERRUPT TABLE
\r
108 EXTINT: REPEAT NINT-36.,0
\r
116 IRP A,,[[HCLOCK,13.],[HMPV,14.],[HILOPR,6],[HIOC,9],[HPURE,26.],[HDOWN,7],[HREAL,35.]
\r
117 [HRUNT,34.],[HPAR,28.]]
\r
131 ; TABLES FOR TENEX INTERRUPT SYSTEM
\r
133 LEVTAB: P1 ; POINTS TO INT PC HOLDERS FOR LEVS 1,2 AND 3
\r
137 CHNMSK==0 ; WILL BE MASK WORD FOR INT SET UP
\r
139 NNETS==10. ; ALLOW 10 NETWRK INTERRUPTS
\r
142 CHNTAB: ; LOCATION OF INT ROUTINES FOR VARIOUS "CHANNELS"
\r
143 BLOCK 36.-NNETS ; THERE AR 36. TENEX INT CHANNELS
\r
145 REPEAT NNETS, 1,,INTNET+3*.RPCNT
\r
147 IRP A,,[[0,CNTLG],[1,CNTLS],[9.,TNXPDL]]
\r
151 CHNMSK==CHNMSK+<1_<35.-B>>
\r
157 EXTINT: BLOCK NINT-NNETS
\r
161 IRP A,,[[HCNTLG,36.],[HCNTLS,37.]]
\r
172 ; HANDLER/HEADER PARAMETERS
\r
176 IHDRLN==4 ; LENGTH OF HEADER BLOCK
\r
178 INAME==0 ; NAME OF INTERRUPT
\r
179 ISTATE==2 ; CURRENT STATE
\r
180 IHNDLR==4 ; POINTS TO LIST OF HANDLERS
\r
181 INTPRI==6 ; CONTAINS PRIORITY OF INTERRUPT
\r
183 IHANDL==4 ; LENGTH OF A HANDLER BLOCK
\r
185 INXT==0 ; POINTS TO NEXTIN CHAIN
\r
186 IPREV==2 ; POINTS TO PREV IN CHAIN
\r
187 INTFCN==4 ; FUNCTION ASSOCIATED WITH THIS HANDLER
\r
188 INTPRO==6 ; PROCESS TO RUN INT IN
\r
194 MTSINT: 0 ;INTERRUPT BITS GET STORED HERE
\r
195 TSINTR: 0 ;INTERRUPT PC WORD STORED HERE
\r
196 JRST TSINTP ;GO TO PURE CODE
\r
198 ; SOFTWARE INTERNAL INTERRUPTS JSR TO HERE
\r
208 ; JSR HERE FOR SOFTWARE INTERNAL INTERRUPTS
\r
218 ;THE REST OF THIS CODE IS PURE
\r
220 TSINTP: SOSGE INTFLG ; SKIP IF ENABLED
\r
221 SETOM INTFLG ;DONT GET LESS THAN -1
\r
223 MOVEM A,TSAVA ;SAVE TWO ACS
\r
225 MOVE A,TSINT ;PICK UP INT BIT PATTERN
\r
226 JUMPL A,2NDWORD ;DONT CHECK FOR PDL OVERFLOW ETC. IF SIGN BIT ON
\r
228 TRZE A,200000 ;IS THIS A PDL OVERFLOW?
\r
229 JRST IPDLOV ;YES, GO HANDLE IT FIRST
\r
232 TRNE A,20000 ;IS IT A MEMORY PROTECTION VIOLATION?
\r
233 MOVEI B,1 ; FLAG SAME
\r
235 TRNE A,40 ;ILLEGAL OP CODE?
\r
236 MOVEI B,2 ; ALSO FLAG
\r
243 SOJGE B,DO.NOW ; CANT WAIT AROUND
\r
245 ;DECODE THE REST OF THE INTERRUPTS USING A TABLE
\r
248 JUMPL A,GC2 ;2ND WORD?
\r
249 IORM A,PIRQ ;NO, INTO WORD 1
\r
250 JRST GCQUIT ;AND DISMISS INT
\r
252 GC2: TLZ A,400000 ;TURN OFF SIGN BIT
\r
254 TRNE A,177777 ;CHECK FOR CHANNELS
\r
255 JRST CHNACT ;GO IF CHANNEL ACTIVITY
\r
257 GCQUIT: SKIPGE INTFLG ;SKIP IF INTERRUPTS ENABLED
\r
258 JRST INTDON ;NO, DEFER REAL HANDLING UNTIL LATER
\r
260 MOVE A,TSINTR ;PICKUP RETURN WORD
\r
262 TLON A,10000 ; EXEC PC?
\r
263 SUBI A,1 ; YES FIXUP PC
\r
265 MOVEM A,LCKINT ;STORE ELSEWHERE
\r
266 MOVEI A,DOINTE ;CAUSE DISMISS TO HANDLER
\r
267 HRRM A,TSINTR ;STORE IN INT RETURN
\r
268 PUSH P,INTFLG ;SAVE INT FLAG
\r
269 SETOM INTFLG ;AND DISABLE
\r
272 INTDON: MOVE A,TSAVA ;RESTORE ACS
\r
274 IFN ITS, .DISMISS TSINTR ;AND DISMISS THE INTERRUPT
\r
278 DO.NOW: SKIPE GCFLG
\r
279 JRST DLOSER ; HANDLE FATAL GC ERRORS
\r
281 SKIPGE INTFLG ; IF NOT ENABLED
\r
282 MOVEM B,INTFLG ; PRETEND IT IS
\r
287 ; HERE FOR TENEX PDL OVER FLOW INTERRUPT
\r
289 TNXPDL: SOSGE INTFLG
\r
293 JRST IPDLOV ; GO TO COMMON HANDLER
\r
295 ; HERE FOR TENEX ^G AND ^S INTERRUPTS
\r
297 CNTLG: MOVEM A,TSAVA
\r
301 CNTLS: MOVEM A,TSAVA
\r
304 CNTSG: MOVEM B,TSAVB
\r
305 IORM A,PIRQ2 ; SAY FOR MUDDLE LEVEL
\r
312 MOVE A,[1_<.RPCNT+NETCHN>]
\r
317 ; HERE TO PROCESS INTERRUPTS
\r
319 DOINT: SKIPE INTHLD ; GLOBAL LOCK ON INTS
\r
321 SETOM INTHLD ; DONT LET IT HAPPEN AGAIN
\r
323 DOINTE: SKIPE ONINT ; ANY FUDGE?
\r
324 XCT ONINT ; YEAH, TRY ONE
\r
325 EXCH 0,LCKINT ; RELATIVIZE PC IF FROM RSUBR
\r
326 PUSH P,0 ; AND SAVE
\r
331 SUBI 0,(M) ; M IS BASE REG
\r
332 HLL 0,(P) ; GET FLAGS
\r
333 TLO 0,M ; INDEX IT OFF M
\r
334 EXCH 0,(P) ; AND RESTORE TO STACK
\r
335 DONREL: EXCH 0,LCKINT ; GET BACK SAVED 0
\r
336 SETZM INTFLG ;DISABLE
\r
337 AOS -1(P) ;INCR SAVED FLAG
\r
339 ;NOW SAVE WORKING ACS
\r
342 HLRZ A,-1(P) ; HACK FUNNYNESS FOR MPV/ILOPR
\r
344 SETZM -1(P) ; REALLY DISABLED
\r
346 DIRQ: MOVE A,PIRQ ;NOW SATRT PROCESSING
\r
347 JFFO A,FIRQ ;COUNT BITS AND GO
\r
348 MOVE A,PIRQ2 ;1ST DONE, LOOK AT 2ND
\r
351 INTDN1: SKIPN GCHAPN ; SKIP IF MUST DO GC INT
\r
354 PUSHJ P,INTOGC ; AND INTERRUPT
\r
359 .SUSET [.SPICLR,,[0]] ; DISABLE INTS
\r
363 SETZM INTHLD ; RE-ENABLE THE WORLD
\r
366 HRRI 0,@0 ; EFFECTIVIZE THE ADDRESS
\r
367 TLZ 0,37 ; KILL IND AND INDEX
\r
371 IFE ITS, JRST @LCKINT
\r
372 FIRQ: PUSHJ P,GETBIT ;SET UP THE BIT TO CLOBBER IN PIRQ
\r
373 ANDCAM A,PIRQ ;CLOBBER IT
\r
374 ADDI B,36. ;OFSET INTO TABLE
\r
375 JRST XIRQ ;GO EXECUTE
\r
377 FIRQ2: PUSHJ P,GETBIT ;PREPARE TO CLOBBER BIT
\r
378 ANDCAM A,PIRQ2 ;CLOBBER IT
\r
379 ADDI B,71. ;AGAIN OFFSET INTO TABLE
\r
381 CAIE B,21 ;PDL OVERFLOW?
\r
382 JRST FHAND ;YES, HACK APPROPRIATELY
\r
384 PDL2: SKIPN A,PGROW
\r
387 JRST DIRQ ; NOTHING GROWING, FALSE ALARM
\r
388 MOVEI B,PDLGRO_-6 ;GET GROWTH SPEC
\r
389 DPB B,[111100,,-1(A)] ;STORE GROWTH SPEC
\r
390 REAGC: MOVE C,[10.,,1] ; INDICATOR FOR AGC
\r
391 SKIPE PGROW ; P IS GROWING
\r
393 SKIPE TPGROW ; TP IS GROWING
\r
395 PUSHJ P,AGC ;COLLECT GARBAGE
\r
398 AOJL A,REAGC ; IF NO CORE, RETRY
\r
402 IRP A,,[0,A,B,C,D,E]
\r
404 SETZM A!STO(PVP) ;NOW ZERO TYPE
\r
410 IRP A,,[E,D,C,B,A,0]
\r
416 ; HERE TO DO GC INTERRUPT AND CLOSE ANY DEAD CHANNELS
\r
418 INTOGC: PUSH P,[N.CHNS-1]
\r
420 ADD A,[CHNL1,,CHNL1]
\r
424 INTGC1: MOVE A,(TP) ; GET POINTER
\r
425 SKIPN B,1(A) ; ANY CHANNEL?
\r
427 HRRE 0,(A) ; INDICATOR
\r
445 PUSH TP,$TFLOAT ; PUSH ON TIME ARGUMENT
\r
447 PUSH TP,$TFIX ; PUSH ON THE CAUSE ARGUMENT
\r
449 PUSH TP,$TATOM ; PUSH ON THE CALL ARGUMENT
\r
464 MQUOTE PURE-PAGE-LOADER
\r
466 MQUOTE INTERRUPT-HANDLER
\r
469 \f; OLD "ON" SETS UP EVENT AND HANDLER
\r
475 HLRE 0,AB ; 0=> -2*NUM OF ARGS
\r
479 MOVEI B,10(AB) ; LAST MUST BE CHAN OR LOC
\r
482 JUMPG 0,TFA ; AT LEAST 3
\r
483 MOVEI A,0 ; SET UP IN CASE NO PROC
\r
484 AOJG 0,ONPROC ; JUMP IF NONE
\r
485 GETYP C,6(AB) ; CHECK IT
\r
488 MOVE A,7(AB) ; GET IT
\r
489 ONPROC: PUSH P,A ; SAVE AS A FLAG
\r
490 GETYP A,(AB) ; CHECK PREV EXISTANCE
\r
496 MOVEI B,(AB) ; FIND IT
\r
498 POP P,0 ; REST NUM OF ARGS
\r
499 JUMPN B,ON3 ; ALREADY THERE
\r
500 SKIPE C ; SKIP IF NOTHING TO FLUSH
\r
502 PUSH TP,(AB) ; GET NAME
\r
506 MOVEI A,2 ; # OF ARGS TO EVENT
\r
507 AOJG 0,ON1 ; JUMP IF NO LAST ARG
\r
515 PUSH TP,2(AB) ; NOW FCN
\r
517 MOVEI A,3 ; NUM OF ARGS
\r
519 SOJA A,ON2 ; NO PROC
\r
522 ON2: ACALL A,HANDLER
\r
526 TRYFIX: SKIPN A,7(AB)
\r
531 ; ROUTINE TO BUILD AN EVENT
\r
533 MFUNCTION EVENT,SUBR
\r
538 CAIN 0,-2 ; IF JUST 1
\r
539 JRST RE.EVN ; COULD BE EVENT
\r
540 CAIL 0,-3 ; MUST BE AT LEAST 2 ARGS
\r
542 GETYP A,2(AB) ; 2ND ARG MUST BE FIXED POINT PRIORITY
\r
545 GETYP A,(AB) ; FIRST ARG SHOULD BE CHSTR
\r
546 CAIN A,TATOM ; ALLOW ACTUAL ATOM
\r
555 PUSHJ P,CHNORL ; CHANNEL OR LOCATIVE (PUT ON STACK)
\r
557 GOTRGS: MOVEI B,(AB) ; NOW TRY TO FIND HEADER FOR THIS INTERRUPT
\r
558 PUSHJ P,FNDINT ; CALL INTERNAL HACKER
\r
559 JUMPN B,FINIS ; ALREADY ONE OF THIS NAME
\r
561 JUMPE C,.+3 ; GET IT OFF STACK
\r
564 PUSHJ P,MAKINT ; MAKE ONE FOR ME
\r
566 MOVEM 0,INTPRI(B) ; SET UP PRIORITY
\r
568 MOVEM 0,INTPRI+1(B)
\r
569 CH.SPC: POP P,C ; GET CODE BACK
\r
571 PUSHJ P,DO.SPC ; DO ANY SPECIAL HACKS
\r
574 RE.EVN: GETYP 0,(AB)
\r
576 JRST TFA ; ELSE SAY NOT ENOUGH
\r
577 MOVE B,1(AB) ; GET IT
\r
578 SETZM ISTATE+1(B) ; MAKE SURE ENABLED
\r
580 GETYP A,INAME(B) ; CHECK FOR CHANNEL
\r
581 CAIN A,TCHAN ; SKIP IF NOT
\r
582 HRROI C,SS.CHA ; SET UP CHANNEL HACK
\r
583 HRLZ E,INTPRI(B) ; GET POSSIBLE READ/WRITE BITS
\r
584 TLNE E,.WRMON+.RDMON ; SKIP IF NOT MONITORS
\r
587 MOVE B,INAME+1(B) ; CHECK FOR SPEC
\r
589 MOVE B,1(AB) ; RESTORE IHEADER
\r
590 RE.EV1: PUSH TP,INAME(B)
\r
596 MOVE D,MQUOTE INTERRUPT
\r
599 MOVE B,INAME+1(B) ; GET IT
\r
600 PUSHJ P,IGET ; LOOK FOR IT
\r
601 JUMPN B,FINIS ; RETURN IT
\r
608 PUSHJ P,IPUT ; REESTABLISH IT
\r
614 ; FUNCTION TO GENERATE A HANDLER FOR A GIVEN INTERRUPT
\r
616 MFUNCTION HANDLER,SUBR
\r
621 CAIL 0,-2 ; MUST BE 2 OR MORE ARGS
\r
624 CAIE A,TINTH ; EVENT?
\r
627 CAIN 0,-4 ; IF EXACTLY 2
\r
628 CAIE A,THAND ; COULD BE HANDLER
\r
631 MOVE B,3(AB) ; GET IT
\r
632 SKIPN IPREV+1(B) ; SKIP IF ALREADY IN USE
\r
634 MOVE D,1(AB) ; GET EVENT
\r
635 SKIPN D,IHNDLR+1(D) ; GET FIRST HANDLER
\r
637 CAMN D,B ; IS THIS IT?
\r
638 JRST HFINIS ; YES, ALREADY "HANDLED"
\r
639 MOVE D,INXT+1(D) ; GO TO NEXT HANDLER
\r
641 BADHND: PUSH TP,$TATOM
\r
642 PUSH TP,EQUOTE HANDLER-ALREADY-IN-USE
\r
645 CHEVNT: CAIG 0,-7 ; SKIP IF LESS THAN 4
\r
647 PUSH TP,$TPVP ; SLOT FOR PROCESS
\r
649 CAIE 0,-6 ; IF 3, LOOK FOR PROC
\r
657 NOPROC: PUSHJ P,APLQ
\r
659 PUSHJ P,MHAND ; MAKE THE HANDLER
\r
660 MOVE 0,1(TB) ; GET PROCESS
\r
661 MOVEM 0,INTPRO+1(B) ; AND PUT IT INTO HANDLER
\r
662 MOVSI 0,TPVP ; SET UP TYPE
\r
664 MOVE 0,2(AB) ; SET UP FUNCTION
\r
667 MOVEM 0,INTFCN+1(B)
\r
669 HNDOK: MOVE D,1(AB) ; PICK UP EVEENT
\r
670 MOVE E,IHNDLR+1(D) ; GET POINTER TO HANDLERS
\r
671 MOVEM B,IHNDLR+1(D) ; PUT NEW ONE IN
\r
672 MOVSI 0,TINTH ; GET INT HDR TYPE
\r
673 MOVEM 0,IPREV(B) ; INTO BACK POINTER
\r
674 MOVEM D,IPREV+1(B) ; AND POINTER ITSELF
\r
675 MOVEM E,INXT+1(B) ; NOW NEXT POINTER
\r
676 MOVSI 0,THAND ; NOW HANDLER TYPE
\r
677 MOVEM 0,IHNDLR(D) ; SET TYPE IN HEADER
\r
679 JUMPE E,HFINIS ; JUMP IF HEADER WAS EMPTY
\r
680 MOVEM 0,IPREV(E) ; FIX UP ITS PREV
\r
682 HFINIS: MOVSI A,THAND
\r
687 ; FUNCTIONS TO SET TIME LIMITS FOR REALTIME AND RUNTIME INTS
\r
689 MFUNCTION RUNTIMER,SUBR
\r
701 RUNT1: CAIE 0,TFLOAT
\r
704 MULI A,400 ; FIX IT
\r
708 RUNT2: JUMPL A,OUTRNG ; NOT FOR NEG #
\r
715 MFUNCTION REALTIMER,SUBR
\r
724 IMULI A,60. ; TO 60THS OF SEC
\r
727 REALT1: CAIE 0,TFLOAT
\r
735 REALT2: JUMPL A,OUTRNG
\r
744 ; FUNCTIONS TO ENABLE AND DISABLE INTERRUPTS
\r
746 MFUNCTION %ENABL,SUBR,ENABLE
\r
752 MFUNCTION %DISABL,SUBR,DISABLE
\r
767 DO.SPC: HRRZ C,INTBL(C) ; POINT TO SPECIAL CODE
\r
768 HLRZ 0,AB ; - TWO TIMES NUM ARGS
\r
769 PUSHJ P,(C) ; CALL ROUTINE
\r
770 JUMPE E,CPOPJ ; NO BITS TO ENABLE, LEAVE
\r
774 MOVE B,1(TB) ; CHANNEL
\r
776 MOVEM 0,(E) ; SAVE IN TABLE
\r
778 SUBI E,NETJFN-NETCHN
\r
779 MOVE A,0 ; SETUP FOR MTOPR
\r
782 TLO C,770000 ; DONT SETUP INR/INS
\r
794 POPJ P, ; ***** TEMP ******
\r
797 CAILE E,35. ; SKIP IF 1ST WORD BIT
\r
801 IORM 0,MASK1 ; STORE IN PROTOTYPE MASK
\r
802 .SUSET [.SMASK,,MASK1]
\r
805 SETW2: LSH 0,-36.(E)
\r
806 IORM 0,MASK2 ; SET UP PROTO MASK2
\r
807 .SUSET [.SMSK2,,MASK2]
\r
811 ; ROUTINE TO CHECK FOR CHANNEL OR LOCATIVE
\r
813 CHNORL: GETYP A,(B) ; GET TYPE
\r
814 CAIN A,TCHAN ; IF CHANNEL
\r
817 PUSHJ P,LOCQ ; ELSE LOOCATIVE
\r
820 CHNWIN: PUSH TP,(B)
\r
824 ; SUBROUTINE TO FIND A HANDLER OF A GIVEN NAME
\r
826 FNDINT: PUSHJ P,FNDNM
\r
828 PUSHJ P,SPEC1 ; COULD BE FUNNY
\r
830 INTASO: PUSH P,C ; C<0 IF SPECIAL
\r
834 SKIPN D ; COULD BE CHANGED FOR MONITOR
\r
835 MOVE D,MQUOTE INTERRUPT
\r
841 POP P,C ; AND RESTOR SPECIAL INDICATOR
\r
843 SUB TP,[2,,2] ; REMOVE CRUFT
\r
844 CPOPJ: POPJ P, ; AND RETURN
\r
846 ; CHECK FOR SPECIAL INTERNAL INTERRUPT HACK
\r
848 SPEC1: MOVSI C,-SPECLN ; BUILD AOBJN PNTR
\r
849 SPCLOP: CAME B,@SPECIN(C) ; SKIP IF SPECIAL
\r
850 AOBJN C,.-1 ; UNTIL EXHAUSTED
\r
854 MOVEI 0,-1(TB) ; SEE IF OK
\r
859 ; ROUTINE TO CREATE A NEW INTERRUPT (INTERNAL ONLY--NOT ITS FLAVOR)
\r
861 MAKINT: JUMPN C,GOTATM ; ALREADY HAVE NAME, GET THING
\r
862 MOVEI B,(AB) ; POINT TO STRING
\r
863 PUSHJ P,CSTAK ; CHARS TO STAKC
\r
864 MOVE B,INTOBL+1(TVP)
\r
866 MOVE D,MQUOTE INTERRUPT
\r
867 GOTATM: PUSH TP,$TINTH ; MAKE SLOT FOR HEADER BLOCK
\r
870 PUSH TP,B ; SAVE ATOM
\r
875 MOVE A,-3(TP) ; GET NAME AND STORE SAME
\r
880 MOVEM B,-4(TP) ; STASH HEADER
\r
885 EXCH A,-1(TP) ; INTERNAL PUT CALL
\r
891 ; FIND NAME OF INTERRUPT
\r
893 FNDNM: GETYP A,(B) ; TYPE
\r
894 CAIE A,TCHSTR ; IF STRING
\r
895 JRST FNDATM ; DONT HAVE ATOM, OTHERWISE DO
\r
898 FNDATM: MOVE B,1(B)
\r
899 SETZB C,D ; PREVENT LOSSAGE LATER
\r
902 ; THE NEXT 2 INSTRUCTIONS ARE A KLUDGE TO GET THE RIGHT ERROR ATOM
\r
904 CAMN B,IMQUOTE ERROR
\r
905 MOVE B,MQUOTE ERROR,ERROR,INTRUP
\r
908 IILOOK: PUSHJ P,CSTAK ; PUT CHRS ON STACK
\r
909 MOVE B,INTOBL+1(TVP)
\r
910 JRST ILOOKC ; LOOK IT UP
\r
912 ; ROUTINE TO MAKE A HANDLER BLOCK
\r
914 MHAND: MOVEI A,IHANDL*2
\r
915 JRST GIBLOK ; GET BLOCK
\r
917 ; HERE TO GET CHANNEL FOR "CHAR" INTERRUPT
\r
919 GETCHN: GETYP 0,(TB) ; GET TYPE
\r
920 CAIE 0,TCHAN ; CHANNL IS WINNER
\r
922 MOVE A,(TB) ; USE THE CHANNEL TO NAME THE INTERRUPT
\r
924 SKIPN CHANNO(B) ; SKIP IF WINNING CHANNEL
\r
925 JRST CBDCHN ; LOSER
\r
928 LOCGET: GETYP 0,(TB) ; TYPE
\r
929 CAIN 0,TCHAN ; SKIP IF LOCATIVE
\r
933 MOVE B,1(TB) ; GET LOCATIVE
\r
936 ; FINAL MONITOR SETUP ROUTINES
\r
938 S.RMON: SKIPA E,[.RDMON,,]
\r
939 S.WMON: MOVSI E,.WRMON
\r
942 HLRM E,INTPRI(B) ; SAVE BITS
\r
943 MOVEI B,(TB) ; POINT TO LOCATIVE
\r
946 MOVSI D,(ANDCAM E,) ; KILL INST
\r
949 PUSHJ P,SMON ; GO DO IT
\r
956 ; SPECIAL SETUP ROUTINES FOR INITIAL INTERRUPTS
\r
959 S.CHAR: MOVE E,1(TB) ; GET CHANNEL
\r
961 ADDI E,36. ; GET CORRECT MASK BIT
\r
962 ONEBIT: MOVEI 0,1 ; BIT FOR INT TO RET
\r
966 S.CHAR: MOVE E,1(TB)
\r
968 ILDB 0,0 ; 1ST CHAR
\r
975 MOVE E,[-NNETS,,NETJFN]
\r
979 MOVE A,E ; REMEMBER WHERE
\r
982 FATAL NO MORE NETWORK
\r
990 ; SPECIAL FOR CLOCK
\r
992 S.DOWN: SKIPA E,[7]
\r
993 S.CLOK: MOVEI E,13. ; FOR NOW JUST GET BIT #
\r
999 ; RUNTIME AND REALTIME INTERRUPTS
\r
1001 S.RUNT: SKIPA E,[34.]
\r
1002 S.REAL: MOVEI E,35.
\r
1005 S.IOC: SKIPA E,[9.] ; IO CHANNEL ERROR
\r
1006 S.PURE: MOVEI E,26.
\r
1011 S.MPV: SKIPA E,[14.] ; BIT POS
\r
1015 ; HERE TO TURN ALL INFERIOR INTS
\r
1017 S.INF: MOVEI E,36.+16.+2 ; START OF BITS
\r
1018 MOVEI 0,37 ; 8 BITS WORTH
\r
1022 ; HERE TO HANDLE ITS INTERRUPTS
\r
1024 FHAND: SKIPN D,EXTINT(B) ; SKIP IF HANDLERS ARE POSSIBLE
\r
1029 ; SPECIAL CHARACTER HANDLERS
\r
1031 HCHAR: MOVEI D,CHNL0+1(TVP)
\r
1032 ADDI D,(B) ; POINT TO CHANNEL SLOT
\r
1034 SKIPN D,-72.(D) ; PICK UP CHANNEL
\r
1035 JRST IPCGOT ;WELL, IT GOTTA BEE THE THE IPC THEN
\r
1038 LDB 0,[600,,STATUS(D)] ; GET DEVICE CODE
\r
1039 CAILE 0,2 ; SKIP IF A TTY
\r
1040 JRST HNET ; MAYBE NETWORK CHANNEL
\r
1041 CAMN D,TTICHN+1(TVP)
\r
1044 MOVE B,D ; CHAN TO B
\r
1045 PUSHJ P,TTYOP2 ; RE-GOBBLE TTY
\r
1047 HCHR11: MOVE D,CHANNO(D) ; GET ITS CHANNEL
\r
1048 PUSH P,D ; AND SAVE IT
\r
1049 .CALL HOWMNY ; GET # OF CHARS
\r
1050 MOVEI B,0 ; IF TTY GONE, NO CHARS
\r
1051 RECHR: ADDI B,1 ; BUMP BY ONE FOR SOSG
\r
1052 MOVEM B,CHNCNT(D) ; AND SAVE
\r
1053 IORM A,PIRQ2 ; LEAVE THE INT ON
\r
1055 CHRLOO: MOVE D,(P) ; GET CHNNAEL NO.
\r
1056 SOSG CHNCNT(D) ; GET COUNT
\r
1060 MOVE D,BUFRIN(B) ; GET EXTRA BUFFER
\r
1061 XCT IOIN2(D) ; READ CHAR
\r
1063 PUSH TP,CHQUOTE CHAR
\r
1064 PUSH TP,$TCHRS ; SAVE CHAR FOR CALL
\r
1066 PUSH TP,$TCHAN ; SAVE CHANNEL
\r
1068 PUSHJ P,INCHAR ; PUT CHAR IN USERS BUFFER
\r
1069 MCALL 3,INTERRUPT ; RUN THE HANDLERS
\r
1070 JRST CHRLOO ; AND LOOP
\r
1072 CHRDON: .CALL HOWMNY
\r
1074 MOVEI A,1 ; SET FOR PI WORD CLOBBER
\r
1076 JUMPG B,RECHR ; ANY MORE?
\r
1084 ; HERE FOR NET CHANNEL INTERRUPT
\r
1086 HNET: CAIE 0,26 ; NETWORK?
\r
1087 JRST HSTYET ; HANDLE PSEUDO TTY ETC.
\r
1089 PUSH TP,MQUOTE CHAR,CHAR,INTRUP
\r
1094 MOVE B,D ; CHAN TO B
\r
1095 PUSHJ P,INSTAT ; UPDATE THE NETWRK STATE
\r
1100 HSTYET: PUSH TP,$TATOM
\r
1101 PUSH TP,MQUOTE CHAR,CHAR,INTRUP
\r
1109 CBDCHN: PUSH TP,$TATOM
\r
1110 PUSH TP,EQUOTE BAD-CHANNEL
\r
1115 HCLOCK: PUSH TP,$TCHSTR
\r
1116 PUSH TP,CHQUOTE CLOCK
\r
1120 HRUNT: PUSH TP,$TATOM
\r
1121 PUSH TP,MQUOTE RUNT,RUNT,INTRUP
\r
1125 HREAL: PUSH TP,$TATOM
\r
1126 PUSH TP,MQUOTE REALT,REALT,INTRUP
\r
1130 HPAR: MOVE A,MQUOTE PARITY,PARITY,INTRUP
\r
1133 HMPV: MOVE A,MQUOTE MPV,MPV,INTRUP
\r
1136 HILOPR: MOVE A,MQUOTE ILOPR,ILOPR,INTRUP
\r
1139 HPURE: MOVE A,MQUOTE PURE,PURE,INTRUP
\r
1140 HMPV1: PUSH TP,$TATOM
\r
1142 PUSH P,LCKINT ; SAVE LOCN
\r
1154 PUSH TP,EQUOTE DANGEROUS-INTERRUPT-NOT-HANDLED
\r
1164 ; HERE TO HANDLE SYS DOWN INTERRUPT
\r
1166 HDOWN: PUSH TP,$TATOM
\r
1167 PUSH TP,MQUOTE SYSDOWN,SYSDOWN,INTRUP
\r
1168 .DIETI A, ; HOW LONG?
\r
1171 PUSH P,A ; FOR MESSAGE
\r
1175 .SUSET [.RTTY,,B] ; DO WE NOW HAVE A TTY AT ALL?
\r
1176 JUMPL B,DIRQ ; DONT HANG AROUND
\r
1179 Excuse me, SYSTEM going down in /]
\r
1180 SKIPG (P) ; SKIP IF REALLY GOING DOWN
\r
1182 Excuse me, SYSTEM has been REVIVED!
\r
1187 IDIVI B,30. ; TO SECONDS
\r
1188 IDIVI B,60. ; A/ SECONDS B/ MINUTES
\r
1192 MOVEI B,[ASCIZ / minutes /]
\r
1196 NOMIN: MOVEI B,(C)
\r
1198 MOVEI B,[ASCIZ / seconds.
\r
1203 ; TWO DIGIT DEC OUT FROM B/
\r
1205 DECOUT: IDIVI B,10.
\r
1206 JUMPE B,DECOU1 ; NO TEN
\r
1209 DECOU1: MOVEI A,60(C)
\r
1212 ; HERE TO HANDLE I/O CHANNEL ERRORS
\r
1214 HIOC: .SUSET [.RAPRC,,A] ; CONTAINS CHANNEL OF MOST RECENT LOSSAGE
\r
1215 LDB A,[330400,,A] ; GET CHAN #
\r
1216 MOVEI C,(A) ; COPY
\r
1217 PUSH TP,$TATOM ; PUSH ERROR
\r
1218 PUSH TP,EQUOTE FILE-SYSTEM-ERROR
\r
1221 ASH C,1 ; GET CHANNEL
\r
1222 ADDI C,CHNL0+1(TVP) ; GET CHANNEL VECTOR
\r
1224 LSH A,23. ; DO A .STATUS
\r
1227 PUSHJ P,GFALS ; GEN NAMED FALSE
\r
1231 PUSH TP,MQUOTE IOC,IOC,INTRUP
\r
1238 JUMPN B,DIRQ1 ; JUMP IF HANDLED
\r
1242 DIRQ1: SUB TP,[6,,6]
\r
1245 ; HANDLE INFERIOR KNOCKING AT THE DOOR
\r
1247 HINF: SUBI B,36.+16.+2 ; CONVERT TO INF #
\r
1249 PUSH TP,MQUOTE INFERIOR,INFERIOR,INTRUP
\r
1257 ; HERE FOR TENEX INTS (FIRST CUT)
\r
1262 HCNTLS: MOVEI A,23
\r
1264 HCNGS: PUSH TP,$TATOM
\r
1265 PUSH TP,MQUOTE CHAR,CHAR,INTRUP
\r
1269 PUSH TP,TTICHN+1(TVP)
\r
1273 HNET: MOVE A,NETJFN-NINT+NNETS(B)
\r
1276 ADDI A,CHNL0+1(TVP)
\r
1279 PUSH TP,MQUOTE CHAR,CHAR,INTRUP
\r
1290 MFUNCTION OFF,SUBR
\r
1295 GETYP A,(AB) ; ARG TYPE
\r
1296 MOVE B,1(AB) ; AND VALUE
\r
1297 CAIN A,TINTH ; HEADER, GO HACK
\r
1298 JRST OFFHD ; QUEEN OF HEARTS
\r
1302 JRST TRYHAN ; MAYBE INDIVIDUAL HANDLER
\r
1303 CAIN 0,-2 ; MORE THAN 1 ARG?
\r
1304 JRST OFFAC1 ; NO, GO ON
\r
1305 CAIG 0,-5 ; CANT BE MORE THAN 2
\r
1307 MOVEI B,2(AB) ; POINT TO 2D
\r
1309 OFFAC1: MOVEI B,(AB)
\r
1311 JUMPGE B,NOHAN1 ; NOT HANDLED
\r
1313 OFFH1: PUSH P,C ; SAVE C FOR BIT CLOBBER
\r
1316 MOVE D,MQUOTE INTERRUPT
\r
1320 SKIPE B ; IF NO ASSOC, DONT SMASH
\r
1321 SETOM ISTATE+1(B) ; DISABLE IN CASE QUEUED
\r
1322 POP P,C ; SPECIAL?
\r
1323 JUMPGE C,FINIS ; NO, DONE
\r
1325 HRRZ C,INTBL(C) ; POINT TO SPECIAL CODE
\r
1326 PUSHJ P,(C) ; GO TO SAME
\r
1327 JUMPE E,OFINIS ; DONE
\r
1329 CAILE E,35. ; SKIP IF 1ST WORD
\r
1330 JRST CLRW2 ; CLOBBER 2D WORD BIT
\r
1331 LSH 0,-1(E) ; POSITION BIT
\r
1332 ANDCAM 0,MASK1 ; KILL BIT
\r
1333 .SUSET [.SMASK,,MASK1]
\r
1339 SUBI E,NETJFN-NETCHN
\r
1347 ANDCAM 0,PIRQ ; JUST IN CASE
\r
1350 OFINIS: MOVSI A,TINTH
\r
1354 CLRW2: LSH 0,-36.(E) ; POS BIT FOR 2D WORD
\r
1356 .SUSET [.SMSK2,,MASK2]
\r
1360 TRYHAN: CAIE A,THAND ; HANDLER?
\r
1364 GETYP 0,IPREV(B) ; GET TYPE OF PREV
\r
1369 JRST DOHEAD ; PREV HUST BE HDR
\r
1372 DOHEAD: MOVEM A,IHNDLR+1(C) ; INTO HDR
\r
1375 MOVEM C,IPREV+1(A)
\r
1376 OFFINI: SETZM IPREV+1(B)
\r
1383 PUSHJ P,GETNMS ; GET INFOR ABOUT INT
\r
1386 PUSH TP,INAME+1(B)
\r
1389 GETNMS: GETYP A,INAME(B) ; CHECK FOR SPECIAL
\r
1393 PUSHJ P,LOCQ ; LOCATIVE?
\r
1396 MOVEI B,INAME(B) ; POINT TO LOCATIVE
\r
1398 PUSHJ P,SMON ; GET MONITOR
\r
1400 GETNM1: HRROI C,SS.WMO ; ASSUME WRITE
\r
1403 MOVE D,MQUOTE WRITE,WRITE,INTRUP
\r
1405 MOVE D,MQUOTE READ,READ,INTRUP
\r
1408 CHGTNM: JUMPL C,CPOPJ
\r
1411 MOVE B,1(AB) ; RESTORE IHEADER
\r
1414 ; EMERGENCY, CANT DEFER ME!!
\r
1422 MFUNCTION INTERRUPT,SUBR
\r
1428 SETZM INTHLD ; RE-ENABLE THE WORLD
\r
1430 MOVE B,1(AB) ; GET HANDLER/NAME
\r
1431 GETYP A,(AB) ; CAN BE HEADER OR NAME
\r
1432 CAIN A,TINTH ; SKIP IF NOT HEADER
\r
1436 CAIE A,TCHSTR ; SKIP IF CHAR STRING
\r
1438 MOVEI B,(AB) ; LOOK UP NAME
\r
1439 PUSHJ P,FNDNM ; GET NAME
\r
1442 CAMN B,MQUOTE CHAR,CHAR,INTRUP
\r
1444 CAME B,MQUOTE READ,READ,INTRUP
\r
1445 CAMN B,MQUOTE WRITE,WRITE,INTRUP
\r
1450 GTHEAD: SKIPE ISTATE+1(B) ; ENABLED?
\r
1451 JRST IFALSE ; IGNORE COMPLETELY
\r
1452 MOVE A,INTPRI+1(B) ; GET PRIORITY OF INTERRUPT
\r
1453 CAMLE A,CURPRI ; SEE IF MUST QUEU
\r
1454 JRST SETPRI ; MAY RUN NOW
\r
1455 SKIPE (P) ; SKIP IF DEFER OK
\r
1458 PUSH TP,$TINTH ; SAVE HEADER
\r
1460 MOVEI A,1 ; SAVE OTHER ARGS
\r
1461 PSHARG: ADD AB,[2,,2]
\r
1462 JUMPGE AB,QUEU1 ; GO MAKE QUEU ENTRY
\r
1466 QUEU1: PUSHJ P,IEVECT ; GET VECTOR
\r
1468 PUSH TP,[0] ; WILL HOLD QUEUE HEADER
\r
1472 POP P,A ; RESTORE PRIORITY
\r
1474 MOVE B,QUEUES+1(TVP) ; GET INTERRUPT QUEUES
\r
1476 JUMPGE B,GQUEU ; MAKE A QUEUE HDR
\r
1478 NXTQU: CAMN A,1(B) ; GOT PRIORITY?
\r
1479 JRST ADDQU ; YES, ADD TO THE QUEU
\r
1480 CAMG A,1(B) ; SKIP IF SPOT NOT FOUND
\r
1483 MOVE B,3(B) ; GO TO NXT QUEUE
\r
1486 GQUEU: PUSH TP,$TVEC ; SAVE NEXT POINTER
\r
1489 PUSH TP,A ; SAVE PRIORITY
\r
1498 MOVE D,(TP) ; NOW SPLICE
\r
1501 MOVEM B,QUEUES+1(TVP)
\r
1503 GQUEU1: MOVEM B,3(D)
\r
1505 ADDQU: MOVEM B,-2(TP) ; SAVE QUEU HDR
\r
1508 PUSHJ P,INCONS ; CONS IT
\r
1509 MOVE C,(TP) ;GET QUEUE HEADER
\r
1510 SKIPE D,7(C) ; IF END EXISTS
\r
1511 HRRM B,(D) ; SPLICE
\r
1513 SKIPN 5(C) ; SKIP IF START EXISTS
\r
1516 IFINI: MOVSI A,TATOM
\r
1520 SETPRI: EXCH A,CURPRI
\r
1523 PUSH TP,$TAB ; PASS AB TO HANDLERS
\r
1526 PUSHJ P,RUNINT ; RUN THE HANDLERS
\r
1527 POP P,A ; UNQUEU ANY WAITERS
\r
1532 ; HERE TO UNQUEUE WAITING INTERRUPTS
\r
1534 UNQUEU: PUSH P,A ; SAVE NEW LEVEL
\r
1536 UNQUE1: MOVE A,(P) ; TARGET LEVEL
\r
1537 CAMLE A,CURPRI ; CHECK RUG NOT PULLED OUT
\r
1539 SKIPE B,QUEUES+1(TVP)
\r
1540 CAML A,1(B) ; RIGHT LEVEL?
\r
1541 JRST UNDONE ; FINISHED
\r
1543 SKIPN C,5(B) ; ON QUEUEU?
\r
1545 HRRZ D,(C) ; CDR THE LIST
\r
1547 SKIPN D ; SKIP IF NOT LAST
\r
1548 SETZM 7(B) ; CLOBBER END POINTER
\r
1549 MOVE A,1(B) ; GET THIS PRIORITY LEVEL
\r
1550 MOVEM A,CURPRI ; MAKE IT THE CURRENT ONE
\r
1551 MOVE D,1(C) ; GET SAVED VECTOR OF INF
\r
1553 MOVE B,1(D) ; INT HEADER
\r
1555 PUSH TP,D ; AND ARGS
\r
1557 PUSHJ P,RUNINT ; RUN THEM
\r
1560 UNDONE: POP P,CURPRI ; SET CURRENT LEVEL
\r
1564 UNXQ: MOVE B,3(B) ; GO TO NEXT QUEUE
\r
1565 MOVEM B,QUEUES+1(TVP)
\r
1570 ; SUBR TO CHANGE INTERRUPT LEVEL
\r
1572 MFUNCTION INTLEV,SUBR,[INT-LEVEL]
\r
1574 JUMPGE AB,RETLEV ; JUST RETURN CURRENT
\r
1577 JRST WTYP1 ; LEVEL IS FIXED
\r
1580 CAMN A,CURPRI ; DIFFERENT?
\r
1581 JRST RETLEV ; NO RETURN
\r
1583 CAMG A,CURPRI ; SKIP IF NO UNQUEUE NEEDED
\r
1585 MOVEM A,CURPRI ; SAVE
\r
1588 RETLEV: MOVE B,CURPRI
\r
1592 RUNINT: PUSH TP,$THAND ; SAVE HANDLERS LIST
\r
1593 PUSH TP,IHNDLR+1(B)
\r
1595 SKIPN ISTATE+1(B) ; SKIP IF DISABLED
\r
1598 NXHND: MOVEM B,(TP) ; SAVE CURRENT HDR
\r
1599 MOVE A,-2(TP) ; SAVE ARG POINTER
\r
1600 PUSHJ P,CHSWAP ; SEE IF MUST SWAP
\r
1603 MOVEI C,1 ; COUNT ARGS
\r
1607 ADD D,[1STEPR,,1STEPR]
\r
1614 PUSH TP,INTFCN+1(B)
\r
1621 PUSHJ P,SPECBE ; BIND 1 STEP FLAG
\r
1625 MOVE C,(TP) ; RESET 1 STEP
\r
1626 MOVEM C,1STEPR+1(PVP)
\r
1630 SUB TP,[4,,4] ; NO PROCESS CHANGE, POP JUNK
\r
1635 MOVEM D,TPSTO+1(E) ; FIXUP HIS STACK
\r
1636 DO.H1: GETYP A,A ; CHECK FOR A DISMISS
\r
1639 MOVE B,(TP) ; TRY FOR NEXT HANDLER
\r
1642 SUBTP4: SUB TP,[4,,4]
\r
1645 MFUNCTION INTAPL,SUBR,[RUNINT]
\r
1649 NOHAND: JUMPE C,NOHAN1
\r
1651 PUSH TP,EQUOTE INTERNAL-INTERRUPT
\r
1652 NOHAN1: PUSH TP,(AB)
\r
1655 PUSH TP,EQUOTE NOT-HANDLED
\r
1661 DEFERR: PUSH TP,$TATOM
\r
1662 PUSH TP,EQUOTE ATTEMPT-TO-DEFER-UNDEFERABLE-INTERRUPT
\r
1666 PUSH TP,MQUOTE INTERRUPT
\r
1667 MCALL 3,RERR ; FORCE REAL ERROR
\r
1670 ; FUNCTION TO DISMISS AN INTERRUPT TO AN ARBITRARY ACTIVATION
\r
1672 MFUNCTION DISMISS,SUBR
\r
1687 DISMI3: MOVEI A,(TB)
\r
1689 DISMI0: HRRZ B,FSAV(A)
\r
1695 MOVEI 0,(A) ; SAVE FRAME
\r
1697 HRRM A,PCSAV(E) ; GET IT BACK HERE
\r
1706 MOVE B,0 ; DEST FRAME
\r
1708 MOVE A,PSAV(E) ; NOW MUNG SAVED INT LEVEL
\r
1709 MOVEM D,-1(A) ; ZAP YOUR MUNGED
\r
1710 PUSHJ P,CHUNW ; CHECK ON UNWINDERS
\r
1711 JRST FINIS ; FALL DOWN
\r
1713 DISMI1: MOVEI E,(A)
\r
1738 DISMI2: MOVE C,(TP)
\r
1739 MOVEM C,1STEPR+1(PVP)
\r
1742 PUSHJ P,CHUNSW ; UNDO ANY PROCESS HACKING
\r
1744 CAME E,PVP ; SWAPED?
\r
1749 SUB C,[4,,4] ; MAYBE FIXUP OTHER STACK
\r
1751 MOVEM C,TPSTO+1(E)
\r
1756 MOVE A,-1(P) ; SAVED PRIORITY
\r
1779 GTLOC1: GETYP A,2(AB)
\r
1782 MOVE D,B ; RET ATOM FOR ASSOC
\r
1786 \f; MONITOR CHECKERS
\r
1788 MONCH0: HLLZ 0,(B) ; POTENTIAL MONITORS
\r
1789 MONCH: TLZ 0,TYPMSK ; KILL TYPE
\r
1790 IOR C,0 ; IN NEW TYPE
\r
1796 TLNN 0,.WRMON ; SKIP IF WRITE MONIT
\r
1799 ; MONITOR IS ON, INVOKE HANDLER
\r
1801 PUSH TP,A ; SAVE OBJ
\r
1804 PUSH TP,D ; SAVE DATUM
\r
1805 MOVSI C,TATOM ; PREPARE TO FIND IT
\r
1806 MOVE D,MQUOTE WRITE,WRITE,INTRUP
\r
1808 JUMPE B,MONCH1 ; NOT FOUND IGNORE FOR NOW
\r
1809 PUSH TP,A ; START SETTING UP CALL
\r
1815 PUSHJ P,FRMSTK ; PUT FRAME ON STAKC
\r
1816 MCALL 4,EMERGE ; DO IT
\r
1821 HLLZ 0,(B) ; UPDATE MONITORS
\r
1826 ; NOW FOR READ MONITORS
\r
1828 RMONC0: HLLZ 0,(B)
\r
1829 RMONCH: TLNN 0,.RDMON
\r
1834 MOVE D,MQUOTE READ,READ,INTRUP
\r
1841 PUSHJ P,FRMSTK ; PUT FRAME ON STACK
\r
1847 ; PUT THE CURRENT FRAME ON THE STACK
\r
1849 FRMSTK: PUSHJ P,MAKACT
\r
1855 ; HERE TO COMPLAIN ABOUT ATTEMPTS TO MUNG PURE CODE
\r
1857 PURERR: PUSH TP,$TATOM
\r
1858 PUSH TP,EQUOTE ATTEMPT-TO-MUNG-PURE-STRUCTURE
\r
1864 ; PROCESS SWAPPING CODE
\r
1866 CHSWAP: MOVE E,PVP ; GET CURRENT
\r
1868 SKIPE D,INTPRO+1(B) ; SKIP IF NO PROCESS GIVEN
\r
1869 CAMN D,PVP ; SKIP IF DIFFERENT
\r
1872 PUSHJ P,SWAPIT ; DO SWAP
\r
1874 PSHPRO: PUSH TP,$TPVP
\r
1878 CHUNSW: MOVE E,PVP ; RET OLD PROC
\r
1879 MOVE D,-2(TP) ; GET SAVED PROC
\r
1880 CAMN D,PVP ; SWAPPED?
\r
1884 MOVE 0,PSTAT+1(D) ; CHECK STATE
\r
1887 MOVEM 0,PSTAT+1(PVP)
\r
1889 MOVEM 0,PSTAT+1(D) ; SAVE NEW STATE
\r
1895 ;SUBROUTINE TO GET BIT FOR CLOBBERAGE
\r
1897 GETBIT: MOVNS B ;NEGATE
\r
1898 MOVSI A,400000 ;GET THE BIT
\r
1899 LSH A,(B) ;SHIFT TO POSITION
\r
1900 POPJ P, ;AND RETURN
\r
1902 ;HERE TO HANDLE PDL OVERFLOW. ASK FOR A GC
\r
1906 MOVEM A,TSINT ;SAVE INT WORD
\r
1909 SKIPE GCFLG ;IS GC RUNNING?
\r
1910 JRST GCPLOV ;YES, COMPLAIN GROSSLY
\r
1912 MOVEI A,200000 ;GET BIT TO CLOBBER
\r
1913 IORM A,PIRQ ;LEAVE A MESSAGE FOR HIGHER LEVEL
\r
1915 EXCH P,GCPDL ;GET A WINNING PDL
\r
1916 HRRZ B,TSINTR ;GET POINTER TO LOSING INSTRUCTION
\r
1917 SKIPG GCPDL ; SKIP IF NOT P
\r
1918 LDB B,[270400,,-1(B)] ;GET AC FIELD
\r
1919 SKIPL GCPDL ; SKIP IF P
\r
1921 MOVEI A,(B) ;COPY IT
\r
1923 ADDI A,0STO(PVP) ;POINT TO THIS ACS CURRENT TYPE
\r
1924 HLRZ A,(A) ;GET THAT TYPE INTO A
\r
1926 MOVEI B,GCPDL ;POINT TO SAVED P
\r
1928 CAIN B,B ;OR IS IT B ITSELF
\r
1934 MOVEI B,1(P) ;C WILL BE ON THE STACK
\r
1939 MOVE A,(B) ;GET THE LOSING POINTER
\r
1940 MOVEI C,(A) ;AND ISOLATE RH
\r
1942 CAMG C,VECTOP ;CHECK IF IN GC SPACE
\r
1944 JRST NOGROW ;NO, COMPLAIN
\r
1949 HLRZ C,A ;GET -LENGTH
\r
1950 SUBI A,-1(C) ;POINT TO A DOPE WORD
\r
1951 POP P,C ;RESTORE TYPE INTO C
\r
1952 PUSH P,D ; SAVE FOR GROWTH HACKER
\r
1954 CAIN C,TPDL ; POIN TD TO APPROPRIATE DOPE WORD
\r
1958 JUMPE D,BADPDL ; IF D STILL 0, THIS PDL IS WEIRD
\r
1959 MOVEI A,PDLBUF(A) ; POINT TO ALLEGED REAL DOPE WORD
\r
1960 SKIPN (D) ; SKIP IF PREVIOUSLY BLOWN
\r
1961 MOVEM A,(D) ; CLOBBER IN
\r
1962 CAME A,(D) ; MAKE SURE IT IS THE SAME
\r
1964 POP P,D ; RESTORE D
\r
1967 PNTRHK: MOVE C,(B) ;RESTORE PDL POINTER
\r
1968 SUB C,[PDLBUF,,0] ;FUDGE THE POINTER
\r
1969 MOVEM C,(B) ;AND STORE IT
\r
1971 POP P,C ;RESTORE THE WORLD
\r
1972 EXCH P,GCPDL ;GET BACK ORIG PDL
\r
1974 MOVE A,TSINT ;RESTORE INT WORD
\r
1976 JRST IMPCH ;LOOK FOR MORE INTERRUPTS
\r
1978 IFE ITS, JRST GCQUIT
\r
1980 TPOVFL: SETOM INTFLG ;SIMULATE PDL OVFL
\r
1982 MOVEI A,200000 ;TURN ON THE BIT
\r
1984 SUB TP,[PDLBUF,,0] ;HACK STACK POINTER
\r
1985 HLRE A,TP ;FIND DOPEW
\r
1986 SUBM TP,A ;POINT TO DOPE WORD
\r
1987 MOVEI A,1(A) ; ZERO LH AND POINT TO DOPEWD
\r
1990 CAME A,TPGROW ; MAKE SURE WINNAGE
\r
1996 ; GROW CORE IF PDL OVERFLOW DURING GC
\r
1998 GCPLOV: MOVE A,P.TOP ; GET TOP OF IMPURE
\r
1999 ASH A,-10. ; TO BLOCKS
\r
2000 EXCH P,GCPDL ; NEED A PDL TO CALL P.CORE
\r
2001 ADDI A,1 ; GO TO NEXT BLOCK
\r
2002 GRECOR: PUSHJ P,P.CORE ; GET CORE
\r
2003 JRST SLPCOR ; HANG GETTING THE CORE
\r
2004 EXCH P,GCPDL ; BPDLS BACK
\r
2006 IFE ITS, JRST GCQUIT
\r
2020 ;HERE TO HANDLE LOW-LEVEL CHANNELS
\r
2023 CHNACT: SKIPN GCFLG ;GET A WINNING PDL
\r
2025 ANDI A,177777 ;ISOLATE CHANNEL BITS
\r
2028 CHNA1: MOVEI B,0 ;BIT COUNTER
\r
2031 SUBI B,35. ;NOW HAVE CHANNEL
\r
2036 MOVEI 0,(B) ; COPY TO 0
\r
2037 LSH 0,23. ;POSITION FOR A .STATUS
\r
2040 ANDI 0,77 ;ISOLATE DEVICE
\r
2044 PMIN4: MOVE 0,B ; CHAN TO 0
\r
2045 .ITYIC 0, ; INTO 0
\r
2046 JRST .+2 ; DONE, GO ON
\r
2048 SETZM GCFLCH ; LEAVE GC MODE
\r
2062 MFUNCTION GASCII,SUBR,ASCII
\r
2073 TRYNUM: CAIE A,TFIX
\r
2075 SKIPGE B,1(AB) ;GET NUMBER
\r
2077 CAILE B,177 ;CHECK RANGE
\r
2082 TOOBIG: PUSH TP,$TATOM
\r
2083 PUSH TP,EQUOTE ARGUMENT-OUT-OF-RANGE
\r
2087 ;HERE IF PDL OVERFLOW DURING GARBAGE COLLECTION
\r
2089 BADPDL: FATAL NON PDL OVERFLOW
\r
2091 NOGROW: FATAL PDL OVERFLOW ON NON EXPANDABLE PDL
\r
2093 PDLOSS: FATAL PDL OVEFLOW BUFFER EXHAUSTED
\r
2095 DLOSER: PUSH P,LOSRS(B)
\r
2106 ;MEMORY PROTECTION INTERRUPT
\r
2108 IOC: FATAL IO CHANNEL ERROR IN GARBAGE COLLECTOR
\r
2109 IMPV: FATAL MPV IN GARBAGE COLLECTOR
\r
2111 IPURE: FATAL PURE WRITE IN GARBAGE COLLECTOR
\r
2112 ILOPR: FATAL ILLEGAL OPEREATION IN GARBAGE COLLECTOR
\r
2116 ;SUBROUTINE TO BE CALLED AT INITIALIZE TIME TO SETUP INTS
\r
2118 INTINT: SETZM CHNCNT
\r
2119 MOVE A,[CHNCNT,,CHNCNT+1]
\r
2122 .SUSET [.SPICLR,,[-1]]
\r
2123 MOVE A,MASK1 ;SET MASKS
\r
2125 .SETM2 A, ;SET BOTH MASKS
\r
2127 MOVEM A,QUEUES(TVP)
\r
2128 SETZM QUEUES+1(TVP) ;UNQUEUE ANY OLD INTERRUPTS
\r
2134 ; INITIALIZE TENEX INTERRUPT SYSTEM
\r
2136 INTINT: CIS ; CLEAR THE INT WORLD
\r
2137 SETZM INTFLG ; IN CASE RESTART
\r
2138 MOVSI A,TVEC ; FIXUP QUEUES
\r
2139 MOVEM A,QUEUES(TVP)
\r
2140 SETZM QUEUES+1(TVP)
\r
2141 SETZM CURPRI ; AND PRIORITY LEVEL
\r
2142 MOVEI A,MFORK ; TURN ON MY INTERRUPTS
\r
2143 MOVE B,[LEVTAB,,CHNTAB] ; POINT TO TABLES
\r
2144 SIR ; TELL SYSTEM ABOUT THEM
\r
2145 MOVE B,MASK1 ; SET UP FOR INT BITS
\r
2146 AIC ; TURN THEM ON
\r
2147 MOVSI A,7 ; CNTL G AND CHANNEL 0
\r
2149 MOVE A,[23,,1] ; CNTL S AND CHANNEL 1
\r
2151 MOVEI A,MFORK ; DO THE ENABLE
\r
2159 MFUNCTION QUITTER,SUBR
\r
2170 CAIN B,^S ; HANDLE CNTL-S
\r
2175 PUSHJ P,CLEAN ; CLEAN UP I/O CHANNELS
\r
2177 PUSH TP,EQUOTE CONTROL-G?
\r
2181 RETLIS: MOVEI D,(TB) ; FIND A LISTEN OR ERROR TO RET TO
\r
2183 RETLI1: HRRZ A,OTBSAV(D)
\r
2184 HRRZ C,FSAV(A) ; CHECK FUNCTION
\r
2186 CAIN C,ERROR ; FOUND?
\r
2187 JRST FNDHIM ; YES, GO TO SAME
\r
2188 CAIN C,ERROR% ; FUNNY ERROR
\r
2190 CAIN C,TOPLEV ; NO ERROR/LISTEN
\r
2195 FNDHIM: PUSH TP,$TTB
\r
2198 MOVE B,(TP) ; NEW FRAME
\r
2201 PUSHJ P,CHUNW ; UNWIND?
\r
2206 CLEAN: MOVE B,3(AB) ; GET IN CHAN
\r
2208 MOVE B,3(AB) ; CHANNEL BAKC
\r
2210 SKIPN C,ECHO(C) ; GET ECHO
\r
2214 CAMN C,[PUSHJ P,MTYO]
\r
2222 MOVEI A,101 ; OUTPUT JFN
\r
2226 CLUNQ: SETZB A,CURPRI
\r
2231 ONINT: 0 ; INT FUDGER
\r
2233 ;RANDOM IMPURE CRUFT NEEDED
\r
2234 CHNCNT: BLOCK 16. ; # OF CHARS IN EACH CHANNEL
\r
2238 PIRQ: 0 ;HOLDS REQUEST BITS FOR 1ST WORD
\r
2239 PIRQ2: 0 ;SAME FOR WORD 2
\r
2241 MASK1: 1200,,220540 ;FIRST MASK
\r
2242 MASK2: 0 ;SECOND THEREOF
\r
2243 CURPRI: 0 ; CURRENT PRIORITY
\r
2246 NETJFN: BLOCK NNETS
\r
2249 P1: 0 ; PC INT LEVEL 1
\r
2250 P2: 0 ; PC INT LEVEL 2
\r
2251 P3: 0 ; PC INT LEVEL 3
\r