mirror of
https://github.com/PDP-10/its.git
synced 2026-01-15 08:03:19 +00:00
3635 lines
83 KiB
Plaintext
3635 lines
83 KiB
Plaintext
TITLE AGC MUDDLE GARBAGE COLLECTOR
|
||
|
||
;SYSTEM WIDE DEFINITIONS GO HERE
|
||
|
||
RELOCATABLE
|
||
GCST==$.
|
||
|
||
|
||
.GLOBAL RCL,VECTOP,GCSTOP,GCSBOT,FRETOP,GCSNEW,VECBOT,PARTOP,PARBOT,HITOP,HIBOT,GETPAG
|
||
.GLOBAL PDLBUF,PDLEX,PDLEXP,GCFLG,GCPDL,GETNUM,PARNEW,MOVPUR,RCLV,RCLVEC,PGCNT
|
||
.GLOBAL PGROW,TPGROW,MAINPR,MSGTYP,PURTOP,PURBOT,STOSTR,GCSET,CKPUR
|
||
.GLOBAL MTYI,UPLO,FRMUNG,BYTDOP,GLOBSP,FREDIF,FREMIN,GCHAPN,INTFLG,FINAGC,NGCS,INQAGC
|
||
.GLOBAL SAT,TTOCHN,TYPVEC,ICONS,INCONS,IBLOCK,IEUVEC,IEVECTI,CELL2,MKTBS,RLENGC
|
||
.GLOBAL GIBLOK,REHASH,IBLOK1,IILIST,IIFORM,CIVEC,CIUVEC,CICONS,CPOPJ,RBLDM,GCOFFS
|
||
.GLOBAL SPBASE,OUTRNG,CISTNG,CBYTES,%RUNAM,PURVEC,GCDOWN,N.CHNS,CHNL1,PLODR,MRKPDL
|
||
.GLOBAL CAFRE,CAFRET,STOGC,GCHN,WNDP,FRNP,FRONT,%GCJOB,%SHWND,%INFMP,%GETIP,CHKPGI
|
||
.GLOBAL TD.PUT,TD.GET,TD.AGC,TD.AGC,TD.LNT,GLOTOP,UBIT,FLGSET,PURMNG,RPURBT,%IFMP2
|
||
.GLOBAL CTIME,IMTYO,ILOC,NODES,GPURFL,GCDANG,GCHACK,LPUR,HITOP,BADCHN,IMPURX,PURCLN
|
||
.GLOBAL GCTIM,GCCAUS,GCCALL,IAAGC,LVLINC,STORIC,GVLINC,TYPIC,GCRSET,ACCESS,NOSHUF,SQUPNT
|
||
; GLOBALS ASSOCIATE WITH THE ASSOCIATION VECTOR
|
||
|
||
.GLOBAL ASOVEC,ASOLNT,ITEM,INDIC,VAL,NWORDT,NODPNT,PNTRS,DSTORE,HASHTB
|
||
.GLOBAL CELL,BINDID,GCFLCH,TYPBOT,GLOBAS,TPBASE,NOWLVL,CURPLN,PVSTOR,SPSTOR
|
||
|
||
.GLOBAL P.TOP,P.CORE,PMAPB,IGET,CIGTPR,ROOT,STBL,CAFREE,%MPIN1,%PURIF,%MPINX,GCHK10
|
||
.GLOBAL %SAVRP,%RSTRP,LENGC,AGCLD,PAGEGC,REALGC,MARK
|
||
.GLOBAL %MPINT,%GBINT,%CLSMP,%CLSM1,PINIT,PGFIND,NPRFLG,%PURMD
|
||
.GLOBAL GCKNUM,CORTOP,GCHPN,INTAGC,WNDP,WNDBOT,BUFGC,WIND,GCDFLG,SAVM,AGC,GCSET
|
||
|
||
.GLOBAL GCRET,PAIRMK,DEFMK,VECTMK,TBMK,TPMK,ARGMK,VECTMK,FRMK,BYTMK,ATOMK,GATOMK
|
||
.GLOBAL BYTMK,ABMK,LOCRMK,GCRDMK,DEFQMK,ASMRK,LOCMK,OFFSMK,INBLOT,MARK2A
|
||
|
||
NOPAGS==1 ; NUMBER OF WINDOWS
|
||
EOFBIT==1000
|
||
PDLBUF=100
|
||
NTPMAX==20000 ; NORMAL MAX TP SIZE
|
||
NTPGOO==4000 ; NORMAL GOOD TP
|
||
ETPMAX==2000 ; TPMAX IN AN EMERGENCY (I.E. GC RECALL)
|
||
ETPGOO==2000 ; GOOD TP IN EMERGENCY
|
||
|
||
.ATOM.==200000 ; FLAG SAYING ATOMS MARKED (FOR VAL FLUSH LOGIC)
|
||
|
||
GCHN==0 ; CHANNEL FOR FUNNNY INFERIOR
|
||
STATNO==19. ; # OF STATISTICS FOR BLOAT-STAT
|
||
STATGC==8. ; # OF GC-STATISTICS FOR BLOAT-STAT
|
||
|
||
|
||
LOC REALGC
|
||
OFFS==AGCLD-$.
|
||
GCOFFS=OFFS
|
||
OFFSET OFFS
|
||
|
||
.INSRT MUDDLE >
|
||
SYSQ
|
||
IFE ITS,[
|
||
.INSRT STENEX >
|
||
]
|
||
IFN ITS, PGSZ==10.
|
||
IFE ITS, PGSZ==9.
|
||
|
||
TYPNT=AB ;SPECIAL AC USAGE DURING GC
|
||
F=TP ;ALSO SPECIAL DURING GC
|
||
LPVP=SP ;SPECIAL FOR GC, HOLDS POINTER TO PROCESS CHAIN
|
||
FPTR=TB ; POINT TO CURRENT FRONTIER OF INFERIOR
|
||
|
||
|
||
; WINDOW AND FRONTIER PAGES
|
||
|
||
MAPCH==0 ; MAPPING CHANNEL
|
||
.LIST.==400000
|
||
FPAG==2000 ; START OF PAGES FOR GC-READ AND GCDUMP
|
||
CONADJ==5 ; ADJUSTMENT OF DUMPERS CONSTANT TABLE
|
||
|
||
|
||
; INTERNAL GCDUMP ROUTINE
|
||
.GLOBAL GODUMP,EGCDUM,EPURIF,ERRKIL,IPURIF
|
||
|
||
GODUMP: MOVE PVP,PVSTOR+1
|
||
MOVEM P,PSTO+1(PVP) ; SAVE P
|
||
MOVE P,GCPDL
|
||
PUSH P,AB
|
||
PUSHJ P,INFSU1 ; SET UP INFERIORS
|
||
|
||
; MARK PHASE
|
||
SETZM PURMNG ; INITIALIZE FLAG INDICATING IF PURIFIED PAGES
|
||
; WERE MUNGED
|
||
MOVEI 0,HIBOT ; SET UP NEW PURBOT TO CONVINCE THE GARBAGE COLLECTOR
|
||
; TO COLLECT PURIFIED STRUCTURES
|
||
EXCH 0,PURBOT
|
||
MOVEM 0,RPURBT ; SAVE THE OLD PURBOT
|
||
MOVEI 0,HIBOT
|
||
EXCH 0,GCSTOP
|
||
MOVEM 0,RGCSTP ; SAVE THE OLD GCSTOP
|
||
POP P,C ; SET UP PTR TO TYPE/VALUE PAIR
|
||
MOVE P,A ; GET NEW PDL PTR
|
||
SETOM DUMFLG ; FLAG INDICATING IN DUMPER
|
||
MOVE A,TYPVEC+1
|
||
MOVEM A,TYPSAV
|
||
ADD FPTR,[7,,7] ; ADJUST FOR FIRST STATUS WORDS
|
||
PUSHJ P,MARK2
|
||
MOVEI E,FPAG+6 ; SEND OUT PAIR
|
||
PUSH P,C ; SAVE C
|
||
MOVE C,A
|
||
PUSHJ P,ADWD
|
||
POP P,C ; RESTORE C
|
||
MOVEI E,FPAG+5
|
||
MOVE C,(C) ; SEND OUT UPDATED PTR
|
||
PUSHJ P,ADWD
|
||
|
||
MOVEI 0,@BOTNEW ; CALCULATE START OF TYPE-TABLE
|
||
MOVEM 0,TYPTAB
|
||
MOVE 0,RPURBT ; RESTORE PURBOT
|
||
MOVEM 0,PURBOT
|
||
MOVE 0,RGCSTP ; RESTORE GCSTOP
|
||
MOVEM 0,GCSTOP
|
||
|
||
|
||
; ROUTINE TO SCAN THE TYPE-VECTOR FOR MARKED TYPE SLOTS AND BUILD A TYPE-TABLE OUT OF
|
||
; THEM
|
||
|
||
MOVE A,TYPSAV ; GET AOBJN POINTER TO TYPE-VECTOR
|
||
MOVEI B,0 ; INITIALIZE TYPE COUNT
|
||
TYPLP2: HLRE C,(A) ; GET MARKING
|
||
JUMPGE C,TYPLP1 ; IF NOT MARKED DON'T OUTPUT
|
||
MOVE C,(A) ; GET FIRST WORD
|
||
HRL C,B ; FIX UP SO TYPE-NUMBER REPLACES TYPE-CELL
|
||
PUSH P,A
|
||
SKIPL FPTR
|
||
PUSHJ P,MOVFNT
|
||
MOVEM C,FRONT(FPTR)
|
||
AOBJN FPTR,.+2
|
||
PUSHJ P,MOVFNT ; EXTEND THE FRONTIER
|
||
POP P,A
|
||
MOVE C,1(A) ; OUTPUT SECOND WORD
|
||
MOVEM C,FRONT(FPTR)
|
||
ADD FPTR,[1,,1]
|
||
TYPLP1: ADDI B,1 ; INCREMENT TYPE COUNT
|
||
ADD A,[2,,2] ; POINT TO NEXT SLOT
|
||
JUMPL A,TYPLP2 ; LOOP
|
||
|
||
; ROUTINE TO BUILD UP ATOM TABLE USING LPVP CHAIN
|
||
|
||
HRRZ F,ABOTN
|
||
MOVEI 0,@BOTNEW ; GET CURRENT BEGINNING OF TRANSFER
|
||
MOVEM 0,ABOTN ; SAVE IT
|
||
PUSHJ P,ALLOGC ; ALLOCATE ROOM FOR ATOMS
|
||
MOVSI D,400000 ; SET UP UNMARK BIT
|
||
SPOUT: JUMPE LPVP,DPGC4 ; END OF CHAIN
|
||
MOVEI F,(LPVP) ; GET COPY OF LPVP
|
||
HRRZ LPVP,-1(LPVP) ; LPVP POINTS TO NEXT ON CHAIN
|
||
ANDCAM D,(F) ; UNMARK IT
|
||
HLRZ C,(F) ; GET LENGTH
|
||
HRRZ E,(F) ; POINTER INTO INF
|
||
ADD E,ABOTN
|
||
SUBI C,2 ; WE'RE NOT SENDING OUT THE VALUE PAIR
|
||
HRLM C,(F) ; ADJUSTED LENGTH
|
||
MOVE 0,C ; COPY C FOR TRBLKX
|
||
SUBI E,(C) ; ADJUST PTRS FOR SENDOUT
|
||
SUBI F,-1(C)
|
||
PUSHJ P,TRBLKX ; OUT IT GOES
|
||
JRST SPOUT
|
||
|
||
|
||
; HERE TO SEND OUT DELIMITER INFORMATION
|
||
DPGC4: SKIPN INCORF ; SKIP IF TRANSFREING TO UVECTOR IN CORE
|
||
JRST CONSTO
|
||
SKIPL FPTR ; SEE IF ROOM IN FRONTEIR
|
||
PUSHJ P,MOVFNT ; EXTEND FRONTEIR
|
||
MOVSI A,.VECT.
|
||
MOVEM A,FRONT(FPTR)
|
||
AOBJN FPTR,.+2
|
||
PUSHJ P,MOVFNT
|
||
MOVEI A,@BOTNEW ; LENGTH
|
||
SUBI A,FPAG
|
||
HRLM A,FRONT(FPTR)
|
||
ADD FPTR,[1,,1]
|
||
|
||
|
||
CONSTO: MOVEI E,FPAG
|
||
MOVE C,ABOTN ; START OF ATOMS
|
||
SUBI C,FPAG+CONADJ ; ADJUSTMENT FOR STARTING ON PAGE ONE
|
||
PUSHJ P,ADWD ; OUT IT GOES
|
||
MOVEI E,FPAG+1
|
||
MOVEI C,@BOTNEW
|
||
SUBI C,FPAG+CONADJ
|
||
SKIPE INCORF ; SKIP IF TO CHANNEL
|
||
SUBI C,2 ; SUBTRACT FOR DOPE WORDS
|
||
PUSHJ P,ADWD
|
||
SKIPE INCORF
|
||
ADDI C,2 ; RESTORE C TO REAL ABOTN
|
||
ADDI C,CONADJ
|
||
PUSH P,C
|
||
MOVE C,TYPTAB
|
||
SUBI C,FPAG+CONADJ
|
||
MOVEI E,FPAG+2 ; SEND OUT START OF TYPE TABLE
|
||
PUSHJ P,ADWD
|
||
ADDI E,1 ; SEND OUT NUMPRI
|
||
MOVEI C,NUMPRI
|
||
PUSHJ P,ADWD
|
||
ADDI E,1 ; SEND OUT NUMSAT
|
||
MOVEI C,NUMSAT
|
||
PUSHJ P,ADWD
|
||
|
||
|
||
|
||
; FINAL CLOSING OF INFERIORS
|
||
|
||
DPCLS: PUSH P,PGCNT
|
||
PUSHJ P,INFCL1
|
||
POP P,PGCNT
|
||
POP P,A ; LENGTH OF CODE
|
||
|
||
; RESTORE AC'S
|
||
MOVE PVP,PVSTOR+1
|
||
IRP AC,,[P,TP,TB,AB,FRM]
|
||
MOVE AC,AC!STO+1(PVP)
|
||
TERMIN
|
||
|
||
SETZB M,R
|
||
SETZM DUMFLG
|
||
SETZM GCDFLG ; ZERO FLAG INDICATING IN DUMPER
|
||
SETZM GCFLG ; AND INDICTOR TO INTERRUPT HANDLER THAT AGC IS ON
|
||
PUSH P,A
|
||
MOVE A,INF2 ; GET POINTER TO PURE MAPPED OUT
|
||
PUSHJ P,%GBINT
|
||
|
||
POP P,A
|
||
JRST EGCDUM
|
||
|
||
|
||
ERDP: PUSH P,B
|
||
PUSHJ P,INFCLS
|
||
PUSHJ P,INFCL1
|
||
SETZM GCFLG
|
||
SETZM GPURFL ; PURE FLAG
|
||
SETZM DUMFLG
|
||
SETZM GCDFLG
|
||
POP P,A
|
||
|
||
; RESTORE AC'S
|
||
MOVE PVP,PVSTOR+1
|
||
IRP AC,,[P,R,M,TP,TB,AB,FRM]
|
||
MOVE AC,AC!STO+1(PVP)
|
||
TERMIN
|
||
|
||
ERDUMP: PUSH TP,$TATOM
|
||
|
||
OFFSET 0
|
||
|
||
PUSH TP,EQUOTE STRUCTURE-CONTAINS-UNDUMPABLE-TYPE
|
||
|
||
OFFSET OFFS
|
||
|
||
PUSH TP,$TATOM ; PUSH ON PRIMTYPE
|
||
PUSH TP,@STBL(A) ; PUSH ON PRIMTYPE
|
||
MOVEI A,2
|
||
JRST ERRKIL
|
||
|
||
; ALTERNATE ATOM MARKER FOR DUMPER
|
||
|
||
DATOMK: SKIPE GPURFL ; SKIP IF NOT IN PURIFIER
|
||
JRST PATOMK
|
||
CAILE A,0 ; SEE IF ALREADY MARKED
|
||
JRST GCRET
|
||
PUSH P,A ; SAVE PTR TO ATOM
|
||
HLRE B,A ; POINT TO DOPE WORD
|
||
SUB A,B ; TO FIRST DOPE WORD
|
||
MOVEI A,1(A) ; TO SECOND
|
||
PUSH P,A ; SAVE PTR TO DOPE WORD
|
||
HLRZ B,(A) ; GET LENGTH AND MARKING
|
||
TRZE B,400000 ; TURN OFF BIT AND SKIP IF UNMARKED
|
||
JRST DATMK1
|
||
IORM D,(A) ; MARK IT
|
||
MOVE 0,ABOTN ; GET CURRENT TOP OF ATOM TABLE
|
||
ADDI 0,-2(B) ; PLACE OF DOPE WORD IN TABLE
|
||
HRRM 0,(A) ; PUT IN RELOCATION
|
||
MOVEM 0,ABOTN ; FIXUP TOP OF TABLE
|
||
HRRM LPVP,-1(A) ; FIXUP CHAIN
|
||
MOVEI LPVP,(A)
|
||
MOVE A,-1(P) ; GET POINTER TO ATOM BACK
|
||
HRRZ B,2(A) ; GET OBLIST POINTER
|
||
JUMPE B,NOOB ; IF ZERO ON NO OBLIST
|
||
CAMG B,VECBOT ; DON'T SKIP IF OFFSET FROM TVP
|
||
MOVE B,(B)
|
||
HRLI B,-1
|
||
DATMK3: MOVE A,$TOBLS ; SET UP FOR GET
|
||
MOVE C,$TATOM
|
||
|
||
OFFSET 0
|
||
MOVE D,IMQUOTE OBLIST
|
||
|
||
OFFSET OFFS
|
||
|
||
PUSH P,TP ; SAVE FPTR
|
||
MOVE TP,MAINPR
|
||
MOVE TP,TPSTO+1(TP) ; GET TP
|
||
PUSHJ P,IGET
|
||
POP P,TP ; RESTORE FPTR
|
||
MOVE C,-1(P) ; RECOVER PTR TO ATOM
|
||
ADDI C,1 ; SET UP TO MARK OBLIST ATOM
|
||
MOVSI D,400000 ; RESTORE MARK WORD
|
||
|
||
OFFSET 0
|
||
|
||
CAMN B,MQUOTE ROOT
|
||
|
||
OFFSET OFFS
|
||
|
||
JRST RTSET
|
||
MOVEM B,1(C)
|
||
MOVEI B,TATOM
|
||
PUSHJ P,MARK1 ; MARK IT
|
||
MOVEM A,1(C) ; SMASH IN ITS ID
|
||
DATMK1:
|
||
NOOB: POP P,A ; GET PTR TO DOPE WORD BACK
|
||
HRRZ A,(A) ; RETURN ID
|
||
SUB P,[1,,1] ; CLEAN OFF STACK
|
||
MOVEM A,(P)
|
||
JRST GCRET ; EXIT
|
||
|
||
; HERE FOR A ROOT ATOM
|
||
RTSET: SETOM 1(C) ; INDICATOR OF ROOT ATOM
|
||
JRST NOOB ; CONTINUE
|
||
|
||
|
||
; INTERNAL PURIFY ROUTINE
|
||
; SAVE AC's
|
||
|
||
IPURIF: PUSHJ P,PURCLN ; GET RID OF PURE MAPPED
|
||
MOVE PVP,PVSTOR+1
|
||
IRP AC,,[P,R,M,TP,TB,AB,FRM]
|
||
MOVEM AC,AC!STO"+1(PVP)
|
||
TERMIN
|
||
|
||
|
||
; HERE TO CREATE INFERIORS AND MARK THE ITEM
|
||
PURIT1: MOVE PVP,PVSTOR+1
|
||
MOVEM P,PSTO+1(PVP) ; SAVE P
|
||
SETOM GPURFL ; INDICATE PURIFICATION IS TAKING PLACE
|
||
MOVE C,AB ; ARG PAIR
|
||
MOVEM C,SAVRS1 ; SAV PTR TO PAIR
|
||
MOVE P,GCPDL
|
||
PUSHJ P,INFSUP ; GET INFERIORS
|
||
MOVE P,A ; GET NEW PDL PTR
|
||
PUSHJ P,%SAVRP ; SAVE RPMAP TABLE FOR TENEX
|
||
MOVE C,SAVRS1 ; SET UP FOR MARKING
|
||
MOVE A,(C) ; GET TYPE WORD
|
||
MOVEM A,SAVRE2
|
||
PURIT3: PUSH P,C
|
||
PUSHJ P,MARK2
|
||
PURIT4: POP P,C ; RESTORE C
|
||
ADD C,[2,,2] ; TO NEXT ARG
|
||
JUMPL C,PURIT3
|
||
MOVEM A,SAVRES ; SAVE UPDATED POINTER
|
||
|
||
; FIX UP IMPURE PART OF ATOM CHAIN
|
||
|
||
PUSH P,[0] ; FLAG INDICATING NON PURE SCAN
|
||
PUSHJ P,FIXATM
|
||
SUB P,[1,,1] ; CLEAN OFF STACK
|
||
|
||
; NOW TO GET PURE STORAGE
|
||
|
||
PURIT2: MOVEI A,@BOTNEW ; GET BOTNEW
|
||
SUBI A,2000-1777 ; START AT PAGE 1 AND ROUND
|
||
ANDCMI A,1777
|
||
ASH A,-10. ; TO PAGES
|
||
SETZ M,
|
||
PUSH P,A
|
||
PUSHJ P,PGFIND ; FIND THEM
|
||
JUMPL B,LOSLP2 ; LOST GO TO CAUSE AGC
|
||
HRRZ 0,BUFGC ;GET BUFFER PAGE
|
||
ASH 0,-10.
|
||
MOVEI A,(B) ; GET LOWER PORTION OF PAGES
|
||
MOVN C,(P)
|
||
SUBM A,C ; GET END PAGE
|
||
CAIL 0,(A) ; L? LOWER
|
||
CAILE 0,(C) ; G? HIGER
|
||
JRST NOREMP ; DON'T GET NEW BUFFER
|
||
PUSHJ P,%FDBUF ; GET A NEW BUFFER PAGE
|
||
NOREMP: MOVN A,(P) ; SET UP AOBJN PTR FOR MAPIN
|
||
MOVE C,B ; SAVE B
|
||
HRL B,A
|
||
HRLZS A
|
||
ADDI A,1
|
||
MOVEM B,INF3 ; SAVE PTR FOR PURIFICATION
|
||
PUSHJ P,%MPIN1 ; MAP IT INTO PURE
|
||
ASH C,10. ; TO WORDS
|
||
MOVEM C,MAPUP
|
||
SUB P,[1,,1] ; CLEAN OFF STACK
|
||
|
||
DONMAP:
|
||
; RESTORE AC's
|
||
MOVE PVP,PVSTOR+1
|
||
MOVE P,PSTO+1(PVP) ; GET REAL P
|
||
PUSH P,LPVP
|
||
MOVEI A,@BOTNEW
|
||
MOVEM A,NABOTN
|
||
|
||
IRP AC,,[M,TP,TB,R,FRM]
|
||
MOVE AC,AC!STO+1(PVP)
|
||
TERMIN
|
||
MOVE A,INF1
|
||
|
||
; NOW FIX UP POINTERS IN PURE STRUCTURE
|
||
MOVE 0,GCSBOT
|
||
MOVEM 0,OGCSTP
|
||
PUSH P,GCSBOT ; SAVE GCSBOT AND GCSTOP
|
||
PUSH P,GCSTOP
|
||
MOVE A,MAPUP ; NEW GCSBOT AND TOP TO FOOL GCHACK
|
||
MOVEM A,GCSBOT
|
||
ADD A,NABOTN
|
||
SUBI A,2000 ; ADJUSTMENT FOR START ON PAGE ONE
|
||
MOVEM A,GCSTOP
|
||
MOVE A,[PUSHJ P,NPRFIX]
|
||
MOVEI PVP,0 ; SAY MIGHT BE NON-ATOMS
|
||
PUSHJ P,GCHK10
|
||
POP P,GCSTOP
|
||
POP P,GCSBOT
|
||
|
||
; NOW FIX UP POINTERS TO PURIFIED STRUCTURE
|
||
|
||
MOVE A,[PUSHJ P,PURFIX]
|
||
MOVEI PVP,0 ; SAY MIGHT BE NON-ATOMS
|
||
PUSHJ P,GCHACK
|
||
|
||
SETZM GCDFLG
|
||
SETZM DUMFLG
|
||
SETZM GCFLG
|
||
|
||
POP P,LPVP ; GET BACK LPVP
|
||
MOVE A,INF1
|
||
PUSHJ P,%KILJB ; KILL IMAGE SAVING INFERIOR
|
||
PUSH P,[-1] ; INDICATION OF PURE ATOM SCAN
|
||
PUSHJ P,FIXATM
|
||
|
||
; SET UP PMAP SO THAT NEW PURE PAGES ARE INDICATED
|
||
|
||
MOVE A,INF3 ; GET AOBJN PTR TO PAGES
|
||
FIXPMP: HRRZ B,A ; GET A PAGE
|
||
IDIVI B,16. ; DIVIDE SO AS TO PT TO PMAP WORD
|
||
PUSHJ P,PINIT ; SET UP PARAMETER
|
||
LSH D,-1
|
||
TDO E,D ; FIX UP WORD
|
||
MOVEM E,PMAPB(B) ; SEND IT BACK
|
||
AOBJN A,FIXPMP
|
||
|
||
SUB P,[1,,1]
|
||
MOVE A,[PUSHJ P,PURTFX] ; FIX UP PURE ATOM POINTERS
|
||
MOVEI PVP,1 ; SAY MIGHT BE NON-ATOMS
|
||
PUSHJ P,GCHACK
|
||
|
||
; NOW FIX UP POINTERS IN PURE STRUCTURE
|
||
PUSH P,GCSBOT ; SAVE GCSBOT AND GCSTOP
|
||
PUSH P,GCSTOP
|
||
MOVE A,MAPUP ; NEW GCSBOT AND TOP TO FOOL GCHACK
|
||
MOVEM A,GCSBOT
|
||
ADD A,NABOTN
|
||
SUBI A,2000 ; ADJUSTMENT FOR START ON PAGE ONE
|
||
MOVEM A,GCSTOP
|
||
MOVE A,[PUSHJ P,PURTFX]
|
||
MOVEI PVP,1 ; SAY MIGHT BE NON-ATOMS
|
||
PUSHJ P,GCHK10
|
||
POP P,GCSTOP
|
||
POP P,GCSBOT
|
||
|
||
; HERE TO FIX UP ATOMS WITH TYPES HACKED INTO THEIR GROWTH FIELD
|
||
|
||
MOVE A,TYPVEC+1 ; GET TYPE VECTOR
|
||
MOVEI B,400000 ; TLOSE==0
|
||
TTFIX: HRRZ D,1(A) ; GET ADDR
|
||
HLRE C,1(A)
|
||
SUB D,C
|
||
HRRM B,(D) ; SMASH IT IN
|
||
NOTFIX: ADDI B,1 ; NEXT TYPE
|
||
ADD A,[2,,2]
|
||
JUMPL A,TTFIX
|
||
|
||
; NOW CLOSE UP INFERIORS AND RETURN
|
||
|
||
PURCLS: MOVE P,[-2000,,MRKPDL]
|
||
PUSHJ P,%RSTRP ;RESETORE RPMAP TABLE FOR TENEX
|
||
PUSHJ P,INFCLS
|
||
|
||
MOVE PVP,PVSTOR+1
|
||
MOVE P,PSTO+1(PVP) ; RESTORE P
|
||
MOVE AB,ABSTO+1(PVP) ; RESTORE R
|
||
|
||
MOVE A,INF3 ; GET PTR TO PURIFIED STRUCTURE
|
||
SKIPN NPRFLG
|
||
PUSHJ P,%PURIF ; PURIFY
|
||
IFE ITS, PUSHJ P,%PURMD
|
||
|
||
SETZM GPURFL
|
||
JRST EPURIF ; FINISH UP
|
||
|
||
NPRFIX: PUSH P,A
|
||
PUSH P,B
|
||
PUSH P,C
|
||
EXCH A,C
|
||
PUSHJ P,SAT ; GET STORAGE ALLOCATION TYPE
|
||
MOVE C,MAPUP ; FIXUP AMOUNT
|
||
SUBI C,FPAG ; ADJUST FOR START ON FIRST PAGE
|
||
CAIE A,SLOCR ; DONT HACK TLOCRS
|
||
CAIN A,S1WORD ; SKIP IF NOT OF PRIMTYPE WORD
|
||
JRST LSTFXP
|
||
CAIN A,SCHSTR
|
||
JRST STRFXP
|
||
CAIN A,SATOM
|
||
JRST ATMFXP
|
||
CAIN A,SOFFS
|
||
JRST OFFFXP ; FIXUP OFFSETS
|
||
STRFXQ: HRRZ D,1(B)
|
||
JUMPE D,LSTFXP ; SKIP IF NIL
|
||
CAMG D,PURTOP ; SEE IF ALREADY PURE
|
||
ADDM C,1(B)
|
||
LSTFXP: TLNN B,.LIST. ; SKIP IF NOT A PAIR
|
||
JRST LSTEX1
|
||
HRRZ D,(B) ; GET REST OF LIST
|
||
SKIPE D ; SKIP IF POINTS TO NIL
|
||
PUSHJ P,RLISTQ
|
||
JRST LSTEX1
|
||
CAMG D,PURTOP ; SKIP IF ALREADY PURE
|
||
ADDM C,(B) ; FIX UP LIST
|
||
LSTEX1: POP P,C
|
||
POP P,B ; RESTORE GCHACK AC'S
|
||
POP P,A
|
||
POPJ P,
|
||
|
||
OFFFXP: HLRZ 0,D ; POINT TO LIST
|
||
JUMPE 0,LSTFXP ; POINTS TO NIL
|
||
CAML 0,PURTOP ; ALREADY PURE?
|
||
JRST LSTFXP ; YES
|
||
ADD 0,C ; UPDATE THE POINTER
|
||
HRLM 0,1(B) ; STUFF IT OUT
|
||
JRST LSTFXP ; DONE
|
||
|
||
STRFXP: TLZN D,STATM ; SKIP IF REALLY ATOM
|
||
JRST STRFXQ
|
||
MOVEM D,1(B)
|
||
PUSH P,C
|
||
MOVE C,B ; GET ARG FOR BYTDOP
|
||
PUSHJ P,BYTDOP
|
||
POP P,C
|
||
MOVEI D,-1(A)
|
||
JRST ATMFXQ
|
||
|
||
ATMFXP: HLRE 0,D ; GET LENGTH
|
||
SUB D,0 ; POINT TO FIRST DOPE WORD
|
||
HRRZS D
|
||
ATMFXQ: CAML D,OGCSTP
|
||
CAIL D,HIBOT ; SKIP IF IMPURE
|
||
JRST LSTFXP
|
||
HRRZ 0,1(D) ; GET RELOCATION
|
||
SUBI 0,1(D)
|
||
ADDM 0,1(B) ; FIX UP PTR IN STRUCTURE
|
||
JRST LSTFXP
|
||
|
||
; FIXUP OF PURE ATOM POINTERS
|
||
|
||
PURTFX: CAIE C,TATOM ; SKIP IF ATOM POINTER
|
||
JRST PURSFX
|
||
HLRE E,D ; GET TO DOPE WORD
|
||
SUBM D,E
|
||
PURSF1: SKIPL 1(E) ; SKIP IF MARKED
|
||
POPJ P,
|
||
HRRZ 0,1(E) ; RELATAVIZE PTR
|
||
SUBI 0,1(E)
|
||
ADD D,0 ; FIX UP PASSED POINTER
|
||
SKIPE B ; AND IF APPROPRIATE MUNG POINTER
|
||
ADDM 0,1(B) ; FIX UP POINTER
|
||
POPJ P,
|
||
|
||
PURSFX: CAIE C,TCHSTR
|
||
POPJ P,
|
||
MOVE C,B ; GET ARG FOR BYTDOP
|
||
PUSHJ P,BYTDOP
|
||
GETYP 0,-1(A)
|
||
MOVEI E,-1(A)
|
||
MOVE A,[PUSHJ P,PURTFX]
|
||
CAIE 0,SATOM
|
||
POPJ P,
|
||
JRST PURSF1
|
||
|
||
PURFIX: PUSH P,D
|
||
PUSH P,A
|
||
PUSH P,B
|
||
PUSH P,C ; SAVE AC'S FOR GCHACK
|
||
EXCH A,C ; GET TYPE IN A
|
||
CAIN A,TATOM ; CHECK FOR ATOM
|
||
JRST ATPFX
|
||
PUSHJ P,SAT
|
||
|
||
CAILE A,NUMSAT ; SKIP IF TEMPLATE
|
||
JRST TLFX
|
||
IFN ITS, JRST @PURDSP(A)
|
||
IFE ITS,[
|
||
HRRZ 0,PURDSP(A)
|
||
HRLI 0,400000
|
||
JRST @0
|
||
]
|
||
PURDSP:
|
||
|
||
OFFSET 0
|
||
|
||
DISTBS DUM1,TLFX,[[S2WORD,LPLSTF],[S2DEFR,LPLSTF],[SNWORD,VECFX],
|
||
[S2NWORD,VECFX],[SSTORE,VECFX],[SBYTE,STRFX],[SATOM,ATPFX],[SLOCB,STRFX]
|
||
[SCHSTR,STRFX],[SLOCL,LPLSTF],[SLOCV,VECFX],[SLOCU,VECFX],[SLOCS,VECFX],[SOFFS,OFFSFX]]
|
||
|
||
OFFSET OFFS
|
||
|
||
VECFX: HLRE 0,D ; GET LENGTH
|
||
SUB D,0 ; POINT TO D.W.
|
||
SKIPL 1(D) ; SKIP IF MARKED
|
||
JRST TLFX
|
||
HRRZ C,1(D)
|
||
SUBI C,1(D) ; CALCULATE RELOCATION
|
||
ADD C,MAPUP ; ADJUSTMENT
|
||
SUBI C,FPAG
|
||
ADDM C,1(B)
|
||
TLFX: TLNN B,.LIST. ; SEE IF PAIR
|
||
JRST LVPUR ; LEAVE IF NOT
|
||
PUSHJ P,RLISTQ
|
||
JRST LVPUR
|
||
HRRZ D,(B) ; GET CDR
|
||
SKIPN D ; SKIP IF NOT ZERO
|
||
JRST LVPUR
|
||
MOVE D,(D) ; GET CADR
|
||
SKIPL D ; SKIP IF MARKED
|
||
JRST LVPUR
|
||
ADD D,MAPUP
|
||
SUBI D,FPAG
|
||
HRRM D,(B) ; FIX UP
|
||
LVPUR: POP P,C
|
||
POP P,B
|
||
POP P,A
|
||
POP P,D
|
||
POPJ P,
|
||
|
||
STRFX: MOVE C,B ; GET ARG FOR BYTDOP
|
||
PUSHJ P,BYTDOP
|
||
SKIPL (A) ; SKIP IF MARKED
|
||
JRST TLFX
|
||
GETYP 0,-1(A)
|
||
MOVE D,1(B)
|
||
MOVEI C,-1(A)
|
||
CAIN 0,SATOM ; REALLY ATOM?
|
||
JRST ATPFX1
|
||
HRRZ 0,(A) ; GET PTR IN NEW STRUCTURE
|
||
SUBI 0,(A) ; RELATAVIZE
|
||
ADD 0,MAPUP ; ADJUST
|
||
SUBI 0,FPAG
|
||
ADDM 0,1(B) ; FIX UP PTR
|
||
JRST TLFX
|
||
|
||
ATPFX: HLRE C,D
|
||
SUBM D,C
|
||
SKIPL 1(C) ; SKIP IF MARKED
|
||
JRST TLFX
|
||
ATPFX1: HRRZS C ; SEE IF PURE
|
||
CAIL C,HIBOT ; SKIP IF NOT PURE
|
||
JRST TLFX
|
||
HRRZ 0,1(C) ; GET PTR TO NEW ATOM
|
||
SUBI 0,1(C) ; RELATAVIZE
|
||
ADD D,0
|
||
JUMPE B,TLFX
|
||
ADDM 0,1(B) ; FIX UP
|
||
JRST TLFX
|
||
|
||
LPLSTF: SKIPN D ; SKIP IF NOT PTR TO NIL
|
||
JRST TLFX
|
||
SKIPL (D) ; SKIP IF MARKED
|
||
JRST TLFX
|
||
HRRZ D,(D) ; GET UPDATED POINTER
|
||
ADD D,MAPUP ; ADJUSTMENT
|
||
SUBI D,FPAG
|
||
HRRM D,1(B)
|
||
JRST TLFX
|
||
|
||
OFFSFX: HLRZS D ; LIST POINTER
|
||
JUMPE D,TLFX ; NIL
|
||
SKIPL (D) ; MARKED?
|
||
JRST TLFX ; NO
|
||
ADD D,MAPUP
|
||
SUBI D,FPAG ; ADJUST
|
||
HRLM D,1(B)
|
||
JRST TLFX ; RETURN
|
||
|
||
; ROUTINES TO CAUSE A GARBAGE COLLECT WHEN EFFORTS TO GET STORAGE FAIL
|
||
|
||
LOSLP1: MOVE A,ABOTN
|
||
MOVEM A,PARNEW ; SET UP GC PARAMS
|
||
MOVE C,[12.,,6]
|
||
JRST PURLOS
|
||
|
||
LOSLP2: MOVEI A,@BOTNEW ; TOTAL AMOUNT NEEDED
|
||
ADDI A,1777
|
||
ANDCMI A,1777 ; CALCULATE PURE PAGES NEEDED
|
||
MOVEM A,GCDOWN
|
||
MOVE C,[12.,,8.]
|
||
JRST PURLOS
|
||
|
||
PURLOS: MOVE P,[-2000,,MRKPDL]
|
||
PUSH P,GCDOWN
|
||
PUSH P,PARNEW
|
||
MOVE R,C ; GET A COPY OF A
|
||
PUSHJ P,INFCLS ; CLOSE INFERIORS AND FIX UP WORLD
|
||
PUSHJ P,INFCL2
|
||
PURLS1: POP P,PARNEW
|
||
POP P,GCDOWN
|
||
MOVE C,R
|
||
|
||
; RESTORE AC'S
|
||
MOVE PVP,PVSTOR+1
|
||
IRP AC,,[P,R,M,TP,TB,AB,FRM]
|
||
MOVE AC,AC!STO+1(PVP)
|
||
TERMIN
|
||
|
||
SETZM GCDFLG ; ZERO OUT FLAGS
|
||
SETZM DUMFLG
|
||
SETZM GPURFL
|
||
SETZM GCDANG
|
||
|
||
PUSHJ P,AGC ; GARBAGE COLLECT
|
||
JRST PURIT1 ; TRY AGAIN
|
||
|
||
; PURIFIER ATOM MARKER
|
||
|
||
PATOMK: HRRZ 0,A
|
||
CAMG 0,PARBOT
|
||
JRST GCRET ; DONE IF FROZEN
|
||
HLRE B,A ; GET TO D.W.
|
||
SUB A,B
|
||
SKIPG 1(A) ; SKIP IF NOT MARKED
|
||
JRST GCRET
|
||
HLRZ B,1(A)
|
||
IORM D,1(A) ; MARK THE ATOM
|
||
ADDM B,ABOTN
|
||
HRRM LPVP,(A) ; LINK ONTO CHAIN
|
||
MOVEI LPVP,1(A)
|
||
JRST GCRET ; EXIT
|
||
|
||
|
||
.GLOBAL %LDRDO,%MPRDO
|
||
|
||
; ROUTINES TO ALLOW GC-DUMPING OF PURIFIED STRUCTURES.
|
||
|
||
; PROPUR MAPS PAGES CONTAINING PURIFIED STUFF INTO THE AGD INFERIOR SO THAT IN CASE
|
||
; THE PAGES ARE MUNGED THEY CAN BE RESTORED USING MAPPING
|
||
|
||
; REPURE REMAPS ANY PAGES THAT WERE MUNGED BY GC-DUMP BY RELOADING THEM FROM THE AGD
|
||
; INFERIOR IN READ/EXEC MODE
|
||
|
||
REPURE: PUSH P,[PUSHJ P,%LDRDO] ; INSTRUCTION FOR MAPPING IN PAGES FROM AGD INF
|
||
SKIPA
|
||
PROPUR: PUSH P,[PUSHJ P,%MPRDO] ; INSTRUCTION FOR MAPPING PAGES TO AGD INF
|
||
MOVE A,PURBOT ; GET STARTING PAGE OF PURENESS
|
||
ASH A,-10. ; CONVERT TO PAGES
|
||
MOVEI C,HIBOT ; GET ENDING PAGE
|
||
ASH C,-10. ; CONVERT TO PAGES
|
||
PUSH P,A ; SAVE PAGE POINTER
|
||
PUSH P,C ; SAVE END OF PURENESS POINTER
|
||
PROLOP: CAML A,(P) ; SKIP IF STILL PURE PAGES TO CHECK
|
||
JRST PRODON ; DONE MAPPING PAGES
|
||
PUSHJ P,CHKPGI ; SKIP IF PAGE IS PURE
|
||
JRST NOTPUR ; IT IS NOT
|
||
MOVE A,-1(P) ; GET PAGE TO MAP
|
||
XCT -2(P) ; MAP IN/OUT TO AGD INFERIOR IN READ/EXEC MODE
|
||
NOTPUR: AOS A,-1(P) ; INCREMENT PAGE POINTER AND LOAD
|
||
JRST PROLOP ; LOOP BACK
|
||
PRODON: SUB P,[3,,3] ; CLEAN OFF STACK
|
||
POPJ P, ; EXIT
|
||
|
||
|
||
|
||
.GLOBAL %SAVIN,STOSTR,%CLMP1,%IMSAV,%IMSV1,ILOOKC,PSHGCF,BSETG,%GCJB1
|
||
.GLOBAL %CLSJB,%KILJB,%IFMP1,%OPGFX,%FDBUF
|
||
INFSU1: PUSH P,[-1] ; ENTRY USED BY GC-DUMP
|
||
SKIPA
|
||
INFSUP: PUSH P,[0]
|
||
MOVE A,GLOTOP+1 ; GET GLOTOP FOR LOCR HACKS
|
||
MOVEM A,GLTOP
|
||
PUSHJ P,%FDBUF ; GET A BUFFER FOR C/W HACKS
|
||
SETOM GCDFLG
|
||
SETOM GCFLG
|
||
HLLZS SQUPNT
|
||
HRRZ TYPNT,TYPVEC+1 ; SETUP TYPNT
|
||
HRLI TYPNT,B
|
||
MOVEI A,STOSTR
|
||
ANDCMI A,1777 ; TO PAGE BOUNDRY
|
||
SUB A,GCSTOP ; SET UP AOBJN POINTER FOR C/W HACK
|
||
ASH A,-10. ; TO PAGES
|
||
HRLZS A
|
||
MOVEI B,STOSTR ; GET START OF MAPPING
|
||
ASH B,-10.
|
||
ADDI A,(B)
|
||
MOVEM A,INF1
|
||
PUSHJ P,%SAVIN ; PROTECT THE CORE IMAGE
|
||
SKIPGE (P) ; IF < 0 GC-DUMP CALL
|
||
PUSHJ P,PROPUR ; PROTECT PURE PAGES
|
||
SUB P,[1,,1] ; CLEAN OFF PSTACK
|
||
PUSHJ P,%CLSJB ; CLOSE INFERIOR
|
||
|
||
MOVSI D,400000 ; CREATE MARK WORD
|
||
SETZB LPVP,ABOTN ; ZERO ATOM COUNTER
|
||
MOVEI A,2000 ; MARKED INF STARTS AT PAGE ONE
|
||
HRRM A,BOTNEW
|
||
SETZM WNDBOT
|
||
SETZM WNDTOP
|
||
HRRZM A,FNTBOT
|
||
ADDI A,2000 ; WNDTOP
|
||
MOVEI A,1 ; TO PAGES
|
||
PUSHJ P,%GCJB1 ; CREATE THE JOB
|
||
MOVSI FPTR,-2000
|
||
MOVEI A,LPUR ; SAVE THE PURE CORE IMAGE
|
||
ANDCMI A,1777 ; TO PAGE BOUNDRY
|
||
MOVE 0,A ; COPY TO 0
|
||
ASH 0,-10. ; TO PAGES
|
||
SUB A,HITOP ; SUBTRACT TOP OF CORE
|
||
ASH A,-10.
|
||
HRLZS A
|
||
ADD A,0
|
||
MOVEM A,INF2
|
||
PUSHJ P,%IMSV1 ; MAP OUT INTERPRETER
|
||
PUSHJ P,%OPGFX
|
||
|
||
; CREATE A PDL TO USE FOR THESE DUMPING FUNCTIONS
|
||
|
||
MOVE A,[-2000,,MRKPDL]
|
||
POPJ P,
|
||
|
||
; ROUTINE TO CLOSE GC's INFERIOR
|
||
|
||
|
||
INFCLS: MOVE A,INF2 ; GET POINTER TO PURE MAPPED OUT
|
||
PUSHJ P,%CLSMP
|
||
POPJ P,
|
||
|
||
; CLOSE INFERIOR PROTECTING CORE IMAGE FOR GCDUMP
|
||
|
||
INFCL2: PUSHJ P,%IFMP1 ; OPEN AGD INF TO RESTORE PAGES
|
||
INFCL3: MOVE A,INF1 ; RESTORE OPENING POINTER
|
||
PUSH P,INF2
|
||
MOVE B,A ; SATIFY MUDITS
|
||
PUSHJ P,%IFMP2 ; MAP IN GC PAGES AND CLOSE INFERIOR
|
||
POP P,INF2 ; RESTOR INF2 PARAMETER
|
||
POPJ P,
|
||
|
||
INFCL1: PUSHJ P,%IFMP1 ; OPEN AGD INF TO RESTORE PAGES
|
||
SKIPGE PURMNG ; SKIP IF NO PURE PAGES WERE MUNGED
|
||
PUSHJ P,REPURE ; REPURIFY MUNGED PAGES
|
||
JRST INFCL3
|
||
|
||
|
||
|
||
; ROUTINE TO DO TYPE HACKING FOR GC-DUMP. IT MARKS THE TYPE-WORD OF THE
|
||
; SLOT IN THE TYPE VECTOR. IT ALSO MARKS THE ATOM REPLACING THE I.D. IN
|
||
; THE RIGHT HALF OF THE ATOM SLOT. IF THE TYPE IS A TEMPLATE THE FIRST
|
||
; USE OF THE SAT HAS ITS ATOM MARKED AND THE I.D. IS PLACED IN THE LEFT
|
||
; HALF OF THE ATOM SLOT (IT GETS THE REAL PRIMTYPE).
|
||
|
||
TYPHK: CAILE B,NUMPRI ; SKIP IF A MUDDLE TYPE
|
||
JRST TYPHKR ; ITS A NEWTYPE SO GO TO TYPHACKER
|
||
CAIN B,TTYPEC ; SKIP IF NOT TYPE-C
|
||
JRST TYPCHK ; GO TO HACK TYPE-C
|
||
CAIE B,TTYPEW ; SKIP IF TYPE-W
|
||
POPJ P,
|
||
PUSH P,B
|
||
HLRZ B,A ; GET TYPE
|
||
JRST TYPHKA ; GO TO TYPE-HACKER
|
||
TYPCHK: PUSH P,B ; SAVE TYPE-WORD
|
||
HRRZ B,A
|
||
JRST TYPHKA
|
||
|
||
; GENERAL TYPE-HACKER FOR GC-DUMP
|
||
|
||
TYPHKR: PUSH P,B ; SAVE AC'S
|
||
TYPHKA: PUSH P,A
|
||
PUSH P,C
|
||
LSH B,1 ; GET OFFSET TO SLOT IN TYPE VECTOR
|
||
MOVEI C,(TYPNT) ; GET TO SLOT
|
||
ADDI C,(B)
|
||
SKIPGE (C)
|
||
JRST EXTYP
|
||
IORM D,(C) ; MARK THE SLOT
|
||
MOVEI B,TATOM ; NOW MARK THE ATOM SLOT
|
||
PUSHJ P,MARK1 ; MARK IT
|
||
HRRM A,1(C) ; SMASH IN ID
|
||
HRRZS 1(C) ; MAKE SURE THAT THATS ALL THATS THERE
|
||
HRRZ B,(C) ; GET SAT
|
||
ANDI B,SATMSK ; GET RID OF MAGIC BITS
|
||
HRRM B,(C) ; SMASH SAT BACK IN
|
||
CAIG B,NUMSAT ; SKIP IF TEMPLATE
|
||
JRST EXTYP
|
||
MOVE A,TYPSAV ; GET POINTER TO TYPE VECTOR
|
||
ADDI A,NUMPRI*2 ; GET TO NEWTYPES SLOTS
|
||
HRLI 0,NUMPRI*2
|
||
HLLZS 0 ; MAKE SURE ONLY LEFT HALF
|
||
ADD A,0
|
||
TYPHK1: HRRZ E,(A) ; GET SAT OF SLOT
|
||
CAMN E,B ; SKIP IF NOT EQUAL
|
||
JRST TYPHK2 ; GOT IT
|
||
ADDI A,2 ; TO NEXT
|
||
JRST TYPHK1
|
||
TYPHK2: PUSH P,C ; SAVE POINTER TO ORIGINAL SLOT
|
||
MOVE C,A ; COPY A
|
||
MOVEI B,TATOM ; SET UP FOR MARK
|
||
MOVE A,1(C) ; ASSUME MARK DOESN'T HAVE TO TAKE PLACE
|
||
SKIPL (C) ; DON'T MARK IF ALREADY MARKED
|
||
PUSHJ P,MARK
|
||
POP P,C ; RESTORE C
|
||
HRLM A,1(C) ; SMASH IN PRIMTYPE OF TEMPLATE
|
||
EXTYP: POP P,C ; RESTORE AC'S
|
||
POP P,A
|
||
POP P,B
|
||
POPJ P, ; EXIT
|
||
|
||
|
||
; A ROUTINE TO DISTINGUISH BETWEEN A DEFERRED AND A LIST POINTER
|
||
RLISTQ: PUSH P,A
|
||
GETYP A,(B) ; GET TYPE
|
||
PUSHJ P,SAT ; GET SAT
|
||
CAIG A,NUMSAT ; NOT DEFERRED IF TEMPLATE
|
||
SKIPL MKTBS(A)
|
||
AOS -1(P) ; SKIP IF NOT DEFFERED
|
||
POP P,A
|
||
POPJ P, ; EXIT
|
||
|
||
|
||
; DISPATCH TABLE FOR MARK PHASE ("SETZ'D" ENTRIES MUST BE DEFERRED)
|
||
|
||
GCDISP:
|
||
|
||
OFFSET 0
|
||
|
||
DISTBS DUM2,GCRET,[[S2WORD,PAIRMK],[S2DEFR,DEFMK],[SNWORD,VECTMK],[STBASE,ERDP]
|
||
[STPSTK,ERDP],[SARGS,ERDP],[S2NWORD,VECTMK],[SPSTK,ERDP],[SSTORE,VECTMK]
|
||
[SFRAME,ERDP],[SBYTE,<SETZ BYTMK>],[SATOM,DATOMK],[SPVP,ERDP],[SGATOM,ERDP]
|
||
[SLOCID,ERDP],[SCHSTR,<SETZ BYTMK>],[SASOC,ERDP],[SLOCL,PAIRMK],[SABASE,ERDP]
|
||
[SLOCA,ERDP],[SLOCV,VECTMK],[SLOCU,VECTMK],[SLOCS,<SETZ BYTMK>],[SLOCN,ERDP]
|
||
[SLOCB,<SETZ BYTMK>],[SLOCR,LOCRDP],[SOFFS,OFFSMK]]
|
||
|
||
OFFSET OFFS
|
||
|
||
|
||
; THIS SUBROUTINE IMPURIFIES A PURE ATOM TO ALLOW MODIFICATION OF SYSTEM SUBRS
|
||
|
||
IMPRF: PUSH P,A
|
||
PUSH P,LPVP
|
||
PUSH TP,$TATOM
|
||
HLRZ C,(A) ; GET LENGTH
|
||
TRZ C,400000 ; TURN OF 400000 BIT
|
||
SUBI A,-1(C) ; POINT TO START OF ATOM
|
||
MOVNI C,-2(C) ; MAKE IT LOOK LIKE AN ATOM POINTER
|
||
HRL A,C
|
||
PUSH TP,A
|
||
MOVE C,A
|
||
MOVEI 0,(C)
|
||
PUSH P,AB
|
||
MOVE PVP,PVSTOR+1
|
||
MOVE AB,ABSTO+1(PVP)
|
||
PUSHJ P,IMPURX
|
||
POP P,AB
|
||
POP P,LPVP ; RESTORE A
|
||
POP P,A
|
||
POPJ P,
|
||
|
||
FIXATM: PUSH P,[0]
|
||
FIXTM5: JUMPE LPVP,FIXTM4
|
||
MOVEI B,(LPVP) ; GET PTR TO ATOMS DOPE WORD
|
||
HRRZ LPVP,-1(B) ; SET UP LPVP FOR NEXT IN CHAIN
|
||
SKIPE -2(P) ; SEE IF PURE SCAN
|
||
JRST FIXTM2
|
||
CAIL B,HIBOT
|
||
JRST FIXTM3
|
||
FIXTM2: CAMG B,PARBOT ; SKIP IF NOT FROZEN
|
||
JRST FIXTM1
|
||
HLRZ A,(B)
|
||
TRZ A,400000 ; GET RID OF MARK BIT
|
||
MOVE D,A ; GET A COPY OF LENGTH
|
||
SKIPE -2(P)
|
||
JRST PFATM
|
||
PUSHJ P,CAFREE ; GET STORAGE
|
||
SKIPE GCDANG ; SEE IF WON
|
||
JRST LOSLP1 ; GO TO CAUSE GC
|
||
JRST FIXT10
|
||
PFATM: PUSH P,AB
|
||
MOVE PVP,PVSTOR+1
|
||
MOVE AB,ABSTO+1(PVP)
|
||
SETZM GPURFL
|
||
PUSHJ P,CAFREE
|
||
SETOM GPURFL
|
||
POP P,AB
|
||
FIXT10: SUBM D,ABOTN
|
||
MOVNS ABOTN
|
||
SUBI B,-1(D) ; POINT TO START OF ATOM
|
||
HRLZ C,B ; SET UP FOR BLT
|
||
HRRI C,(A)
|
||
ADDI A,-1(D) ; FIX UP TO POINT TO NEW DOPE WORD
|
||
BLT C,(A)
|
||
HLLZS -1(A)
|
||
HLLOS (A) ; -1 IN RELOCATION FIELD SINCE ITS NOT GARBAGE
|
||
ADDI B,-1(D) ; B POINTS TO SECOND D.W.
|
||
HRRM A,(B) ; PUT IN RELOCATION
|
||
MOVSI D,400000 ; UNMARK ATOM
|
||
ANDCAM D,(A)
|
||
CAIL B,HIBOT ; SKIP IF IMPURE
|
||
PUSHJ P,IMPRF
|
||
JRST FIXTM5 ; CONTINE FIXUP
|
||
|
||
FIXTM4: POP P,LPVP ; FIX UP LPVP TO POINT TO NEW CHAIN
|
||
POPJ P, ; EXIT
|
||
|
||
FIXTM1: HRRM B,(B) ; SMASH IN RELOCATION
|
||
MOVSI D,400000
|
||
ANDCAM D,(B) ; CLEAR MARK BIT
|
||
JRST FIXTM5
|
||
|
||
FIXTM3: MOVE 0,(P)
|
||
HRRM 0,-1(B)
|
||
MOVEM B,(P) ; FIX UP CHAIN
|
||
JRST FIXTM5
|
||
|
||
|
||
|
||
IAGC":
|
||
|
||
;SET FLAG FOR INTERRUPT HANDLER
|
||
SETZB M,RCL ; CLEAR OUT RECYCLE LIST CELLS, AND RSUBR BASE PNTR
|
||
EXCH P,GCPDL ; IN CASE CURRENT PDL LOSES
|
||
PUSH P,B
|
||
PUSH P,A
|
||
PUSH P,C ; SAVE C
|
||
|
||
; HERE TO CLEAN UP ANY POSSIBLE PURENESS IN GC SPACE BEFORE COLLECTING
|
||
|
||
|
||
|
||
MOVE A,NOWFRE
|
||
ADD A,GCSTOP ; ADJUSTMENT TO KEEP FREE REAL
|
||
SUB A,FRETOP
|
||
MOVEM A,NOWFRE
|
||
MOVE A,NOWP ; ADJUSTMENTS FOR STACKS
|
||
SUB A,CURP
|
||
MOVEM A,NOWP
|
||
MOVE A,NOWTP
|
||
SUB A,CURTP
|
||
MOVEM A,NOWTP
|
||
|
||
MOVEI B,[ASCIZ /GIN /]
|
||
SKIPE GCMONF ; MONITORING
|
||
PUSHJ P,MSGTYP
|
||
NOMON1: HRRZ C,(P) ; GET CAUSE OF GC INDICATOR
|
||
MOVE B,GCNO(C) ; ADD 1 TO COUNT OF GC'S CAUSED BY GIVEN REASON
|
||
ADDI B,1
|
||
MOVEM B,GCNO(C)
|
||
MOVEM C,GCCAUS ; SAVE CAUSE OF GC
|
||
SKIPN GCMONF ; MONITORING
|
||
JRST NOMON2
|
||
MOVE B,MSGGCT(C) ; GET CAUSE MESSAGE
|
||
PUSHJ P,MSGTYP
|
||
NOMON2: HLRZ C,(P) ; FIND OUT WHO CAUSED THE GC
|
||
MOVEM C,GCCALL ; SAVE CALLER OF GC
|
||
SKIPN GCMONF ; MONITORING
|
||
JRST NOMON3
|
||
MOVE B,MSGGFT(C)
|
||
PUSHJ P,MSGTYP
|
||
NOMON3: SUB P,[1,,1] ; POP OFF C
|
||
POP P,A
|
||
POP P,B
|
||
EXCH P,GCPDL
|
||
JRST .+1
|
||
IAAGC:
|
||
HLLZS SQUPNT ; FLUSH SQUOZE TABLE
|
||
SETZB M,RCL ; ALTERNATE GC-ENTRY POINT FOR INITIALIZATION
|
||
INITGC: SETOM GCFLG
|
||
SETZM RCLV
|
||
|
||
;SAVE AC'S
|
||
EXCH PVP,PVSTOR+1
|
||
IRP AC,,[0,A,B,C,D,E,P,R,M,SP,TP,TB,AB,TVP,FRM]
|
||
MOVEM AC,AC!STO"+1(PVP)
|
||
TERMIN
|
||
|
||
MOVE 0,PVSTOR+1
|
||
MOVEM 0,PVPSTO+1(PVP)
|
||
MOVEM PVP,PVSTOR+1
|
||
MOVE D,DSTORE
|
||
MOVEM D,DSTO(PVP)
|
||
JSP E,CKPUR ; CHECK FOR PURE RSUBR
|
||
|
||
|
||
;SET UP E TO POINT TO TYPE VECTOR
|
||
GETYP E,TYPVEC
|
||
CAIE E,TVEC
|
||
JRST AGCE1
|
||
HRRZ TYPNT,TYPVEC+1
|
||
HRLI TYPNT,B
|
||
|
||
CHPDL: MOVE D,P ; SAVE FOR LATER
|
||
CORGET: MOVE P,[-2000,,MRKPDL]
|
||
|
||
;FENCE POST PDLS AND CHECK IF ANY SHOULD BE SHRUNK
|
||
|
||
MOVEI A,(TB) ;POINT TO CURRENT FRAME IN PROCESS
|
||
PUSHJ P,FRMUNG ;AND MUNG IT
|
||
MOVE A,TP ;THEN TEMPORARY PDL
|
||
PUSHJ P,PDLCHK
|
||
MOVE PVP,PVSTOR+1
|
||
MOVE A,PSTO+1(PVP) ;AND UNMARKED P STACK
|
||
PUSHJ P,PDLCHP
|
||
|
||
; FIRST CREATE INFERIOR TO HOLD NEW PAGES
|
||
|
||
INFCRT: MOVE A,PARBOT ; GENERATE NEW PARBOT AND PARNEW
|
||
ADD A,PARNEW
|
||
ADDI A,1777
|
||
ANDCMI A,1777 ; EVEN PAGE BOUNDARY
|
||
HRRM A,BOTNEW ; INTO POINTER WORD
|
||
HRRZM A,FNTBOT
|
||
SETZM WNDBOT
|
||
SETZM WNDTOP
|
||
MOVEM A,NPARBO
|
||
HRRZ A,BOTNEW ; GET PAGE TO START INF AT
|
||
ASH A,-10. ; TO PAGES
|
||
MOVEI R,(A) ; COPY A
|
||
PUSHJ P,%GCJOB ; GET PAGE HOLDER
|
||
MOVSI FPTR,-2000 ; FIX UP FRONTIER POINTER
|
||
MOVE A,WNDBOT
|
||
ADDI A,2000 ; FIND WNDTOP
|
||
MOVEM A,WNDTOP
|
||
|
||
;MARK PHASE: MARK ALL LISTS AND VECTORS
|
||
;POINTED TO WITH ONE BIT IN SIGN BIT
|
||
;START AT TRANSFER VECTOR
|
||
NOMAP: MOVE A,GLOBSP+1 ; GET GLOBSP TO SAVE
|
||
MOVEM A,GCGBSP
|
||
MOVE A,ASOVEC+1 ; ALSO SAVE FOR USE BY GC
|
||
MOVEM A,GCASOV
|
||
MOVE A,NODES+1 ; SAVE FOR ASSOCIATION UPDATE AND MOVEMENT PHASE
|
||
MOVEM A,GCNOD
|
||
MOVE A,GLOTOP+1 ; GET GLOTOP FOR LOCR HACKS
|
||
MOVEM A,GLTOP
|
||
MOVE A,PURVEC+1 ; SAVE PURE VECTOR FOR GETPAG
|
||
MOVEM A,PURSVT
|
||
MOVE A,HASHTB+1
|
||
MOVEM A,GCHSHT
|
||
|
||
SETZ LPVP, ;CLEAR NUMBER OF PAIRS
|
||
MOVE 0,NGCS ; SEE IF NEED HAIR
|
||
SOSGE GCHAIR
|
||
MOVEM 0,GCHAIR ; RESUME COUNTING
|
||
MOVSI D,400000 ;SIGN BIT FOR MARKING
|
||
MOVE A,ASOVEC+1 ;MARK ASSOC. VECTOR NOW
|
||
PUSHJ P,PRMRK ; PRE-MARK
|
||
MOVE A,GLOBSP+1
|
||
PUSHJ P,PRMRK
|
||
MOVE A,HASHTB+1
|
||
PUSHJ P,PRMRK
|
||
OFFSET 0
|
||
|
||
MOVE A,IMQUOTE THIS-PROCESS
|
||
|
||
OFFSET OFFS
|
||
|
||
MOVEM A,GCATM
|
||
|
||
; HAIR TO DO AUTO CHANNEL CLOSE
|
||
|
||
MOVEI 0,N.CHNS-1 ; NUMBER OF CHANNELS
|
||
MOVEI A,CHNL1 ; 1ST SLOT
|
||
|
||
SKIPE 1(A) ; NOW A CHANNEL?
|
||
SETZM (A) ; DON'T MARK AS CHANNELS
|
||
ADDI A,2
|
||
SOJG 0,.-3
|
||
|
||
MOVEI C,PVSTOR
|
||
MOVEI B,TPVP
|
||
MOVE A,PVSTOR+1 ; MARK MAIN PROCES EVEN IF SWAPPED OUT
|
||
PUSHJ P,MARK
|
||
MOVEI C,MAINPR-1
|
||
MOVEI B,TPVP
|
||
MOVE A,MAINPR ; MARK MAIN PROCES EVEN IF SWAPPED OUT
|
||
PUSHJ P,MARK
|
||
MOVEM A,MAINPR ; ADJUST PTR
|
||
|
||
; ASSOCIATION AND VALUE FLUSHING PHASE
|
||
|
||
SKIPN GCHAIR ; ONLY IF HAIR
|
||
PUSHJ P,VALFLS
|
||
|
||
SKIPN GCHAIR
|
||
PUSHJ P,ATCLEA ; CLEAN UP ATOM TABLE
|
||
|
||
SKIPE GCHAIR ; IF NOT HAIR, DO CHANNELS NOW
|
||
PUSHJ P,CHNFLS
|
||
|
||
PUSHJ P,ASSOUP ; UPDATE AND MOVE ASSOCIATIONS
|
||
PUSHJ P,CHFIX ; SEND OUT CHANNELS AND MARK LOSERS
|
||
PUSHJ P,STOGC ; FIX UP FROZEN WORLD
|
||
MOVE P,GCPDL ; SWITCH PDLS IN CASE THIS ONE DISSAPPEARS
|
||
|
||
|
||
MOVE A,NPARBO ; UPDATE GCSBOT
|
||
MOVEM A,GCSBOT
|
||
MOVE A,PURSVT
|
||
PUSH P,PURVEC+1
|
||
MOVEM A,PURVEC+1 ; RESTORE PURVEC
|
||
PUSHJ P,CORADJ ; ADJUST CORE SIZE
|
||
POP P,PURVEC+1
|
||
|
||
|
||
|
||
; MAP NEW PAIR SPACE IN FOR PAIR SPACE UPDATE
|
||
|
||
NOMAP1: MOVEI A,@BOTNEW
|
||
ADDI A,1777 ; TO PAGE BOUNDRY
|
||
ANDCMI A,1777
|
||
MOVE B,A
|
||
DOMAP: ASH B,-10. ; TO PAGES
|
||
MOVE A,PARBOT
|
||
MOVEI C,(A) ; COMPUTE HIS TOP
|
||
ASH C,-10.
|
||
ASH A,-10.
|
||
SUBM A,B ; B==> - # OF PAGES
|
||
HRLI A,(B) ; AOBJN TO SOURCE AND DEST
|
||
MOVE B,A ; IN CASE OF FUNNY
|
||
HRRI B,(C) ; MAP HIS POSSIBLE HIGHER OR LOWER PAGES
|
||
PUSHJ P,%INFMP ; NOW FLUSH INF AND MAKE HIS CORE MINE
|
||
JRST GARZER
|
||
|
||
; CORE ADJUSTMENT PHASE
|
||
|
||
CORADJ: MOVE A,PURTOP
|
||
SUB A,CURPLN ; ADJUST FOR RSUBR
|
||
ANDCMI A,1777 ; ROUND DOWN
|
||
MOVEM A,RPTOP
|
||
MOVEI A,@BOTNEW ; NEW GCSTOP
|
||
ADDI A,1777 ; GCPDL AND ROUND
|
||
ANDCMI A,1777 ; TO PAGE BOUNDRY
|
||
MOVEM A,CORTOP ; TAKE CARE OF POSSIBLE LATER LOSSAGE
|
||
CAMLE A,RPTOP ; SEE IF WE CAN MAP THE WORLD BACK IN
|
||
FATAL AGC--UNABLE TO MAP GC-SPACE INTO CORE
|
||
CAMG A,PURBOT ; SEE IF WE HAVE TO PUNT SOME PURE TO DO IT
|
||
JRST CORAD0 ; DON'T HAVE TO PUNT SOME PURE
|
||
PUSHJ P,MAPOUT ; GET THE CORE
|
||
FATAL AGC--PAGES NOT AVAILABLE
|
||
|
||
; NOW THAT WE ARE ABLE TO MAP TO GCS INTO CORE WE WILL TRY TO HONOR SOME REQUESTS
|
||
; FIRST LETS SEE IF WE HAVE TO CORE DOWN.
|
||
; GCDOWN IS DEFINED AS AMOUNT FROM FRETOP TO PURBOT NEEDED
|
||
|
||
CORAD0: SKIPN B,GCDOWN ; CORE DOWN?
|
||
JRST CORAD1 ; NO, LETS GET CORE REQUIREMENTS
|
||
ADDI A,(B) ; AMOUNT+ONE FREE BLOCK
|
||
CAMGE A,RPTOP ; CAN WE WIN
|
||
JRST CORAD3 ; POSSIBLY
|
||
|
||
; THIS IS A EXIT FOR LOSSAGE WITHOUT A FATAL ERROR
|
||
CORAD2: SETOM GCDANG ; INDICATE LOSSAGE
|
||
|
||
; CALCULATE PARAMETERS BEFORE LEAVING
|
||
CORAD6: MOVE A,PURSVT ; GET PURE TABLE
|
||
PUSHJ P,SPCOUT ; OUT IT GOES IN CASE IT WAS CHANGED
|
||
MOVEI A,@BOTNEW ; GCSTOP
|
||
MOVEM A,GCSTOP
|
||
MOVE A,CORTOP ; ADJUST CORE IMAGE
|
||
ASH A,-10. ; TO PAGES
|
||
TRYPCO: PUSHJ P,P.CORE
|
||
FATAL AGC--CORE SCREW UP
|
||
MOVE A,CORTOP ; GET IT BACK
|
||
ANDCMI A,1777
|
||
MOVEM A,FRETOP
|
||
MOVEM A,RFRETP
|
||
POPJ P,
|
||
|
||
; TRIES TO SATISFY REQUEST FOR CORE
|
||
CORAD1: MOVEM A,CORTOP
|
||
MOVEI A,@BOTNEW
|
||
ADD A,GETNUM ; ADD MINIMUM CORE NEEDED
|
||
ADDI A,1777 ; ONE BLOCK+ROUND
|
||
ANDCMI A,1777 ; TO BLOCK BOUNDRY
|
||
CAMLE A,RPTOP ; CAN WE WIN
|
||
JRST CORAD2 ; LOSE
|
||
CAMGE A,PURBOT
|
||
JRST CORAD7 ; DON'T HAVE TO MAP OUT PURE
|
||
PUSHJ P,MAPOUT
|
||
JRST CORAD2 ; LOSS
|
||
|
||
; NOW TRY TO GET SLOP SPACE. NOT NECESSARY BUT NICE
|
||
CORAD7: MOVEM A,CORTOP ; STORE POSSIBLE VALUE
|
||
MOVE B,RPTOP ; GET REAL PURTOP
|
||
SUB B,PURMIN ; KEEP PURMIN
|
||
CAMG B,CORTOP ; SEE IF CORTOP IS ALREADY HIGH
|
||
MOVE B,CORTOP ; DONT GIVE BACK WHAT WE GOT
|
||
MOVEM B,RPTOP ; FOOL CORE HACKING
|
||
ADD A,FREMIN
|
||
ANDCMI A,1777 ; TO PAGE BOUNDRY
|
||
CAMGE A,RPTOP ; DO WE WIN TOTALLY
|
||
JRST CORAD4
|
||
MOVE A,RPTOP ; GET AS MUCH CORE AS POSSIBLE
|
||
PUSHJ P,MAPOUT
|
||
JRST CORAD6 ; LOSE, BUT YOU CAN'T HAVE EVERYTHING
|
||
CORAD4: CAMG A,PURBOT ; DO WE HAVE TO PUNT SOME PURE
|
||
JRST CORAD8
|
||
PUSHJ P,MAPOUT ; GET IT
|
||
JRST CORAD6
|
||
CORAD8: MOVEM A,CORTOP ; ADJUST PARAMETER
|
||
JRST CORAD6 ; WIN TOTALLY
|
||
|
||
; WE CAN CORE DOWN NOW TO SEE IF WE CAN GET SOME SLOP SPACE
|
||
|
||
CORAD3: ADD A,FREMIN
|
||
ANDCMI A,1777
|
||
CAMGE A,PURBOT ; CAN WE WIN
|
||
JRST CORAD9
|
||
MOVE A,RPTOP
|
||
CORAD9: SUB A,GCDOWN ; SATISFY GCDOWN REQUEST
|
||
JRST CORAD4 ; GO CHECK ALLOCATION
|
||
|
||
MAPOUT: PUSH P,A ; SAVE A
|
||
SUB A,P.TOP ; AMOUNT TO GET
|
||
ADDI A,1777 ; ROUND
|
||
ANDCMI A,1777 ; TO PAGE BOUNDRY
|
||
ASH A,-PGSZ ; TO PAGES
|
||
PUSHJ P,GETPAG ; GET THEN
|
||
JRST MAPLOS ; LOSSAGE
|
||
AOS -1(P) ; INDICATE WINNAGE
|
||
MAPLOS: POP P,A
|
||
POPJ P,
|
||
|
||
|
||
;GARBAGE ZEROING PHASE
|
||
GARZER: MOVE A,GCSTOP ;FIRST WORD OF GARBAGE IS AFTER PAIR SPACE
|
||
MOVE B,FRETOP ;LAST ADDRESS OF GARBAGE + 1
|
||
CAIL A,(B)
|
||
JRST GARZR1
|
||
CLEARM (A) ;ZERO THE FIRST WORD
|
||
CAIL A,-1(B) ; ARE WE AT THE TOP OF THE WORLD (FORMERLY CAML A,FRETOP)
|
||
JRST GARZR1 ; DON'T BLT
|
||
IFE ITS,[
|
||
MOVEI B,777(A)
|
||
ANDCMI B,777
|
||
]
|
||
HRLS A
|
||
ADDI A,1 ;MAKE A A BLT POINTER
|
||
BLT A,-1(B) ;AND COPY ZEROES INTO REST OF AREA
|
||
IFE ITS,[
|
||
|
||
; MAP UNWANTED PAGES OUT ON TWENEX (AFTER ZEROING REST OF LAST PAGE)
|
||
|
||
MOVE D,PURBOT
|
||
ASH D,-PGSZ
|
||
ASH B,-PGSZ
|
||
MOVNI A,1
|
||
MOVEI C,0
|
||
HRLI B,400000
|
||
|
||
GARZR2: CAIG D,(B)
|
||
JRST GARZR1
|
||
|
||
PMAP
|
||
AOJA B,GARZR2
|
||
]
|
||
|
||
|
||
; NOW REHASH THE ASSOCIATIONS BASED ON VALUES
|
||
GARZR1: PUSHJ P,REHASH
|
||
|
||
|
||
;RESTORE AC'S
|
||
TRYCOX: SKIPN GCMONF
|
||
JRST NOMONO
|
||
MOVEI B,[ASCIZ /GOUT /]
|
||
PUSHJ P,MSGTYP
|
||
NOMONO: MOVE PVP,PVSTOR+1
|
||
IRP AC,,[0,A,B,C,D,E,P,R,M,SP,TP,TB,AB,TVP,FRM]
|
||
MOVE AC,AC!STO+1(PVP)
|
||
TERMIN
|
||
SKIPN DSTORE
|
||
SETZM DSTO(PVP)
|
||
MOVE PVP,PVPSTO+1(PVP)
|
||
|
||
; CLOSING ROUTINE FOR G-C
|
||
PUSH P,A ; SAVE AC'C
|
||
PUSH P,B
|
||
PUSH P,C
|
||
PUSH P,D
|
||
|
||
MOVE A,FRETOP ; ADJUST BLOAT-STAT PARAMETERS
|
||
SUB A,GCSTOP
|
||
ADDM A,NOWFRE
|
||
PUSHJ P,GCSET ; FIX UP BLOAT-STAT PARAMETERS
|
||
MOVE A,CURTP
|
||
ADDM A,NOWTP
|
||
MOVE A,CURP
|
||
ADDM A,NOWP
|
||
|
||
PUSHJ P,CTIME
|
||
FSBR B,GCTIM ; GET TIME ELAPSED
|
||
SKIPN INBLOT ; STORE TIME ONLY IF NO RETRY
|
||
SKIPN GCDANG
|
||
MOVEM B,GCTIM ; SAVE ELAPSED TIME FOR INT-HANDLER
|
||
SKIPN GCMONF ; SEE IF MONITORING
|
||
JRST GCCONT
|
||
PUSHJ P,FIXSEN ; OUTPUT TIME
|
||
MOVEI A,15 ; OUTPUT C/R LINE-FEED
|
||
PUSHJ P,IMTYO
|
||
MOVEI A,12
|
||
PUSHJ P,IMTYO
|
||
GCCONT: MOVE C,[NTPGOO,,NTPMAX] ; MAY FIX UP TP PARAMS TO ENCOURAGE
|
||
; SHRINKAGE FOR EXTRA ROOM
|
||
SKIPE GCDANG
|
||
MOVE C,[ETPGOO,,ETPMAX]
|
||
HLRZM C,TPGOOD
|
||
HRRZM C,TPMAX
|
||
POP P,D ; RESTORE AC'C
|
||
POP P,C
|
||
POP P,B
|
||
POP P,A
|
||
MOVE A,GCDANG
|
||
JUMPE A,AGCWIN ; IF ZERO THE GC WORKED
|
||
SKIPN GCHAIR ; SEE IF HAIRY GC
|
||
JRST BTEST
|
||
REAGCX: MOVEI A,1 ; PREPARE FOR A HAIRY GC
|
||
MOVEM A,GCHAIR
|
||
SETZM GCDANG
|
||
MOVE C,[11,,10.] ; REASON FOR GC
|
||
JRST IAGC
|
||
|
||
BTEST: SKIPE INBLOT
|
||
JRST AGCWIN
|
||
FATAL AGC--NO CORE AVAILABLE TO SATISFY REQUESTS
|
||
JRST REAGCX
|
||
|
||
AGCWIN: SETZM PARNEW ;CLEAR FOR NEXT AGC CALL
|
||
SETZM GETNUM ;ALSO CLEAR THIS
|
||
SETZM INBLOT
|
||
SETZM GCFLG
|
||
|
||
SETZM PGROW ; CLEAR GROWTH
|
||
SETZM TPGROW
|
||
SETOM GCHAPN ; INDICATE A GC HAS HAPPENED
|
||
SETOM GCHPN
|
||
SETOM INTFLG ; AND REQUEST AN INTERRUPT
|
||
SETZM GCDOWN
|
||
PUSHJ P,RBLDM
|
||
; JUMPE R,FINAGC
|
||
; JUMPN M,FINAGC ; IF M 0, RUNNING RSUBR SWAPPED OUT
|
||
; SKIPE PLODR ; LOADING ONE, M = 0 IS OK
|
||
JRST FINAGC
|
||
|
||
FATAL AGC--RUNNING RSUBR WENT AWAY
|
||
|
||
AGCE1: FATAL AGC--TYPE VECTOR NOT OF TYPE VECTOR
|
||
|
||
; CONVERSION FROM FLOAT TO DECIMAL. X 100 AND SEND OUT WITH APPROPRIATELY PLACED DECIMAL
|
||
; POINT.
|
||
|
||
FIXSEN: PUSH P,B ; SAVE TIME
|
||
MOVEI B,[ASCIZ /TIME= /]
|
||
PUSHJ P,MSGTYP ; PRINT OUT MESSAGE
|
||
POP P,B ; RESTORE B
|
||
FMPRI B,(100.0) ; CONVERT TO FIX
|
||
MULI B,400
|
||
TSC B,B
|
||
ASH C,-163.(B)
|
||
MOVEI A,1 ; INITIALIZE COUNT OF CHARACTERS FOR PUTTING OUT TIME
|
||
PUSH P,C
|
||
IDIVI C,10. ; START COUNTING
|
||
JUMPLE C,.+2
|
||
AOJA A,.-2
|
||
POP P,C
|
||
CAIN A,1 ; SEE IF THERE IS ONLY ONE CHARACTER
|
||
JRST DOT1
|
||
FIXOUT: IDIVI C,10. ; RECOVER NUMBER
|
||
HRLM D,(P)
|
||
SKIPE C
|
||
PUSHJ P,FIXOUT
|
||
PUSH P,A ; SAVE A
|
||
CAIN A,2 ; DECIMAL POINT HERE?
|
||
JRST DOT2
|
||
FIX1: HLRZ A,(P)-1 ; GET NUMBER
|
||
ADDI A,60 ; MAKE IT A CHARACTER
|
||
PUSHJ P,IMTYO ; OUT IT GOES
|
||
POP P,A
|
||
SOJ A,
|
||
POPJ P,
|
||
DOT1: MOVEI A,". ; OUTPUT DECIMAL POINT AND PADDING 0
|
||
PUSHJ P,IMTYO
|
||
MOVEI A,"0
|
||
PUSHJ P,IMTYO
|
||
JRST FIXOUT ; CONTINUE
|
||
DOT2: MOVEI A,". ; OUTPUT DECIMAL POINT
|
||
PUSHJ P,IMTYO
|
||
JRST FIX1
|
||
|
||
|
||
; SUBROUTINE TO CHECK SIZE OF PDLS AND DO FENCEPOSTING
|
||
|
||
PDLCHK: JUMPGE A,CPOPJ
|
||
HLRE B,A ;GET NEGATIVE COUNT
|
||
MOVE C,A ;SAVE A COPY OF PDL POINTER
|
||
SUBI A,-1(B) ;LOCATE DOPE WORD PAIR
|
||
HRRZS A ; ISOLATE POINTER
|
||
CAME A,TPGROW ;GROWING?
|
||
ADDI A,PDLBUF ;NO, POINT TO REAL DOPE WORD
|
||
MOVMS B
|
||
CAIN A,2(C)
|
||
JRST NOFENC
|
||
SETOM 1(C) ; START FENECE POST
|
||
CAIN A,3(C)
|
||
JRST NOFENC
|
||
MOVSI D,1(C) ;YES, SET UP TO BLT FENCE POSTS
|
||
HRRI D,2(C)
|
||
BLT D,-2(A) ;FENCE POST ALL EXCEPT DOPE WORDS
|
||
|
||
|
||
NOFENC: CAMG B,TPMAX ;NOW CHECK SIZE
|
||
CAMG B,TPMIN
|
||
JRST MUNGTP ;TOO BIG OR TOO SMALL
|
||
POPJ P,
|
||
|
||
MUNGTP: SUB B,TPGOOD ;FIND DELTA TP
|
||
MUNG3: MOVE C,-1(A) ;IS GROWTH ALREADY SPECIFIED
|
||
TRNE C,777000 ;SKIP IF NOT
|
||
POPJ P, ;ASSUME GROWTH GIVEN WILL WIN
|
||
|
||
ASH B,-6 ;CONVERT TO NUMBER OF BLOCKS
|
||
JUMPLE B,MUNGT1
|
||
CAILE B,377 ; SKIP IF BELOW MAX
|
||
MOVEI B,377 ; ELSE USE MAX
|
||
TRO B,400 ;TURN ON SHRINK BIT
|
||
JRST MUNGT2
|
||
MUNGT1: MOVMS B
|
||
ANDI B,377
|
||
MUNGT2: DPB B,[111100,,-1(A)] ;STORE IN DOPE WORD
|
||
POPJ P,
|
||
|
||
; CHECK UNMARKED STACK (NO NEED TO FENCE POST)
|
||
|
||
PDLCHP: HLRE B,A ;-LENGTH TO B
|
||
MOVE C,A
|
||
SUBI A,-1(B) ;POINT TO DOPE WORD
|
||
HRRZS A ;ISOLATE POINTER
|
||
CAME A,PGROW ;GROWING?
|
||
ADDI A,PDLBUF ;NO, POINT TO REAL DOPE WORD
|
||
MOVMS B
|
||
CAIN A,2(C)
|
||
JRST NOPF
|
||
SETOM 1(C) ; START FENECE POST
|
||
CAIN A,3(C)
|
||
JRST NOPF
|
||
MOVSI D,1(C)
|
||
HRRI D,2(C)
|
||
BLT D,-2(A)
|
||
|
||
NOPF: CAMG B,PMAX ;TOO BIG?
|
||
CAMG B,PMIN ;OR TOO LITTLE
|
||
JRST .+2 ;YES, MUNG IT
|
||
POPJ P,
|
||
SUB B,PGOOD
|
||
JRST MUNG3
|
||
|
||
|
||
; ROUTINE TO PRE MARK SPECIAL HACKS
|
||
|
||
PRMRK: SKIPE GCHAIR ; FLUSH IF NO HAIR
|
||
POPJ P,
|
||
PRMRK2: HLRE B,A
|
||
SUBI A,(B) ;POINT TO DOPE WORD
|
||
HLRZ F,1(A) ; GET LNTH
|
||
LDB 0,[111100,,(A)] ; GET GROWTHS
|
||
TRZE 0,400 ; SIGN HACK
|
||
MOVNS 0
|
||
ASH 0,6 ; TO WORDS
|
||
ADD F,0
|
||
LDB 0,[001100,,(A)]
|
||
TRZE 0,400
|
||
MOVNS 0
|
||
ASH 0,6
|
||
ADD F,0
|
||
PUSHJ P,ALLOGC
|
||
HRRM 0,1(A) ; NEW RELOCATION FIELD
|
||
IORM D,1(A) ;AND MARK
|
||
POPJ P,
|
||
|
||
|
||
;GENERAL MARK SUBROUTINE. CALLED TO MARK ALL THINGS
|
||
; A/ GOODIE TO MARK FROM
|
||
; B/ TYPE OF A (IN RH)
|
||
; C/ TYPE,DATUM PAIR POINTER
|
||
|
||
MARK2A:
|
||
MARK2: HLRZ B,(C) ;GET TYPE
|
||
MARK1: MOVE A,1(C) ;GET GOODIE
|
||
MARK: SKIPN DUMFLG
|
||
JUMPE A,CPOPJ ; NEVER MARK 0
|
||
MOVEI 0,1(A)
|
||
CAIL 0,@PURBOT
|
||
JRST GCRETD
|
||
MARCON: PUSH P,A
|
||
HRLM C,-1(P) ;AND POINTER TO IT
|
||
ANDI B,TYPMSK ; FLUSH MONITORS
|
||
SKIPE DUMFLG ; SKIP IF NOT IN DUMPER
|
||
PUSHJ P,TYPHK ; HACK SOME TYPES
|
||
LSH B,1 ;TIMES 2 TO GET SAT
|
||
HRRZ B,@TYPNT ;GET SAT
|
||
ANDI B,SATMSK
|
||
JUMPE A,GCRET
|
||
CAILE B,NUMSAT ; SKIP IF TEMPLATE DATA
|
||
JRST TD.MRK
|
||
SKIPN GCDFLG
|
||
IFN ITS,[
|
||
JRST @MKTBS(B) ;AND GO MARK
|
||
JRST @GCDISP(B) ; DISPATCH FOR DUMPERS
|
||
]
|
||
IFE ITS,[
|
||
SKIPA E,MKTBS(B)
|
||
MOVE E,GCDISP(B)
|
||
HRLI E,-1
|
||
JRST (E)
|
||
]
|
||
; HERE TO MARK A POSSIBLE DEFER POINTER
|
||
|
||
DEFQMK: GETYP B,(A) ; GET ITS TYPE
|
||
LSH B,1
|
||
HRRZ B,@TYPNT
|
||
ANDI B,SATMSK ; AND TO SAT
|
||
SKIPGE MKTBS(B)
|
||
|
||
;HERE TO MARK THAT WHICH IS POINTED TO BY A DEFERRED POINTER
|
||
|
||
DEFMK: TLOA TYPNT,400000 ;USE SIGN BIT AS FLAG
|
||
|
||
;HERE TO MARK LIST ELEMENTS
|
||
|
||
PAIRMK: TLZ TYPNT,400000 ;TURN OF DEFER BIT
|
||
PUSH P,[0] ; WILL HOLD BACK PNTR
|
||
MOVEI C,(A) ; POINT TO LIST
|
||
PAIRM1: CAMGE C,PARTOP ;CHECK FOR BEING IN BOUNDS
|
||
CAMGE C,PARBOT
|
||
FATAL AGC--MARKED PAIR OUTSIDE PAIR SPACE
|
||
SKIPGE B,(C) ;SKIP IF NOT MARKED
|
||
JRST RETNEW ;ALREADY MARKED, RETURN
|
||
IORM D,(C) ;MARK IT
|
||
SKIPL FPTR ; SEE IF IN FRONTEIR
|
||
PUSHJ P,MOVFNT ; EXPAND THE FRONTEIR
|
||
MOVEM B,FRONT(FPTR)
|
||
MOVE 0,1(C) ; AND 2D
|
||
AOBJN FPTR,.+2 ; AOS AND CHECK FRONTEIR
|
||
PUSHJ P,MOVFNT ; EXPAND FRONTEIR
|
||
MOVEM 0,FRONT(FPTR)
|
||
ADD FPTR,[1,,1] ; MOVE ALONG IN FRONTIER
|
||
|
||
|
||
PAIRM2: MOVEI A,@BOTNEW ; GET INF ADDR
|
||
SUBI A,2
|
||
HRRM A,(C) ; LEAVE A POINTER TO NEW HOME
|
||
HRRZ E,(P) ; GET BACK POINTER
|
||
JUMPE E,PAIRM7 ; 1ST ONE, NEW FIXUP
|
||
MOVSI 0,(HRRM) ; INS FOR CLOBBER
|
||
PUSHJ P,SMINF ; SMASH INF'S CORE IMAGE
|
||
PAIRM4: MOVEM A,(P) ; NEW BACK POINTER
|
||
JUMPL TYPNT,DEFDO ;GO HANDLE DEFERRED POINTER
|
||
HRLM B,(P) ; SAVE OLD CDR
|
||
PUSHJ P,MARK2 ;MARK THIS DATUM
|
||
HRRZ E,(P) ; SMASH CAR IN CASE CHANGED
|
||
ADDI E,1
|
||
MOVSI 0,(MOVEM)
|
||
PUSHJ P,SMINF
|
||
HLRZ C,(P) ;GET CDR OF LIST
|
||
CAIGE C,@PURBOT ; SKIP IF PURE (I.E. DONT MARK)
|
||
JUMPN C,PAIRM1 ;IF NOT NIL, MARK IT
|
||
GCRETP: SUB P,[1,,1]
|
||
|
||
GCRET: TLZ TYPNT,400000 ;FOR PAIRMKS BENEFIT
|
||
HLRZ C,-1(P) ;RESTORE C
|
||
POP P,A
|
||
POPJ P, ;AND RETURN TO CALLER
|
||
|
||
GCRETD: ANDI B,TYPMSK ; TURN OFF MONITORS
|
||
CAIN B,TLOCR ; SEE IF A LOCR
|
||
JRST MARCON
|
||
SKIPN GCDFLG ; SKIP IF IN PURIFIER OR DUMPER
|
||
POPJ P,
|
||
CAIE B,TATOM ; WE MARK PURE ATOMS
|
||
CAIN B,TCHSTR ; AND STRINGS
|
||
JRST MARCON
|
||
POPJ P,
|
||
|
||
;HERE TO MARK DEFERRED POINTER
|
||
|
||
DEFDO: PUSH P,B ; PUSH OLD PAIR ON STACK
|
||
PUSH P,1(C)
|
||
MOVEI C,-1(P) ; USE AS NEW DATUM
|
||
PUSHJ P,MARK2 ;MARK THE DATUM
|
||
HRRZ E,-2(P) ; GET POINTER IN INF CORE
|
||
ADDI E,1
|
||
MOVSI 0,(MOVEM)
|
||
PUSHJ P,SMINF ; AND CLOBBER
|
||
HRRZ E,-2(P)
|
||
MOVE A,-1(P)
|
||
MOVSI 0,(HRRM) ; SMASH IN RIGHT HALF
|
||
PUSHJ P,SMINF
|
||
SUB P,[3,,3]
|
||
JRST GCRET ;AND RETURN
|
||
|
||
|
||
PAIRM7: MOVEM A,-1(P) ; SAVE NEW VAL FOR RETURN
|
||
JRST PAIRM4
|
||
|
||
RETNEW: HRRZ A,(C) ; POINT TO NEW WORLD LOCN
|
||
HRRZ E,(P) ; BACK POINTER
|
||
JUMPE E,RETNW1 ; NONE
|
||
MOVSI 0,(HRRM)
|
||
PUSHJ P,SMINF
|
||
JRST GCRETP
|
||
|
||
RETNW1: MOVEM A,-1(P)
|
||
JRST GCRETP
|
||
|
||
; ROUTINE TO EXPAND THE FRONTEIR
|
||
|
||
MOVFNT: PUSH P,B ; SAVE REG B
|
||
HRRZ A,BOTNEW ; CURRENT BOTTOM OF WINDOW
|
||
ADDI A,2000 ; MOVE IT UP
|
||
HRRM A,BOTNEW
|
||
HRRZM A,FNTBOT ; BOTTOM OF FRONTEIR
|
||
MOVEI B,FRNP
|
||
ASH A,-10. ; TO PAGES
|
||
PUSHJ P,%GETIP
|
||
PUSHJ P,%SHWND ; SHARE THE PAGE
|
||
MOVSI FPTR,-2000 ; FIX UP FPTR
|
||
POP P,B
|
||
POPJ P,
|
||
|
||
|
||
; ROUTINE TO SMASH INFERIORS PPAGES
|
||
; E/ ADDR IN INF, A/ THING TO SMASH ,0/ INS TO USE
|
||
|
||
SMINF: CAMGE E,FNTBOT
|
||
JRST SMINF1 ; NOT IN FRONTEIR
|
||
SUB E,FNTBOT ; ADJUST POINTER
|
||
IOR 0,[0 A,FRONT(E)] ; BUILD INSTRUCTION
|
||
XCT 0 ; XCT IT
|
||
POPJ P, ; EXIT
|
||
SMINF1: CAML E,WNDBOT
|
||
CAML E,WNDTOP ; SEE IF IN WINDOW
|
||
JRST SMINF2
|
||
SMINF3: SUB E,WNDBOT ; FIX UP
|
||
IOR 0,[0 A,WIND(E)] ; FIX INS
|
||
XCT 0
|
||
POPJ P,
|
||
SMINF2: PUSH P,A ; SAVE E
|
||
PUSH P,B ; SAVE B
|
||
HRRZ A,E ; E SOMETIMES HAS STUFF IN LH
|
||
ASH A,-10.
|
||
MOVEI B,WNDP ; WINDOW PAGE
|
||
PUSHJ P,%SHWND ; SHARE IT
|
||
ASH A,10. ; TO PAGES
|
||
MOVEM A,WNDBOT ; UPDATE POINTERS
|
||
ADDI A,2000
|
||
MOVEM A,WNDTOP
|
||
POP P,B ; RESTORE ACS
|
||
POP P,A
|
||
JRST SMINF3 ; FIX UP INF
|
||
|
||
|
||
|
||
; VECTOR AND TP MARKER, SIGN OF TYPNT IS SET BASED ON WHICH ONE
|
||
|
||
TPMK: TLOA TYPNT,400000 ;SET TP MARK FLAG
|
||
VECTMK: TLZ TYPNT,400000
|
||
MOVEI 0,@BOTNEW ; POINTER TO INF
|
||
PUSH P,0
|
||
MOVEI E,(A) ;SAVE A POINTER TO THE VECTOR
|
||
HLRE B,A ;GET -LNTH
|
||
SUB A,B ;LOCATE DOPE WORD
|
||
MOVEI A,1(A) ;ZERO LH AND POINT TO 2ND DOPE WORD
|
||
CAIL A,STOSTR ; CHECK IN VECTOR SPACE
|
||
CAMLE A,GCSTOP
|
||
JRST VECTB1 ;LOSE, COMPLAIN
|
||
|
||
HLLM TYPNT,(P) ; SAVE MARKER INDICATING STACK
|
||
JUMPGE TYPNT,NOBUFR ;IF A VECTOR, NO BUFFER CHECK
|
||
CAME A,PGROW ;IS THIS THE BLOWN P
|
||
CAMN A,TPGROW ;IS THIS THE GROWING PDL
|
||
JRST NOBUFR ;YES, DONT ADD BUFFER
|
||
ADDI A,PDLBUF ;POINT TO REAL DOPE WORD
|
||
MOVSI 0,-PDLBUF ;ALSO FIX UP POINTER
|
||
ADD 0,1(C)
|
||
MOVEM 0,-1(P) ; FIXUP RET'D PNTR
|
||
|
||
NOBUFR: HLRE B,(A) ;GET LENGTH FROM DOPE WORD
|
||
JUMPL B,EXVECT ; MARKED, LEAVE
|
||
LDB B,[111100,,-1(A)] ; GET TOP GROWTH
|
||
TRZE B,400 ; HACK SIGN BIT
|
||
MOVNS B
|
||
ASH B,6 ; CONVERT TO WORDS
|
||
PUSH P,B ; SAVE TOP GROWTH
|
||
LDB 0,[001100,,-1(A)] ;GET GROWTH FACTOR
|
||
TRZE 0,400 ;KILL SIGN BIT AND SKIP IF +
|
||
MOVNS 0 ;NEGATE
|
||
ASH 0,6 ;CONVERT TO NUMBER OF WORDS
|
||
PUSH P,0 ; SAVE BOTTOM GROWTH
|
||
ADD B,0 ;TOTAL GROWTH TO B
|
||
VECOK: HLRE E,(A) ;GET LENGTH AND MARKING
|
||
MOVEI F,(E) ;SAVE A COPY
|
||
ADD F,B ;ADD GROWTH
|
||
SUBI E,2 ;- DOPE WORD LENGTH
|
||
IORM D,(A) ;MAKE SURE NOW MARKED
|
||
PUSHJ P,ALLOGC ; ALLOCATE SPACE FOR VECTOR IN THE INF
|
||
HRRM 0,(A)
|
||
VECOK1: JUMPLE E,MOVEC2 ; ZERO LENGTH, LEAVE
|
||
PUSH P,A ; SAVE POINTER TO DOPE WORD
|
||
SKIPGE B,-1(A) ;SKIP IF UNIFORM
|
||
TLNE B,377777-.VECT. ;SKIP IF NOT SPECIAL
|
||
JUMPGE TYPNT,NOTGEN ;JUMP IF NOT A GENERAL VECTOR
|
||
|
||
GENRAL: HLRZ 0,B ;CHECK FOR PSTACK
|
||
TRZ 0,.VECT.
|
||
JUMPE 0,NOTGEN ;IT ISN'T GENERAL
|
||
JUMPL TYPNT,TPMK1 ; JUMP IF TP
|
||
MOVEI C,(A)
|
||
SUBI C,1(E) ; C POINTS TO BEGINNING OF VECTOR
|
||
|
||
; LOOP TO MARK ELEMENTS IN A GENERAL VECTOR
|
||
VECTM2: HLRE B,(C) ;GET TYPE AND MARKING
|
||
JUMPL B,UMOVEC ;RETURN, (EITHER DOPE WORD OR FENCE POST)
|
||
MOVE A,1(C) ;DATUM TO A
|
||
|
||
|
||
VECTM3: PUSHJ P,MARK ;MARK DATUM
|
||
MOVEM A,1(C) ; IN CASE WAS FIXED
|
||
VECTM4: ADDI C,2
|
||
JRST VECTM2
|
||
|
||
UMOVEC: POP P,A
|
||
MOVEC2: POP P,C ; RESTORE BOTTOM GROWTH
|
||
HRRZ E,-1(P) ; GET POINTER INTO INF
|
||
SKIPN C ; SKIP IF NO BOTTOM GROWTH
|
||
JRST MOVEC3
|
||
JUMPL C,.+3 ; SEE IF BOTTOM SHRINKAGE
|
||
ADD E,C ; GROW IT
|
||
JRST MOVEC3 ; CONTINUE
|
||
HRLM C,E ; MOVE SHRINKAGE FOR TRANSFER PHASE
|
||
MOVEC3: PUSHJ P,DOPMOD ; MODIFY DOPE WORD AND PLACE IN INF
|
||
PUSHJ P,TRBLKV ; SEND VECTOR INTO INF
|
||
TGROT: CAMGE A,PARBOT ; SKIP IF NOT STORAGE
|
||
JRST TGROT1
|
||
MOVE C,DOPSV1 ; RESTORE DOPE WORD
|
||
SKIPN (P) ; DON'T RESTORE D.W.'S YET IF THERE IS GROWTH
|
||
MOVEM C,-1(A)
|
||
TGROT1: POP P,C ; IS THERE TOP GROWH
|
||
SKIPN C ; SEE IF ANY GROWTH
|
||
JRST DOPEAD
|
||
SUBI E,2
|
||
SKIPG C
|
||
JRST OUTDOP
|
||
PUSH P,C ; SAVE C
|
||
SETZ C, ; ZERO C
|
||
PUSHJ P,ADWD
|
||
ADDI E,1
|
||
SETZ C, ; ZERO WHERE OLD DOPE WORDS WERE
|
||
PUSHJ P,ADWD
|
||
POP P,C
|
||
ADDI E,-1(C) ; MAKE ADJUSTMENT FOR TOP GROWTH
|
||
OUTDOP: PUSHJ P,DOPOUT
|
||
DOPEAD:
|
||
EXVECT: HLRZ B,(P)
|
||
SUB P,[1,,1] ; GET RID OF FPTR
|
||
PUSHJ P,RELATE ; RELATIVIZE
|
||
TRNN B,400000 ; WAS THIS A STACK
|
||
JRST GCRET
|
||
MOVSI 0,PDLBUF ; FIX UP STACK PTR
|
||
ADDM 0,(P)
|
||
JRST GCRET ; EXIT
|
||
|
||
VECLOS: JUMPL C,CCRET ;JUMP IF CAN'T MUNG TYPE
|
||
HLLZ 0,(C) ;GET TYPE
|
||
MOVEI B,TILLEG ;GET ILLEGAL TYPE
|
||
HRLM B,(C)
|
||
MOVEM 0,1(C) ;AND STORE OLD TYPE AS VALUE
|
||
JRST UMOVEC ;RETURN WITHOUT MARKING VECTOR
|
||
|
||
CCRET: CLEARM 1(C) ;CLOBBER THE DATUM
|
||
JRST GCRET
|
||
|
||
|
||
; ROUTINE TO MARK A TP. IT SCANS THE TP. IT MARKS ALL THE ITEMS AND IT MAPS AN
|
||
; UPDATED VERSION INTO THE INFERIOR WITHOUT CHANGING THE ORIGINAL.
|
||
|
||
TPMK1:
|
||
TPMK2: POP P,A
|
||
POP P,C
|
||
HRRZ E,-1(P) ; FIX UP PARAMS
|
||
ADDI E,(C)
|
||
PUSH P,A ; REPUSH A
|
||
HRRZ B,(A) ; CALCULATE RELOCATION
|
||
SUB B,A
|
||
MOVE C,-1(P) ; ADJUST FOR GROWTH
|
||
SUB B,C
|
||
HRLZS C
|
||
PUSH P,C
|
||
PUSH P,B
|
||
PUSH P,E
|
||
PUSH P,[0]
|
||
TPMK3: HLRZ E,(A) ; GET LENGTH
|
||
TRZ E,400000 ; GET RID OF MARK BIT
|
||
SUBI A,-1(E) ;POINT TO FIRST ELEMENT
|
||
MOVEI C,(A) ;POINT TO FIRST ELEMENT WITH C
|
||
TPMK4: HLRE B,(C) ;GET TYPE AND MARKING
|
||
JUMPL B,TPMK7 ;RETURN, (EITHER DOPE WORD OR FENCE POST)
|
||
HRRZ A,(C) ;DATUM TO A
|
||
ANDI B,TYPMSK ; FLUSH MONITORS
|
||
CAIE B,TCBLK
|
||
CAIN B,TENTRY ;IS THIS A STACK FRAME
|
||
JRST MFRAME ;YES, MARK IT
|
||
CAIE B,TUBIND ; BIND
|
||
CAIN B,TBIND ;OR A BINDING BLOCK
|
||
JRST MBIND
|
||
CAIE B,TBVL ; CHECK FOR OTHER BINDING HACKS
|
||
CAIN B,TUNWIN
|
||
SKIPA ; FIX UP SP-CHAIN
|
||
CAIN B,TSKIP ; OTHER BINDING HACK
|
||
PUSHJ P,FIXBND
|
||
|
||
|
||
TPMK5: PUSH P,(C) ; SAVE BECAUSE FRAMES MIGHT MUNG IT
|
||
HRRM A,(C) ; FIX UP IN CASE OF SP CHAIN
|
||
PUSHJ P,MARK1 ;MARK DATUM
|
||
MOVE R,A ; SAVE A
|
||
POP P,M
|
||
MOVE A,(C)
|
||
PUSHJ P,OUTTP ; MOVE OUT TYPE
|
||
MOVE A,R
|
||
PUSHJ P,OUTTP ; SEND OUT VALUE
|
||
MOVEM M,(C) ; RESTORE TO OLD VALUE
|
||
TPMK6: ADDI C,2
|
||
JRST TPMK4
|
||
|
||
MFRAME: HRRZ 0,1(C) ; SET UP RELITIVIZATION OF PTR TO PREVIOUS FRAME
|
||
HRROI C,FRAMLN+FSAV-1(C) ;POINT TO FUNCTION
|
||
HRRZ A,1(C) ; GET IT
|
||
CAIL A,STOSTR ; CHECK IN VECTOR SPACE
|
||
CAMLE A,GCSTOP
|
||
JRST MFRAM1 ; IGNORE, NOT IN VECTOR SPACE
|
||
HRL A,(A) ; GET LENGTH
|
||
MOVEI B,TVEC
|
||
PUSHJ P,MARK ; AND MARK IT
|
||
MFRAM1: HLL A,1(C)
|
||
PUSHJ P,OUTTP ; SEND IT OUT
|
||
HRRZ A,OTBSAV-FSAV+1(C) ; POINT TO TB TO PREVIOUS FRAME
|
||
SKIPE A
|
||
ADD A,-2(P) ; RELOCATE IF NOT 0
|
||
HLL A,2(C)
|
||
PUSHJ P,OUTTP ; SEND IT OUT
|
||
MOVE A,-2(P) ; ADJUST AB SLOT
|
||
ADD A,ABSAV-FSAV+1(C) ; POINT TO SAVED AB
|
||
PUSHJ P,OUTTP ; SEND IT OUT
|
||
MOVE A,-2(P) ; ADJUST SP SLOT
|
||
ADD A,SPSAV-FSAV+1(C) ;POINT TO SAVED SP
|
||
SUB A,-3(P) ; ADJUSTMENT OF LENGTH IF GROWTH
|
||
PUSHJ P,OUTTP ; SEND IT OUT
|
||
HRROI C,PSAV-FSAV(C) ;POINT TO SAVED P
|
||
MOVEI B,TPDL
|
||
PUSHJ P,MARK1 ;AND MARK IT
|
||
PUSHJ P,OUTTP ; SEND IT OUT
|
||
HLRE 0,TPSAV-PSAV+1(C)
|
||
MOVE A,TPSAV-PSAV+1(C)
|
||
SUB A,0
|
||
MOVEI 0,1(A)
|
||
MOVE A,TPSAV-PSAV+1(C)
|
||
CAME 0,TPGROW ; SEE IF BLOWN
|
||
JRST MFRAM9
|
||
MOVSI 0,PDLBUF
|
||
ADD A,0
|
||
MFRAM9: ADD A,-2(P)
|
||
SUB A,-3(P) ; ADJUST
|
||
PUSHJ P,OUTTP
|
||
MOVE A,PCSAV-PSAV+1(C)
|
||
PUSHJ P,OUTTP
|
||
HRROI C,-PSAV+1(C) ; POINT PAST THE FRAME
|
||
JRST TPMK4 ;AND DO MORE MARKING
|
||
|
||
|
||
MBIND: PUSHJ P,FIXBND
|
||
MOVEI B,TATOM ;FIRST MARK ATOM
|
||
SKIPN GCHAIR ; IF NO HAIR, MARK ALL NOW
|
||
SKIPE (P) ; PASSED MARKER, IF SO DONT SKIP
|
||
JRST MBIND2 ; GO MARK
|
||
MOVE A,1(C) ; RESTORE A
|
||
CAME A,GCATM
|
||
JRST MBIND1 ; NOT IT, CONTINUE SKIPPING
|
||
HRRM LPVP,2(C) ; SAVE IN RH OF TPVP,,0
|
||
MOVE 0,-4(P) ; RECOVER PTR TO DOPE WORD
|
||
HRLM 0,2(C) ; SAVE FOR MOVEMENT
|
||
MOVEI B,TATOM ; MARK THE BINDING TO THIS PROCESS
|
||
PUSHJ P,MARK1 ; MARK THE ATOM
|
||
MOVEI LPVP,(C) ; POINT
|
||
SETOM (P) ; INDICATE PASSAGE
|
||
MBIND1: ADDI C,6 ; SKIP BINDING
|
||
MOVEI 0,6
|
||
SKIPE -1(P) ; ONLY UPDATE IF SENDING OVER
|
||
ADDM 0,-1(P)
|
||
JRST TPMK4
|
||
|
||
MBIND2: HLL A,(C)
|
||
PUSHJ P,OUTTP ; FIX UP CHAIN
|
||
MOVEI B,TATOM ; RESTORE IN CASE SMASHED
|
||
PUSHJ P,MARK1 ; MARK ATOM
|
||
PUSHJ P,OUTTP ; SEND IT OUT
|
||
ADDI C,2
|
||
PUSH P,(C) ; SAVE BECAUSE FRAMES MIGHT MUNG IT
|
||
PUSHJ P,MARK2 ;MARK DATUM
|
||
MOVE R,A ; SAVE A
|
||
POP P,M
|
||
MOVE A,(C)
|
||
PUSHJ P,OUTTP ; MOVE OUT TYPE
|
||
MOVE A,R
|
||
PUSHJ P,OUTTP ; SEND OUT VALUE
|
||
MOVEM M,(C) ; RESTORE TO OLD VALUE
|
||
ADDI C,2
|
||
MOVEI B,TLIST ; POINT TO DECL SPECS
|
||
HLRZ A,(C)
|
||
PUSHJ P,MARK ; AND MARK IT
|
||
HRR A,(C) ; LIST FIX UP
|
||
PUSHJ P,OUTTP
|
||
SKIPL A,1(C) ; PREV LOC?
|
||
JRST NOTLCI
|
||
MOVEI B,TLOCI ; NOW MARK LOCATIVE
|
||
PUSHJ P,MARK1
|
||
NOTLCI: PUSHJ P,OUTTP
|
||
ADDI C,2
|
||
JRST TPMK4
|
||
|
||
FIXBND: HRRZ A,(C) ; GET PTR TO CHAIN
|
||
SKIPE A ; DO NOTHING IF EMPTY
|
||
ADD A,-3(P)
|
||
POPJ P,
|
||
TPMK7:
|
||
TPMK8: MOVNI A,1 ; FENCE-POST THE STACK
|
||
PUSHJ P,OUTTP
|
||
ADDI C,1 ; INCREMENT C FOR FENCE-POST
|
||
SUB P,[1,,1] ; CLEAN UP STACK
|
||
POP P,E ; GET UPDATED PTR TO INF
|
||
SUB P,[2,,2] ; POP OFF RELOCATION
|
||
HRRZ A,(P)
|
||
HLRZ B,(A)
|
||
TRZ B,400000
|
||
SUBI A,-1(B)
|
||
SUBI C,(A) ; GET # OF WORDS TRANSFERED
|
||
SUB B,C ; GET # LEFT
|
||
ADDI E,-2(B) ; ADJUST POINTER TO INF
|
||
POP P,A
|
||
POP P,C ; IS THERE TOP GROWH
|
||
ADD E,C ; MAKE ADJUSTMENT FOR TOP GROWTH
|
||
ANDI E,-1
|
||
PUSHJ P,DOPMOD ; FIX UP DOPE WORDS
|
||
PUSHJ P,DOPOUT ; SEND THEM OUT
|
||
JRST DOPEAD
|
||
|
||
|
||
; ROUTINE TO ALLOCATE ROOM FOR VECTORS IN INFERIOR
|
||
; F= # OF WORDS TO ALLOCATE
|
||
|
||
ALLOGC: HRRZS A ; GET ABS VALUE
|
||
SKIPN GCDFLG ; SKIP IF IN DUMPER
|
||
CAML A,GCSBOT ; SKIP IF IN STORAGE
|
||
JRST ALOGC2 ; JUMP IF ALLOCATING
|
||
HRRZ 0,A
|
||
POPJ P,
|
||
ALOGC2: PUSH P,A ; SAVE A
|
||
ALOGC1: HLRE 0,FPTR ; GET ROOM LEFT
|
||
ADD 0,F ; SEE IF ITS ENOUGH
|
||
JUMPL 0,ALOCOK
|
||
MOVE F,0 ; MODIFY F
|
||
PUSH P,F
|
||
PUSHJ P,MOVFNT ; MOVE UP FRONTEIR
|
||
POP P,F
|
||
JRST ALOGC1 ; CONTINUE
|
||
ALOCOK: ADD FPTR,F ; MODIFY FPTR
|
||
HRLZS F
|
||
ADD FPTR,F
|
||
POP P,A ; RESTORE A
|
||
MOVEI 0,@BOTNEW
|
||
SUBI 0,1 ; RELOCATION PTR
|
||
POPJ P, ; EXIT
|
||
|
||
|
||
|
||
|
||
; TRBLK MOVES A VECTOR INTO THE INFERIOR
|
||
; E= STARTING ADDR IN INF A= DOPE WORD OF VECTOR
|
||
|
||
TRBLK: HRRZS A
|
||
SKIPE GCDFLG
|
||
JRST TRBLK7
|
||
CAMGE A,GCSBOT ; SEE IF IN GC-SPACE
|
||
JRST FIXDOP
|
||
TRBLK7: PUSH P,A
|
||
HLRZ 0,(A)
|
||
TRZ 0,400000 ; TURN OFF GC FLAG
|
||
HRRZ F,A
|
||
HLRE A,E ; GET SHRINKAGE
|
||
ADD 0,A ; MUNG LENGTH
|
||
SUB F,0
|
||
ADDI F,1 ; F POINTS TO START OF VECTOR
|
||
TRBLK2: HRRZ R,E ; SAVE POINTER TO INFERIOR
|
||
ADD E,0 ; E NOW POINTS TO FINAL ADDRESS+1
|
||
MOVE M,E ;SAVE E
|
||
TRBLK1: MOVE 0,R
|
||
SUBI E,1
|
||
CAMGE R,FNTBOT ; SEE IF IN FRONTEIR
|
||
JRST TRBL10
|
||
SUB E,FNTBOT ; ADJUST E
|
||
SUB 0,FNTBOT ; ADJ START
|
||
MOVEI A,FRONT+1777
|
||
JRST TRBLK4
|
||
TRBL10: CAML R,WNDBOT
|
||
CAML R,WNDTOP ; SEE IF IN WINDOW
|
||
JRST TRBLK5 ; NO
|
||
SUB E,WNDBOT
|
||
SUB 0,WNDBOT
|
||
MOVEI A,WIND+1777
|
||
TRBLK4: ADDI 0,-1777(A) ; CALCULATE START IN WINDOW OR FRONTEIR
|
||
CAIL E,2000
|
||
JRST TRNSWD
|
||
ADDI E,-1777(A) ; SUBTRACT WINDBOT
|
||
HRL 0,F ; SET UP FOR BLT
|
||
BLT 0,(E)
|
||
POP P,A
|
||
|
||
FIXDOP: IORM D,(A)
|
||
MOVE E,M ; GET END OF WORD
|
||
POPJ P,
|
||
TRNSWD: PUSH P,B
|
||
MOVEI B,1(A) ; GET TOP OF WORLD
|
||
SUB B,0
|
||
HRL 0,F
|
||
BLT 0,(A)
|
||
ADD F,B ; ADJUST F
|
||
ADD R,B
|
||
POP P,B
|
||
MOVE E,M ; RESTORE E
|
||
JRST TRBLK1 ; CONTINUE
|
||
TRBLK5: HRRZ A,R ; COPY E
|
||
ASH A,-10. ; TO PAGES
|
||
PUSH P,B ; SAVE B
|
||
MOVEI B,WNDP ; IT IS WINDOW
|
||
PUSHJ P,%SHWND
|
||
ASH A,10. ; TO PAGES
|
||
MOVEM A,WNDBOT ; UPDATE POINTERS
|
||
ADDI A,2000
|
||
MOVEM A,WNDTOP
|
||
POP P,B ; RESTORE B
|
||
JRST TRBL10
|
||
|
||
|
||
|
||
|
||
; ALTERNATE ENTRY FOR VECTORS WHICH TAKES CARE OF SHRINKAGE
|
||
|
||
TRBLKV: HRRZS A
|
||
SKIPE GCDFLG ; SKIP IF NOT IN DUMPER
|
||
JRST TRBLV2
|
||
CAMGE A,GCSBOT ; SEE IF IN GC-SPACE
|
||
JRST FIXDOP
|
||
TRBLV2: PUSH P,A ; SAVE A
|
||
HLRZ 0,DOPSV2
|
||
TRZ 0,400000
|
||
HRRZ F,A
|
||
HLRE A,E ; GET SHRINKAGE
|
||
ADD 0,A ; MUNG LENGTH
|
||
SUB F,0
|
||
ADDI F,1 ; F POINTS TO START OF VECTOR
|
||
SKIPGE -2(P) ; SEE IF SHRINKAGE
|
||
ADD 0,-2(P) ; IF SO COMPENSATE
|
||
JRST TRBLK2 ; CONTINUE
|
||
|
||
; ALTERNATE ENTRY POINT TO TRBLK A==> OBJECT TO SEND IN 0= # OF WORDS
|
||
|
||
TRBLK3: PUSH P,A ; SAVE A
|
||
MOVE F,A
|
||
JRST TRBLK2
|
||
|
||
; FINAL ALTERNATE ENTRY POINT TO TRBLK A==> OBJECT
|
||
; F==> START OF TRANSFER IN GCS 0= # OF WORDS
|
||
|
||
TRBLKX: PUSH P,A ; SAVE A
|
||
JRST TRBLK2 ; SEND IT OUT
|
||
|
||
|
||
; OUTTP IS THE ROUTINE THAT TPMK USES TO SEND OUT ELEMENTS FOR THE SCAN
|
||
; -2(P) CONTAINS THE ADDR IN THE INF AND IT IS UPDATED
|
||
; A CONTAINS THE WORD TO BE SENT OUT
|
||
|
||
OUTTP: AOS E,-2(P) ; INCREMENT PLACE
|
||
MOVSI 0,(MOVEM) ; INS FOR SMINF
|
||
SOJA E,SMINF
|
||
|
||
|
||
; ADWD PLACES ONE WORD IN THE INF
|
||
; E ==> INF C IS THE WORD
|
||
|
||
ADWD: PUSH P,E ; SAVE AC'S
|
||
PUSH P,A
|
||
MOVE A,C ; GET WORD
|
||
MOVSI 0,(MOVEM) ; INS FOR SMINF
|
||
PUSHJ P,SMINF ; SMASH IT IN
|
||
POP P,A
|
||
POP P,E
|
||
POPJ P, ; EXIT
|
||
|
||
; DOPOUT IS USED TO SEND OUT THE DOPE WORDS IN UNUSUAL CALSE
|
||
; SUCH AS THE TP AND GROWTH
|
||
|
||
|
||
DOPOUT: MOVE C,-1(A)
|
||
PUSHJ P,ADWD
|
||
ADDI E,1
|
||
MOVE C,(A) ; GET SECOND DOPE WORD
|
||
TLZ C,400000 ; TURN OFF POSSIBLE MARK BIT
|
||
PUSHJ P,ADWD
|
||
MOVE C,DOPSV1 ; FIX UP FIRST DOPE WORD
|
||
MOVEM C,-1(A)
|
||
MOVE C,DOPSV2
|
||
MOVEM C,(A) ; RESTORE SECOND D.W.
|
||
POPJ P,
|
||
|
||
; DOPMOD MODIFIES THE DOPE WORD OF A VECTOR AND PLACES A NEW DOPE-WORD IN INF
|
||
; A ==> DOPE WORD E==> INF
|
||
|
||
DOPMOD: SKIPE GCDFLG ; CHECK TO SEE IF IN DUMPER AND PURIFY
|
||
JRST .+3
|
||
CAMG A,GCSBOT
|
||
POPJ P, ; EXIT IF NOT IN GCS
|
||
MOVE C,-1(A) ; GET FIRST DOPE WORD
|
||
MOVEM C,DOPSV1
|
||
HLLZS C ; CLEAR OUT GROWTH
|
||
TLO C,.VECT. ; FIX UP FOR GCHACK
|
||
PUSH P,C
|
||
MOVE C,(A) ; GET SECOND DOPE WORD
|
||
HLRZ B,(A) ; GET LENGTH
|
||
TRZ B,400000 ; TURN OFF MARK BIT
|
||
MOVEM C,DOPSV2
|
||
HRRZ 0,-1(A) ; CHECK FOR GROWTH
|
||
JUMPE 0,DOPMD1
|
||
LDB 0,[111100,,-1(A)] ; MODIFY WITH GROWTH
|
||
TRZE 0,400
|
||
MOVNS 0
|
||
ASH 0,6
|
||
ADD B,0
|
||
LDB 0,[001100,,-1(A)]
|
||
TRZE 0,400
|
||
MOVNS 0
|
||
ASH 0,6
|
||
ADD B,0
|
||
DOPMD1: HRL C,B ; FIX IT UP
|
||
MOVEM C,(A) ; FIX IT UP
|
||
POP P,-1(A)
|
||
POPJ P,
|
||
|
||
ADPMOD: CAMG A,GCSBOT
|
||
POPJ P, ; EXIT IF NOT IN GCS
|
||
MOVE C,-1(A) ; GET FIRST DOPE WORD
|
||
TLO C,.VECT. ; FIX UP FOR GCHACK
|
||
MOVEM C,-1(A)
|
||
MOVE C,(A) ; GET SECOND DOPE WORD
|
||
TLZ C,400000 ; TURN OFF PARK BIT
|
||
MOVEM C,(A)
|
||
POPJ P,
|
||
|
||
|
||
|
||
|
||
; RELATE RELATAVIZES A POINTER TO A VECTOR
|
||
; B IS THE POINTER A==> DOPE WORD
|
||
|
||
RELATE: SKIPE GCDFLG ; SEE IF DUMPER OR PURIFIER
|
||
JRST .+3
|
||
CAMGE A,GCSBOT ; SEE IF IN VECTOR SPACE
|
||
POPJ P, ; IF NOT EXIT
|
||
MOVE C,-1(P)
|
||
HLRE F,C ; GET LENGTH
|
||
HRRZ 0,-1(A) ; CHECK FO GROWTH
|
||
JUMPE A,RELAT1
|
||
LDB 0,[111100,,-1(A)] ; GET TOP GROWTH
|
||
TRZE 0,400 ; HACK SIGN BIT
|
||
MOVNS 0
|
||
ASH 0,6 ; CONVERT TO WORDS
|
||
SUB F,0 ; ACCOUNT FOR GROWTH
|
||
RELAT1: HRLM F,C ; PLACE CORRECTED LENGTH BACK IN POINTER
|
||
HRRZ F,(A) ; GET RELOCATED ADDR
|
||
SUBI F,(A) ; FIND RELATIVIZATION AMOUNT
|
||
ADD C,F ; ADJUST POINTER
|
||
SUB C,0 ; ACCOUNT FOR GROWTH
|
||
MOVEM C,-1(P)
|
||
POPJ P,
|
||
|
||
|
||
|
||
; MARK TB POINTERS
|
||
TBMK: HRRZS A ; CHECK FOR NIL POINTER
|
||
SKIPN A
|
||
JRST GCRET ; IF POINTING TO NIL THEN RETURN
|
||
HLRE B,TPSAV(A) ; MAKE POINTER LOOK LIKE A TP POINTER
|
||
HRRZ C,TPSAV(A) ; GET TO DOPE WORD
|
||
TBMK2: SUB C,B ; POINT TO FIRST DOPE WORD
|
||
HRRZ A,(P) ; GET PTR TO FRAME
|
||
SUB A,C ; GET PTR TO FRAME
|
||
HRLS A
|
||
HRR A,(P)
|
||
PUSH P,A
|
||
MOVEI C,-1(P)
|
||
MOVEI B,TTP
|
||
PUSHJ P,MARK
|
||
SUB P,[1,,1]
|
||
HRRM A,(P)
|
||
JRST GCRET
|
||
ABMK: HLRE B,A ; FIX UP TO GET TO FRAME
|
||
SUB A,B
|
||
HLRE B,FRAMLN+TPSAV(A) ; FIX UP TO LOOK LIKE TP
|
||
HRRZ C,FRAMLN+TPSAV(A)
|
||
JRST TBMK2
|
||
|
||
|
||
|
||
; MARK ARG POINTERS
|
||
|
||
ARGMK: HRRZ A,1(C) ; GET POINTER
|
||
HLRE B,1(C) ; AND LNTH
|
||
SUB A,B ; POINT TO BASE
|
||
CAIL A,STOSTR ; CHECK IN VECTOR SPACE
|
||
CAMLE A,GCSTOP
|
||
JRST ARGMK0
|
||
HLRZ 0,(A) ; GET TYPE
|
||
ANDI 0,TYPMSK
|
||
CAIN 0,TCBLK
|
||
JRST ARGMK1
|
||
CAIE 0,TENTRY ; IS NEXT A WINNER?
|
||
CAIN 0,TINFO
|
||
JRST ARGMK1 ; YES, GO ON TO WIN CODE
|
||
|
||
ARGMK0: SETZB A,1(C) ; CLOBBER THE CELL
|
||
SETZM (P) ; AND SAVED COPY
|
||
JRST GCRET
|
||
|
||
ARGMK1: MOVE B,1(A) ; ASSUME TTB
|
||
ADDI B,(A) ; POINT TO FRAME
|
||
CAIE 0,TINFO ; IS IT?
|
||
MOVEI B,FRAMLN(A) ; NO, USE OTHER GOODIE
|
||
HLRZ 0,OTBSAV(B) ; GET TIME
|
||
HRRZ A,(C) ; AND FROM POINTER
|
||
CAIE 0,(A) ; SKIP IF WINNER
|
||
JRST ARGMK0
|
||
MOVE A,TPSAV(B) ; GET A RELATAVIZED TP
|
||
HRROI C,TPSAV-1(B)
|
||
MOVEI B,TTP
|
||
PUSHJ P,MARK1
|
||
SUB A,1(C) ; AMOUNT TO RELATAVIZE ARGS
|
||
HRRZ B,(P)
|
||
ADD B,A
|
||
HRRM B,(P) ; PUT RELATAVIZED PTR BACK
|
||
JRST GCRET
|
||
|
||
|
||
; MARK FRAME POINTERS
|
||
|
||
FRMK: HLRZ B,A ; GET TIME FROM FRAME PTR
|
||
HLRZ F,OTBSAV(A) ; GET TIME FROM FRAME
|
||
CAME B,F ; SEE IF EQUAL
|
||
JRST GCRET
|
||
SUBI C,1 ;PREPARE TO MARK PROCESS VECTOR
|
||
HRRZ A,1(C) ;USE AS DATUM
|
||
SUBI A,1 ;FUDGE FOR VECTMK
|
||
MOVEI B,TPVP ;IT IS A VECTRO
|
||
PUSHJ P,MARK ;MARK IT
|
||
ADDI A,1 ; READJUST PTR
|
||
HRRM A,1(C) ; FIX UP PROCESS SLOT
|
||
MOVEI C,1(C) ; SET UP FOR TBMK
|
||
HRRZ A,(P)
|
||
JRST TBMK ; MARK LIKE TB
|
||
|
||
|
||
; MARK BYTE POINTER
|
||
|
||
BYTMK: PUSHJ P,BYTDOP ; GET DOPE WORD IN A
|
||
HLRZ F,-1(A) ; GET THE TYPE
|
||
ANDI F,SATMSK ; FLUSH MONITOR BITS
|
||
CAIN F,SATOM ; SEE IF ATOM
|
||
JRST ATMSET
|
||
HLRE F,(A) ; GET MARKING
|
||
JUMPL F,BYTREL ; JUMP IF MARKED
|
||
HLRZ F,(A) ; GET LENGTH
|
||
PUSHJ P,ALLOGC ; ALLOCATE FOR IT
|
||
HRRM 0,(A) ; SMASH IT IN
|
||
MOVE E,0
|
||
HLRZ F,(A)
|
||
SUBI E,-1(F) ; ADJUST INF POINTER
|
||
IORM D,(A)
|
||
PUSHJ P,ADPMOD
|
||
PUSHJ P,TRBLK
|
||
BYTREL: HRRZ E,(A)
|
||
SUBI E,(A)
|
||
ADDM E,(P) ; RELATAVIZE
|
||
JRST GCRET
|
||
|
||
ATMSET: PUSH P,A ; SAVE A
|
||
HLRZ B,(A) ; GET LENGTH
|
||
TRZ B,400000 ; GET RID OF MARK BIT
|
||
MOVNI B,-2(B) ; GET LENGTH
|
||
ADDI A,-1(B) ; CALCULATE POINTER
|
||
HRLI A,(B)
|
||
MOVEI B,TATOM ; TYPE
|
||
PUSHJ P,MARK
|
||
POP P,A ; RESTORE A
|
||
SKIPN GCDFLG
|
||
JRST BYTREL
|
||
MOVSI E,STATM ; GET "STRING IS ATOM BIT"
|
||
IORM E,(P)
|
||
SKIPN DUMFLG
|
||
JRST GCRET
|
||
HRRM A,(P)
|
||
JRST BYTREL ; TO BYTREL
|
||
|
||
|
||
; MARK OFFSET
|
||
|
||
OFFSMK: HLRZS A
|
||
PUSH P,$TLIST
|
||
PUSH P,A ; PUSH LIST POINTER ON THE STACK
|
||
MOVEI C,-1(P) ; POINTER TO PAIR
|
||
PUSHJ P,MARK2 ; MARK THE LIST
|
||
HRLM A,-2(P) ; UPDATE POINTER IN OFFSET
|
||
SUB P,[2,,2]
|
||
JRST GCRET
|
||
|
||
|
||
; MARK ATOMS IN GVAL STACK
|
||
|
||
GATOMK: HRRZ B,(C) ; POINT TO POSSIBLE GDECL
|
||
JUMPE B,ATOMK
|
||
CAIN B,-1
|
||
JRST ATOMK
|
||
MOVEI A,(B) ; POINT TO DECL FOR MARK
|
||
MOVEI B,TLIST
|
||
MOVEI C,0
|
||
PUSHJ P,MARK
|
||
HLRZ C,-1(P) ; RESTORE HOME POINTER
|
||
HRRM A,(C) ; CLOBBER UPDATED LIST IN
|
||
MOVE A,1(C) ; RESTORE ATOM POINTER
|
||
|
||
; MARK ATOMS
|
||
|
||
ATOMK:
|
||
MOVEI 0,@BOTNEW
|
||
PUSH P,0 ; SAVE POINTER TO INF
|
||
TLO TYPNT,.ATOM. ; SAY ATOM WAS MARKED
|
||
MOVEI C,1(A)
|
||
PUSHJ P,GETLNT ;GET LENGTH AND CHECK BOUNDS
|
||
JRST ATMRL1 ; ALREADY MARKED
|
||
PUSH P,A ; SAVE DOPE WORD PTR FOR LATER
|
||
HLRZ C,(A) ; FIND REAL ATOM PNTR
|
||
SUBI C,400001 ; KILL MARK BIT AND ADJUST
|
||
HRLI C,-1(C)
|
||
SUBM A,C ; NOW TOP OF ATOM
|
||
MRKOBL: MOVEI B,TOBLS
|
||
HRRZ A,2(C) ; IF > 0, NOT OBL
|
||
CAMG A,VECBOT
|
||
JRST .+3
|
||
HRLI A,-1
|
||
PUSHJ P,MARK ; AND MARK IT
|
||
HRRM A,2(C)
|
||
SKIPN GCHAIR
|
||
JRST NOMKNX
|
||
HLRZ A,2(C)
|
||
MOVEI B,TATOM
|
||
PUSHJ P,MARK
|
||
HRLM A,2(C)
|
||
NOMKNX: HLRZ B,(C) ; SEE IF UNBOUND
|
||
TRZ B,400000 ; TURN OFF MARK BIT
|
||
SKIPE B
|
||
CAIN B,TUNBOUND
|
||
JRST ATOMK1 ; IT IS UNBOUND
|
||
HRRZ 0,(C) ; SEE IF VECTOR OR TP POINTER
|
||
MOVEI B,TVEC ; ASSUME VECTOR
|
||
SKIPE 0
|
||
MOVEI B,TTP ; ITS A LOCAL VALUE
|
||
PUSHJ P,MARK1 ; MARK IT
|
||
MOVEM A,1(C) ; SMASH INTO SLOT
|
||
ATOMK1: HRRZ 0,2(C) ; MAKE SURE ATOMS NOT ON OBLISTS GET SENT
|
||
POP P,A ; RESTORE A
|
||
POP P,E ; GET POINTER INTO INF
|
||
SKIPN GCHAIR
|
||
JUMPN 0,ATMREL
|
||
PUSHJ P,ADPMOD
|
||
PUSHJ P,TRBLK
|
||
ATMREL: HRRZ E,(A) ; RELATAVIZE
|
||
SUBI E,(A)
|
||
ADDM E,(P)
|
||
JRST GCRET
|
||
ATMRL1: SUB P,[1,,1] ; POP OFF STACK
|
||
JRST ATMREL
|
||
|
||
|
||
GETLNT: HLRE B,A ;GET -LNTH
|
||
SUB A,B ;POINT TO 1ST DOPE WORD
|
||
MOVEI A,1(A) ;POINT TO 2ND DOPE WORD
|
||
CAIL A,STOSTR ; CHECK IN VECTOR SPACE
|
||
CAMLE A,GCSTOP
|
||
JRST VECTB1 ;BAD VECTOR, COMPLAIN
|
||
HLRE B,(A) ;GET LENGTH AND MARKING
|
||
IORM D,(A) ;MAKE SURE MARKED
|
||
JUMPL B,AMTKE
|
||
MOVEI F,(B) ; AMOUNT TO ALLOCATE
|
||
PUSHJ P,ALLOGC ;ALLOCATE ROOM
|
||
HRRM 0,(A) ; RELATIVIZE
|
||
AMTK1: AOS (P) ; A NON MARKED ITEM
|
||
AMTKE: POPJ P, ;AND RETURN
|
||
|
||
GCRET1: SUB P,[1,,1] ;FLUSH RETURN ADDRESS
|
||
JRST GCRET
|
||
|
||
|
||
|
||
; MARK NON-GENERAL VECTORS
|
||
|
||
NOTGEN: CAMN B,[GENERAL+<SPVP,,0>]
|
||
JRST GENRAL ;YES, MARK AS A VECTOR
|
||
JUMPL B,SPECLS ; COMPLAIN IF A SPECIAL HACK
|
||
SUBI A,1(E) ;POINT TO TOP OF A UNIFORM VECTOR
|
||
HLRZS B ;ISOLATE TYPE
|
||
ANDI B,TYPMSK
|
||
PUSH P,E
|
||
SKIPE DUMFLG ; SKIP IF NOT IN DUMPER
|
||
PUSHJ P,TYPHK ; HACK WITH TYPE IF SPECIAL
|
||
POP P,E ; RESTORE LENGTH
|
||
MOVE F,B ; AND COPY IT
|
||
LSH B,1 ;FIND OUT WHERE IT WILL GO
|
||
HRRZ B,@TYPNT ;GET SAT IN B
|
||
ANDI B,SATMSK
|
||
MOVEI C,@MKTBS(B) ;POINT TO MARK SR
|
||
CAIN C,GCRET ;IF NOT A MARKED FROM GOODIE, IGNORE
|
||
JRST UMOVEC
|
||
MOVEI C,-1(A) ;POINT 1 PRIOR TO VECTOR START
|
||
PUSH P,E ;SAVE NUMBER OF ELEMENTS
|
||
PUSH P,F ;AND UNIFORM TYPE
|
||
|
||
UNLOOP: MOVE B,(P) ;GET TYPE
|
||
MOVE A,1(C) ;AND GOODIE
|
||
TLO C,400000 ;CAN'T MUNG TYPE
|
||
PUSHJ P,MARK ;MARK THIS ONE
|
||
MOVEM A,1(C) ; LIST FIXUP
|
||
SOSE -1(P) ;COUNT
|
||
AOJA C,UNLOOP ;IF MORE, DO NEXT
|
||
|
||
SUB P,[2,,2] ;REMOVE STACK CRAP
|
||
JRST UMOVEC
|
||
|
||
|
||
SPECLS: FATAL AGC--UNRECOGNIZED SPECIAL VECTOR
|
||
SUB P,[4,,4] ; REOVER
|
||
JRST AFIXUP
|
||
|
||
|
||
|
||
; ROUTINE TO MARK THE GC-READ TABLE. MARKS THE ATOMS AT THE DOPE WORDS
|
||
; AND UPDATES PTR TO THE TABLE.
|
||
|
||
GCRDMK: PUSH P,A ; SAVE PTR TO TOP
|
||
MOVEI 0,@BOTNEW ; SAVE PTR TO INF
|
||
PUSH P,0
|
||
PUSHJ P,GETLNT ; GET TO D.W. AND CHECK MARKING
|
||
JRST GCRDRL ; RELATIVIZE
|
||
PUSH P,A ; SAVE D.W POINTER
|
||
SUBI A,2
|
||
MOVE B,ABOTN ; GET TOP OF ATOM TABLE
|
||
HRRZ 0,-2(P)
|
||
ADD B,0 ; GET BOTTOM OF ATOM TABLE
|
||
GCRD1: CAMG A,B ; DON'T SKIP IF DONE
|
||
JRST GCRD2
|
||
HLRZ C,(A) ; GET MARKING
|
||
TRZN C,400000 ; SKIP IF MARKED
|
||
JRST GCRD3
|
||
MOVEI E,(A)
|
||
SUBI A,(C) ; GO BACK ONE ATOM
|
||
PUSH P,B ; SAVE B
|
||
PUSH P,A ; SAVE POINTER
|
||
MOVEI C,-2(E) ; SET UP POINTER
|
||
MOVEI B,TATOM ; GO TO MARK
|
||
MOVE A,1(C)
|
||
PUSHJ P,MARK
|
||
MOVEM A,1(C) ; SMASH FIXED UP ATOM BACK IN
|
||
POP P,A
|
||
POP P,B
|
||
JRST GCRD1
|
||
GCRD3: SUBI A,(C) ; TO NEXT ATOM
|
||
JRST GCRD1
|
||
GCRD2: POP P,A ; GET PTR TO D.W.
|
||
POP P,E ; GET PTR TO INF
|
||
SUB P,[1,,1] ; GET RID OF TOP
|
||
PUSHJ P,ADPMOD ; FIX UP D.W.
|
||
PUSHJ P,TRBLK ; SEND IT OUT
|
||
JRST ATMREL ; RELATIVIZE AND LEAVE
|
||
GCRDRL: POP P,A ; GET PTR TO D.W
|
||
SUB P,[2,,2] ; GET RID OF TOP AND PTR TO INF
|
||
JRST ATMREL ; RELATAVIZE
|
||
|
||
|
||
|
||
;MARK RELATAVIZED GLOC HACKS
|
||
|
||
LOCRMK: SKIPE GCHAIR
|
||
JRST GCRET
|
||
LOCRDP: PUSH P,C ; SAVE C
|
||
MOVEI C,-2(A) ; RELATAVIZED PTR TO ATOM
|
||
ADD C,GLTOP ; ADD GLOTOP TO GET TO ATOM
|
||
MOVEI B,TATOM ; ITS AN ATOM
|
||
SKIPL (C)
|
||
PUSHJ P,MARK1
|
||
POP P,C ; RESTORE C
|
||
SKIPN DUMFLG ; IF GC-DUMP, WILL STORE ATOM FOR LOCR
|
||
JRST LOCRDD
|
||
MOVEI B,1
|
||
IORM B,3(A) ; MUNG ATOM TO SAY IT IS LOCR
|
||
CAIA
|
||
LOCRDD: MOVE A,1(C) ; GET RELATIVIZATION
|
||
MOVEM A,(P) ; IT STAYS THE SAVE
|
||
JRST GCRET
|
||
|
||
;MARK LOCID TYPE GOODIES
|
||
|
||
LOCMK: HRRZ B,(C) ;GET TIME
|
||
JUMPE B,LOCMK1 ; SKIP LEGAL CHECK FOR GLOBAL
|
||
HRRZ 0,2(A) ; GET OTHER TIME
|
||
CAIE 0,(B) ; SAME?
|
||
SETZB A,(P) ; NO, SMASH LOCATIVE
|
||
JUMPE A,GCRET ; LEAVE IF DONE
|
||
LOCMK1: PUSH P,C
|
||
MOVEI B,TATOM ; MARK ATOM
|
||
MOVEI C,-2(A) ; POINT TO ATOM
|
||
MOVE E,(C) ; SEE IF BLOCK IS MARKED
|
||
TLNE E,400000 ; SKIP IF MARKED
|
||
JRST LOCMK2 ; SKIP OVER BLOCK
|
||
SKIPN GCHAIR ; DO NOT MARK IF NOT HAIRY (WILL BE MARKED)
|
||
PUSHJ P,MARK1 ; LET LOCATIVE SAVE THE ATOM
|
||
LOCMK2: POP P,C
|
||
HRRZ E,(C) ; TIME BACK
|
||
MOVEI B,TVEC ; ASSUME GLOBAL
|
||
SKIPE E
|
||
MOVEI B,TTP ; ITS LOCAL
|
||
PUSHJ P,MARK1 ; MARK IT
|
||
MOVEM A,(P)
|
||
JRST GCRET
|
||
|
||
|
||
; MARK ASSOCIATION BLOCKS
|
||
|
||
ASMRK: PUSH P,A
|
||
ASMRK1: HRLI A,-ASOLNT ;LOOK LIKE A VECTOR POINTER
|
||
PUSHJ P,GETLNT ;GET LENGTH AND CHECK BOUNDS
|
||
JRST ASTREL ; ALREADY MARKED
|
||
MOVEI C,-ASOLNT-1(A) ;COPY POINTER
|
||
PUSHJ P,MARK2 ;MARK ITEM CELL
|
||
MOVEM A,1(C)
|
||
ADDI C,INDIC-ITEM ;POINT TO INDICATOR
|
||
PUSHJ P,MARK2
|
||
MOVEM A,1(C)
|
||
ADDI C,VAL-INDIC
|
||
PUSHJ P,MARK2
|
||
MOVEM A,1(C)
|
||
SKIPN GCHAIR ; IF NO HAIR, MARK ALL FRIENDS
|
||
JRST ASTREL
|
||
HRRZ A,NODPNT-VAL(C) ; NEXT
|
||
JUMPN A,ASMRK1 ; IF EXISTS, GO
|
||
ASTREL: POP P,A ; RESTORE PTR TO ASSOCIATION
|
||
MOVEI A,ASOLNT+1(A) ; POINT TO D.W.
|
||
SKIPN NODPNT-ASOLNT-1(A) ; SEE IF EMPTY NODPTR
|
||
JRST ASTX ; JUMP TO SEND OUT
|
||
ASTR1: HRRZ E,(A) ; RELATAVIZE
|
||
SUBI E,(A)
|
||
ADDM E,(P)
|
||
JRST GCRET ; EXIT
|
||
ASTX: HRRZ E,(A) ; GET PTR IN FRONTEIR
|
||
SUBI E,ASOLNT+1 ; ADJUST TO POINT TO BEGINNING
|
||
PUSHJ P,ADPMOD
|
||
PUSHJ P,TRBLK
|
||
JRST ASTR1
|
||
|
||
;HERE WHEN A VECTOR POINTER IS BAD
|
||
|
||
VECTB1:FATAL AGC--VECTOR POINTS OUTSIDE OF VECTOR SPACE
|
||
SUB P,[1,,1] ; RECOVERY
|
||
AFIXUP: SETZM (P) ; CLOBBER SLOT
|
||
JRST GCRET ; CONTINUE
|
||
|
||
|
||
VECTB2: FATAL AGC--VECTOR POINTS OUT OF VECTOR SPACE
|
||
SUB P,[2,,2]
|
||
JRST AFIXUP ; RECOVER
|
||
|
||
PARERR: FATAL AGC--PAIR POINTS OUT OF PAIR SPACE
|
||
SUB P,[1,,1] ; RECOVER
|
||
JRST AFIXUP
|
||
|
||
|
||
; HERE TO MARK TEMPLATE DATA STRUCTURES
|
||
|
||
TD.MRK: MOVEI 0,@BOTNEW ; SAVE PTR TO INF
|
||
PUSH P,0
|
||
HLRZ B,(A) ; GET REAL SPEC TYPE
|
||
ANDI B,37777 ; KILL SIGN BIT
|
||
MOVEI E,-NUMSAT-1(B) ; GET REL POINTER TO TABLE
|
||
HRLI E,(E)
|
||
ADD E,TD.AGC+1
|
||
HRRZS C,A ; FLUSH COUNT AND SAVE
|
||
SKIPL E ; WITHIN BOUNDS
|
||
FATAL BAD SAT IN AGC
|
||
PUSHJ P,GETLNT ; GOODIE IS NOW MARKED
|
||
JRST TMPREL ; ALREADY MARKED
|
||
|
||
SKIPE (E)
|
||
JRST USRAGC
|
||
SUB E,TD.AGC+1 ; POINT TO LENGTH
|
||
ADD E,TD.LNT+1
|
||
XCT (E) ; RET # OF ELEMENTS IN B
|
||
|
||
HLRZ D,B ; GET POSSIBLE "BASIC LENGTH" FOR RESTS
|
||
PUSH P,[0] ; TEMP USED IF RESTS EXIST
|
||
PUSH P,D
|
||
MOVEI B,(B) ; ZAP TO ONLY LENGTH
|
||
PUSH P,C ; SAVE POINTER TO TEMPLATE STRUCTURE
|
||
PUSH P,[0] ; HOME FOR VALUES
|
||
PUSH P,[0] ; SLOT FOR TEMP
|
||
PUSH P,B ; SAVE
|
||
SUB E,TD.LNT+1
|
||
PUSH P,E ; SAVE FOR FINDING OTHER TABLES
|
||
JUMPE D,TD.MR2 ; NO REPEATING SEQ
|
||
ADD E,TD.GET+1 ; COMP LNTH OF REPEATING SEQ
|
||
HLRE E,(E) ; E ==> - LNTH OF TEMPLATE
|
||
ADDI E,(D) ; E ==> -LENGTH OF REP SEQ
|
||
MOVNS E
|
||
HRLM E,-5(P) ; SAVE IT AND BASIC
|
||
|
||
TD.MR2: SKIPG D,-1(P) ; ANY LEFT?
|
||
JRST TD.MR1
|
||
|
||
MOVE E,TD.GET+1
|
||
ADD E,(P)
|
||
MOVE E,(E) ; POINTER TO VECTOR IN E
|
||
MOVEM D,-6(P) ; SAVE ELMENT #
|
||
SKIPN B,-5(P) ; SKIP IF "RESTS" EXIST
|
||
SOJA D,TD.MR3
|
||
|
||
MOVEI 0,(B) ; BASIC LNT TO 0
|
||
SUBI 0,(D) ; SEE IF PAST BASIC
|
||
JUMPGE 0,.-3 ; JUMP IF O.K.
|
||
MOVSS B ; REP LNT TO RH, BASIC TO LH
|
||
IDIVI 0,(B) ; A==> -WHICH REPEATER
|
||
MOVNS A
|
||
ADD A,-5(P) ; PLUS BASIC
|
||
ADDI A,1 ; AND FUDGE
|
||
MOVEM A,-6(P) ; SAVE FOR PUTTER
|
||
ADDI E,-1(A) ; POINT
|
||
SOJA D,.+2
|
||
|
||
TD.MR3: ADDI E,(D) ; POINT TO SLOT
|
||
XCT (E) ; GET THIS ELEMENT INTO A AND B
|
||
JFCL ; NO-OP FOR ANY CASE
|
||
MOVEM A,-3(P) ; SAVE TYPE FOR LATER PUT
|
||
MOVEM B,-2(P)
|
||
EXCH A,B ; REARRANGE
|
||
GETYP B,B
|
||
MOVEI C,-3(P) ; TELL OTHER GUYS THEY CANT DIRECTLY MUNG
|
||
MOVSI D,400000 ; RESET FOR MARK
|
||
PUSHJ P,MARK ; AND MARK THIS GUY (RET FIXED POINTER IN A)
|
||
MOVE C,-4(P) ; REGOBBLE POINTER TO TEMPLATE
|
||
MOVE E,TD.PUT+1
|
||
MOVE B,-6(P) ; RESTORE COUNT
|
||
ADD E,(P)
|
||
MOVE E,(E) ; POINTER TO VECTOR IN E
|
||
ADDI E,(B)-1 ; POINT TO SLOT
|
||
MOVE B,-3(P) ; RESTORE TYPE WORD
|
||
EXCH A,B
|
||
SOS D,-1(P) ; GET ELEMENT #
|
||
XCT (E) ; SMASH IT BACK
|
||
FATAL TEMPLATE LOSSAGE
|
||
MOVE C,-4(P) ; RESTORE POINTER IN CASE MUNGED
|
||
JRST TD.MR2
|
||
|
||
TD.MR1: MOVE A,-8(P) ; PTR TO DOPE WORD
|
||
MOVE E,-7(P) ; RESTORE PTR TO FRONTEIR
|
||
SUB P,[7,,7] ; CLEAN UP STACK
|
||
USRAG1: ADDI A,1 ; POINT TO SECOND D.W.
|
||
MOVSI D,400000 ; SET UP MARK BIT
|
||
PUSHJ P,ADPMOD
|
||
PUSHJ P,TRBLK ; SEND IT OUT
|
||
TMPREL: SUB P,[1,,1]
|
||
HRRZ D,(A)
|
||
SUBI D,(A)
|
||
ADDM D,(P)
|
||
MOVSI D,400000 ; RESTORE MARK/UNMARK BIT
|
||
JRST GCRET
|
||
|
||
USRAGC: HRRZ E,(E) ; MARK THE TEMPLATE
|
||
PUSHJ P,(E)
|
||
MOVE A,-1(P) ; POINTER TO D.W
|
||
MOVE E,(P) ; TOINTER TO FRONTIER
|
||
JRST USRAG1
|
||
|
||
; This phase attempts to remove any unwanted associations. The program
|
||
; loops through the structure marking values of associations. It can only
|
||
; stop when no new values (potential items and/or indicators) are marked.
|
||
|
||
VALFLS: PUSH P,LPVP ; SAVE LPVP FOR LATER
|
||
PUSH P,[0] ; INDICATE WHETHER ANY ON THIS PASS
|
||
PUSH P,[0] ; OR THIS BUCKET
|
||
ASOMK1: MOVE A,GCASOV ; GET VECTOR POINTER
|
||
SETOM -1(P) ; INITIALIZE FLAG
|
||
|
||
ASOM6: SKIPG C,(A) ; SKIP IF BUCKET TO BE SCANNED
|
||
JRST ASOM1
|
||
SETOM (P) ; SAY BUCKET NOT CHANGED
|
||
|
||
ASOM2: MOVEI F,(C) ; COPY POINTER
|
||
SKIPG ASOLNT+1(C) ; SKIP IF NOT ALREADY MARKED
|
||
JRST ASOM4 ; MARKED, GO ON
|
||
PUSHJ P,MARKQ ; SEE IF ITEM IS MARKED
|
||
JRST ASOM3 ; IT IS NOT, IGNORE IT
|
||
MOVEI F,(C) ; IN CASE CLOBBERED BY MARK2
|
||
MOVEI C,INDIC(C) ; POINT TO INDICATOR SLOT
|
||
PUSHJ P,MARKQ
|
||
JRST ASOM3 ; NOT MARKED
|
||
|
||
PUSH P,A ; HERE TO MARK VALUE
|
||
PUSH P,F
|
||
HLRE F,ASOLNT-INDIC+1(C) ; GET LENGTH
|
||
JUMPL F,.+3 ; SKIP IF MARKED
|
||
CAMGE C,VECBOT ; SKIP IF IN VECT SPACE
|
||
JRST ASOM20
|
||
HRRM FPTR,ASOLNT-INDIC+1(C) ; PUT IN RELATIVISATION
|
||
MOVEI F,12 ; AMOUNT TO ALLOCATE IN INF
|
||
PUSHJ P,ALLOGC
|
||
HRRM 0,5(C) ; STICK IN RELOCATION
|
||
|
||
ASOM20: PUSHJ P,MARK2 ; AND MARK
|
||
MOVEM A,1(C) ; LIST FIX UP
|
||
ADDI C,ITEM-INDIC ; POINT TO ITEM
|
||
PUSHJ P,MARK2
|
||
MOVEM A,1(C)
|
||
ADDI C,VAL-ITEM ; POINT TO VALUE
|
||
PUSHJ P,MARK2
|
||
MOVEM A,1(C)
|
||
IORM D,ASOLNT-VAL+1(C) ; MARK ASOC BLOCK
|
||
POP P,F
|
||
POP P,A
|
||
AOSA -1(P) ; INDICATE A MARK TOOK PLACE
|
||
|
||
ASOM3: AOS (P) ; INDICATE AN UNMARKED IN THIS BUCKET
|
||
ASOM4: HRRZ C,ASOLNT-1(F) ; POINT TO NEXT IN BUCKET
|
||
JUMPN C,ASOM2 ; IF NOT EMPTY, CONTINUE
|
||
SKIPGE (P) ; SKIP IF ANY NOT MARKED
|
||
HRROS (A) ; MARK BUCKET AS NOT INTERESTING
|
||
ASOM1: AOBJN A,ASOM6 ; GO TO NEXT BUCKET
|
||
TLZE TYPNT,.ATOM. ; ANY ATOMS MARKED?
|
||
JRST VALFLA ; YES, CHECK VALUES
|
||
VALFL8:
|
||
|
||
; NOW SEE WHICH CHANNELS STILL POINTED TO
|
||
|
||
CHNFL3: MOVEI 0,N.CHNS-1
|
||
MOVEI A,CHNL1 ; SLOTS
|
||
HRLI A,TCHAN ; TYPE HERE TOO
|
||
|
||
CHNFL2: SKIPN B,1(A)
|
||
JRST CHNFL1
|
||
HLRE C,B
|
||
SUBI B,(C) ; POINT TO DOPE
|
||
HLLM A,(A) ; PUT TYPE BACK
|
||
HRRE F,(A) ; SEE IF ALREADY MARKED
|
||
JUMPN F,CHNFL1
|
||
SKIPGE 1(B)
|
||
JRST CHNFL8
|
||
HLLOS (A) ; MARK AS A LOSER
|
||
SETZM -1(P)
|
||
JRST CHNFL1
|
||
CHNFL8: MOVEI F,1 ; MARK A GOOD CHANNEL
|
||
HRRM F,(A)
|
||
CHNFL1: ADDI A,2
|
||
SOJG 0,CHNFL2
|
||
|
||
SKIPE GCHAIR ; IF NOT HAIRY CASE
|
||
POPJ P, ; LEAVE
|
||
|
||
SKIPL -1(P) ; SKIP IF NOTHING NEW MARKED
|
||
JRST ASOMK1
|
||
|
||
SUB P,[2,,2] ; REMOVE FLAGS
|
||
|
||
|
||
|
||
; HERE TO REEMOVE UNUSED ASSOCIATIONS
|
||
|
||
MOVE A,GCASOV ; GET ASOVEC BACK FOR FLUSHES
|
||
|
||
ASOFL1: SKIPN C,(A) ; SKIP IF BUCKET NOT EMPTY
|
||
JRST ASOFL2 ; EMPTY BUCKET, IGNORE
|
||
HRRZS (A) ; UNDO DAMAGE OF BEFORE
|
||
|
||
ASOFL5: SKIPGE ASOLNT+1(C) ; SKIP IF UNMARKED
|
||
JRST ASOFL6 ; MARKED, DONT FLUSH
|
||
|
||
HRRZ B,ASOLNT-1(C) ; GET FORWARD POINTER
|
||
HLRZ E,ASOLNT-1(C) ; AND BACK POINTER
|
||
JUMPN E,ASOFL4 ; JUMP IF NO BACK POINTER (FIRST IN BUCKET)
|
||
HRRZM B,(A) ; FIX BUCKET
|
||
JRST .+2
|
||
|
||
ASOFL4: HRRM B,ASOLNT-1(E) ; FIX UP PREVIOUS
|
||
JUMPE B,.+2 ; JUMP IF NO NEXT POINTER
|
||
HRLM E,ASOLNT-1(B) ; FIX NEXT'S BACK POINTER
|
||
HRRZ B,NODPNT(C) ; SPLICE OUT THRAD
|
||
HLRZ E,NODPNT(C)
|
||
SKIPE E
|
||
HRRM B,NODPNT(E)
|
||
SKIPE B
|
||
HRLM E,NODPNT(B)
|
||
|
||
ASOFL3: HRRZ C,ASOLNT-1(C) ; GO TO NEXT
|
||
JUMPN C,ASOFL5
|
||
ASOFL2: AOBJN A,ASOFL1
|
||
|
||
|
||
|
||
; NOW CLOBBER UNMARKED LOCAL NAD GLOBAL VALUES
|
||
|
||
MOVE A,GCGBSP ; GET GLOBAL PDL
|
||
|
||
GLOFLS: SKIPGE (A) ; SKIP IF NOT ALREADY MARKED
|
||
JRST SVDCL
|
||
MOVSI B,-3
|
||
PUSHJ P,ZERSLT ; CLOBBER THE SLOT
|
||
HLLZS (A)
|
||
SVDCL: ANDCAM D,(A) ; UNMARK
|
||
ADD A,[4,,4]
|
||
JUMPL A,GLOFLS ; MORE?, KEEP LOOPING
|
||
|
||
MOVEM LPVP,(P)
|
||
LOCFL1: HRRZ A,(LPVP) ; NOW CLOBBER LOCAL SLOTS
|
||
HRRZ C,2(LPVP)
|
||
MOVEI LPVP,(C)
|
||
JUMPE A,LOCFL2 ; NONE TO FLUSH
|
||
|
||
LOCFLS: SKIPGE (A) ; MARKDE?
|
||
JRST .+3
|
||
MOVSI B,-5
|
||
PUSHJ P,ZERSLT
|
||
ANDCAM D,(A) ;UNMARK
|
||
HRRZ A,(A) ; GO ON
|
||
JUMPN A,LOCFLS
|
||
LOCFL2: JUMPN LPVP,LOCFL1 ; JUMP IF MORE PROCESS
|
||
|
||
; AT THIS POINT THE LOCALS ARE FINALLY SENT OUT.
|
||
; THIS ROUTINE UPDATES THE THIS-PROCESS BINDING. IT FIXES UP THE SP-CHAIN AND IT
|
||
; SENDS OUT THE ATOMS.
|
||
|
||
LOCFL3: MOVE C,(P)
|
||
MOVEI B,TATOM ; MARK THE BINDING TO THIS PROCESS
|
||
PUSHJ P,MARK1 ; MARK THE ATOM
|
||
MOVEM A,1(C) ; NEW HOME
|
||
MOVEI C,2(C) ; MARK VALUE
|
||
MOVEI B,TPVP ; IT IS A PROCESS VECTOR POINTER
|
||
PUSHJ P,MARK1 ; MARK IT
|
||
MOVEM A,1(C)
|
||
POP P,R
|
||
NEXPRO: MOVEI 0,TPVP ; FIX UP SLOT
|
||
HLRZ A,2(R) ; GET PTR TO NEXT PROCESS
|
||
HRLM 0,2(R)
|
||
HRRZ E,(A) ; ADRESS IN INF
|
||
HRRZ B,(A) ; CALCULATE RELOCATION
|
||
SUB B,A
|
||
PUSH P,B
|
||
HRRZ F,A ; CALCULATE START OF TP IN F
|
||
HLRZ B,(A) ; ADJUST INF PTR
|
||
TRZ B,400000
|
||
SUBI F,-1(B)
|
||
LDB M,[111100,,-1(A)] ; CALCULATE TOP GROWTH
|
||
TRZE M,400 ; FUDGE SIGN
|
||
MOVNS M
|
||
ASH M,6
|
||
ADD B,M ; FIX UP LENGTH
|
||
EXCH M,(P)
|
||
SUBM M,(P) ; FIX RELOCATION TO TAKE INTO ACCOUNT CHANGE IN LENGTH
|
||
MOVE M,R ; GET A COPY OF R
|
||
NEXP1: HRRZ C,(M) ; GET PTR TO NEXT IN CHAIN
|
||
JUMPE C,NEXP2 ; EXIT IF END OF CHAIN
|
||
MOVE 0,C ; GET COPY OF CHAIN PTR TO UPDATE
|
||
ADD 0,(P) ; UPDATE
|
||
HRRM 0,(M) ; PUT IN
|
||
MOVE M,C ; NEXT
|
||
JRST NEXP1
|
||
NEXP2: SUB P,[1,,1] ; CLEAN UP STACK
|
||
SUBI E,-1(B)
|
||
HRRI B,(R) ; GET POINTER TO THIS-PROCESS BINDING
|
||
MOVEI B,6(B) ; POINT AFTER THE BINDING
|
||
MOVE 0,F ; CALCULATE # OF WORDS TO SEND OUT
|
||
SUBM B,0
|
||
PUSH P,R ; PRESERVE R
|
||
PUSHJ P,TRBLKX ; SEND IT OUT
|
||
POP P,R ; RESTORE R
|
||
HRRZS R,2(R) ; GET THE NEXT PROCESS
|
||
SKIPN R
|
||
JRST .+3
|
||
PUSH P,R
|
||
JRST LOCFL3
|
||
MOVE A,GCGBSP ; PTR TO GLOBAL STACK
|
||
PUSHJ P,SPCOUT ; SEND IT OUT
|
||
MOVE A,GCASOV
|
||
PUSHJ P,SPCOUT ; SEND IT OUT
|
||
POPJ P,
|
||
|
||
; THIS ROUTINE MARKS ALL THE CHANNELS
|
||
; IT THEN SENDS OUT A COPY OF THE TVP
|
||
|
||
CHFIX: MOVEI 0,N.CHNS-1
|
||
MOVEI A,CHNL1 ; SLOTS
|
||
HRLI A,TCHAN ; TYPE HERE TOO
|
||
|
||
DHNFL2: SKIPN B,1(A)
|
||
JRST DHNFL1
|
||
MOVEI C,(A) ; MARK THE CHANNEL
|
||
PUSH P,0 ; SAVE 0
|
||
PUSH P,A ; SAVE A
|
||
PUSHJ P,MARK2
|
||
MOVEM A,1(C) ; ADJUST PTR
|
||
POP P,A ; RESTORE A
|
||
POP P,0 ; RESTORE
|
||
DHNFL1: ADDI A,2
|
||
SOJG 0,DHNFL2
|
||
POPJ P,
|
||
|
||
|
||
; ROUTINE TO SEND OUT SPECIAL STUFF FROM GCHAIR
|
||
|
||
SPCOUT: HLRE B,A
|
||
SUB A,B
|
||
MOVEI A,1(A) ; POINT TO DOPE WORD
|
||
LDB 0,[001100,,-1(A)] ;GET GROWTH FACTOR
|
||
TRZE 0,400 ;KILL SIGN BIT AND SKIP IF +
|
||
MOVNS 0 ;NEGATE
|
||
ASH 0,6 ;CONVERT TO NUMBER OF WORDS
|
||
PUSHJ P,DOPMOD
|
||
HRRZ E,(A) ; GET PTR TO INF
|
||
HLRZ B,(A) ; LENGTH
|
||
TRZ B,400000 ; GET RID OF MARK BIT
|
||
SUBI E,-1(B)
|
||
ADD E,0
|
||
PUSH P,0 ; DUMMY FOR TRBLKV
|
||
PUSHJ P,TRBLKV ; OUT IT GOES
|
||
SUB P,[1,,1]
|
||
POPJ P, ;RETURN
|
||
|
||
ASOFL6: HLRZ E,ASOLNT-1(C) ; SEE IF FIRST IN BUCKET
|
||
JUMPN E,ASOFL3 ; IF NOT CONTINUE
|
||
HRRZ E,ASOLNT+1(C) ; GET PTR FROM DOPE WORD
|
||
SUBI E,ASOLNT+1 ; ADJUST TO POINT TO BEGINNING OF ALSSOCIATION
|
||
HRRZM E,(A) ; SMASH IT IN
|
||
JRST ASOFL3
|
||
|
||
|
||
MARK23: PUSH P,A ; SAVE BUCKET POINTER
|
||
PUSH P,F
|
||
PUSHJ P,MARK2
|
||
MOVEM A,1(C)
|
||
POP P,F
|
||
POP P,A
|
||
AOS -2(P) ; MARKING HAS OCCURRED
|
||
IORM D,ASOLNT+1(C) ; MARK IT
|
||
JRST MKD
|
||
|
||
; CHANNEL FLUSHER FOR NON HAIRY GC
|
||
|
||
CHNFLS: PUSH P,[-1]
|
||
SETOM (P) ; RESET FOR RETRY
|
||
PUSHJ P,CHNFL3
|
||
SKIPL (P)
|
||
JRST .-3 ; REDO
|
||
SUB P,[1,,1]
|
||
POPJ P,
|
||
|
||
; VALUE FLUSHING PHASE, HACKS BOTTOM OF TP AND GLOBAL SP
|
||
|
||
VALFLA: MOVE C,GCGBSP ; GET POINTER TO GLOBAL STACK
|
||
VALFL1: SKIPL (C) ; SKIP IF NOT MARKED
|
||
PUSHJ P,MARKQ ; SEE IF ATOM IS MARKED
|
||
JRST VALFL2
|
||
PUSH P,C
|
||
MOVEI B,TATOM ; UPDATE ATOM SLOT
|
||
PUSHJ P,MARK1
|
||
MOVEM A,1(C)
|
||
IORM D,(C)
|
||
AOS -2(P) ; INDICATE MARK OCCURRED
|
||
HRRZ B,(C) ; GET POSSIBLE GDECL
|
||
JUMPE B,VLFL10 ; NONE
|
||
CAIN B,-1 ; MAINFIFEST
|
||
JRST VLFL10
|
||
MOVEI A,(B)
|
||
MOVEI B,TLIST
|
||
MOVEI C,0
|
||
PUSHJ P,MARK ; MARK IT
|
||
MOVE C,(P) ; POINT
|
||
HRRM A,(C) ; CLOBBER UPDATE IN
|
||
VLFL10: ADD C,[2,,2] ; BUMP TO VALUE
|
||
PUSHJ P,MARK2 ; MARK VALUE
|
||
MOVEM A,1(C)
|
||
POP P,C
|
||
VALFL2: ADD C,[4,,4]
|
||
JUMPL C,VALFL1 ; JUMP IF MORE
|
||
|
||
HRLM LPVP,(P) ; SAVE POINTER
|
||
VALFL7: MOVEI C,(LPVP)
|
||
MOVEI LPVP,0
|
||
VALFL6: HRRM C,(P)
|
||
|
||
VALFL5: HRRZ C,(C) ; CHAIN
|
||
JUMPE C,VALFL4
|
||
MOVEI B,TATOM ; TREAT LIKE AN ATOM
|
||
SKIPL (C) ; MARKED?
|
||
PUSHJ P,MARKQ1 ; NO, SEE
|
||
JRST VALFL5 ; LOOP
|
||
AOS -1(P) ; MARK WILL OCCUR
|
||
MOVEI B,TATOM ; RELATAVIZE
|
||
PUSHJ P,MARK1
|
||
MOVEM A,1(C)
|
||
IORM D,(C)
|
||
ADD C,[2,,2] ; POINT TO VALUE
|
||
PUSHJ P,MARK2 ; MARK VALUE
|
||
MOVEM A,1(C)
|
||
SUBI C,2
|
||
JRST VALFL5
|
||
|
||
VALFL4: HRRZ C,(P) ; GET SAVED LPVP
|
||
MOVEI A,(C)
|
||
HRRZ C,2(C) ; POINT TO NEXT
|
||
JUMPN C,VALFL6
|
||
JUMPE LPVP,VALFL9
|
||
|
||
HRRM LPVP,2(A) ; NEW PROCESS WAS MARKED
|
||
JRST VALFL7
|
||
|
||
ZERSLT: HRRI B,(A) ; COPY POINTER
|
||
SETZM 1(B)
|
||
AOBJN B,.-1
|
||
POPJ P,
|
||
|
||
VALFL9: HLRZ LPVP,(P) ; RESTORE CHAIN
|
||
JRST VALFL8
|
||
|
||
;SUBROUTINE TO SEE IF A GOODIE IS MARKED
|
||
;RECEIVES POINTER IN C
|
||
;SKIPS IF MARKED NOT OTHERWISE
|
||
|
||
MARKQ: HLRZ B,(C) ;TYPE TO B
|
||
MARKQ1: MOVE E,1(C) ;DATUM TO C
|
||
MOVEI 0,(E)
|
||
CAIL 0,@PURBOT ; DONT CHACK PURE
|
||
JRST MKD ; ALWAYS MARKED
|
||
ANDI B,TYPMSK ; FLUSH MONITORS
|
||
LSH B,1
|
||
HRRZ B,@TYPNT ;GOBBLE SAT
|
||
ANDI B,SATMSK
|
||
CAIG B,NUMSAT ; SKIP FOR TEMPLATE
|
||
JRST @MQTBS(B) ;DISPATCH
|
||
ANDI E,-1 ; FLUSH REST HACKS
|
||
JRST VECMQ
|
||
|
||
|
||
MQTBS:
|
||
|
||
OFFSET 0
|
||
|
||
DISTB2 DUM3,MKD,[[S2WORD,PAIRMQ],[S2DEFR,PAIRMQ],[SNWORD,VECMQ],[S2NWORD,VECMQ]
|
||
[STPSTK,VECMQ],[SARGS,ARGMQ],[SPSTK,VECMQ],[SFRAME,FRMQ],[SLOCID,LOCMQ]
|
||
[SATOM,ATMMQ],[SPVP,VECMQ],[SCHSTR,BYTMQ],[SLOCA,ARGMQ],[SLOCU,VECMQ]
|
||
[SLOCV,VECMQ],[SLOCS,BYTMQ],[SLOCN,ASMQ],[SASOC,ASMQ],[SLOCL,PAIRMQ],[SGATOM,ATMMQ]
|
||
[SBYTE,BYTMQ],[SLOCB,BYTMQ],[SDEFQ,PAIRMQ],[SOFFS,OFFSMQ]]
|
||
|
||
OFFSET OFFS
|
||
|
||
PAIRMQ: JUMPE E,MKD ; NIL ALWAYS MARKED
|
||
SKIPL (E) ; SKIP IF MARKED
|
||
POPJ P,
|
||
ARGMQ:
|
||
MKD: AOS (P)
|
||
POPJ P,
|
||
|
||
BYTMQ: PUSH P,A ; SAVE A
|
||
PUSHJ P,BYTDOP ; GET PTR TO DOPE WORD
|
||
MOVE E,A ; COPY POINTER
|
||
POP P,A ; RESTORE A
|
||
SKIPGE (E) ; SKIP IF NOT MARKED
|
||
AOS (P)
|
||
POPJ P, ; EXIT
|
||
|
||
FRMQ: HRRZ E,(C) ; POINT TO PV DOPE WORD
|
||
SOJA E,VECMQ1
|
||
|
||
ATMMQ: CAML 0,GCSBOT ; ALWAYS KEEP FROZEN ATOMS
|
||
JRST VECMQ
|
||
AOS (P)
|
||
POPJ P,
|
||
|
||
VECMQ: HLRE 0,E ;GET LENGTH
|
||
SUB E,0 ;POINT TO DOPE WORDS
|
||
|
||
VECMQ1: SKIPGE 1(E) ;SKIP IF NOT MARKED
|
||
AOS (P) ;MARKED, CAUSE SKIP RETURN
|
||
POPJ P,
|
||
|
||
ASMQ: ADDI E,ASOLNT
|
||
JRST VECMQ1
|
||
|
||
LOCMQ: HRRZ 0,(C) ; GET TIME
|
||
JUMPE 0,VECMQ ; GLOBAL, LIKE VECTOR
|
||
HLRE 0,E ; FIND DOPE
|
||
SUB E,0
|
||
MOVEI E,1(E) ; POINT TO LAST DOPE
|
||
CAMN E,TPGROW ; GROWING?
|
||
SOJA E,VECMQ1 ; YES, CHECK
|
||
ADDI E,PDLBUF ; FUDGE
|
||
MOVSI 0,-PDLBUF
|
||
ADDM 0,1(C)
|
||
SOJA E,VECMQ1
|
||
|
||
OFFSMQ: HLRZS E ; POINT TO LIST STRUCTURE
|
||
SKIPGE (E) ; MARKED?
|
||
AOS (P) ; YES
|
||
POPJ P,
|
||
|
||
; SUBROUTINE TO UPDATE ASSOCIATIONS AND MOVE THEM INTO THE INF
|
||
|
||
ASSOUP: MOVE A,GCNOD ; RECOVER PTR TO START OF CHAIN
|
||
ASSOP1: HRRZ B,NODPNT(A)
|
||
PUSH P,B ; SAVE NEXT ON CHAIN
|
||
PUSH P,A ; SAVE IT
|
||
HRRZ B,ASOLNT-1(A) ;POINT TO NEXT
|
||
JUMPE B,ASOUP1
|
||
HRRZ C,ASOLNT+1(B) ;AND GET ITS RELOC IN C
|
||
SUBI C,ASOLNT+1(B) ; RELATIVIZE
|
||
ADDM C,ASOLNT-1(A) ;C NOW HAS UPDATED POINTER
|
||
ASOUP1: HLRZ B,ASOLNT-1(A) ;GET PREV BLOCK POINTER
|
||
JUMPE B,ASOUP2
|
||
HRRZ F,ASOLNT+1(B) ;AND ITS RELOCATION
|
||
SUBI F,ASOLNT+1(B) ; RELATIVIZE
|
||
MOVSI F,(F)
|
||
ADDM F,ASOLNT-1(A) ;RELOCATE
|
||
ASOUP2: HRRZ B,NODPNT(A) ;UPDATE NODE CHAIN
|
||
JUMPE B,ASOUP4
|
||
HRRZ C,ASOLNT+1(B) ;GET RELOC
|
||
SUBI C,ASOLNT+1(B) ; RELATIVIZE
|
||
ADDM C,NODPNT(A) ;AND UPDATE
|
||
ASOUP4: HLRZ B,NODPNT(A) ;GET PREV POINTER
|
||
JUMPE B,ASOUP5
|
||
HRRZ F,ASOLNT+1(B) ;RELOC
|
||
SUBI F,ASOLNT+1(B)
|
||
MOVSI F,(F)
|
||
ADDM F,NODPNT(A)
|
||
ASOUP5: POP P,A ; RECOVER PTR TO DOPE WORD
|
||
MOVEI A,ASOLNT+1(A)
|
||
MOVSI B,400000 ;UNMARK IT
|
||
XORM B,(A)
|
||
HRRZ E,(A) ; SET UP PTR TO INF
|
||
HLRZ B,(A)
|
||
SUBI E,-1(B) ; ADJUST PTR
|
||
PUSHJ P,ADPMOD
|
||
PUSHJ P,TRBLK ; OUT IT GOES
|
||
POP P,A ; RECOVER PTR TO ASSOCIATION
|
||
JUMPN A,ASSOP1 ; IF NOT ZERO CONTINUP
|
||
POPJ P, ; DONE
|
||
|
||
|
||
; HERE TO CLEAN UP ATOM HASH TABLE
|
||
|
||
ATCLEA: MOVE A,GCHSHT ; GET TABLE POINTER
|
||
|
||
ATCLE1: MOVEI B,0
|
||
SKIPE C,(A) ; GET NEXT
|
||
JRST ATCLE2 ; GOT ONE
|
||
|
||
ATCLE3: PUSHJ P,OUTATM
|
||
AOBJN A,ATCLE1
|
||
|
||
MOVE A,GCHSHT ; MOVE OUT TABLE
|
||
PUSHJ P,SPCOUT
|
||
POPJ P,
|
||
|
||
; HAVE AN ATOM IN C
|
||
|
||
ATCLE2: MOVEI B,0
|
||
|
||
ATCLE5: CAIL C,HIBOT
|
||
JRST ATCLE3
|
||
CAMG C,VECBOT ; FROZEN ATOMS ALWAYS MARKED
|
||
JRST .+3
|
||
SKIPL 1(C) ; SKIP IF ATOM MARKED
|
||
JRST ATCLE6
|
||
|
||
HRRZ 0,1(C) ; GET DESTINATION
|
||
CAIN 0,-1 ; FROZEN/MAGIC ATOM
|
||
MOVEI 0,1(C) ; USE CURRENT POSN
|
||
SUBI 0,1 ; POINT TO CORRECT DOPE
|
||
JUMPN B,ATCLE7 ; JUMP IF GOES INTO ATOM
|
||
|
||
HRRZM 0,(A) ; INTO HASH TABLE
|
||
JRST ATCLE8
|
||
|
||
ATCLE7: HRLM 0,2(B) ; INTO PREV ATOM
|
||
PUSHJ P,OUTATM
|
||
|
||
ATCLE8: HLRZ B,1(C)
|
||
ANDI B,377777 ; KILL MARK BIT
|
||
SUBI B,2
|
||
HRLI B,(B)
|
||
SUBM C,B
|
||
HLRZ C,2(B)
|
||
JUMPE C,ATCLE3 ; DONE WITH BUCKET
|
||
JRST ATCLE5
|
||
|
||
; HERE TO PASS OVER LOST ATOM
|
||
|
||
ATCLE6: HLRZ F,1(C) ; FIND NEXT ATOM
|
||
SUBI C,-2(F)
|
||
HLRZ C,2(C)
|
||
JUMPE B,ATCLE9
|
||
HRLM C,2(B)
|
||
JRST .+2
|
||
ATCLE9: HRRZM C,(A)
|
||
JUMPE C,ATCLE3
|
||
JRST ATCLE5
|
||
|
||
OUTATM: JUMPE B,CPOPJ
|
||
PUSH P,A
|
||
PUSH P,C
|
||
HLRE A,B
|
||
SUBM B,A
|
||
MOVSI D,400000 ;UNMARK IT
|
||
XORM D,1(A)
|
||
HRRZ E,1(A) ; SET UP PTR TO INF
|
||
HLRZ B,1(A)
|
||
SUBI E,-1(B) ; ADJUST PTR
|
||
MOVEI A,1(A)
|
||
PUSHJ P,ADPMOD
|
||
PUSHJ P,TRBLK ; OUT IT GOES
|
||
POP P,C
|
||
POP P,A ; RECOVER PTR TO ASSOCIATION
|
||
POPJ P,
|
||
|
||
|
||
VCMLOS: FATAL AGC--VECTOR WITH ZERO IN DOPE WORD LENGTH
|
||
|
||
|
||
; THESE ARE THE MESSAGES INDICATING THE CAUSE OF THE GC
|
||
|
||
MSGGCT: [ASCIZ /USER CALLED- /]
|
||
[ASCIZ /FREE STORAGE- /]
|
||
[ASCIZ /TP-STACK- /]
|
||
[ASCIZ /TOP-LEVEL LOCALS- /]
|
||
[ASCIZ /GLOBAL VALUES- /]
|
||
[ASCIZ /TYPES- /]
|
||
[ASCIZ /STATIONARY IMPURE STORAGE- /]
|
||
[ASCIZ /P-STACK /]
|
||
[ASCIZ /BOTH STACKS BLOWN- /]
|
||
[ASCIZ /PURE STORAGE- /]
|
||
[ASCIZ /GC-RCALL- /]
|
||
|
||
; THESE ARE MESSAGES INDICATING WHO CAUSED THE GC
|
||
|
||
GCPAT: SPBLOK 100
|
||
EGCPAT: -1
|
||
|
||
MSGGFT: [ASCIZ /GC-READ /]
|
||
[ASCIZ /BLOAT /]
|
||
[ASCIZ /GROW /]
|
||
[ASCIZ /LIST /]
|
||
[ASCIZ /VECTOR /]
|
||
[ASCIZ /SET /]
|
||
[ASCIZ /SETG /]
|
||
[ASCIZ /FREEZE /]
|
||
[ASCIZ /PURE-PAGE LOADER /]
|
||
[ASCIZ /GC /]
|
||
[ASCIZ /INTERRUPT-HANDLER /]
|
||
[ASCIZ /NEWTYPE /]
|
||
[ASCIZ /PURIFY /]
|
||
|
||
.GLOBAL GCNO,BSTGC,BSTAT,NOWFRE,CURFRE,MAXFRE,USEFRE,NOWTP,CURTP,CTPMX,NOWLFL
|
||
.GLOBAL CURLVL,NOWGVL,CURGVL,NOWTYP,CURTYP,NOWSTO,CURSTO,CURMAX,NOWP,CURP,CPMX
|
||
.GLOBAL GCCAUS,GCCALL,LVLINC,GVLINC,TYPIC,STORIC,RCL,RCLV,GCDANG,GETNUM,RPTOP,CORTOP
|
||
.GLOBAL TPGROW,PPGROW,PGROW,PMAIN,PGOOD,PMAX,TPGOOD,TPMIN,TPMAX,RFRETP,TYPTAB
|
||
.GLOBAL NNPRI,NNSAT,TYPSAV,BUFGC,GCTIM,GPURFL,GCDFLG,DUMFLG
|
||
.GLOBAL TPBINC,GBLINC,TYPINC,CONADJ,OGCSTP,ABOTN,MAXLEN
|
||
.GLOBAL PURMIN,GCMONF,.LIST.,FPAG,PMIN,GLBINC,INCORF,PURCOR,GCHAIR
|
||
|
||
|
||
;LOCAL VARIABLES
|
||
|
||
OFFSET 0
|
||
|
||
IMPURE
|
||
; LOCACTIONS USED BY THE PAGE HACKER
|
||
|
||
DOPSV1: 0 ;SAVED FIRST D.W.
|
||
DOPSV2: 0 ; SAVED LENGTH
|
||
|
||
|
||
; LOCATIONS USED BY BLOAT-STAT TO HELP THE USER PICK BLOAT SPECIFICATIONS.
|
||
;
|
||
|
||
GCNO: 0 ; USER-CALLED GC
|
||
BSTGC: 0 ; FREE STORAGE
|
||
0 ; BLOWN TP
|
||
0 ; TOP-LEVEL LVALS
|
||
0 ; GVALS
|
||
0 ; TYPE
|
||
0 ; STORAGE
|
||
0 ; P-STACK
|
||
0 ; BOTH STATCKS BLOWN
|
||
0 ; STORAGE
|
||
|
||
BSTAT:
|
||
NOWFRE: 0 ; FREE STORAGE FROM LAST GC
|
||
CURFRE: 0 ; STORAGE USED SINCE LAST GC
|
||
MAXFRE: 0 ; MAXIMUM FREE STORAGE ALLOCATED
|
||
USEFRE: 0 ; TOTAL FREE STORAGE USED
|
||
NOWTP: 0 ; TP LENGTH FROM LAST GC
|
||
CURTP: 0 ; # WORDS ON TP
|
||
CTPMX: 0 ; MAXIMUM SIZE OF TP SO FAR
|
||
NOWLVL: 0 ; # OF TOP-LEVEL LVAL-SLOTS
|
||
CURLVL: 0 ; # OF TOP-LEVEL LVALS
|
||
NOWGVL: 0 ; # OF GVAL SLOTS
|
||
CURGVL: 0 ; # OF GVALS
|
||
NOWTYP: 0 ; SIZE OF TYPE-VECTOR
|
||
CURTYP: 0 ; # OF TYPES
|
||
NOWSTO: 0 ; SIZE OF STATIONARY STORAGE
|
||
CURSTO: 0 ; STATIONARY STORAGE IN USE
|
||
CURMAX: 0 ; MAXIMUM BLOCK OF CONTIGUOUS STORAGE
|
||
NOWP: 0 ; SIZE OF P-STACK
|
||
CURP: 0 ; #WORDS ON P
|
||
CPMX: 0 ; MAXIMUM P-STACK LENGTH SO FAR
|
||
GCCAUS: 0 ; INDICATOR FOR CAUSE OF GC
|
||
GCCALL: 0 ; INDICATOR FOR CALLER OF GC
|
||
|
||
|
||
; THIS GROUP OF VARIABLES DETERMINES HOW THINGS GROW
|
||
LVLINC: 6 ; LVAL INCREMENT ASSUMED TO BE 64 SLOTS
|
||
GVLINC: 4 ; GVAL INCREMENT ASSUMED TO BE 64 SLOTS
|
||
TYPIC: 1 ; TYPE INCREMENT ASSUMED TO BE 32 TYPES
|
||
STORIC: 2000 ; STORAGE INCREMENT USED BY NFREE (MINIMUM BLOCK-SIZE)
|
||
|
||
|
||
RCL: 0 ; POINTER TO LIST OF RECYCLEABLE LIST CELLS
|
||
RCLV: 0 ; POINTER TO RECYCLED VECTORS
|
||
GCMONF: 0 ; NON-ZERO SAY GIN/GOUT
|
||
GCDANG: 0 ; NON-ZERO, STORAGE IS LOW
|
||
INBLOT: 0 ; INDICATE THAT WE ARE RUNNING OIN A BLOAT
|
||
GETNUM: 0 ;NO OF WORDS TO GET
|
||
RFRETP:
|
||
RPTOP: 0 ;NO OF BLOCKS OF CORE, IF GIVING CORE AWAY
|
||
CORTOP: 0 ;CURRENT TOP OF CORE, EXCLUDING ANY TO BE GIVEN AWAY
|
||
NGCS: 8 ; NUMBER OF GARBAGE COLLECTS BETWEEN HAIRY GCS
|
||
|
||
;VARIABLES WHICH DETERMIN WHEN MUDDLE WILL ASK FOR MORE CORE,
|
||
;AND WHEN IT WILL GET UNHAPPY
|
||
|
||
FREMIN: 20000 ;MINIMUM FREE WORDS
|
||
|
||
;POINTER TO GROWING PDL
|
||
|
||
TPGROW: 0 ;POINTS TO A BLOWN TP
|
||
PPGROW: 0 ;POINTS TO A BLOWN PP
|
||
PGROW: 0 ;POINTS TO A BLOWN P
|
||
|
||
;IN GC FLAG
|
||
|
||
GCFLG: 0
|
||
GCFLCH: 0 ; TELL INT HANDLER TO ITIC CHARS
|
||
GCHAIR: 1 ; COUNTS GCS AND TELLS WHEN TO HAIRIFY
|
||
GCDOWN: 0 ; AMOUNT TO TRY AND MOVE DOWN
|
||
CURPLN: 0 ; LENGTH OF CURRENTLY RUNNING PURE RSUBR
|
||
PURMIN: 0 ; MINIMUM PURE STORAGE
|
||
|
||
; VARS ASSOCIATED WITH BLOAT LOGIC
|
||
PMIN: 200 ; MINIMUM FOR PSTACK
|
||
PGOOD: 1000 ; GOOD SIZE FOR PSTACK
|
||
PMAX: 4000 ; MAX SIZE FOR PSTACK
|
||
TPMIN: 1000 ; MINIMUM SIZE FOR TP
|
||
TPGOOD: NTPGOO ; GOOD SIZE OF TP
|
||
TPMAX: NTPMAX ; MAX SIZE OF TP
|
||
|
||
TPBINC: 0
|
||
GLBINC: 0
|
||
TYPINC: 0
|
||
|
||
; VARS FOR PAGE WINDOW HACKS
|
||
|
||
GCHSHT: 0 ; SAVED ATOM TABLE
|
||
PURSVT: 0 ; SAVED PURVEC TABLE
|
||
GLTOP: 0 ; SAVE GLOTOP
|
||
GCNOD: 0 ; PTR TO START OF ASSOCIATION CHAIN
|
||
GCGBSP: 0 ; SAVED GLOBAL SP
|
||
GCASOV: 0 ; SAVED PTR TO ASSOCIATION VECTOR
|
||
GCATM: 0 ; PTR TO IMQUOT THIS-PROCESS
|
||
FNTBOT: 0 ; BOTTOM OF FRONTEIR
|
||
WNDBOT: 0 ; BOTTOM OF WINDOW
|
||
WNDTOP: 0
|
||
BOTNEW: (FPTR) ; POINTER TO FRONTIER
|
||
GCTIM: 0
|
||
NPARBO: 0 ; SAVED PARBOT
|
||
|
||
; FLAGS TO INDICATE DUMPER IS IN USE
|
||
|
||
GPURFL: 0 ; INDICATE PURIFIER IS RUNNING
|
||
GCDFLG: 0 ; INDICATE EITHER GCDUMP OR PURIFIER IS RUNNING
|
||
DUMFLG: 0 ; FLAG INDICATING DUMPER IS RUNNING
|
||
|
||
; CONSTANTS FOR DUMPER,READER AND PURIFYER
|
||
|
||
ABOTN: 0 ; COUNTER FOR ATOMS
|
||
NABOTN: 0 ; POINTER USED BY PURIFY
|
||
OGCSTP: 0 ; CONTAINS OLD GCSTOP FOR READER
|
||
MAPUP: 0 ; BEGINNING OF MAPPED UP PURE STUFF
|
||
SAVRES: 0 ; SAVED UPDATED ITEM OF PURIFIER
|
||
SAVRE2: 0 ; SAVED TYPE WORD
|
||
SAVRS1: 0 ; SAVED PTR TO OBJECT
|
||
INF1: 0 ; AOBJN PTR USED IN CREATING PROTECTION INF
|
||
INF2: 0 ; AOBJN PTR USED IN CREATING SECOND INF
|
||
INF3: 0 ; AOBJN PTR USED TO PURIFY A STRUCTURE
|
||
|
||
; VARIABLES USED BY GC INTERRUPT HANDLER
|
||
|
||
GCHPN: 0 ; SET TO -1 EVERYTIME A GC HAS OCCURED
|
||
GCKNUM: 0 ; NUMBER OF WORDS OF REQUEST TO INTERRUPT
|
||
|
||
; VARIABLE TO INDICATE WHETHER AGC HAS PUSHED THE MAPPING CHANNEL TO WIN
|
||
|
||
PSHGCF: 0
|
||
|
||
; VARIABLES USED BY DUMPER AND READER TO HANDLE NEWTYPES
|
||
|
||
TYPTAB: 0 ; POINTER TO TYPE TABLE
|
||
NNPRI: 0 ; NUMPRI FROM DUMPED OBJECT
|
||
NNSAT: 0 ; NUMSAT FROM DUMPED OBJECT
|
||
TYPSAV: 0 ; SAVE PTR TO TYPE VECTOR
|
||
|
||
; VARIABLES USED BY GC-DUMP FOR COPY-WRITE MAPPING
|
||
|
||
BUFGC: 0 ; BUFFER FOR COPY ON WRITE HACKING
|
||
PURMNG: 0 ; FLAG INDICATING IF A PURIFIED PAGE WAS MUNGED DURING GC-DUMP
|
||
RPURBT: 0 ; SAVED VALUE OF PURTOP
|
||
RGCSTP: 0 ; SAVED GCSTOP
|
||
|
||
; VARIABLES USED TO DETERMINE WHERE THE GC-DUMPED STRUCTURE SHOULD GO
|
||
|
||
INCORF: 0 ; INDICATION OF UVECTOR HACKS FOR GC-DUMP
|
||
PURCOR: 0 ; INDICATION OF UVECTOR TO PURE CORE
|
||
; ARE NOT GENERATED
|
||
|
||
|
||
PLODR: 0 ; INDICATE A PLOAD IS IN OPERATION
|
||
NPRFLG: 0
|
||
|
||
; VARIABLE USED BY MARK SWEEP GARBAGE COLLECTOR
|
||
|
||
MAXLEN: 0 ; MAXIMUM RECLAIMED SLOT
|
||
|
||
PURE
|
||
|
||
OFFSET OFFS
|
||
|
||
CONSTANTS
|
||
|
||
HERE
|
||
|
||
CONSTANTS
|
||
|
||
OFFSET 0
|
||
|
||
ZZ==$.+1777
|
||
|
||
.LOP ANDCM ZZ 1777
|
||
|
||
ZZ1==.LVAL1
|
||
|
||
LOC ZZ1
|
||
|
||
|
||
OFFSET OFFS
|
||
|
||
WIND: SPBLOK 2000
|
||
FRONT: SPBLOK 2000
|
||
MRKPD: SPBLOK 1777
|
||
ENDPDL: -1
|
||
|
||
MRKPDL=MRKPD-1
|
||
|
||
ENDGC:
|
||
|
||
OFFSET 0
|
||
|
||
.LOP <ASH @> WIND <,-10.>
|
||
WNDP==.LVAL1
|
||
|
||
.LOP <ASH @> FRONT <,-10.>
|
||
FRNP==.LVAL1
|
||
|
||
ZZ2==ENDGC-AGCLD
|
||
.LOP <ASH @> ZZ2 <,-10.>
|
||
LENGC==.LVAL1
|
||
|
||
.LOP <ASH @> LENGC <,10.>
|
||
RLENGC==.LVAL1
|
||
|
||
.LOP <ASH @> AGCLD <,-10.>
|
||
PAGEGC==.LVAL1
|
||
|
||
OFFSET 0
|
||
|
||
LOC GCST
|
||
.LPUR==$.
|
||
|
||
END
|
||
|