TITLE LOADGC MODULE TO LOAD THE GARBAGE COLLECTOR RELOCA .INSRT MUDDLE > SYSQ IFE ITS,[ .INSRT STENEX > XJRST==JRST 5, ] IFN ITS, PGSZ==10. IFE ITS, PGSZ==9. ; ROUTINES TO GET THE GC DO PDL OVERFLOWS IN GC AND ALLOCATE SPECIAL ; BUFFERS. ; IMPORTANT VARAIBLES .GLOBAL PAGEGC ; STARTING PAGE OF GARBAGE COLLECTOR (PAGES) .GLOBAL LENGC ; LENGTH OF GARBAGE COLLECTOR (PAGES) .GLOBAL SLENGC ; LENGTH OF MARK/SWEEP GARBAGE COLLECTOR .GLOBAL MRKPDL ; STARTING LOCATION OF MARK PDL (WORDS) .GLOBAL STRBUF ; START OF BUFFER LOCATIONS (WORDS) .GLOBAL SWAPGC ; WHICH GARBAGE COLLECTOR TO LOAD .GLOBAL MARK2G ; GENERAL MARKING ROUTINE FOR TEMPLATE STUFF .GLOBAL MARK2A,MARK2S ; SPECIFIC MARKERS IN SGC/AGC .GLOBAL SECLEN ; LENGTH OF SECTION GC GUY .GLOBAL MULTSG .GLOBAL SECBLK,DECBLK,GCDEBU,DEBUGC,NDEBUG .GLOBAL FRETOP,PURBOT,PURTOP,GCPDL,LPUR,STRPAG,CKPUR,INPLOD,GETPAG,CURPLN,SGCLBK,PGCNT .GLOBAL LODGC,CKFILE,SLEEPR,KILGC,GETBUF,KILBUF,GPDLOV,GCDIR,INTDIR,GCLDBK .GLOBAL OPBLK,SJFNS,IJFNS,OPSYS,IJFNS1,RBLDM,ILDBLK,TILDBL .GLOBAL TMTNXS,C%1 IFN ITS,[ IMAPCH==0 ; INTERNAL MAPPING CHANNEL MAPCHN==1000,,IMAPCH ; CORBLK CHANNEL FME==1000,,-1 ; BITS FOR CURRENT JOB FLS==1000,,0 ; BITS TO FLUSH A PAGE RDTP==1000,,200000 ; BITS TO MAP IN IN READ-ONLY WRTP==1000,,100000 CRJB==1000,,400001 ; BITS TO ALLOCATE CORE CWRITE==1000,,4000 ] IFE ITS,[ MFORK==400000 CTREAD==100000 ; READ BIT CTEXEC==20000 ; EXECUTE BIT CTWRIT==40000 ; WRITE BIT CTCW==400 ; COPY ON WRITE SGJF==1 ; USE SHORT JFN (LH FLAG) OLDF==100000 ; REQUIRE OLD (EXISTING FILE) (LH FLAG) FREAD==200000 ; READ BIT FOR OPENF FEXEC==40000 ; EXEC BIT FOR OPENF FTHAW==2000 ] ; GENERAL MARK ROUTINE FOR TEMPLATE STUFF. GOES TO RIGHT PLACE IN ; WHICHEVER GC'ER WE'RE USING AT THE MOMENT MARK2G: SKIPN SWAPGC JRST MARK2A ; INTO AGC JRST MARK2S ; INTO SGC ; ROUTINE TO LOAD THE GARBAGE COLLECTOR LODGC: IFN ITS,[ MOVEI 0,GCLDBK SKIPE SWAPGC ; SKIP IF SWAPPED GARBAGE COLLECTOR MOVEI 0,SGCLBK MOVEM 0,OPBLK .SUSET [.RSNAM,,SAVSNM] ; SAVE OLD SNAME .SUSET [.SSNAM,,GCDIR] ; SET SNAME TO APP DIR .OPEN IMAPCH,@OPBLK ; OPEN CHANNEL TO FILE PUSHJ P,CKFILE ; SEE IF REALLY LOSING HRLZI A,-LENGC+3 SKIPE SWAPGC HRLZI A,-SLENGC MOVE B,A ; B WILL CONTAIN PTR TO CORE HRRI B,PAGEGC DOTCAL CORBLK,[[RDTP],[FME],B,[MAPCHN],A] PUSHJ P,SLEEPR HRLI B,-1 SKIPN SWAPGC ; IF SWAP 1 PAGE FOR CORBLK ELSE 3 HRLI B,-3 GETIT: DOTCAL CORBLK,[[WRTP],[FME],B,[CRJB]] PUSHJ P,SLEEPR .CLOSE IMAPCH, MOVEI A,LENGC ; SMASH PAGECOUNT SKIPE SWAPGC MOVEI A,SLENGC+1 ; PSTACK MOVEM A,PGCNT POPJ P, ; SEE WHY OPEN FAILED CKFILE: .STATUS IMAPCH,0 ; GET STATUS BITS INTO 0 HRLZS 0 ANDI 0,77 ; AND OF EXTRANEOUS BITS CAIN 0,4 ; SKIP IF NOT FNF FATAL CANT OPEN AGC FILE SLEEPR: MOVEI 0,1 ; SLEEP FOR A WHILE .SLEEP SOS (P) ; TRY AGAIN SOS (P) POPJ P, ; BYE ] IFE ITS,[ HRRZ A,IJFNS1 SKIPN MULTSG HLRZ A,IJFNS SKIPE SWAPGC HLRZ A,IJFNS1 JUMPN A,GOTJFN ; HERE TO GET GC JFNS ; GET STRING NAME OF MDL INTERPRETER FILE HRRZ A,IJFNS ; INTERPRETER JFN MOVE B,A ; SET UP FOR JFNS PUSHJ P,TMTNXS ; MAKES A STRING ON P STACK MOVE D,E ; SAVED VALUE OF P STACK HRROI A,1(E) ; STRING FOR RESULT MOVE C,[211000,,1] ; GET "DEV:NM1" FROM JFNS JFNS MOVE C,A ; SAVE TO REUSE FOR ".SGC" ; GET JFN TO AGC FILE MOVEI B,[ASCIZ /.AGC/] SKIPN MULTSG JRST .+4 MOVEI B,[ASCIZ /.DEC/] SKIPN GCDEBU MOVEI B,[ASCIZ /.SEC/] SKIPE SWAPGC MOVEI B,[ASCIZ /.SGC/] HRLI B,440700 ILDB B IDPB A JUMPN .-2 ; COPY ".AGC" INTO STRING HRROI B,1(E) ; GTJFN STRING MOVSI A,SGJF+OLDF ; GTJFN CONTROL BITSS GTJFN FATAL AGC GARBAGE COLLECTOR IS MISSING SKIPN SWAPGC JRST .+3 HRLM A,IJFNS1 JRST JFNIN SKIPE MULTSG HRRM A,IJFNS1 SKIPN MULTSG HRLM A,IJFNS JFNIN: MOVE B,[440000,,FREAD+FEXEC] OPENF FATAL CANT OPEN AGC FILE MOVE P,E GOTJFN: MOVEI D,SECLEN+SECLEN-2 SKIPN MULTSG MOVEI D,LENGC+LENGC-6 ; # OF TENEX PAGES TO GET IT SKIPE SWAPGC MOVEI D,SLENGC+SLENGC MOVSI A,(A) ; JFN TO LH MOVE B,[MFORK,,PAGEGC+PAGEGC] MOVSI C,CTREAD+CTEXEC LDLP: PMAP ADDI A,1 ADDI B,1 SOJG D,LDLP MOVEI C,0 MOVEI D,6 ; THESE PAGES WILL BE THE GC PDL SKIPN MULTSG SKIPE SWAPGC MOVEI D,2 ; PDL BUT NO FRONT OR WINDOW MOVNI A,1 LDLP1: PMAP ADDI B,1 SOJG D,LDLP1 MOVEI A,SECLEN+1 SKIPN MULTSG MOVEI A,LENGC ; SMASH PAGECOUNT SKIPE SWAPGC MOVEI A,SLENGC+1 MOVEM A,PGCNT POPJ P, ;ROUTINE TO "SLEEP" FOR A WHILE ON 10X/20X HA HA SLEEPR: SOS (P) POPJ P, ] ; ROUTINE TO LOAD THE INTERPRETER ; C=>LENGTH OF PAGES ; D=>START OF PAGES LODINT: IFN ITS,[ .SUSET [.RSNAME,,SAVSNM] LODIN1: .IOPUS IMAPCH, .SUSET [.SSNAM,,INTDIR] .OPEN IMAPCH,ILDBLK ; OPEN FILE TO INTERPRETER BLOCK PUSHJ P,CKFILE 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 IMAPCH,C%1 .IOT IMAPCH,A ; GET IN PAGE MAP 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,(D) ; SKIP IF DONE AOJA E,LOPFND MOVNI 0,(C) ; GET PAGE-COUNT HRL A,0 ; BUILD FILE PAGE POINTER HRL B,0 ; BUILD CORE PAGE POINTER DOTCAL CORBLK,[[RDTP],[FME],B,[MAPCHN],A] PUSHJ P,SLEEPR ; GO TO SLEEP FOR A WHILE .CLOSE IMAPCH, .IOPOP IMAPCH, .SUSET [.SSNAM,,SAVSNM] POPJ P, ; DONE ] IFE ITS,[ HRRZ E,IJFNS MOVEI A,(E) ; FIND OUT LENGTH OF MAP MOVEI B,0 SFPTR FATAL CANNOT RESET FILE POINTER MOVEI A,(E) BIN ; GET LENGTH WORD MOVEI A,(B) ; ISOLATE SIZE OF MAP HLRZ 0,B HLRE B,TP ; MUST BE SPACE FOR CRUFT MOVNS B CAIGE B,(A) ; ROOM? FATAL NO ROOM FOR PAGE MAP (GULP) PUSH P,C ; SAVE # PAGES WANTED 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) CAIE 0,1000 ; CHECK FOR TENEX JRST TOPS20 LDB 0,[221100,,(A)] ; GET FORK PAGE CAIE 0,(D) ; GOT IT? AOJA A,.-2 HRRZ A,(A) JRST GOTPG TOPS21: ADDI A,2 TOPS20: HRRZ 0,1(A) ; GET PAGE IN PROCESS LDB B,[331100,,1(A)] ; GET REPT COUNT ADD B,0 ; LAST PAGE IN BLOCK CAIG 0,(D) CAIGE B,(D) ; WITHIN RANGE? JRST TOPS21 SUBM D,0 HRRZ A,(A) ADD A,0 GOTPG: HRLI A,(E) MOVEI B,(D) HRLI B,MFORK MOVSI C,CTREAD+CTEXEC ; BITS POP P,D ; PAGES ASH D,1 ; FOR TENEX MPLP: PMAP ADDI A,1 ADDI B,1 SOJG D,MPLP ; MAP-EM IN POPJ P, ] ; ROUTINE TO MAP IN OVER GARBAGE COLLECTOR EXPLICITLY KILGC: IFN ITS,[ MOVEI D,PAGEGC MOVE C,PGCNT JRST LODIN1 ] IFE ITS,[ MOVEI D,PAGEGC+PAGEGC MOVE C,PGCNT JRST LODINT ] ; ROUTINE TO TRY TO ALLOCATE A BUFFER ; 1) IT FIRSTS LOOKS BETWEEN FRETOP AND PURBOT ; 2) LOOKS AT THE INTERPRETER ; A=>NUMBER OF BUFFER PAGES (CURRENTLY ALWAYS 1) ; B=>BUFFER ; BUFFER SAVED IN BUFPTR GETBUF: ASH A,10. ; CONVERT TO WORDS MOVE B,PURBOT ; LOOK FOR ROOM IN GCS SUB B,FRETOP CAMGE B,A ; SKIP IF WINNING JRST NOBUF1 MOVE B,FRETOP ; BUFFER IN B MOVEM B,BUFPTR ; SAVE BUFFER ASH A,-10. ; TO PAGES MOVEM A,BUFLT ; LENGTH OF BUFFER POPJ P, NOBUF1: ASH A,-10. ; BACK TO WORDS SKIPE INPLOD ; SKIP IF NOT IN MAPPUR JRST INTBUF PUSH P,A PUSH P,E JSP E,CKPUR POP P,E POP P,A MOVE B,PURTOP SUB B,PURBOT SUB B,CURPLN ASH B,-10. ; CALCULATE AVAILABLE ROOM CAIGE B,(A) ; SEE IF ENOUGH JRST INTBUF ; LOSE LOSE GET BUFFER FROM INTERPRETER IFE ITS, ASH A,1 ; TENEX PAGES PUSH P,C PUSH P,D PUSH P,E PUSHJ P,GETPAG ; GET THOSE PAGES FATAL GETPAG FAILED POP P,E POP P,D POP P,C IFE ITS, ASH A,-1 JRST GETBUF ; TRY AGAIN INTBUF: MOVEM A,BUFLT IFN ITS,[ MOVNS A ; NEGATE HRLZS A ; SWAP HRRI A,STRPAG ; AOBJN TO PAGE MOVE B,A DOTCAL CORBLK,[[FLS],[FME],A] FATAL CANT FLUSH PAGE DOTCAL CORBLK,[[WRTP],[FME],B,[CRJB]] PUSHJ P,SLEEPR ] IFE ITS,[ PUSH P,C MOVEI C,(A) ; PAGES TO FLUSH ASH C,1 MOVNI A,1 ; FLUSH PAGES MOVE B,[MFORK,,STRPAG+STRPAG] ; WHICH ONES FLSLP: PMAP ADDI B,1 SOJG C,FLSLP POP P,C ] MOVEI B,STRBUF ; START OF BUFFER MOVEM B,BUFPTR ; SAVE IN BUFPTR PUSHJ P,RBLDM POPJ P, ; ROUTINE TO FLUSH A BUFFER WHEN DONE WITH IT KILBUF: SKIPN B,BUFPTR ; SEE IF BUFPTR EXISTS POPJ P, IFE ITS, JRST @[.+1] ; RUN IN SECTION 0 CAIL B,HIBOT ; SKIP IF NOT PART OF INTERPRETER JRST HIBUF ; INTERPRETER IFN ITS,[ ASH B,-10. MOVN A,BUFLT ; GET LENGTH HRLI B,(A) ; BUILD PAGE AOBJN DOTCAL CORBLK,[[FLS],[FME],B] FATAL CANT FLUSH PAGES ] IFE ITS,[ ASH B,-9. ; TO PAGES HRLI B,MFORK MOVNI A,1 MOVE D,BUFLT LSH D,1 ; TO TENEX PAGES PUSH P,C ; SAVE C MOVEI C,0 ; C CONTAINS SOME FLAGS FLSLP1: PMAP ADDI B,1 SOJG D,FLSLP1 POP P,C ; RESTORE C ] FLEXIT: SETZM BUFPTR SETZM BUFLT IFE ITS,[ PUSH P,A HLRZ A,SJFNS JUMPE A,.+3 CLOSF JFCL SETZM SJFNS POP P,A SKIPN MULTSG POPJ P, POP P,21 SETZM 20 XJRST 20 ] IFN ITS,[ POPJ P, ] HIBUF: MOVE C,BUFLT MOVE D,BUFPTR IFN ITS, ASH D,-10. IFE ITS, ASH D,-9. PUSHJ P,LODINT JRST FLEXIT ; HERE TO HANDLE GC PDL OVERFLOW. ROUTINE USES A,B AND ASSUMES GCPDL IS THE PDL GPDLOV: HRRZ A,PGCNT ; # OF PAGES TO A ADDI A,PAGEGC ; SEE IF ROOM ASH A,10. ; TO WORDS CAIL A,LPUR ; HAVE WE LOST FATAL NO ROOM FOR GCPDL IFN ITS,[ ASH A,-10. ; GET PAGE NUMBER AOS PGCNT ; AOS DOTCAL CORBLK,[[FLS],[FME],A] FATAL CANT FLUSH PAGE DOTCAL CORBLK,[[WRTP],[FME],A,[CRJB]] PUSHJ P,SLEEPR ] IFE ITS,[ ASH A,-9. AOS PGCNT MOVE B,A MOVNI A,1 HRLI B,MFORK PUSH P,C ; BETTER HAVE A PDL HERE MOVEI C,0 PMAP ADDI B,1 PMAP POP P,C ] HRRI A,-2000 ; SMASH PDL HRLM A,GCPDL POPJ P, ; EXIT IFN ITS,[ GCDIR: SIXBIT /MUDSAV/ INTDIR: SIXBIT /MUDSAV/ GCLDBK: SIXBIT / &DSK/ SIXBIT /AGC/ 0 ; FILLED IN BY INITM SGCLBK: SIXBIT / &DSK/ SIXBIT /SGC/ 0 ILDBLK: SIXBIT / &DSK/ SIXBIT /TS/ 0 ; FILLED IN BY INITM ] NDEBUG: SETZM GCDEBU CAIA DEBUGC: SETOM GCDEBU HRRZ A,IJFNS1 ; GET GC JFN SKIPE A CLOSF JFCL POPJ P, IMPURE GCDEBU: 0 BUFPTR: 0 ; POINTER TO CURRENTLY ACTIVE BUFFER (WORD) BUFLT: 0 ; LENGTH OF CURRENTLY ACTIVE BUFFER (PAGES) PGCNT: 0 ; # OF PAGES OF MAPPED OUT INTERPRETER SAVSNM: 0 OPBLK: 0 ; BLOCK USED FOR OPEN PURE END