Twenex Muddle.
[pdp10-muddle.git] / <mdl.int> / interr.mid.419
1
2 TITLE INTERRUPT HANDLER FOR MUDDLE
3
4 RELOCATABLE
5
6 ;C. REEVE  APRIL 1971
7
8 .INSRT MUDDLE >
9
10 SYSQ
11 XJRST=JRST 5,
12
13 F==PVP
14 G==TVP
15
16 IF1,[
17 IFE ITS,.INSRT STENEX >
18 ]
19
20 PDLGRO==10000   ;AMOUNT TO GROW A PDL THAT LOSES
21 NINT==72.       ;MAXIMUM NUMBER OF INTERRUPTS POSSIBLE
22
23 IFN ITS,[
24 ;SET UP LOCATION 42 TO POINT TO TSINT
25
26 RMT [
27
28 ZZZ==$. ;SAVE CURRENT LOCATION
29
30 LOC 42
31
32         JSR     MTSINT          ;GO TO HANDLER
33
34 LOC ZZZ
35 ]
36 ]
37
38 ; GLOBALS NEEDED BY INTERRUPT HANDLER
39
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
64 .GLOBAL MULTSG
65
66 ; GLOBALS FOR GC
67 .GLOBAL GCTIM,GCCAUS,GCCALL,GPDLOV
68
69 ; GLOBALS FOR MONITOR ROUTINES
70
71 .GLOBAL MONCH,MONCH0,RMONCH,RMONC0,LOCQ,SMON,BAPT,APLQ,MAKACT,NAPT
72 .GLOBAL PURERR,BUFRIN,INSTAT,REALTV,DSTORE
73
74 MONITOR
75
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
79
80 ; GLOBALS FOR PRE-AGC INTERRUPT
81
82 .GLOBAL FRETOP,GCSTOP,FREMIN,CORTOP,P.CORE,PURBOT,GETNUM,GCKNUM,GCHPN,INTAGC
83 .GLOBAL SPECBIND,SSPEC1,ILVAL
84
85
86 ; GLOBALS FOR COPY/WRITE HACK FOR GCDUMP AND PURIFY
87
88 .GLOBAL GCDFLG,%CWINF,BUFGC,WNDBOT,WIND,WNDP,%SHWND,GPURFL,%FDBUF,PURMNG,RPURBT
89 .GLOBAL NPWRIT,PVSTOR,SPSTOR,OPSYS
90
91
92
93 ;BEGINNING OF ACTUAL INTERRUPT HANDLER (MUST BE IMPURE)
94
95
96 ;***** TEMP FUDGE *******
97
98 QUEUES==INTVEC
99
100 \f
101 ; DECLARATIONS ASSOCIATED WITH INTERRUPT HANDERS AND HEADERS
102
103 ; SPECIAL TABLES
104
105 SPECIN: IRP A,,[CHAR,CLOCK,MPV,ILOPR,WRITE,READ,IOC,PURE,SYSDOWN,INFERIOR,RUNT,REALT
106 PARITY]
107         MQUOTE A,[A]INTRUP
108         TERMIN
109 SPECLN==.-SPECIN
110
111 ; TABLE OF SPECIAL FINDING ROUTINES
112
113 FNDTBL: IRP A,,[GETCHN,0,0,0,LOCGET,LOCGET,0,0,0,0,0,0,0]
114         A
115         TERMIN
116
117 ; TABLE OF SPECIAL SETUP ROUTINES
118
119 INTBL:  IRP A,,[S.CHAR,S.CLOK,S.MPV,S.ILOP,S.WMON,S.RMON,S.IOC,S.PURE,S.DOWN,S.INF
120 S.RUNT,S.REAL,S.PAR]
121         A
122         S!A==.IRPCNT
123         TERMIN
124
125 IFN ITS,[
126
127 ; EXTERNAL INTERRUPT TABLE
128
129 EXTINT: REPEAT NINT-36.,0
130         REPEAT 16.,HCHAR
131         0
132         0
133         REPEAT 8.,HINF
134         REPEAT NINT-62.,0
135 EXTIND:
136
137 IRP A,,[[HCLOCK,13.],[HMPV,14.],[HILOPR,6],[HIOC,9],[HPURE,26.],[HDOWN,7],[HREAL,35.]
138 [HRUNT,34.],[HPAR,28.]]
139         IRP B,C,[A]
140         LOC EXTINT+C
141         B
142         .ISTOP
143         TERMIN
144 TERMIN
145
146
147 LOC EXTIND
148 ]
149 \f
150 IFE ITS,[
151
152 ; TABLES FOR TENEX INTERRUPT SYSTEM
153
154 LEVTAB: P1              ; POINTS TO INT PC HOLDERS FOR LEVS 1,2 AND 3
155         P2
156         P3
157
158 CHNMSK==700000,,7       ; WILL BE MASK WORD FOR INT SET UP
159 MFORK==400000
160 NNETS==7                ; ALLOW 7 NETWRK INTERRUPTS
161 UINTS==4
162 NETCHN==36.-NNETS-UINTS-1
163 NCHRS==6
164 RLCHN==36.-NNETS-UINTS
165
166 RMT [
167 IMPURE                  ; IMPURE BECAUSE IT CHANGES IN MULTI-SECTION MODE
168 CHNTAB:                 ; LOCATION OF INT ROUTINES FOR VARIOUS "CHANNELS"
169
170 REPEAT NCHRS,   1,,INTCHR+3*.RPCNT
171         BLOCK   36.-NNETS-NCHRS-UINTS-1 ; THERE ARE 36. TENEX INT CHANNELS
172
173 REPEAT NNETS+UINTS, 1,,INTNET+3*.RPCNT
174
175 IRP A,,[[9.,TNXPDL],[17.,PWRIT],[10.,TNXEOF],[11.,TNXIOC],[12.,TNXFUL]
176 [RLCHN,TNXRLT],[19.,TNXINF]]
177         IRP B,C,[A]
178         LOC CHNTAB+B
179         1,,C
180         CHNMSK==CHNMSK+<1_<35.-B>>
181         .ISTOP
182         TERMIN
183 TERMIN
184 LOC CHNTAB+36.
185 PURE
186 ]
187 EXTINT:
188 BLOCK 36.
189 REPEAT NCHRS,SETZ HCHAR
190 BLOCK NINT-NNETS-NCHRS-UINTS-36.-1
191 REPEAT NNETS,SETZ HNET
192 REPEAT UINTS,SETZ USRINT
193 LOC EXTINT+NINT-12.
194 REPEAT 3,SETZ HIOC
195 LOC EXTINT+NINT-RLCHN-1
196 SETZ HREAL
197 LOC EXTINT+NINT-19.-1
198 SETZ HINF
199 LOC EXTINT+NINT
200 ]
201
202
203 ; HANDLER/HEADER PARAMETERS
204
205 ; HEADER BLOCKS
206
207 IHDRLN==4               ; LENGTH OF HEADER BLOCK
208
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
213
214 IHANDL==4               ; LENGTH OF A HANDLER BLOCK
215
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
220
221 IFN ITS,[
222 RMT [
223 IMPURE
224 TSINT:
225 MTSINT: 0                       ;INTERRUPT BITS GET STORED HERE
226 TSINTR: 0                       ;INTERRUPT PC WORD STORED HERE
227         JRST    TSINTP          ;GO TO PURE CODE
228
229 ; SOFTWARE INTERNAL INTERRUPTS JSR TO HERE
230
231 LCKINT: 0
232         JRST    DOINT
233
234 PURE
235 ]
236 ]
237 IFE ITS,[
238 RMT [
239 ; JSR HERE FOR SOFTWARE INTERNAL INTERRUPTS
240
241 IMPURE
242 LCKINT: 0
243         JRST    DOINT
244 PURE
245 ]
246 ]
247 \f
248
249 IFN ITS,[
250
251 ;THE REST OF THIS CODE IS PURE
252
253 TSINTP: SOSGE   INTFLG          ; SKIP IF ENABLED
254         SETOM   INTFLG          ;DONT GET LESS THAN -1
255
256         SKIPE   INTBCK          ; ANY INT HACKS?
257         JRST    PCLOSR          ; DO A PC-LOSR ON THE PROGRAM
258         MOVEM   A,TSAVA         ;SAVE TWO ACS
259         MOVEM   B,TSAVB
260         MOVE    A,TSINT         ;PICK UP INT BIT PATTERN
261         JUMPL   A,2NDWORD       ;DONT CHECK FOR PDL OVERFLOW ETC. IF SIGN BIT ON
262
263         TRZE    A,200000        ;IS THIS A PDL OVERFLOW?
264         JRST    IPDLOV          ;YES, GO HANDLE IT FIRST
265
266 IMPCH:  MOVEI   B,0
267         TRNE    A,20000         ;IS IT A MEMORY PROTECTION VIOLATION?
268         MOVEI   B,1             ; FLAG SAME
269
270         TRNE    A,40            ;ILLEGAL OP CODE?
271         MOVEI   B,2             ; ALSO FLAG
272         TRNN    A,400           ; IOC?
273         JRST    .+3
274         SOS     TSINTR
275         MOVEI   B,3
276         TLNE    A,200           ; PURE?
277         JRST    GCPWRT          ; CHECK FOR PURE WRITE FOR POSSIBLE C/W
278 NOPUGC: SOJGE   B,DO.NOW                ; CANT WAIT AROUND
279
280 ;DECODE THE REST OF THE INTERRUPTS USING A TABLE
281
282 2NDWORD:
283         JUMPL   A,GC2           ;2ND WORD?
284         IORM    A,PIRQ          ;NO, INTO WORD 1
285         JRST    GCQUIT          ;AND DISMISS INT
286
287 GC2:    TLZ     A,400000        ;TURN OFF SIGN BIT
288         IORM    A,PIRQ2
289         TRNE    A,177777        ;CHECK FOR CHANNELS
290         JRST    CHNACT          ;GO IF CHANNEL ACTIVITY
291 ]
292 GCQUIT: SKIPGE  INTFLG          ;SKIP IF INTERRUPTS ENABLED
293         JRST    INTDON          ;NO, DEFER REAL HANDLING UNTIL LATER
294
295         MOVE    A,TSINTR        ;PICKUP RETURN WORD
296 IFE ITS,[
297         SKIPE   MULTSG
298          JRST   MLTEX
299         TLON    A,10000         ; EXEC PC?
300         SOJA    A,MLTEX1        ; YES FIXUP PC
301 MLTEX:  TLON    A,10000
302         SOS     TSINTR+1
303         MOVEM   A,TSINTR
304         MOVE    A,TSINTR+1
305 ]
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
309 IFE ITS,[
310         SKIPE   MULTSG
311          HRRM   A,TSINTR+1
312         SKIPN   MULTSG
313          HRRM   A,TSINTR
314 ]
315         PUSH    P,INTFLG        ;SAVE INT FLAG
316         SETOM   INTFLG          ;AND DISABLE
317
318
319 INTDON: MOVE    A,TSAVA         ;RESTORE ACS
320         MOVE    B,TSAVB
321 IFN ITS,        .DISMISS        TSINTR          ;AND DISMISS THE INTERRUPT
322 IFE ITS,        DEBRK
323
324 IFN ITS,[
325 PCLOSR: MOVEM   A,TSAVA
326         HRRZ    A,TSINTR        ; WHERE FROM
327         CAIG    A,INTBCK
328         CAILE   A,INTBEN        ; AVOID TIMING ERRORS
329         JRST    .+2
330         JRST    INTDON
331
332         SOS     A,INTBCK
333         MOVEM   A,TSINTR
334         SETZM   INTBCK
335         SETZM   INTFLG
336         AOS     INTFLG
337         MOVE    TP,TPSAV(TB)
338         MOVE    P,PSAV(TB)
339         MOVE    A,TSAVA
340         JRST    TSINTP
341 ]
342 DO.NOW: SKIPN   GPURFL
343         SKIPE   GCFLG
344         JRST    DLOSER          ; HANDLE FATAL GC ERRORS
345         MOVSI   B,1
346         SKIPGE  INTFLG          ; IF NOT ENABLED
347         MOVEM   B,INTFLG        ; PRETEND IT IS
348 IFN ITS,        JRST    2NDWORD
349 IFE ITS,        JRST    GCQUIT
350
351 IFE ITS,[
352
353 ; HERE FOR TENEX PDL OVER FLOW INTERRUPT
354
355 TNXPDL: SOSGE   INTFLG
356         SETOM   INTFLG
357         MOVEM   A,TSAVA
358         MOVEM   B,TSAVB
359         JRST    IPDLOV          ; GO TO COMMON HANDLER
360
361 ; HERE FOR REAL TIMER
362
363 TNXRLT: MOVEM   A,TSAVA
364 IFG <RLCHN-18.>,        MOVEI   A,<1_<35.-<RLCHN>>>
365 IFLE <RLCHN-18.>        MOVSI   A,(<1_<35.-<RLCHN>>>)
366
367         JRST    CNTSG
368
369 ; HERE FOR TENEX ^G AND ^S INTERRUPTS
370
371 INTCHR:
372 REPEAT NCHRS,[
373         MOVEM   A,TSAVA
374         MOVEI   A,<1_<.RPCNT>>
375         JRST    CNTSG
376 ]
377 CNTSG:  MOVEM   B,TSAVB
378         IORM    A,PIRQ2         ; SAY FOR MUDDLE LEVEL
379         SOSGE   INTFLG
380         SETOM   INTFLG
381         JRST    GCQUIT
382 INTNET:
383 REPEAT NNETS+UINTS,[
384         MOVEM   A,TSAVA
385         MOVE    A,[1_<.RPCNT+NETCHN>]
386         JRST    CNTSG
387 ]
388 TNXINF: MOVEM   A,TSAVA
389         MOVEI   A,<1_<35.-19.>>
390         JRST    TNXCHN
391
392 ; LOW LEVEL HANDLERS FOR 10X IOC INTERRUPTS
393
394 TNXEOF: MOVEM   A,TSAVA
395         MOVSI   A,(1_<35.-10.>)
396         JRST    TNXCHN
397
398 TNXIOC: MOVEM   A,TSAVA
399         MOVSI   A,(1_<35.-11.>)
400         JRST    TNXCHN
401
402 TNXFUL: MOVEM   A,TSAVA
403         MOVSI   A,(1_<35.-12.>)
404
405 TNXCHN: IORM    A,PIRQ2
406         MOVEM   B,TSAVB
407         HRRZ    A,TSAVA         ; ASSUME JFN IS IN A (PRETTY FLAKEY BUT ...)
408         MOVEM   A,IOCLOS
409         JRST    DO.NOW
410 ]
411 \f
412 ; HERE TO PROCESS INTERRUPTS
413
414 DOINT:  SKIPE   INTHLD          ; GLOBAL LOCK ON INTS
415         JRST    @LCKINT
416         SETOM   INTHLD          ; DONT LET IT HAPPEN AGAIN
417         PUSH    P,INTFLG
418 DOINTE: SKIPE   ONINT           ; ANY FUDGE?
419         XCT     ONINT           ; YEAH, TRY ONE
420         EXCH    0,LCKINT        ; RELATIVIZE PC IF FROM RSUBR
421 IFE ITS,        TLZ     0,777740        ; KILL EXCESS BITS
422         PUSH    P,0             ; AND SAVE
423         ANDI    0,-1
424         CAMG    0,PURTOP
425         CAMGE   0,VECBOT
426         JRST    DONREL
427         SUBI    0,(M)           ; M IS BASE REG
428 IFN ITS,        TLO     0,400000+M      ; INDEX IT OFF M
429 IFE ITS,[
430         TLO     0,400000+M
431         SKIPN   MULTSG
432          JRST   .+3
433         HLL     0,(P)
434         TLO     0,400000
435 ]
436         EXCH    0,(P)           ; AND RESTORE TO STACK
437 DONREL: EXCH    0,LCKINT        ; GET BACK SAVED 0
438         SETZM   INTFLG          ;DISABLE
439         AOS     -1(P)           ;INCR SAVED FLAG
440
441 ;NOW SAVE WORKING ACS
442
443         PUSHJ   P,SAVACS
444         HLRZ    A,-1(P)         ; HACK FUNNYNESS FOR MPV/ILOPR
445         SKIPE   A
446         SETZM   -1(P)           ; REALLY DISABLED
447
448 DIRQ:   MOVE    A,PIRQ          ;NOW SATRT PROCESSING
449         JFFO    A,FIRQ          ;COUNT BITS AND GO
450         MOVE    A,PIRQ2         ;1ST DONE, LOOK AT 2ND
451         JFFO    A,FIRQ2
452
453 INTDN1: SKIPN   GCHAPN          ; SKIP IF MUST DO GC INT
454         JRST    .+3
455         SETZM   GCHAPN
456         PUSHJ   P,INTOGC        ; AND INTERRUPT
457
458         PUSHJ   P,RESTAC
459
460 IFN ITS,[
461         .SUSET  [.SPICLR,,[0]]  ; DISABLE INTS
462 ]
463         POP     P,LCKINT
464         POP     P,INTFLG
465         SETZM   INTHLD          ; RE-ENABLE THE WORLD
466 IFN ITS,[
467         EXCH    0,LCKINT
468         HRRI    0,@0            ; EFFECTIVIZE THE ADDRESS
469         TLZ     0,37            ; KILL IND AND INDEX
470         EXCH    0,LCKINT
471         .DISMIS LCKINT
472 ]
473 IFE ITS,[
474         SKIPN   MULTSG
475          JRST   @LCKINT
476         XJRST   .+1             ; MAKE SURE OUT OF SECTION 0
477                 0
478                 FSEG,,.+1
479         EXCH    0,LCKINT
480         TLZE    0,400000
481          ADDI   0,(M)
482         EXCH    0,LCKINT
483         JRST    @LCKINT
484 ]
485 FIRQ:   PUSHJ   P,GETBIT        ;SET UP THE BIT TO CLOBBER IN PIRQ
486         ANDCAM  A,PIRQ          ;CLOBBER IT
487         ADDI    B,36.           ;OFSET INTO TABLE
488         JRST    XIRQ            ;GO EXECUTE
489
490 FIRQ2:  PUSHJ   P,GETBIT        ;PREPARE TO CLOBBER BIT
491         ANDCAM  A,PIRQ2         ;CLOBBER IT
492         ADDI    B,71.           ;AGAIN OFFSET INTO TABLE
493 XIRQ:
494         CAIE    B,21            ;PDL OVERFLOW?
495         JRST    FHAND           ;YES, HACK APPROPRIATELY
496
497 PDL2:   JSP     E,PDL3
498         JRST    DIRQ
499
500 PDL3:   SKIPN   A,PGROW
501         SKIPE   A,TPGROW
502         JRST    .+2
503         JRST    (E)             ; NOTHING GROWING, FALSE ALARM
504         MOVEI   B,PDLGRO_-6     ;GET GROWTH SPEC
505         DPB     B,[111100,,-1(A)]       ;STORE GROWTH SPEC
506 REAGC:  MOVE    C,[10.,,1]      ; INDICATOR FOR AGC
507         SKIPE   PGROW           ; P IS GROWING
508         ADDI    C,6
509         SKIPE   TPGROW          ; TP IS GROWING
510         ADDI    C,1
511         PUSHJ   P,AGC           ;COLLECT GARBAGE
512         SETZM   PGROW
513         SETZM   TPGROW
514         AOJL    A,REAGC         ; IF NO CORE, RETRY
515         JRST    (E)
516
517 SAVACS:
518         PUSH    P,PVP
519         MOVE    PVP,PVSTOR+1
520 IRP A,,[0,A,B,C,D,E,TVP,SP]
521         PUSH    TP,A!STO(PVP)
522         SETZM   A!STO(PVP)      ;NOW ZERO TYPE
523         PUSH    TP,A
524         TERMIN
525         PUSH    TP,$TLOSE
526         PUSH    TP,DSTORE
527         MOVE    D,PVP
528         POP     P,PVP
529         PUSH    TP,PVPSTO(D)
530         PUSH    TP,PVP
531         SKIPE   D,DSTORE
532         MOVEM   D,-13(TP)       ; USE AS DSTO
533         SETZM   DSTORE
534         POPJ    P,
535
536 RESTAC: POP     TP,PVP
537         PUSH    P,PVP
538         MOVE    PVP,PVSTOR+1
539         POP     TP,PVPSTO(PVP)
540         POP     TP,DSTORE
541         SUB     TP,[1,,1]
542 IRP A,,[SP,TVP,E,D,C,B,A,0]
543         POP     TP,A
544         POP     TP,A!STO(PVP)
545         TERMIN
546         SKIPE   DSTORE
547         SETZM   DSTO(PVP)
548         POP     P,PVP
549         POPJ    P,
550
551 ; HERE TO DO GC INTERRUPT AND CLOSE ANY DEAD CHANNELS
552
553 INTOGC: PUSH    P,[N.CHNS-1]
554         MOVE    PVP,PVSTOR+1
555         MOVE    TVP,REALTV+1(PVP)
556         MOVEI   A,CHNL1
557         SUBI    A,(TVP)
558         HRLS    A
559         ADD     A,TVP
560         PUSH    TP,$TVEC
561         PUSH    TP,A
562
563 INTGC1: MOVE    A,(TP)          ; GET POINTER
564         SKIPN   B,1(A)          ; ANY CHANNEL?
565         JRST    INTGC2
566         HRRE    0,(A)           ; INDICATOR
567         JUMPGE  0,INTGC2
568         PUSH    TP,$TCHAN
569         PUSH    TP,B
570         MCALL   1,FCLOSE
571
572         MOVE    A,(TP)
573
574 INTGC2: HLLZS   (A)
575         ADD     A,[2,,2]
576         MOVEM   A,(TP)
577         SOSE    (P)
578         JRST    INTGC1
579
580         SUB     P,[1,,1]
581         SUB     TP,[2,,2]
582         PUSH    TP,$TCHSTR
583         PUSH    TP,CHQUOTE GC
584         PUSH    TP,$TFLOAT      ; PUSH  ON TIME ARGUMENT
585         PUSH    TP,GCTIM
586         PUSH    TP,$TFIX        ; PUSH ON THE CAUSE ARGUMENT
587         PUSH    TP,GCCAUS
588         PUSH    TP,$TATOM       ; PUSH ON THE CALL ARGUMENT
589         MOVE    A,GCCALL
590         PUSH    TP,@GCALLR(A)
591         MCALL   4,INTERR
592         POPJ    P,
593
594 ; PRE AGC INTERRUPT. CAUSED WHEN FREE STORAGE REQUEST CAN BE SATISFIED BY
595 ; EXTENDING CORE. IT IS CALLED "AGC" AND THE HANDLER IS PASSED THE CALLER,
596 ; AND THE PENDING REQUEST.
597
598
599 INTAGC: MOVE    A,GETNUM
600         MOVEM   A,GCKNUM                ; SET UP TO CAUSE INTERRUPT
601         PUSH    P,C             ; SAVE ARGS TO GC
602         MOVEI   A,2000          ; GET WORKING SPACE
603         PUSHJ   P,INTCOR        ; GET IT
604         MOVSI   A,TATOM         ; EXAMINE BINDING OF FLAG
605         MOVE    B,IMQUOTE AGC-FLAG
606         PUSHJ   P,ILVAL
607         CAME    A,$TUNBOUND
608         JRST    INAGCO          ; JUMP TO GET CORE FOR INTERRUPT
609         MOVE    A,GETNUM
610         ADD     A,P.TOP         ; SEE IF WE CAN POSSIBLY WIN
611         ADD     A,FREMIN
612         CAML    A,PURBOT
613         JRST    AGCCAU          ; WORLD IS IN BAD SHAPE, CALL AGC
614         PUSH    TP,$TTP         ; BIND FLAG
615         PUSH    TP,TP           ; FOR UNBINDING PURPOSES
616         PUSH    TP,[TATOM,,-1]  ; SPECBINDS ARGS
617         PUSH    TP,IMQUOTE AGC-FLAG
618         PUSH    TP,$TFIX
619         PUSH    TP,[-1]
620         PUSH    TP,[0]
621         PUSH    TP,[0]
622         PUSHJ   P,SPECBIND
623
624 ; SET UP CALL TO HANDLER
625
626         PUSH    TP,$TCHSTR      ; STRING INDICATING INTERRUPT
627         PUSH    TP,CHQUOTE DIVERT-AGC
628         PUSH    TP,$TFIX        ; PENDING REQUEST
629         PUSH    TP,GETNUM
630         HLRZ    C,(P)
631         PUSH    TP,$TATOM
632         PUSH    TP,@GCALLR(C)
633         SETZM   GCHPN
634         MCALL   3,INTERR        ; ENABLE INTERRUPT
635         GETYP   A,A             ; CHECK TO SEE IF INTERRUPT WAS ENABLED
636         HRRZ    E,-6(TP)        ; GET ARG FOR UNBINDING
637         PUSHJ   P,SSPEC1
638         SUB     TP,[8,,8]       ; CLEAN OFF STACK
639         CAIE    A,TFALSE        ; SKIP IF NOT
640         JRST    CHKWIN
641
642 ; CAUSE AN AGC TO HAPPEN
643
644 AGCCAU: MOVE    C,(P)           ; INDICATOR
645         PUSHJ   P,SAGC          ; CALL AGC
646         JRST    FINAGC
647
648 ; SEE WHETHER ENOUGH CORE WAS ALLOCATED
649 CHKWIN: MOVE    A,FRETOP
650         SUB     A,GCSTOP
651         SUB     A,GCKNUM        ; AMOUNT NEEDED OR IN EXCESS
652         JUMPGE  A,FINAGC        ; JUMP IF DONE
653         MOVE    A,GCKNUM
654         MOVEM   A,GETNUM        ; SET UP REQUEST
655         MOVE    C,(P)
656         JRST    AGCCAU
657 FINAGC: SETZM   GETNUM
658         POP     P,C             ; RESTORE C
659         POPJ    P,              ; EXIT
660
661 ; ROUTINE TO  HANDLE INTERRUPT WHILE INTERRUPT IS RUNNING
662 ; IT TRIES TO ALLOCATE FOR REQUEST+ AT LEAST ONE CORE BLOCK
663
664 INAGCO: MOVE    A,GETNUM                ; GET REQUEST
665         SUB     A,GCKNUM        ; CALCULATE REAL CURRENT REQUEST
666         ADDI    A,1777
667         ANDCMI  A,1777  ; AMOUNT WANTED
668         PUSHJ   P,INTCOR        ; GET IT
669         POP     P,C             ; RESTORE C
670         POPJ    P,              ; EXIT
671
672 ; ROUTINE TO GET CORE FOR PRE-AGC INTERRUPT.  REQUEST IN A
673
674
675 INTCOR: ADD     A,P.TOP         ; ADD TOP TO REQUEST
676         CAML    A,PURBOT        ; SKIP IF BELOW PURE
677         JRST    AGCCA1          ; LOSE
678         MOVEM   A,CORTOP        ; STORE POSSIBLE CORE TOP
679         ASH     A,-10.          ; TO PAGES
680         PUSHJ   P,P.CORE        ; GET THE CORE
681         JRST    AGCCA1          ; LOSE,LOSE,LOSE
682         PUSH    P,B
683         MOVE    B,FRETOP
684         SUBI    B,2000
685         MOVE    A,FRETOP
686         SETZM   (B)
687         HRLI    B,(B)
688         ADDI    B,1
689         BLT     B,-1(A)
690         POP     P,B
691         MOVEM   A,FRETOP
692         POPJ    P,              ; EXIT
693 AGCCA1: MOVE    C,-1(P)         ; GET ARGS FOR AGC
694         SUB     P,[1,,1]        ; FLUSH RETURN ADDRESS
695         JRST    AGCCAU+1
696
697
698
699 GCALLR: MQUOTE GC-READ
700         MQUOTE BLOAT
701         MQUOTE GROW
702         IMQUOTE LIST
703         IMQUOTE VECTOR
704         IMQUOTE SET
705         IMQUOTE SETG
706         MQUOTE FREEZE
707         MQUOTE PURE-PAGE-LOADER
708         MQUOTE GC
709         MQUOTE INTERRUPT-HANDLER
710         MQUOTE NEWTYPE
711         MQUOTE PURIFY
712
713 \f; OLD "ON"  SETS UP EVENT AND HANDLER
714
715 MFUNCTION ON,SUBR
716
717         ENTRY
718
719         HLRE    0,AB            ; 0=> -2*NUM OF ARGS
720         ASH     0,-1            ; TO -NUM
721         CAME    0,[-5]
722         JRST    .+3
723         MOVEI   B,10(AB)        ; LAST MUST BE CHAN OR LOC
724         PUSHJ   P,CHNORL
725         ADDI    0,3
726         JUMPG   0,TFA           ; AT LEAST 3
727         MOVEI   A,0             ; SET UP IN CASE NO PROC
728         AOJG    0,ONPROC        ; JUMP IF NONE
729         GETYP   C,6(AB)         ; CHECK IT
730         CAIE    C,TPVP
731         JRST    TRYFIX
732         MOVE    A,7(AB)         ; GET IT
733 ONPROC: PUSH    P,A             ; SAVE AS A FLAG
734         GETYP   A,(AB)          ; CHECK PREV EXISTANCE
735         PUSH    P,0
736         CAIN    A,TATOM
737         JRST    .+3
738         CAIE    A,TCHSTR
739         JRST    WTYP1
740         MOVEI   B,(AB)          ; FIND IT
741         PUSHJ   P,FNDINT
742         POP     P,0             ; REST NUM OF ARGS
743         JUMPN   B,ON3           ; ALREADY THERE
744         SKIPE   C               ; SKIP IF NOTHING TO FLUSH
745         SUB     TP,[2,,2]
746         PUSH    TP,(AB)         ; GET NAME
747         PUSH    TP,1(AB)
748         PUSH    TP,4(AB)
749         PUSH    TP,5(AB)
750         MOVEI   A,2             ; # OF ARGS TO EVENT
751         AOJG    0,ON1           ; JUMP IF NO LAST ARG
752         PUSH    TP,10(AB)
753         PUSH    TP,11(AB)
754         ADDI    A,1
755 ON1:    ACALL   A,EVENT
756
757 ON3:    PUSH    TP,A
758         PUSH    TP,B
759         PUSH    TP,2(AB)        ; NOW FCN
760         PUSH    TP,3(AB)
761         MOVEI   A,3             ; NUM OF ARGS
762         SKIPN   (P)
763         SOJA    A,ON2           ; NO PROC
764         PUSH    TP,$TPVP
765         PUSH    TP,7(AB)
766 ON2:    ACALL   A,HANDLER
767         JRST    FINIS
768
769
770 TRYFIX: SKIPN   A,7(AB)
771         CAIE    C,TFIX
772         JRST    WRONGT
773         JRST    ONPROC
774 \f
775 ; ROUTINE TO BUILD AN EVENT
776
777 MFUNCTION EVENT,SUBR
778
779         ENTRY
780
781         HLRZ    0,AB
782         CAIN    0,-2            ; IF JUST 1
783         JRST    RE.EVN          ; COULD BE EVENT
784         CAIL    0,-3            ; MUST BE AT LEAST 2 ARGS
785         JRST    TFA
786         GETYP   A,2(AB)         ; 2ND ARG MUST BE FIXED POINT PRIORITY
787         CAIE    A,TFIX
788         JRST    WTYP2
789         GETYP   A,(AB)          ; FIRST ARG SHOULD BE CHSTR
790         CAIN    A,TATOM         ; ALLOW ACTUAL ATOM
791         JRST    .+3
792         CAIE    A,TCHSTR
793         JRST    WTYP1
794         CAIL    0,-5
795         JRST    GOTRGS
796         CAIG    0,-7
797         JRST    TMA
798         MOVEI   B,4(AB)
799         PUSHJ   P,CHNORL        ; CHANNEL OR LOCATIVE (PUT ON STACK)
800
801 GOTRGS: MOVEI   B,(AB)          ; NOW TRY TO FIND HEADER FOR THIS INTERRUPT
802         PUSHJ   P,FNDINT        ; CALL INTERNAL HACKER
803         JUMPN   B,FINIS         ; ALREADY ONE OF THIS NAME
804         PUSH    P,C
805         JUMPE   C,.+3           ; GET IT OFF STACK
806         POP     TP,B
807         POP     TP,A
808         PUSHJ   P,MAKINT        ; MAKE ONE FOR ME
809         MOVSI   0,TFIX
810         MOVEM   0,INTPRI(B)     ; SET UP PRIORITY
811         MOVE    0,3(AB)
812         MOVEM   0,INTPRI+1(B)
813 CH.SPC: POP     P,C             ; GET CODE BACK
814         SKIPGE  C
815         PUSHJ   P,DO.SPC        ; DO ANY SPECIAL HACKS
816         JRST    FINIS
817
818 RE.EVN: GETYP   0,(AB)
819         CAIE    0,TINTH
820         JRST    TFA             ; ELSE SAY NOT ENOUGH
821         MOVE    B,1(AB)         ; GET IT
822         SETZM   ISTATE+1(B)     ; MAKE SURE ENABLED
823         SETZB   D,C
824         GETYP   A,INAME(B)      ; CHECK FOR CHANNEL
825         CAIN    A,TCHAN         ; SKIP IF NOT
826         HRROI   C,SS.CHA        ; SET UP CHANNEL HACK
827         HRLZ    E,INTPRI(B)     ; GET POSSIBLE READ/WRITE BITS
828         TLNE    E,.WRMON+.RDMON ; SKIP IF NOT MONITORS
829         PUSHJ   P,GETNM1
830         JUMPL   C,RE.EV1
831         MOVE    B,INAME+1(B)    ; CHECK FOR SPEC
832         PUSHJ   P,SPEC1
833         MOVE    B,1(AB)         ; RESTORE IHEADER
834 RE.EV1: PUSH    TP,INAME(B)
835         PUSH    TP,INAME+1(B)
836         PUSH    P,C
837         MOVSI   C,TATOM
838         PUSH    TP,$TATOM
839         SKIPN   D
840         MOVE    D,MQUOTE INTERRUPT
841         PUSH    TP,D
842         MOVE    A,INAME(B)
843         MOVE    B,INAME+1(B)    ; GET IT
844         PUSHJ   P,IGET          ; LOOK FOR IT
845         JUMPN   B,FINIS         ; RETURN IT
846         MOVE    A,(TB)
847         MOVE    B,1(TB)
848         POP     TP,D
849         POP     TP,C
850         PUSH    TP,(AB)
851         PUSH    TP,1(AB)
852         PUSHJ   P,IPUT          ; REESTABLISH IT
853         MOVE    A,(AB)
854         MOVE    B,1(AB)
855         JRST    CH.SPC
856
857 \f
858 ; FUNCTION TO GENERATE A HANDLER FOR A GIVEN INTERRUPT
859
860 MFUNCTION HANDLER,SUBR
861
862         ENTRY
863
864         HLRZ    0,AB
865         CAIL    0,-2            ; MUST BE 2 OR MORE ARGS
866         JRST    TFA
867         GETYP   A,(AB)
868         CAIE    A,TINTH         ; EVENT?
869         JRST    WTYP1
870         GETYP   A,2(AB)
871         CAIN    0,-4            ; IF EXACTLY 2
872         CAIE    A,THAND         ; COULD BE HANDLER
873         JRST    CHEVNT
874
875         MOVE    B,3(AB)         ; GET IT
876         SKIPN   IPREV+1(B)      ; SKIP IF ALREADY IN USE
877         JRST    HNDOK
878         MOVE    D,1(AB)         ; GET EVENT
879         SKIPN   D,IHNDLR+1(D)   ; GET FIRST HANDLER
880         JRST    BADHND
881         CAMN    D,B             ; IS THIS IT?
882         JRST    HFINIS          ; YES, ALREADY "HANDLED"
883         MOVE    D,INXT+1(D)     ; GO TO NEXT HANDLER
884         JUMPN   D,.-3
885 BADHND: ERRUUO  EQUOTE HANDLER-ALREADY-IN-USE
886
887 CHEVNT: CAIG    0,-7            ; SKIP IF LESS THAN 4
888         JRST    TMA
889         PUSH    TP,$TPVP                ; SLOT FOR PROCESS
890         PUSH    TP,[0]
891         CAIE    0,-6            ; IF 3, LOOK FOR PROC
892         JRST    NOPROC
893         GETYP   0,4(AB)
894         CAIE    0,TPVP
895         JRST    WTYP3
896         MOVE    0,5(AB)
897         MOVEM   0,(TP)
898
899 NOPROC: PUSHJ   P,APLQ
900         JRST    NAPT
901         PUSHJ   P,MHAND         ; MAKE THE HANDLER
902         MOVE    0,1(TB)         ; GET PROCESS
903         MOVEM   0,INTPRO+1(B)   ; AND PUT IT INTO HANDLER
904         MOVSI   0,TPVP          ; SET UP TYPE
905         MOVEM   0,INTPRO(B)
906         MOVE    0,2(AB)         ; SET UP FUNCTION
907         MOVEM   0,INTFCN(B)
908         MOVE    0,3(AB)
909         MOVEM   0,INTFCN+1(B)
910
911 HNDOK:  MOVE    D,1(AB)         ; PICK UP EVEENT
912         MOVE    E,IHNDLR+1(D)   ; GET POINTER TO HANDLERS
913         MOVEM   B,IHNDLR+1(D)   ; PUT NEW ONE IN
914         MOVSI   0,TINTH         ; GET INT HDR TYPE
915         MOVEM   0,IPREV(B)      ; INTO BACK POINTER
916         MOVEM   D,IPREV+1(B)    ; AND POINTER ITSELF
917         MOVEM   E,INXT+1(B)     ; NOW NEXT POINTER
918         MOVSI   0,THAND         ; NOW HANDLER TYPE
919         MOVEM   0,IHNDLR(D)     ; SET TYPE IN HEADER
920         MOVEM   0,INXT(B)
921         JUMPE   E,HFINIS        ; JUMP IF HEADER WAS EMPTY
922         MOVEM   0,IPREV(E)      ; FIX UP ITS PREV
923         MOVEM   B,IPREV+1(E)
924 HFINIS: MOVSI   A,THAND
925         JRST    FINIS
926
927 \f
928
929 ; FUNCTIONS TO SET TIME LIMITS FOR REALTIME AND RUNTIME INTS
930
931 IFN ITS,[
932
933 MFUNCTION RUNTIMER,SUBR
934
935         ENTRY
936
937         CAMG    AB,[-3,,0]
938          JRST   TMA
939         JUMPGE  AB,RNTLFT
940         GETYP   0,(AB)
941         JFCL    10,.+1
942         MOVE    A,1(AB)
943         CAIE    0,TFIX
944         JRST    RUNT1
945         IMUL    A,[245761.]
946         JRST    RUNT2
947
948 RUNT1:  CAIE    0,TFLOAT
949         JRST    WTYP1
950         FMPR    A,[245760.62]
951         MULI    A,400           ; FIX IT
952         TSC     A,A
953         ASH     B,(A)-243
954         MOVE    A,B
955 RUNT2:  JUMPL   A,OUTRNG        ; NOT FOR NEG #
956         JFCL    10,OUTRNG
957         .SUSET  [.SRTMR,,A]
958         MOVE    A,(AB)
959         MOVE    B,1(AB)
960         JRST    FINIS
961 RNTLFT: .SUSET  [.RRTMR,,B]
962         JUMPL   B,IFALSE        ; RETURN FALSE IF NONE SET
963         IDIV    B,[245761.]     ; TO SECONDS
964         MOVSI   A,TFIX
965         JRST    FINIS
966         
967 ]
968 .TIMAL==5
969 .TIMEL==1
970
971 MFUNCTION REALTIMER,SUBR
972
973         ENTRY
974
975         CAMG    AB,[-3,,0]
976          JRST   TMA
977         JUMPGE  AB,RLTPER
978         JFCL    10,.+1
979         GETYP   0,(AB)
980         MOVE    A,1(AB)
981         CAIE    0,TFIX
982         JRST    REALT1
983 IFN ITS,        IMULI   A,60.   ; TO 60THS OF SEC
984 IFE ITS,        IMULI   A,1000. ; TO MILLI
985         JRST    REALT2
986
987 REALT1: CAIE    0,TFLOAT
988         JRST    WTYP1
989 IFN ITS,        FMPRI   A,(60.0)
990 IFE ITS,        FMPRI   A,(1000.0)
991         MULI    A,400
992         TSC     A,A
993         ASH     B,(A)-243
994         MOVE    A,B
995
996 REALT2: JUMPL   A,OUTRNG
997         JFCL    10,OUTRNG
998         MOVEM   A,RLTSAV
999 IFN ITS,[
1000         MOVE    B,[200000,,A]
1001         SKIPN   A
1002         MOVSI   B,400000
1003         .REALT  B,
1004         JFCL
1005 ]
1006 IFE ITS,[
1007         MOVE    A,[MFORK,,.TIMAL]       ; FLUSH CURRENT FIRST
1008         TIMER
1009          JRST   TIMERR
1010         SKIPN   B,RLTSAV
1011          JRST   RETRLT
1012         HRRI    A,.TIMEL
1013         MOVEI   C,RLCHN
1014         TIMER
1015          JRST   TIMERR
1016 RETRLT: MOVE    A,(AB)
1017         MOVE    B,1(AB)
1018         JRST    FINIS
1019
1020 TIMERR: MOVNI   A,1
1021         PUSHJ   P,TGFALS
1022         JRST    FINIS
1023         
1024 RLTPER: SKIPGE  B,RLTSAV
1025          JRST   IFALSE
1026 IFN ITS,        IDIVI   B,60.           ; BACK TO SECONDS
1027 IFE ITS,        IDIVI   B,1000.
1028         MOVSI   A,TFIX
1029         JRST    FINIS
1030
1031
1032 ; FUNCTIONS TO ENABLE AND DISABLE INTERRUPTS
1033
1034 MFUNCTION %ENABL,SUBR,ENABLE
1035
1036         PUSHJ   P,GTEVNT
1037         SETZM   ISTATE+1(B)
1038         JRST    FINIS
1039
1040 MFUNCTION %DISABL,SUBR,DISABLE
1041
1042
1043         PUSHJ   P,GTEVNT
1044         SETOM   ISTATE+1(B)
1045         JRST    FINIS
1046
1047 GTEVNT: ENTRY   1
1048         GETYP   0,(AB)
1049         CAIE    0,TINTH
1050         JRST    WTYP1
1051         MOVE    A,(AB)
1052         MOVE    B,1(AB)
1053         POPJ    P,
1054
1055 DO.SPC: HRRO    C,INTBL(C)      ; POINT TO SPECIAL CODE
1056         HLRZ    0,AB            ; - TWO TIMES NUM ARGS
1057         PUSHJ   P,(C)           ; CALL ROUTINE
1058         JUMPE   E,CPOPJ         ; NO BITS TO ENABLE, LEAVE
1059 IFE ITS,[
1060         PUSH    TP,A
1061         PUSH    TP,B
1062         MOVE    B,1(TB)         ; CHANNEL
1063         MOVE    0,CHANNO(B)
1064         MOVEM   0,(E)           ; SAVE IN TABLE
1065         MOVEI   E,(E)
1066         SUBI    E,NETJFN-NETCHN
1067         MOVE    A,0             ; SETUP FOR MTOPR
1068         MOVEI   B,24
1069         MOVSI   C,(E)
1070         TLO     C,770000        ; DONT SETUP INR/INS
1071         MTOPR
1072         MOVEI   0,1
1073         MOVNS   E
1074         LSH     0,35.(E)
1075         IORM    0,MASK1
1076         MOVE    B,MASK1
1077         MOVEI   A,MFORK
1078         AIC
1079         
1080         POP     TP,B
1081         POP     TP,A
1082         POPJ    P,              ; ***** TEMP ******
1083 ]
1084 IFN ITS,[
1085         CAILE   E,35.           ; SKIP IF 1ST WORD BIT
1086         JRST    SETW2
1087         LSH     0,-1(E)
1088
1089         IORM    0,MASK1         ; STORE IN PROTOTYPE MASK
1090         .SUSET  [.SMASK,,MASK1]
1091         POPJ    P,
1092
1093 SETW2:  LSH     0,-36.(E)
1094         IORM    0,MASK2         ; SET UP PROTO MASK2
1095         .SUSET  [.SMSK2,,MASK2]
1096         POPJ    P,
1097 ]
1098
1099 ; ROUTINE TO CHECK FOR CHANNEL OR LOCATIVE
1100
1101 CHNORL: GETYP   A,(B)           ; GET TYPE
1102         CAIN    A,TCHAN         ; IF CHANNEL
1103         JRST    CHNWIN
1104         PUSH    P,0
1105         PUSHJ   P,LOCQ          ; ELSE LOOCATIVE
1106         JRST    WRONGT
1107         POP     P,0
1108 CHNWIN: PUSH    TP,(B)
1109         PUSH    TP,1(B)
1110         POPJ    P,
1111 \f
1112 ; SUBROUTINE TO FIND A HANDLER OF A GIVEN NAME
1113
1114 FNDINT: PUSHJ   P,FNDNM
1115         JUMPE   B,CPOPJ
1116         PUSHJ   P,SPEC1         ; COULD BE FUNNY
1117
1118 INTASO: PUSH    P,C             ; C<0 IF SPECIAL
1119         PUSH    TP,A
1120         PUSH    TP,B
1121         MOVSI   C,TATOM
1122         SKIPN   D               ; COULD BE CHANGED FOR MONITOR
1123         MOVE    D,MQUOTE INTERRUPT
1124         PUSH    TP,C
1125         PUSH    TP,D
1126         PUSHJ   P,IGET
1127         MOVE    D,(TP)
1128         SUB     TP,[2,,2]
1129         POP     P,C             ; AND RESTOR SPECIAL INDICATOR
1130         SKIPE   B               ; IF FOUND
1131         SUB     TP,[2,,2]       ; REMOVE CRUFT
1132 CPOPJ:  POPJ    P,              ; AND RETURN
1133
1134 ; CHECK FOR SPECIAL INTERNAL INTERRUPT HACK
1135
1136 SPEC1:  MOVSI   C,-SPECLN       ; BUILD AOBJN PNTR
1137 SPCLOP: CAME    B,@SPECIN(C)    ; SKIP IF SPECIAL
1138         AOBJN   C,.-1           ; UNTIL EXHAUSTED
1139         JUMPGE  C,.+3
1140         SKIPE   E,FNDTBL(C)
1141         JRST    (E)
1142         MOVEI   0,-1(TB)        ; SEE IF OK
1143         CAIE    0,(TP)
1144         JRST    TMA
1145         POPJ    P,
1146
1147 ; ROUTINE TO CREATE A NEW INTERRUPT (INTERNAL ONLY--NOT ITS FLAVOR)
1148
1149 MAKINT: JUMPN   C,GOTATM        ; ALREADY HAVE NAME, GET THING
1150         MOVEI   B,(AB)          ; POINT TO STRING
1151         PUSHJ   P,CSTAK         ; CHARS TO STAKC
1152         MOVE    B,INTOBL+1
1153         PUSHJ   P,INSRTX
1154         MOVE    D,MQUOTE INTERRUPT
1155 GOTATM: PUSH    TP,$TINTH       ; MAKE SLOT FOR HEADER BLOCK
1156         PUSH    TP,[0]
1157         PUSH    TP,A
1158         PUSH    TP,B            ; SAVE ATOM
1159         PUSH    TP,$TATOM
1160         PUSH    TP,D
1161         MOVEI   A,IHDRLN*2
1162         PUSHJ   P,GIBLOK
1163         MOVE    A,-3(TP)                ; GET NAME AND STORE SAME
1164         MOVEM   A,INAME(B)
1165         MOVE    A,-2(TP)
1166         MOVEM   A,INAME+1(B)
1167         SETZM   ISTATE+1(B)
1168         MOVEM   B,-4(TP)        ; STASH HEADER
1169         POP     TP,D
1170         POP     TP,C
1171         EXCH    B,(TP)
1172         MOVSI   A,TINTH
1173         EXCH    A,-1(TP)        ; INTERNAL PUT CALL
1174         PUSHJ   P,IPUT
1175         POP     TP,B
1176         POP     TP,A
1177         POPJ    P,
1178
1179 ; FIND NAME OF INTERRUPT
1180
1181 FNDNM:  GETYP   A,(B)           ; TYPE
1182         CAIE    A,TCHSTR        ; IF STRING
1183         JRST    FNDATM          ; DONT HAVE ATOM, OTHERWISE DO
1184         PUSHJ   P,IILOOK
1185         JRST    .+2
1186 FNDATM: MOVE    B,1(B)
1187         SETZB   C,D             ; PREVENT LOSSAGE LATER
1188         MOVSI   A,TATOM
1189
1190 ; THE NEXT 2 INSTRUCTIONS ARE A KLUDGE TO GET THE RIGHT ERROR ATOM
1191
1192         CAMN    B,IMQUOTE ERROR
1193         MOVE    B,MQUOTE ERROR,ERROR,INTRUP
1194         POPJ    P,
1195
1196 IILOOK: PUSHJ   P,CSTAK         ; PUT CHRS ON STACK
1197         MOVSI   A,TOBLS
1198         MOVE    B,INTOBL+1
1199         JRST    ILOOKC  ; LOOK IT UP
1200 \f
1201 ; ROUTINE TO MAKE A HANDLER BLOCK
1202
1203 MHAND:  MOVEI   A,IHANDL*2
1204         JRST    GIBLOK          ; GET BLOCK
1205
1206 ; HERE TO GET CHANNEL FOR "CHAR" INTERRUPT
1207
1208 GETCHN: GETYP   0,(TB)          ; GET TYPE
1209         CAIE    0,TCHAN         ; CHANNL IS WINNER
1210         JRST    WRONGT
1211         MOVE    A,(TB)          ; USE THE CHANNEL TO NAME THE INTERRUPT
1212         MOVE    B,1(TB)
1213         SKIPN   CHANNO(B)       ; SKIP IF WINNING CHANNEL
1214         JRST    CBDCHN          ; LOSER
1215         POPJ    P,
1216
1217 LOCGET: GETYP   0,(TB)          ; TYPE
1218         CAIN    0,TCHAN         ; SKIP IF LOCATIVE
1219         JRST    WRONGT
1220         MOVE    D,B
1221         MOVE    A,(TB)
1222         MOVE    B,1(TB)         ; GET LOCATIVE
1223         POPJ    P,
1224
1225 ; FINAL MONITOR SETUP ROUTINES
1226
1227 S.RMON: SKIPA   E,[.RDMON,,]
1228 S.WMON: MOVSI   E,.WRMON
1229         PUSH    TP,A
1230         PUSH    TP,B
1231         HLRM    E,INTPRI(B)     ; SAVE BITS
1232         MOVEI   B,(TB)          ; POINT TO LOCATIVE
1233         HRRZ    A,FSAV(TB)
1234         CAIN    A,OFF
1235         MOVSI   D,(ANDCAM E,)   ; KILL INST
1236         CAIN    A,EVENT
1237         MOVSI   D,(IORM E,)
1238         PUSHJ   P,SMON          ; GO DO IT
1239         POP     TP,B
1240         POP     TP,A
1241         MOVEI   E,0
1242         POPJ    P,
1243 \f
1244
1245 ; SPECIAL SETUP ROUTINES FOR INITIAL INTERRUPTS
1246
1247 IFN ITS,[
1248 S.CHAR: MOVE    E,1(TB)         ; GET CHANNEL
1249         MOVE    0,RDEVIC(E)
1250         ILDB    0,0             ; 1ST CHAR TO 0
1251         CAIE    0,"T            ; TTY
1252         JRST    .+3             ; NO
1253         MOVEI   0,C.INTL
1254         XORM    0,-2(E)         ; IN CASE OUTPUT
1255         MOVE    E,CHANNO(E)
1256         ADDI    E,36.           ; GET CORRECT MASK BIT
1257 ONEBIT: MOVEI   0,1             ; BIT FOR INT TO RET
1258         POPJ    P,
1259 ]
1260 IFE ITS,[
1261 S.CHAR: MOVE    E,1(TB)
1262         MOVEI   0,C.INTL
1263         XORM    0,-2(E)         ; IN CASE OUTPUT
1264         MOVE    0,RDEVIC(E)
1265         ILDB    0,0             ; 1ST CHAR
1266         PUSH    P,A
1267         CAIE    0,"N            ; NET ?
1268         JRST    S.CHA1
1269
1270         MOVEI   A,0
1271         HRRZ    0,CHANNO(E)
1272         MOVE    E,[-NNETS,,NETJFN]
1273         CAMN    0,(E)
1274         JRST    S.CHA2
1275         SKIPN   (E)
1276         MOVE    A,E             ; REMEMBER WHERE
1277         AOBJN   E,.-4
1278         TLNN    A,-1    
1279         FATAL   NO MORE NETWORK
1280         SKIPA   E,A
1281 S.CHA1: MOVEI   E,0
1282 S.CHA2: POP     P,A
1283         POPJ    P,
1284 ]
1285
1286
1287 ; SPECIAL FOR CLOCK
1288 IFN ITS,[
1289 S.DOWN: SKIPA   E,[7]
1290 S.CLOK: MOVEI   E,13.           ; FOR NOW JUST GET BIT #
1291         JRST    ONEBIT
1292
1293 S.PAR:  MOVEI   E,28.
1294         JRST    ONEBIT
1295
1296 ; RUNTIME AND REALTIME INTERRUPTS
1297
1298 S.RUNT: SKIPA   E,[34.]
1299 S.REAL: MOVEI   E,35.
1300         JRST    ONEBIT
1301
1302 S.IOC:  SKIPA   E,[9.]          ; IO CHANNEL ERROR
1303 S.PURE: MOVEI   E,26.
1304         JRST    ONEBIT
1305
1306 ; MPV AND ILOPR
1307
1308 S.MPV:  SKIPA   E,[14.]         ; BIT POS
1309 S.ILOP: MOVEI   E,6
1310         JRST    ONEBIT
1311
1312 ; HERE TO TURN ALL INFERIOR INTS
1313
1314 S.INF:  MOVEI   E,36.+16.+2     ; START OF BITS
1315         MOVEI   0,37            ; 8 BITS WORTH
1316         POPJ    P,
1317 ]
1318 IFE ITS,[
1319 S.PURE:
1320 S.MPV:
1321 S.ILOP:
1322 S.DOWN:
1323 S.CLOK:
1324 S.PAR:
1325
1326
1327 S.RUNT: ERRUUO  EQUOTE INTERRUPT-UNAVAILABLE-ON-TENEX
1328 S.IOC:  MOVEI   0,7             ; 3 BITS FOR EOF/FULL/ERROR
1329         MOVEI   E,10.
1330         POPJ    P,
1331
1332 S.INF:
1333 S.REAL: MOVEI   E,0
1334         POPJ    P,
1335 ]
1336
1337
1338 ; HERE TO HANDLE ITS INTERRUPTS
1339
1340 FHAND:  SKIPN   D,EXTINT(B)     ; SKIP IF HANDLERS ARE POSSIBLE
1341         JRST    DIRQ
1342         JRST    (D)
1343
1344 IFN ITS,[
1345 ; SPECIAL CHARACTER HANDLERS
1346
1347 HCHAR:  MOVEI   D,CHNL0+1
1348         ADDI    D,(B)           ; POINT TO CHANNEL SLOT
1349         ADDI    D,(B)
1350         SKIPN   D,-72.(D)       ; PICK UP CHANNEL
1351         JRST    IPCGOT          ;WELL, IT GOTTA BEE THE THE IPC THEN
1352         PUSH    TP,$TCHAN
1353         PUSH    TP,D
1354         LDB     0,[600,,STATUS(D)]      ; GET DEVICE CODE
1355         CAILE   0,2             ; SKIP IF A TTY
1356         JRST    HNET            ; MAYBE NETWORK CHANNEL
1357         HRRZ    0,-2(D)
1358         TRNN    0,C.READ
1359         JRST    HMORE
1360         CAMN    D,TTICHN+1
1361         SKIPE   DEMFLG          ; SKIP IF NOT DEMON
1362         JRST    .+3
1363         SKIPN   NOTTY
1364         JRST    HCHR11
1365         MOVE    B,D             ; CHAN TO B
1366         PUSH    P,A
1367         PUSHJ   P,TTYOP2        ; RE-GOBBLE TTY
1368         POP     P,A
1369         MOVE    D,(TP)
1370 HCHR11: MOVE    D,CHANNO(D)     ; GET ITS CHANNEL
1371         PUSH    P,D             ; AND SAVE IT
1372         .CALL   HOWMNY          ; GET # OF CHARS
1373         MOVEI   B,0             ; IF TTY GONE, NO CHARS
1374 RECHR:  ADDI    B,1             ; BUMP BY ONE FOR SOSG
1375         MOVEM   B,CHNCNT(D)     ; AND SAVE
1376         IORM    A,PIRQ2         ; LEAVE THE INT ON
1377
1378 CHRLOO: MOVE    D,(P)           ; GET CHNNAEL NO.
1379         SOSG    CHNCNT(D)       ; GET COUNT
1380         JRST    CHRDON
1381
1382         MOVE    B,(TP)
1383         MOVE    D,BUFRIN(B)     ; GET EXTRA BUFFER
1384         XCT     IOIN2(D)        ; READ CHAR
1385         JUMPL   A,CHRDON        ; NO CHAR THERE, FORGET IT
1386         PUSH    TP,$TCHSTR
1387         PUSH    TP,CHQUOTE CHAR
1388         PUSH    TP,$TCHRS       ; SAVE CHAR FOR CALL    
1389         PUSH    TP,A
1390         PUSH    TP,$TCHAN       ; SAVE CHANNEL
1391         PUSH    TP,B
1392         PUSHJ   P,INCHAR        ; PUT CHAR IN USERS BUFFER
1393         MCALL   3,INTERRUPT     ; RUN THE HANDLERS
1394         JRST    CHRLOO          ; AND LOOP
1395
1396 CHRDON: .CALL   HOWMNY
1397         MOVEI   B,0
1398         MOVEI   A,1             ; SET FOR PI WORD CLOBBER
1399         LSH     A,(D)
1400         JUMPG   B,RECHR         ; ANY MORE?
1401         ANDCAM  A,PIRQ2
1402         SUB     P,[1,,1]
1403         SUB     TP,[2,,2]
1404         JRST    DIRQ
1405
1406
1407 \f
1408 ; HERE FOR NET CHANNEL INTERRUPT
1409
1410 HNET:   CAIE    0,26            ; NETWORK?
1411         JRST    HSTYET          ; HANDLE PSEUDO TTY ETC.
1412         PUSH    TP,$TATOM
1413         PUSH    TP,MQUOTE CHAR,CHAR,INTRUP
1414         PUSH    TP,$TUVEC
1415         PUSH    TP,BUFRIN(D)
1416         PUSH    TP,$TCHAN
1417         PUSH    TP,D
1418         MOVE    B,D             ; CHAN TO B
1419         PUSHJ   P,INSTAT        ; UPDATE THE NETWRK STATE
1420         MCALL   3,INTERRUPT
1421         SUB     TP,[2,,2]
1422         JRST    DIRQ
1423
1424 HMORE:
1425 HSTYET: PUSH    TP,$TATOM
1426         PUSH    TP,MQUOTE CHAR,CHAR,INTRUP
1427         PUSH    TP,$TCHAN
1428         PUSH    TP,D
1429         MCALL   2,INTERRUPT
1430         SUB     TP,[2,,2]
1431         JRST    DIRQ
1432
1433 ]
1434 CBDCHN: ERRUUO  EQUOTE BAD-CHANNEL
1435
1436 IFN ITS,[
1437
1438 HCLOCK: PUSH    TP,$TCHSTR
1439         PUSH    TP,CHQUOTE CLOCK
1440         MCALL   1,INTERRUPT
1441         JRST    DIRQ
1442
1443 HRUNT:  PUSH    TP,$TATOM
1444         PUSH    TP,MQUOTE RUNT,RUNT,INTRUP
1445         MCALL   1,INTERRUPT
1446         JRST    DIRQ
1447 ]
1448 HREAL:  PUSH    TP,$TATOM
1449         PUSH    TP,MQUOTE REALT,REALT,INTRUP
1450         MCALL   1,INTERRUPT
1451         JRST    DIRQ
1452 IFN ITS,[
1453 HPAR:   MOVE    A,MQUOTE PARITY,PARITY,INTRUP
1454         JRST    HMPV1
1455
1456 HMPV:   MOVE    A,MQUOTE MPV,MPV,INTRUP
1457         JRST    HMPV1
1458
1459 HILOPR: MOVE    A,MQUOTE ILOPR,ILOPR,INTRUP
1460         JRST    HMPV1
1461
1462 HPURE:  MOVE    A,MQUOTE PURE,PURE,INTRUP
1463 HMPV1:  PUSH    TP,$TATOM
1464         PUSH    TP,A
1465         PUSH    P,LCKINT        ; SAVE LOCN
1466         PUSH    TP,$TATOM
1467         PUSH    TP,A
1468         PUSH    TP,$TWORD
1469         PUSH    TP,LCKINT
1470         MCALL   2,EMERGENCY
1471         POP     P,A
1472         MOVE    C,(TP)
1473         SUB     TP,[2,,2]
1474         JUMPN   B,DIRQ
1475
1476         PUSH    TP,$TATOM
1477         PUSH    TP,EQUOTE DANGEROUS-INTERRUPT-NOT-HANDLED
1478         PUSH    TP,$TATOM
1479         PUSH    TP,C
1480         PUSH    TP,$TWORD
1481         PUSH    TP,A
1482         MCALL   3,ERROR
1483         JRST    DIRQ
1484
1485 \f
1486
1487 ; HERE TO HANDLE SYS DOWN INTERRUPT
1488
1489 HDOWN:  PUSH    TP,$TATOM
1490         PUSH    TP,MQUOTE SYSDOWN,SYSDOWN,INTRUP
1491         .DIETI  A,              ; HOW LONG?
1492         PUSH    TP,$TFIX
1493         PUSH    TP,A
1494         PUSH    P,A             ; FOR MESSAGE
1495         MCALL   2,INTERRUPT
1496         POP     P,A
1497         JUMPN   B,DIRQ
1498         .SUSET  [.RTTY,,B]      ; DO WE NOW HAVE A TTY AT ALL?
1499         JUMPL   B,DIRQ          ; DONT HANG AROUND
1500         PUSH    P,A
1501         MOVEI   B,[ASCIZ /
1502 Excuse me, SYSTEM going down in /]
1503         SKIPG   (P)             ; SKIP IF REALLY GOING DOWN
1504         MOVEI   B,[ASCIZ /
1505 Excuse me, SYSTEM has been REVIVED!
1506 /]
1507         PUSHJ   P,MSGTYP
1508         POP     P,B
1509         JUMPE   B,DIRQ
1510         IDIVI   B,30.           ; TO SECONDS
1511         IDIVI   B,60.           ; A/ SECONDS B/ MINUTES
1512         JUMPE   B,NOMIN
1513         PUSH    P,C
1514         PUSHJ   P,DECOUT
1515         MOVEI   B,[ASCIZ / minutes /]
1516         PUSHJ   P,MSGTYP
1517         POP     P,B
1518         JRST    .+2
1519 NOMIN:  MOVEI   B,(C)
1520         PUSHJ   P,DECOUT
1521         MOVEI   B,[ASCIZ / seconds.
1522 /]
1523         PUSHJ   P,MSGTYP
1524         JRST    DIRQ
1525
1526 ; TWO DIGIT DEC OUT FROM B/
1527
1528 DECOUT: IDIVI   B,10.
1529         JUMPE   B,DECOU1        ; NO TEN
1530         MOVEI   A,60(B)
1531         PUSHJ   P,MTYO
1532 DECOU1: MOVEI   A,60(C)
1533         JRST    MTYO
1534 ]
1535 \f
1536 ; HERE TO HANDLE I/O CHANNEL ERRORS
1537
1538 HIOC:
1539 IFN ITS,[
1540         .SUSET  [.RAPRC,,A]     ; CONTAINS CHANNEL OF MOST RECENT LOSSAGE
1541         LDB     A,[330400,,A]   ; GET CHAN #
1542         MOVEI   C,(A)           ; COPY
1543 ]
1544         PUSH    TP,$TATOM       ; PUSH ERROR
1545         PUSH    TP,EQUOTE FILE-SYSTEM-ERROR
1546 IFE ITS,        MOVE    C,IOCLOS        ; GET JFN
1547         PUSH    TP,$TCHAN       
1548         ASH     C,1             ; GET CHANNEL
1549         ADDI    C,CHNL0+1       ; GET CHANNEL VECTOR
1550         PUSH    TP,(C)
1551 IFN ITS,[
1552         LSH     A,23.           ; DO A .STATUS
1553         IOR     A,[.STATUS A]
1554         XCT     A
1555 ]
1556 IFE ITS,[
1557         MOVNI   A,1                     ; GET "MOST RECENT ERROR"
1558 ]
1559         MOVE    B,(TP)
1560 IFN ITS,        PUSHJ   P,GFALS         ; GEN NAMED FALSE
1561 IFE ITS,        PUSHJ   P,TGFALS
1562         PUSH    TP,A
1563         PUSH    TP,B
1564         PUSH    TP,$TATOM
1565         PUSH    TP,MQUOTE IOC,IOC,INTRUP
1566
1567         PUSH    TP,A
1568         PUSH    TP,B
1569         PUSH    TP,-7(TP)
1570         PUSH    TP,-7(TP)
1571         MCALL   3,EMERGENCY
1572         JUMPN   B,DIRQ1         ; JUMP IF HANDLED
1573         MCALL   3,ERROR
1574         JRST    DIRQ
1575
1576 DIRQ1:  SUB     TP,[6,,6]
1577         JRST    DIRQ
1578 ]
1579 ; HANDLE INFERIOR KNOCKING AT THE DOOR
1580
1581 HINF:
1582 IFN ITS,        SUBI    B,36.+16.+2     ; CONVERT TO INF #
1583 IFE ITS,        MOVEI   B,0
1584         PUSH    TP,$TATOM
1585         PUSH    TP,MQUOTE INFERIOR,INFERIOR,INTRUP
1586         PUSH    TP,$TFIX
1587         PUSH    TP,B
1588         MCALL   2,INTERRUPT
1589         JRST    DIRQ
1590 \f
1591 IFE ITS,[
1592
1593 ; HERE FOR TENEX INTS (FIRST CUT)
1594
1595 MFUNCTION %ACCHRS,SUBR,[ACTIVATE-CHARS]
1596
1597         ENTRY
1598
1599         JUMPGE  AB,RETCHR
1600         CAMGE   AB,[-3,,]
1601         JRST    TMA
1602
1603         GETYP   A,(AB)
1604         CAIE    A,TCHSTR
1605         JRST    WTYP1
1606         HRRZ    D,(AB)          ; CHECK LENGTH
1607         MOVEI   C,0             ; SEE IF ANY NET CHANS IN USE
1608         MOVE    A,[-NNETS,,NETJFN]
1609         SKIPE   (A)
1610         SUBI    C,1
1611         AOBJN   A,.-2
1612
1613         CAILE   D,NCHRS+NNETS(C)
1614         JRST    WTYP1
1615
1616         MOVEI   0,(D)           ; CHECK THEM
1617         MOVE    B,1(AB)
1618
1619         JUMPE   0,.+4
1620         ILDB    C,B
1621         CAILE   C,32
1622         JRST    WTYP1
1623         SOJG    0,.-3
1624
1625         MOVSI   E,-<NCHRS+NNETS>        ; ZAP CURRENT
1626         HRRZ    A,CHRS(E)
1627         DTI
1628         SETZM   CHRS(E)
1629         AOBJN   E,.-3
1630
1631         MOVE    A,[-NNETS,,NETJFN]      ; IN CASE USED NET INTS FOR CHARS
1632
1633         SKIPGE  (A)
1634         SETZM   (A)
1635         AOBJN   A,.-2
1636
1637         MOVE    E,1(AB)
1638         SETZB   C,F             ; C WILL BE MASK, F OFFSET INTO TABLE
1639         MOVSI   0,400000        ; 0 WILL BE THE BIT FOR INT MASK OR'ING
1640         JUMPE   D,ALP1          ; JUMP IF NONE
1641         MOVNS   D               ; BUILD AOBJN POINTER TO CHRS TABLE
1642         MOVSI   D,(D)
1643         MOVEI   B,0             ; B COUNTS NUMBER DONE
1644
1645 ALP:    ILDB    A,E             ; GET CHR
1646         IOR     C,0
1647         LSH     0,-1
1648         HRROM   A,CHRS(D)
1649         MOVSS   A
1650         HRRI    A,(D)
1651         ADDI    A,(F)           ; POSSIBLE OFFSET FOR MORE CHANS
1652         ATI
1653         ADDI    B,1
1654         CAIGE   B,NCHRS
1655          JRST   ALP2
1656
1657         SKIPE   NETJFN-NCHRS(B)
1658          AOJA   B,.-1
1659
1660         MOVEI   F,36.-NNETS-UINTS-NCHRS(B)
1661         MOVN    G,F
1662         MOVSI   0,400000
1663         LSH     0,(G)                   ;NEW MASK FOR INT MASKS
1664         SUBI    F,1(D)
1665
1666 ALP2:   AOBJN   D,ALP
1667
1668 ALP1:   IORM    C,MASK1
1669         MOVEI   A,MFORK
1670         MOVE    B,MASK1         ; SET UP FOR INT BITS
1671         AIC                     ; TURN THEM ON
1672         MOVE    A,(AB)
1673         MOVE    B,1(AB)
1674         JRST    FINIS
1675
1676 RETCHR: MOVE    C,[-NCHRS-NNETS,,CHRS]
1677         MOVEI   A,0
1678
1679 RETCH1: SKIPN   D,(C)
1680         JRST    RETDON
1681         PUSH    TP,$TCHRS
1682         ANDI    D,177
1683         PUSH    TP,D
1684         ADDI    A,1
1685         AOBJN   C,RETCH1
1686
1687 RETDON: PUSHJ   P,CISTNG
1688         JRST    FINIS
1689
1690 HCHAR:  HRRZ    A,CHRS-36.(B)
1691         PUSH    TP,$TATOM
1692         PUSH    TP,MQUOTE CHAR,CHAR,INTRUP
1693         PUSH    TP,$TCHRS
1694         PUSH    TP,A
1695         PUSH    TP,$TCHAN
1696         PUSH    TP,TTICHN+1
1697         MCALL   3,INTERRUPT
1698         JRST    DIRQ
1699
1700 HNET:   SKIPLE  A,NETJFN-NINT+NNETS+UINTS(B)
1701          JRST   HNET1
1702         SUBI    B,36.-NNETS-UINTS-NCHRS
1703         JUMPE   A,DIRQ
1704         JRST    HCHAR
1705 HNET1:  ASH     A,1
1706         ADDI    A,CHNL0+1
1707         MOVE    B,(A)
1708         PUSH    TP,$TATOM
1709         PUSH    TP,MQUOTE CHAR,CHAR,INTRUP
1710         PUSH    TP,$TUVEC
1711         PUSH    TP,BUFRIN(B)
1712         PUSH    TP,$TCHAN
1713         PUSH    TP,B
1714         PUSHJ   P,INSTAT
1715         MCALL   3,INTERRUPT
1716         JRST    DIRQ
1717
1718 USRINT: SUBI    B,36.
1719         PUSH    TP,$TATOM
1720         PUSH    TP,MQUOTE USERINT,USERINT,INTRUP
1721         PUSH    TP,$TFIX
1722         PUSH    TP,B
1723         MCALL   2,INTERRUPT
1724         JRST    DIRQ
1725 ]
1726
1727 \f
1728 MFUNCTION OFF,SUBR
1729         ENTRY
1730
1731         JUMPGE  AB,TFA
1732         HLRZ    0,AB
1733         GETYP   A,(AB)          ; ARG TYPE
1734         MOVE    B,1(AB)         ; AND VALUE
1735         CAIN    A,TINTH         ; HEADER, GO HACK
1736         JRST    OFFHD           ; QUEEN OF HEARTS
1737         CAIN    A,TATOM
1738         JRST    .+3
1739         CAIE    A,TCHSTR
1740         JRST    TRYHAN          ; MAYBE INDIVIDUAL HANDLER
1741         CAIN    0,-2            ; MORE THAN 1 ARG?
1742         JRST    OFFAC1          ; NO, GO ON
1743         CAIG    0,-5            ; CANT BE MORE THAN 2
1744         JRST    TMA
1745         MOVEI   B,2(AB)         ; POINT TO 2D
1746         PUSHJ   P,CHNORL
1747 OFFAC1: MOVEI   B,(AB)
1748         PUSHJ   P,FNDINT
1749         JUMPGE  B,NOHAN1        ; NOT HANDLED
1750
1751 OFFH1:  PUSH    P,C             ; SAVE C FOR BIT CLOBBER
1752         MOVSI   C,TATOM
1753         SKIPN   D
1754         MOVE    D,MQUOTE INTERRUPT
1755         MOVE    A,INAME(B)
1756         MOVE    B,INAME+1(B)
1757         PUSHJ   P,IREMAS
1758         SKIPE   B               ; IF NO ASSOC, DONT SMASH
1759         SETOM   ISTATE+1(B)     ; DISABLE IN CASE QUEUED
1760         POP     P,C             ; SPECIAL?
1761         JUMPGE  C,FINIS         ;  NO, DONE
1762
1763         HRRZ    C,INTBL(C)      ; POINT TO SPECIAL CODE
1764         PUSHJ   P,(C)           ; GO TO SAME
1765         JUMPE   E,OFINIS        ; DONE
1766 IFN ITS,[
1767         CAILE   E,35.           ; SKIP IF 1ST WORD
1768         JRST    CLRW2           ; CLOBBER 2D WORD BIT
1769         LSH     0,-1(E)         ; POSITION BIT
1770         ANDCAM  0,MASK1         ; KILL BIT
1771         .SUSET  [.SMASK,,MASK1]
1772 ]
1773 IFE ITS,[
1774         MOVE    D,B
1775         SETZM   (E)
1776         MOVEI   E,(E)
1777         SUBI    E,NETJFN-NETCHN
1778         MOVEI   0,1
1779         MOVNS   E
1780         LSH     0,35.(E)
1781         ANDCAM  0,MASK1
1782         MOVEI   A,MFORK
1783         SETCM   B,MASK1
1784         DIC
1785         ANDCAM  0,PIRQ          ; JUST IN CASE
1786         MOVE    B,D
1787 ]
1788 OFINIS: MOVSI   A,TINTH
1789         JRST    FINIS
1790
1791 IFN ITS,[
1792 CLRW2:  LSH     0,-36.(E)       ; POS BIT FOR 2D WORD
1793         ANDCAM  0,MASK2
1794         .SUSET  [.SMSK2,,MASK2]
1795         JRST    OFINIS
1796 ]
1797
1798 TRYHAN: CAIE    A,THAND         ; HANDLER?
1799         JRST    WTYP1
1800         CAIE    0,-2
1801         JRST    TMA
1802         GETYP   0,IPREV(B)      ; GET TYPE OF PREV
1803         MOVE    A,INXT+1(B)
1804         SKIPN   C,IPREV+1(B)    ; dont act silly if already off! (TT)
1805         JRST    HFINIS
1806         MOVE    D,IPREV(B)
1807         CAIE    0,THAND
1808         JRST    DOHEAD          ; PREV HUST BE HDR
1809         MOVEM   A,INXT+1(C)
1810         JRST    .+2
1811 DOHEAD: MOVEM   A,IHNDLR+1(C)   ; INTO HDR
1812         JUMPE   A,OFFINI
1813         MOVEM   D,IPREV(A)
1814         MOVEM   C,IPREV+1(A)
1815 OFFINI: SETZM   IPREV+1(B)      ; Leave NXT slot intact for RUNINT (BKD)
1816         MOVSI   A,THAND
1817         JRST    FINIS
1818
1819 OFFHD:  CAIE    0,-2
1820         JRST    TMA
1821         PUSHJ   P,GETNMS                ; GET INFOR ABOUT INT
1822         JUMPE   C,OFFH1
1823         PUSH    TP,INAME(B)
1824         PUSH    TP,INAME+1(B)
1825         JRST    OFFH1
1826
1827 GETNMS: GETYP   A,INAME(B)      ; CHECK FOR SPECIAL
1828         SETZB   C,D
1829         CAIN    A,TCHAN
1830         HRROI   C,SS.CHA
1831         PUSHJ   P,LOCQ          ; LOCATIVE?
1832         JRST    CHGTNM
1833
1834         MOVEI   B,INAME(B)      ; POINT TO LOCATIVE
1835         MOVSI   D,(MOVE E,)
1836         PUSHJ   P,SMON          ; GET MONITOR
1837         MOVE    B,1(AB)
1838 GETNM1: HRROI   C,SS.WMO        ; ASSUME WRITE
1839         TLNN    E,.WRMON
1840         HRROI   C,SS.RMO
1841         MOVE    D,MQUOTE WRITE,WRITE,INTRUP
1842         TLNN    E,.WRMON
1843         MOVE    D,MQUOTE READ,READ,INTRUP
1844         POPJ    P,
1845
1846 CHGTNM: JUMPL   C,CPOPJ
1847         MOVE    B,INAME+1(B)
1848         PUSHJ   P,SPEC1
1849         MOVE    B,1(AB)         ; RESTORE IHEADER
1850         POPJ    P,
1851 \f
1852 ; EMERGENCY, CANT DEFER ME!!
1853
1854 MQUOTE INTERRUPT
1855
1856 EMERGENCY:
1857         PUSH    P,.
1858         JRST    INTERR+1
1859
1860 MFUNCTION INTERRUPT,SUBR
1861
1862         PUSH    P,[0]
1863
1864         ENTRY
1865
1866         SETZM   INTHLD          ; RE-ENABLE THE WORLD
1867         JUMPGE  AB,TFA
1868         MOVE    B,1(AB)         ; GET HANDLER/NAME
1869         GETYP   A,(AB)          ; CAN BE HEADER OR NAME
1870         CAIN    A,TINTH         ; SKIP IF NOT HEADER
1871         JRST    GTHEAD
1872         CAIN    A,TATOM
1873         JRST    .+3
1874         CAIE    A,TCHSTR        ; SKIP IF CHAR STRING
1875         JRST    WTYP1
1876         MOVEI   B,(AB)          ; LOOK UP NAME
1877         PUSHJ   P,FNDNM         ; GET NAME
1878         JUMPE   B,IFALSE
1879         MOVEI   D,0
1880         CAMN    B,MQUOTE CHAR,CHAR,INTRUP
1881         PUSHJ   P,CHNGT1
1882         CAME    B,MQUOTE READ,READ,INTRUP
1883         CAMN    B,MQUOTE WRITE,WRITE,INTRUP
1884         PUSHJ   P,GTLOC1
1885         PUSHJ   P,INTASO
1886         JUMPE   B,IFALSE
1887
1888 GTHEAD: SKIPE   ISTATE+1(B)     ; ENABLED?
1889         JRST    IFALSE          ; IGNORE COMPLETELY
1890         MOVE    A,INTPRI+1(B)   ; GET PRIORITY OF INTERRUPT
1891         CAMLE   A,CURPRI        ; SEE IF MUST QUEU
1892         JRST    SETPRI          ; MAY RUN NOW
1893         SKIPE   (P)             ; SKIP IF DEFER OK
1894         JRST    DEFERR
1895         MOVEM   A,(P)
1896         PUSH    TP,$TINTH       ; SAVE HEADER
1897         PUSH    TP,B
1898         MOVEI   A,1             ; SAVE OTHER ARGS
1899 PSHARG: ADD     AB,[2,,2]
1900         JUMPGE  AB,QUEU1        ; GO MAKE QUEU ENTRY
1901         PUSH    TP,(AB)
1902         PUSH    TP,1(AB)
1903         AOJA    A,PSHARG
1904 QUEU1:  PUSHJ   P,IEVECT        ; GET VECTOR
1905         PUSH    TP,$TVEC
1906         PUSH    TP,[0]          ; WILL HOLD QUEUE HEADER
1907         PUSH    TP,A
1908         PUSH    TP,B
1909
1910         POP     P,A             ; RESTORE PRIORITY
1911
1912         MOVE    B,QUEUES+1      ; GET INTERRUPT QUEUES
1913         MOVEI   D,0
1914         JUMPGE  B,GQUEU         ; MAKE A QUEUE HDR
1915
1916 NXTQU:  CAMN    A,1(B)          ; GOT PRIORITY?
1917         JRST    ADDQU           ; YES, ADD TO THE QUEU
1918         CAML    A,1(B)          ; SKIP IF SPOT NOT FOUND
1919         JRST    GQUEU
1920         MOVE    D,B
1921         MOVE    B,3(B)          ; GO TO NXT QUEUE
1922         JUMPL   B,NXTQU
1923
1924 GQUEU:  PUSH    TP,$TVEC        ; SAVE NEXT POINTER
1925         PUSH    TP,D
1926         PUSH    TP,$TFIX
1927         PUSH    TP,A            ; SAVE PRIORITY
1928         PUSH    TP,$TVEC
1929         PUSH    TP,B
1930         PUSH    TP,$TLIST
1931         PUSH    TP,[0]
1932         PUSH    TP,$TLIST
1933         PUSH    TP,[0]
1934         MOVEI   A,4
1935         PUSHJ   P,IEVECT
1936         MOVE    D,(TP)          ; NOW SPLICE
1937         SUB     TP,[2,,2]
1938         JUMPN   D,GQUEU1
1939         MOVEM   B,QUEUES+1
1940         JRST    .+2
1941 GQUEU1: MOVEM   B,3(D)
1942
1943 ADDQU:  MOVEM   B,-2(TP)        ; SAVE QUEU HDR
1944         POP     TP,D
1945         POP     TP,C
1946         PUSHJ   P,INCONS        ; CONS IT
1947         MOVE    C,(TP)          ;GET QUEUE HEADER
1948         SKIPE   D,7(C)          ; IF END EXISTS
1949         HRRM    B,(D)           ; SPLICE
1950         MOVEM   B,7(C)
1951         SKIPN   5(C)            ; SKIP IF START EXISTS
1952         MOVEM   B,5(C)
1953
1954 IFINI:  MOVSI   A,TATOM
1955         MOVE    B,IMQUOTE T
1956         JRST    FINIS
1957
1958 SETPRI: EXCH    A,CURPRI
1959         MOVEM   A,(P)
1960
1961         PUSH    TP,$TAB         ; PASS AB TO HANDLERS
1962         PUSH    TP,AB
1963
1964         PUSHJ   P,RUNINT        ; RUN THE HANDLERS
1965         POP     P,A             ; UNQUEU ANY WAITERS
1966         PUSHJ   P,UNQUEU
1967
1968         JRST    IFINI
1969
1970 ; HERE TO UNQUEUE WAITING INTERRUPTS
1971
1972 UNQUEU: PUSH    P,A             ; SAVE NEW LEVEL
1973
1974 UNQUE1: MOVE    A,(P)           ; TARGET LEVEL
1975         CAMLE   A,CURPRI        ; CHECK RUG NOT PULLED OUT
1976         JRST    UNDONE
1977         SKIPE   B,QUEUES+1
1978         CAML    A,1(B)          ; RIGHT LEVEL?
1979         JRST    UNDONE          ; FINISHED
1980
1981         SKIPN   C,5(B)          ; ON QUEUEU?
1982         JRST    UNXQ
1983         HRRZ    D,(C)           ; CDR THE LIST
1984         MOVEM   D,5(B)
1985         SKIPN   D               ; SKIP IF NOT LAST
1986         SETZM   7(B)            ; CLOBBER END POINTER
1987         MOVE    A,1(B)          ; GET THIS PRIORITY LEVEL
1988         MOVEM   A,CURPRI        ; MAKE IT THE CURRENT ONE
1989         MOVE    D,1(C)          ; GET SAVED VECTOR OF INF
1990
1991         MOVE    B,1(D)          ; INT HEADER
1992         PUSH    TP,$TVEC
1993         PUSH    TP,D            ; AND ARGS
1994
1995         PUSHJ   P,RUNINT        ; RUN THEM
1996         JRST    UNQUE1
1997
1998 UNDONE: POP     P,CURPRI        ; SET CURRENT LEVEL
1999         MOVE    A,CURPRI
2000         POPJ    P,
2001
2002 UNXQ:   MOVE    B,3(B)          ; GO  TO NEXT QUEUE
2003         MOVEM   B,QUEUES+1
2004         JRST    UNQUE1
2005
2006
2007
2008 ; SUBR TO CHANGE INTERRUPT LEVEL
2009
2010 MFUNCTION INTLEV,SUBR,[INT-LEVEL]
2011         ENTRY
2012         JUMPGE  AB,RETLEV       ; JUST RETURN CURRENT
2013         GETYP   A,(AB)
2014         CAIE    A,TFIX
2015         JRST    WTYP1           ; LEVEL IS FIXED
2016         SKIPGE  A,1(AB)
2017         JRST    OUTRNG"
2018         CAMN    A,CURPRI        ; DIFFERENT?
2019         JRST    RETLEV          ; NO RETURN
2020         PUSH    P,CURPRI
2021         CAMG    A,CURPRI        ; SKIP IF NO UNQUEUE NEEDED
2022         PUSHJ   P,UNQUEU
2023         MOVEM   A,CURPRI        ; SAVE
2024         POP     P,A
2025         SKIPA   B,A
2026 RETLEV: MOVE    B,CURPRI
2027         MOVSI   A,TFIX
2028         JRST    FINIS
2029
2030 RUNINT: PUSH    TP,$THAND       ; SAVE HANDLERS LIST
2031         PUSH    TP,IHNDLR+1(B)
2032
2033         SKIPN   ISTATE+1(B)     ; SKIP IF DISABLED
2034         SKIPN   B,(TP)
2035         JRST    SUBTP4
2036 NXHND:  MOVEM   B,(TP)          ; SAVE CURRENT HDR
2037         MOVE    A,-2(TP)                ; SAVE ARG POINTER
2038         PUSHJ   P,CHSWAP        ; SEE IF MUST SWAP
2039         PUSH    TP,[0]
2040         PUSH    TP,[0]
2041         MOVEI   C,1             ; COUNT ARGS
2042         PUSH    TP,SPSTOR       ; SAVE INITIAL BINDING POINTER
2043         PUSH    TP,SPSTOR+1
2044         MOVE    D,PVSTOR+1
2045         ADD     D,[1STEPR,,1STEPR]
2046         PUSH    TP,BNDV
2047         PUSH    TP,D
2048         PUSH    TP,$TPVP
2049         PUSH    TP,[0]
2050         MOVE    E,TP
2051 NBIND:  PUSH    TP,INTFCN(B)
2052         PUSH    TP,INTFCN+1(B)
2053         ADD     A,[2,,2]
2054         JUMPGE  A,DO.HND
2055         PUSH    TP,(A)
2056         PUSH    TP,1(A)
2057         AOJA    C,.-4
2058 DO.HND: MOVE    PVP,PVSTOR+1
2059         SKIPN   1STEPR+1(PVP)   ; NECESSARY TO DO 1STEP BINDING ?
2060         JRST    NBIND1          ; NO, DON'T BOTHER
2061         PUSH    P,C
2062         PUSHJ   P,SPECBE        ; BIND 1 STEP FLAG
2063         POP     P,C
2064 NBIND1: ACALL   C,INTAPL        ; RUN HAND WITH POSSIBLY BOUND 1STEP FLAG
2065         MOVE    SP,SPSTOR+1     ; GET CURRENT BINDING POINTER
2066         CAMN    SP,-4(TP)       ; SAME AS SAVED BINDING POINTER ?
2067         JRST    NBIND2          ; YES, 1STEP FLAG NOT BOUND
2068         MOVE    C,(TP)          ; RESET 1 STEP
2069         MOVE    PVP,PVSTOR+1
2070         MOVEM   C,1STEPR+1(PVP)
2071         MOVE    SP,-4(TP)       ; RESTORE SAVED BINDING POINTER
2072         MOVEM   SP,SPSTOR+1
2073 NBIND2: SUB     TP,[6,,6]
2074         PUSHJ   P,CHUNSW
2075         CAMN    E,PVSTOR+1
2076         SUB     TP,[4,,4]       ; NO PROCESS CHANGE, POP JUNK
2077         CAMN    E,PVSTOR+1
2078         JRST    .+4
2079         MOVE    D,TPSTO+1(E)
2080         SUB     D,[4,,4]
2081         MOVEM   D,TPSTO+1(E)    ; FIXUP HIS STACK
2082 DO.H1:  GETYP   A,A             ; CHECK FOR A DISMISS
2083         CAIN    A,TDISMI
2084         JRST    SUBTP4
2085         MOVE    B,(TP)          ; TRY FOR NEXT HANDLER
2086         SKIPE   B,INXT+1(B)
2087         JRST    NXHND
2088 SUBTP4: SUB     TP,[4,,4]
2089         POPJ    P,
2090
2091 MFUNCTION INTAPL,SUBR,[RUNINT]
2092         JRST    APPLY
2093
2094
2095 NOHAND: JUMPE   C,NOHAN1
2096         PUSH    TP,$TATOM
2097         PUSH    TP,EQUOTE INTERNAL-INTERRUPT
2098 NOHAN1: PUSH    TP,(AB)
2099         PUSH    TP,1(AB)
2100         PUSH    TP,$TATOM
2101         PUSH    TP,EQUOTE NOT-HANDLED
2102         SKIPE   A,C
2103         MOVEI   A,1
2104         ADDI    A,2
2105         JRST    CALER
2106
2107 DEFERR: PUSH    TP,$TATOM
2108         PUSH    TP,EQUOTE ATTEMPT-TO-DEFER-UNDEFERABLE-INTERRUPT
2109         PUSH    TP,$TINTH
2110         PUSH    TP,B
2111         PUSH    TP,$TATOM
2112         PUSH    TP,MQUOTE INTERRUPT
2113         MCALL   3,RERR          ; FORCE REAL ERROR
2114         JRST    FINIS
2115
2116 ; FUNCTION TO DISMISS AN INTERRUPT TO AN ARBITRARY ACTIVATION
2117
2118 MFUNCTION DISMISS,SUBR
2119
2120         HLRZ    0,AB
2121         JUMPGE  AB,TFA
2122         CAIGE   0,-6
2123         JRST    TMA
2124         MOVNI   D,1
2125         CAIE    0,-6
2126         JRST    DISMI3
2127         GETYP   0,4(AB)
2128         CAIE    0,TFIX
2129         JRST    WTYP
2130         SKIPGE  D,5(AB)
2131         JRST    OUTRNG
2132
2133 DISMI3: MOVEI   A,(TB)
2134
2135 DISMI0: HRRZ    B,FSAV(A)
2136         HRRZ    C,PCSAV(A)
2137         CAIE    B,INTAPL
2138         JRST    DISMI1
2139
2140         MOVE    E,OTBSAV(A)
2141         MOVEI   0,(A)           ; SAVE FRAME
2142         MOVEI   A,DISMI2
2143         HRRM    A,PCSAV(E)      ; GET IT BACK HERE
2144         MOVE    A,(AB)
2145         MOVE    B,1(AB)
2146         MOVE    C,TPSAV(E)
2147         MOVEM   A,-7(C)
2148         MOVEM   B,-6(C)
2149         MOVEI   C,0
2150         CAMGE   AB,[-3,,]
2151         MOVEI   C,2(AB)
2152         MOVE    B,0             ; DEST FRAME
2153         JUMPL   D,.+3
2154         MOVE    A,PSAV(E)       ; NOW MUNG SAVED INT LEVEL
2155         MOVEM   D,-1(A)         ; ZAP YOUR MUNGED
2156         PUSHJ   P,CHUNW         ; CHECK ON UNWINDERS
2157         JRST    FINIS           ; FALL DOWN
2158
2159 DISMI1: MOVEI   E,(A)
2160         HRRZ    A,OTBSAV(A)
2161         JUMPN   A,DISMI0
2162
2163         MOVE    A,(AB)
2164         MOVE    B,1(AB)
2165
2166         PUSH    TP,A
2167         PUSH    TP,B
2168         SKIPGE  A,D
2169         JRST    .+4
2170         CAMG    A,CURPRI
2171         PUSHJ   P,UNQUEU
2172         MOVEM   A,CURPRI
2173         CAML    AB,[-3,,]
2174         JRST    .+5
2175         PUSH    TP,2(AB)
2176         PUSH    TP,3(AB)
2177         MCALL   2,ERRET
2178         JRST    FINIS
2179
2180         POP     TP,B
2181         POP     TP,A
2182         JRST    FINIS
2183
2184 DISMI2: CAMN    SP,-4(TP)       ; 1STEP FLAG BEEN BOUND ?
2185         JRST    NDISMI          ; NO
2186         MOVE    C,(TP)
2187         MOVE    PVP,PVSTOR+1
2188         MOVEM   C,1STEPR+1(PVP) 
2189         MOVE    SP,-4(TP)
2190 NDISMI: SUB     TP,[6,,6]
2191         PUSHJ   P,CHUNSW        ; UNDO ANY PROCESS HACKING
2192         MOVE    C,TP
2193         CAME    E,PVSTOR+1      ; SWAPED?
2194         MOVE    C,TPSTO+1(E)
2195         MOVE    D,-1(C)
2196         MOVE    0,(C)
2197         SUB     TP,[4,,4]
2198         SUB     C,[4,,4]        ; MAYBE FIXUP OTHER STACK
2199         CAME    E,PVSTOR+1
2200         MOVEM   C,TPSTO+1(E)
2201         PUSH    TP,D
2202         PUSH    TP,0
2203         PUSH    TP,A
2204         PUSH    TP,B
2205         MOVE    A,-1(P)         ; SAVED PRIORITY
2206         CAMG    A,CURPRI
2207         PUSHJ   P,UNQUEU
2208         MOVEM   A,CURPRI
2209         SKIPN   -1(TP)
2210         JRST    .+3
2211         MCALL   2,ERRET
2212         JRST    FINIS
2213
2214         SUB     TP,[4,,4]
2215         MOVSI   A,TDISMI
2216         MOVE    B,IMQUOTE T
2217         JRST    DO.H1
2218         
2219 CHNGT1: HLRE    B,AB
2220         SUBM    AB,B
2221         GETYP   0,-2(B)
2222         CAIE    0,TCHAN
2223         JRST    WTYP3
2224         MOVE    B,-1(B)
2225         MOVSI   A,TCHAN
2226         POPJ    P,
2227
2228 GTLOC1: GETYP   A,2(AB)
2229         PUSHJ   P,LOCQ
2230         JRST    WTYP2
2231         MOVE    D,B             ; RET ATOM FOR ASSOC
2232         MOVE    A,2(AB)
2233         MOVE    B,3(AB)
2234         POPJ    P,
2235 \f; MONITOR CHECKERS
2236
2237 MONCH0: HLLZ    0,(B)           ; POTENTIAL MONITORS
2238 MONCH:  TLZ     0,TYPMSK        ; KILL TYPE
2239         IOR     C,0             ; IN NEW TYPE
2240         PUSH    P,0
2241         MOVEI   0,(B)
2242         CAIL    0,HIBOT
2243         JRST    PURERR
2244         POP     P,0
2245         TLNN    0,.WRMON        ; SKIP IF WRITE MONIT
2246         POPJ    P,
2247
2248 ; MONITOR IS ON, INVOKE HANDLER
2249
2250         PUSH    TP,A            ; SAVE OBJ
2251         PUSH    TP,B
2252         PUSH    TP,C
2253         PUSH    TP,D            ; SAVE DATUM
2254         MOVSI   C,TATOM         ; PREPARE TO FIND IT
2255         MOVE    D,MQUOTE WRITE,WRITE,INTRUP
2256         PUSHJ   P,IGET
2257         JUMPE   B,MONCH1        ; NOT FOUND IGNORE FOR NOW
2258         PUSH    TP,A            ; START SETTING UP CALL
2259         PUSH    TP,B
2260         PUSH    TP,-5(TP)
2261         PUSH    TP,-5(TP)
2262         PUSH    TP,-5(TP)
2263         PUSH    TP,-5(TP)
2264         PUSHJ   P,FRMSTK        ; PUT FRAME ON STAKC
2265         MCALL   4,EMERGE        ; DO IT
2266 MONCH1: POP     TP,D
2267         POP     TP,C
2268         POP     TP,B
2269         POP     TP,A
2270         HLLZ    0,(B)           ; UPDATE MONITORS
2271         TLZ     0,TYPMSK
2272         IOR     C,0
2273         POPJ    P,
2274
2275 ; NOW FOR READ MONITORS
2276
2277 RMONC0: HLLZ    0,(B)
2278 RMONCH: TLNN    0,.RDMON
2279         POPJ    P,
2280         PUSH    TP,A
2281         PUSH    TP,B
2282         MOVSI   C,TATOM
2283         MOVE    D,MQUOTE READ,READ,INTRUP
2284         PUSHJ   P,IGET
2285         JUMPE   B,RMONC1
2286         PUSH    TP,A
2287         PUSH    TP,B
2288         PUSH    TP,-3(TP)
2289         PUSH    TP,-3(TP)
2290         PUSHJ   P,FRMSTK        ; PUT FRAME ON STACK
2291         MCALL   3,EMERGE
2292 RMONC1: POP     TP,B
2293         POP     TP,A
2294         POPJ    P,
2295
2296 ; PUT THE CURRENT FRAME ON THE STACK
2297
2298 FRMSTK: PUSHJ   P,MAKACT
2299         HRLI    A,TFRAME
2300         PUSH    TP,A
2301         PUSH    TP,B
2302         POPJ    P,
2303
2304 ; HERE TO COMPLAIN ABOUT ATTEMPTS TO MUNG PURE CODE
2305
2306 PURERR: PUSH    TP,$TATOM
2307         PUSH    TP,EQUOTE ATTEMPT-TO-MUNG-PURE-STRUCTURE
2308         PUSH    TP,A
2309         PUSH    TP,B
2310         MOVEI   A,2
2311         JRST    CALER
2312 \f
2313 ; PROCESS SWAPPING CODE
2314
2315 CHSWAP: MOVE    E,PVSTOR+1      ; GET CURRENT
2316         POP     P,0
2317         SKIPE   D,INTPRO+1(B)   ; SKIP IF NO PROCESS GIVEN
2318         CAMN    D,PVSTOR+1      ; SKIP IF DIFFERENT
2319         JRST    PSHPRO
2320         
2321         PUSHJ   P,SWAPIT        ; DO SWAP
2322
2323 PSHPRO: PUSH    TP,$TPVP
2324         PUSH    TP,E
2325         JRST    @0
2326
2327 CHUNSW: MOVE    E,PVSTOR+1      ; RET OLD PROC
2328         MOVE    D,-2(TP)        ; GET SAVED PROC
2329         CAMN    D,PVSTOR+1      ; SWAPPED?
2330         POPJ    P,
2331
2332 SWAPIT: PUSH    P,0
2333         MOVE    0,PSTAT+1(D)    ; CHECK STATE
2334         CAIE    0,RESMBL
2335         JRST    NOTRES
2336         MOVE    PVP,PVSTOR+1
2337         MOVEM   0,PSTAT+1(PVP)
2338         MOVEI   0,RUNING
2339         MOVEM   0,PSTAT+1(D)    ; SAVE NEW STATE
2340         POP     P,0
2341         POP     P,C
2342         JRST    SWAP"
2343 \f
2344
2345 ;SUBROUTINE TO GET BIT FOR CLOBBERAGE
2346
2347 GETBIT: MOVNS   B               ;NEGATE
2348         MOVSI   A,400000        ;GET THE BIT
2349         LSH     A,(B)           ;SHIFT TO POSITION
2350         POPJ    P,              ;AND RETURN
2351
2352 ; HERE TO HANDLE PURE WRITE AND CHECK FOR POSSIBLE C/W
2353
2354 IFN ITS,[
2355 GCPWRT: SKIPN   GCDFLG          ; SEE IF IN DUMPER OR PURIFYER
2356         SKIPE   NPWRIT
2357         JRST    .+3
2358         MOVEI   B,4             ; INDICATE PURE WRITE
2359         JRST    NOPUGC          ; CONTINUE
2360         TLZ     A,200
2361         MOVEM   A,TSINT         ; SVE A
2362         MOVE    A,TSAVA
2363         SOS     TSINTR
2364         .SUSET  [.RMPVA,,A]
2365         CAML    A,RPURBT        ; SKIP IF NOT PURE
2366         CAIL    A,HIBOT         ; DONT MARK IF TOUCHING INTERPRETER
2367         SKIPA
2368         SETOM   PURMNG          ; MUNGING PURENESS INDICATE
2369         MOVE    B,BUFGC         ; GET BUFFER
2370         JUMPL   B,GCPW1         ; JUMP IF WINDOW IS BUFFER
2371         EXCH    P,GCPDL
2372         PUSHJ   P,%CWINF        ; GO DO COPY/WRITE
2373 GCPW2:  EXCH    P,GCPDL
2374         MOVE    A,TSINT         ; RESTORE A
2375         JRST    2NDWORD         ; CONTINUE
2376 GCPW1:  EXCH    P,GCPDL
2377         MOVEI   B,WIND          ; START OF BUFFER
2378         PUSHJ   P,%CWINF        ; C/W
2379         MOVEI   B,WNDP          ; RESTORE WINDOW
2380         MOVE    A,WNDBOT        ; BOTTOM OF WINDOW
2381         ASH     A,-10.          ; TO PAGES
2382         SKIPE   A
2383         PUSHJ   P,%SHWND        ; SHARE IT
2384         JRST    GCPW2
2385 ]
2386 IFE ITS,[
2387
2388 ; HERE TO HANDLE BUFFERING FOR GC-DUMP AND PURIFY FOR TENEX
2389
2390 PWRIT:  SKIPN   GCDFLG          ; SEE IF IN DUMPER OR PURIFYER
2391         SKIPE   GPURFL
2392         SKIPA
2393         FATAL IMW
2394         EXCH    P,GCPDL         ; GET A GOOD PDL
2395         MOVEM   A,TSAVA         ; SAVE AC'S
2396         MOVEM   B,TSAVB
2397         MOVEI   A,MFORK         ; FOR TWENEX  THIS IS A MOVEI
2398         SKIPE   OPSYS           ; SKIP IF TOPS20
2399         MOVSI   A,MFORK         ; FOR A TENEX IT SHOULD BE A MOVSI 
2400         GTRPW                   ; GET TRAP WORDS
2401         PUSH    P,A             ; SAVE ADDRESS AND WORD
2402         PUSH    P,B
2403         ANDI    A,-1
2404         CAML    A,RPURBT        ; SKIP IF NOT PURE
2405         CAIL    A,HIBOT         ; DONT MARK IF TOUCHING INTERPRETER
2406         SKIPA
2407         SETOM   PURMNG          ; MUNGING PURENESS INDICATE
2408         MOVE    B,BUFGC         ; GET BUFFER
2409         ANDCMI  A,1777          ; TO PAGE BOUNDRY
2410         JUMPL   B,PWRIT2        ; USE WINDOW AS BUFFER
2411 PWRIT3: PUSHJ   P,%CWINF        ; FIX UP
2412 PWRIT4: POP     P,B             ; RESTORE AC'S
2413         POP     P,A
2414         TLNN    A,10            ; SEE IF R/W CYCLE
2415         MOVEM   B,(A)           ; FINISH WRITE
2416         EXCH    P,GCPDL
2417         JRST    INTDON
2418 PWRIT2: MOVEI   B,WIND
2419         PUSHJ   P,%CWINF        ; GO TRY TO WIN
2420         MOVEI   B,WNDP
2421         MOVE    A,WNDBOT        ; BOTTOM OF WINDOW
2422         ASH     A,-10.          ; TO PAGES
2423         SKIPE   A
2424         PUSHJ   P,%SHWND        ; SHARE IT
2425         JRST    PWRIT4
2426 ]
2427
2428 ;HERE TO HANDLE PDL OVERFLOW.  ASK FOR A GC
2429
2430 IPDLOV:
2431 IFN ITS,[
2432         MOVEM   A,TSINT         ;SAVE INT WORD
2433 ]
2434
2435         SKIPE   GCFLG           ;IS GC RUNNING?
2436         JRST    GCPLOV          ;YES, COMPLAIN GROSSLY
2437
2438         MOVEI   A,200000        ;GET BIT TO CLOBBER
2439         IORM    A,PIRQ          ;LEAVE A MESSAGE FOR HIGHER LEVEL
2440
2441         EXCH    P,GCPDL         ;GET A WINNING PDL
2442         HRRZ    B,TSINTR        ;GET POINTER TO LOSING INSTRUCTION
2443 IFE ITS,[
2444         SKIPE   MULTSG
2445          MOVE   B,TSINTR+1
2446 ]
2447         SKIPG   GCPDL           ; SKIP IF NOT P
2448         LDB     B,[270400,,-1(B)]       ;GET AC FIELD
2449         SKIPL   GCPDL           ; SKIP IF P
2450         MOVEI   B,P
2451         MOVEI   A,(B)           ;COPY IT
2452         LSH     A,1             ;TIMES 2
2453         EXCH    PVP,PVSTOR+1
2454         ADDI    A,0STO(PVP)     ;POINT TO THIS ACS CURRENT TYPE
2455         EXCH    PVP,PVSTOR+1
2456         HLRZ    A,(A)           ;GET THAT TYPE INTO A
2457         CAIN    B,P             ;IS IT P
2458         MOVEI   B,GCPDL         ;POINT TO SAVED P
2459
2460         CAIN    B,B             ;OR IS IT B ITSELF
2461         MOVEI   B,TSAVB
2462         CAIN    B,A             ;OR A
2463         MOVEI   B,TSAVA
2464
2465         CAIN    B,C             ;OR C
2466         MOVEI   B,1(P)          ;C WILL BE ON THE STACK
2467
2468         PUSH    P,C
2469         PUSH    P,A
2470
2471         MOVE    A,(B)           ;GET THE LOSING POINTER
2472         MOVEI   C,(A)           ;AND ISOLATE RH
2473
2474         CAMG    C,VECTOP        ;CHECK IF IN GC SPACE
2475         CAMG    C,VECBOT
2476         JRST    NOGROW          ;NO, COMPLAIN
2477
2478 ; FALL THROUGH
2479 \f
2480
2481         HLRZ    C,A             ;GET -LENGTH
2482         SUBI    A,-1(C)         ;POINT TO A DOPE WORD
2483         POP     P,C             ;RESTORE TYPE INTO C
2484         PUSH    P,D             ; SAVE FOR GROWTH HACKER
2485         MOVEI   D,0
2486         CAIN    C,TPDL          ; POINT TD TO APPROPRIATE DOPE WORD
2487         MOVEI   D,PGROW
2488         CAIN    C,TTP
2489         MOVEI   D,TPGROW
2490         JUMPE   D,BADPDL        ; IF D STILL 0, THIS PDL IS WEIRD
2491         MOVEI   A,PDLBUF(A)     ; POINT TO ALLEGED REAL DOPE WORD
2492         SKIPN   (D)             ; SKIP IF PREVIOUSLY BLOWN
2493         MOVEM   A,(D)           ; CLOBBER IN
2494         CAME    A,(D)           ; MAKE SURE IT IS THE SAME
2495         JRST    PDLOSS
2496         POP     P,D             ; RESTORE D
2497
2498
2499 PNTRHK: MOVE    C,(B)           ;RESTORE PDL POINTER
2500         SUB     C,[PDLBUF,,0]   ;FUDGE THE POINTER
2501         MOVEM   C,(B)           ;AND STORE IT
2502
2503         POP     P,C             ;RESTORE THE WORLD
2504         EXCH    P,GCPDL         ;GET BACK ORIG PDL
2505 IFN ITS,[
2506         MOVE    A,TSINT         ;RESTORE INT WORD
2507
2508         JRST    IMPCH           ;LOOK FOR MORE INTERRUPTS
2509 ]
2510 IFE ITS,        JRST    GCQUIT
2511
2512 TPOVFL: SETOM   INTFLG          ;SIMULATE PDL OVFL
2513         PUSH    P,A
2514         MOVEI   A,200000        ;TURN ON THE BIT
2515         IORM    A,PIRQ
2516         HLRE    A,TP            ;FIND DOPEW
2517         SUBM    TP,A            ;POINT TO DOPE WORD
2518         MOVEI   A,PDLBUF+1(A)   ; ZERO LH AND POINT TO DOPEWD
2519         SKIPN   TPGROW
2520         HRRZM   A,TPGROW
2521         CAME    A,TPGROW        ; MAKE SURE WINNAGE
2522         JRST    PDLOS1
2523         SUB     TP,[PDLBUF,,0]  ; HACK STACK POINTER
2524         POP     P,A
2525         POPJ    P,
2526
2527
2528 ; GROW CORE IF PDL OVERFLOW DURING GC
2529
2530 GCPLOV: EXCH    P,GCPDL         ; NEED A PDL TO CALL P.CORE
2531         PUSHJ   P,GPDLOV        ; HANDLE PDL OVERFLOW
2532         EXCH    P,GCPDL
2533         PUSHJ   P,%FDBUF
2534 IFE ITS,[
2535         JRST    GCQUIT
2536 ]
2537 IFN ITS,[
2538         MOVE    A,TSINT
2539         JRST    IMPCH
2540
2541 ]
2542 \f
2543 IFN ITS,[
2544
2545 ;HERE TO HANDLE LOW-LEVEL CHANNELS
2546
2547
2548 CHNACT: SKIPN   GCFLG           ;GET A WINNING PDL
2549         EXCH    P,GCPDL
2550         ANDI    A,177777        ;ISOLATE CHANNEL BITS
2551         PUSH    P,0             ;SAVE
2552
2553 CHNA1:  MOVEI   B,0             ;BIT COUNTER
2554         JFFO    A,.+2           ;COUNT
2555         JRST    CHNA2
2556         SUBI    B,35.           ;NOW HAVE CHANNEL
2557         MOVMS   B               ;PLUS IT
2558         MOVEI   0,1
2559         LSH     0,(B)
2560         ANDCM   A,0
2561         MOVEI   0,(B)           ; COPY TO 0
2562         LSH     0,23.           ;POSITION FOR A .STATUS
2563         IOR     0,[.STATUS 0]
2564         XCT     0               ;DO IT
2565         ANDI    0,77            ;ISOLATE DEVICE
2566         CAILE   0,2
2567         JRST    CHNA1
2568
2569 PMIN4:  MOVE    0,B             ; CHAN TO 0
2570         .ITYIC  0,              ; INTO 0
2571         JRST    .+2             ; DONE, GO ON
2572         JRST    PMIN4
2573         SETZM   GCFLCH          ; LEAVE GC MODE
2574         JRST    CHNA1
2575
2576 CHNA2:  POP     P,0
2577         SKIPN   GCFLG
2578         EXCH    P,GCPDL
2579         JRST    GCQUIT
2580
2581 HOWMNY: SETZ
2582         SIXBIT /LISTEN/
2583         D
2584         402000,,B
2585 ]
2586
2587 MFUNCTION GASCII,SUBR,ASCII
2588         ENTRY   1
2589
2590         GETYP   A,(AB)
2591         CAIE    A,TCHRS
2592         JRST    TRYNUM
2593
2594         MOVE    B,1(AB)
2595         MOVSI   A,TFIX
2596         JRST    FINIS
2597
2598 TRYNUM: CAIE    A,TFIX
2599         JRST    WTYP1
2600         SKIPGE  B,1(AB)         ;GET NUMBER
2601         JRST    TOOBIG
2602         CAILE   B,177           ;CHECK RANGE
2603         JRST    TOOBIG
2604         MOVSI   A,TCHRS
2605         JRST    FINIS
2606
2607 TOOBIG: ERRUUO  EQUOTE ARGUMENT-OUT-OF-RANGE
2608
2609 \f
2610 ;HERE IF PDL OVERFLOW DURING GARBAGE COLLECTION
2611
2612 BADPDL: FATAL   NON PDL OVERFLOW
2613
2614 NOGROW: FATAL   PDL OVERFLOW ON NON EXPANDABLE PDL
2615
2616 PDLOS1: MOVEI   D,TPGROW
2617 PDLOSS: MOVSI   A,(GENERAL)     ; FIX UP TP DOPE WORD JUST IN CASE
2618         HRRZ    D,(D)           ; POINT TO POSSIBLE LOSING D.W.
2619         SKIPN   TPGROW
2620         JRST    PDLOS2
2621         MOVEM   A,-1(D)
2622         MOVEI   A,(TP)          ; SEE IF REL STACK SIZE WINS
2623         SUBI    A,(TB)
2624         TRNN    A,1
2625         SUB     TP,[1,,1]
2626 PDLOS2: MOVSI   A,.VECT.
2627         SKIPE   PGROW
2628         MOVEM   A,-1(D)
2629         SUB     P,[2,,2]                ; TRY TO RECOVER GRACEFULLY
2630         EXCH    P,GCPDL
2631         MOVEI   A,DOAGC         ; SET UP TO IMMEDIATE GC
2632 IFN ITS,[
2633         HRRM    A,TSINTR
2634 ]
2635 IFE ITS,[
2636         SKIPE   MULTSG
2637          HRRM   A,TSINTR+1
2638         SKIPN   MULTSG
2639          HRRM   A,TSINTR
2640 ]
2641 IFN ITS,        .DISMIS TSINTR
2642 IFE ITS,        DEBRK
2643
2644 DOAGC:  SKIPE   PGROW
2645         SUB     P,[2,,2]        ; ALLOW ROOM FOR CALL
2646         JSP     E,PDL3          ; CLEANUP
2647         ERRUUO  EQUOTE PDL-OVERFLOW-BUFFER-EXHAUSTED
2648
2649
2650 DLOSER: PUSH    P,LOSRS(B)
2651         MOVE    A,TSAVA
2652         MOVE    B,TSAVB
2653         POPJ    P,
2654
2655 LOSRS:  IMPV
2656         ILOPR
2657         IOC
2658         IPURE
2659
2660
2661 ;MEMORY PROTECTION INTERRUPT
2662
2663 IOC:    FATAL   IO CHANNEL ERROR IN GARBAGE COLLECTOR
2664 IMPV:   FATAL   MPV IN GARBAGE COLLECTOR
2665
2666 IPURE:  FATAL   PURE WRITE IN GARBAGE COLLECTOR
2667 ILOPR:  FATAL   ILLEGAL OPEREATION IN GARBAGE COLLECTOR
2668
2669 IFN ITS,[
2670
2671 ;SUBROUTINE TO BE CALLED AT INITIALIZE TIME TO SETUP INTS
2672
2673 INTINT: SETZM   CHNCNT
2674         MOVE    A,[CHNCNT,,CHNCNT+1]
2675         BLT     A,CHNCNT+16.
2676         SETZM   INTFLG
2677         .SUSET  [.SPICLR,,[-1]]
2678         MOVE    A,MASK1         ;SET MASKS
2679         MOVE    B,MASK2
2680         .SETM2  A,              ;SET BOTH MASKS
2681         MOVSI   A,TVEC
2682         MOVEM   A,QUEUES
2683         SETZM   QUEUES+1        ;UNQUEUE ANY OLD INTERRUPTS
2684         SETZM   CURPRI
2685         POPJ    P,
2686 ]
2687 IFE ITS,[
2688
2689 ; INITIALIZE TENEX INTERRUPT SYSTEM
2690
2691 INTINT: CIS                     ; CLEAR THE INT WORLD
2692         SETZM   INTFLG          ; IN CASE RESTART
2693         MOVSI   A,TVEC          ; FIXUP QUEUES
2694         MOVEM   A,QUEUES
2695         SETZM   QUEUES+1
2696         SETZM   CURPRI          ; AND PRIORITY LEVEL
2697         MOVEI   A,MFORK         ; TURN ON MY INTERRUPTS
2698         SKIPN   MULTSG
2699          JRST   INTINM
2700         PUSHJ   P,@[DOSIR]      ; HACK TO TEMP GET TO SEGMENT 0
2701         JRST    INTINX
2702
2703 INTINM: MOVE    B,[-36.,,CHNTAB]
2704         MOVSI   0,1
2705         HLLM    0,(B)
2706         AOBJN   B,.-1
2707
2708         MOVE    B,[LEVTAB,,CHNTAB]      ; POINT TO TABLES
2709         SIR                     ; TELL SYSTEM ABOUT THEM
2710
2711 INTINX: MOVSI   D,-NCHRS
2712         MOVEI   0,40
2713         MOVEI   C,0
2714
2715 INTILP: SKIPN   A,CHRS(D)
2716         JRST    ITTIL1
2717         IOR     C,0
2718         MOVSS   A
2719         HRRI    A,(D)
2720         ATI
2721 ITTIL1: LSH     0,-1
2722         AOBJN   D,INTILP
2723
2724         DPB     C,[360600,,MASK1]
2725         MOVE    B,MASK1         ; SET UP FOR INT BITS
2726         MOVEI   A,MFORK
2727         AIC                     ; TURN THEM ON
2728         MOVEI   A,MFORK         ; DO THE ENABLE
2729         EIR
2730         POPJ    P,
2731
2732
2733 DOSIR:  MOVE    B,[-36.,,CHNTAB]
2734         MOVSI   0,1_12.
2735         HLLM    0,(B)
2736         AOBJN   B,.-1
2737
2738         MOVEI   B,..ARGB        ; WILL RUN IN SEGMENT 0
2739 RMT [
2740 ..ARGB: 3
2741         LEVTAB
2742         CHNTAB
2743 ]
2744         XSIR
2745         POP     P,D
2746         HRLI    D,FSEG
2747         XJRST   C               ; GET BACK TO CALLING SEGMENT
2748 ]
2749 \f
2750
2751 ; CNTL-G HANDLER
2752
2753 MFUNCTION QUITTER,SUBR
2754
2755         ENTRY   2
2756         GETYP   A,(AB)
2757         CAIE    A,TCHRS
2758         JRST    WTYP1
2759         GETYP   A,2(AB)
2760         CAIE    A,TCHAN
2761         JRST    WTYP2
2762         MOVE    B,1(AB)
2763         MOVE    A,(AB)
2764 IFE ITS,        CAIE    ^O
2765         CAIN    B,^S            ; HANDLE CNTL-S
2766         JRST    RETLIS
2767         CAIE    B,7
2768         JRST    FINIS
2769
2770         PUSHJ   P,CLEAN         ; CLEAN UP I/O CHANNELS
2771         PUSH    TP,$TATOM
2772         PUSH    TP,EQUOTE CONTROL-G?
2773         MCALL   1,ERROR
2774         JRST    FINIS
2775
2776 RETLIS: MOVE    B,IMQUOTE LER,[LERR ]INTRUP
2777         PUSHJ   P,ILVAL         ; GET CURRENT VALUE
2778         PUSH    TP,A
2779         PUSH    TP,B
2780         MOVEI   B,-1(TP)
2781         PUSHJ   P,CHFSWP
2782         SUB     TP,[2,,2]
2783         MOVEI   D,(TB)          ; FIND A LISTEN OR ERROR TO RET TO
2784
2785 RETLI1: HRRZ    A,OTBSAV(D)
2786         CAIN    A,(B)           ; CHECK FOR WINNER
2787         JRST    FNDHIM
2788         HRRZ    C,FSAV(A)       ; CHECK FUNCTION
2789         CAIE    C,LISTEN
2790         CAIN    C,ERROR         ; FOUND?
2791         JRST    FNDHIM          ; YES, GO TO SAME
2792         CAIN    C,ERROR%        ; FUNNY ERROR
2793         JRST    FNDHIM
2794         CAIN    C,TOPLEV        ; NO ERROR/LISTEN
2795         JRST    FINIS
2796         MOVEI   D,(A)
2797         JRST    RETLI1
2798
2799 FNDHIM: PUSH    TP,$TTB
2800         PUSH    TP,D
2801         PUSHJ   P,CLEAN
2802         MOVE    B,(TP)          ; NEW FRAME
2803         SUB     TP,[2,,2]
2804         MOVEI   C,0
2805         PUSHJ   P,CHUNW         ; UNWIND?
2806         MOVSI   A,TATOM
2807         MOVE    B,IMQUOTE T
2808         JRST    FINIS
2809
2810 CLEAN:  MOVE    B,3(AB)         ; GET IN CHAN
2811         PUSHJ   P,RRESET
2812         MOVE    B,3(AB)         ; CHANNEL BAKC
2813         MOVE    C,BUFRIN(B)
2814         SKIPN   C,ECHO(C)       ; GET ECHO
2815         JRST    CLUNQ
2816 IFN ITS,[
2817         MOVEI   A,2
2818         CAMN    C,[PUSHJ P,MTYO]
2819         JRST    TYONUM
2820         LDB     A,[270400,,C]
2821 TYONUM: LSH     A,23.
2822         IOR     A,[.RESET]
2823         XCT     A
2824 ]
2825 IFE ITS,[
2826         MOVEI   A,101           ; OUTPUT JFN
2827         CFOBF
2828 ]
2829
2830 CLUNQ:  SETZB   A,CURPRI
2831         JRST    UNQUEU
2832
2833 \f
2834 IMPURE
2835 ONINT:  0               ; INT FUDGER
2836 INTBCK: 0               ; GO BACK TO THIS PC AFTER INTERRUPT
2837         MOVEM   TP,TPSAV(TB)            ; SAVE STUFF
2838         MOVEM   P,PSAV(TB)
2839 INTBEN: SKIPL   INTFLG          ; PENDING INTS?
2840         JRST    @INTBCK
2841         PUSH    P,A
2842         SOS     A,INTBCK
2843         SETZM   INTBCK
2844         MOVEM   A,LCKINT
2845         POP     P,A
2846         JRST    LCKINT+1
2847
2848
2849 IFN ITS,[
2850 ;RANDOM IMPURE CRUFT NEEDED
2851 CHNCNT: BLOCK   16.     ; # OF CHARS IN EACH CHANNEL
2852
2853 TSAVA:  0
2854 TSAVB:  0
2855 PIRQ:   0                       ;HOLDS REQUEST BITS FOR 1ST WORD
2856 PIRQ2:  0                       ;SAME FOR WORD 2
2857 PCOFF:  0
2858 MASK1:  200,,200100                     ;FIRST MASK
2859 MASK2:  0                       ;SECOND THEREOF
2860 CURPRI: 0               ; CURRENT PRIORITY
2861 RLTSAV: 0
2862 ]
2863 IFE ITS,[
2864 CHRS:   7                       ; CNTL-G
2865         23                      ; CNTL-O
2866         17                      ; CNTL-S
2867         BLOCK   NCHRS-3
2868
2869 NETJFN: BLOCK   NNETS
2870 MASK1:  CHNMSK
2871 RLTSAV: 0
2872 TSINTR:
2873 P1:     0
2874         0                       ; PC INT LEVEL 1 (1ST WORD IN 1 SEG MODE, 2D
2875                                 ;               IN MULTI SEG MODE)
2876 P2:     0
2877         0                       ; PC INT LEVEL 2
2878 P3:     0
2879         0                       ; PC INT LEVEL 3
2880 CURPRI: 0
2881 TSAVA:  0
2882 TSAVB:  0
2883 PIRQ:   0
2884 PIRQ2:  0
2885 IOCLOS: 0                       ; HOLDS LOSING JFN IN TNX IOC
2886 ]
2887 PURE
2888
2889 END
2890 \f