2 TITLE SECAGC MUDDLE GARBAGE COLLECTOR FOR MULTI SECTIONS
4 ;SYSTEM WIDE DEFINITIONS GO HERE
12 .GLOBAL SHRRM,SHRLM,SMOVEM,SSETZM,SXBLT,SHLRZ
13 .GLOBAL RCL,VECTOP,GCSTOP,GCSBOT,FRETOP,GCSNEW,VECBOT,PARTOP,PARBOT,HITOP,HIBOT,GETPAG
14 .GLOBAL PDLBUF,PDLEX,PDLEXP,GCFLG,GCPDL,GETNUM,PARNEW,MOVPUR,RCLV,RCLVEC,PGCNT
15 .GLOBAL PGROW,TPGROW,MAINPR,%SLEEP,MSGTYP,PURTOP,PURBOT,STOSTR,GCSET,CKPUR
16 .GLOBAL MTYI,UPLO,FRMUNG,BYTDOP,GLOBSP,FREDIF,FREMIN,GCHAPN,INTFLG,FINAGC,NGCS,INQAGC
17 .GLOBAL SAT,TTOCHN,TYPVEC,ICONS,INCONS,IBLOCK,IEUVEC,IEVECTI,CELL2,MKTBS,RLENGC
18 .GLOBAL GIBLOK,REHASH,IBLOK1,IILIST,IIFORM,CIVEC,CIUVEC,CICONS,CPOPJ,RBLDM
19 .GLOBAL SPBASE,OUTRNG,CISTNG,CBYTES,%RUNAM,PURVEC,GCDOWN,N.CHNS,CHNL1,PLODR
20 .GLOBAL CAFRE,CAFRET,STOGC,GCHN,WNDP,FRNP,FRONT,%GCJOB,%SHWND,%INFMP,%GETIP,CHKPGI
21 .GLOBAL TD.PUT,TD.GET,TD.AGC,TD.AGC,TD.LNT,GLOTOP,UBIT,FLGSET,PURMNG,RPURBT,%IFMP2
22 .GLOBAL CTIME,IMTYO,ILOC,NODES,GPURFL,GCDANG,GCHACK,LPUR,HITOP,BADCHN,IMPURX,PURCLN
23 .GLOBAL GCTIM,GCCAUS,GCCALL,IAAGC,LVLINC,STORIC,GVLINC,TYPIC,GCRSET,ACCESS,NOSHUF,SQUPNT
24 ; GLOBALS ASSOCIATE WITH THE ASSOCIATION VECTOR
26 .GLOBAL ASOVEC,ASOLNT,ITEM,INDIC,VAL,NWORDT,NODPNT,PNTRS,DSTORE,HASHTB
27 .GLOBAL CELL,BINDID,GCFLCH,TYPBOT,GLOBAS,TPBASE,NOWLVL,CURPLN,PVSTOR,SPSTOR
28 .GLOBAL ISECGC,SECLEN,RSECLE
29 .GLOBAL P.TOP,P.CORE,PMAPB,IGET,CIGTPR,ROOT,STBL,CAFREE,%MPIN1,%PURIF,%MPINX,GCHK10
30 .GLOBAL %SAVRP,%RSTRP,LENGC,AGCLD,PAGEGC,REALGC
31 .GLOBAL %MPINT,%GBINT,%CLSMP,%CLSM1,PINIT,PGFIND,NPRFLG
32 .GLOBAL GCKNUM,CORTOP,GCHPN,INTAGC,WNDP,WNDBOT,BUFGC,WIND,GCDFLG,SAVM,AGC,GCSET
36 NOPAGS==1 ; NUMBER OF WINDOWS
39 NTPMAX==20000 ; NORMAL MAX TP SIZE
40 NTPGOO==4000 ; NORMAL GOOD TP
41 ETPMAX==2000 ; TPMAX IN AN EMERGENCY (I.E. GC RECALL)
42 ETPGOO==2000 ; GOOD TP IN EMERGENCY
45 GCHN==0 ; CHANNEL FOR FUNNNY INFERIOR
46 STATNO==19. ; # OF STATISTICS FOR BLOAT-STAT
47 STATGC==8. ; # OF GC-STATISTICS FOR BLOAT-STAT
50 LOC REALGC+RLENGC+RSLENG
60 F==E+1 ; THESE 3 ACS OFTEN USED FOR XBLT
64 TYPNT==FPTR+1 ; SPECIAL AC USAGE DURING GC
65 EXTAC==TYPNT+1 ; ALSO SPECIAL DURING GC
66 LPVP==EXTAC+1 ; SPECIAL FOR GC, HOLDS POINTER TO PROCESS
88 DEFINE TBLADD LCN,\FOO
96 RMT [XBLT==123000,,%XXBLT
103 ;SET FLAG FOR INTERRUPT HANDLER
104 SETZB M,RCL ; CLEAR OUT RECYCLE LIST CELLS, AND RSUBR BASE
106 EXCH P,GCPDL ; IN CASE CURRENT PDL LOSES
111 ; HERE TO CLEAN UP ANY POSSIBLE PURENESS IN GC SPACE BEFORE COLLECTING
114 ADD A,GCSTOP ; ADJUSTMENT TO KEEP FREE REAL
117 MOVE A,NOWP ; ADJUSTMENTS FOR STACKS
124 MOVEI B,[ASCIZ /SGIN /]
125 SKIPE GCMONF ; MONITORING
127 NOMON1: HRRZ C,(P) ; GET CAUSE OF GC INDICATOR
128 MOVE B,GCNO(C) ; ADD 1 TO COUNT OF GC'S CAUSED BY GIVEN REASON
131 MOVEM C,GCCAUS ; SAVE CAUSE OF GC
132 SKIPN GCMONF ; MONITORING
134 MOVE B,MSGGCT(C) ; GET CAUSE MESSAGE
136 NOMON2: HLRZ C,(P) ; FIND OUT WHO CAUSED THE GC
137 MOVEM C,GCCALL ; SAVE CALLER OF GC
138 SKIPN GCMONF ; MONITORING
142 NOMON3: ADJSP P,-1 ; POP OFF C
146 HLLZS SQUPNT ; FLUSH SQUOZE TABLE
152 IRP AC,,[0,A,B,C,D,E,P,R,M,SP,TP,TB,AB,TVP,FRM]
153 MOVEM AC,AC!STO"+1(PVP)
157 MOVEM 0,PVPSTO+1(PVP)
161 JSP E,CKPUR ; CHECK FOR PURE RSUBR
163 ;SET UP E TO POINT TO TYPE VECTOR
169 HRLI TYPNT,400000+B ; LOCAL INDEX
171 CHPDL: MOVE D,P ; SAVE FOR LATER
172 CORGET: MOVE P,[GCSEG,,MRKPDL] ; USE GCSEG FOR PDL
174 ;FENCE POST PDLS AND CHECK IF ANY SHOULD BE SHRUNK
176 HRRZ A,TB ;POINT TO CURRENT FRAME IN PROCESS
177 PUSHJ P,FRMUNG ;AND MUNG IT
178 MOVE A,TP ;THEN TEMPORARY PDL
181 MOVE A,PSTO+1(PVP) ;AND UNMARKED P STACK
184 \f; FIRST CREATE INFERIOR TO HOLD NEW PAGES
186 INFCRT: MOVE A,PARBOT ; GENERATE NEW PARBOT AND PARNEW
189 ANDCMI A,1777 ; EVEN PAGE BOUNDARY
194 ; NOW ZERO OUT NEW SPACE USING XBLT
196 ; DOMULT [SETZM (FPTR)]
198 ; SUBI 0,(FPTR) ; FROM VECBOT UP
204 ; USE PMAP TO FLUSH GC SPACE PAGES
207 MOVE B,[MFORK,,GCSEG_9.]
211 ;MARK PHASE: MARK ALL LISTS AND VECTORS
212 ;POINTED TO WITH ONE BIT IN SIGN BIT
213 ;START AT TRANSFER VECTOR
214 NOMAP: MOVE A,GLOBSP+1 ; GET GLOBSP TO SAVE
216 MOVE A,ASOVEC+1 ; ALSO SAVE FOR USE BY GC
218 MOVE A,NODES+1 ; SAVE FOR ASSOCIATION UPDATE AND MOVEMENT
221 MOVE A,GLOTOP+1 ; GET GLOTOP FOR LOCR HACKS
223 MOVE A,PURVEC+1 ; SAVE PURE VECTOR FOR GETPAG
228 SETZ LPVP, ;CLEAR NUMBER OF PAIRS
229 MOVE 0,NGCS ; SEE IF NEED HAIR
231 MOVEM 0,GCHAIR ; RESUME COUNTING
232 MOVSI D,400000 ;SIGN BIT FOR MARKING
233 MOVE A,ASOVEC+1 ;MARK ASSOC. VECTOR NOW
234 PUSHJ P,PRMRK ; PRE-MARK
241 MOVE A,IMQUOTE THIS-PROCESS
247 ; HAIR TO DO AUTO CHANNEL CLOSE
249 MOVEI 0,N.CHNS-1 ; NUMBER OF CHANNELS
250 MOVEI A,CHNL1 ; 1ST SLOT
252 SKIPE 1(A) ; NOW A CHANNEL?
253 SETZM (A) ; DON'T MARK AS CHANNELS
259 MOVE A,PVSTOR+1 ; MARK MAIN PROCES EVEN IF SWAPPED OUT
263 MOVE A,MAINPR ; MARK MAIN PROCES EVEN IF SWAPPED OUT
265 MOVEM A,MAINPR ; ADJUST PTR
267 ; ASSOCIATION AND VALUE FLUSHING PHASE
269 SKIPN GCHAIR ; ONLY IF HAIR
273 PUSHJ P,ATCLEA ; CLEAN UP ATOM TABLE
275 SKIPE GCHAIR ; IF NOT HAIR, DO CHANNELS NOW
278 PUSHJ P,ASSOUP ; UPDATE AND MOVE ASSOCIATIONS
279 PUSHJ P,CHFIX ; SEND OUT CHANNELS AND MARK LOSERS
280 PUSHJ P,STOGC ; FIX UP FROZEN WORLD
281 MOVE P,GCPDL ; SWITCH PDLS IN CASE THIS ONE DISSAPPEARS
283 MOVE A,NPARBO ; UPDATE GCSBOT
287 MOVEM A,PURVEC+1 ; RESTORE PURVEC
288 PUSHJ P,CORADJ ; ADJUST CORE SIZE
294 ; MOVE NEW GC SPACE IN
305 ; NOW REHASH THE ASSOCIATIONS BASED ON VALUES
306 GARZR1: PUSHJ P,REHASH
312 MOVEI B,[ASCIZ /GOUT /]
314 NOMONO: MOVE PVP,PVSTOR+1
315 IRP AC,,[0,A,B,C,D,E,P,R,M,SP,TP,TB,AB,TVP,FRM]
316 MOVE AC,AC!STO+1(PVP)
320 MOVE PVP,PVPSTO+1(PVP)
322 ; CLOSING ROUTINE FOR G-C
328 MOVE A,FRETOP ; ADJUST BLOAT-STAT PARAMETERS
331 PUSHJ P,GCSET ; FIX UP BLOAT-STAT PARAMETERS
338 FSBR B,GCTIM ; GET TIME ELAPSED
339 SKIPN INBLOT ; STORE TIME ONLY IF NO RETRY
341 MOVEM B,GCTIM ; SAVE ELAPSED TIME FOR INT-HANDLER
342 SKIPN GCMONF ; SEE IF MONITORING
344 PUSHJ P,FIXSEN ; OUTPUT TIME
345 MOVEI A,15 ; OUTPUT C/R LINE-FEED
349 GCCONT: MOVE C,[NTPGOO,,NTPMAX] ; MAY FIX UP TP PARAMS TO ENCOURAGE
350 ; SHRINKAGE FOR EXTRA ROOM
352 MOVE C,[ETPGOO,,ETPMAX]
355 POP P,D ; RESTORE AC'C
360 JUMPE A,AGCWIN ; IF ZERO THE GC WORKED
361 SKIPN GCHAIR ; SEE IF HAIRY GC
363 REAGCX: MOVEI A,1 ; PREPARE FOR A HAIRY GC
366 MOVE C,[11,,10.] ; REASON FOR GC
371 FATAL AGC--NO CORE AVAILABLE TO SATISFY REQUESTS
374 AGCWIN: SETZM PARNEW ;CLEAR FOR NEXT AGC CALL
375 SETZM GETNUM ;ALSO CLEAR THIS
379 SETZM PGROW ; CLEAR GROWTH
381 SETOM GCHAPN ; INDICATE A GC HAS HAPPENED
383 SETOM INTFLG ; AND REQUEST AN INTERRUPT
387 JUMPN M,FINAGC ; IF M 0, RUNNING RSUBR SWAPPED OUT
388 SKIPE PLODR ; IF LOADING ONE, IT MIGHT NOT HAVE ARRIVED
391 FATAL AGC--RUNNING RSUBR WENT AWAY
393 AGCE1: FATAL AGC--TYPE VECTOR NOT OF TYPE VECTOR
395 \f; CORE ADJUSTMENT PHASE
397 CORADJ: MOVE A,PURTOP
398 SUB A,CURPLN ; ADJUST FOR RSUBR
400 HRRZ A,FPTR ; NEW GCSTOP
401 ADDI A,1777 ; GCPDL AND ROUND
402 ANDCMI A,1777 ; TO PAGE BOUNDRY
403 MOVEM A,CORTOP ; TAKE CARE OF POSSIBLE LATER LOSSAGE
404 CAMLE A,RPTOP ; SEE IF WE CAN MAP THE WORLD BACK IN
405 FATAL AGC--UNABLE TO MAP GC-SPACE INTO CORE
406 CAMG A,PURBOT ; SEE IF WE HAVE TO PUNT SOME PURE TO DO IT
407 JRST CORAD0 ; DON'T HAVE TO PUNT SOME PURE
408 PUSHJ P,MAPOUT ; GET THE CORE
409 FATAL AGC--PAGES NOT AVAILABLE
411 ; NOW THAT WE ARE ABLE TO MAP TO GCS INTO CORE WE WILL TRY TO HONOR SOME REQUESTS
412 ; FIRST LETS SEE IF WE HAVE TO CORE DOWN.
413 ; GCDOWN IS DEFINED AS AMOUNT FROM FRETOP TO PURBOT NEEDED
415 CORAD0: SKIPN B,GCDOWN ; CORE DOWN?
416 JRST CORAD1 ; NO, LETS GET CORE REQUIREMENTS
417 ADDI A,(B) ; AMOUNT+ONE FREE BLOCK
418 CAMGE A,RPTOP ; CAN WE WIN
419 JRST CORAD3 ; POSSIBLY
421 ; THIS IS A EXIT FOR LOSSAGE WITHOUT A FATAL ERROR
422 CORAD2: SETOM GCDANG ; INDICATE LOSSAGE
424 ; CALCULATE PARAMETERS BEFORE LEAVING
425 CORAD6: MOVE A,PURSVT ; GET PURE TABLE
426 PUSHJ P,SPCOUT ; OUT IT GOES IN CASE IT WAS CHANGED
429 MOVE A,CORTOP ; ADJUST CORE IMAGE
430 ASH A,-10. ; TO PAGES
431 TRYPCO: PUSHJ P,P.CORE
433 MOVE A,CORTOP ; GET IT BACK
440 ; TRIES TO SATISFY REQUEST FOR CORE
441 CORAD1: MOVEM A,CORTOP
443 ADD A,GETNUM ; ADD MINIMUM CORE NEEDED
444 ADDI A,1777 ; ONE BLOCK+ROUND
445 ANDCMI A,1777 ; TO BLOCK BOUNDRY
446 CAMLE A,RPTOP ; CAN WE WIN
449 JRST CORAD7 ; DON'T HAVE TO MAP OUT PURE
453 ; NOW TRY TO GET SLOP SPACE. NOT NECESSARY BUT NICE
454 CORAD7: MOVEM A,CORTOP ; STORE POSSIBLE VALUE
455 MOVE B,RPTOP ; GET REAL PURTOP
456 SUB B,PURMIN ; KEEP PURMIN
457 CAMG B,CORTOP ; SEE IF CORTOP IS ALREADY HIGH
458 MOVE B,CORTOP ; DONT GIVE BACK WHAT WE GOT
459 MOVEM B,RPTOP ; FOOL CORE HACKING
461 ANDCMI A,1777 ; TO PAGE BOUNDRY
462 CAMGE A,RPTOP ; DO WE WIN TOTALLY
464 MOVE A,RPTOP ; GET AS MUCH CORE AS POSSIBLE
466 JRST CORAD6 ; LOSE, BUT YOU CAN'T HAVE EVERYTHING
467 CORAD4: CAMG A,PURBOT ; DO WE HAVE TO PUNT SOME PURE
469 PUSHJ P,MAPOUT ; GET IT
471 MOVEM A,CORTOP ; ADJUST PARAMETER
472 JRST CORAD6 ; WIN TOTALLY
473 CORAD8: MOVEM A,CORTOP ; NEW CORTOP
476 ; WE CAN CORE DOWN NOW TO SEE IF WE CAN GET SOME SLOP SPACE
480 CAMGE A,PURBOT ; CAN WE WIN
483 CORAD9: SUB A,GCDOWN ; SATISFY GCDOWN REQUEST
484 JRST CORAD4 ; GO CHECK ALLOCATION
486 MAPOUT: PUSH P,A ; SAVE A
487 SUB A,P.TOP ; AMOUNT TO GET
489 ANDCMI A,1777 ; TO PAGE BOUNDRY
490 ASH A,-PGSZ ; TO PAGES
491 PUSHJ P,GETPAG ; GET THEN
492 JRST MAPLOS ; LOSSAGE
493 AOS -1(P) ; INDICATE WINNAGE
499 \f; CONVERSION FROM FLOAT TO DECIMAL. X 100 AND SEND OUT WITH APPROPRIATELY PLACED DECIMAL
502 FIXSEN: PUSH P,B ; SAVE TIME
503 MOVEI B,[ASCIZ /TIME= /]
504 PUSHJ P,MSGTYP ; PRINT OUT MESSAGE
506 FMPRI B,(100.0) ; CONVERT TO FIX
510 MOVEI A,1 ; INITIALIZE COUNT OF CHARACTERS FOR PUTTING OUT TIME
512 IDIVI C,10. ; START COUNTING
516 CAIN A,1 ; SEE IF THERE IS ONLY ONE CHARACTER
518 FIXOUT: IDIVI C,10. ; RECOVER NUMBER
523 CAIN A,2 ; DECIMAL POINT HERE?
525 FIX1: HLRZ A,(P)-1 ; GET NUMBER
526 ADDI A,60 ; MAKE IT A CHARACTER
527 PUSHJ P,IMTYO ; OUT IT GOES
533 DOT1: MOVEI A,". ; OUTPUT DECIMAL POINT AND PADDING 0
537 JRST FIXOUT ; CONTINUE
538 DOT2: MOVEI A,". ; OUTPUT DECIMAL POINT
543 \f; SUBROUTINE TO CHECK SIZE OF PDLS AND DO FENCEPOSTING
545 PDLCHK: JUMPGE A,CPOPJ
546 HLRE B,A ;GET NEGATIVE COUNT
547 MOVE C,A ;SAVE A COPY OF PDL POINTER
548 SUBI A,-1(B) ;LOCATE DOPE WORD PAIR
549 HRRZS A ; ISOLATE POINTER
550 CAME A,TPGROW ;GROWING?
551 ADDI A,PDLBUF ;NO, POINT TO REAL DOPE WORD
555 SETOM 1(C) ; START FENECE POST
558 MOVSI D,1(C) ;YES, SET UP TO BLT FENCE POSTS
560 BLT D,-2(A) ;FENCE POST ALL EXCEPT DOPE WORDS
563 NOFENC: CAMG B,TPMAX ;NOW CHECK SIZE
565 JRST MUNGTP ;TOO BIG OR TOO SMALL
568 MUNGTP: SUB B,TPGOOD ;FIND DELTA TP
569 MUNG3: MOVE C,-1(A) ;IS GROWTH ALREADY SPECIFIED
570 TRNE C,777000 ;SKIP IF NOT
571 POPJ P, ;ASSUME GROWTH GIVEN WILL WIN
573 ASH B,-6 ;CONVERT TO NUMBER OF BLOCKS
575 CAILE B,377 ; SKIP IF BELOW MAX
576 MOVEI B,377 ; ELSE USE MAX
577 TRO B,400 ;TURN ON SHRINK BIT
581 MUNGT2: DPB B,[TOPGRO,,-1(A)] ;STORE IN DOPE WORD
584 ; CHECK UNMARKED STACK (NO NEED TO FENCE POST)
586 PDLCHP: HLRE B,A ;-LENGTH TO B
588 SUBI A,-1(B) ;POINT TO DOPE WORD
589 HRRZS A ;ISOLATE POINTER
590 CAME A,PGROW ;GROWING?
591 ADDI A,PDLBUF ;NO, POINT TO REAL DOPE WORD
595 SETOM 1(C) ; START FENECE POST
602 NOPF: CAMG B,PMAX ;TOO BIG?
603 CAMG B,PMIN ;OR TOO LITTLE
604 JRST .+2 ;YES, MUNG IT
610 ; ROUTINE TO PRE MARK SPECIAL HACKS
612 PRMRK: SKIPE GCHAIR ; FLUSH IF NO HAIR
615 SUBI A,(B) ;POINT TO DOPE WORD
616 HLRZ EXTAC,1(A) ; GET LNTH
617 LDB 0,[TOPGRO,,(A)] ; GET GROWTHS
618 TRZE 0,400 ; SIGN HACK
628 HRRM 0,1(A) ; NEW RELOCATION FIELD
629 IORM D,1(A) ;AND MARK
633 \f;GENERAL MARK SUBROUTINE. CALLED TO MARK ALL THINGS
634 ; A/ GOODIE TO MARK FROM
635 ; B/ TYPE OF A (IN RH)
636 ; C/ TYPE,DATUM PAIR POINTER
639 MARK2: HLRZ B,(C) ;GET TYPE
640 MARK1: MOVE A,1(C) ;GET GOODIE
641 MARK: JUMPE A,CPOPJ ; NEVER MARK 0
647 ANDI B,TYPMSK ; FLUSH MONITORS
648 LSH B,1 ;TIMES 2 TO GET SAT
649 HRRZ B,@TYPNT ;GET SAT
652 CAILE B,NUMSAT ; SKIP IF TEMPLATE DATA
660 TBLDIS DUM2,GCRET,[[S2WORD,PAIRMK],[S2DEFR,DEFMK],[SNWORD,VECTMK],[STBASE,TBMK]
661 [STPSTK,TPMK],[SARGS,ARGMK],[S2NWORD,VECTMK],[SPSTK,TPMK],[SSTORE,VECTMK]
662 [SFRAME,FRMK],[SBYTE,BYTMK],[SATOM,ATOMK],[SPVP,VECTMK],[SGATOM,GATOMK]
663 [SLOCID,LOCMK],[SCHSTR,BYTMK],[SASOC,ASMRK],[SLOCL,PAIRMK],[SABASE,ABMK]
664 [SLOCA,ARGMK],[SLOCV,VECTMK],[SLOCU,VECTMK],[SLOCS,BYTMK],[SLOCN,ASMRK]
665 [SLOCR,LOCRMK],[SRDTB,GCRDMK],[SLOCB,BYTMK],[SDEFQ,DEFQMK],[SOFFS,OFFSMK]]NUMSAT,400000
669 ; HERE TO MARK A POSSIBLE DEFER POINTER
671 DEFQMK: GETYP B,(A) ; GET ITS TYPE
674 ANDI B,SATMSK ; AND TO SAT
677 ;HERE TO MARK THAT WHICH IS POINTED TO BY A DEFERRED POINTER
679 DEFMK: SETOM GENFLG ; SET FLAG SAYING DEFERRED
682 ;HERE TO MARK LIST ELEMENTS
684 PAIRMK: SETZM GENFLG ;TURN OF DEFER BIT
685 PUSH P,[0] ; WILL HOLD BACK PNTR
686 MOVEI C,(A) ; POINT TO LIST
687 PAIRM1: CAMGE C,PARTOP ;CHECK FOR BEING IN BOUNDS
689 FATAL AGC--MARKED PAIR OUTSIDE PAIR SPACE
690 SKIPGE B,(C) ;SKIP IF NOT MARKED
691 JRST RETNEW ;ALREADY MARKED, RETURN
693 DOMULT [MOVEM B,(FPTR)]
695 DOMULT [MOVEM 0,1(FPTR)]
696 ADDI FPTR,2 ; MOVE ALONG IN NEW SPACE
698 PAIRM2: MOVEI A,-2(FPTR) ; GET INF ADDR
699 HRRM A,(C) ; LEAVE A POINTER TO NEW HOME
700 HRRZ E,(P) ; GET BACK POINTER
701 JUMPE E,PAIRM7 ; 1ST ONE, NEW FIXUP
703 DOMULT [HRRM A,(E)] ; CLOBBER
704 PAIRM4: MOVEM A,(P) ; NEW BACK POINTER
706 JRST DEFDO ;GO HANDLE DEFERRED POINTER
707 HRLM B,(P) ; SAVE OLD CDR
708 PUSHJ P,MARK2 ;MARK THIS DATUM
709 HRRZ E,(P) ; SMASH CAR IN CASE CHANGED
711 DOMULT [MOVEM A,1(E)]
712 HLRZ C,(P) ;GET CDR OF LIST
713 CAIGE C,@PURBOT ; SKIP IF PURE (I.E. DONT MARK)
714 JUMPN C,PAIRM1 ;IF NOT NIL, MARK IT
717 GCRET: SETZM GENFLG ;FOR PAIRMKS BENEFIT
718 POP P,A ;RESTORE C AND A
720 POPJ P, ;AND RETURN TO CALLER
722 GCRETD: ANDI B,TYPMSK ; TURN OFF MONITORS
723 CAIN B,TLOCR ; SEE IF A LOCR
727 ;HERE TO MARK DEFERRED POINTER
729 DEFDO: PUSH P,B ; PUSH OLD PAIR ON STACK
731 MOVEI C,-1(P) ; USE AS NEW DATUM
732 HRLI C,GCSEG ; KEEP IN CORRECT SECTION
733 PUSHJ P,MARK2 ;MARK THE DATUM
734 HRRZ E,-2(P) ; GET POINTER IN INF CORE
736 DOMULT [MOVEM A,1(E)]
740 JRST GCRET ;AND RETURN
743 PAIRM7: MOVEM A,-1(P) ; SAVE NEW VAL FOR RETURN
746 RETNEW: HRRZ A,(C) ; POINT TO NEW WORLD LOCN
747 HRRZ E,(P) ; BACK POINTER
748 JUMPE E,RETNW1 ; NONE
753 RETNW1: MOVEM A,-1(P)
757 \f; VECTOR AND TP MARKER, SIGN OF TYPNT IS SET BASED ON WHICH ONE
759 TPMK: SETOM GENFLG ;SET TP MARK FLAG
763 MOVEI E,(A) ;SAVE A POINTER TO THE VECTOR
765 SUB A,B ;LOCATE DOPE WORD
766 MOVEI A,1(A) ;ZERO LH AND POINT TO 2ND DOPE WORD
767 CAIL A,STOSTR ; CHECK IN VECTOR SPACE
769 JRST VECTB1 ;LOSE, COMPLAIN
772 HLLM 0,(P) ; SAVE TP VS VECT INDICATOR
773 JUMPE 0,NOBUFR ;IF A VECTOR, NO BUFFER CHECK
774 CAME A,PGROW ;IS THIS THE BLOWN P
775 CAMN A,TPGROW ;IS THIS THE GROWING PDL
776 JRST NOBUFR ;YES, DONT ADD BUFFER
777 ADDI A,PDLBUF ;POINT TO REAL DOPE WORD
778 MOVSI 0,-PDLBUF ;ALSO FIX UP POINTER
780 MOVEM 0,-1(P) ; FIXUP RET'D PNTR
782 NOBUFR: HLRE B,(A) ;GET LENGTH FROM DOPE WORD
783 JUMPL B,EXVECT ; MARKED, LEAVE
784 LDB B,[TOPGRO,,-1(A)] ; GET TOP GROWTH
785 TRZE B,400 ; HACK SIGN BIT
787 ASH B,6 ; CONVERT TO WORDS
788 PUSH P,B ; SAVE TOP GROWTH
789 LDB 0,[BOTGRO,,-1(A)] ;GET GROWTH FACTOR
790 TRZE 0,400 ;KILL SIGN BIT AND SKIP IF +
792 ASH 0,6 ;CONVERT TO NUMBER OF WORDS
793 PUSH P,0 ; SAVE BOTTOM GROWTH
794 ADD B,0 ;TOTAL GROWTH TO B
795 VECOK: HLRE E,(A) ;GET LENGTH AND MARKING
796 MOVEI EXTAC,(E) ;SAVE A COPY
797 ADD EXTAC,B ;ADD GROWTH
798 SUBI E,2 ;- DOPE WORD LENGTH
799 IORM D,(A) ;MAKE SURE NOW MARKED
800 PUSHJ P,ALLOGC ; ALLOCATE SPACE FOR VECTOR IN THE INF
802 VECOK1: JUMPLE E,MOVEC2 ; ZERO LENGTH, LEAVE
803 PUSH P,A ; SAVE POINTER TO DOPE WORD
805 SKIPGE B,-1(A) ;SKIP IF UNIFORM
806 TLNE B,377777-.VECT. ;SKIP IF NOT SPECIAL
807 JUMPE EXTAC,NOTGEN ;JUMP IF NOT A GENERAL VECTOR
809 GENRAL: HLRZ 0,B ;CHECK FOR PSTACK
811 JUMPE 0,NOTGEN ;IT ISN'T GENERAL
812 JUMPN EXTAC,TPMK1 ; JUMP IF TP
814 SUBI C,1(E) ; C POINTS TO BEGINNING OF VECTOR
816 \f; LOOP TO MARK ELEMENTS IN A GENERAL VECTOR
817 VECTM2: HLRE B,(C) ;GET TYPE AND MARKING
818 JUMPL B,UMOVEC ;RETURN, (EITHER DOPE WORD OR FENCE POST)
819 MOVE A,1(C) ;DATUM TO A
822 VECTM3: PUSHJ P,MARK ;MARK DATUM
823 MOVEM A,1(C) ; IN CASE WAS FIXED
828 MOVEC2: POP P,C ; RESTORE BOTTOM GROWTH
829 CAMGE A,GCSBOT ; DONT DO THIS STUFF IF THIS IS FROZEN
831 HRRZ B,-1(P) ; GET POINTER INTO INF
834 MOVEC3: HLLZ 0,-1(A) ; MODIFY DOPE WORD AND PLACE IN INF
836 HRRZ EXTAC,(A) ; DESTINATION OF DOPEWORDS (SORT OF)
837 HRLI EXTAC,GCSEG ; MAKE INTO CORRECT KIND OF ADDR
838 DOMULT [MOVEM 0,-1(EXTAC)]
840 ANDI 0,377777 ; KILL MARK BIT
842 ADD 0,C ; COMPENSATE FOR SHRINKAGE
846 SKIPGE (P) ; ACCOUNT FOR OTHER END SHRINKAGE
849 SUBI 0,2 ; AVOID RE-SENDING DOPE WORDS
850 DOMULT [XBLT 0,] ; MOVE VECTOR TO OTHER IMAGE
855 ADJSP P,-1 ; GET RID OF FPTR
856 PUSHJ P,RELATE ; RELATIVIZE
858 MOVSI 0,PDLBUF ; FIX UP STACK PTR
862 VECLOS: JUMPL C,CCRET ;JUMP IF CAN'T MUNG TYPE
864 MOVEI B,TILLEG ;GET ILLEGAL TYPE
866 MOVEM 0,1(C) ;AND STORE OLD TYPE AS VALUE
867 JRST UMOVEC ;RETURN WITHOUT MARKING VECTOR
869 CCRET: CLEARM 1(C) ;CLOBBER THE DATUM
873 ; ROUTINE TO MARK A TP. IT SCANS THE TP. IT MARKS ALL THE ITEMS AND IT MAPS AN
874 ; UPDATED VERSION INTO THE INFERIOR WITHOUT CHANGING THE ORIGINAL.
877 TPMK2: POP P,A ; RESTORE DW POINTER
878 POP P,C ; AND BOTTOM GROWTH
879 HRRZ E,-1(P) ; FIX UP PARAMS
882 HRRZ B,(A) ; CALCULATE RELOCATION
884 MOVE C,-1(P) ; ADJUST FOR GROWTH
892 TPMK3: HLRZ E,(A) ; GET LENGTH
893 TRZ E,400000 ; GET RID OF MARK BIT
894 SUBI A,-1(E) ;POINT TO FIRST ELEMENT
895 MOVEI C,(A) ;POINT TO FIRST ELEMENT WITH C
896 TPMK4: HLRE B,(C) ;GET TYPE AND MARKING
897 JUMPL B,TPMK7 ;RETURN, (EITHER DOPE WORD OR FENCE POST)
898 HRRZ A,(C) ;DATUM TO A
899 ANDI B,TYPMSK ; FLUSH MONITORS
901 CAIN B,TENTRY ;IS THIS A STACK FRAME
902 JRST MFRAME ;YES, MARK IT
904 CAIN B,TBIND ;OR A BINDING BLOCK
906 CAIE B,TBVL ; CHECK FOR OTHER BINDING HACKS
908 SKIPA ; FIX UP SP-CHAIN
909 CAIN B,TSKIP ; OTHER BINDING HACK
912 TPMK5: PUSH P,(C) ; SAVE BECAUSE FRAMES MIGHT MUNG IT
913 HRRM A,(C) ; FIX UP IN CASE OF SP CHAIN
914 PUSHJ P,MARK1 ;MARK DATUM
918 AOS E,-1(P) ; MOVE OUT TYPE
919 DOMULT [MOVEM A,-1(E)]
922 MOVEM M,(C) ; RESTORE TO OLD VALUE
926 MFRAME: HRRZ 0,1(C) ; SET UP RELITIVIZATION OF PTR TO PREVIOUS
928 HRROI C,FRAMLN+FSAV-1(C) ;POINT TO FUNCTION
930 CAIL A,STOSTR ; CHECK IN VECTOR SPACE
932 JRST MFRAM1 ; IGNORE, NOT IN VECTOR SPACE
933 HRL A,(A) ; GET LENGTH
935 PUSHJ P,MARK ; AND MARK IT
939 HRRZ A,OTBSAV-FSAV+1(C) ; POINT TO TB TO PREVIOUS FRAME
941 ADD A,-2(P) ; RELOCATE IF NOT 0
943 DOMULT [MOVEM A,1(E)]
944 MOVE A,-2(P) ; ADJUST AB SLOT
945 ADD A,ABSAV-FSAV+1(C) ; POINT TO SAVED AB
946 DOMULT [MOVEM A,2(E)]
947 MOVE A,-2(P) ; ADJUST SP SLOT
948 ADD A,SPSAV-FSAV+1(C) ;POINT TO SAVED SP
949 SUB A,-3(P) ; ADJUSTMENT OF LENGTH IF GROWTH
950 DOMULT [MOVEM A,3(E)]
951 HRROI C,PSAV-FSAV(C) ;POINT TO SAVED P
953 ADDI E,FRAMLN ; UPDATE OUT ADDR
955 PUSHJ P,MARK1 ;AND MARK IT
957 DOMULT [MOVEM A,-3(E)] ; STORE UPDATED P
958 HLRE 0,TPSAV-PSAV+1(C)
959 MOVE A,TPSAV-PSAV+1(C)
962 MOVE A,TPSAV-PSAV+1(C)
963 CAME 0,TPGROW ; SEE IF BLOWN
969 DOMULT [MOVEM A,-2(E)] ; AND UPDATED TP
970 MOVE A,PCSAV-PSAV+1(C)
971 DOMULT [MOVEM A,-1(E)] ; DONT FORGET SAVED PC
972 HRROI C,-PSAV+1(C) ; POINT PAST THE FRAME
973 JRST TPMK4 ;AND DO MORE MARKING
975 MBIND: PUSHJ P,FIXBND
976 MOVEI B,TATOM ;FIRST MARK ATOM
977 SKIPN GCHAIR ; IF NO HAIR, MARK ALL NOW
978 SKIPE (P) ; PASSED MARKER, IF SO DONT SKIP
979 JRST MBIND2 ; GO MARK
980 MOVE A,1(C) ; RESTORE A
982 JRST MBIND1 ; NOT IT, CONTINUE SKIPPING
983 HRRM LPVP,2(C) ; SAVE IN RH OF TPVP,,0
984 MOVE 0,-4(P) ; RECOVER PTR TO DOPE WORD
985 HRLM 0,2(C) ; SAVE FOR MOVEMENT
986 MOVEI B,TATOM ; MARK THE BINDING TO THIS PROCESS
987 PUSHJ P,MARK1 ; MARK THE ATOM
988 MOVEI LPVP,(C) ; POINT
989 SETOM (P) ; INDICATE PASSAGE
990 MBIND1: ADDI C,6 ; SKIP BINDING
992 SKIPE -1(P) ; ONLY UPDATE IF SENDING OVER
997 AOS E,-1(P) ; FIX UP CHAIN
998 DOMULT [MOVEM A,-1(E)]
999 MOVEI B,TATOM ; RESTORE IN CASE SMASHED
1000 PUSHJ P,MARK1 ; MARK ATOM
1001 AOS E,-1(P) ; SEND IT OUT
1002 DOMULT [MOVEM A,-1(E)]
1004 PUSH P,(C) ; SAVE BECAUSE FRAMES MIGHT MUNG IT
1005 PUSHJ P,MARK2 ;MARK DATUM
1009 AOS E,-1(P) ; SEND IT OUT
1010 DOMULT [MOVEM A,-1(E)]
1012 DOMULT [MOVEM A,(E)] ; SEND OUT VALUE
1014 MOVEM M,(C) ; RESTORE TO OLD VALUE
1016 MOVEI B,TLIST ; POINT TO DECL SPECS
1018 PUSHJ P,MARK ; AND MARK IT
1019 HRR A,(C) ; LIST FIX UP
1020 AOS E,-1(P) ; SEND IT OUT
1021 DOMULT [MOVEM A,-1(E)]
1022 SKIPL A,1(C) ; PREV LOC?
1024 MOVEI B,TLOCI ; NOW MARK LOCATIVE
1026 NOTLCI: AOS E,-1(P) ; SEND IT OUT
1027 DOMULT [MOVEM A,-1(E)]
1031 FIXBND: HRRZ A,(C) ; GET PTR TO CHAIN
1032 SKIPE A ; DO NOTHING IF EMPTY
1036 TPMK8: MOVNI A,1 ; FENCE-POST THE STACK
1037 AOS E,-1(P) ; SEND IT OUT
1038 DOMULT [MOVEM A,-1(E)]
1039 ADDI C,1 ; INCREMENT C FOR FENCE-POST
1040 ADJSP P,-1 ; CLEAN UP STACK
1041 POP P,E ; GET UPDATED PTR TO INF
1042 ADJSP P,-2 ; POP OFF RELOCATION
1047 SUBI C,(A) ; GET # OF WORDS TRANSFERED
1048 SUB B,C ; GET # LEFT
1049 ADDI E,-2(B) ; ADJUST POINTER TO INF
1051 POP P,C ; IS THERE TOP GROWH
1052 ADD E,C ; MAKE ADJUSTMENT FOR TOP GROWTH
1054 HLLZ 0,-1(A) ; MODIFY DOPE WORD AND PLACE IN INF
1056 HRRZ EXTAC,(A) ; DESTINATION OF DOPEWORDS (SORT OF)
1057 HRLI EXTAC,GCSEG ; MAKE INTO CORRECT KIND OF ADDR
1058 DOMULT [MOVEM 0,-1(EXTAC)]
1061 ; ROUTINE TO ALLOCATE ROOM FOR VECTORS IN INFERIOR
1062 ; EXTAC= # OF WORDS TO ALLOCATE
1064 ALLOGC: HRRZS A ; GET ABS VALUE
1065 CAML A,GCSBOT ; SKIP IF IN STORAGE
1066 JRST ALOGC2 ; JUMP IF ALLOCATING
1070 ALOGC1: ADDI FPTR,(EXTAC)
1072 DOMULT [HRRM 0,-1(FPTR)]
1073 DOMULT [HRLM EXTAC,-1(FPTR)]
1076 \f; RELATE RELATAVIZES A POINTER TO A VECTOR
1077 ; B IS THE POINTER A==> DOPE WORD
1079 RELATE: CAMGE A,GCSBOT ; SEE IF IN VECTOR SPACE
1080 POPJ P, ; IF NOT EXIT
1082 HLRE EXTAC,C ; GET LENGTH
1083 HRRZ 0,-1(A) ; CHECK FO GROWTH
1085 LDB 0,[TOPGRO,,-1(A)] ; GET TOP GROWTH
1086 TRZE 0,400 ; HACK SIGN BIT
1088 ASH 0,6 ; CONVERT TO WORDS
1089 SUB EXTAC,0 ; ACCOUNT FOR GROWTH
1090 RELAT1: HRLM EXTAC,C ; PLACE CORRECTED LENGTH BACK IN POINTER
1091 HRRZ EXTAC,(A) ; GET RELOCATED ADDR
1092 SUBI EXTAC,(A) ; FIND RELATIVIZATION AMOUNT
1093 ADD C,EXTAC ; ADJUST POINTER
1094 SUB C,0 ; ACCOUNT FOR GROWTH
1099 \f; MARK TB POINTERS
1100 TBMK: HRRZS A ; CHECK FOR NIL POINTER
1102 JRST GCRET ; IF POINTING TO NIL THEN RETURN
1103 HLRE B,TPSAV(A) ; MAKE POINTER LOOK LIKE A TP POINTER
1104 HRRZ C,TPSAV(A) ; GET TO DOPE WORD
1105 TBMK2: SUB C,B ; POINT TO FIRST DOPE WORD
1106 HRRZ A,(P) ; GET PTR TO FRAME
1107 SUB A,C ; GET PTR TO FRAME
1117 ABMK: HLRE B,A ; FIX UP TO GET TO FRAME
1119 HLRE B,FRAMLN+TPSAV(A) ; FIX UP TO LOOK LIKE TP
1120 HRRZ C,FRAMLN+TPSAV(A)
1126 ARGMK: HRRZ A,1(C) ; GET POINTER
1127 HLRE B,1(C) ; AND LNTH
1128 SUB A,B ; POINT TO BASE
1129 CAIL A,STOSTR ; CHECK IN VECTOR SPACE
1132 HLRZ 0,(A) ; GET TYPE
1136 CAIE 0,TENTRY ; IS NEXT A WINNER?
1138 JRST ARGMK1 ; YES, GO ON TO WIN CODE
1140 ARGMK0: SETZB A,1(C) ; CLOBBER THE CELL
1141 SETZM (P) ; AND SAVED COPY
1144 ARGMK1: MOVE B,1(A) ; ASSUME TTB
1145 ADDI B,(A) ; POINT TO FRAME
1146 CAIE 0,TINFO ; IS IT?
1147 MOVEI B,FRAMLN(A) ; NO, USE OTHER GOODIE
1148 HLRZ 0,OTBSAV(B) ; GET TIME
1149 HRRZ A,(C) ; AND FROM POINTER
1150 CAIE 0,(A) ; SKIP IF WINNER
1152 MOVE A,TPSAV(B) ; GET A RELATAVIZED TP
1156 SUB A,1(C) ; AMOUNT TO RELATAVIZE ARGS
1159 HRRM B,(P) ; PUT RELATAVIZED PTR BACK
1163 ; MARK FRAME POINTERS
1165 FRMK: HLRZ B,A ; GET TIME FROM FRAME PTR
1166 HLRZ EXTAC,OTBSAV(A) ; GET TIME FROM FRAME
1167 CAME B,EXTAC ; SEE IF EQUAL
1169 SUBI C,1 ;PREPARE TO MARK PROCESS VECTOR
1170 HRRZ A,1(C) ;USE AS DATUM
1171 SUBI A,1 ;FUDGE FOR VECTMK
1172 MOVEI B,TPVP ;IT IS A VECTRO
1173 PUSHJ P,MARK ;MARK IT
1174 ADDI A,1 ; READJUST PTR
1175 HRRM A,1(C) ; FIX UP PROCESS SLOT
1176 MOVEI C,1(C) ; SET UP FOR TBMK
1178 JRST TBMK ; MARK LIKE TB
1183 BYTMK: PUSHJ P,BYTDOP ; GET DOPE WORD IN A
1184 HLRZ EXTAC,-1(A) ; GET THE TYPE
1185 ANDI EXTAC,SATMSK ; FLUSH MONITOR BITS
1186 CAIN EXTAC,SATOM ; SEE IF ATOM
1188 HLRE EXTAC,(A) ; GET MARKING
1189 JUMPL EXTAC,BYTREL ; JUMP IF MARKED
1190 HLRZ EXTAC,(A) ; GET LENGTH
1191 PUSHJ P,ALLOGC ; ALLOCATE FOR IT
1192 HRRM 0,(A) ; SMASH IT IN
1195 SUBI 0,1 ; DONT RESEND DW
1196 SUBI B,-1(EXTAC) ; ADJUST INF POINTER
1205 ADDM E,(P) ; RELATAVIZE
1208 ATMSET: PUSH P,A ; SAVE A
1209 HLRZ B,(A) ; GET LENGTH
1210 TRZ B,400000 ; GET RID OF MARK BIT
1211 MOVNI B,-2(B) ; GET LENGTH
1212 ADDI A,-1(B) ; CALCULATE POINTER
1214 MOVEI B,TATOM ; TYPE
1217 JRST BYTREL ; TO BYTREL
1225 PUSH P,A ; PUSH LIST POINTER ON THE STACK
1226 PUSHJ P,MARK2 ; MARK THE LIST
1227 HRLM A,-2(P) ; UPDATE POINTER IN OFFSET
1232 ; MARK ATOMS IN GVAL STACK
1234 GATOMK: HRRZ B,(C) ; POINT TO POSSIBLE GDECL
1238 MOVEI A,(B) ; POINT TO DECL FOR MARK
1242 MOVE C,-1(P) ; RESTORE HOME POINTER
1243 HRRM A,(C) ; CLOBBER UPDATED LIST IN
1244 MOVE A,1(C) ; RESTORE ATOM POINTER
1250 PUSH P,0 ; SAVE POINTER TO INF
1251 SETOM .ATOM. ; SAY ATOM WAS MARKED
1253 PUSHJ P,GETLNT ;GET LENGTH AND CHECK BOUNDS
1254 JRST ATMRL1 ; ALREADY MARKED
1255 PUSH P,A ; SAVE DOPE WORD PTR FOR LATER
1256 HLRZ C,(A) ; FIND REAL ATOM PNTR
1257 SUBI C,400001 ; KILL MARK BIT AND ADJUST
1259 SUBM A,C ; NOW TOP OF ATOM
1260 MRKOBL: MOVEI B,TOBLS
1261 HRRZ A,2(C) ; IF > 0, NOT OBL
1265 PUSHJ P,MARK ; AND MARK IT
1273 NOMKNX: HLRZ B,(C) ; SEE IF UNBOUND
1274 TRZ B,400000 ; TURN OFF MARK BIT
1277 JRST ATOMK1 ; IT IS UNBOUND
1278 HRRZ 0,(C) ; SEE IF VECTOR OR TP POINTER
1279 MOVEI B,TVEC ; ASSUME VECTOR
1281 MOVEI B,TTP ; ITS A LOCAL VALUE
1282 PUSHJ P,MARK1 ; MARK IT
1283 MOVEM A,1(C) ; SMASH INTO SLOT
1284 ATOMK1: HRRZ 0,2(C) ; CHECK IF NOT ON ANY OBLIST
1286 POP P,C ; GET POINTER INTO INF
1289 JUMPN 0,ATMREL ; ALWAYS SEND OUT ATOMS ON NO OBLIST
1291 ; HERE WITH B POINT TO CURRENT DW AND C TO NEW DW, DO IT TO IT
1293 ATMOVX: PUSHJ P,XBLTR
1294 ATMREL: HRRZ E,(A) ; RELATAVIZE
1298 ATMRL1: ADJSP P,-1 ; POP OFF STACK
1301 ; HERE TO MOVE STUFF TO OTHER SEGMENT
1302 ; B==> CURRENT DW, C==> START OF NEW OBJECT (A MUST SURVIVE)
1303 XBLTR: CAMGE B,GCSBOT
1306 HRRZ E,(B) ; NEW DW LOC
1313 MOVE A,EXTAC ; BACK TO A
1316 GETLNT: HLRE B,A ;GET -LNTH
1317 SUB A,B ;POINT TO 1ST DOPE WORD
1318 MOVEI A,1(A) ;POINT TO 2ND DOPE WORD
1319 CAIL A,STOSTR ; CHECK IN VECTOR SPACE
1321 JRST VECTB1 ;BAD VECTOR, COMPLAIN
1322 HLRE B,(A) ;GET LENGTH AND MARKING
1323 IORM D,(A) ;MAKE SURE MARKED
1325 MOVEI EXTAC,(B) ; AMOUNT TO ALLOCATE
1326 PUSHJ P,ALLOGC ;ALLOCATE ROOM
1327 HRRM 0,(A) ; RELATIVIZE
1328 AMTK1: AOS (P) ; A NON MARKED ITEM
1329 AMTKE: POPJ P, ;AND RETURN
1331 GCRET1: ADJSP P,-1 ;FLUSH RETURN ADDRESS
1336 ; MARK NON-GENERAL VECTORS
1338 NOTGEN: CAMN B,[GENERAL+<SPVP,,0>]
1339 JRST GENRAL ;YES, MARK AS A VECTOR
1340 JUMPL B,SPECLS ; COMPLAIN IF A SPECIAL HACK
1341 SUBI A,1(E) ;POINT TO TOP OF A UNIFORM VECTOR
1342 HLRZS B ;ISOLATE TYPE
1344 MOVE EXTAC,B ; AND COPY IT
1345 LSH B,1 ;FIND OUT WHERE IT WILL GO
1346 HRRZ B,@TYPNT ;GET SAT IN B
1348 HRRZ C,SMKTBS(B) ;POINT TO MARK SR
1349 CAIN C,GCRET ;IF NOT A MARKED FROM GOODIE, IGNORE
1351 MOVEI C,-1(A) ;POINT 1 PRIOR TO VECTOR START
1352 PUSH P,E ;SAVE NUMBER OF ELEMENTS
1353 PUSH P,EXTAC ;AND UNIFORM TYPE
1355 UNLOOP: MOVE B,(P) ;GET TYPE
1356 MOVE A,1(C) ;AND GOODIE
1357 TLO C,400000 ;CAN'T MUNG TYPE
1358 PUSHJ P,MARK ;MARK THIS ONE
1359 MOVEM A,1(C) ; LIST FIXUP
1361 AOJA C,UNLOOP ;IF MORE, DO NEXT
1363 ADJSP P,-2 ;REMOVE STACK CRAP
1367 SPECLS: FATAL AGC--UNRECOGNIZED SPECIAL VECTOR
1373 ; ROUTINE TO MARK THE GC-READ TABLE. MARKS THE ATOMS AT THE DOPE WORDS
1374 ; AND UPDATES PTR TO THE TABLE.
1376 GCRDMK: PUSH P,A ; SAVE PTR TO TOP
1377 MOVEI 0,(FPTR) ; SAVE PTR TO INF
1379 PUSHJ P,GETLNT ; GET TO D.W. AND CHECK MARKING
1380 JRST GCRDRL ; RELATIVIZE
1381 PUSH P,A ; SAVE D.W POINTER
1383 MOVE B,ABOTN ; GET TOP OF ATOM TABLE
1385 ADD B,0 ; GET BOTTOM OF ATOM TABLE
1386 GCRD1: CAMG A,B ; DON'T SKIP IF DONE
1388 HLRZ C,(A) ; GET MARKING
1389 TRZN C,400000 ; SKIP IF MARKED
1392 SUBI A,(C) ; GO BACK ONE ATOM
1394 PUSH P,A ; SAVE POINTER
1395 MOVEI C,-2(E) ; SET UP POINTER
1396 MOVEI B,TATOM ; GO TO MARK
1399 MOVEM A,1(C) ; SMASH FIXED UP ATOM BACK IN
1403 GCRD3: SUBI A,(C) ; TO NEXT ATOM
1405 GCRD2: POP P,B ; GET PTR TO D.W.
1406 POP P,C ; GET PTR TO INF
1407 ADJSP P,-1 ; GET RID OF TOP
1409 JRST ATMOVX ; RELATIVIZE AND LEAVE
1411 GCRDRL: POP P,A ; GET PTR TO D.W
1412 ADJSP P,-2 ; GET RID OF TOP AND PTR TO INF
1413 JRST ATMREL ; RELATAVIZE
1416 ;MARK RELATAVIZED GLOC HACKS
1418 LOCRMK: SKIPE GCHAIR
1420 LOCRDP: PUSH P,C ; SAVE C
1421 MOVEI C,-2(A) ; RELATAVIZED PTR TO ATOM
1422 ADD C,GLTOP ; ADD GLOTOP TO GET TO ATOM
1423 MOVEI B,TATOM ; ITS AN ATOM
1427 MOVE A,1(C) ; GET RELATIVIZATION
1428 MOVEM A,(P) ; IT STAYS THE SAVE
1431 ;MARK LOCID TYPE GOODIES
1433 LOCMK: HRRZ B,(C) ;GET TIME
1434 JUMPE B,LOCMK1 ; SKIP LEGAL CHECK FOR GLOBAL
1435 HRRZ 0,2(A) ; GET OTHER TIME
1437 SETZB A,(P) ; NO, SMASH LOCATIVE
1438 JUMPE A,GCRET ; LEAVE IF DONE
1440 MOVEI B,TATOM ; MARK ATOM
1441 MOVEI C,-2(A) ; POINT TO ATOM
1442 MOVE E,(C) ; SEE IF BLOCK IS MARKED
1443 TLNE E,400000 ; SKIP IF MARKED
1444 JRST LOCMK2 ; SKIP OVER BLOCK
1445 SKIPN GCHAIR ; DO NOT MARK IF NOT HAIRY (WILL BE MARKED)
1446 PUSHJ P,MARK1 ; LET LOCATIVE SAVE THE ATOM
1448 HRRZ E,(C) ; TIME BACK
1449 MOVEI B,TVEC ; ASSUME GLOBAL
1451 MOVEI B,TTP ; ITS LOCAL
1452 PUSHJ P,MARK1 ; MARK IT
1457 ; MARK ASSOCIATION BLOCKS
1460 ASMRK1: HRLI A,-ASOLNT ;LOOK LIKE A VECTOR POINTER
1461 PUSHJ P,GETLNT ;GET LENGTH AND CHECK BOUNDS
1462 JRST ASTREL ; ALREADY MARKED
1463 MOVEI C,-ASOLNT-1(A) ;COPY POINTER
1464 PUSHJ P,MARK2 ;MARK ITEM CELL
1466 ADDI C,INDIC-ITEM ;POINT TO INDICATOR
1472 SKIPN GCHAIR ; IF NO HAIR, MARK ALL FRIENDS
1474 HRRZ A,NODPNT-VAL(C) ; NEXT
1475 JUMPN A,ASMRK1 ; IF EXISTS, GO
1476 ASTREL: POP P,A ; RESTORE PTR TO ASSOCIATION
1477 MOVEI A,ASOLNT+1(A) ; POINT TO D.W.
1478 SKIPN NODPNT-ASOLNT-1(A) ; SEE IF EMPTY NODPTR
1479 JRST ASTX ; JUMP TO SEND OUT
1480 ASTR1: HRRZ E,(A) ; RELATAVIZE
1484 ASTX: HRRZ C,(A) ; GET PTR IN FRONTEIR
1485 SUBI C,ASOLNT+1 ; ADJUST TO POINT TO BEGINNING
1490 ;HERE WHEN A VECTOR POINTER IS BAD
1492 VECTB1:FATAL AGC--VECTOR POINTS OUTSIDE OF VECTOR SPACE
1493 ADJSP P,-1 ; RECOVERY
1494 AFIXUP: SETZM (P) ; CLOBBER SLOT
1495 JRST GCRET ; CONTINUE
1498 VECTB2: FATAL AGC--VECTOR POINTS OUT OF VECTOR SPACE
1500 JRST AFIXUP ; RECOVER
1502 PARERR: FATAL AGC--PAIR POINTS OUT OF PAIR SPACE
1503 ADJSP P,-1 ; RECOVER
1507 \f; HERE TO MARK TEMPLATE DATA STRUCTURES
1509 TD.MRK: MOVEI 0,(FPTR) ; SAVE PTR TO INF
1511 HLRZ B,(A) ; GET REAL SPEC TYPE
1512 ANDI B,37777 ; KILL SIGN BIT
1513 MOVEI E,-NUMSAT-1(B) ; GET REL POINTER TO TABLE
1516 HRRZS C,A ; FLUSH COUNT AND SAVE
1517 SKIPL E ; WITHIN BOUNDS
1518 FATAL BAD SAT IN AGC
1519 PUSHJ P,GETLNT ; GOODIE IS NOW MARKED
1520 JRST TMPREL ; ALREADY MARKED
1524 SUB E,TD.AGC+1 ; POINT TO LENGTH
1526 XCT (E) ; RET # OF ELEMENTS IN B
1528 HLRZ D,B ; GET POSSIBLE "BASIC LENGTH" FOR RESTS
1529 PUSH P,[0] ; TEMP USED IF RESTS EXIST
1531 MOVEI B,(B) ; ZAP TO ONLY LENGTH
1532 PUSH P,C ; SAVE POINTER TO TEMPLATE STRUCTURE
1533 PUSH P,[0] ; HOME FOR VALUES
1534 PUSH P,[0] ; SLOT FOR TEMP
1537 PUSH P,E ; SAVE FOR FINDING OTHER TABLES
1538 JUMPE D,TD.MR2 ; NO REPEATING SEQ
1539 ADD E,TD.GET+1 ; COMP LNTH OF REPEATING SEQ
1540 HLRE E,(E) ; E ==> - LNTH OF TEMPLATE
1541 ADDI E,(D) ; E ==> -LENGTH OF REP SEQ
1543 HRLM E,-5(P) ; SAVE IT AND BASIC
1545 TD.MR2: SKIPG D,-1(P) ; ANY LEFT?
1550 MOVE E,(E) ; POINTER TO VECTOR IN E
1551 MOVEM D,-6(P) ; SAVE ELMENT #
1552 SKIPN B,-5(P) ; SKIP IF "RESTS" EXIST
1555 MOVEI 0,(B) ; BASIC LNT TO 0
1556 SUBI 0,(D) ; SEE IF PAST BASIC
1557 JUMPGE 0,.-3 ; JUMP IF O.K.
1558 MOVSS B ; REP LNT TO RH, BASIC TO LH
1559 IDIVI 0,(B) ; A==> -WHICH REPEATER
1561 ADD A,-5(P) ; PLUS BASIC
1562 ADDI A,1 ; AND FUDGE
1563 MOVEM A,-6(P) ; SAVE FOR PUTTER
1564 ADDI E,-1(A) ; POINT
1567 TD.MR3: ADDI E,(D) ; POINT TO SLOT
1568 XCT (E) ; GET THIS ELEMENT INTO A AND B
1569 JFCL ; NO-OP FOR ANY CASE
1570 MOVEM A,-3(P) ; SAVE TYPE FOR LATER PUT
1572 EXCH A,B ; REARRANGE
1574 MOVEI C,-3(P) ; TELL OTHER GUYS THEY CANT DIRECTLY MUNG
1575 MOVSI D,400000 ; RESET FOR MARK
1576 PUSHJ P,MARK ; AND MARK THIS GUY (RET FIXED POINTER IN A)
1577 MOVE C,-4(P) ; REGOBBLE POINTER TO TEMPLATE
1579 MOVE B,-6(P) ; RESTORE COUNT
1581 MOVE E,(E) ; POINTER TO VECTOR IN E
1582 ADDI E,(B)-1 ; POINT TO SLOT
1583 MOVE B,-3(P) ; RESTORE TYPE WORD
1585 SOS D,-1(P) ; GET ELEMENT #
1586 XCT (E) ; SMASH IT BACK
1587 FATAL TEMPLATE LOSSAGE
1588 MOVE C,-4(P) ; RESTORE POINTER IN CASE MUNGED
1591 TD.MR1: MOVE A,-8(P) ; PTR TO DOPE WORD
1592 MOVE B,-7(P) ; RESTORE PTR TO FRONTEIR
1593 ADJSP P,-7 ; CLEAN UP STACK
1594 USRAG1: ADDI A,1 ; POINT TO SECOND D.W.
1595 MOVSI D,400000 ; SET UP MARK BIT
1597 HRRZ C,(A) ; DEST DW
1598 DOMULT [HLRZ E,(C)] ; LENGTH
1605 MOVSI D,400000 ; RESTORE MARK/UNMARK BIT
1608 USRAGC: HRRZ E,(E) ; MARK THE TEMPLATE
1610 MOVE A,-1(P) ; POINTER TO D.W
1611 MOVE B,(P) ; TOINTER TO FRONTIER
1614 ; This phase attempts to remove any unwanted associations. The program
1615 ; loops through the structure marking values of associations. It can only
1616 ; stop when no new values (potential items and/or indicators) are marked.
1618 VALFLS: PUSH P,LPVP ; SAVE LPVP FOR LATER
1619 PUSH P,[0] ; INDICATE WHETHER ANY ON THIS PASS
1620 PUSH P,[0] ; OR THIS BUCKET
1621 ASOMK1: MOVE A,GCASOV ; GET VECTOR POINTER
1622 SETOM -1(P) ; INITIALIZE FLAG
1624 ASOM6: SKIPG C,(A) ; SKIP IF BUCKET TO BE SCANNED
1626 SETOM (P) ; SAY BUCKET NOT CHANGED
1628 ASOM2: MOVEI EXTAC,(C) ; COPY POINTER
1629 SKIPG ASOLNT+1(C) ; SKIP IF NOT ALREADY MARKED
1630 JRST ASOM4 ; MARKED, GO ON
1631 PUSHJ P,MARKQ ; SEE IF ITEM IS MARKED
1632 JRST ASOM3 ; IT IS NOT, IGNORE IT
1633 MOVEI EXTAC,(C) ; IN CASE CLOBBERED BY MARK2
1634 MOVEI C,INDIC(C) ; POINT TO INDICATOR SLOT
1636 JRST ASOM3 ; NOT MARKED
1638 PUSH P,A ; HERE TO MARK VALUE
1640 HLRE EXTAC,ASOLNT-INDIC+1(C) ; GET LENGTH
1641 JUMPL EXTAC,.+3 ; SKIP IF MARKED
1642 CAMGE C,VECBOT ; SKIP IF IN VECT SPACE
1644 HRRM FPTR,ASOLNT-INDIC+1(C) ; PUT IN RELATIVISATION
1645 MOVEI EXTAC,12 ; AMOUNT TO ALLOCATE IN INF
1647 HRRM 0,5(C) ; STICK IN RELOCATION
1649 ASOM20: PUSHJ P,MARK2 ; AND MARK
1650 MOVEM A,1(C) ; LIST FIX UP
1651 ADDI C,ITEM-INDIC ; POINT TO ITEM
1654 ADDI C,VAL-ITEM ; POINT TO VALUE
1657 IORM D,ASOLNT-VAL+1(C) ; MARK ASOC BLOCK
1660 AOSA -1(P) ; INDICATE A MARK TOOK PLACE
1662 ASOM3: AOS (P) ; INDICATE AN UNMARKED IN THIS BUCKET
1663 ASOM4: HRRZ C,ASOLNT-1(EXTAC) ; POINT TO NEXT IN BUCKET
1664 JUMPN C,ASOM2 ; IF NOT EMPTY, CONTINUE
1665 SKIPGE (P) ; SKIP IF ANY NOT MARKED
1666 HRROS (A) ; MARK BUCKET AS NOT INTERESTING
1667 ASOM1: AOBJN A,ASOM6 ; GO TO NEXT BUCKET
1670 JUMPN 0,VALFLA ; YES, CHECK VALUES
1673 ; NOW SEE WHICH CHANNELS STILL POINTED TO
1675 CHNFL3: MOVEI 0,N.CHNS-1
1676 MOVEI A,CHNL1 ; SLOTS
1677 HRLI E,TCHAN ; TYPE HERE TOO
1679 CHNFL2: SKIPN B,1(A)
1682 SUBI B,(C) ; POINT TO DOPE
1683 HLLM E,(A) ; PUT TYPE BACK
1684 HRRE EXTAC,(A) ; SEE IF ALREADY MARKED
1688 HLLOS (A) ; MARK AS A LOSER
1691 CHNFL8: MOVEI EXTAC,1 ; MARK A GOOD CHANNEL
1696 SKIPE GCHAIR ; IF NOT HAIRY CASE
1699 SKIPL -1(P) ; SKIP IF NOTHING NEW MARKED
1702 ADJSP P,-2 ; REMOVE FLAGS
1706 ; HERE TO REEMOVE UNUSED ASSOCIATIONS
1708 MOVE A,GCASOV ; GET ASOVEC BACK FOR FLUSHES
1710 ASOFL1: SKIPN C,(A) ; SKIP IF BUCKET NOT EMPTY
1711 JRST ASOFL2 ; EMPTY BUCKET, IGNORE
1712 HRRZS (A) ; UNDO DAMAGE OF BEFORE
1714 ASOFL5: SKIPGE ASOLNT+1(C) ; SKIP IF UNMARKED
1715 JRST ASOFL6 ; MARKED, DONT FLUSH
1717 HRRZ B,ASOLNT-1(C) ; GET FORWARD POINTER
1718 HLRZ E,ASOLNT-1(C) ; AND BACK POINTER
1719 JUMPN E,ASOFL4 ; JUMP IF NO BACK POINTER (FIRST IN BUCKET)
1720 HRRZM B,(A) ; FIX BUCKET
1723 ASOFL4: HRRM B,ASOLNT-1(E) ; FIX UP PREVIOUS
1724 JUMPE B,.+2 ; JUMP IF NO NEXT POINTER
1725 HRLM E,ASOLNT-1(B) ; FIX NEXT'S BACK POINTER
1726 HRRZ B,NODPNT(C) ; SPLICE OUT THRAD
1733 ASOFL3: HRRZ C,ASOLNT-1(C) ; GO TO NEXT
1735 ASOFL2: AOBJN A,ASOFL1
1739 ; NOW CLOBBER UNMARKED LOCAL NAD GLOBAL VALUES
1741 MOVE A,GCGBSP ; GET GLOBAL PDL
1743 GLOFLS: SKIPGE (A) ; SKIP IF NOT ALREADY MARKED
1746 PUSHJ P,ZERSLT ; CLOBBER THE SLOT
1748 SVDCL: ANDCAM D,(A) ; UNMARK
1750 JUMPL A,GLOFLS ; MORE?, KEEP LOOPING
1753 LOCFL1: HRRZ A,(LPVP) ; NOW CLOBBER LOCAL SLOTS
1756 JUMPE A,LOCFL2 ; NONE TO FLUSH
1758 LOCFLS: SKIPGE (A) ; MARKDE?
1762 ANDCAM D,(A) ;UNMARK
1765 LOCFL2: JUMPN LPVP,LOCFL1 ; JUMP IF MORE PROCESS
1767 ; AT THIS POINT THE LOCALS ARE FINALLY SENT OUT.
1768 ; THIS ROUTINE UPDATES THE THIS-PROCESS BINDING.
1769 ; IT FIXES UP THE SP-CHAIN AND IT
1770 ; SENDS OUT THE ATOMS.
1773 MOVEI B,TATOM ; MARK THE BINDING TO THIS PROCESS
1774 PUSHJ P,MARK1 ; MARK THE ATOM
1775 MOVEM A,1(C) ; NEW HOME
1776 MOVEI C,2(C) ; MARK VALUE
1777 MOVEI B,TPVP ; IT IS A PROCESS VECTOR POINTER
1778 PUSHJ P,MARK1 ; MARK IT
1781 NEXPRO: MOVEI 0,TPVP ; FIX UP SLOT
1782 HLRZ A,2(R) ; GET PTR TO NEXT PROCESS
1784 HRRZ E,(A) ; ADRESS IN INF
1785 HRRZ B,(A) ; CALCULATE RELOCATION
1788 HRRZ EXTAC,A ; CALCULATE START OF TP IN EXTAC
1789 HLRZ B,(A) ; ADJUST INF PTR
1792 LDB M,[TOPGRO,,-1(A)] ; CALCULATE TOP GROWTH
1793 TRZE M,400 ; FUDGE SIGN
1796 ADD B,M ; FIX UP LENGTH
1798 SUBM M,(P) ; FIX RELOCATION TO TAKE INTO ACCOUNT
1800 MOVE M,R ; GET A COPY OF R
1801 NEXP1: HRRZ C,(M) ; GET PTR TO NEXT IN CHAIN
1802 JUMPE C,NEXP2 ; EXIT IF END OF CHAIN
1803 MOVE 0,C ; GET COPY OF CHAIN PTR TO UPDATE
1808 NEXP2: ADJSP P,-1 ; CLEAN UP STACK
1810 MOVEI A,6(R) ; POINT AFTER THE BINDING
1811 MOVE 0,EXTAC ; CALCULATE # OF WORDS TO SEND OUT
1817 HRRZS R,2(R) ; GET THE NEXT PROCESS
1821 MOVE A,GCGBSP ; PTR TO GLOBAL STACK
1822 PUSHJ P,SPCOUT ; SEND IT OUT
1824 PUSHJ P,SPCOUT ; SEND IT OUT
1827 ; THIS ROUTINE MARKS ALL THE CHANNELS
1828 ; IT THEN SENDS OUT A COPY OF THE TVP
1830 CHFIX: MOVEI 0,N.CHNS-1
1831 MOVEI A,CHNL1 ; SLOTS
1832 HRLI E,TCHAN ; TYPE HERE TOO
1834 DHNFL2: SKIPN B,1(A)
1836 MOVEI C,(A) ; MARK THE CHANNEL
1840 MOVEM A,1(C) ; ADJUST PTR
1848 ; ROUTINE TO SEND OUT STUFF - SPCOUX--DONT LOOK AT GROWTH
1849 ; SPCOUT--LOOK AT GROWTH
1851 SPCOUX: TDZA C,C ; ZERO C AS FLAG
1856 MOVEI A,1(A) ; POINT TO DOPE WORD
1859 HLLZ 0,-1(A) ; MODIFY DOPE WORD AND PLACE IN INF
1861 HRRZ B,(A) ; DESTINATION OF DOPEWORDS (SORT OF)
1862 HRLI B,GCSEG ; MAKE INTO CORRECT KIND OF ADDR
1863 DOMULT [MOVEM 0,-1(B)]
1864 JUMPE C,SPCOUY ; JUMP IF NO GROWTH STUFF
1865 LDB C,[BOTGRO,,-1(A)]
1869 SPCOUY: DOMULT [HLRZ 0,(B)]
1870 ADD 0,C ; COMPENSATE FOR SHRINKAGE
1871 SUBI 0,1 ; DONT RESEND DW
1874 DOMULT [XBLT 0,] ; MOVE VECTOR TO OTHER IMAGE
1877 ASOFL6: HLRZ E,ASOLNT-1(C) ; SEE IF FIRST IN BUCKET
1878 JUMPN E,ASOFL3 ; IF NOT CONTINUE
1879 HRRZ E,ASOLNT+1(C) ; GET PTR FROM DOPE WORD
1880 SUBI E,ASOLNT+1 ; ADJUST TO POINT TO BEGINNING OF ALSSOCIATION
1881 HRRZM E,(A) ; SMASH IT IN
1885 MARK23: PUSH P,A ; SAVE BUCKET POINTER
1891 AOS -2(P) ; MARKING HAS OCCURRED
1892 IORM D,ASOLNT+1(C) ; MARK IT
1895 \f; CHANNEL FLUSHER FOR NON HAIRY GC
1898 SETOM (P) ; RESET FOR RETRY
1905 ; VALUE FLUSHING PHASE, HACKS BOTTOM OF TP AND GLOBAL SP
1907 VALFLA: MOVE C,GCGBSP ; GET POINTER TO GLOBAL STACK
1908 VALFL1: SKIPL (C) ; SKIP IF NOT MARKED
1909 PUSHJ P,MARKQ ; SEE IF ATOM IS MARKED
1912 MOVEI B,TATOM ; UPDATE ATOM SLOT
1916 AOS -2(P) ; INDICATE MARK OCCURRED
1917 HRRZ B,(C) ; GET POSSIBLE GDECL
1918 JUMPE B,VLFL10 ; NONE
1919 CAIN B,-1 ; MAINFIFEST
1924 PUSHJ P,MARK ; MARK IT
1926 HRRM A,(C) ; CLOBBER UPDATE IN
1927 VLFL10: ADD C,[2,,2] ; BUMP TO VALUE
1928 PUSHJ P,MARK2 ; MARK VALUE
1931 VALFL2: ADD C,[4,,4]
1932 JUMPL C,VALFL1 ; JUMP IF MORE
1934 HRLM LPVP,(P) ; SAVE POINTER
1935 VALFL7: MOVEI C,(LPVP)
1939 VALFL5: HRRZ C,(C) ; CHAIN
1941 MOVEI B,TATOM ; TREAT LIKE AN ATOM
1943 PUSHJ P,MARKQ1 ; NO, SEE
1945 AOS -1(P) ; MARK WILL OCCUR
1946 MOVEI B,TATOM ; RELATAVIZE
1950 ADD C,[2,,2] ; POINT TO VALUE
1951 PUSHJ P,MARK2 ; MARK VALUE
1956 VALFL4: HRRZ C,(P) ; GET SAVED LPVP
1958 HRRZ C,2(C) ; POINT TO NEXT
1962 HRRM LPVP,2(A) ; NEW PROCESS WAS MARKED
1965 ZERSLT: HRRI B,(A) ; COPY POINTER
1970 VALFL9: HLRZ LPVP,(P) ; RESTORE CHAIN
1973 \f;SUBROUTINE TO SEE IF A GOODIE IS MARKED
1974 ;RECEIVES POINTER IN C
1975 ;SKIPS IF MARKED NOT OTHERWISE
1977 MARKQ: HLRZ B,(C) ;TYPE TO B
1978 MARKQ1: MOVE E,1(C) ;DATUM TO C
1980 CAIL 0,@PURBOT ; DONT CHACK PURE
1981 JRST MKD ; ALWAYS MARKED
1982 ANDI B,TYPMSK ; FLUSH MONITORS
1984 HRRZ B,@TYPNT ;GOBBLE SAT
1986 CAIG B,NUMSAT ; SKIP FOR TEMPLATE
1987 JRST @MQTBS(B) ;DISPATCH
1988 ANDI E,-1 ; FLUSH REST HACKS
1996 DISTB2 DUM3,MKD,[[S2WORD,PAIRMQ],[S2DEFR,PAIRMQ],[SNWORD,VECMQ],[S2NWORD,VECMQ]
1997 [STPSTK,VECMQ],[SARGS,ARGMQ],[SPSTK,VECMQ],[SFRAME,FRMQ],[SLOCID,LOCMQ]
1998 [SATOM,ATMMQ],[SPVP,VECMQ],[SCHSTR,BYTMQ],[SLOCA,ARGMQ],[SLOCU,VECMQ]
1999 [SLOCV,VECMQ],[SLOCS,BYTMQ],[SLOCN,ASMQ],[SASOC,ASMQ],[SLOCL,PAIRMQ],[SGATOM,ATMMQ]
2000 [SBYTE,BYTMQ],[SLOCB,BYTMQ],[SDEFQ,PAIRMQ],[SOFFS,OFFSMQ]]
2004 PAIRMQ: JUMPE E,MKD ; NIL ALWAYS MARKED
2005 SKIPL (E) ; SKIP IF MARKED
2011 BYTMQ: PUSH P,A ; SAVE A
2012 PUSHJ P,BYTDOP ; GET PTR TO DOPE WORD
2013 MOVE E,A ; COPY POINTER
2015 SKIPGE (E) ; SKIP IF NOT MARKED
2019 FRMQ: HRRZ E,(C) ; POINT TO PV DOPE WORD
2022 ATMMQ: CAML 0,GCSBOT ; ALWAYS KEEP FROZEN ATOMS
2027 VECMQ: HLRE 0,E ;GET LENGTH
2028 SUB E,0 ;POINT TO DOPE WORDS
2030 VECMQ1: SKIPGE 1(E) ;SKIP IF NOT MARKED
2031 AOS (P) ;MARKED, CAUSE SKIP RETURN
2037 LOCMQ: HRRZ 0,(C) ; GET TIME
2038 JUMPE 0,VECMQ ; GLOBAL, LIKE VECTOR
2039 HLRE 0,E ; FIND DOPE
2041 MOVEI E,1(E) ; POINT TO LAST DOPE
2042 CAMN E,TPGROW ; GROWING?
2043 SOJA E,VECMQ1 ; YES, CHECK
2044 ADDI E,PDLBUF ; FUDGE
2049 OFFSMQ: HLRZS E ; POINT TO LIST STRUCTURE
2050 SKIPGE (E) ; MARKED?
2054 \f; SUBROUTINE TO UPDATE ASSOCIATIONS AND MOVE THEM INTO THE INF
2056 ASSOUP: MOVE A,GCNOD ; RECOVER PTR TO START OF CHAIN
2057 ASSOP1: HRRZ B,NODPNT(A)
2058 PUSH P,B ; SAVE NEXT ON CHAIN
2060 HRRZ B,ASOLNT-1(A) ;POINT TO NEXT
2062 HRRZ C,ASOLNT+1(B) ;AND GET ITS RELOC IN C
2063 SUBI C,ASOLNT+1(B) ; RELATIVIZE
2064 ADDM C,ASOLNT-1(A) ;C NOW HAS UPDATED POINTER
2065 ASOUP1: HLRZ B,ASOLNT-1(A) ;GET PREV BLOCK POINTER
2067 HRRZ EXTAC,ASOLNT+1(B) ;AND ITS RELOCATION
2068 SUBI EXTAC,ASOLNT+1(B) ; RELATIVIZE
2070 ADDM EXTAC,ASOLNT-1(A) ;RELOCATE
2071 ASOUP2: HRRZ B,NODPNT(A) ;UPDATE NODE CHAIN
2073 HRRZ C,ASOLNT+1(B) ;GET RELOC
2074 SUBI C,ASOLNT+1(B) ; RELATIVIZE
2075 ADDM C,NODPNT(A) ;AND UPDATE
2076 ASOUP4: HLRZ B,NODPNT(A) ;GET PREV POINTER
2078 HRRZ EXTAC,ASOLNT+1(B) ;RELOC
2079 SUBI EXTAC,ASOLNT+1(B)
2081 ADDM EXTAC,NODPNT(A)
2082 ASOUP5: POP P,A ; RECOVER PTR TO DOPE WORD
2085 POP P,A ; RECOVER PTR TO ASSOCIATION
2086 JUMPN A,ASSOP1 ; IF NOT ZERO CONTINUP
2090 ; HERE TO CLEAN UP ATOM HASH TABLE
2092 ATCLEA: MOVE A,GCHSHT ; GET TABLE POINTER
2095 SKIPE C,(A) ; GET NEXT
2096 JRST ATCLE2 ; GOT ONE
2098 ATCLE3: PUSHJ P,OUTATM
2101 MOVE A,GCHSHT ; MOVE OUT TABLE
2109 ATCLE5: CAIL C,HIBOT
2111 CAMG C,VECBOT ; FROZEN ATOMS ALWAYS MARKED
2113 SKIPL 1(C) ; SKIP IF ATOM MARKED
2116 HRRZ 0,1(C) ; GET DESTINATION
2117 CAIN 0,-1 ; FROZEN/MAGIC ATOM
2118 MOVEI 0,1(C) ; USE CURRENT POSN
2119 SUBI 0,1 ; POINT TO CORRECT DOPE
2120 JUMPN B,ATCLE7 ; JUMP IF GOES INTO ATOM
2122 HRRZM 0,(A) ; INTO HASH TABLE
2125 ATCLE7: HRLM 0,2(B) ; INTO PREV ATOM
2129 ANDI B,377777 ; KILL MARK BIT
2134 JUMPE C,ATCLE3 ; DONE WITH BUCKET
2137 ; HERE TO PASS OVER LOST ATOM
2139 ATCLE6: HLRZ EXTAC,1(C) ; FIND NEXT ATOM
2149 OUTATM: JUMPE B,CPOPJ
2157 POP P,A ; RECOVER PTR TO ASSOCIATION
2161 VCMLOS: FATAL AGC--VECTOR WITH ZERO IN DOPE WORD LENGTH
2164 ; THESE ARE THE MESSAGES INDICATING THE CAUSE OF THE GC
2166 MSGGCT: [ASCIZ /USER CALLED- /]
2167 [ASCIZ /FREE STORAGE- /]
2168 [ASCIZ /TP-STACK- /]
2169 [ASCIZ /TOP-LEVEL LOCALS- /]
2170 [ASCIZ /GLOBAL VALUES- /]
2172 [ASCIZ /STATIONARY IMPURE STORAGE- /]
2174 [ASCIZ /BOTH STACKS BLOWN- /]
2175 [ASCIZ /PURE STORAGE- /]
2176 [ASCIZ /GC-RCALL- /]
2178 ; THESE ARE MESSAGES INDICATING WHO CAUSED THE GC
2184 MSGGFT: [ASCIZ /GC-READ /]
2192 [ASCIZ /PURE-PAGE LOADER /]
2194 [ASCIZ /INTERRUPT-HANDLER /]
2199 .GLOBAL GCNO,BSTGC,BSTAT,NOWFRE,CURFRE,MAXFRE,USEFRE,NOWTP,CURTP,CTPMX,NOWLFL
2200 .GLOBAL CURLVL,NOWGVL,CURGVL,NOWTYP,CURTYP,NOWSTO,CURSTO,CURMAX,NOWP,CURP,CPMX
2201 .GLOBAL GCCAUS,GCCALL,LVLINC,GVLINC,TYPIC,STORIC,RCL,RCLV,GCDANG,GETNUM,RPTOP,CORTOP
2202 .GLOBAL TPGROW,PPGROW,PGROW,PMAIN,PGOOD,PMAX,TPGOOD,TPMIN,TPMAX,RFRETP,TYPTAB
2203 .GLOBAL NNPRI,NNSAT,TYPSAV,BUFGC,GCTIM,GPURFL,GCDFLG,DUMFLG
2204 .GLOBAL TPBINC,GBLINC,TYPINC,CONADJ,OGCSTP,ABOTN,MAXLEN
2205 .GLOBAL PURMIN,GCMONF,.LIST.,FPAG,PMIN,GLBINC,INCORF,PURCOR,GCHAIR
2213 ; LOCACTIONS USED BY THE PAGE HACKER
2217 ;VARIABLES WHICH DETERMIN WHEN MUDDLE WILL ASK FOR MORE CORE,
2218 ;AND WHEN IT WILL GET UNHAPPY
2222 GCHSHT: 0 ; SAVED ATOM TABLE
2223 PURSVT: 0 ; SAVED PURVEC TABLE
2224 GLTOP: 0 ; SAVE GLOTOP
2225 GCNOD: 0 ; PTR TO START OF ASSOCIATION CHAIN
2226 GCGBSP: 0 ; SAVED GLOBAL SP
2227 GCASOV: 0 ; SAVED PTR TO ASSOCIATION VECTOR
2228 GCATM: 0 ; PTR TO IMQUOT THIS-PROCESS
2229 NPARBO: 0 ; SAVED PARBOT
2232 ; CONSTANTS FOR DUMPER,READER AND PURIFYER
2238 ; VARIABLE USED BY MARK SWEEP GARBAGE COLLECTOR
2248 DEFINE HERE G00002,G00003
2249 G00002!G00003!TERMIN
2276 .LOP <ASH @> ZZ2 <,-10.>
2279 .LOP <ASH @> SECLEN <,10.>
2282 .LOP <ASH @> AGCLD <,-10.>