1 TITLE UTILITY FUNCTIONS FOR MUDDLE
14 .GLOBAL GODUMP,IPURIF,EGCDUM,EPURIF,LODGC,KILGC,CALER,RBLDM,CPOPJ,C1POPJ,INQAGC,FRETOP
15 .GLOBAL SAT,PGFIND,PGGIVE,PGTAKE,PINIT,ERRKIL,CKPUR,GCSET,MKTBS,PFLG,NPWRIT,GETNUM
16 .GLOBAL AGC,AAGC,%CLSM1,%SHWND,IBLOCK,FINAGC,PGINT,CPOPJ1,REHASH,FRMUNG,MAXLEN,TOTCNT
17 .GLOBAL NWORDT,NWORDS,MSGTYP,IMTYO,MULTSG,MULTI,NOMULT,GCDEBU
18 .GLOBAL PURCOR,INCORF,BADCHN,INTHLD,%MPIN1,WNDP,WIND,ACCESS,PURTOP,GCPDL,CTIME,P.CORE
19 .GLOBAL IAGC,IAAGC,TYPVEC,PURBOT,PURTOP,MOVPUR,PURVEC,PMAPB,CURPLN,RFRETP,NOWFRE,FREMIN
20 .GLOBAL MAXFRE,TPGROW,PDLBUF,CTPMX,PGROW,PDLBUF,CPMX,SAVM,NOWP,NOWTP,MPOPJ,GCFLG,GCDOWN
21 .GLOBAL GCTIM,NOSHUF,P.TOP,GETPAG,ITEM,INDIC,ASOVEC,ASOLNT,GETBUF,KILBUF,PAT,PATEND
22 .GLOBAL PATCH,DSTORE,PVSTOR,SPSTOR,SQKIL,IAMSGC,FNMSGC,RNUMSP,NUMSWP,SWAPGC,SAGC,GCSTOP
24 .GLOBAL C%11,C%22,C%33,C%44,C%55,C%66,C%0,C%1,C%2,C%3,C%M1,C%M2,C%M10
25 .GLOBAL C%M20,C%M30,C%M40,C%M60
29 ; GC-DUMP TAKES AN OBJECT AND MAPS IT INTO A FILE DIRECTLY USING THE GARBAGE
30 ; COLLECTOR. ALL OBJECTS HAVE RELATIVIZED POINTERS AND WILL BE SET UP UPON
31 ; READIN (USING GC-READ).
32 ; IT TAKES TWO ARGUMENTS. THE FIRST IS THE OBJECT THE SECOND MUST BE A "PRINTB"
35 MFUNCTION GCDUMP,SUBR,[GC-DUMP]
41 SKIPE MULTSG ; MUST RUN I 0 SEXTION MODE
45 IRP AC,,[FRM,P,R,M,TP,TB,AB]
46 MOVEM AC,AC!STO"+1(PVP)
50 SETZM INCORF ; SET UP PARAMS
51 CAML AB,C%M20 ; CHECK ARGS
55 GETYP A,2(AB) ; SEE WHETHER THE CHANNEL IS A WINNER
56 CAIN A,TFALSE ; SKIP IF NOT FALSE
59 JRST WTYP2 ; ITS NOT A CHANNEL. COMPLAIN
60 MOVE B,3(AB) ; CHECK BITS IN CHANNEL
62 TRC C,C.PRIN+C.OPN+C.BIN
63 TRNE C,C.PRIN+C.OPN+C.BIN
65 PUSH P,1(B) ; SAVE CHANNEL NUMBER
66 CAMGE AB,C%M40 ; SEE IF THIRD ARG WAS SNUCK IN
70 UVEARG: SETOM INCORF ; SET UP FLAG INDICATING UVECTOR
71 CAML AB,C%M40 ; SEE IF THIRD ARG
77 PUSHJ P,LODGC ; GET THE GARBAGE COLLECTOR
81 EGCDUM: PUSH P,A ; SAVE LENGTH
82 PUSHJ P,KILGC ; KILL THE GARBAGE COLLECTOR
85 SKIPN INCORF ; SKIP IF TO UVECTOR
87 SKIPN PURCOR ; SKIP IF PURE UVECTOR
90 ; ROUTINE TO CREATE A UVECTOR IN PURE STORAGE CONTAINING GC-DUMPED
95 ASH A,-10. ; TO BLOCKS
97 TRAGN: PUSHJ P,PGFIND ; TRY TO GET PAGES
98 JUMPL B,GCDPLS ; LOSSAGE?
99 POP P,A ; GET # OF PAGES
101 MOVNS A ; BUILD AOBJN POINTER
103 ADDI A,FPAG/2000 ; START
104 HLL B,A ; SAME # OF PAGES
106 POP P,B ; RESTORE # OF FIRST PAGE
107 ASH B,10. ; TO ADDRESS
108 POP P,A ; RESTORE LENGTH IN WORDS
109 MOVNI A,-2(A) ; BUILD AOBJN
111 MOVE A,$TUVEC ; TYPE WORD
114 ; HERE WHEN EFFORTS TO GE PURE STORAGE FAIL.
116 GCDPLS: MOVE A,(P) ; GET # OF PAGES
119 ANDCMI A,1777 ; ROUND AND TO PAGE
121 MOVE C,[13.,,9.] ; CAUSE INDICATOR
122 PUSHJ P,AGC ; CAUSE AGC TO HAPPEN
123 MOVE A,(P) ; GET # OF PAGES
124 JRST TRAGN ; TRY AGAIN
126 ; HERE TO TRANSFER FROM INFERIOR TO THE FILE
127 OUTFIL: PUSH P,A ; SAVE LENGTH OF FILE
131 ASH A,-10. ; TO PAGES
132 MOVNS A ; SET UP AOBJN POINTER
134 ADDI A,1 ; STARTS ON PAGE ONE
135 MOVE C,-1(P) ; GET ITS CHANNEL #
136 MOVE B,BUFP ; WINDOW PAGE
140 HRLI D,-2000 ; SET UP BUFFER IOT POINTER
141 PUSHJ P,%SHWND ; SHARE INF PAGE AND WINDOW
143 FATAL GCDUMP-- IOT FAILED
151 MOVE A,C ; CHANNEL INTO A
152 MOVE B,BUFL ; SET UP BYTE POINTER
161 DPGC5: MOVE D,(P) ; CALCULATE AMOUNT LEFT TO SEND OUT
163 ANDCMI D,1777 ; TO PAGE BOUNDRY
164 SUB D,0 ; SET UP AOBJN PTR FOR OUTPUT
168 MOVE B,BUFP ; SHARE WINDOW
171 FATAL GCDUMP-- IOT FAILED
174 MOVE B,BUFP ; SET UP WINDOW
176 MOVE A,C ; CHANNEL TO A
178 MOVE B,BUFL ; SET UP BYTE POINTER
182 MOVE B,3(AB) ; GET CHANNEL
186 MOVE A,(AB) ; RETURN WHAT IS GIVEN
188 DONDUM: PUSH TP,A ; SAVE RETURNS
202 ; HERE TO BLT INTO A UVECTOR IN GCS
204 BLTGCD: PUSH P,A ; SAVE # OF WORDS
207 PUSHJ P,IBLOCK ; GET THE UVECTOR
208 PUSH TP,A ; SAVE POINTER TO IT
210 MOVE C,(P) ; GET # OF WORDS
211 ASH C,-10. ; TO PAGES
216 MOVE B,BUFP ; WINDOW ACTS AS A BUFFER
217 HRRZ D,(TP) ; GET PTR TO START OF UVECTOR
218 JUMPGE C,DUNBLT ; IF < 1 BLOCK
219 LOPBLT: MOVEI A,(C) ; GET A BLOCK
221 MOVS A,BUFL ; SET UP TO BLT INTO UVECTOR
223 BLT A,1777(D) ; IN COMES ONE BLOCK
224 ADDI D,2000 ; INCREMENT D
225 AOBJN C,LOPBLT ; LOOP
226 DUNBLT: MOVEI A,(C) ; SHARE LAST PAGE
228 MOVS A,BUFL ; SET UP BLT
230 MOVE C,-1(P) ; GET TOTAL # OF WORDS
233 SUB C,0 ; CALCULATE # LEFT TO GO
234 ADDI D,-1(C) ; END OF UVECTOR
236 SUB P,C%22 ; CLEAN OFF STACK
250 ; LITTLE ROUTINES USED ALL OVER THE PLACE
252 MSGTYP: HRLI B,440700 ;MAKE BYTE POINTER
253 MSGTY1: ILDB A,B ;GET NEXT CHARACTER
254 JUMPE A,CPOPJ ;NULL ENDS STRING
255 CAIE A,177 ; DONT PRINT RUBOUTS
257 JRST MSGTY1 ;AND GET NEXT CHARACTER
261 ; ROUTINE TO PURIFY A STRUCTURE AND FREEZE ATOMS POINTED TO BY IT.
262 ; TAKES ONE ARGUMENT, THE ITEM TO PURIFY
264 MFUNCTION PURIF,SUBR,[PURIFY]
268 JUMPGE AB,TFA ; CHECK # OF ARGS
272 SKIPE MULTSG ; MUST RUN I 0 SEXTION MODE
276 PUSH P,C%0 ; SLOT TO SEE IF WINNER
279 JRST PURMON ; CHECK FOR PURENESS
280 GETYP A,(C) ; SEE IF ITS MONAD
288 SKIPE 1(C) ; SKIP IF EMPTY
290 PURMON: ADD C,C%22 ; INC AND GO
292 POP P,A ; GET MARKING
294 NPF: MOVE A,(AB) ; FINISH IF MONAD
304 PUSHJ P,LODGC ; LOAD THE GARBAGE COLLECTOR
309 EPURIF: PUSHJ P,KILGC
326 ; ROUTINE TO DO A SPECIAL GARBAGE COLLECT, CALLED FOR FREE STORAGE GARBAGE
328 ; AND CAN RUN A MARK/SWEEP GARBAGE COLLECT
332 JRST @[.+1] ; RETURN WITH US NOW TO THE THRILLING
335 SOSL NUMSWP ; GET NUMBER OF SWEEP GARBAGE COLLECTS
336 JRST MSGC ; TRY MARK/SWEEP
337 MOVE RNUMSP ; MOVE IN RNUMSWP
338 MOVEM NUMSWP ; SMASH IT IN
340 MSGC: SKIPN PGROW ; CHECK FOR STACK OVERFLOW
342 JRST AGC ; IF SO CAUSE REAL GARBAGE COLLECT
346 SETOM SWAPGC ; LOAD MARK SWEEP VERSION
347 PUSHJ P,AGC1 ; CAUSE GARBAGE COLLECT
348 HRRZ 0,MAXLEN ; SEE IF REQUEST SATISFIED
351 MOVE C,FREMIN ; GET FREMIN
352 SUB C,TOTCNT ; CALCULATE NEEDED
356 JSP E,CKPUR ; GO CHECK FOR SOME STUFF
358 IFE ITS, ANDCMI D,1777 ; MAKE LIKE AN ITS PAGE
359 SUB D,CURPLN ; CALCULATE PURENESS
361 CAIG D,(C) ; SEE IF PURENESS EXISTS
385 POP P,21 ; BACK TO CALLING SEGMENT
410 PUSHJ P,SVAC ; SAVE ACS
414 PUSHJ P,LODGC ; LOAD GC
415 PUSHJ P,RSAC ; RESTORE ACS
427 PUSHJ P,SVAC ; SAVE ACS
428 PUSHJ P,LODGC ; LOAD GC
429 PUSHJ P,RSAC ; RESTORE ACS
436 PUSHJ P,SVAC ; SAVE ACS
445 POP P,21 ; BACK TO CALLING SEGMENT
449 ; ROUTINE TO SAVE THE ACS
459 ; ROUTINE TO RESTORE THE ACS
473 ; INTERNAL FUNCTION TO GET STRAGE ALLOCATION TYPE
474 ; GETS THE TYPE CODE IN A AND RETURNS SAT IN A.
476 SAT: LSH A,1 ; TIMES 2 TO REF VECTOR
477 HRLS A ; TO BOTH HALVES TO HACK AOBJN
479 ADD A,TYPVEC+1 ; ACCESS THE VECTOR
480 HRR A,(A) ; GET PROBABLE SAT
481 JUMPL A,.+2 ; DID WE REALLY HAVE A VALID
483 MOVEI A,0 ; NO RETURN 0
487 ; FIND AND ALLOCATE AS MANY CONTIGUOUS PAGES AS INDICATED BY REG A
488 ; RETURN THE NUMBER (0-255.) OF THE FIRST SUCH PAGE IN REG B
489 ; RETURN -1 IN REG B IF NONE FOUND
496 PUSHJ P,PGFND1 ; SEE IF ALREADY ENOUGH
497 SKIPN NOSHUF ; CAN'T MOVE PURNESS
498 SKIPL B ; SKIP IF LOST
505 PGFLO4: MOVE C,PURBOT ; CHECK IF ROOM AT ALL
506 ; (NOTE POTENTIAL FOR INFINITE LOOP)
507 SUB C,P.TOP ; TOTAL SPACE
508 MOVEI D,(C) ; COPY FOR CONVERSION TO PAGES
510 CAIGE D,(A) ; SKIP IF COULD WIN
513 MOVNS A ; MOVE PURE AREA DOWN "A" PAGES
515 MOVE B,PURTOP ; GET FIRST PAGE ALLOCATED
516 ASH B,-10. ; TO PAGE #
520 PUSHJ P,RBLDM ; GET A NEW VALUE FOR M
523 ; HERE TO SHUFFLE PURE SPACE TO TRY TO FIND PAGES
525 PGFLO1: SKIPE GCFLG ; SKIP IF NOT IN GC
526 JRST PGFLO5 ; WE LOST
529 HRRZ D,FSAV(TB) ; ARE WE IN A PURE RSUBR?
530 CAIL D,HIBOT ; ARE WE AN RSUBR AT ALL?
532 GETYP E,(R) ; SEE IF PCODE
535 HLRZ D,1(R) ; GET OFFSET TO PURVEC
537 HRROS 2(D) ; MUNG AGE
538 HLRE D,1(D) ; GET LENGTH
544 IFE ITS, ASH A,1 ; TENEX PAGES ARE HALF SIZE
545 PUSHJ P,GETPAG ; SHUFFLE THEM AROUND
546 FATAL PURE SPACE LOSING
550 ; HERE TO CAUSE AGC IF PAGES ARE NOT AVAILABLE EVEN AFTER MAPPING OUT THE WORLD
553 PGFLO3: PUSH P,A ; ASK GC FOR SPACE
555 MOVEM A,GCDOWN ; REQUEST THOSE PAGES
557 PUSHJ P,AGC ; GO GARBAGE COLLECT
559 JRST PGFLO4 ; GO BACK TO POTENTIAL LOOP
562 PGFLO5: SETOM B ; -1 TO B
563 JRST PGFLOS ; INDICATE LOSSAGE
568 PUSH P,C%M1 ; POSSIBLE CONTENTS FOR REG B
569 PUSH P,A ; SAVE LENGTH OF BLOCK DESIRED FOR LATER USE
570 SETZB B,C ; INITIAL SECTION AND PAGE NUMBERS
571 MOVEI 0,0 ; COUNT OF PAGES ALREADY FOUND
573 PLOOP: TDNE E,D ; FREE PAGE ?
575 JUMPN 0,NFIRST ; FIRST FREE PAGE OF A BLOCK ?
576 MOVEI A,(B) ; YES SAVE ADDRESS OF PAGE IN REG A
578 ASH C,-1 ; BACK TO PAGES
580 ASH C,1 ; FIX IT TO WHAT IT WAS
582 CAML 0,(P) ; TEST IF ENOUGH PAGES HAVE BEEN FOUND
583 JRST PWIN ; YES, FINISHED
585 NOTFRE: MOVEI 0,0 ; RESET COUNT
586 PUSHJ P,PNEXT ; NEXT PAGE
587 JRST PLOSE ; NONE--LOSE RETURNING -1 IN REG B
590 PWIN: MOVEI B,(A) ; GET WINNING ADDRESS
591 MOVEM B,(P)-1 ; RETURN ADDRESS OF WINNING PAGE
592 MOVE A,(P) ; RELOAD LENGTH OF BLOCK OF PAGES
593 MOVE 0,[TDO E,D] ; INST TO SET "BUSY" BITS
596 ; CLAIM OR RETURN TO FREE STORAGE AS MANY CONTIGUOUS PAGES AS INDICATED BY REG A
597 ; THE NUMBER (0 - 255.) OF THE FIRST SUCH PAGE IS IN REG B
598 PGGIVE: MOVE 0,[TDZ E,D] ; INST TO SET "FREE" BITS
600 PGTAKE: MOVE 0,[TDO E,D] ; INST TO SET "BUSY" BITS
613 RTL: XCT 0 ; SET APPROPRIATE BIT
614 PUSHJ P,PNEXT ; NEXT PAGE'S BIT
615 JUMPG A,FPLOSS ; TOO MANY ?
617 MOVEM E,PMAPB(B) ; REPLACE BIT MASK
626 PINIT: MOVE E,PMAPB(B) ; GET BITS FOR THIS SECTION
627 HRLZI D,400000 ; BIT MASK
630 LSH D,(C) ; SHIFT TO APPROPRIATE BIT POSITION
634 PNEXT: AOS (P) ; FOR SKIP RETURN ON EXPECTED SUCCESS
635 LSH D,-2 ; CONSIDER NEXT PAGE
636 CAIL C,30. ; FINISHED WITH THIS SECTION ?
639 AOJA C,CPOPJ ; NO, INCREMENT AND CONTINUE
640 PNEXT1: MOVEM E,PMAPB(B) ; REPLACE BIT MASK
642 CAIGE B,15. ; LAST SECTION ?
643 AOJA B,PINIT ; NO, INCREMENT AND CONTINUE
644 SOS (P) ; YES, UNDO SKIP RETURN
647 FPLOSS: FATAL PAGE LOSSAGE
649 PGINT: MOVEI B,HIBOT ; INITIALIZE MUDDLE'S PAGE MAP TABLE
650 IDIVI B,2000 ; FIRST PAGE OF PURE CODE
654 SUBI A,(B) ; NUMBER OF SUCH PAGES
655 PUSHJ P,PGTAKE ; MARK THESE PAGES AS TAKEN
662 PUSHJ P,KILGC ; KILL THE GARBAGE COLLECTOR
666 ; IF IN A PURE RSUBR, FIND ITS LENGTH AND FUDGE ITS LRU
668 CKPUR: HRRZ A,FSAV(TB) ; GET NAME OF CURRENT GOODIE
669 SETZM CURPLN ; CLEAR FOR NONE
670 CAIL A,HIBOT ; IF LESS THAN TOP OF PURE ASSUME RSUBR
672 GETYP 0,(A) ; SEE IF PURE
673 CAIE 0,TPCODE ; SKIP IF IT IS
675 NRSB2: HLRZ B,1(A) ; GET SLOT INDICATION
676 ADD B,PURVEC+1 ; POINT TO SLOT
677 HRROS 2(B) ; MUNG AGE
678 HLRE A,1(B) ; - LENGTH TO A
680 MOVNM A,CURPLN ; AND STORE
682 NPRSUB: SKIPGE B,1(R) ; SEE IF PURE RSUBR
687 ; THIS IS THE SCHEME USED TO UPDATE CERTAIN IMFORMATION USED BY THE
688 ; BLOAT-SPEC ROUTINE TO GIVE USERS IMFORMATION ABOUT USE OF SPACE BY
691 GCSET: MOVE A,RFRETP ; COMPUTE FREE SPACE AVAILABLE
695 MOVEM A,MAXFRE ; MODIFY MAXIMUM
696 HLRE A,TP ; FIND THE DOPE WORD OF THE TP STACK
698 ADDI A,1(TP) ; CLOSE TO DOPE WORD
700 ADDI A,PDLBUF ; NOW AT REAL DOPE WORD
701 HLRZ B,(A) ; GET LENGTH OF TP-STACK
703 CAMLE B,CTPMX ; SEE IF THIS IS THE BIGGEST TP
705 HLRE B,P ; FIND DOPE WORD OF P-STACK
707 ADDI B,1(P) ; CLOSE TO IT
708 CAME B,PGROW ; SEE IF THE STACK IS BLOWN
709 ADDI B,PDLBUF ; POINTING TO IT
710 HLRZ A,(B) ; GET IN LENGTH
712 CAMLE A,CPMX ; SEE IF WE HAVE THE BIGGEST P STACK
716 RBLDM: JUMPGE R,CPOPJ
717 SKIPGE M,1(R) ; SKIP IF FUNNY
729 RBLDM1: SKIPN SAVM ; SKIP IF FUNNY (M)
740 ; THIS ROUTINE MAKES SURE CURRENT FRAME MAKES SENSE
741 FRMUNG: MOVEM D,PSAV(A)
744 MOVEM TP,TPSAV(A) ; SAVE FOR MARKING
748 ; SUBROUTINE TO REBUILD THE NOW DEFUNCT HASH TABLE
750 REHASH: MOVE D,ASOVEC+1 ; GET POINTER TO VECTOR
752 PUSH P,E ; PUSH A POINTER
753 HLRE A,D ; GET -LENGTH
754 MOVMS A ; AND PLUSIFY
755 PUSH P,A ; PUSH IT ALSO
757 REH3: HRRZ C,(D) ; POINT TO FIRST BUCKKET
758 HLRZS (D) ; MAKE SURE NEW POINTER IS IN RH
759 JUMPLE C,REH1 ; BUCKET EMPTY, QUIT
761 REH2: MOVEI E,(C) ; MAKE A COPY OF THE POINTER
762 MOVE A,ITEM(C) ; START HASHING
763 TLZ A,TYPMSK#777777 ; KILL MONITORS
769 TLZ A,400000 ; MAKE SURE FINAL HASH IS +
770 IDIV A,(P) ; DIVIDE BY TOTAL LENGTH
771 ADD B,-1(P) ; POINT TO WINNING BUCKET
773 MOVE C,[002200,,(B)] ; BYTE POINTER TO RH
774 CAILE B,(D) ; IF PAST CURRENT POINT
775 MOVE C,[222200,,(B)] ; USE LH
776 LDB A,C ; GET OLD VALUE
777 DPB E,C ; STORE NEW VALUE
778 HRRZ B,ASOLNT-1(E) ; GET NEXT POINTER
779 HRRZM A,ASOLNT-1(E) ; AND CLOBBER IN NEW NEXT
780 SKIPE A ; SKKIP IF NOTHING PREVIOUSLY IN BUCKET
781 HRLM E,ASOLNT-1(A) ; OTHERWISE CLOBBER
782 SKIPE C,B ; SKIP IF END OF CHAIN
786 SUB P,C%22 ; FLUSH THE JUNK
789 ;SUBROUTINES TO RETURN WORDS NEEDED BASED ON TYPE OR SAT
791 NWORDT: PUSHJ P,SAT ;GET STORAGE ALLOC TYPE
792 NWORDS: CAIG A,NUMSAT ; TEMPLATE?
793 SKIPL MKTBS(A) ;-ENTRY IN TABLE MEANS 2 NEEDED
794 SKIPA A,C%1 ;NEED ONLY 1
798 .GLOBAL GCRET,PAIRMK,DEFMK,VECTMK,TBMK,TPMK,ARGMK,VECTMK,FRMK,BYTMK,ATOMK,GATOMK
799 .GLOBAL LOCMK,BYTMK,ABMK,LOCRMK,GCRDMK,DEFQMK,ASMRK,OFFSMK
801 ; DISPATCH TABLE FOR MARK PHASE ("SETZ'D" ENTRIES MUST BE DEFERRED)
803 DISTBS MKTBS,GCRET,[[S2WORD,PAIRMK],[S2DEFR,DEFMK],[SNWORD,VECTMK],[STBASE,TBMK]
804 [STPSTK,TPMK],[SARGS,<SETZ ARGMK>],[S2NWORD,VECTMK],[SPSTK,TPMK],[SSTORE,VECTMK]
805 [SFRAME,<SETZ FRMK>],[SBYTE,<SETZ BYTMK>],[SATOM,ATOMK],[SPVP,VECTMK],[SGATOM,GATOMK]
806 [SLOCID,<SETZ LOCMK>],[SCHSTR,<SETZ BYTMK>],[SASOC,ASMRK],[SLOCL,PAIRMK],[SABASE,ABMK]
807 [SLOCA,<SETZ ARGMK>],[SLOCV,VECTMK],[SLOCU,VECTMK],[SLOCS,<SETZ BYTMK>],[SLOCN,ASMRK]
808 [SLOCR,LOCRMK],[SRDTB,GCRDMK],[SLOCB,<SETZ BYTMK>],[SDEFQ,DEFQMK],[SOFFS,OFFSMK]]
812 DSTORE: 0 ; USED FOR MAPFS AND SEGMENTS
813 BUFL: 0 ; BUFFER PAGE (WORDS)
814 BUFP: 0 ; BUFFER PAGE (PAGES)
815 NPWRIT: 0 ; INDICATION OF PURIFY
816 RNUMSP: 0 ; NUMBER OF MARK/SWEEP GARBAGE
817 ; COLLECTS TO REAL GARBAGE COLLECT
818 NUMSWP: 0 ; NUMBER MARK SWEEP GARBAGE COLLECTS TO GO
819 SWAPGC: 0 ; FLAG INDICATING WHETHER TO LOAD SWAP
821 TOTCNT: 0 ; TOTAL COUNT