2 TITLE INTERRUPT HANDLER FOR MUDDLE
10 NINT==72. ;MAXIMUM NUMBER OF INTERRUPTS POSSIBLE
12 ;SET UP LOCATION 42 TO POINT TO TSINT
14 ZZZ==. ;SAVE CURRENT LOCATION
17 î JSR TSINT ;GO TO HANDLER
21 ; GLOBALS NEEDED BY INTERRUPT HANDLER
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
41 .GLOBAL INTINT ;CALLED BY INITIALIZER TO TAKE CARE OF INT PCS
43 .GLOBAL MSGTYP,TYI,IFLUSH,OCLOS,ERRET ;SUBROUTINES USED
44 ;BEGINNING OF ACTUAL INTERRUPT HANDLER (MUST BE IMPURE)
46 TSINT: 0 ;INTERRUPT BITS GET STORED HERE
47 TSINTR: 0 ;INTERRUPT PC WORD STORED HERE
48 JRST TSINTP ;GO TO PURE CODE
50 ; SOFTWARE INTERNAL INTERRUPTS JSR TO HERE
55 ;THE REST OF THIS CODE IS PURE
57 TSINTP: SOSGE INTFLG ; SKIP IF ENABLED
58 SETOM INTFLG ;DONT GET LESS THAN -1
60 MOVEM A,TSAVA ;SAVE TWO ACS
62 MOVE A,TSINT ;PICK UP INT BIT PATTERN
63 JUMPL A,2NDWORD ;DONT CHECK FOR PDL OVERFLOW ETC. IF SIGN BIT ON
65 TRZE A,200000 ;IS THIS A PDL OVERFLOW?
66 JRST IPDLOV ;YES, GO HANDLE IT FIRST
68 IMPCH: TRZE A,20000 ;IS IT A MEMORY PROTECTION VIOLATION?
69 JRST IMPV ;YES, GO HANDLE IT
71 TRZE A,40 ;ILLEGAL OP CODE?
72 JRST ILOPR ;YES, GO HANDLE
74 ;DECODE THE REST OF THE INTERRUPTS USING A TABLE
77 JUMPL A,GC2 ;2ND WORD?
78 IORM A,PIRQ ;NO, INTO WORD 1
79 JRST GCQUIT ;AND DISMISS INT
81 GC2: TLZ A,400000 ;TURN OFF SIGN BIT
83 TRNE A,177777 ;CHECK FOR CHANNELS
84 JRST CHNACT ;GO IF CHANNEL ACTIVITY
86 GCQUIT: SKIPGE INTFLG ;SKIP IF INTERRUPTS ENABLED
87 JRST INTDON ;NO, DEFER REAL HANDLING UNTIL LATER
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
97 INTDON: MOVE A,TSAVA ;RESTORE ACS
99 .DISMISS TSINTR ;AND DISMISS THE INTERRUPT
101 ; HERE IF INTERRUPTED IN OTHER THAN GC
104 DOINTE: PUSH P,LCKINT ;SAVE RETURN
105 SETZM INTFLG ;DISABLE
106 AOS -1(P) ;INCR SAVED FLAG
108 ;NOW SAVE WORKING ACS
112 SETZM A!STO(PVP) ;NOW ZERO TYPE
115 PUSH P,INTNUM+1(TVP) ;PUSH CURRENT VALUE
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
123 POP P,INTNUM+1(TVP) ;RESTORE CURRENT
131 JRST @LCKINT ;AND RETURN
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
138 FIRQ2: PUSHJ P,GETBIT ;PREPARE TO CLOBBER BIT
139 ANDCAM A,PIRQ2 ;CLOBBER IT
140 ADDI B,71. ;AGAIN OFFSET INTO TABLE
142 CAIN B,21 ;PDL OVERFLOW?
143 JRST PDL2 ;YES, HACK APPROPRIATELY
144 MOVEM B,INTNUM+1(TVP) ;AND SAVE
146 ADD B,INTVEC+1(TVP) ;POINT TO LIST OF TASKS
147 SKIPN A,(B) ;ANY TASKS?
150 PUSH TP,$TLIST ;SAVE LIST
152 DOINTS: HLRZ C,(A) ;GET TYPE
156 JUMPE A,IWTYP ;LIST IS NIL, LOSE
157 HLRZ C,(A) ;CHECK FOR A PROCESS
160 HRRZ D,(A) ;POINT TO 2D PART OF PAIR
161 PUSH TP,(D) ;SETUP CALL TO EVAL
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
174 INTCDR: HRRZ A,@(TP) ;CDR THE LIST OF TASKS
176 MOVEM A,(TP) ;SAVE THE CDR'D LIST
179 TPPOP: SUB TP,[2,,2] ;REMOVE LIST
182 IWTYP: PUSH TP,(A) ;SAVE TASK
185 PUSH TP,MQUOTE BAD-INTERRUPT-HANDLER-TASK-IGNORED
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
205 ;SUBROUTINE TO SET AN INTERRUPT HANDLER
207 MFUNCTION SETINT,SUBR
210 HLRZ A,(AB) ;FIRST IS FIXED
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
221 ISETNT: MOVEI D,(B) ;COPY
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
229 CAILE D,35. ;WHICH MASK?
232 SUBI D,36. ;FIND BIT POSITION
236 .SUSET [.SMASK,,MASK1]
239 CFINIS: POPJ P,FINIS ;USED BY SETINT TO SETUP RETURN
245 .SUSET [.SMSK2,,MASK2]
247 WTYP1: PUSH TP,$TATOM
248 PUSH TP,MQUOTE FIRST-ARG-WRONG-TYPE
252 WTYP2: PUSH TP,$TATOM
253 PUSH TP,MQUOTE SECOND-ARG-WRONG-TYPE
256 NEGINT: PUSH TP,$TATOM
257 PUSH TP,MQUOTE NEGATIVE-INTERRUPT-NUMBER
259 INTOBG: PUSH TP,$TATOM
260 PUSH TP,MQUOTE INT-NUMBER-TOO-LARGE
263 BADCHN: PUSH TP,$TATOM
264 PUSH TP,MQUOTE CHANNEL-NOT-PHYSICAL
267 LWTYP: PUSH TP,$TATOM
268 PUSH TP,MQUOTE LAST-ARG-WRONG-TYPE
271 ; SET A CHANNEL INTERRUPT
273 MFUNCTION ONCHAR,SUBR
277 SKIPL B,AB ;COPY ARG POINTER
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
284 MOVE C,1(AB) ;GET CHANNEL
285 SKIPN C,CHANNO(C) ;GET CHANNEL
287 ADDI C,36. ;POINT INTO INT VECTOR
289 PUSHJ P,ISETNT ;SET THE INTERRUPT
290 MOVE A,2(AB) ;RETURN ARG
294 ; SET A CLOCK INTERRUPT
296 MFUNCTION ONCLOCK,SUBR
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
307 MOVE C,PVP ;GET CURRENT PROCESS
308 CAML B,[-2,,0] ;CHECK FOR PROCESS ARG
310 CAMGE B,[-4,,0] ;SKIP IF RIGHT NO. OF ARGS
312 GETYP A,2(B) ;CHECK TYPE
314 JRST LWTYP ;WRONG TYPE
315 MOVE C,3(B) ;GET PROCESS
316 GOTPVP: PUSH TP,$TPVP
318 PUSH TP,(B) ;PUSH EXPRESSION
320 MCALL 2,LIST ;MAKE THE LIST
323 MCALL 1,LIST ;MAKE A LIST OF A LIST
327 ;ROUTINE TO GET CURRENT INT NUMBER
329 MFUNCTION GETINT,SUBR
336 MFUNCTION INTCHAR,SUBR
339 PUSH P,CFINIS ;CAUSE RETURN TO FINIS
340 INTCH1: MOVE B,INTNUM+1(TVP)
347 GOTNUM: SUBI B,36. ;CONVERT TO CHANNEL
348 MOVEI C,(B) ;SAVE A COPY OF CHANNEL
354 MOVEI D,(C) ;COPY CHANNEL AGAIN
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
361 REINT: MOVEI E,1 ;PREPARE TO RENABLE
364 .SUSET [.SMSK2,,MASK2]
372 MFUNCTION QUITTER,SUBR
376 REQT: PUSHJ P,INTCH1 ;CHECK FOR A CHAR
377 CAMN A,$TFALSE ;ANY LEFT?
379 CAME B,[7_29.] ;CNTL G?
381 PUSH TP,$TCHAN ;QUIT HERE
382 PUSH TP,(D) ;PUSH CHANNEL
385 PUSH TP,MQUOTE CONTROL-G
389 MFUNCTION INTRCH,SUBR,INTCHAN
393 MOVE B,INTNUM+1(TVP) ;GET INT NUMBER
395 JUMPL B,IFALSE ;NOT A CHANNEL
397 JRST IFALSE ;NOT A CHANNEL
399 ADDI B,CHANL0(TVP) ;GET POINTER TO CHANNEL
404 MFUNCTION GASCII,SUBR,ASCII
419 SKIPGE B,1(AB) ;GET NUMBER
421 CAILE B,177 ;CHECK RANGE
427 TOOBIG: PUSH TP,$TATOM
428 PUSH TP,MQUOTE OUT-OF-RANGE
431 ;SUBROUTINE TO GET BIT FOR CLOBBERAGE
433 GETBIT: MOVNS B ;NEGATE
434 MOVSI A,400000 ;GET THE BIT
435 LSH A,(B) ;SHIFT TO POSITION
438 ;HERE TO HANDLE PDL OVERFLOW. ASK FOR A GC
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
446 SKIPE GCFLG ;IS GC RUNNING?
447 JRST GCPLOV ;YES, COMPLAIN GROSSLY
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
454 ADDI A,0STO(PVP) ;POINT TO THIS ACS CURRENT TYPE
455 HLRZ A,(A) ;GET THAT TYPE INTO A
457 MOVEI B,GCPDL ;POINT TO SAVED P
459 CAIN B,B ;OR IS IT B ITSELF
465 MOVEI B,1(P) ;C WILL BE ON THE STACK
470 MOVE A,(B) ;GET THE LOSING POINTER
471 MOVEI C,(A) ;AND ISOLATE RH
473 CAMG C,VECTOP ;CHECK IF IN GC SPACE
475 JRST NOGROW ;NO, COMPLAIN
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?
482 SKIPE PGROW ;YES, ALREADY GROWN?
483 JRST PDLOSS ;YES, LOSE
484 ADDI A,PDLBUF ;POINT TO REAL DOPE WORD
486 JRST PNTRHK ;FIX UP THE PDL POINTER
488 TRYTP: CAIE C,TTP ;TP STACK
490 SKIPE TPGROW ;ALREADY GROWN?
492 ADDI A,PDLBUF ;POINT TO REAL DOPE WORD
494 JRST PNTRHK ;GO MUNG POINTER
496 TRYPP: CAIE C,TPP ;PLANNER PDL?
504 PNTRHK: MOVE C,(B) ;RESTORE PDL POINTER
505 SUB C,[PDLBUF,,0] ;FUDGE THE POINTER
506 MOVEM C,(B) ;AND STORE IT
508 POP P,C ;RESTORE THE WORLD
509 MOVE A,TSINT ;RESTORE INT WORD
511 EXCH P,GCPDL ;GET BACK ORIG PDL
512 JRST IMPCH ;LOOK FOR MORE INTERRUPTS
514 TPOVFL: SETOM INTFLG ;SIMULATE PDL OVFL
516 MOVEI A,200000 ;TURN ON THE BIT
518 SUB TP,[PDLBUF,,0] ;HACK STACK POINTER
519 HLRE A,TP ;FIND DOPEW
520 SUBM TP,A ;POINT TO DOPE WORD
527 ;HERE TO HANDLE LOW-LEVEL CHANNELS
530 CHNACT: SKIPN GCFLG ;GET A WINNING PDL
532 ANDI A,177777 ;ISOLATE CHANNEL BITS
535 CHNA1: MOVEI B,0 ;BIT COUNTER
538 SUBI B,35. ;NOW HAVE CHANNEL
541 LSH 0,(B) ;SET TO CLOBBER BIT
543 LSH B,23. ;POSITION FOR A .STATUS
546 ANDI B,77 ;ISOLATE DEVICE
549 ANDCAM 0,MASK2 ;TURN OFF BIT
550 .SUSET [.SMSK2,,MASK2]
558 ;HERE IF PDL OVERFLOW DURING GARBAGE COLLECTION
560 BADPDL: SKIPA B,[[ASCIZ /NON-PDL OVERFLOW
562 GCPLOV: MOVEI B,[ASCIZ /PDL OVERFLOW DURING GARBAGE COLLECTION
564 GFATER: MOVE P,GCPDL ;GET ORIGINAL PDL FOR TYPE OUT
565 JRST FATERR ;GO TO FATAL ERROR ROUTINE
567 NOGROW: MOVEI B,[ASCIZ /PDL OVERFLOW ON NON-EXPANDABLE PDL
571 PDLOSS: MOVEI B,[ASCIZ /PDL OVERFLOW BUFFER EXHAUSTED
575 FATERR: PUSHJ P,MSGTYP ;TYPE THE MESSAGE
576 MOVEI B,[ASCIZ /FATAL ERROR, PLEASE DUMP SO THAT MUDDLE SYSTEM PROGRAMMERS
578 PUSHJ P,MSGTYP ;TYPE THE LOSER MESSAGE
579 PUSHJ P,OCLOS ;CLOSE THE TTY
584 ;MEMORY PROTECTION INTERRUPT
586 IMPV: MOVEI B,[ASCIZ /MPV -- /]
588 IMPV1: PUSHJ P,MSGTYP ;TYPE
589 SKIPE GCFLG ;THESE ERRORS FATAL IN GARBAGE COLLECTOR
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
597 PUSHJ P,TYI ;READ THE CHARACTER
599 PUSHJ P,UPLO ;CONVERT TO UPPER CASE
603 CAIE A,"R ;DOES HE WANT TO RESTART
604 JRST ERLP ;NO, TELL HIM AGAIN
606 MCALL 0,INTABR ;ABORT THE PROCESS
608 INTABR: MOVEI A,ERRET ;REAALY GO TO ERRET
613 GCERR: MOVEI B,[ASCIZ /IN GARBAGE COLLECTOR
617 ILOPR: MOVEI B,[ASCIZ /ILLEGAL OPERATION -- /]
620 ; SUBROUTINE TO CONVERT LOWER CASE LETTERS TO UPPER
622 UPLO: CAIG A,172 ;GEATER THAN Z?
623 CAIG A,140 ;NO, LESS THAN A
625 SUBI A,40 ;MAKE UPPER CASE
628 ;SUBROUTINE TO BE CALLED AT INITIALIZE TIME TO FUDGE INT PC
630 INTINT: PUSHJ P,PCHACK ;FUDGE PC LOSSAGE
631 MOVE A,MASK1 ;SET MASKS
633 .SETM2 A, ;SET BOTH MASKS
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
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
653 INTLOS: .VALUE [ASCIZ /INT/]
654 CHARCH: .VALUE [ASCIZ /CHAR?/]
655 ;RANDOM IMPURE CRUFT NEEDED
659 PIRQ: 0 ;HOLDS REQUEST BITS FOR 1ST WORD
660 PIRQ2: 0 ;SAME FOR WORD 2
662 MASK1: 220040 ;FIRST MASK
663 MASK2: 0 ;SECOND THEREOF