X-Git-Url: https://jxself.org/git/?p=pdp10-muddle.git;a=blobdiff_plain;f=MUDDLE%2Fnuuoh.12;fp=MUDDLE%2Fnuuoh.12;h=687fba26952a914d70332b4d91f0a1103074ca28;hp=0000000000000000000000000000000000000000;hb=39c5769144e7f2a58076bdb973d2c80fa603345c;hpb=bab072f950a643ac109660a223b57e635492ac25 diff --git a/MUDDLE/nuuoh.12 b/MUDDLE/nuuoh.12 new file mode 100644 index 0000000..687fba2 --- /dev/null +++ b/MUDDLE/nuuoh.12 @@ -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 +  \ No newline at end of file