+TITLE UUO HANDLER FOR MUDDLE
+RELOCATABLE
+.INSRT MUDDLE >
+
+;GLOBALS FOR THIS PROGRAM
+
+.GLOBAL BACKTR,PRINT,PDLBUF,TPGROW,SPECSTO,TIMOUT,AGC
+.GLOBAL BCKTRK,SPCSTE,CNTIN2
+
+;SETUP UUO DISPATCH TABLE HERE
+
+UUOTBL: ILLUUO
+
+IRP UUOS,,[[DP,DODP],[.MCALL,DMCALL],[.ACALL,DACALL]]
+UUFOO==.IRPCNT+1
+IRP UUO,DISP,[UUOS]
+.GLOBAL UUO
+UUO=UUFOO_33
+DISP
+.ISTOP
+TERMIN
+TERMIN
+
+REPEAT 100-.IRPCNT,ILLUUO
+
+
+UUOH:
+LOC 41
+ JSR UUOH
+LOC UUOH
+ 0
+ JRST UUOPUR ;GO TO PURE CODE FOR THIS
+
+;SEPARATION OF PURE FROM IMPURE CODE HERE
+
+UUOPUR: PUSH P,C
+ LDB C,[330900,,40]
+ JRST @UUOTBL(C) ;DISPATCH BASED ON THE UUO
+
+;HANDLER FOR DEBUGGING CALL TO PRINT
+
+DODP:
+ POP P,C
+ PUSH TP, @40
+ AOS 40
+ PUSH TP,@40
+ PUSH P,0
+ PUSH P,1
+ PUSH P,2
+ PUSH P,3
+ PUSH P,4
+ PUSH P,5
+ PUSH P,40
+ MCALL 1,PRINT
+ POP P,40
+ POP P,5
+ POP P,4
+ POP P,3
+ POP P,2
+ POP P,1
+ POP P,0
+ JRST 2,@UUOH
+
+;CALL HANDLER
+
+DMCALL: MOVEM SP,SPSAV(TB) ;STORE VITALS INTO CURRENT FRAME
+ MOVE C,UUOH ;PICK UP PCWORD
+ MOVEM C,PCSAV(TB) ;SAVE IN CURRENT FRAME
+ LDB C,[270400,,40] ;GET AC FIELD OF UUO
+COMCAL: LSH C,1 ;TIMES 2
+ MOVEM C,(P) ;SAVE
+ HRLI C,(C) ;TO BOTH SIDES
+ SUBM TP,C ;NOW HAVE TP TO SAVE
+ MOVEM C,TPSAV(TB) ;SAVE IT
+ MOVEI AB,1(C) ;BUILD THE AB POINTER
+ MOVN C,(P) ;NEGATE NUMBER OF ARGS
+ HRLI AB,(C) ;HAVE A REAL AB POINTER
+ MOVSI C,TENTRY ;SET UP ENTRY WORD
+ HRR C,40 ;POINT TO CALLED SR
+ PUSH TP,C ;START HACKING FRAME
+ PUSH TP,TB
+ PUSH TP,AB
+ PUSH TP,SP
+ PUSH TP,P
+ PUSH TP,TP
+ PUSH TP,PP
+ PUSH TP,[0]
+CALDON: SUB P,[1,,1] ;POP STACK
+ MOVEM P,PSAV(TB)
+ MOVEM PP,PPSAV(TB) ;SAVE PLANNER PDL
+ HRRI TB,(TP) ;SETUP NEW TB
+ AOBJP TB,CALLIT ;GO TO CALLED SR
+ TLNE TB,-1 ;TIME OVERFLOW?
+ JRST CALLIT ;NO, GOT TO CALLED GOODIE
+
+;TIME OVERFLOW, CALL THE GARBAGE COLLECTOR
+
+ MOVEM TP,TIMOUT ;POINT TO UNHAPPY PDL
+ PUSHJ P,AGC ;AND COLLECT GARBAGE
+ HRLI TB,TIMOUT ;CONTAINS CURRENT TIME
+ SETZM TIMOUT
+CALLIT: INTGO ;CHECK FOR INTERRUPTS
+ JRST (C)
+
+
+;HANDLER FOR CALL WHERE SPECIFIES NUMBER OF ARGS
+
+DACALL: MOVEM SP,SPSAV(TB) ;SETUP THE OLD FRAME
+ MOVE C,UUOH ;GET PC WORD
+ MOVEM C,PCSAV(TB) ;AND SAVE
+ LDB C,[270400,,40] ;GOBBLE THE AC LOCN INTO C
+ IOR C,[MOVE C,0] ;SETUP INS
+ EXCH C,(P) ;PUT INS ON STACK AND RESTORE C
+ XCT (P) ;C NOW HAS NO. OF ARGS
+ JRST COMCAL ;JOIN MCALL
+
+;HANDLE OVERFLOW IN THE TP
+
+TPLOSE: ADD TP,[-PDLBUF,,0] ;USE BUFFER
+ HLRE C,TP ;GET -LENGTH
+ MOVEI D,1(TP) ;COPY TP
+ SUB D,C ;D POINTS TO DOPE WORD
+ MOVEM D,TPGROW ;SAVE FOR NEXT GARBAGE COLLECTION
+ SETOM INTFLG ;CAUSE AN INTERRUPT NEXT TIME
+ JRST CALDON
+
+;SUBROUTINE TERMINATION CODE (NOT A UUO BUT HERE FOR COMPLETENENSS)
+
+FINIS: MOVE C,OTBSAV(TB)
+ MOVE E,SPSAV(C) ;RESTORE BINDINGS
+ CAIE E,(SP)
+ PUSHJ P,SPCSTE ;IF NECESSARY
+ HRR C,OTBSAV(TB) ;CHECK PP GROWTH
+ CAME PP,PPSAV(C)
+ JRST BCKTR1 ;SAVE TP FRAME
+CNTIN1: HRR TB,OTBSAV(TB) ;RESTORE BASE
+CNTIN2: MOVE TP,TPSAV(TB) ;START HERE FOR FUNNY RESTART
+ MOVE P,PSAV(TB)
+ MOVE AB,ABSAV(TB) ;AND GET OLD ARG POINTER
+ JRST 2,@PCSAV(TB) ;AND RETURN
+BCKTR1: PUSH TP,A ;SAVE VALUE TO BE RETURNED
+ PUSH TP,B ;SAVE FRAME ON PP
+ PUSHJ P,BCKTRK
+ POP TP,B
+ POP TP,A
+ JRST CNTIN1
+CONTIN: CAME SP,SPSAV(TB)
+ PUSHJ P,SPECST
+ JRST CNTIN2
+
+
+ILLUUO: .VALUE
+
+OPC: 0
+JPC: 0
+
+END
+\f\ 3\f
\ No newline at end of file