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,PLODR
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
405 FATAL DISK FULL IN PURE FIXUP, CONTINUE TO RETRY
408 TNXFU1: MOVSI A,(1_<35.-12.>)
412 HRRZ A,TSAVA ; ASSUME JFN IS IN A (PRETTY FLAKEY BUT ...)
417 ; HERE TO PROCESS INTERRUPTS
419 DOINT: SKIPE INTHLD ; GLOBAL LOCK ON INTS
421 SETOM INTHLD ; DONT LET IT HAPPEN AGAIN
423 DOINTE: SKIPE ONINT ; ANY FUDGE?
424 XCT ONINT ; YEAH, TRY ONE
427 EXCH 0,LCKINT ; RELATIVIZE PC IF FROM RSUBR
428 IFE ITS, TLZ 0,777740 ; KILL EXCESS BITS
434 SUBI 0,(M) ; M IS BASE REG
435 IFN ITS, TLO 0,400000+M ; INDEX IT OFF M
443 EXCH 0,(P) ; AND RESTORE TO STACK
444 DONREL: EXCH 0,LCKINT ; GET BACK SAVED 0
445 SETZM INTFLG ;DISABLE
446 AOS -2(P) ;INCR SAVED FLAG
448 ;NOW SAVE WORKING ACS
451 HLRZ A,-2(P) ; HACK FUNNYNESS FOR MPV/ILOPR
453 SETZM -2(P) ; REALLY DISABLED
455 DIRQ: MOVE A,PIRQ ;NOW SATRT PROCESSING
456 JFFO A,FIRQ ;COUNT BITS AND GO
457 MOVE A,PIRQ2 ;1ST DONE, LOOK AT 2ND
460 INTDN1: SKIPN GCHAPN ; SKIP IF MUST DO GC INT
463 PUSHJ P,INTOGC ; AND INTERRUPT
468 .SUSET [.SPICLR,,[0]] ; DISABLE INTS
473 SETZM INTHLD ; RE-ENABLE THE WORLD
476 HRRI 0,@0 ; EFFECTIVIZE THE ADDRESS
477 TLZ 0,37 ; KILL IND AND INDEX
484 XJRST .+1 ; MAKE SURE OUT OF SECTION 0
493 FIRQ: PUSHJ P,GETBIT ;SET UP THE BIT TO CLOBBER IN PIRQ
494 ANDCAM A,PIRQ ;CLOBBER IT
495 ADDI B,36. ;OFSET INTO TABLE
496 JRST XIRQ ;GO EXECUTE
498 FIRQ2: PUSHJ P,GETBIT ;PREPARE TO CLOBBER BIT
499 ANDCAM A,PIRQ2 ;CLOBBER IT
500 ADDI B,71. ;AGAIN OFFSET INTO TABLE
502 CAIE B,21 ;PDL OVERFLOW?
503 JRST FHAND ;YES, HACK APPROPRIATELY
511 JRST (E) ; NOTHING GROWING, FALSE ALARM
512 MOVEI B,PDLGRO_-6 ;GET GROWTH SPEC
513 DPB B,[111100,,-1(A)] ;STORE GROWTH SPEC
514 REAGC: MOVE C,[10.,,1] ; INDICATOR FOR AGC
515 SKIPE PGROW ; P IS GROWING
517 SKIPE TPGROW ; TP IS GROWING
519 PUSHJ P,AGC ;COLLECT GARBAGE
522 AOJL A,REAGC ; IF NO CORE, RETRY
528 IRP A,,[0,A,B,C,D,E,TVP,SP]
530 SETZM A!STO(PVP) ;NOW ZERO TYPE
540 MOVEM D,-13(TP) ; USE AS DSTO
550 IRP A,,[SP,TVP,E,D,C,B,A,0]
559 ; HERE TO DO GC INTERRUPT AND CLOSE ANY DEAD CHANNELS
561 INTOGC: PUSH P,[N.CHNS-1]
563 MOVE TVP,REALTV+1(PVP)
571 INTGC1: MOVE A,(TP) ; GET POINTER
572 SKIPN B,1(A) ; ANY CHANNEL?
574 HRRE 0,(A) ; INDICATOR
592 PUSH TP,$TFLOAT ; PUSH ON TIME ARGUMENT
594 PUSH TP,$TFIX ; PUSH ON THE CAUSE ARGUMENT
596 PUSH TP,$TATOM ; PUSH ON THE CALL ARGUMENT
602 ; PRE AGC INTERRUPT. CAUSED WHEN FREE STORAGE REQUEST CAN BE SATISFIED BY
603 ; EXTENDING CORE. IT IS CALLED "AGC" AND THE HANDLER IS PASSED THE CALLER,
604 ; AND THE PENDING REQUEST.
607 INTAGC: MOVE A,GETNUM
608 MOVEM A,GCKNUM ; SET UP TO CAUSE INTERRUPT
609 PUSH P,C ; SAVE ARGS TO GC
610 MOVEI A,2000 ; GET WORKING SPACE
611 PUSHJ P,INTCOR ; GET IT
612 MOVSI A,TATOM ; EXAMINE BINDING OF FLAG
613 MOVE B,IMQUOTE AGC-FLAG
616 JRST INAGCO ; JUMP TO GET CORE FOR INTERRUPT
618 ADD A,P.TOP ; SEE IF WE CAN POSSIBLY WIN
621 JRST AGCCAU ; WORLD IS IN BAD SHAPE, CALL AGC
622 PUSH TP,$TTP ; BIND FLAG
623 PUSH TP,TP ; FOR UNBINDING PURPOSES
624 PUSH TP,[TATOM,,-1] ; SPECBINDS ARGS
625 PUSH TP,IMQUOTE AGC-FLAG
632 ; SET UP CALL TO HANDLER
634 PUSH TP,$TCHSTR ; STRING INDICATING INTERRUPT
635 PUSH TP,CHQUOTE DIVERT-AGC
636 PUSH TP,$TFIX ; PENDING REQUEST
642 MCALL 3,INTERR ; ENABLE INTERRUPT
643 GETYP A,A ; CHECK TO SEE IF INTERRUPT WAS ENABLED
644 HRRZ E,-6(TP) ; GET ARG FOR UNBINDING
646 SUB TP,[8,,8] ; CLEAN OFF STACK
647 CAIE A,TFALSE ; SKIP IF NOT
650 ; CAUSE AN AGC TO HAPPEN
652 AGCCAU: MOVE C,(P) ; INDICATOR
653 PUSHJ P,SAGC ; CALL AGC
656 ; SEE WHETHER ENOUGH CORE WAS ALLOCATED
657 CHKWIN: MOVE A,FRETOP
659 SUB A,GCKNUM ; AMOUNT NEEDED OR IN EXCESS
660 JUMPGE A,FINAGC ; JUMP IF DONE
662 MOVEM A,GETNUM ; SET UP REQUEST
669 ; ROUTINE TO HANDLE INTERRUPT WHILE INTERRUPT IS RUNNING
670 ; IT TRIES TO ALLOCATE FOR REQUEST+ AT LEAST ONE CORE BLOCK
672 INAGCO: MOVE A,GETNUM ; GET REQUEST
673 SUB A,GCKNUM ; CALCULATE REAL CURRENT REQUEST
675 ANDCMI A,1777 ; AMOUNT WANTED
676 PUSHJ P,INTCOR ; GET IT
680 ; ROUTINE TO GET CORE FOR PRE-AGC INTERRUPT. REQUEST IN A
683 INTCOR: ADD A,P.TOP ; ADD TOP TO REQUEST
684 CAML A,PURBOT ; SKIP IF BELOW PURE
686 MOVEM A,CORTOP ; STORE POSSIBLE CORE TOP
687 ASH A,-10. ; TO PAGES
688 PUSHJ P,P.CORE ; GET THE CORE
689 JRST AGCCA1 ; LOSE,LOSE,LOSE
701 AGCCA1: MOVE C,-1(P) ; GET ARGS FOR AGC
702 SUB P,[1,,1] ; FLUSH RETURN ADDRESS
707 GCALLR: MQUOTE GC-READ
715 MQUOTE PURE-PAGE-LOADER
717 MQUOTE INTERRUPT-HANDLER
721 \f; OLD "ON" SETS UP EVENT AND HANDLER
727 HLRE 0,AB ; 0=> -2*NUM OF ARGS
731 MOVEI B,10(AB) ; LAST MUST BE CHAN OR LOC
734 JUMPG 0,TFA ; AT LEAST 3
735 MOVEI A,0 ; SET UP IN CASE NO PROC
736 AOJG 0,ONPROC ; JUMP IF NONE
737 GETYP C,6(AB) ; CHECK IT
740 MOVE A,7(AB) ; GET IT
741 ONPROC: PUSH P,A ; SAVE AS A FLAG
742 GETYP A,(AB) ; CHECK PREV EXISTANCE
748 MOVEI B,(AB) ; FIND IT
750 POP P,0 ; REST NUM OF ARGS
751 JUMPN B,ON3 ; ALREADY THERE
752 SKIPE C ; SKIP IF NOTHING TO FLUSH
754 PUSH TP,(AB) ; GET NAME
758 MOVEI A,2 ; # OF ARGS TO EVENT
759 AOJG 0,ON1 ; JUMP IF NO LAST ARG
767 PUSH TP,2(AB) ; NOW FCN
769 MOVEI A,3 ; NUM OF ARGS
778 TRYFIX: SKIPN A,7(AB)
783 ; ROUTINE TO BUILD AN EVENT
790 CAIN 0,-2 ; IF JUST 1
791 JRST RE.EVN ; COULD BE EVENT
792 CAIL 0,-3 ; MUST BE AT LEAST 2 ARGS
794 GETYP A,2(AB) ; 2ND ARG MUST BE FIXED POINT PRIORITY
797 GETYP A,(AB) ; FIRST ARG SHOULD BE CHSTR
798 CAIN A,TATOM ; ALLOW ACTUAL ATOM
807 PUSHJ P,CHNORL ; CHANNEL OR LOCATIVE (PUT ON STACK)
809 GOTRGS: MOVEI B,(AB) ; NOW TRY TO FIND HEADER FOR THIS INTERRUPT
810 PUSHJ P,FNDINT ; CALL INTERNAL HACKER
811 JUMPN B,FINIS ; ALREADY ONE OF THIS NAME
813 JUMPE C,.+3 ; GET IT OFF STACK
816 PUSHJ P,MAKINT ; MAKE ONE FOR ME
818 MOVEM 0,INTPRI(B) ; SET UP PRIORITY
821 CH.SPC: POP P,C ; GET CODE BACK
823 PUSHJ P,DO.SPC ; DO ANY SPECIAL HACKS
828 JRST TFA ; ELSE SAY NOT ENOUGH
829 MOVE B,1(AB) ; GET IT
830 SETZM ISTATE+1(B) ; MAKE SURE ENABLED
832 GETYP A,INAME(B) ; CHECK FOR CHANNEL
833 CAIN A,TCHAN ; SKIP IF NOT
834 HRROI C,SS.CHA ; SET UP CHANNEL HACK
835 HRLZ E,INTPRI(B) ; GET POSSIBLE READ/WRITE BITS
836 TLNE E,.WRMON+.RDMON ; SKIP IF NOT MONITORS
839 MOVE B,INAME+1(B) ; CHECK FOR SPEC
841 MOVE B,1(AB) ; RESTORE IHEADER
842 RE.EV1: PUSH TP,INAME(B)
848 MOVE D,MQUOTE INTERRUPT
851 MOVE B,INAME+1(B) ; GET IT
852 PUSHJ P,IGET ; LOOK FOR IT
853 JUMPN B,FINIS ; RETURN IT
860 PUSHJ P,IPUT ; REESTABLISH IT
866 ; FUNCTION TO GENERATE A HANDLER FOR A GIVEN INTERRUPT
868 MFUNCTION HANDLER,SUBR
873 CAIL 0,-2 ; MUST BE 2 OR MORE ARGS
876 CAIE A,TINTH ; EVENT?
879 CAIN 0,-4 ; IF EXACTLY 2
880 CAIE A,THAND ; COULD BE HANDLER
883 MOVE B,3(AB) ; GET IT
884 SKIPN IPREV+1(B) ; SKIP IF ALREADY IN USE
886 MOVE D,1(AB) ; GET EVENT
887 SKIPN D,IHNDLR+1(D) ; GET FIRST HANDLER
889 CAMN D,B ; IS THIS IT?
890 JRST HFINIS ; YES, ALREADY "HANDLED"
891 MOVE D,INXT+1(D) ; GO TO NEXT HANDLER
893 BADHND: ERRUUO EQUOTE HANDLER-ALREADY-IN-USE
895 CHEVNT: CAIG 0,-7 ; SKIP IF LESS THAN 4
897 PUSH TP,$TPVP ; SLOT FOR PROCESS
899 CAIE 0,-6 ; IF 3, LOOK FOR PROC
909 PUSHJ P,MHAND ; MAKE THE HANDLER
910 MOVE 0,1(TB) ; GET PROCESS
911 MOVEM 0,INTPRO+1(B) ; AND PUT IT INTO HANDLER
912 MOVSI 0,TPVP ; SET UP TYPE
914 MOVE 0,2(AB) ; SET UP FUNCTION
919 HNDOK: MOVE D,1(AB) ; PICK UP EVEENT
920 MOVE E,IHNDLR+1(D) ; GET POINTER TO HANDLERS
921 MOVEM B,IHNDLR+1(D) ; PUT NEW ONE IN
922 MOVSI 0,TINTH ; GET INT HDR TYPE
923 MOVEM 0,IPREV(B) ; INTO BACK POINTER
924 MOVEM D,IPREV+1(B) ; AND POINTER ITSELF
925 MOVEM E,INXT+1(B) ; NOW NEXT POINTER
926 MOVSI 0,THAND ; NOW HANDLER TYPE
927 MOVEM 0,IHNDLR(D) ; SET TYPE IN HEADER
929 JUMPE E,HFINIS ; JUMP IF HEADER WAS EMPTY
930 MOVEM 0,IPREV(E) ; FIX UP ITS PREV
932 HFINIS: MOVSI A,THAND
937 ; FUNCTIONS TO SET TIME LIMITS FOR REALTIME AND RUNTIME INTS
941 MFUNCTION RUNTIMER,SUBR
963 RUNT2: JUMPL A,OUTRNG ; NOT FOR NEG #
969 RNTLFT: .SUSET [.RRTMR,,B]
970 JUMPL B,IFALSE ; RETURN FALSE IF NONE SET
971 IDIV B,[245761.] ; TO SECONDS
979 MFUNCTION REALTIMER,SUBR
991 IFN ITS, IMULI A,60. ; TO 60THS OF SEC
992 IFE ITS, IMULI A,1000. ; TO MILLI
995 REALT1: CAIE 0,TFLOAT
997 IFN ITS, FMPRI A,(60.0)
998 IFE ITS, FMPRI A,(1000.0)
1004 REALT2: JUMPL A,OUTRNG
1015 MOVE A,[MFORK,,.TIMAL] ; FLUSH CURRENT FIRST
1032 RLTPER: SKIPGE B,RLTSAV
1034 IFN ITS, IDIVI B,60. ; BACK TO SECONDS
1035 IFE ITS, IDIVI B,1000.
1040 ; FUNCTIONS TO ENABLE AND DISABLE INTERRUPTS
1042 MFUNCTION %ENABL,SUBR,ENABLE
1048 MFUNCTION %DISABL,SUBR,DISABLE
1063 DO.SPC: HRRO C,INTBL(C) ; POINT TO SPECIAL CODE
1064 HLRZ 0,AB ; - TWO TIMES NUM ARGS
1065 PUSHJ P,(C) ; CALL ROUTINE
1066 JUMPE E,CPOPJ ; NO BITS TO ENABLE, LEAVE
1070 MOVE B,1(TB) ; CHANNEL
1072 MOVEM 0,(E) ; SAVE IN TABLE
1074 SUBI E,NETJFN-NETCHN
1075 MOVE A,0 ; SETUP FOR MTOPR
1078 TLO C,770000 ; DONT SETUP INR/INS
1090 POPJ P, ; ***** TEMP ******
1093 CAILE E,35. ; SKIP IF 1ST WORD BIT
1097 IORM 0,MASK1 ; STORE IN PROTOTYPE MASK
1098 .SUSET [.SMASK,,MASK1]
1101 SETW2: LSH 0,-36.(E)
1102 IORM 0,MASK2 ; SET UP PROTO MASK2
1103 .SUSET [.SMSK2,,MASK2]
1107 ; ROUTINE TO CHECK FOR CHANNEL OR LOCATIVE
1109 CHNORL: GETYP A,(B) ; GET TYPE
1110 CAIN A,TCHAN ; IF CHANNEL
1113 PUSHJ P,LOCQ ; ELSE LOOCATIVE
1120 ; SUBROUTINE TO FIND A HANDLER OF A GIVEN NAME
1122 FNDINT: PUSHJ P,FNDNM
1124 PUSHJ P,SPEC1 ; COULD BE FUNNY
1126 INTASO: PUSH P,C ; C<0 IF SPECIAL
1130 SKIPN D ; COULD BE CHANGED FOR MONITOR
1131 MOVE D,MQUOTE INTERRUPT
1137 POP P,C ; AND RESTOR SPECIAL INDICATOR
1139 SUB TP,[2,,2] ; REMOVE CRUFT
1140 CPOPJ: POPJ P, ; AND RETURN
1142 ; CHECK FOR SPECIAL INTERNAL INTERRUPT HACK
1144 SPEC1: MOVSI C,-SPECLN ; BUILD AOBJN PNTR
1145 SPCLOP: CAME B,@SPECIN(C) ; SKIP IF SPECIAL
1146 AOBJN C,.-1 ; UNTIL EXHAUSTED
1150 MOVEI 0,-1(TB) ; SEE IF OK
1155 ; ROUTINE TO CREATE A NEW INTERRUPT (INTERNAL ONLY--NOT ITS FLAVOR)
1157 MAKINT: JUMPN C,GOTATM ; ALREADY HAVE NAME, GET THING
1158 MOVEI B,(AB) ; POINT TO STRING
1159 PUSHJ P,CSTAK ; CHARS TO STAKC
1162 MOVE D,MQUOTE INTERRUPT
1163 GOTATM: PUSH TP,$TINTH ; MAKE SLOT FOR HEADER BLOCK
1166 PUSH TP,B ; SAVE ATOM
1171 MOVE A,-3(TP) ; GET NAME AND STORE SAME
1176 MOVEM B,-4(TP) ; STASH HEADER
1181 EXCH A,-1(TP) ; INTERNAL PUT CALL
1187 ; FIND NAME OF INTERRUPT
1189 FNDNM: GETYP A,(B) ; TYPE
1190 CAIE A,TCHSTR ; IF STRING
1191 JRST FNDATM ; DONT HAVE ATOM, OTHERWISE DO
1195 SETZB C,D ; PREVENT LOSSAGE LATER
1198 ; THE NEXT 2 INSTRUCTIONS ARE A KLUDGE TO GET THE RIGHT ERROR ATOM
1200 CAMN B,IMQUOTE ERROR
1201 MOVE B,MQUOTE ERROR,ERROR,INTRUP
1204 IILOOK: PUSHJ P,CSTAK ; PUT CHRS ON STACK
1207 JRST ILOOKC ; LOOK IT UP
1209 ; ROUTINE TO MAKE A HANDLER BLOCK
1211 MHAND: MOVEI A,IHANDL*2
1212 JRST GIBLOK ; GET BLOCK
1214 ; HERE TO GET CHANNEL FOR "CHAR" INTERRUPT
1216 GETCHN: GETYP 0,(TB) ; GET TYPE
1217 CAIE 0,TCHAN ; CHANNL IS WINNER
1219 MOVE A,(TB) ; USE THE CHANNEL TO NAME THE INTERRUPT
1221 SKIPN CHANNO(B) ; SKIP IF WINNING CHANNEL
1225 LOCGET: GETYP 0,(TB) ; TYPE
1226 CAIN 0,TCHAN ; SKIP IF LOCATIVE
1230 MOVE B,1(TB) ; GET LOCATIVE
1233 ; FINAL MONITOR SETUP ROUTINES
1235 S.RMON: SKIPA E,[.RDMON,,]
1236 S.WMON: MOVSI E,.WRMON
1239 HLRM E,INTPRI(B) ; SAVE BITS
1240 MOVEI B,(TB) ; POINT TO LOCATIVE
1243 MOVSI D,(ANDCAM E,) ; KILL INST
1246 PUSHJ P,SMON ; GO DO IT
1253 ; SPECIAL SETUP ROUTINES FOR INITIAL INTERRUPTS
1256 S.CHAR: MOVE E,1(TB) ; GET CHANNEL
1258 ILDB 0,0 ; 1ST CHAR TO 0
1262 XORM 0,-2(E) ; IN CASE OUTPUT
1264 ADDI E,36. ; GET CORRECT MASK BIT
1265 ONEBIT: MOVEI 0,1 ; BIT FOR INT TO RET
1269 S.CHAR: MOVE E,1(TB)
1271 XORM 0,-2(E) ; IN CASE OUTPUT
1280 MOVE E,[-NNETS,,NETJFN]
1284 MOVE A,E ; REMEMBER WHERE
1287 FATAL NO MORE NETWORK
1298 S.CLOK: MOVEI E,13. ; FOR NOW JUST GET BIT #
1304 ; RUNTIME AND REALTIME INTERRUPTS
1306 S.RUNT: SKIPA E,[34.]
1310 S.IOC: SKIPA E,[9.] ; IO CHANNEL ERROR
1316 S.MPV: SKIPA E,[14.] ; BIT POS
1320 ; HERE TO TURN ALL INFERIOR INTS
1322 S.INF: MOVEI E,36.+16.+2 ; START OF BITS
1323 MOVEI 0,37 ; 8 BITS WORTH
1335 S.RUNT: ERRUUO EQUOTE INTERRUPT-UNAVAILABLE-ON-TENEX
1336 S.IOC: MOVEI 0,7 ; 3 BITS FOR EOF/FULL/ERROR
1346 ; HERE TO HANDLE ITS INTERRUPTS
1348 FHAND: SKIPN D,EXTINT(B) ; SKIP IF HANDLERS ARE POSSIBLE
1353 ; SPECIAL CHARACTER HANDLERS
1355 HCHAR: MOVEI D,CHNL0+1
1356 ADDI D,(B) ; POINT TO CHANNEL SLOT
1358 SKIPN D,-72.(D) ; PICK UP CHANNEL
1359 JRST IPCGOT ;WELL, IT GOTTA BEE THE THE IPC THEN
1362 LDB 0,[600,,STATUS(D)] ; GET DEVICE CODE
1363 CAILE 0,2 ; SKIP IF A TTY
1364 JRST HNET ; MAYBE NETWORK CHANNEL
1369 SKIPE DEMFLG ; SKIP IF NOT DEMON
1373 MOVE B,D ; CHAN TO B
1375 PUSHJ P,TTYOP2 ; RE-GOBBLE TTY
1378 HCHR11: MOVE D,CHANNO(D) ; GET ITS CHANNEL
1379 PUSH P,D ; AND SAVE IT
1380 .CALL HOWMNY ; GET # OF CHARS
1381 MOVEI B,0 ; IF TTY GONE, NO CHARS
1382 RECHR: ADDI B,1 ; BUMP BY ONE FOR SOSG
1383 MOVEM B,CHNCNT(D) ; AND SAVE
1384 IORM A,PIRQ2 ; LEAVE THE INT ON
1386 CHRLOO: MOVE D,(P) ; GET CHNNAEL NO.
1387 SOSG CHNCNT(D) ; GET COUNT
1391 MOVE D,BUFRIN(B) ; GET EXTRA BUFFER
1392 XCT IOIN2(D) ; READ CHAR
1393 JUMPL A,CHRDON ; NO CHAR THERE, FORGET IT
1395 PUSH TP,CHQUOTE CHAR
1396 PUSH TP,$TCHRS ; SAVE CHAR FOR CALL
1398 PUSH TP,$TCHAN ; SAVE CHANNEL
1400 PUSHJ P,INCHAR ; PUT CHAR IN USERS BUFFER
1401 MCALL 3,INTERRUPT ; RUN THE HANDLERS
1402 JRST CHRLOO ; AND LOOP
1404 CHRDON: .CALL HOWMNY
1406 MOVEI A,1 ; SET FOR PI WORD CLOBBER
1408 JUMPG B,RECHR ; ANY MORE?
1416 ; HERE FOR NET CHANNEL INTERRUPT
1418 HNET: CAIE 0,26 ; NETWORK?
1419 JRST HSTYET ; HANDLE PSEUDO TTY ETC.
1421 PUSH TP,MQUOTE CHAR,CHAR,INTRUP
1426 MOVE B,D ; CHAN TO B
1427 PUSHJ P,INSTAT ; UPDATE THE NETWRK STATE
1433 HSTYET: PUSH TP,$TATOM
1434 PUSH TP,MQUOTE CHAR,CHAR,INTRUP
1442 CBDCHN: ERRUUO EQUOTE BAD-CHANNEL
1446 HCLOCK: PUSH TP,$TCHSTR
1447 PUSH TP,CHQUOTE CLOCK
1451 HRUNT: PUSH TP,$TATOM
1452 PUSH TP,MQUOTE RUNT,RUNT,INTRUP
1456 HREAL: PUSH TP,$TATOM
1457 PUSH TP,MQUOTE REALT,REALT,INTRUP
1461 HPAR: MOVE A,MQUOTE PARITY,PARITY,INTRUP
1464 HMPV: MOVE A,MQUOTE MPV,MPV,INTRUP
1467 HILOPR: MOVE A,MQUOTE ILOPR,ILOPR,INTRUP
1470 HPURE: MOVE A,MQUOTE PURE,PURE,INTRUP
1471 HMPV1: PUSH TP,$TATOM
1473 PUSH P,LCKINT ; SAVE LOCN
1485 PUSH TP,EQUOTE DANGEROUS-INTERRUPT-NOT-HANDLED
1495 ; HERE TO HANDLE SYS DOWN INTERRUPT
1497 HDOWN: PUSH TP,$TATOM
1498 PUSH TP,MQUOTE SYSDOWN,SYSDOWN,INTRUP
1499 .DIETI A, ; HOW LONG?
1502 PUSH P,A ; FOR MESSAGE
1506 .SUSET [.RTTY,,B] ; DO WE NOW HAVE A TTY AT ALL?
1507 JUMPL B,DIRQ ; DONT HANG AROUND
1510 Excuse me, SYSTEM going down in /]
1511 SKIPG (P) ; SKIP IF REALLY GOING DOWN
1513 Excuse me, SYSTEM has been REVIVED!
1518 IDIVI B,30. ; TO SECONDS
1519 IDIVI B,60. ; A/ SECONDS B/ MINUTES
1523 MOVEI B,[ASCIZ / minutes /]
1529 MOVEI B,[ASCIZ / seconds.
1534 ; TWO DIGIT DEC OUT FROM B/
1537 JUMPE B,DECOU1 ; NO TEN
1540 DECOU1: MOVEI A,60(C)
1544 ; HERE TO HANDLE I/O CHANNEL ERRORS
1548 .SUSET [.RAPRC,,A] ; CONTAINS CHANNEL OF MOST RECENT LOSSAGE
1549 LDB A,[330400,,A] ; GET CHAN #
1552 PUSH TP,$TATOM ; PUSH ERROR
1553 PUSH TP,EQUOTE FILE-SYSTEM-ERROR
1554 IFE ITS, MOVE C,IOCLOS ; GET JFN
1556 ASH C,1 ; GET CHANNEL
1557 ADDI C,CHNL0+1 ; GET CHANNEL VECTOR
1560 LSH A,23. ; DO A .STATUS
1565 MOVNI A,1 ; GET "MOST RECENT ERROR"
1568 IFN ITS, PUSHJ P,GFALS ; GEN NAMED FALSE
1569 IFE ITS, PUSHJ P,TGFALS
1573 PUSH TP,MQUOTE IOC,IOC,INTRUP
1580 JUMPN B,DIRQ1 ; JUMP IF HANDLED
1584 DIRQ1: SUB TP,[6,,6]
1587 ; HANDLE INFERIOR KNOCKING AT THE DOOR
1590 IFN ITS, SUBI B,36.+16.+2 ; CONVERT TO INF #
1593 PUSH TP,MQUOTE INFERIOR,INFERIOR,INTRUP
1601 ; HERE FOR TENEX INTS (FIRST CUT)
1603 MFUNCTION %ACCHRS,SUBR,[ACTIVATE-CHARS]
1614 HRRZ D,(AB) ; CHECK LENGTH
1615 MOVEI C,0 ; SEE IF ANY NET CHANS IN USE
1616 MOVE A,[-NNETS,,NETJFN]
1621 CAILE D,NCHRS+NNETS(C)
1624 MOVEI 0,(D) ; CHECK THEM
1633 MOVSI E,-<NCHRS+NNETS> ; ZAP CURRENT
1639 MOVE A,[-NNETS,,NETJFN] ; IN CASE USED NET INTS FOR CHARS
1646 SETZB C,F ; C WILL BE MASK, F OFFSET INTO TABLE
1647 MOVSI 0,400000 ; 0 WILL BE THE BIT FOR INT MASK OR'ING
1648 JUMPE D,ALP1 ; JUMP IF NONE
1649 MOVNS D ; BUILD AOBJN POINTER TO CHRS TABLE
1651 MOVEI B,0 ; B COUNTS NUMBER DONE
1653 ALP: ILDB A,E ; GET CHR
1659 ADDI A,(F) ; POSSIBLE OFFSET FOR MORE CHANS
1665 SKIPE NETJFN-NCHRS(B)
1668 MOVEI F,36.-NNETS-UINTS-NCHRS(B)
1671 LSH 0,(G) ;NEW MASK FOR INT MASKS
1678 MOVE B,MASK1 ; SET UP FOR INT BITS
1684 RETCHR: MOVE C,[-NCHRS-NNETS,,CHRS]
1695 RETDON: PUSHJ P,CISTNG
1698 HCHAR: HRRZ A,CHRS-36.(B)
1700 PUSH TP,MQUOTE CHAR,CHAR,INTRUP
1708 HNET: SKIPLE A,NETJFN-NINT+NNETS+UINTS+1(B)
1710 SUBI B,36.-NNETS-UINTS-NCHRS
1717 PUSH TP,MQUOTE CHAR,CHAR,INTRUP
1728 PUSH TP,MQUOTE USERINT,USERINT,INTRUP
1741 GETYP A,(AB) ; ARG TYPE
1742 MOVE B,1(AB) ; AND VALUE
1743 CAIN A,TINTH ; HEADER, GO HACK
1744 JRST OFFHD ; QUEEN OF HEARTS
1748 JRST TRYHAN ; MAYBE INDIVIDUAL HANDLER
1749 CAIN 0,-2 ; MORE THAN 1 ARG?
1750 JRST OFFAC1 ; NO, GO ON
1751 CAIG 0,-5 ; CANT BE MORE THAN 2
1753 MOVEI B,2(AB) ; POINT TO 2D
1755 OFFAC1: MOVEI B,(AB)
1757 JUMPGE B,NOHAN1 ; NOT HANDLED
1759 OFFH1: PUSH P,C ; SAVE C FOR BIT CLOBBER
1762 MOVE D,MQUOTE INTERRUPT
1766 SKIPE B ; IF NO ASSOC, DONT SMASH
1767 SETOM ISTATE+1(B) ; DISABLE IN CASE QUEUED
1769 JUMPGE C,FINIS ; NO, DONE
1771 HRRZ C,INTBL(C) ; POINT TO SPECIAL CODE
1772 PUSHJ P,(C) ; GO TO SAME
1773 JUMPE E,OFINIS ; DONE
1775 CAILE E,35. ; SKIP IF 1ST WORD
1776 JRST CLRW2 ; CLOBBER 2D WORD BIT
1777 LSH 0,-1(E) ; POSITION BIT
1778 ANDCAM 0,MASK1 ; KILL BIT
1779 .SUSET [.SMASK,,MASK1]
1785 SUBI E,NETJFN-NETCHN
1793 ANDCAM 0,PIRQ ; JUST IN CASE
1796 OFINIS: MOVSI A,TINTH
1800 CLRW2: LSH 0,-36.(E) ; POS BIT FOR 2D WORD
1802 .SUSET [.SMSK2,,MASK2]
1806 TRYHAN: CAIE A,THAND ; HANDLER?
1810 GETYP 0,IPREV(B) ; GET TYPE OF PREV
1812 SKIPN C,IPREV+1(B) ; dont act silly if already off! (TT)
1816 JRST DOHEAD ; PREV HUST BE HDR
1819 DOHEAD: MOVEM A,IHNDLR+1(C) ; INTO HDR
1823 OFFINI: SETZM IPREV+1(B) ; Leave NXT slot intact for RUNINT (BKD)
1829 PUSHJ P,GETNMS ; GET INFOR ABOUT INT
1835 GETNMS: GETYP A,INAME(B) ; CHECK FOR SPECIAL
1839 PUSHJ P,LOCQ ; LOCATIVE?
1842 MOVEI B,INAME(B) ; POINT TO LOCATIVE
1844 PUSHJ P,SMON ; GET MONITOR
1846 GETNM1: HRROI C,SS.WMO ; ASSUME WRITE
1849 MOVE D,MQUOTE WRITE,WRITE,INTRUP
1851 MOVE D,MQUOTE READ,READ,INTRUP
1854 CHGTNM: JUMPL C,CPOPJ
1857 MOVE B,1(AB) ; RESTORE IHEADER
1860 ; EMERGENCY, CANT DEFER ME!!
1868 MFUNCTION INTERRUPT,SUBR
1874 SETZM INTHLD ; RE-ENABLE THE WORLD
1876 MOVE B,1(AB) ; GET HANDLER/NAME
1877 GETYP A,(AB) ; CAN BE HEADER OR NAME
1878 CAIN A,TINTH ; SKIP IF NOT HEADER
1882 CAIE A,TCHSTR ; SKIP IF CHAR STRING
1884 MOVEI B,(AB) ; LOOK UP NAME
1885 PUSHJ P,FNDNM ; GET NAME
1888 CAMN B,MQUOTE CHAR,CHAR,INTRUP
1890 CAME B,MQUOTE READ,READ,INTRUP
1891 CAMN B,MQUOTE WRITE,WRITE,INTRUP
1896 GTHEAD: SKIPE ISTATE+1(B) ; ENABLED?
1897 JRST IFALSE ; IGNORE COMPLETELY
1898 MOVE A,INTPRI+1(B) ; GET PRIORITY OF INTERRUPT
1899 CAMLE A,CURPRI ; SEE IF MUST QUEU
1900 JRST SETPRI ; MAY RUN NOW
1901 SKIPE (P) ; SKIP IF DEFER OK
1904 PUSH TP,$TINTH ; SAVE HEADER
1906 MOVEI A,1 ; SAVE OTHER ARGS
1907 PSHARG: ADD AB,[2,,2]
1908 JUMPGE AB,QUEU1 ; GO MAKE QUEU ENTRY
1912 QUEU1: PUSHJ P,IEVECT ; GET VECTOR
1914 PUSH TP,[0] ; WILL HOLD QUEUE HEADER
1918 POP P,A ; RESTORE PRIORITY
1920 MOVE B,QUEUES+1 ; GET INTERRUPT QUEUES
1922 JUMPGE B,GQUEU ; MAKE A QUEUE HDR
1924 NXTQU: CAMN A,1(B) ; GOT PRIORITY?
1925 JRST ADDQU ; YES, ADD TO THE QUEU
1926 CAML A,1(B) ; SKIP IF SPOT NOT FOUND
1929 MOVE B,3(B) ; GO TO NXT QUEUE
1932 GQUEU: PUSH TP,$TVEC ; SAVE NEXT POINTER
1935 PUSH TP,A ; SAVE PRIORITY
1944 MOVE D,(TP) ; NOW SPLICE
1949 GQUEU1: MOVEM B,3(D)
1951 ADDQU: MOVEM B,-2(TP) ; SAVE QUEU HDR
1954 PUSHJ P,INCONS ; CONS IT
1955 MOVE C,(TP) ;GET QUEUE HEADER
1956 SKIPE D,7(C) ; IF END EXISTS
1959 SKIPN 5(C) ; SKIP IF START EXISTS
1962 IFINI: MOVSI A,TATOM
1966 SETPRI: EXCH A,CURPRI
1969 PUSH TP,$TAB ; PASS AB TO HANDLERS
1972 PUSHJ P,RUNINT ; RUN THE HANDLERS
1973 POP P,A ; UNQUEU ANY WAITERS
1978 ; HERE TO UNQUEUE WAITING INTERRUPTS
1980 UNQUEU: PUSH P,A ; SAVE NEW LEVEL
1982 UNQUE1: MOVE A,(P) ; TARGET LEVEL
1983 CAMLE A,CURPRI ; CHECK RUG NOT PULLED OUT
1986 CAML A,1(B) ; RIGHT LEVEL?
1987 JRST UNDONE ; FINISHED
1989 SKIPN C,5(B) ; ON QUEUEU?
1991 HRRZ D,(C) ; CDR THE LIST
1993 SKIPN D ; SKIP IF NOT LAST
1994 SETZM 7(B) ; CLOBBER END POINTER
1995 MOVE A,1(B) ; GET THIS PRIORITY LEVEL
1996 MOVEM A,CURPRI ; MAKE IT THE CURRENT ONE
1997 MOVE D,1(C) ; GET SAVED VECTOR OF INF
1999 MOVE B,1(D) ; INT HEADER
2001 PUSH TP,D ; AND ARGS
2003 PUSHJ P,RUNINT ; RUN THEM
2006 UNDONE: POP P,CURPRI ; SET CURRENT LEVEL
2010 UNXQ: MOVE B,3(B) ; GO TO NEXT QUEUE
2016 ; SUBR TO CHANGE INTERRUPT LEVEL
2018 MFUNCTION INTLEV,SUBR,[INT-LEVEL]
2020 JUMPGE AB,RETLEV ; JUST RETURN CURRENT
2023 JRST WTYP1 ; LEVEL IS FIXED
2026 CAMN A,CURPRI ; DIFFERENT?
2027 JRST RETLEV ; NO RETURN
2029 CAMG A,CURPRI ; SKIP IF NO UNQUEUE NEEDED
2031 MOVEM A,CURPRI ; SAVE
2034 RETLEV: MOVE B,CURPRI
2038 RUNINT: PUSH TP,$THAND ; SAVE HANDLERS LIST
2041 SKIPN ISTATE+1(B) ; SKIP IF DISABLED
2044 NXHND: MOVEM B,(TP) ; SAVE CURRENT HDR
2045 MOVE A,-2(TP) ; SAVE ARG POINTER
2046 PUSHJ P,CHSWAP ; SEE IF MUST SWAP
2049 MOVEI C,1 ; COUNT ARGS
2050 PUSH TP,SPSTOR ; SAVE INITIAL BINDING POINTER
2053 ADD D,[1STEPR,,1STEPR]
2059 NBIND: PUSH TP,INTFCN(B)
2066 DO.HND: MOVE PVP,PVSTOR+1
2067 SKIPN 1STEPR+1(PVP) ; NECESSARY TO DO 1STEP BINDING ?
2068 JRST NBIND1 ; NO, DON'T BOTHER
2070 PUSHJ P,SPECBE ; BIND 1 STEP FLAG
2072 NBIND1: ACALL C,INTAPL ; RUN HAND WITH POSSIBLY BOUND 1STEP FLAG
2073 MOVE SP,SPSTOR+1 ; GET CURRENT BINDING POINTER
2074 CAMN SP,-4(TP) ; SAME AS SAVED BINDING POINTER ?
2075 JRST NBIND2 ; YES, 1STEP FLAG NOT BOUND
2076 MOVE C,(TP) ; RESET 1 STEP
2078 MOVEM C,1STEPR+1(PVP)
2079 MOVE SP,-4(TP) ; RESTORE SAVED BINDING POINTER
2081 NBIND2: SUB TP,[6,,6]
2084 SUB TP,[4,,4] ; NO PROCESS CHANGE, POP JUNK
2089 MOVEM D,TPSTO+1(E) ; FIXUP HIS STACK
2090 DO.H1: GETYP A,A ; CHECK FOR A DISMISS
2093 MOVE B,(TP) ; TRY FOR NEXT HANDLER
2096 SUBTP4: SUB TP,[4,,4]
2099 MFUNCTION INTAPL,SUBR,[RUNINT]
2103 NOHAND: JUMPE C,NOHAN1
2105 PUSH TP,EQUOTE INTERNAL-INTERRUPT
2106 NOHAN1: PUSH TP,(AB)
2109 PUSH TP,EQUOTE NOT-HANDLED
2115 DEFERR: PUSH TP,$TATOM
2116 PUSH TP,EQUOTE ATTEMPT-TO-DEFER-UNDEFERABLE-INTERRUPT
2120 PUSH TP,MQUOTE INTERRUPT
2121 MCALL 3,RERR ; FORCE REAL ERROR
2124 ; FUNCTION TO DISMISS AN INTERRUPT TO AN ARBITRARY ACTIVATION
2126 MFUNCTION DISMISS,SUBR
2141 DISMI3: MOVEI A,(TB)
2143 DISMI0: HRRZ B,FSAV(A)
2149 MOVEI 0,(A) ; SAVE FRAME
2151 HRRM A,PCSAV(E) ; GET IT BACK HERE
2160 MOVE B,0 ; DEST FRAME
2162 MOVE A,PSAV(E) ; NOW MUNG SAVED INT LEVEL
2163 MOVEM D,-1(A) ; ZAP YOUR MUNGED
2164 PUSHJ P,CHUNW ; CHECK ON UNWINDERS
2165 JRST FINIS ; FALL DOWN
2192 DISMI2: CAMN SP,-4(TP) ; 1STEP FLAG BEEN BOUND ?
2196 MOVEM C,1STEPR+1(PVP)
2198 NDISMI: SUB TP,[6,,6]
2199 PUSHJ P,CHUNSW ; UNDO ANY PROCESS HACKING
2201 CAME E,PVSTOR+1 ; SWAPED?
2206 SUB C,[4,,4] ; MAYBE FIXUP OTHER STACK
2213 MOVE A,-1(P) ; SAVED PRIORITY
2236 GTLOC1: GETYP A,2(AB)
2239 MOVE D,B ; RET ATOM FOR ASSOC
2243 \f; MONITOR CHECKERS
2245 MONCH0: HLLZ 0,(B) ; POTENTIAL MONITORS
2246 MONCH: TLZ 0,TYPMSK ; KILL TYPE
2247 IOR C,0 ; IN NEW TYPE
2253 TLNN 0,.WRMON ; SKIP IF WRITE MONIT
2256 ; MONITOR IS ON, INVOKE HANDLER
2258 PUSH TP,A ; SAVE OBJ
2261 PUSH TP,D ; SAVE DATUM
2262 MOVSI C,TATOM ; PREPARE TO FIND IT
2263 MOVE D,MQUOTE WRITE,WRITE,INTRUP
2265 JUMPE B,MONCH1 ; NOT FOUND IGNORE FOR NOW
2266 PUSH TP,A ; START SETTING UP CALL
2272 PUSHJ P,FRMSTK ; PUT FRAME ON STAKC
2273 MCALL 4,EMERGE ; DO IT
2278 HLLZ 0,(B) ; UPDATE MONITORS
2283 ; NOW FOR READ MONITORS
2286 RMONCH: TLNN 0,.RDMON
2291 MOVE D,MQUOTE READ,READ,INTRUP
2298 PUSHJ P,FRMSTK ; PUT FRAME ON STACK
2304 ; PUT THE CURRENT FRAME ON THE STACK
2306 FRMSTK: PUSHJ P,MAKACT
2312 ; HERE TO COMPLAIN ABOUT ATTEMPTS TO MUNG PURE CODE
2314 PURERR: PUSH TP,$TATOM
2315 PUSH TP,EQUOTE ATTEMPT-TO-MUNG-PURE-STRUCTURE
2321 ; PROCESS SWAPPING CODE
2323 CHSWAP: MOVE E,PVSTOR+1 ; GET CURRENT
2325 SKIPE D,INTPRO+1(B) ; SKIP IF NO PROCESS GIVEN
2326 CAMN D,PVSTOR+1 ; SKIP IF DIFFERENT
2329 PUSHJ P,SWAPIT ; DO SWAP
2331 PSHPRO: PUSH TP,$TPVP
2335 CHUNSW: MOVE E,PVSTOR+1 ; RET OLD PROC
2336 MOVE D,-2(TP) ; GET SAVED PROC
2337 CAMN D,PVSTOR+1 ; SWAPPED?
2341 MOVE 0,PSTAT+1(D) ; CHECK STATE
2345 MOVEM 0,PSTAT+1(PVP)
2347 MOVEM 0,PSTAT+1(D) ; SAVE NEW STATE
2353 ;SUBROUTINE TO GET BIT FOR CLOBBERAGE
2355 GETBIT: MOVNS B ;NEGATE
2356 MOVSI A,400000 ;GET THE BIT
2357 LSH A,(B) ;SHIFT TO POSITION
2360 ; HERE TO HANDLE PURE WRITE AND CHECK FOR POSSIBLE C/W
2363 GCPWRT: SKIPN GCDFLG ; SEE IF IN DUMPER OR PURIFYER
2366 MOVEI B,4 ; INDICATE PURE WRITE
2367 JRST NOPUGC ; CONTINUE
2369 MOVEM A,TSINT ; SVE A
2373 CAML A,RPURBT ; SKIP IF NOT PURE
2374 CAIL A,HIBOT ; DONT MARK IF TOUCHING INTERPRETER
2376 SETOM PURMNG ; MUNGING PURENESS INDICATE
2377 MOVE B,BUFGC ; GET BUFFER
2378 JUMPL B,GCPW1 ; JUMP IF WINDOW IS BUFFER
2380 PUSHJ P,%CWINF ; GO DO COPY/WRITE
2382 MOVE A,TSINT ; RESTORE A
2383 JRST 2NDWORD ; CONTINUE
2385 MOVEI B,WIND ; START OF BUFFER
2386 PUSHJ P,%CWINF ; C/W
2387 MOVEI B,WNDP ; RESTORE WINDOW
2388 MOVE A,WNDBOT ; BOTTOM OF WINDOW
2389 ASH A,-10. ; TO PAGES
2391 PUSHJ P,%SHWND ; SHARE IT
2396 ; HERE TO HANDLE BUFFERING FOR GC-DUMP AND PURIFY FOR TENEX
2398 PWRIT: SKIPN GCDFLG ; SEE IF IN DUMPER OR PURIFYER
2402 EXCH P,GCPDL ; GET A GOOD PDL
2403 MOVEM A,TSAVA ; SAVE AC'S
2405 MOVEI A,MFORK ; FOR TWENEX THIS IS A MOVEI
2406 SKIPE OPSYS ; SKIP IF TOPS20
2407 MOVSI A,MFORK ; FOR A TENEX IT SHOULD BE A MOVSI
2408 GTRPW ; GET TRAP WORDS
2409 PUSH P,A ; SAVE ADDRESS AND WORD
2412 CAML A,RPURBT ; SKIP IF NOT PURE
2413 CAIL A,HIBOT ; DONT MARK IF TOUCHING INTERPRETER
2415 SETOM PURMNG ; MUNGING PURENESS INDICATE
2416 MOVE B,BUFGC ; GET BUFFER
2417 ANDCMI A,1777 ; TO PAGE BOUNDRY
2418 JUMPL B,PWRIT2 ; USE WINDOW AS BUFFER
2419 PWRIT3: PUSHJ P,%CWINF ; FIX UP
2420 PWRIT4: POP P,B ; RESTORE AC'S
2422 TLNN A,10 ; SEE IF R/W CYCLE
2423 MOVEM B,(A) ; FINISH WRITE
2426 PWRIT2: MOVEI B,WIND
2427 PUSHJ P,%CWINF ; GO TRY TO WIN
2429 MOVE A,WNDBOT ; BOTTOM OF WINDOW
2430 ASH A,-10. ; TO PAGES
2432 PUSHJ P,%SHWND ; SHARE IT
2436 ;HERE TO HANDLE PDL OVERFLOW. ASK FOR A GC
2440 MOVEM A,TSINT ;SAVE INT WORD
2443 SKIPE GCFLG ;IS GC RUNNING?
2444 JRST GCPLOV ;YES, COMPLAIN GROSSLY
2446 MOVEI A,200000 ;GET BIT TO CLOBBER
2447 IORM A,PIRQ ;LEAVE A MESSAGE FOR HIGHER LEVEL
2449 EXCH P,GCPDL ;GET A WINNING PDL
2450 HRRZ B,TSINTR ;GET POINTER TO LOSING INSTRUCTION
2455 SKIPG GCPDL ; SKIP IF NOT P
2456 LDB B,[270400,,-1(B)] ;GET AC FIELD
2457 SKIPL GCPDL ; SKIP IF P
2459 MOVEI A,(B) ;COPY IT
2462 ADDI A,0STO(PVP) ;POINT TO THIS ACS CURRENT TYPE
2464 HLRZ A,(A) ;GET THAT TYPE INTO A
2466 MOVEI B,GCPDL ;POINT TO SAVED P
2468 CAIN B,B ;OR IS IT B ITSELF
2474 MOVEI B,1(P) ;C WILL BE ON THE STACK
2479 MOVE A,(B) ;GET THE LOSING POINTER
2480 MOVEI C,(A) ;AND ISOLATE RH
2482 CAMG C,VECTOP ;CHECK IF IN GC SPACE
2484 JRST NOGROW ;NO, COMPLAIN
2489 HLRZ C,A ;GET -LENGTH
2490 SUBI A,-1(C) ;POINT TO A DOPE WORD
2491 POP P,C ;RESTORE TYPE INTO C
2492 PUSH P,D ; SAVE FOR GROWTH HACKER
2494 CAIN C,TPDL ; POINT TD TO APPROPRIATE DOPE WORD
2498 JUMPE D,BADPDL ; IF D STILL 0, THIS PDL IS WEIRD
2499 MOVEI A,PDLBUF(A) ; POINT TO ALLEGED REAL DOPE WORD
2500 SKIPN (D) ; SKIP IF PREVIOUSLY BLOWN
2501 MOVEM A,(D) ; CLOBBER IN
2502 CAME A,(D) ; MAKE SURE IT IS THE SAME
2507 PNTRHK: MOVE C,(B) ;RESTORE PDL POINTER
2508 SUB C,[PDLBUF,,0] ;FUDGE THE POINTER
2509 MOVEM C,(B) ;AND STORE IT
2511 POP P,C ;RESTORE THE WORLD
2512 EXCH P,GCPDL ;GET BACK ORIG PDL
2514 MOVE A,TSINT ;RESTORE INT WORD
2516 JRST IMPCH ;LOOK FOR MORE INTERRUPTS
2518 IFE ITS, JRST GCQUIT
2520 TPOVFL: SETOM INTFLG ;SIMULATE PDL OVFL
2522 MOVEI A,200000 ;TURN ON THE BIT
2524 HLRE A,TP ;FIND DOPEW
2525 SUBM TP,A ;POINT TO DOPE WORD
2526 MOVEI A,PDLBUF+1(A) ; ZERO LH AND POINT TO DOPEWD
2529 CAME A,TPGROW ; MAKE SURE WINNAGE
2531 SUB TP,[PDLBUF,,0] ; HACK STACK POINTER
2536 ; GROW CORE IF PDL OVERFLOW DURING GC
2538 GCPLOV: EXCH P,GCPDL ; NEED A PDL TO CALL P.CORE
2539 PUSHJ P,GPDLOV ; HANDLE PDL OVERFLOW
2553 ;HERE TO HANDLE LOW-LEVEL CHANNELS
2556 CHNACT: SKIPN GCFLG ;GET A WINNING PDL
2558 ANDI A,177777 ;ISOLATE CHANNEL BITS
2561 CHNA1: MOVEI B,0 ;BIT COUNTER
2564 SUBI B,35. ;NOW HAVE CHANNEL
2569 MOVEI 0,(B) ; COPY TO 0
2570 LSH 0,23. ;POSITION FOR A .STATUS
2573 ANDI 0,77 ;ISOLATE DEVICE
2577 PMIN4: MOVE 0,B ; CHAN TO 0
2579 JRST .+2 ; DONE, GO ON
2581 SETZM GCFLCH ; LEAVE GC MODE
2595 MFUNCTION GASCII,SUBR,ASCII
2608 SKIPGE B,1(AB) ;GET NUMBER
2610 CAILE B,177 ;CHECK RANGE
2615 TOOBIG: ERRUUO EQUOTE ARGUMENT-OUT-OF-RANGE
2618 ;HERE IF PDL OVERFLOW DURING GARBAGE COLLECTION
2620 BADPDL: FATAL NON PDL OVERFLOW
2622 NOGROW: FATAL PDL OVERFLOW ON NON EXPANDABLE PDL
2624 PDLOS1: MOVEI D,TPGROW
2625 PDLOSS: MOVSI A,(GENERAL) ; FIX UP TP DOPE WORD JUST IN CASE
2626 HRRZ D,(D) ; POINT TO POSSIBLE LOSING D.W.
2630 MOVEI A,(TP) ; SEE IF REL STACK SIZE WINS
2634 PDLOS2: MOVSI A,.VECT.
2637 SUB P,[2,,2] ; TRY TO RECOVER GRACEFULLY
2639 MOVEI A,DOAGC ; SET UP TO IMMEDIATE GC
2649 IFN ITS, .DISMIS TSINTR
2653 SUB P,[2,,2] ; ALLOW ROOM FOR CALL
2654 JSP E,PDL3 ; CLEANUP
2655 ERRUUO EQUOTE PDL-OVERFLOW-BUFFER-EXHAUSTED
2658 DLOSER: PUSH P,LOSRS(B)
2669 ;MEMORY PROTECTION INTERRUPT
2671 IOC: FATAL IO CHANNEL ERROR IN GARBAGE COLLECTOR
2672 IMPV: FATAL MPV IN GARBAGE COLLECTOR
2674 IPURE: FATAL PURE WRITE IN GARBAGE COLLECTOR
2675 ILOPR: FATAL ILLEGAL OPEREATION IN GARBAGE COLLECTOR
2679 ;SUBROUTINE TO BE CALLED AT INITIALIZE TIME TO SETUP INTS
2681 INTINT: SETZM CHNCNT
2682 MOVE A,[CHNCNT,,CHNCNT+1]
2685 .SUSET [.SPICLR,,[-1]]
2686 MOVE A,MASK1 ;SET MASKS
2688 .SETM2 A, ;SET BOTH MASKS
2691 SETZM QUEUES+1 ;UNQUEUE ANY OLD INTERRUPTS
2697 ; INITIALIZE TENEX INTERRUPT SYSTEM
2699 INTINT: CIS ; CLEAR THE INT WORLD
2700 SETZM INTFLG ; IN CASE RESTART
2701 MOVSI A,TVEC ; FIXUP QUEUES
2704 SETZM CURPRI ; AND PRIORITY LEVEL
2705 MOVEI A,MFORK ; TURN ON MY INTERRUPTS
2708 PUSHJ P,@[DOSIR] ; HACK TO TEMP GET TO SEGMENT 0
2711 INTINM: MOVE B,[-36.,,CHNTAB]
2716 MOVE B,[LEVTAB,,CHNTAB] ; POINT TO TABLES
2717 SIR ; TELL SYSTEM ABOUT THEM
2719 INTINX: MOVSI D,-NCHRS
2723 INTILP: SKIPN A,CHRS(D)
2732 DPB C,[360600,,MASK1]
2733 MOVE B,MASK1 ; SET UP FOR INT BITS
2736 MOVEI A,MFORK ; DO THE ENABLE
2741 DOSIR: MOVE B,[-36.,,CHNTAB]
2742 MOVSI 0,<1_12.>+FSEG
2746 MOVEI B,..ARGB ; WILL RUN IN SEGMENT 0
2755 XJRST C ; GET BACK TO CALLING SEGMENT
2761 MFUNCTION QUITTER,SUBR
2773 CAIN B,^S ; HANDLE CNTL-S
2778 PUSHJ P,CLEAN ; CLEAN UP I/O CHANNELS
2780 PUSH TP,EQUOTE CONTROL-G?
2784 RETLIS: MOVE B,IMQUOTE LER,[LERR ]INTRUP
2785 PUSHJ P,ILVAL ; GET CURRENT VALUE
2791 MOVEI D,(TB) ; FIND A LISTEN OR ERROR TO RET TO
2793 RETLI1: HRRZ A,OTBSAV(D)
2794 CAIN A,(B) ; CHECK FOR WINNER
2796 HRRZ C,FSAV(A) ; CHECK FUNCTION
2798 CAIN C,ERROR ; FOUND?
2799 JRST FNDHIM ; YES, GO TO SAME
2800 CAIN C,ERROR% ; FUNNY ERROR
2802 CAIN C,TOPLEV ; NO ERROR/LISTEN
2807 FNDHIM: PUSH TP,$TTB
2810 MOVE B,(TP) ; NEW FRAME
2813 PUSHJ P,CHUNW ; UNWIND?
2818 CLEAN: MOVE B,3(AB) ; GET IN CHAN
2820 MOVE B,3(AB) ; CHANNEL BAKC
2822 SKIPN C,ECHO(C) ; GET ECHO
2826 CAMN C,[PUSHJ P,MTYO]
2834 MOVEI A,101 ; OUTPUT JFN
2838 CLUNQ: SETZB A,CURPRI
2843 ONINT: 0 ; INT FUDGER
2844 INTBCK: 0 ; GO BACK TO THIS PC AFTER INTERRUPT
2845 MOVEM TP,TPSAV(TB) ; SAVE STUFF
2847 INTBEN: SKIPL INTFLG ; PENDING INTS?
2858 ;RANDOM IMPURE CRUFT NEEDED
2859 CHNCNT: BLOCK 16. ; # OF CHARS IN EACH CHANNEL
2863 PIRQ: 0 ;HOLDS REQUEST BITS FOR 1ST WORD
2864 PIRQ2: 0 ;SAME FOR WORD 2
2866 MASK1: 200,,200100 ;FIRST MASK
2867 MASK2: 0 ;SECOND THEREOF
2868 CURPRI: 0 ; CURRENT PRIORITY
2882 0 ; PC INT LEVEL 1 (1ST WORD IN 1 SEG MODE, 2D
2883 ; IN MULTI SEG MODE)
2893 IOCLOS: 0 ; HOLDS LOSING JFN IN TNX IOC