mirror of
https://github.com/PDP-10/its.git
synced 2026-05-23 13:56:15 +00:00
Looking at the backup dates for files in <mdl.int>, mdl106.exe is from 20th January 1981, whereas some of the source files are from a couple of years later. Revert to the last version prior to 20th January 1981 -- in every case, this was the earliest revision that was kept in <mdl.int>. This undoes the changes that we'd previously made to these files, many of which are no longer necessary now that we're using MIDAS 73.
2289 lines
52 KiB
Plaintext
2289 lines
52 KiB
Plaintext
|
||
TITLE SECAGC MUDDLE GARBAGE COLLECTOR FOR MULTI SECTIONS
|
||
|
||
;SYSTEM WIDE DEFINITIONS GO HERE
|
||
|
||
RELOCATABLE
|
||
GCST==$.
|
||
TOPGRO==111100
|
||
BOTGRO==001100
|
||
MFORK==400000
|
||
.GLOBAL SHRRM,SHRLM,SMOVEM,SSETZM,SXBLT,SHLRZ
|
||
.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,%SLEEP,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
|
||
.GLOBAL SPBASE,OUTRNG,CISTNG,CBYTES,%RUNAM,PURVEC,GCDOWN,N.CHNS,CHNL1,PLODR
|
||
.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 ISECGC,SECLEN,RSECLE
|
||
.GLOBAL P.TOP,P.CORE,PMAPB,IGET,CIGTPR,ROOT,STBL,CAFREE,%MPIN1,%PURIF,%MPINX,GCHK10
|
||
.GLOBAL %SAVRP,%RSTRP,LENGC,AGCLD,PAGEGC,REALGC
|
||
.GLOBAL %MPINT,%GBINT,%CLSMP,%CLSM1,PINIT,PGFIND,NPRFLG
|
||
.GLOBAL GCKNUM,CORTOP,GCHPN,INTAGC,WNDP,WNDBOT,BUFGC,WIND,GCDFLG,SAVM,AGC,GCSET
|
||
|
||
.GLOBAL INBLOT,RSLENG
|
||
|
||
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
|
||
|
||
|
||
GCHN==0 ; CHANNEL FOR FUNNNY INFERIOR
|
||
STATNO==19. ; # OF STATISTICS FOR BLOAT-STAT
|
||
STATGC==8. ; # OF GC-STATISTICS FOR BLOAT-STAT
|
||
|
||
|
||
LOC REALGC+RLENGC+RSLENG
|
||
OFFS==AGCLD-$.
|
||
OFFSET OFFS
|
||
|
||
.INSRT MUDDLE >
|
||
|
||
.INSRT STENEX >
|
||
|
||
PGSZ==9.
|
||
|
||
F==E+1 ; THESE 3 ACS OFTEN USED FOR XBLT
|
||
G==F+1
|
||
FPTR==G+1
|
||
|
||
TYPNT==FPTR+1 ; SPECIAL AC USAGE DURING GC
|
||
EXTAC==TYPNT+1 ; ALSO SPECIAL DURING GC
|
||
LPVP==EXTAC+1 ; SPECIAL FOR GC, HOLDS POINTER TO PROCESS
|
||
; CHAIN
|
||
.LIST.==400000
|
||
.GLOBAL %FXUPS,%FXEND
|
||
|
||
|
||
|
||
DEFINE DOMULT INS
|
||
FOOIT [INS]
|
||
TERMIN
|
||
|
||
DEFINE FOOIT INS,\LCN
|
||
LCN==.-OFFS
|
||
INS
|
||
RMT [
|
||
TBLADD LCN
|
||
]
|
||
TERMIN
|
||
|
||
RMT [%FXLIN==0
|
||
]
|
||
|
||
DEFINE TBLADD LCN,\FOO
|
||
FOO==.-OFFS
|
||
%FXLIN,,LCN
|
||
%FXLIN==FOO
|
||
%FXUPS==FOO
|
||
TERMIN
|
||
|
||
|
||
RMT [XBLT==123000,,%XXBLT
|
||
]
|
||
|
||
|
||
|
||
ISECGC:
|
||
|
||
;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 /SGIN /]
|
||
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: ADJSP P,-1 ; POP OFF C
|
||
POP P,A
|
||
POP P,B
|
||
EXCH P,GCPDL
|
||
HLLZS SQUPNT ; FLUSH SQUOZE TABLE
|
||
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,400000+B ; LOCAL INDEX
|
||
|
||
CHPDL: MOVE D,P ; SAVE FOR LATER
|
||
CORGET: MOVE P,[GCSEG,,MRKPDL] ; USE GCSEG FOR PDL
|
||
|
||
;FENCE POST PDLS AND CHECK IF ANY SHOULD BE SHRUNK
|
||
|
||
HRRZ 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
|
||
MOVEM A,NPARBO
|
||
MOVE FPTR,A
|
||
HRLI FPTR,GCSEG
|
||
|
||
; NOW ZERO OUT NEW SPACE USING XBLT
|
||
|
||
; DOMULT [SETZM (FPTR)]
|
||
; MOVEI 0,777777-1
|
||
; SUBI 0,(FPTR) ; FROM VECBOT UP
|
||
; MOVE A,FPTR
|
||
; MOVE B,A
|
||
; ADDI B,1
|
||
; DOMULT [XBLT 0,]
|
||
|
||
; USE PMAP TO FLUSH GC SPACE PAGES
|
||
|
||
MOVNI A,1
|
||
MOVE B,[MFORK,,GCSEG_9.]
|
||
MOVE C,[SETZ 777]
|
||
PMAP
|
||
|
||
;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
|
||
|
||
|
||
|
||
|
||
; MOVE NEW GC SPACE IN
|
||
|
||
NOMAP1: MOVE A,P.TOP
|
||
SUBI A,1
|
||
MOVE C,PARBOT
|
||
MOVE B,C
|
||
SUB A,B
|
||
HRLI B,GCSEG
|
||
DOMULT [XBLT A,]
|
||
|
||
|
||
; 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
|
||
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 ISECGC
|
||
|
||
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 ; IF LOADING ONE, IT MIGHT NOT HAVE ARRIVED
|
||
JRST FINAGC
|
||
|
||
FATAL AGC--RUNNING RSUBR WENT AWAY
|
||
|
||
AGCE1: FATAL AGC--TYPE VECTOR NOT OF TYPE VECTOR
|
||
|
||
; CORE ADJUSTMENT PHASE
|
||
|
||
CORADJ: MOVE A,PURTOP
|
||
SUB A,CURPLN ; ADJUST FOR RSUBR
|
||
MOVEM A,RPTOP
|
||
HRRZ A,FPTR ; 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
|
||
HRRZ A,FPTR ; GCSTOP
|
||
MOVEM A,GCSTOP
|
||
MOVE A,CORTOP ; ADJUST CORE IMAGE
|
||
ASH A,-10. ; TO PAGES
|
||
TRYPCO: PUSHJ P,P.CORE
|
||
FATAL NO CORE?
|
||
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
|
||
HRRZ A,FPTR
|
||
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
|
||
MOVEM A,CORTOP ; ADJUST PARAMETER
|
||
JRST CORAD6 ; WIN TOTALLY
|
||
CORAD8: MOVEM A,CORTOP ; NEW CORTOP
|
||
JRST CORAD6
|
||
|
||
; 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,
|
||
|
||
|
||
|
||
; 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
|
||
MOVEI A,FSEG
|
||
HRLM A,-1(P)
|
||
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,[TOPGRO,,-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 EXTAC,1(A) ; GET LNTH
|
||
LDB 0,[TOPGRO,,(A)] ; GET GROWTHS
|
||
TRZE 0,400 ; SIGN HACK
|
||
MOVNS 0
|
||
ASH 0,6 ; TO WORDS
|
||
ADD EXTAC,0
|
||
LDB 0,[BOTGRO,,(A)]
|
||
TRZE 0,400
|
||
MOVNS 0
|
||
ASH 0,6
|
||
ADD EXTAC,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: JUMPE A,CPOPJ ; NEVER MARK 0
|
||
MOVEI 0,1(A)
|
||
CAML 0,PURBOT
|
||
JRST GCRETD
|
||
MARCON: PUSH P,C
|
||
PUSH P,A
|
||
ANDI B,TYPMSK ; FLUSH MONITORS
|
||
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
|
||
JRST @SMKTBS(B)
|
||
|
||
SMKTBS:
|
||
|
||
OFFSET 0
|
||
|
||
TBLDIS DUM2,GCRET,[[S2WORD,PAIRMK],[S2DEFR,DEFMK],[SNWORD,VECTMK],[STBASE,TBMK]
|
||
[STPSTK,TPMK],[SARGS,ARGMK],[S2NWORD,VECTMK],[SPSTK,TPMK],[SSTORE,VECTMK]
|
||
[SFRAME,FRMK],[SBYTE,BYTMK],[SATOM,ATOMK],[SPVP,VECTMK],[SGATOM,GATOMK]
|
||
[SLOCID,LOCMK],[SCHSTR,BYTMK],[SASOC,ASMRK],[SLOCL,PAIRMK],[SABASE,ABMK]
|
||
[SLOCA,ARGMK],[SLOCV,VECTMK],[SLOCU,VECTMK],[SLOCS,BYTMK],[SLOCN,ASMRK]
|
||
[SLOCR,LOCRMK],[SRDTB,GCRDMK],[SLOCB,BYTMK],[SDEFQ,DEFQMK],[SOFFS,OFFSMK]]NUMSAT,400000
|
||
|
||
OFFSET OFFS
|
||
|
||
; 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: SETOM GENFLG ; SET FLAG SAYING DEFERRED
|
||
CAIA
|
||
|
||
;HERE TO MARK LIST ELEMENTS
|
||
|
||
PAIRMK: SETZM GENFLG ;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
|
||
DOMULT [MOVEM B,(FPTR)]
|
||
MOVE 0,1(C) ; AND 2D
|
||
DOMULT [MOVEM 0,1(FPTR)]
|
||
ADDI FPTR,2 ; MOVE ALONG IN NEW SPACE
|
||
|
||
PAIRM2: MOVEI A,-2(FPTR) ; GET INF ADDR
|
||
HRRM A,(C) ; LEAVE A POINTER TO NEW HOME
|
||
HRRZ E,(P) ; GET BACK POINTER
|
||
JUMPE E,PAIRM7 ; 1ST ONE, NEW FIXUP
|
||
HRLI E,GCSEG
|
||
DOMULT [HRRM A,(E)] ; CLOBBER
|
||
PAIRM4: MOVEM A,(P) ; NEW BACK POINTER
|
||
SKIPGE GENFLG
|
||
JRST 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
|
||
HRLI E,GCSEG
|
||
DOMULT [MOVEM A,1(E)]
|
||
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: ADJSP P,-1
|
||
|
||
GCRET: SETZM GENFLG ;FOR PAIRMKS BENEFIT
|
||
POP P,A ;RESTORE C AND A
|
||
POP P,C
|
||
POPJ P, ;AND RETURN TO CALLER
|
||
|
||
GCRETD: ANDI B,TYPMSK ; TURN OFF MONITORS
|
||
CAIN B,TLOCR ; SEE IF A LOCR
|
||
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
|
||
HRLI C,GCSEG ; KEEP IN CORRECT SECTION
|
||
PUSHJ P,MARK2 ;MARK THE DATUM
|
||
HRRZ E,-2(P) ; GET POINTER IN INF CORE
|
||
HRLI E,GCSEG
|
||
DOMULT [MOVEM A,1(E)]
|
||
MOVE A,-1(P)
|
||
DOMULT [HRRM A,(E)]
|
||
ADJSP P,-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
|
||
HRLI E,GCSEG
|
||
DOMULT [HRRM A,(E)]
|
||
JRST GCRETP
|
||
|
||
RETNW1: MOVEM A,-1(P)
|
||
JRST GCRETP
|
||
|
||
|
||
; VECTOR AND TP MARKER, SIGN OF TYPNT IS SET BASED ON WHICH ONE
|
||
|
||
TPMK: SETOM GENFLG ;SET TP MARK FLAG
|
||
CAIA
|
||
VECTMK: SETZM GENFLG
|
||
PUSH P,FPTR
|
||
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
|
||
|
||
MOVE 0,GENFLG
|
||
HLLM 0,(P) ; SAVE TP VS VECT INDICATOR
|
||
JUMPE 0,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,[TOPGRO,,-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,[BOTGRO,,-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 EXTAC,(E) ;SAVE A COPY
|
||
ADD EXTAC,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
|
||
MOVE EXTAC,GENFLG
|
||
SKIPGE B,-1(A) ;SKIP IF UNIFORM
|
||
TLNE B,377777-.VECT. ;SKIP IF NOT SPECIAL
|
||
JUMPE EXTAC,NOTGEN ;JUMP IF NOT A GENERAL VECTOR
|
||
|
||
GENRAL: HLRZ 0,B ;CHECK FOR PSTACK
|
||
TRZ 0,.VECT.
|
||
JUMPE 0,NOTGEN ;IT ISN'T GENERAL
|
||
JUMPN EXTAC,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
|
||
CAMGE A,GCSBOT ; DONT DO THIS STUFF IF THIS IS FROZEN
|
||
JRST EXVEC1
|
||
HRRZ B,-1(P) ; GET POINTER INTO INF
|
||
JUMPLE C,MOVEC3
|
||
ADD B,C ; GROW IT
|
||
MOVEC3: HLLZ 0,-1(A) ; MODIFY DOPE WORD AND PLACE IN INF
|
||
TLO 0,.VECT.
|
||
HRRZ EXTAC,(A) ; DESTINATION OF DOPEWORDS (SORT OF)
|
||
HRLI EXTAC,GCSEG ; MAKE INTO CORRECT KIND OF ADDR
|
||
DOMULT [MOVEM 0,-1(EXTAC)]
|
||
HLRZ 0,(A)
|
||
ANDI 0,377777 ; KILL MARK BIT
|
||
SKIPG C
|
||
ADD 0,C ; COMPENSATE FOR SHRINKAGE
|
||
MOVE EXTAC,A
|
||
SUB A,0
|
||
ADDI A,1
|
||
SKIPGE (P) ; ACCOUNT FOR OTHER END SHRINKAGE
|
||
ADD 0,(P)
|
||
HRLI B,GCSEG
|
||
SUBI 0,2 ; AVOID RE-SENDING DOPE WORDS
|
||
DOMULT [XBLT 0,] ; MOVE VECTOR TO OTHER IMAGE
|
||
MOVE A,EXTAC
|
||
EXVEC1: ADJSP P,-1
|
||
|
||
EXVECT: HLRZ B,(P)
|
||
ADJSP P,-1 ; GET RID OF FPTR
|
||
PUSHJ P,RELATE ; RELATIVIZE
|
||
JUMPE B,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 ; RESTORE DW POINTER
|
||
POP P,C ; AND BOTTOM GROWTH
|
||
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
|
||
HRLI E,GCSEG
|
||
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)
|
||
AOS E,-1(P) ; MOVE OUT TYPE
|
||
DOMULT [MOVEM A,-1(E)]
|
||
DOMULT [MOVEM R,(E)]
|
||
AOS -1(P)
|
||
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)
|
||
MOVE E,-1(P)
|
||
DOMULT [MOVEM A,(E)]
|
||
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)
|
||
DOMULT [MOVEM A,1(E)]
|
||
MOVE A,-2(P) ; ADJUST AB SLOT
|
||
ADD A,ABSAV-FSAV+1(C) ; POINT TO SAVED AB
|
||
DOMULT [MOVEM A,2(E)]
|
||
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
|
||
DOMULT [MOVEM A,3(E)]
|
||
HRROI C,PSAV-FSAV(C) ;POINT TO SAVED P
|
||
MOVEI B,TPDL
|
||
ADDI E,FRAMLN ; UPDATE OUT ADDR
|
||
MOVEM E,-1(P)
|
||
PUSHJ P,MARK1 ;AND MARK IT
|
||
MOVE E,-1(P)
|
||
DOMULT [MOVEM A,-3(E)] ; STORE UPDATED P
|
||
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
|
||
DOMULT [MOVEM A,-2(E)] ; AND UPDATED TP
|
||
MOVE A,PCSAV-PSAV+1(C)
|
||
DOMULT [MOVEM A,-1(E)] ; DONT FORGET SAVED PC
|
||
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)
|
||
AOS E,-1(P) ; FIX UP CHAIN
|
||
DOMULT [MOVEM A,-1(E)]
|
||
MOVEI B,TATOM ; RESTORE IN CASE SMASHED
|
||
PUSHJ P,MARK1 ; MARK ATOM
|
||
AOS E,-1(P) ; SEND IT OUT
|
||
DOMULT [MOVEM A,-1(E)]
|
||
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)
|
||
AOS E,-1(P) ; SEND IT OUT
|
||
DOMULT [MOVEM A,-1(E)]
|
||
MOVE A,R
|
||
DOMULT [MOVEM A,(E)] ; SEND OUT VALUE
|
||
AOS -1(P)
|
||
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
|
||
AOS E,-1(P) ; SEND IT OUT
|
||
DOMULT [MOVEM A,-1(E)]
|
||
SKIPL A,1(C) ; PREV LOC?
|
||
JRST NOTLCI
|
||
MOVEI B,TLOCI ; NOW MARK LOCATIVE
|
||
PUSHJ P,MARK1
|
||
NOTLCI: AOS E,-1(P) ; SEND IT OUT
|
||
DOMULT [MOVEM A,-1(E)]
|
||
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
|
||
AOS E,-1(P) ; SEND IT OUT
|
||
DOMULT [MOVEM A,-1(E)]
|
||
ADDI C,1 ; INCREMENT C FOR FENCE-POST
|
||
ADJSP P,-1 ; CLEAN UP STACK
|
||
POP P,E ; GET UPDATED PTR TO INF
|
||
ADJSP P,-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
|
||
HLLZ 0,-1(A) ; MODIFY DOPE WORD AND PLACE IN INF
|
||
TLO 0,.VECT.
|
||
HRRZ EXTAC,(A) ; DESTINATION OF DOPEWORDS (SORT OF)
|
||
HRLI EXTAC,GCSEG ; MAKE INTO CORRECT KIND OF ADDR
|
||
DOMULT [MOVEM 0,-1(EXTAC)]
|
||
JRST EXVECT
|
||
|
||
; ROUTINE TO ALLOCATE ROOM FOR VECTORS IN INFERIOR
|
||
; EXTAC= # OF WORDS TO ALLOCATE
|
||
|
||
ALLOGC: HRRZS A ; GET ABS VALUE
|
||
CAML A,GCSBOT ; SKIP IF IN STORAGE
|
||
JRST ALOGC2 ; JUMP IF ALLOCATING
|
||
HRRZ 0,A
|
||
POPJ P,
|
||
ALOGC2:
|
||
ALOGC1: ADDI FPTR,(EXTAC)
|
||
MOVEI 0,-1(FPTR)
|
||
DOMULT [HRRM 0,-1(FPTR)]
|
||
DOMULT [HRLM EXTAC,-1(FPTR)]
|
||
POPJ P,
|
||
|
||
; RELATE RELATAVIZES A POINTER TO A VECTOR
|
||
; B IS THE POINTER A==> DOPE WORD
|
||
|
||
RELATE: CAMGE A,GCSBOT ; SEE IF IN VECTOR SPACE
|
||
POPJ P, ; IF NOT EXIT
|
||
MOVE C,-1(P)
|
||
HLRE EXTAC,C ; GET LENGTH
|
||
HRRZ 0,-1(A) ; CHECK FO GROWTH
|
||
JUMPE A,RELAT1
|
||
LDB 0,[TOPGRO,,-1(A)] ; GET TOP GROWTH
|
||
TRZE 0,400 ; HACK SIGN BIT
|
||
MOVNS 0
|
||
ASH 0,6 ; CONVERT TO WORDS
|
||
SUB EXTAC,0 ; ACCOUNT FOR GROWTH
|
||
RELAT1: HRLM EXTAC,C ; PLACE CORRECTED LENGTH BACK IN POINTER
|
||
HRRZ EXTAC,(A) ; GET RELOCATED ADDR
|
||
SUBI EXTAC,(A) ; FIND RELATIVIZATION AMOUNT
|
||
ADD C,EXTAC ; 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)
|
||
MOVE C,P
|
||
PUSH P,A
|
||
MOVEI B,TTP
|
||
PUSHJ P,MARK
|
||
ADJSP P,-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 EXTAC,OTBSAV(A) ; GET TIME FROM FRAME
|
||
CAME B,EXTAC ; 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 EXTAC,-1(A) ; GET THE TYPE
|
||
ANDI EXTAC,SATMSK ; FLUSH MONITOR BITS
|
||
CAIN EXTAC,SATOM ; SEE IF ATOM
|
||
JRST ATMSET
|
||
HLRE EXTAC,(A) ; GET MARKING
|
||
JUMPL EXTAC,BYTREL ; JUMP IF MARKED
|
||
HLRZ EXTAC,(A) ; GET LENGTH
|
||
PUSHJ P,ALLOGC ; ALLOCATE FOR IT
|
||
HRRM 0,(A) ; SMASH IT IN
|
||
MOVE B,0
|
||
HLRZ 0,(A)
|
||
SUBI 0,1 ; DONT RESEND DW
|
||
SUBI B,-1(EXTAC) ; ADJUST INF POINTER
|
||
MOVE E,A
|
||
SUBI A,-1(EXTAC)
|
||
HRLI B,GCSEG
|
||
DOMULT [XBLT 0,]
|
||
IORM D,(E)
|
||
MOVE A,E
|
||
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
|
||
JRST BYTREL ; TO BYTREL
|
||
|
||
|
||
; MARK OFFSET
|
||
|
||
OFFSMK: HLRZS A
|
||
PUSH P,$TLIST
|
||
MOVE C,P
|
||
PUSH P,A ; PUSH LIST POINTER ON THE STACK
|
||
PUSHJ P,MARK2 ; MARK THE LIST
|
||
HRLM A,-2(P) ; UPDATE POINTER IN OFFSET
|
||
ADJSP P,-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
|
||
MOVE 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,(FPTR)
|
||
PUSH P,0 ; SAVE POINTER TO INF
|
||
SETOM .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) ; CHECK IF NOT ON ANY OBLIST
|
||
POP P,B ; RESTORE A
|
||
POP P,C ; GET POINTER INTO INF
|
||
MOVE A,B
|
||
SKIPN GCHAIR
|
||
JUMPN 0,ATMREL ; ALWAYS SEND OUT ATOMS ON NO OBLIST
|
||
|
||
; HERE WITH B POINT TO CURRENT DW AND C TO NEW DW, DO IT TO IT
|
||
|
||
ATMOVX: PUSHJ P,XBLTR
|
||
ATMREL: HRRZ E,(A) ; RELATAVIZE
|
||
SUBI E,(A)
|
||
ADDM E,(P)
|
||
JRST GCRET
|
||
ATMRL1: ADJSP P,-1 ; POP OFF STACK
|
||
JRST ATMREL
|
||
|
||
; HERE TO MOVE STUFF TO OTHER SEGMENT
|
||
; B==> CURRENT DW, C==> START OF NEW OBJECT (A MUST SURVIVE)
|
||
XBLTR: CAMGE B,GCSBOT
|
||
POPJ P,
|
||
MOVE EXTAC,A
|
||
HRRZ E,(B) ; NEW DW LOC
|
||
HRLI E,GCSEG
|
||
DOMULT [HLRZ A,(E)]
|
||
SUBI A,1
|
||
SUBI B,(A)
|
||
HRLI C,GCSEG
|
||
DOMULT [XBLT A,]
|
||
MOVE A,EXTAC ; BACK TO A
|
||
POPJ P,
|
||
|
||
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 EXTAC,(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: ADJSP P,-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
|
||
MOVE EXTAC,B ; AND COPY IT
|
||
LSH B,1 ;FIND OUT WHERE IT WILL GO
|
||
HRRZ B,@TYPNT ;GET SAT IN B
|
||
ANDI B,SATMSK
|
||
HRRZ C,SMKTBS(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,EXTAC ;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
|
||
|
||
ADJSP P,-2 ;REMOVE STACK CRAP
|
||
JRST UMOVEC
|
||
|
||
|
||
SPECLS: FATAL AGC--UNRECOGNIZED SPECIAL VECTOR
|
||
ADJSP P,-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,(FPTR) ; 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,B ; GET PTR TO D.W.
|
||
POP P,C ; GET PTR TO INF
|
||
ADJSP P,-1 ; GET RID OF TOP
|
||
MOVE A,B
|
||
JRST ATMOVX ; RELATIVIZE AND LEAVE
|
||
|
||
GCRDRL: POP P,A ; GET PTR TO D.W
|
||
ADJSP P,-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
|
||
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 C,(A) ; GET PTR IN FRONTEIR
|
||
SUBI C,ASOLNT+1 ; ADJUST TO POINT TO BEGINNING
|
||
MOVE B,A
|
||
PUSHJ P,XBLTR
|
||
JRST ASTR1
|
||
|
||
;HERE WHEN A VECTOR POINTER IS BAD
|
||
|
||
VECTB1:FATAL AGC--VECTOR POINTS OUTSIDE OF VECTOR SPACE
|
||
ADJSP P,-1 ; RECOVERY
|
||
AFIXUP: SETZM (P) ; CLOBBER SLOT
|
||
JRST GCRET ; CONTINUE
|
||
|
||
|
||
VECTB2: FATAL AGC--VECTOR POINTS OUT OF VECTOR SPACE
|
||
ADJSP P,-2
|
||
JRST AFIXUP ; RECOVER
|
||
|
||
PARERR: FATAL AGC--PAIR POINTS OUT OF PAIR SPACE
|
||
ADJSP P,-1 ; RECOVER
|
||
JRST AFIXUP
|
||
|
||
|
||
; HERE TO MARK TEMPLATE DATA STRUCTURES
|
||
|
||
TD.MRK: MOVEI 0,(FPTR) ; 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 B,-7(P) ; RESTORE PTR TO FRONTEIR
|
||
ADJSP P,-7 ; CLEAN UP STACK
|
||
USRAG1: ADDI A,1 ; POINT TO SECOND D.W.
|
||
MOVSI D,400000 ; SET UP MARK BIT
|
||
MOVE B,A
|
||
HRRZ C,(A) ; DEST DW
|
||
DOMULT [HLRZ E,(C)] ; LENGTH
|
||
SUBI C,-1(E)
|
||
PUSHJ P,XBLTR
|
||
TMPREL: ADJSP P,-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 B,(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 EXTAC,(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 EXTAC,(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,EXTAC
|
||
HLRE EXTAC,ASOLNT-INDIC+1(C) ; GET LENGTH
|
||
JUMPL EXTAC,.+3 ; SKIP IF MARKED
|
||
CAMGE C,VECBOT ; SKIP IF IN VECT SPACE
|
||
JRST ASOM20
|
||
HRRM FPTR,ASOLNT-INDIC+1(C) ; PUT IN RELATIVISATION
|
||
MOVEI EXTAC,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,EXTAC
|
||
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(EXTAC) ; 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
|
||
MOVE 0,.ATOM.
|
||
SETZM .ATOM.
|
||
JUMPN 0,VALFLA ; YES, CHECK VALUES
|
||
VALFL8:
|
||
|
||
; NOW SEE WHICH CHANNELS STILL POINTED TO
|
||
|
||
CHNFL3: MOVEI 0,N.CHNS-1
|
||
MOVEI A,CHNL1 ; SLOTS
|
||
HRLI E,TCHAN ; TYPE HERE TOO
|
||
|
||
CHNFL2: SKIPN B,1(A)
|
||
JRST CHNFL1
|
||
HLRE C,B
|
||
SUBI B,(C) ; POINT TO DOPE
|
||
HLLM E,(A) ; PUT TYPE BACK
|
||
HRRE EXTAC,(A) ; SEE IF ALREADY MARKED
|
||
JUMPN EXTAC,CHNFL1
|
||
SKIPGE 1(B)
|
||
JRST CHNFL8
|
||
HLLOS (A) ; MARK AS A LOSER
|
||
SETZM -1(P)
|
||
JRST CHNFL1
|
||
CHNFL8: MOVEI EXTAC,1 ; MARK A GOOD CHANNEL
|
||
HRRM EXTAC,(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
|
||
|
||
ADJSP P,-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 EXTAC,A ; CALCULATE START OF TP IN EXTAC
|
||
HLRZ B,(A) ; ADJUST INF PTR
|
||
TRZ B,400000
|
||
SUBI EXTAC,-1(B)
|
||
LDB M,[TOPGRO,,-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: ADJSP P,-1 ; CLEAN UP STACK
|
||
SUBI E,-1(B)
|
||
MOVEI A,6(R) ; POINT AFTER THE BINDING
|
||
MOVE 0,EXTAC ; CALCULATE # OF WORDS TO SEND OUT
|
||
SUBM A,0
|
||
HRRZ A,EXTAC
|
||
MOVE B,E
|
||
HRLI B,GCSEG
|
||
DOMULT [XBLT 0,]
|
||
HRRZS R,2(R) ; GET THE NEXT PROCESS
|
||
JUMPE R,.+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 E,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 STUFF - SPCOUX--DONT LOOK AT GROWTH
|
||
; SPCOUT--LOOK AT GROWTH
|
||
|
||
SPCOUX: TDZA C,C ; ZERO C AS FLAG
|
||
|
||
SPCOUT: MOVEI C,1
|
||
HLRE B,A
|
||
SUB A,B
|
||
MOVEI A,1(A) ; POINT TO DOPE WORD
|
||
CAMGE A,GCSBOT
|
||
POPJ P,
|
||
HLLZ 0,-1(A) ; MODIFY DOPE WORD AND PLACE IN INF
|
||
TLO 0,.VECT.
|
||
HRRZ B,(A) ; DESTINATION OF DOPEWORDS (SORT OF)
|
||
HRLI B,GCSEG ; MAKE INTO CORRECT KIND OF ADDR
|
||
DOMULT [MOVEM 0,-1(B)]
|
||
JUMPE C,SPCOUY ; JUMP IF NO GROWTH STUFF
|
||
LDB C,[BOTGRO,,-1(A)]
|
||
TRZE C,400
|
||
MOVNS C
|
||
ASH C,6
|
||
SPCOUY: DOMULT [HLRZ 0,(B)]
|
||
ADD 0,C ; COMPENSATE FOR SHRINKAGE
|
||
SUBI 0,1 ; DONT RESEND DW
|
||
SUB A,0
|
||
SUB B,0
|
||
DOMULT [XBLT 0,] ; MOVE VECTOR TO OTHER IMAGE
|
||
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,EXTAC
|
||
PUSHJ P,MARK2
|
||
MOVEM A,1(C)
|
||
POP P,EXTAC
|
||
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
|
||
ADJSP P,-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: SUBI 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 EXTAC,ASOLNT+1(B) ;AND ITS RELOCATION
|
||
SUBI EXTAC,ASOLNT+1(B) ; RELATIVIZE
|
||
MOVSI EXTAC,(EXTAC)
|
||
ADDM EXTAC,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 EXTAC,ASOLNT+1(B) ;RELOC
|
||
SUBI EXTAC,ASOLNT+1(B)
|
||
MOVSI EXTAC,(EXTAC)
|
||
ADDM EXTAC,NODPNT(A)
|
||
ASOUP5: POP P,A ; RECOVER PTR TO DOPE WORD
|
||
MOVEI A,ASOLNT(A)
|
||
PUSHJ P,SPCOUX
|
||
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 EXTAC,1(C) ; FIND NEXT ATOM
|
||
SUBI C,-2(EXTAC)
|
||
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
|
||
ANDI A,-1
|
||
PUSHJ P,SPCOUX
|
||
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
|
||
%XXBLT: 020000,,
|
||
|
||
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
|
||
|
||
|
||
|
||
;VARIABLES WHICH DETERMIN WHEN MUDDLE WILL ASK FOR MORE CORE,
|
||
;AND WHEN IT WILL GET UNHAPPY
|
||
|
||
;IN GC FLAG
|
||
|
||
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
|
||
NPARBO: 0 ; SAVED PARBOT
|
||
|
||
|
||
; CONSTANTS FOR DUMPER,READER AND PURIFYER
|
||
|
||
GENFLG: 0
|
||
.ATOM.: 0
|
||
|
||
|
||
; VARIABLE USED BY MARK SWEEP GARBAGE COLLECTOR
|
||
|
||
|
||
PURE
|
||
|
||
OFFSET OFFS
|
||
|
||
CONSTANTS
|
||
|
||
HERE
|
||
DEFINE HERE G00002,G00003
|
||
G00002!G00003!TERMIN
|
||
|
||
CONSTANTS
|
||
|
||
OFFSET 0
|
||
|
||
ZZ==$.+1777
|
||
|
||
.LOP ANDCM ZZ 1777
|
||
|
||
ZZ1==.LVAL1
|
||
|
||
LOC ZZ1
|
||
|
||
|
||
OFFSET OFFS
|
||
|
||
MRKPD: SPBLOK 1777
|
||
ENDPDL: -1
|
||
|
||
MRKPDL=MRKPD-1
|
||
|
||
SENDGC:
|
||
|
||
OFFSET 0
|
||
|
||
ZZ2==SENDGC-AGCLD
|
||
.LOP <ASH @> ZZ2 <,-10.>
|
||
SECLEN==.LVAL1
|
||
|
||
.LOP <ASH @> SECLEN <,10.>
|
||
RSECLE==.LVAL1
|
||
|
||
.LOP <ASH @> AGCLD <,-10.>
|
||
PAGESC==.LVAL1
|
||
|
||
OFFSET 0
|
||
|
||
LOC GCST
|
||
.LPUR==$.
|
||
|
||
END
|
||
|