1 TITLE MUDEX -- TENEX DEPENDANT MUDDLE CODE
11 .GLOBAL %SSNAM,%RSNAM,%KILLM,%LOGOU,%SLEEP,%VALRE,NOTTY,DEMFLG,MSGTYP,TTYOP2
12 .GLOBAL %UNAM,%XUNA,%JNAM,%XJNA,%RUNAM,%RXUNA,%RJNAM,%RXJNA,%GCJOB,%VALFI
13 .GLOBAL %SHWND,%SHFNT,%GETIP,%INFMP,SGCLBK,TWENTY,MULTSG,MLTUUP
14 .GLOBAL GCHN,WNDP,FRNP,MESSAG,INITFL,6TOCHS,SGSNAM,MTYO,PGINT,WHOAMI
15 .GLOBAL %TOPLQ,IBLOCK,TMTNXS,TNXSTR,%HANG,ILLUUO,UUOH,IPCINI,CTIME,BFLOAT
16 .GLOBAL GCRSET,%MPINT,%GBINT,%CLSMP,%GCJB1,%CLMP1,%SAVIN,%MPIN,%MPIN1,%IMSV1
17 .GLOBAL %PURIF,%MPINX,%CLSJB,%KILJB,%IFMP1,%OPGFX,STOSTR,%SAVRP,%RSTRP,GETSQU
18 .GLOBAL WIND,%FDBUF,%CWINF,P.TOP,BUFGC,PURBOT,%IFMP2,%CLSM1,GETBUF,KILBUF
19 .GLOBAL CERR1,CERR2,CERR3,COMPERR,CALER1,%LDRDO,%MPRDO,SQBLK,SQLOD,SQKIL,GETSQU
20 .GLOBAL SQUPNT,SFRK,IJFNS,GETJS,OPBLK,SJFNS,OPSYS,GCLDBK,ILDBLK,IJFNS1,TILDBL
21 .GLOBAL TBINIT,PVSTOR,SECBLK,PURCLN,NSEGS,INTINT,PURBTB,%CLNCO,OUTRNG
22 .GLOBAL MULTI,NOMULT,THIBOT,%PURMD
23 .GLOBAL C%11,C%22,C%33,C%44,C%55,C%66,C%0,C%1,C%2,C%3,C%M1,C%M2,C%M10
24 .GLOBAL C%M20,C%M30,C%M40,C%M60
35 CTREAD==100000 ; READ BIT
36 CTEXEC==20000 ; EXECUTE BIT
37 CTWRIT==40000 ; WRITE BIT
38 CTCW==400 ; COPY ON WRITE
41 FREAD==200000 ; READ BIT FOR OPENF
42 FEXEC==40000 ; EXEC BIT FOR OPENF
46 GJ%SHT==1 ; SHORT FORM GTJFN
47 GJ%OLD==100000 ; FILE MUST EXIST
48 OP%36B==440000 ; 36 BIT BYTES
49 OP%7B==700000 ; 7 BIT BYTES
53 JRST @[.+1] ; RUN IN 0 FOR BIZARRE BUGS
69 MOVE B,[OP%36B,,FREAD]
71 FATAL CANT OPEN SQUOZE
73 FATAL CANT SIZEF SQUOZE
102 %PURMD: MOVE A,[MFORK,,THIBOT]
105 TLNN B,CTWRIT+CTCW ; SKIP IF NOT READ ONLY
106 TLNN B,CTEXST ; SKIP IF EXISTS (OTHERWISE WE'LL CREATE IT)
107 JRST .+3 ; SKIP IF NOT READ ONLY
108 MOVSI B,CTREAD+CTEXEC
114 GETSQU: HRRZ 0,SQUPNT
119 CTIME: SKIPE OPSYS ; skip if TOPS20
124 JOBTM ; get run time in milli secs
129 FDVRI B,(1000.0) ; Change to units of seconds
135 %RSNAM: PUSHJ P,TMTNXS ; GET STRING ON STACK (POINTER IN E)
136 GJINF ; USER NUMBER IS IN A
137 PUSHJ P,INFSTR ; MAKE INFO STRING
141 ; KILL THE CURRENT JOB
152 RSCAN ; MAKE IT AVAILABLE FOR USE
156 ; LOGOUT OF SYSTEM (MUST BE "TOP LEVEL")
161 ; GO TO SLEEP A WHILE
163 %SLEEP: IMULI A,33. ; TO MILLI SECS
174 %RJNAM: GETNM ; RETURNS SIXBIT IN A
181 %RUNAM: PUSHJ P,TMTNXS ; GET STRING ON STACK (POINTER IN E)
182 GJINF ; USER NUMBER IS IN A
183 MOVE B,A ; USER NUMBER TO B
184 PUSHJ P,INFST1 ; MAKE INFO STRING
185 CPOPJ1: AOS (P) ; SKIP RETURN
188 ; MAKE A STRING FROM DIRST GOODIES
190 INFST1: MOVEI 0,1 ; FLAG WHETHER TO SCAN
191 HRROI A,1(E) ; STRING POINTER IN A
193 FATAL ATTACHED DIRECTORY DOESN'TEXIST
194 MOVEI B,1(E) ; A AND B BOUND STRING
195 JUMPN 0,INFST2 ; NO NEED TO SCAN
202 ILDB 0,B ; FLUSH : AND <>
218 INFST2: SUBM P,E ; RELATIVIZE E
219 PUSHJ P,TNXSTR ; BUILD STRING (IN A AND B)
220 MOVE C,(P) ; GET RETURN PC FROM PUSHJ
221 SUB P,E ; P BACK TO NORMAL
224 ; HERE TO SEE IF WE ARE A TOP LEVEL JOB
230 ; ERRORS IN COMPILED CODE MAY END UP HERE
232 CERR1: ERRUUO EQUOTE NEGATIVE-ARGUMENT
234 CERR2: ERRUUO EQUOTE NTH-REST-PUT-OUT-OF-RANGE
236 CERR3: ERRUUO EQUOTE UVECTOR-PUT-TYPE-VIOLATION
239 ERRUUO EQUOTE ERROR-IN-COMPILED-CODE
242 ; GET AN INFERIOR FOR THE GARBAGE COLLECTOR
245 MOVEI A,CR%CAP ; GET BITS FOR FORK
246 CFORK ; MAKE AN IFERIOR FORK
247 FATAL CANT GET GC FORK
248 MOVEM A,GCFRK ; SAVE HANDLE
249 POP P,A ; RESTORE PAGE
254 ; HERE TO SHARE WINDOW
266 ASH B,1 ; TO CRETINOUT TENEX PAGE SIZE
270 MOVSI C,CTREAD+CTWRIT ; READ AND WRITE ACCESS
276 ASH B,9. ; POINT TO PAGE
277 MOVES (B) ; CLOBBER TOP
278 MOVES -1(B) ; AND UNDER
285 ; HERE TO MAP INFERIOR BACK AND KILL SAME
292 MOVE D,A ; POINT TO PAGES
293 MOVE E,B ; FOR COPYING
294 PUSH P,A ; SAVE FOR TOUCHING
296 ; HERE FOR OPTIONAL MULTI FORK HACK
298 SKIPLE A,SFRK ; SKIP NOT ENABLED OR NOT ACTIVE
299 KFORK ; FLUSH THE OLD EXTRA
302 SKIPE SFRK ; SKIP IF NOT MULTI FORK
303 HLRZM A,SFRK ; SAVE THIS AS IT
305 MOVSI C,CTREAD+CTEXEC+CTCW ; READ AND WRITE COPY
307 MOVSI C,CTREAD+CTEXEC+CTWRIT
315 ; HERE TO TOUCH PAGES TO INSURE KEEPING THEM (KLUDGE)
317 POP P,E ; RESTORE MY FIRST PAGE #
318 SKIPE SFRK ; SKIP IF NOT MULTI CASE
320 MOVEI A,(E) ; COPY FOR LOOP
321 ASH A,9. ; TO WORD ADDR
323 AOBJN E,.-3 ; FOR ALL PAGES
332 ; HACK TO PRINT MESSAGE OF INTEREST TO USER
334 MESOUT: MOVSI A,(JFCL)
335 MOVEM A,MESSAG ; DO ONLY ONCE
338 SETOM SFRK ; NO FORK TO HACK RIGGHT NOW
339 PUSHJ P,GETJS ; GET SOME JFNS
345 SETZB SP,FRM ; HACK TO AVOID LOSSAGE WITH GARBAGE IN SP
348 MOVE A,[MFORK,,THIBOT]
349 MOVSI B,CTREAD+CTEXEC
354 PUSHJ P,PGINT ; INITIALIZE PAGE MAP
356 AOJN D,.+3 ; JUMP IF HAS TTY
361 MOVEI A,MFORK ; GET FORK HANDLE
363 MOVE C,B ; HAIR TO ENABLE CAPABILITIES OF DEMON
366 SKIPN DEMFLG ; SKIP IF DEMON
367 SKIPE NOTTY ; HAVE A TTY?
368 JRST RESNM ; NO, SKIP THIS STUFF
374 MOVE B,[OP%7B,,FREAD]
392 RESNM: PUSHJ P,TWENTY
395 POP P,C ; STAY IN MAIN SEG
400 ; GET JFNS TO MDL INTERPRETER, AGC AND SGC, SAVE IN IJFNS AND IJFNS1
401 GETJS: MOVEI A,$TLOSE
403 HRLI A,MFORK ; THIS FORK
405 JUMPGE A,GETJS1 ; HAPPY?
406 ; HERE TO GET MDL INTERPRETER JFN EXPLICITLY RATHER THAN THROUGH RMAP
410 MOVSI A,GJ%SHT+GJ%OLD
412 FATAL INTERPRETER EXE FILE MISSING
413 MOVE B,[OP%36B,,FREAD+FWRITE]
415 FATAL CANT OPEN MDL INTERPRETER EXE FILE
417 GETJS1: HLRZM A,IJFNS ; SAVE JFN TO INTERPRETER
420 ; GTJFN BLOCK FOR MESSAGE FILE
431 MUDINT: MOVSI 0,(JFCL) ; CLOBBER MUDDLE INIT SWITCH
434 ; LOOP TO TOUCH ALL PAGES SO PURIFY CAN WORK
436 SKIPN A,DEMFLG ; SKIP IF A DEMON
437 JRST FINDIR ; GET USERS DIRECTORY
439 MOVE A,DEMFLG ; GET SIXBIT OF DIRECTORY NAME
440 PUSHJ P,6TOCHS ; TO CHARACACTER STRING
443 FINDIR: GJINF ; GET INFO NEEDED
445 PUSHJ P,TMTNXS ; MAKE A TEMP STRING FOR TENEX INFO
446 ; (POINTER LEFT IN E)
448 DIRCON: PUSH TP,$TATOM
455 MOVE A,[SIXBIT/MUDDLE/]
456 PUSHJ P,6TOCHS ; MAKE A CHARACTER STRING
461 PUSH TP,$TCHSTR ; NOW THE .INIT
462 PUSH TP,CHQUOTE .INIT
463 MCALL 2,STRING ; MAKE A STRING
464 PUSH TP,A ; ARGS TO FOPEN
470 SUBSYS: PUSH TP,$TCHSTR
472 MOVE A,[SIXBIT /MUDDLE/]
483 PUSH TP,CHQUOTE MUDDLE
488 ISVCHN: PUSH TP,$TCHAN
490 MOVEI B,INITSTR ; TELL USER WHAT'S HAPPENING
493 SKIPE DEMFLG ; SKIP IF NOT A DEMON
500 TMTNXS: POP P,D ; SAVE RET ADDR
501 MOVE E,P ; BUILD A STRING SPACE ON PSTACK
502 MOVEI 0,20. ; USE 20 WORDS (=100 CHARS)
512 SUBI B,(A) ; WORDS TO B
514 LDB 0,[360600,,A] ; GET BYTE POSITION
515 IDIVI 0,7 ; TO A REAL BYTE POSITION
518 SUBM 0,B ; FINAL LENGTH IN BYTES TO B
520 MOVEI A,4(B) ; TO WORDS
523 PUSHJ P,IBLOCK ; GET STRING
528 MOVE D,B ; COPY POINTER
529 MOVE 0,(C) ; GET A WORD
535 HRLI B,00700 ; MAKE INTO BYTER
538 INITSTR: ASCIZ /MUDDLE INIT/
540 ; HERE TO RECOPY PAGE 0 WHICH CONTAINS IMFORMATION FOR REMAPPING IN INFERIOR
541 %OPGFX: PUSH P,B ; SAVE B
543 MOVEI B,STOSTR ; TOP OF CONSTANTS
546 ASH B,-10. ; TO PAGES
548 MOVEI B,WNDP ; GET WINDOW
549 HRLZS A ; START WITH PAGE 0
550 OPGFX2: JUMPGE A,OPGFX1
555 ASH A,10. ; TO START OF PAGE
556 HRLS A ; SET UP BLT POINTER
559 BLT A,1777(B) ; OUT INTO THE BUFFER
566 ; ROUTINE TO PROTECT A CORE IMAGE BY SAVING IT IN AN INFERIOR
567 ; A==FORK HANDLE B== AOBJN POINTER
570 PROTCT: TRNN B,-1 ; SEE IF PAGE 0 IS INCLUDED
571 ADD B,C%11 ; INC PAGE
574 MOVE C,B ; COPY AOBJN
575 MOVSI A,MFORK ; FORK HANDLE
576 JUMPE C,PRTDON ; IF ZERO THEN WE ARE DONE
577 PROTC1: HRRI A,(C) ; GET PAGE
581 TLNN B,CTWRIT+CTCW ; SKIP IF NOT READ ONLY
582 TLNN B,CTEXST ; SKIP IF EXISTS (OTHERWISE WE'LL CREATE IT)
583 MOVES 20(D) ; TOUCH PAGE
584 MOVSI B,CTREAD+CTEXEC ; SET UP TO MARK PAGES TO TRAP ON ANY REF
585 SPACS ; CHANGE MODE OF PAGE
587 PRTDON: POP P,C ; RESTORE C
590 %FDBUF: HRRZ A,PURBOT
591 SUB A,P.TOP ; CALCULATE ROOM FOR PROSPECTIVE BUFFER
592 CAIG A,2000 ; SEE IF ROOM
594 MOVE A,P.TOP ; START OF BUFFER
597 FDBUF1: SETOM BUFGC ; INDICATE NO BUFFER FOUND
600 ; HERE TO SIMULATE A COPY ON WRITE TO AN INFERIOR. IF A PAGE HAS NO WRITE BITS
601 ; IT WILL COPY IT INTO THE GCFRK1 FORK. A== START OF PAGE, B== START OF BUFFER PAGE
606 ANDI A,-1 ; CLEAN OUT LEFT HALF OF A
609 HRLI A,MFORK ; GET FORK HANDLE
610 RPACS ; READ PAGE BITS
612 TLNE B,CTEXST ; SKIP IF DOESN'T EXIST
613 TLNE B,CTWRIT ; SEE IF WRITABLE
614 JRST CWINFX ; NO, EXIT
615 MOVSI B,CTEXEC+CTREAD+CTCW
616 SPACS ; RESTORE PAGE TO NORMAL
618 RPACS ; READ PAGE BITS
619 TLNE B,CTEXST ; SKIP IF DOESN'T EXIST
620 TLNE B,CTWRIT ; SEE IF WRITABLE
621 JRST CWINFY ; NO, EXIT
622 MOVSI B,CTEXEC+CTREAD+CTCW
627 TLNE B,CTEXST ; SKIP IF DOESN'T EXIST
628 TLNE B,CTWRIT ; SEE IF WRITABLE
629 JRST CWINF1 ; NO, EXIT
630 CWINFZ: HRRZI A,-1(A)
632 MOVE B,-1(P) ; SET UP BUFFER PAGE
633 ASH B,-10. ; TO PAGE NUMBER
634 PUSHJ P,%SHWNF ; SHARE A WINDOW
635 HRLZ A,-2(P) ; PREPARE FOR BLT
638 BLT A,1777(B) ; SAVE THE PAGE
642 HRLI B,MFORK ; SET UP HANDLE
652 ; ROUTINE TO RESTORE THE IMAGE FROM A SAVED FORK IMAGE.
653 ; A== FORK HANDLE B== AOBJN POINTER TO MUDDLE
657 RSTIM: ASH B,1 ; TO CONVERT TO TENEX PAGES
659 HRLZS A ; FORK HANDLE TO LEFT HALF
660 JUMPE C,RSTIM1 ; SEE IF NO WORK TO DO
663 RPACS ; READ PAGE BITS
664 TLNN B,CTEXST ; SKIP IF IT EXISTS
666 HRRZ B,(P) ; GET PAGE
667 HRLI B,MFORK ; GET PAGE BACK TO ME
669 MOVSI C,CTREAD+CTCW+CTEXEC ; PAGE MODES
672 ASH B,9. ; TO START OF PAGE
673 MOVES 20(B) ; TOUCH PAGE
674 RSTIM3: POP P,B ; GET BACK B
676 AOBJN B,RSTIM2 ; GO BACK IN LOOP
677 RSTIM1: POPJ P, ; DONE
680 ; ROUTINE TO MAP OUT PARTS OF THE INTERPRETER IN ORDER TO PRESERVE IT
687 MPIN: PUSH P,C ; SAVE B
689 MOVE A,0 ; GET FORK HANDLE
694 %SAVIN: PUSH P,B ; SAVE AC'S
698 FATAL AGC--CAN'T GET GC FORK
699 MOVEM A,GCFK1 ; SAVE FORK HANDLE
700 POP P,B ; RESTORE AOBJN
701 PUSHJ P,PROTCT ; PROTECT IMAGE
702 MOVE A,[MFORK,,THIBOT]
705 TLNN B,CTWRIT+CTCW ; SKIP IF NOT READ ONLY
706 TLNN B,CTEXST ; SKIP IF EXISTS (OTHERWISE WE'LL CREATE IT)
707 JRST .+3 ; SKIP IF NOT READ ONLY
708 MOVSI B,CTREAD+CTCW+CTEXEC
720 ; CREATE A JOB FOR MARKING HACKS (PURIFY AND GC-DUMP) AND SAVES HANDLE IN TWO SEPERATE
723 %GCJB1: PUSHJ P,%GCJOB ; CREATE FORK
724 MOVE A,GCFRK ; GET HANDLE
728 %CLSMP: MOVE 0,GCFK2 ; GET BACK FROM FORK CONTAINING UPDATED WORLD
730 %CLSM1: MOVE A,GCFK2 ; KILL THE FORK
733 %CLSJB: POPJ P, ; IN ITS CLOSES AN INFERIORS CHANNEL WITHOUT
736 ; HERE TO KILL THE IMAGE SAVING INFERIOR
738 %KILJB: PUSH P,A ; SAVE MAPPING PARAMS
741 JRST IFMP3 ; GO FIX UP CORE IMAGE
743 ; HERE TO MAP IN SAVED WORLD AND KILL INF CONTAINING IT
747 ; HERE TO MAP IN A PAGE IN READ ONLY MODE FROM THE AGD INFERIOR
750 PUSH P,A ; SAVE PAGE POINTER
752 HRLI B,-1 ; MAKE UP PAGE POINTER
753 PUSHJ P,MPIN ; MAP IN THE PAGES
755 HRLI A,MFORK ; SET UP HANDLE
757 ASH A,1 ; CONVERT TO TENEX PATES
767 SUB P,C%11 ; CLEAN OFF STACK
770 %IFMP2: PUSH P,A ; SAVE POINTER
772 PUSHJ P,MPIN ; MAP IT IN
773 MOVE A,GCFK1 ; KILL IT
777 MOVSI A,MFORK ; SET UP FORK HANDLE
778 JUMPGE C,IFMP2 ; IF DONE
779 DORPA: HRR A,C ; GET PAGE #
781 TLNN B,CTEXST ; SKIP IF IT EXISTS
783 MOVSI B,CTREAD+CTWRIT+CTEXEC ; CAPABILATIES
784 SPACS ; SET CAPABILATIES
789 %CLMP1: MOVE A,GCFK1 ; KILL THE FIRST FORK
793 %MPINT: PUSH P,C ; SAVE C
799 MPINT1: MOVSI A,MFORK ; SET UP ARGS TO RMAP
811 ; ROUTINE TO GET BACK THE INTERPRETER. IT MAPS
817 MOVE D,A ; COPY UDDATED AOBJN
818 MOVEI E,0 ; ZERO INDEX TO TABLE
819 GBINT1: MOVE A,RMPTAB(E) ; GET FILE HANDLE
820 MOVSI B,MFORK ; SET UP INTERPRETER ARG
822 MOVSI C,CTREAD+CTEXEC
832 ; HERE TO SAVE RMAP TABLE FOR PURIFY
834 %SAVRP: PUSH P,A ; SAVE AC
835 MOVE A,[RMPTAB,,ORMTAB]
836 BLT A,ENDRPT-1 ; SAVE RMAP TABLE
838 ; POP P,A ; RESTORE A
841 ; HERE TO RESTORE THE RMAP TABLE FOR PURIFY
843 %RSTRP: PUSH P,A ; SAVE A
844 MOVE A,[ORMTAB,,RMPTAB]
847 ; POP P,A ; RESTORE A
850 SQBLK: ASCIZ /PS:<MDL>MDLXXX.SQUOZE/
851 TSQBLK: ASCIZ /DSK:<MDL>MDLXXX.SQUOZE/
853 ; CODE TO DISTINGUISH BETWEEN TOPS20 AND TENEX AT SETUP TIME
855 TWENTY: HRROI A,C ; RESULTS KEPT HERE
857 MOVEI C,0 ; CLEAN C UP
860 MOVEI A,1 ; TENEX HAS OPSYS = 1
861 CAME C,[ASCII/NUL/] ; TOPS20 GIVES "NUL"
862 MOVEM A,OPSYS ; TENEX GIVES "NIL"
865 ;%CLNCO -- FLUSH SOME PAGES FOR SAFETY
866 ; C ==> ADDR OF PAGE PREV TO LOSERS
867 ; E ==> JUST ABOVE LOSERS
875 JRST @[.+1] ; RUN IN SECT 0
898 XJRST .+1 ; BACK TO SECT 1
902 ; MULTI -- ENTER MULTI SEGMENT MODE
903 ; THIS ROUTINE MAPS EVERYTHING UP AND THEN GOES UP THERE
905 MULTI: PUSHJ P,PURCLN ; UNMAP ANY CORRENTLY MAPPED FBINS
906 PUSHJ P,SQKIL ; AND SQUOZE TABLE
908 MOVE A,PURBOT ; MUNG TABLE OF THESE GUYS
915 MOVE A,VECTOP ; CWRITE GC SPACE
921 MOVEI A,0 ; FIRST CREATE OTHER SECTIONS
923 MOVE C,[CTREAD+CTWRIT+CTEXEC,,1]
934 ; NOW LOOP AROUND MAPPING PAGES (MAY TAKE SOME TIME)
939 LSH PVP,9. ; PVP NOW HIGHEST PAGE TO MAP
940 MOVSI E,-1000 ; 1ST PAGE AND COUNTER
952 MOVSI C,CTREAD+CTWRIT+CTEXEC
961 ; SETUP MULTI SEG LUUO HANDLER
964 MOVEI B,2 ; CODE FOR SETUP OF UUO TABLE
965 MOVE C,[FSEG,,MLTUUP]
974 HRLI C,FSEG ; MAKE INTO FUNNY ADDRESS
976 TLO TB,400000 ; MAKE TB BE A LOCAL INDEX
979 NOMULT: PUSHJ P,PURCLN
980 JRST @[.+1] ; RUN IN SECTION 0
999 MFUNCTION MMS,SUBR,MULTI-SECTION
1005 JUMPGE AB,RMULT ; NO ARGS==>LEAVE
1006 CAMGE AB,C%M30 ; [-3,,]
1027 POP P,B ; POSSIBLE PREV NSEGS
1037 DEMFLG: 0 ; FLAG INDICATING DEMON
1038 ; (IF DEMON SIXBIT OF DIRECTORY)
1039 SFRK: -1 ; FLAG FOR EXTRA INFERIOR HACK
1047 MESSAG: PUSHJ P,MESOUT ; MESSAGE SWITCH
1049 INITFL: PUSHJ P,MUDINT ; MUDDLE INIT SWITCH