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 SKIPN INBLOT ; STORE TIME ONLY IF NO RETRY
340 MOVEM B,GCTIM ; SAVE ELAPSED TIME FOR INT-HANDLER
341 SKIPN GCMONF ; SEE IF MONITORING
343 PUSHJ P,FIXSEN ; OUTPUT TIME
344 MOVEI A,15 ; OUTPUT C/R LINE-FEED
348 GCCONT: MOVE C,[NTPGOO,,NTPMAX] ; MAY FIX UP TP PARAMS TO ENCOURAGE
349 ; SHRINKAGE FOR EXTRA ROOM
351 MOVE C,[ETPGOO,,ETPMAX]
354 POP P,D ; RESTORE AC'C
359 JUMPE A,AGCWIN ; IF ZERO THE GC WORKED
360 SKIPN GCHAIR ; SEE IF HAIRY GC
362 REAGCX: MOVEI A,1 ; PREPARE FOR A HAIRY GC
365 MOVE C,[11,,10.] ; REASON FOR GC
370 FATAL AGC--NO CORE AVAILABLE TO SATISFY REQUESTS
373 AGCWIN: SETZM PARNEW ;CLEAR FOR NEXT AGC CALL
374 SETZM GETNUM ;ALSO CLEAR THIS
378 SETZM PGROW ; CLEAR GROWTH
380 SETOM GCHAPN ; INDICATE A GC HAS HAPPENED
382 SETOM INTFLG ; AND REQUEST AN INTERRUPT
386 JUMPN M,FINAGC ; IF M 0, RUNNING RSUBR SWAPPED OUT
387 SKIPE PLODR ; IF LOADING ONE, IT MIGHT NOT HAVE ARRIVED
390 FATAL AGC--RUNNING RSUBR WENT AWAY
392 AGCE1: FATAL AGC--TYPE VECTOR NOT OF TYPE VECTOR
394 \f; CORE ADJUSTMENT PHASE
396 CORADJ: MOVE A,PURTOP
397 SUB A,CURPLN ; ADJUST FOR RSUBR
399 HRRZ A,FPTR ; NEW GCSTOP
400 ADDI A,1777 ; GCPDL AND ROUND
401 ANDCMI A,1777 ; TO PAGE BOUNDRY
402 MOVEM A,CORTOP ; TAKE CARE OF POSSIBLE LATER LOSSAGE
403 CAMLE A,RPTOP ; SEE IF WE CAN MAP THE WORLD BACK IN
404 FATAL AGC--UNABLE TO MAP GC-SPACE INTO CORE
405 CAMG A,PURBOT ; SEE IF WE HAVE TO PUNT SOME PURE TO DO IT
406 JRST CORAD0 ; DON'T HAVE TO PUNT SOME PURE
407 PUSHJ P,MAPOUT ; GET THE CORE
408 FATAL AGC--PAGES NOT AVAILABLE
410 ; NOW THAT WE ARE ABLE TO MAP TO GCS INTO CORE WE WILL TRY TO HONOR SOME REQUESTS
411 ; FIRST LETS SEE IF WE HAVE TO CORE DOWN.
412 ; GCDOWN IS DEFINED AS AMOUNT FROM FRETOP TO PURBOT NEEDED
414 CORAD0: SKIPN B,GCDOWN ; CORE DOWN?
415 JRST CORAD1 ; NO, LETS GET CORE REQUIREMENTS
416 ADDI A,(B) ; AMOUNT+ONE FREE BLOCK
417 CAMGE A,RPTOP ; CAN WE WIN
418 JRST CORAD3 ; POSSIBLY
420 ; THIS IS A EXIT FOR LOSSAGE WITHOUT A FATAL ERROR
421 CORAD2: SETOM GCDANG ; INDICATE LOSSAGE
423 ; CALCULATE PARAMETERS BEFORE LEAVING
424 CORAD6: MOVE A,PURSVT ; GET PURE TABLE
425 PUSHJ P,SPCOUT ; OUT IT GOES IN CASE IT WAS CHANGED
428 MOVE A,CORTOP ; ADJUST CORE IMAGE
429 ASH A,-10. ; TO PAGES
430 TRYPCO: PUSHJ P,P.CORE
432 MOVE A,CORTOP ; GET IT BACK
439 ; TRIES TO SATISFY REQUEST FOR CORE
440 CORAD1: MOVEM A,CORTOP
442 ADD A,GETNUM ; ADD MINIMUM CORE NEEDED
443 ADDI A,1777 ; ONE BLOCK+ROUND
444 ANDCMI A,1777 ; TO BLOCK BOUNDRY
445 CAMLE A,RPTOP ; CAN WE WIN
448 JRST CORAD7 ; DON'T HAVE TO MAP OUT PURE
452 ; NOW TRY TO GET SLOP SPACE. NOT NECESSARY BUT NICE
453 CORAD7: MOVEM A,CORTOP ; STORE POSSIBLE VALUE
454 MOVE B,RPTOP ; GET REAL PURTOP
455 SUB B,PURMIN ; KEEP PURMIN
456 CAMG B,CORTOP ; SEE IF CORTOP IS ALREADY HIGH
457 MOVE B,CORTOP ; DONT GIVE BACK WHAT WE GOT
458 MOVEM B,RPTOP ; FOOL CORE HACKING
460 ANDCMI A,1777 ; TO PAGE BOUNDRY
461 CAMGE A,RPTOP ; DO WE WIN TOTALLY
463 MOVE A,RPTOP ; GET AS MUCH CORE AS POSSIBLE
465 JRST CORAD6 ; LOSE, BUT YOU CAN'T HAVE EVERYTHING
466 CORAD4: CAMG A,PURBOT ; DO WE HAVE TO PUNT SOME PURE
468 PUSHJ P,MAPOUT ; GET IT
470 MOVEM A,CORTOP ; ADJUST PARAMETER
471 JRST CORAD6 ; WIN TOTALLY
472 CORAD8: MOVEM A,CORTOP ; NEW CORTOP
475 ; WE CAN CORE DOWN NOW TO SEE IF WE CAN GET SOME SLOP SPACE
479 CAMGE A,PURBOT ; CAN WE WIN
482 CORAD9: SUB A,GCDOWN ; SATISFY GCDOWN REQUEST
483 JRST CORAD4 ; GO CHECK ALLOCATION
485 MAPOUT: PUSH P,A ; SAVE A
486 SUB A,P.TOP ; AMOUNT TO GET
488 ANDCMI A,1777 ; TO PAGE BOUNDRY
489 ASH A,-PGSZ ; TO PAGES
490 PUSHJ P,GETPAG ; GET THEN
491 JRST MAPLOS ; LOSSAGE
492 AOS -1(P) ; INDICATE WINNAGE
498 \f; CONVERSION FROM FLOAT TO DECIMAL. X 100 AND SEND OUT WITH APPROPRIATELY PLACED DECIMAL
501 FIXSEN: PUSH P,B ; SAVE TIME
502 MOVEI B,[ASCIZ /TIME= /]
503 PUSHJ P,MSGTYP ; PRINT OUT MESSAGE
505 FMPRI B,(100.0) ; CONVERT TO FIX
509 MOVEI A,1 ; INITIALIZE COUNT OF CHARACTERS FOR PUTTING OUT TIME
511 IDIVI C,10. ; START COUNTING
515 CAIN A,1 ; SEE IF THERE IS ONLY ONE CHARACTER
517 FIXOUT: IDIVI C,10. ; RECOVER NUMBER
522 CAIN A,2 ; DECIMAL POINT HERE?
524 FIX1: HLRZ A,(P)-1 ; GET NUMBER
525 ADDI A,60 ; MAKE IT A CHARACTER
526 PUSHJ P,IMTYO ; OUT IT GOES
532 DOT1: MOVEI A,". ; OUTPUT DECIMAL POINT AND PADDING 0
536 JRST FIXOUT ; CONTINUE
537 DOT2: MOVEI A,". ; OUTPUT DECIMAL POINT
542 \f; SUBROUTINE TO CHECK SIZE OF PDLS AND DO FENCEPOSTING
544 PDLCHK: JUMPGE A,CPOPJ
545 HLRE B,A ;GET NEGATIVE COUNT
546 MOVE C,A ;SAVE A COPY OF PDL POINTER
547 SUBI A,-1(B) ;LOCATE DOPE WORD PAIR
548 HRRZS A ; ISOLATE POINTER
549 CAME A,TPGROW ;GROWING?
550 ADDI A,PDLBUF ;NO, POINT TO REAL DOPE WORD
554 SETOM 1(C) ; START FENECE POST
557 MOVSI D,1(C) ;YES, SET UP TO BLT FENCE POSTS
559 BLT D,-2(A) ;FENCE POST ALL EXCEPT DOPE WORDS
562 NOFENC: CAMG B,TPMAX ;NOW CHECK SIZE
564 JRST MUNGTP ;TOO BIG OR TOO SMALL
567 MUNGTP: SUB B,TPGOOD ;FIND DELTA TP
568 MUNG3: MOVE C,-1(A) ;IS GROWTH ALREADY SPECIFIED
569 TRNE C,777000 ;SKIP IF NOT
570 POPJ P, ;ASSUME GROWTH GIVEN WILL WIN
572 ASH B,-6 ;CONVERT TO NUMBER OF BLOCKS
574 CAILE B,377 ; SKIP IF BELOW MAX
575 MOVEI B,377 ; ELSE USE MAX
576 TRO B,400 ;TURN ON SHRINK BIT
580 MUNGT2: DPB B,[TOPGRO,,-1(A)] ;STORE IN DOPE WORD
583 ; CHECK UNMARKED STACK (NO NEED TO FENCE POST)
585 PDLCHP: HLRE B,A ;-LENGTH TO B
587 SUBI A,-1(B) ;POINT TO DOPE WORD
588 HRRZS A ;ISOLATE POINTER
589 CAME A,PGROW ;GROWING?
590 ADDI A,PDLBUF ;NO, POINT TO REAL DOPE WORD
594 SETOM 1(C) ; START FENECE POST
601 NOPF: CAMG B,PMAX ;TOO BIG?
602 CAMG B,PMIN ;OR TOO LITTLE
603 JRST .+2 ;YES, MUNG IT
609 ; ROUTINE TO PRE MARK SPECIAL HACKS
611 PRMRK: SKIPE GCHAIR ; FLUSH IF NO HAIR
614 SUBI A,(B) ;POINT TO DOPE WORD
615 HLRZ EXTAC,1(A) ; GET LNTH
616 LDB 0,[TOPGRO,,(A)] ; GET GROWTHS
617 TRZE 0,400 ; SIGN HACK
627 HRRM 0,1(A) ; NEW RELOCATION FIELD
628 IORM D,1(A) ;AND MARK
632 \f;GENERAL MARK SUBROUTINE. CALLED TO MARK ALL THINGS
633 ; A/ GOODIE TO MARK FROM
634 ; B/ TYPE OF A (IN RH)
635 ; C/ TYPE,DATUM PAIR POINTER
638 MARK2: HLRZ B,(C) ;GET TYPE
639 MARK1: MOVE A,1(C) ;GET GOODIE
640 MARK: JUMPE A,CPOPJ ; NEVER MARK 0
646 ANDI B,TYPMSK ; FLUSH MONITORS
647 LSH B,1 ;TIMES 2 TO GET SAT
648 HRRZ B,@TYPNT ;GET SAT
651 CAILE B,NUMSAT ; SKIP IF TEMPLATE DATA
659 TBLDIS DUM2,GCRET,[[S2WORD,PAIRMK],[S2DEFR,DEFMK],[SNWORD,VECTMK],[STBASE,TBMK]
660 [STPSTK,TPMK],[SARGS,ARGMK],[S2NWORD,VECTMK],[SPSTK,TPMK],[SSTORE,VECTMK]
661 [SFRAME,FRMK],[SBYTE,BYTMK],[SATOM,ATOMK],[SPVP,VECTMK],[SGATOM,GATOMK]
662 [SLOCID,LOCMK],[SCHSTR,BYTMK],[SASOC,ASMRK],[SLOCL,PAIRMK],[SABASE,ABMK]
663 [SLOCA,ARGMK],[SLOCV,VECTMK],[SLOCU,VECTMK],[SLOCS,BYTMK],[SLOCN,ASMRK]
664 [SLOCR,LOCRMK],[SRDTB,GCRDMK],[SLOCB,BYTMK],[SDEFQ,DEFQMK],[SOFFS,OFFSMK]]NUMSAT,400000
668 ; HERE TO MARK A POSSIBLE DEFER POINTER
670 DEFQMK: GETYP B,(A) ; GET ITS TYPE
673 ANDI B,SATMSK ; AND TO SAT
676 ;HERE TO MARK THAT WHICH IS POINTED TO BY A DEFERRED POINTER
678 DEFMK: SETOM GENFLG ; SET FLAG SAYING DEFERRED
681 ;HERE TO MARK LIST ELEMENTS
683 PAIRMK: SETZM GENFLG ;TURN OF DEFER BIT
684 PUSH P,[0] ; WILL HOLD BACK PNTR
685 MOVEI C,(A) ; POINT TO LIST
686 PAIRM1: CAMGE C,PARTOP ;CHECK FOR BEING IN BOUNDS
688 FATAL AGC--MARKED PAIR OUTSIDE PAIR SPACE
689 SKIPGE B,(C) ;SKIP IF NOT MARKED
690 JRST RETNEW ;ALREADY MARKED, RETURN
692 DOMULT [MOVEM B,(FPTR)]
694 DOMULT [MOVEM 0,1(FPTR)]
695 ADDI FPTR,2 ; MOVE ALONG IN NEW SPACE
697 PAIRM2: MOVEI A,-2(FPTR) ; GET INF ADDR
698 HRRM A,(C) ; LEAVE A POINTER TO NEW HOME
699 HRRZ E,(P) ; GET BACK POINTER
700 JUMPE E,PAIRM7 ; 1ST ONE, NEW FIXUP
702 DOMULT [HRRM A,(E)] ; CLOBBER
703 PAIRM4: MOVEM A,(P) ; NEW BACK POINTER
705 JRST DEFDO ;GO HANDLE DEFERRED POINTER
706 HRLM B,(P) ; SAVE OLD CDR
707 PUSHJ P,MARK2 ;MARK THIS DATUM
708 HRRZ E,(P) ; SMASH CAR IN CASE CHANGED
710 DOMULT [MOVEM A,1(E)]
711 HLRZ C,(P) ;GET CDR OF LIST
712 CAIGE C,@PURBOT ; SKIP IF PURE (I.E. DONT MARK)
713 JUMPN C,PAIRM1 ;IF NOT NIL, MARK IT
716 GCRET: SETZM GENFLG ;FOR PAIRMKS BENEFIT
717 POP P,A ;RESTORE C AND A
719 POPJ P, ;AND RETURN TO CALLER
721 GCRETD: ANDI B,TYPMSK ; TURN OFF MONITORS
722 CAIN B,TLOCR ; SEE IF A LOCR
726 ;HERE TO MARK DEFERRED POINTER
728 DEFDO: PUSH P,B ; PUSH OLD PAIR ON STACK
730 MOVEI C,-1(P) ; USE AS NEW DATUM
731 HRLI C,GCSEG ; KEEP IN CORRECT SECTION
732 PUSHJ P,MARK2 ;MARK THE DATUM
733 HRRZ E,-2(P) ; GET POINTER IN INF CORE
735 DOMULT [MOVEM A,1(E)]
739 JRST GCRET ;AND RETURN
742 PAIRM7: MOVEM A,-1(P) ; SAVE NEW VAL FOR RETURN
745 RETNEW: HRRZ A,(C) ; POINT TO NEW WORLD LOCN
746 HRRZ E,(P) ; BACK POINTER
747 JUMPE E,RETNW1 ; NONE
752 RETNW1: MOVEM A,-1(P)
756 \f; VECTOR AND TP MARKER, SIGN OF TYPNT IS SET BASED ON WHICH ONE
758 TPMK: SETOM GENFLG ;SET TP MARK FLAG
762 MOVEI E,(A) ;SAVE A POINTER TO THE VECTOR
764 SUB A,B ;LOCATE DOPE WORD
765 MOVEI A,1(A) ;ZERO LH AND POINT TO 2ND DOPE WORD
766 CAIL A,STOSTR ; CHECK IN VECTOR SPACE
768 JRST VECTB1 ;LOSE, COMPLAIN
771 HLLM 0,(P) ; SAVE TP VS VECT INDICATOR
772 JUMPE 0,NOBUFR ;IF A VECTOR, NO BUFFER CHECK
773 CAME A,PGROW ;IS THIS THE BLOWN P
774 CAMN A,TPGROW ;IS THIS THE GROWING PDL
775 JRST NOBUFR ;YES, DONT ADD BUFFER
776 ADDI A,PDLBUF ;POINT TO REAL DOPE WORD
777 MOVSI 0,-PDLBUF ;ALSO FIX UP POINTER
779 MOVEM 0,-1(P) ; FIXUP RET'D PNTR
781 NOBUFR: HLRE B,(A) ;GET LENGTH FROM DOPE WORD
782 JUMPL B,EXVECT ; MARKED, LEAVE
783 LDB B,[TOPGRO,,-1(A)] ; GET TOP GROWTH
784 TRZE B,400 ; HACK SIGN BIT
786 ASH B,6 ; CONVERT TO WORDS
787 PUSH P,B ; SAVE TOP GROWTH
788 LDB 0,[BOTGRO,,-1(A)] ;GET GROWTH FACTOR
789 TRZE 0,400 ;KILL SIGN BIT AND SKIP IF +
791 ASH 0,6 ;CONVERT TO NUMBER OF WORDS
792 PUSH P,0 ; SAVE BOTTOM GROWTH
793 ADD B,0 ;TOTAL GROWTH TO B
794 VECOK: HLRE E,(A) ;GET LENGTH AND MARKING
795 MOVEI EXTAC,(E) ;SAVE A COPY
796 ADD EXTAC,B ;ADD GROWTH
797 SUBI E,2 ;- DOPE WORD LENGTH
798 IORM D,(A) ;MAKE SURE NOW MARKED
799 PUSHJ P,ALLOGC ; ALLOCATE SPACE FOR VECTOR IN THE INF
801 VECOK1: JUMPLE E,MOVEC2 ; ZERO LENGTH, LEAVE
802 PUSH P,A ; SAVE POINTER TO DOPE WORD
804 SKIPGE B,-1(A) ;SKIP IF UNIFORM
805 TLNE B,377777-.VECT. ;SKIP IF NOT SPECIAL
806 JUMPE EXTAC,NOTGEN ;JUMP IF NOT A GENERAL VECTOR
808 GENRAL: HLRZ 0,B ;CHECK FOR PSTACK
810 JUMPE 0,NOTGEN ;IT ISN'T GENERAL
811 JUMPN EXTAC,TPMK1 ; JUMP IF TP
813 SUBI C,1(E) ; C POINTS TO BEGINNING OF VECTOR
815 \f; LOOP TO MARK ELEMENTS IN A GENERAL VECTOR
816 VECTM2: HLRE B,(C) ;GET TYPE AND MARKING
817 JUMPL B,UMOVEC ;RETURN, (EITHER DOPE WORD OR FENCE POST)
818 MOVE A,1(C) ;DATUM TO A
821 VECTM3: PUSHJ P,MARK ;MARK DATUM
822 MOVEM A,1(C) ; IN CASE WAS FIXED
827 MOVEC2: POP P,C ; RESTORE BOTTOM GROWTH
828 CAMGE A,GCSBOT ; DONT DO THIS STUFF IF THIS IS FROZEN
830 HRRZ B,-1(P) ; GET POINTER INTO INF
833 MOVEC3: HLLZ 0,-1(A) ; MODIFY DOPE WORD AND PLACE IN INF
835 HRRZ EXTAC,(A) ; DESTINATION OF DOPEWORDS (SORT OF)
836 HRLI EXTAC,GCSEG ; MAKE INTO CORRECT KIND OF ADDR
837 DOMULT [MOVEM 0,-1(EXTAC)]
839 ANDI 0,377777 ; KILL MARK BIT
841 ADD 0,C ; COMPENSATE FOR SHRINKAGE
845 SKIPGE (P) ; ACCOUNT FOR OTHER END SHRINKAGE
848 SUBI 0,2 ; AVOID RE-SENDING DOPE WORDS
849 DOMULT [XBLT 0,] ; MOVE VECTOR TO OTHER IMAGE
854 ADJSP P,-1 ; GET RID OF FPTR
855 PUSHJ P,RELATE ; RELATIVIZE
857 MOVSI 0,PDLBUF ; FIX UP STACK PTR
861 VECLOS: JUMPL C,CCRET ;JUMP IF CAN'T MUNG TYPE
863 MOVEI B,TILLEG ;GET ILLEGAL TYPE
865 MOVEM 0,1(C) ;AND STORE OLD TYPE AS VALUE
866 JRST UMOVEC ;RETURN WITHOUT MARKING VECTOR
868 CCRET: CLEARM 1(C) ;CLOBBER THE DATUM
872 ; ROUTINE TO MARK A TP. IT SCANS THE TP. IT MARKS ALL THE ITEMS AND IT MAPS AN
873 ; UPDATED VERSION INTO THE INFERIOR WITHOUT CHANGING THE ORIGINAL.
876 TPMK2: POP P,A ; RESTORE DW POINTER
877 POP P,C ; AND BOTTOM GROWTH
878 HRRZ E,-1(P) ; FIX UP PARAMS
881 HRRZ B,(A) ; CALCULATE RELOCATION
883 MOVE C,-1(P) ; ADJUST FOR GROWTH
891 TPMK3: HLRZ E,(A) ; GET LENGTH
892 TRZ E,400000 ; GET RID OF MARK BIT
893 SUBI A,-1(E) ;POINT TO FIRST ELEMENT
894 MOVEI C,(A) ;POINT TO FIRST ELEMENT WITH C
895 TPMK4: HLRE B,(C) ;GET TYPE AND MARKING
896 JUMPL B,TPMK7 ;RETURN, (EITHER DOPE WORD OR FENCE POST)
897 HRRZ A,(C) ;DATUM TO A
898 ANDI B,TYPMSK ; FLUSH MONITORS
900 CAIN B,TENTRY ;IS THIS A STACK FRAME
901 JRST MFRAME ;YES, MARK IT
903 CAIN B,TBIND ;OR A BINDING BLOCK
905 CAIE B,TBVL ; CHECK FOR OTHER BINDING HACKS
907 SKIPA ; FIX UP SP-CHAIN
908 CAIN B,TSKIP ; OTHER BINDING HACK
911 TPMK5: PUSH P,(C) ; SAVE BECAUSE FRAMES MIGHT MUNG IT
912 HRRM A,(C) ; FIX UP IN CASE OF SP CHAIN
913 PUSHJ P,MARK1 ;MARK DATUM
917 AOS E,-1(P) ; MOVE OUT TYPE
918 DOMULT [MOVEM A,-1(E)]
921 MOVEM M,(C) ; RESTORE TO OLD VALUE
925 MFRAME: HRRZ 0,1(C) ; SET UP RELITIVIZATION OF PTR TO PREVIOUS
927 HRROI C,FRAMLN+FSAV-1(C) ;POINT TO FUNCTION
929 CAIL A,STOSTR ; CHECK IN VECTOR SPACE
931 JRST MFRAM1 ; IGNORE, NOT IN VECTOR SPACE
932 HRL A,(A) ; GET LENGTH
934 PUSHJ P,MARK ; AND MARK IT
938 HRRZ A,OTBSAV-FSAV+1(C) ; POINT TO TB TO PREVIOUS FRAME
940 ADD A,-2(P) ; RELOCATE IF NOT 0
942 DOMULT [MOVEM A,1(E)]
943 MOVE A,-2(P) ; ADJUST AB SLOT
944 ADD A,ABSAV-FSAV+1(C) ; POINT TO SAVED AB
945 DOMULT [MOVEM A,2(E)]
946 MOVE A,-2(P) ; ADJUST SP SLOT
947 ADD A,SPSAV-FSAV+1(C) ;POINT TO SAVED SP
948 SUB A,-3(P) ; ADJUSTMENT OF LENGTH IF GROWTH
949 DOMULT [MOVEM A,3(E)]
950 HRROI C,PSAV-FSAV(C) ;POINT TO SAVED P
952 ADDI E,FRAMLN ; UPDATE OUT ADDR
954 PUSHJ P,MARK1 ;AND MARK IT
956 DOMULT [MOVEM A,-3(E)] ; STORE UPDATED P
957 HLRE 0,TPSAV-PSAV+1(C)
958 MOVE A,TPSAV-PSAV+1(C)
961 MOVE A,TPSAV-PSAV+1(C)
962 CAME 0,TPGROW ; SEE IF BLOWN
968 DOMULT [MOVEM A,-2(E)] ; AND UPDATED TP
969 MOVE A,PCSAV-PSAV+1(C)
970 DOMULT [MOVEM A,-1(E)] ; DONT FORGET SAVED PC
971 HRROI C,-PSAV+1(C) ; POINT PAST THE FRAME
972 JRST TPMK4 ;AND DO MORE MARKING
974 MBIND: PUSHJ P,FIXBND
975 MOVEI B,TATOM ;FIRST MARK ATOM
976 SKIPN GCHAIR ; IF NO HAIR, MARK ALL NOW
977 SKIPE (P) ; PASSED MARKER, IF SO DONT SKIP
978 JRST MBIND2 ; GO MARK
979 MOVE A,1(C) ; RESTORE A
981 JRST MBIND1 ; NOT IT, CONTINUE SKIPPING
982 HRRM LPVP,2(C) ; SAVE IN RH OF TPVP,,0
983 MOVE 0,-4(P) ; RECOVER PTR TO DOPE WORD
984 HRLM 0,2(C) ; SAVE FOR MOVEMENT
985 MOVEI B,TATOM ; MARK THE BINDING TO THIS PROCESS
986 PUSHJ P,MARK1 ; MARK THE ATOM
987 MOVEI LPVP,(C) ; POINT
988 SETOM (P) ; INDICATE PASSAGE
989 MBIND1: ADDI C,6 ; SKIP BINDING
991 SKIPE -1(P) ; ONLY UPDATE IF SENDING OVER
996 AOS E,-1(P) ; FIX UP CHAIN
997 DOMULT [MOVEM A,-1(E)]
998 MOVEI B,TATOM ; RESTORE IN CASE SMASHED
999 PUSHJ P,MARK1 ; MARK ATOM
1000 AOS E,-1(P) ; SEND IT OUT
1001 DOMULT [MOVEM A,-1(E)]
1003 PUSH P,(C) ; SAVE BECAUSE FRAMES MIGHT MUNG IT
1004 PUSHJ P,MARK2 ;MARK DATUM
1008 AOS E,-1(P) ; SEND IT OUT
1009 DOMULT [MOVEM A,-1(E)]
1011 DOMULT [MOVEM A,(E)] ; SEND OUT VALUE
1013 MOVEM M,(C) ; RESTORE TO OLD VALUE
1015 MOVEI B,TLIST ; POINT TO DECL SPECS
1017 PUSHJ P,MARK ; AND MARK IT
1018 HRR A,(C) ; LIST FIX UP
1019 AOS E,-1(P) ; SEND IT OUT
1020 DOMULT [MOVEM A,-1(E)]
1021 SKIPL A,1(C) ; PREV LOC?
1023 MOVEI B,TLOCI ; NOW MARK LOCATIVE
1025 NOTLCI: AOS E,-1(P) ; SEND IT OUT
1026 DOMULT [MOVEM A,-1(E)]
1030 FIXBND: HRRZ A,(C) ; GET PTR TO CHAIN
1031 SKIPE A ; DO NOTHING IF EMPTY
1035 TPMK8: MOVNI A,1 ; FENCE-POST THE STACK
1036 AOS E,-1(P) ; SEND IT OUT
1037 DOMULT [MOVEM A,-1(E)]
1038 ADDI C,1 ; INCREMENT C FOR FENCE-POST
1039 ADJSP P,-1 ; CLEAN UP STACK
1040 POP P,E ; GET UPDATED PTR TO INF
1041 ADJSP P,-2 ; POP OFF RELOCATION
1046 SUBI C,(A) ; GET # OF WORDS TRANSFERED
1047 SUB B,C ; GET # LEFT
1048 ADDI E,-2(B) ; ADJUST POINTER TO INF
1050 POP P,C ; IS THERE TOP GROWH
1051 ADD E,C ; MAKE ADJUSTMENT FOR TOP GROWTH
1053 HLLZ 0,-1(A) ; MODIFY DOPE WORD AND PLACE IN INF
1055 HRRZ EXTAC,(A) ; DESTINATION OF DOPEWORDS (SORT OF)
1056 HRLI EXTAC,GCSEG ; MAKE INTO CORRECT KIND OF ADDR
1057 DOMULT [MOVEM 0,-1(EXTAC)]
1060 ; ROUTINE TO ALLOCATE ROOM FOR VECTORS IN INFERIOR
1061 ; EXTAC= # OF WORDS TO ALLOCATE
1063 ALLOGC: HRRZS A ; GET ABS VALUE
1064 CAML A,GCSBOT ; SKIP IF IN STORAGE
1065 JRST ALOGC2 ; JUMP IF ALLOCATING
1069 ALOGC1: ADDI FPTR,(EXTAC)
1071 DOMULT [HRRM 0,-1(FPTR)]
1072 DOMULT [HRLM EXTAC,-1(FPTR)]
1075 \f; RELATE RELATAVIZES A POINTER TO A VECTOR
1076 ; B IS THE POINTER A==> DOPE WORD
1078 RELATE: CAMGE A,GCSBOT ; SEE IF IN VECTOR SPACE
1079 POPJ P, ; IF NOT EXIT
1081 HLRE EXTAC,C ; GET LENGTH
1082 HRRZ 0,-1(A) ; CHECK FO GROWTH
1084 LDB 0,[TOPGRO,,-1(A)] ; GET TOP GROWTH
1085 TRZE 0,400 ; HACK SIGN BIT
1087 ASH 0,6 ; CONVERT TO WORDS
1088 SUB EXTAC,0 ; ACCOUNT FOR GROWTH
1089 RELAT1: HRLM EXTAC,C ; PLACE CORRECTED LENGTH BACK IN POINTER
1090 HRRZ EXTAC,(A) ; GET RELOCATED ADDR
1091 SUBI EXTAC,(A) ; FIND RELATIVIZATION AMOUNT
1092 ADD C,EXTAC ; ADJUST POINTER
1093 SUB C,0 ; ACCOUNT FOR GROWTH
1098 \f; MARK TB POINTERS
1099 TBMK: HRRZS A ; CHECK FOR NIL POINTER
1101 JRST GCRET ; IF POINTING TO NIL THEN RETURN
1102 HLRE B,TPSAV(A) ; MAKE POINTER LOOK LIKE A TP POINTER
1103 HRRZ C,TPSAV(A) ; GET TO DOPE WORD
1104 TBMK2: SUB C,B ; POINT TO FIRST DOPE WORD
1105 HRRZ A,(P) ; GET PTR TO FRAME
1106 SUB A,C ; GET PTR TO FRAME
1116 ABMK: HLRE B,A ; FIX UP TO GET TO FRAME
1118 HLRE B,FRAMLN+TPSAV(A) ; FIX UP TO LOOK LIKE TP
1119 HRRZ C,FRAMLN+TPSAV(A)
1125 ARGMK: HRRZ A,1(C) ; GET POINTER
1126 HLRE B,1(C) ; AND LNTH
1127 SUB A,B ; POINT TO BASE
1128 CAIL A,STOSTR ; CHECK IN VECTOR SPACE
1131 HLRZ 0,(A) ; GET TYPE
1135 CAIE 0,TENTRY ; IS NEXT A WINNER?
1137 JRST ARGMK1 ; YES, GO ON TO WIN CODE
1139 ARGMK0: SETZB A,1(C) ; CLOBBER THE CELL
1140 SETZM (P) ; AND SAVED COPY
1143 ARGMK1: MOVE B,1(A) ; ASSUME TTB
1144 ADDI B,(A) ; POINT TO FRAME
1145 CAIE 0,TINFO ; IS IT?
1146 MOVEI B,FRAMLN(A) ; NO, USE OTHER GOODIE
1147 HLRZ 0,OTBSAV(B) ; GET TIME
1148 HRRZ A,(C) ; AND FROM POINTER
1149 CAIE 0,(A) ; SKIP IF WINNER
1151 MOVE A,TPSAV(B) ; GET A RELATAVIZED TP
1155 SUB A,1(C) ; AMOUNT TO RELATAVIZE ARGS
1158 HRRM B,(P) ; PUT RELATAVIZED PTR BACK
1162 ; MARK FRAME POINTERS
1164 FRMK: HLRZ B,A ; GET TIME FROM FRAME PTR
1165 HLRZ EXTAC,OTBSAV(A) ; GET TIME FROM FRAME
1166 CAME B,EXTAC ; SEE IF EQUAL
1168 SUBI C,1 ;PREPARE TO MARK PROCESS VECTOR
1169 HRRZ A,1(C) ;USE AS DATUM
1170 SUBI A,1 ;FUDGE FOR VECTMK
1171 MOVEI B,TPVP ;IT IS A VECTRO
1172 PUSHJ P,MARK ;MARK IT
1173 ADDI A,1 ; READJUST PTR
1174 HRRM A,1(C) ; FIX UP PROCESS SLOT
1175 MOVEI C,1(C) ; SET UP FOR TBMK
1177 JRST TBMK ; MARK LIKE TB
1182 BYTMK: PUSHJ P,BYTDOP ; GET DOPE WORD IN A
1183 HLRZ EXTAC,-1(A) ; GET THE TYPE
1184 ANDI EXTAC,SATMSK ; FLUSH MONITOR BITS
1185 CAIN EXTAC,SATOM ; SEE IF ATOM
1187 HLRE EXTAC,(A) ; GET MARKING
1188 JUMPL EXTAC,BYTREL ; JUMP IF MARKED
1189 HLRZ EXTAC,(A) ; GET LENGTH
1190 PUSHJ P,ALLOGC ; ALLOCATE FOR IT
1191 HRRM 0,(A) ; SMASH IT IN
1194 SUBI 0,1 ; DONT RESEND DW
1195 SUBI B,-1(EXTAC) ; ADJUST INF POINTER
1204 ADDM E,(P) ; RELATAVIZE
1207 ATMSET: PUSH P,A ; SAVE A
1208 HLRZ B,(A) ; GET LENGTH
1209 TRZ B,400000 ; GET RID OF MARK BIT
1210 MOVNI B,-2(B) ; GET LENGTH
1211 ADDI A,-1(B) ; CALCULATE POINTER
1213 MOVEI B,TATOM ; TYPE
1216 JRST BYTREL ; TO BYTREL
1224 PUSH P,A ; PUSH LIST POINTER ON THE STACK
1225 PUSHJ P,MARK2 ; MARK THE LIST
1226 HRLM A,-2(P) ; UPDATE POINTER IN OFFSET
1231 ; MARK ATOMS IN GVAL STACK
1233 GATOMK: HRRZ B,(C) ; POINT TO POSSIBLE GDECL
1237 MOVEI A,(B) ; POINT TO DECL FOR MARK
1241 MOVE C,-1(P) ; RESTORE HOME POINTER
1242 HRRM A,(C) ; CLOBBER UPDATED LIST IN
1243 MOVE A,1(C) ; RESTORE ATOM POINTER
1249 PUSH P,0 ; SAVE POINTER TO INF
1250 SETOM .ATOM. ; SAY ATOM WAS MARKED
1252 PUSHJ P,GETLNT ;GET LENGTH AND CHECK BOUNDS
1253 JRST ATMRL1 ; ALREADY MARKED
1254 PUSH P,A ; SAVE DOPE WORD PTR FOR LATER
1255 HLRZ C,(A) ; FIND REAL ATOM PNTR
1256 SUBI C,400001 ; KILL MARK BIT AND ADJUST
1258 SUBM A,C ; NOW TOP OF ATOM
1259 MRKOBL: MOVEI B,TOBLS
1260 HRRZ A,2(C) ; IF > 0, NOT OBL
1264 PUSHJ P,MARK ; AND MARK IT
1272 NOMKNX: HLRZ B,(C) ; SEE IF UNBOUND
1273 TRZ B,400000 ; TURN OFF MARK BIT
1276 JRST ATOMK1 ; IT IS UNBOUND
1277 HRRZ 0,(C) ; SEE IF VECTOR OR TP POINTER
1278 MOVEI B,TVEC ; ASSUME VECTOR
1280 MOVEI B,TTP ; ITS A LOCAL VALUE
1281 PUSHJ P,MARK1 ; MARK IT
1282 MOVEM A,1(C) ; SMASH INTO SLOT
1283 ATOMK1: HRRZ 0,2(C) ; CHECK IF NOT ON ANY OBLIST
1285 POP P,C ; GET POINTER INTO INF
1288 JUMPN 0,ATMREL ; ALWAYS SEND OUT ATOMS ON NO OBLIST
1290 ; HERE WITH B POINT TO CURRENT DW AND C TO NEW DW, DO IT TO IT
1292 ATMOVX: PUSHJ P,XBLTR
1293 ATMREL: HRRZ E,(A) ; RELATAVIZE
1297 ATMRL1: ADJSP P,-1 ; POP OFF STACK
1300 ; HERE TO MOVE STUFF TO OTHER SEGMENT
1301 ; B==> CURRENT DW, C==> START OF NEW OBJECT (A MUST SURVIVE)
1302 XBLTR: CAMGE B,GCSBOT
1305 HRRZ E,(B) ; NEW DW LOC
1312 MOVE A,EXTAC ; BACK TO A
1315 GETLNT: HLRE B,A ;GET -LNTH
1316 SUB A,B ;POINT TO 1ST DOPE WORD
1317 MOVEI A,1(A) ;POINT TO 2ND DOPE WORD
1318 CAIL A,STOSTR ; CHECK IN VECTOR SPACE
1320 JRST VECTB1 ;BAD VECTOR, COMPLAIN
1321 HLRE B,(A) ;GET LENGTH AND MARKING
1322 IORM D,(A) ;MAKE SURE MARKED
1324 MOVEI EXTAC,(B) ; AMOUNT TO ALLOCATE
1325 PUSHJ P,ALLOGC ;ALLOCATE ROOM
1326 HRRM 0,(A) ; RELATIVIZE
1327 AMTK1: AOS (P) ; A NON MARKED ITEM
1328 AMTKE: POPJ P, ;AND RETURN
1330 GCRET1: ADJSP P,-1 ;FLUSH RETURN ADDRESS
1335 ; MARK NON-GENERAL VECTORS
1337 NOTGEN: CAMN B,[GENERAL+<SPVP,,0>]
1338 JRST GENRAL ;YES, MARK AS A VECTOR
1339 JUMPL B,SPECLS ; COMPLAIN IF A SPECIAL HACK
1340 SUBI A,1(E) ;POINT TO TOP OF A UNIFORM VECTOR
1341 HLRZS B ;ISOLATE TYPE
1343 MOVE EXTAC,B ; AND COPY IT
1344 LSH B,1 ;FIND OUT WHERE IT WILL GO
1345 HRRZ B,@TYPNT ;GET SAT IN B
1347 HRRZ C,SMKTBS(B) ;POINT TO MARK SR
1348 CAIN C,GCRET ;IF NOT A MARKED FROM GOODIE, IGNORE
1350 MOVEI C,-1(A) ;POINT 1 PRIOR TO VECTOR START
1351 PUSH P,E ;SAVE NUMBER OF ELEMENTS
1352 PUSH P,EXTAC ;AND UNIFORM TYPE
1354 UNLOOP: MOVE B,(P) ;GET TYPE
1355 MOVE A,1(C) ;AND GOODIE
1356 TLO C,400000 ;CAN'T MUNG TYPE
1357 PUSHJ P,MARK ;MARK THIS ONE
1358 MOVEM A,1(C) ; LIST FIXUP
1360 AOJA C,UNLOOP ;IF MORE, DO NEXT
1362 ADJSP P,-2 ;REMOVE STACK CRAP
1366 SPECLS: FATAL AGC--UNRECOGNIZED SPECIAL VECTOR
1372 ; ROUTINE TO MARK THE GC-READ TABLE. MARKS THE ATOMS AT THE DOPE WORDS
1373 ; AND UPDATES PTR TO THE TABLE.
1375 GCRDMK: PUSH P,A ; SAVE PTR TO TOP
1376 MOVEI 0,(FPTR) ; SAVE PTR TO INF
1378 PUSHJ P,GETLNT ; GET TO D.W. AND CHECK MARKING
1379 JRST GCRDRL ; RELATIVIZE
1380 PUSH P,A ; SAVE D.W POINTER
1382 MOVE B,ABOTN ; GET TOP OF ATOM TABLE
1384 ADD B,0 ; GET BOTTOM OF ATOM TABLE
1385 GCRD1: CAMG A,B ; DON'T SKIP IF DONE
1387 HLRZ C,(A) ; GET MARKING
1388 TRZN C,400000 ; SKIP IF MARKED
1391 SUBI A,(C) ; GO BACK ONE ATOM
1393 PUSH P,A ; SAVE POINTER
1394 MOVEI C,-2(E) ; SET UP POINTER
1395 MOVEI B,TATOM ; GO TO MARK
1398 MOVEM A,1(C) ; SMASH FIXED UP ATOM BACK IN
1402 GCRD3: SUBI A,(C) ; TO NEXT ATOM
1404 GCRD2: POP P,B ; GET PTR TO D.W.
1405 POP P,C ; GET PTR TO INF
1406 ADJSP P,-1 ; GET RID OF TOP
1408 JRST ATMOVX ; RELATIVIZE AND LEAVE
1410 GCRDRL: POP P,A ; GET PTR TO D.W
1411 ADJSP P,-2 ; GET RID OF TOP AND PTR TO INF
1412 JRST ATMREL ; RELATAVIZE
1415 ;MARK RELATAVIZED GLOC HACKS
1417 LOCRMK: SKIPE GCHAIR
1419 LOCRDP: PUSH P,C ; SAVE C
1420 MOVEI C,-2(A) ; RELATAVIZED PTR TO ATOM
1421 ADD C,GLTOP ; ADD GLOTOP TO GET TO ATOM
1422 MOVEI B,TATOM ; ITS AN ATOM
1426 MOVE A,1(C) ; GET RELATIVIZATION
1427 MOVEM A,(P) ; IT STAYS THE SAVE
1430 ;MARK LOCID TYPE GOODIES
1432 LOCMK: HRRZ B,(C) ;GET TIME
1433 JUMPE B,LOCMK1 ; SKIP LEGAL CHECK FOR GLOBAL
1434 HRRZ 0,2(A) ; GET OTHER TIME
1436 SETZB A,(P) ; NO, SMASH LOCATIVE
1437 JUMPE A,GCRET ; LEAVE IF DONE
1439 MOVEI B,TATOM ; MARK ATOM
1440 MOVEI C,-2(A) ; POINT TO ATOM
1441 MOVE E,(C) ; SEE IF BLOCK IS MARKED
1442 TLNE E,400000 ; SKIP IF MARKED
1443 JRST LOCMK2 ; SKIP OVER BLOCK
1444 SKIPN GCHAIR ; DO NOT MARK IF NOT HAIRY (WILL BE MARKED)
1445 PUSHJ P,MARK1 ; LET LOCATIVE SAVE THE ATOM
1447 HRRZ E,(C) ; TIME BACK
1448 MOVEI B,TVEC ; ASSUME GLOBAL
1450 MOVEI B,TTP ; ITS LOCAL
1451 PUSHJ P,MARK1 ; MARK IT
1456 ; MARK ASSOCIATION BLOCKS
1459 ASMRK1: HRLI A,-ASOLNT ;LOOK LIKE A VECTOR POINTER
1460 PUSHJ P,GETLNT ;GET LENGTH AND CHECK BOUNDS
1461 JRST ASTREL ; ALREADY MARKED
1462 MOVEI C,-ASOLNT-1(A) ;COPY POINTER
1463 PUSHJ P,MARK2 ;MARK ITEM CELL
1465 ADDI C,INDIC-ITEM ;POINT TO INDICATOR
1471 SKIPN GCHAIR ; IF NO HAIR, MARK ALL FRIENDS
1473 HRRZ A,NODPNT-VAL(C) ; NEXT
1474 JUMPN A,ASMRK1 ; IF EXISTS, GO
1475 ASTREL: POP P,A ; RESTORE PTR TO ASSOCIATION
1476 MOVEI A,ASOLNT+1(A) ; POINT TO D.W.
1477 SKIPN NODPNT-ASOLNT-1(A) ; SEE IF EMPTY NODPTR
1478 JRST ASTX ; JUMP TO SEND OUT
1479 ASTR1: HRRZ E,(A) ; RELATAVIZE
1483 ASTX: HRRZ C,(A) ; GET PTR IN FRONTEIR
1484 SUBI C,ASOLNT+1 ; ADJUST TO POINT TO BEGINNING
1489 ;HERE WHEN A VECTOR POINTER IS BAD
1491 VECTB1:FATAL AGC--VECTOR POINTS OUTSIDE OF VECTOR SPACE
1492 ADJSP P,-1 ; RECOVERY
1493 AFIXUP: SETZM (P) ; CLOBBER SLOT
1494 JRST GCRET ; CONTINUE
1497 VECTB2: FATAL AGC--VECTOR POINTS OUT OF VECTOR SPACE
1499 JRST AFIXUP ; RECOVER
1501 PARERR: FATAL AGC--PAIR POINTS OUT OF PAIR SPACE
1502 ADJSP P,-1 ; RECOVER
1506 \f; HERE TO MARK TEMPLATE DATA STRUCTURES
1508 TD.MRK: MOVEI 0,(FPTR) ; SAVE PTR TO INF
1510 HLRZ B,(A) ; GET REAL SPEC TYPE
1511 ANDI B,37777 ; KILL SIGN BIT
1512 MOVEI E,-NUMSAT-1(B) ; GET REL POINTER TO TABLE
1515 HRRZS C,A ; FLUSH COUNT AND SAVE
1516 SKIPL E ; WITHIN BOUNDS
1517 FATAL BAD SAT IN AGC
1518 PUSHJ P,GETLNT ; GOODIE IS NOW MARKED
1519 JRST TMPREL ; ALREADY MARKED
1523 SUB E,TD.AGC+1 ; POINT TO LENGTH
1525 XCT (E) ; RET # OF ELEMENTS IN B
1527 HLRZ D,B ; GET POSSIBLE "BASIC LENGTH" FOR RESTS
1528 PUSH P,[0] ; TEMP USED IF RESTS EXIST
1530 MOVEI B,(B) ; ZAP TO ONLY LENGTH
1531 PUSH P,C ; SAVE POINTER TO TEMPLATE STRUCTURE
1532 PUSH P,[0] ; HOME FOR VALUES
1533 PUSH P,[0] ; SLOT FOR TEMP
1536 PUSH P,E ; SAVE FOR FINDING OTHER TABLES
1537 JUMPE D,TD.MR2 ; NO REPEATING SEQ
1538 ADD E,TD.GET+1 ; COMP LNTH OF REPEATING SEQ
1539 HLRE E,(E) ; E ==> - LNTH OF TEMPLATE
1540 ADDI E,(D) ; E ==> -LENGTH OF REP SEQ
1542 HRLM E,-5(P) ; SAVE IT AND BASIC
1544 TD.MR2: SKIPG D,-1(P) ; ANY LEFT?
1549 MOVE E,(E) ; POINTER TO VECTOR IN E
1550 MOVEM D,-6(P) ; SAVE ELMENT #
1551 SKIPN B,-5(P) ; SKIP IF "RESTS" EXIST
1554 MOVEI 0,(B) ; BASIC LNT TO 0
1555 SUBI 0,(D) ; SEE IF PAST BASIC
1556 JUMPGE 0,.-3 ; JUMP IF O.K.
1557 MOVSS B ; REP LNT TO RH, BASIC TO LH
1558 IDIVI 0,(B) ; A==> -WHICH REPEATER
1560 ADD A,-5(P) ; PLUS BASIC
1561 ADDI A,1 ; AND FUDGE
1562 MOVEM A,-6(P) ; SAVE FOR PUTTER
1563 ADDI E,-1(A) ; POINT
1566 TD.MR3: ADDI E,(D) ; POINT TO SLOT
1567 XCT (E) ; GET THIS ELEMENT INTO A AND B
1568 JFCL ; NO-OP FOR ANY CASE
1569 MOVEM A,-3(P) ; SAVE TYPE FOR LATER PUT
1571 EXCH A,B ; REARRANGE
1573 MOVEI C,-3(P) ; TELL OTHER GUYS THEY CANT DIRECTLY MUNG
1574 MOVSI D,400000 ; RESET FOR MARK
1575 PUSHJ P,MARK ; AND MARK THIS GUY (RET FIXED POINTER IN A)
1576 MOVE C,-4(P) ; REGOBBLE POINTER TO TEMPLATE
1578 MOVE B,-6(P) ; RESTORE COUNT
1580 MOVE E,(E) ; POINTER TO VECTOR IN E
1581 ADDI E,(B)-1 ; POINT TO SLOT
1582 MOVE B,-3(P) ; RESTORE TYPE WORD
1584 SOS D,-1(P) ; GET ELEMENT #
1585 XCT (E) ; SMASH IT BACK
1586 FATAL TEMPLATE LOSSAGE
1587 MOVE C,-4(P) ; RESTORE POINTER IN CASE MUNGED
1590 TD.MR1: MOVE A,-8(P) ; PTR TO DOPE WORD
1591 MOVE B,-7(P) ; RESTORE PTR TO FRONTEIR
1592 ADJSP P,-7 ; CLEAN UP STACK
1593 USRAG1: ADDI A,1 ; POINT TO SECOND D.W.
1594 MOVSI D,400000 ; SET UP MARK BIT
1596 HRRZ C,(A) ; DEST DW
1597 DOMULT [HLRZ E,(C)] ; LENGTH
1604 MOVSI D,400000 ; RESTORE MARK/UNMARK BIT
1607 USRAGC: HRRZ E,(E) ; MARK THE TEMPLATE
1609 MOVE A,-1(P) ; POINTER TO D.W
1610 MOVE B,(P) ; TOINTER TO FRONTIER
1613 ; This phase attempts to remove any unwanted associations. The program
1614 ; loops through the structure marking values of associations. It can only
1615 ; stop when no new values (potential items and/or indicators) are marked.
1617 VALFLS: PUSH P,LPVP ; SAVE LPVP FOR LATER
1618 PUSH P,[0] ; INDICATE WHETHER ANY ON THIS PASS
1619 PUSH P,[0] ; OR THIS BUCKET
1620 ASOMK1: MOVE A,GCASOV ; GET VECTOR POINTER
1621 SETOM -1(P) ; INITIALIZE FLAG
1623 ASOM6: SKIPG C,(A) ; SKIP IF BUCKET TO BE SCANNED
1625 SETOM (P) ; SAY BUCKET NOT CHANGED
1627 ASOM2: MOVEI EXTAC,(C) ; COPY POINTER
1628 SKIPG ASOLNT+1(C) ; SKIP IF NOT ALREADY MARKED
1629 JRST ASOM4 ; MARKED, GO ON
1630 PUSHJ P,MARKQ ; SEE IF ITEM IS MARKED
1631 JRST ASOM3 ; IT IS NOT, IGNORE IT
1632 MOVEI EXTAC,(C) ; IN CASE CLOBBERED BY MARK2
1633 MOVEI C,INDIC(C) ; POINT TO INDICATOR SLOT
1635 JRST ASOM3 ; NOT MARKED
1637 PUSH P,A ; HERE TO MARK VALUE
1639 HLRE EXTAC,ASOLNT-INDIC+1(C) ; GET LENGTH
1640 JUMPL EXTAC,.+3 ; SKIP IF MARKED
1641 CAMGE C,VECBOT ; SKIP IF IN VECT SPACE
1643 HRRM FPTR,ASOLNT-INDIC+1(C) ; PUT IN RELATIVISATION
1644 MOVEI EXTAC,12 ; AMOUNT TO ALLOCATE IN INF
1646 HRRM 0,5(C) ; STICK IN RELOCATION
1648 ASOM20: PUSHJ P,MARK2 ; AND MARK
1649 MOVEM A,1(C) ; LIST FIX UP
1650 ADDI C,ITEM-INDIC ; POINT TO ITEM
1653 ADDI C,VAL-ITEM ; POINT TO VALUE
1656 IORM D,ASOLNT-VAL+1(C) ; MARK ASOC BLOCK
1659 AOSA -1(P) ; INDICATE A MARK TOOK PLACE
1661 ASOM3: AOS (P) ; INDICATE AN UNMARKED IN THIS BUCKET
1662 ASOM4: HRRZ C,ASOLNT-1(EXTAC) ; POINT TO NEXT IN BUCKET
1663 JUMPN C,ASOM2 ; IF NOT EMPTY, CONTINUE
1664 SKIPGE (P) ; SKIP IF ANY NOT MARKED
1665 HRROS (A) ; MARK BUCKET AS NOT INTERESTING
1666 ASOM1: AOBJN A,ASOM6 ; GO TO NEXT BUCKET
1669 JUMPN 0,VALFLA ; YES, CHECK VALUES
1672 ; NOW SEE WHICH CHANNELS STILL POINTED TO
1674 CHNFL3: MOVEI 0,N.CHNS-1
1675 MOVEI A,CHNL1 ; SLOTS
1676 HRLI E,TCHAN ; TYPE HERE TOO
1678 CHNFL2: SKIPN B,1(A)
1681 SUBI B,(C) ; POINT TO DOPE
1682 HLLM E,(A) ; PUT TYPE BACK
1683 HRRE EXTAC,(A) ; SEE IF ALREADY MARKED
1687 HLLOS (A) ; MARK AS A LOSER
1690 CHNFL8: MOVEI EXTAC,1 ; MARK A GOOD CHANNEL
1695 SKIPE GCHAIR ; IF NOT HAIRY CASE
1698 SKIPL -1(P) ; SKIP IF NOTHING NEW MARKED
1701 ADJSP P,-2 ; REMOVE FLAGS
1705 ; HERE TO REEMOVE UNUSED ASSOCIATIONS
1707 MOVE A,GCASOV ; GET ASOVEC BACK FOR FLUSHES
1709 ASOFL1: SKIPN C,(A) ; SKIP IF BUCKET NOT EMPTY
1710 JRST ASOFL2 ; EMPTY BUCKET, IGNORE
1711 HRRZS (A) ; UNDO DAMAGE OF BEFORE
1713 ASOFL5: SKIPGE ASOLNT+1(C) ; SKIP IF UNMARKED
1714 JRST ASOFL6 ; MARKED, DONT FLUSH
1716 HRRZ B,ASOLNT-1(C) ; GET FORWARD POINTER
1717 HLRZ E,ASOLNT-1(C) ; AND BACK POINTER
1718 JUMPN E,ASOFL4 ; JUMP IF NO BACK POINTER (FIRST IN BUCKET)
1719 HRRZM B,(A) ; FIX BUCKET
1722 ASOFL4: HRRM B,ASOLNT-1(E) ; FIX UP PREVIOUS
1723 JUMPE B,.+2 ; JUMP IF NO NEXT POINTER
1724 HRLM E,ASOLNT-1(B) ; FIX NEXT'S BACK POINTER
1725 HRRZ B,NODPNT(C) ; SPLICE OUT THRAD
1732 ASOFL3: HRRZ C,ASOLNT-1(C) ; GO TO NEXT
1734 ASOFL2: AOBJN A,ASOFL1
1738 ; NOW CLOBBER UNMARKED LOCAL NAD GLOBAL VALUES
1740 MOVE A,GCGBSP ; GET GLOBAL PDL
1742 GLOFLS: SKIPGE (A) ; SKIP IF NOT ALREADY MARKED
1745 PUSHJ P,ZERSLT ; CLOBBER THE SLOT
1747 SVDCL: ANDCAM D,(A) ; UNMARK
1749 JUMPL A,GLOFLS ; MORE?, KEEP LOOPING
1752 LOCFL1: HRRZ A,(LPVP) ; NOW CLOBBER LOCAL SLOTS
1755 JUMPE A,LOCFL2 ; NONE TO FLUSH
1757 LOCFLS: SKIPGE (A) ; MARKDE?
1761 ANDCAM D,(A) ;UNMARK
1764 LOCFL2: JUMPN LPVP,LOCFL1 ; JUMP IF MORE PROCESS
1766 ; AT THIS POINT THE LOCALS ARE FINALLY SENT OUT.
1767 ; THIS ROUTINE UPDATES THE THIS-PROCESS BINDING.
1768 ; IT FIXES UP THE SP-CHAIN AND IT
1769 ; SENDS OUT THE ATOMS.
1772 MOVEI B,TATOM ; MARK THE BINDING TO THIS PROCESS
1773 PUSHJ P,MARK1 ; MARK THE ATOM
1774 MOVEM A,1(C) ; NEW HOME
1775 MOVEI C,2(C) ; MARK VALUE
1776 MOVEI B,TPVP ; IT IS A PROCESS VECTOR POINTER
1777 PUSHJ P,MARK1 ; MARK IT
1780 NEXPRO: MOVEI 0,TPVP ; FIX UP SLOT
1781 HLRZ A,2(R) ; GET PTR TO NEXT PROCESS
1783 HRRZ E,(A) ; ADRESS IN INF
1784 HRRZ B,(A) ; CALCULATE RELOCATION
1787 HRRZ EXTAC,A ; CALCULATE START OF TP IN EXTAC
1788 HLRZ B,(A) ; ADJUST INF PTR
1791 LDB M,[TOPGRO,,-1(A)] ; CALCULATE TOP GROWTH
1792 TRZE M,400 ; FUDGE SIGN
1795 ADD B,M ; FIX UP LENGTH
1797 SUBM M,(P) ; FIX RELOCATION TO TAKE INTO ACCOUNT
1799 MOVE M,R ; GET A COPY OF R
1800 NEXP1: HRRZ C,(M) ; GET PTR TO NEXT IN CHAIN
1801 JUMPE C,NEXP2 ; EXIT IF END OF CHAIN
1802 MOVE 0,C ; GET COPY OF CHAIN PTR TO UPDATE
1807 NEXP2: ADJSP P,-1 ; CLEAN UP STACK
1809 MOVEI A,6(R) ; POINT AFTER THE BINDING
1810 MOVE 0,EXTAC ; CALCULATE # OF WORDS TO SEND OUT
1816 HRRZS R,2(R) ; GET THE NEXT PROCESS
1820 MOVE A,GCGBSP ; PTR TO GLOBAL STACK
1821 PUSHJ P,SPCOUT ; SEND IT OUT
1823 PUSHJ P,SPCOUT ; SEND IT OUT
1826 ; THIS ROUTINE MARKS ALL THE CHANNELS
1827 ; IT THEN SENDS OUT A COPY OF THE TVP
1829 CHFIX: MOVEI 0,N.CHNS-1
1830 MOVEI A,CHNL1 ; SLOTS
1831 HRLI E,TCHAN ; TYPE HERE TOO
1833 DHNFL2: SKIPN B,1(A)
1835 MOVEI C,(A) ; MARK THE CHANNEL
1839 MOVEM A,1(C) ; ADJUST PTR
1847 ; ROUTINE TO SEND OUT STUFF - SPCOUX--DONT LOOK AT GROWTH
1848 ; SPCOUT--LOOK AT GROWTH
1850 SPCOUX: TDZA C,C ; ZERO C AS FLAG
1855 MOVEI A,1(A) ; POINT TO DOPE WORD
1858 HLLZ 0,-1(A) ; MODIFY DOPE WORD AND PLACE IN INF
1860 HRRZ B,(A) ; DESTINATION OF DOPEWORDS (SORT OF)
1861 HRLI B,GCSEG ; MAKE INTO CORRECT KIND OF ADDR
1862 DOMULT [MOVEM 0,-1(B)]
1863 JUMPE C,SPCOUY ; JUMP IF NO GROWTH STUFF
1864 LDB C,[BOTGRO,,-1(A)]
1868 SPCOUY: DOMULT [HLRZ 0,(B)]
1869 ADD 0,C ; COMPENSATE FOR SHRINKAGE
1870 SUBI 0,1 ; DONT RESEND DW
1873 DOMULT [XBLT 0,] ; MOVE VECTOR TO OTHER IMAGE
1876 ASOFL6: HLRZ E,ASOLNT-1(C) ; SEE IF FIRST IN BUCKET
1877 JUMPN E,ASOFL3 ; IF NOT CONTINUE
1878 HRRZ E,ASOLNT+1(C) ; GET PTR FROM DOPE WORD
1879 SUBI E,ASOLNT+1 ; ADJUST TO POINT TO BEGINNING OF ALSSOCIATION
1880 HRRZM E,(A) ; SMASH IT IN
1884 MARK23: PUSH P,A ; SAVE BUCKET POINTER
1890 AOS -2(P) ; MARKING HAS OCCURRED
1891 IORM D,ASOLNT+1(C) ; MARK IT
1894 \f; CHANNEL FLUSHER FOR NON HAIRY GC
1897 SETOM (P) ; RESET FOR RETRY
1904 ; VALUE FLUSHING PHASE, HACKS BOTTOM OF TP AND GLOBAL SP
1906 VALFLA: MOVE C,GCGBSP ; GET POINTER TO GLOBAL STACK
1907 VALFL1: SKIPL (C) ; SKIP IF NOT MARKED
1908 PUSHJ P,MARKQ ; SEE IF ATOM IS MARKED
1911 MOVEI B,TATOM ; UPDATE ATOM SLOT
1915 AOS -2(P) ; INDICATE MARK OCCURRED
1916 HRRZ B,(C) ; GET POSSIBLE GDECL
1917 JUMPE B,VLFL10 ; NONE
1918 CAIN B,-1 ; MAINFIFEST
1923 PUSHJ P,MARK ; MARK IT
1925 HRRM A,(C) ; CLOBBER UPDATE IN
1926 VLFL10: ADD C,[2,,2] ; BUMP TO VALUE
1927 PUSHJ P,MARK2 ; MARK VALUE
1930 VALFL2: ADD C,[4,,4]
1931 JUMPL C,VALFL1 ; JUMP IF MORE
1933 HRLM LPVP,(P) ; SAVE POINTER
1934 VALFL7: MOVEI C,(LPVP)
1938 VALFL5: HRRZ C,(C) ; CHAIN
1940 MOVEI B,TATOM ; TREAT LIKE AN ATOM
1942 PUSHJ P,MARKQ1 ; NO, SEE
1944 AOS -1(P) ; MARK WILL OCCUR
1945 MOVEI B,TATOM ; RELATAVIZE
1949 ADD C,[2,,2] ; POINT TO VALUE
1950 PUSHJ P,MARK2 ; MARK VALUE
1955 VALFL4: HRRZ C,(P) ; GET SAVED LPVP
1957 HRRZ C,2(C) ; POINT TO NEXT
1961 HRRM LPVP,2(A) ; NEW PROCESS WAS MARKED
1964 ZERSLT: HRRI B,(A) ; COPY POINTER
1969 VALFL9: HLRZ LPVP,(P) ; RESTORE CHAIN
1972 \f;SUBROUTINE TO SEE IF A GOODIE IS MARKED
1973 ;RECEIVES POINTER IN C
1974 ;SKIPS IF MARKED NOT OTHERWISE
1976 MARKQ: HLRZ B,(C) ;TYPE TO B
1977 MARKQ1: MOVE E,1(C) ;DATUM TO C
1979 CAIL 0,@PURBOT ; DONT CHACK PURE
1980 JRST MKD ; ALWAYS MARKED
1981 ANDI B,TYPMSK ; FLUSH MONITORS
1983 HRRZ B,@TYPNT ;GOBBLE SAT
1985 CAIG B,NUMSAT ; SKIP FOR TEMPLATE
1986 JRST @MQTBS(B) ;DISPATCH
1987 ANDI E,-1 ; FLUSH REST HACKS
1995 DISTB2 DUM3,MKD,[[S2WORD,PAIRMQ],[S2DEFR,PAIRMQ],[SNWORD,VECMQ],[S2NWORD,VECMQ]
1996 [STPSTK,VECMQ],[SARGS,ARGMQ],[SPSTK,VECMQ],[SFRAME,FRMQ],[SLOCID,LOCMQ]
1997 [SATOM,ATMMQ],[SPVP,VECMQ],[SCHSTR,BYTMQ],[SLOCA,ARGMQ],[SLOCU,VECMQ]
1998 [SLOCV,VECMQ],[SLOCS,BYTMQ],[SLOCN,ASMQ],[SASOC,ASMQ],[SLOCL,PAIRMQ],[SGATOM,ATMMQ]
1999 [SBYTE,BYTMQ],[SLOCB,BYTMQ],[SDEFQ,PAIRMQ],[SOFFS,OFFSMQ]]
2003 PAIRMQ: JUMPE E,MKD ; NIL ALWAYS MARKED
2004 SKIPL (E) ; SKIP IF MARKED
2010 BYTMQ: PUSH P,A ; SAVE A
2011 PUSHJ P,BYTDOP ; GET PTR TO DOPE WORD
2012 MOVE E,A ; COPY POINTER
2014 SKIPGE (E) ; SKIP IF NOT MARKED
2018 FRMQ: HRRZ E,(C) ; POINT TO PV DOPE WORD
2021 ATMMQ: CAML 0,GCSBOT ; ALWAYS KEEP FROZEN ATOMS
2026 VECMQ: HLRE 0,E ;GET LENGTH
2027 SUB E,0 ;POINT TO DOPE WORDS
2029 VECMQ1: SKIPGE 1(E) ;SKIP IF NOT MARKED
2030 AOS (P) ;MARKED, CAUSE SKIP RETURN
2036 LOCMQ: HRRZ 0,(C) ; GET TIME
2037 JUMPE 0,VECMQ ; GLOBAL, LIKE VECTOR
2038 HLRE 0,E ; FIND DOPE
2040 MOVEI E,1(E) ; POINT TO LAST DOPE
2041 CAMN E,TPGROW ; GROWING?
2042 SOJA E,VECMQ1 ; YES, CHECK
2043 ADDI E,PDLBUF ; FUDGE
2048 OFFSMQ: HLRZS E ; POINT TO LIST STRUCTURE
2049 SKIPGE (E) ; MARKED?
2053 \f; SUBROUTINE TO UPDATE ASSOCIATIONS AND MOVE THEM INTO THE INF
2055 ASSOUP: MOVE A,GCNOD ; RECOVER PTR TO START OF CHAIN
2056 ASSOP1: HRRZ B,NODPNT(A)
2057 PUSH P,B ; SAVE NEXT ON CHAIN
2059 HRRZ B,ASOLNT-1(A) ;POINT TO NEXT
2061 HRRZ C,ASOLNT+1(B) ;AND GET ITS RELOC IN C
2062 SUBI C,ASOLNT+1(B) ; RELATIVIZE
2063 ADDM C,ASOLNT-1(A) ;C NOW HAS UPDATED POINTER
2064 ASOUP1: HLRZ B,ASOLNT-1(A) ;GET PREV BLOCK POINTER
2066 HRRZ EXTAC,ASOLNT+1(B) ;AND ITS RELOCATION
2067 SUBI EXTAC,ASOLNT+1(B) ; RELATIVIZE
2069 ADDM EXTAC,ASOLNT-1(A) ;RELOCATE
2070 ASOUP2: HRRZ B,NODPNT(A) ;UPDATE NODE CHAIN
2072 HRRZ C,ASOLNT+1(B) ;GET RELOC
2073 SUBI C,ASOLNT+1(B) ; RELATIVIZE
2074 ADDM C,NODPNT(A) ;AND UPDATE
2075 ASOUP4: HLRZ B,NODPNT(A) ;GET PREV POINTER
2077 HRRZ EXTAC,ASOLNT+1(B) ;RELOC
2078 SUBI EXTAC,ASOLNT+1(B)
2080 ADDM EXTAC,NODPNT(A)
2081 ASOUP5: POP P,A ; RECOVER PTR TO DOPE WORD
2084 POP P,A ; RECOVER PTR TO ASSOCIATION
2085 JUMPN A,ASSOP1 ; IF NOT ZERO CONTINUP
2089 ; HERE TO CLEAN UP ATOM HASH TABLE
2091 ATCLEA: MOVE A,GCHSHT ; GET TABLE POINTER
2094 SKIPE C,(A) ; GET NEXT
2095 JRST ATCLE2 ; GOT ONE
2097 ATCLE3: PUSHJ P,OUTATM
2100 MOVE A,GCHSHT ; MOVE OUT TABLE
2108 ATCLE5: CAIL C,HIBOT
2110 CAMG C,VECBOT ; FROZEN ATOMS ALWAYS MARKED
2112 SKIPL 1(C) ; SKIP IF ATOM MARKED
2115 HRRZ 0,1(C) ; GET DESTINATION
2116 CAIN 0,-1 ; FROZEN/MAGIC ATOM
2117 MOVEI 0,1(C) ; USE CURRENT POSN
2118 SUBI 0,1 ; POINT TO CORRECT DOPE
2119 JUMPN B,ATCLE7 ; JUMP IF GOES INTO ATOM
2121 HRRZM 0,(A) ; INTO HASH TABLE
2124 ATCLE7: HRLM 0,2(B) ; INTO PREV ATOM
2128 ANDI B,377777 ; KILL MARK BIT
2133 JUMPE C,ATCLE3 ; DONE WITH BUCKET
2136 ; HERE TO PASS OVER LOST ATOM
2138 ATCLE6: HLRZ EXTAC,1(C) ; FIND NEXT ATOM
2148 OUTATM: JUMPE B,CPOPJ
2156 POP P,A ; RECOVER PTR TO ASSOCIATION
2160 VCMLOS: FATAL AGC--VECTOR WITH ZERO IN DOPE WORD LENGTH
2163 ; THESE ARE THE MESSAGES INDICATING THE CAUSE OF THE GC
2165 MSGGCT: [ASCIZ /USER CALLED- /]
2166 [ASCIZ /FREE STORAGE- /]
2167 [ASCIZ /TP-STACK- /]
2168 [ASCIZ /TOP-LEVEL LOCALS- /]
2169 [ASCIZ /GLOBAL VALUES- /]
2171 [ASCIZ /STATIONARY IMPURE STORAGE- /]
2173 [ASCIZ /BOTH STACKS BLOWN- /]
2174 [ASCIZ /PURE STORAGE- /]
2175 [ASCIZ /GC-RCALL- /]
2177 ; THESE ARE MESSAGES INDICATING WHO CAUSED THE GC
2183 MSGGFT: [ASCIZ /GC-READ /]
2191 [ASCIZ /PURE-PAGE LOADER /]
2193 [ASCIZ /INTERRUPT-HANDLER /]
2198 .GLOBAL GCNO,BSTGC,BSTAT,NOWFRE,CURFRE,MAXFRE,USEFRE,NOWTP,CURTP,CTPMX,NOWLFL
2199 .GLOBAL CURLVL,NOWGVL,CURGVL,NOWTYP,CURTYP,NOWSTO,CURSTO,CURMAX,NOWP,CURP,CPMX
2200 .GLOBAL GCCAUS,GCCALL,LVLINC,GVLINC,TYPIC,STORIC,RCL,RCLV,GCDANG,GETNUM,RPTOP,CORTOP
2201 .GLOBAL TPGROW,PPGROW,PGROW,PMAIN,PGOOD,PMAX,TPGOOD,TPMIN,TPMAX,RFRETP,TYPTAB
2202 .GLOBAL NNPRI,NNSAT,TYPSAV,BUFGC,GCTIM,GPURFL,GCDFLG,DUMFLG
2203 .GLOBAL TPBINC,GBLINC,TYPINC,CONADJ,OGCSTP,ABOTN,MAXLEN
2204 .GLOBAL PURMIN,GCMONF,.LIST.,FPAG,PMIN,GLBINC,INCORF,PURCOR,GCHAIR
2212 ; LOCACTIONS USED BY THE PAGE HACKER
2216 ;VARIABLES WHICH DETERMIN WHEN MUDDLE WILL ASK FOR MORE CORE,
2217 ;AND WHEN IT WILL GET UNHAPPY
2221 GCHSHT: 0 ; SAVED ATOM TABLE
2222 PURSVT: 0 ; SAVED PURVEC TABLE
2223 GLTOP: 0 ; SAVE GLOTOP
2224 GCNOD: 0 ; PTR TO START OF ASSOCIATION CHAIN
2225 GCGBSP: 0 ; SAVED GLOBAL SP
2226 GCASOV: 0 ; SAVED PTR TO ASSOCIATION VECTOR
2227 GCATM: 0 ; PTR TO IMQUOT THIS-PROCESS
2228 NPARBO: 0 ; SAVED PARBOT
2231 ; CONSTANTS FOR DUMPER,READER AND PURIFYER
2237 ; VARIABLE USED BY MARK SWEEP GARBAGE COLLECTOR
2247 DEFINE HERE G00002,G00003
2248 G00002!G00003!TERMIN
2275 .LOP <ASH @> ZZ2 <,-10.>
2278 .LOP <ASH @> SECLEN <,10.>
2281 .LOP <ASH @> AGCLD <,-10.>