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
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 GETSQU: HRRZ 0,SQUPNT
107 CTIME: SKIPE OPSYS ; skip if TOPS20
112 JOBTM ; get run time in milli secs
117 FDVRI B,(1000.0) ; Change to units of seconds
123 %RSNAM: PUSHJ P,TMTNXS ; GET STRING ON STACK (POINTER IN E)
124 GJINF ; USER NUMBER IS IN A
125 PUSHJ P,INFSTR ; MAKE INFO STRING
129 ; KILL THE CURRENT JOB
140 RSCAN ; MAKE IT AVAILABLE FOR USE
144 ; LOGOUT OF SYSTEM (MUST BE "TOP LEVEL")
149 ; GO TO SLEEP A WHILE
151 %SLEEP: IMULI A,33. ; TO MILLI SECS
162 %RJNAM: GETNM ; RETURNS SIXBIT IN A
169 %RUNAM: PUSHJ P,TMTNXS ; GET STRING ON STACK (POINTER IN E)
170 GJINF ; USER NUMBER IS IN A
171 MOVE B,A ; USER NUMBER TO B
172 PUSHJ P,INFST1 ; MAKE INFO STRING
173 CPOPJ1: AOS (P) ; SKIP RETURN
176 ; MAKE A STRING FROM DIRST GOODIES
178 INFST1: MOVEI 0,1 ; FLAG WHETHER TO SCAN
179 HRROI A,1(E) ; STRING POINTER IN A
181 FATAL ATTACHED DIRECTORY DOESN'TEXIST
182 MOVEI B,1(E) ; A AND B BOUND STRING
183 JUMPN 0,INFST2 ; NO NEED TO SCAN
190 ILDB 0,B ; FLUSH : AND <>
206 INFST2: SUBM P,E ; RELATIVIZE E
207 PUSHJ P,TNXSTR ; BUILD STRING (IN A AND B)
208 MOVE C,(P) ; GET RETURN PC FROM PUSHJ
209 SUB P,E ; P BACK TO NORMAL
212 ; HERE TO SEE IF WE ARE A TOP LEVEL JOB
218 ; ERRORS IN COMPILED CODE MAY END UP HERE
220 CERR1: ERRUUO EQUOTE NEGATIVE-ARGUMENT
222 CERR2: ERRUUO EQUOTE NTH-REST-PUT-OUT-OF-RANGE
224 CERR3: ERRUUO EQUOTE UVECTOR-PUT-TYPE-VIOLATION
227 ERRUUO EQUOTE ERROR-IN-COMPILED-CODE
230 ; GET AN INFERIOR FOR THE GARBAGE COLLECTOR
233 MOVEI A,CR%CAP ; GET BITS FOR FORK
234 CFORK ; MAKE AN IFERIOR FORK
235 FATAL CANT GET GC FORK
236 MOVEM A,GCFRK ; SAVE HANDLE
237 POP P,A ; RESTORE PAGE
242 ; HERE TO SHARE WINDOW
254 ASH B,1 ; TO CRETINOUT TENEX PAGE SIZE
258 MOVSI C,CTREAD+CTWRIT ; READ AND WRITE ACCESS
264 ASH B,9. ; POINT TO PAGE
265 MOVES (B) ; CLOBBER TOP
266 MOVES -1(B) ; AND UNDER
273 ; HERE TO MAP INFERIOR BACK AND KILL SAME
280 MOVE D,A ; POINT TO PAGES
281 MOVE E,B ; FOR COPYING
282 PUSH P,A ; SAVE FOR TOUCHING
284 ; HERE FOR OPTIONAL MULTI FORK HACK
286 SKIPLE A,SFRK ; SKIP NOT ENABLED OR NOT ACTIVE
287 KFORK ; FLUSH THE OLD EXTRA
290 SKIPE SFRK ; SKIP IF NOT MULTI FORK
291 HLRZM A,SFRK ; SAVE THIS AS IT
293 MOVSI C,CTREAD+CTEXEC+CTCW ; READ AND WRITE COPY
295 MOVSI C,CTREAD+CTEXEC+CTWRIT
303 ; HERE TO TOUCH PAGES TO INSURE KEEPING THEM (KLUDGE)
305 POP P,E ; RESTORE MY FIRST PAGE #
306 SKIPE SFRK ; SKIP IF NOT MULTI CASE
308 MOVEI A,(E) ; COPY FOR LOOP
309 ASH A,9. ; TO WORD ADDR
311 AOBJN E,.-3 ; FOR ALL PAGES
320 ; HACK TO PRINT MESSAGE OF INTEREST TO USER
322 MESOUT: MOVSI A,(JFCL)
323 MOVEM A,MESSAG ; DO ONLY ONCE
326 SETOM SFRK ; NO FORK TO HACK RIGGHT NOW
327 PUSHJ P,GETJS ; GET SOME JFNS
333 SETZB SP,FRM ; HACK TO AVOID LOSSAGE WITH GARBAGE IN SP
336 MOVE A,[MFORK,,THIBOT]
337 MOVSI B,CTREAD+CTEXEC
342 PUSHJ P,PGINT ; INITIALIZE PAGE MAP
344 AOJN D,.+3 ; JUMP IF HAS TTY
349 MOVEI A,MFORK ; GET FORK HANDLE
351 MOVE C,B ; HAIR TO ENABLE CAPABILITIES OF DEMON
354 SKIPN DEMFLG ; SKIP IF DEMON
355 SKIPE NOTTY ; HAVE A TTY?
356 JRST RESNM ; NO, SKIP THIS STUFF
362 MOVE B,[OP%7B,,FREAD]
380 RESNM: PUSHJ P,TWENTY
383 POP P,C ; STAY IN MAIN SEG
388 ; GET JFNS TO MDL INTERPRETER, AGC AND SGC, SAVE IN IJFNS AND IJFNS1
389 GETJS: MOVEI A,$TLOSE
391 HRLI A,MFORK ; THIS FORK
393 JUMPGE A,GETJS1 ; HAPPY?
394 ; HERE TO GET MDL INTERPRETER JFN EXPLICITLY RATHER THAN THROUGH RMAP
398 MOVSI A,GJ%SHT+GJ%OLD
400 FATAL INTERPRETER EXE FILE MISSING
401 MOVE B,[OP%36B,,FREAD+FWRITE]
403 FATAL CANT OPEN MDL INTERPRETER EXE FILE
405 GETJS1: HLRZM A,IJFNS ; SAVE JFN TO INTERPRETER
408 ; GTJFN BLOCK FOR MESSAGE FILE
419 MUDINT: MOVSI 0,(JFCL) ; CLOBBER MUDDLE INIT SWITCH
422 ; LOOP TO TOUCH ALL PAGES SO PURIFY CAN WORK
424 SKIPN A,DEMFLG ; SKIP IF A DEMON
425 JRST FINDIR ; GET USERS DIRECTORY
427 MOVE A,DEMFLG ; GET SIXBIT OF DIRECTORY NAME
428 PUSHJ P,6TOCHS ; TO CHARACACTER STRING
431 FINDIR: GJINF ; GET INFO NEEDED
433 PUSHJ P,TMTNXS ; MAKE A TEMP STRING FOR TENEX INFO
434 ; (POINTER LEFT IN E)
436 DIRCON: PUSH TP,$TATOM
443 MOVE A,[SIXBIT/MUDDLE/]
444 PUSHJ P,6TOCHS ; MAKE A CHARACTER STRING
449 PUSH TP,$TCHSTR ; NOW THE .INIT
450 PUSH TP,CHQUOTE .INIT
451 MCALL 2,STRING ; MAKE A STRING
452 PUSH TP,A ; ARGS TO FOPEN
458 SUBSYS: PUSH TP,$TCHSTR
460 MOVE A,[SIXBIT /MUDDLE/]
471 PUSH TP,CHQUOTE MUDDLE
476 ISVCHN: PUSH TP,$TCHAN
478 MOVEI B,INITSTR ; TELL USER WHAT'S HAPPENING
481 SKIPE DEMFLG ; SKIP IF NOT A DEMON
488 TMTNXS: POP P,D ; SAVE RET ADDR
489 MOVE E,P ; BUILD A STRING SPACE ON PSTACK
490 MOVEI 0,20. ; USE 20 WORDS (=100 CHARS)
500 SUBI B,(A) ; WORDS TO B
502 LDB 0,[360600,,A] ; GET BYTE POSITION
503 IDIVI 0,7 ; TO A REAL BYTE POSITION
506 SUBM 0,B ; FINAL LENGTH IN BYTES TO B
508 MOVEI A,4(B) ; TO WORDS
511 PUSHJ P,IBLOCK ; GET STRING
516 MOVE D,B ; COPY POINTER
517 MOVE 0,(C) ; GET A WORD
523 HRLI B,00700 ; MAKE INTO BYTER
526 INITSTR: ASCIZ /MUDDLE INIT/
528 ; HERE TO RECOPY PAGE 0 WHICH CONTAINS IMFORMATION FOR REMAPPING IN INFERIOR
529 %OPGFX: PUSH P,B ; SAVE B
531 MOVEI B,STOSTR ; TOP OF CONSTANTS
534 ASH B,-10. ; TO PAGES
536 MOVEI B,WNDP ; GET WINDOW
537 HRLZS A ; START WITH PAGE 0
538 OPGFX2: JUMPGE A,OPGFX1
543 ASH A,10. ; TO START OF PAGE
544 HRLS A ; SET UP BLT POINTER
547 BLT A,1777(B) ; OUT INTO THE BUFFER
554 ; ROUTINE TO PROTECT A CORE IMAGE BY SAVING IT IN AN INFERIOR
555 ; A==FORK HANDLE B== AOBJN POINTER
558 PROTCT: TRNN B,-1 ; SEE IF PAGE 0 IS INCLUDED
559 ADD B,C%11 ; INC PAGE
562 MOVE C,B ; COPY AOBJN
563 MOVSI A,MFORK ; FORK HANDLE
564 JUMPE C,PRTDON ; IF ZERO THEN WE ARE DONE
565 PROTC1: HRRI A,(C) ; GET PAGE
569 TLNN B,CTWRIT+CTCW ; SKIP IF NOT READ ONLY
570 TLNN B,CTEXST ; SKIP IF EXISTS (OTHERWISE WE'LL CREATE IT)
571 MOVES 20(D) ; TOUCH PAGE
572 MOVSI B,CTREAD+CTEXEC ; SET UP TO MARK PAGES TO TRAP ON ANY REF
573 SPACS ; CHANGE MODE OF PAGE
575 PRTDON: POP P,C ; RESTORE C
578 %FDBUF: HRRZ A,PURBOT
579 SUB A,P.TOP ; CALCULATE ROOM FOR PROSPECTIVE BUFFER
580 CAIG A,2000 ; SEE IF ROOM
582 MOVE A,P.TOP ; START OF BUFFER
585 FDBUF1: SETOM BUFGC ; INDICATE NO BUFFER FOUND
588 ; HERE TO SIMULATE A COPY ON WRITE TO AN INFERIOR. IF A PAGE HAS NO WRITE BITS
589 ; IT WILL COPY IT INTO THE GCFRK1 FORK. A== START OF PAGE, B== START OF BUFFER PAGE
594 ANDI A,-1 ; CLEAN OUT LEFT HALF OF A
597 HRLI A,MFORK ; GET FORK HANDLE
598 RPACS ; READ PAGE BITS
600 TLNE B,CTEXST ; SKIP IF DOESN'T EXIST
601 TLNE B,CTWRIT ; SEE IF WRITABLE
602 JRST CWINFX ; NO, EXIT
603 MOVSI B,CTEXEC+CTREAD+CTCW
604 SPACS ; RESTORE PAGE TO NORMAL
606 RPACS ; READ PAGE BITS
607 TLNE B,CTEXST ; SKIP IF DOESN'T EXIST
608 TLNE B,CTWRIT ; SEE IF WRITABLE
609 JRST CWINFY ; NO, EXIT
610 MOVSI B,CTEXEC+CTREAD+CTCW
615 TLNE B,CTEXST ; SKIP IF DOESN'T EXIST
616 TLNE B,CTWRIT ; SEE IF WRITABLE
617 JRST CWINF1 ; NO, EXIT
618 CWINFZ: HRRZI A,-1(A)
620 MOVE B,-1(P) ; SET UP BUFFER PAGE
621 ASH B,-10. ; TO PAGE NUMBER
622 PUSHJ P,%SHWNF ; SHARE A WINDOW
623 HRLZ A,-2(P) ; PREPARE FOR BLT
626 BLT A,1777(B) ; SAVE THE PAGE
630 HRLI B,MFORK ; SET UP HANDLE
640 ; ROUTINE TO RESTORE THE IMAGE FROM A SAVED FORK IMAGE.
641 ; A== FORK HANDLE B== AOBJN POINTER TO MUDDLE
645 RSTIM: ASH B,1 ; TO CONVERT TO TENEX PAGES
647 HRLZS A ; FORK HANDLE TO LEFT HALF
648 JUMPE C,RSTIM1 ; SEE IF NO WORK TO DO
651 RPACS ; READ PAGE BITS
652 TLNN B,CTEXST ; SKIP IF IT EXISTS
654 HRRZ B,(P) ; GET PAGE
655 HRLI B,MFORK ; GET PAGE BACK TO ME
657 MOVSI C,CTREAD+CTCW+CTEXEC ; PAGE MODES
660 ASH B,9. ; TO START OF PAGE
661 MOVES 20(B) ; TOUCH PAGE
662 RSTIM3: POP P,B ; GET BACK B
664 AOBJN B,RSTIM2 ; GO BACK IN LOOP
665 RSTIM1: POPJ P, ; DONE
668 ; ROUTINE TO MAP OUT PARTS OF THE INTERPRETER IN ORDER TO PRESERVE IT
675 MPIN: PUSH P,C ; SAVE B
677 MOVE A,0 ; GET FORK HANDLE
682 %SAVIN: PUSH P,B ; SAVE AC'S
686 FATAL AGC--CAN'T GET GC FORK
687 MOVEM A,GCFK1 ; SAVE FORK HANDLE
688 POP P,B ; RESTORE AOBJN
689 PUSHJ P,PROTCT ; PROTECT IMAGE
698 ; CREATE A JOB FOR MARKING HACKS (PURIFY AND GC-DUMP) AND SAVES HANDLE IN TWO SEPERATE
701 %GCJB1: PUSHJ P,%GCJOB ; CREATE FORK
702 MOVE A,GCFRK ; GET HANDLE
706 %CLSMP: MOVE 0,GCFK2 ; GET BACK FROM FORK CONTAINING UPDATED WORLD
708 %CLSM1: MOVE A,GCFK2 ; KILL THE FORK
711 %CLSJB: POPJ P, ; IN ITS CLOSES AN INFERIORS CHANNEL WITHOUT
714 ; HERE TO KILL THE IMAGE SAVING INFERIOR
716 %KILJB: PUSH P,A ; SAVE MAPPING PARAMS
719 JRST IFMP3 ; GO FIX UP CORE IMAGE
721 ; HERE TO MAP IN SAVED WORLD AND KILL INF CONTAINING IT
725 ; HERE TO MAP IN A PAGE IN READ ONLY MODE FROM THE AGD INFERIOR
728 PUSH P,A ; SAVE PAGE POINTER
730 HRLI B,-1 ; MAKE UP PAGE POINTER
731 PUSHJ P,MPIN ; MAP IN THE PAGES
733 HRLI A,MFORK ; SET UP HANDLE
735 ASH A,1 ; CONVERT TO TENEX PATES
745 SUB P,C%11 ; CLEAN OFF STACK
748 %IFMP2: PUSH P,A ; SAVE POINTER
750 PUSHJ P,MPIN ; MAP IT IN
751 MOVE A,GCFK1 ; KILL IT
755 MOVSI A,MFORK ; SET UP FORK HANDLE
756 JUMPGE C,IFMP2 ; IF DONE
757 DORPA: HRR A,C ; GET PAGE #
759 TLNN B,CTEXST ; SKIP IF IT EXISTS
761 MOVSI B,CTREAD+CTWRIT+CTEXEC ; CAPABILATIES
762 SPACS ; SET CAPABILATIES
767 %CLMP1: MOVE A,GCFK1 ; KILL THE FIRST FORK
771 %MPINT: PUSH P,C ; SAVE C
777 MPINT1: MOVSI A,MFORK ; SET UP ARGS TO RMAP
789 ; ROUTINE TO GET BACK THE INTERPRETER. IT MAPS
795 MOVE D,A ; COPY UDDATED AOBJN
796 MOVEI E,0 ; ZERO INDEX TO TABLE
797 GBINT1: MOVE A,RMPTAB(E) ; GET FILE HANDLE
798 MOVSI B,MFORK ; SET UP INTERPRETER ARG
800 MOVSI C,CTREAD+CTEXEC+CTCW
810 ; HERE TO SAVE RMAP TABLE FOR PURIFY
812 %SAVRP: PUSH P,A ; SAVE AC
813 MOVE A,[RMPTAB,,ORMTAB]
814 BLT A,ENDRPT-1 ; SAVE RMAP TABLE
816 ; POP P,A ; RESTORE A
819 ; HERE TO RESTORE THE RMAP TABLE FOR PURIFY
821 %RSTRP: PUSH P,A ; SAVE A
822 MOVE A,[ORMTAB,,RMPTAB]
825 ; POP P,A ; RESTORE A
828 SQBLK: ASCIZ /PS:<MDL>MDLXXX.SQUOZE/
829 TSQBLK: ASCIZ /DSK:<MDL>MDLXXX.SQUOZE/
831 ; CODE TO DISTINGUISH BETWEEN TOPS20 AND TENEX AT SETUP TIME
833 TWENTY: HRROI A,C ; RESULTS KEPT HERE
835 MOVEI C,0 ; CLEAN C UP
838 MOVEI A,1 ; TENEX HAS OPSYS = 1
839 CAME C,[ASCII/NUL/] ; TOPS20 GIVES "NUL"
840 MOVEM A,OPSYS ; TENEX GIVES "NIL"
843 ;%CLNCO -- FLUSH SOME PAGES FOR SAFETY
844 ; C ==> ADDR OF PAGE PREV TO LOSERS
845 ; E ==> JUST ABOVE LOSERS
874 ; MULTI -- ENTER MULTI SEGMENT MODE
875 ; THIS ROUTINE MAPS EVERYTHING UP AND THEN GOES UP THERE
877 MULTI: PUSHJ P,PURCLN ; UNMAP ANY CORRENTLY MAPPED FBINS
878 PUSHJ P,SQKIL ; AND SQUOZE TABLE
880 MOVE A,PURBOT ; MUNG TABLE OF THESE GUYS
887 MOVE A,VECTOP ; CWRITE GC SPACE
893 MOVEI A,0 ; FIRST CREATE OTHER SECTIONS
895 MOVE C,[CTREAD+CTWRIT+CTEXEC,,1]
906 ; NOW LOOP AROUND MAPPING PAGES (MAY TAKE SOME TIME)
911 LSH PVP,9. ; PVP NOW HIGHEST PAGE TO MAP
912 MOVSI E,-1000 ; 1ST PAGE AND COUNTER
924 MOVSI C,CTREAD+CTWRIT+CTEXEC
933 ; SETUP MULTI SEG LUUO HANDLER
936 MOVEI B,2 ; CODE FOR SETUP OF UUO TABLE
937 MOVE C,[FSEG,,MLTUUP]
946 HRLI C,FSEG ; MAKE INTO FUNNY ADDRESS
948 TLO TB,400000 ; MAKE TB BE A LOCAL INDEX
951 NOMULT: PUSHJ P,PURCLN
952 JRST @[.+1] ; RUN IN SECTION 0
971 MFUNCTION MMS,SUBR,MULTI-SECTION
977 JUMPGE AB,RMULT ; NO ARGS==>LEAVE
978 CAMGE AB,C%M30 ; [-3,,]
999 POP P,B ; POSSIBLE PREV NSEGS
1009 DEMFLG: 0 ; FLAG INDICATING DEMON
1010 ; (IF DEMON SIXBIT OF DIRECTORY)
1011 SFRK: -1 ; FLAG FOR EXTRA INFERIOR HACK
1019 MESSAG: PUSHJ P,MESOUT ; MESSAGE SWITCH
1021 INITFL: PUSHJ P,MUDINT ; MUDDLE INIT SWITCH