ITS Muddle.
[pdp10-muddle.git] / MUDDLE / nuuoh.12
diff --git a/MUDDLE/nuuoh.12 b/MUDDLE/nuuoh.12
new file mode 100644 (file)
index 0000000..687fba2
--- /dev/null
@@ -0,0 +1,158 @@
+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