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