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
425 PUSHJ P,SVAC ; SAVE ACS
426 PUSHJ P,LODGC ; LOAD GC
427 PUSHJ P,RSAC ; RESTORE ACS
434 PUSHJ P,SVAC ; SAVE ACS
443 POP P,21 ; BACK TO CALLING SEGMENT
447 ; ROUTINE TO SAVE THE ACS
457 ; ROUTINE TO RESTORE THE ACS
471 ; INTERNAL FUNCTION TO GET STRAGE ALLOCATION TYPE
472 ; GETS THE TYPE CODE IN A AND RETURNS SAT IN A.
474 SAT: LSH A,1 ; TIMES 2 TO REF VECTOR
475 HRLS A ; TO BOTH HALVES TO HACK AOBJN
477 ADD A,TYPVEC+1 ; ACCESS THE VECTOR
478 HRR A,(A) ; GET PROBABLE SAT
479 JUMPL A,.+2 ; DID WE REALLY HAVE A VALID
481 MOVEI A,0 ; NO RETURN 0
485 ; FIND AND ALLOCATE AS MANY CONTIGUOUS PAGES AS INDICATED BY REG A
486 ; RETURN THE NUMBER (0-255.) OF THE FIRST SUCH PAGE IN REG B
487 ; RETURN -1 IN REG B IF NONE FOUND
494 PUSHJ P,PGFND1 ; SEE IF ALREADY ENOUGH
495 SKIPN NOSHUF ; CAN'T MOVE PURNESS
496 SKIPL B ; SKIP IF LOST
503 PGFLO4: MOVE C,PURBOT ; CHECK IF ROOM AT ALL
504 ; (NOTE POTENTIAL FOR INFINITE LOOP)
505 SUB C,P.TOP ; TOTAL SPACE
506 MOVEI D,(C) ; COPY FOR CONVERSION TO PAGES
508 CAIGE D,(A) ; SKIP IF COULD WIN
511 MOVNS A ; MOVE PURE AREA DOWN "A" PAGES
513 MOVE B,PURTOP ; GET FIRST PAGE ALLOCATED
514 ASH B,-10. ; TO PAGE #
518 PUSHJ P,RBLDM ; GET A NEW VALUE FOR M
521 ; HERE TO SHUFFLE PURE SPACE TO TRY TO FIND PAGES
523 PGFLO1: SKIPE GCFLG ; SKIP IF NOT IN GC
524 JRST PGFLO5 ; WE LOST
527 HRRZ D,FSAV(TB) ; ARE WE IN A PURE RSUBR?
528 CAIL D,HIBOT ; ARE WE AN RSUBR AT ALL?
530 GETYP E,(R) ; SEE IF PCODE
533 HLRZ D,1(R) ; GET OFFSET TO PURVEC
535 HRROS 2(D) ; MUNG AGE
536 HLRE D,1(D) ; GET LENGTH
542 IFE ITS, ASH A,1 ; TENEX PAGES ARE HALF SIZE
543 PUSHJ P,GETPAG ; SHUFFLE THEM AROUND
544 FATAL PURE SPACE LOSING
548 ; HERE TO CAUSE AGC IF PAGES ARE NOT AVAILABLE EVEN AFTER MAPPING OUT THE WORLD
551 PGFLO3: PUSH P,A ; ASK GC FOR SPACE
553 MOVEM A,GCDOWN ; REQUEST THOSE PAGES
555 PUSHJ P,AGC ; GO GARBAGE COLLECT
557 JRST PGFLO4 ; GO BACK TO POTENTIAL LOOP
560 PGFLO5: SETOM B ; -1 TO B
561 JRST PGFLOS ; INDICATE LOSSAGE
566 PUSH P,C%M1 ; POSSIBLE CONTENTS FOR REG B
567 PUSH P,A ; SAVE LENGTH OF BLOCK DESIRED FOR LATER USE
568 SETZB B,C ; INITIAL SECTION AND PAGE NUMBERS
569 MOVEI 0,0 ; COUNT OF PAGES ALREADY FOUND
571 PLOOP: TDNE E,D ; FREE PAGE ?
573 JUMPN 0,NFIRST ; FIRST FREE PAGE OF A BLOCK ?
574 MOVEI A,(B) ; YES SAVE ADDRESS OF PAGE IN REG A
576 ASH C,-1 ; BACK TO PAGES
578 ASH C,1 ; FIX IT TO WHAT IT WAS
580 CAML 0,(P) ; TEST IF ENOUGH PAGES HAVE BEEN FOUND
581 JRST PWIN ; YES, FINISHED
583 NOTFRE: MOVEI 0,0 ; RESET COUNT
584 PUSHJ P,PNEXT ; NEXT PAGE
585 JRST PLOSE ; NONE--LOSE RETURNING -1 IN REG B
588 PWIN: MOVEI B,(A) ; GET WINNING ADDRESS
589 MOVEM B,(P)-1 ; RETURN ADDRESS OF WINNING PAGE
590 MOVE A,(P) ; RELOAD LENGTH OF BLOCK OF PAGES
591 MOVE 0,[TDO E,D] ; INST TO SET "BUSY" BITS
594 ; CLAIM OR RETURN TO FREE STORAGE AS MANY CONTIGUOUS PAGES AS INDICATED BY REG A
595 ; THE NUMBER (0 - 255.) OF THE FIRST SUCH PAGE IS IN REG B
596 PGGIVE: MOVE 0,[TDZ E,D] ; INST TO SET "FREE" BITS
598 PGTAKE: MOVE 0,[TDO E,D] ; INST TO SET "BUSY" BITS
611 RTL: XCT 0 ; SET APPROPRIATE BIT
612 PUSHJ P,PNEXT ; NEXT PAGE'S BIT
613 JUMPG A,FPLOSS ; TOO MANY ?
615 MOVEM E,PMAPB(B) ; REPLACE BIT MASK
624 PINIT: MOVE E,PMAPB(B) ; GET BITS FOR THIS SECTION
625 HRLZI D,400000 ; BIT MASK
628 LSH D,(C) ; SHIFT TO APPROPRIATE BIT POSITION
632 PNEXT: AOS (P) ; FOR SKIP RETURN ON EXPECTED SUCCESS
633 LSH D,-2 ; CONSIDER NEXT PAGE
634 CAIL C,30. ; FINISHED WITH THIS SECTION ?
637 AOJA C,CPOPJ ; NO, INCREMENT AND CONTINUE
638 PNEXT1: MOVEM E,PMAPB(B) ; REPLACE BIT MASK
640 CAIGE B,15. ; LAST SECTION ?
641 AOJA B,PINIT ; NO, INCREMENT AND CONTINUE
642 SOS (P) ; YES, UNDO SKIP RETURN
645 FPLOSS: FATAL PAGE LOSSAGE
647 PGINT: MOVEI B,HIBOT ; INITIALIZE MUDDLE'S PAGE MAP TABLE
648 IDIVI B,2000 ; FIRST PAGE OF PURE CODE
652 SUBI A,(B) ; NUMBER OF SUCH PAGES
653 PUSHJ P,PGTAKE ; MARK THESE PAGES AS TAKEN
660 PUSHJ P,KILGC ; KILL THE GARBAGE COLLECTOR
664 ; IF IN A PURE RSUBR, FIND ITS LENGTH AND FUDGE ITS LRU
666 CKPUR: HRRZ A,FSAV(TB) ; GET NAME OF CURRENT GOODIE
667 SETZM CURPLN ; CLEAR FOR NONE
668 CAIL A,HIBOT ; IF LESS THAN TOP OF PURE ASSUME RSUBR
670 GETYP 0,(A) ; SEE IF PURE
671 CAIE 0,TPCODE ; SKIP IF IT IS
673 NRSB2: HLRZ B,1(A) ; GET SLOT INDICATION
674 ADD B,PURVEC+1 ; POINT TO SLOT
675 HRROS 2(B) ; MUNG AGE
676 HLRE A,1(B) ; - LENGTH TO A
678 MOVNM A,CURPLN ; AND STORE
680 NPRSUB: SKIPGE B,1(R) ; SEE IF PURE RSUBR
685 ; THIS IS THE SCHEME USED TO UPDATE CERTAIN IMFORMATION USED BY THE
686 ; BLOAT-SPEC ROUTINE TO GIVE USERS IMFORMATION ABOUT USE OF SPACE BY
689 GCSET: MOVE A,RFRETP ; COMPUTE FREE SPACE AVAILABLE
693 MOVEM A,MAXFRE ; MODIFY MAXIMUM
694 HLRE A,TP ; FIND THE DOPE WORD OF THE TP STACK
696 ADDI A,1(TP) ; CLOSE TO DOPE WORD
698 ADDI A,PDLBUF ; NOW AT REAL DOPE WORD
699 HLRZ B,(A) ; GET LENGTH OF TP-STACK
701 CAMLE B,CTPMX ; SEE IF THIS IS THE BIGGEST TP
703 HLRE B,P ; FIND DOPE WORD OF P-STACK
705 ADDI B,1(P) ; CLOSE TO IT
706 CAME B,PGROW ; SEE IF THE STACK IS BLOWN
707 ADDI B,PDLBUF ; POINTING TO IT
708 HLRZ A,(B) ; GET IN LENGTH
710 CAMLE A,CPMX ; SEE IF WE HAVE THE BIGGEST P STACK
714 RBLDM: JUMPGE R,CPOPJ
715 SKIPGE M,1(R) ; SKIP IF FUNNY
727 RBLDM1: SKIPN SAVM ; SKIP IF FUNNY (M)
738 ; THIS ROUTINE MAKES SURE CURRENT FRAME MAKES SENSE
739 FRMUNG: MOVEM D,PSAV(A)
742 MOVEM TP,TPSAV(A) ; SAVE FOR MARKING
746 ; SUBROUTINE TO REBUILD THE NOW DEFUNCT HASH TABLE
748 REHASH: MOVE D,ASOVEC+1 ; GET POINTER TO VECTOR
750 PUSH P,E ; PUSH A POINTER
751 HLRE A,D ; GET -LENGTH
752 MOVMS A ; AND PLUSIFY
753 PUSH P,A ; PUSH IT ALSO
755 REH3: HRRZ C,(D) ; POINT TO FIRST BUCKKET
756 HLRZS (D) ; MAKE SURE NEW POINTER IS IN RH
757 JUMPLE C,REH1 ; BUCKET EMPTY, QUIT
759 REH2: MOVEI E,(C) ; MAKE A COPY OF THE POINTER
760 MOVE A,ITEM(C) ; START HASHING
761 TLZ A,TYPMSK#777777 ; KILL MONITORS
767 TLZ A,400000 ; MAKE SURE FINAL HASH IS +
768 IDIV A,(P) ; DIVIDE BY TOTAL LENGTH
769 ADD B,-1(P) ; POINT TO WINNING BUCKET
771 MOVE C,[002200,,(B)] ; BYTE POINTER TO RH
772 CAILE B,(D) ; IF PAST CURRENT POINT
773 MOVE C,[222200,,(B)] ; USE LH
774 LDB A,C ; GET OLD VALUE
775 DPB E,C ; STORE NEW VALUE
776 HRRZ B,ASOLNT-1(E) ; GET NEXT POINTER
777 HRRZM A,ASOLNT-1(E) ; AND CLOBBER IN NEW NEXT
778 SKIPE A ; SKKIP IF NOTHING PREVIOUSLY IN BUCKET
779 HRLM E,ASOLNT-1(A) ; OTHERWISE CLOBBER
780 SKIPE C,B ; SKIP IF END OF CHAIN
784 SUB P,C%22 ; FLUSH THE JUNK
787 ;SUBROUTINES TO RETURN WORDS NEEDED BASED ON TYPE OR SAT
789 NWORDT: PUSHJ P,SAT ;GET STORAGE ALLOC TYPE
790 NWORDS: CAIG A,NUMSAT ; TEMPLATE?
791 SKIPL MKTBS(A) ;-ENTRY IN TABLE MEANS 2 NEEDED
792 SKIPA A,C%1 ;NEED ONLY 1
796 .GLOBAL GCRET,PAIRMK,DEFMK,VECTMK,TBMK,TPMK,ARGMK,VECTMK,FRMK,BYTMK,ATOMK,GATOMK
797 .GLOBAL LOCMK,BYTMK,ABMK,LOCRMK,GCRDMK,DEFQMK,ASMRK,OFFSMK
799 ; DISPATCH TABLE FOR MARK PHASE ("SETZ'D" ENTRIES MUST BE DEFERRED)
801 DISTBS MKTBS,GCRET,[[S2WORD,PAIRMK],[S2DEFR,DEFMK],[SNWORD,VECTMK],[STBASE,TBMK]
802 [STPSTK,TPMK],[SARGS,<SETZ ARGMK>],[S2NWORD,VECTMK],[SPSTK,TPMK],[SSTORE,VECTMK]
803 [SFRAME,<SETZ FRMK>],[SBYTE,<SETZ BYTMK>],[SATOM,ATOMK],[SPVP,VECTMK],[SGATOM,GATOMK]
804 [SLOCID,<SETZ LOCMK>],[SCHSTR,<SETZ BYTMK>],[SASOC,ASMRK],[SLOCL,PAIRMK],[SABASE,ABMK]
805 [SLOCA,<SETZ ARGMK>],[SLOCV,VECTMK],[SLOCU,VECTMK],[SLOCS,<SETZ BYTMK>],[SLOCN,ASMRK]
806 [SLOCR,LOCRMK],[SRDTB,GCRDMK],[SLOCB,<SETZ BYTMK>],[SDEFQ,DEFQMK],[SOFFS,OFFSMK]]
810 DSTORE: 0 ; USED FOR MAPFS AND SEGMENTS
811 BUFL: 0 ; BUFFER PAGE (WORDS)
812 BUFP: 0 ; BUFFER PAGE (PAGES)
813 NPWRIT: 0 ; INDICATION OF PURIFY
814 RNUMSP: 0 ; NUMBER OF MARK/SWEEP GARBAGE
815 ; COLLECTS TO REAL GARBAGE COLLECT
816 NUMSWP: 0 ; NUMBER MARK SWEEP GARBAGE COLLECTS TO GO
817 SWAPGC: 0 ; FLAG INDICATING WHETHER TO LOAD SWAP
819 TOTCNT: 0 ; TOTAL COUNT