1 TITLE AGC MUDDLE GARBAGE COLLECTOR
3 ;SYSTEM WIDE DEFINITIONS GO HERE
9 .GLOBAL RCL,VECTOP,GCSTOP,GCSBOT,FRETOP,GCSNEW,VECBOT,PARTOP,PARBOT,HITOP,HIBOT,GETPAG
10 .GLOBAL PDLBUF,PDLEX,PDLEXP,GCFLG,GCPDL,GETNUM,PARNEW,MOVPUR,RCLV,RCLVEC,PGCNT
11 .GLOBAL PGROW,TPGROW,MAINPR,MSGTYP,PURTOP,PURBOT,STOSTR,GCSET,CKPUR
12 .GLOBAL MTYI,UPLO,FRMUNG,BYTDOP,GLOBSP,FREDIF,FREMIN,GCHAPN,INTFLG,FINAGC,NGCS,INQAGC
13 .GLOBAL SAT,TTOCHN,TYPVEC,ICONS,INCONS,IBLOCK,IEUVEC,IEVECTI,CELL2,MKTBS,RLENGC
14 .GLOBAL GIBLOK,REHASH,IBLOK1,IILIST,IIFORM,CIVEC,CIUVEC,CICONS,CPOPJ,RBLDM,GCOFFS
15 .GLOBAL SPBASE,OUTRNG,CISTNG,CBYTES,%RUNAM,PURVEC,GCDOWN,N.CHNS,CHNL1,PLODR,MRKPDL
16 .GLOBAL CAFRE,CAFRET,STOGC,GCHN,WNDP,FRNP,FRONT,%GCJOB,%SHWND,%INFMP,%GETIP,CHKPGI
17 .GLOBAL TD.PUT,TD.GET,TD.AGC,TD.AGC,TD.LNT,GLOTOP,UBIT,FLGSET,PURMNG,RPURBT,%IFMP2
18 .GLOBAL CTIME,IMTYO,ILOC,NODES,GPURFL,GCDANG,GCHACK,LPUR,HITOP,BADCHN,IMPURX,PURCLN
19 .GLOBAL GCTIM,GCCAUS,GCCALL,IAAGC,LVLINC,STORIC,GVLINC,TYPIC,GCRSET,ACCESS,NOSHUF,SQUPNT
20 ; GLOBALS ASSOCIATE WITH THE ASSOCIATION VECTOR
22 .GLOBAL ASOVEC,ASOLNT,ITEM,INDIC,VAL,NWORDT,NODPNT,PNTRS,DSTORE,HASHTB
23 .GLOBAL CELL,BINDID,GCFLCH,TYPBOT,GLOBAS,TPBASE,NOWLVL,CURPLN,PVSTOR,SPSTOR
25 .GLOBAL P.TOP,P.CORE,PMAPB,IGET,CIGTPR,ROOT,STBL,CAFREE,%MPIN1,%PURIF,%MPINX,GCHK10
26 .GLOBAL %SAVRP,%RSTRP,LENGC,AGCLD,PAGEGC,REALGC,MARK
27 .GLOBAL %MPINT,%GBINT,%CLSMP,%CLSM1,PINIT,PGFIND,NPRFLG,%PURMD
28 .GLOBAL GCKNUM,CORTOP,GCHPN,INTAGC,WNDP,WNDBOT,BUFGC,WIND,GCDFLG,SAVM,AGC,GCSET
30 .GLOBAL GCRET,PAIRMK,DEFMK,VECTMK,TBMK,TPMK,ARGMK,VECTMK,FRMK,BYTMK,ATOMK,GATOMK
31 .GLOBAL BYTMK,ABMK,LOCRMK,GCRDMK,DEFQMK,ASMRK,LOCMK,OFFSMK,INBLOT,MARK2A
33 NOPAGS==1 ; NUMBER OF WINDOWS
36 NTPMAX==20000 ; NORMAL MAX TP SIZE
37 NTPGOO==4000 ; NORMAL GOOD TP
38 ETPMAX==2000 ; TPMAX IN AN EMERGENCY (I.E. GC RECALL)
39 ETPGOO==2000 ; GOOD TP IN EMERGENCY
41 .ATOM.==200000 ; FLAG SAYING ATOMS MARKED (FOR VAL FLUSH LOGIC)
43 GCHN==0 ; CHANNEL FOR FUNNNY INFERIOR
44 STATNO==19. ; # OF STATISTICS FOR BLOAT-STAT
45 STATGC==8. ; # OF GC-STATISTICS FOR BLOAT-STAT
61 TYPNT=AB ;SPECIAL AC USAGE DURING GC
62 F=TP ;ALSO SPECIAL DURING GC
63 LPVP=SP ;SPECIAL FOR GC, HOLDS POINTER TO PROCESS CHAIN
64 FPTR=TB ; POINT TO CURRENT FRONTIER OF INFERIOR
67 ; WINDOW AND FRONTIER PAGES
69 MAPCH==0 ; MAPPING CHANNEL
71 FPAG==2000 ; START OF PAGES FOR GC-READ AND GCDUMP
72 CONADJ==5 ; ADJUSTMENT OF DUMPERS CONSTANT TABLE
75 ; INTERNAL GCDUMP ROUTINE
76 .GLOBAL GODUMP,EGCDUM,EPURIF,ERRKIL,IPURIF
78 GODUMP: MOVE PVP,PVSTOR+1
79 MOVEM P,PSTO+1(PVP) ; SAVE P
82 PUSHJ P,INFSU1 ; SET UP INFERIORS
85 SETZM PURMNG ; INITIALIZE FLAG INDICATING IF PURIFIED PAGES
87 MOVEI 0,HIBOT ; SET UP NEW PURBOT TO CONVINCE THE GARBAGE COLLECTOR
88 ; TO COLLECT PURIFIED STRUCTURES
90 MOVEM 0,RPURBT ; SAVE THE OLD PURBOT
93 MOVEM 0,RGCSTP ; SAVE THE OLD GCSTOP
94 POP P,C ; SET UP PTR TO TYPE/VALUE PAIR
95 MOVE P,A ; GET NEW PDL PTR
96 SETOM DUMFLG ; FLAG INDICATING IN DUMPER
99 ADD FPTR,[7,,7] ; ADJUST FOR FIRST STATUS WORDS
101 MOVEI E,FPAG+6 ; SEND OUT PAIR
107 MOVE C,(C) ; SEND OUT UPDATED PTR
110 MOVEI 0,@BOTNEW ; CALCULATE START OF TYPE-TABLE
112 MOVE 0,RPURBT ; RESTORE PURBOT
114 MOVE 0,RGCSTP ; RESTORE GCSTOP
118 ; ROUTINE TO SCAN THE TYPE-VECTOR FOR MARKED TYPE SLOTS AND BUILD A TYPE-TABLE OUT OF
121 MOVE A,TYPSAV ; GET AOBJN POINTER TO TYPE-VECTOR
122 MOVEI B,0 ; INITIALIZE TYPE COUNT
123 TYPLP2: HLRE C,(A) ; GET MARKING
124 JUMPGE C,TYPLP1 ; IF NOT MARKED DON'T OUTPUT
125 MOVE C,(A) ; GET FIRST WORD
126 HRL C,B ; FIX UP SO TYPE-NUMBER REPLACES TYPE-CELL
132 PUSHJ P,MOVFNT ; EXTEND THE FRONTIER
134 MOVE C,1(A) ; OUTPUT SECOND WORD
137 TYPLP1: ADDI B,1 ; INCREMENT TYPE COUNT
138 ADD A,[2,,2] ; POINT TO NEXT SLOT
139 JUMPL A,TYPLP2 ; LOOP
141 ; ROUTINE TO BUILD UP ATOM TABLE USING LPVP CHAIN
144 MOVEI 0,@BOTNEW ; GET CURRENT BEGINNING OF TRANSFER
145 MOVEM 0,ABOTN ; SAVE IT
146 PUSHJ P,ALLOGC ; ALLOCATE ROOM FOR ATOMS
147 MOVSI D,400000 ; SET UP UNMARK BIT
148 SPOUT: JUMPE LPVP,DPGC4 ; END OF CHAIN
149 MOVEI F,(LPVP) ; GET COPY OF LPVP
150 HRRZ LPVP,-1(LPVP) ; LPVP POINTS TO NEXT ON CHAIN
151 ANDCAM D,(F) ; UNMARK IT
152 HLRZ C,(F) ; GET LENGTH
153 HRRZ E,(F) ; POINTER INTO INF
155 SUBI C,2 ; WE'RE NOT SENDING OUT THE VALUE PAIR
156 HRLM C,(F) ; ADJUSTED LENGTH
157 MOVE 0,C ; COPY C FOR TRBLKX
158 SUBI E,(C) ; ADJUST PTRS FOR SENDOUT
\r
160 PUSHJ P,TRBLKX ; OUT IT GOES
164 ; HERE TO SEND OUT DELIMITER INFORMATION
165 DPGC4: SKIPN INCORF ; SKIP IF TRANSFREING TO UVECTOR IN CORE
167 SKIPL FPTR ; SEE IF ROOM IN FRONTEIR
168 PUSHJ P,MOVFNT ; EXTEND FRONTEIR
173 MOVEI A,@BOTNEW ; LENGTH
180 MOVE C,ABOTN ; START OF ATOMS
181 SUBI C,FPAG+CONADJ ; ADJUSTMENT FOR STARTING ON PAGE ONE
182 PUSHJ P,ADWD ; OUT IT GOES
186 SKIPE INCORF ; SKIP IF TO CHANNEL
187 SUBI C,2 ; SUBTRACT FOR DOPE WORDS
190 ADDI C,2 ; RESTORE C TO REAL ABOTN
195 MOVEI E,FPAG+2 ; SEND OUT START OF TYPE TABLE
197 ADDI E,1 ; SEND OUT NUMPRI
200 ADDI E,1 ; SEND OUT NUMSAT
206 ; FINAL CLOSING OF INFERIORS
211 POP P,A ; LENGTH OF CODE
215 IRP AC,,[P,TP,TB,AB,FRM]
216 MOVE AC,AC!STO+1(PVP)
221 SETZM GCDFLG ; ZERO FLAG INDICATING IN DUMPER
222 SETZM GCFLG ; AND INDICTOR TO INTERRUPT HANDLER THAT AGC IS ON
224 MOVE A,INF2 ; GET POINTER TO PURE MAPPED OUT
235 SETZM GPURFL ; PURE FLAG
242 IRP AC,,[P,R,M,TP,TB,AB,FRM]
243 MOVE AC,AC!STO+1(PVP)
246 ERDUMP: PUSH TP,$TATOM
250 PUSH TP,EQUOTE STRUCTURE-CONTAINS-UNDUMPABLE-TYPE
254 PUSH TP,$TATOM ; PUSH ON PRIMTYPE
255 PUSH TP,@STBL(A) ; PUSH ON PRIMTYPE
259 ; ALTERNATE ATOM MARKER FOR DUMPER
261 DATOMK: SKIPE GPURFL ; SKIP IF NOT IN PURIFIER
263 CAILE A,0 ; SEE IF ALREADY MARKED
265 PUSH P,A ; SAVE PTR TO ATOM
266 HLRE B,A ; POINT TO DOPE WORD
267 SUB A,B ; TO FIRST DOPE WORD
268 MOVEI A,1(A) ; TO SECOND
269 PUSH P,A ; SAVE PTR TO DOPE WORD
270 HLRZ B,(A) ; GET LENGTH AND MARKING
271 TRZE B,400000 ; TURN OFF BIT AND SKIP IF UNMARKED
274 MOVE 0,ABOTN ; GET CURRENT TOP OF ATOM TABLE
275 ADDI 0,-2(B) ; PLACE OF DOPE WORD IN TABLE
276 HRRM 0,(A) ; PUT IN RELOCATION
277 MOVEM 0,ABOTN ; FIXUP TOP OF TABLE
278 HRRM LPVP,-1(A) ; FIXUP CHAIN
280 MOVE A,-1(P) ; GET POINTER TO ATOM BACK
281 HRRZ B,2(A) ; GET OBLIST POINTER
282 JUMPE B,NOOB ; IF ZERO ON NO OBLIST
283 CAMG B,VECBOT ; DON'T SKIP IF OFFSET FROM TVP
286 DATMK3: MOVE A,$TOBLS ; SET UP FOR GET
290 MOVE D,IMQUOTE OBLIST
294 PUSH P,TP ; SAVE FPTR
296 MOVE TP,TPSTO+1(TP) ; GET TP
298 POP P,TP ; RESTORE FPTR
299 MOVE C,-1(P) ; RECOVER PTR TO ATOM
300 ADDI C,1 ; SET UP TO MARK OBLIST ATOM
301 MOVSI D,400000 ; RESTORE MARK WORD
312 PUSHJ P,MARK1 ; MARK IT
313 MOVEM A,1(C) ; SMASH IN ITS ID
315 NOOB: POP P,A ; GET PTR TO DOPE WORD BACK
316 HRRZ A,(A) ; RETURN ID
317 SUB P,[1,,1] ; CLEAN OFF STACK
321 ; HERE FOR A ROOT ATOM
322 RTSET: SETOM 1(C) ; INDICATOR OF ROOT ATOM
326 ; INTERNAL PURIFY ROUTINE
329 IPURIF: PUSHJ P,PURCLN ; GET RID OF PURE MAPPED
331 IRP AC,,[P,R,M,TP,TB,AB,FRM]
332 MOVEM AC,AC!STO"+1(PVP)
336 ; HERE TO CREATE INFERIORS AND MARK THE ITEM
337 PURIT1: MOVE PVP,PVSTOR+1
338 MOVEM P,PSTO+1(PVP) ; SAVE P
339 SETOM GPURFL ; INDICATE PURIFICATION IS TAKING PLACE
341 MOVEM C,SAVRS1 ; SAV PTR TO PAIR
343 PUSHJ P,INFSUP ; GET INFERIORS
344 MOVE P,A ; GET NEW PDL PTR
345 PUSHJ P,%SAVRP ; SAVE RPMAP TABLE FOR TENEX
346 MOVE C,SAVRS1 ; SET UP FOR MARKING
347 MOVE A,(C) ; GET TYPE WORD
351 PURIT4: POP P,C ; RESTORE C
352 ADD C,[2,,2] ; TO NEXT ARG
354 MOVEM A,SAVRES ; SAVE UPDATED POINTER
356 ; FIX UP IMPURE PART OF ATOM CHAIN
358 PUSH P,[0] ; FLAG INDICATING NON PURE SCAN
360 SUB P,[1,,1] ; CLEAN OFF STACK
362 ; NOW TO GET PURE STORAGE
364 PURIT2: MOVEI A,@BOTNEW ; GET BOTNEW
365 SUBI A,2000-1777 ; START AT PAGE 1 AND ROUND
367 ASH A,-10. ; TO PAGES
370 PUSHJ P,PGFIND ; FIND THEM
371 JUMPL B,LOSLP2 ; LOST GO TO CAUSE AGC
372 HRRZ 0,BUFGC ;GET BUFFER PAGE
374 MOVEI A,(B) ; GET LOWER PORTION OF PAGES
376 SUBM A,C ; GET END PAGE
377 CAIL 0,(A) ; L? LOWER
378 CAILE 0,(C) ; G? HIGER
379 JRST NOREMP ; DON'T GET NEW BUFFER
380 PUSHJ P,%FDBUF ; GET A NEW BUFFER PAGE
381 NOREMP: MOVN A,(P) ; SET UP AOBJN PTR FOR MAPIN
386 MOVEM B,INF3 ; SAVE PTR FOR PURIFICATION
387 PUSHJ P,%MPIN1 ; MAP IT INTO PURE
390 SUB P,[1,,1] ; CLEAN OFF STACK
395 MOVE P,PSTO+1(PVP) ; GET REAL P
400 IRP AC,,[M,TP,TB,R,FRM]
401 MOVE AC,AC!STO+1(PVP)
405 ; NOW FIX UP POINTERS IN PURE STRUCTURE
408 PUSH P,GCSBOT ; SAVE GCSBOT AND GCSTOP
410 MOVE A,MAPUP ; NEW GCSBOT AND TOP TO FOOL GCHACK
413 SUBI A,2000 ; ADJUSTMENT FOR START ON PAGE ONE
415 MOVE A,[PUSHJ P,NPRFIX]
416 MOVEI PVP,0 ; SAY MIGHT BE NON-ATOMS
421 ; NOW FIX UP POINTERS TO PURIFIED STRUCTURE
423 MOVE A,[PUSHJ P,PURFIX]
424 MOVEI PVP,0 ; SAY MIGHT BE NON-ATOMS
431 POP P,LPVP ; GET BACK LPVP
433 PUSHJ P,%KILJB ; KILL IMAGE SAVING INFERIOR
434 PUSH P,[-1] ; INDICATION OF PURE ATOM SCAN
437 ; SET UP PMAP SO THAT NEW PURE PAGES ARE INDICATED
439 MOVE A,INF3 ; GET AOBJN PTR TO PAGES
440 FIXPMP: HRRZ B,A ; GET A PAGE
441 IDIVI B,16. ; DIVIDE SO AS TO PT TO PMAP WORD
442 PUSHJ P,PINIT ; SET UP PARAMETER
444 TDO E,D ; FIX UP WORD
445 MOVEM E,PMAPB(B) ; SEND IT BACK
449 MOVE A,[PUSHJ P,PURTFX] ; FIX UP PURE ATOM POINTERS
450 MOVEI PVP,1 ; SAY MIGHT BE NON-ATOMS
453 ; NOW FIX UP POINTERS IN PURE STRUCTURE
454 PUSH P,GCSBOT ; SAVE GCSBOT AND GCSTOP
456 MOVE A,MAPUP ; NEW GCSBOT AND TOP TO FOOL GCHACK
459 SUBI A,2000 ; ADJUSTMENT FOR START ON PAGE ONE
461 MOVE A,[PUSHJ P,PURTFX]
462 MOVEI PVP,1 ; SAY MIGHT BE NON-ATOMS
467 ; HERE TO FIX UP ATOMS WITH TYPES HACKED INTO THEIR GROWTH FIELD
469 MOVE A,TYPVEC+1 ; GET TYPE VECTOR
470 MOVEI B,400000 ; TLOSE==0
471 TTFIX: HRRZ D,1(A) ; GET ADDR
474 HRRM B,(D) ; SMASH IT IN
475 NOTFIX: ADDI B,1 ; NEXT TYPE
479 ; NOW CLOSE UP INFERIORS AND RETURN
481 PURCLS: MOVE P,[-2000,,MRKPDL]
482 PUSHJ P,%RSTRP ;RESETORE RPMAP TABLE FOR TENEX
486 MOVE P,PSTO+1(PVP) ; RESTORE P
487 MOVE AB,ABSTO+1(PVP) ; RESTORE R
489 MOVE A,INF3 ; GET PTR TO PURIFIED STRUCTURE
491 PUSHJ P,%PURIF ; PURIFY
495 JRST EPURIF ; FINISH UP
501 PUSHJ P,SAT ; GET STORAGE ALLOCATION TYPE
502 MOVE C,MAPUP ; FIXUP AMOUNT
503 SUBI C,FPAG ; ADJUST FOR START ON FIRST PAGE
504 CAIE A,SLOCR ; DONT HACK TLOCRS
505 CAIN A,S1WORD ; SKIP IF NOT OF PRIMTYPE WORD
512 JRST OFFFXP ; FIXUP OFFSETS
514 JUMPE D,LSTFXP ; SKIP IF NIL
515 CAMG D,PURTOP ; SEE IF ALREADY PURE
517 LSTFXP: TLNN B,.LIST. ; SKIP IF NOT A PAIR
519 HRRZ D,(B) ; GET REST OF LIST
520 SKIPE D ; SKIP IF POINTS TO NIL
523 CAMG D,PURTOP ; SKIP IF ALREADY PURE
524 ADDM C,(B) ; FIX UP LIST
526 POP P,B ; RESTORE GCHACK AC'S
530 OFFFXP: HLRZ 0,D ; POINT TO LIST
531 JUMPE 0,LSTFXP ; POINTS TO NIL
532 CAML 0,PURTOP ; ALREADY PURE?
534 ADD 0,C ; UPDATE THE POINTER
535 HRLM 0,1(B) ; STUFF IT OUT
538 STRFXP: TLZN D,STATM ; SKIP IF REALLY ATOM
542 MOVE C,B ; GET ARG FOR BYTDOP
548 ATMFXP: HLRE 0,D ; GET LENGTH
549 SUB D,0 ; POINT TO FIRST DOPE WORD
551 ATMFXQ: CAML D,OGCSTP
552 CAIL D,HIBOT ; SKIP IF IMPURE
554 HRRZ 0,1(D) ; GET RELOCATION
556 ADDM 0,1(B) ; FIX UP PTR IN STRUCTURE
559 ; FIXUP OF PURE ATOM POINTERS
561 PURTFX: CAIE C,TATOM ; SKIP IF ATOM POINTER
563 HLRE E,D ; GET TO DOPE WORD
565 PURSF1: SKIPL 1(E) ; SKIP IF MARKED
567 HRRZ 0,1(E) ; RELATAVIZE PTR
569 ADD D,0 ; FIX UP PASSED POINTER
570 SKIPE B ; AND IF APPROPRIATE MUNG POINTER
571 ADDM 0,1(B) ; FIX UP POINTER
574 PURSFX: CAIE C,TCHSTR
576 MOVE C,B ; GET ARG FOR BYTDOP
580 MOVE A,[PUSHJ P,PURTFX]
588 PUSH P,C ; SAVE AC'S FOR GCHACK
589 EXCH A,C ; GET TYPE IN A
590 CAIN A,TATOM ; CHECK FOR ATOM
594 CAILE A,NUMSAT ; SKIP IF TEMPLATE
596 IFN ITS, JRST @PURDSP(A)
606 DISTBS DUM1,TLFX,[[S2WORD,LPLSTF],[S2DEFR,LPLSTF],[SNWORD,VECFX],
607 [S2NWORD,VECFX],[SSTORE,VECFX],[SBYTE,STRFX],[SATOM,ATPFX],[SLOCB,STRFX]
608 [SCHSTR,STRFX],[SLOCL,LPLSTF],[SLOCV,VECFX],[SLOCU,VECFX],[SLOCS,VECFX],[SOFFS,OFFSFX]]
612 VECFX: HLRE 0,D ; GET LENGTH
613 SUB D,0 ; POINT TO D.W.
614 SKIPL 1(D) ; SKIP IF MARKED
617 SUBI C,1(D) ; CALCULATE RELOCATION
618 ADD C,MAPUP ; ADJUSTMENT
621 TLFX: TLNN B,.LIST. ; SEE IF PAIR
622 JRST LVPUR ; LEAVE IF NOT
626 SKIPN D ; SKIP IF NOT ZERO
628 MOVE D,(D) ; GET CADR
629 SKIPL D ; SKIP IF MARKED
640 STRFX: MOVE C,B ; GET ARG FOR BYTDOP
642 SKIPL (A) ; SKIP IF MARKED
647 CAIN 0,SATOM ; REALLY ATOM?
649 HRRZ 0,(A) ; GET PTR IN NEW STRUCTURE
650 SUBI 0,(A) ; RELATAVIZE
653 ADDM 0,1(B) ; FIX UP PTR
658 SKIPL 1(C) ; SKIP IF MARKED
660 ATPFX1: HRRZS C ; SEE IF PURE
661 CAIL C,HIBOT ; SKIP IF NOT PURE
663 HRRZ 0,1(C) ; GET PTR TO NEW ATOM
664 SUBI 0,1(C) ; RELATAVIZE
670 LPLSTF: SKIPN D ; SKIP IF NOT PTR TO NIL
672 SKIPL (D) ; SKIP IF MARKED
674 HRRZ D,(D) ; GET UPDATED POINTER
675 ADD D,MAPUP ; ADJUSTMENT
680 OFFSFX: HLRZS D ; LIST POINTER
689 ; ROUTINES TO CAUSE A GARBAGE COLLECT WHEN EFFORTS TO GET STORAGE FAIL
692 MOVEM A,PARNEW ; SET UP GC PARAMS
696 LOSLP2: MOVEI A,@BOTNEW ; TOTAL AMOUNT NEEDED
698 ANDCMI A,1777 ; CALCULATE PURE PAGES NEEDED
703 PURLOS: MOVE P,[-2000,,MRKPDL]
706 MOVE R,C ; GET A COPY OF A
707 PUSHJ P,INFCLS ; CLOSE INFERIORS AND FIX UP WORLD
715 IRP AC,,[P,R,M,TP,TB,AB,FRM]
716 MOVE AC,AC!STO+1(PVP)
719 SETZM GCDFLG ; ZERO OUT FLAGS
724 PUSHJ P,AGC ; GARBAGE COLLECT
725 JRST PURIT1 ; TRY AGAIN
727 ; PURIFIER ATOM MARKER
731 JRST GCRET ; DONE IF FROZEN
732 HLRE B,A ; GET TO D.W.
734 SKIPG 1(A) ; SKIP IF NOT MARKED
737 IORM D,1(A) ; MARK THE ATOM
739 HRRM LPVP,(A) ; LINK ONTO CHAIN
744 .GLOBAL %LDRDO,%MPRDO
746 ; ROUTINES TO ALLOW GC-DUMPING OF PURIFIED STRUCTURES.
748 ; PROPUR MAPS PAGES CONTAINING PURIFIED STUFF INTO THE AGD INFERIOR SO THAT IN CASE
749 ; THE PAGES ARE MUNGED THEY CAN BE RESTORED USING MAPPING
751 ; REPURE REMAPS ANY PAGES THAT WERE MUNGED BY GC-DUMP BY RELOADING THEM FROM THE AGD
752 ; INFERIOR IN READ/EXEC MODE
754 REPURE: PUSH P,[PUSHJ P,%LDRDO] ; INSTRUCTION FOR MAPPING IN PAGES FROM AGD INF
756 PROPUR: PUSH P,[PUSHJ P,%MPRDO] ; INSTRUCTION FOR MAPPING PAGES TO AGD INF
757 MOVE A,PURBOT ; GET STARTING PAGE OF PURENESS
758 ASH A,-10. ; CONVERT TO PAGES
759 MOVEI C,HIBOT ; GET ENDING PAGE
760 ASH C,-10. ; CONVERT TO PAGES
761 PUSH P,A ; SAVE PAGE POINTER
762 PUSH P,C ; SAVE END OF PURENESS POINTER
763 PROLOP: CAML A,(P) ; SKIP IF STILL PURE PAGES TO CHECK
764 JRST PRODON ; DONE MAPPING PAGES
765 PUSHJ P,CHKPGI ; SKIP IF PAGE IS PURE
766 JRST NOTPUR ; IT IS NOT
767 MOVE A,-1(P) ; GET PAGE TO MAP
768 XCT -2(P) ; MAP IN/OUT TO AGD INFERIOR IN READ/EXEC MODE
769 NOTPUR: AOS A,-1(P) ; INCREMENT PAGE POINTER AND LOAD
770 JRST PROLOP ; LOOP BACK
771 PRODON: SUB P,[3,,3] ; CLEAN OFF STACK
776 .GLOBAL %SAVIN,STOSTR,%CLMP1,%IMSAV,%IMSV1,ILOOKC,PSHGCF,BSETG,%GCJB1
777 .GLOBAL %CLSJB,%KILJB,%IFMP1,%OPGFX,%FDBUF
778 INFSU1: PUSH P,[-1] ; ENTRY USED BY GC-DUMP
781 MOVE A,GLOTOP+1 ; GET GLOTOP FOR LOCR HACKS
783 PUSHJ P,%FDBUF ; GET A BUFFER FOR C/W HACKS
787 HRRZ TYPNT,TYPVEC+1 ; SETUP TYPNT
790 ANDCMI A,1777 ; TO PAGE BOUNDRY
791 SUB A,GCSTOP ; SET UP AOBJN POINTER FOR C/W HACK
792 ASH A,-10. ; TO PAGES
794 MOVEI B,STOSTR ; GET START OF MAPPING
798 PUSHJ P,%SAVIN ; PROTECT THE CORE IMAGE
799 SKIPGE (P) ; IF < 0 GC-DUMP CALL
800 PUSHJ P,PROPUR ; PROTECT PURE PAGES
801 SUB P,[1,,1] ; CLEAN OFF PSTACK
802 PUSHJ P,%CLSJB ; CLOSE INFERIOR
804 MOVSI D,400000 ; CREATE MARK WORD
805 SETZB LPVP,ABOTN ; ZERO ATOM COUNTER
806 MOVEI A,2000 ; MARKED INF STARTS AT PAGE ONE
813 PUSHJ P,%GCJB1 ; CREATE THE JOB
815 MOVEI A,LPUR ; SAVE THE PURE CORE IMAGE
816 ANDCMI A,1777 ; TO PAGE BOUNDRY
818 ASH 0,-10. ; TO PAGES
819 SUB A,HITOP ; SUBTRACT TOP OF CORE
824 PUSHJ P,%IMSV1 ; MAP OUT INTERPRETER
827 ; CREATE A PDL TO USE FOR THESE DUMPING FUNCTIONS
829 MOVE A,[-2000,,MRKPDL]
832 ; ROUTINE TO CLOSE GC's INFERIOR
835 INFCLS: MOVE A,INF2 ; GET POINTER TO PURE MAPPED OUT
839 ; CLOSE INFERIOR PROTECTING CORE IMAGE FOR GCDUMP
841 INFCL2: PUSHJ P,%IFMP1 ; OPEN AGD INF TO RESTORE PAGES
842 INFCL3: MOVE A,INF1 ; RESTORE OPENING POINTER
844 MOVE B,A ; SATIFY MUDITS
845 PUSHJ P,%IFMP2 ; MAP IN GC PAGES AND CLOSE INFERIOR
846 POP P,INF2 ; RESTOR INF2 PARAMETER
849 INFCL1: PUSHJ P,%IFMP1 ; OPEN AGD INF TO RESTORE PAGES
850 SKIPGE PURMNG ; SKIP IF NO PURE PAGES WERE MUNGED
851 PUSHJ P,REPURE ; REPURIFY MUNGED PAGES
856 ; ROUTINE TO DO TYPE HACKING FOR GC-DUMP. IT MARKS THE TYPE-WORD OF THE
857 ; SLOT IN THE TYPE VECTOR. IT ALSO MARKS THE ATOM REPLACING THE I.D. IN
858 ; THE RIGHT HALF OF THE ATOM SLOT. IF THE TYPE IS A TEMPLATE THE FIRST
859 ; USE OF THE SAT HAS ITS ATOM MARKED AND THE I.D. IS PLACED IN THE LEFT
860 ; HALF OF THE ATOM SLOT (IT GETS THE REAL PRIMTYPE).
862 TYPHK: CAILE B,NUMPRI ; SKIP IF A MUDDLE TYPE
863 JRST TYPHKR ; ITS A NEWTYPE SO GO TO TYPHACKER
864 CAIN B,TTYPEC ; SKIP IF NOT TYPE-C
865 JRST TYPCHK ; GO TO HACK TYPE-C
866 CAIE B,TTYPEW ; SKIP IF TYPE-W
870 JRST TYPHKA ; GO TO TYPE-HACKER
871 TYPCHK: PUSH P,B ; SAVE TYPE-WORD
875 ; GENERAL TYPE-HACKER FOR GC-DUMP
877 TYPHKR: PUSH P,B ; SAVE AC'S
880 LSH B,1 ; GET OFFSET TO SLOT IN TYPE VECTOR
881 MOVEI C,(TYPNT) ; GET TO SLOT
885 IORM D,(C) ; MARK THE SLOT
886 MOVEI B,TATOM ; NOW MARK THE ATOM SLOT
887 PUSHJ P,MARK1 ; MARK IT
888 HRRM A,1(C) ; SMASH IN ID
889 HRRZS 1(C) ; MAKE SURE THAT THATS ALL THATS THERE
891 ANDI B,SATMSK ; GET RID OF MAGIC BITS
892 HRRM B,(C) ; SMASH SAT BACK IN
893 CAIG B,NUMSAT ; SKIP IF TEMPLATE
895 MOVE A,TYPSAV ; GET POINTER TO TYPE VECTOR
896 ADDI A,NUMPRI*2 ; GET TO NEWTYPES SLOTS
898 HLLZS 0 ; MAKE SURE ONLY LEFT HALF
900 TYPHK1: HRRZ E,(A) ; GET SAT OF SLOT
901 CAMN E,B ; SKIP IF NOT EQUAL
905 TYPHK2: PUSH P,C ; SAVE POINTER TO ORIGINAL SLOT
907 MOVEI B,TATOM ; SET UP FOR MARK
908 MOVE A,1(C) ; ASSUME MARK DOESN'T HAVE TO TAKE PLACE
909 SKIPL (C) ; DON'T MARK IF ALREADY MARKED
912 HRLM A,1(C) ; SMASH IN PRIMTYPE OF TEMPLATE
913 EXTYP: POP P,C ; RESTORE AC'S
919 ; A ROUTINE TO DISTINGUISH BETWEEN A DEFERRED AND A LIST POINTER
921 GETYP A,(B) ; GET TYPE
922 PUSHJ P,SAT ; GET SAT
923 CAIG A,NUMSAT ; NOT DEFERRED IF TEMPLATE
925 AOS -1(P) ; SKIP IF NOT DEFFERED
930 ; DISPATCH TABLE FOR MARK PHASE ("SETZ'D" ENTRIES MUST BE DEFERRED)
936 DISTBS DUM2,GCRET,[[S2WORD,PAIRMK],[S2DEFR,DEFMK],[SNWORD,VECTMK],[STBASE,ERDP]
937 [STPSTK,ERDP],[SARGS,ERDP],[S2NWORD,VECTMK],[SPSTK,ERDP],[SSTORE,VECTMK]
938 [SFRAME,ERDP],[SBYTE,<SETZ BYTMK>],[SATOM,DATOMK],[SPVP,ERDP],[SGATOM,ERDP]
939 [SLOCID,ERDP],[SCHSTR,<SETZ BYTMK>],[SASOC,ERDP],[SLOCL,PAIRMK],[SABASE,ERDP]
940 [SLOCA,ERDP],[SLOCV,VECTMK],[SLOCU,VECTMK],[SLOCS,<SETZ BYTMK>],[SLOCN,ERDP]
941 [SLOCB,<SETZ BYTMK>],[SLOCR,LOCRDP],[SOFFS,OFFSMK]]
946 ; THIS SUBROUTINE IMPURIFIES A PURE ATOM TO ALLOW MODIFICATION OF SYSTEM SUBRS
951 HLRZ C,(A) ; GET LENGTH
952 TRZ C,400000 ; TURN OF 400000 BIT
953 SUBI A,-1(C) ; POINT TO START OF ATOM
954 MOVNI C,-2(C) ; MAKE IT LOOK LIKE AN ATOM POINTER
964 POP P,LPVP ; RESTORE A
969 FIXTM5: JUMPE LPVP,FIXTM4
970 MOVEI B,(LPVP) ; GET PTR TO ATOMS DOPE WORD
971 HRRZ LPVP,-1(B) ; SET UP LPVP FOR NEXT IN CHAIN
972 SKIPE -2(P) ; SEE IF PURE SCAN
976 FIXTM2: CAMG B,PARBOT ; SKIP IF NOT FROZEN
979 TRZ A,400000 ; GET RID OF MARK BIT
980 MOVE D,A ; GET A COPY OF LENGTH
983 PUSHJ P,CAFREE ; GET STORAGE
984 SKIPE GCDANG ; SEE IF WON
985 JRST LOSLP1 ; GO TO CAUSE GC
996 SUBI B,-1(D) ; POINT TO START OF ATOM
997 HRLZ C,B ; SET UP FOR BLT
999 ADDI A,-1(D) ; FIX UP TO POINT TO NEW DOPE WORD
1002 HLLOS (A) ; -1 IN RELOCATION FIELD SINCE ITS NOT GARBAGE
1003 ADDI B,-1(D) ; B POINTS TO SECOND D.W.
1004 HRRM A,(B) ; PUT IN RELOCATION
1005 MOVSI D,400000 ; UNMARK ATOM
1007 CAIL B,HIBOT ; SKIP IF IMPURE
1009 JRST FIXTM5 ; CONTINE FIXUP
1011 FIXTM4: POP P,LPVP ; FIX UP LPVP TO POINT TO NEW CHAIN
1014 FIXTM1: HRRM B,(B) ; SMASH IN RELOCATION
1016 ANDCAM D,(B) ; CLEAR MARK BIT
1021 MOVEM B,(P) ; FIX UP CHAIN
1028 ;SET FLAG FOR INTERRUPT HANDLER
1029 SETZB M,RCL ; CLEAR OUT RECYCLE LIST CELLS, AND RSUBR BASE PNTR
1030 EXCH P,GCPDL ; IN CASE CURRENT PDL LOSES
1035 ; HERE TO CLEAN UP ANY POSSIBLE PURENESS IN GC SPACE BEFORE COLLECTING
1040 ADD A,GCSTOP ; ADJUSTMENT TO KEEP FREE REAL
1043 MOVE A,NOWP ; ADJUSTMENTS FOR STACKS
1050 MOVEI B,[ASCIZ /GIN /]
1051 SKIPE GCMONF ; MONITORING
1053 NOMON1: HRRZ C,(P) ; GET CAUSE OF GC INDICATOR
1054 MOVE B,GCNO(C) ; ADD 1 TO COUNT OF GC'S CAUSED BY GIVEN REASON
1057 MOVEM C,GCCAUS ; SAVE CAUSE OF GC
1058 SKIPN GCMONF ; MONITORING
1060 MOVE B,MSGGCT(C) ; GET CAUSE MESSAGE
1062 NOMON2: HLRZ C,(P) ; FIND OUT WHO CAUSED THE GC
1063 MOVEM C,GCCALL ; SAVE CALLER OF GC
1064 SKIPN GCMONF ; MONITORING
1068 NOMON3: SUB P,[1,,1] ; POP OFF C
1074 HLLZS SQUPNT ; FLUSH SQUOZE TABLE
1075 SETZB M,RCL ; ALTERNATE GC-ENTRY POINT FOR INITIALIZATION
1081 IRP AC,,[0,A,B,C,D,E,P,R,M,SP,TP,TB,AB,TVP,FRM]
1082 MOVEM AC,AC!STO"+1(PVP)
1086 MOVEM 0,PVPSTO+1(PVP)
1090 JSP E,CKPUR ; CHECK FOR PURE RSUBR
1093 ;SET UP E TO POINT TO TYPE VECTOR
1100 CHPDL: MOVE D,P ; SAVE FOR LATER
1101 CORGET: MOVE P,[-2000,,MRKPDL]
1103 ;FENCE POST PDLS AND CHECK IF ANY SHOULD BE SHRUNK
1105 MOVEI A,(TB) ;POINT TO CURRENT FRAME IN PROCESS
1106 PUSHJ P,FRMUNG ;AND MUNG IT
1107 MOVE A,TP ;THEN TEMPORARY PDL
1110 MOVE A,PSTO+1(PVP) ;AND UNMARKED P STACK
1113 \f; FIRST CREATE INFERIOR TO HOLD NEW PAGES
1115 INFCRT: MOVE A,PARBOT ; GENERATE NEW PARBOT AND PARNEW
1118 ANDCMI A,1777 ; EVEN PAGE BOUNDARY
1119 HRRM A,BOTNEW ; INTO POINTER WORD
1124 HRRZ A,BOTNEW ; GET PAGE TO START INF AT
1125 ASH A,-10. ; TO PAGES
1126 MOVEI R,(A) ; COPY A
1127 PUSHJ P,%GCJOB ; GET PAGE HOLDER
1128 MOVSI FPTR,-2000 ; FIX UP FRONTIER POINTER
1130 ADDI A,2000 ; FIND WNDTOP
1133 ;MARK PHASE: MARK ALL LISTS AND VECTORS
1134 ;POINTED TO WITH ONE BIT IN SIGN BIT
1135 ;START AT TRANSFER VECTOR
1136 NOMAP: MOVE A,GLOBSP+1 ; GET GLOBSP TO SAVE
1138 MOVE A,ASOVEC+1 ; ALSO SAVE FOR USE BY GC
1140 MOVE A,NODES+1 ; SAVE FOR ASSOCIATION UPDATE AND MOVEMENT PHASE
1142 MOVE A,GLOTOP+1 ; GET GLOTOP FOR LOCR HACKS
1144 MOVE A,PURVEC+1 ; SAVE PURE VECTOR FOR GETPAG
1149 SETZ LPVP, ;CLEAR NUMBER OF PAIRS
1150 MOVE 0,NGCS ; SEE IF NEED HAIR
1152 MOVEM 0,GCHAIR ; RESUME COUNTING
1153 MOVSI D,400000 ;SIGN BIT FOR MARKING
1154 MOVE A,ASOVEC+1 ;MARK ASSOC. VECTOR NOW
1155 PUSHJ P,PRMRK ; PRE-MARK
1162 MOVE A,IMQUOTE THIS-PROCESS
1168 ; HAIR TO DO AUTO CHANNEL CLOSE
1170 MOVEI 0,N.CHNS-1 ; NUMBER OF CHANNELS
1171 MOVEI A,CHNL1 ; 1ST SLOT
1173 SKIPE 1(A) ; NOW A CHANNEL?
1174 SETZM (A) ; DON'T MARK AS CHANNELS
1180 MOVE A,PVSTOR+1 ; MARK MAIN PROCES EVEN IF SWAPPED OUT
1184 MOVE A,MAINPR ; MARK MAIN PROCES EVEN IF SWAPPED OUT
1186 MOVEM A,MAINPR ; ADJUST PTR
1188 ; ASSOCIATION AND VALUE FLUSHING PHASE
1190 SKIPN GCHAIR ; ONLY IF HAIR
1194 PUSHJ P,ATCLEA ; CLEAN UP ATOM TABLE
1196 SKIPE GCHAIR ; IF NOT HAIR, DO CHANNELS NOW
1199 PUSHJ P,ASSOUP ; UPDATE AND MOVE ASSOCIATIONS
1200 PUSHJ P,CHFIX ; SEND OUT CHANNELS AND MARK LOSERS
1201 PUSHJ P,STOGC ; FIX UP FROZEN WORLD
1202 MOVE P,GCPDL ; SWITCH PDLS IN CASE THIS ONE DISSAPPEARS
1205 MOVE A,NPARBO ; UPDATE GCSBOT
1209 MOVEM A,PURVEC+1 ; RESTORE PURVEC
1210 PUSHJ P,CORADJ ; ADJUST CORE SIZE
1215 \f; MAP NEW PAIR SPACE IN FOR PAIR SPACE UPDATE
1217 NOMAP1: MOVEI A,@BOTNEW
1218 ADDI A,1777 ; TO PAGE BOUNDRY
1221 DOMAP: ASH B,-10. ; TO PAGES
1223 MOVEI C,(A) ; COMPUTE HIS TOP
1226 SUBM A,B ; B==> - # OF PAGES
1227 HRLI A,(B) ; AOBJN TO SOURCE AND DEST
1228 MOVE B,A ; IN CASE OF FUNNY
1229 HRRI B,(C) ; MAP HIS POSSIBLE HIGHER OR LOWER PAGES
1230 PUSHJ P,%INFMP ; NOW FLUSH INF AND MAKE HIS CORE MINE
1233 \f; CORE ADJUSTMENT PHASE
1235 CORADJ: MOVE A,PURTOP
1236 SUB A,CURPLN ; ADJUST FOR RSUBR
1237 ANDCMI A,1777 ; ROUND DOWN
1239 MOVEI A,@BOTNEW ; NEW GCSTOP
1240 ADDI A,1777 ; GCPDL AND ROUND
1241 ANDCMI A,1777 ; TO PAGE BOUNDRY
1242 MOVEM A,CORTOP ; TAKE CARE OF POSSIBLE LATER LOSSAGE
1243 CAMLE A,RPTOP ; SEE IF WE CAN MAP THE WORLD BACK IN
1244 FATAL AGC--UNABLE TO MAP GC-SPACE INTO CORE
1245 CAMG A,PURBOT ; SEE IF WE HAVE TO PUNT SOME PURE TO DO IT
1246 JRST CORAD0 ; DON'T HAVE TO PUNT SOME PURE
1247 PUSHJ P,MAPOUT ; GET THE CORE
1248 FATAL AGC--PAGES NOT AVAILABLE
1250 ; NOW THAT WE ARE ABLE TO MAP TO GCS INTO CORE WE WILL TRY TO HONOR SOME REQUESTS
1251 ; FIRST LETS SEE IF WE HAVE TO CORE DOWN.
1252 ; GCDOWN IS DEFINED AS AMOUNT FROM FRETOP TO PURBOT NEEDED
1254 CORAD0: SKIPN B,GCDOWN ; CORE DOWN?
1255 JRST CORAD1 ; NO, LETS GET CORE REQUIREMENTS
1256 ADDI A,(B) ; AMOUNT+ONE FREE BLOCK
1257 CAMGE A,RPTOP ; CAN WE WIN
1258 JRST CORAD3 ; POSSIBLY
1260 ; THIS IS A EXIT FOR LOSSAGE WITHOUT A FATAL ERROR
1261 CORAD2: SETOM GCDANG ; INDICATE LOSSAGE
1263 ; CALCULATE PARAMETERS BEFORE LEAVING
1264 CORAD6: MOVE A,PURSVT ; GET PURE TABLE
1265 PUSHJ P,SPCOUT ; OUT IT GOES IN CASE IT WAS CHANGED
1266 MOVEI A,@BOTNEW ; GCSTOP
1268 MOVE A,CORTOP ; ADJUST CORE IMAGE
1269 ASH A,-10. ; TO PAGES
1270 TRYPCO: PUSHJ P,P.CORE
1271 FATAL AGC--CORE SCREW UP
1272 MOVE A,CORTOP ; GET IT BACK
1278 ; TRIES TO SATISFY REQUEST FOR CORE
1279 CORAD1: MOVEM A,CORTOP
1281 ADD A,GETNUM ; ADD MINIMUM CORE NEEDED
1282 ADDI A,1777 ; ONE BLOCK+ROUND
1283 ANDCMI A,1777 ; TO BLOCK BOUNDRY
1284 CAMLE A,RPTOP ; CAN WE WIN
1287 JRST CORAD7 ; DON'T HAVE TO MAP OUT PURE
1291 ; NOW TRY TO GET SLOP SPACE. NOT NECESSARY BUT NICE
1292 CORAD7: MOVEM A,CORTOP ; STORE POSSIBLE VALUE
1293 MOVE B,RPTOP ; GET REAL PURTOP
1294 SUB B,PURMIN ; KEEP PURMIN
1295 CAMG B,CORTOP ; SEE IF CORTOP IS ALREADY HIGH
1296 MOVE B,CORTOP ; DONT GIVE BACK WHAT WE GOT
1297 MOVEM B,RPTOP ; FOOL CORE HACKING
1299 ANDCMI A,1777 ; TO PAGE BOUNDRY
1300 CAMGE A,RPTOP ; DO WE WIN TOTALLY
1302 MOVE A,RPTOP ; GET AS MUCH CORE AS POSSIBLE
1304 JRST CORAD6 ; LOSE, BUT YOU CAN'T HAVE EVERYTHING
1305 CORAD4: CAMG A,PURBOT ; DO WE HAVE TO PUNT SOME PURE
1307 PUSHJ P,MAPOUT ; GET IT
1309 CORAD8: MOVEM A,CORTOP ; ADJUST PARAMETER
1310 JRST CORAD6 ; WIN TOTALLY
1312 ; WE CAN CORE DOWN NOW TO SEE IF WE CAN GET SOME SLOP SPACE
1314 CORAD3: ADD A,FREMIN
1316 CAMGE A,PURBOT ; CAN WE WIN
1319 CORAD9: SUB A,GCDOWN ; SATISFY GCDOWN REQUEST
1320 JRST CORAD4 ; GO CHECK ALLOCATION
1322 MAPOUT: PUSH P,A ; SAVE A
1323 SUB A,P.TOP ; AMOUNT TO GET
1325 ANDCMI A,1777 ; TO PAGE BOUNDRY
1326 ASH A,-PGSZ ; TO PAGES
1327 PUSHJ P,GETPAG ; GET THEN
1328 JRST MAPLOS ; LOSSAGE
1329 AOS -1(P) ; INDICATE WINNAGE
1334 \f;GARBAGE ZEROING PHASE
1335 GARZER: MOVE A,GCSTOP ;FIRST WORD OF GARBAGE IS AFTER PAIR SPACE
1336 MOVE B,FRETOP ;LAST ADDRESS OF GARBAGE + 1
1339 CLEARM (A) ;ZERO THE FIRST WORD
1340 CAIL A,-1(B) ; ARE WE AT THE TOP OF THE WORLD (FORMERLY CAML A,FRETOP)
1341 JRST GARZR1 ; DON'T BLT
1347 ADDI A,1 ;MAKE A A BLT POINTER
1348 BLT A,-1(B) ;AND COPY ZEROES INTO REST OF AREA
1351 ; MAP UNWANTED PAGES OUT ON TWENEX (AFTER ZEROING REST OF LAST PAGE)
1368 ; NOW REHASH THE ASSOCIATIONS BASED ON VALUES
1369 GARZR1: PUSHJ P,REHASH
1373 TRYCOX: SKIPN GCMONF
1375 MOVEI B,[ASCIZ /GOUT /]
1377 NOMONO: MOVE PVP,PVSTOR+1
1378 IRP AC,,[0,A,B,C,D,E,P,R,M,SP,TP,TB,AB,TVP,FRM]
1379 MOVE AC,AC!STO+1(PVP)
1383 MOVE PVP,PVPSTO+1(PVP)
1385 ; CLOSING ROUTINE FOR G-C
1386 PUSH P,A ; SAVE AC'C
1391 MOVE A,FRETOP ; ADJUST BLOAT-STAT PARAMETERS
1394 PUSHJ P,GCSET ; FIX UP BLOAT-STAT PARAMETERS
1401 FSBR B,GCTIM ; GET TIME ELAPSED
1402 MOVEM B,GCTIM ; SAVE ELAPSED TIME FOR INT-HANDLER
1403 SKIPN GCMONF ; SEE IF MONITORING
1405 PUSHJ P,FIXSEN ; OUTPUT TIME
1406 MOVEI A,15 ; OUTPUT C/R LINE-FEED
1410 GCCONT: MOVE C,[NTPGOO,,NTPMAX] ; MAY FIX UP TP PARAMS TO ENCOURAGE
1411 ; SHRINKAGE FOR EXTRA ROOM
1413 MOVE C,[ETPGOO,,ETPMAX]
1416 POP P,D ; RESTORE AC'C
1421 JUMPE A,AGCWIN ; IF ZERO THE GC WORKED
1422 SKIPN GCHAIR ; SEE IF HAIRY GC
1424 REAGCX: MOVEI A,1 ; PREPARE FOR A HAIRY GC
1427 MOVE C,[11,,10.] ; REASON FOR GC
1432 FATAL AGC--NO CORE AVAILABLE TO SATISFY REQUESTS
1435 AGCWIN: SETZM PARNEW ;CLEAR FOR NEXT AGC CALL
1436 SETZM GETNUM ;ALSO CLEAR THIS
1440 SETZM PGROW ; CLEAR GROWTH
1442 SETOM GCHAPN ; INDICATE A GC HAS HAPPENED
1444 SETOM INTFLG ; AND REQUEST AN INTERRUPT
1448 JUMPN M,FINAGC ; IF M 0, RUNNING RSUBR SWAPPED OUT
1449 SKIPE PLODR ; LOADING ONE, M = 0 IS OK
1452 FATAL AGC--RUNNING RSUBR WENT AWAY
1454 AGCE1: FATAL AGC--TYPE VECTOR NOT OF TYPE VECTOR
1456 \f; CONVERSION FROM FLOAT TO DECIMAL. X 100 AND SEND OUT WITH APPROPRIATELY PLACED DECIMAL
1459 FIXSEN: PUSH P,B ; SAVE TIME
1460 MOVEI B,[ASCIZ /TIME= /]
1461 PUSHJ P,MSGTYP ; PRINT OUT MESSAGE
1463 FMPRI B,(100.0) ; CONVERT TO FIX
1467 MOVEI A,1 ; INITIALIZE COUNT OF CHARACTERS FOR PUTTING OUT TIME
1469 IDIVI C,10. ; START COUNTING
1473 CAIN A,1 ; SEE IF THERE IS ONLY ONE CHARACTER
1475 FIXOUT: IDIVI C,10. ; RECOVER NUMBER
1480 CAIN A,2 ; DECIMAL POINT HERE?
1482 FIX1: HLRZ A,(P)-1 ; GET NUMBER
1483 ADDI A,60 ; MAKE IT A CHARACTER
1484 PUSHJ P,IMTYO ; OUT IT GOES
1488 DOT1: MOVEI A,". ; OUTPUT DECIMAL POINT AND PADDING 0
1492 JRST FIXOUT ; CONTINUE
1493 DOT2: MOVEI A,". ; OUTPUT DECIMAL POINT
1498 \f; SUBROUTINE TO CHECK SIZE OF PDLS AND DO FENCEPOSTING
1500 PDLCHK: JUMPGE A,CPOPJ
1501 HLRE B,A ;GET NEGATIVE COUNT
1502 MOVE C,A ;SAVE A COPY OF PDL POINTER
1503 SUBI A,-1(B) ;LOCATE DOPE WORD PAIR
1504 HRRZS A ; ISOLATE POINTER
1505 CAME A,TPGROW ;GROWING?
1506 ADDI A,PDLBUF ;NO, POINT TO REAL DOPE WORD
1510 SETOM 1(C) ; START FENECE POST
1513 MOVSI D,1(C) ;YES, SET UP TO BLT FENCE POSTS
1515 BLT D,-2(A) ;FENCE POST ALL EXCEPT DOPE WORDS
1518 NOFENC: CAMG B,TPMAX ;NOW CHECK SIZE
1520 JRST MUNGTP ;TOO BIG OR TOO SMALL
1523 MUNGTP: SUB B,TPGOOD ;FIND DELTA TP
1524 MUNG3: MOVE C,-1(A) ;IS GROWTH ALREADY SPECIFIED
1525 TRNE C,777000 ;SKIP IF NOT
1526 POPJ P, ;ASSUME GROWTH GIVEN WILL WIN
1528 ASH B,-6 ;CONVERT TO NUMBER OF BLOCKS
1530 CAILE B,377 ; SKIP IF BELOW MAX
1531 MOVEI B,377 ; ELSE USE MAX
1532 TRO B,400 ;TURN ON SHRINK BIT
1536 MUNGT2: DPB B,[111100,,-1(A)] ;STORE IN DOPE WORD
1539 ; CHECK UNMARKED STACK (NO NEED TO FENCE POST)
1541 PDLCHP: HLRE B,A ;-LENGTH TO B
1543 SUBI A,-1(B) ;POINT TO DOPE WORD
1544 HRRZS A ;ISOLATE POINTER
1545 CAME A,PGROW ;GROWING?
1546 ADDI A,PDLBUF ;NO, POINT TO REAL DOPE WORD
1550 SETOM 1(C) ; START FENECE POST
1557 NOPF: CAMG B,PMAX ;TOO BIG?
1558 CAMG B,PMIN ;OR TOO LITTLE
1559 JRST .+2 ;YES, MUNG IT
1565 ; ROUTINE TO PRE MARK SPECIAL HACKS
1567 PRMRK: SKIPE GCHAIR ; FLUSH IF NO HAIR
1570 SUBI A,(B) ;POINT TO DOPE WORD
1571 HLRZ F,1(A) ; GET LNTH
1572 LDB 0,[111100,,(A)] ; GET GROWTHS
1573 TRZE 0,400 ; SIGN HACK
1583 HRRM 0,1(A) ; NEW RELOCATION FIELD
1584 IORM D,1(A) ;AND MARK
1588 \f;GENERAL MARK SUBROUTINE. CALLED TO MARK ALL THINGS
1589 ; A/ GOODIE TO MARK FROM
1590 ; B/ TYPE OF A (IN RH)
1591 ; C/ TYPE,DATUM PAIR POINTER
1594 MARK2: HLRZ B,(C) ;GET TYPE
1595 MARK1: MOVE A,1(C) ;GET GOODIE
1597 JUMPE A,CPOPJ ; NEVER MARK 0
1602 HRLM C,-1(P) ;AND POINTER TO IT
1603 ANDI B,TYPMSK ; FLUSH MONITORS
1604 SKIPE DUMFLG ; SKIP IF NOT IN DUMPER
1605 PUSHJ P,TYPHK ; HACK SOME TYPES
1606 LSH B,1 ;TIMES 2 TO GET SAT
1607 HRRZ B,@TYPNT ;GET SAT
1610 CAILE B,NUMSAT ; SKIP IF TEMPLATE DATA
1614 JRST @MKTBS(B) ;AND GO MARK
1615 JRST @GCDISP(B) ; DISPATCH FOR DUMPERS
1623 ; HERE TO MARK A POSSIBLE DEFER POINTER
1625 DEFQMK: GETYP B,(A) ; GET ITS TYPE
1628 ANDI B,SATMSK ; AND TO SAT
1631 ;HERE TO MARK THAT WHICH IS POINTED TO BY A DEFERRED POINTER
1633 DEFMK: TLOA TYPNT,400000 ;USE SIGN BIT AS FLAG
1635 ;HERE TO MARK LIST ELEMENTS
1637 PAIRMK: TLZ TYPNT,400000 ;TURN OF DEFER BIT
1638 PUSH P,[0] ; WILL HOLD BACK PNTR
1639 MOVEI C,(A) ; POINT TO LIST
1640 PAIRM1: CAMGE C,PARTOP ;CHECK FOR BEING IN BOUNDS
1642 FATAL AGC--MARKED PAIR OUTSIDE PAIR SPACE
1643 SKIPGE B,(C) ;SKIP IF NOT MARKED
1644 JRST RETNEW ;ALREADY MARKED, RETURN
1646 SKIPL FPTR ; SEE IF IN FRONTEIR
1647 PUSHJ P,MOVFNT ; EXPAND THE FRONTEIR
1649 MOVE 0,1(C) ; AND 2D
1650 AOBJN FPTR,.+2 ; AOS AND CHECK FRONTEIR
1651 PUSHJ P,MOVFNT ; EXPAND FRONTEIR
1653 ADD FPTR,[1,,1] ; MOVE ALONG IN FRONTIER
1656 PAIRM2: MOVEI A,@BOTNEW ; GET INF ADDR
1658 HRRM A,(C) ; LEAVE A POINTER TO NEW HOME
1659 HRRZ E,(P) ; GET BACK POINTER
1660 JUMPE E,PAIRM7 ; 1ST ONE, NEW FIXUP
1661 MOVSI 0,(HRRM) ; INS FOR CLOBBER
1662 PUSHJ P,SMINF ; SMASH INF'S CORE IMAGE
1663 PAIRM4: MOVEM A,(P) ; NEW BACK POINTER
1664 JUMPL TYPNT,DEFDO ;GO HANDLE DEFERRED POINTER
1665 HRLM B,(P) ; SAVE OLD CDR
1666 PUSHJ P,MARK2 ;MARK THIS DATUM
1667 HRRZ E,(P) ; SMASH CAR IN CASE CHANGED
1671 HLRZ C,(P) ;GET CDR OF LIST
1672 CAIGE C,@PURBOT ; SKIP IF PURE (I.E. DONT MARK)
1673 JUMPN C,PAIRM1 ;IF NOT NIL, MARK IT
1674 GCRETP: SUB P,[1,,1]
1676 GCRET: TLZ TYPNT,400000 ;FOR PAIRMKS BENEFIT
1677 HLRZ C,-1(P) ;RESTORE C
1679 POPJ P, ;AND RETURN TO CALLER
1681 GCRETD: ANDI B,TYPMSK ; TURN OFF MONITORS
1682 CAIN B,TLOCR ; SEE IF A LOCR
1684 SKIPN GCDFLG ; SKIP IF IN PURIFIER OR DUMPER
1686 CAIE B,TATOM ; WE MARK PURE ATOMS
1687 CAIN B,TCHSTR ; AND STRINGS
1691 ;HERE TO MARK DEFERRED POINTER
1693 DEFDO: PUSH P,B ; PUSH OLD PAIR ON STACK
1695 MOVEI C,-1(P) ; USE AS NEW DATUM
1696 PUSHJ P,MARK2 ;MARK THE DATUM
1697 HRRZ E,-2(P) ; GET POINTER IN INF CORE
1700 PUSHJ P,SMINF ; AND CLOBBER
1703 MOVSI 0,(HRRM) ; SMASH IN RIGHT HALF
1706 JRST GCRET ;AND RETURN
1709 PAIRM7: MOVEM A,-1(P) ; SAVE NEW VAL FOR RETURN
1712 RETNEW: HRRZ A,(C) ; POINT TO NEW WORLD LOCN
1713 HRRZ E,(P) ; BACK POINTER
1714 JUMPE E,RETNW1 ; NONE
1719 RETNW1: MOVEM A,-1(P)
1722 ; ROUTINE TO EXPAND THE FRONTEIR
1724 MOVFNT: PUSH P,B ; SAVE REG B
1725 HRRZ A,BOTNEW ; CURRENT BOTTOM OF WINDOW
1726 ADDI A,2000 ; MOVE IT UP
1728 HRRZM A,FNTBOT ; BOTTOM OF FRONTEIR
1730 ASH A,-10. ; TO PAGES
1732 PUSHJ P,%SHWND ; SHARE THE PAGE
1733 MOVSI FPTR,-2000 ; FIX UP FPTR
1738 ; ROUTINE TO SMASH INFERIORS PPAGES
1739 ; E/ ADDR IN INF, A/ THING TO SMASH ,0/ INS TO USE
1741 SMINF: CAMGE E,FNTBOT
1742 JRST SMINF1 ; NOT IN FRONTEIR
1743 SUB E,FNTBOT ; ADJUST POINTER
1744 IOR 0,[0 A,FRONT(E)] ; BUILD INSTRUCTION
1747 SMINF1: CAML E,WNDBOT
1748 CAML E,WNDTOP ; SEE IF IN WINDOW
1750 SMINF3: SUB E,WNDBOT ; FIX UP
1751 IOR 0,[0 A,WIND(E)] ; FIX INS
1754 SMINF2: PUSH P,A ; SAVE E
1756 HRRZ A,E ; E SOMETIMES HAS STUFF IN LH
1758 MOVEI B,WNDP ; WINDOW PAGE
1759 PUSHJ P,%SHWND ; SHARE IT
1760 ASH A,10. ; TO PAGES
1761 MOVEM A,WNDBOT ; UPDATE POINTERS
1764 POP P,B ; RESTORE ACS
1766 JRST SMINF3 ; FIX UP INF
1770 \f; VECTOR AND TP MARKER, SIGN OF TYPNT IS SET BASED ON WHICH ONE
1772 TPMK: TLOA TYPNT,400000 ;SET TP MARK FLAG
1773 VECTMK: TLZ TYPNT,400000
1774 MOVEI 0,@BOTNEW ; POINTER TO INF
1776 MOVEI E,(A) ;SAVE A POINTER TO THE VECTOR
1778 SUB A,B ;LOCATE DOPE WORD
1779 MOVEI A,1(A) ;ZERO LH AND POINT TO 2ND DOPE WORD
1780 CAIL A,STOSTR ; CHECK IN VECTOR SPACE
1782 JRST VECTB1 ;LOSE, COMPLAIN
1784 HLLM TYPNT,(P) ; SAVE MARKER INDICATING STACK
1785 JUMPGE TYPNT,NOBUFR ;IF A VECTOR, NO BUFFER CHECK
1786 CAME A,PGROW ;IS THIS THE BLOWN P
1787 CAMN A,TPGROW ;IS THIS THE GROWING PDL
1788 JRST NOBUFR ;YES, DONT ADD BUFFER
1789 ADDI A,PDLBUF ;POINT TO REAL DOPE WORD
1790 MOVSI 0,-PDLBUF ;ALSO FIX UP POINTER
1792 MOVEM 0,-1(P) ; FIXUP RET'D PNTR
1794 NOBUFR: HLRE B,(A) ;GET LENGTH FROM DOPE WORD
1795 JUMPL B,EXVECT ; MARKED, LEAVE
1796 LDB B,[111100,,-1(A)] ; GET TOP GROWTH
1797 TRZE B,400 ; HACK SIGN BIT
1799 ASH B,6 ; CONVERT TO WORDS
1800 PUSH P,B ; SAVE TOP GROWTH
1801 LDB 0,[001100,,-1(A)] ;GET GROWTH FACTOR
1802 TRZE 0,400 ;KILL SIGN BIT AND SKIP IF +
1804 ASH 0,6 ;CONVERT TO NUMBER OF WORDS
1805 PUSH P,0 ; SAVE BOTTOM GROWTH
1806 ADD B,0 ;TOTAL GROWTH TO B
1807 VECOK: HLRE E,(A) ;GET LENGTH AND MARKING
1808 MOVEI F,(E) ;SAVE A COPY
1810 SUBI E,2 ;- DOPE WORD LENGTH
1811 IORM D,(A) ;MAKE SURE NOW MARKED
1812 PUSHJ P,ALLOGC ; ALLOCATE SPACE FOR VECTOR IN THE INF
1814 VECOK1: JUMPLE E,MOVEC2 ; ZERO LENGTH, LEAVE
1815 PUSH P,A ; SAVE POINTER TO DOPE WORD
1816 SKIPGE B,-1(A) ;SKIP IF UNIFORM
1817 TLNE B,377777-.VECT. ;SKIP IF NOT SPECIAL
1818 JUMPGE TYPNT,NOTGEN ;JUMP IF NOT A GENERAL VECTOR
1820 GENRAL: HLRZ 0,B ;CHECK FOR PSTACK
1822 JUMPE 0,NOTGEN ;IT ISN'T GENERAL
1823 JUMPL TYPNT,TPMK1 ; JUMP IF TP
1825 SUBI C,1(E) ; C POINTS TO BEGINNING OF VECTOR
1827 \f; LOOP TO MARK ELEMENTS IN A GENERAL VECTOR
1828 VECTM2: HLRE B,(C) ;GET TYPE AND MARKING
1829 JUMPL B,UMOVEC ;RETURN, (EITHER DOPE WORD OR FENCE POST)
1830 MOVE A,1(C) ;DATUM TO A
1833 VECTM3: PUSHJ P,MARK ;MARK DATUM
1834 MOVEM A,1(C) ; IN CASE WAS FIXED
1839 MOVEC2: POP P,C ; RESTORE BOTTOM GROWTH
1840 HRRZ E,-1(P) ; GET POINTER INTO INF
1841 SKIPN C ; SKIP IF NO BOTTOM GROWTH
1843 JUMPL C,.+3 ; SEE IF BOTTOM SHRINKAGE
1845 JRST MOVEC3 ; CONTINUE
1846 HRLM C,E ; MOVE SHRINKAGE FOR TRANSFER PHASE
1847 MOVEC3: PUSHJ P,DOPMOD ; MODIFY DOPE WORD AND PLACE IN INF
1848 PUSHJ P,TRBLKV ; SEND VECTOR INTO INF
1849 TGROT: CAMGE A,PARBOT ; SKIP IF NOT STORAGE
1851 MOVE C,DOPSV1 ; RESTORE DOPE WORD
1852 SKIPN (P) ; DON'T RESTORE D.W.'S YET IF THERE IS GROWTH
1854 TGROT1: POP P,C ; IS THERE TOP GROWH
1855 SKIPN C ; SEE IF ANY GROWTH
1864 SETZ C, ; ZERO WHERE OLD DOPE WORDS WERE
1867 ADDI E,-1(C) ; MAKE ADJUSTMENT FOR TOP GROWTH
1868 OUTDOP: PUSHJ P,DOPOUT
1871 SUB P,[1,,1] ; GET RID OF FPTR
1872 PUSHJ P,RELATE ; RELATIVIZE
1873 TRNN B,400000 ; WAS THIS A STACK
1875 MOVSI 0,PDLBUF ; FIX UP STACK PTR
1879 VECLOS: JUMPL C,CCRET ;JUMP IF CAN'T MUNG TYPE
1880 HLLZ 0,(C) ;GET TYPE
1881 MOVEI B,TILLEG ;GET ILLEGAL TYPE
1883 MOVEM 0,1(C) ;AND STORE OLD TYPE AS VALUE
1884 JRST UMOVEC ;RETURN WITHOUT MARKING VECTOR
1886 CCRET: CLEARM 1(C) ;CLOBBER THE DATUM
1890 ; ROUTINE TO MARK A TP. IT SCANS THE TP. IT MARKS ALL THE ITEMS AND IT MAPS AN
1891 ; UPDATED VERSION INTO THE INFERIOR WITHOUT CHANGING THE ORIGINAL.
1896 HRRZ E,-1(P) ; FIX UP PARAMS
1899 HRRZ B,(A) ; CALCULATE RELOCATION
1901 MOVE C,-1(P) ; ADJUST FOR GROWTH
1908 TPMK3: HLRZ E,(A) ; GET LENGTH
1909 TRZ E,400000 ; GET RID OF MARK BIT
1910 SUBI A,-1(E) ;POINT TO FIRST ELEMENT
1911 MOVEI C,(A) ;POINT TO FIRST ELEMENT WITH C
1912 TPMK4: HLRE B,(C) ;GET TYPE AND MARKING
1913 JUMPL B,TPMK7 ;RETURN, (EITHER DOPE WORD OR FENCE POST)
1914 HRRZ A,(C) ;DATUM TO A
1915 ANDI B,TYPMSK ; FLUSH MONITORS
1917 CAIN B,TENTRY ;IS THIS A STACK FRAME
1918 JRST MFRAME ;YES, MARK IT
1919 CAIE B,TUBIND ; BIND
1920 CAIN B,TBIND ;OR A BINDING BLOCK
1922 CAIE B,TBVL ; CHECK FOR OTHER BINDING HACKS
1924 SKIPA ; FIX UP SP-CHAIN
1925 CAIN B,TSKIP ; OTHER BINDING HACK
1929 TPMK5: PUSH P,(C) ; SAVE BECAUSE FRAMES MIGHT MUNG IT
1930 HRRM A,(C) ; FIX UP IN CASE OF SP CHAIN
1931 PUSHJ P,MARK1 ;MARK DATUM
1935 PUSHJ P,OUTTP ; MOVE OUT TYPE
1937 PUSHJ P,OUTTP ; SEND OUT VALUE
1938 MOVEM M,(C) ; RESTORE TO OLD VALUE
1942 MFRAME: HRRZ 0,1(C) ; SET UP RELITIVIZATION OF PTR TO PREVIOUS FRAME
1943 HRROI C,FRAMLN+FSAV-1(C) ;POINT TO FUNCTION
1944 HRRZ A,1(C) ; GET IT
1945 CAIL A,STOSTR ; CHECK IN VECTOR SPACE
1947 JRST MFRAM1 ; IGNORE, NOT IN VECTOR SPACE
1948 HRL A,(A) ; GET LENGTH
1950 PUSHJ P,MARK ; AND MARK IT
1952 PUSHJ P,OUTTP ; SEND IT OUT
1953 HRRZ A,OTBSAV-FSAV+1(C) ; POINT TO TB TO PREVIOUS FRAME
1955 ADD A,-2(P) ; RELOCATE IF NOT 0
1957 PUSHJ P,OUTTP ; SEND IT OUT
1958 MOVE A,-2(P) ; ADJUST AB SLOT
1959 ADD A,ABSAV-FSAV+1(C) ; POINT TO SAVED AB
1960 PUSHJ P,OUTTP ; SEND IT OUT
1961 MOVE A,-2(P) ; ADJUST SP SLOT
1962 ADD A,SPSAV-FSAV+1(C) ;POINT TO SAVED SP
1963 SUB A,-3(P) ; ADJUSTMENT OF LENGTH IF GROWTH
1964 PUSHJ P,OUTTP ; SEND IT OUT
1965 HRROI C,PSAV-FSAV(C) ;POINT TO SAVED P
1967 PUSHJ P,MARK1 ;AND MARK IT
1968 PUSHJ P,OUTTP ; SEND IT OUT
1969 HLRE 0,TPSAV-PSAV+1(C)
1970 MOVE A,TPSAV-PSAV+1(C)
1973 MOVE A,TPSAV-PSAV+1(C)
1974 CAME 0,TPGROW ; SEE IF BLOWN
1979 SUB A,-3(P) ; ADJUST
1981 MOVE A,PCSAV-PSAV+1(C)
1983 HRROI C,-PSAV+1(C) ; POINT PAST THE FRAME
1984 JRST TPMK4 ;AND DO MORE MARKING
1987 MBIND: PUSHJ P,FIXBND
1988 MOVEI B,TATOM ;FIRST MARK ATOM
1989 SKIPN GCHAIR ; IF NO HAIR, MARK ALL NOW
1990 SKIPE (P) ; PASSED MARKER, IF SO DONT SKIP
1991 JRST MBIND2 ; GO MARK
1992 MOVE A,1(C) ; RESTORE A
1994 JRST MBIND1 ; NOT IT, CONTINUE SKIPPING
1995 HRRM LPVP,2(C) ; SAVE IN RH OF TPVP,,0
1996 MOVE 0,-4(P) ; RECOVER PTR TO DOPE WORD
1997 HRLM 0,2(C) ; SAVE FOR MOVEMENT
1998 MOVEI B,TATOM ; MARK THE BINDING TO THIS PROCESS
1999 PUSHJ P,MARK1 ; MARK THE ATOM
2000 MOVEI LPVP,(C) ; POINT
2001 SETOM (P) ; INDICATE PASSAGE
2002 MBIND1: ADDI C,6 ; SKIP BINDING
2004 SKIPE -1(P) ; ONLY UPDATE IF SENDING OVER
2009 PUSHJ P,OUTTP ; FIX UP CHAIN
2010 MOVEI B,TATOM ; RESTORE IN CASE SMASHED
2011 PUSHJ P,MARK1 ; MARK ATOM
2012 PUSHJ P,OUTTP ; SEND IT OUT
2014 PUSH P,(C) ; SAVE BECAUSE FRAMES MIGHT MUNG IT
2015 PUSHJ P,MARK2 ;MARK DATUM
2019 PUSHJ P,OUTTP ; MOVE OUT TYPE
2021 PUSHJ P,OUTTP ; SEND OUT VALUE
2022 MOVEM M,(C) ; RESTORE TO OLD VALUE
2024 MOVEI B,TLIST ; POINT TO DECL SPECS
2026 PUSHJ P,MARK ; AND MARK IT
2027 HRR A,(C) ; LIST FIX UP
2029 SKIPL A,1(C) ; PREV LOC?
2031 MOVEI B,TLOCI ; NOW MARK LOCATIVE
2033 NOTLCI: PUSHJ P,OUTTP
2037 FIXBND: HRRZ A,(C) ; GET PTR TO CHAIN
2038 SKIPE A ; DO NOTHING IF EMPTY
2042 TPMK8: MOVNI A,1 ; FENCE-POST THE STACK
2044 ADDI C,1 ; INCREMENT C FOR FENCE-POST
2045 SUB P,[1,,1] ; CLEAN UP STACK
2046 POP P,E ; GET UPDATED PTR TO INF
2047 SUB P,[2,,2] ; POP OFF RELOCATION
2052 SUBI C,(A) ; GET # OF WORDS TRANSFERED
2053 SUB B,C ; GET # LEFT
2054 ADDI E,-2(B) ; ADJUST POINTER TO INF
2056 POP P,C ; IS THERE TOP GROWH
2057 ADD E,C ; MAKE ADJUSTMENT FOR TOP GROWTH
2059 PUSHJ P,DOPMOD ; FIX UP DOPE WORDS
2060 PUSHJ P,DOPOUT ; SEND THEM OUT
2064 \f; ROUTINE TO ALLOCATE ROOM FOR VECTORS IN INFERIOR
2065 ; F= # OF WORDS TO ALLOCATE
2067 ALLOGC: HRRZS A ; GET ABS VALUE
2068 SKIPN GCDFLG ; SKIP IF IN DUMPER
2069 CAML A,GCSBOT ; SKIP IF IN STORAGE
2070 JRST ALOGC2 ; JUMP IF ALLOCATING
2073 ALOGC2: PUSH P,A ; SAVE A
2074 ALOGC1: HLRE 0,FPTR ; GET ROOM LEFT
2075 ADD 0,F ; SEE IF ITS ENOUGH
2079 PUSHJ P,MOVFNT ; MOVE UP FRONTEIR
2081 JRST ALOGC1 ; CONTINUE
2082 ALOCOK: ADD FPTR,F ; MODIFY FPTR
2087 SUBI 0,1 ; RELOCATION PTR
2093 ; TRBLK MOVES A VECTOR INTO THE INFERIOR
2094 ; E= STARTING ADDR IN INF A= DOPE WORD OF VECTOR
2099 CAMGE A,GCSBOT ; SEE IF IN GC-SPACE
2103 TRZ 0,400000 ; TURN OFF GC FLAG
2105 HLRE A,E ; GET SHRINKAGE
2106 ADD 0,A ; MUNG LENGTH
2108 ADDI F,1 ; F POINTS TO START OF VECTOR
2109 TRBLK2: HRRZ R,E ; SAVE POINTER TO INFERIOR
2110 ADD E,0 ; E NOW POINTS TO FINAL ADDRESS+1
2114 CAMGE R,FNTBOT ; SEE IF IN FRONTEIR
2116 SUB E,FNTBOT ; ADJUST E
2117 SUB 0,FNTBOT ; ADJ START
2120 TRBL10: CAML R,WNDBOT
2121 CAML R,WNDTOP ; SEE IF IN WINDOW
2126 TRBLK4: ADDI 0,-1777(A) ; CALCULATE START IN WINDOW OR FRONTEIR
2129 ADDI E,-1777(A) ; SUBTRACT WINDBOT
2130 HRL 0,F ; SET UP FOR BLT
2135 MOVE E,M ; GET END OF WORD
2138 MOVEI B,1(A) ; GET TOP OF WORLD
2145 MOVE E,M ; RESTORE E
2146 JRST TRBLK1 ; CONTINUE
2147 TRBLK5: HRRZ A,R ; COPY E
2148 ASH A,-10. ; TO PAGES
2150 MOVEI B,WNDP ; IT IS WINDOW
2152 ASH A,10. ; TO PAGES
2153 MOVEM A,WNDBOT ; UPDATE POINTERS
2162 ; ALTERNATE ENTRY FOR VECTORS WHICH TAKES CARE OF SHRINKAGE
2165 SKIPE GCDFLG ; SKIP IF NOT IN DUMPER
2167 CAMGE A,GCSBOT ; SEE IF IN GC-SPACE
2169 TRBLV2: PUSH P,A ; SAVE A
2173 HLRE A,E ; GET SHRINKAGE
2174 ADD 0,A ; MUNG LENGTH
2176 ADDI F,1 ; F POINTS TO START OF VECTOR
2177 SKIPGE -2(P) ; SEE IF SHRINKAGE
2178 ADD 0,-2(P) ; IF SO COMPENSATE
2179 JRST TRBLK2 ; CONTINUE
2181 ; ALTERNATE ENTRY POINT TO TRBLK A==> OBJECT TO SEND IN 0= # OF WORDS
2183 TRBLK3: PUSH P,A ; SAVE A
2187 ; FINAL ALTERNATE ENTRY POINT TO TRBLK A==> OBJECT
2188 ; F==> START OF TRANSFER IN GCS 0= # OF WORDS
2190 TRBLKX: PUSH P,A ; SAVE A
2191 JRST TRBLK2 ; SEND IT OUT
2194 ; OUTTP IS THE ROUTINE THAT TPMK USES TO SEND OUT ELEMENTS FOR THE SCAN
2195 ; -2(P) CONTAINS THE ADDR IN THE INF AND IT IS UPDATED
2196 ; A CONTAINS THE WORD TO BE SENT OUT
2198 OUTTP: AOS E,-2(P) ; INCREMENT PLACE
2199 MOVSI 0,(MOVEM) ; INS FOR SMINF
2203 ; ADWD PLACES ONE WORD IN THE INF
2204 ; E ==> INF C IS THE WORD
2206 ADWD: PUSH P,E ; SAVE AC'S
2209 MOVSI 0,(MOVEM) ; INS FOR SMINF
2210 PUSHJ P,SMINF ; SMASH IT IN
2215 ; DOPOUT IS USED TO SEND OUT THE DOPE WORDS IN UNUSUAL CALSE
2216 ; SUCH AS THE TP AND GROWTH
2219 DOPOUT: MOVE C,-1(A)
2222 MOVE C,(A) ; GET SECOND DOPE WORD
2223 TLZ C,400000 ; TURN OFF POSSIBLE MARK BIT
2225 MOVE C,DOPSV1 ; FIX UP FIRST DOPE WORD
2228 MOVEM C,(A) ; RESTORE SECOND D.W.
2231 ; DOPMOD MODIFIES THE DOPE WORD OF A VECTOR AND PLACES A NEW DOPE-WORD IN INF
2232 ; A ==> DOPE WORD E==> INF
2234 DOPMOD: SKIPE GCDFLG ; CHECK TO SEE IF IN DUMPER AND PURIFY
2237 POPJ P, ; EXIT IF NOT IN GCS
2238 MOVE C,-1(A) ; GET FIRST DOPE WORD
2240 HLLZS C ; CLEAR OUT GROWTH
2241 TLO C,.VECT. ; FIX UP FOR GCHACK
2243 MOVE C,(A) ; GET SECOND DOPE WORD
2244 HLRZ B,(A) ; GET LENGTH
2245 TRZ B,400000 ; TURN OFF MARK BIT
2247 HRRZ 0,-1(A) ; CHECK FOR GROWTH
2249 LDB 0,[111100,,-1(A)] ; MODIFY WITH GROWTH
2254 LDB 0,[001100,,-1(A)]
2259 DOPMD1: HRL C,B ; FIX IT UP
2260 MOVEM C,(A) ; FIX IT UP
2264 ADPMOD: CAMG A,GCSBOT
2265 POPJ P, ; EXIT IF NOT IN GCS
2266 MOVE C,-1(A) ; GET FIRST DOPE WORD
2267 TLO C,.VECT. ; FIX UP FOR GCHACK
2269 MOVE C,(A) ; GET SECOND DOPE WORD
2270 TLZ C,400000 ; TURN OFF PARK BIT
2277 \f; RELATE RELATAVIZES A POINTER TO A VECTOR
2278 ; B IS THE POINTER A==> DOPE WORD
2280 RELATE: SKIPE GCDFLG ; SEE IF DUMPER OR PURIFIER
2282 CAMGE A,GCSBOT ; SEE IF IN VECTOR SPACE
2283 POPJ P, ; IF NOT EXIT
2285 HLRE F,C ; GET LENGTH
2286 HRRZ 0,-1(A) ; CHECK FO GROWTH
2288 LDB 0,[111100,,-1(A)] ; GET TOP GROWTH
2289 TRZE 0,400 ; HACK SIGN BIT
2291 ASH 0,6 ; CONVERT TO WORDS
2292 SUB F,0 ; ACCOUNT FOR GROWTH
2293 RELAT1: HRLM F,C ; PLACE CORRECTED LENGTH BACK IN POINTER
2294 HRRZ F,(A) ; GET RELOCATED ADDR
2295 SUBI F,(A) ; FIND RELATIVIZATION AMOUNT
2296 ADD C,F ; ADJUST POINTER
2297 SUB C,0 ; ACCOUNT FOR GROWTH
2303 \f; MARK TB POINTERS
2304 TBMK: HRRZS A ; CHECK FOR NIL POINTER
2306 JRST GCRET ; IF POINTING TO NIL THEN RETURN
2307 HLRE B,TPSAV(A) ; MAKE POINTER LOOK LIKE A TP POINTER
2308 HRRZ C,TPSAV(A) ; GET TO DOPE WORD
2309 TBMK2: SUB C,B ; POINT TO FIRST DOPE WORD
2310 HRRZ A,(P) ; GET PTR TO FRAME
2311 SUB A,C ; GET PTR TO FRAME
2321 ABMK: HLRE B,A ; FIX UP TO GET TO FRAME
2323 HLRE B,FRAMLN+TPSAV(A) ; FIX UP TO LOOK LIKE TP
2324 HRRZ C,FRAMLN+TPSAV(A)
2331 ARGMK: HRRZ A,1(C) ; GET POINTER
2332 HLRE B,1(C) ; AND LNTH
2333 SUB A,B ; POINT TO BASE
2334 CAIL A,STOSTR ; CHECK IN VECTOR SPACE
2337 HLRZ 0,(A) ; GET TYPE
2341 CAIE 0,TENTRY ; IS NEXT A WINNER?
2343 JRST ARGMK1 ; YES, GO ON TO WIN CODE
2345 ARGMK0: SETZB A,1(C) ; CLOBBER THE CELL
2346 SETZM (P) ; AND SAVED COPY
2349 ARGMK1: MOVE B,1(A) ; ASSUME TTB
2350 ADDI B,(A) ; POINT TO FRAME
2351 CAIE 0,TINFO ; IS IT?
2352 MOVEI B,FRAMLN(A) ; NO, USE OTHER GOODIE
2353 HLRZ 0,OTBSAV(B) ; GET TIME
2354 HRRZ A,(C) ; AND FROM POINTER
2355 CAIE 0,(A) ; SKIP IF WINNER
2357 MOVE A,TPSAV(B) ; GET A RELATAVIZED TP
2361 SUB A,1(C) ; AMOUNT TO RELATAVIZE ARGS
2364 HRRM B,(P) ; PUT RELATAVIZED PTR BACK
2368 ; MARK FRAME POINTERS
2370 FRMK: HLRZ B,A ; GET TIME FROM FRAME PTR
2371 HLRZ F,OTBSAV(A) ; GET TIME FROM FRAME
2372 CAME B,F ; SEE IF EQUAL
2374 SUBI C,1 ;PREPARE TO MARK PROCESS VECTOR
2375 HRRZ A,1(C) ;USE AS DATUM
2376 SUBI A,1 ;FUDGE FOR VECTMK
2377 MOVEI B,TPVP ;IT IS A VECTRO
2378 PUSHJ P,MARK ;MARK IT
2379 ADDI A,1 ; READJUST PTR
2380 HRRM A,1(C) ; FIX UP PROCESS SLOT
2381 MOVEI C,1(C) ; SET UP FOR TBMK
2383 JRST TBMK ; MARK LIKE TB
2388 BYTMK: PUSHJ P,BYTDOP ; GET DOPE WORD IN A
2389 HLRZ F,-1(A) ; GET THE TYPE
2390 ANDI F,SATMSK ; FLUSH MONITOR BITS
2391 CAIN F,SATOM ; SEE IF ATOM
2393 HLRE F,(A) ; GET MARKING
2394 JUMPL F,BYTREL ; JUMP IF MARKED
2395 HLRZ F,(A) ; GET LENGTH
2396 PUSHJ P,ALLOGC ; ALLOCATE FOR IT
2397 HRRM 0,(A) ; SMASH IT IN
2400 SUBI E,-1(F) ; ADJUST INF POINTER
2406 ADDM E,(P) ; RELATAVIZE
2409 ATMSET: PUSH P,A ; SAVE A
2410 HLRZ B,(A) ; GET LENGTH
2411 TRZ B,400000 ; GET RID OF MARK BIT
2412 MOVNI B,-2(B) ; GET LENGTH
2413 ADDI A,-1(B) ; CALCULATE POINTER
2415 MOVEI B,TATOM ; TYPE
2420 MOVSI E,STATM ; GET "STRING IS ATOM BIT"
2425 JRST BYTREL ; TO BYTREL
2432 PUSH P,A ; PUSH LIST POINTER ON THE STACK
2433 MOVEI C,-1(P) ; POINTER TO PAIR
2434 PUSHJ P,MARK2 ; MARK THE LIST
2435 HRLM A,-2(P) ; UPDATE POINTER IN OFFSET
2440 ; MARK ATOMS IN GVAL STACK
2442 GATOMK: HRRZ B,(C) ; POINT TO POSSIBLE GDECL
2446 MOVEI A,(B) ; POINT TO DECL FOR MARK
2450 HLRZ C,-1(P) ; RESTORE HOME POINTER
2451 HRRM A,(C) ; CLOBBER UPDATED LIST IN
2452 MOVE A,1(C) ; RESTORE ATOM POINTER
2458 PUSH P,0 ; SAVE POINTER TO INF
2459 TLO TYPNT,.ATOM. ; SAY ATOM WAS MARKED
2461 PUSHJ P,GETLNT ;GET LENGTH AND CHECK BOUNDS
2462 JRST ATMRL1 ; ALREADY MARKED
2463 PUSH P,A ; SAVE DOPE WORD PTR FOR LATER
2464 HLRZ C,(A) ; FIND REAL ATOM PNTR
2465 SUBI C,400001 ; KILL MARK BIT AND ADJUST
2467 SUBM A,C ; NOW TOP OF ATOM
2468 MRKOBL: MOVEI B,TOBLS
2469 HRRZ A,2(C) ; IF > 0, NOT OBL
2473 PUSHJ P,MARK ; AND MARK IT
2481 NOMKNX: HLRZ B,(C) ; SEE IF UNBOUND
2482 TRZ B,400000 ; TURN OFF MARK BIT
2485 JRST ATOMK1 ; IT IS UNBOUND
2486 HRRZ 0,(C) ; SEE IF VECTOR OR TP POINTER
2487 MOVEI B,TVEC ; ASSUME VECTOR
2489 MOVEI B,TTP ; ITS A LOCAL VALUE
2490 PUSHJ P,MARK1 ; MARK IT
2491 MOVEM A,1(C) ; SMASH INTO SLOT
2492 ATOMK1: HRRZ 0,2(C) ; MAKE SURE ATOMS NOT ON OBLISTS GET SENT
2494 POP P,E ; GET POINTER INTO INF
2499 ATMREL: HRRZ E,(A) ; RELATAVIZE
2503 ATMRL1: SUB P,[1,,1] ; POP OFF STACK
2507 GETLNT: HLRE B,A ;GET -LNTH
2508 SUB A,B ;POINT TO 1ST DOPE WORD
2509 MOVEI A,1(A) ;POINT TO 2ND DOPE WORD
2510 CAIL A,STOSTR ; CHECK IN VECTOR SPACE
2512 JRST VECTB1 ;BAD VECTOR, COMPLAIN
2513 HLRE B,(A) ;GET LENGTH AND MARKING
2514 IORM D,(A) ;MAKE SURE MARKED
2516 MOVEI F,(B) ; AMOUNT TO ALLOCATE
2517 PUSHJ P,ALLOGC ;ALLOCATE ROOM
2518 HRRM 0,(A) ; RELATIVIZE
2519 AMTK1: AOS (P) ; A NON MARKED ITEM
2520 AMTKE: POPJ P, ;AND RETURN
2522 GCRET1: SUB P,[1,,1] ;FLUSH RETURN ADDRESS
2527 ; MARK NON-GENERAL VECTORS
2529 NOTGEN: CAMN B,[GENERAL+<SPVP,,0>]
2530 JRST GENRAL ;YES, MARK AS A VECTOR
2531 JUMPL B,SPECLS ; COMPLAIN IF A SPECIAL HACK
2532 SUBI A,1(E) ;POINT TO TOP OF A UNIFORM VECTOR
2533 HLRZS B ;ISOLATE TYPE
2536 SKIPE DUMFLG ; SKIP IF NOT IN DUMPER
2537 PUSHJ P,TYPHK ; HACK WITH TYPE IF SPECIAL
2538 POP P,E ; RESTORE LENGTH
2539 MOVE F,B ; AND COPY IT
2540 LSH B,1 ;FIND OUT WHERE IT WILL GO
2541 HRRZ B,@TYPNT ;GET SAT IN B
2543 MOVEI C,@MKTBS(B) ;POINT TO MARK SR
2544 CAIN C,GCRET ;IF NOT A MARKED FROM GOODIE, IGNORE
2546 MOVEI C,-1(A) ;POINT 1 PRIOR TO VECTOR START
2547 PUSH P,E ;SAVE NUMBER OF ELEMENTS
2548 PUSH P,F ;AND UNIFORM TYPE
2550 UNLOOP: MOVE B,(P) ;GET TYPE
2551 MOVE A,1(C) ;AND GOODIE
2552 TLO C,400000 ;CAN'T MUNG TYPE
2553 PUSHJ P,MARK ;MARK THIS ONE
2554 MOVEM A,1(C) ; LIST FIXUP
2556 AOJA C,UNLOOP ;IF MORE, DO NEXT
2558 SUB P,[2,,2] ;REMOVE STACK CRAP
2562 SPECLS: FATAL AGC--UNRECOGNIZED SPECIAL VECTOR
2563 SUB P,[4,,4] ; REOVER
2568 ; ROUTINE TO MARK THE GC-READ TABLE. MARKS THE ATOMS AT THE DOPE WORDS
2569 ; AND UPDATES PTR TO THE TABLE.
2571 GCRDMK: PUSH P,A ; SAVE PTR TO TOP
2572 MOVEI 0,@BOTNEW ; SAVE PTR TO INF
2574 PUSHJ P,GETLNT ; GET TO D.W. AND CHECK MARKING
2575 JRST GCRDRL ; RELATIVIZE
2576 PUSH P,A ; SAVE D.W POINTER
2578 MOVE B,ABOTN ; GET TOP OF ATOM TABLE
2580 ADD B,0 ; GET BOTTOM OF ATOM TABLE
2581 GCRD1: CAMG A,B ; DON'T SKIP IF DONE
2583 HLRZ C,(A) ; GET MARKING
2584 TRZN C,400000 ; SKIP IF MARKED
2587 SUBI A,(C) ; GO BACK ONE ATOM
2589 PUSH P,A ; SAVE POINTER
2590 MOVEI C,-2(E) ; SET UP POINTER
2591 MOVEI B,TATOM ; GO TO MARK
2594 MOVEM A,1(C) ; SMASH FIXED UP ATOM BACK IN
2598 GCRD3: SUBI A,(C) ; TO NEXT ATOM
2600 GCRD2: POP P,A ; GET PTR TO D.W.
2601 POP P,E ; GET PTR TO INF
2602 SUB P,[1,,1] ; GET RID OF TOP
2603 PUSHJ P,ADPMOD ; FIX UP D.W.
2604 PUSHJ P,TRBLK ; SEND IT OUT
2605 JRST ATMREL ; RELATIVIZE AND LEAVE
2606 GCRDRL: POP P,A ; GET PTR TO D.W
2607 SUB P,[2,,2] ; GET RID OF TOP AND PTR TO INF
2608 JRST ATMREL ; RELATAVIZE
2612 ;MARK RELATAVIZED GLOC HACKS
2614 LOCRMK: SKIPE GCHAIR
2616 LOCRDP: PUSH P,C ; SAVE C
2617 MOVEI C,-2(A) ; RELATAVIZED PTR TO ATOM
2618 ADD C,GLTOP ; ADD GLOTOP TO GET TO ATOM
2619 MOVEI B,TATOM ; ITS AN ATOM
2623 SKIPN DUMFLG ; IF GC-DUMP, WILL STORE ATOM FOR LOCR
2626 IORM B,3(A) ; MUNG ATOM TO SAY IT IS LOCR
2628 LOCRDD: MOVE A,1(C) ; GET RELATIVIZATION
2629 MOVEM A,(P) ; IT STAYS THE SAVE
2632 ;MARK LOCID TYPE GOODIES
2634 LOCMK: HRRZ B,(C) ;GET TIME
2635 JUMPE B,LOCMK1 ; SKIP LEGAL CHECK FOR GLOBAL
2636 HRRZ 0,2(A) ; GET OTHER TIME
2638 SETZB A,(P) ; NO, SMASH LOCATIVE
2639 JUMPE A,GCRET ; LEAVE IF DONE
2641 MOVEI B,TATOM ; MARK ATOM
2642 MOVEI C,-2(A) ; POINT TO ATOM
2643 MOVE E,(C) ; SEE IF BLOCK IS MARKED
2644 TLNE E,400000 ; SKIP IF MARKED
2645 JRST LOCMK2 ; SKIP OVER BLOCK
2646 SKIPN GCHAIR ; DO NOT MARK IF NOT HAIRY (WILL BE MARKED)
2647 PUSHJ P,MARK1 ; LET LOCATIVE SAVE THE ATOM
2649 HRRZ E,(C) ; TIME BACK
2650 MOVEI B,TVEC ; ASSUME GLOBAL
2652 MOVEI B,TTP ; ITS LOCAL
2653 PUSHJ P,MARK1 ; MARK IT
2658 ; MARK ASSOCIATION BLOCKS
2661 ASMRK1: HRLI A,-ASOLNT ;LOOK LIKE A VECTOR POINTER
2662 PUSHJ P,GETLNT ;GET LENGTH AND CHECK BOUNDS
2663 JRST ASTREL ; ALREADY MARKED
2664 MOVEI C,-ASOLNT-1(A) ;COPY POINTER
2665 PUSHJ P,MARK2 ;MARK ITEM CELL
2667 ADDI C,INDIC-ITEM ;POINT TO INDICATOR
2673 SKIPN GCHAIR ; IF NO HAIR, MARK ALL FRIENDS
2675 HRRZ A,NODPNT-VAL(C) ; NEXT
2676 JUMPN A,ASMRK1 ; IF EXISTS, GO
2677 ASTREL: POP P,A ; RESTORE PTR TO ASSOCIATION
2678 MOVEI A,ASOLNT+1(A) ; POINT TO D.W.
2679 SKIPN NODPNT-ASOLNT-1(A) ; SEE IF EMPTY NODPTR
2680 JRST ASTX ; JUMP TO SEND OUT
2681 ASTR1: HRRZ E,(A) ; RELATAVIZE
2685 ASTX: HRRZ E,(A) ; GET PTR IN FRONTEIR
2686 SUBI E,ASOLNT+1 ; ADJUST TO POINT TO BEGINNING
2691 ;HERE WHEN A VECTOR POINTER IS BAD
2693 VECTB1:FATAL AGC--VECTOR POINTS OUTSIDE OF VECTOR SPACE
2694 SUB P,[1,,1] ; RECOVERY
2695 AFIXUP: SETZM (P) ; CLOBBER SLOT
2696 JRST GCRET ; CONTINUE
2699 VECTB2: FATAL AGC--VECTOR POINTS OUT OF VECTOR SPACE
2701 JRST AFIXUP ; RECOVER
2703 PARERR: FATAL AGC--PAIR POINTS OUT OF PAIR SPACE
2704 SUB P,[1,,1] ; RECOVER
2708 \f; HERE TO MARK TEMPLATE DATA STRUCTURES
2710 TD.MRK: MOVEI 0,@BOTNEW ; SAVE PTR TO INF
2712 HLRZ B,(A) ; GET REAL SPEC TYPE
2713 ANDI B,37777 ; KILL SIGN BIT
2714 MOVEI E,-NUMSAT-1(B) ; GET REL POINTER TO TABLE
2717 HRRZS C,A ; FLUSH COUNT AND SAVE
2718 SKIPL E ; WITHIN BOUNDS
2719 FATAL BAD SAT IN AGC
2720 PUSHJ P,GETLNT ; GOODIE IS NOW MARKED
2721 JRST TMPREL ; ALREADY MARKED
2725 SUB E,TD.AGC+1 ; POINT TO LENGTH
2727 XCT (E) ; RET # OF ELEMENTS IN B
2729 HLRZ D,B ; GET POSSIBLE "BASIC LENGTH" FOR RESTS
2730 PUSH P,[0] ; TEMP USED IF RESTS EXIST
2732 MOVEI B,(B) ; ZAP TO ONLY LENGTH
2733 PUSH P,C ; SAVE POINTER TO TEMPLATE STRUCTURE
2734 PUSH P,[0] ; HOME FOR VALUES
2735 PUSH P,[0] ; SLOT FOR TEMP
2738 PUSH P,E ; SAVE FOR FINDING OTHER TABLES
2739 JUMPE D,TD.MR2 ; NO REPEATING SEQ
2740 ADD E,TD.GET+1 ; COMP LNTH OF REPEATING SEQ
2741 HLRE E,(E) ; E ==> - LNTH OF TEMPLATE
2742 ADDI E,(D) ; E ==> -LENGTH OF REP SEQ
2744 HRLM E,-5(P) ; SAVE IT AND BASIC
2746 TD.MR2: SKIPG D,-1(P) ; ANY LEFT?
2751 MOVE E,(E) ; POINTER TO VECTOR IN E
2752 MOVEM D,-6(P) ; SAVE ELMENT #
2753 SKIPN B,-5(P) ; SKIP IF "RESTS" EXIST
2756 MOVEI 0,(B) ; BASIC LNT TO 0
2757 SUBI 0,(D) ; SEE IF PAST BASIC
2758 JUMPGE 0,.-3 ; JUMP IF O.K.
2759 MOVSS B ; REP LNT TO RH, BASIC TO LH
2760 IDIVI 0,(B) ; A==> -WHICH REPEATER
2762 ADD A,-5(P) ; PLUS BASIC
2763 ADDI A,1 ; AND FUDGE
2764 MOVEM A,-6(P) ; SAVE FOR PUTTER
2765 ADDI E,-1(A) ; POINT
2768 TD.MR3: ADDI E,(D) ; POINT TO SLOT
2769 XCT (E) ; GET THIS ELEMENT INTO A AND B
2770 JFCL ; NO-OP FOR ANY CASE
2771 MOVEM A,-3(P) ; SAVE TYPE FOR LATER PUT
2773 EXCH A,B ; REARRANGE
2775 MOVEI C,-3(P) ; TELL OTHER GUYS THEY CANT DIRECTLY MUNG
2776 MOVSI D,400000 ; RESET FOR MARK
2777 PUSHJ P,MARK ; AND MARK THIS GUY (RET FIXED POINTER IN A)
2778 MOVE C,-4(P) ; REGOBBLE POINTER TO TEMPLATE
2780 MOVE B,-6(P) ; RESTORE COUNT
2782 MOVE E,(E) ; POINTER TO VECTOR IN E
2783 ADDI E,(B)-1 ; POINT TO SLOT
2784 MOVE B,-3(P) ; RESTORE TYPE WORD
2786 SOS D,-1(P) ; GET ELEMENT #
2787 XCT (E) ; SMASH IT BACK
2788 FATAL TEMPLATE LOSSAGE
2789 MOVE C,-4(P) ; RESTORE POINTER IN CASE MUNGED
2792 TD.MR1: MOVE A,-8(P) ; PTR TO DOPE WORD
2793 MOVE E,-7(P) ; RESTORE PTR TO FRONTEIR
2794 SUB P,[7,,7] ; CLEAN UP STACK
2795 USRAG1: ADDI A,1 ; POINT TO SECOND D.W.
2796 MOVSI D,400000 ; SET UP MARK BIT
2798 PUSHJ P,TRBLK ; SEND IT OUT
2799 TMPREL: SUB P,[1,,1]
2803 MOVSI D,400000 ; RESTORE MARK/UNMARK BIT
2806 USRAGC: HRRZ E,(E) ; MARK THE TEMPLATE
2808 MOVE A,-1(P) ; POINTER TO D.W
2809 MOVE E,(P) ; TOINTER TO FRONTIER
2812 ; This phase attempts to remove any unwanted associations. The program
2813 ; loops through the structure marking values of associations. It can only
2814 ; stop when no new values (potential items and/or indicators) are marked.
2816 VALFLS: PUSH P,LPVP ; SAVE LPVP FOR LATER
2817 PUSH P,[0] ; INDICATE WHETHER ANY ON THIS PASS
2818 PUSH P,[0] ; OR THIS BUCKET
2819 ASOMK1: MOVE A,GCASOV ; GET VECTOR POINTER
2820 SETOM -1(P) ; INITIALIZE FLAG
2822 ASOM6: SKIPG C,(A) ; SKIP IF BUCKET TO BE SCANNED
2824 SETOM (P) ; SAY BUCKET NOT CHANGED
2826 ASOM2: MOVEI F,(C) ; COPY POINTER
2827 SKIPG ASOLNT+1(C) ; SKIP IF NOT ALREADY MARKED
2828 JRST ASOM4 ; MARKED, GO ON
2829 PUSHJ P,MARKQ ; SEE IF ITEM IS MARKED
2830 JRST ASOM3 ; IT IS NOT, IGNORE IT
2831 MOVEI F,(C) ; IN CASE CLOBBERED BY MARK2
2832 MOVEI C,INDIC(C) ; POINT TO INDICATOR SLOT
2834 JRST ASOM3 ; NOT MARKED
2836 PUSH P,A ; HERE TO MARK VALUE
2838 HLRE F,ASOLNT-INDIC+1(C) ; GET LENGTH
2839 JUMPL F,.+3 ; SKIP IF MARKED
2840 CAMGE C,VECBOT ; SKIP IF IN VECT SPACE
2842 HRRM FPTR,ASOLNT-INDIC+1(C) ; PUT IN RELATIVISATION
2843 MOVEI F,12 ; AMOUNT TO ALLOCATE IN INF
2845 HRRM 0,5(C) ; STICK IN RELOCATION
2847 ASOM20: PUSHJ P,MARK2 ; AND MARK
2848 MOVEM A,1(C) ; LIST FIX UP
2849 ADDI C,ITEM-INDIC ; POINT TO ITEM
2852 ADDI C,VAL-ITEM ; POINT TO VALUE
2855 IORM D,ASOLNT-VAL+1(C) ; MARK ASOC BLOCK
2858 AOSA -1(P) ; INDICATE A MARK TOOK PLACE
2860 ASOM3: AOS (P) ; INDICATE AN UNMARKED IN THIS BUCKET
2861 ASOM4: HRRZ C,ASOLNT-1(F) ; POINT TO NEXT IN BUCKET
2862 JUMPN C,ASOM2 ; IF NOT EMPTY, CONTINUE
2863 SKIPGE (P) ; SKIP IF ANY NOT MARKED
2864 HRROS (A) ; MARK BUCKET AS NOT INTERESTING
2865 ASOM1: AOBJN A,ASOM6 ; GO TO NEXT BUCKET
2866 TLZE TYPNT,.ATOM. ; ANY ATOMS MARKED?
2867 JRST VALFLA ; YES, CHECK VALUES
2870 ; NOW SEE WHICH CHANNELS STILL POINTED TO
2872 CHNFL3: MOVEI 0,N.CHNS-1
2873 MOVEI A,CHNL1 ; SLOTS
2874 HRLI A,TCHAN ; TYPE HERE TOO
2876 CHNFL2: SKIPN B,1(A)
2879 SUBI B,(C) ; POINT TO DOPE
2880 HLLM A,(A) ; PUT TYPE BACK
2881 HRRE F,(A) ; SEE IF ALREADY MARKED
2885 HLLOS (A) ; MARK AS A LOSER
2888 CHNFL8: MOVEI F,1 ; MARK A GOOD CHANNEL
2893 SKIPE GCHAIR ; IF NOT HAIRY CASE
2896 SKIPL -1(P) ; SKIP IF NOTHING NEW MARKED
2899 SUB P,[2,,2] ; REMOVE FLAGS
2903 ; HERE TO REEMOVE UNUSED ASSOCIATIONS
2905 MOVE A,GCASOV ; GET ASOVEC BACK FOR FLUSHES
2907 ASOFL1: SKIPN C,(A) ; SKIP IF BUCKET NOT EMPTY
2908 JRST ASOFL2 ; EMPTY BUCKET, IGNORE
2909 HRRZS (A) ; UNDO DAMAGE OF BEFORE
2911 ASOFL5: SKIPGE ASOLNT+1(C) ; SKIP IF UNMARKED
2912 JRST ASOFL6 ; MARKED, DONT FLUSH
2914 HRRZ B,ASOLNT-1(C) ; GET FORWARD POINTER
2915 HLRZ E,ASOLNT-1(C) ; AND BACK POINTER
2916 JUMPN E,ASOFL4 ; JUMP IF NO BACK POINTER (FIRST IN BUCKET)
2917 HRRZM B,(A) ; FIX BUCKET
2920 ASOFL4: HRRM B,ASOLNT-1(E) ; FIX UP PREVIOUS
2921 JUMPE B,.+2 ; JUMP IF NO NEXT POINTER
2922 HRLM E,ASOLNT-1(B) ; FIX NEXT'S BACK POINTER
2923 HRRZ B,NODPNT(C) ; SPLICE OUT THRAD
2930 ASOFL3: HRRZ C,ASOLNT-1(C) ; GO TO NEXT
2932 ASOFL2: AOBJN A,ASOFL1
2936 ; NOW CLOBBER UNMARKED LOCAL NAD GLOBAL VALUES
2938 MOVE A,GCGBSP ; GET GLOBAL PDL
2940 GLOFLS: SKIPGE (A) ; SKIP IF NOT ALREADY MARKED
2943 PUSHJ P,ZERSLT ; CLOBBER THE SLOT
2945 SVDCL: ANDCAM D,(A) ; UNMARK
2947 JUMPL A,GLOFLS ; MORE?, KEEP LOOPING
2950 LOCFL1: HRRZ A,(LPVP) ; NOW CLOBBER LOCAL SLOTS
2953 JUMPE A,LOCFL2 ; NONE TO FLUSH
2955 LOCFLS: SKIPGE (A) ; MARKDE?
2959 ANDCAM D,(A) ;UNMARK
2962 LOCFL2: JUMPN LPVP,LOCFL1 ; JUMP IF MORE PROCESS
2964 ; AT THIS POINT THE LOCALS ARE FINALLY SENT OUT.
2965 ; THIS ROUTINE UPDATES THE THIS-PROCESS BINDING. IT FIXES UP THE SP-CHAIN AND IT
2966 ; SENDS OUT THE ATOMS.
2969 MOVEI B,TATOM ; MARK THE BINDING TO THIS PROCESS
2970 PUSHJ P,MARK1 ; MARK THE ATOM
2971 MOVEM A,1(C) ; NEW HOME
2972 MOVEI C,2(C) ; MARK VALUE
2973 MOVEI B,TPVP ; IT IS A PROCESS VECTOR POINTER
2974 PUSHJ P,MARK1 ; MARK IT
2977 NEXPRO: MOVEI 0,TPVP ; FIX UP SLOT
2978 HLRZ A,2(R) ; GET PTR TO NEXT PROCESS
2980 HRRZ E,(A) ; ADRESS IN INF
2981 HRRZ B,(A) ; CALCULATE RELOCATION
2984 HRRZ F,A ; CALCULATE START OF TP IN F
2985 HLRZ B,(A) ; ADJUST INF PTR
2988 LDB M,[111100,,-1(A)] ; CALCULATE TOP GROWTH
2989 TRZE M,400 ; FUDGE SIGN
2992 ADD B,M ; FIX UP LENGTH
2994 SUBM M,(P) ; FIX RELOCATION TO TAKE INTO ACCOUNT CHANGE IN LENGTH
2995 MOVE M,R ; GET A COPY OF R
2996 NEXP1: HRRZ C,(M) ; GET PTR TO NEXT IN CHAIN
2997 JUMPE C,NEXP2 ; EXIT IF END OF CHAIN
2998 MOVE 0,C ; GET COPY OF CHAIN PTR TO UPDATE
3003 NEXP2: SUB P,[1,,1] ; CLEAN UP STACK
3005 HRRI B,(R) ; GET POINTER TO THIS-PROCESS BINDING
3006 MOVEI B,6(B) ; POINT AFTER THE BINDING
3007 MOVE 0,F ; CALCULATE # OF WORDS TO SEND OUT
3009 PUSH P,R ; PRESERVE R
3010 PUSHJ P,TRBLKX ; SEND IT OUT
3012 HRRZS R,2(R) ; GET THE NEXT PROCESS
3017 MOVE A,GCGBSP ; PTR TO GLOBAL STACK
3018 PUSHJ P,SPCOUT ; SEND IT OUT
3020 PUSHJ P,SPCOUT ; SEND IT OUT
3023 ; THIS ROUTINE MARKS ALL THE CHANNELS
3024 ; IT THEN SENDS OUT A COPY OF THE TVP
3026 CHFIX: MOVEI 0,N.CHNS-1
3027 MOVEI A,CHNL1 ; SLOTS
3028 HRLI A,TCHAN ; TYPE HERE TOO
3030 DHNFL2: SKIPN B,1(A)
3032 MOVEI C,(A) ; MARK THE CHANNEL
3036 MOVEM A,1(C) ; ADJUST PTR
3044 ; ROUTINE TO SEND OUT SPECIAL STUFF FROM GCHAIR
3048 MOVEI A,1(A) ; POINT TO DOPE WORD
3049 LDB 0,[001100,,-1(A)] ;GET GROWTH FACTOR
3050 TRZE 0,400 ;KILL SIGN BIT AND SKIP IF +
3052 ASH 0,6 ;CONVERT TO NUMBER OF WORDS
3054 HRRZ E,(A) ; GET PTR TO INF
3056 TRZ B,400000 ; GET RID OF MARK BIT
3059 PUSH P,0 ; DUMMY FOR TRBLKV
3060 PUSHJ P,TRBLKV ; OUT IT GOES
3064 ASOFL6: HLRZ E,ASOLNT-1(C) ; SEE IF FIRST IN BUCKET
3065 JUMPN E,ASOFL3 ; IF NOT CONTINUE
3066 HRRZ E,ASOLNT+1(C) ; GET PTR FROM DOPE WORD
3067 SUBI E,ASOLNT+1 ; ADJUST TO POINT TO BEGINNING OF ALSSOCIATION
3068 HRRZM E,(A) ; SMASH IT IN
3072 MARK23: PUSH P,A ; SAVE BUCKET POINTER
3078 AOS -2(P) ; MARKING HAS OCCURRED
3079 IORM D,ASOLNT+1(C) ; MARK IT
3082 \f; CHANNEL FLUSHER FOR NON HAIRY GC
3085 SETOM (P) ; RESET FOR RETRY
3092 ; VALUE FLUSHING PHASE, HACKS BOTTOM OF TP AND GLOBAL SP
3094 VALFLA: MOVE C,GCGBSP ; GET POINTER TO GLOBAL STACK
3095 VALFL1: SKIPL (C) ; SKIP IF NOT MARKED
3096 PUSHJ P,MARKQ ; SEE IF ATOM IS MARKED
3099 MOVEI B,TATOM ; UPDATE ATOM SLOT
3103 AOS -2(P) ; INDICATE MARK OCCURRED
3104 HRRZ B,(C) ; GET POSSIBLE GDECL
3105 JUMPE B,VLFL10 ; NONE
3106 CAIN B,-1 ; MAINFIFEST
3111 PUSHJ P,MARK ; MARK IT
3113 HRRM A,(C) ; CLOBBER UPDATE IN
3114 VLFL10: ADD C,[2,,2] ; BUMP TO VALUE
3115 PUSHJ P,MARK2 ; MARK VALUE
3118 VALFL2: ADD C,[4,,4]
3119 JUMPL C,VALFL1 ; JUMP IF MORE
3121 HRLM LPVP,(P) ; SAVE POINTER
3122 VALFL7: MOVEI C,(LPVP)
3126 VALFL5: HRRZ C,(C) ; CHAIN
3128 MOVEI B,TATOM ; TREAT LIKE AN ATOM
3130 PUSHJ P,MARKQ1 ; NO, SEE
3132 AOS -1(P) ; MARK WILL OCCUR
3133 MOVEI B,TATOM ; RELATAVIZE
3137 ADD C,[2,,2] ; POINT TO VALUE
3138 PUSHJ P,MARK2 ; MARK VALUE
3143 VALFL4: HRRZ C,(P) ; GET SAVED LPVP
3145 HRRZ C,2(C) ; POINT TO NEXT
3149 HRRM LPVP,2(A) ; NEW PROCESS WAS MARKED
3152 ZERSLT: HRRI B,(A) ; COPY POINTER
3157 VALFL9: HLRZ LPVP,(P) ; RESTORE CHAIN
3160 \f;SUBROUTINE TO SEE IF A GOODIE IS MARKED
3161 ;RECEIVES POINTER IN C
3162 ;SKIPS IF MARKED NOT OTHERWISE
3164 MARKQ: HLRZ B,(C) ;TYPE TO B
3165 MARKQ1: MOVE E,1(C) ;DATUM TO C
3167 CAIL 0,@PURBOT ; DONT CHACK PURE
3168 JRST MKD ; ALWAYS MARKED
3169 ANDI B,TYPMSK ; FLUSH MONITORS
3171 HRRZ B,@TYPNT ;GOBBLE SAT
3173 CAIG B,NUMSAT ; SKIP FOR TEMPLATE
3174 JRST @MQTBS(B) ;DISPATCH
3175 ANDI E,-1 ; FLUSH REST HACKS
3183 DISTB2 DUM3,MKD,[[S2WORD,PAIRMQ],[S2DEFR,PAIRMQ],[SNWORD,VECMQ],[S2NWORD,VECMQ]
3184 [STPSTK,VECMQ],[SARGS,ARGMQ],[SPSTK,VECMQ],[SFRAME,FRMQ],[SLOCID,LOCMQ]
3185 [SATOM,ATMMQ],[SPVP,VECMQ],[SCHSTR,BYTMQ],[SLOCA,ARGMQ],[SLOCU,VECMQ]
3186 [SLOCV,VECMQ],[SLOCS,BYTMQ],[SLOCN,ASMQ],[SASOC,ASMQ],[SLOCL,PAIRMQ],[SGATOM,ATMMQ]
3187 [SBYTE,BYTMQ],[SLOCB,BYTMQ],[SDEFQ,PAIRMQ],[SOFFS,OFFSMQ]]
3191 PAIRMQ: JUMPE E,MKD ; NIL ALWAYS MARKED
3192 SKIPL (E) ; SKIP IF MARKED
3198 BYTMQ: PUSH P,A ; SAVE A
3199 PUSHJ P,BYTDOP ; GET PTR TO DOPE WORD
3200 MOVE E,A ; COPY POINTER
3202 SKIPGE (E) ; SKIP IF NOT MARKED
3206 FRMQ: HRRZ E,(C) ; POINT TO PV DOPE WORD
3209 ATMMQ: CAML 0,GCSBOT ; ALWAYS KEEP FROZEN ATOMS
3214 VECMQ: HLRE 0,E ;GET LENGTH
3215 SUB E,0 ;POINT TO DOPE WORDS
3217 VECMQ1: SKIPGE 1(E) ;SKIP IF NOT MARKED
3218 AOS (P) ;MARKED, CAUSE SKIP RETURN
3224 LOCMQ: HRRZ 0,(C) ; GET TIME
3225 JUMPE 0,VECMQ ; GLOBAL, LIKE VECTOR
3226 HLRE 0,E ; FIND DOPE
3228 MOVEI E,1(E) ; POINT TO LAST DOPE
3229 CAMN E,TPGROW ; GROWING?
3230 SOJA E,VECMQ1 ; YES, CHECK
3231 ADDI E,PDLBUF ; FUDGE
3236 OFFSMQ: HLRZS E ; POINT TO LIST STRUCTURE
3237 SKIPGE (E) ; MARKED?
3241 \f; SUBROUTINE TO UPDATE ASSOCIATIONS AND MOVE THEM INTO THE INF
3243 ASSOUP: MOVE A,GCNOD ; RECOVER PTR TO START OF CHAIN
3244 ASSOP1: HRRZ B,NODPNT(A)
3245 PUSH P,B ; SAVE NEXT ON CHAIN
3247 HRRZ B,ASOLNT-1(A) ;POINT TO NEXT
3249 HRRZ C,ASOLNT+1(B) ;AND GET ITS RELOC IN C
3250 SUBI C,ASOLNT+1(B) ; RELATIVIZE
3251 ADDM C,ASOLNT-1(A) ;C NOW HAS UPDATED POINTER
3252 ASOUP1: HLRZ B,ASOLNT-1(A) ;GET PREV BLOCK POINTER
3254 HRRZ F,ASOLNT+1(B) ;AND ITS RELOCATION
3255 SUBI F,ASOLNT+1(B) ; RELATIVIZE
3257 ADDM F,ASOLNT-1(A) ;RELOCATE
3258 ASOUP2: HRRZ B,NODPNT(A) ;UPDATE NODE CHAIN
3260 HRRZ C,ASOLNT+1(B) ;GET RELOC
3261 SUBI C,ASOLNT+1(B) ; RELATIVIZE
3262 ADDM C,NODPNT(A) ;AND UPDATE
3263 ASOUP4: HLRZ B,NODPNT(A) ;GET PREV POINTER
3265 HRRZ F,ASOLNT+1(B) ;RELOC
3269 ASOUP5: POP P,A ; RECOVER PTR TO DOPE WORD
3271 MOVSI B,400000 ;UNMARK IT
3273 HRRZ E,(A) ; SET UP PTR TO INF
3275 SUBI E,-1(B) ; ADJUST PTR
3277 PUSHJ P,TRBLK ; OUT IT GOES
3278 POP P,A ; RECOVER PTR TO ASSOCIATION
3279 JUMPN A,ASSOP1 ; IF NOT ZERO CONTINUP
3283 ; HERE TO CLEAN UP ATOM HASH TABLE
3285 ATCLEA: MOVE A,GCHSHT ; GET TABLE POINTER
3288 SKIPE C,(A) ; GET NEXT
3289 JRST ATCLE2 ; GOT ONE
3291 ATCLE3: PUSHJ P,OUTATM
3294 MOVE A,GCHSHT ; MOVE OUT TABLE
3302 ATCLE5: CAIL C,HIBOT
3304 CAMG C,VECBOT ; FROZEN ATOMS ALWAYS MARKED
3306 SKIPL 1(C) ; SKIP IF ATOM MARKED
3309 HRRZ 0,1(C) ; GET DESTINATION
3310 CAIN 0,-1 ; FROZEN/MAGIC ATOM
3311 MOVEI 0,1(C) ; USE CURRENT POSN
3312 SUBI 0,1 ; POINT TO CORRECT DOPE
3313 JUMPN B,ATCLE7 ; JUMP IF GOES INTO ATOM
3315 HRRZM 0,(A) ; INTO HASH TABLE
3318 ATCLE7: HRLM 0,2(B) ; INTO PREV ATOM
3322 ANDI B,377777 ; KILL MARK BIT
3327 JUMPE C,ATCLE3 ; DONE WITH BUCKET
3330 ; HERE TO PASS OVER LOST ATOM
3332 ATCLE6: HLRZ F,1(C) ; FIND NEXT ATOM
3342 OUTATM: JUMPE B,CPOPJ
3347 MOVSI D,400000 ;UNMARK IT
3349 HRRZ E,1(A) ; SET UP PTR TO INF
3351 SUBI E,-1(B) ; ADJUST PTR
3354 PUSHJ P,TRBLK ; OUT IT GOES
3356 POP P,A ; RECOVER PTR TO ASSOCIATION
3360 VCMLOS: FATAL AGC--VECTOR WITH ZERO IN DOPE WORD LENGTH
3363 ; THESE ARE THE MESSAGES INDICATING THE CAUSE OF THE GC
3365 MSGGCT: [ASCIZ /USER CALLED- /]
3366 [ASCIZ /FREE STORAGE- /]
3367 [ASCIZ /TP-STACK- /]
3368 [ASCIZ /TOP-LEVEL LOCALS- /]
3369 [ASCIZ /GLOBAL VALUES- /]
3371 [ASCIZ /STATIONARY IMPURE STORAGE- /]
3373 [ASCIZ /BOTH STACKS BLOWN- /]
3374 [ASCIZ /PURE STORAGE- /]
3375 [ASCIZ /GC-RCALL- /]
3377 ; THESE ARE MESSAGES INDICATING WHO CAUSED THE GC
3382 MSGGFT: [ASCIZ /GC-READ /]
3390 [ASCIZ /PURE-PAGE LOADER /]
3392 [ASCIZ /INTERRUPT-HANDLER /]
3396 .GLOBAL GCNO,BSTGC,BSTAT,NOWFRE,CURFRE,MAXFRE,USEFRE,NOWTP,CURTP,CTPMX,NOWLFL
3397 .GLOBAL CURLVL,NOWGVL,CURGVL,NOWTYP,CURTYP,NOWSTO,CURSTO,CURMAX,NOWP,CURP,CPMX
3398 .GLOBAL GCCAUS,GCCALL,LVLINC,GVLINC,TYPIC,STORIC,RCL,RCLV,GCDANG,GETNUM,RPTOP,CORTOP
3399 .GLOBAL TPGROW,PPGROW,PGROW,PMAIN,PGOOD,PMAX,TPGOOD,TPMIN,TPMAX,RFRETP,TYPTAB
3400 .GLOBAL NNPRI,NNSAT,TYPSAV,BUFGC,GCTIM,GPURFL,GCDFLG,DUMFLG
3401 .GLOBAL TPBINC,GBLINC,TYPINC,CONADJ,OGCSTP,ABOTN,MAXLEN
3402 .GLOBAL PURMIN,GCMONF,.LIST.,FPAG,PMIN,GLBINC,INCORF,PURCOR,GCHAIR
3410 ; LOCACTIONS USED BY THE PAGE HACKER
3412 DOPSV1: 0 ;SAVED FIRST D.W.
3413 DOPSV2: 0 ; SAVED LENGTH
3416 ; LOCATIONS USED BY BLOAT-STAT TO HELP THE USER PICK BLOAT SPECIFICATIONS.
3419 GCNO: 0 ; USER-CALLED GC
3420 BSTGC: 0 ; FREE STORAGE
3427 0 ; BOTH STATCKS BLOWN
3431 NOWFRE: 0 ; FREE STORAGE FROM LAST GC
3432 CURFRE: 0 ; STORAGE USED SINCE LAST GC
3433 MAXFRE: 0 ; MAXIMUM FREE STORAGE ALLOCATED
3434 USEFRE: 0 ; TOTAL FREE STORAGE USED
3435 NOWTP: 0 ; TP LENGTH FROM LAST GC
3436 CURTP: 0 ; # WORDS ON TP
3437 CTPMX: 0 ; MAXIMUM SIZE OF TP SO FAR
3438 NOWLVL: 0 ; # OF TOP-LEVEL LVAL-SLOTS
3439 CURLVL: 0 ; # OF TOP-LEVEL LVALS
3440 NOWGVL: 0 ; # OF GVAL SLOTS
3441 CURGVL: 0 ; # OF GVALS
3442 NOWTYP: 0 ; SIZE OF TYPE-VECTOR
3443 CURTYP: 0 ; # OF TYPES
3444 NOWSTO: 0 ; SIZE OF STATIONARY STORAGE
3445 CURSTO: 0 ; STATIONARY STORAGE IN USE
3446 CURMAX: 0 ; MAXIMUM BLOCK OF CONTIGUOUS STORAGE
3447 NOWP: 0 ; SIZE OF P-STACK
3448 CURP: 0 ; #WORDS ON P
3449 CPMX: 0 ; MAXIMUM P-STACK LENGTH SO FAR
3450 GCCAUS: 0 ; INDICATOR FOR CAUSE OF GC
3451 GCCALL: 0 ; INDICATOR FOR CALLER OF GC
3454 ; THIS GROUP OF VARIABLES DETERMINES HOW THINGS GROW
3455 LVLINC: 6 ; LVAL INCREMENT ASSUMED TO BE 64 SLOTS
3456 GVLINC: 4 ; GVAL INCREMENT ASSUMED TO BE 64 SLOTS
3457 TYPIC: 1 ; TYPE INCREMENT ASSUMED TO BE 32 TYPES
3458 STORIC: 2000 ; STORAGE INCREMENT USED BY NFREE (MINIMUM BLOCK-SIZE)
3461 RCL: 0 ; POINTER TO LIST OF RECYCLEABLE LIST CELLS
3462 RCLV: 0 ; POINTER TO RECYCLED VECTORS
3463 GCMONF: 0 ; NON-ZERO SAY GIN/GOUT
3464 GCDANG: 0 ; NON-ZERO, STORAGE IS LOW
3465 INBLOT: 0 ; INDICATE THAT WE ARE RUNNING OIN A BLOAT
3466 GETNUM: 0 ;NO OF WORDS TO GET
3468 RPTOP: 0 ;NO OF BLOCKS OF CORE, IF GIVING CORE AWAY
3469 CORTOP: 0 ;CURRENT TOP OF CORE, EXCLUDING ANY TO BE GIVEN AWAY
3470 NGCS: 8 ; NUMBER OF GARBAGE COLLECTS BETWEEN HAIRY GCS
3472 ;VARIABLES WHICH DETERMIN WHEN MUDDLE WILL ASK FOR MORE CORE,
3473 ;AND WHEN IT WILL GET UNHAPPY
3475 FREMIN: 20000 ;MINIMUM FREE WORDS
3477 ;POINTER TO GROWING PDL
3479 TPGROW: 0 ;POINTS TO A BLOWN TP
3480 PPGROW: 0 ;POINTS TO A BLOWN PP
3481 PGROW: 0 ;POINTS TO A BLOWN P
3486 GCFLCH: 0 ; TELL INT HANDLER TO ITIC CHARS
3487 GCHAIR: 1 ; COUNTS GCS AND TELLS WHEN TO HAIRIFY
3488 GCDOWN: 0 ; AMOUNT TO TRY AND MOVE DOWN
3489 CURPLN: 0 ; LENGTH OF CURRENTLY RUNNING PURE RSUBR
3490 PURMIN: 0 ; MINIMUM PURE STORAGE
3492 ; VARS ASSOCIATED WITH BLOAT LOGIC
3493 PMIN: 200 ; MINIMUM FOR PSTACK
3494 PGOOD: 1000 ; GOOD SIZE FOR PSTACK
3495 PMAX: 4000 ; MAX SIZE FOR PSTACK
3496 TPMIN: 1000 ; MINIMUM SIZE FOR TP
3497 TPGOOD: NTPGOO ; GOOD SIZE OF TP
3498 TPMAX: NTPMAX ; MAX SIZE OF TP
3504 ; VARS FOR PAGE WINDOW HACKS
3506 GCHSHT: 0 ; SAVED ATOM TABLE
3507 PURSVT: 0 ; SAVED PURVEC TABLE
3508 GLTOP: 0 ; SAVE GLOTOP
3509 GCNOD: 0 ; PTR TO START OF ASSOCIATION CHAIN
3510 GCGBSP: 0 ; SAVED GLOBAL SP
3511 GCASOV: 0 ; SAVED PTR TO ASSOCIATION VECTOR
3512 GCATM: 0 ; PTR TO IMQUOT THIS-PROCESS
3513 FNTBOT: 0 ; BOTTOM OF FRONTEIR
3514 WNDBOT: 0 ; BOTTOM OF WINDOW
3516 BOTNEW: (FPTR) ; POINTER TO FRONTIER
3518 NPARBO: 0 ; SAVED PARBOT
3520 ; FLAGS TO INDICATE DUMPER IS IN USE
3522 GPURFL: 0 ; INDICATE PURIFIER IS RUNNING
3523 GCDFLG: 0 ; INDICATE EITHER GCDUMP OR PURIFIER IS RUNNING
3524 DUMFLG: 0 ; FLAG INDICATING DUMPER IS RUNNING
3526 ; CONSTANTS FOR DUMPER,READER AND PURIFYER
3528 ABOTN: 0 ; COUNTER FOR ATOMS
3529 NABOTN: 0 ; POINTER USED BY PURIFY
3530 OGCSTP: 0 ; CONTAINS OLD GCSTOP FOR READER
3531 MAPUP: 0 ; BEGINNING OF MAPPED UP PURE STUFF
3532 SAVRES: 0 ; SAVED UPDATED ITEM OF PURIFIER
3533 SAVRE2: 0 ; SAVED TYPE WORD
3534 SAVRS1: 0 ; SAVED PTR TO OBJECT
3535 INF1: 0 ; AOBJN PTR USED IN CREATING PROTECTION INF
3536 INF2: 0 ; AOBJN PTR USED IN CREATING SECOND INF
3537 INF3: 0 ; AOBJN PTR USED TO PURIFY A STRUCTURE
3539 ; VARIABLES USED BY GC INTERRUPT HANDLER
3541 GCHPN: 0 ; SET TO -1 EVERYTIME A GC HAS OCCURED
3542 GCKNUM: 0 ; NUMBER OF WORDS OF REQUEST TO INTERRUPT
3544 ; VARIABLE TO INDICATE WHETHER AGC HAS PUSHED THE MAPPING CHANNEL TO WIN
3548 ; VARIABLES USED BY DUMPER AND READER TO HANDLE NEWTYPES
3550 TYPTAB: 0 ; POINTER TO TYPE TABLE
3551 NNPRI: 0 ; NUMPRI FROM DUMPED OBJECT
3552 NNSAT: 0 ; NUMSAT FROM DUMPED OBJECT
3553 TYPSAV: 0 ; SAVE PTR TO TYPE VECTOR
3555 ; VARIABLES USED BY GC-DUMP FOR COPY-WRITE MAPPING
3557 BUFGC: 0 ; BUFFER FOR COPY ON WRITE HACKING
3558 PURMNG: 0 ; FLAG INDICATING IF A PURIFIED PAGE WAS MUNGED DURING GC-DUMP
3559 RPURBT: 0 ; SAVED VALUE OF PURTOP
3560 RGCSTP: 0 ; SAVED GCSTOP
3562 ; VARIABLES USED TO DETERMINE WHERE THE GC-DUMPED STRUCTURE SHOULD GO
3564 INCORF: 0 ; INDICATION OF UVECTOR HACKS FOR GC-DUMP
3565 PURCOR: 0 ; INDICATION OF UVECTOR TO PURE CORE
3569 PLODR: 0 ; INDICATE A PLOAD IS IN OPERATION
3572 ; VARIABLE USED BY MARK SWEEP GARBAGE COLLECTOR
3574 MAXLEN: 0 ; MAXIMUM RECLAIMED SLOT
3610 .LOP <ASH @> WIND <,-10.>
3613 .LOP <ASH @> FRONT <,-10.>
3617 .LOP <ASH @> ZZ2 <,-10.>
3620 .LOP <ASH @> LENGC <,10.>
3623 .LOP <ASH @> AGCLD <,-10.>