TITLE MUDEX -- TENEX DEPENDANT MUDDLE CODE RELOCATABLE .INSRT MUDDLE > .INSRT STENEX > MFORK==400000 MONITS==1 .GLOBAL %SSNAM,%RSNAM,%KILLM,%LOGOU,%SLEEP,%VALRE,NOTTY,MSGTYP,TTYOP2 .GLOBAL %UNAM,%JNAM,%RUNAM,%RJNAM,%GCJOB,%SHWND,%SHFNT,%GETIP,%INFMP .GLOBAL GCHN,WNDP,FRNP,MESSAG,INITFL,6TOCHS,SGSNAM,MTYO,PGINT,WHOAMI .GLOBAL %TOPLQ,IBLOCK,TMTNXS,TNXSTR,%HANG,ILLUUO,UUOH,IPCINI,CTIME,BFLOAT .GLOBAL GCRSET GCHN==0 WRTP==1000,,100000 GCHI==1000,,GCHN CRJB==1000,,400001 FME==1000,,-1 FLS==1000,, CTIME: JOBTM ; get run time in milli secs MOVE B,A JSP A,BFLOAT ; Convert to floating FDVRI B,(1000.0) ; Change to units of seconds MOVSI A,TFLOAT POPJ P, ; SET THE SNAME GLOBALLY %SSNAM: POPJ P, ; READ THE GLOBAL SNAME %RSNAM: POPJ P, ; KILL THE CURRENT JOB %KILLM: HALTF POPJ P, ; PASS STRING TO SUPERIOR (MONITOR?) %VALRE: HALTF POPJ P, ; LOGOUT OF SYSTEM (MUST BE "TOP LEVEL") %LOGOU: LGOUT POPJ P, ; GO TO SLEEP A WHILE %SLEEP: IMULI A,33. ; TO MILLI SECS DISMS POPJ P, ; HANG FOR EVER %HANG: WAIT ; READ JNAME %RJNAM: POPJ P, ; READ UNAME %RUNAM: POPJ P, ; HERE TO SEE IF WE ARE A TOP LEVEL JOB %TOPLQ: GJINF SKIPGE D AOS (P) POPJ P, ; GET AN INFERIOR FOR THE GARBAGE COLLECTOR %GCJOB: PUSH P,A MOVEI A,200000 ; GET BITS FOR FORK CFORK ; MAKE AN IFERIOR FORK FATAL CANT GET GC FORK MOVEM A,GCFRK ; SAVE HANDLE POP P,A ; RESTORE PAGE PUSHJ P,%GETIP ; GET IT THERE PUSHJ P,%SHWND JRST %SHFNT ; AND FRONTIER ; HERE TO GET A PAGE FOR THE INFERIOR %GETIP: POPJ P, ; HERE TO SHARE WINDOW %SHWND: TDZA 0,0 ; FLAG SAYING WINDOW ; HERE TO SHARE FRONTIER %SHFNT: MOVEI 0,1 PUSH P,A PUSH P,B PUSH P,C MOVEI B,2*FRNP ; FRONTIER (REMEMBER TENEX PAGE SIZE) SKIPN 0 MOVEI B,2*WNDP ; NO,WINDOW HRLI B,MFORK ASH A,1 ; TIMES 2 HRL A,GCFRK MOVSI C,140000 ; READ AND WRITE ACCESS PMAP ADDI A,1 ADDI B,1 PMAP ASH B,9. ; POINT TO PAGE MOVES (B) ; CLOBBER TOP MOVES -1(B) ; AND UNDER POP P,C POP P,B POP P,A POPJ P, ; HERE TO MAP INFERIOR BACK AND KILL SAME %INFMP: PUSH P,C PUSH P,D PUSH P,E ASH A,1 ASH B,1 MOVE D,A ; POINT TO PAGES MOVE E,B ; FOR COPYING PUSH P,A ; SAVE FOR TOUCHING MOVS A,GCFRK MOVSI B,MFORK MOVSI C,120400 ; READ AND WRITE COPY LP1: HRRI A,(E) HRRI B,(D) PMAP ADDI E,1 AOBJN D,LP1 ; HERE TO TOUCH PAGES TO INSURE KEEPING THEM (KLUDGE) POP P,E ; RESTORE MY FIRST PAGE # MOVEI A,(E) ; COPY FOR LOOP ASH A,9. ; TO WORD ADDR MOVES (A) ; WRITE IT AOBJN E,.-3 ; FOR ALL PAGES MOVE A,GCFRK KFORK POP P,E POP P,D POP P,C POPJ P, ; HACK TO PRINT MESSAGE OF INTEREST TO USER MESOUT: MOVSI A,(JFCL) MOVEM A,MESSAG ; DO ONLY ONCE MOVEI A,400000 MOVE B,[1,,ILLUUO] MOVE C,[40,,UUOH] SCVEC SETZ SP, ; HACK TO AVOID LOSSAGE WITH GARBAGE IN SP FIRST TIME PUSHJ P,GCRSET PUSHJ P,PGINT ; INITIALIZE PAGE MAP RESET PUSHJ P,TTYOP2 SKIPE NOTTY ; HAVE A TTY? JRST RESNM ; NO, SKIP THIS STUFF MOVEI A,MESBLK MOVEI B,0 GTJFN JRST RESNM MOVE B,[70000,,200000] OPENF JRST RESNM MSLP: BIN MOVE D,B ; SAVE BYTE GTSTS TLNE B,1000 JRST RESNM EXCH D,A CAIN A,14 PBOUT MOVE A,D JRST MSLP RESNM2: CLOSF JFCL RESNM: RESNM1: POPJ P, MESBLK: 100000,, 377777,,377777 -1,,[ASCIZ /DSK/] -1,,[ASCIZ /VEZZA/] -1,,[ASCIZ /MUDDLE/] -1,,[ASCIZ /MESSAG/] 0 0 0 MUDINT: MOVSI 0,(JFCL) ; CLOBBER MUDDLE INIT SWITCH MOVEM 0,INITFL GJINF ; GET INFO NEEDED PUSHJ P,TMTNXS ; MAKE A TEMP STRING FOR TENEX INFO (POINTER LEFT IN E) HRROI A,1(E) ; TNX STRING POINTER DIRST FATAL ATTACHED DIR DOES NOT EXIST MOVEI B,1(E) ; NOW HAVE BOUNDS OF STRING SUBM P,E ; RELATIVIZE E PUSHJ P,TNXSTR ; MAKE THE STRING SUB P,E PUSH TP,$TATOM PUSH TP,IMQUOTE SNM PUSH TP,A PUSH TP,B MCALL 2,SETG PUSH TP,$TCHSTR PUSH TP,CHQUOTE READ PUSH TP,$TCHSTR PUSH TP,CHQUOTE MUDDLE.INIT MCALL 2,FOPEN GETYP A,A CAIE A,TCHAN POPJ P, PUSH TP,$TCHAN PUSH TP,B MOVEI B,INITSTR ; TELL USER WHAT'S HAPPENING SKIPE WHOAMI JRST .+3 SKIPN NOTTY PUSHJ P,MSGTYP MCALL 1,MLOAD POPJ P, TMTNXS: POP P,D ; SAVE RET ADDR MOVE E,P ; BUILD A STRING SPACE ON PSTACK MOVEI 0,20. ; USE 20 WORDS (=100 CHARS) PUSH P,[0] SOJG 0,.-1 JRST (D) TNXSTR: SUBI B,(P) PUSH P,B ADDI B,-1(P) SUBI B,(A) ; WORDS TO B IMULI B,5 ; TO CHARS LDB 0,[360600,,A] ; GET BYTE POSITION IDIVI 0,7 ; TO A REAL BYTE POSITION MOVNS 0 ADDI 0,5 SUBM 0,B ; FINAL LENGTH IN BYTES TO B PUSH P,B ; SAVE IT MOVEI A,4(B) ; TO WORDS IDIVI A,5 PUSHJ P,IBLOCK ; GET STRING POP P,A POP P,C ADDI C,(P) MOVE D,B ; COPY POINTER MOVE 0,(C) ; GET A WORD MOVEM 0,(D) ADDI C,1 AOBJN D,.-3 HRLI A,TCHSTR HRLI B,440700 ; MAKE INTO BYTER POPJ P, IPCINI: JFCL IFN MONITS,[ DEMS: SETZ SIXBIT /DEMSIG/ SETZ [SIXBIT /MUDSTA/] ] INITSTR: ASCIZ /MUDDLE INIT/ IMPURE GCFRK: 0 IFN MONITS,[ MESSDM: 30,,(SIXBIT /IPC/) .+1 SIXBIT /MUDDLESTATIS/ 1 1 ] MESSAG: PUSHJ P,MESOUT ; MESSAGE SWITCH INITFL: PUSHJ P,MUDINT ; MUDDLE INIT SWITCH PURE END