2 TITLE INTERRUPT HANDLER FOR MUDDLE
17 IFE ITS,.INSRT STENEX >
20 PDLGRO==10000 ;AMOUNT TO GROW A PDL THAT LOSES
21 NINT==72. ;MAXIMUM NUMBER OF INTERRUPTS POSSIBLE
24 ;SET UP LOCATION 42 TO POINT TO TSINT
28 ZZZ==$. ;SAVE CURRENT LOCATION
32 JSR MTSINT ;GO TO HANDLER
38 ; GLOBALS NEEDED BY INTERRUPT HANDLER
40 .GLOBAL ONINT ; FUDGE INS EXECUTED IF NON ZERO AT START OF INTERRUPT
41 .GLOBAL INTBCK ; "PC-LOSER HACK "
42 .GLOBA GCFLG ;TELLS WHETHER OR NOT GARBAGE COLLECTOR IS RUNNING
43 .GLOBAL GCFLCH ; FLUSH CHARS IMMEDIATE SO GC CAN SEE THEM
44 .GLOBAL CORTOP ; TOP OF CORE
45 .GLOBA GCINT ;TELLS GARBAGE COLLECTOR TO SIMULATE AN INTERRUPT
46 .GLOBAL INTNUM,INTVEC ;TV ENTRIES CONCERNING INTERRUPTS
47 .GLOBAL AGC ;CALL THE GARBAGE COLLECTOR
48 .GLOBAL VECNEW,PARNEW,GETNUM ;GC PSEUDO ARGS
49 .GLOBAL GCPDL ;GARBAGE COLLECTORS PDL
50 .GLOBAL VECTOP,VECBOT ;DELIMIT VECTOR SPACE
51 .GLOBAL PURTOP,CISTNG,SAGC
52 .GLOBAL PDLBUF ;AMOUNT OF PDL GROWTH
53 .GLOBAL PGROW ;POINTS TO DOPE WORD OF NEXT PDL TO GROW
54 .GLOBAL TPGROW ;POINTS TO NEXT MUDDLE PDL TO GROW
55 .GLOBAL TOPLEV,ERROR%,N.CHNS,CHNL1
56 .GLOBAL BUFRIN,CHNL0,SYSCHR ;CHANNEL GLOBALS
57 .GLOBAL IFALSE,TPOVFL,1STEPR,INTOBL,INCHAR,CURPRI,RDEVIC,RDIREC,GFALS,STATUS
58 .GLOBAL PSTAT,NOTRES,IOIN2,INAME,INTFCN,CHNCNT,CHANNO,GIBLOK,ICONS,INCONS
59 .GLOBAL IEVECT,INSRTX,ILOOKC,IPUT,IREMAS,IGET,CSTAK,EMERGE,CHFSWP
60 .GLOBAL MTSINT ;BEGINNING OF INTERRUPT HANDLER
61 .GLOBAL INTINT ;CALLED BY INITIALIZER TO TAKE CARE OF INT PCS
62 .GLOBAL FRMSTK,APPLY,CHUNW,TGFALS
63 .GLOBAL IPCGOT,DIRQ ;HANDLE BRANCHING OFF TO IPC KLUDGERY
67 .GLOBAL GCTIM,GCCAUS,GCCALL,GPDLOV
69 ; GLOBALS FOR MONITOR ROUTINES
71 .GLOBAL MONCH,MONCH0,RMONCH,RMONC0,LOCQ,SMON,BAPT,APLQ,MAKACT,NAPT
72 .GLOBAL PURERR,BUFRIN,INSTAT,REALTV,DSTORE
76 .GLOBAL MSGTYP,MTYI,UPLO,IFLUSH,OCLOS,ERRET,MASK1,MASK2 ;SUBROUTINES USED
77 .GLOBAL ERROR,LISTEN,ECHO,RRESET,MTYO,GCHAPN,P.CORE,P.TOP,QUEUES,NOTTY,TTYOP2,TTICHN
78 .GLOBAL INTHLD,BNDV,SPECBE,DEMFLG
80 ; GLOBALS FOR PRE-AGC INTERRUPT
82 .GLOBAL FRETOP,GCSTOP,FREMIN,CORTOP,P.CORE,PURBOT,GETNUM,GCKNUM,GCHPN,INTAGC
83 .GLOBAL SPECBIND,SSPEC1,ILVAL
86 ; GLOBALS FOR COPY/WRITE HACK FOR GCDUMP AND PURIFY
88 .GLOBAL GCDFLG,%CWINF,BUFGC,WNDBOT,WIND,WNDP,%SHWND,GPURFL,%FDBUF,PURMNG,RPURBT
89 .GLOBAL NPWRIT,PVSTOR,SPSTOR,OPSYS
93 ;BEGINNING OF ACTUAL INTERRUPT HANDLER (MUST BE IMPURE)
96 ;***** TEMP FUDGE *******
101 ; DECLARATIONS ASSOCIATED WITH INTERRUPT HANDERS AND HEADERS
105 SPECIN: IRP A,,[CHAR,CLOCK,MPV,ILOPR,WRITE,READ,IOC,PURE,SYSDOWN,INFERIOR,RUNT,REALT
111 ; TABLE OF SPECIAL FINDING ROUTINES
113 FNDTBL: IRP A,,[GETCHN,0,0,0,LOCGET,LOCGET,0,0,0,0,0,0,0]
117 ; TABLE OF SPECIAL SETUP ROUTINES
119 INTBL: IRP A,,[S.CHAR,S.CLOK,S.MPV,S.ILOP,S.WMON,S.RMON,S.IOC,S.PURE,S.DOWN,S.INF
127 ; EXTERNAL INTERRUPT TABLE
129 EXTINT: REPEAT NINT-36.,0
137 IRP A,,[[HCLOCK,13.],[HMPV,14.],[HILOPR,6],[HIOC,9],[HPURE,26.],[HDOWN,7],[HREAL,35.]
138 [HRUNT,34.],[HPAR,28.]]
152 ; TABLES FOR TENEX INTERRUPT SYSTEM
154 LEVTAB: P1 ; POINTS TO INT PC HOLDERS FOR LEVS 1,2 AND 3
158 CHNMSK==700000,,7 ; WILL BE MASK WORD FOR INT SET UP
160 NNETS==7 ; ALLOW 7 NETWRK INTERRUPTS
162 NETCHN==36.-NNETS-UINTS-1
164 RLCHN==36.-NNETS-UINTS
167 IMPURE ; IMPURE BECAUSE IT CHANGES IN MULTI-SECTION MODE
168 CHNTAB: ; LOCATION OF INT ROUTINES FOR VARIOUS "CHANNELS"
170 REPEAT NCHRS, 1,,INTCHR+3*.RPCNT
171 BLOCK 36.-NNETS-NCHRS-UINTS-1 ; THERE ARE 36. TENEX INT CHANNELS
173 REPEAT NNETS+UINTS, 1,,INTNET+3*.RPCNT
175 IRP A,,[[9.,TNXPDL],[17.,PWRIT],[10.,TNXEOF],[11.,TNXIOC],[12.,TNXFUL]
176 [RLCHN,TNXRLT],[19.,TNXINF]]
180 CHNMSK==CHNMSK+<1_<35.-B>>
189 REPEAT NCHRS,SETZ HCHAR
190 BLOCK NINT-NNETS-NCHRS-UINTS-36.-1
191 REPEAT NNETS,SETZ HNET
192 REPEAT UINTS,SETZ USRINT
195 LOC EXTINT+NINT-RLCHN-1
197 LOC EXTINT+NINT-19.-1
203 ; HANDLER/HEADER PARAMETERS
207 IHDRLN==4 ; LENGTH OF HEADER BLOCK
209 INAME==0 ; NAME OF INTERRUPT
210 ISTATE==2 ; CURRENT STATE
211 IHNDLR==4 ; POINTS TO LIST OF HANDLERS
212 INTPRI==6 ; CONTAINS PRIORITY OF INTERRUPT
214 IHANDL==4 ; LENGTH OF A HANDLER BLOCK
216 INXT==0 ; POINTS TO NEXTIN CHAIN
217 IPREV==2 ; POINTS TO PREV IN CHAIN
218 INTFCN==4 ; FUNCTION ASSOCIATED WITH THIS HANDLER
219 INTPRO==6 ; PROCESS TO RUN INT IN
225 MTSINT: 0 ;INTERRUPT BITS GET STORED HERE
226 TSINTR: 0 ;INTERRUPT PC WORD STORED HERE
227 JRST TSINTP ;GO TO PURE CODE
229 ; SOFTWARE INTERNAL INTERRUPTS JSR TO HERE
239 ; JSR HERE FOR SOFTWARE INTERNAL INTERRUPTS
251 ;THE REST OF THIS CODE IS PURE
253 TSINTP: SOSGE INTFLG ; SKIP IF ENABLED
254 SETOM INTFLG ;DONT GET LESS THAN -1
256 SKIPE INTBCK ; ANY INT HACKS?
257 JRST PCLOSR ; DO A PC-LOSR ON THE PROGRAM
258 MOVEM A,TSAVA ;SAVE TWO ACS
260 MOVE A,TSINT ;PICK UP INT BIT PATTERN
261 JUMPL A,2NDWORD ;DONT CHECK FOR PDL OVERFLOW ETC. IF SIGN BIT ON
263 TRZE A,200000 ;IS THIS A PDL OVERFLOW?
264 JRST IPDLOV ;YES, GO HANDLE IT FIRST
267 TRNE A,20000 ;IS IT A MEMORY PROTECTION VIOLATION?
268 MOVEI B,1 ; FLAG SAME
270 TRNE A,40 ;ILLEGAL OP CODE?
271 MOVEI B,2 ; ALSO FLAG
277 JRST GCPWRT ; CHECK FOR PURE WRITE FOR POSSIBLE C/W
278 NOPUGC: SOJGE B,DO.NOW ; CANT WAIT AROUND
280 ;DECODE THE REST OF THE INTERRUPTS USING A TABLE
283 JUMPL A,GC2 ;2ND WORD?
284 IORM A,PIRQ ;NO, INTO WORD 1
285 JRST GCQUIT ;AND DISMISS INT
287 GC2: TLZ A,400000 ;TURN OFF SIGN BIT
289 TRNE A,177777 ;CHECK FOR CHANNELS
290 JRST CHNACT ;GO IF CHANNEL ACTIVITY
292 GCQUIT: SKIPGE INTFLG ;SKIP IF INTERRUPTS ENABLED
293 JRST INTDON ;NO, DEFER REAL HANDLING UNTIL LATER
295 MOVE A,TSINTR ;PICKUP RETURN WORD
299 TLON A,10000 ; EXEC PC?
300 SOJA A,MLTEX1 ; YES FIXUP PC
306 MLTEX1: MOVEM A,LCKINT ;STORE ELSEWHERE
307 MOVEI A,DOINTE ;CAUSE DISMISS TO HANDLER
308 IFN ITS, HRRM A,TSINTR ;STORE IN INT RETURN
315 PUSH P,INTFLG ;SAVE INT FLAG
316 SETOM INTFLG ;AND DISABLE
319 INTDON: MOVE A,TSAVA ;RESTORE ACS
321 IFN ITS, .DISMISS TSINTR ;AND DISMISS THE INTERRUPT
325 PCLOSR: MOVEM A,TSAVA
326 HRRZ A,TSINTR ; WHERE FROM
328 CAILE A,INTBEN ; AVOID TIMING ERRORS
344 JRST DLOSER ; HANDLE FATAL GC ERRORS
346 SKIPGE INTFLG ; IF NOT ENABLED
347 MOVEM B,INTFLG ; PRETEND IT IS
348 IFN ITS, JRST 2NDWORD
353 ; HERE FOR TENEX PDL OVER FLOW INTERRUPT
359 JRST IPDLOV ; GO TO COMMON HANDLER
361 ; HERE FOR REAL TIMER
363 TNXRLT: MOVEM A,TSAVA
364 IFG <RLCHN-18.>, MOVEI A,<1_<35.-<RLCHN>>>
365 IFLE <RLCHN-18.> MOVSI A,(<1_<35.-<RLCHN>>>)
369 ; HERE FOR TENEX ^G AND ^S INTERRUPTS
378 IORM A,PIRQ2 ; SAY FOR MUDDLE LEVEL
385 MOVE A,[1_<.RPCNT+NETCHN>]
388 TNXINF: MOVEM A,TSAVA
389 MOVEI A,<1_<35.-19.>>
392 ; LOW LEVEL HANDLERS FOR 10X IOC INTERRUPTS
394 TNXEOF: MOVEM A,TSAVA
395 MOVSI A,(1_<35.-10.>)
398 TNXIOC: MOVEM A,TSAVA
399 MOVSI A,(1_<35.-11.>)
402 TNXFUL: MOVEM A,TSAVA
403 MOVSI A,(1_<35.-12.>)
407 HRRZ A,TSAVA ; ASSUME JFN IS IN A (PRETTY FLAKEY BUT ...)
412 ; HERE TO PROCESS INTERRUPTS
414 DOINT: SKIPE INTHLD ; GLOBAL LOCK ON INTS
416 SETOM INTHLD ; DONT LET IT HAPPEN AGAIN
418 DOINTE: SKIPE ONINT ; ANY FUDGE?
419 XCT ONINT ; YEAH, TRY ONE
420 EXCH 0,LCKINT ; RELATIVIZE PC IF FROM RSUBR
421 IFE ITS, TLZ 0,777740 ; KILL EXCESS BITS
427 SUBI 0,(M) ; M IS BASE REG
428 IFN ITS, TLO 0,400000+M ; INDEX IT OFF M
436 EXCH 0,(P) ; AND RESTORE TO STACK
437 DONREL: EXCH 0,LCKINT ; GET BACK SAVED 0
438 SETZM INTFLG ;DISABLE
439 AOS -1(P) ;INCR SAVED FLAG
441 ;NOW SAVE WORKING ACS
444 HLRZ A,-1(P) ; HACK FUNNYNESS FOR MPV/ILOPR
446 SETZM -1(P) ; REALLY DISABLED
448 DIRQ: MOVE A,PIRQ ;NOW SATRT PROCESSING
449 JFFO A,FIRQ ;COUNT BITS AND GO
450 MOVE A,PIRQ2 ;1ST DONE, LOOK AT 2ND
453 INTDN1: SKIPN GCHAPN ; SKIP IF MUST DO GC INT
456 PUSHJ P,INTOGC ; AND INTERRUPT
461 .SUSET [.SPICLR,,[0]] ; DISABLE INTS
465 SETZM INTHLD ; RE-ENABLE THE WORLD
468 HRRI 0,@0 ; EFFECTIVIZE THE ADDRESS
469 TLZ 0,37 ; KILL IND AND INDEX
476 XJRST .+1 ; MAKE SURE OUT OF SECTION 0
485 FIRQ: PUSHJ P,GETBIT ;SET UP THE BIT TO CLOBBER IN PIRQ
486 ANDCAM A,PIRQ ;CLOBBER IT
487 ADDI B,36. ;OFSET INTO TABLE
488 JRST XIRQ ;GO EXECUTE
490 FIRQ2: PUSHJ P,GETBIT ;PREPARE TO CLOBBER BIT
491 ANDCAM A,PIRQ2 ;CLOBBER IT
492 ADDI B,71. ;AGAIN OFFSET INTO TABLE
494 CAIE B,21 ;PDL OVERFLOW?
495 JRST FHAND ;YES, HACK APPROPRIATELY
503 JRST (E) ; NOTHING GROWING, FALSE ALARM
504 MOVEI B,PDLGRO_-6 ;GET GROWTH SPEC
505 DPB B,[111100,,-1(A)] ;STORE GROWTH SPEC
506 REAGC: MOVE C,[10.,,1] ; INDICATOR FOR AGC
507 SKIPE PGROW ; P IS GROWING
509 SKIPE TPGROW ; TP IS GROWING
511 PUSHJ P,AGC ;COLLECT GARBAGE
514 AOJL A,REAGC ; IF NO CORE, RETRY
520 IRP A,,[0,A,B,C,D,E,TVP,SP]
522 SETZM A!STO(PVP) ;NOW ZERO TYPE
532 MOVEM D,-13(TP) ; USE AS DSTO
542 IRP A,,[SP,TVP,E,D,C,B,A,0]
551 ; HERE TO DO GC INTERRUPT AND CLOSE ANY DEAD CHANNELS
553 INTOGC: PUSH P,[N.CHNS-1]
555 MOVE TVP,REALTV+1(PVP)
563 INTGC1: MOVE A,(TP) ; GET POINTER
564 SKIPN B,1(A) ; ANY CHANNEL?
566 HRRE 0,(A) ; INDICATOR
584 PUSH TP,$TFLOAT ; PUSH ON TIME ARGUMENT
586 PUSH TP,$TFIX ; PUSH ON THE CAUSE ARGUMENT
588 PUSH TP,$TATOM ; PUSH ON THE CALL ARGUMENT
594 ; PRE AGC INTERRUPT. CAUSED WHEN FREE STORAGE REQUEST CAN BE SATISFIED BY
595 ; EXTENDING CORE. IT IS CALLED "AGC" AND THE HANDLER IS PASSED THE CALLER,
596 ; AND THE PENDING REQUEST.
599 INTAGC: MOVE A,GETNUM
600 MOVEM A,GCKNUM ; SET UP TO CAUSE INTERRUPT
601 PUSH P,C ; SAVE ARGS TO GC
602 MOVEI A,2000 ; GET WORKING SPACE
603 PUSHJ P,INTCOR ; GET IT
604 MOVSI A,TATOM ; EXAMINE BINDING OF FLAG
605 MOVE B,IMQUOTE AGC-FLAG
608 JRST INAGCO ; JUMP TO GET CORE FOR INTERRUPT
610 ADD A,P.TOP ; SEE IF WE CAN POSSIBLY WIN
613 JRST AGCCAU ; WORLD IS IN BAD SHAPE, CALL AGC
614 PUSH TP,$TTP ; BIND FLAG
615 PUSH TP,TP ; FOR UNBINDING PURPOSES
616 PUSH TP,[TATOM,,-1] ; SPECBINDS ARGS
617 PUSH TP,IMQUOTE AGC-FLAG
624 ; SET UP CALL TO HANDLER
626 PUSH TP,$TCHSTR ; STRING INDICATING INTERRUPT
627 PUSH TP,CHQUOTE DIVERT-AGC
628 PUSH TP,$TFIX ; PENDING REQUEST
634 MCALL 3,INTERR ; ENABLE INTERRUPT
635 GETYP A,A ; CHECK TO SEE IF INTERRUPT WAS ENABLED
636 HRRZ E,-6(TP) ; GET ARG FOR UNBINDING
638 SUB TP,[8,,8] ; CLEAN OFF STACK
639 CAIE A,TFALSE ; SKIP IF NOT
642 ; CAUSE AN AGC TO HAPPEN
644 AGCCAU: MOVE C,(P) ; INDICATOR
645 PUSHJ P,SAGC ; CALL AGC
648 ; SEE WHETHER ENOUGH CORE WAS ALLOCATED
649 CHKWIN: MOVE A,FRETOP
651 SUB A,GCKNUM ; AMOUNT NEEDED OR IN EXCESS
652 JUMPGE A,FINAGC ; JUMP IF DONE
654 MOVEM A,GETNUM ; SET UP REQUEST
661 ; ROUTINE TO HANDLE INTERRUPT WHILE INTERRUPT IS RUNNING
662 ; IT TRIES TO ALLOCATE FOR REQUEST+ AT LEAST ONE CORE BLOCK
664 INAGCO: MOVE A,GETNUM ; GET REQUEST
665 SUB A,GCKNUM ; CALCULATE REAL CURRENT REQUEST
667 ANDCMI A,1777 ; AMOUNT WANTED
668 PUSHJ P,INTCOR ; GET IT
672 ; ROUTINE TO GET CORE FOR PRE-AGC INTERRUPT. REQUEST IN A
675 INTCOR: ADD A,P.TOP ; ADD TOP TO REQUEST
676 CAML A,PURBOT ; SKIP IF BELOW PURE
678 MOVEM A,CORTOP ; STORE POSSIBLE CORE TOP
679 ASH A,-10. ; TO PAGES
680 PUSHJ P,P.CORE ; GET THE CORE
681 JRST AGCCA1 ; LOSE,LOSE,LOSE
693 AGCCA1: MOVE C,-1(P) ; GET ARGS FOR AGC
694 SUB P,[1,,1] ; FLUSH RETURN ADDRESS
699 GCALLR: MQUOTE GC-READ
707 MQUOTE PURE-PAGE-LOADER
709 MQUOTE INTERRUPT-HANDLER
713 \f; OLD "ON" SETS UP EVENT AND HANDLER
719 HLRE 0,AB ; 0=> -2*NUM OF ARGS
723 MOVEI B,10(AB) ; LAST MUST BE CHAN OR LOC
726 JUMPG 0,TFA ; AT LEAST 3
727 MOVEI A,0 ; SET UP IN CASE NO PROC
728 AOJG 0,ONPROC ; JUMP IF NONE
729 GETYP C,6(AB) ; CHECK IT
732 MOVE A,7(AB) ; GET IT
733 ONPROC: PUSH P,A ; SAVE AS A FLAG
734 GETYP A,(AB) ; CHECK PREV EXISTANCE
740 MOVEI B,(AB) ; FIND IT
742 POP P,0 ; REST NUM OF ARGS
743 JUMPN B,ON3 ; ALREADY THERE
744 SKIPE C ; SKIP IF NOTHING TO FLUSH
746 PUSH TP,(AB) ; GET NAME
750 MOVEI A,2 ; # OF ARGS TO EVENT
751 AOJG 0,ON1 ; JUMP IF NO LAST ARG
759 PUSH TP,2(AB) ; NOW FCN
761 MOVEI A,3 ; NUM OF ARGS
770 TRYFIX: SKIPN A,7(AB)
775 ; ROUTINE TO BUILD AN EVENT
782 CAIN 0,-2 ; IF JUST 1
783 JRST RE.EVN ; COULD BE EVENT
784 CAIL 0,-3 ; MUST BE AT LEAST 2 ARGS
786 GETYP A,2(AB) ; 2ND ARG MUST BE FIXED POINT PRIORITY
789 GETYP A,(AB) ; FIRST ARG SHOULD BE CHSTR
790 CAIN A,TATOM ; ALLOW ACTUAL ATOM
799 PUSHJ P,CHNORL ; CHANNEL OR LOCATIVE (PUT ON STACK)
801 GOTRGS: MOVEI B,(AB) ; NOW TRY TO FIND HEADER FOR THIS INTERRUPT
802 PUSHJ P,FNDINT ; CALL INTERNAL HACKER
803 JUMPN B,FINIS ; ALREADY ONE OF THIS NAME
805 JUMPE C,.+3 ; GET IT OFF STACK
808 PUSHJ P,MAKINT ; MAKE ONE FOR ME
810 MOVEM 0,INTPRI(B) ; SET UP PRIORITY
813 CH.SPC: POP P,C ; GET CODE BACK
815 PUSHJ P,DO.SPC ; DO ANY SPECIAL HACKS
820 JRST TFA ; ELSE SAY NOT ENOUGH
821 MOVE B,1(AB) ; GET IT
822 SETZM ISTATE+1(B) ; MAKE SURE ENABLED
824 GETYP A,INAME(B) ; CHECK FOR CHANNEL
825 CAIN A,TCHAN ; SKIP IF NOT
826 HRROI C,SS.CHA ; SET UP CHANNEL HACK
827 HRLZ E,INTPRI(B) ; GET POSSIBLE READ/WRITE BITS
828 TLNE E,.WRMON+.RDMON ; SKIP IF NOT MONITORS
831 MOVE B,INAME+1(B) ; CHECK FOR SPEC
833 MOVE B,1(AB) ; RESTORE IHEADER
834 RE.EV1: PUSH TP,INAME(B)
840 MOVE D,MQUOTE INTERRUPT
843 MOVE B,INAME+1(B) ; GET IT
844 PUSHJ P,IGET ; LOOK FOR IT
845 JUMPN B,FINIS ; RETURN IT
852 PUSHJ P,IPUT ; REESTABLISH IT
858 ; FUNCTION TO GENERATE A HANDLER FOR A GIVEN INTERRUPT
860 MFUNCTION HANDLER,SUBR
865 CAIL 0,-2 ; MUST BE 2 OR MORE ARGS
868 CAIE A,TINTH ; EVENT?
871 CAIN 0,-4 ; IF EXACTLY 2
872 CAIE A,THAND ; COULD BE HANDLER
875 MOVE B,3(AB) ; GET IT
876 SKIPN IPREV+1(B) ; SKIP IF ALREADY IN USE
878 MOVE D,1(AB) ; GET EVENT
879 SKIPN D,IHNDLR+1(D) ; GET FIRST HANDLER
881 CAMN D,B ; IS THIS IT?
882 JRST HFINIS ; YES, ALREADY "HANDLED"
883 MOVE D,INXT+1(D) ; GO TO NEXT HANDLER
885 BADHND: ERRUUO EQUOTE HANDLER-ALREADY-IN-USE
887 CHEVNT: CAIG 0,-7 ; SKIP IF LESS THAN 4
889 PUSH TP,$TPVP ; SLOT FOR PROCESS
891 CAIE 0,-6 ; IF 3, LOOK FOR PROC
901 PUSHJ P,MHAND ; MAKE THE HANDLER
902 MOVE 0,1(TB) ; GET PROCESS
903 MOVEM 0,INTPRO+1(B) ; AND PUT IT INTO HANDLER
904 MOVSI 0,TPVP ; SET UP TYPE
906 MOVE 0,2(AB) ; SET UP FUNCTION
911 HNDOK: MOVE D,1(AB) ; PICK UP EVEENT
912 MOVE E,IHNDLR+1(D) ; GET POINTER TO HANDLERS
913 MOVEM B,IHNDLR+1(D) ; PUT NEW ONE IN
914 MOVSI 0,TINTH ; GET INT HDR TYPE
915 MOVEM 0,IPREV(B) ; INTO BACK POINTER
916 MOVEM D,IPREV+1(B) ; AND POINTER ITSELF
917 MOVEM E,INXT+1(B) ; NOW NEXT POINTER
918 MOVSI 0,THAND ; NOW HANDLER TYPE
919 MOVEM 0,IHNDLR(D) ; SET TYPE IN HEADER
921 JUMPE E,HFINIS ; JUMP IF HEADER WAS EMPTY
922 MOVEM 0,IPREV(E) ; FIX UP ITS PREV
924 HFINIS: MOVSI A,THAND
929 ; FUNCTIONS TO SET TIME LIMITS FOR REALTIME AND RUNTIME INTS
933 MFUNCTION RUNTIMER,SUBR
955 RUNT2: JUMPL A,OUTRNG ; NOT FOR NEG #
961 RNTLFT: .SUSET [.RRTMR,,B]
962 JUMPL B,IFALSE ; RETURN FALSE IF NONE SET
963 IDIV B,[245761.] ; TO SECONDS
971 MFUNCTION REALTIMER,SUBR
983 IFN ITS, IMULI A,60. ; TO 60THS OF SEC
984 IFE ITS, IMULI A,1000. ; TO MILLI
987 REALT1: CAIE 0,TFLOAT
989 IFN ITS, FMPRI A,(60.0)
990 IFE ITS, FMPRI A,(1000.0)
996 REALT2: JUMPL A,OUTRNG
1007 MOVE A,[MFORK,,.TIMAL] ; FLUSH CURRENT FIRST
1024 RLTPER: SKIPGE B,RLTSAV
1026 IFN ITS, IDIVI B,60. ; BACK TO SECONDS
1027 IFE ITS, IDIVI B,1000.
1032 ; FUNCTIONS TO ENABLE AND DISABLE INTERRUPTS
1034 MFUNCTION %ENABL,SUBR,ENABLE
1040 MFUNCTION %DISABL,SUBR,DISABLE
1055 DO.SPC: HRRO C,INTBL(C) ; POINT TO SPECIAL CODE
1056 HLRZ 0,AB ; - TWO TIMES NUM ARGS
1057 PUSHJ P,(C) ; CALL ROUTINE
1058 JUMPE E,CPOPJ ; NO BITS TO ENABLE, LEAVE
1062 MOVE B,1(TB) ; CHANNEL
1064 MOVEM 0,(E) ; SAVE IN TABLE
1066 SUBI E,NETJFN-NETCHN
1067 MOVE A,0 ; SETUP FOR MTOPR
1070 TLO C,770000 ; DONT SETUP INR/INS
1082 POPJ P, ; ***** TEMP ******
1085 CAILE E,35. ; SKIP IF 1ST WORD BIT
1089 IORM 0,MASK1 ; STORE IN PROTOTYPE MASK
1090 .SUSET [.SMASK,,MASK1]
1093 SETW2: LSH 0,-36.(E)
1094 IORM 0,MASK2 ; SET UP PROTO MASK2
1095 .SUSET [.SMSK2,,MASK2]
1099 ; ROUTINE TO CHECK FOR CHANNEL OR LOCATIVE
1101 CHNORL: GETYP A,(B) ; GET TYPE
1102 CAIN A,TCHAN ; IF CHANNEL
1105 PUSHJ P,LOCQ ; ELSE LOOCATIVE
1112 ; SUBROUTINE TO FIND A HANDLER OF A GIVEN NAME
1114 FNDINT: PUSHJ P,FNDNM
1116 PUSHJ P,SPEC1 ; COULD BE FUNNY
1118 INTASO: PUSH P,C ; C<0 IF SPECIAL
1122 SKIPN D ; COULD BE CHANGED FOR MONITOR
1123 MOVE D,MQUOTE INTERRUPT
1129 POP P,C ; AND RESTOR SPECIAL INDICATOR
1131 SUB TP,[2,,2] ; REMOVE CRUFT
1132 CPOPJ: POPJ P, ; AND RETURN
1134 ; CHECK FOR SPECIAL INTERNAL INTERRUPT HACK
1136 SPEC1: MOVSI C,-SPECLN ; BUILD AOBJN PNTR
1137 SPCLOP: CAME B,@SPECIN(C) ; SKIP IF SPECIAL
1138 AOBJN C,.-1 ; UNTIL EXHAUSTED
1142 MOVEI 0,-1(TB) ; SEE IF OK
1147 ; ROUTINE TO CREATE A NEW INTERRUPT (INTERNAL ONLY--NOT ITS FLAVOR)
1149 MAKINT: JUMPN C,GOTATM ; ALREADY HAVE NAME, GET THING
1150 MOVEI B,(AB) ; POINT TO STRING
1151 PUSHJ P,CSTAK ; CHARS TO STAKC
1154 MOVE D,MQUOTE INTERRUPT
1155 GOTATM: PUSH TP,$TINTH ; MAKE SLOT FOR HEADER BLOCK
1158 PUSH TP,B ; SAVE ATOM
1163 MOVE A,-3(TP) ; GET NAME AND STORE SAME
1168 MOVEM B,-4(TP) ; STASH HEADER
1173 EXCH A,-1(TP) ; INTERNAL PUT CALL
1179 ; FIND NAME OF INTERRUPT
1181 FNDNM: GETYP A,(B) ; TYPE
1182 CAIE A,TCHSTR ; IF STRING
1183 JRST FNDATM ; DONT HAVE ATOM, OTHERWISE DO
1187 SETZB C,D ; PREVENT LOSSAGE LATER
1190 ; THE NEXT 2 INSTRUCTIONS ARE A KLUDGE TO GET THE RIGHT ERROR ATOM
1192 CAMN B,IMQUOTE ERROR
1193 MOVE B,MQUOTE ERROR,ERROR,INTRUP
1196 IILOOK: PUSHJ P,CSTAK ; PUT CHRS ON STACK
1199 JRST ILOOKC ; LOOK IT UP
1201 ; ROUTINE TO MAKE A HANDLER BLOCK
1203 MHAND: MOVEI A,IHANDL*2
1204 JRST GIBLOK ; GET BLOCK
1206 ; HERE TO GET CHANNEL FOR "CHAR" INTERRUPT
1208 GETCHN: GETYP 0,(TB) ; GET TYPE
1209 CAIE 0,TCHAN ; CHANNL IS WINNER
1211 MOVE A,(TB) ; USE THE CHANNEL TO NAME THE INTERRUPT
1213 SKIPN CHANNO(B) ; SKIP IF WINNING CHANNEL
1217 LOCGET: GETYP 0,(TB) ; TYPE
1218 CAIN 0,TCHAN ; SKIP IF LOCATIVE
1222 MOVE B,1(TB) ; GET LOCATIVE
1225 ; FINAL MONITOR SETUP ROUTINES
1227 S.RMON: SKIPA E,[.RDMON,,]
1228 S.WMON: MOVSI E,.WRMON
1231 HLRM E,INTPRI(B) ; SAVE BITS
1232 MOVEI B,(TB) ; POINT TO LOCATIVE
1235 MOVSI D,(ANDCAM E,) ; KILL INST
1238 PUSHJ P,SMON ; GO DO IT
1245 ; SPECIAL SETUP ROUTINES FOR INITIAL INTERRUPTS
1248 S.CHAR: MOVE E,1(TB) ; GET CHANNEL
1250 ILDB 0,0 ; 1ST CHAR TO 0
1254 XORM 0,-2(E) ; IN CASE OUTPUT
1256 ADDI E,36. ; GET CORRECT MASK BIT
1257 ONEBIT: MOVEI 0,1 ; BIT FOR INT TO RET
1261 S.CHAR: MOVE E,1(TB)
1263 XORM 0,-2(E) ; IN CASE OUTPUT
1272 MOVE E,[-NNETS,,NETJFN]
1276 MOVE A,E ; REMEMBER WHERE
1279 FATAL NO MORE NETWORK
1290 S.CLOK: MOVEI E,13. ; FOR NOW JUST GET BIT #
1296 ; RUNTIME AND REALTIME INTERRUPTS
1298 S.RUNT: SKIPA E,[34.]
1302 S.IOC: SKIPA E,[9.] ; IO CHANNEL ERROR
1308 S.MPV: SKIPA E,[14.] ; BIT POS
1312 ; HERE TO TURN ALL INFERIOR INTS
1314 S.INF: MOVEI E,36.+16.+2 ; START OF BITS
1315 MOVEI 0,37 ; 8 BITS WORTH
1327 S.RUNT: ERRUUO EQUOTE INTERRUPT-UNAVAILABLE-ON-TENEX
1328 S.IOC: MOVEI 0,7 ; 3 BITS FOR EOF/FULL/ERROR
1338 ; HERE TO HANDLE ITS INTERRUPTS
1340 FHAND: SKIPN D,EXTINT(B) ; SKIP IF HANDLERS ARE POSSIBLE
1345 ; SPECIAL CHARACTER HANDLERS
1347 HCHAR: MOVEI D,CHNL0+1
1348 ADDI D,(B) ; POINT TO CHANNEL SLOT
1350 SKIPN D,-72.(D) ; PICK UP CHANNEL
1351 JRST IPCGOT ;WELL, IT GOTTA BEE THE THE IPC THEN
1354 LDB 0,[600,,STATUS(D)] ; GET DEVICE CODE
1355 CAILE 0,2 ; SKIP IF A TTY
1356 JRST HNET ; MAYBE NETWORK CHANNEL
1361 SKIPE DEMFLG ; SKIP IF NOT DEMON
1365 MOVE B,D ; CHAN TO B
1367 PUSHJ P,TTYOP2 ; RE-GOBBLE TTY
1370 HCHR11: MOVE D,CHANNO(D) ; GET ITS CHANNEL
1371 PUSH P,D ; AND SAVE IT
1372 .CALL HOWMNY ; GET # OF CHARS
1373 MOVEI B,0 ; IF TTY GONE, NO CHARS
1374 RECHR: ADDI B,1 ; BUMP BY ONE FOR SOSG
1375 MOVEM B,CHNCNT(D) ; AND SAVE
1376 IORM A,PIRQ2 ; LEAVE THE INT ON
1378 CHRLOO: MOVE D,(P) ; GET CHNNAEL NO.
1379 SOSG CHNCNT(D) ; GET COUNT
1383 MOVE D,BUFRIN(B) ; GET EXTRA BUFFER
1384 XCT IOIN2(D) ; READ CHAR
1385 JUMPL A,CHRDON ; NO CHAR THERE, FORGET IT
1387 PUSH TP,CHQUOTE CHAR
1388 PUSH TP,$TCHRS ; SAVE CHAR FOR CALL
1390 PUSH TP,$TCHAN ; SAVE CHANNEL
1392 PUSHJ P,INCHAR ; PUT CHAR IN USERS BUFFER
1393 MCALL 3,INTERRUPT ; RUN THE HANDLERS
1394 JRST CHRLOO ; AND LOOP
1396 CHRDON: .CALL HOWMNY
1398 MOVEI A,1 ; SET FOR PI WORD CLOBBER
1400 JUMPG B,RECHR ; ANY MORE?
1408 ; HERE FOR NET CHANNEL INTERRUPT
1410 HNET: CAIE 0,26 ; NETWORK?
1411 JRST HSTYET ; HANDLE PSEUDO TTY ETC.
1413 PUSH TP,MQUOTE CHAR,CHAR,INTRUP
1418 MOVE B,D ; CHAN TO B
1419 PUSHJ P,INSTAT ; UPDATE THE NETWRK STATE
1425 HSTYET: PUSH TP,$TATOM
1426 PUSH TP,MQUOTE CHAR,CHAR,INTRUP
1434 CBDCHN: ERRUUO EQUOTE BAD-CHANNEL
1438 HCLOCK: PUSH TP,$TCHSTR
1439 PUSH TP,CHQUOTE CLOCK
1443 HRUNT: PUSH TP,$TATOM
1444 PUSH TP,MQUOTE RUNT,RUNT,INTRUP
1448 HREAL: PUSH TP,$TATOM
1449 PUSH TP,MQUOTE REALT,REALT,INTRUP
1453 HPAR: MOVE A,MQUOTE PARITY,PARITY,INTRUP
1456 HMPV: MOVE A,MQUOTE MPV,MPV,INTRUP
1459 HILOPR: MOVE A,MQUOTE ILOPR,ILOPR,INTRUP
1462 HPURE: MOVE A,MQUOTE PURE,PURE,INTRUP
1463 HMPV1: PUSH TP,$TATOM
1465 PUSH P,LCKINT ; SAVE LOCN
1477 PUSH TP,EQUOTE DANGEROUS-INTERRUPT-NOT-HANDLED
1487 ; HERE TO HANDLE SYS DOWN INTERRUPT
1489 HDOWN: PUSH TP,$TATOM
1490 PUSH TP,MQUOTE SYSDOWN,SYSDOWN,INTRUP
1491 .DIETI A, ; HOW LONG?
1494 PUSH P,A ; FOR MESSAGE
1498 .SUSET [.RTTY,,B] ; DO WE NOW HAVE A TTY AT ALL?
1499 JUMPL B,DIRQ ; DONT HANG AROUND
1502 Excuse me, SYSTEM going down in /]
1503 SKIPG (P) ; SKIP IF REALLY GOING DOWN
1505 Excuse me, SYSTEM has been REVIVED!
1510 IDIVI B,30. ; TO SECONDS
1511 IDIVI B,60. ; A/ SECONDS B/ MINUTES
1515 MOVEI B,[ASCIZ / minutes /]
1521 MOVEI B,[ASCIZ / seconds.
1526 ; TWO DIGIT DEC OUT FROM B/
1529 JUMPE B,DECOU1 ; NO TEN
1532 DECOU1: MOVEI A,60(C)
1536 ; HERE TO HANDLE I/O CHANNEL ERRORS
1540 .SUSET [.RAPRC,,A] ; CONTAINS CHANNEL OF MOST RECENT LOSSAGE
1541 LDB A,[330400,,A] ; GET CHAN #
1544 PUSH TP,$TATOM ; PUSH ERROR
1545 PUSH TP,EQUOTE FILE-SYSTEM-ERROR
1546 IFE ITS, MOVE C,IOCLOS ; GET JFN
1548 ASH C,1 ; GET CHANNEL
1549 ADDI C,CHNL0+1 ; GET CHANNEL VECTOR
1552 LSH A,23. ; DO A .STATUS
1557 MOVNI A,1 ; GET "MOST RECENT ERROR"
1560 IFN ITS, PUSHJ P,GFALS ; GEN NAMED FALSE
1561 IFE ITS, PUSHJ P,TGFALS
1565 PUSH TP,MQUOTE IOC,IOC,INTRUP
1572 JUMPN B,DIRQ1 ; JUMP IF HANDLED
1576 DIRQ1: SUB TP,[6,,6]
1579 ; HANDLE INFERIOR KNOCKING AT THE DOOR
1582 IFN ITS, SUBI B,36.+16.+2 ; CONVERT TO INF #
1585 PUSH TP,MQUOTE INFERIOR,INFERIOR,INTRUP
1593 ; HERE FOR TENEX INTS (FIRST CUT)
1595 MFUNCTION %ACCHRS,SUBR,[ACTIVATE-CHARS]
1606 HRRZ D,(AB) ; CHECK LENGTH
1607 MOVEI C,0 ; SEE IF ANY NET CHANS IN USE
1608 MOVE A,[-NNETS,,NETJFN]
1613 CAILE D,NCHRS+NNETS(C)
1616 MOVEI 0,(D) ; CHECK THEM
1625 MOVSI E,-<NCHRS+NNETS> ; ZAP CURRENT
1631 MOVE A,[-NNETS,,NETJFN] ; IN CASE USED NET INTS FOR CHARS
1638 SETZB C,F ; C WILL BE MASK, F OFFSET INTO TABLE
1639 MOVSI 0,400000 ; 0 WILL BE THE BIT FOR INT MASK OR'ING
1640 JUMPE D,ALP1 ; JUMP IF NONE
1641 MOVNS D ; BUILD AOBJN POINTER TO CHRS TABLE
1643 MOVEI B,0 ; B COUNTS NUMBER DONE
1645 ALP: ILDB A,E ; GET CHR
1651 ADDI A,(F) ; POSSIBLE OFFSET FOR MORE CHANS
1657 SKIPE NETJFN-NCHRS(B)
1660 MOVEI F,36.-NNETS-UINTS-NCHRS(B)
1663 LSH 0,(G) ;NEW MASK FOR INT MASKS
1670 MOVE B,MASK1 ; SET UP FOR INT BITS
1676 RETCHR: MOVE C,[-NCHRS-NNETS,,CHRS]
1687 RETDON: PUSHJ P,CISTNG
1690 HCHAR: HRRZ A,CHRS-36.(B)
1692 PUSH TP,MQUOTE CHAR,CHAR,INTRUP
1700 HNET: SKIPLE A,NETJFN-NINT+NNETS+UINTS(B)
1702 SUBI B,36.-NNETS-UINTS-NCHRS
1709 PUSH TP,MQUOTE CHAR,CHAR,INTRUP
1720 PUSH TP,MQUOTE USERINT,USERINT,INTRUP
1733 GETYP A,(AB) ; ARG TYPE
1734 MOVE B,1(AB) ; AND VALUE
1735 CAIN A,TINTH ; HEADER, GO HACK
1736 JRST OFFHD ; QUEEN OF HEARTS
1740 JRST TRYHAN ; MAYBE INDIVIDUAL HANDLER
1741 CAIN 0,-2 ; MORE THAN 1 ARG?
1742 JRST OFFAC1 ; NO, GO ON
1743 CAIG 0,-5 ; CANT BE MORE THAN 2
1745 MOVEI B,2(AB) ; POINT TO 2D
1747 OFFAC1: MOVEI B,(AB)
1749 JUMPGE B,NOHAN1 ; NOT HANDLED
1751 OFFH1: PUSH P,C ; SAVE C FOR BIT CLOBBER
1754 MOVE D,MQUOTE INTERRUPT
1758 SKIPE B ; IF NO ASSOC, DONT SMASH
1759 SETOM ISTATE+1(B) ; DISABLE IN CASE QUEUED
1761 JUMPGE C,FINIS ; NO, DONE
1763 HRRZ C,INTBL(C) ; POINT TO SPECIAL CODE
1764 PUSHJ P,(C) ; GO TO SAME
1765 JUMPE E,OFINIS ; DONE
1767 CAILE E,35. ; SKIP IF 1ST WORD
1768 JRST CLRW2 ; CLOBBER 2D WORD BIT
1769 LSH 0,-1(E) ; POSITION BIT
1770 ANDCAM 0,MASK1 ; KILL BIT
1771 .SUSET [.SMASK,,MASK1]
1777 SUBI E,NETJFN-NETCHN
1785 ANDCAM 0,PIRQ ; JUST IN CASE
1788 OFINIS: MOVSI A,TINTH
1792 CLRW2: LSH 0,-36.(E) ; POS BIT FOR 2D WORD
1794 .SUSET [.SMSK2,,MASK2]
1798 TRYHAN: CAIE A,THAND ; HANDLER?
1802 GETYP 0,IPREV(B) ; GET TYPE OF PREV
1804 SKIPN C,IPREV+1(B) ; dont act silly if already off! (TT)
1808 JRST DOHEAD ; PREV HUST BE HDR
1811 DOHEAD: MOVEM A,IHNDLR+1(C) ; INTO HDR
1815 OFFINI: SETZM IPREV+1(B) ; Leave NXT slot intact for RUNINT (BKD)
1821 PUSHJ P,GETNMS ; GET INFOR ABOUT INT
1827 GETNMS: GETYP A,INAME(B) ; CHECK FOR SPECIAL
1831 PUSHJ P,LOCQ ; LOCATIVE?
1834 MOVEI B,INAME(B) ; POINT TO LOCATIVE
1836 PUSHJ P,SMON ; GET MONITOR
1838 GETNM1: HRROI C,SS.WMO ; ASSUME WRITE
1841 MOVE D,MQUOTE WRITE,WRITE,INTRUP
1843 MOVE D,MQUOTE READ,READ,INTRUP
1846 CHGTNM: JUMPL C,CPOPJ
1849 MOVE B,1(AB) ; RESTORE IHEADER
1852 ; EMERGENCY, CANT DEFER ME!!
1860 MFUNCTION INTERRUPT,SUBR
1866 SETZM INTHLD ; RE-ENABLE THE WORLD
1868 MOVE B,1(AB) ; GET HANDLER/NAME
1869 GETYP A,(AB) ; CAN BE HEADER OR NAME
1870 CAIN A,TINTH ; SKIP IF NOT HEADER
1874 CAIE A,TCHSTR ; SKIP IF CHAR STRING
1876 MOVEI B,(AB) ; LOOK UP NAME
1877 PUSHJ P,FNDNM ; GET NAME
1880 CAMN B,MQUOTE CHAR,CHAR,INTRUP
1882 CAME B,MQUOTE READ,READ,INTRUP
1883 CAMN B,MQUOTE WRITE,WRITE,INTRUP
1888 GTHEAD: SKIPE ISTATE+1(B) ; ENABLED?
1889 JRST IFALSE ; IGNORE COMPLETELY
1890 MOVE A,INTPRI+1(B) ; GET PRIORITY OF INTERRUPT
1891 CAMLE A,CURPRI ; SEE IF MUST QUEU
1892 JRST SETPRI ; MAY RUN NOW
1893 SKIPE (P) ; SKIP IF DEFER OK
1896 PUSH TP,$TINTH ; SAVE HEADER
1898 MOVEI A,1 ; SAVE OTHER ARGS
1899 PSHARG: ADD AB,[2,,2]
1900 JUMPGE AB,QUEU1 ; GO MAKE QUEU ENTRY
1904 QUEU1: PUSHJ P,IEVECT ; GET VECTOR
1906 PUSH TP,[0] ; WILL HOLD QUEUE HEADER
1910 POP P,A ; RESTORE PRIORITY
1912 MOVE B,QUEUES+1 ; GET INTERRUPT QUEUES
1914 JUMPGE B,GQUEU ; MAKE A QUEUE HDR
1916 NXTQU: CAMN A,1(B) ; GOT PRIORITY?
1917 JRST ADDQU ; YES, ADD TO THE QUEU
1918 CAML A,1(B) ; SKIP IF SPOT NOT FOUND
1921 MOVE B,3(B) ; GO TO NXT QUEUE
1924 GQUEU: PUSH TP,$TVEC ; SAVE NEXT POINTER
1927 PUSH TP,A ; SAVE PRIORITY
1936 MOVE D,(TP) ; NOW SPLICE
1941 GQUEU1: MOVEM B,3(D)
1943 ADDQU: MOVEM B,-2(TP) ; SAVE QUEU HDR
1946 PUSHJ P,INCONS ; CONS IT
1947 MOVE C,(TP) ;GET QUEUE HEADER
1948 SKIPE D,7(C) ; IF END EXISTS
1951 SKIPN 5(C) ; SKIP IF START EXISTS
1954 IFINI: MOVSI A,TATOM
1958 SETPRI: EXCH A,CURPRI
1961 PUSH TP,$TAB ; PASS AB TO HANDLERS
1964 PUSHJ P,RUNINT ; RUN THE HANDLERS
1965 POP P,A ; UNQUEU ANY WAITERS
1970 ; HERE TO UNQUEUE WAITING INTERRUPTS
1972 UNQUEU: PUSH P,A ; SAVE NEW LEVEL
1974 UNQUE1: MOVE A,(P) ; TARGET LEVEL
1975 CAMLE A,CURPRI ; CHECK RUG NOT PULLED OUT
1978 CAML A,1(B) ; RIGHT LEVEL?
1979 JRST UNDONE ; FINISHED
1981 SKIPN C,5(B) ; ON QUEUEU?
1983 HRRZ D,(C) ; CDR THE LIST
1985 SKIPN D ; SKIP IF NOT LAST
1986 SETZM 7(B) ; CLOBBER END POINTER
1987 MOVE A,1(B) ; GET THIS PRIORITY LEVEL
1988 MOVEM A,CURPRI ; MAKE IT THE CURRENT ONE
1989 MOVE D,1(C) ; GET SAVED VECTOR OF INF
1991 MOVE B,1(D) ; INT HEADER
1993 PUSH TP,D ; AND ARGS
1995 PUSHJ P,RUNINT ; RUN THEM
1998 UNDONE: POP P,CURPRI ; SET CURRENT LEVEL
2002 UNXQ: MOVE B,3(B) ; GO TO NEXT QUEUE
2008 ; SUBR TO CHANGE INTERRUPT LEVEL
2010 MFUNCTION INTLEV,SUBR,[INT-LEVEL]
2012 JUMPGE AB,RETLEV ; JUST RETURN CURRENT
2015 JRST WTYP1 ; LEVEL IS FIXED
2018 CAMN A,CURPRI ; DIFFERENT?
2019 JRST RETLEV ; NO RETURN
2021 CAMG A,CURPRI ; SKIP IF NO UNQUEUE NEEDED
2023 MOVEM A,CURPRI ; SAVE
2026 RETLEV: MOVE B,CURPRI
2030 RUNINT: PUSH TP,$THAND ; SAVE HANDLERS LIST
2033 SKIPN ISTATE+1(B) ; SKIP IF DISABLED
2036 NXHND: MOVEM B,(TP) ; SAVE CURRENT HDR
2037 MOVE A,-2(TP) ; SAVE ARG POINTER
2038 PUSHJ P,CHSWAP ; SEE IF MUST SWAP
2041 MOVEI C,1 ; COUNT ARGS
2042 PUSH TP,SPSTOR ; SAVE INITIAL BINDING POINTER
2045 ADD D,[1STEPR,,1STEPR]
2051 NBIND: PUSH TP,INTFCN(B)
2058 DO.HND: MOVE PVP,PVSTOR+1
2059 SKIPN 1STEPR+1(PVP) ; NECESSARY TO DO 1STEP BINDING ?
2060 JRST NBIND1 ; NO, DON'T BOTHER
2062 PUSHJ P,SPECBE ; BIND 1 STEP FLAG
2064 NBIND1: ACALL C,INTAPL ; RUN HAND WITH POSSIBLY BOUND 1STEP FLAG
2065 MOVE SP,SPSTOR+1 ; GET CURRENT BINDING POINTER
2066 CAMN SP,-4(TP) ; SAME AS SAVED BINDING POINTER ?
2067 JRST NBIND2 ; YES, 1STEP FLAG NOT BOUND
2068 MOVE C,(TP) ; RESET 1 STEP
2070 MOVEM C,1STEPR+1(PVP)
2071 MOVE SP,-4(TP) ; RESTORE SAVED BINDING POINTER
2073 NBIND2: SUB TP,[6,,6]
2076 SUB TP,[4,,4] ; NO PROCESS CHANGE, POP JUNK
2081 MOVEM D,TPSTO+1(E) ; FIXUP HIS STACK
2082 DO.H1: GETYP A,A ; CHECK FOR A DISMISS
2085 MOVE B,(TP) ; TRY FOR NEXT HANDLER
2088 SUBTP4: SUB TP,[4,,4]
2091 MFUNCTION INTAPL,SUBR,[RUNINT]
2095 NOHAND: JUMPE C,NOHAN1
2097 PUSH TP,EQUOTE INTERNAL-INTERRUPT
2098 NOHAN1: PUSH TP,(AB)
2101 PUSH TP,EQUOTE NOT-HANDLED
2107 DEFERR: PUSH TP,$TATOM
2108 PUSH TP,EQUOTE ATTEMPT-TO-DEFER-UNDEFERABLE-INTERRUPT
2112 PUSH TP,MQUOTE INTERRUPT
2113 MCALL 3,RERR ; FORCE REAL ERROR
2116 ; FUNCTION TO DISMISS AN INTERRUPT TO AN ARBITRARY ACTIVATION
2118 MFUNCTION DISMISS,SUBR
2133 DISMI3: MOVEI A,(TB)
2135 DISMI0: HRRZ B,FSAV(A)
2141 MOVEI 0,(A) ; SAVE FRAME
2143 HRRM A,PCSAV(E) ; GET IT BACK HERE
2152 MOVE B,0 ; DEST FRAME
2154 MOVE A,PSAV(E) ; NOW MUNG SAVED INT LEVEL
2155 MOVEM D,-1(A) ; ZAP YOUR MUNGED
2156 PUSHJ P,CHUNW ; CHECK ON UNWINDERS
2157 JRST FINIS ; FALL DOWN
2184 DISMI2: CAMN SP,-4(TP) ; 1STEP FLAG BEEN BOUND ?
2188 MOVEM C,1STEPR+1(PVP)
2190 NDISMI: SUB TP,[6,,6]
2191 PUSHJ P,CHUNSW ; UNDO ANY PROCESS HACKING
2193 CAME E,PVSTOR+1 ; SWAPED?
2198 SUB C,[4,,4] ; MAYBE FIXUP OTHER STACK
2205 MOVE A,-1(P) ; SAVED PRIORITY
2228 GTLOC1: GETYP A,2(AB)
2231 MOVE D,B ; RET ATOM FOR ASSOC
2235 \f; MONITOR CHECKERS
2237 MONCH0: HLLZ 0,(B) ; POTENTIAL MONITORS
2238 MONCH: TLZ 0,TYPMSK ; KILL TYPE
2239 IOR C,0 ; IN NEW TYPE
2245 TLNN 0,.WRMON ; SKIP IF WRITE MONIT
2248 ; MONITOR IS ON, INVOKE HANDLER
2250 PUSH TP,A ; SAVE OBJ
2253 PUSH TP,D ; SAVE DATUM
2254 MOVSI C,TATOM ; PREPARE TO FIND IT
2255 MOVE D,MQUOTE WRITE,WRITE,INTRUP
2257 JUMPE B,MONCH1 ; NOT FOUND IGNORE FOR NOW
2258 PUSH TP,A ; START SETTING UP CALL
2264 PUSHJ P,FRMSTK ; PUT FRAME ON STAKC
2265 MCALL 4,EMERGE ; DO IT
2270 HLLZ 0,(B) ; UPDATE MONITORS
2275 ; NOW FOR READ MONITORS
2278 RMONCH: TLNN 0,.RDMON
2283 MOVE D,MQUOTE READ,READ,INTRUP
2290 PUSHJ P,FRMSTK ; PUT FRAME ON STACK
2296 ; PUT THE CURRENT FRAME ON THE STACK
2298 FRMSTK: PUSHJ P,MAKACT
2304 ; HERE TO COMPLAIN ABOUT ATTEMPTS TO MUNG PURE CODE
2306 PURERR: PUSH TP,$TATOM
2307 PUSH TP,EQUOTE ATTEMPT-TO-MUNG-PURE-STRUCTURE
2313 ; PROCESS SWAPPING CODE
2315 CHSWAP: MOVE E,PVSTOR+1 ; GET CURRENT
2317 SKIPE D,INTPRO+1(B) ; SKIP IF NO PROCESS GIVEN
2318 CAMN D,PVSTOR+1 ; SKIP IF DIFFERENT
2321 PUSHJ P,SWAPIT ; DO SWAP
2323 PSHPRO: PUSH TP,$TPVP
2327 CHUNSW: MOVE E,PVSTOR+1 ; RET OLD PROC
2328 MOVE D,-2(TP) ; GET SAVED PROC
2329 CAMN D,PVSTOR+1 ; SWAPPED?
2333 MOVE 0,PSTAT+1(D) ; CHECK STATE
2337 MOVEM 0,PSTAT+1(PVP)
2339 MOVEM 0,PSTAT+1(D) ; SAVE NEW STATE
2345 ;SUBROUTINE TO GET BIT FOR CLOBBERAGE
2347 GETBIT: MOVNS B ;NEGATE
2348 MOVSI A,400000 ;GET THE BIT
2349 LSH A,(B) ;SHIFT TO POSITION
2352 ; HERE TO HANDLE PURE WRITE AND CHECK FOR POSSIBLE C/W
2355 GCPWRT: SKIPN GCDFLG ; SEE IF IN DUMPER OR PURIFYER
2358 MOVEI B,4 ; INDICATE PURE WRITE
2359 JRST NOPUGC ; CONTINUE
2361 MOVEM A,TSINT ; SVE A
2365 CAML A,RPURBT ; SKIP IF NOT PURE
2366 CAIL A,HIBOT ; DONT MARK IF TOUCHING INTERPRETER
2368 SETOM PURMNG ; MUNGING PURENESS INDICATE
2369 MOVE B,BUFGC ; GET BUFFER
2370 JUMPL B,GCPW1 ; JUMP IF WINDOW IS BUFFER
2372 PUSHJ P,%CWINF ; GO DO COPY/WRITE
2374 MOVE A,TSINT ; RESTORE A
2375 JRST 2NDWORD ; CONTINUE
2377 MOVEI B,WIND ; START OF BUFFER
2378 PUSHJ P,%CWINF ; C/W
2379 MOVEI B,WNDP ; RESTORE WINDOW
2380 MOVE A,WNDBOT ; BOTTOM OF WINDOW
2381 ASH A,-10. ; TO PAGES
2383 PUSHJ P,%SHWND ; SHARE IT
2388 ; HERE TO HANDLE BUFFERING FOR GC-DUMP AND PURIFY FOR TENEX
2390 PWRIT: SKIPN GCDFLG ; SEE IF IN DUMPER OR PURIFYER
2394 EXCH P,GCPDL ; GET A GOOD PDL
2395 MOVEM A,TSAVA ; SAVE AC'S
2397 MOVEI A,MFORK ; FOR TWENEX THIS IS A MOVEI
2398 SKIPE OPSYS ; SKIP IF TOPS20
2399 MOVSI A,MFORK ; FOR A TENEX IT SHOULD BE A MOVSI
2400 GTRPW ; GET TRAP WORDS
2401 PUSH P,A ; SAVE ADDRESS AND WORD
2404 CAML A,RPURBT ; SKIP IF NOT PURE
2405 CAIL A,HIBOT ; DONT MARK IF TOUCHING INTERPRETER
2407 SETOM PURMNG ; MUNGING PURENESS INDICATE
2408 MOVE B,BUFGC ; GET BUFFER
2409 ANDCMI A,1777 ; TO PAGE BOUNDRY
2410 JUMPL B,PWRIT2 ; USE WINDOW AS BUFFER
2411 PWRIT3: PUSHJ P,%CWINF ; FIX UP
2412 PWRIT4: POP P,B ; RESTORE AC'S
2414 TLNN A,10 ; SEE IF R/W CYCLE
2415 MOVEM B,(A) ; FINISH WRITE
2418 PWRIT2: MOVEI B,WIND
2419 PUSHJ P,%CWINF ; GO TRY TO WIN
2421 MOVE A,WNDBOT ; BOTTOM OF WINDOW
2422 ASH A,-10. ; TO PAGES
2424 PUSHJ P,%SHWND ; SHARE IT
2428 ;HERE TO HANDLE PDL OVERFLOW. ASK FOR A GC
2432 MOVEM A,TSINT ;SAVE INT WORD
2435 SKIPE GCFLG ;IS GC RUNNING?
2436 JRST GCPLOV ;YES, COMPLAIN GROSSLY
2438 MOVEI A,200000 ;GET BIT TO CLOBBER
2439 IORM A,PIRQ ;LEAVE A MESSAGE FOR HIGHER LEVEL
2441 EXCH P,GCPDL ;GET A WINNING PDL
2442 HRRZ B,TSINTR ;GET POINTER TO LOSING INSTRUCTION
2447 SKIPG GCPDL ; SKIP IF NOT P
2448 LDB B,[270400,,-1(B)] ;GET AC FIELD
2449 SKIPL GCPDL ; SKIP IF P
2451 MOVEI A,(B) ;COPY IT
2454 ADDI A,0STO(PVP) ;POINT TO THIS ACS CURRENT TYPE
2456 HLRZ A,(A) ;GET THAT TYPE INTO A
2458 MOVEI B,GCPDL ;POINT TO SAVED P
2460 CAIN B,B ;OR IS IT B ITSELF
2466 MOVEI B,1(P) ;C WILL BE ON THE STACK
2471 MOVE A,(B) ;GET THE LOSING POINTER
2472 MOVEI C,(A) ;AND ISOLATE RH
2474 CAMG C,VECTOP ;CHECK IF IN GC SPACE
2476 JRST NOGROW ;NO, COMPLAIN
2481 HLRZ C,A ;GET -LENGTH
2482 SUBI A,-1(C) ;POINT TO A DOPE WORD
2483 POP P,C ;RESTORE TYPE INTO C
2484 PUSH P,D ; SAVE FOR GROWTH HACKER
2486 CAIN C,TPDL ; POINT TD TO APPROPRIATE DOPE WORD
2490 JUMPE D,BADPDL ; IF D STILL 0, THIS PDL IS WEIRD
2491 MOVEI A,PDLBUF(A) ; POINT TO ALLEGED REAL DOPE WORD
2492 SKIPN (D) ; SKIP IF PREVIOUSLY BLOWN
2493 MOVEM A,(D) ; CLOBBER IN
2494 CAME A,(D) ; MAKE SURE IT IS THE SAME
2499 PNTRHK: MOVE C,(B) ;RESTORE PDL POINTER
2500 SUB C,[PDLBUF,,0] ;FUDGE THE POINTER
2501 MOVEM C,(B) ;AND STORE IT
2503 POP P,C ;RESTORE THE WORLD
2504 EXCH P,GCPDL ;GET BACK ORIG PDL
2506 MOVE A,TSINT ;RESTORE INT WORD
2508 JRST IMPCH ;LOOK FOR MORE INTERRUPTS
2510 IFE ITS, JRST GCQUIT
2512 TPOVFL: SETOM INTFLG ;SIMULATE PDL OVFL
2514 MOVEI A,200000 ;TURN ON THE BIT
2516 HLRE A,TP ;FIND DOPEW
2517 SUBM TP,A ;POINT TO DOPE WORD
2518 MOVEI A,PDLBUF+1(A) ; ZERO LH AND POINT TO DOPEWD
2521 CAME A,TPGROW ; MAKE SURE WINNAGE
2523 SUB TP,[PDLBUF,,0] ; HACK STACK POINTER
2528 ; GROW CORE IF PDL OVERFLOW DURING GC
2530 GCPLOV: EXCH P,GCPDL ; NEED A PDL TO CALL P.CORE
2531 PUSHJ P,GPDLOV ; HANDLE PDL OVERFLOW
2545 ;HERE TO HANDLE LOW-LEVEL CHANNELS
2548 CHNACT: SKIPN GCFLG ;GET A WINNING PDL
2550 ANDI A,177777 ;ISOLATE CHANNEL BITS
2553 CHNA1: MOVEI B,0 ;BIT COUNTER
2556 SUBI B,35. ;NOW HAVE CHANNEL
2561 MOVEI 0,(B) ; COPY TO 0
2562 LSH 0,23. ;POSITION FOR A .STATUS
2565 ANDI 0,77 ;ISOLATE DEVICE
2569 PMIN4: MOVE 0,B ; CHAN TO 0
2571 JRST .+2 ; DONE, GO ON
2573 SETZM GCFLCH ; LEAVE GC MODE
2587 MFUNCTION GASCII,SUBR,ASCII
2600 SKIPGE B,1(AB) ;GET NUMBER
2602 CAILE B,177 ;CHECK RANGE
2607 TOOBIG: ERRUUO EQUOTE ARGUMENT-OUT-OF-RANGE
2610 ;HERE IF PDL OVERFLOW DURING GARBAGE COLLECTION
2612 BADPDL: FATAL NON PDL OVERFLOW
2614 NOGROW: FATAL PDL OVERFLOW ON NON EXPANDABLE PDL
2616 PDLOS1: MOVEI D,TPGROW
2617 PDLOSS: MOVSI A,(GENERAL) ; FIX UP TP DOPE WORD JUST IN CASE
2618 HRRZ D,(D) ; POINT TO POSSIBLE LOSING D.W.
2622 MOVEI A,(TP) ; SEE IF REL STACK SIZE WINS
2626 PDLOS2: MOVSI A,.VECT.
2629 SUB P,[2,,2] ; TRY TO RECOVER GRACEFULLY
2631 MOVEI A,DOAGC ; SET UP TO IMMEDIATE GC
2641 IFN ITS, .DISMIS TSINTR
2645 SUB P,[2,,2] ; ALLOW ROOM FOR CALL
2646 JSP E,PDL3 ; CLEANUP
2647 ERRUUO EQUOTE PDL-OVERFLOW-BUFFER-EXHAUSTED
2650 DLOSER: PUSH P,LOSRS(B)
2661 ;MEMORY PROTECTION INTERRUPT
2663 IOC: FATAL IO CHANNEL ERROR IN GARBAGE COLLECTOR
2664 IMPV: FATAL MPV IN GARBAGE COLLECTOR
2666 IPURE: FATAL PURE WRITE IN GARBAGE COLLECTOR
2667 ILOPR: FATAL ILLEGAL OPEREATION IN GARBAGE COLLECTOR
2671 ;SUBROUTINE TO BE CALLED AT INITIALIZE TIME TO SETUP INTS
2673 INTINT: SETZM CHNCNT
2674 MOVE A,[CHNCNT,,CHNCNT+1]
2677 .SUSET [.SPICLR,,[-1]]
2678 MOVE A,MASK1 ;SET MASKS
2680 .SETM2 A, ;SET BOTH MASKS
2683 SETZM QUEUES+1 ;UNQUEUE ANY OLD INTERRUPTS
2689 ; INITIALIZE TENEX INTERRUPT SYSTEM
2691 INTINT: CIS ; CLEAR THE INT WORLD
2692 SETZM INTFLG ; IN CASE RESTART
2693 MOVSI A,TVEC ; FIXUP QUEUES
2696 SETZM CURPRI ; AND PRIORITY LEVEL
2697 MOVEI A,MFORK ; TURN ON MY INTERRUPTS
2700 PUSHJ P,@[DOSIR] ; HACK TO TEMP GET TO SEGMENT 0
2703 INTINM: MOVE B,[-36.,,CHNTAB]
2708 MOVE B,[LEVTAB,,CHNTAB] ; POINT TO TABLES
2709 SIR ; TELL SYSTEM ABOUT THEM
2711 INTINX: MOVSI D,-NCHRS
2715 INTILP: SKIPN A,CHRS(D)
2724 DPB C,[360600,,MASK1]
2725 MOVE B,MASK1 ; SET UP FOR INT BITS
2728 MOVEI A,MFORK ; DO THE ENABLE
2733 DOSIR: MOVE B,[-36.,,CHNTAB]
2738 MOVEI B,..ARGB ; WILL RUN IN SEGMENT 0
2747 XJRST C ; GET BACK TO CALLING SEGMENT
2753 MFUNCTION QUITTER,SUBR
2765 CAIN B,^S ; HANDLE CNTL-S
2770 PUSHJ P,CLEAN ; CLEAN UP I/O CHANNELS
2772 PUSH TP,EQUOTE CONTROL-G?
2776 RETLIS: MOVE B,IMQUOTE LER,[LERR ]INTRUP
2777 PUSHJ P,ILVAL ; GET CURRENT VALUE
2783 MOVEI D,(TB) ; FIND A LISTEN OR ERROR TO RET TO
2785 RETLI1: HRRZ A,OTBSAV(D)
2786 CAIN A,(B) ; CHECK FOR WINNER
2788 HRRZ C,FSAV(A) ; CHECK FUNCTION
2790 CAIN C,ERROR ; FOUND?
2791 JRST FNDHIM ; YES, GO TO SAME
2792 CAIN C,ERROR% ; FUNNY ERROR
2794 CAIN C,TOPLEV ; NO ERROR/LISTEN
2799 FNDHIM: PUSH TP,$TTB
2802 MOVE B,(TP) ; NEW FRAME
2805 PUSHJ P,CHUNW ; UNWIND?
2810 CLEAN: MOVE B,3(AB) ; GET IN CHAN
2812 MOVE B,3(AB) ; CHANNEL BAKC
2814 SKIPN C,ECHO(C) ; GET ECHO
2818 CAMN C,[PUSHJ P,MTYO]
2826 MOVEI A,101 ; OUTPUT JFN
2830 CLUNQ: SETZB A,CURPRI
2835 ONINT: 0 ; INT FUDGER
2836 INTBCK: 0 ; GO BACK TO THIS PC AFTER INTERRUPT
2837 MOVEM TP,TPSAV(TB) ; SAVE STUFF
2839 INTBEN: SKIPL INTFLG ; PENDING INTS?
2850 ;RANDOM IMPURE CRUFT NEEDED
2851 CHNCNT: BLOCK 16. ; # OF CHARS IN EACH CHANNEL
2855 PIRQ: 0 ;HOLDS REQUEST BITS FOR 1ST WORD
2856 PIRQ2: 0 ;SAME FOR WORD 2
2858 MASK1: 200,,200100 ;FIRST MASK
2859 MASK2: 0 ;SECOND THEREOF
2860 CURPRI: 0 ; CURRENT PRIORITY
2874 0 ; PC INT LEVEL 1 (1ST WORD IN 1 SEG MODE, 2D
2875 ; IN MULTI SEG MODE)
2885 IOCLOS: 0 ; HOLDS LOSING JFN IN TNX IOC