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