--- /dev/null
+TITLE INITIALIZATION FOR MUDDLE
+
+RELOCATABLE
+
+HTVLNT==3000 ; GUESS OF TVP LENGTH
+
+LAST==1 ;POSSIBLE CHECKS DONE LATER
+
+.INSRT MUDDLE >
+
+SYSQ
+XBLT==123000,,
+GCHN==0
+IFE ITS,[
+FATINS==.FATAL"
+SEVEC==104000,,204
+.INSRT STENEX >
+]
+
+IMPURE
+
+OBSIZE==151. ;DEFAULT OBLIST SIZE
+
+.LIFG <TVBASE+TVLNT-TVLOC>
+.LOP .VALUE
+.ELDC
+
+.GLOBAL SHRRM,SHRLM,SMOVEM,SSETZM,SXBLT,SHLRZ
+.GLOBAL SETUP,TPBAS,GCPDL,GCPVP,PVBASE,PVLNT,PARNEW,AAGC,ICR,SWAP,OBLNT,MSGTYP,POPUNW
+.GLOBAL ICLOS,OCLOS,GLOBASE,GLOBSP,PARBOT,PARTOP,CODTOP,START,BEGIN,VECBOT,VECTOP,TPBASE
+.GLOBAL LISTEN,ROOT,INITIAL,TBINIT,TOPLEV,INTOBL,ERROBL,MUDOBL,TTYOPE,RESFUN,QUITTER
+.GLOBAL IOINS,BUFRIN,IOIN2,ECHO,MTYI,MTYO,IMTYO,MUDSTR,P.TOP,TTICHN,TTOCHN,TYPVEC,SQDIR
+.GLOBAL PDLBUF,PHIBOT,%UNAM,PURVEC,STOSTR,ISTOST,TD.LNT,TD.PUT,TD.GET,CAFRE1
+.GLOBAL FRETOP,LPUR,SQBLK,REALGC,INTDIR,AGCLD,PAGEGC,TD.AGC,TVSTRT,REALTV,PVSTOR
+.GLOBAL GCSTOP,SPSTOR,DSTORE,SQBYTE,INBYTE,GCBYTE,FRSTCH,OPSYS,IJFNS,GETJS
+.GLOBAL HASHTB,ILOOKC
+
+LPUR==.LPUR ; SET UP SO LPUR WORKS
+
+; INIITAL AMOUNT OF AFREE SPACE
+
+STOSTR:
+LOC TVSTRT-1
+ISTOST: TVSTRT-STOSTR,,0
+
+ BLOCK HTVLNT ; TVP
+
+SETUP: MOVEI 0,0 ; ZERO ACS
+ MOVEI 17,1
+ BLT 17,17
+
+IFN ITS, .SUSET [.RUNAM,,%UNAM] ; FOR AGC'S BENFIT
+ MOVE P,GCPDL ;GET A PUSH DOWN STACK
+IFN ITS, .SUSET [.SMASK,,[200000]] ; ENABLE PDL OVFL
+ MOVE 0,[TVBASE,,TVSTRT]
+ BLT 0,TVSTRT+HTVLNT-3 ; BLT OVER TVP
+IFE ITS, PUSHJ P,TWENTY ; FIND OUT WHETHER IT IS TOPS20 OR NOT
+ PUSHJ P,TTYOPE ;OPEN THE TTY
+ AOS A,20 ; TOP OF LOW SEGG
+ HRRZM A,P.TOP
+ SOSN A ; IF NOTHING YET
+IFN ITS, .SUSET [.RMEMT,,P.TOP]
+IFE ITS, JRST 4,
+ MOVE A,P.TOP
+ SUB A,FRETOP ; SETUP FOR GETTING NEEDED CORE
+ SUBI A,3777
+ ASH A,-10. ; TO PAGES
+ HRLS A ; SET UP AOBJN
+ HRRZ 0,P.TOP
+ ASH 0,-10.
+ SUBI 0,1
+ HRR A,0
+IFN ITS,[
+ .CALL HIGET ; GET THEM
+ FATAL INITM--CORE NOT AVAILABLE FOR INITIALIZATION
+ ASH A,10. ; TO WORDS
+ MOVEM A,P.TOP
+ SUBI A,2000 ; WHERE FRETOP IS
+ MOVEM A,FRETOP
+
+]
+IFE ITS,[
+ MOVE A,FRETOP
+ ADDI A,2000
+ MOVEM A,P.TOP
+]
+ HRRE A,P.TOP ; CHECK TOP
+ TRNE A,377777 ; SKIP IF ALL LOW SEG
+ JUMPL A,PAGLOS ; COMPLAIN
+ MOVE A,HITOP ; FIND HI SEG TOP
+ ADDI A,1777
+ ANDCMI A,1777
+ MOVEM A,RHITOP ; SAVE IT
+ MOVEI A,200
+ SUBI A,PHIBOT
+ JUMPE A,HIBOK
+ MOVSI A,(A)
+ HRRI A,200
+IFN ITS,[
+ .CALL GIVCOR
+ .VALUE
+]
+HIBOK: MOVEI B,[ASCIZ /MUDDLE INITIALIZATION.
+/]
+ PUSHJ P,MSGTYP ;PRINT IT
+ MOVE A,CODTOP ;CHECK FOR A WINNING LOAD
+ CAML A,VECBOT ;IT BETTER BE LESS
+ JRST DEATH1 ;LOSE COMPLETELY
+SETTV: MOVE PVP,[-PVLNT*2,,GCPVP] ;AND A PROCESS VECTOR
+ MOVEM PVP,PVSTOR+1
+ MOVEM PVP,PVSTOR+1-TVSTRT+TVBASE
+ MOVEI A,(PVP) ;SET UP A BLT
+ HRLI A,PVBASE ;FROM PROTOTYPE
+ BLT A,PVLNT*2-1(PVP) ;INITIALIZE
+ MOVE TP,[-ITPLNT,,TPBAS] ;GET A STACK FOR THIS PROCCESS
+ MOVEI TB,(TP) ;AND A BASE
+IFN ITS, HRLI TB,1
+IFE ITS, HRLI TB,400001 ; FOR MULTI SEG HACKING
+ SUB TP,[1,,1] ;POP ONCE
+
+; FIRST BUILD MOBY HASH TABLE
+
+ MOVEI A,1023. ; TRY THIS OUT FOR SIZE
+ PUSHJ P,IBLOCK
+ MOVEM B,HASHTB+1-TVSTRT+TVBASE ; STORE IN TVP POINTER
+ HLRE A,B
+ SUB B,A
+ MOVEI A,TATOM+.VECT.
+ HRLM A,(B)
+
+; ALLOCATE SOME OBLISTS FOR INITIAL ATOMS
+
+ PUSH P,[5] ;COUNT INITIAL OBLISTS
+
+ PUSH P,OBLNT ;SAVE CURRENT OBLIST DEFAULT SIZE
+
+MAKEOB: SOS A,-1(P)
+ MOVE A,OBSZ(A)
+ MOVEM A,OBLNT
+ MCALL 0,MOBLIST ;GOBBLE AN OBLIST
+ PUSH TP,$TOBLS ;AND SAVE THEM
+ PUSH TP,B
+ MOVE A,(P)-1 ;COUNT DOWN
+ MOVEM B,@OBTBL(A) ;STORE
+ JUMPN A,MAKEOB
+
+ POP P,OBLNT ;RESTORE DEFAULT OBLIST SIZE
+
+ MOVE C,[-TVLNT+2,,TVBASE]
+ MOVE D,[-HTVLNT+2,,TVSTRT]
+
+;MAIN INITIALIZE LOOP - SCAN XFER VECTOR FOR ATOMS, UPDATE
+;OFFSETS IN CODE, UNIQUIFY ATOMS AND COMPACT XFER VECTOR
+
+ILOOP: HLRZ A,(C) ;FIRST TYPE
+ JUMPE A,TVEXAU ;USEFUL STUFF EXHAUSTED
+ CAIN A,TCHSTR ;CHARACTER STRING?
+ JRST CHACK ;YES, GO HACK IT
+ CAIN A,TATOM ;ATOM?
+ JRST ATOMHK ;YES, CHECK IT OUT
+ MOVE A,(C) ;MOVE TO NEW HOME (MAY BE SAME)
+ MOVEM A,(D)
+ MOVE A,1(C)
+ MOVEM A,1(D)
+SETLP: AOS (P) ;COUNT NUMBER OF PAIRS IN XFER VECTOR
+ ADD D,[2,,2] ;OUT COUNTER
+SETLP1: ADD C,[2,,2] ;AND IN COUNTER
+ JUMPL C,ILOOP ;JUMP IF MORE TO DO
+\f
+;NEW XFER VECTOR FINISHED, NOW GIVE AWAY THE REST
+
+TVEXAU: HLRE B,D ; LEFT HALF OF AOBJN
+ MOVNI TVP,HTVLNT-2 ; CALCULATE LENGTH OF TVP
+ SUB TVP,B ; GET -LENGTH OF TVP IN TVP
+ HRLS TVP
+ HRRI TVP,TVSTRT ; BUILD A TASTEFUL TVP POINTER
+ MOVNI C,TVLNT-HTVLNT+2(B) ; SMASH IN LENGTH INTO END DOPE WORDS
+ HRLM C,TVSTRT+HTVLNT-1
+ MOVSI E,400000
+ MOVEM E,TVSTRT+HTVLNT-2
+ HLRE C,TVP
+ MOVNI C,-2(C) ; CLOBBER LENGTH INTO REAL TVP
+ HLRE B,TVP
+ SUBM TVP,B
+ MOVEM E,(B)
+ HRLM C,1(B) ; PUT IN LENGTH
+ MOVE PVP,PVSTOR+1
+ MOVEM TVP,REALTV+1(PVP)
+
+
+; FIX UP TYPE VECTOR
+
+ MOVE A,TYPVEC+1 ;GET POINTER
+ MOVEI 0,0 ;FOR POSSIBLE NULL SLOTS
+ MOVSI B,TATOM ;SET TYPE TO ATOM
+ MOVEI D,400000 ; TYPE CODE HACKS
+
+TYPLP: HLLM B,(A) ;CHANGE TYPE TO ATOM
+ MOVE C,@1(A) ;GET ATOM
+ HLRE E,C ; FIND DOPE WORD
+ SUBM C,E
+ HRRM D,(E) ; STUFF INTO ATOM
+ MOVEM C,1(A)
+ ADDI D,1
+ ADD A,[2,,2] ;BUMP
+ JUMPL A,TYPLP
+
+\f; CLOSE TTY CHANNELS
+IFN ITS,[
+
+ .CLOSE 1,
+ .CLOSE 2,
+]
+
+;GENERAT THE LOGICAL TTY IN AND OUT CHANNELS
+
+;SETUP CALL TO OPEN OUTPUT TTY CHANNNEL
+
+ IRP A,,[[PRINT,TCHSTR],[TTY:,TCHSTR]]
+ IRP B,C,[A]
+ PUSH TP,$!C
+ PUSH TP,CHQUOTE B
+ .ISTOP
+ TERMIN
+ TERMIN
+
+ MCALL 2,FOPEN ;OPEN THE OUT PUT CHANNEL
+ MOVEM B,TTOCHN+1 ;SAVE IT
+
+;ASSIGN AS GLOBAL VALUE
+
+ PUSH TP,$TATOM
+ PUSH TP,IMQUOTE OUTCHAN
+ PUSH TP,A
+ PUSH TP,B
+ MOVE A,[PUSHJ P,MTYO] ;MORE WINNING INS
+ MOVEM A,IOINS(B) ;CLOBBER
+ MCALL 2,SETG
+
+;SETUP A CALL TO OPEN THE TTY CHANNEL
+
+ IRP A,,[[READ,TCHSTR],[TTY:,TCHSTR]]
+ IRP B,C,[A]
+ PUSH TP,$!C
+ PUSH TP,CHQUOTE B
+ .ISTOP
+ TERMIN
+ TERMIN
+
+ MCALL 2,FOPEN ;OPEN INPUTCHANNEL
+ MOVEM B,TTICHN+1 ;SAVE IT
+ PUSH TP,$TATOM ;ASSIGN AS A GLOBAL VALUE
+ PUSH TP,IMQUOTE INCHAN
+ PUSH TP,A
+ PUSH TP,B
+ MOVE C,BUFRIN(B) ;GET AUX BUFFER PTR
+ MOVE A,[PUSHJ P,MTYI]
+ MOVEM A,IOIN2(C) ;MORE OF A WINNER
+ MOVE A,[PUSHJ P,IMTYO]
+ MOVEM A,ECHO(C) ;ECHO INS
+ MCALL 2,SETG
+ MOVEI A,3 ;FIRST CHANNEL AFTER INIT HAPPENS
+ MOVEM A,FRSTCH
+
+;GENERATE AN INITIAL PROCESS AND SWAP IT IN
+
+ MOVEI A,TPLNT ;STACK PARAMETERS
+ MOVEI B,PLNT
+ PUSHJ P,ICR ;CREATE IT
+ MOVE PVP,PVSTOR+1
+ MOVE 0,SPSTO+1(B)
+ MOVEM 0,SPSTOR+1
+ MOVE 0,REALTV+1(PVP)
+ MOVEM 0,REALTV+1(B) ; STUFF IN TRANSFER VECTOR POINTER
+ MOVEI 0,RUNING
+ MOVEM 0,PSTAT"+1(B)
+ MOVE D,B ;SET UP TO CALL SWAP
+ JSP C,SWAP ;AND SWAP IN
+ MOVEM PVP,MAINPR" ;SAVE AS THE MAIN PROCESS
+ PUSH TP,[TENTRY,,TOPLEV] ;BUILD DUMMY FRAME
+ PUSH TP,[1,,0]
+ MOVEI A,-1(TP)
+ PUSH TP,A
+ PUSH TP,SPSTOR+1
+ PUSH TP,P
+ MOVE C,TP ;COPY TP
+ ADD C,[3,,3] ;FUDGE
+ PUSH TP,C ;TPSAV PUSHED
+ PUSH TP,[TOPLEV]
+ HRRI TB,(TP) ;SETUP TB
+IFN ITS, HRLI TB,2
+IFE ITS, HRLI TB,400002
+ ADD TB,[1,,1]
+ MOVE PVP,PVSTOR+1
+ MOVEM TB,TBINIT+1(PVP)
+ MOVSI A,TSUBR
+ MOVEM A,RESFUN(PVP)
+ MOVEI A,LISTEN"
+ MOVEM A,RESFUN+1(PVP)
+ PUSH TP,$TATOM
+ PUSH TP,IMQUOTE THIS-PROCESS
+ PUSH TP,$TPVP
+ PUSH TP,PVP
+ MCALL 2,SETG
+
+; FIND TVP OFFSET FOR THE ATOM 'T' FOR TEMPLATE
+
+ MOVEI A,IMQUOTE T
+ SUBI A,
+TVTOFF==0
+ ADDSQU TVTOFF
+
+ MOVEM A,SQULOC-1
+
+ PUSH TP,$TATOM
+ PUSH TP,IMQUOTE TVTOFF,,MUDDLE
+ PUSH TP,$TFIX
+ PUSH TP,A
+ MCALL 2,SETG
+
+; HERE TO SETUP SQUOZE TABLE IN PURE CORE
+
+ PUSHJ P,SQSETU ; GO TO ROUTINE
+
+ PUSHJ P,DUMPGC
+ MOVEI A,400000 ; FENCE POST PURE SR VECTOR
+ HRRM A,PURVEC
+ MOVE A,TP
+ HLRE B,A
+ SUBI A,-PDLBUF(B) ;POINT TO DOPE WORDS
+ MOVEI B,12 ;GROWTH SPEC
+ IORM B,(A)
+ MOVE PVP,PVSTOR+1
+ MOVE 0,REALTV+1(PVP)
+ HLRE E,0
+ SUBI 0,-1(E)
+ HRRZM 0,CODTOP
+IFE ITS, PUSHJ P,GETJS
+ PUSHJ P,AAGC ;DO IT
+ AOJL A,.-1
+ MOVE PVP,PVSTOR+1
+ MOVE A,TPBASE+1(PVP)
+ SUB A,[640.,,640.]
+ MOVEM A,TPBASE+1(PVP)
+
+; CREATE LIST OF ROOT AND NEW OBLIST
+
+ MOVEI A,5
+ PUSH P,A
+
+NAMOBL: PUSH TP,$TATOM
+ PUSH TP,@OBNAM-1(A) ; NAME
+ PUSH TP,$TATOM
+ PUSH TP,IMQUOTE OBLIST
+ PUSH TP,$TOBLS
+ PUSH TP,@OBTBL1-1(A)
+ MCALL 3,PUT ; NAME IT
+ SOS A,(P)
+ PUSH TP,$TOBLS
+ PUSH TP,@OBTBL1(A)
+ PUSH TP,$TATOM
+ PUSH TP,IMQUOTE OBLIST
+ PUSH TP,$TATOM
+ PUSH TP,@OBNAM(A)
+ MCALL 3,PUT
+ SKIPE A,(P)
+ JRST NAMOBL
+ SUB P,[1,,1]
+
+;Define MUDDLE version number
+ MOVEI A,5
+ MOVEI B,0 ;Initialize result
+ MOVE C,[440700,,MUDSTR+2]
+VERLP: ILDB D,C ;Get next charcter digit
+ CAIG D,"9 ;Non-digit ?
+ CAIGE D,"0
+ JRST VERDEF
+ SUBI D,"0 ;Convert to number
+ IMULI B,10.
+ ADD B,D ;Include number into result
+ SOJG A,VERLP ;Finished ?
+VERDEF:
+ PUSH TP,$TATOM
+ PUSH TP,IMQUOTE MUDDLE
+ PUSH TP,$TFIX
+ PUSH TP,B
+ MCALL 2,SETG ;Make definition
+OPIPC:
+IFN ITS,[
+ PUSH TP,$TCHSTR
+ PUSH TP,CHQUOTE IPC
+ PUSH TP,$TATOM
+ PUSH TP,MQUOTE IPC-HANDLER
+ MCALL 1,GVAL
+ PUSH TP,A
+ PUSH TP,B
+ PUSH TP,$TFIX
+ PUSH TP,[1]
+ MCALL 3,ON
+ MCALL 0,IPCON
+]
+
+; Allocate inital template tables
+
+ MOVEI A,10
+ PUSHJ P,CAFRE1
+ MOVSI A,(B)
+ HRRI A,1(B)
+ SETZM (B)
+ BLT A,7(B)
+ ADD B,[10,,10] ; REST IT OFF
+ MOVEM B,TD.LNT+1
+ MOVEI A,10
+ PUSHJ P,CAFRE1
+ MOVEI 0,TUVEC ; SETUP UTYPE
+ HRLM 0,10(B)
+ MOVEM B,TD.GET+1
+ MOVSI A,(B)
+ HRRI A,1(B)
+ SETZM (B)
+ BLT A,7(B)
+ MOVEI A,10
+ PUSHJ P,CAFRE1
+ MOVEI 0,TUVEC ; SETUP UTYPE
+ HRLM 0,10(B)
+ MOVEM B,TD.PUT+1
+ MOVSI A,(B)
+ HRRI A,1(B)
+ SETZM (B)
+ BLT A,7(B)
+ MOVEI A,10
+ PUSHJ P,CAFRE1
+ MOVEI 0,TUVEC ; SETUP UTYPE
+ HRLM 0,10(B)
+ MOVEM B,TD.AGC+1
+ MOVSI A,(B)
+ HRRI A,1(B)
+ SETZM (B)
+ BLT A,7(B)
+
+PTSTRT: MOVEI A,SETUP
+ ADDI A,1
+ SUB A,PARBOT ;FIND WHERE PAIRS SHOULD GO
+ MOVEM A,PARNEW
+
+; PURIFY/IMPURIFY THE WORLD (PDL)
+
+IFN ITS,[
+PURIMP: MOVE A,FRETOP
+ SUBI A,1
+ LSH A,-12
+ MOVE B,A
+ MOVNI A,1(A)
+ HRLZ A,A
+ DOTCAL CORBLK,[[1000,,310000],[1000,,-1],A]
+ FATAL INITM -- CAN'T IMPURIFY LOW CORE
+ MOVEI A,PHIBOT
+ ADDI B,1
+ SUB A,B
+ MOVNS A
+ HRL B,A
+ DOTCAL CORBLK,[[1000,,0],[1000,,-1],B]
+ FATAL INITM -- CAN'T FLUSH MIDDLE CORE
+ MOVE A,[-<400-PHIBOT>,,PHIBOT]
+ DOTCAL CORBLK,[[1000,,210000],[1000,,-1],A]
+ FATAL INITM -- CAN'T PURIFY HIGH CORE
+]
+
+IFE ITS,[
+ MOVEI A,400000
+ MOVE B,[1,,START]
+ SEVEC
+]
+ PUSH P,[15.,,15.] ;PUSH A SMALL PRGRM ONTO P
+ MOVEI A,1(P) ;POINT TO ITS START
+ PUSH P,[JRST AAGC] ;GO TO AGC
+ PUSH P,[MOVE PVP,PVSTOR+1]
+ PUSH P,[MOVE B,PSTO+1(PVP)] ;GET SAVED P
+ PUSH P,[SUB B,-14.(P)] ;FUDGE TO POP OFF PROGRAM
+ PUSH P,[MOVEM B,PSAV(TB)] ;INTO FRAME
+ PUSH P,[MOVE B,TPSTO+1(PVP)] ;GET TP
+ PUSH P,[MOVEM B,TPSAV(TB)] ;STORE IT
+ PUSH P,[MOVE B,SPSTOR+1] ;SP
+ PUSH P,[MOVEM B,SPSAV(TB)]
+ PUSH P,[MOVEI B,TOPLEV] ;WHERE TO GO
+ PUSH P,[MOVEM B,PCSAV(TB)]
+IFN ITS, PUSH P,[MOVSI B,(.VALUE )]
+IFE ITS, PUSH P,[MOVSI B,(JRST)]
+ PUSH P,[HRRI B,C]
+ PUSH P,[JRST B] ;GO DO VALRET
+ PUSH P,[B]
+ PUSH P,A ; PUSH START ADDR
+ MOVE B,[JRST -12.(P)]
+ MOVE 0,[JUMPA START]
+IFE ITS, MOVE C,[HALTF]
+IFE ITS, SKIPE OPSYS
+ MOVE C,[ASCII \\170/\e9\]
+ MOVE D,[ASCII \B/\e1Q\]
+ MOVE E,[ASCIZ \\r\16*\r\] ;TERMINATE
+ POPJ P, ; GO
+\f
+; CHECK PAIR SPACE
+
+PAIRCH: CAMG A,B
+ JRST SETTV ;O.K.
+
+DEATH1: MOVEI B,[ASCIZ /LOSSAGE--CODE AND DATA OVERLAP
+/]
+ PUSHJ P,MSGTYP
+ .VALUE
+
+;CHARACTER STRING HACKER
+
+CHACK: MOVE A,(C) ;GET TYPE
+ HLLZM A,(D) ;STORE IN NEW HOME
+ MOVE B,1(C) ;GET POINTER
+ HLRZ E,B ;-LENGHT
+ HRRM E,(D)
+ PUSH P,E+1 ; IDIVI WILL CLOBBER
+ ADDI E,4+5*2 ; ROUND AND ACCOUNT FOR DOPE WORDS
+ IDIVI E,5 ; E/ WORDS LONG
+ PUSHJ P,EBPUR ; MAKE A PURIFIED COPY
+ POP P,E+1
+ HRLI B,010700 ;MAKE POINT BYTER
+ SUBI B,1
+ MOVEM B,1(D) ;AND STORE IT
+ ANDI A,-1 ;CLEAR LH OF A
+ JUMPE A,SETLP ;JUMP IF NO REF
+ HRRZ B,-1(A) ;SEE IF PREVIOUS INSTRUCTION REFERS TO $TCHSTR
+ CAIE B,$TCHSTR ;SKIP IF IT DOES
+ JRST CHACK1 ;NO, JUST DO CHQUOTE PART
+ HRRM D,-1(A) ;CLOBBER
+CHACK1: MOVEI E,1(D)
+ HRRM E,(A) ;STORE INTO REFERENCE
+ MOVEI E,0
+ DPB E,[220400,,(A)]
+ JRST SETLP
+
+; SUBROUTINE TO COPY A HUNK OF STRUCTURE TO THE HIGH SEGMENT
+
+EBPUR: PUSH P,E
+ PUSH P,A
+ ADD E,HITOP ; GET NEW TOP
+ CAMG E,RHITOP ; SKIP IF TOO BIG
+ JRST EBPUR1
+
+; CODE TO GROW HI SEG
+
+ MOVEI A,2000
+ ADDB A,RHITOP ; NEW TOP
+ TLNE A,777776
+ JRST HIFUL
+IFN ITS,[
+ ASH A,-10. ; NUM OF BLOCKS
+ SUBI A,1 ; BLOCK TO GET
+ .CALL HIGET
+ .VALUE
+]
+
+EBPUR1: MOVEI A,-1(E) ; NEEDED TO TERMINATE BLT
+ EXCH E,HITOP
+ HRLI E,(B)
+ MOVEI B,(E)
+ BLT E,(A)
+ POP P,A
+ POP P,E
+ POPJ P,
+
+GIVCOR: SETZ
+ SIXBIT /CORBLK/
+ 1000,,0
+ 1000,,-1
+ SETZ A
+
+HIGET: SETZ
+ SIXBIT /CORBLK/
+ 1000,,100000
+ 1000,,-1
+ A
+ 401000,,400001
+
+\f
+; PROCESS AN ATOM AND ADD IT TO AN APPROPRIATE OBLIST IF IT ISN'T
+; ALREADY THERE
+
+ATOMHK: PUSH TP,$TOBLS ; SAVE OBLIST
+ PUSH TP,[0] ; FILLED IN LATER
+ PUSH TP,$TVEC ;SAVE TV POINTERS
+ PUSH TP,C
+ PUSH TP,$TVEC
+ PUSH TP,D
+ MOVE C,1(C) ;GET THE ATOM
+ PUSH TP,$TATOM ;AND SAVE
+ PUSH TP,C
+ PUSH TP,$TATOM
+ PUSH TP,[0]
+ HRRZ B,(C) ;GET OBLIST SPEC FROM ATOM
+ LSH B,1
+ ADDI B,1(TB) ;POINT TO ITS HOME
+ HRRM B,-9(TP)
+ MOVE B,(B)
+ MOVEM B,-10(TP) ; CLOBBER
+
+ SETZM 2(C) ; FLUSH CURRENT OBLIST SPEC
+ MOVEI E,0
+ MOVE D,C
+ PUSH P,[LOOKCR]
+ ADD D,[3,,3]
+ JUMPGE D,.+4
+ PUSH P,(D)
+ ADDI E,1
+ AOBJN D,.-2
+ PUSH P,E
+ MOVSI A,TOBLS
+ JRST ILOOKC
+LOOKCR:
+ MOVEM B,(TP)
+ JUMPN B,CHCKD
+
+;HERE IF THIS ATOM MUST BE PUT ON OBLIST
+
+USEATM: MOVE B,-2(TP) ; GET ATOM
+ HLRZ E,(B) ; SEE IF PURE OR NOT
+ TRNN E,400000 ; SKIP IF IMPURE
+ JRST PURATM
+ PUSH TP,$TATOM
+ PUSH TP,B
+ PUSH TP,$TOBLS
+ PUSH TP,-13(TP)
+ MCALL 2,INSERT
+
+ PUSHJ P,VALMAK ;MAKE A GLOBAL VALUE FOR THIS LOSER
+PURAT2: MOVE C,-6(TP) ;RESET POINTERS
+ MOVE D,-4(TP)
+ SUB TP,[12,,12]
+ MOVE B,(C) ;MOVE THE ENTRY
+ HLLZM B,(D) ;DON'T WANT REF POINTER STORED
+ MOVE A,1(C) ;AND MOVE ATOM
+ MOVEM A,1(D)
+ MOVEI A,1(D)
+ ANDI B,-1 ;CHECK FOR REAL REF
+ JUMPE B,SETLP1 ;DON'T SAVE THIS ATOM ON TVP
+ HRRM A,(B) ;CLOBBER CODE
+ MOVEI A,0
+ DPB A,[220400,,(B)] ; CLOBBER TVP PORTION
+ JRST SETLP
+
+
+; HERE TO MAKE A PURE ATOM
+
+PURATM: HRRZ B,-2(TP) ; POINT TO IT
+ HLRE E,-2(TP) ; - LNTH
+ MOVNS E
+ ADDI E,2
+ PUSHJ P,EBPUR ; PURE COPY
+ HRRM B,-2(TP) ; AND STORE BACK
+ MOVE B,-2(TP)
+ JUMPE 0,PURAT0
+ HRRZ D,0
+ HLRE E,0
+ SUBM D,E
+ HLRZ 0,2(D)
+ JUMPE 0,PURAT8
+ CAIG 0,HIBOT
+ FATAL INITM--PURE IMPURE LOSSAGE
+ JRST PURAT8
+
+PURAT0: HRRZ E,(C)
+ MOVE D,-2(TP) ; GET ATOM BACK
+ HRRZ 0,(D) ; GET OBLIST CODE
+ JUMPE E,PURAT9
+PURAT7: HLRZ D,1(E)
+ MOVEI D,-2(D)
+ SUBM E,D
+ HLRZ D,2(D)
+ CAILE D,HIBOT ; IF NEXT PURE & I AM ROOT
+ JUMPE 0,PURAT8 ; TAKES ADVANTAGE OF SYSTEM=0
+ JUMPE D,PURAT8
+ MOVE E,D
+ JRST PURAT7
+
+PURAT8: HLRZ D,1(E)
+ SUBI D,2
+ SUBM E,D
+ HLRE C,B
+ SUBM B,C
+ HLRZ E,2(D)
+ HRLM E,2(B)
+ HRLM C,2(D)
+ JRST PURAT6
+
+PURAT9: HLRE A,-2(TP)
+ SUBM B,A
+ HRRZM A,(C)
+
+PURAT6: MOVE B,-10(TP) ; GET BUCKET BACK
+ MOVE C,-2(TP)
+ HRRZ 0,-9(TP)
+ HRRM 0,2(C) ; STORE OBLIST IN ATOM
+PURAT1: HRRZ C,(B) ; GET CONTENTS
+ JUMPE C,HICONS ; AT END, OK
+ CAIL C,HIBOT ; SKIP IF IMPURE
+ JRST HICONS ; CONS IT ON
+ MOVEI B,(C)
+ JRST PURAT1
+
+HICONS: HRLI C,TATOM
+ PUSH P,C
+ PUSH P,-2(TP)
+ PUSH P,B
+ MOVEI B,-2(P)
+ MOVEI E,2
+ PUSHJ P,EBPUR ; MAKE PURE LIST CELL
+
+ MOVE C,(P)
+ SUB P,[3,,3]
+ HRRM B,(C) ; STORE IT
+ MOVE B,1(B) ; ATOM BACK
+ MOVE C,-6(TP) ; GET TVP SLOT
+ HRRM B,1(C) ; AND STORE
+ HLRZ 0,(B) ; TYPE OF VAL
+ MOVE C,B
+ CAIN 0,TUNBOU ; NOT UNBOUND?
+ JRST PURAT3 ; UNBOUND, NO VAL
+ MOVEI E,2 ; COUNT AGAIN
+ PUSHJ P,EBPUR ; VALUE CELL
+ MOVE C,-2(TP) ; ATOM BACK
+ HLLZS (B) ; CLEAR LH
+ MOVSI 0,TLOCI
+ MOVEM B,1(C)
+ SKIPA
+PURAT3: MOVEI 0,0
+ HRRZ A,(C) ; GET OBLIST CODE
+ MOVE A,OBTBL2(A)
+ HRRM A,2(C) ; STORE OBLIST SLOT
+ MOVEM 0,(C)
+ JRST PURAT2
+\f
+; A POSSIBLE MATCH ARRIVES HERE
+
+CHCKD: MOVE D,(TP) ;THEY MATCH!, GET EXISTING ATOM
+ MOVEI A,(D) ;GET TYPE OF IT
+ MOVE B,-2(TP) ;GET NEW ATOM
+ HLRZ 0,(B)
+ TRZ A,377777 ; SAVE ONLY 400000 BIT
+ TRZ 0,377777
+ CAIN 0,(A) ; SKIP IF WIN
+ JRST IM.PUR
+ MOVSI 0,400000
+ ANDCAM 0,(B)
+ ANDCAM 0,(D)
+ HLRZ A,(D)
+ JUMPN A,A1VAL
+ MOVE A,(B) ;MOVE VALUE
+ MOVEM A,(D)
+ MOVE A,1(B)
+ MOVEM A,1(D)
+ MOVE B,D ;EXISTING ATOM TO B
+ MOVEI 0,(B)
+ CAIL 0,HIBOT
+ JRST .+3
+ PUSHJ P,VALMAK ;MAKE A VALUE
+ JRST .+2
+ PUSHJ P,PVALM
+
+;NOW FIND ATOMS OCCURENCE IN XFER VECTOR
+
+OFFIND: MOVE D,-4(TP) ;GET CURRENT POINTER INTO TP
+ MOVE C,[-TVLNT,,TVSTRT] ;AND A COPY OF TVP
+ MOVEI A,0 ;INITIALIZE COUNTER
+ALOOP: CAMN B,1(C) ;IS THIS IT?
+ JRST AFOUND
+ ADD C,[2,,2] ;BUMP COUNTER
+ CAMG C,D
+ AOJA A,ALOOP ;NO, KEEP LOOKING
+
+ MOVEI B,[ASCIZ /LOSSAGE--ATOM DISAPPEARED
+/]
+TYPIT: PUSHJ P,MSGTYP
+ .VALUE
+
+AFOUND: LSH A,1 ;FOUND ATOM, GET REAL OFFSET
+ ADDI A,1
+ ADDI A,TVSTRT
+ MOVE C,-6(TP) ;GET TV POINTER TO NEW ATOM
+ HRRZ B,(C) ;POINT TO REFERENCE
+ SKIPE B ;ANY THERE?
+ HRRM A,(B) ;YES, CLOBBER AWAY
+ SUB TP,[12,,12]
+ MOVEI A,0
+ DPB A,[220400,,(B)] ; KILL TVP POINTER
+ JRST SETLP1 ;AND GO ON
+
+A1VAL: HLRZ C,(B) ;GET VALUE'S TYPE
+ MOVE B,D ;NOW PUT EXISTING ATOM IN B
+ CAIN C,TUNBOU ;UNBOUND?
+ JRST OFFIND ;YES, WINNER
+
+ MOVEI B,[ASCIZ /LOSSAGE--ATOM TRIES TO HAVE 2 VALUES
+/]
+ JRST TYPIT
+
+
+IM.PUR: MOVEI B,[ASCIZ /LOSSAG--ATOM TRIES TO BE BOTH PURE AND IMPURE
+/]
+ JRST TYPIT
+
+PAGLOS: MOVEI B,[ASCIZ /LOSSAGE--IMPURE CORE EXTENDS INTO HIGH SEGMENT
+/]
+ JRST TYPIT
+
+HIFUL: MOVEI B,[ASCIZ /LOSSAGE--HI SEG FULL
+/]
+ JRST TYPIT
+
+\f
+;MAKE A VALUE IN SLOT ON GLOBAL SP
+
+VALMAK: HLRZ A,(B) ;TYPE OF VALUE
+ CAIE A,400000+TUNBOU
+ CAIN A,TUNBOU ;VALUE?
+ JRST VALMA1
+ MOVE A,GLOBSP+1 ;GET POINTER TO GLOBAL SP
+ SUB A,[4,,4] ;ALLOCATE SPACE
+ CAMG A,GLOBAS+1 ;CHECK FOR OVERFLOW
+ JRST SPOVFL
+ MOVEM A,GLOBSP+1 ;STORE IT BACK
+ MOVE C,(B) ;GET TYPE CELL
+ TLZ C,400000
+ HLLZM C,2(A) ;INTO TYPE CELL
+ MOVE C,1(B) ;GET VALUE
+ MOVEM C,3(A) ;INTO VALUE SLOT
+ MOVSI C,TGATOM ;GET TATOM,,0
+ MOVEM C,(A)
+ MOVEM B,1(A) ;AND POINTER TO ATOM
+ MOVSI C,TLOCI ;NOW CLOBBER THE ATOM
+ MOVEM C,(B) ;INTO TYPE CELL
+ ADD A,[2,,2] ;POINT TO VALUE
+ MOVEM A,1(B)
+ POPJ P,
+
+VALMA1: SETZM (B)
+ POPJ P,
+
+SPOVFL: MOVEI B,[ASCIZ /LOSSAGE--GLOBAL SP OVERFLOW
+/]
+ JRST TYPIT
+
+
+PVALM: HLRZ 0,(B)
+ CAIE 0,400000+TUNBOU
+ CAIN 0,TUNBOU
+ JRST VALMA1
+ MOVEI E,2
+ PUSH P,B
+ PUSHJ P,EBPUR
+ POP P,C
+ MOVEM B,1(C)
+ MOVSI 0,TLOCI
+ MOVEM 0,(C)
+ MOVE B,C
+ POPJ P,
+\f;SET UP LIST OF INTERNAL NAMES AND ADDRESS NEEDED BY COMPILER
+
+VECTGO DUMMY1
+
+IRP A,,[FINIS,SPECBIND,WNA,WRONGT,$TLOSE,CALER1,POPUNW
+ILOC,IGLOC,IDVAL,IDVAL1,ILVAL,IGVAL,INTFLG,LCKINT,ONINT,TYPLOO,TDEFER
+IFALSE,UNAS,UNBOU,RCALL,SEGMNT,SEGLST,NUMPRI,OPSYS,SSPEC1,COMPERR
+MAKACT,MAKENV,BFRAME,TTP,TTB,$TTP,$TTB,MAKTUP,TPALOC,IBIND,SSPECS
+CILVAL,CISET,CIGVAL,CSETG,IBLOK1,IBLOCK,CLLOC,CGLOC,CASSQ,CGASSQ
+CILNT,CILNQ,CILEGQ,CEMPTY,CIEQUA,CIREST,CINTH,CIAT,CSETLO,CIN
+CIPUT,CIGET,CIGETL,CIMON,CISTRU,CIMEMQ,CIMEMB,CITOP,CIBACK,TYPSEG
+C1CONS,CICONS,CIUVEC,CIVEC,IIFORM,IILIST,CISTNG,HITOP,INCR1,TYPG,VALG,TESTR
+OTBSAV,CITYPE,CFRAME,CARGS,CFUNCT,CUTYPE,CPTYPE,CTYPEP,CTYPEQ,CCHUTY
+CIREMA,RTFALS,CIPUTP,CIGETP,CIGTPR,MPOPJ,TAB,$TAB,ICONS,CSTO,DSTO,NTPALO
+CPLUS,CTIMES,CTIME,CDIVID,CMINUS,CLQ,CLEQ,CGQ,CGEQ,CLOG,CSIN,CCOS,CATAN,CSQRT
+CFIX,CFLOAT,CEXP,CRAND,CINEQU,SPECBND,PGGIVE,PGFIND,MTYO,CMIN,CMAX,RCL,R1C,W1C
+CALLTY,CTYPEC,CTYPEW,NOTTY,CHKAB,CTMPLT,IUNWIN,UNWIN2,NOSHUF,ROOT,ERROBL,INTOBL
+CINSER,CIRMV,CLOOKU,CATOM,CIPNAM,ISTRCM,CITERP,CIPRIN,CIPRN1,CIPRNC,CGFALS
+CPATM,CP1ATM,CPCATM,CPSTR,CP1STR,CPCSTR,CPCH,CREADC,CNXTCH,CREDC1,CNXTC1
+CGBOUN,IIGLOC,MAKTU2,CIFLTZ,CIUPRS,SAT,TFA,WTYP,NAPT,PTYPE,APLQ,PURBOT,GCSBOT
+GLOTOP,TYPVEC,1STEPR,LSTRES,NODES,MAINPR,CVTYPE,CSPNAM,CSBSTR,INTBCK,CICRLF
+CERR1,CERR2,CERR3,CANDP,CORP,CSQUTA,CIMAGE,ATOSQ,CFILLE,CPRTYC,FMPOPJ
+TD.PUT,TD.GET,TD.LNT,CBYTES,MARK,MARK2G,TD.AGC,DSTORE,RCLV,NUMSAT,RMCALL,NPRFLG
+NSPOPJ,NFPOPJ,PURCLN,FRETOP,PURVEC,SWAPGC,NTTYPE,CLRSTR,VECBOT]
+ .GLOBAL A
+ ADDSQU A
+TERMIN
+
+VECRET
+
+; ROUTINE TO SORT AND PURIFY SQUOZE TABLE
+
+SQSETU: MOVE A,[SQUTBL-SQULOC+2,,SQUTBL]
+ MOVEI 0,1
+SQ2: MOVE B,(A)
+ CAMG B,2(A)
+ JRST SQ1
+ MOVEI 0,0
+ EXCH B,2(A)
+ MOVEM B,(A)
+ MOVE B,1(A)
+ EXCH B,3(A)
+ MOVEM B,1(A)
+SQ1: ADD A,[2,,2]
+ JUMPL A,SQ2
+ JUMPE 0,SQSETU
+IFE ITS,[
+STSQU: MOVE B,[440700,,SQBLK]
+ PUSHJ P,MNGNAM
+ HRROI B,SQBLK
+ MOVSI A,600001
+ GTJFN
+ FATAL CANT MAKE FIXUP FILE
+ MOVEI E,(A)
+ MOVE B,[440000,,100000]
+ OPENF
+ FATAL CANT OPEN FIXUP FILE
+ MOVE B,[444400,,SQUTBL]
+ MOVNI C,SQULOC-SQUTBL
+ SOUT
+ MOVEI A,(E)
+ CLOSF
+ JFCL
+ MOVE A,[SQUTBL-SQULOC,,SQUTBL]
+ MOVEM A,SQUPNT"
+]
+IFN ITS,[
+.GLOBAL CSIXBT
+STSQU: MOVE C,MUDSTR+2 ; CALCULATE SECOND FILE NAME FOR SQUOZE TABLE
+ PUSHJ P,CSIXBT
+ HRRI C,(SIXBIT/TAB/) ; TABxxx IS SECOND NAME OF FILE
+ MOVSS C
+ MOVEM C,SQBLK+2 ; STORE IN APPROPRIATE BLOCKS
+ MOVEM C,SQWBLK+2
+ .SUSET [.SSNAM,,SQDIR]
+ .OPEN GCHN,SQWBLK ; OPEN FILE
+ FATAL CAN'T CREATE SQUOZE FILE
+ MOVE A,[SQUTBL-SQULOC,,SQUTBL]
+ MOVEM A,SQUPNT"
+ .IOT GCHN,A
+ .CLOSE GCHN ; CLOSE THE CHANNEL
+]
+ POPJ P,
+
+RHITOP: 0
+
+OBSZ: 151.
+ 13.
+ 151.
+ 151.
+ 317.
+
+OBTBL2: ROOT+1
+ ERROBL+1
+ INTOBL+1
+ MUDOBL+1
+ INITIAL+1
+
+OBTBL: INITIAL+1-TVSTRT+TVBASE
+ MUDOBL+1-TVSTRT+TVBASE
+ INTOBL+1-TVSTRT+TVBASE
+ ERROBL+1-TVSTRT+TVBASE
+ ROOT+1-TVSTRT+TVBASE
+OBNAM: MQUOTE INITIAL
+ IMQUOTE MUDDLE
+ MQUOTE INTERRUPTS
+ MQUOTE ERRORS
+ MQUOTE ROOT
+
+OBTBL1: INITIAL+1
+ MUDOBL+1
+ INTOBL+1
+ ERROBL+1
+ ROOT+1
+
+
+IFN ITS,[
+SQWBLK: SIXBIT / 'DSK/
+ SIXBIT /SQUOZE/
+ SIXBIT /TABLE/
+]
+IFE ITS,[
+MNGNAM: MOVE A,[440700,,MUDSTR+2] ; FOR NAME HACKING
+ ILDB 0,A ; SEE IF IT IS A VERSION
+ CAIN 0,177
+ POPJ P,
+ MOVE A,B
+ ILDB 0,A
+ CAIN 0,"X ; LOOK FOR X'S
+ JRST .+3
+ MOVE B,A
+ JRST .-4
+
+ MOVE A,[440700,,MUDSTR+2]
+ ILDB 0,A
+ IDPB 0,B
+ ILDB 0,A
+ IDPB 0,B
+ ILDB 0,A
+ IDPB 0,B
+ POPJ P,
+]
+
+IFN ITS,[
+.GLOBAL VCREATE,MUDSTR
+
+DEBUG: MOVE E,[440600,,[SIXBIT /EXPERIMENTAL/]]
+ MOVEI 0,12.
+ JRST STUFF
+
+VCREATE: .SUSET [.SSNAM,,[SIXBIT /MUDSYS/]]
+ .OPEN 0,OP%
+ .VALUE
+ MOVEI 0,0 ; SET 0 TO DO THE .RCHST
+ .RCHST 0
+ .CLOSE 0
+ .FDELE DB%
+ .VALUE
+ MOVE E,[440600,,B]
+ MOVEI 0,6
+STUFF: MOVE D,[440700,,MUDSTR+2]
+STUFF1: ILDB A,E ; GET A CHAR
+ CAIN A,0 ;SUPRESS SPACES
+ MOVEI A,137 ;RUBOUT'S DON'T TYPE OUT
+ ADDI A,40 ; TO ASCII
+ IDPB A,D ; STORE
+ SOJN 0,STUFF1
+ SETZM 34
+ SETZM 35
+ SETZM 36
+ .VALUE
+
+OP%: 1,,(SIXBIT /DSK/)
+ SIXBIT /MUD%/
+ SIXBIT />/
+
+DB%: (SIXBIT /DSK/)
+ SIXBIT /MUD%/
+ SIXBIT /</
+ 0
+ 0
+]
+
+
+.GLOBAL GCDIR,ILDBLK,TILDBL,GCLDBK,LENGC,SLENGC,SGCLBK,RLENGC
+.GLOBAL SECBLK,SECLEN,RSLENG,DECBLK
+
+; ROUTINE TO DUMP OUT THE GARBAGE-COLLECTOR
+
+DUMPGC:
+IFN ITS,[
+ .SUSET [.SSNAM,,GCDIR] ; SET SNAME
+ MOVE C,MUDSTR+2 ; CREATE SECOND NAMES
+ PUSHJ P,CSIXBT
+ HRRI C,(SIXBIT /MUD/)
+ MOVS A,C ; MUDxx IS SECOND NAME
+ MOVEM A,GCLDBK+2
+ MOVEM A,SGCLBK+2
+ MOVEM A,ILDBLK+2
+ MOVEM A,GCDBLK+2 ; SMASH IN SECOND NAMES
+ MOVEM A,SGCDBK+2
+ MOVEM A,INTDBK+2
+ .OPEN 0,GCDBLK ; OPEN GC FILE
+ FATAL CANT CREATE AGC FILE
+ MOVNI A,LENGC ; CALCULATE IOT POINTER
+ ASH A,10.
+ HRLZS A
+ HRRI A,REALGC
+ .IOT 0,A ; SEND IT OUT
+ .CLOSE 0, ; CLOSE THE CHANNEL
+ .OPEN 0,SGCDBK ; OPEN GC FILE
+ FATAL CANT CREATE AGC FILE
+ MOVNI A,SLENGC ; CALCULATE IOT POINTER
+ ASH A,10.
+ HRLZS A
+ HRRI A,REALGC+RLENGC
+ .IOT 0,A ; SEND IT OUT
+ .CLOSE 0, ; CLOSE THE CHANNEL
+
+
+; ROUTINE TO DUMP THE INTERPRETER
+
+ .SUSET [.SSNAM,,INTDIR]
+ .OPEN 0,ILDBLK ; OPEN FILE TO INTERPRETER BLOCK
+ FATAL CANT FIXUP INTERPRETER
+ HLRE B,TP ; MAKE SURE BIG ENOUGJ
+ MOVNS B ; SEE IF WE WIN
+ CAIGE B,400 ; SKIP IF WINNING
+ FATAL NO ROOM FOR PAGE MAP
+ MOVSI A,-400
+ HRRI A,1(TP)
+ .ACCES 0,[1]
+ .IOT 0,A ; GET IN PAGE MAP
+ .CLOSE 0,
+ .OPEN 0,INTDBK
+ FATAL CANT FIXUP INTERPRETER
+ MOVEI A,1 ; INITIALIZE FILE PAGE COUNT
+ MOVEI B,0 ; CORE PAGE COUNT
+ MOVEI E,1(TP)
+LOPFND: HRRZ 0,(E)
+ JUMPE 0,NOPAG ; IF 0 FORGET IT
+ ADDI A,1 ; AOS FILE MAP
+NOPAG: ADDI B,1 ; AOS PAGE MAP
+ CAIE B,PAGEGC ; SKIP IF DONE
+ AOJA E,LOPFND
+ ASH A,10. ; TO WORDS
+ .ACCES 0,A
+ MOVNI B,LENGC
+ ASH B,10. ; TO WORDS
+ HRLZS B ; SWAP
+ HRRI B,AGCLD
+ .IOT 0,B
+ .CLOSE 0,
+ POPJ P, ; DONE
+
+GCDBLK: SIXBIT / 'DSK/
+ SIXBIT /AGC/
+ SIXBIT /MUD /
+
+SGCDBK: SIXBIT / 'DSK/
+ SIXBIT /SGC/
+ SIXBIT /MUD /
+
+INTDBK: 100007,,(SIXBIT /DSK/)
+ SIXBIT /TS/
+ SIXBIT /MUD/
+
+]
+IFE ITS,[
+ MOVE B,[440700,,GCLDBK]
+ PUSHJ P,MNGNAM ; VERSION TO NAME IF NECESSARY
+ HRROI B,GCLDBK
+ MOVSI A,600001
+ GTJFN
+ FATAL CANT WRITE OUT GC
+ MOVEI E,(A)
+ MOVE B,[440000,,100000]
+ OPENF
+ FATAL CANT OPEN GC FILE
+ MOVNI C,LENGC
+ ASH C,10.
+ MOVE B,[444400,,REALGC]
+ MOVEI A,(E)
+ SOUT
+ MOVEI A,(E)
+ CLOSF
+ JFCL
+ MOVEI D,LENGC+LENGC
+ MOVNI A,1
+ MOVEI B,REALGC
+ ASH B,-9.
+ HRLI B,400000
+
+ PMAP
+ ADDI B,1
+ SOJG D,.-2
+
+ MOVE B,[440700,,SGCLBK]
+ PUSHJ P,MNGNAM ; VERSION TO NAME IF NECESSARY
+ HRROI B,SGCLBK
+ MOVSI A,600001
+ GTJFN
+ FATAL CANT WRITE OUT GC
+ MOVEI E,(A)
+ MOVE B,[440000,,100000]
+ OPENF
+ FATAL CANT OPEN GC FILE
+ MOVNI C,SLENGC
+ ASH C,10.
+ MOVE B,[444400,,REALGC+RLENGC]
+ MOVEI A,(E)
+ SOUT
+ MOVEI A,(E)
+ CLOSF
+ JFCL
+ MOVEI D,SLENGC+SLENGC
+ MOVNI A,1
+ MOVEI B,REALGC+RLENGC
+ ASH B,-9.
+ HRLI B,400000
+
+ PMAP
+ ADDI B,1
+ SOJG D,.-2
+
+ MOVE B,[440700,,SECBLK]
+ PUSHJ P,MNGNAM ; VERSION TO NAME IF NECESSARY
+ HRROI B,SECBLK
+ MOVSI A,600001
+ GTJFN
+ FATAL CANT WRITE OUT GC
+ MOVEI E,(A)
+ MOVE B,[440000,,100000]
+ OPENF
+ FATAL CANT OPEN GC FILE
+ MOVNI C,SECLEN
+ ASH C,10.
+ MOVE B,[444400,,REALGC+RLENGC+RSLENG]
+ MOVEI A,(E)
+ SOUT
+ MOVEI A,(E)
+ CLOSF
+ JFCL
+
+; NOW MUNG THE THING TO BE DIFFERENT TO USE UUOS FOR DEBUGGING VERSION
+
+.GLOBAL %FXUPS,%FXEND
+
+ MOVEI A,%FXUPS
+
+%DBG1: HLRZ D,(A)
+ HRRZ A,(A)
+ LDB 0,[331100,,(A)] ; GET INS
+ MOVEI C,%TBL
+ HRRZ B,(C)
+ CAME B,0
+ AOJA C,.-2
+ CAIN B,<<(XBLT)>_<-9.>>
+ HLLZS (A)
+ LDB B,[331100,,(C)]
+ DPB B,[331100,,(A)]
+ MOVE A,D
+ JUMPN A,%DBG1
+%DBG2:
+ MOVE B,[440700,,DECBLK]
+ PUSHJ P,MNGNAM ; VERSION TO NAME IF NECESSARY
+ HRROI B,DECBLK
+ MOVSI A,600001
+ GTJFN
+ FATAL CANT WRITE OUT GC
+ MOVEI E,(A)
+ MOVE B,[440000,,100000]
+ OPENF
+ FATAL CANT OPEN GC FILE
+ MOVNI C,SECLEN
+ ASH C,10.
+ MOVE B,[444400,,REALGC+RLENGC+RSLENG]
+ MOVEI A,(E)
+ SOUT
+ MOVEI A,(E)
+ CLOSF
+ JFCL
+ MOVEI D,SECLEN+SECLEN
+ MOVNI A,1
+ MOVEI B,REALGC+RLENGC
+ ASH B,-9.
+ HRLI B,400000
+
+ PMAP
+ ADDI B,1
+ SOJG D,.-2
+
+ MOVE B,[440700,,ILDBLK]
+ SKIPE OPSYS
+ MOVE B,[440700,,TILDBL]
+ PUSHJ P,MNGNAM
+ MOVSI C,-1000
+ MOVSI A,400000
+RPA: RPACS
+ TLNE B,10000
+ TLNN B,400 ; SKIP IF NOT PRIVATE
+ SKIPA
+ MOVES (C)
+ ADDI C,777
+ ADDI A,1
+ AOBJN C,RPA
+
+ MOVNI A,1
+ CLOSF
+ FATAL CANT CLOSE STUFF
+ HRROI B,ILDBLK
+ MOVSI A,100001
+ GTJFN ; GET A JFN
+ FATAL GARBAGE COLLECTOR IS MISSING
+ HRRZS E,A ; SAVE JFN
+ MOVE B,[440000,,300000]
+ OPENF
+ FATAL CANT OPEN GC FILE
+ MOVEI A,(E) ; FIND OUT LENGTH OF MAP
+ BIN ; GET LENGTH WORD
+ HLRZ 0,B
+ CAIE 0,1776 ; TOPS20 SSAVE FILE FORMAT
+ CAIN 0,1000 ; TENEX SSAVE FILE FORMAT
+ JRST .+2
+ FATAL NOT AN SSAVE FILE
+ MOVEI A,(B) ; ISOLATE SIZE OF MAP
+ HLRE B,TP ; MUST BE SPACE FOR CRUFT
+ MOVNS B
+ CAIGE B,(A) ; ROOM?
+ FATAL NO ROOM FOR PAGE MAP (GULP)
+ MOVN C,A
+ MOVEI A,(E) ; READY TO READ IN MAP
+ MOVEI B,1(TP) ; ONTO TP STACK
+ HRLI B,444400
+ SIN ; SNARF IT IN
+
+ MOVEI A,1(TP) ; POINT TO MAP
+ CAIE 0,1000
+ JRST RPA1 ; GO TO THE TOPS20 CODE
+ LDB 0,[221100,,(A)] ; GET FORK PAGE
+ CAIE 0,PAGEGC+PAGEGC ; GOT IT?
+ AOJA A,.-2
+ JRST RPA2
+
+RPA1: ADDI A,1 ; POINT TO PROCESS PAGE NUMBER
+ LDB 0,[331100,,(A)] ; REPEAT COUNT IN 0
+ LDB B,[3300,,(A)] ; FIRST PAGE NUMBER IN B
+ ADD 0,B ; LARGEST PAGE NUMBER
+ CAIL 0,PAGEGC+PAGEGC
+ CAILE B,PAGEGC+PAGEGC
+ AOJA A,RPA1 ; NEXT PAIR OF WORDS PLEASE
+ SUBI A,1 ; POINT TO FILE PAGE NUMBER
+ SUBI B,PAGEGC+PAGEGC
+ MOVN B,B
+ ADDM B,(A) ; SET UP THE PAGE
+
+RPA2: HRRZ B,(A) ; GET PAGE
+ MOVEI A,(E) ; GET JFN
+ ASH B,9.
+ SFPTR
+ FATAL ACCESS OF FILE FAILED
+ MOVEI A,(E)
+ MOVE B,[444400,,AGCLD]
+ MOVNI C,LENGC
+ ASH C,10.
+ SOUT
+ MOVEI A,(E)
+ CLOSF
+ JFCL
+ POPJ P,
+
+; CODE TO DISTINGUISH BETWEEN TOPS20 AND TENEX AT SETUP TIME
+
+TWENTY: HRROI A,C ; RESULTS KEPT HERE
+ HRLOI B,600015
+ MOVEI C,0 ; CLEAN C UP
+ DEVST
+ JFCL
+ MOVEI A,1 ; TENEX HAS OPSYS = 1
+ CAME C,[ASCII/NUL/] ; TOPS20 GIVES "NUL"
+ MOVEM A,OPSYS ; TENEX GIVES "NIL"
+ POPJ P,
+%TBL: IRP A,,[HRRM,HRLM,MOVEM,SETZM,HLRZ,XBLT]
+ S!A <<(A)>_<-9.>>
+ TERMIN
+
+GCLDBK: ASCIZ /MDLXXX.AGC/
+SGCLBK: ASCIZ /MDLXXX.SGC/
+SECBLK: ASCIZ /MDLXXX.SEC/
+ILDBLK: ASCIZ /MDLXXX.EXE/
+TILDBL: ASCIZ /MDLXXX.SAV/
+DECBLK: ASCIZ /MDLXXX.DEC/
+]
+
+
+
+END SETUP
+\f
\ No newline at end of file