2 TITLE SECAGC MUDDLE GARBAGE COLLECTOR FOR MULTI SECTIONS
4 ;SYSTEM WIDE DEFINITIONS GO HERE
11 .GLOBAL SHRRM,SHRLM,SMOVEM,SSETZM,SXBLT,SHLRZ
12 .GLOBAL RCL,VECTOP,GCSTOP,GCSBOT,FRETOP,GCSNEW,VECBOT,PARTOP,PARBOT,HITOP,HIBOT,GETPAG
13 .GLOBAL PDLBUF,PDLEX,PDLEXP,GCFLG,GCPDL,GETNUM,PARNEW,MOVPUR,RCLV,RCLVEC,PGCNT
14 .GLOBAL PGROW,TPGROW,MAINPR,%SLEEP,MSGTYP,PURTOP,PURBOT,STOSTR,GCSET,CKPUR
15 .GLOBAL MTYI,UPLO,FRMUNG,BYTDOP,GLOBSP,FREDIF,FREMIN,GCHAPN,INTFLG,FINAGC,NGCS,INQAGC
16 .GLOBAL SAT,TTOCHN,TYPVEC,ICONS,INCONS,IBLOCK,IEUVEC,IEVECTI,CELL2,MKTBS,RLENGC
17 .GLOBAL GIBLOK,REHASH,IBLOK1,IILIST,IIFORM,CIVEC,CIUVEC,CICONS,CPOPJ,RBLDM
18 .GLOBAL SPBASE,OUTRNG,CISTNG,CBYTES,%RUNAM,PURVEC,GCDOWN,N.CHNS,CHNL1,PLODR
19 .GLOBAL CAFRE,CAFRET,STOGC,GCHN,WNDP,FRNP,FRONT,%GCJOB,%SHWND,%INFMP,%GETIP,CHKPGI
20 .GLOBAL TD.PUT,TD.GET,TD.AGC,TD.AGC,TD.LNT,GLOTOP,UBIT,FLGSET,PURMNG,RPURBT,%IFMP2
21 .GLOBAL CTIME,IMTYO,ILOC,NODES,GPURFL,GCDANG,GCHACK,LPUR,HITOP,BADCHN,IMPURX,PURCLN
22 .GLOBAL GCTIM,GCCAUS,GCCALL,IAAGC,LVLINC,STORIC,GVLINC,TYPIC,GCRSET,ACCESS,NOSHUF,SQUPNT
23 ; GLOBALS ASSOCIATE WITH THE ASSOCIATION VECTOR
25 .GLOBAL ASOVEC,ASOLNT,ITEM,INDIC,VAL,NWORDT,NODPNT,PNTRS,DSTORE,HASHTB
26 .GLOBAL CELL,BINDID,GCFLCH,TYPBOT,GLOBAS,TPBASE,NOWLVL,CURPLN,PVSTOR,SPSTOR
27 .GLOBAL ISECGC,SECLEN,RSECLE
28 .GLOBAL P.TOP,P.CORE,PMAPB,IGET,CIGTPR,ROOT,STBL,CAFREE,%MPIN1,%PURIF,%MPINX,GCHK10
29 .GLOBAL %SAVRP,%RSTRP,LENGC,AGCLD,PAGEGC,REALGC
30 .GLOBAL %MPINT,%GBINT,%CLSMP,%CLSM1,PINIT,PGFIND,NPRFLG
31 .GLOBAL GCKNUM,CORTOP,GCHPN,INTAGC,WNDP,WNDBOT,BUFGC,WIND,GCDFLG,SAVM,AGC,GCSET
35 NOPAGS==1 ; NUMBER OF WINDOWS
38 NTPMAX==20000 ; NORMAL MAX TP SIZE
39 NTPGOO==4000 ; NORMAL GOOD TP
40 ETPMAX==2000 ; TPMAX IN AN EMERGENCY (I.E. GC RECALL)
41 ETPGOO==2000 ; GOOD TP IN EMERGENCY
44 GCHN==0 ; CHANNEL FOR FUNNNY INFERIOR
45 STATNO==19. ; # OF STATISTICS FOR BLOAT-STAT
46 STATGC==8. ; # OF GC-STATISTICS FOR BLOAT-STAT
49 LOC REALGC+RLENGC+RSLENG
59 F==E+1 ; THESE 3 ACS OFTEN USED FOR XBLT
63 TYPNT==FPTR+1 ; SPECIAL AC USAGE DURING GC
64 EXTAC==TYPNT+1 ; ALSO SPECIAL DURING GC
65 LPVP==EXTAC+1 ; SPECIAL FOR GC, HOLDS POINTER TO PROCESS
87 DEFINE TBLADD LCN,\FOO
95 RMT [XBLT==123000,,%XXBLT
102 ;SET FLAG FOR INTERRUPT HANDLER
103 SETZB M,RCL ; CLEAR OUT RECYCLE LIST CELLS, AND RSUBR BASE
105 EXCH P,GCPDL ; IN CASE CURRENT PDL LOSES
110 ; HERE TO CLEAN UP ANY POSSIBLE PURENESS IN GC SPACE BEFORE COLLECTING
113 ADD A,GCSTOP ; ADJUSTMENT TO KEEP FREE REAL
116 MOVE A,NOWP ; ADJUSTMENTS FOR STACKS
123 MOVEI B,[ASCIZ /SGIN /]
124 SKIPE GCMONF ; MONITORING
126 NOMON1: HRRZ C,(P) ; GET CAUSE OF GC INDICATOR
127 MOVE B,GCNO(C) ; ADD 1 TO COUNT OF GC'S CAUSED BY GIVEN REASON
130 MOVEM C,GCCAUS ; SAVE CAUSE OF GC
131 SKIPN GCMONF ; MONITORING
133 MOVE B,MSGGCT(C) ; GET CAUSE MESSAGE
135 NOMON2: HLRZ C,(P) ; FIND OUT WHO CAUSED THE GC
136 MOVEM C,GCCALL ; SAVE CALLER OF GC
137 SKIPN GCMONF ; MONITORING
141 NOMON3: ADJSP P,-1 ; POP OFF C
145 HLLZS SQUPNT ; FLUSH SQUOZE TABLE
151 IRP AC,,[0,A,B,C,D,E,P,R,M,SP,TP,TB,AB,TVP,FRM]
152 MOVEM AC,AC!STO"+1(PVP)
156 MOVEM 0,PVPSTO+1(PVP)
160 JSP E,CKPUR ; CHECK FOR PURE RSUBR
162 ;SET UP E TO POINT TO TYPE VECTOR
168 HRLI TYPNT,400000+B ; LOCAL INDEX
170 CHPDL: MOVE D,P ; SAVE FOR LATER
171 CORGET: MOVE P,[GCSEG,,MRKPDL] ; USE GCSEG FOR PDL
173 ;FENCE POST PDLS AND CHECK IF ANY SHOULD BE SHRUNK
175 HRRZ A,TB ;POINT TO CURRENT FRAME IN PROCESS
176 PUSHJ P,FRMUNG ;AND MUNG IT
177 MOVE A,TP ;THEN TEMPORARY PDL
180 MOVE A,PSTO+1(PVP) ;AND UNMARKED P STACK
183 \f; FIRST CREATE INFERIOR TO HOLD NEW PAGES
185 INFCRT: MOVE A,PARBOT ; GENERATE NEW PARBOT AND PARNEW
188 ANDCMI A,1777 ; EVEN PAGE BOUNDARY
193 ; NOW ZERO OUT NEW SPACE USING XBLT
195 ; DOMULT [SETZM (FPTR)]
197 ; SUBI 0,(FPTR) ; FROM VECBOT UP
203 ; USE PMAP TO FLUSH GC SPACE PAGES
206 MOVE B,[MFORK,,GCSEG_9.]
210 ;MARK PHASE: MARK ALL LISTS AND VECTORS
211 ;POINTED TO WITH ONE BIT IN SIGN BIT
212 ;START AT TRANSFER VECTOR
213 NOMAP: MOVE A,GLOBSP+1 ; GET GLOBSP TO SAVE
215 MOVE A,ASOVEC+1 ; ALSO SAVE FOR USE BY GC
217 MOVE A,NODES+1 ; SAVE FOR ASSOCIATION UPDATE AND MOVEMENT
220 MOVE A,GLOTOP+1 ; GET GLOTOP FOR LOCR HACKS
222 MOVE A,PURVEC+1 ; SAVE PURE VECTOR FOR GETPAG
227 SETZ LPVP, ;CLEAR NUMBER OF PAIRS
228 MOVE 0,NGCS ; SEE IF NEED HAIR
230 MOVEM 0,GCHAIR ; RESUME COUNTING
231 MOVSI D,400000 ;SIGN BIT FOR MARKING
232 MOVE A,ASOVEC+1 ;MARK ASSOC. VECTOR NOW
233 PUSHJ P,PRMRK ; PRE-MARK
240 MOVE A,IMQUOTE THIS-PROCESS
246 ; HAIR TO DO AUTO CHANNEL CLOSE
248 MOVEI 0,N.CHNS-1 ; NUMBER OF CHANNELS
249 MOVEI A,CHNL1 ; 1ST SLOT
251 SKIPE 1(A) ; NOW A CHANNEL?
252 SETZM (A) ; DON'T MARK AS CHANNELS
258 MOVE A,PVSTOR+1 ; MARK MAIN PROCES EVEN IF SWAPPED OUT
262 MOVE A,MAINPR ; MARK MAIN PROCES EVEN IF SWAPPED OUT
264 MOVEM A,MAINPR ; ADJUST PTR
266 ; ASSOCIATION AND VALUE FLUSHING PHASE
268 SKIPN GCHAIR ; ONLY IF HAIR
272 PUSHJ P,ATCLEA ; CLEAN UP ATOM TABLE
274 SKIPE GCHAIR ; IF NOT HAIR, DO CHANNELS NOW
277 PUSHJ P,ASSOUP ; UPDATE AND MOVE ASSOCIATIONS
278 PUSHJ P,CHFIX ; SEND OUT CHANNELS AND MARK LOSERS
279 PUSHJ P,STOGC ; FIX UP FROZEN WORLD
280 MOVE P,GCPDL ; SWITCH PDLS IN CASE THIS ONE DISSAPPEARS
282 MOVE A,NPARBO ; UPDATE GCSBOT
286 MOVEM A,PURVEC+1 ; RESTORE PURVEC
287 PUSHJ P,CORADJ ; ADJUST CORE SIZE
293 ; MOVE NEW GC SPACE IN
304 ; NOW REHASH THE ASSOCIATIONS BASED ON VALUES
305 GARZR1: PUSHJ P,REHASH
311 MOVEI B,[ASCIZ /GOUT /]
313 NOMONO: MOVE PVP,PVSTOR+1
314 IRP AC,,[0,A,B,C,D,E,P,R,M,SP,TP,TB,AB,TVP,FRM]
315 MOVE AC,AC!STO+1(PVP)
319 MOVE PVP,PVPSTO+1(PVP)
321 ; CLOSING ROUTINE FOR G-C
327 MOVE A,FRETOP ; ADJUST BLOAT-STAT PARAMETERS
330 PUSHJ P,GCSET ; FIX UP BLOAT-STAT PARAMETERS
337 FSBR B,GCTIM ; GET TIME ELAPSED
338 MOVEM B,GCTIM ; SAVE ELAPSED TIME FOR INT-HANDLER
339 SKIPN GCMONF ; SEE IF MONITORING
341 PUSHJ P,FIXSEN ; OUTPUT TIME
342 MOVEI A,15 ; OUTPUT C/R LINE-FEED
346 GCCONT: MOVE C,[NTPGOO,,NTPMAX] ; MAY FIX UP TP PARAMS TO ENCOURAGE
347 ; SHRINKAGE FOR EXTRA ROOM
349 MOVE C,[ETPGOO,,ETPMAX]
352 POP P,D ; RESTORE AC'C
357 JUMPE A,AGCWIN ; IF ZERO THE GC WORKED
358 SKIPN GCHAIR ; SEE IF HAIRY GC
360 REAGCX: MOVEI A,1 ; PREPARE FOR A HAIRY GC
363 MOVE C,[11,,10.] ; REASON FOR GC
368 FATAL AGC--NO CORE AVAILABLE TO SATISFY REQUESTS
371 AGCWIN: SETZM PARNEW ;CLEAR FOR NEXT AGC CALL
372 SETZM GETNUM ;ALSO CLEAR THIS
376 SETZM PGROW ; CLEAR GROWTH
378 SETOM GCHAPN ; INDICATE A GC HAS HAPPENED
380 SETOM INTFLG ; AND REQUEST AN INTERRUPT
384 JUMPN M,FINAGC ; IF M 0, RUNNING RSUBR SWAPPED OUT
385 SKIPE PLODR ; IF LOADING ONE, IT MIGHT NOT HAVE ARRIVED
388 FATAL AGC--RUNNING RSUBR WENT AWAY
390 AGCE1: FATAL AGC--TYPE VECTOR NOT OF TYPE VECTOR
392 \f; CORE ADJUSTMENT PHASE
394 CORADJ: MOVE A,PURTOP
395 SUB A,CURPLN ; ADJUST FOR RSUBR
397 HRRZ A,FPTR ; NEW GCSTOP
398 ADDI A,1777 ; GCPDL AND ROUND
399 ANDCMI A,1777 ; TO PAGE BOUNDRY
400 MOVEM A,CORTOP ; TAKE CARE OF POSSIBLE LATER LOSSAGE
401 CAMLE A,RPTOP ; SEE IF WE CAN MAP THE WORLD BACK IN
402 FATAL AGC--UNABLE TO MAP GC-SPACE INTO CORE
403 CAMG A,PURBOT ; SEE IF WE HAVE TO PUNT SOME PURE TO DO IT
404 JRST CORAD0 ; DON'T HAVE TO PUNT SOME PURE
405 PUSHJ P,MAPOUT ; GET THE CORE
406 FATAL AGC--PAGES NOT AVAILABLE
408 ; NOW THAT WE ARE ABLE TO MAP TO GCS INTO CORE WE WILL TRY TO HONOR SOME REQUESTS
409 ; FIRST LETS SEE IF WE HAVE TO CORE DOWN.
410 ; GCDOWN IS DEFINED AS AMOUNT FROM FRETOP TO PURBOT NEEDED
412 CORAD0: SKIPN B,GCDOWN ; CORE DOWN?
413 JRST CORAD1 ; NO, LETS GET CORE REQUIREMENTS
414 ADDI A,(B) ; AMOUNT+ONE FREE BLOCK
415 CAMGE A,RPTOP ; CAN WE WIN
416 JRST CORAD3 ; POSSIBLY
418 ; THIS IS A EXIT FOR LOSSAGE WITHOUT A FATAL ERROR
419 CORAD2: SETOM GCDANG ; INDICATE LOSSAGE
421 ; CALCULATE PARAMETERS BEFORE LEAVING
422 CORAD6: MOVE A,PURSVT ; GET PURE TABLE
423 PUSHJ P,SPCOUT ; OUT IT GOES IN CASE IT WAS CHANGED
426 MOVE A,CORTOP ; ADJUST CORE IMAGE
427 ASH A,-10. ; TO PAGES
428 TRYPCO: PUSHJ P,P.CORE
430 MOVE A,CORTOP ; GET IT BACK
437 ; TRIES TO SATISFY REQUEST FOR CORE
438 CORAD1: MOVEM A,CORTOP
440 ADD A,GETNUM ; ADD MINIMUM CORE NEEDED
441 ADDI A,1777 ; ONE BLOCK+ROUND
442 ANDCMI A,1777 ; TO BLOCK BOUNDRY
443 CAMLE A,RPTOP ; CAN WE WIN
446 JRST CORAD7 ; DON'T HAVE TO MAP OUT PURE
450 ; NOW TRY TO GET SLOP SPACE. NOT NECESSARY BUT NICE
451 CORAD7: MOVEM A,CORTOP ; STORE POSSIBLE VALUE
452 MOVE B,RPTOP ; GET REAL PURTOP
453 SUB B,PURMIN ; KEEP PURMIN
454 CAMG B,CORTOP ; SEE IF CORTOP IS ALREADY HIGH
455 MOVE B,CORTOP ; DONT GIVE BACK WHAT WE GOT
456 MOVEM B,RPTOP ; FOOL CORE HACKING
458 ANDCMI A,1777 ; TO PAGE BOUNDRY
459 CAMGE A,RPTOP ; DO WE WIN TOTALLY
461 MOVE A,RPTOP ; GET AS MUCH CORE AS POSSIBLE
463 JRST CORAD6 ; LOSE, BUT YOU CAN'T HAVE EVERYTHING
464 CORAD4: CAMG A,PURBOT ; DO WE HAVE TO PUNT SOME PURE
466 PUSHJ P,MAPOUT ; GET IT
468 MOVEM A,CORTOP ; ADJUST PARAMETER
469 JRST CORAD6 ; WIN TOTALLY
470 CORAD8: MOVEM A,CORTOP ; NEW CORTOP
473 ; WE CAN CORE DOWN NOW TO SEE IF WE CAN GET SOME SLOP SPACE
477 CAMGE A,PURBOT ; CAN WE WIN
480 CORAD9: SUB A,GCDOWN ; SATISFY GCDOWN REQUEST
481 JRST CORAD4 ; GO CHECK ALLOCATION
483 MAPOUT: PUSH P,A ; SAVE A
484 SUB A,P.TOP ; AMOUNT TO GET
486 ANDCMI A,1777 ; TO PAGE BOUNDRY
487 ASH A,-PGSZ ; TO PAGES
488 PUSHJ P,GETPAG ; GET THEN
489 JRST MAPLOS ; LOSSAGE
490 AOS -1(P) ; INDICATE WINNAGE
496 \f; CONVERSION FROM FLOAT TO DECIMAL. X 100 AND SEND OUT WITH APPROPRIATELY PLACED DECIMAL
499 FIXSEN: PUSH P,B ; SAVE TIME
500 MOVEI B,[ASCIZ /TIME= /]
501 PUSHJ P,MSGTYP ; PRINT OUT MESSAGE
503 FMPRI B,(100.0) ; CONVERT TO FIX
507 MOVEI A,1 ; INITIALIZE COUNT OF CHARACTERS FOR PUTTING OUT TIME
509 IDIVI C,10. ; START COUNTING
513 CAIN A,1 ; SEE IF THERE IS ONLY ONE CHARACTER
515 FIXOUT: IDIVI C,10. ; RECOVER NUMBER
520 CAIN A,2 ; DECIMAL POINT HERE?
522 FIX1: HLRZ A,(P)-1 ; GET NUMBER
523 ADDI A,60 ; MAKE IT A CHARACTER
524 PUSHJ P,IMTYO ; OUT IT GOES
530 DOT1: MOVEI A,". ; OUTPUT DECIMAL POINT AND PADDING 0
534 JRST FIXOUT ; CONTINUE
535 DOT2: MOVEI A,". ; OUTPUT DECIMAL POINT
540 \f; SUBROUTINE TO CHECK SIZE OF PDLS AND DO FENCEPOSTING
542 PDLCHK: JUMPGE A,CPOPJ
543 HLRE B,A ;GET NEGATIVE COUNT
544 MOVE C,A ;SAVE A COPY OF PDL POINTER
545 SUBI A,-1(B) ;LOCATE DOPE WORD PAIR
546 HRRZS A ; ISOLATE POINTER
547 CAME A,TPGROW ;GROWING?
548 ADDI A,PDLBUF ;NO, POINT TO REAL DOPE WORD
552 SETOM 1(C) ; START FENECE POST
555 MOVSI D,1(C) ;YES, SET UP TO BLT FENCE POSTS
557 BLT D,-2(A) ;FENCE POST ALL EXCEPT DOPE WORDS
560 NOFENC: CAMG B,TPMAX ;NOW CHECK SIZE
562 JRST MUNGTP ;TOO BIG OR TOO SMALL
565 MUNGTP: SUB B,TPGOOD ;FIND DELTA TP
566 MUNG3: MOVE C,-1(A) ;IS GROWTH ALREADY SPECIFIED
567 TRNE C,777000 ;SKIP IF NOT
568 POPJ P, ;ASSUME GROWTH GIVEN WILL WIN
570 ASH B,-6 ;CONVERT TO NUMBER OF BLOCKS
572 CAILE B,377 ; SKIP IF BELOW MAX
573 MOVEI B,377 ; ELSE USE MAX
574 TRO B,400 ;TURN ON SHRINK BIT
578 MUNGT2: DPB B,[TOPGRO,,-1(A)] ;STORE IN DOPE WORD
581 ; CHECK UNMARKED STACK (NO NEED TO FENCE POST)
583 PDLCHP: HLRE B,A ;-LENGTH TO B
585 SUBI A,-1(B) ;POINT TO DOPE WORD
586 HRRZS A ;ISOLATE POINTER
587 CAME A,PGROW ;GROWING?
588 ADDI A,PDLBUF ;NO, POINT TO REAL DOPE WORD
592 SETOM 1(C) ; START FENECE POST
599 NOPF: CAMG B,PMAX ;TOO BIG?
600 CAMG B,PMIN ;OR TOO LITTLE
601 JRST .+2 ;YES, MUNG IT
607 ; ROUTINE TO PRE MARK SPECIAL HACKS
609 PRMRK: SKIPE GCHAIR ; FLUSH IF NO HAIR
612 SUBI A,(B) ;POINT TO DOPE WORD
613 HLRZ EXTAC,1(A) ; GET LNTH
614 LDB 0,[TOPGRO,,(A)] ; GET GROWTHS
615 TRZE 0,400 ; SIGN HACK
625 HRRM 0,1(A) ; NEW RELOCATION FIELD
626 IORM D,1(A) ;AND MARK
630 \f;GENERAL MARK SUBROUTINE. CALLED TO MARK ALL THINGS
631 ; A/ GOODIE TO MARK FROM
632 ; B/ TYPE OF A (IN RH)
633 ; C/ TYPE,DATUM PAIR POINTER
636 MARK2: HLRZ B,(C) ;GET TYPE
637 MARK1: MOVE A,1(C) ;GET GOODIE
638 MARK: JUMPE A,CPOPJ ; NEVER MARK 0
644 ANDI B,TYPMSK ; FLUSH MONITORS
645 LSH B,1 ;TIMES 2 TO GET SAT
646 HRRZ B,@TYPNT ;GET SAT
649 CAILE B,NUMSAT ; SKIP IF TEMPLATE DATA
657 TBLDIS DUM2,GCRET,[[S2WORD,PAIRMK],[S2DEFR,DEFMK],[SNWORD,VECTMK],[STBASE,TBMK]
658 [STPSTK,TPMK],[SARGS,ARGMK],[S2NWORD,VECTMK],[SPSTK,TPMK],[SSTORE,VECTMK]
659 [SFRAME,FRMK],[SBYTE,BYTMK],[SATOM,ATOMK],[SPVP,VECTMK],[SGATOM,GATOMK]
660 [SLOCID,LOCMK],[SCHSTR,BYTMK],[SASOC,ASMRK],[SLOCL,PAIRMK],[SABASE,ABMK]
661 [SLOCA,ARGMK],[SLOCV,VECTMK],[SLOCU,VECTMK],[SLOCS,BYTMK],[SLOCN,ASMRK]
662 [SLOCR,LOCRMK],[SRDTB,GCRDMK],[SLOCB,BYTMK],[SDEFQ,DEFQMK],[SOFFS,OFFSMK]]NUMSAT,400000
666 ; HERE TO MARK A POSSIBLE DEFER POINTER
668 DEFQMK: GETYP B,(A) ; GET ITS TYPE
671 ANDI B,SATMSK ; AND TO SAT
674 ;HERE TO MARK THAT WHICH IS POINTED TO BY A DEFERRED POINTER
676 DEFMK: SETOM GENFLG ; SET FLAG SAYING DEFERRED
679 ;HERE TO MARK LIST ELEMENTS
681 PAIRMK: SETZM GENFLG ;TURN OF DEFER BIT
682 PUSH P,[0] ; WILL HOLD BACK PNTR
683 MOVEI C,(A) ; POINT TO LIST
684 PAIRM1: CAMGE C,PARTOP ;CHECK FOR BEING IN BOUNDS
686 FATAL AGC--MARKED PAIR OUTSIDE PAIR SPACE
687 SKIPGE B,(C) ;SKIP IF NOT MARKED
688 JRST RETNEW ;ALREADY MARKED, RETURN
690 DOMULT [MOVEM B,(FPTR)]
692 DOMULT [MOVEM 0,1(FPTR)]
693 ADDI FPTR,2 ; MOVE ALONG IN NEW SPACE
695 PAIRM2: MOVEI A,-2(FPTR) ; GET INF ADDR
696 HRRM A,(C) ; LEAVE A POINTER TO NEW HOME
697 HRRZ E,(P) ; GET BACK POINTER
698 JUMPE E,PAIRM7 ; 1ST ONE, NEW FIXUP
700 DOMULT [HRRM A,(E)] ; CLOBBER
701 PAIRM4: MOVEM A,(P) ; NEW BACK POINTER
703 JRST DEFDO ;GO HANDLE DEFERRED POINTER
704 HRLM B,(P) ; SAVE OLD CDR
705 PUSHJ P,MARK2 ;MARK THIS DATUM
706 HRRZ E,(P) ; SMASH CAR IN CASE CHANGED
708 DOMULT [MOVEM A,1(E)]
709 HLRZ C,(P) ;GET CDR OF LIST
710 CAIGE C,@PURBOT ; SKIP IF PURE (I.E. DONT MARK)
711 JUMPN C,PAIRM1 ;IF NOT NIL, MARK IT
714 GCRET: SETZM GENFLG ;FOR PAIRMKS BENEFIT
715 POP P,A ;RESTORE C AND A
717 POPJ P, ;AND RETURN TO CALLER
719 GCRETD: ANDI B,TYPMSK ; TURN OFF MONITORS
720 CAIN B,TLOCR ; SEE IF A LOCR
724 ;HERE TO MARK DEFERRED POINTER
726 DEFDO: PUSH P,B ; PUSH OLD PAIR ON STACK
728 MOVEI C,-1(P) ; USE AS NEW DATUM
729 HRLI C,GCSEG ; KEEP IN CORRECT SECTION
730 PUSHJ P,MARK2 ;MARK THE DATUM
731 HRRZ E,-2(P) ; GET POINTER IN INF CORE
733 DOMULT [MOVEM A,1(E)]
737 JRST GCRET ;AND RETURN
740 PAIRM7: MOVEM A,-1(P) ; SAVE NEW VAL FOR RETURN
743 RETNEW: HRRZ A,(C) ; POINT TO NEW WORLD LOCN
744 HRRZ E,(P) ; BACK POINTER
745 JUMPE E,RETNW1 ; NONE
750 RETNW1: MOVEM A,-1(P)
754 \f; VECTOR AND TP MARKER, SIGN OF TYPNT IS SET BASED ON WHICH ONE
756 TPMK: SETOM GENFLG ;SET TP MARK FLAG
760 MOVEI E,(A) ;SAVE A POINTER TO THE VECTOR
762 SUB A,B ;LOCATE DOPE WORD
763 MOVEI A,1(A) ;ZERO LH AND POINT TO 2ND DOPE WORD
764 CAIL A,STOSTR ; CHECK IN VECTOR SPACE
766 JRST VECTB1 ;LOSE, COMPLAIN
769 HLLM 0,(P) ; SAVE TP VS VECT INDICATOR
770 JUMPE 0,NOBUFR ;IF A VECTOR, NO BUFFER CHECK
771 CAME A,PGROW ;IS THIS THE BLOWN P
772 CAMN A,TPGROW ;IS THIS THE GROWING PDL
773 JRST NOBUFR ;YES, DONT ADD BUFFER
774 ADDI A,PDLBUF ;POINT TO REAL DOPE WORD
775 MOVSI 0,-PDLBUF ;ALSO FIX UP POINTER
777 MOVEM 0,-1(P) ; FIXUP RET'D PNTR
779 NOBUFR: HLRE B,(A) ;GET LENGTH FROM DOPE WORD
780 JUMPL B,EXVECT ; MARKED, LEAVE
781 LDB B,[TOPGRO,,-1(A)] ; GET TOP GROWTH
782 TRZE B,400 ; HACK SIGN BIT
784 ASH B,6 ; CONVERT TO WORDS
785 PUSH P,B ; SAVE TOP GROWTH
786 LDB 0,[BOTGRO,,-1(A)] ;GET GROWTH FACTOR
787 TRZE 0,400 ;KILL SIGN BIT AND SKIP IF +
789 ASH 0,6 ;CONVERT TO NUMBER OF WORDS
790 PUSH P,0 ; SAVE BOTTOM GROWTH
791 ADD B,0 ;TOTAL GROWTH TO B
792 VECOK: HLRE E,(A) ;GET LENGTH AND MARKING
793 MOVEI EXTAC,(E) ;SAVE A COPY
794 ADD EXTAC,B ;ADD GROWTH
795 SUBI E,2 ;- DOPE WORD LENGTH
796 IORM D,(A) ;MAKE SURE NOW MARKED
797 PUSHJ P,ALLOGC ; ALLOCATE SPACE FOR VECTOR IN THE INF
799 VECOK1: JUMPLE E,MOVEC2 ; ZERO LENGTH, LEAVE
800 PUSH P,A ; SAVE POINTER TO DOPE WORD
802 SKIPGE B,-1(A) ;SKIP IF UNIFORM
803 TLNE B,377777-.VECT. ;SKIP IF NOT SPECIAL
804 JUMPE EXTAC,NOTGEN ;JUMP IF NOT A GENERAL VECTOR
806 GENRAL: HLRZ 0,B ;CHECK FOR PSTACK
808 JUMPE 0,NOTGEN ;IT ISN'T GENERAL
809 JUMPN EXTAC,TPMK1 ; JUMP IF TP
811 SUBI C,1(E) ; C POINTS TO BEGINNING OF VECTOR
813 \f; LOOP TO MARK ELEMENTS IN A GENERAL VECTOR
814 VECTM2: HLRE B,(C) ;GET TYPE AND MARKING
815 JUMPL B,UMOVEC ;RETURN, (EITHER DOPE WORD OR FENCE POST)
816 MOVE A,1(C) ;DATUM TO A
819 VECTM3: PUSHJ P,MARK ;MARK DATUM
820 MOVEM A,1(C) ; IN CASE WAS FIXED
825 MOVEC2: POP P,C ; RESTORE BOTTOM GROWTH
826 CAMGE A,GCSBOT ; DONT DO THIS STUFF IF THIS IS FROZEN
828 HRRZ B,-1(P) ; GET POINTER INTO INF
831 MOVEC3: HLLZ 0,-1(A) ; MODIFY DOPE WORD AND PLACE IN INF
833 HRRZ EXTAC,(A) ; DESTINATION OF DOPEWORDS (SORT OF)
834 HRLI EXTAC,GCSEG ; MAKE INTO CORRECT KIND OF ADDR
835 DOMULT [MOVEM 0,-1(EXTAC)]
837 ANDI 0,377777 ; KILL MARK BIT
839 ADD 0,C ; COMPENSATE FOR SHRINKAGE
843 SKIPGE (P) ; ACCOUNT FOR OTHER END SHRINKAGE
846 SUBI 0,2 ; AVOID RE-SENDING DOPE WORDS
847 DOMULT [XBLT 0,] ; MOVE VECTOR TO OTHER IMAGE
852 ADJSP P,-1 ; GET RID OF FPTR
853 PUSHJ P,RELATE ; RELATIVIZE
855 MOVSI 0,PDLBUF ; FIX UP STACK PTR
859 VECLOS: JUMPL C,CCRET ;JUMP IF CAN'T MUNG TYPE
861 MOVEI B,TILLEG ;GET ILLEGAL TYPE
863 MOVEM 0,1(C) ;AND STORE OLD TYPE AS VALUE
864 JRST UMOVEC ;RETURN WITHOUT MARKING VECTOR
866 CCRET: CLEARM 1(C) ;CLOBBER THE DATUM
870 ; ROUTINE TO MARK A TP. IT SCANS THE TP. IT MARKS ALL THE ITEMS AND IT MAPS AN
871 ; UPDATED VERSION INTO THE INFERIOR WITHOUT CHANGING THE ORIGINAL.
874 TPMK2: POP P,A ; RESTORE DW POINTER
875 POP P,C ; AND BOTTOM GROWTH
876 HRRZ E,-1(P) ; FIX UP PARAMS
879 HRRZ B,(A) ; CALCULATE RELOCATION
881 MOVE C,-1(P) ; ADJUST FOR GROWTH
889 TPMK3: HLRZ E,(A) ; GET LENGTH
890 TRZ E,400000 ; GET RID OF MARK BIT
891 SUBI A,-1(E) ;POINT TO FIRST ELEMENT
892 MOVEI C,(A) ;POINT TO FIRST ELEMENT WITH C
893 TPMK4: HLRE B,(C) ;GET TYPE AND MARKING
894 JUMPL B,TPMK7 ;RETURN, (EITHER DOPE WORD OR FENCE POST)
895 HRRZ A,(C) ;DATUM TO A
896 ANDI B,TYPMSK ; FLUSH MONITORS
898 CAIN B,TENTRY ;IS THIS A STACK FRAME
899 JRST MFRAME ;YES, MARK IT
901 CAIN B,TBIND ;OR A BINDING BLOCK
903 CAIE B,TBVL ; CHECK FOR OTHER BINDING HACKS
905 SKIPA ; FIX UP SP-CHAIN
906 CAIN B,TSKIP ; OTHER BINDING HACK
909 TPMK5: PUSH P,(C) ; SAVE BECAUSE FRAMES MIGHT MUNG IT
910 HRRM A,(C) ; FIX UP IN CASE OF SP CHAIN
911 PUSHJ P,MARK1 ;MARK DATUM
915 AOS E,-1(P) ; MOVE OUT TYPE
916 DOMULT [MOVEM A,-1(E)]
919 MOVEM M,(C) ; RESTORE TO OLD VALUE
923 MFRAME: HRRZ 0,1(C) ; SET UP RELITIVIZATION OF PTR TO PREVIOUS
925 HRROI C,FRAMLN+FSAV-1(C) ;POINT TO FUNCTION
927 CAIL A,STOSTR ; CHECK IN VECTOR SPACE
929 JRST MFRAM1 ; IGNORE, NOT IN VECTOR SPACE
930 HRL A,(A) ; GET LENGTH
932 PUSHJ P,MARK ; AND MARK IT
936 HRRZ A,OTBSAV-FSAV+1(C) ; POINT TO TB TO PREVIOUS FRAME
938 ADD A,-2(P) ; RELOCATE IF NOT 0
940 DOMULT [MOVEM A,1(E)]
941 MOVE A,-2(P) ; ADJUST AB SLOT
942 ADD A,ABSAV-FSAV+1(C) ; POINT TO SAVED AB
943 DOMULT [MOVEM A,2(E)]
944 MOVE A,-2(P) ; ADJUST SP SLOT
945 ADD A,SPSAV-FSAV+1(C) ;POINT TO SAVED SP
946 SUB A,-3(P) ; ADJUSTMENT OF LENGTH IF GROWTH
947 DOMULT [MOVEM A,3(E)]
948 HRROI C,PSAV-FSAV(C) ;POINT TO SAVED P
950 ADDI E,FRAMLN ; UPDATE OUT ADDR
952 PUSHJ P,MARK1 ;AND MARK IT
954 DOMULT [MOVEM A,-3(E)] ; STORE UPDATED P
955 HLRE 0,TPSAV-PSAV+1(C)
956 MOVE A,TPSAV-PSAV+1(C)
959 MOVE A,TPSAV-PSAV+1(C)
960 CAME 0,TPGROW ; SEE IF BLOWN
966 DOMULT [MOVEM A,-2(E)] ; AND UPDATED TP
967 MOVE A,PCSAV-PSAV+1(C)
968 DOMULT [MOVEM A,-1(E)] ; DONT FORGET SAVED PC
969 HRROI C,-PSAV+1(C) ; POINT PAST THE FRAME
970 JRST TPMK4 ;AND DO MORE MARKING
972 MBIND: PUSHJ P,FIXBND
973 MOVEI B,TATOM ;FIRST MARK ATOM
974 SKIPN GCHAIR ; IF NO HAIR, MARK ALL NOW
975 SKIPE (P) ; PASSED MARKER, IF SO DONT SKIP
976 JRST MBIND2 ; GO MARK
977 MOVE A,1(C) ; RESTORE A
979 JRST MBIND1 ; NOT IT, CONTINUE SKIPPING
980 HRRM LPVP,2(C) ; SAVE IN RH OF TPVP,,0
981 MOVE 0,-4(P) ; RECOVER PTR TO DOPE WORD
982 HRLM 0,2(C) ; SAVE FOR MOVEMENT
983 MOVEI B,TATOM ; MARK THE BINDING TO THIS PROCESS
984 PUSHJ P,MARK1 ; MARK THE ATOM
985 MOVEI LPVP,(C) ; POINT
986 SETOM (P) ; INDICATE PASSAGE
987 MBIND1: ADDI C,6 ; SKIP BINDING
989 SKIPE -1(P) ; ONLY UPDATE IF SENDING OVER
994 AOS E,-1(P) ; FIX UP CHAIN
995 DOMULT [MOVEM A,-1(E)]
996 MOVEI B,TATOM ; RESTORE IN CASE SMASHED
997 PUSHJ P,MARK1 ; MARK ATOM
998 AOS E,-1(P) ; SEND IT OUT
999 DOMULT [MOVEM A,-1(E)]
1001 PUSH P,(C) ; SAVE BECAUSE FRAMES MIGHT MUNG IT
1002 PUSHJ P,MARK2 ;MARK DATUM
1006 AOS E,-1(P) ; SEND IT OUT
1007 DOMULT [MOVEM A,-1(E)]
1009 DOMULT [MOVEM A,(E)] ; SEND OUT VALUE
1011 MOVEM M,(C) ; RESTORE TO OLD VALUE
1013 MOVEI B,TLIST ; POINT TO DECL SPECS
1015 PUSHJ P,MARK ; AND MARK IT
1016 HRR A,(C) ; LIST FIX UP
1017 AOS E,-1(P) ; SEND IT OUT
1018 DOMULT [MOVEM A,-1(E)]
1019 SKIPL A,1(C) ; PREV LOC?
1021 MOVEI B,TLOCI ; NOW MARK LOCATIVE
1023 NOTLCI: AOS E,-1(P) ; SEND IT OUT
1024 DOMULT [MOVEM A,-1(E)]
1028 FIXBND: HRRZ A,(C) ; GET PTR TO CHAIN
1029 SKIPE A ; DO NOTHING IF EMPTY
1033 TPMK8: MOVNI A,1 ; FENCE-POST THE STACK
1034 AOS E,-1(P) ; SEND IT OUT
1035 DOMULT [MOVEM A,-1(E)]
1036 ADDI C,1 ; INCREMENT C FOR FENCE-POST
1037 ADJSP P,-1 ; CLEAN UP STACK
1038 POP P,E ; GET UPDATED PTR TO INF
1039 ADJSP P,-2 ; POP OFF RELOCATION
1044 SUBI C,(A) ; GET # OF WORDS TRANSFERED
1045 SUB B,C ; GET # LEFT
1046 ADDI E,-2(B) ; ADJUST POINTER TO INF
1048 POP P,C ; IS THERE TOP GROWH
1049 ADD E,C ; MAKE ADJUSTMENT FOR TOP GROWTH
1051 HLLZ 0,-1(A) ; MODIFY DOPE WORD AND PLACE IN INF
1053 HRRZ EXTAC,(A) ; DESTINATION OF DOPEWORDS (SORT OF)
1054 HRLI EXTAC,GCSEG ; MAKE INTO CORRECT KIND OF ADDR
1055 DOMULT [MOVEM 0,-1(EXTAC)]
1058 ; ROUTINE TO ALLOCATE ROOM FOR VECTORS IN INFERIOR
1059 ; EXTAC= # OF WORDS TO ALLOCATE
1061 ALLOGC: HRRZS A ; GET ABS VALUE
1062 CAML A,GCSBOT ; SKIP IF IN STORAGE
1063 JRST ALOGC2 ; JUMP IF ALLOCATING
1067 ALOGC1: ADDI FPTR,(EXTAC)
1069 DOMULT [HRRM 0,-1(FPTR)]
1070 DOMULT [HRLM EXTAC,-1(FPTR)]
1073 \f; RELATE RELATAVIZES A POINTER TO A VECTOR
1074 ; B IS THE POINTER A==> DOPE WORD
1076 RELATE: CAMGE A,GCSBOT ; SEE IF IN VECTOR SPACE
1077 POPJ P, ; IF NOT EXIT
1079 HLRE EXTAC,C ; GET LENGTH
1080 HRRZ 0,-1(A) ; CHECK FO GROWTH
1082 LDB 0,[TOPGRO,,-1(A)] ; GET TOP GROWTH
1083 TRZE 0,400 ; HACK SIGN BIT
1085 ASH 0,6 ; CONVERT TO WORDS
1086 SUB EXTAC,0 ; ACCOUNT FOR GROWTH
1087 RELAT1: HRLM EXTAC,C ; PLACE CORRECTED LENGTH BACK IN POINTER
1088 HRRZ EXTAC,(A) ; GET RELOCATED ADDR
1089 SUBI EXTAC,(A) ; FIND RELATIVIZATION AMOUNT
1090 ADD C,EXTAC ; ADJUST POINTER
1091 SUB C,0 ; ACCOUNT FOR GROWTH
1096 \f; MARK TB POINTERS
1097 TBMK: HRRZS A ; CHECK FOR NIL POINTER
1099 JRST GCRET ; IF POINTING TO NIL THEN RETURN
1100 HLRE B,TPSAV(A) ; MAKE POINTER LOOK LIKE A TP POINTER
1101 HRRZ C,TPSAV(A) ; GET TO DOPE WORD
1102 TBMK2: SUB C,B ; POINT TO FIRST DOPE WORD
1103 HRRZ A,(P) ; GET PTR TO FRAME
1104 SUB A,C ; GET PTR TO FRAME
1114 ABMK: HLRE B,A ; FIX UP TO GET TO FRAME
1116 HLRE B,FRAMLN+TPSAV(A) ; FIX UP TO LOOK LIKE TP
1117 HRRZ C,FRAMLN+TPSAV(A)
1123 ARGMK: HRRZ A,1(C) ; GET POINTER
1124 HLRE B,1(C) ; AND LNTH
1125 SUB A,B ; POINT TO BASE
1126 CAIL A,STOSTR ; CHECK IN VECTOR SPACE
1129 HLRZ 0,(A) ; GET TYPE
1133 CAIE 0,TENTRY ; IS NEXT A WINNER?
1135 JRST ARGMK1 ; YES, GO ON TO WIN CODE
1137 ARGMK0: SETZB A,1(C) ; CLOBBER THE CELL
1138 SETZM (P) ; AND SAVED COPY
1141 ARGMK1: MOVE B,1(A) ; ASSUME TTB
1142 ADDI B,(A) ; POINT TO FRAME
1143 CAIE 0,TINFO ; IS IT?
1144 MOVEI B,FRAMLN(A) ; NO, USE OTHER GOODIE
1145 HLRZ 0,OTBSAV(B) ; GET TIME
1146 HRRZ A,(C) ; AND FROM POINTER
1147 CAIE 0,(A) ; SKIP IF WINNER
1149 MOVE A,TPSAV(B) ; GET A RELATAVIZED TP
1153 SUB A,1(C) ; AMOUNT TO RELATAVIZE ARGS
1156 HRRM B,(P) ; PUT RELATAVIZED PTR BACK
1160 ; MARK FRAME POINTERS
1162 FRMK: HLRZ B,A ; GET TIME FROM FRAME PTR
1163 HLRZ EXTAC,OTBSAV(A) ; GET TIME FROM FRAME
1164 CAME B,EXTAC ; SEE IF EQUAL
1166 SUBI C,1 ;PREPARE TO MARK PROCESS VECTOR
1167 HRRZ A,1(C) ;USE AS DATUM
1168 SUBI A,1 ;FUDGE FOR VECTMK
1169 MOVEI B,TPVP ;IT IS A VECTRO
1170 PUSHJ P,MARK ;MARK IT
1171 ADDI A,1 ; READJUST PTR
1172 HRRM A,1(C) ; FIX UP PROCESS SLOT
1173 MOVEI C,1(C) ; SET UP FOR TBMK
1175 JRST TBMK ; MARK LIKE TB
1180 BYTMK: PUSHJ P,BYTDOP ; GET DOPE WORD IN A
1181 HLRZ EXTAC,-1(A) ; GET THE TYPE
1182 ANDI EXTAC,SATMSK ; FLUSH MONITOR BITS
1183 CAIN EXTAC,SATOM ; SEE IF ATOM
1185 HLRE EXTAC,(A) ; GET MARKING
1186 JUMPL EXTAC,BYTREL ; JUMP IF MARKED
1187 HLRZ EXTAC,(A) ; GET LENGTH
1188 PUSHJ P,ALLOGC ; ALLOCATE FOR IT
1189 HRRM 0,(A) ; SMASH IT IN
1192 SUBI 0,1 ; DONT RESEND DW
1193 SUBI B,-1(EXTAC) ; ADJUST INF POINTER
1202 ADDM E,(P) ; RELATAVIZE
1205 ATMSET: PUSH P,A ; SAVE A
1206 HLRZ B,(A) ; GET LENGTH
1207 TRZ B,400000 ; GET RID OF MARK BIT
1208 MOVNI B,-2(B) ; GET LENGTH
1209 ADDI A,-1(B) ; CALCULATE POINTER
1211 MOVEI B,TATOM ; TYPE
1214 JRST BYTREL ; TO BYTREL
1222 PUSH P,A ; PUSH LIST POINTER ON THE STACK
1223 PUSHJ P,MARK2 ; MARK THE LIST
1224 HRLM A,-2(P) ; UPDATE POINTER IN OFFSET
1229 ; MARK ATOMS IN GVAL STACK
1231 GATOMK: HRRZ B,(C) ; POINT TO POSSIBLE GDECL
1235 MOVEI A,(B) ; POINT TO DECL FOR MARK
1239 MOVE C,-1(P) ; RESTORE HOME POINTER
1240 HRRM A,(C) ; CLOBBER UPDATED LIST IN
1241 MOVE A,1(C) ; RESTORE ATOM POINTER
1247 PUSH P,0 ; SAVE POINTER TO INF
1248 SETOM .ATOM. ; SAY ATOM WAS MARKED
1250 PUSHJ P,GETLNT ;GET LENGTH AND CHECK BOUNDS
1251 JRST ATMRL1 ; ALREADY MARKED
1252 PUSH P,A ; SAVE DOPE WORD PTR FOR LATER
1253 HLRZ C,(A) ; FIND REAL ATOM PNTR
1254 SUBI C,400001 ; KILL MARK BIT AND ADJUST
1256 SUBM A,C ; NOW TOP OF ATOM
1257 MRKOBL: MOVEI B,TOBLS
1258 HRRZ A,2(C) ; IF > 0, NOT OBL
1262 PUSHJ P,MARK ; AND MARK IT
1270 NOMKNX: HLRZ B,(C) ; SEE IF UNBOUND
1271 TRZ B,400000 ; TURN OFF MARK BIT
1274 JRST ATOMK1 ; IT IS UNBOUND
1275 HRRZ 0,(C) ; SEE IF VECTOR OR TP POINTER
1276 MOVEI B,TVEC ; ASSUME VECTOR
1278 MOVEI B,TTP ; ITS A LOCAL VALUE
1279 PUSHJ P,MARK1 ; MARK IT
1280 MOVEM A,1(C) ; SMASH INTO SLOT
1281 ATOMK1: HRRZ 0,2(C) ; CHECK IF NOT ON ANY OBLIST
1283 POP P,C ; GET POINTER INTO INF
1286 JUMPN 0,ATMREL ; ALWAYS SEND OUT ATOMS ON NO OBLIST
1288 ; HERE WITH B POINT TO CURRENT DW AND C TO NEW DW, DO IT TO IT
1290 ATMOVX: PUSHJ P,XBLTR
1291 ATMREL: HRRZ E,(A) ; RELATAVIZE
1295 ATMRL1: ADJSP P,-1 ; POP OFF STACK
1298 ; HERE TO MOVE STUFF TO OTHER SEGMENT
1299 ; B==> CURRENT DW, C==> START OF NEW OBJECT (A MUST SURVIVE)
1300 XBLTR: CAMGE B,GCSBOT
1303 HRRZ E,(B) ; NEW DW LOC
1310 MOVE A,EXTAC ; BACK TO A
1313 GETLNT: HLRE B,A ;GET -LNTH
1314 SUB A,B ;POINT TO 1ST DOPE WORD
1315 MOVEI A,1(A) ;POINT TO 2ND DOPE WORD
1316 CAIL A,STOSTR ; CHECK IN VECTOR SPACE
1318 JRST VECTB1 ;BAD VECTOR, COMPLAIN
1319 HLRE B,(A) ;GET LENGTH AND MARKING
1320 IORM D,(A) ;MAKE SURE MARKED
1322 MOVEI EXTAC,(B) ; AMOUNT TO ALLOCATE
1323 PUSHJ P,ALLOGC ;ALLOCATE ROOM
1324 HRRM 0,(A) ; RELATIVIZE
1325 AMTK1: AOS (P) ; A NON MARKED ITEM
1326 AMTKE: POPJ P, ;AND RETURN
1328 GCRET1: ADJSP P,-1 ;FLUSH RETURN ADDRESS
1333 ; MARK NON-GENERAL VECTORS
1335 NOTGEN: CAMN B,[GENERAL+<SPVP,,0>]
1336 JRST GENRAL ;YES, MARK AS A VECTOR
1337 JUMPL B,SPECLS ; COMPLAIN IF A SPECIAL HACK
1338 SUBI A,1(E) ;POINT TO TOP OF A UNIFORM VECTOR
1339 HLRZS B ;ISOLATE TYPE
1341 MOVE EXTAC,B ; AND COPY IT
1342 LSH B,1 ;FIND OUT WHERE IT WILL GO
1343 HRRZ B,@TYPNT ;GET SAT IN B
1345 HRRZ C,SMKTBS(B) ;POINT TO MARK SR
1346 CAIN C,GCRET ;IF NOT A MARKED FROM GOODIE, IGNORE
1348 MOVEI C,-1(A) ;POINT 1 PRIOR TO VECTOR START
1349 PUSH P,E ;SAVE NUMBER OF ELEMENTS
1350 PUSH P,EXTAC ;AND UNIFORM TYPE
1352 UNLOOP: MOVE B,(P) ;GET TYPE
1353 MOVE A,1(C) ;AND GOODIE
1354 TLO C,400000 ;CAN'T MUNG TYPE
1355 PUSHJ P,MARK ;MARK THIS ONE
1356 MOVEM A,1(C) ; LIST FIXUP
1358 AOJA C,UNLOOP ;IF MORE, DO NEXT
1360 ADJSP P,-2 ;REMOVE STACK CRAP
1364 SPECLS: FATAL AGC--UNRECOGNIZED SPECIAL VECTOR
1370 ; ROUTINE TO MARK THE GC-READ TABLE. MARKS THE ATOMS AT THE DOPE WORDS
1371 ; AND UPDATES PTR TO THE TABLE.
1373 GCRDMK: PUSH P,A ; SAVE PTR TO TOP
1374 MOVEI 0,(FPTR) ; SAVE PTR TO INF
1376 PUSHJ P,GETLNT ; GET TO D.W. AND CHECK MARKING
1377 JRST GCRDRL ; RELATIVIZE
1378 PUSH P,A ; SAVE D.W POINTER
1380 MOVE B,ABOTN ; GET TOP OF ATOM TABLE
1382 ADD B,0 ; GET BOTTOM OF ATOM TABLE
1383 GCRD1: CAMG A,B ; DON'T SKIP IF DONE
1385 HLRZ C,(A) ; GET MARKING
1386 TRZN C,400000 ; SKIP IF MARKED
1389 SUBI A,(C) ; GO BACK ONE ATOM
1391 PUSH P,A ; SAVE POINTER
1392 MOVEI C,-2(E) ; SET UP POINTER
1393 MOVEI B,TATOM ; GO TO MARK
1396 MOVEM A,1(C) ; SMASH FIXED UP ATOM BACK IN
1400 GCRD3: SUBI A,(C) ; TO NEXT ATOM
1402 GCRD2: POP P,B ; GET PTR TO D.W.
1403 POP P,C ; GET PTR TO INF
1404 ADJSP P,-1 ; GET RID OF TOP
1406 JRST ATMOVX ; RELATIVIZE AND LEAVE
1408 GCRDRL: POP P,A ; GET PTR TO D.W
1409 ADJSP P,-2 ; GET RID OF TOP AND PTR TO INF
1410 JRST ATMREL ; RELATAVIZE
1413 ;MARK RELATAVIZED GLOC HACKS
1415 LOCRMK: SKIPE GCHAIR
1417 LOCRDP: PUSH P,C ; SAVE C
1418 MOVEI C,-2(A) ; RELATAVIZED PTR TO ATOM
1419 ADD C,GLTOP ; ADD GLOTOP TO GET TO ATOM
1420 MOVEI B,TATOM ; ITS AN ATOM
1424 MOVE A,1(C) ; GET RELATIVIZATION
1425 MOVEM A,(P) ; IT STAYS THE SAVE
1428 ;MARK LOCID TYPE GOODIES
1430 LOCMK: HRRZ B,(C) ;GET TIME
1431 JUMPE B,LOCMK1 ; SKIP LEGAL CHECK FOR GLOBAL
1432 HRRZ 0,2(A) ; GET OTHER TIME
1434 SETZB A,(P) ; NO, SMASH LOCATIVE
1435 JUMPE A,GCRET ; LEAVE IF DONE
1437 MOVEI B,TATOM ; MARK ATOM
1438 MOVEI C,-2(A) ; POINT TO ATOM
1439 MOVE E,(C) ; SEE IF BLOCK IS MARKED
1440 TLNE E,400000 ; SKIP IF MARKED
1441 JRST LOCMK2 ; SKIP OVER BLOCK
1442 SKIPN GCHAIR ; DO NOT MARK IF NOT HAIRY (WILL BE MARKED)
1443 PUSHJ P,MARK1 ; LET LOCATIVE SAVE THE ATOM
1445 HRRZ E,(C) ; TIME BACK
1446 MOVEI B,TVEC ; ASSUME GLOBAL
1448 MOVEI B,TTP ; ITS LOCAL
1449 PUSHJ P,MARK1 ; MARK IT
1454 ; MARK ASSOCIATION BLOCKS
1457 ASMRK1: HRLI A,-ASOLNT ;LOOK LIKE A VECTOR POINTER
1458 PUSHJ P,GETLNT ;GET LENGTH AND CHECK BOUNDS
1459 JRST ASTREL ; ALREADY MARKED
1460 MOVEI C,-ASOLNT-1(A) ;COPY POINTER
1461 PUSHJ P,MARK2 ;MARK ITEM CELL
1463 ADDI C,INDIC-ITEM ;POINT TO INDICATOR
1469 SKIPN GCHAIR ; IF NO HAIR, MARK ALL FRIENDS
1471 HRRZ A,NODPNT-VAL(C) ; NEXT
1472 JUMPN A,ASMRK1 ; IF EXISTS, GO
1473 ASTREL: POP P,A ; RESTORE PTR TO ASSOCIATION
1474 MOVEI A,ASOLNT+1(A) ; POINT TO D.W.
1475 SKIPN NODPNT-ASOLNT-1(A) ; SEE IF EMPTY NODPTR
1476 JRST ASTX ; JUMP TO SEND OUT
1477 ASTR1: HRRZ E,(A) ; RELATAVIZE
1481 ASTX: HRRZ C,(A) ; GET PTR IN FRONTEIR
1482 SUBI C,ASOLNT+1 ; ADJUST TO POINT TO BEGINNING
1487 ;HERE WHEN A VECTOR POINTER IS BAD
1489 VECTB1:FATAL AGC--VECTOR POINTS OUTSIDE OF VECTOR SPACE
1490 ADJSP P,-1 ; RECOVERY
1491 AFIXUP: SETZM (P) ; CLOBBER SLOT
1492 JRST GCRET ; CONTINUE
1495 VECTB2: FATAL AGC--VECTOR POINTS OUT OF VECTOR SPACE
1497 JRST AFIXUP ; RECOVER
1499 PARERR: FATAL AGC--PAIR POINTS OUT OF PAIR SPACE
1500 ADJSP P,-1 ; RECOVER
1504 \f; HERE TO MARK TEMPLATE DATA STRUCTURES
1506 TD.MRK: MOVEI 0,(FPTR) ; SAVE PTR TO INF
1508 HLRZ B,(A) ; GET REAL SPEC TYPE
1509 ANDI B,37777 ; KILL SIGN BIT
1510 MOVEI E,-NUMSAT-1(B) ; GET REL POINTER TO TABLE
1513 HRRZS C,A ; FLUSH COUNT AND SAVE
1514 SKIPL E ; WITHIN BOUNDS
1515 FATAL BAD SAT IN AGC
1516 PUSHJ P,GETLNT ; GOODIE IS NOW MARKED
1517 JRST TMPREL ; ALREADY MARKED
1521 SUB E,TD.AGC+1 ; POINT TO LENGTH
1523 XCT (E) ; RET # OF ELEMENTS IN B
1525 HLRZ D,B ; GET POSSIBLE "BASIC LENGTH" FOR RESTS
1526 PUSH P,[0] ; TEMP USED IF RESTS EXIST
1528 MOVEI B,(B) ; ZAP TO ONLY LENGTH
1529 PUSH P,C ; SAVE POINTER TO TEMPLATE STRUCTURE
1530 PUSH P,[0] ; HOME FOR VALUES
1531 PUSH P,[0] ; SLOT FOR TEMP
1534 PUSH P,E ; SAVE FOR FINDING OTHER TABLES
1535 JUMPE D,TD.MR2 ; NO REPEATING SEQ
1536 ADD E,TD.GET+1 ; COMP LNTH OF REPEATING SEQ
1537 HLRE E,(E) ; E ==> - LNTH OF TEMPLATE
1538 ADDI E,(D) ; E ==> -LENGTH OF REP SEQ
1540 HRLM E,-5(P) ; SAVE IT AND BASIC
1542 TD.MR2: SKIPG D,-1(P) ; ANY LEFT?
1547 MOVE E,(E) ; POINTER TO VECTOR IN E
1548 MOVEM D,-6(P) ; SAVE ELMENT #
1549 SKIPN B,-5(P) ; SKIP IF "RESTS" EXIST
1552 MOVEI 0,(B) ; BASIC LNT TO 0
1553 SUBI 0,(D) ; SEE IF PAST BASIC
1554 JUMPGE 0,.-3 ; JUMP IF O.K.
1555 MOVSS B ; REP LNT TO RH, BASIC TO LH
1556 IDIVI 0,(B) ; A==> -WHICH REPEATER
1558 ADD A,-5(P) ; PLUS BASIC
1559 ADDI A,1 ; AND FUDGE
1560 MOVEM A,-6(P) ; SAVE FOR PUTTER
1561 ADDI E,-1(A) ; POINT
1564 TD.MR3: ADDI E,(D) ; POINT TO SLOT
1565 XCT (E) ; GET THIS ELEMENT INTO A AND B
1566 JFCL ; NO-OP FOR ANY CASE
1567 MOVEM A,-3(P) ; SAVE TYPE FOR LATER PUT
1569 EXCH A,B ; REARRANGE
1571 MOVEI C,-3(P) ; TELL OTHER GUYS THEY CANT DIRECTLY MUNG
1572 MOVSI D,400000 ; RESET FOR MARK
1573 PUSHJ P,MARK ; AND MARK THIS GUY (RET FIXED POINTER IN A)
1574 MOVE C,-4(P) ; REGOBBLE POINTER TO TEMPLATE
1576 MOVE B,-6(P) ; RESTORE COUNT
1578 MOVE E,(E) ; POINTER TO VECTOR IN E
1579 ADDI E,(B)-1 ; POINT TO SLOT
1580 MOVE B,-3(P) ; RESTORE TYPE WORD
1582 SOS D,-1(P) ; GET ELEMENT #
1583 XCT (E) ; SMASH IT BACK
1584 FATAL TEMPLATE LOSSAGE
1585 MOVE C,-4(P) ; RESTORE POINTER IN CASE MUNGED
1588 TD.MR1: MOVE A,-8(P) ; PTR TO DOPE WORD
1589 MOVE B,-7(P) ; RESTORE PTR TO FRONTEIR
1590 ADJSP P,-7 ; CLEAN UP STACK
1591 USRAG1: ADDI A,1 ; POINT TO SECOND D.W.
1592 MOVSI D,400000 ; SET UP MARK BIT
1594 HRRZ C,(A) ; DEST DW
1595 DOMULT [HLRZ E,(C)] ; LENGTH
1602 MOVSI D,400000 ; RESTORE MARK/UNMARK BIT
1605 USRAGC: HRRZ E,(E) ; MARK THE TEMPLATE
1607 MOVE A,-1(P) ; POINTER TO D.W
1608 MOVE B,(P) ; TOINTER TO FRONTIER
1611 ; This phase attempts to remove any unwanted associations. The program
1612 ; loops through the structure marking values of associations. It can only
1613 ; stop when no new values (potential items and/or indicators) are marked.
1615 VALFLS: PUSH P,LPVP ; SAVE LPVP FOR LATER
1616 PUSH P,[0] ; INDICATE WHETHER ANY ON THIS PASS
1617 PUSH P,[0] ; OR THIS BUCKET
1618 ASOMK1: MOVE A,GCASOV ; GET VECTOR POINTER
1619 SETOM -1(P) ; INITIALIZE FLAG
1621 ASOM6: SKIPG C,(A) ; SKIP IF BUCKET TO BE SCANNED
1623 SETOM (P) ; SAY BUCKET NOT CHANGED
1625 ASOM2: MOVEI EXTAC,(C) ; COPY POINTER
1626 SKIPG ASOLNT+1(C) ; SKIP IF NOT ALREADY MARKED
1627 JRST ASOM4 ; MARKED, GO ON
1628 PUSHJ P,MARKQ ; SEE IF ITEM IS MARKED
1629 JRST ASOM3 ; IT IS NOT, IGNORE IT
1630 MOVEI EXTAC,(C) ; IN CASE CLOBBERED BY MARK2
1631 MOVEI C,INDIC(C) ; POINT TO INDICATOR SLOT
1633 JRST ASOM3 ; NOT MARKED
1635 PUSH P,A ; HERE TO MARK VALUE
1637 HLRE EXTAC,ASOLNT-INDIC+1(C) ; GET LENGTH
1638 JUMPL EXTAC,.+3 ; SKIP IF MARKED
1639 CAMGE C,VECBOT ; SKIP IF IN VECT SPACE
1641 HRRM FPTR,ASOLNT-INDIC+1(C) ; PUT IN RELATIVISATION
1642 MOVEI EXTAC,12 ; AMOUNT TO ALLOCATE IN INF
1644 HRRM 0,5(C) ; STICK IN RELOCATION
1646 ASOM20: PUSHJ P,MARK2 ; AND MARK
1647 MOVEM A,1(C) ; LIST FIX UP
1648 ADDI C,ITEM-INDIC ; POINT TO ITEM
1651 ADDI C,VAL-ITEM ; POINT TO VALUE
1654 IORM D,ASOLNT-VAL+1(C) ; MARK ASOC BLOCK
1657 AOSA -1(P) ; INDICATE A MARK TOOK PLACE
1659 ASOM3: AOS (P) ; INDICATE AN UNMARKED IN THIS BUCKET
1660 ASOM4: HRRZ C,ASOLNT-1(EXTAC) ; POINT TO NEXT IN BUCKET
1661 JUMPN C,ASOM2 ; IF NOT EMPTY, CONTINUE
1662 SKIPGE (P) ; SKIP IF ANY NOT MARKED
1663 HRROS (A) ; MARK BUCKET AS NOT INTERESTING
1664 ASOM1: AOBJN A,ASOM6 ; GO TO NEXT BUCKET
1667 JUMPN 0,VALFLA ; YES, CHECK VALUES
1670 ; NOW SEE WHICH CHANNELS STILL POINTED TO
1672 CHNFL3: MOVEI 0,N.CHNS-1
1673 MOVEI A,CHNL1 ; SLOTS
1674 HRLI E,TCHAN ; TYPE HERE TOO
1676 CHNFL2: SKIPN B,1(A)
1679 SUBI B,(C) ; POINT TO DOPE
1680 HLLM E,(A) ; PUT TYPE BACK
1681 HRRE EXTAC,(A) ; SEE IF ALREADY MARKED
1685 HLLOS (A) ; MARK AS A LOSER
1688 CHNFL8: MOVEI EXTAC,1 ; MARK A GOOD CHANNEL
1693 SKIPE GCHAIR ; IF NOT HAIRY CASE
1696 SKIPL -1(P) ; SKIP IF NOTHING NEW MARKED
1699 ADJSP P,-2 ; REMOVE FLAGS
1703 ; HERE TO REEMOVE UNUSED ASSOCIATIONS
1705 MOVE A,GCASOV ; GET ASOVEC BACK FOR FLUSHES
1707 ASOFL1: SKIPN C,(A) ; SKIP IF BUCKET NOT EMPTY
1708 JRST ASOFL2 ; EMPTY BUCKET, IGNORE
1709 HRRZS (A) ; UNDO DAMAGE OF BEFORE
1711 ASOFL5: SKIPGE ASOLNT+1(C) ; SKIP IF UNMARKED
1712 JRST ASOFL6 ; MARKED, DONT FLUSH
1714 HRRZ B,ASOLNT-1(C) ; GET FORWARD POINTER
1715 HLRZ E,ASOLNT-1(C) ; AND BACK POINTER
1716 JUMPN E,ASOFL4 ; JUMP IF NO BACK POINTER (FIRST IN BUCKET)
1717 HRRZM B,(A) ; FIX BUCKET
1720 ASOFL4: HRRM B,ASOLNT-1(E) ; FIX UP PREVIOUS
1721 JUMPE B,.+2 ; JUMP IF NO NEXT POINTER
1722 HRLM E,ASOLNT-1(B) ; FIX NEXT'S BACK POINTER
1723 HRRZ B,NODPNT(C) ; SPLICE OUT THRAD
1730 ASOFL3: HRRZ C,ASOLNT-1(C) ; GO TO NEXT
1732 ASOFL2: AOBJN A,ASOFL1
1736 ; NOW CLOBBER UNMARKED LOCAL NAD GLOBAL VALUES
1738 MOVE A,GCGBSP ; GET GLOBAL PDL
1740 GLOFLS: SKIPGE (A) ; SKIP IF NOT ALREADY MARKED
1743 PUSHJ P,ZERSLT ; CLOBBER THE SLOT
1745 SVDCL: ANDCAM D,(A) ; UNMARK
1747 JUMPL A,GLOFLS ; MORE?, KEEP LOOPING
1750 LOCFL1: HRRZ A,(LPVP) ; NOW CLOBBER LOCAL SLOTS
1753 JUMPE A,LOCFL2 ; NONE TO FLUSH
1755 LOCFLS: SKIPGE (A) ; MARKDE?
1759 ANDCAM D,(A) ;UNMARK
1762 LOCFL2: JUMPN LPVP,LOCFL1 ; JUMP IF MORE PROCESS
1764 ; AT THIS POINT THE LOCALS ARE FINALLY SENT OUT.
1765 ; THIS ROUTINE UPDATES THE THIS-PROCESS BINDING.
1766 ; IT FIXES UP THE SP-CHAIN AND IT
1767 ; SENDS OUT THE ATOMS.
1770 MOVEI B,TATOM ; MARK THE BINDING TO THIS PROCESS
1771 PUSHJ P,MARK1 ; MARK THE ATOM
1772 MOVEM A,1(C) ; NEW HOME
1773 MOVEI C,2(C) ; MARK VALUE
1774 MOVEI B,TPVP ; IT IS A PROCESS VECTOR POINTER
1775 PUSHJ P,MARK1 ; MARK IT
1778 NEXPRO: MOVEI 0,TPVP ; FIX UP SLOT
1779 HLRZ A,2(R) ; GET PTR TO NEXT PROCESS
1781 HRRZ E,(A) ; ADRESS IN INF
1782 HRRZ B,(A) ; CALCULATE RELOCATION
1785 HRRZ EXTAC,A ; CALCULATE START OF TP IN EXTAC
1786 HLRZ B,(A) ; ADJUST INF PTR
1789 LDB M,[TOPGRO,,-1(A)] ; CALCULATE TOP GROWTH
1790 TRZE M,400 ; FUDGE SIGN
1793 ADD B,M ; FIX UP LENGTH
1795 SUBM M,(P) ; FIX RELOCATION TO TAKE INTO ACCOUNT
1797 MOVE M,R ; GET A COPY OF R
1798 NEXP1: HRRZ C,(M) ; GET PTR TO NEXT IN CHAIN
1799 JUMPE C,NEXP2 ; EXIT IF END OF CHAIN
1800 MOVE 0,C ; GET COPY OF CHAIN PTR TO UPDATE
1805 NEXP2: ADJSP P,-1 ; CLEAN UP STACK
1807 MOVEI A,6(R) ; POINT AFTER THE BINDING
1808 MOVE 0,EXTAC ; CALCULATE # OF WORDS TO SEND OUT
1814 HRRZS R,2(R) ; GET THE NEXT PROCESS
1818 MOVE A,GCGBSP ; PTR TO GLOBAL STACK
1819 PUSHJ P,SPCOUT ; SEND IT OUT
1821 PUSHJ P,SPCOUT ; SEND IT OUT
1824 ; THIS ROUTINE MARKS ALL THE CHANNELS
1825 ; IT THEN SENDS OUT A COPY OF THE TVP
1827 CHFIX: MOVEI 0,N.CHNS-1
1828 MOVEI A,CHNL1 ; SLOTS
1829 HRLI E,TCHAN ; TYPE HERE TOO
1831 DHNFL2: SKIPN B,1(A)
1833 MOVEI C,(A) ; MARK THE CHANNEL
1837 MOVEM A,1(C) ; ADJUST PTR
1845 ; ROUTINE TO SEND OUT STUFF - SPCOUX--DONT LOOK AT GROWTH
1846 ; SPCOUT--LOOK AT GROWTH
1848 SPCOUX: TDZA C,C ; ZERO C AS FLAG
1853 MOVEI A,1(A) ; POINT TO DOPE WORD
1856 HLLZ 0,-1(A) ; MODIFY DOPE WORD AND PLACE IN INF
1858 HRRZ B,(A) ; DESTINATION OF DOPEWORDS (SORT OF)
1859 HRLI B,GCSEG ; MAKE INTO CORRECT KIND OF ADDR
1860 DOMULT [MOVEM 0,-1(B)]
1861 JUMPE C,SPCOUY ; JUMP IF NO GROWTH STUFF
1862 LDB C,[BOTGRO,,-1(A)]
1866 SPCOUY: DOMULT [HLRZ 0,(B)]
1867 ADD 0,C ; COMPENSATE FOR SHRINKAGE
1868 SUBI 0,1 ; DONT RESEND DW
1871 DOMULT [XBLT 0,] ; MOVE VECTOR TO OTHER IMAGE
1874 ASOFL6: HLRZ E,ASOLNT-1(C) ; SEE IF FIRST IN BUCKET
1875 JUMPN E,ASOFL3 ; IF NOT CONTINUE
1876 HRRZ E,ASOLNT+1(C) ; GET PTR FROM DOPE WORD
1877 SUBI E,ASOLNT+1 ; ADJUST TO POINT TO BEGINNING OF ALSSOCIATION
1878 HRRZM E,(A) ; SMASH IT IN
1882 MARK23: PUSH P,A ; SAVE BUCKET POINTER
1888 AOS -2(P) ; MARKING HAS OCCURRED
1889 IORM D,ASOLNT+1(C) ; MARK IT
1892 \f; CHANNEL FLUSHER FOR NON HAIRY GC
1895 SETOM (P) ; RESET FOR RETRY
1902 ; VALUE FLUSHING PHASE, HACKS BOTTOM OF TP AND GLOBAL SP
1904 VALFLA: MOVE C,GCGBSP ; GET POINTER TO GLOBAL STACK
1905 VALFL1: SKIPL (C) ; SKIP IF NOT MARKED
1906 PUSHJ P,MARKQ ; SEE IF ATOM IS MARKED
1909 MOVEI B,TATOM ; UPDATE ATOM SLOT
1913 AOS -2(P) ; INDICATE MARK OCCURRED
1914 HRRZ B,(C) ; GET POSSIBLE GDECL
1915 JUMPE B,VLFL10 ; NONE
1916 CAIN B,-1 ; MAINFIFEST
1921 PUSHJ P,MARK ; MARK IT
1923 HRRM A,(C) ; CLOBBER UPDATE IN
1924 VLFL10: ADD C,[2,,2] ; BUMP TO VALUE
1925 PUSHJ P,MARK2 ; MARK VALUE
1928 VALFL2: ADD C,[4,,4]
1929 JUMPL C,VALFL1 ; JUMP IF MORE
1931 HRLM LPVP,(P) ; SAVE POINTER
1932 VALFL7: MOVEI C,(LPVP)
1936 VALFL5: HRRZ C,(C) ; CHAIN
1938 MOVEI B,TATOM ; TREAT LIKE AN ATOM
1940 PUSHJ P,MARKQ1 ; NO, SEE
1942 AOS -1(P) ; MARK WILL OCCUR
1943 MOVEI B,TATOM ; RELATAVIZE
1947 ADD C,[2,,2] ; POINT TO VALUE
1948 PUSHJ P,MARK2 ; MARK VALUE
1953 VALFL4: HRRZ C,(P) ; GET SAVED LPVP
1955 HRRZ C,2(C) ; POINT TO NEXT
1959 HRRM LPVP,2(A) ; NEW PROCESS WAS MARKED
1962 ZERSLT: HRRI B,(A) ; COPY POINTER
1967 VALFL9: HLRZ LPVP,(P) ; RESTORE CHAIN
1970 \f;SUBROUTINE TO SEE IF A GOODIE IS MARKED
1971 ;RECEIVES POINTER IN C
1972 ;SKIPS IF MARKED NOT OTHERWISE
1974 MARKQ: HLRZ B,(C) ;TYPE TO B
1975 MARKQ1: MOVE E,1(C) ;DATUM TO C
1977 CAIL 0,@PURBOT ; DONT CHACK PURE
1978 JRST MKD ; ALWAYS MARKED
1979 ANDI B,TYPMSK ; FLUSH MONITORS
1981 HRRZ B,@TYPNT ;GOBBLE SAT
1983 CAIG B,NUMSAT ; SKIP FOR TEMPLATE
1984 JRST @MQTBS(B) ;DISPATCH
1985 ANDI E,-1 ; FLUSH REST HACKS
1993 DISTB2 DUM3,MKD,[[S2WORD,PAIRMQ],[S2DEFR,PAIRMQ],[SNWORD,VECMQ],[S2NWORD,VECMQ]
1994 [STPSTK,VECMQ],[SARGS,ARGMQ],[SPSTK,VECMQ],[SFRAME,FRMQ],[SLOCID,LOCMQ]
1995 [SATOM,ATMMQ],[SPVP,VECMQ],[SCHSTR,BYTMQ],[SLOCA,ARGMQ],[SLOCU,VECMQ]
1996 [SLOCV,VECMQ],[SLOCS,BYTMQ],[SLOCN,ASMQ],[SASOC,ASMQ],[SLOCL,PAIRMQ],[SGATOM,ATMMQ]
1997 [SBYTE,BYTMQ],[SLOCB,BYTMQ],[SDEFQ,PAIRMQ],[SOFFS,OFFSMQ]]
2001 PAIRMQ: JUMPE E,MKD ; NIL ALWAYS MARKED
2002 SKIPL (E) ; SKIP IF MARKED
2008 BYTMQ: PUSH P,A ; SAVE A
2009 PUSHJ P,BYTDOP ; GET PTR TO DOPE WORD
2010 MOVE E,A ; COPY POINTER
2012 SKIPGE (E) ; SKIP IF NOT MARKED
2016 FRMQ: HRRZ E,(C) ; POINT TO PV DOPE WORD
2019 ATMMQ: CAML 0,GCSBOT ; ALWAYS KEEP FROZEN ATOMS
2024 VECMQ: HLRE 0,E ;GET LENGTH
2025 SUB E,0 ;POINT TO DOPE WORDS
2027 VECMQ1: SKIPGE 1(E) ;SKIP IF NOT MARKED
2028 AOS (P) ;MARKED, CAUSE SKIP RETURN
2034 LOCMQ: HRRZ 0,(C) ; GET TIME
2035 JUMPE 0,VECMQ ; GLOBAL, LIKE VECTOR
2036 HLRE 0,E ; FIND DOPE
2038 MOVEI E,1(E) ; POINT TO LAST DOPE
2039 CAMN E,TPGROW ; GROWING?
2040 SOJA E,VECMQ1 ; YES, CHECK
2041 ADDI E,PDLBUF ; FUDGE
2046 OFFSMQ: HLRZS E ; POINT TO LIST STRUCTURE
2047 SKIPGE (E) ; MARKED?
2051 \f; SUBROUTINE TO UPDATE ASSOCIATIONS AND MOVE THEM INTO THE INF
2053 ASSOUP: MOVE A,GCNOD ; RECOVER PTR TO START OF CHAIN
2054 ASSOP1: HRRZ B,NODPNT(A)
2055 PUSH P,B ; SAVE NEXT ON CHAIN
2057 HRRZ B,ASOLNT-1(A) ;POINT TO NEXT
2059 HRRZ C,ASOLNT+1(B) ;AND GET ITS RELOC IN C
2060 SUBI C,ASOLNT+1(B) ; RELATIVIZE
2061 ADDM C,ASOLNT-1(A) ;C NOW HAS UPDATED POINTER
2062 ASOUP1: HLRZ B,ASOLNT-1(A) ;GET PREV BLOCK POINTER
2064 HRRZ EXTAC,ASOLNT+1(B) ;AND ITS RELOCATION
2065 SUBI EXTAC,ASOLNT+1(B) ; RELATIVIZE
2067 ADDM EXTAC,ASOLNT-1(A) ;RELOCATE
2068 ASOUP2: HRRZ B,NODPNT(A) ;UPDATE NODE CHAIN
2070 HRRZ C,ASOLNT+1(B) ;GET RELOC
2071 SUBI C,ASOLNT+1(B) ; RELATIVIZE
2072 ADDM C,NODPNT(A) ;AND UPDATE
2073 ASOUP4: HLRZ B,NODPNT(A) ;GET PREV POINTER
2075 HRRZ EXTAC,ASOLNT+1(B) ;RELOC
2076 SUBI EXTAC,ASOLNT+1(B)
2078 ADDM EXTAC,NODPNT(A)
2079 ASOUP5: POP P,A ; RECOVER PTR TO DOPE WORD
2082 POP P,A ; RECOVER PTR TO ASSOCIATION
2083 JUMPN A,ASSOP1 ; IF NOT ZERO CONTINUP
2087 ; HERE TO CLEAN UP ATOM HASH TABLE
2089 ATCLEA: MOVE A,GCHSHT ; GET TABLE POINTER
2092 SKIPE C,(A) ; GET NEXT
2093 JRST ATCLE2 ; GOT ONE
2095 ATCLE3: PUSHJ P,OUTATM
2098 MOVE A,GCHSHT ; MOVE OUT TABLE
2106 ATCLE5: CAIL C,HIBOT
2108 CAMG C,VECBOT ; FROZEN ATOMS ALWAYS MARKED
2110 SKIPL 1(C) ; SKIP IF ATOM MARKED
2113 HRRZ 0,1(C) ; GET DESTINATION
2114 CAIN 0,-1 ; FROZEN/MAGIC ATOM
2115 MOVEI 0,1(C) ; USE CURRENT POSN
2116 SUBI 0,1 ; POINT TO CORRECT DOPE
2117 JUMPN B,ATCLE7 ; JUMP IF GOES INTO ATOM
2119 HRRZM 0,(A) ; INTO HASH TABLE
2122 ATCLE7: HRLM 0,2(B) ; INTO PREV ATOM
2126 ANDI B,377777 ; KILL MARK BIT
2131 JUMPE C,ATCLE3 ; DONE WITH BUCKET
2134 ; HERE TO PASS OVER LOST ATOM
2136 ATCLE6: HLRZ EXTAC,1(C) ; FIND NEXT ATOM
2146 OUTATM: JUMPE B,CPOPJ
2154 POP P,A ; RECOVER PTR TO ASSOCIATION
2158 VCMLOS: FATAL AGC--VECTOR WITH ZERO IN DOPE WORD LENGTH
2161 ; THESE ARE THE MESSAGES INDICATING THE CAUSE OF THE GC
2163 MSGGCT: [ASCIZ /USER CALLED- /]
2164 [ASCIZ /FREE STORAGE- /]
2165 [ASCIZ /TP-STACK- /]
2166 [ASCIZ /TOP-LEVEL LOCALS- /]
2167 [ASCIZ /GLOBAL VALUES- /]
2169 [ASCIZ /STATIONARY IMPURE STORAGE- /]
2171 [ASCIZ /BOTH STACKS BLOWN- /]
2172 [ASCIZ /PURE STORAGE- /]
2173 [ASCIZ /GC-RCALL- /]
2175 ; THESE ARE MESSAGES INDICATING WHO CAUSED THE GC
2181 MSGGFT: [ASCIZ /GC-READ /]
2189 [ASCIZ /PURE-PAGE LOADER /]
2191 [ASCIZ /INTERRUPT-HANDLER /]
2196 .GLOBAL GCNO,BSTGC,BSTAT,NOWFRE,CURFRE,MAXFRE,USEFRE,NOWTP,CURTP,CTPMX,NOWLFL
2197 .GLOBAL CURLVL,NOWGVL,CURGVL,NOWTYP,CURTYP,NOWSTO,CURSTO,CURMAX,NOWP,CURP,CPMX
2198 .GLOBAL GCCAUS,GCCALL,LVLINC,GVLINC,TYPIC,STORIC,RCL,RCLV,GCDANG,GETNUM,RPTOP,CORTOP
2199 .GLOBAL TPGROW,PPGROW,PGROW,PMAIN,PGOOD,PMAX,TPGOOD,TPMIN,TPMAX,RFRETP,TYPTAB
2200 .GLOBAL NNPRI,NNSAT,TYPSAV,BUFGC,GCTIM,GPURFL,GCDFLG,DUMFLG
2201 .GLOBAL TPBINC,GBLINC,TYPINC,CONADJ,OGCSTP,ABOTN,MAXLEN
2202 .GLOBAL PURMIN,GCMONF,.LIST.,FPAG,PMIN,GLBINC,INCORF,PURCOR,GCHAIR
2210 ; LOCACTIONS USED BY THE PAGE HACKER
2214 ;VARIABLES WHICH DETERMIN WHEN MUDDLE WILL ASK FOR MORE CORE,
2215 ;AND WHEN IT WILL GET UNHAPPY
2219 GCHSHT: 0 ; SAVED ATOM TABLE
2220 PURSVT: 0 ; SAVED PURVEC TABLE
2221 GLTOP: 0 ; SAVE GLOTOP
2222 GCNOD: 0 ; PTR TO START OF ASSOCIATION CHAIN
2223 GCGBSP: 0 ; SAVED GLOBAL SP
2224 GCASOV: 0 ; SAVED PTR TO ASSOCIATION VECTOR
2225 GCATM: 0 ; PTR TO IMQUOT THIS-PROCESS
2226 NPARBO: 0 ; SAVED PARBOT
2229 ; CONSTANTS FOR DUMPER,READER AND PURIFYER
2235 ; VARIABLE USED BY MARK SWEEP GARBAGE COLLECTOR
2245 DEFINE HERE G00002,G00003
2246 G00002!G00003!TERMIN
2273 .LOP <ASH @> ZZ2 <,-10.>
2276 .LOP <ASH @> SECLEN <,10.>
2279 .LOP <ASH @> AGCLD <,-10.>