Split up files.
[pdp10-muddle.git] / sumex / interr.mcr239
1 TITLE INTERRUPT HANDLER FOR MUDDLE\r
2 \r
3 RELOCATABLE\r
4 \r
5 ;C. REEVE  APRIL 1971\r
6 \r
7 .INSRT MUDDLE >\r
8 \r
9 SYSQ\r
10 \r
11 IF1,[\r
12 IFE ITS,.INSRT MUDSYS;STENEX >\r
13 ]\r
14 \r
15 PDLGRO==10000   ;AMOUNT TO GROW A PDL THAT LOSES\r
16 NINT==72.       ;MAXIMUM NUMBER OF INTERRUPTS POSSIBLE\r
17 \r
18 IFN ITS,[\r
19 ;SET UP LOCATION 42 TO POINT TO TSINT\r
20 \r
21 RMT [\r
22 \r
23 ZZZ==$. ;SAVE CURRENT LOCATION\r
24 \r
25 LOC 42\r
26 \r
27         JSR     MTSINT          ;GO TO HANDLER\r
28 \r
29 LOC ZZZ\r
30 ]\r
31 ]\r
32 \r
33 ; GLOBALS NEEDED BY INTERRUPT HANDLER\r
34 \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
45 .GLOBAL PURTOP\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
58 \r
59 ; GLOBALS FOR GC\r
60 .GLOBAL GCTIM,GCCAUS,GCCALL\r
61 \r
62 ; GLOBALS FOR MONITOR ROUTINES\r
63 \r
64 .GLOBAL MONCH,MONCH0,RMONCH,RMONC0,LOCQ,SMON,BAPT,APLQ,MAKACT,NAPT\r
65 .GLOBAL PURERR,BUFRIN,INSTAT\r
66 \r
67 MONITOR\r
68 \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
73 \r
74 \r
75 ;***** TEMP FUDGE *******\r
76 \r
77 QUEUES==INTVEC\r
78 \r
79 \f\r
80 ; DECLARATIONS ASSOCIATED WITH INTERRUPT HANDERS AND HEADERS\r
81 \r
82 ; SPECIAL TABLES\r
83 \r
84 SPECIN: IRP A,,[CHAR,CLOCK,MPV,ILOPR,WRITE,READ,IOC,PURE,SYSDOWN,INFERIOR,RUNT,REALT\r
85 PARITY]\r
86         MQUOTE A,[A]INTRUP\r
87         TERMIN\r
88 SPECLN==.-SPECIN\r
89 \r
90 ; TABLE OF SPECIAL FINDING ROUTINES\r
91 \r
92 FNDTBL: IRP A,,[GETCHN,0,0,0,LOCGET,LOCGET,0,0,0,0,0,0,0]\r
93         A\r
94         TERMIN\r
95 \r
96 ; TABLE OF SPECIAL SETUP ROUTINES\r
97 \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
100         A\r
101         S!A==.IRPCNT\r
102         TERMIN\r
103 \r
104 IFN ITS,[\r
105 \r
106 ; EXTERNAL INTERRUPT TABLE\r
107 \r
108 EXTINT: REPEAT NINT-36.,0\r
109         REPEAT 16.,HCHAR\r
110         0\r
111         0\r
112         REPEAT 8.,HINF\r
113         REPEAT NINT-62.,0\r
114 EXTEND:\r
115 \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
118         IRP B,C,[A]\r
119         LOC EXTINT+C\r
120         B\r
121         .ISTOP\r
122         TERMIN\r
123 TERMIN\r
124 \r
125 \r
126 LOC EXTEND\r
127 ]\r
128 \f\r
129 IFE ITS,[\r
130 \r
131 ; TABLES FOR TENEX INTERRUPT SYSTEM\r
132 \r
133 LEVTAB: P1              ; POINTS TO INT PC HOLDERS FOR LEVS 1,2 AND 3\r
134         P2\r
135         P3\r
136 \r
137 CHNMSK==0                       ; WILL BE MASK WORD FOR INT SET UP\r
138 MFORK==400000\r
139 NNETS==10.              ; ALLOW 10 NETWRK INTERRUPTS\r
140 NETCHN==36.-NNETS\r
141 \r
142 CHNTAB:                 ; LOCATION OF INT ROUTINES FOR VARIOUS "CHANNELS"\r
143         BLOCK   36.-NNETS       ; THERE AR 36. TENEX INT CHANNELS\r
144 \r
145 REPEAT NNETS, 1,,INTNET+3*.RPCNT\r
146 \r
147 IRP A,,[[0,CNTLG],[1,CNTLS],[9.,TNXPDL]]\r
148         IRP B,C,[A]\r
149         LOC CHNTAB+B\r
150         1,,C\r
151         CHNMSK==CHNMSK+<1_<35.-B>>\r
152         .ISTOP\r
153         TERMIN\r
154 TERMIN\r
155 LOC CHNTAB+36.\r
156 \r
157 EXTINT: BLOCK NINT-NNETS\r
158 \r
159 REPEAT NNETS,HNET\r
160 \r
161 IRP A,,[[HCNTLG,36.],[HCNTLS,37.]]\r
162         IRP B,C,[A]\r
163         LOC EXTINT+C\r
164         B\r
165         .ISTOP\r
166         TERMIN\r
167 TERMIN\r
168 LOC EXTINT+NINT\r
169 ]\r
170 \r
171 \r
172 ; HANDLER/HEADER PARAMETERS\r
173 \r
174 ; HEADER BLOCKS\r
175 \r
176 IHDRLN==4               ; LENGTH OF HEADER BLOCK\r
177 \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
182 \r
183 IHANDL==4               ; LENGTH OF A HANDLER BLOCK\r
184 \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
189 \r
190 IFN ITS,[\r
191 RMT [\r
192 IMPURE\r
193 TSINT:\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
197 \r
198 ; SOFTWARE INTERNAL INTERRUPTS JSR TO HERE\r
199 \r
200 LCKINT: 0\r
201         JRST    DOINT\r
202 \r
203 PURE\r
204 ]\r
205 ]\r
206 IFE ITS,[\r
207 RMT [\r
208 ; JSR HERE FOR SOFTWARE INTERNAL INTERRUPTS\r
209 \r
210 LCKINT: 0\r
211         JRST    DOINT\r
212 ]\r
213 ]\r
214 \f\r
215 \r
216 IFN ITS,[\r
217 \r
218 ;THE REST OF THIS CODE IS PURE\r
219 \r
220 TSINTP: SOSGE   INTFLG          ; SKIP IF ENABLED\r
221         SETOM   INTFLG          ;DONT GET LESS THAN -1\r
222 \r
223         MOVEM   A,TSAVA         ;SAVE TWO ACS\r
224         MOVEM   B,TSAVB\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
227 \r
228         TRZE    A,200000        ;IS THIS A PDL OVERFLOW?\r
229         JRST    IPDLOV          ;YES, GO HANDLE IT FIRST\r
230 \r
231 IMPCH:  MOVEI   B,0\r
232         TRNE    A,20000         ;IS IT A MEMORY PROTECTION VIOLATION?\r
233         MOVEI   B,1             ; FLAG SAME\r
234 \r
235         TRNE    A,40            ;ILLEGAL OP CODE?\r
236         MOVEI   B,2             ; ALSO FLAG\r
237         TRNN    A,400           ; IOC?\r
238         JRST    .+3\r
239         SOS     TSINTR\r
240         MOVEI   B,3\r
241         TLNE    A,200           ; PURE?\r
242         MOVEI   B,4\r
243         SOJGE   B,DO.NOW                ; CANT WAIT AROUND\r
244 \r
245 ;DECODE THE REST OF THE INTERRUPTS USING A TABLE\r
246 \r
247 2NDWORD:\r
248         JUMPL   A,GC2           ;2ND WORD?\r
249         IORM    A,PIRQ          ;NO, INTO WORD 1\r
250         JRST    GCQUIT          ;AND DISMISS INT\r
251 \r
252 GC2:    TLZ     A,400000        ;TURN OFF SIGN BIT\r
253         IORM    A,PIRQ2\r
254         TRNE    A,177777        ;CHECK FOR CHANNELS\r
255         JRST    CHNACT          ;GO IF CHANNEL ACTIVITY\r
256 ]\r
257 GCQUIT: SKIPGE  INTFLG          ;SKIP IF INTERRUPTS ENABLED\r
258         JRST    INTDON          ;NO, DEFER REAL HANDLING UNTIL LATER\r
259 \r
260         MOVE    A,TSINTR        ;PICKUP RETURN WORD\r
261 IFE ITS,[\r
262         TLON    A,10000         ; EXEC PC?\r
263         SUBI    A,1             ; YES FIXUP PC\r
264 ]\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
270 \r
271 \r
272 INTDON: MOVE    A,TSAVA         ;RESTORE ACS\r
273         MOVE    B,TSAVB\r
274 IFN ITS,        .DISMISS        TSINTR          ;AND DISMISS THE INTERRUPT\r
275 IFE ITS,        DEBRK\r
276 \r
277 \r
278 DO.NOW: SKIPE   GCFLG\r
279         JRST    DLOSER          ; HANDLE FATAL GC ERRORS\r
280         MOVSI   B,1\r
281         SKIPGE  INTFLG          ; IF NOT ENABLED\r
282         MOVEM   B,INTFLG        ; PRETEND IT IS\r
283         JRST    2NDWORD\r
284 \r
285 IFE ITS,[\r
286 \r
287 ; HERE FOR TENEX PDL OVER FLOW INTERRUPT\r
288 \r
289 TNXPDL: SOSGE   INTFLG\r
290         SETOM   INTFLG\r
291         MOVEM   A,TSAVA\r
292         MOVEM   B,TSAVB\r
293         JRST    IPDLOV          ; GO TO COMMON HANDLER\r
294 \r
295 ; HERE FOR TENEX ^G AND ^S INTERRUPTS\r
296 \r
297 CNTLG:  MOVEM   A,TSAVA\r
298         MOVEI   A,1\r
299         JRST    CNTSG\r
300 \r
301 CNTLS:  MOVEM   A,TSAVA\r
302         MOVEI   A,2\r
303 \r
304 CNTSG:  MOVEM   B,TSAVB\r
305         IORM    A,PIRQ2         ; SAY FOR MUDDLE LEVEL\r
306         SOSGE   INTFLG\r
307         SETOM   INTFLG\r
308         JRST    GCQUIT\r
309 INTNET:\r
310 REPEAT NNETS,[\r
311         MOVEM   A,TSAVA\r
312         MOVE    A,[1_<.RPCNT+NETCHN>]\r
313         JRST    CNTSG\r
314 ]\r
315 ]\r
316 \f\r
317 ; HERE TO PROCESS INTERRUPTS\r
318 \r
319 DOINT:  SKIPE   INTHLD          ; GLOBAL LOCK ON INTS\r
320         JRST    @LCKINT\r
321         SETOM   INTHLD          ; DONT LET IT HAPPEN AGAIN\r
322         PUSH    P,INTFLG\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
327         ANDI    0,-1\r
328         CAMG    0,PURTOP\r
329         CAMGE   0,VECBOT\r
330         JRST    DONREL\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
338 \r
339 ;NOW SAVE WORKING ACS\r
340 \r
341         PUSHJ   P,SAVACS\r
342         HLRZ    A,-1(P)         ; HACK FUNNYNESS FOR MPV/ILOPR\r
343         SKIPE   A\r
344         SETZM   -1(P)           ; REALLY DISABLED\r
345 \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
349         JFFO    A,FIRQ2\r
350 \r
351 INTDN1: SKIPN   GCHAPN          ; SKIP IF MUST DO GC INT\r
352         JRST    .+3\r
353         SETZM   GCHAPN\r
354         PUSHJ   P,INTOGC        ; AND INTERRUPT\r
355 \r
356         PUSHJ   P,RESTAC\r
357 \r
358 IFN ITS,[\r
359         .SUSET  [.SPICLR,,[0]]  ; DISABLE INTS\r
360 ]\r
361         POP     P,LCKINT\r
362         POP     P,INTFLG\r
363         SETZM   INTHLD          ; RE-ENABLE THE WORLD\r
364 IFN ITS,[\r
365         EXCH    0,LCKINT\r
366         HRRI    0,@0            ; EFFECTIVIZE THE ADDRESS\r
367         TLZ     0,37            ; KILL IND AND INDEX\r
368         EXCH    0,LCKINT\r
369         .DISMIS LCKINT\r
370 ]\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
376 \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
380 XIRQ:\r
381         CAIE    B,21            ;PDL OVERFLOW?\r
382         JRST    FHAND           ;YES, HACK APPROPRIATELY\r
383 \r
384 PDL2:   SKIPN   A,PGROW\r
385         SKIPE   A,TPGROW\r
386         JRST    .+2\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
392         ADDI    C,6\r
393         SKIPE   TPGROW          ; TP IS GROWING\r
394         ADDI    C,1\r
395         PUSHJ   P,AGC           ;COLLECT GARBAGE\r
396         SETZM   PGROW\r
397         SETZM   TPGROW\r
398         AOJL    A,REAGC         ; IF NO CORE, RETRY\r
399         JRST    DIRQ\r
400 \r
401 SAVACS:\r
402 IRP A,,[0,A,B,C,D,E]\r
403         PUSH    TP,A!STO(PVP)\r
404         SETZM   A!STO(PVP)      ;NOW ZERO TYPE\r
405         PUSH    TP,A\r
406         TERMIN\r
407         POPJ    P,\r
408 \r
409 RESTAC:\r
410 IRP A,,[E,D,C,B,A,0]\r
411         POP     TP,A\r
412         POP     TP,A!STO(PVP)\r
413         TERMIN\r
414         POPJ    P,\r
415 \r
416 ; HERE TO DO GC INTERRUPT AND CLOSE ANY DEAD CHANNELS\r
417 \r
418 INTOGC: PUSH    P,[N.CHNS-1]\r
419         MOVE    A,TVP\r
420         ADD     A,[CHNL1,,CHNL1]\r
421         PUSH    TP,$TVEC\r
422         PUSH    TP,A\r
423 \r
424 INTGC1: MOVE    A,(TP)          ; GET POINTER\r
425         SKIPN   B,1(A)          ; ANY CHANNEL?\r
426         JRST    INTGC2\r
427         HRRE    0,(A)           ; INDICATOR\r
428         JUMPGE  0,INTGC2\r
429         PUSH    TP,$TCHAN\r
430         PUSH    TP,B\r
431         MCALL   1,FCLOSE\r
432 \r
433         MOVE    A,(TP)\r
434 \r
435 INTGC2: HLLZS   (A)\r
436         ADD     A,[2,,2]\r
437         MOVEM   A,(TP)\r
438         SOSE    (P)\r
439         JRST    INTGC1\r
440 \r
441         SUB     P,[1,,1]\r
442         SUB     TP,[2,,2]\r
443         PUSH    TP,$TCHSTR\r
444         PUSH    TP,CHQUOTE GC\r
445         PUSH    TP,$TFLOAT      ; PUSH  ON TIME ARGUMENT\r
446         PUSH    TP,GCTIM\r
447         PUSH    TP,$TFIX        ; PUSH ON THE CAUSE ARGUMENT\r
448         PUSH    TP,GCCAUS\r
449         PUSH    TP,$TATOM       ; PUSH ON THE CALL ARGUMENT\r
450         MOVE    A,GCCALL\r
451         PUSH    TP,@GCALLR(A)\r
452         MCALL   4,INTERR\r
453         POPJ    P,\r
454 \r
455 \r
456 GCALLR: 0\r
457         MQUOTE BLOAT\r
458         MQUOTE GROW\r
459         MQUOTE LIST\r
460         MQUOTE VECTOR\r
461         MQUOTE SET\r
462         MQUOTE  SETG\r
463         MQUOTE FREEZE\r
464         MQUOTE PURE-PAGE-LOADER\r
465         MQUOTE GC\r
466         MQUOTE INTERRUPT-HANDLER\r
467         MQUOTE NEWTYPE\r
468 \r
469 \f; OLD "ON"  SETS UP EVENT AND HANDLER\r
470 \r
471 MFUNCTION ON,SUBR\r
472 \r
473         ENTRY\r
474 \r
475         HLRE    0,AB            ; 0=> -2*NUM OF ARGS\r
476         ASH     0,-1            ; TO -NUM\r
477         CAME    0,[-5]\r
478         JRST    .+3\r
479         MOVEI   B,10(AB)        ; LAST MUST BE CHAN OR LOC\r
480         PUSHJ   P,CHNORL\r
481         ADDI    0,3\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
486         CAIE    C,TPVP\r
487         JRST    TRYFIX\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
491         PUSH    P,0\r
492         CAIN    A,TATOM\r
493         JRST    .+3\r
494         CAIE    A,TCHSTR\r
495         JRST    WTYP1\r
496         MOVEI   B,(AB)          ; FIND IT\r
497         PUSHJ   P,FNDINT\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
501         SUB     TP,[2,,2]\r
502         PUSH    TP,(AB)         ; GET NAME\r
503         PUSH    TP,1(AB)\r
504         PUSH    TP,4(AB)\r
505         PUSH    TP,5(AB)\r
506         MOVEI   A,2             ; # OF ARGS TO EVENT\r
507         AOJG    0,ON1           ; JUMP IF NO LAST ARG\r
508         PUSH    TP,10(AB)\r
509         PUSH    TP,11(AB)\r
510         ADDI    A,1\r
511 ON1:    ACALL   A,EVENT\r
512 \r
513 ON3:    PUSH    TP,A\r
514         PUSH    TP,B\r
515         PUSH    TP,2(AB)        ; NOW FCN\r
516         PUSH    TP,3(AB)\r
517         MOVEI   A,3             ; NUM OF ARGS\r
518         SKIPN   (P)\r
519         SOJA    A,ON2           ; NO PROC\r
520         PUSH    TP,$TPVP\r
521         PUSH    TP,7(AB)\r
522 ON2:    ACALL   A,HANDLER\r
523         JRST    FINIS\r
524 \r
525 \r
526 TRYFIX: SKIPN   A,7(AB)\r
527         CAIE    C,TFIX\r
528         JRST    WRONGT\r
529         JRST    ONPROC\r
530 \f\r
531 ; ROUTINE TO BUILD AN EVENT\r
532 \r
533 MFUNCTION EVENT,SUBR\r
534 \r
535         ENTRY\r
536 \r
537         HLRZ    0,AB\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
541         JRST    TFA\r
542         GETYP   A,2(AB)         ; 2ND ARG MUST BE FIXED POINT PRIORITY\r
543         CAIE    A,TFIX\r
544         JRST    WTYP2\r
545         GETYP   A,(AB)          ; FIRST ARG SHOULD BE CHSTR\r
546         CAIN    A,TATOM         ; ALLOW ACTUAL ATOM\r
547         JRST    .+3\r
548         CAIE    A,TCHSTR\r
549         JRST    WTYP1\r
550         CAIL    0,-5\r
551         JRST    GOTRGS\r
552         CAIG    0,-7\r
553         JRST    TMA\r
554         MOVEI   B,4(AB)\r
555         PUSHJ   P,CHNORL        ; CHANNEL OR LOCATIVE (PUT ON STACK)\r
556 \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
560         PUSH    P,C\r
561         JUMPE   C,.+3           ; GET IT OFF STACK\r
562         POP     TP,B\r
563         POP     TP,A\r
564         PUSHJ   P,MAKINT        ; MAKE ONE FOR ME\r
565         MOVSI   0,TFIX\r
566         MOVEM   0,INTPRI(B)     ; SET UP PRIORITY\r
567         MOVE    0,3(AB)\r
568         MOVEM   0,INTPRI+1(B)\r
569 CH.SPC: POP     P,C             ; GET CODE BACK\r
570         SKIPGE  C\r
571         PUSHJ   P,DO.SPC        ; DO ANY SPECIAL HACKS\r
572         JRST    FINIS\r
573 \r
574 RE.EVN: GETYP   0,(AB)\r
575         CAIE    0,TINTH\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
579         SETZB   D,C\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
585         PUSHJ   P,GETNM1\r
586         JUMPL   C,RE.EV1\r
587         MOVE    B,INAME+1(B)    ; CHECK FOR SPEC\r
588         PUSHJ   P,SPEC1\r
589         MOVE    B,1(AB)         ; RESTORE IHEADER\r
590 RE.EV1: PUSH    TP,INAME(B)\r
591         PUSH    TP,INAME+1(B)\r
592         PUSH    P,C\r
593         MOVSI   C,TATOM\r
594         PUSH    TP,$TATOM\r
595         SKIPN   D\r
596         MOVE    D,MQUOTE INTERRUPT\r
597         PUSH    TP,D\r
598         MOVE    A,INAME(B)\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
602         MOVE    A,(TB)\r
603         MOVE    B,1(TB)\r
604         POP     TP,D\r
605         POP     TP,C\r
606         PUSH    TP,(AB)\r
607         PUSH    TP,1(AB)\r
608         PUSHJ   P,IPUT          ; REESTABLISH IT\r
609         MOVE    A,(AB)\r
610         MOVE    B,1(AB)\r
611         JRST    CH.SPC\r
612 \r
613 \f\r
614 ; FUNCTION TO GENERATE A HANDLER FOR A GIVEN INTERRUPT\r
615 \r
616 MFUNCTION HANDLER,SUBR\r
617 \r
618         ENTRY\r
619 \r
620         HLRZ    0,AB\r
621         CAIL    0,-2            ; MUST BE 2 OR MORE ARGS\r
622         JRST    TFA\r
623         GETYP   A,(AB)\r
624         CAIE    A,TINTH         ; EVENT?\r
625         JRST    WTYP1\r
626         GETYP   A,2(AB)\r
627         CAIN    0,-4            ; IF EXACTLY 2\r
628         CAIE    A,THAND         ; COULD BE HANDLER\r
629         JRST    CHEVNT\r
630 \r
631         MOVE    B,3(AB)         ; GET IT\r
632         SKIPN   IPREV+1(B)      ; SKIP IF ALREADY IN USE\r
633         JRST    HNDOK\r
634         MOVE    D,1(AB)         ; GET EVENT\r
635         SKIPN   D,IHNDLR+1(D)   ; GET FIRST HANDLER\r
636         JRST    BADHND\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
640         JUMPN   D,.-3\r
641 BADHND: PUSH    TP,$TATOM\r
642         PUSH    TP,EQUOTE HANDLER-ALREADY-IN-USE\r
643         JRST    CALER1\r
644 \r
645 CHEVNT: CAIG    0,-7            ; SKIP IF LESS THAN 4\r
646         JRST    TMA\r
647         PUSH    TP,$TPVP                ; SLOT FOR PROCESS\r
648         PUSH    TP,[0]\r
649         CAIE    0,-6            ; IF 3, LOOK FOR PROC\r
650         JRST    NOPROC\r
651         GETYP   0,4(AB)\r
652         CAIE    0,TPVP\r
653         JRST    WTYP3\r
654         MOVE    0,5(AB)\r
655         MOVEM   0,(TP)\r
656 \r
657 NOPROC: PUSHJ   P,APLQ\r
658         JRST    NAPT\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
663         MOVEM   0,INTPRO(B)\r
664         MOVE    0,2(AB)         ; SET UP FUNCTION\r
665         MOVEM   0,INTFCN(B)\r
666         MOVE    0,3(AB)\r
667         MOVEM   0,INTFCN+1(B)\r
668 \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
678         MOVEM   0,INXT(B)\r
679         JUMPE   E,HFINIS        ; JUMP IF HEADER WAS EMPTY\r
680         MOVEM   0,IPREV(E)      ; FIX UP ITS PREV\r
681         MOVEM   B,IPREV+1(E)\r
682 HFINIS: MOVSI   A,THAND\r
683         JRST    FINIS\r
684 \r
685 \f\r
686 \r
687 ; FUNCTIONS TO SET TIME LIMITS FOR REALTIME AND RUNTIME INTS\r
688 \r
689 MFUNCTION RUNTIMER,SUBR\r
690 \r
691         ENTRY   1\r
692 \r
693         GETYP   0,(AB)\r
694         JFCL    10,.+1\r
695         MOVE    A,1(AB)\r
696         CAIE    0,TFIX\r
697         JRST    RUNT1\r
698         IMUL    A,[245761.]\r
699         JRST    RUNT2\r
700 \r
701 RUNT1:  CAIE    0,TFLOAT\r
702         JRST    WTYP1\r
703         FMPR    A,[245760.62]\r
704         MULI    A,400           ; FIX IT\r
705         TSC     A,A\r
706         ASH     B,(A)-243\r
707         MOVE    A,B\r
708 RUNT2:  JUMPL   A,OUTRNG        ; NOT FOR NEG #\r
709         JFCL    10,OUTRNG\r
710         .SUSET  [.SRTMR,,A]\r
711         MOVE    A,(AB)\r
712         MOVE    B,1(AB)\r
713         JRST    FINIS\r
714 \r
715 MFUNCTION REALTIMER,SUBR\r
716 \r
717         ENTRY   1\r
718 \r
719         JFCL    10,.+1\r
720         GETYP   0,(AB)\r
721         MOVE    A,1(AB)\r
722         CAIE    0,TFIX\r
723         JRST    REALT1\r
724         IMULI   A,60.   ; TO 60THS OF SEC\r
725         JRST    REALT2\r
726 \r
727 REALT1: CAIE    0,TFLOAT\r
728         JRST    WTYP1\r
729         FMPRI   A,(60.0)\r
730         MULI    A,400\r
731         TSC     A,A\r
732         ASH     B,(A)-243\r
733         MOVE    A,B\r
734 \r
735 REALT2: JUMPL   A,OUTRNG\r
736         JFCL    10,OUTRNG\r
737         MOVE    B,[200000,,A]\r
738         .REALT  B,\r
739         JFCL\r
740         MOVE    A,(AB)\r
741         MOVE    B,1(AB)\r
742         JRST    FINIS\r
743 \r
744 ; FUNCTIONS TO ENABLE AND DISABLE INTERRUPTS\r
745 \r
746 MFUNCTION %ENABL,SUBR,ENABLE\r
747 \r
748         PUSHJ   P,GTEVNT\r
749         SETZM   ISTATE+1(B)\r
750         JRST    FINIS\r
751 \r
752 MFUNCTION %DISABL,SUBR,DISABLE\r
753 \r
754 \r
755         PUSHJ   P,GTEVNT\r
756         SETOM   ISTATE+1(B)\r
757         JRST    FINIS\r
758 \r
759 GTEVNT: ENTRY   1\r
760         GETYP   0,(AB)\r
761         CAIE    0,TINTH\r
762         JRST    WTYP1\r
763         MOVE    A,(AB)\r
764         MOVE    B,1(AB)\r
765         POPJ    P,\r
766 \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
771 IFE ITS,[\r
772         PUSH    TP,A\r
773         PUSH    TP,B\r
774         MOVE    B,1(TB)         ; CHANNEL\r
775         MOVE    0,CHANNO(B)\r
776         MOVEM   0,(E)           ; SAVE IN TABLE\r
777         MOVEI   E,(E)\r
778         SUBI    E,NETJFN-NETCHN\r
779         MOVE    A,0             ; SETUP FOR MTOPR\r
780         MOVEI   B,24\r
781         MOVSI   C,(E)\r
782         TLO     C,770000        ; DONT SETUP INR/INS\r
783         MTOPR\r
784         MOVEI   0,1\r
785         MOVNS   E\r
786         LSH     0,35.(E)\r
787         IORM    0,MASK1\r
788         MOVE    B,MASK1\r
789         MOVEI   A,MFORK\r
790         AIC\r
791         \r
792         POP     TP,B\r
793         POP     TP,A\r
794         POPJ    P,              ; ***** TEMP ******\r
795 ]\r
796 IFN ITS,[\r
797         CAILE   E,35.           ; SKIP IF 1ST WORD BIT\r
798         JRST    SETW2\r
799         LSH     0,-1(E)\r
800 \r
801         IORM    0,MASK1         ; STORE IN PROTOTYPE MASK\r
802         .SUSET  [.SMASK,,MASK1]\r
803         POPJ    P,\r
804 \r
805 SETW2:  LSH     0,-36.(E)\r
806         IORM    0,MASK2         ; SET UP PROTO MASK2\r
807         .SUSET  [.SMSK2,,MASK2]\r
808         POPJ    P,\r
809 ]\r
810 \r
811 ; ROUTINE TO CHECK FOR CHANNEL OR LOCATIVE\r
812 \r
813 CHNORL: GETYP   A,(B)           ; GET TYPE\r
814         CAIN    A,TCHAN         ; IF CHANNEL\r
815         JRST    CHNWIN\r
816         PUSH    P,0\r
817         PUSHJ   P,LOCQ          ; ELSE LOOCATIVE\r
818         JRST    WRONGT\r
819         POP     P,0\r
820 CHNWIN: PUSH    TP,(B)\r
821         PUSH    TP,1(B)\r
822         POPJ    P,\r
823 \f\r
824 ; SUBROUTINE TO FIND A HANDLER OF A GIVEN NAME\r
825 \r
826 FNDINT: PUSHJ   P,FNDNM\r
827         JUMPE   B,CPOPJ\r
828         PUSHJ   P,SPEC1         ; COULD BE FUNNY\r
829 \r
830 INTASO: PUSH    P,C             ; C<0 IF SPECIAL\r
831         PUSH    TP,A\r
832         PUSH    TP,B\r
833         MOVSI   C,TATOM\r
834         SKIPN   D               ; COULD BE CHANGED FOR MONITOR\r
835         MOVE    D,MQUOTE INTERRUPT\r
836         PUSH    TP,C\r
837         PUSH    TP,D\r
838         PUSHJ   P,IGET\r
839         MOVE    D,(TP)\r
840         SUB     TP,[2,,2]\r
841         POP     P,C             ; AND RESTOR SPECIAL INDICATOR\r
842         SKIPE   B               ; IF FOUND\r
843         SUB     TP,[2,,2]       ; REMOVE CRUFT\r
844 CPOPJ:  POPJ    P,              ; AND RETURN\r
845 \r
846 ; CHECK FOR SPECIAL INTERNAL INTERRUPT HACK\r
847 \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
851         JUMPGE  C,.+3\r
852         SKIPE   E,FNDTBL(C)\r
853         JRST    (E)\r
854         MOVEI   0,-1(TB)        ; SEE IF OK\r
855         CAIE    0,(TP)\r
856         JRST    TMA\r
857         POPJ    P,\r
858 \r
859 ; ROUTINE TO CREATE A NEW INTERRUPT (INTERNAL ONLY--NOT ITS FLAVOR)\r
860 \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
865         PUSHJ   P,INSRTX\r
866         MOVE    D,MQUOTE INTERRUPT\r
867 GOTATM: PUSH    TP,$TINTH       ; MAKE SLOT FOR HEADER BLOCK\r
868         PUSH    TP,[0]\r
869         PUSH    TP,A\r
870         PUSH    TP,B            ; SAVE ATOM\r
871         PUSH    TP,$TATOM\r
872         PUSH    TP,D\r
873         MOVEI   A,IHDRLN*2\r
874         PUSHJ   P,GIBLOK\r
875         MOVE    A,-3(TP)                ; GET NAME AND STORE SAME\r
876         MOVEM   A,INAME(B)\r
877         MOVE    A,-2(TP)\r
878         MOVEM   A,INAME+1(B)\r
879         SETZM   ISTATE+1(B)\r
880         MOVEM   B,-4(TP)        ; STASH HEADER\r
881         POP     TP,D\r
882         POP     TP,C\r
883         EXCH    B,(TP)\r
884         MOVSI   A,TINTH\r
885         EXCH    A,-1(TP)        ; INTERNAL PUT CALL\r
886         PUSHJ   P,IPUT\r
887         POP     TP,B\r
888         POP     TP,A\r
889         POPJ    P,\r
890 \r
891 ; FIND NAME OF INTERRUPT\r
892 \r
893 FNDNM:  GETYP   A,(B)           ; TYPE\r
894         CAIE    A,TCHSTR        ; IF STRING\r
895         JRST    FNDATM          ; DONT HAVE ATOM, OTHERWISE DO\r
896         PUSHJ   P,IILOOK\r
897         JRST    .+2\r
898 FNDATM: MOVE    B,1(B)\r
899         SETZB   C,D             ; PREVENT LOSSAGE LATER\r
900         MOVSI   A,TATOM\r
901 \r
902 ; THE NEXT 2 INSTRUCTIONS ARE A KLUDGE TO GET THE RIGHT ERROR ATOM\r
903 \r
904         CAMN    B,IMQUOTE ERROR\r
905         MOVE    B,MQUOTE ERROR,ERROR,INTRUP\r
906         POPJ    P,\r
907 \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
911 \f\r
912 ; ROUTINE TO MAKE A HANDLER BLOCK\r
913 \r
914 MHAND:  MOVEI   A,IHANDL*2\r
915         JRST    GIBLOK          ; GET BLOCK\r
916 \r
917 ; HERE TO GET CHANNEL FOR "CHAR" INTERRUPT\r
918 \r
919 GETCHN: GETYP   0,(TB)          ; GET TYPE\r
920         CAIE    0,TCHAN         ; CHANNL IS WINNER\r
921         JRST    WRONGT\r
922         MOVE    A,(TB)          ; USE THE CHANNEL TO NAME THE INTERRUPT\r
923         MOVE    B,1(TB)\r
924         SKIPN   CHANNO(B)       ; SKIP IF WINNING CHANNEL\r
925         JRST    CBDCHN          ; LOSER\r
926         POPJ    P,\r
927 \r
928 LOCGET: GETYP   0,(TB)          ; TYPE\r
929         CAIN    0,TCHAN         ; SKIP IF LOCATIVE\r
930         JRST    WRONGT\r
931         MOVE    D,B\r
932         MOVE    A,(TB)\r
933         MOVE    B,1(TB)         ; GET LOCATIVE\r
934         POPJ    P,\r
935 \r
936 ; FINAL MONITOR SETUP ROUTINES\r
937 \r
938 S.RMON: SKIPA   E,[.RDMON,,]\r
939 S.WMON: MOVSI   E,.WRMON\r
940         PUSH    TP,A\r
941         PUSH    TP,B\r
942         HLRM    E,INTPRI(B)     ; SAVE BITS\r
943         MOVEI   B,(TB)          ; POINT TO LOCATIVE\r
944         HRRZ    A,FSAV(TB)\r
945         CAIN    A,OFF\r
946         MOVSI   D,(ANDCAM E,)   ; KILL INST\r
947         CAIN    A,EVENT\r
948         MOVSI   D,(IORM E,)\r
949         PUSHJ   P,SMON          ; GO DO IT\r
950         POP     TP,B\r
951         POP     TP,A\r
952         MOVEI   E,0\r
953         POPJ    P,\r
954 \f\r
955 \r
956 ; SPECIAL SETUP ROUTINES FOR INITIAL INTERRUPTS\r
957 \r
958 IFN ITS,[\r
959 S.CHAR: MOVE    E,1(TB)         ; GET CHANNEL\r
960         MOVE    E,CHANNO(E)\r
961         ADDI    E,36.           ; GET CORRECT MASK BIT\r
962 ONEBIT: MOVEI   0,1             ; BIT FOR INT TO RET\r
963         POPJ    P,\r
964 ]\r
965 IFE ITS,[\r
966 S.CHAR: MOVE    E,1(TB)\r
967         MOVE    0,RDEVIC(E)\r
968         ILDB    0,0             ; 1ST CHAR\r
969         PUSH    P,A\r
970         CAIE    0,"N            ; NET ?\r
971         JRST    S.CHA1\r
972 \r
973         MOVEI   A,0\r
974         HRRZ    0,CHANNO(E)\r
975         MOVE    E,[-NNETS,,NETJFN]\r
976         CAMN    0,(E)\r
977         JRST    S.CHA2\r
978         SKIPN   (E)\r
979         MOVE    A,E             ; REMEMBER WHERE\r
980         AOBJN   E,.-5\r
981         TLNN    A,-1    \r
982         FATAL   NO MORE NETWORK\r
983         MOVE    E,A\r
984 S.CHA1: MOVEI   E,0\r
985 S.CHA2: POP     P,A\r
986         POPJ    P,\r
987 ]\r
988 \r
989 \r
990 ; SPECIAL FOR CLOCK\r
991 \r
992 S.DOWN: SKIPA   E,[7]\r
993 S.CLOK: MOVEI   E,13.           ; FOR NOW JUST GET BIT #\r
994         JRST    ONEBIT\r
995 \r
996 S.PAR:  MOVEI   E,28.\r
997         JRST    ONEBIT\r
998 \r
999 ; RUNTIME AND REALTIME INTERRUPTS\r
1000 \r
1001 S.RUNT: SKIPA   E,[34.]\r
1002 S.REAL: MOVEI   E,35.\r
1003         JRST    ONEBIT\r
1004 \r
1005 S.IOC:  SKIPA   E,[9.]          ; IO CHANNEL ERROR\r
1006 S.PURE: MOVEI   E,26.\r
1007         JRST    ONEBIT\r
1008 \r
1009 ; MPV AND ILOPR\r
1010 \r
1011 S.MPV:  SKIPA   E,[14.]         ; BIT POS\r
1012 S.ILOP: MOVEI   E,6\r
1013         JRST    ONEBIT\r
1014 \r
1015 ; HERE TO TURN ALL INFERIOR INTS\r
1016 \r
1017 S.INF:  MOVEI   E,36.+16.+2     ; START OF BITS\r
1018         MOVEI   0,37            ; 8 BITS WORTH\r
1019         POPJ    P,\r
1020 \f\r
1021 \r
1022 ; HERE TO HANDLE ITS INTERRUPTS\r
1023 \r
1024 FHAND:  SKIPN   D,EXTINT(B)     ; SKIP IF HANDLERS ARE POSSIBLE\r
1025         JRST    DIRQ\r
1026         JRST    (D)\r
1027 \r
1028 IFN ITS,[\r
1029 ; SPECIAL CHARACTER HANDLERS\r
1030 \r
1031 HCHAR:  MOVEI   D,CHNL0+1(TVP)\r
1032         ADDI    D,(B)           ; POINT TO CHANNEL SLOT\r
1033         ADDI    D,(B)\r
1034         SKIPN   D,-72.(D)       ; PICK UP CHANNEL\r
1035         JRST    IPCGOT          ;WELL, IT GOTTA BEE THE THE IPC THEN\r
1036         PUSH    TP,$TCHAN\r
1037         PUSH    TP,D\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
1042         SKIPN   NOTTY\r
1043         JRST    HCHR11\r
1044         MOVE    B,D             ; CHAN TO B\r
1045         PUSHJ   P,TTYOP2        ; RE-GOBBLE TTY\r
1046         MOVE    D,(TP)\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
1054 \r
1055 CHRLOO: MOVE    D,(P)           ; GET CHNNAEL NO.\r
1056         SOSG    CHNCNT(D)       ; GET COUNT\r
1057         JRST    CHRDON\r
1058 \r
1059         MOVE    B,(TP)\r
1060         MOVE    D,BUFRIN(B)     ; GET EXTRA BUFFER\r
1061         XCT     IOIN2(D)        ; READ CHAR\r
1062         PUSH    TP,$TCHSTR\r
1063         PUSH    TP,CHQUOTE CHAR\r
1064         PUSH    TP,$TCHRS       ; SAVE CHAR FOR CALL    \r
1065         PUSH    TP,A\r
1066         PUSH    TP,$TCHAN       ; SAVE CHANNEL\r
1067         PUSH    TP,B\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
1071 \r
1072 CHRDON: .CALL   HOWMNY\r
1073         MOVEI   B,0\r
1074         MOVEI   A,1             ; SET FOR PI WORD CLOBBER\r
1075         LSH     A,(D)\r
1076         JUMPG   B,RECHR         ; ANY MORE?\r
1077         ANDCAM  A,PIRQ2\r
1078         SUB     P,[1,,1]\r
1079         SUB     TP,[2,,2]\r
1080         JRST    DIRQ\r
1081 \r
1082 \r
1083 \f\r
1084 ; HERE FOR NET CHANNEL INTERRUPT\r
1085 \r
1086 HNET:   CAIE    0,26            ; NETWORK?\r
1087         JRST    HSTYET          ; HANDLE PSEUDO TTY ETC.\r
1088         PUSH    TP,$TATOM\r
1089         PUSH    TP,MQUOTE CHAR,CHAR,INTRUP\r
1090         PUSH    TP,$TUVEC\r
1091         PUSH    TP,BUFRIN(D)\r
1092         PUSH    TP,$TCHAN\r
1093         PUSH    TP,D\r
1094         MOVE    B,D             ; CHAN TO B\r
1095         PUSHJ   P,INSTAT        ; UPDATE THE NETWRK STATE\r
1096         MCALL   3,INTERRUPT\r
1097         SUB     TP,[2,,2]\r
1098         JRST    DIRQ\r
1099 \r
1100 HSTYET: PUSH    TP,$TATOM\r
1101         PUSH    TP,MQUOTE CHAR,CHAR,INTRUP\r
1102         PUSH    TP,$TCHAN\r
1103         PUSH    TP,D\r
1104         MCALL   2,INTERRUPT\r
1105         SUB     TP,[2,,2]\r
1106         JRST    DIRQ\r
1107 \r
1108 ]\r
1109 CBDCHN: PUSH    TP,$TATOM\r
1110         PUSH    TP,EQUOTE BAD-CHANNEL\r
1111         JRST    CALER1\r
1112 \r
1113 IFN ITS,[\r
1114 \r
1115 HCLOCK: PUSH    TP,$TCHSTR\r
1116         PUSH    TP,CHQUOTE CLOCK\r
1117         MCALL   1,INTERRUPT\r
1118         JRST    DIRQ\r
1119 \r
1120 HRUNT:  PUSH    TP,$TATOM\r
1121         PUSH    TP,MQUOTE RUNT,RUNT,INTRUP\r
1122         MCALL   1,INTERRUPT\r
1123         JRST    DIRQ\r
1124 \r
1125 HREAL:  PUSH    TP,$TATOM\r
1126         PUSH    TP,MQUOTE REALT,REALT,INTRUP\r
1127         MCALL   1,INTERRUPT\r
1128         JRST    DIRQ\r
1129 \r
1130 HPAR:   MOVE    A,MQUOTE PARITY,PARITY,INTRUP\r
1131         JRST    HMPV1\r
1132 \r
1133 HMPV:   MOVE    A,MQUOTE MPV,MPV,INTRUP\r
1134         JRST    HMPV1\r
1135 \r
1136 HILOPR: MOVE    A,MQUOTE ILOPR,ILOPR,INTRUP\r
1137         JRST    HMPV1\r
1138 \r
1139 HPURE:  MOVE    A,MQUOTE PURE,PURE,INTRUP\r
1140 HMPV1:  PUSH    TP,$TATOM\r
1141         PUSH    TP,A\r
1142         PUSH    P,LCKINT        ; SAVE LOCN\r
1143         PUSH    TP,$TATOM\r
1144         PUSH    TP,A\r
1145         PUSH    TP,$TWORD\r
1146         PUSH    TP,LCKINT\r
1147         MCALL   2,EMERGENCY\r
1148         POP     P,A\r
1149         MOVE    C,(TP)\r
1150         SUB     TP,[2,,2]\r
1151         JUMPN   B,DIRQ\r
1152 \r
1153         PUSH    TP,$TATOM\r
1154         PUSH    TP,EQUOTE DANGEROUS-INTERRUPT-NOT-HANDLED\r
1155         PUSH    TP,$TATOM\r
1156         PUSH    TP,C\r
1157         PUSH    TP,$TWORD\r
1158         PUSH    TP,A\r
1159         MCALL   3,ERROR\r
1160         JRST    DIRQ\r
1161 \r
1162 \f\r
1163 \r
1164 ; HERE TO HANDLE SYS DOWN INTERRUPT\r
1165 \r
1166 HDOWN:  PUSH    TP,$TATOM\r
1167         PUSH    TP,MQUOTE SYSDOWN,SYSDOWN,INTRUP\r
1168         .DIETI  A,              ; HOW LONG?\r
1169         PUSH    TP,$TFIX\r
1170         PUSH    TP,A\r
1171         PUSH    P,A             ; FOR MESSAGE\r
1172         MCALL   2,INTERRUPT\r
1173         POP     P,A\r
1174         JUMPN   B,DIRQ\r
1175         .SUSET  [.RTTY,,B]      ; DO WE NOW HAVE A TTY AT ALL?\r
1176         JUMPL   B,DIRQ          ; DONT HANG AROUND\r
1177         PUSH    P,A\r
1178         MOVEI   B,[ASCIZ /\r
1179 Excuse me, SYSTEM going down in /]\r
1180         SKIPG   (P)             ; SKIP IF REALLY GOING DOWN\r
1181         MOVEI   B,[ASCIZ /\r
1182 Excuse me, SYSTEM has been REVIVED!\r
1183 /]\r
1184         PUSHJ   P,MSGTYP\r
1185         POP     P,B\r
1186         JUMPE   B,DIRQ\r
1187         IDIVI   B,30.           ; TO SECONDS\r
1188         IDIVI   B,60.           ; A/ SECONDS B/ MINUTES\r
1189         JUMPE   B,NOMIN\r
1190         PUSH    P,C\r
1191         PUSHJ   P,DECOUT\r
1192         MOVEI   B,[ASCIZ / minutes /]\r
1193         PUSHJ   P,MSGTYP\r
1194         POP     P,B\r
1195         JRST    .+2\r
1196 NOMIN:  MOVEI   B,(C)\r
1197         PUSHJ   P,DECOUT\r
1198         MOVEI   B,[ASCIZ / seconds.\r
1199 /]\r
1200         PUSHJ   P,MSGTYP\r
1201         JRST    DIRQ\r
1202 \r
1203 ; TWO DIGIT DEC OUT FROM B/\r
1204 \r
1205 DECOUT: IDIVI   B,10.\r
1206         JUMPE   B,DECOU1        ; NO TEN\r
1207         MOVEI   A,60(B)\r
1208         PUSHJ   P,MTYO\r
1209 DECOU1: MOVEI   A,60(C)\r
1210         JRST    MTYO\r
1211 \f\r
1212 ; HERE TO HANDLE I/O CHANNEL ERRORS\r
1213 \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
1219 \r
1220         PUSH    TP,$TCHAN       \r
1221         ASH     C,1             ; GET CHANNEL\r
1222         ADDI    C,CHNL0+1(TVP)  ; GET CHANNEL VECTOR\r
1223         PUSH    TP,(C)\r
1224         LSH     A,23.           ; DO A .STATUS\r
1225         IOR     A,[.STATUS A]\r
1226         XCT     A\r
1227         PUSHJ   P,GFALS         ; GEN NAMED FALSE\r
1228         PUSH    TP,A\r
1229         PUSH    TP,B\r
1230         PUSH    TP,$TATOM\r
1231         PUSH    TP,MQUOTE IOC,IOC,INTRUP\r
1232 \r
1233         PUSH    TP,A\r
1234         PUSH    TP,B\r
1235         PUSH    TP,-7(TP)\r
1236         PUSH    TP,-7(TP)\r
1237         MCALL   3,EMERGENCY\r
1238         JUMPN   B,DIRQ1         ; JUMP IF HANDLED\r
1239         MCALL   3,ERROR\r
1240         JRST    DIRQ\r
1241 \r
1242 DIRQ1:  SUB     TP,[6,,6]\r
1243         JRST    DIRQ\r
1244 \r
1245 ; HANDLE INFERIOR KNOCKING AT THE DOOR\r
1246 \r
1247 HINF:   SUBI    B,36.+16.+2     ; CONVERT TO INF #\r
1248         PUSH    TP,$TATOM\r
1249         PUSH    TP,MQUOTE INFERIOR,INFERIOR,INTRUP\r
1250         PUSH    TP,$TFIX\r
1251         PUSH    TP,B\r
1252         MCALL   2,INTERRUPT\r
1253         JRST    DIRQ\r
1254 ]\f\r
1255 IFE ITS,[\r
1256 \r
1257 ; HERE FOR TENEX INTS (FIRST CUT)\r
1258 \r
1259 HCNTLG: MOVEI   A,7\r
1260         JRST    HCNGS\r
1261 \r
1262 HCNTLS: MOVEI   A,23\r
1263 \r
1264 HCNGS:  PUSH    TP,$TATOM\r
1265         PUSH    TP,MQUOTE CHAR,CHAR,INTRUP\r
1266         PUSH    TP,$TCHRS\r
1267         PUSH    TP,A\r
1268         PUSH    TP,$TCHAN\r
1269         PUSH    TP,TTICHN+1(TVP)\r
1270         MCALL   3,INTERRUPT\r
1271         JRST    DIRQ\r
1272 \r
1273 HNET:   MOVE    A,NETJFN-NINT+NNETS(B)\r
1274         JUMPE   A,DIRQ\r
1275         ASH     A,1\r
1276         ADDI    A,CHNL0+1(TVP)\r
1277         MOVE    B,(A)\r
1278         PUSH    TP,$TATOM\r
1279         PUSH    TP,MQUOTE CHAR,CHAR,INTRUP\r
1280         PUSH    TP,$TUVEC\r
1281         PUSH    TP,BUFRIN(B)\r
1282         PUSH    TP,$TCHAN\r
1283         PUSH    TP,B\r
1284         PUSHJ   P,INSTAT\r
1285         MCALL   3,INTERRUPT\r
1286         JRST    DIRQ\r
1287 ]\r
1288 \r
1289 \f\r
1290 MFUNCTION OFF,SUBR\r
1291         ENTRY\r
1292 \r
1293         JUMPGE  AB,TFA\r
1294         HLRZ    0,AB\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
1299         CAIN    A,TATOM\r
1300         JRST    .+3\r
1301         CAIE    A,TCHSTR\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
1306         JRST    TMA\r
1307         MOVEI   B,2(AB)         ; POINT TO 2D\r
1308         PUSHJ   P,CHNORL\r
1309 OFFAC1: MOVEI   B,(AB)\r
1310         PUSHJ   P,FNDINT\r
1311         JUMPGE  B,NOHAN1        ; NOT HANDLED\r
1312 \r
1313 OFFH1:  PUSH    P,C             ; SAVE C FOR BIT CLOBBER\r
1314         MOVSI   C,TATOM\r
1315         SKIPN   D\r
1316         MOVE    D,MQUOTE INTERRUPT\r
1317         MOVE    A,INAME(B)\r
1318         MOVE    B,INAME+1(B)\r
1319         PUSHJ   P,IREMAS\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
1324 \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
1328 IFN ITS,[\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
1334 ]\r
1335 IFE ITS,[\r
1336         MOVE    D,B\r
1337         SETZM   (E)\r
1338         MOVEI   E,(E)\r
1339         SUBI    E,NETJFN-NETCHN\r
1340         MOVEI   0,1\r
1341         MOVNS   E\r
1342         LSH     0,35.(E)\r
1343         ANDCAM  0,MASK1\r
1344         MOVEI   A,MFORK\r
1345         SETCM   B,MASK1\r
1346         DIC\r
1347         ANDCAM  0,PIRQ          ; JUST IN CASE\r
1348         MOVE    B,D\r
1349 ]\r
1350 OFINIS: MOVSI   A,TINTH\r
1351         JRST    FINIS\r
1352 \r
1353 IFN ITS,[\r
1354 CLRW2:  LSH     0,-36.(E)       ; POS BIT FOR 2D WORD\r
1355         ANDCAM  0,MASK2\r
1356         .SUSET  [.SMSK2,,MASK2]\r
1357         JRST    OFINIS\r
1358 ]\r
1359 \r
1360 TRYHAN: CAIE    A,THAND         ; HANDLER?\r
1361         JRST    WTYP1\r
1362         CAIE    0,-2\r
1363         JRST    TMA\r
1364         GETYP   0,IPREV(B)      ; GET TYPE OF PREV\r
1365         MOVE    A,INXT+1(B)\r
1366         MOVE    C,IPREV+1(B)\r
1367         MOVE    D,IPREV(B)\r
1368         CAIE    0,THAND\r
1369         JRST    DOHEAD          ; PREV HUST BE HDR\r
1370         MOVEM   A,INXT+1(C)\r
1371         JRST    .+2\r
1372 DOHEAD: MOVEM   A,IHNDLR+1(C)   ; INTO HDR\r
1373         JUMPE   A,OFFINI\r
1374         MOVEM   D,IPREV(A)\r
1375         MOVEM   C,IPREV+1(A)\r
1376 OFFINI: SETZM   IPREV+1(B)\r
1377         SETZM   INXT+1(B)\r
1378         MOVSI   A,THAND\r
1379         JRST    FINIS\r
1380 \r
1381 OFFHD:  CAIE    0,-2\r
1382         JRST    TMA\r
1383         PUSHJ   P,GETNMS                ; GET INFOR ABOUT INT\r
1384         JUMPE   C,OFFH1\r
1385         PUSH    TP,INAME(B)\r
1386         PUSH    TP,INAME+1(B)\r
1387         JRST    OFFH1\r
1388 \r
1389 GETNMS: GETYP   A,INAME(B)      ; CHECK FOR SPECIAL\r
1390         SETZB   C,D\r
1391         CAIN    A,TCHAN\r
1392         HRROI   C,SS.CHA\r
1393         PUSHJ   P,LOCQ          ; LOCATIVE?\r
1394         JRST    CHGTNM\r
1395 \r
1396         MOVEI   B,INAME(B)      ; POINT TO LOCATIVE\r
1397         MOVSI   D,(MOVE E,)\r
1398         PUSHJ   P,SMON          ; GET MONITOR\r
1399         MOVE    B,1(AB)\r
1400 GETNM1: HRROI   C,SS.WMO        ; ASSUME WRITE\r
1401         TLNN    E,.WRMON\r
1402         HRROI   C,SS.RMO\r
1403         MOVE    D,MQUOTE WRITE,WRITE,INTRUP\r
1404         TLNN    E,.WRMON\r
1405         MOVE    D,MQUOTE READ,READ,INTRUP\r
1406         POPJ    P,\r
1407 \r
1408 CHGTNM: JUMPL   C,CPOPJ\r
1409         MOVE    B,INAME+1(B)\r
1410         PUSHJ   P,SPEC1\r
1411         MOVE    B,1(AB)         ; RESTORE IHEADER\r
1412         POPJ    P,\r
1413 \f\r
1414 ; EMERGENCY, CANT DEFER ME!!\r
1415 \r
1416 MQUOTE INTERRUPT\r
1417 \r
1418 EMERGENCY:\r
1419         PUSH    P,.\r
1420         JRST    INTERR+1\r
1421 \r
1422 MFUNCTION INTERRUPT,SUBR\r
1423 \r
1424         PUSH    P,[0]\r
1425 \r
1426         ENTRY\r
1427 \r
1428         SETZM   INTHLD          ; RE-ENABLE THE WORLD\r
1429         JUMPGE  AB,TFA\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
1433         JRST    GTHEAD\r
1434         CAIN    A,TATOM\r
1435         JRST    .+3\r
1436         CAIE    A,TCHSTR        ; SKIP IF CHAR STRING\r
1437         JRST    WTYP1\r
1438         MOVEI   B,(AB)          ; LOOK UP NAME\r
1439         PUSHJ   P,FNDNM         ; GET NAME\r
1440         JUMPE   B,IFALSE\r
1441         MOVEI   D,0\r
1442         CAMN    B,MQUOTE CHAR,CHAR,INTRUP\r
1443         PUSHJ   P,CHNGT1\r
1444         CAME    B,MQUOTE READ,READ,INTRUP\r
1445         CAMN    B,MQUOTE WRITE,WRITE,INTRUP\r
1446         PUSHJ   P,GTLOC1\r
1447         PUSHJ   P,INTASO\r
1448         JUMPE   B,IFALSE\r
1449 \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
1456         JRST    DEFERR\r
1457         MOVEM   A,(P)\r
1458         PUSH    TP,$TINTH       ; SAVE HEADER\r
1459         PUSH    TP,B\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
1463         PUSH    TP,(AB)\r
1464         PUSH    TP,1(AB)\r
1465         AOJA    A,PSHARG\r
1466 QUEU1:  PUSHJ   P,IEVECT        ; GET VECTOR\r
1467         PUSH    TP,$TVEC\r
1468         PUSH    TP,[0]          ; WILL HOLD QUEUE HEADER\r
1469         PUSH    TP,A\r
1470         PUSH    TP,B\r
1471 \r
1472         POP     P,A             ; RESTORE PRIORITY\r
1473 \r
1474         MOVE    B,QUEUES+1(TVP) ; GET INTERRUPT QUEUES\r
1475         MOVEI   D,0\r
1476         JUMPGE  B,GQUEU         ; MAKE A QUEUE HDR\r
1477 \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
1481         JRST    GQUEU\r
1482         MOVE    D,B\r
1483         MOVE    B,3(B)          ; GO TO NXT QUEUE\r
1484         JUMPL   B,NXTQU\r
1485 \r
1486 GQUEU:  PUSH    TP,$TVEC        ; SAVE NEXT POINTER\r
1487         PUSH    TP,D\r
1488         PUSH    TP,$TFIX\r
1489         PUSH    TP,A            ; SAVE PRIORITY\r
1490         PUSH    TP,$TVEC\r
1491         PUSH    TP,B\r
1492         PUSH    TP,$TLIST\r
1493         PUSH    TP,[0]\r
1494         PUSH    TP,$TLIST\r
1495         PUSH    TP,[0]\r
1496         MOVEI   A,4\r
1497         PUSHJ   P,IEVECT\r
1498         MOVE    D,(TP)          ; NOW SPLICE\r
1499         SUB     TP,[2,,2]\r
1500         JUMPN   D,GQUEU1\r
1501         MOVEM   B,QUEUES+1(TVP)\r
1502         JRST    .+2\r
1503 GQUEU1: MOVEM   B,3(D)\r
1504 \r
1505 ADDQU:  MOVEM   B,-2(TP)        ; SAVE QUEU HDR\r
1506         POP     TP,D\r
1507         POP     TP,C\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
1512         MOVEM   B,7(C)\r
1513         SKIPN   5(C)            ; SKIP IF START EXISTS\r
1514         MOVEM   B,5(C)\r
1515 \r
1516 IFINI:  MOVSI   A,TATOM\r
1517         MOVE    B,MQUOTE T\r
1518         JRST    FINIS\r
1519 \r
1520 SETPRI: EXCH    A,CURPRI\r
1521         MOVEM   A,(P)\r
1522 \r
1523         PUSH    TP,$TAB         ; PASS AB TO HANDLERS\r
1524         PUSH    TP,AB\r
1525 \r
1526         PUSHJ   P,RUNINT        ; RUN THE HANDLERS\r
1527         POP     P,A             ; UNQUEU ANY WAITERS\r
1528         PUSHJ   P,UNQUEU\r
1529 \r
1530         JRST    IFINI\r
1531 \r
1532 ; HERE TO UNQUEUE WAITING INTERRUPTS\r
1533 \r
1534 UNQUEU: PUSH    P,A             ; SAVE NEW LEVEL\r
1535 \r
1536 UNQUE1: MOVE    A,(P)           ; TARGET LEVEL\r
1537         CAMLE   A,CURPRI        ; CHECK RUG NOT PULLED OUT\r
1538         JRST    UNDONE\r
1539         SKIPE   B,QUEUES+1(TVP)\r
1540         CAML    A,1(B)          ; RIGHT LEVEL?\r
1541         JRST    UNDONE          ; FINISHED\r
1542 \r
1543         SKIPN   C,5(B)          ; ON QUEUEU?\r
1544         JRST    UNXQ\r
1545         HRRZ    D,(C)           ; CDR THE LIST\r
1546         MOVEM   D,5(B)\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
1552 \r
1553         MOVE    B,1(D)          ; INT HEADER\r
1554         PUSH    TP,$TVEC\r
1555         PUSH    TP,D            ; AND ARGS\r
1556 \r
1557         PUSHJ   P,RUNINT        ; RUN THEM\r
1558         JRST    UNQUE1\r
1559 \r
1560 UNDONE: POP     P,CURPRI        ; SET CURRENT LEVEL\r
1561         MOVE    A,CURPRI\r
1562         POPJ    P,\r
1563 \r
1564 UNXQ:   MOVE    B,3(B)          ; GO  TO NEXT QUEUE\r
1565         MOVEM   B,QUEUES+1(TVP)\r
1566         JRST    UNQUE1\r
1567 \r
1568 \r
1569 \r
1570 ; SUBR TO CHANGE INTERRUPT LEVEL\r
1571 \r
1572 MFUNCTION INTLEV,SUBR,[INT-LEVEL]\r
1573         ENTRY\r
1574         JUMPGE  AB,RETLEV       ; JUST RETURN CURRENT\r
1575         GETYP   A,(AB)\r
1576         CAIE    A,TFIX\r
1577         JRST    WTYP1           ; LEVEL IS FIXED\r
1578         SKIPGE  A,1(AB)\r
1579         JRST    OUTRNG"\r
1580         CAMN    A,CURPRI        ; DIFFERENT?\r
1581         JRST    RETLEV          ; NO RETURN\r
1582         PUSH    P,CURPRI\r
1583         CAMG    A,CURPRI        ; SKIP IF NO UNQUEUE NEEDED\r
1584         PUSHJ   P,UNQUEU\r
1585         MOVEM   A,CURPRI        ; SAVE\r
1586         POP     P,A\r
1587         SKIPA   B,A\r
1588 RETLEV: MOVE    B,CURPRI\r
1589         MOVSI   A,TFIX\r
1590         JRST    FINIS\r
1591 \r
1592 RUNINT: PUSH    TP,$THAND       ; SAVE HANDLERS LIST\r
1593         PUSH    TP,IHNDLR+1(B)\r
1594 \r
1595         SKIPN   ISTATE+1(B)     ; SKIP IF DISABLED\r
1596         SKIPN   B,(TP)\r
1597         JRST    SUBTP4\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
1601         PUSH    TP,[0]\r
1602         PUSH    TP,[0]\r
1603         MOVEI   C,1             ; COUNT ARGS\r
1604         PUSH    TP,$TSP\r
1605         PUSH    TP,SP\r
1606         MOVE    D,PVP\r
1607         ADD     D,[1STEPR,,1STEPR]\r
1608         PUSH    TP,BNDV\r
1609         PUSH    TP,D\r
1610         PUSH    TP,$TPVP\r
1611         PUSH    TP,[0]\r
1612         MOVE    E,TP\r
1613         PUSH    TP,INTFCN(B)\r
1614         PUSH    TP,INTFCN+1(B)\r
1615         ADD     A,[2,,2]\r
1616         JUMPGE  A,DO.HND\r
1617         PUSH    TP,(A)\r
1618         PUSH    TP,1(A)\r
1619         AOJA    C,.-4\r
1620 DO.HND: PUSH    P,C\r
1621         PUSHJ   P,SPECBE        ; BIND 1 STEP FLAG\r
1622         POP     P,C\r
1623         ACALL   C,INTAPL\r
1624         MOVE    SP,-4(TP)\r
1625         MOVE    C,(TP)          ; RESET 1 STEP\r
1626         MOVEM   C,1STEPR+1(PVP)\r
1627         SUB     TP,[6,,6]\r
1628         PUSHJ   P,CHUNSW\r
1629         CAMN    E,PVP\r
1630         SUB     TP,[4,,4]       ; NO PROCESS CHANGE, POP JUNK\r
1631         CAMN    E,PVP\r
1632         JRST    .+4\r
1633         MOVE    D,TPSTO+1(E)\r
1634         SUB     D,[4,,4]\r
1635         MOVEM   D,TPSTO+1(E)    ; FIXUP HIS STACK\r
1636 DO.H1:  GETYP   A,A             ; CHECK FOR A DISMISS\r
1637         CAIN    A,TDISMI\r
1638         JRST    SUBTP4\r
1639         MOVE    B,(TP)          ; TRY FOR NEXT HANDLER\r
1640         SKIPE   B,INXT+1(B)\r
1641         JRST    NXHND\r
1642 SUBTP4: SUB     TP,[4,,4]\r
1643         POPJ    P,\r
1644 \r
1645 MFUNCTION INTAPL,SUBR,[RUNINT]\r
1646         JRST    APPLY\r
1647 \r
1648 \r
1649 NOHAND: JUMPE   C,NOHAN1\r
1650         PUSH    TP,$TATOM\r
1651         PUSH    TP,EQUOTE INTERNAL-INTERRUPT\r
1652 NOHAN1: PUSH    TP,(AB)\r
1653         PUSH    TP,1(AB)\r
1654         PUSH    TP,$TATOM\r
1655         PUSH    TP,EQUOTE NOT-HANDLED\r
1656         SKIPE   A,C\r
1657         MOVEI   A,1\r
1658         ADDI    A,2\r
1659         JRST    CALER\r
1660 \r
1661 DEFERR: PUSH    TP,$TATOM\r
1662         PUSH    TP,EQUOTE ATTEMPT-TO-DEFER-UNDEFERABLE-INTERRUPT\r
1663         PUSH    TP,$TINTH\r
1664         PUSH    TP,B\r
1665         PUSH    TP,$TATOM\r
1666         PUSH    TP,MQUOTE INTERRUPT\r
1667         MCALL   3,RERR          ; FORCE REAL ERROR\r
1668         JRST    FINIS\r
1669 \r
1670 ; FUNCTION TO DISMISS AN INTERRUPT TO AN ARBITRARY ACTIVATION\r
1671 \r
1672 MFUNCTION DISMISS,SUBR\r
1673 \r
1674         HLRZ    0,AB\r
1675         JUMPGE  AB,TFA\r
1676         CAIGE   0,-6\r
1677         JRST    TMA\r
1678         MOVNI   D,1\r
1679         CAIE    0,-6\r
1680         JRST    DISMI3\r
1681         GETYP   0,4(AB)\r
1682         CAIE    0,TFIX\r
1683         JRST    WTYP\r
1684         SKIPGE  D,5(AB)\r
1685         JRST    OUTRNG\r
1686 \r
1687 DISMI3: MOVEI   A,(TB)\r
1688 \r
1689 DISMI0: HRRZ    B,FSAV(A)\r
1690         HRRZ    C,PCSAV(A)\r
1691         CAIE    B,INTAPL\r
1692         JRST    DISMI1\r
1693 \r
1694         MOVE    E,OTBSAV(A)\r
1695         MOVEI   0,(A)           ; SAVE FRAME\r
1696         MOVEI   A,DISMI2\r
1697         HRRM    A,PCSAV(E)      ; GET IT BACK HERE\r
1698         MOVE    A,(AB)\r
1699         MOVE    B,1(AB)\r
1700         MOVE    C,TPSAV(E)\r
1701         MOVEM   A,-7(C)\r
1702         MOVEM   B,-6(C)\r
1703         MOVEI   C,0\r
1704         CAMGE   AB,[-3,,]\r
1705         MOVEI   C,2(AB)\r
1706         MOVE    B,0             ; DEST FRAME\r
1707         JUMPL   D,.+3\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
1712 \r
1713 DISMI1: MOVEI   E,(A)\r
1714         HRRZ    A,OTBSAV(A)\r
1715         JUMPN   A,DISMI0\r
1716 \r
1717         MOVE    A,(AB)\r
1718         MOVE    B,1(AB)\r
1719 \r
1720         PUSH    TP,A\r
1721         PUSH    TP,B\r
1722         SKIPGE  A,D\r
1723         JRST    .+4\r
1724         CAMG    A,CURPRI\r
1725         PUSHJ   P,UNQUEU\r
1726         MOVEM   A,CURPRI\r
1727         CAML    AB,[-3,,]\r
1728         JRST    .+5\r
1729         PUSH    TP,2(AB)\r
1730         PUSH    TP,3(AB)\r
1731         MCALL   2,ERRET\r
1732         JRST    FINIS\r
1733 \r
1734         POP     TP,B\r
1735         POP     TP,A\r
1736         JRST    FINIS\r
1737 \r
1738 DISMI2: MOVE    C,(TP)\r
1739         MOVEM   C,1STEPR+1(PVP)\r
1740         MOVE    SP,-4(TP)\r
1741         SUB     TP,[6,,6]\r
1742         PUSHJ   P,CHUNSW        ; UNDO ANY PROCESS HACKING\r
1743         MOVE    C,TP\r
1744         CAME    E,PVP           ; SWAPED?\r
1745         MOVE    C,TPSTO+1(E)\r
1746         MOVE    D,-1(C)\r
1747         MOVE    0,(C)\r
1748         SUB     TP,[4,,4]\r
1749         SUB     C,[4,,4]        ; MAYBE FIXUP OTHER STACK\r
1750         CAME    E,PVP\r
1751         MOVEM   C,TPSTO+1(E)\r
1752         PUSH    TP,D\r
1753         PUSH    TP,0\r
1754         PUSH    TP,A\r
1755         PUSH    TP,B\r
1756         MOVE    A,-1(P)         ; SAVED PRIORITY\r
1757         CAMG    A,CURPRI\r
1758         PUSHJ   P,UNQUEU\r
1759         MOVEM   A,CURPRI\r
1760         SKIPN   -1(TP)\r
1761         JRST    .+3\r
1762         MCALL   2,ERRET\r
1763         JRST    FINIS\r
1764 \r
1765         SUB     TP,[4,,4]\r
1766         MOVSI   A,TDISMI\r
1767         MOVE    B,MQUOTE T\r
1768         JRST    DO.H1\r
1769         \r
1770 CHNGT1: HLRE    B,AB\r
1771         SUBM    AB,B\r
1772         GETYP   0,-2(B)\r
1773         CAIE    0,TCHAN\r
1774         JRST    WTYP3\r
1775         MOVE    B,-1(B)\r
1776         MOVSI   A,TCHAN\r
1777         POPJ    P,\r
1778 \r
1779 GTLOC1: GETYP   A,2(AB)\r
1780         PUSHJ   P,LOCQ\r
1781         JRST    WTYP2\r
1782         MOVE    D,B             ; RET ATOM FOR ASSOC\r
1783         MOVE    A,2(AB)\r
1784         MOVE    B,3(AB)\r
1785         POPJ    P,\r
1786 \f; MONITOR CHECKERS\r
1787 \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
1791         PUSH    P,0\r
1792         MOVEI   0,(B)\r
1793         CAIL    0,HIBOT\r
1794         JRST    PURERR\r
1795         POP     P,0\r
1796         TLNN    0,.WRMON        ; SKIP IF WRITE MONIT\r
1797         POPJ    P,\r
1798 \r
1799 ; MONITOR IS ON, INVOKE HANDLER\r
1800 \r
1801         PUSH    TP,A            ; SAVE OBJ\r
1802         PUSH    TP,B\r
1803         PUSH    TP,C\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
1807         PUSHJ   P,IGET\r
1808         JUMPE   B,MONCH1        ; NOT FOUND IGNORE FOR NOW\r
1809         PUSH    TP,A            ; START SETTING UP CALL\r
1810         PUSH    TP,B\r
1811         PUSH    TP,-5(TP)\r
1812         PUSH    TP,-5(TP)\r
1813         PUSH    TP,-5(TP)\r
1814         PUSH    TP,-5(TP)\r
1815         PUSHJ   P,FRMSTK        ; PUT FRAME ON STAKC\r
1816         MCALL   4,EMERGE        ; DO IT\r
1817 MONCH1: POP     TP,D\r
1818         POP     TP,C\r
1819         POP     TP,B\r
1820         POP     TP,A\r
1821         HLLZ    0,(B)           ; UPDATE MONITORS\r
1822         TLZ     0,TYPMSK\r
1823         IOR     C,0\r
1824         POPJ    P,\r
1825 \r
1826 ; NOW FOR READ MONITORS\r
1827 \r
1828 RMONC0: HLLZ    0,(B)\r
1829 RMONCH: TLNN    0,.RDMON\r
1830         POPJ    P,\r
1831         PUSH    TP,A\r
1832         PUSH    TP,B\r
1833         MOVSI   C,TATOM\r
1834         MOVE    D,MQUOTE READ,READ,INTRUP\r
1835         PUSHJ   P,IGET\r
1836         JUMPE   B,RMONC1\r
1837         PUSH    TP,A\r
1838         PUSH    TP,B\r
1839         PUSH    TP,-3(TP)\r
1840         PUSH    TP,-3(TP)\r
1841         PUSHJ   P,FRMSTK        ; PUT FRAME ON STACK\r
1842         MCALL   3,EMERGE\r
1843 RMONC1: POP     TP,B\r
1844         POP     TP,A\r
1845         POPJ    P,\r
1846 \r
1847 ; PUT THE CURRENT FRAME ON THE STACK\r
1848 \r
1849 FRMSTK: PUSHJ   P,MAKACT\r
1850         HRLI    A,TFRAME\r
1851         PUSH    TP,A\r
1852         PUSH    TP,B\r
1853         POPJ    P,\r
1854 \r
1855 ; HERE TO COMPLAIN ABOUT ATTEMPTS TO MUNG PURE CODE\r
1856 \r
1857 PURERR: PUSH    TP,$TATOM\r
1858         PUSH    TP,EQUOTE ATTEMPT-TO-MUNG-PURE-STRUCTURE\r
1859         PUSH    TP,A\r
1860         PUSH    TP,B\r
1861         MOVEI   A,2\r
1862         JRST    CALER\r
1863 \f\r
1864 ; PROCESS SWAPPING CODE\r
1865 \r
1866 CHSWAP: MOVE    E,PVP           ; GET CURRENT\r
1867         POP     P,0\r
1868         SKIPE   D,INTPRO+1(B)   ; SKIP IF NO PROCESS GIVEN\r
1869         CAMN    D,PVP           ; SKIP IF DIFFERENT\r
1870         JRST    PSHPRO\r
1871         \r
1872         PUSHJ   P,SWAPIT        ; DO SWAP\r
1873 \r
1874 PSHPRO: PUSH    TP,$TPVP\r
1875         PUSH    TP,E\r
1876         JRST    @0\r
1877 \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
1881         POPJ    P,\r
1882 \r
1883 SWAPIT: PUSH    P,0\r
1884         MOVE    0,PSTAT+1(D)    ; CHECK STATE\r
1885         CAIE    0,RESMBL\r
1886         JRST    NOTRES\r
1887         MOVEM   0,PSTAT+1(PVP)\r
1888         MOVEI   0,RUNING\r
1889         MOVEM   0,PSTAT+1(D)    ; SAVE NEW STATE\r
1890         POP     P,0\r
1891         POP     P,C\r
1892         JRST    SWAP"\r
1893 \f\r
1894 \r
1895 ;SUBROUTINE TO GET BIT FOR CLOBBERAGE\r
1896 \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
1901 \r
1902 ;HERE TO HANDLE PDL OVERFLOW.  ASK FOR A GC\r
1903 \r
1904 IPDLOV:\r
1905 IFN ITS,[\r
1906         MOVEM   A,TSINT         ;SAVE INT WORD\r
1907 ]\r
1908 \r
1909         SKIPE   GCFLG           ;IS GC RUNNING?\r
1910         JRST    GCPLOV          ;YES, COMPLAIN GROSSLY\r
1911 \r
1912         MOVEI   A,200000        ;GET BIT TO CLOBBER\r
1913         IORM    A,PIRQ          ;LEAVE A MESSAGE FOR HIGHER LEVEL\r
1914 \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
1920         MOVEI   B,P\r
1921         MOVEI   A,(B)           ;COPY IT\r
1922         LSH     A,1             ;TIMES 2\r
1923         ADDI    A,0STO(PVP)     ;POINT TO THIS ACS CURRENT TYPE\r
1924         HLRZ    A,(A)           ;GET THAT TYPE INTO A\r
1925         CAIN    B,P             ;IS IT P\r
1926         MOVEI   B,GCPDL         ;POINT TO SAVED P\r
1927 \r
1928         CAIN    B,B             ;OR IS IT B ITSELF\r
1929         MOVEI   B,TSAVB\r
1930         CAIN    B,A             ;OR A\r
1931         MOVEI   B,TSAVA\r
1932 \r
1933         CAIN    B,C             ;OR C\r
1934         MOVEI   B,1(P)          ;C WILL BE ON THE STACK\r
1935 \r
1936         PUSH    P,C\r
1937         PUSH    P,A\r
1938 \r
1939         MOVE    A,(B)           ;GET THE LOSING POINTER\r
1940         MOVEI   C,(A)           ;AND ISOLATE RH\r
1941 \r
1942         CAMG    C,VECTOP        ;CHECK IF IN GC SPACE\r
1943         CAMG    C,VECBOT\r
1944         JRST    NOGROW          ;NO, COMPLAIN\r
1945 \r
1946 ; FALL THROUGH\r
1947 \f\r
1948 \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
1953         MOVEI   D,0\r
1954         CAIN    C,TPDL          ; POIN TD TO APPROPRIATE DOPE WORD\r
1955         MOVEI   D,PGROW\r
1956         CAIN    C,TTP\r
1957         MOVEI   D,TPGROW\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
1963         JRST    PDLOSS\r
1964         POP     P,D             ; RESTORE D\r
1965 \r
1966 \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
1970 \r
1971         POP     P,C             ;RESTORE THE WORLD\r
1972         EXCH    P,GCPDL         ;GET BACK ORIG PDL\r
1973 IFN ITS,[\r
1974         MOVE    A,TSINT         ;RESTORE INT WORD\r
1975 \r
1976         JRST    IMPCH           ;LOOK FOR MORE INTERRUPTS\r
1977 ]\r
1978 IFE ITS,        JRST    GCQUIT\r
1979 \r
1980 TPOVFL: SETOM   INTFLG          ;SIMULATE PDL OVFL\r
1981         PUSH    P,A\r
1982         MOVEI   A,200000        ;TURN ON THE BIT\r
1983         IORM    A,PIRQ\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
1988         SKIPN   TPGROW\r
1989         HRRZM   A,TPGROW\r
1990         CAME    A,TPGROW        ; MAKE SURE WINNAGE\r
1991         JRST    PDLOSS\r
1992         POP     P,A\r
1993         POPJ    P,\r
1994 \r
1995 \r
1996 ; GROW CORE IF PDL OVERFLOW DURING GC\r
1997 \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
2005         ADD     P,[-2000,,0]\r
2006 IFE ITS,        JRST    GCQUIT\r
2007 IFN ITS,[\r
2008         MOVE    A,TSINT\r
2009         JRST    IMPCH\r
2010 \r
2011 \r
2012 SLPCOR: MOVEI   B,1\r
2013         .SLEEP  B,\r
2014         JRST    GRECOR\r
2015 \r
2016 ]\r
2017 \f\r
2018 IFN ITS,[\r
2019 \r
2020 ;HERE TO HANDLE LOW-LEVEL CHANNELS\r
2021 \r
2022 \r
2023 CHNACT: SKIPN   GCFLG           ;GET A WINNING PDL\r
2024         EXCH    P,GCPDL\r
2025         ANDI    A,177777        ;ISOLATE CHANNEL BITS\r
2026         PUSH    P,0             ;SAVE\r
2027 \r
2028 CHNA1:  MOVEI   B,0             ;BIT COUNTER\r
2029         JFFO    A,.+2           ;COUNT\r
2030         JRST    CHNA2\r
2031         SUBI    B,35.           ;NOW HAVE CHANNEL\r
2032         MOVMS   B               ;PLUS IT\r
2033         MOVEI   0,1\r
2034         LSH     0,(B)\r
2035         ANDCM   A,0\r
2036         MOVEI   0,(B)           ; COPY TO 0\r
2037         LSH     0,23.           ;POSITION FOR A .STATUS\r
2038         IOR     0,[.STATUS 0]\r
2039         XCT     0               ;DO IT\r
2040         ANDI    0,77            ;ISOLATE DEVICE\r
2041         CAILE   0,2\r
2042         JRST    CHNA1\r
2043 \r
2044 PMIN4:  MOVE    0,B             ; CHAN TO 0\r
2045         .ITYIC  0,              ; INTO 0\r
2046         JRST    .+2             ; DONE, GO ON\r
2047         JRST    PMIN4\r
2048         SETZM   GCFLCH          ; LEAVE GC MODE\r
2049         JRST    CHNA1\r
2050 \r
2051 CHNA2:  POP     P,0\r
2052         SKIPN   GCFLG\r
2053         EXCH    P,GCPDL\r
2054         JRST    GCQUIT\r
2055 \r
2056 HOWMNY: SETZ\r
2057         SIXBIT /LISTEN/\r
2058         D\r
2059         402000,,B\r
2060 ]\r
2061 \r
2062 MFUNCTION GASCII,SUBR,ASCII\r
2063         ENTRY   1\r
2064 \r
2065         GETYP   A,(AB)\r
2066         CAIE    A,TCHRS\r
2067         JRST    TRYNUM\r
2068 \r
2069         MOVE    B,1(AB)\r
2070         MOVSI   A,TFIX\r
2071         JRST    FINIS\r
2072 \r
2073 TRYNUM: CAIE    A,TFIX\r
2074         JRST    WTYP1\r
2075         SKIPGE  B,1(AB)         ;GET NUMBER\r
2076         JRST    TOOBIG\r
2077         CAILE   B,177           ;CHECK RANGE\r
2078         JRST    TOOBIG\r
2079         MOVSI   A,TCHRS\r
2080         JRST    FINIS\r
2081 \r
2082 TOOBIG: PUSH    TP,$TATOM\r
2083         PUSH    TP,EQUOTE ARGUMENT-OUT-OF-RANGE\r
2084         JRST    CALER1\r
2085 \r
2086 \f\r
2087 ;HERE IF PDL OVERFLOW DURING GARBAGE COLLECTION\r
2088 \r
2089 BADPDL: FATAL   NON PDL OVERFLOW\r
2090 \r
2091 NOGROW: FATAL   PDL OVERFLOW ON NON EXPANDABLE PDL\r
2092 \r
2093 PDLOSS: FATAL   PDL OVEFLOW BUFFER EXHAUSTED\r
2094 \r
2095 DLOSER: PUSH    P,LOSRS(B)\r
2096         MOVE    A,TSAVA\r
2097         MOVE    B,TSAVB\r
2098         POPJ    P,\r
2099 \r
2100 LOSRS:  IMPV\r
2101         ILOPR\r
2102         IOC\r
2103         IPURE\r
2104 \r
2105 \r
2106 ;MEMORY PROTECTION INTERRUPT\r
2107 \r
2108 IOC:    FATAL   IO CHANNEL ERROR IN GARBAGE COLLECTOR\r
2109 IMPV:   FATAL   MPV IN GARBAGE COLLECTOR\r
2110 \r
2111 IPURE:  FATAL   PURE WRITE IN GARBAGE COLLECTOR\r
2112 ILOPR:  FATAL   ILLEGAL OPEREATION IN GARBAGE COLLECTOR\r
2113 \r
2114 IFN ITS,[\r
2115 \r
2116 ;SUBROUTINE TO BE CALLED AT INITIALIZE TIME TO SETUP INTS\r
2117 \r
2118 INTINT: SETZM   CHNCNT\r
2119         MOVE    A,[CHNCNT,,CHNCNT+1]\r
2120         BLT     A,CHNCNT+16.\r
2121         SETZM   INTFLG\r
2122         .SUSET  [.SPICLR,,[-1]]\r
2123         MOVE    A,MASK1         ;SET MASKS\r
2124         MOVE    B,MASK2\r
2125         .SETM2  A,              ;SET BOTH MASKS\r
2126         MOVSI   A,TVEC\r
2127         MOVEM   A,QUEUES(TVP)\r
2128         SETZM   QUEUES+1(TVP)   ;UNQUEUE ANY OLD INTERRUPTS\r
2129         SETZM   CURPRI\r
2130         POPJ    P,\r
2131 ]\r
2132 IFE ITS,[\r
2133 \r
2134 ; INITIALIZE TENEX INTERRUPT SYSTEM\r
2135 \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
2148         ATI                     ; ACTIVATE IT\r
2149         MOVE    A,[23,,1]       ; CNTL S AND CHANNEL 1\r
2150         ATI                     ; ACTIVATE IT\r
2151         MOVEI   A,MFORK         ; DO THE ENABLE\r
2152         EIR\r
2153         POPJ    P,\r
2154 ]\r
2155 \f\r
2156 \r
2157 ; CNTL-G HANDLER\r
2158 \r
2159 MFUNCTION QUITTER,SUBR\r
2160 \r
2161         ENTRY   2\r
2162         GETYP   A,(AB)\r
2163         CAIE    A,TCHRS\r
2164         JRST    WTYP1\r
2165         GETYP   A,2(AB)\r
2166         CAIE    A,TCHAN\r
2167         JRST    WTYP2\r
2168         MOVE    B,1(AB)\r
2169         MOVE    A,(AB)\r
2170         CAIN    B,^S            ; HANDLE CNTL-S\r
2171         JRST    RETLIS\r
2172         CAIE    B,7\r
2173         JRST    FINIS\r
2174 \r
2175         PUSHJ   P,CLEAN         ; CLEAN UP I/O CHANNELS\r
2176         PUSH    TP,$TATOM\r
2177         PUSH    TP,EQUOTE CONTROL-G?\r
2178         MCALL   1,ERROR\r
2179         JRST    FINIS\r
2180 \r
2181 RETLIS: MOVEI   D,(TB)          ; FIND A LISTEN OR ERROR TO RET TO\r
2182 \r
2183 RETLI1: HRRZ    A,OTBSAV(D)\r
2184         HRRZ    C,FSAV(A)       ; CHECK FUNCTION\r
2185         CAIE    C,LISTEN\r
2186         CAIN    C,ERROR         ; FOUND?\r
2187         JRST    FNDHIM          ; YES, GO TO SAME\r
2188         CAIN    C,ERROR%        ; FUNNY ERROR\r
2189         JRST    FNDHIM\r
2190         CAIN    C,TOPLEV        ; NO ERROR/LISTEN\r
2191         JRST    FINIS\r
2192         MOVEI   D,(A)\r
2193         JRST    RETLI1\r
2194 \r
2195 FNDHIM: PUSH    TP,$TTB\r
2196         PUSH    TP,D\r
2197         PUSHJ   P,CLEAN\r
2198         MOVE    B,(TP)          ; NEW FRAME\r
2199         SUB     TP,[2,,2]\r
2200         MOVEI   C,0\r
2201         PUSHJ   P,CHUNW         ; UNWIND?\r
2202         MOVSI   A,TATOM\r
2203         MOVE    B,MQUOTE T\r
2204         JRST    FINIS\r
2205 \r
2206 CLEAN:  MOVE    B,3(AB)         ; GET IN CHAN\r
2207         PUSHJ   P,RRESET\r
2208         MOVE    B,3(AB)         ; CHANNEL BAKC\r
2209         MOVE    C,BUFRIN(B)\r
2210         SKIPN   C,ECHO(C)       ; GET ECHO\r
2211         JRST    CLUNQ\r
2212 IFN ITS,[\r
2213         MOVEI   A,2\r
2214         CAMN    C,[PUSHJ P,MTYO]\r
2215         JRST    TYONUM\r
2216         LDB     A,[270400,,C]\r
2217 TYONUM: LSH     A,23.\r
2218         IOR     A,[.RESET]\r
2219         XCT     A\r
2220 ]\r
2221 IFE ITS,[\r
2222         MOVEI   A,101           ; OUTPUT JFN\r
2223         CFOBF\r
2224 ]\r
2225 \r
2226 CLUNQ:  SETZB   A,CURPRI\r
2227         JRST    UNQUEU\r
2228 \r
2229 \f\r
2230 IMPURE\r
2231 ONINT:  0               ; INT FUDGER\r
2232 IFN ITS,[\r
2233 ;RANDOM IMPURE CRUFT NEEDED\r
2234 CHNCNT: BLOCK   16.     ; # OF CHARS IN EACH CHANNEL\r
2235 \r
2236 TSAVA:  0\r
2237 TSAVB:  0\r
2238 PIRQ:   0                       ;HOLDS REQUEST BITS FOR 1ST WORD\r
2239 PIRQ2:  0                       ;SAME FOR WORD 2\r
2240 PCOFF:  0\r
2241 MASK1:  1200,,220540                    ;FIRST MASK\r
2242 MASK2:  0                       ;SECOND THEREOF\r
2243 CURPRI: 0               ; CURRENT PRIORITY\r
2244 ]\r
2245 IFE ITS,[\r
2246 NETJFN: BLOCK   NNETS\r
2247 MASK1:  CHNMSK\r
2248 TSINTR:\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
2252 CURPRI: 0\r
2253 TSAVA:  0\r
2254 TSAVB:  0\r
2255 PIRQ:   0\r
2256 PIRQ2:  0\r
2257 ]\r
2258 PURE\r
2259 \r
2260 END\r
2261 \f