1 TITLE LOADGC MODULE TO LOAD THE GARBAGE COLLECTOR
14 ; ROUTINES TO GET THE GC DO PDL OVERFLOWS IN GC AND ALLOCATE SPECIAL
19 .GLOBAL PAGEGC ; STARTING PAGE OF GARBAGE COLLECTOR (PAGES)
20 .GLOBAL LENGC ; LENGTH OF GARBAGE COLLECTOR (PAGES)
21 .GLOBAL SLENGC ; LENGTH OF MARK/SWEEP GARBAGE COLLECTOR
22 .GLOBAL MRKPDL ; STARTING LOCATION OF MARK PDL (WORDS)
23 .GLOBAL STRBUF ; START OF BUFFER LOCATIONS (WORDS)
24 .GLOBAL SWAPGC ; WHICH GARBAGE COLLECTOR TO LOAD
26 .GLOBAL MARK2G ; GENERAL MARKING ROUTINE FOR TEMPLATE STUFF
27 .GLOBAL MARK2A,MARK2S ; SPECIFIC MARKERS IN SGC/AGC
28 .GLOBAL SECLEN ; LENGTH OF SECTION GC GUY
30 .GLOBAL SECBLK,DECBLK,GCDEBU,DEBUGC,NDEBUG
31 .GLOBAL FRETOP,PURBOT,PURTOP,GCPDL,LPUR,STRPAG,CKPUR,INPLOD,GETPAG,CURPLN,SGCLBK,PGCNT
32 .GLOBAL LODGC,CKFILE,SLEEPR,KILGC,GETBUF,KILBUF,GPDLOV,GCDIR,INTDIR,GCLDBK
33 .GLOBAL OPBLK,SJFNS,IJFNS,OPSYS,IJFNS1,RBLDM,ILDBLK,TILDBL
37 IMAPCH==0 ; INTERNAL MAPPING CHANNEL
38 MAPCHN==1000,,IMAPCH ; CORBLK CHANNEL
39 FME==1000,,-1 ; BITS FOR CURRENT JOB
40 FLS==1000,,0 ; BITS TO FLUSH A PAGE
41 RDTP==1000,,200000 ; BITS TO MAP IN IN READ-ONLY
43 CRJB==1000,,400001 ; BITS TO ALLOCATE CORE
48 CTREAD==100000 ; READ BIT
49 CTEXEC==20000 ; EXECUTE BIT
50 CTWRIT==40000 ; WRITE BIT
51 CTCW==400 ; COPY ON WRITE
52 SGJF==1 ; USE SHORT JFN (LH FLAG)
53 OLDF==100000 ; REQUIRE OLD (EXISTING FILE) (LH FLAG)
54 FREAD==200000 ; READ BIT FOR OPENF
55 FEXEC==40000 ; EXEC BIT FOR OPENF
58 ; GENERAL MARK ROUTINE FOR TEMPLATE STUFF. GOES TO RIGHT PLACE IN
59 ; WHICHEVER GC'ER WE'RE USING AT THE MOMENT
61 JRST MARK2A ; INTO AGC
62 JRST MARK2S ; INTO SGC
64 ; ROUTINE TO LOAD THE GARBAGE COLLECTOR
69 SKIPE SWAPGC ; SKIP IF SWAPPED GARBAGE COLLECTOR
74 .SUSET [.RSNAM,,SAVSNM] ; SAVE OLD SNAME
75 .SUSET [.SSNAM,,GCDIR] ; SET SNAME TO APP DIR
76 .OPEN IMAPCH,@OPBLK ; OPEN CHANNEL TO FILE
77 PUSHJ P,CKFILE ; SEE IF REALLY LOSING
81 MOVE B,A ; B WILL CONTAIN PTR TO CORE
83 DOTCAL CORBLK,[[RDTP],[FME],B,[MAPCHN],A]
86 SKIPN SWAPGC ; IF SWAP 1 PAGE FOR CORBLK ELSE 3
88 GETIT: DOTCAL CORBLK,[[WRTP],[FME],B,[CRJB]]
91 MOVEI A,LENGC ; SMASH PAGECOUNT
93 MOVEI A,SLENGC+1 ; PSTACK
99 CKFILE: .STATUS IMAPCH,0 ; GET STATUS BITS INTO 0
101 ANDI 0,77 ; AND OF EXTRANEOUS BITS
102 CAIN 0,4 ; SKIP IF NOT FNF
103 FATAL CANT OPEN AGC FILE
105 SLEEPR: MOVEI 0,1 ; SLEEP FOR A WHILE
120 ; HERE TO GET GC JFNS
121 ; GET STRING NAME OF MDL INTERPRETER FILE
122 HRRZ A,IJFNS ; INTERPRETER JFN
123 MOVE B,A ; SET UP FOR JFNS
124 PUSHJ P,TMTNXS ; MAKES A STRING ON P STACK
125 MOVE D,E ; SAVED VALUE OF P STACK
126 HRROI A,1(E) ; STRING FOR RESULT
127 MOVE C,[211000,,1] ; GET "DEV:<DIR>NM1" FROM JFNS
129 MOVE C,A ; SAVE TO REUSE FOR ".SGC"
130 ; GET JFN TO AGC FILE
131 MOVEI B,[ASCIZ /.AGC/]
134 MOVEI B,[ASCIZ /.DEC/]
136 MOVEI B,[ASCIZ /.SEC/]
138 MOVEI B,[ASCIZ /.SGC/]
142 JUMPN .-2 ; COPY ".AGC" INTO STRING
143 HRROI B,1(E) ; GTJFN STRING
144 MOVSI A,SGJF+OLDF ; GTJFN CONTROL BITSS
146 FATAL AGC GARBAGE COLLECTOR IS MISSING
155 JFNIN: MOVE B,[440000,,FREAD+FEXEC]
157 FATAL CANT OPEN AGC FILE
160 MOVEI D,SECLEN+SECLEN-2
162 MOVEI D,LENGC+LENGC-6 ; # OF TENEX PAGES TO GET IT
164 MOVEI D,SLENGC+SLENGC
165 MOVSI A,(A) ; JFN TO LH
166 MOVE B,[MFORK,,PAGEGC+PAGEGC]
167 MOVSI C,CTREAD+CTEXEC
175 MOVEI D,6 ; THESE PAGES WILL BE THE GC PDL
178 MOVEI D,2 ; PDL BUT NO FRONT OR WINDOW
187 MOVEI A,LENGC ; SMASH PAGECOUNT
193 ;ROUTINE TO "SLEEP" FOR A WHILE ON 10X/20X HA HA
198 ; ROUTINE TO LOAD THE INTERPRETER
204 .SUSET [.RSNAME,,SAVSNM]
205 LODIN1: .IOPUS IMAPCH,
206 .SUSET [.SSNAM,,INTDIR]
207 .OPEN IMAPCH,ILDBLK ; OPEN FILE TO INTERPRETER BLOCK
209 HLRE B,TP ; MAKE SURE BIG ENOUGJ
210 MOVNS B ; SEE IF WE WIN
211 CAIGE B,400 ; SKIP IF WINNING
212 FATAL NO ROOM FOR PAGE MAP
216 .IOT IMAPCH,A ; GET IN PAGE MAP
217 MOVEI A,1 ; INITIALIZE FILE PAGE COUNT
218 MOVEI B,0 ; CORE PAGE COUNT
221 JUMPE 0,NOPAG ; IF 0 FORGET IT
222 ADDI A,1 ; AOS FILE MAP
223 NOPAG: ADDI B,1 ; AOS PAGE MAP
224 CAIE B,(D) ; SKIP IF DONE
226 MOVNI 0,(C) ; GET PAGE-COUNT
227 HRL A,0 ; BUILD FILE PAGE POINTER
228 HRL B,0 ; BUILD CORE PAGE POINTER
229 DOTCAL CORBLK,[[RDTP],[FME],B,[MAPCHN],A]
230 PUSHJ P,SLEEPR ; GO TO SLEEP FOR A WHILE
233 .SUSET [.SSNAM,,SAVSNM]
238 MOVEI A,(E) ; FIND OUT LENGTH OF MAP
241 FATAL CANNOT RESET FILE POINTER
243 BIN ; GET LENGTH WORD
244 MOVEI A,(B) ; ISOLATE SIZE OF MAP
246 HLRE B,TP ; MUST BE SPACE FOR CRUFT
249 FATAL NO ROOM FOR PAGE MAP (GULP)
250 PUSH P,C ; SAVE # PAGES WANTED
252 MOVEI A,(E) ; READY TO READ IN MAP
253 MOVEI B,1(TP) ; ONTO TP STACK
258 CAIE 0,1000 ; CHECK FOR TENEX
260 LDB 0,[221100,,(A)] ; GET FORK PAGE
267 TOPS20: HRRZ 0,1(A) ; GET PAGE IN PROCESS
268 LDB B,[331100,,1(A)] ; GET REPT COUNT
269 ADD B,0 ; LAST PAGE IN BLOCK
271 CAIGE B,(D) ; WITHIN RANGE?
280 MOVSI C,CTREAD+CTEXEC ; BITS
287 SOJG D,MPLP ; MAP-EM IN
292 ; ROUTINE TO MAP IN OVER GARBAGE COLLECTOR EXPLICITLY
301 MOVEI D,PAGEGC+PAGEGC
306 ; ROUTINE TO TRY TO ALLOCATE A BUFFER
307 ; 1) IT FIRSTS LOOKS BETWEEN FRETOP AND PURBOT
308 ; 2) LOOKS AT THE INTERPRETER
309 ; A=>NUMBER OF BUFFER PAGES (CURRENTLY ALWAYS 1)
311 ; BUFFER SAVED IN BUFPTR
313 GETBUF: ASH A,10. ; CONVERT TO WORDS
314 MOVE B,PURBOT ; LOOK FOR ROOM IN GCS
316 CAMGE B,A ; SKIP IF WINNING
318 MOVE B,FRETOP ; BUFFER IN B
319 MOVEM B,BUFPTR ; SAVE BUFFER
320 ASH A,-10. ; TO PAGES
321 MOVEM A,BUFLT ; LENGTH OF BUFFER
323 NOBUF1: ASH A,-10. ; BACK TO WORDS
324 SKIPE INPLOD ; SKIP IF NOT IN MAPPUR
334 ASH B,-10. ; CALCULATE AVAILABLE ROOM
335 CAIGE B,(A) ; SEE IF ENOUGH
336 JRST INTBUF ; LOSE LOSE GET BUFFER FROM INTERPRETER
337 IFE ITS, ASH A,1 ; TENEX PAGES
341 PUSHJ P,GETPAG ; GET THOSE PAGES
347 JRST GETBUF ; TRY AGAIN
348 INTBUF: MOVEM A,BUFLT
352 HRRI A,STRPAG ; AOBJN TO PAGE
354 DOTCAL CORBLK,[[FLS],[FME],A]
355 FATAL CANT FLUSH PAGE
356 DOTCAL CORBLK,[[WRTP],[FME],B,[CRJB]]
362 MOVEI C,(A) ; PAGES TO FLUSH
364 MOVNI A,1 ; FLUSH PAGES
365 MOVE B,[MFORK,,STRPAG+STRPAG] ; WHICH ONES
371 MOVEI B,STRBUF ; START OF BUFFER
372 MOVEM B,BUFPTR ; SAVE IN BUFPTR
376 ; ROUTINE TO FLUSH A BUFFER WHEN DONE WITH IT
378 KILBUF: SKIPN B,BUFPTR ; SEE IF BUFPTR EXISTS
380 IFE ITS, JRST @[.+1] ; RUN IN SECTION 0
381 CAIL B,HIBOT ; SKIP IF NOT PART OF INTERPRETER
382 JRST HIBUF ; INTERPRETER
385 MOVN A,BUFLT ; GET LENGTH
386 HRLI B,(A) ; BUILD PAGE AOBJN
387 DOTCAL CORBLK,[[FLS],[FME],B]
388 FATAL CANT FLUSH PAGES
395 LSH D,1 ; TO TENEX PAGES
397 MOVEI C,0 ; C CONTAINS SOME FLAGS
432 ; HERE TO HANDLE GC PDL OVERFLOW. ROUTINE USES A,B AND ASSUMES GCPDL IS THE PDL
434 GPDLOV: HRRZ A,PGCNT ; # OF PAGES TO A
435 ADDI A,PAGEGC ; SEE IF ROOM
437 CAIL A,LPUR ; HAVE WE LOST
438 FATAL NO ROOM FOR GCPDL
440 ASH A,-10. ; GET PAGE NUMBER
442 DOTCAL CORBLK,[[FLS],[FME],A]
443 FATAL CANT FLUSH PAGE
444 DOTCAL CORBLK,[[WRTP],[FME],A,[CRJB]]
453 PUSH P,C ; BETTER HAVE A PDL HERE
461 HRRI A,-2000 ; SMASH PDL
468 GCDIR: SIXBIT /MUDSAV/
469 INTDIR: SIXBIT /MUDSAV/
470 GCLDBK: SIXBIT / &DSK/
472 0 ; FILLED IN BY INITM
474 SGCLBK: SIXBIT / &DSK/
478 ILDBLK: SIXBIT / &DSK/
480 0 ; FILLED IN BY INITM
487 HRRZ A,IJFNS1 ; GET GC JFN
495 BUFPTR: 0 ; POINTER TO CURRENTLY ACTIVE BUFFER (WORD)
496 BUFLT: 0 ; LENGTH OF CURRENTLY ACTIVE BUFFER (PAGES)
497 PGCNT: 0 ; # OF PAGES OF MAPPED OUT INTERPRETER
499 OPBLK: 0 ; BLOCK USED FOR OPEN