2 TITLE INTERRUPT HANDLER FOR MUDDLE
10 PDLGRO==10000 ;AMOUNT TO GROW A PDL THAT LOSES
11 NINT==72. ;MAXIMUM NUMBER OF INTERRUPTS POSSIBLE
13 ;SET UP LOCATION 42 TO POINT TO TSINT
15 ZZZ==. ;SAVE CURRENT LOCATION
18 î JSR TSINT ;GO TO HANDLER
22 ; GLOBALS NEEDED BY INTERRUPT HANDLER
24 .GLOBA GCFLG ;TELLS WHETHER OR NOT GARBAGE COLLECTOR IS RUNNING
25 .GLOBA GCINT ;TELLS GARBAGE COLLECTOR TO SIMULATE AN INTERRUPT
26 .GLOBAL INTNUM,INTVEC ;TV ENTRIES CONCERNING INTERRUPTS
27 .GLOBAL AGC ;CALL THE GARBAGE COLLECTOR
28 .GLOBAL VECNEW,PARNEW,GETNUM ;GC PSEUDO ARGS
29 .GLOBAL GCPDL ;GARBAGE COLLECTORS PDL
30 .GLOBAL VECTOP,VECBOT ;DELIMIT VECTOR SPACE
31 .GLOBAL PDLBUF ;AMOUNT OF PDL GROWTH
32 .GLOBAL PGROW ;POINTS TO DOPE WORD OF NEXT PDL TO GROW
33 .GLOBAL TPGROW ;POINTS TO NEXT MUDDLE PDL TO GROW
34 .GLOBAL PPGROW ;BLOWN PLANNER PDL
35 .GLOBAL PLDGRO ;SEE ABOVE
36 .GLOBAL CALER1,TMA,TFA
37 .GLOBAL BUFRIN,CHANL0,SYSCHR ;CHANNEL GLOBALS
38 .GLOBAL IFALSE,TPOVFL,PDLOSS
39 .GLOBAL FLFLG ;-1 IFF INTERRUPT IN FAIL
42 .GLOBAL INTINT ;CALLED BY INITIALIZER TO TAKE CARE OF INT PCS
44 .GLOBAL MSGTYP,TYI,IFLUSH,OCLOS,ERRET ;SUBROUTINES USED
45 ;BEGINNING OF ACTUAL INTERRUPT HANDLER (MUST BE IMPURE)
47 TSINT: 0 ;INTERRUPT BITS GET STORED HERE
48 TSINTR: 0 ;INTERRUPT PC WORD STORED HERE
49 JRST TSINTP ;GO TO PURE CODE
51 ; SOFTWARE INTERNAL INTERRUPTS JSR TO HERE
56 ;THE REST OF THIS CODE IS PURE
58 TSINTP: SOSGE INTFLG ; SKIP IF ENABLED
59 SETOM INTFLG ;DONT GET LESS THAN -1
61 MOVEM A,TSAVA ;SAVE TWO ACS
63 MOVE A,TSINT ;PICK UP INT BIT PATTERN
64 JUMPL A,2NDWORD ;DONT CHECK FOR PDL OVERFLOW ETC. IF SIGN BIT ON
66 TRZE A,200000 ;IS THIS A PDL OVERFLOW?
67 JRST IPDLOV ;YES, GO HANDLE IT FIRST
69 IMPCH: TRZE A,20000 ;IS IT A MEMORY PROTECTION VIOLATION?
70 JRST IMPV ;YES, GO HANDLE IT
72 TRZE A,40 ;ILLEGAL OP CODE?
73 JRST ILOPR ;YES, GO HANDLE
75 ;DECODE THE REST OF THE INTERRUPTS USING A TABLE
78 JUMPL A,GC2 ;2ND WORD?
79 IORM A,PIRQ ;NO, INTO WORD 1
80 JRST GCQUIT ;AND DISMISS INT
82 GC2: TLZ A,400000 ;TURN OFF SIGN BIT
84 TRNE A,177777 ;CHECK FOR CHANNELS
85 JRST CHNACT ;GO IF CHANNEL ACTIVITY
87 GCQUIT: SKIPGE INTFLG ;SKIP IF INTERRUPTS ENABLED
88 JRST INTDON ;NO, DEFER REAL HANDLING UNTIL LATER
90 MOVE A,TSINTR ;PICKUP RETURN WORD
91 MOVEM A,LCKINT ;STORE ELSEWHERE
92 MOVEI A,DOINTE ;CAUSE DISMISS TO HANDLER
93 HRRM A,TSINTR ;STORE IN INT RETURN
94 PUSH P,INTFLG ;SAVE INT FLAG
95 SETOM INTFLG ;AND DISABLE
98 INTDON: MOVE A,TSAVA ;RESTORE ACS
100 .DISMISS TSINTR ;AND DISMISS THE INTERRUPT
102 ; HERE IF INTERRUPTED IN OTHER THAN GC
105 DOINTE: PUSH P,LCKINT ;SAVE RETURN
106 SETZM INTFLG ;DISABLE
107 AOS -1(P) ;INCR SAVED FLAG
109 ;NOW SAVE WORKING ACS
113 SETZM A!STO(PVP) ;NOW ZERO TYPE
116 PUSH P,INTNUM+1(TVP) ;PUSH CURRENT VALUE
118 DIRQ: MOVE A,PIRQ ;NOW SATRT PROCESSING
119 JFFO A,FIRQ ;COUNT BITS AND GO
120 MOVE A,PIRQ2 ;1ST DONE, LOOK AT 2ND
124 POP P,INTNUM+1(TVP) ;RESTORE CURRENT
132 JRST @LCKINT ;AND RETURN
134 FIRQ: PUSHJ P,GETBIT ;SET UP THE BIT TO CLOBBER IN PIRQ
135 ANDCAM A,PIRQ ;CLOBBER IT
136 ADDI B,36. ;OFSET INTO TABLE
137 JRST XIRQ ;GO EXECUTE
139 FIRQ2: PUSHJ P,GETBIT ;PREPARE TO CLOBBER BIT
140 ANDCAM A,PIRQ2 ;CLOBBER IT
141 ADDI B,71. ;AGAIN OFFSET INTO TABLE
143 CAIN B,21 ;PDL OVERFLOW?
144 JRST PDL2 ;YES, HACK APPROPRIATELY
145 MOVEM B,INTNUM+1(TVP) ;AND SAVE
147 ADD B,INTVEC+1(TVP) ;POINT TO LIST OF TASKS
148 SKIPN A,(B) ;ANY TASKS?
151 PUSH TP,$TLIST ;SAVE LIST
153 DOINTS: HLRZ C,(A) ;GET TYPE
157 JUMPE A,IWTYP ;LIST IS NIL, LOSE
158 HLRZ C,(A) ;CHECK FOR A PROCESS
161 HRRZ D,(A) ;POINT TO 2D PART OF PAIR
162 PUSH TP,(D) ;SETUP CALL TO EVAL
164 MOVE D,TB ;GET CURRENT FRAME POINTER
165 MOVE C,1(A) ;GET PROCESS WHO WANTS THIS INTERRUPT
166 CAME C,PVP ;SKIP IF CURRENT PROCESS
167 MOVE D,TBSTO+1(C) ;GET SAVED FRAME
168 HLRE A,C ;COMPUTE DOPE WORD POINTER
169 SUBI C,-1(A) ;HAVE POINTER
170 HRLI C,TFRAME ;BUILD A FRAME HACK
171 HLL D,OTBSAV(D) ;GET A WINNING TIME
172 PUSH TP,C ;AND PUSH IT
175 INTCDR: HRRZ A,@(TP) ;CDR THE LIST OF TASKS
177 MOVEM A,(TP) ;SAVE THE CDR'D LIST
180 TPPOP: SUB TP,[2,,2] ;REMOVE LIST
183 IWTYP: PUSH TP,(A) ;SAVE TASK
186 PUSH TP,MQUOTE BAD-INTERRUPT-HANDLER-TASK-IGNORED
191 PDL2: MOVEI B,PDLGRO_-6 ;GET GROWTH SPEC
192 SKIPE A,PGROW ;SKIP IF A P IS NOT GROWING
193 DPB B,[111100,,-1(A)] ;STORE GROWTH SPEC
194 TRYTPG: SKIPE A,TPGROW ;IS TP BLOWN
195 DPB B,[111100,,-1(A)] ;YES, SET GROWTH SPEC
196 SKIPE A,PPGROW ;POINT TO BLOWN PP
197 DPB B,[111100,,-1(A)]
198 PUSHJ P,AGC ;COLLECT GARBAGE
206 ;SUBROUTINE TO SET AN INTERRUPT HANDLER
208 MFUNCTION SETINT,SUBR
211 HLRZ A,(AB) ;FIRST IS FIXED
217 SKIPGE B,1(AB) ;GET NUMBER
218 JRST NEGINT ;INTERRUPT NEGATIVE
219 HRRZ C,3(AB) ;PICKUP LIST
220 ISENT1: PUSH P,CFINIS ;FALL INTO INTERNAL SET TO POP TO FINIS
222 ISETNT: MOVEI D,(B) ;COPY
224 HRLI B,(B) ;TO 2 HALVES
225 ADD B,INTVEC+1(TVP) ;POINT TO HANDLER
226 JUMPGE B,INTOBG ;OUT OF RANGE
227 HRRZ E,(B) ;AND OLD POINTER
230 CAILE D,35. ;WHICH MASK?
233 SUBI D,36. ;FIND BIT POSITION
237 .SUSET [.SMASK,,MASK1]
240 CFINIS: POPJ P,FINIS ;USED BY SETINT TO SETUP RETURN
246 .SUSET [.SMSK2,,MASK2]
248 WTYP1: PUSH TP,$TATOM
249 PUSH TP,MQUOTE FIRST-ARG-WRONG-TYPE
253 WTYP2: PUSH TP,$TATOM
254 PUSH TP,MQUOTE SECOND-ARG-WRONG-TYPE
257 NEGINT: PUSH TP,$TATOM
258 PUSH TP,MQUOTE NEGATIVE-INTERRUPT-NUMBER
260 INTOBG: PUSH TP,$TATOM
261 PUSH TP,MQUOTE INT-NUMBER-TOO-LARGE
264 BADCHN: PUSH TP,$TATOM
265 PUSH TP,MQUOTE CHANNEL-NOT-PHYSICAL
268 LWTYP: PUSH TP,$TATOM
269 PUSH TP,MQUOTE LAST-ARG-WRONG-TYPE
272 ; SET A CHANNEL INTERRUPT
274 MFUNCTION ONCHAR,SUBR
278 SKIPL B,AB ;COPY ARG POINTER
280 ADD B,[2,,2] ;POINT TO EXPRESSION ARG
281 PUSHJ P,CHKRGS ;CHECK OUT THE ARGS AND MAKE THE LIST
282 GETYP A,(AB) ;CHECK FOR A CHANNEL
285 MOVE C,1(AB) ;GET CHANNEL
286 SKIPN C,CHANNO(C) ;GET CHANNEL
288 ADDI C,36. ;POINT INTO INT VECTOR
290 PUSHJ P,ISETNT ;SET THE INTERRUPT
291 MOVE A,2(AB) ;RETURN ARG
295 ; SET A CLOCK INTERRUPT
297 MFUNCTION ONCLOCK,SUBR
302 PUSHJ P,CHKRGS ;CHECK ARGS AND MAKE LIST
303 MOVE C,B ;COPY LIST POINTER
304 MOVEI B,13. ;CLOCK INT NUMBER
305 JRST ISENT1 ;SET UP THE INT
308 MOVE C,PVP ;GET CURRENT PROCESS
309 CAML B,[-2,,0] ;CHECK FOR PROCESS ARG
311 CAMGE B,[-4,,0] ;SKIP IF RIGHT NO. OF ARGS
313 GETYP A,2(B) ;CHECK TYPE
315 JRST LWTYP ;WRONG TYPE
316 MOVE C,3(B) ;GET PROCESS
317 GOTPVP: PUSH TP,$TPVP
319 PUSH TP,(B) ;PUSH EXPRESSION
321 MCALL 2,LIST ;MAKE THE LIST
324 MCALL 1,LIST ;MAKE A LIST OF A LIST
328 ;ROUTINE TO GET CURRENT INT NUMBER
330 MFUNCTION GETINT,SUBR
337 MFUNCTION INTCHAR,SUBR
340 PUSH P,CFINIS ;CAUSE RETURN TO FINIS
341 INTCH1: MOVE B,INTNUM+1(TVP)
348 GOTNUM: SUBI B,36. ;CONVERT TO CHANNEL
349 MOVEI C,(B) ;SAVE A COPY OF CHANNEL
355 MOVEI D,(C) ;COPY CHANNEL AGAIN
357 ADDI D,CHANL0+1(TVP) ;POINT TO INFO
358 HRRZ E,(D) ;POINT TO CHANNEL
359 HRRZ E,BUFRIN(E) ;POINT TO ADDL INFO
362 REINT: MOVEI E,1 ;PREPARE TO RENABLE
365 .SUSET [.SMSK2,,MASK2]
373 MFUNCTION QUITTER,SUBR
377 REQT: PUSHJ P,INTCH1 ;CHECK FOR A CHAR
378 CAMN A,$TFALSE ;ANY LEFT?
380 CAME B,[7_29.] ;CNTL G?
382 PUSH TP,$TCHAN ;QUIT HERE
383 PUSH TP,(D) ;PUSH CHANNEL
386 PUSH TP,MQUOTE CONTROL-G
390 MFUNCTION INTRCH,SUBR,INTCHAN
394 MOVE B,INTNUM+1(TVP) ;GET INT NUMBER
396 JUMPL B,IFALSE ;NOT A CHANNEL
398 JRST IFALSE ;NOT A CHANNEL
400 ADDI B,CHANL0(TVP) ;GET POINTER TO CHANNEL
405 MFUNCTION GASCII,SUBR,ASCII
420 SKIPGE B,1(AB) ;GET NUMBER
422 CAILE B,177 ;CHECK RANGE
428 TOOBIG: PUSH TP,$TATOM
429 PUSH TP,MQUOTE OUT-OF-RANGE
432 ;SUBROUTINE TO GET BIT FOR CLOBBERAGE
434 GETBIT: MOVNS B ;NEGATE
435 MOVSI A,400000 ;GET THE BIT
436 LSH A,(B) ;SHIFT TO POSITION
439 ;HERE TO HANDLE PDL OVERFLOW. ASK FOR A GC
441 IPDLOV: SKIPE FLFLG ;DURING FAILURE,
442 JRST IMPCH ;LET FAIL HANDLE BLOWN PDLS
443 MOVEM A,TSINT ;SAVE INT WORD
444 MOVEI A,200000 ;GET BIT TO CLOBBER
445 IORM A,PIRQ ;LEAVE A MESSAGE FOR HIGHER LEVEL
447 SKIPE GCFLG ;IS GC RUNNING?
448 JRST GCPLOV ;YES, COMPLAIN GROSSLY
450 EXCH P,GCPDL ;GET A WINNING PDL
451 HRRZ B,TSINTR ;GET POINTER TO LOSING INSTRUCTION
452 LDB B,[270400,,-1(B)] ;GET AC FIELD
455 ADDI A,0STO(PVP) ;POINT TO THIS ACS CURRENT TYPE
456 HLRZ A,(A) ;GET THAT TYPE INTO A
458 MOVEI B,GCPDL ;POINT TO SAVED P
460 CAIN B,B ;OR IS IT B ITSELF
466 MOVEI B,1(P) ;C WILL BE ON THE STACK
471 MOVE A,(B) ;GET THE LOSING POINTER
472 MOVEI C,(A) ;AND ISOLATE RH
474 CAMG C,VECTOP ;CHECK IF IN GC SPACE
476 JRST NOGROW ;NO, COMPLAIN
478 HLRZ C,A ;GET -LENGTH
479 SUBI A,-1(C) ;POINT TO A DOPE WORD
480 POP P,C ;RESTORE TYPE INTO C
481 CAIE C,TPDL ;IS IT A P STACK?
483 SKIPE PGROW ;YES, ALREADY GROWN?
484 JRST PDLOSS ;YES, LOSE
485 ADDI A,PDLBUF ;POINT TO REAL DOPE WORD
487 JRST PNTRHK ;FIX UP THE PDL POINTER
489 TRYTP: CAIE C,TTP ;TP STACK
491 SKIPE TPGROW ;ALREADY GROWN?
493 ADDI A,PDLBUF ;POINT TO REAL DOPE WORD
495 JRST PNTRHK ;GO MUNG POINTER
497 TRYPP: CAIE C,TPP ;PLANNER PDL?
505 PNTRHK: MOVE C,(B) ;RESTORE PDL POINTER
506 SUB C,[PDLBUF,,0] ;FUDGE THE POINTER
507 MOVEM C,(B) ;AND STORE IT
509 POP P,C ;RESTORE THE WORLD
510 MOVE A,TSINT ;RESTORE INT WORD
512 EXCH P,GCPDL ;GET BACK ORIG PDL
513 JRST IMPCH ;LOOK FOR MORE INTERRUPTS
515 TPOVFL: SETOM INTFLG ;SIMULATE PDL OVFL
517 MOVEI A,200000 ;TURN ON THE BIT
519 SUB TP,[PDLBUF,,0] ;HACK STACK POINTER
520 HLRE A,TP ;FIND DOPEW
521 SUBM TP,A ;POINT TO DOPE WORD
528 ;HERE TO HANDLE LOW-LEVEL CHANNELS
531 CHNACT: SKIPN GCFLG ;GET A WINNING PDL
533 ANDI A,177777 ;ISOLATE CHANNEL BITS
536 CHNA1: MOVEI B,0 ;BIT COUNTER
539 SUBI B,35. ;NOW HAVE CHANNEL
542 LSH 0,(B) ;SET TO CLOBBER BIT
544 LSH B,23. ;POSITION FOR A .STATUS
547 ANDI B,77 ;ISOLATE DEVICE
550 ANDCAM 0,MASK2 ;TURN OFF BIT
551 .SUSET [.SMSK2,,MASK2]
559 ;HERE IF PDL OVERFLOW DURING GARBAGE COLLECTION
561 BADPDL: SKIPA B,[[ASCIZ /NON-PDL OVERFLOW
563 GCPLOV: MOVEI B,[ASCIZ /PDL OVERFLOW DURING GARBAGE COLLECTION
565 GFATER: MOVE P,GCPDL ;GET ORIGINAL PDL FOR TYPE OUT
566 JRST FATERR ;GO TO FATAL ERROR ROUTINE
568 NOGROW: MOVEI B,[ASCIZ /PDL OVERFLOW ON NON-EXPANDABLE PDL
572 PDLOSS: MOVEI B,[ASCIZ /PDL OVERFLOW BUFFER EXHAUSTED
576 FATERR: PUSHJ P,MSGTYP ;TYPE THE MESSAGE
577 MOVEI B,[ASCIZ /FATAL ERROR, PLEASE DUMP SO THAT MUDDLE SYSTEM PROGRAMMERS
579 PUSHJ P,MSGTYP ;TYPE THE LOSER MESSAGE
580 PUSHJ P,OCLOS ;CLOSE THE TTY
585 ;MEMORY PROTECTION INTERRUPT
587 IMPV: MOVEI B,[ASCIZ /MPV -- /]
589 IMPV1: PUSHJ P,MSGTYP ;TYPE
590 SKIPE GCFLG ;THESE ERRORS FATAL IN GARBAGE COLLECTOR
593 MOVE P,GCPDL ;MAKE SURE OF A WINNING PDL
594 ERLP: MOVEI B,[ASCIZ /TYPE "S" TO GO TO SUPERIOR, "R" TO RESTART PROCESS./]
595 PUSHJ P,IFLUSH ;FLUSH AWAITING INPUT
598 PUSHJ P,TYI ;READ THE CHARACTER
600 PUSHJ P,UPLO ;CONVERT TO UPPER CASE
604 CAIE A,"R ;DOES HE WANT TO RESTART
605 JRST ERLP ;NO, TELL HIM AGAIN
607 MCALL 0,INTABR ;ABORT THE PROCESS
609 INTABR: MOVEI A,ERRET ;REAALY GO TO ERRET
614 GCERR: MOVEI B,[ASCIZ /IN GARBAGE COLLECTOR
618 ILOPR: MOVEI B,[ASCIZ /ILLEGAL OPERATION -- /]
621 ; SUBROUTINE TO CONVERT LOWER CASE LETTERS TO UPPER
623 UPLO: CAIG A,172 ;GEATER THAN Z?
624 CAIG A,140 ;NO, LESS THAN A
626 SUBI A,40 ;MAKE UPPER CASE
629 ;SUBROUTINE TO BE CALLED AT INITIALIZE TIME TO FUDGE INT PC
631 INTINT: PUSHJ P,PCHACK ;FUDGE PC LOSSAGE
632 MOVE A,MASK1 ;SET MASKS
634 .SETM2 A, ;SET BOTH MASKS
637 PCHACK: .SUSET [.SMASK,,[200000]] ;SET FOR ONLY PDL OVERFLOW
638 MOVE D,TSINT+2 ;SAVE CONTENTS OF ITERRUPT HANDLER
639 MOVEI A,FUNINT ;POINT TO DUMMY THEREOF
640 HRRM A,TSINT+2 ;AND STORE IT
641 HRROI A,0 ;MAKE A VERY SHORT PDL
642 CHPUSH: PUSH A,0 ;PUSH SOMETHING AND OVERFLOW
643 .VALUE [ASCIZ /?/] ;SHOULD NEVER GET HERE
645 FUNINT: HRRM D,TSINT+2 ;RESTORE STANDARD HANDLER
646 HRRZ D,TSINTR ;GET THE LOCATION STORED
647 SUBI D,CHPUSH ;FIND THE DIFFERENCE
648 MOVEM D,PCOFF ;AND SAVE
649 POP P,TSINTR ; POP INTO DISMISS WORD
650 .DISMISS TSINTR ;AND DISMISS
654 INTLOS: .VALUE [ASCIZ /INT/]
655 CHARCH: .VALUE [ASCIZ /CHAR?/]
656 ;RANDOM IMPURE CRUFT NEEDED
660 PIRQ: 0 ;HOLDS REQUEST BITS FOR 1ST WORD
661 PIRQ2: 0 ;SAME FOR WORD 2
663 MASK1: 220040 ;FIRST MASK
664 MASK2: 0 ;SECOND THEREOF