Twenex Muddle.
[pdp10-muddle.git] / <mdl.int> / ldgc.mid.100
1 TITLE LOADGC MODULE TO LOAD THE GARBAGE COLLECTOR
2
3 RELOCA
4
5 .INSRT MUDDLE >
6 SYSQ
7 IFE ITS,[
8 .INSRT STENEX >
9 XJRST==JRST 5,
10 ]
11 IFN ITS,        PGSZ==10.
12 IFE ITS,        PGSZ==9.
13
14 ; ROUTINES TO GET THE GC DO PDL OVERFLOWS IN GC AND ALLOCATE SPECIAL
15 ; BUFFERS.
16
17 ; IMPORTANT VARAIBLES
18
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
25
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
29 .GLOBAL MULTSG
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
34 .GLOBAL TMTNXS,C%1
35
36 IFN ITS,[
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
42 WRTP==1000,,100000
43 CRJB==1000,,400001              ; BITS TO ALLOCATE CORE
44 CWRITE==1000,,4000
45 ]
46 IFE ITS,[
47 MFORK==400000
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
56 FTHAW==2000
57 ]
58 ; GENERAL MARK ROUTINE FOR TEMPLATE STUFF.  GOES TO RIGHT PLACE IN
59 ; WHICHEVER GC'ER WE'RE USING AT THE MOMENT
60 MARK2G: SKIPN   SWAPGC
61          JRST   MARK2A  ; INTO AGC
62         JRST    MARK2S  ; INTO SGC
63
64 ; ROUTINE TO LOAD THE GARBAGE COLLECTOR
65
66 LODGC:
67 IFN ITS,[
68         MOVEI   0,GCLDBK
69         SKIPE   SWAPGC                  ; SKIP IF SWAPPED GARBAGE COLLECTOR 
70         MOVEI   0,SGCLBK
71         MOVEM   0,OPBLK
72
73
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
78         HRLZI   A,-LENGC+3
79         SKIPE   SWAPGC
80         HRLZI   A,-SLENGC
81         MOVE    B,A                     ; B WILL CONTAIN PTR TO CORE
82         HRRI    B,PAGEGC
83         DOTCAL  CORBLK,[[RDTP],[FME],B,[MAPCHN],A]
84         PUSHJ   P,SLEEPR
85         HRLI    B,-1
86         SKIPN   SWAPGC                  ; IF SWAP 1 PAGE FOR CORBLK ELSE 3
87         HRLI    B,-3
88 GETIT:  DOTCAL  CORBLK,[[WRTP],[FME],B,[CRJB]]
89         PUSHJ   P,SLEEPR
90         .CLOSE  IMAPCH,
91         MOVEI   A,LENGC                 ; SMASH PAGECOUNT
92         SKIPE   SWAPGC
93         MOVEI   A,SLENGC+1              ; PSTACK
94         MOVEM   A,PGCNT
95         POPJ    P,
96
97 ; SEE WHY OPEN FAILED
98
99 CKFILE: .STATUS IMAPCH,0                ; GET STATUS BITS INTO 0
100         HRLZS   0
101         ANDI    0,77                    ; AND OF EXTRANEOUS BITS
102         CAIN    0,4                     ; SKIP IF NOT FNF
103         FATAL   CANT OPEN AGC FILE
104
105 SLEEPR: MOVEI   0,1                     ; SLEEP FOR A WHILE
106         .SLEEP  
107         SOS     (P)                     ; TRY AGAIN
108         SOS     (P)
109         POPJ    P,                      ; BYE
110 ]
111
112 IFE ITS,[
113         HRRZ    A,IJFNS1
114         SKIPN   MULTSG
115         HLRZ    A,IJFNS
116         SKIPE   SWAPGC
117         HLRZ    A,IJFNS1
118         JUMPN   A,GOTJFN
119         
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
128         JFNS
129         MOVE    C,A                     ; SAVE TO REUSE FOR ".SGC"
130 ; GET JFN TO AGC FILE
131         MOVEI   B,[ASCIZ /.AGC/]
132         SKIPN   MULTSG
133          JRST   .+4
134         MOVEI   B,[ASCIZ /.DEC/]
135         SKIPN   GCDEBU  
136          MOVEI  B,[ASCIZ /.SEC/]
137         SKIPE   SWAPGC
138         MOVEI   B,[ASCIZ /.SGC/]
139         HRLI    B,440700
140         ILDB    B
141         IDPB    A
142         JUMPN   .-2                     ; COPY ".AGC" INTO STRING
143         HRROI   B,1(E)                  ; GTJFN STRING
144         MOVSI   A,SGJF+OLDF             ; GTJFN CONTROL BITSS
145         GTJFN
146          FATAL  AGC GARBAGE COLLECTOR IS MISSING
147         SKIPN   SWAPGC
148          JRST   .+3
149         HRLM    A,IJFNS1
150         JRST    JFNIN
151         SKIPE   MULTSG
152          HRRM   A,IJFNS1
153         SKIPN   MULTSG
154          HRLM   A,IJFNS
155 JFNIN:  MOVE    B,[440000,,FREAD+FEXEC]
156         OPENF
157          FATAL  CANT OPEN AGC FILE
158         MOVE    P,E
159 GOTJFN:
160         MOVEI   D,SECLEN+SECLEN-2
161         SKIPN   MULTSG
162         MOVEI   D,LENGC+LENGC-6         ; # OF TENEX PAGES TO GET IT
163         SKIPE   SWAPGC
164         MOVEI   D,SLENGC+SLENGC
165         MOVSI   A,(A)                   ; JFN TO LH
166         MOVE    B,[MFORK,,PAGEGC+PAGEGC]
167         MOVSI   C,CTREAD+CTEXEC
168
169 LDLP:   PMAP
170         ADDI    A,1
171         ADDI    B,1
172         SOJG    D,LDLP
173
174         MOVEI   C,0
175         MOVEI   D,6             ; THESE PAGES WILL BE THE GC PDL
176         SKIPN   MULTSG
177         SKIPE   SWAPGC
178         MOVEI   D,2             ; PDL BUT NO FRONT OR WINDOW
179         MOVNI   A,1
180
181 LDLP1:  PMAP
182         ADDI    B,1
183         SOJG    D,LDLP1
184
185         MOVEI   A,SECLEN+1
186         SKIPN   MULTSG
187         MOVEI   A,LENGC         ; SMASH PAGECOUNT
188         SKIPE   SWAPGC
189         MOVEI   A,SLENGC+1
190         MOVEM   A,PGCNT
191         POPJ    P,
192
193 ;ROUTINE TO "SLEEP" FOR A WHILE ON 10X/20X  HA HA
194 SLEEPR: SOS     (P)
195         POPJ    P,
196 ]
197
198 ; ROUTINE TO LOAD THE INTERPRETER
199 ; C=>LENGTH OF PAGES
200 ; D=>START OF PAGES
201
202 LODINT:
203 IFN ITS,[
204         .SUSET  [.RSNAME,,SAVSNM]
205 LODIN1: .IOPUS  IMAPCH,
206         .SUSET  [.SSNAM,,INTDIR]
207         .OPEN   IMAPCH,ILDBLK           ; OPEN FILE TO INTERPRETER BLOCK
208         PUSHJ   P,CKFILE
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
213         MOVSI   A,-400
214         HRRI    A,1(TP)
215         .ACCES  IMAPCH,C%1
216         .IOT    IMAPCH,A                ; GET IN PAGE MAP
217         MOVEI   A,1                     ; INITIALIZE FILE PAGE COUNT
218         MOVEI   B,0                     ; CORE PAGE COUNT
219         MOVEI   E,1(TP)
220 LOPFND: HRRZ    0,(E)
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
225         AOJA    E,LOPFND
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
231         .CLOSE  IMAPCH,
232         .IOPOP  IMAPCH,
233         .SUSET  [.SSNAM,,SAVSNM]
234         POPJ    P,                      ; DONE
235 ]
236 IFE ITS,[
237         HRRZ    E,IJFNS
238         MOVEI   A,(E)                   ; FIND OUT LENGTH OF MAP
239         MOVEI   B,0
240         SFPTR
241         FATAL   CANNOT RESET FILE POINTER
242         MOVEI   A,(E)
243         BIN                             ; GET LENGTH WORD
244         MOVEI   A,(B)                   ; ISOLATE SIZE OF MAP
245         HLRZ    0,B
246         HLRE    B,TP                    ; MUST BE SPACE FOR CRUFT
247         MOVNS   B
248         CAIGE   B,(A)                   ; ROOM?
249         FATAL   NO ROOM FOR PAGE MAP (GULP)
250         PUSH    P,C                     ; SAVE # PAGES WANTED
251         MOVN    C,A
252         MOVEI   A,(E)                   ; READY TO READ IN MAP
253         MOVEI   B,1(TP)                 ; ONTO TP STACK
254         HRLI    B,444400
255         SIN                             ; SNARF IT IN
256
257         MOVEI   A,1(TP)
258         CAIE    0,1000                  ; CHECK FOR TENEX
259         JRST    TOPS20
260         LDB     0,[221100,,(A)]         ; GET FORK PAGE
261         CAIE    0,(D)                   ; GOT IT?
262         AOJA    A,.-2
263         HRRZ    A,(A)
264         JRST    GOTPG
265
266 TOPS21: ADDI    A,2
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
270         CAIG    0,(D)
271         CAIGE   B,(D)                   ; WITHIN RANGE?
272         JRST    TOPS21
273         SUBM    D,0
274         HRRZ    A,(A)
275         ADD     A,0
276
277 GOTPG:  HRLI    A,(E)
278         MOVEI   B,(D)
279         HRLI    B,MFORK
280         MOVSI   C,CTREAD+CTEXEC         ; BITS
281         POP     P,D                     ; PAGES
282         ASH     D,1                     ; FOR TENEX
283
284 MPLP:   PMAP
285         ADDI    A,1
286         ADDI    B,1
287         SOJG    D,MPLP                  ; MAP-EM IN
288
289         POPJ    P,
290 ]
291
292 ; ROUTINE TO MAP IN OVER GARBAGE COLLECTOR EXPLICITLY
293
294 KILGC:
295 IFN ITS,[
296         MOVEI   D,PAGEGC
297         MOVE    C,PGCNT
298         JRST    LODIN1
299 ]
300 IFE ITS,[
301         MOVEI   D,PAGEGC+PAGEGC
302         MOVE    C,PGCNT
303         JRST    LODINT
304 ]
305
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)
310 ; B=>BUFFER
311 ; BUFFER SAVED IN BUFPTR
312
313 GETBUF: ASH     A,10.                   ; CONVERT TO WORDS
314         MOVE    B,PURBOT                ; LOOK FOR ROOM IN GCS
315         SUB     B,FRETOP
316         CAMGE   B,A                     ; SKIP IF WINNING
317         JRST    NOBUF1
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
322         POPJ    P,
323 NOBUF1: ASH     A,-10.                  ; BACK TO WORDS
324         SKIPE   INPLOD                  ; SKIP IF NOT IN MAPPUR
325         JRST    INTBUF
326         PUSH    P,A
327         PUSH    P,E
328         JSP     E,CKPUR
329         POP     P,E
330         POP     P,A
331         MOVE    B,PURTOP
332         SUB     B,PURBOT
333         SUB     B,CURPLN
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
338         PUSH    P,C
339         PUSH    P,D
340         PUSH    P,E
341         PUSHJ   P,GETPAG                ; GET THOSE PAGES
342         FATAL   GETPAG FAILED
343         POP     P,E
344         POP     P,D
345         POP     P,C
346 IFE ITS,        ASH     A,-1
347         JRST    GETBUF                  ; TRY AGAIN
348 INTBUF: MOVEM   A,BUFLT
349 IFN ITS,[
350         MOVNS   A                       ; NEGATE
351         HRLZS   A                       ; SWAP
352         HRRI    A,STRPAG                ; AOBJN TO PAGE
353         MOVE    B,A
354         DOTCAL  CORBLK,[[FLS],[FME],A]
355         FATAL   CANT FLUSH PAGE
356         DOTCAL  CORBLK,[[WRTP],[FME],B,[CRJB]]
357         PUSHJ   P,SLEEPR
358 ]
359
360 IFE ITS,[
361         PUSH    P,C
362         MOVEI   C,(A)           ; PAGES TO FLUSH
363         ASH     C,1
364         MOVNI   A,1                     ; FLUSH PAGES
365         MOVE    B,[MFORK,,STRPAG+STRPAG]        ; WHICH ONES
366 FLSLP:  PMAP
367         ADDI    B,1
368         SOJG    C,FLSLP
369         POP     P,C
370 ]
371         MOVEI   B,STRBUF                ; START OF BUFFER
372         MOVEM   B,BUFPTR                ; SAVE IN BUFPTR
373         PUSHJ   P,RBLDM
374         POPJ    P,
375
376 ; ROUTINE TO FLUSH A BUFFER WHEN DONE WITH IT
377
378 KILBUF: SKIPN   B,BUFPTR                ; SEE IF BUFPTR EXISTS
379         POPJ    P,
380 IFE ITS,        JRST    @[.+1]          ; RUN IN SECTION 0
381         CAIL    B,HIBOT                 ; SKIP IF NOT PART OF INTERPRETER
382         JRST    HIBUF                   ; INTERPRETER
383 IFN ITS,[
384         ASH     B,-10.
385         MOVN    A,BUFLT                 ; GET LENGTH
386         HRLI    B,(A)                   ; BUILD PAGE AOBJN
387         DOTCAL  CORBLK,[[FLS],[FME],B]
388         FATAL   CANT FLUSH PAGES
389 ]
390 IFE ITS,[
391         ASH     B,-9.                   ; TO PAGES
392         HRLI    B,MFORK
393         MOVNI   A,1
394         MOVE    D,BUFLT
395         LSH     D,1                     ; TO TENEX PAGES
396         PUSH    P,C                     ; SAVE C
397         MOVEI   C,0                     ; C CONTAINS SOME FLAGS
398
399 FLSLP1: PMAP
400         ADDI    B,1
401         SOJG    D,FLSLP1
402
403         POP     P,C                     ; RESTORE C
404 ]
405
406 FLEXIT: SETZM   BUFPTR
407         SETZM   BUFLT
408 IFE ITS,[
409         PUSH    P,A
410         HLRZ    A,SJFNS
411         JUMPE   A,.+3
412         CLOSF
413          JFCL
414         SETZM   SJFNS
415         POP     P,A
416         SKIPN   MULTSG
417          POPJ   P,
418         POP     P,21
419         SETZM   20
420         XJRST   20
421 ]
422 IFN ITS,[
423         POPJ    P,
424 ]
425 HIBUF:  MOVE    C,BUFLT
426         MOVE    D,BUFPTR
427 IFN ITS,        ASH     D,-10.
428 IFE ITS,        ASH     D,-9.
429         PUSHJ   P,LODINT
430         JRST    FLEXIT
431
432 ; HERE TO HANDLE GC PDL OVERFLOW. ROUTINE USES A,B AND ASSUMES GCPDL IS THE PDL
433
434 GPDLOV: HRRZ    A,PGCNT                 ; # OF PAGES TO A
435         ADDI    A,PAGEGC                ; SEE IF ROOM
436         ASH     A,10.                   ; TO WORDS
437         CAIL    A,LPUR                  ; HAVE WE LOST
438         FATAL   NO ROOM FOR GCPDL
439 IFN ITS,[
440         ASH     A,-10.                  ; GET PAGE NUMBER
441         AOS     PGCNT                   ; AOS
442         DOTCAL  CORBLK,[[FLS],[FME],A]
443         FATAL   CANT FLUSH PAGE
444         DOTCAL  CORBLK,[[WRTP],[FME],A,[CRJB]]
445         PUSHJ   P,SLEEPR
446 ]
447 IFE ITS,[
448         ASH     A,-9.
449         AOS     PGCNT
450         MOVE    B,A
451         MOVNI   A,1
452         HRLI    B,MFORK
453         PUSH    P,C                     ; BETTER HAVE A PDL HERE
454         MOVEI   C,0
455         PMAP
456         ADDI    B,1
457         PMAP
458         POP     P,C
459         
460 ]
461         HRRI    A,-2000                 ; SMASH PDL
462         HRLM    A,GCPDL
463         POPJ    P,                      ; EXIT
464
465 IFN ITS,[
466
467
468 GCDIR:  SIXBIT /MUDSAV/
469 INTDIR: SIXBIT /MUDSAV/
470 GCLDBK: SIXBIT /  &DSK/
471         SIXBIT /AGC/
472         0                       ; FILLED IN BY INITM
473
474 SGCLBK: SIXBIT /  &DSK/
475         SIXBIT /SGC/
476         0
477
478 ILDBLK: SIXBIT /  &DSK/
479         SIXBIT /TS/
480         0                       ; FILLED IN BY INITM
481 ]
482
483
484 NDEBUG: SETZM   GCDEBU
485         CAIA
486 DEBUGC: SETOM   GCDEBU
487         HRRZ    A,IJFNS1        ; GET GC JFN
488         SKIPE   A
489         CLOSF
490         JFCL
491         POPJ    P,
492
493 IMPURE
494 GCDEBU: 0
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
498 SAVSNM: 0
499 OPBLK:  0                       ; BLOCK USED FOR OPEN
500
501 PURE
502
503 END
504 \f