483cc8bef331b8ba009b371bc2c632f610591fbc
[pdp10-muddle.git] / MUDDLE / ninter.4
1
2 TITLE INTERRUPT HANDLER FOR MUDDLE
3
4 RELOCATABLE
5
6 ;C. REEVE  APRIL 1971
7
8 .INSRT MUDDLE >
9
10 NINT==72.       ;MAXIMUM NUMBER OF INTERRUPTS POSSIBLE
11
12 ;SET UP LOCATION 42 TO POINT TO TSINT
13
14 ZZZ==.  ;SAVE CURRENT LOCATION
15
16 LOC 42
17 î       JSR     TSINT           ;GO TO HANDLER
18
19 LOC ZZZ
20
21 ; GLOBALS NEEDED BY INTERRUPT HANDLER
22
23 .GLOBA GCFLG    ;TELLS WHETHER OR NOT GARBAGE COLLECTOR IS RUNNING
24 .GLOBA GCINT    ;TELLS GARBAGE COLLECTOR TO SIMULATE AN INTERRUPT
25 .GLOBAL INTNUM,INTVEC   ;TV ENTRIES CONCERNING INTERRUPTS
26 .GLOBAL AGC     ;CALL THE GARBAGE COLLECTOR
27 .GLOBAL VECNEW,PARNEW,GETNUM    ;GC PSEUDO ARGS
28 .GLOBAL GCPDL   ;GARBAGE COLLECTORS PDL
29 .GLOBAL VECTOP,VECBOT   ;DELIMIT VECTOR SPACE
30 .GLOBAL PDLBUF  ;AMOUNT OF  PDL GROWTH
31 .GLOBAL PGROW   ;POINTS TO DOPE WORD OF NEXT PDL TO GROW
32 .GLOBAL TPGROW  ;POINTS TO NEXT MUDDLE PDL TO GROW
33 .GLOBAL PPGROW  ;BLOWN PLANNER PDL
34 .GLOBAL PLDGRO  ;SEE ABOVE
35 .GLOBAL CALER1,TMA,TFA
36 .GLOBAL BUFRIN,CHANL0,SYSCHR    ;CHANNEL GLOBALS
37 .GLOBAL IFALSE,TPOVFL,PDLOSS
38 .GLOBAL FLFLG   ;-1  IFF INTERRUPT IN FAIL
39
40
41 .GLOBAL INTINT  ;CALLED BY INITIALIZER TO TAKE CARE OF INT PCS
42
43 .GLOBAL MSGTYP,TYI,IFLUSH,OCLOS,ERRET   ;SUBROUTINES USED
44 ;BEGINNING OF ACTUAL INTERRUPT HANDLER (MUST BE IMPURE)
45
46 TSINT:  0                       ;INTERRUPT BITS GET STORED HERE
47 TSINTR: 0                       ;INTERRUPT PC WORD STORED HERE
48         JRST    TSINTP          ;GO TO PURE CODE
49
50 ; SOFTWARE INTERNAL INTERRUPTS JSR TO HERE
51
52 LCKINT: 0
53         JRST    DOINT
54
55 ;THE REST OF THIS CODE IS PURE
56
57 TSINTP: SOSGE   INTFLG          ; SKIP IF ENABLED
58         SETOM   INTFLG          ;DONT GET LESS THAN -1
59
60         MOVEM   A,TSAVA         ;SAVE TWO ACS
61         MOVEM   B,TSAVB
62         MOVE    A,TSINT         ;PICK UP INT BIT PATTERN
63         JUMPL   A,2NDWORD       ;DONT CHECK FOR PDL OVERFLOW ETC. IF SIGN BIT ON
64
65         TRZE    A,200000        ;IS THIS A PDL OVERFLOW?
66         JRST    IPDLOV          ;YES, GO HANDLE IT FIRST
67
68 IMPCH:  TRZE    A,20000         ;IS IT A MEMORY PROTECTION VIOLATION?
69         JRST    IMPV            ;YES, GO HANDLE IT
70
71         TRZE    A,40            ;ILLEGAL OP CODE?
72         JRST    ILOPR           ;YES, GO HANDLE
73
74 ;DECODE THE REST OF THE INTERRUPTS USING A TABLE
75
76 2NDWORD:
77         JUMPL   A,GC2           ;2ND WORD?
78         IORM    A,PIRQ          ;NO, INTO WORD 1
79         JRST    GCQUIT          ;AND DISMISS INT
80
81 GC2:    TLZ     A,400000        ;TURN OFF SIGN BIT
82         IORM    A,PIRQ2
83         TRNE    A,177777        ;CHECK FOR CHANNELS
84         JRST    CHNACT          ;GO IF CHANNEL ACTIVITY
85
86 GCQUIT: SKIPGE  INTFLG          ;SKIP IF INTERRUPTS ENABLED
87         JRST    INTDON          ;NO, DEFER REAL HANDLING UNTIL LATER
88
89         MOVE    A,TSINTR        ;PICKUP RETURN WORD
90         MOVEM   A,LCKINT        ;STORE ELSEWHERE
91         MOVEI   A,DOINTE        ;CAUSE DISMISS TO HANDLER
92         HRRM    A,TSINTR        ;STORE IN INT RETURN
93         PUSH    P,INTFLG        ;SAVE INT FLAG
94         SETOM   INTFLG          ;AND DISABLE
95
96
97 INTDON: MOVE    A,TSAVA         ;RESTORE ACS
98         MOVE    B,TSAVB
99         .DISMISS        TSINTR          ;AND DISMISS THE INTERRUPT
100
101 ; HERE IF INTERRUPTED IN OTHER THAN GC
102
103 DOINT:  PUSH    P,INTFLG
104 DOINTE: PUSH    P,LCKINT        ;SAVE RETURN
105         SETZM   INTFLG          ;DISABLE
106         AOS     -1(P)           ;INCR SAVED FLAG
107
108 ;NOW SAVE WORKING ACS
109
110 IRP A,,[0,A,B,C,D,E]
111         PUSH    TP,A!STO(PVP)
112         SETZM   A!STO(PVP)      ;NOW ZERO TYPE
113         PUSH    TP,A
114         TERMIN
115         PUSH    P,INTNUM+1(TVP) ;PUSH CURRENT VALUE
116
117 DIRQ:   MOVE    A,PIRQ          ;NOW SATRT PROCESSING
118         JFFO    A,FIRQ          ;COUNT BITS AND GO
119         MOVE    A,PIRQ2         ;1ST DONE, LOOK AT 2ND
120         JFFO    A,FIRQ2
121
122 INTDN1:
123         POP     P,INTNUM+1(TVP) ;RESTORE CURRENT
124 IRP A,,[E,D,C,B,A,0]
125         POP     TP,A
126         POP     TP,A!STO(PVP)
127         TERMIN
128
129         POP     P,LCKINT
130         POP     P,INTFLG
131         JRST    @LCKINT         ;AND RETURN
132
133 FIRQ:   PUSHJ   P,GETBIT        ;SET UP THE BIT TO CLOBBER IN PIRQ
134         ANDCAM  A,PIRQ          ;CLOBBER IT
135         ADDI    B,36.           ;OFSET INTO TABLE
136         JRST    XIRQ            ;GO EXECUTE
137
138 FIRQ2:  PUSHJ   P,GETBIT        ;PREPARE TO CLOBBER BIT
139         ANDCAM  A,PIRQ2         ;CLOBBER IT
140         ADDI    B,71.           ;AGAIN OFFSET INTO TABLE
141 XIRQ:
142         CAIN    B,21            ;PDL OVERFLOW?
143         JRST    PDL2            ;YES, HACK APPROPRIATELY
144         MOVEM   B,INTNUM+1(TVP) ;AND SAVE
145         LSH     B,1             ;TIMES 2
146         ADD     B,INTVEC+1(TVP) ;POINT TO LIST OF TASKS
147         SKIPN   A,(B)           ;ANY TASKS?
148         JRST    DIRQ            ;NO, PUNT
149
150         PUSH    TP,$TLIST       ;SAVE LIST
151         PUSH    TP,A
152 DOINTS: HLRZ    C,(A)           ;GET TYPE
153         CAIE    C,TLIST         ;LIST?
154         JRST    IWTYP
155         HRRZ    A,1(A)
156         JUMPE   A,IWTYP         ;LIST IS NIL, LOSE
157         HLRZ    C,(A)           ;CHECK FOR A PROCESS
158         CAIE    C,TPVP
159         JRST    IWTYP
160         HRRZ    D,(A)           ;POINT TO 2D PART OF PAIR
161         PUSH    TP,(D)          ;SETUP CALL TO EVAL
162         PUSH    TP,1(D)
163         MOVE    D,TB            ;GET CURRENT FRAME POINTER
164         MOVE    C,1(A)          ;GET PROCESS WHO WANTS THIS INTERRUPT
165         CAME    C,PVP           ;SKIP IF CURRENT PROCESS
166         MOVE    D,TBSTO+1(C)    ;GET SAVED FRAME
167         HLRE    A,C             ;COMPUTE DOPE WORD POINTER
168         SUBI    C,-1(A)         ;HAVE POINTER
169         HRLI    C,TFRAME        ;BUILD A FRAME HACK
170         HLL     D,OTBSAV(D)     ;GET A WINNING TIME
171         PUSH    TP,C            ;AND PUSH IT
172         PUSH    TP,D
173         MCALL   2,EVAL
174 INTCDR: HRRZ    A,@(TP)         ;CDR THE LIST OF TASKS
175         JUMPE   A,TPPOP
176         MOVEM   A,(TP)          ;SAVE THE CDR'D LIST
177         JRST    DOINTS
178
179 TPPOP:  SUB     TP,[2,,2]       ;REMOVE LIST
180         JRST    DIRQ
181
182 IWTYP:  PUSH    TP,(A)          ;SAVE TASK
183         PUSH    TP,1(A)
184         PUSH    TP,$TATOM
185         PUSH    TP,MQUOTE BAD-INTERRUPT-HANDLER-TASK-IGNORED
186         MCALL   1,PRINT
187         MCALL   1,PRINT
188         JRST    INTCDR
189
190 PDL2:   MOVEI   B,PDLGRO_-6     ;GET GROWTH SPEC
191         SKIPE   A,PGROW         ;SKIP IF A P IS NOT GROWING
192         DPB     B,[111100,,-1(A)]       ;STORE GROWTH SPEC
193 TRYTPG: SKIPE   A,TPGROW        ;IS TP BLOWN
194         DPB     B,[111100,,-1(A)]       ;YES, SET GROWTH SPEC
195         SKIPE   A,PPGROW                ;POINT TO BLOWN PP
196         DPB     B,[111100,,-1(A)]
197         PUSHJ   P,AGC           ;COLLECT GARBAGE
198         SETZM   PPGROW
199         SETZM   PGROW
200         SETZM   TPGROW
201         JRST    INTDN1
202
203
204
205 ;SUBROUTINE TO SET AN INTERRUPT HANDLER
206
207 MFUNCTION SETINT,SUBR
208         ENTRY   2
209
210         HLRZ    A,(AB)          ;FIRST IS FIXED
211         CAIE    A,TFIX
212         JRST    WTYP1
213         HLRZ    A,2(AB)
214         CAIE    A,TLIST
215         JRST    WTYP2
216         SKIPGE  B,1(AB)         ;GET NUMBER
217         JRST    NEGINT          ;INTERRUPT NEGATIVE
218         HRRZ    C,3(AB)         ;PICKUP LIST
219 ISENT1: PUSH    P,CFINIS                ;FALL INTO INTERNAL SET TO POP TO FINIS
220
221 ISETNT: MOVEI   D,(B)           ;COPY
222         LSH     B,1
223         HRLI    B,(B)           ;TO 2 HALVES
224         ADD     B,INTVEC+1(TVP) ;POINT TO HANDLER
225         JUMPGE  B,INTOBG        ;OUT OF RANGE
226         HRRZ    E,(B)           ;AND OLD POINTER
227         HRRM    E,(C)           ;SPLICE
228         HRRM    C,(B)
229         CAILE   D,35.           ;WHICH MASK?
230         JRST    SETW2
231
232         SUBI    D,36.           ;FIND BIT POSITION
233         MOVSI   A,400000
234         LSH     A,(D)           ;POSTITION
235         IORM    A,MASK1
236         .SUSET  [.SMASK,,MASK1]
237 SETIN1: MOVE    A,(AB)
238         MOVE    B,1(AB)
239 CFINIS: POPJ    P,FINIS ;USED BY SETINT TO SETUP RETURN
240
241 SETW2:  SUBI    D,71.
242         MOVSI   A,400000
243         LSH     A,(D)
244         IORM    A,MASK2
245         .SUSET  [.SMSK2,,MASK2]
246         JRST    SETIN1
247 WTYP1:  PUSH    TP,$TATOM
248         PUSH    TP,MQUOTE FIRST-ARG-WRONG-TYPE
249         JRST    CALER1
250
251
252 WTYP2:  PUSH    TP,$TATOM
253         PUSH    TP,MQUOTE SECOND-ARG-WRONG-TYPE
254         JRST    CALER1
255
256 NEGINT: PUSH    TP,$TATOM
257         PUSH    TP,MQUOTE NEGATIVE-INTERRUPT-NUMBER
258         JRST    CALER1
259 INTOBG: PUSH    TP,$TATOM
260         PUSH    TP,MQUOTE INT-NUMBER-TOO-LARGE
261         JRST    CALER1
262
263 BADCHN: PUSH    TP,$TATOM
264         PUSH    TP,MQUOTE CHANNEL-NOT-PHYSICAL
265         JRST    CALER1
266
267 LWTYP:  PUSH    TP,$TATOM
268         PUSH    TP,MQUOTE LAST-ARG-WRONG-TYPE
269         JRST    CALER1
270
271 ; SET A CHANNEL INTERRUPT
272
273 MFUNCTION ONCHAR,SUBR
274
275         ENTRY
276
277         SKIPL   B,AB            ;COPY ARG POINTER
278         JRST    TFA
279         ADD     B,[2,,2]        ;POINT TO EXPRESSION ARG
280         PUSHJ   P,CHKRGS        ;CHECK OUT THE ARGS AND MAKE THE LIST
281         GETYP   A,(AB)  ;CHECK FOR A CHANNEL
282         CAIE    A,TCHAN
283         JRST    WTYP1
284         MOVE    C,1(AB)         ;GET CHANNEL
285         SKIPN   C,CHANNO(C)     ;GET CHANNEL
286         JRST    BADCHN
287         ADDI    C,36.           ;POINT INTO INT VECTOR
288         EXCH    B,C
289         PUSHJ   P,ISETNT        ;SET THE INTERRUPT
290         MOVE    A,2(AB)         ;RETURN ARG
291         MOVE    B,3(AB)
292         JRST    FINIS
293
294 ; SET A CLOCK INTERRUPT
295
296 MFUNCTION ONCLOCK,SUBR
297
298         ENTRY
299
300         MOVE    B,AB
301         PUSHJ   P,CHKRGS                ;CHECK ARGS AND MAKE LIST
302         MOVE    C,B     ;COPY LIST POINTER
303         MOVEI   B,13.           ;CLOCK INT NUMBER
304         JRST    ISENT1          ;SET UP THE INT
305
306 CHKRGS: JUMPGE  B,TFA
307         MOVE    C,PVP           ;GET CURRENT PROCESS
308         CAML    B,[-2,,0]       ;CHECK FOR PROCESS ARG
309         JRST    GOTPVP
310         CAMGE   B,[-4,,0]       ;SKIP IF RIGHT NO. OF ARGS
311         JRST    TMA             ;TOO MANY
312         GETYP   A,2(B)          ;CHECK TYPE
313         CAIE    A,TPVP
314         JRST    LWTYP           ;WRONG TYPE
315         MOVE    C,3(B)          ;GET PROCESS
316 GOTPVP: PUSH    TP,$TPVP
317         PUSH    TP,C
318         PUSH    TP,(B)          ;PUSH EXPRESSION
319         PUSH    TP,1(B)
320         MCALL   2,LIST  ;MAKE THE LIST
321         PUSH    TP,A
322         PUSH    TP,B
323         MCALL   1,LIST          ;MAKE A LIST OF A LIST
324         POPJ    P,
325
326
327 ;ROUTINE TO GET CURRENT INT NUMBER
328
329 MFUNCTION GETINT,SUBR
330
331         ENTRY   0
332         MOVSI   A,TFIX
333         MOVE    B,INTNUM+1(TVP)
334         JRST    FINIS
335
336 MFUNCTION INTCHAR,SUBR
337
338         ENTRY
339         PUSH    P,CFINIS        ;CAUSE RETURN TO FINIS
340 INTCH1: MOVE    B,INTNUM+1(TVP)
341         JUMPGE  AB,GOTNUM
342         HLRZ    A,(AB)
343         CAIE    A,TFIX
344         JRST    WTYP1
345         MOVE    B,1(AB)
346
347 GOTNUM: SUBI    B,36.           ;CONVERT TO CHANNEL
348         MOVEI   C,(B)           ;SAVE A COPY OF CHANNEL
349         .ITYIC  B,
350         JRST    NOCHRS
351
352         LSH     B,29.
353         MOVSI   A,TCHRS
354         MOVEI   D,(C)   ;COPY CHANNEL AGAIN
355         LSH     D,1             ;TIMES 2
356         ADDI    D,CHANL0+1(TVP) ;POINT TO INFO
357         HRRZ    E,(D)   ;POINT TO CHANNEL
358         HRRZ    E,BUFRIN(E)     ;POINT TO ADDL INFO
359         AOS     SYSCHR(E)
360
361 REINT:  MOVEI   E,1     ;PREPARE TO RENABLE
362         LSH     E,(C)
363         IORM    E,MASK2
364         .SUSET  [.SMSK2,,MASK2]
365         POPJ    P,
366
367
368 NOCHRS: MOVEI   B,0
369         MOVSI   A,TFALSE
370         JRST    REINT
371
372 MFUNCTION QUITTER,SUBR
373
374         ENTRY   0
375
376 REQT:   PUSHJ   P,INTCH1        ;CHECK FOR A CHAR
377         CAMN    A,$TFALSE       ;ANY LEFT?
378         JRST    FINIS   ;NO
379         CAME    B,[7_29.]       ;CNTL G?
380         JRST    REQT
381         PUSH    TP,$TCHAN               ;QUIT HERE
382         PUSH    TP,(D)          ;PUSH CHANNEL
383         MCALL   1,RRRES
384         PUSH    TP,$TATOM
385         PUSH    TP,MQUOTE CONTROL-G
386         MCALL   1,ERROR
387         JRST    FINIS
388
389 MFUNCTION INTRCH,SUBR,INTCHAN
390
391         ENTRY   0
392
393         MOVE    B,INTNUM+1(TVP) ;GET INT NUMBER
394         SUBI    B,36.
395         JUMPL   B,IFALSE        ;NOT A CHANNEL
396         CAILE   B,17
397         JRST    IFALSE          ;NOT A CHANNEL
398         LSH     B,1             ;TIMES 2
399         ADDI    B,CHANL0(TVP)   ;GET POINTER TO CHANNEL
400         MOVE    A,(B)
401         MOVE    B,1(B)
402         JRST    FINIS
403
404 MFUNCTION GASCII,SUBR,ASCII
405         ENTRY   1
406
407         HLRZ    A,(AB)
408         CAIE    A,TCHRS
409         JRST    TRYNUM
410
411         MOVE    B,1(AB)
412         TDNN    B,[3777,,-1]
413         LSH     B,-29.
414         MOVSI   A,TFIX
415         JRST    FINIS
416
417 TRYNUM: CAIE    A,TFIX
418         JRST    WTYP1
419         SKIPGE  B,1(AB)         ;GET NUMBER
420         JRST    TOOBIG
421         CAILE   B,177           ;CHECK RANGE
422         JRST    TOOBIG
423         LSH     B,29.
424         MOVSI   A,TCHRS
425         JRST    FINIS
426
427 TOOBIG: PUSH    TP,$TATOM
428         PUSH    TP,MQUOTE OUT-OF-RANGE
429         JRST    CALER1
430
431 ;SUBROUTINE TO GET BIT FOR CLOBBERAGE
432
433 GETBIT: MOVNS   B               ;NEGATE
434         MOVSI   A,400000        ;GET THE BIT
435         LSH     A,(B)           ;SHIFT TO POSITION
436         POPJ    P,              ;AND RETURN
437
438 ;HERE TO HANDLE PDL OVERFLOW.  ASK FOR A GC
439
440 IPDLOV: SKIPE   FLFLG           ;DURING FAILURE,
441         JRST    IMPCH           ;LET FAIL HANDLE BLOWN PDLS
442         MOVEM   A,TSINT         ;SAVE INT WORD
443         MOVEI   A,200000        ;GET BIT TO CLOBBER
444         IORM    A,PIRQ          ;LEAVE A MESSAGE FOR HIGHER LEVEL
445
446         SKIPE   GCFLG           ;IS GC RUNNING?
447         JRST    GCPLOV          ;YES, COMPLAIN GROSSLY
448
449         EXCH    P,GCPDL         ;GET A WINNING PDL
450         HRRZ    B,TSINTR        ;GET POINTER TO LOSING INSTRUCTION
451         LDB     B,[270400,,-1(B)]       ;GET AC FIELD
452         MOVEI   A,(B)           ;COPY IT
453         LSH     A,1             ;TIMES 2
454         ADDI    A,0STO(PVP)     ;POINT TO THIS ACS CURRENT TYPE
455         HLRZ    A,(A)           ;GET THAT TYPE INTO A
456         CAIN    B,P             ;IS IT P
457         MOVEI   B,GCPDL         ;POINT TO SAVED P
458
459         CAIN    B,B             ;OR IS IT B ITSELF
460         MOVEI   B,TSAVB
461         CAIN    B,A             ;OR A
462         MOVEI   B,TSAVA
463
464         CAIN    B,C             ;OR C
465         MOVEI   B,1(P)          ;C WILL BE ON THE STACK
466
467         PUSH    P,C
468         PUSH    P,A
469
470         MOVE    A,(B)           ;GET THE LOSING POINTER
471         MOVEI   C,(A)           ;AND ISOLATE RH
472
473         CAMG    C,VECTOP        ;CHECK IF IN GC SPACE
474         CAMG    C,VECBOT
475         JRST    NOGROW          ;NO, COMPLAIN
476
477         HLRZ    C,A             ;GET -LENGTH
478         SUBI    A,-1(C)         ;POINT TO A DOPE WORD
479         POP     P,C             ;RESTORE TYPE INTO C
480         CAIE    C,TPDL          ;IS IT A P STACK?
481         JRST    TRYTP           ;NO
482         SKIPE   PGROW           ;YES, ALREADY GROWN?
483         JRST    PDLOSS          ;YES, LOSE
484         ADDI    A,PDLBUF        ;POINT TO REAL DOPE WORD
485         HRRM    A,PGROW         ;STORE
486         JRST    PNTRHK          ;FIX UP THE PDL POINTER
487
488 TRYTP:  CAIE    C,TTP           ;TP STACK
489         JRST    TRYPP
490         SKIPE   TPGROW          ;ALREADY GROWN?
491         JRST    PDLOSS
492         ADDI    A,PDLBUF        ;POINT TO REAL DOPE WORD
493         HRRM    A,TPGROW
494         JRST    PNTRHK          ;GO MUNG POINTER
495
496 TRYPP:  CAIE    C,TPP           ;PLANNER PDL?
497         JRST    BADPDL
498         SKIPE   PPGROW
499         JRST    PDLOSS          ;LOSER
500         ADDI    A,PDLBUF
501         HRRM    A,PPGROW
502
503
504 PNTRHK: MOVE    C,(B)           ;RESTORE PDL POINTER
505         SUB     C,[PDLBUF,,0]   ;FUDGE THE POINTER
506         MOVEM   C,(B)           ;AND STORE IT
507
508         POP     P,C             ;RESTORE THE WORLD
509         MOVE    A,TSINT         ;RESTORE INT WORD
510
511         EXCH    P,GCPDL         ;GET BACK ORIG PDL
512         JRST    IMPCH           ;LOOK FOR MORE INTERRUPTS
513
514 TPOVFL: SETOM   INTFLG          ;SIMULATE PDL OVFL
515         PUSH    P,A
516         MOVEI   A,200000        ;TURN ON THE BIT
517         IORM    A,PIRQ
518         SUB     TP,[PDLBUF,,0]  ;HACK STACK POINTER
519         HLRE    A,TP            ;FIND DOPEW
520         SUBM    TP,A            ;POINT TO DOPE WORD
521         ADDI    A,1
522         HRRZM   A,TPGROW
523         POP     P,A
524         POPJ    P,
525
526
527 ;HERE TO HANDLE LOW-LEVEL CHANNELS
528
529
530 CHNACT: SKIPN   GCFLG           ;GET A WINNING PDL
531         EXCH    P,GCPDL
532         ANDI    A,177777        ;ISOLATE CHANNEL BITS
533         PUSH    P,0             ;SAVE
534
535 CHNA1:  MOVEI   B,0             ;BIT COUNTER
536         JFFO    A,.+2           ;COUNT
537         JRST    CHNA2
538         SUBI    B,35.           ;NOW HAVE CHANNEL
539         MOVMS   B               ;PLUS IT
540         MOVEI   0,1
541         LSH     0,(B)           ;SET TO CLOBBER BIT
542         ANDCM   A,0
543         LSH     B,23.           ;POSITION FOR A .STATUS
544         IOR     B,[.STATUS B]
545         XCT     B               ;DO IT
546         ANDI    B,77            ;ISOLATE DEVICE
547         CAILE   B,2
548         JRST    CHNA1
549         ANDCAM  0,MASK2         ;TURN OFF BIT
550         .SUSET  [.SMSK2,,MASK2]
551         JRST    CHNA1
552
553 CHNA2:  POP     P,0
554         SKIPN   GCFLG
555         EXCH    P,GCPDL
556         JRST    GCQUIT
557
558 ;HERE IF PDL OVERFLOW DURING GARBAGE COLLECTION
559
560 BADPDL: SKIPA   B,[[ASCIZ /NON-PDL OVERFLOW
561 /]]
562 GCPLOV: MOVEI   B,[ASCIZ /PDL OVERFLOW DURING GARBAGE COLLECTION
563 /]
564 GFATER: MOVE    P,GCPDL         ;GET ORIGINAL PDL FOR TYPE OUT
565         JRST    FATERR          ;GO TO FATAL ERROR ROUTINE
566
567 NOGROW: MOVEI   B,[ASCIZ /PDL OVERFLOW ON NON-EXPANDABLE PDL
568 /]
569         JRST    GFATER
570
571 PDLOSS: MOVEI   B,[ASCIZ /PDL OVERFLOW BUFFER EXHAUSTED
572 /]
573         JRST    GFATER
574
575 FATERR: PUSHJ   P,MSGTYP        ;TYPE THE MESSAGE
576         MOVEI   B,[ASCIZ /FATAL ERROR, PLEASE DUMP SO THAT MUDDLE SYSTEM PROGRAMMERS
577 MAY DEBUG./]
578         PUSHJ   P,MSGTYP        ;TYPE THE LOSER MESSAGE
579         PUSHJ   P,OCLOS         ;CLOSE THE TTY
580         .VALUE
581         JRST    .-1
582
583
584 ;MEMORY PROTECTION INTERRUPT
585
586 IMPV:   MOVEI   B,[ASCIZ /MPV -- /]
587
588 IMPV1:  PUSHJ   P,MSGTYP        ;TYPE
589         SKIPE   GCFLG           ;THESE ERRORS FATAL IN GARBAGE COLLECTOR
590         JRST    GCERR
591
592         MOVE    P,GCPDL         ;MAKE SURE OF A WINNING PDL
593 ERLP:   MOVEI   B,[ASCIZ /TYPE "S" TO GO TO SUPERIOR, "R" TO RESTART PROCESS./]
594         PUSHJ   P,IFLUSH        ;FLUSH AWAITING INPUT
595         PUSHJ   P,MSGTYP
596
597         PUSHJ   P,TYI           ;READ THE CHARACTER
598
599         PUSHJ   P,UPLO          ;CONVERT TO UPPER CASE
600         CAIN    A,"S
601         .VALUE
602
603         CAIE    A,"R            ;DOES HE WANT TO RESTART
604         JRST    ERLP            ;NO, TELL HIM AGAIN
605
606         MCALL   0,INTABR        ;ABORT THE PROCESS
607
608 INTABR: MOVEI   A,ERRET         ;REAALY GO TO ERRET
609         HRRM    A,TSINTR
610         .DISMISS        TSINTR
611
612
613 GCERR:  MOVEI   B,[ASCIZ /IN GARBAGE COLLECTOR
614 /]
615         JRST    FATERR
616
617 ILOPR:  MOVEI   B,[ASCIZ /ILLEGAL OPERATION -- /]
618         JRST    IMPV1
619
620 ; SUBROUTINE TO CONVERT LOWER CASE LETTERS TO UPPER
621
622 UPLO:   CAIG    A,172           ;GEATER THAN Z?
623         CAIG    A,140           ;NO, LESS THAN A
624         POPJ    P,              ;YES, LOSE
625         SUBI    A,40            ;MAKE UPPER CASE
626         POPJ    P,
627
628 ;SUBROUTINE TO BE CALLED AT INITIALIZE TIME TO FUDGE INT PC
629
630 INTINT: PUSHJ   P,PCHACK        ;FUDGE PC LOSSAGE
631         MOVE    A,MASK1 ;SET MASKS
632         MOVE    B,MASK2
633         .SETM2  A,              ;SET BOTH MASKS
634         POPJ    P,
635
636 PCHACK: .SUSET  [.SMASK,,[200000]]      ;SET FOR ONLY PDL OVERFLOW
637         MOVE    D,TSINT+2       ;SAVE CONTENTS OF ITERRUPT HANDLER
638         MOVEI   A,FUNINT        ;POINT TO DUMMY THEREOF
639         HRRM    A,TSINT+2       ;AND STORE IT
640         HRROI   A,0             ;MAKE A VERY SHORT PDL
641 CHPUSH: PUSH    A,0             ;PUSH SOMETHING AND OVERFLOW
642         .VALUE  [ASCIZ /?/]     ;SHOULD NEVER GET HERE
643
644 FUNINT: HRRM    D,TSINT+2       ;RESTORE STANDARD HANDLER
645         HRRZ    D,TSINTR        ;GET THE LOCATION STORED
646         SUBI    D,CHPUSH        ;FIND THE DIFFERENCE
647         MOVEM   D,PCOFF         ;AND SAVE
648         POP     P,TSINTR        ; POP INTO DISMISS WORD
649         .DISMISS        TSINTR          ;AND DISMISS
650
651
652
653 INTLOS: .VALUE  [ASCIZ /INT/]
654 CHARCH: .VALUE  [ASCIZ /CHAR?/]
655 ;RANDOM IMPURE CRUFT NEEDED
656
657 TSAVA:  0
658 TSAVB:  0
659 PIRQ:   0                       ;HOLDS REQUEST BITS FOR 1ST WORD
660 PIRQ2:  0                       ;SAME FOR WORD 2
661 PCOFF:  0
662 MASK1:  220040                  ;FIRST MASK
663 MASK2:  0                       ;SECOND THEREOF
664
665
666 END
667 \f\f\ 3\f