mirror of
https://github.com/PDP-10/its.git
synced 2026-01-17 08:43:21 +00:00
506 lines
10 KiB
Plaintext
506 lines
10 KiB
Plaintext
TITLE LOADGC MODULE TO LOAD THE GARBAGE COLLECTOR
|
||
|
||
RELOCA
|
||
|
||
.INSRT MUDDLE >
|
||
SYSQ
|
||
IFE ITS,[
|
||
.INSRT STENEX >
|
||
XJRST==JRST 5,
|
||
]
|
||
IFN ITS, PGSZ==10.
|
||
IFE ITS, PGSZ==9.
|
||
|
||
; ROUTINES TO GET THE GC DO PDL OVERFLOWS IN GC AND ALLOCATE SPECIAL
|
||
; BUFFERS.
|
||
|
||
; IMPORTANT VARAIBLES
|
||
|
||
.GLOBAL PAGEGC ; STARTING PAGE OF GARBAGE COLLECTOR (PAGES)
|
||
.GLOBAL LENGC ; LENGTH OF GARBAGE COLLECTOR (PAGES)
|
||
.GLOBAL SLENGC ; LENGTH OF MARK/SWEEP GARBAGE COLLECTOR
|
||
.GLOBAL MRKPDL ; STARTING LOCATION OF MARK PDL (WORDS)
|
||
.GLOBAL STRBUF ; START OF BUFFER LOCATIONS (WORDS)
|
||
.GLOBAL SWAPGC ; WHICH GARBAGE COLLECTOR TO LOAD
|
||
|
||
.GLOBAL MARK2G ; GENERAL MARKING ROUTINE FOR TEMPLATE STUFF
|
||
.GLOBAL MARK2A,MARK2S ; SPECIFIC MARKERS IN SGC/AGC
|
||
.GLOBAL SECLEN ; LENGTH OF SECTION GC GUY
|
||
.GLOBAL MULTSG
|
||
.GLOBAL SECBLK,DECBLK,GCDEBU,DEBUGC,NDEBUG
|
||
.GLOBAL FRETOP,PURBOT,PURTOP,GCPDL,LPUR,STRPAG,CKPUR,INPLOD,GETPAG,CURPLN,SGCLBK,PGCNT
|
||
.GLOBAL LODGC,CKFILE,SLEEPR,KILGC,GETBUF,KILBUF,GPDLOV,GCDIR,INTDIR,GCLDBK
|
||
.GLOBAL OPBLK,SJFNS,IJFNS,OPSYS,IJFNS1,RBLDM,ILDBLK,TILDBL
|
||
.GLOBAL TMTNXS,C%1
|
||
|
||
IFN ITS,[
|
||
IMAPCH==0 ; INTERNAL MAPPING CHANNEL
|
||
MAPCHN==1000,,IMAPCH ; CORBLK CHANNEL
|
||
FME==1000,,-1 ; BITS FOR CURRENT JOB
|
||
FLS==1000,,0 ; BITS TO FLUSH A PAGE
|
||
RDTP==1000,,200000 ; BITS TO MAP IN IN READ-ONLY
|
||
WRTP==1000,,100000
|
||
CRJB==1000,,400001 ; BITS TO ALLOCATE CORE
|
||
CWRITE==1000,,4000
|
||
]
|
||
IFE ITS,[
|
||
MFORK==400000
|
||
CTREAD==100000 ; READ BIT
|
||
CTEXEC==20000 ; EXECUTE BIT
|
||
CTWRIT==40000 ; WRITE BIT
|
||
CTCW==400 ; COPY ON WRITE
|
||
SGJF==1 ; USE SHORT JFN (LH FLAG)
|
||
OLDF==100000 ; REQUIRE OLD (EXISTING FILE) (LH FLAG)
|
||
FREAD==200000 ; READ BIT FOR OPENF
|
||
FEXEC==40000 ; EXEC BIT FOR OPENF
|
||
FTHAW==2000
|
||
]
|
||
; GENERAL MARK ROUTINE FOR TEMPLATE STUFF. GOES TO RIGHT PLACE IN
|
||
; WHICHEVER GC'ER WE'RE USING AT THE MOMENT
|
||
MARK2G: SKIPN SWAPGC
|
||
JRST MARK2A ; INTO AGC
|
||
JRST MARK2S ; INTO SGC
|
||
|
||
; ROUTINE TO LOAD THE GARBAGE COLLECTOR
|
||
|
||
LODGC:
|
||
IFN ITS,[
|
||
MOVEI 0,GCLDBK
|
||
SKIPE SWAPGC ; SKIP IF SWAPPED GARBAGE COLLECTOR
|
||
MOVEI 0,SGCLBK
|
||
MOVEM 0,OPBLK
|
||
|
||
|
||
.SUSET [.RSNAM,,SAVSNM] ; SAVE OLD SNAME
|
||
.SUSET [.SSNAM,,GCDIR] ; SET SNAME TO APP DIR
|
||
.OPEN IMAPCH,@OPBLK ; OPEN CHANNEL TO FILE
|
||
PUSHJ P,CKFILE ; SEE IF REALLY LOSING
|
||
HRLZI A,-LENGC+3
|
||
SKIPE SWAPGC
|
||
HRLZI A,-SLENGC
|
||
MOVE B,A ; B WILL CONTAIN PTR TO CORE
|
||
HRRI B,PAGEGC
|
||
DOTCAL CORBLK,[[RDTP],[FME],B,[MAPCHN],A]
|
||
PUSHJ P,SLEEPR
|
||
HRLI B,-1
|
||
SKIPN SWAPGC ; IF SWAP 1 PAGE FOR CORBLK ELSE 3
|
||
HRLI B,-3
|
||
GETIT: DOTCAL CORBLK,[[WRTP],[FME],B,[CRJB]]
|
||
PUSHJ P,SLEEPR
|
||
.CLOSE IMAPCH,
|
||
MOVEI A,LENGC ; SMASH PAGECOUNT
|
||
SKIPE SWAPGC
|
||
MOVEI A,SLENGC+1 ; PSTACK
|
||
MOVEM A,PGCNT
|
||
POPJ P,
|
||
|
||
; SEE WHY OPEN FAILED
|
||
|
||
CKFILE: .STATUS IMAPCH,0 ; GET STATUS BITS INTO 0
|
||
HRLZS 0
|
||
ANDI 0,77 ; AND OF EXTRANEOUS BITS
|
||
CAIN 0,4 ; SKIP IF NOT FNF
|
||
FATAL CANT OPEN AGC FILE
|
||
|
||
SLEEPR: MOVEI 0,1 ; SLEEP FOR A WHILE
|
||
.SLEEP
|
||
SOS (P) ; TRY AGAIN
|
||
SOS (P)
|
||
POPJ P, ; BYE
|
||
]
|
||
|
||
IFE ITS,[
|
||
HRRZ A,IJFNS1
|
||
SKIPN MULTSG
|
||
HLRZ A,IJFNS
|
||
SKIPE SWAPGC
|
||
HLRZ A,IJFNS1
|
||
JUMPN A,GOTJFN
|
||
|
||
; HERE TO GET GC JFNS
|
||
; GET STRING NAME OF MDL INTERPRETER FILE
|
||
HRRZ A,IJFNS ; INTERPRETER JFN
|
||
MOVE B,A ; SET UP FOR JFNS
|
||
PUSHJ P,TMTNXS ; MAKES A STRING ON P STACK
|
||
MOVE D,E ; SAVED VALUE OF P STACK
|
||
HRROI A,1(E) ; STRING FOR RESULT
|
||
MOVE C,[211000,,1] ; GET "DEV:<DIR>NM1" FROM JFNS
|
||
JFNS
|
||
MOVE C,A ; SAVE TO REUSE FOR ".SGC"
|
||
; GET JFN TO AGC FILE
|
||
MOVEI B,[ASCIZ /.AGC/]
|
||
SKIPN MULTSG
|
||
JRST .+4
|
||
MOVEI B,[ASCIZ /.DEC/]
|
||
SKIPN GCDEBU
|
||
MOVEI B,[ASCIZ /.SEC/]
|
||
SKIPE SWAPGC
|
||
MOVEI B,[ASCIZ /.SGC/]
|
||
HRLI B,440700
|
||
ILDB B
|
||
IDPB A
|
||
JUMPN .-2 ; COPY ".AGC" INTO STRING
|
||
HRROI B,1(E) ; GTJFN STRING
|
||
MOVSI A,SGJF+OLDF ; GTJFN CONTROL BITSS
|
||
GTJFN
|
||
FATAL AGC GARBAGE COLLECTOR IS MISSING
|
||
SKIPN SWAPGC
|
||
JRST .+3
|
||
HRLM A,IJFNS1
|
||
JRST JFNIN
|
||
SKIPE MULTSG
|
||
HRRM A,IJFNS1
|
||
SKIPN MULTSG
|
||
HRLM A,IJFNS
|
||
JFNIN: MOVE B,[440000,,FREAD+FEXEC]
|
||
OPENF
|
||
FATAL CANT OPEN AGC FILE
|
||
MOVE P,E
|
||
GOTJFN:
|
||
MOVEI D,SECLEN+SECLEN-2
|
||
SKIPN MULTSG
|
||
MOVEI D,LENGC+LENGC-6 ; # OF TENEX PAGES TO GET IT
|
||
SKIPE SWAPGC
|
||
MOVEI D,SLENGC+SLENGC
|
||
MOVSI A,(A) ; JFN TO LH
|
||
MOVE B,[MFORK,,PAGEGC+PAGEGC]
|
||
MOVSI C,CTREAD+CTEXEC
|
||
|
||
LDLP: PMAP
|
||
ADDI A,1
|
||
ADDI B,1
|
||
SOJG D,LDLP
|
||
|
||
MOVEI C,0
|
||
MOVEI D,6 ; THESE PAGES WILL BE THE GC PDL
|
||
SKIPN MULTSG
|
||
SKIPE SWAPGC
|
||
MOVEI D,2 ; PDL BUT NO FRONT OR WINDOW
|
||
MOVNI A,1
|
||
|
||
LDLP1: PMAP
|
||
ADDI B,1
|
||
SOJG D,LDLP1
|
||
|
||
MOVEI A,SECLEN+1
|
||
SKIPN MULTSG
|
||
MOVEI A,LENGC ; SMASH PAGECOUNT
|
||
SKIPE SWAPGC
|
||
MOVEI A,SLENGC+1
|
||
MOVEM A,PGCNT
|
||
POPJ P,
|
||
|
||
;ROUTINE TO "SLEEP" FOR A WHILE ON 10X/20X HA HA
|
||
SLEEPR: SOS (P)
|
||
POPJ P,
|
||
]
|
||
|
||
; ROUTINE TO LOAD THE INTERPRETER
|
||
; C=>LENGTH OF PAGES
|
||
; D=>START OF PAGES
|
||
|
||
LODINT:
|
||
IFN ITS,[
|
||
.SUSET [.RSNAME,,SAVSNM]
|
||
LODIN1: .IOPUS IMAPCH,
|
||
.SUSET [.SSNAM,,INTDIR]
|
||
.OPEN IMAPCH,ILDBLK ; OPEN FILE TO INTERPRETER BLOCK
|
||
PUSHJ P,CKFILE
|
||
HLRE B,TP ; MAKE SURE BIG ENOUGJ
|
||
MOVNS B ; SEE IF WE WIN
|
||
CAIGE B,400 ; SKIP IF WINNING
|
||
FATAL NO ROOM FOR PAGE MAP
|
||
MOVSI A,-400
|
||
HRRI A,1(TP)
|
||
.ACCES IMAPCH,C%1
|
||
.IOT IMAPCH,A ; GET IN PAGE MAP
|
||
MOVEI A,1 ; INITIALIZE FILE PAGE COUNT
|
||
MOVEI B,0 ; CORE PAGE COUNT
|
||
MOVEI E,1(TP)
|
||
LOPFND: HRRZ 0,(E)
|
||
JUMPE 0,NOPAG ; IF 0 FORGET IT
|
||
ADDI A,1 ; AOS FILE MAP
|
||
NOPAG: ADDI B,1 ; AOS PAGE MAP
|
||
CAIE B,(D) ; SKIP IF DONE
|
||
AOJA E,LOPFND
|
||
MOVNI 0,(C) ; GET PAGE-COUNT
|
||
HRL A,0 ; BUILD FILE PAGE POINTER
|
||
HRL B,0 ; BUILD CORE PAGE POINTER
|
||
DOTCAL CORBLK,[[RDTP],[FME],B,[MAPCHN],A]
|
||
PUSHJ P,SLEEPR ; GO TO SLEEP FOR A WHILE
|
||
.CLOSE IMAPCH,
|
||
.IOPOP IMAPCH,
|
||
.SUSET [.SSNAM,,SAVSNM]
|
||
POPJ P, ; DONE
|
||
]
|
||
IFE ITS,[
|
||
HRRZ E,IJFNS
|
||
MOVEI A,(E) ; FIND OUT LENGTH OF MAP
|
||
MOVEI B,0
|
||
SFPTR
|
||
FATAL CANNOT RESET FILE POINTER
|
||
MOVEI A,(E)
|
||
BIN ; GET LENGTH WORD
|
||
MOVEI A,(B) ; ISOLATE SIZE OF MAP
|
||
HLRZ 0,B
|
||
HLRE B,TP ; MUST BE SPACE FOR CRUFT
|
||
MOVNS B
|
||
CAIGE B,(A) ; ROOM?
|
||
FATAL NO ROOM FOR PAGE MAP (GULP)
|
||
PUSH P,C ; SAVE # PAGES WANTED
|
||
MOVN C,A
|
||
MOVEI A,(E) ; READY TO READ IN MAP
|
||
MOVEI B,1(TP) ; ONTO TP STACK
|
||
HRLI B,444400
|
||
SIN ; SNARF IT IN
|
||
|
||
MOVEI A,1(TP)
|
||
CAIE 0,1000 ; CHECK FOR TENEX
|
||
JRST TOPS20
|
||
LDB 0,[221100,,(A)] ; GET FORK PAGE
|
||
CAIE 0,(D) ; GOT IT?
|
||
AOJA A,.-2
|
||
HRRZ A,(A)
|
||
JRST GOTPG
|
||
|
||
TOPS21: ADDI A,2
|
||
TOPS20: HRRZ 0,1(A) ; GET PAGE IN PROCESS
|
||
LDB B,[331100,,1(A)] ; GET REPT COUNT
|
||
ADD B,0 ; LAST PAGE IN BLOCK
|
||
CAIG 0,(D)
|
||
CAIGE B,(D) ; WITHIN RANGE?
|
||
JRST TOPS21
|
||
SUBM D,0
|
||
HRRZ A,(A)
|
||
ADD A,0
|
||
|
||
GOTPG: HRLI A,(E)
|
||
MOVEI B,(D)
|
||
HRLI B,MFORK
|
||
MOVSI C,CTREAD+CTEXEC ; BITS
|
||
POP P,D ; PAGES
|
||
ASH D,1 ; FOR TENEX
|
||
|
||
MPLP: PMAP
|
||
ADDI A,1
|
||
ADDI B,1
|
||
SOJG D,MPLP ; MAP-EM IN
|
||
|
||
POPJ P,
|
||
]
|
||
|
||
; ROUTINE TO MAP IN OVER GARBAGE COLLECTOR EXPLICITLY
|
||
|
||
KILGC:
|
||
IFN ITS,[
|
||
MOVEI D,PAGEGC
|
||
MOVE C,PGCNT
|
||
JRST LODIN1
|
||
]
|
||
IFE ITS,[
|
||
MOVEI D,PAGEGC+PAGEGC
|
||
MOVE C,PGCNT
|
||
JRST LODINT
|
||
]
|
||
|
||
; ROUTINE TO TRY TO ALLOCATE A BUFFER
|
||
; 1) IT FIRSTS LOOKS BETWEEN FRETOP AND PURBOT
|
||
; 2) LOOKS AT THE INTERPRETER
|
||
; A=>NUMBER OF BUFFER PAGES (CURRENTLY ALWAYS 1)
|
||
; B=>BUFFER
|
||
; BUFFER SAVED IN BUFPTR
|
||
|
||
GETBUF: ASH A,10. ; CONVERT TO WORDS
|
||
MOVE B,PURBOT ; LOOK FOR ROOM IN GCS
|
||
SUB B,FRETOP
|
||
CAMGE B,A ; SKIP IF WINNING
|
||
JRST NOBUF1
|
||
MOVE B,FRETOP ; BUFFER IN B
|
||
MOVEM B,BUFPTR ; SAVE BUFFER
|
||
ASH A,-10. ; TO PAGES
|
||
MOVEM A,BUFLT ; LENGTH OF BUFFER
|
||
POPJ P,
|
||
NOBUF1: ASH A,-10. ; BACK TO WORDS
|
||
SKIPE INPLOD ; SKIP IF NOT IN MAPPUR
|
||
JRST INTBUF
|
||
PUSH P,A
|
||
PUSH P,E
|
||
JSP E,CKPUR
|
||
POP P,E
|
||
POP P,A
|
||
MOVE B,PURTOP
|
||
SUB B,PURBOT
|
||
SUB B,CURPLN
|
||
ASH B,-10. ; CALCULATE AVAILABLE ROOM
|
||
CAIGE B,(A) ; SEE IF ENOUGH
|
||
JRST INTBUF ; LOSE LOSE GET BUFFER FROM INTERPRETER
|
||
IFE ITS, ASH A,1 ; TENEX PAGES
|
||
PUSH P,C
|
||
PUSH P,D
|
||
PUSH P,E
|
||
PUSHJ P,GETPAG ; GET THOSE PAGES
|
||
FATAL GETPAG FAILED
|
||
POP P,E
|
||
POP P,D
|
||
POP P,C
|
||
IFE ITS, ASH A,-1
|
||
JRST GETBUF ; TRY AGAIN
|
||
INTBUF: MOVEM A,BUFLT
|
||
IFN ITS,[
|
||
MOVNS A ; NEGATE
|
||
HRLZS A ; SWAP
|
||
HRRI A,STRPAG ; AOBJN TO PAGE
|
||
MOVE B,A
|
||
DOTCAL CORBLK,[[FLS],[FME],A]
|
||
FATAL CANT FLUSH PAGE
|
||
DOTCAL CORBLK,[[WRTP],[FME],B,[CRJB]]
|
||
PUSHJ P,SLEEPR
|
||
]
|
||
|
||
IFE ITS,[
|
||
PUSH P,C
|
||
MOVEI C,(A) ; PAGES TO FLUSH
|
||
ASH C,1
|
||
MOVNI A,1 ; FLUSH PAGES
|
||
MOVE B,[MFORK,,STRPAG+STRPAG] ; WHICH ONES
|
||
FLSLP: PMAP
|
||
ADDI B,1
|
||
SOJG C,FLSLP
|
||
POP P,C
|
||
]
|
||
MOVEI B,STRBUF ; START OF BUFFER
|
||
MOVEM B,BUFPTR ; SAVE IN BUFPTR
|
||
PUSHJ P,RBLDM
|
||
POPJ P,
|
||
|
||
; ROUTINE TO FLUSH A BUFFER WHEN DONE WITH IT
|
||
|
||
KILBUF: SKIPN B,BUFPTR ; SEE IF BUFPTR EXISTS
|
||
POPJ P,
|
||
IFE ITS, JRST @[.+1] ; RUN IN SECTION 0
|
||
CAIL B,HIBOT ; SKIP IF NOT PART OF INTERPRETER
|
||
JRST HIBUF ; INTERPRETER
|
||
IFN ITS,[
|
||
ASH B,-10.
|
||
MOVN A,BUFLT ; GET LENGTH
|
||
HRLI B,(A) ; BUILD PAGE AOBJN
|
||
DOTCAL CORBLK,[[FLS],[FME],B]
|
||
FATAL CANT FLUSH PAGES
|
||
]
|
||
IFE ITS,[
|
||
ASH B,-9. ; TO PAGES
|
||
HRLI B,MFORK
|
||
MOVNI A,1
|
||
MOVE D,BUFLT
|
||
LSH D,1 ; TO TENEX PAGES
|
||
PUSH P,C ; SAVE C
|
||
MOVEI C,0 ; C CONTAINS SOME FLAGS
|
||
|
||
FLSLP1: PMAP
|
||
ADDI B,1
|
||
SOJG D,FLSLP1
|
||
|
||
POP P,C ; RESTORE C
|
||
]
|
||
|
||
FLEXIT: SETZM BUFPTR
|
||
SETZM BUFLT
|
||
IFE ITS,[
|
||
PUSH P,A
|
||
HLRZ A,SJFNS
|
||
JUMPE A,.+3
|
||
CLOSF
|
||
JFCL
|
||
SETZM SJFNS
|
||
POP P,A
|
||
SKIPN MULTSG
|
||
POPJ P,
|
||
POP P,21
|
||
SETZM 20
|
||
XJRST 20
|
||
]
|
||
IFN ITS,[
|
||
POPJ P,
|
||
]
|
||
HIBUF: MOVE C,BUFLT
|
||
MOVE D,BUFPTR
|
||
IFN ITS, ASH D,-10.
|
||
IFE ITS, ASH D,-9.
|
||
PUSHJ P,LODINT
|
||
JRST FLEXIT
|
||
|
||
; HERE TO HANDLE GC PDL OVERFLOW. ROUTINE USES A,B AND ASSUMES GCPDL IS THE PDL
|
||
|
||
GPDLOV: HRRZ A,PGCNT ; # OF PAGES TO A
|
||
ADDI A,PAGEGC ; SEE IF ROOM
|
||
ASH A,10. ; TO WORDS
|
||
CAIL A,LPUR ; HAVE WE LOST
|
||
FATAL NO ROOM FOR GCPDL
|
||
IFN ITS,[
|
||
ASH A,-10. ; GET PAGE NUMBER
|
||
AOS PGCNT ; AOS
|
||
DOTCAL CORBLK,[[FLS],[FME],A]
|
||
FATAL CANT FLUSH PAGE
|
||
DOTCAL CORBLK,[[WRTP],[FME],A,[CRJB]]
|
||
PUSHJ P,SLEEPR
|
||
]
|
||
IFE ITS,[
|
||
ASH A,-9.
|
||
AOS PGCNT
|
||
MOVE B,A
|
||
MOVNI A,1
|
||
HRLI B,MFORK
|
||
PUSH P,C ; BETTER HAVE A PDL HERE
|
||
MOVEI C,0
|
||
PMAP
|
||
ADDI B,1
|
||
PMAP
|
||
POP P,C
|
||
|
||
]
|
||
HRRI A,-2000 ; SMASH PDL
|
||
HRLM A,GCPDL
|
||
POPJ P, ; EXIT
|
||
|
||
IFN ITS,[
|
||
|
||
|
||
GCDIR: SIXBIT /MUDSAV/
|
||
INTDIR: SIXBIT /MUDSAV/
|
||
GCLDBK: SIXBIT / &DSK/
|
||
SIXBIT /AGC/
|
||
0 ; FILLED IN BY INITM
|
||
|
||
SGCLBK: SIXBIT / &DSK/
|
||
SIXBIT /SGC/
|
||
0
|
||
|
||
ILDBLK: SIXBIT / &DSK/
|
||
SIXBIT /TS/
|
||
0 ; FILLED IN BY INITM
|
||
]
|
||
|
||
|
||
IFE ITS,[
|
||
NDEBUG: SETZM GCDEBU
|
||
CAIA
|
||
DEBUGC: SETOM GCDEBU
|
||
HRRZ A,IJFNS1 ; GET GC JFN
|
||
SKIPE A
|
||
CLOSF
|
||
JFCL
|
||
POPJ P,
|
||
]
|
||
|
||
IMPURE
|
||
GCDEBU: 0
|
||
BUFPTR: 0 ; POINTER TO CURRENTLY ACTIVE BUFFER (WORD)
|
||
BUFLT: 0 ; LENGTH OF CURRENTLY ACTIVE BUFFER (PAGES)
|
||
PGCNT: 0 ; # OF PAGES OF MAPPED OUT INTERPRETER
|
||
SAVSNM: 0
|
||
OPBLK: 0 ; BLOCK USED FOR OPEN
|
||
|
||
PURE
|
||
|
||
END
|
||
|