Google
 

Trailing-Edge - PDP-10 Archives - tops10_703a_sys_ap115_bb-ju01b-bb - lnkini.x14
There are 4 other files named lnkini.x14 in the archive. Click here to see a list.
TITLE LINK 10/20 - INITIALIZATION MODULE
SUBTTL	D.M.NIXON/DMN/RKH/SRM/JBC/JNG/DZN/PY/PAH/HD	28-May-86



;COPYRIGHT (c) DIGITAL EQUIPMENT CORPORATION 1973,1986. ALL RIGHTS RESERVED.
;[2403]
;
;THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY BE USED AND COPIED
;ONLY  IN  ACCORDANCE  WITH  THE  TERMS  OF  SUCH LICENSE AND WITH THE
;INCLUSION OF THE ABOVE COPYRIGHT NOTICE.  THIS SOFTWARE OR ANY  OTHER
;COPIES THEREOF MAY NOT BE PROVIDED OR OTHERWISE MADE AVAILABLE TO ANY
;OTHER PERSON.  NO TITLE TO AND OWNERSHIP OF THE  SOFTWARE  IS  HEREBY
;TRANSFERRED.
;
;
;THE INFORMATION IN THIS SOFTWARE IS SUBJECT TO CHANGE WITHOUT  NOTICE
;AND  SHOULD  NOT  BE  CONSTRUED  AS A COMMITMENT BY DIGITAL EQUIPMENT
;CORPORATION.
;
;DIGITAL ASSUMES NO RESPONSIBILITY FOR THE USE OR RELIABILITY  OF  ITS
;SOFTWARE ON EQUIPMENT WHICH IS NOT SUPPLIED BY DIGITAL.



SEARCH	LNKPAR,LNKLOW,OVRPAR,MACTEN,UUOSYM,SCNMAC
IFN TOPS20,< SEARCH MONSYM >	;[1407]
SALL

ENTRY	LINK
EXTERN	LNKSCN,LNKCOR,LNKLOG,.TYOCH


CUSTVR==0		;CUSTOMER VERSION
DECVER==6		;DEC VERSION
DECMVR==0		;DEC MINOR VERSION
DECEVR==2403		;DEC EDIT VERSION

VERSION


SEGMENT

	LOC	.JB41
	JSR	UUOTRAP
	RELOC

	.JBHSA==:0		;STARTING ADDRESS STORED IN HIGH SEGMENT
	.JB41==:41

;ACCUMULATORS

R==R1		;MUST MATCH LNKLOD DEFINITION
SUBTTL	REVISION HISTORY


;START OF VERSION 1A
;41	ADD PHYSICAL ONLY GETSEG
;45	HASH INITIAL SYMBOLS AT ASSEMBLY TIME
;46	ADD KLUDGE FEATURE
;64	HANDLE RUN LINK ALL OF CORE PROBLEM
;65	TENEX SPEEDUP
;71	MAKE ALL MESSAGE STANDARD FORM
;106	REMOVE HIORG & ONESEG
;107	CHANGE KLUDGE TO MIXFOR

;START OF VERSION 2
;135	ADD OVERLAY FACILITY
;145	IMPLEMENT USER LIBRARIES
;157	(12640) MAKE VALUE OF FORLIB BE -2 IF .FORLB =-1
;161	ADD LANGUAGE DEPENDENCY TO /USERLIB
;202	REMOVE CORE UUO BEFORE GETSEG

;START OF VERSION 2B
;225	ADD SUPPORT FOR PSECT (MACRO VERSION 51)
;230	ADD CHECK THAT LOW SEG DATA BASE IS SAME SIZE IN ALL SEGMENTS
;302	HANDLE TENEX IDDT CORRECTLY
;333	Add code to handle sucessful GETTAB return of zero
;346	INCLUDE EDIT 302 IN MAINTENANCE SOURCES.  LABEL EDIT 230.
;353	REMOVE EDIT 225

;START OF VERSION 2C
;444	Don't lose libraries defined with the USELIB macro.
;530	Define triplet flags correctly and use TXxx macros.
;557	Clean up listing for release.

;START OF VERSION 3A
;560	Release on both TOPS-10 and TOPS-20 as LINK version 3A(560)

;START OF VERSION 4
;600	Put phased lowseg code at PHAZLO; start DY area at .JBFF
;604	Support device NUL: correctly
;607	Reserve page 377 on TOPS-20 for HELPER so /HELP will work
;635	Initialize ARSIZE to .ARS.
;636	Make TTYIT and LOGIT preserve T1.
;650	Use VM on TOPS-10 if available.
;674	GETSEG other segments correctly if LINK is run from an SFD.
;677	Don't set /SYMSEG:LOW by default if loading overlays.
;706	Setup RC.NTB
;727	Set defualt symbol limt to .SYLIM
;731	SEARCH MACTEN,UUOSYM instead of C.
;732	Initialize lowest location to 400000,,0.
;750	Initialize LC.AB to LC.LB+.IWM
;765	Release on both TOPS-10 and TOPS-20 as LINK version 4(765)
;START OF VERSION 4A
;1120	Initialize OKCPUS to all known CPUs.
;1124	Make TTYIT return to a potentially execute-only high segment again.
;1126	Use ACs for GETSEG args if all 7.01 GETTABs are not available.
;1132	Initialize .LOW.'s RC.AT and RC.HL.
;1150	Call proper LNKFIO routines if a log file is opened at start-up time.
;1151	Add .JBEDV.
;1172	Don't initialize SYMLIM.
;1174	Label and clean up all error messages.
;1217	Clean up the listings for release.
;1220	Release on both TOPS-10 and TOPS-20 as version 4A(1220).

;START OF VERSION 4B
;1254	Update MAKLIB internal macro
;1300	Add code to initialize RC.LM in .ABS. and .LOW.
;1301	Do GETTAB to determine initial verbosity.
;1304	Initialize RC.MAP
;1315	Use bits for compiler type in MAKLIB definition.

;START OF VERSION 5
; Maintanence edits 1221-1377
;1400	Use OVRPAR.MAC.
;1407	Streamline initialization code on Tops20.
;1436	Use connected directory, not logged in directory PPN on TOPS-20.

;START OF VERSION 5.1
;1500-1677 Reserved for maintenance.
;1546	Use bit not compiler code at SETUSE+17.
;1736	Strip unsupported FMXFOR code.
;1744	supress loading attempt if compilation errors occurred during
;	EXECUTE command.
;2026	Update copyright and cleanup listings.
;2050	Make question mark in loading suppressed message be in column 1.
;2070	Check only right half of .JBERR - Conditionalize .SGNAM
;2075	Eliminate .SGNAM, .SGPPN, .SGDEV and add fatal error if GETTAB fails.

;Start of version 6
;2207	Initialize RC.MAP with internal psect indices 0 and 1.
;2247	Create an inferior fork.
;2254	Use new format of segment table if fake JOBDAT title.
;2300	Remove F40 and FTFORK code.
;2306	Get TOPS-20 format date and time for PDV.
;2337	Trap CFORK% JSYS errors.
;2403	New copywrite statement.
SUBTTL	INITIALIZE


;HERE AFTER START,  RUN, EXECUTE, LOAD OR RUN UUO

LINK:	PORTAL	.+2		;EXECUTE ONLY
	PORTAL	.+2		;CCL
	TDZA	P1,P1		;CLEAR OFFSET
	MOVEI	P1,1		;SET OFFSET
	RESET			;RESET ANY EXTERNAL I/O
	JUMPE	P1,F1		;[1744] IF NOT CCL SKIP COMP ERROR 
				;CHECK AND DON'T OUPUT MESSAGE
	HRRZ	T1,.JBERR	;[2070] get any compilation errors
	JUMPG	T1,LOASUP	;[2070] go suppress loading if any errors
	OUTSTR	CCLMES		;TELL THE WORLD WHO IS NOW RUNNING
F1:	MOVEI	T2,EZCOR+AD.FRC	;WE NEED AT LEAST THIS MUCH CORE
	CAMG	T2,.JBREL	;SEE IF WE HAVE IT
	JRST	.+3		;YES
	CORE	T2,		;NO, BUT GET IT
	  JRST	E$$IMI		;[1174] YOU LOSE
	MOVEM	P1,OFFSET	;SAFE TO STORE OFFSET NOW
	MSTIME	T1,		;GET INITIAL TIME (MORE OR LESS)
	MOVEM	T1,TIMEON	;SAVE FOR LOG FILE
IFN TOPS20,<			;[2306]
	GTAD%			;[2306] GET TOPS-20 FORMAT DATE AND TIME
	MOVEM	T1,DATIME	;[2306] SAVE IT
>;[2306] IFN TOPS20
	MOVE	T1,[ZCOR,,ZCOR+1]
	SETZB	FL,ZCOR		;CLEAR FLAGS AND CORE
	BLT	T1,EZCOR
;DO NOT CLEAR REST OF CORE SINCE MONITOR WILL DO IT
;ON FIRST TIME, AND RESTART LOGIC ON SUBSEQUENT TIMES
;THIS IS ESPECIALLY IMPORTANT IN V/M IF RUNNING IN LARGE LOW SEG
	MOVE	P,[IOWD LN.EPD,EPDP+1]	;ESTABLISH PUSH-DOWN LIST
	MOVEM	P,EPDP		;FOR EMMERGENCY WORK
	SKIPN	OFFSET		;IF NOT CCL MODE
	SETZM	.JBERR		;CLEAR COMPILER ERRORS
IFE FTSINGLE,<
	MOVSI	T1,HICODE	;NOW FOR PHASED CODE
	HRRI	T1,PHAZLO	;INTO DYNAMIC AREA
	BLT	T1,HIEND	;FOR GETSEGS ETC
	MOVEI	T1,SEGCOD	;ADDRESS OF GETSEG ROUTINE
	MOVEM	T1,NXTSEG	;WHERE OTHER SEGMENTS CAN USE IT
	MOVEI	T1,PRVSEG	;SAME BUT FOR LAST SEGMENT
	MOVEM	T1,LSTSEG

;NOW TRY TO GET WHERE WE CAME FROM (INCLUDING SFD'S) VIA GETTAB.
;IF UNAVAILABLE (OLD MONITOR), USE INFO SET UP ABOVE.

	MOVSI	T1,-<.PTMAX-.PTSFD-1>	;NUMBER OF SFD'S
	HRROI	T2,.GTRS0	;GETTAB FOR RUN FROM SFD, THIS JOB
SFDLUP:	MOVE	T3,T2		;[1126] SET UP FOR NEXT SFD
	GETTAB	T3,		;GET IT
	  JRST	NOSFD		;[1126] GETTAB FAILED, SEE WHY
	MOVEM	T3,SEGPTH+.PTSFD(T1)	;STORE THIS SFD
	ADDI	T2,1		;INCREMENT GETTAB ARG
	AOBJN	T1,SFDLUP	;[1126] LOOP FOR ALL SFD'S
	JRST	GETUFD		;[1126] GOT ALL SFDS, NOW FOR UFD


;HERE WHEN A GETTAB TO GET AN SFD FAILED.  SEE IF THE MONITOR IS TOO OLD.

NOSFD:	TRNE	T1,-1		;[1126] FAIL FIRST TIME?
	JRST	GETUFD		;[1126] NO, GOT SOME SFDS, USE NEW DATA
	MOVEI	T1,<<GETSEG T1,>&RH.ALF>;[1126] USE DATA ABOVE
	HRRM	T1,NGTSEG	;[1126] BUT NEED TO REPLACE GETSEGS
	HRRM	T1,EGTSEG	;[1126] TO REPLACE PHYSICAL ONLY BIT
	JRST	GETHSO		;[1126] GETSEG INFO DONE, PROCEED
;HERE IF THE 7.01 GETTABS WORK.  FILL IN THE REST OF THE DATA.

GETUFD:	SETZM	SEGPTH+.PTSFD(T1)	;FORCE A ZERO AFTER THE LAST SFD
	HRROI	T1,.GTRDI	;UFD OF PATH WE WERE RUN FROM
	GETTAB	T1,		;GET IT
	  JRST	E$$GTF		;[2075] CAN'T
	SKIPN	T1		;THERE?
	JRST	GETHSO		;NO, GIVE UP
	MOVEM	T1,SEGPTH+.PTPPN	;STORE UFD TO FINISH PATH BLOCK
	HRROI	T1,.GTRDV	;GET DEVICE WE WERE RUN FROM
	GETTAB	T1,		; . . .
	  JRST	E$$GTF		;[2075] CAN'T
	SKIPN	T1		;AVAILABLE?
	  JRST	E$$GTF		;[2075] NEED A DEVICE
	MOVEM	T1,SEGBLK	;YES, STORE DEVICE
	MOVEM	T1,ERRBLK	;FOR LNK999 ALSO
	HRROI	T1,.GTRFN	;[1126] THE FILE NAME WE CAME FROM
	GETTAB	T1,		;[1126] GET IT
	  JRST	E$$GTF		;[2075] CAN'T
	SKIPN	T1		;[1126] RETURN ANYTHING?
	  JRST	E$$GTF		;[2075] CAN'T
	MOVEM	T1,FSTSEG	;[1126] OK, STORE IT
	MOVEM	T1,SEGBLK+1	;[1126] FOR GETSEGS TOO
	MOVEI	T1,SEGPTH	;NOW POINT GETSEG BLOCKS TO PATH BLOCK
	MOVEM	T1,SEGBLK+4	;NORMAL GETSEG BLOCK
	MOVEM	T1,ERRBLK+4	;AND LNK999'S COPY
>;END OF IFE FTSINGLE

GETHSO:
IFE TOPS20,<
	MOVE	T1,[-2,,.GTUPM]	;[650] ORIGIN OF HIGH SEG
	GETTAB	T1,		;GET START OF HIGH SEGMENT
	  MOVSI	T1,%HISEG	;ASSUME USER KNOWS WHERE IT STARTS
	SKIPN	T1		;RETURNS ZERO IF NOT IMPLEMENTED
	MOVSI	T1,%HISEG	;USE ASSEMBLY VALUE
	HLRZ	T1,T1
	ANDCMI	T1,777		;ONLY ON A FULL PAGE
	HRRZM	T1,HIORGN	;[650] SAVE HISEG ORIGIN FOR EVERYBODY
> ;[1407] IFE TOPS20
IFN TOPS20,<
	MOVEI	T1,%HISEG	;[1407] PICK UP HISEG ORIGIN
	MOVEM	T1,HIORGN	;[1407] SAVE FOR EVERYBODY
> ;[1407] IFN TOPS20
IFE FTSINGLE,<
	ADDI	T1,.JBHDA##	;ADD OFFSET NOW
	HRRZM	T1,SEGPGN	;SAVE PAGE NUMBER
> ;END OF IFE FTSINGLE
	MOVE	T1,[JRST UUOHANDLER]
	MOVEM	T1,UUOTRAP+1	;FIELD UUOS
IFN FTVM,<
	SETOM	USEVM		;[650] ASSUME VM AVAILABLE
	MOVSI	T1,.PAGCA	;[650] CHECK ACCESS OF PAGE 0
	PAGE.	T1,		;[650] TO SEE IF PAGE. UUO'S WORK
	  SETZM	USEVM		;[650] NOPE, VM NOT AVAILABLE
	MOVEI	T1,.PAGEM	;[650] PAGE. UUO FUNCTION
	MOVEM	T1,PAGFUN	;[650] STORE FOR MONITOR
> ;END IFN FTVM
IFE TOPS20,<
	MOVE	T1,[PTHLEN-1,,PTHARG]
	SETOM	PTHARG		;-1 MEANS RETURN DEFAULT PATH
	PATH.	T1,		;GET DEFAULT PATH
	  SETZM	PTHARG		;IF ERROR, CLEAR ARGUMENT
	GETPPN	T1,		;DETERMINE THIS JOB'S PPN
	  JFCL			;(IN CASE OF JACCT)
	MOVEM	T1,MYPPN	;SAVE FOR THE FUTURE
	SKIPN	PTHDIR		;SEE IF PATH. UUO WORKED
	MOVEM	T1,PTHDIR	;NO, SIMULATE IT
> ;[1407] IFE TOPS20
IFN TOPS20,<
	SETOM	T1		;[1407] TELL US ABOUT OURSELVES
	MOVE	T2,[ XWD -21,.TEMP ]
				;[1407] PUT DETAILS IN TEMP AREA
	SETZM	T3		;[1511]
	GETJI%			;[1407] DONE
	  JFCL			;[1407] SO WE DON'T EXIST, EH?
	MOVEI	T4,.TEMP	;[1407] BASE OF JOB INFO BLOCK
	MOVE	T1,.JIDNO(T4)	;[1407] [1436] NOW WHO ARE WE?
	STPPN%			;[1407] [1436] MAKE CONNECTED DIRECTORY A PPN
	MOVEM	T2,MYPPN	;[1407] AND REMEMBER IT
	MOVEM	T2,PTHDIR	;[1407] ...
	SKIPE	.JIBAT(T4)	;[1407] RUNNING UNDER BATCH?
	SETOM	BATCH		;[1407] YES
	MOVE	T1,.JIJNO(T4)	;[1407] JOB NUMBER?
	MOVEM	T1,JOBNUM	;[1407] REMEMBER IT.
> ;[1407] IFN TOPS20

IFE TOPS20,<
	MOVNI	T1,1		;STANDARD AOBJN TEST FOR KI-10
	AOBJN	T1,.+1		;TESTS FOR HALF-WORD ADDER
	JUMPN	T1,KSET		;KA-10 IF CARRY
>;END OF IFE TOPS20
	AOS	CPUHST		;KI, KL, TOPS-20 BECOMES 1
IFE TOPS20,<
	MOVE	T1,[115,,.GTCNF]
	GETTAB	T1,		;PAGE SIZE
	  SKIPA	T1,[%CNVER]	;FAILED, USE GETTAB FOR MONITOR VERSION
	SOJA	T1,GSET		;GET MASK FOR PAGE SIZE
	GETTAB	T1,
	  SETZ	T1,		;NOT 5.06 FOR SURE
	HRRZ	T1,T1		;ONLY WANT DEC HALF
	CAIGE	T1,50511	;TEST FOR 5.06 OR LATER
	JRST	KSET		;NO, USES 1K BOUNDS
PSET:	SKIPA	T1,[777]	;AND STORE SIZE
KSET:	MOVEI	T1,1777		;KA-10 PAGE SIZE
GSET:	MOVEM	T1,.PGSIZ	;USED TO MAKE SAVE FILES ETC
>;END OF IFE TOPS20
;HERE WHEN PAGE SIZE KNOWN. DO OTHER MISC. SETUP

IFE TOPS20,<
	HRROI	T1,.GTLIM	;JOB'S TIME LIMIT AND BATCH STATUS
	GETTAB	T1,
	  JRST	.+3		;CANNOT BE BATCH JOB
	TXNE	T1,JB.LBT	;TEST FOR BATCH CONTROL
	SETOM	BATCH		;YES, IT IS
	PJOB	T1,		;GET JOB NUMBER
	HRRZM	T1,JOBNUM	;SAVE IN RIGHT HALF
> ;[1407] IFE TOPS20
IFN TOPS20,<
	MOVE	T1,JOBNUM	;[1407] JOBNUM ALREADY HAS JOB NUMBER
> ;[1407] IFN TOPS20
	MOVEI	T4,3		;PICK UP 3 CHARS
PJLOOP:	IDIVI	T1,^D10		;ONE AT A TIME
	ADDI	T2,'0'		;MAKE SIXBIT
	LSHC	T2,-6		;SAVE CHAR
	SOJG	T4,PJLOOP
	HLLM	T3,JOBNUM	;SAVE SIXBIT FOR TMP FILES
	MOVSI	T1,'DSK'	;SET UP GLOBAL DEFAULTS
	MOVEM	T1,G.DEV	;INITIAL SETTINGS
	HRLOI	T1,'REL'
	MOVEM	T1,G.EXT
	MOVEI	T3,AD.FRC	;DEFAULT VALUE
	MOVEM	T3,FRECOR	;OF SPACE TO BE LEFT IN TABLES
	MOVE	T1,HIORGN	;MAKE SURE WE NEVER EXPAND INTO HISEG
	SUBI	T1,1001		;[607] RESERVE A PAGE FOR HELPER
	MOVEM	T1,MAXCOR	; IF USER DOES NOT SET A VALUE
IFN TOPS20,<
	CORE	T1,		;GET ALL CORE IN LOW SEGMENT
	  JRST	E$$IMI		;[1174] SHOULD NEVER HAPPEN
>
IFE TOPS20,<
	SUBI	T3,3		;INCASE IT IS EXACTLY A BOUND
	IDIVI	T3,4		;NUMBER OF TABLES SETUP INITIALLY
	ADDI	T3,.IPM		;MAKE INTO BLOCK BOUND
	ANDCMI	T3,.IPM
	MOVE	P2,T3		;SAFER PLACE
	MOVX	T1,.INFIN	;[1172] INITIALIZE LOWEST LOCATION
	MOVEM	T1,LOWLOC	;[732]
>				;[2247]
;HERE TO SETUP RELOCATION TABLES ETC
;THE MAIN TABLE RC.TB CONSISTS OF POINTERS TO INDIVIDUAL CODE BLOCKS
;RC.TB GROWS AS REQUIRED. THE INDIVIDUAL BLOCKS CONTAIN
;RC.SG	SEGMENT NUMBER (INDEX TO SG.TB)
;RC.NM	6-BIT NAME OF R.C.
;RC.IV	INITIAL VALUE OF R.C.
;RC.CV	CURRENT VALUE OF R.C. (THIS IS WHAT IS ADDED TO RELOCATABLE WORD)
;RC.OF	OFFSET TO LOCATION IN CORE RELATIVE TO LC.LB OR HC.LB	;
;RC.HL	HIGHEST LOCATION LOADED INTO (NEXT R.C. AT END)
;RC.LB	WHICH SEGMENT (EITHER LC.LB OR HC.LB ADDRESS)
;RC.WD	POINTER TO START OF CODE WINDOW (LW.S1 OR LW.S2)
;RC.PG	POINTER TO END OF CODE WINDOW (LW.S1 OR LW.S2)
;RC.LM	UPPER LIMIT OF PSECT+1 (FIRST ILLEGAL ADDRESS FOR PSECT LOADING) [1300]

CORINI:	MOVEI	T1,RC.INC-2	;JUST A RANDOM NUMBER
	MOVEM	T1,RC.FRE	;NUMBER OF FREE SLOTS
	MOVEI	T1,1		;FIRST ONE IS SET NOW
	MOVEM	T1,RC.NO
	HRRZ	P1,.JBFF	;GET START OF DYNAMIC AREA
	SETOM	.JBFF		;STOP ANY ONE USING .JBFF UNTIL AUTHORISED
	MOVEI	T1,SG.TB	;MAKE SEG TAB POINT TO TABLES LIKE RC.TB
	HRLI	T1,R
	MOVEM	T1,SG.TB	;SO WE CAN REFERENCE IT THE SAME WAY
	MOVEM	P1,DY.LB	;STORE START OF  DYNAMIC AREA
	HRR	P,P1		;SETUP REAL PUSHDOWN STACK
	HRLI	P,-LN.PDL	;IN DYNAMIC AREA SO WE CAN MOVE IT
	MOVEM	P,PDP		;SAVE SO WE CAN RESET ON I/O ERRORS
	ADDI	P1,LN.PDL+1
	MOVEM	P1,IO.EMG	;USED FOR OPEN/ENTER WHEN CORE FULL
	ADDI	P1,LN.IO	;RESERVE SPACE BEFORE IT'S TOO LATE
	HRLI	P1,R		;PUT (R) IN INDEX FIELD
	MOVEM	P1,RC.MAP	;[1304] SETUP MAP FOR LOCAL PSECT NUMBERS
	ADDI	P1,RC.INC	;[1304] SAME LENGTH AS RC.TB
	MOVEM	P1,RC.NTB	;[706] SETUP PSECT ORDER TABLE
	ADDI	P1,RC.INC	;[706] SAME LENGTH AS RC.TB
	MOVEM	P1,RC.TB	;AND POINT TO TABLE OF POINTERS
	SETZ	R,		;START AT SLOT #0
	HRRZS	P1
	ADDI	P1,RC.INC
	MOVEM	P1,@RC.TB	;POINT TO SLOT #0
	MOVEM	P1,@RC.NTB	;[706] 
	MOVEI	T2,1		;[1132] SET TO LC AREA
	MOVEM	T2,RC.SG(P1)	;[1132]
	MOVEM	T2,@RC.MAP	;[2207] SET UP MAP FOR BLANK PSECT (0)
	MOVEI	T2,.JBDA	;[1132] INIT H?.S0 TO SHOW JOBDAT LOADED
	MOVEM	T2,HC.S0	;[1132] HIGHEST LOCATION NON-ZERO
	MOVEM	T2,HL.S0	;[1132] HIGHEST LOCATION SEEN
	MOVX	T1,<1,,0>	;[1300] END OF MEMORY
	MOVEM	T1,RC.LM(P1)	;[1300]
	MOVE	T2,['.ABS. ']	;NAME OF IT
	MOVEM	T2,RC.NM(P1)
;NOW BUILD .LOW. RELOCATION COUNTER

	ADDI	P1,RC.INC	;NOW FOR SLOT #1 (0')
	ADDI	R,1
	MOVEM	R,@RC.MAP	;[2207]	SET UP MAP FOR .LOW.
	MOVEM	P1,@RC.TB	;POINT TO SLOT #1
	MOVEM	P1,@RC.NTB		;[706]
	MOVEM	P1,@SG.TB	;AND IN SEGMENT TABLE
	MOVEM	R,RC.SG(P1)	;POINT TO SEG #1 (0 UPWARDS)
	MOVE	T2,['.LOW. ']	;NAME OF IT
	MOVEM	T2,RC.NM(P1)
	SETZM	RC.IV(P1)	;INITIAL VALUE OF 0
	MOVEI	T2,.JBDA	;PRESET TO 140
	MOVEM	T2,RC.CV(P1)	;CURRENT VALUE
	MOVEM	T2,RC.HL(P1)	;[1132] ALSO HIGHEST LOADED SO FAR
	MOVX	T2,AT.RP	;[2247] GET THE RELOCATABLE ATTRIBUTE
	MOVEM	T2,RC.AT(P1)	;[2247] SET AS A RELOCATABLE PSECT
	SETZM	RC.OF(P1)	;ZERO RELATIVE TO LC.LB
	MOVX	T2,<1,,0>	;[1300] END OF MEMORY
	MOVEM	T2,RC.LM(P1)	;[1300]
	MOVEI	T2,LC.LB	;POINT TO LOW SEGMENT
	MOVEM	T2,RC.LB(P1)
	MOVEI	T2,LW.S1	;POINTER TO BASE OF CORE WINDOW IN PAGING
	MOVEM	T2,RC.WD(P1)
	MOVEI	T2,UW.S1	;END OF WINDOW (PAGING IF NON-ZERO)
	MOVEM	T2,RC.PG(P1)
	ADDI	P1,RC.INC
	MOVEM	P1,DY.PT	;POINTER TO NEXT FREE LOCATION IN DY
IFE TOPS20,<
	ADDI	P1,1000		;LEAVE SOME BUFFER SPACE
>
	IORI	P1,.IPM		;GET TO A GOOD BREAK
	MOVEM	P1,DY.AB	;ACTUAL TOP IN USE
	MOVE	T2,P1		;CALCULATE FREE SPACE
	SUB	T2,DY.PT	;ABOVE DY.PT
	MOVEM	T2,DY.FR	;AND STORE
IFE TOPS20,<ADDI P1,(P2)	;ALLOCATE FREE SPACE>
IFN TOPS20,<MOVEI P1,LC.ORG-1	;ONE LESS THAN START OF CODE>
	MOVEM	P1,DY.UB	;TOP OF DYNAMIC AREA (FOR NOW)
	ADDI	P1,1		;START OF CORE AREA
;HERE TO SETUP ALL OTHER AREA BOUNDS, POINTERS ETC
	MOVEM	P1,LC.LB
	IORI	P1,.IWM		;[750] ALLOCATE FOR JOBDAT AREA
	MOVEM	P1,LC.AB
IFE TOPS20,<ADDI P1,(P2)	;SOME FREE SPACE>
IFN TOPS20,<MOVEI P1,LS.ORG-1	;ONE LESS THAN START OF SYMBOLS>
	MOVEM	P1,LC.UB
	ADDI	P1,1
	MOVEM	P1,LS.LB	;START OF LOCAL SYMBOL AREA
	ADDI	P1,ENDSYM-LSTBL+1	;NUMBER OF LOCAL SYMBOL LOCATIONS
	MOVEM	P1,LS.PT	;POINTS TO NEXT FREE LOCATION
	IORI	P1,.IPM		;NEXT BLOCK BOUND
	MOVEM	P1,LS.AB
	MOVE	T1,P1
	SUB	T1,LS.PT	;CALCULATE FREE SPACE IN LAST BLOCK
	MOVEM	T1,LS.FR
IFE TOPS20,<ADDI P1,(P2)	;SPACE>
IFN TOPS20,<MOVEI P1,GS.ORG-1	;ONE LESS THAN START OF GLOBAL SYMBOLS>
	MOVEM	P1,LS.UB
	ADDI	P1,1
	MOVEM	P1,GS.LB	;GLOBAL SYMBOL AREA
	ADDI	P1,ENDSYM-GSTBL+1	;END OF SYMBOLS
	MOVSI	T1,(POINT 18,0)	;RELATIVE PTR TO PRIME TABLE
	MOVEM	T1,PRMPTR	;SETUP PRIME NUMBER TABLE PTR
	MOVEI	T2,I.PRM	;INITIAL NUMBER
	MOVEM	T2,HT.PRM	;SET SIZE
	MOVEI	T2,<<I.PRM+.L-1>/.L*.L>	;ALLOCATE SPACE IN MULTIPLES OF .L
					;SO REHASHING DOES NOT WASTE SPACE
	HRLI	P1,P2		;INDEX USED IN TRYSYM COMPARES
	MOVEM	P1,HT.PTR	;STORE POINTER
	ADDI	P1,(T2)		;RESERVE SPACE FOR TABLE
	HRRZS	P1
	MOVEM	P1,GS.PT	;NEXT FREE LOCATION
	IORI	P1,.IPM		;NEXT BLOCK BOUND
	MOVEM	P1,GS.AB	;MARK THIS AS TAKEN
	MOVE	T2,P1
	SUB	T2,GS.PT	;SEE HOWMUCH ACTUALLY FREE
	MOVEM	T2,GS.FR	;SAVE IT
IFE TOPS20,<
	ADDI	P1,(P2)		;SOME FREE SPACE
	MOVEM	P1,GS.UB	;UPPER BOUND FOR NOW
	CAMGE	P1,.JBREL	;SEE IF ENOUGH
	JRST	.+3		;YES
	CORE	P1,		;NO, TRY FOR MORE
	  JRST	E$$IMI		;[1174] YOU LOSE
>;END IFE TOPS20
	HRRZ	P1,.JBREL	;GET TOP OF LOW SEGMENT
	MOVEM	P1,GS.UB	;AS TOP OF GLOBAL SYMBOLS
;NOW TO STORE INITIAL SYMBOLS

	MOVEI	T1,ENDSYM-LSTBL+1	;NUMBER OF LOCAL SYMBOL LOCATIONS
	MOVE	P1,LS.LB	;BASE OF LOCAL SYMBOLS
	MOVEM	T1,LSYM		;REQUIRED UNLESS /NOINITIAL
	MOVEM	T1,(P1)		;STORE IN FIRST WORD (UNUSED)
	HRLI	T1,LSTBL	;FORM BLT POINTER
	HRRI	T1,1(P1)
	BLT	T1,ENDSYM-LSTBL(P1)	;MOVE IN

	MOVEI	T1,<ENDSYM-GSTBL>/.L	;NUMBER OF GLOBAL SYMBOLS
	MOVE	P1,GS.LB	;BASE OF GLOBAL SYMBOLS
	MOVEM	T1,GSYM		;REQUIRED UNLESS /NOINITIAL
	MOVEM	T1,(P1)		;STORE IN FIRST WORD (UNUSED)
	HRLI	T1,GSTBL	;FORM BLT POINTER
	HRRI	T1,1(P1)
	BLT	T1,ENDSYM-GSTBL(P1)	;MOVE IN

	HRLI	T1,HSTBL	;FORM BLT POINTER
	HRRZ	P1,HT.PTR	;BASE OF HASH TABLE
	HRR	T1,P1
	BLT	T1,ENDHSH-HSTBL-1(P1)	;MOVE HASH TABLE
	MOVEI	T1,.HS%		;GET % TO FILL TABLE
	MOVEM	T1,HSFACT
	MOVE	T1,HT.PRM	;GET CURRENT HASH SIZE
	IMULI	T1,.HS%		;SEE HOW MUCH TO FILL
	IDIVI	T1,^D100
	SUB	T1,GSYM		;MINUS INITIAL NO.
	MOVEM	T1,HSPACE	;HASH TABLE FULL ENOUGH AT THIS  POINT
;HERE TO INIT LOG FILE IF POSSIBLE
LOGINI:	MOVEI	T1,TTYIT	;LINE BUFFERING ROUTINE FOR OUTCHRS
	MOVEM	T1,TTYSUB
	PUSHJ	P,.TYOCH##	;INCASE NO LOG FILE
	MOVEI	T1,L%W		;GET TTY ERROR CUTOFF
	MOVEM	T1,ERRLVL	;INCASE NOT SET BY USER
	MOVEI	T1,S%C		;[1174] SET UP DEFAULT SEVERITY
	SKIPE	BATCH		;HOWEVER IN BATCH MODE
	MOVEI	T1,S%B		;U LOSE MUCH SOONER
	MOVEM	T1,SEVLVL
	MOVEI	T1,L%W		;[604] NORMAL LOG FILE CUTOFF
	MOVEM	T1,LOGLVL
	MOVE	T1,[LOGIT,,TTYIT] ;[1174] IN CASE /LOG LATER
	MOVEM	T1,LOWSUB	;[1174] SO WE CAN FIND ROUTINES
	HRROI	T1,.GTWCH	;[1301] GET THE DEFAULT /MESSAGE
	GETTAB	T1,		;[1301] FROM THE MONITOR
	SETZ	T1,		;[1301] NO GETTAB
	LDB	T1,[POINTR T1,JW.WMS] ;[1301] GET THE USEFUL BITS
	SKIPN	T1		;[1301] IS THERE A DEFAULT?
	MOVX	T1,M%P!M%F	;[1301] NO, USE /VERB:MEDIUM
	TXNE	T1,M%C		;[1301] CONTINUATION ASKED FOR?
	TXO	T1,M%F		;[1301] YES, GIVE FIRST TOO
	MOVEM	T1,VERLVL	;[1301] SET THE VERBOSITY LEVEL
	MOVSI	T1,'LOG'	;SEE IF WE ALREADY HAVE A LOG DEVICE
	DEVCHR	T1,		;SKIP IF ASSIGNED
	JUMPE	T1,NOLOG	;NOT YET
	SETZM	LOGLVL		;[604] ASSUME USER WANTS ALL IF ASSIGNED LOG DEVICE
	TXNE	T1,DV.TTA	;YES, BUT IS IT USERS TTY?
	JRST	[SETOM	LOGTTY		;YES, NOT REALLY A LOG DEVICE
		JRST	LOGMSG]	;[1174] GO PRINT START OF LOG MSG
	MOVEI	T2,LN.IO	;SPACE WE NEED
	PUSHJ	P,DY.GET##	; FOR ENTER BLOCK
	MOVEM	T1,IO.PTR+RC	;STORE ADDRESS IN I/O TABLE
	MOVEI	T2,RC		;[1150] SET UP LOG FILE CHANNEL
	MOVEM	T2,IO.CHN	;[1150]   ..
	MOVX	T2,<Z RC,>	;[1150]   AND IN FORM WE CAN IOR INTO UUOS
	MOVEM	T2,I.CHN(T1)	;[1150]   ..
	MOVEI	T2,.IOASC	;ASCII MODE
	MOVEM	T2,I.MOD(T1)
	MOVSI	T2,'LOG'	;DEVICE
	MOVEM	T2,I.DEV(T1)
	MOVEI	T2,RCBUF	;BUFFER HEADER
	MOVSM	T2,I.BUF(T1)	;OUTPUT ONLY
	MOVEI	T2,LN.RIB-1	;EXTENDED ENTER
	MOVEM	T2,I.RIB(T1)
	MOVSI	T2,'LOG'	;EXTENSION
	MOVEM	T2,I.EXT(T1)
	PUSHJ	P,DVNAM.##	;[1150] SET UP DEFAULT FILE NAME
	PUSHJ	P,DVCHK.##	;[1150] MAKE SURE DEVICE CAN HANDLE I/O MODE
	PUSHJ	P,DVOPN.##	;[1150] OPEN THE LOG FILE
	PUSHJ	P,DVENT.##	;[1150] ENTER THE FILE
;HERE WITH LOG FILE OPENED AND ENTERED. ALLOW LINK TO USE IT FOR LOGGING.

	MOVEI	T1,LOGIT	;NOW WE CAN POINT TO IT
	MOVEM	T1,LOGSUB	;SET NON-ZERO
	PUSHJ	P,.TYOCH	; ALWATS EXCEPT WHEN IN SCAN
LOGMSG:
E$$LFB::.ERR.	(MS,.EC,V%L,L%I,S%I,LFB,<LINK log file begun on >) ;[1174]
	.ETC.	(DAT)		;[1174]
;	JRST	NOLOG		;NOW DO OTHER THINGS
;HERE TO INITIALIZE OTHER ODD ITEMS

NOLOG:
E$$LIN::.ERR.	(MS,,V%L,L%I,S%I,LIN,<LINK initialization>) ;[1174] NO POINT TIL NOW
	MOVEI	T1,OPENBL	;PUT ADDRESS OF INPUT I/O BLOCK
	MOVEM	T1,IO.PTR+DC	;IN I/O VECTOR INCASE OF ERRORS
	MOVEI	T1,.IOBIN	;MODE 14
	MOVEM	T1,OPENBL	;FOR INPUT DEVICE
	MOVEI	T1,DCBUF	;INPUT BUFFER HEADER
	MOVEM	T1,FSTR+1	;IN OPEN BLOCK
	MOVSI	T1,(Z DC,)	;GET CHAN# IN AC FIELD
	MOVEM	T1,OPENBL+I.CHN	;FOR OPEN/LOOKUP ETC
	MOVE	T1,[C%DEFAULT]	;DEFAULT MAP CONTENTS
	MOVEM	T1,MAPCON	;INCASE NO USER SWITCHES
	MOVEI	T1,CP.MSK	;[1120] START PROG RUNNABLE ON ALL CPU TYPES
	MOVEM	T1,OKCPUS	;[1120]   ..
IFN FTOVERLAY,<
	MOVEI	T1,.SPA		;SET DEFAULT FOR LINK 0
	MOVEM	T1,SPACE	;IN CASE USER DOES'NT
	MOVEI	T1,PH.LEN	;[1400] LENGTH OF PREAMBLE
	MOVEM	T1,PH+PH.HDR	;[1400] FOR LINK FILES
	MOVX	T1,<.ARS,,.ARS>	;[635] SET DEFAULT /ARSIZE
	MOVEM	T1,ARSIZE	;[635] IN CASE NO /ARSIZE SWITCH
	SETOM	LNKMAX		;SO WE CAN TELL LINK #0
>
IFN TOPS20,<
	MOVSI	T1,L.SYM	;ALWAYS LOAD SYMBOLS IF TENEX
	MOVEM	T1,FLAGS	;REMEMBER OVER CR-LF
>
	MOVEI	T1,START	;RESTART CODE
	HRRM	T1,.JBSA##	;SO WE GET CORRECT SEGMENT

IFN DEBSW,<
	MOVE	T1,[JRST %DDT%]	;ENTER DDT IF LOADED
>
IFE DEBSW,<
	MOVSI	T1,(POPJ	P,)	;NO DDT
>
	MOVEM	T1,ENTDDT	;WILL HANDLE DEBUG RIGHT

IFN TOPS20,<			;[2247]
;[2247] Here to set up the inferior fork.

	MOVX	T1,CR%CAP	;[2247] Give inferior some privs
	CFORK%			;[2247] Create it
	 ERNAM	CFORK%		;[2337] Catch errors
	MOVEM	T1,LC.JF	;[2247] Store the fork handle
	SETZB	T1,LW.LC	;[2247] Map from page zero
	MOVE	T2,LC.AB	;[2247] Get the top
	SUB	T2,LC.LB	;[2247] Minus bottom is size
	MOVEM	T2,UW.LC	;[2247] Store size
	PUSHJ	P,LC.IN##	;[2247] Map it in (section 0 always exists)
>;[2247] IFN TOPS20

	MOVEI	T2,USELEN	;ANY USER LIBS TO SETUP?
	JUMPE	T2,LNKSCN	;NO, SCAN FIRST COMMAND LINE
SUBTTL	SETUP USER LIBRARIES


SETUSE:	PUSHJ	P,DY.GET##	;GET SPACE WE NEED
	MOVEM	T1,USEPTR	;SETUP POINTER
	MOVE	T3,T1
	HRLI	T3,LIBTBL	;SETUP BYTE POINTER
	MOVE	T4,T1
	ADDI	T4,-1(T2)	;CALCULATE END
	BLT	T3,(T4)		;MOVE LIST
	SUBI	T2,F.LEN	;ANY MORE?
	JUMPLE	T2,LNKSCN	;NO, GO TO SCANNER
	ADDI	T1,F.LEN
	MOVEM	T1,-F.LEN(T1)	;POINT TO NEXT
	JRST	.-4		;TRY AGAIN
DEFINE MAKLIB (LANGUAGE,DEVICE,FILE,EXT,PRJ,PRG,SFD) <
	.ZZT==0			;[1315] ACCUMULATE LANGUAGE BITS
	.ZZZ==.			;REMEMBER CURRENT POSITION
	 EXP	0		;ZERO LINK WORD (NEXT LIB)
 DEFINE X (A,B,C,D)<
  IFIDN <A>,<LANGUAGE>,<
	.ZZT==.ZZT!1B<CT.'B>	;[1546] USE FOR USER DEFINED LIBRARY
 >>
 IFIDN <ALL><LANGUAGE>,<
   .ZZT==-1			;;[1315] USE FOR ALL LANGUAGES
 >
 IFB <LANGUAGE>,<
   .ZZT==-1			;;[1315] USE FOR ALL LANGUAGES
 >
 PROCESSORS
IFE .ZZT,<PRINTX ?UNKNOWN LANG. "LANGUAGE" IN USELIB MACRO ;;[1315]
	.ZZT==-1		;[1315]ASSUME ALL ON ERROR>
   EXP	.ZZT			;[1315] PROCESSOR BITS
 IFNB <DEVICE>,<<SIXBIT /DEVICE/>>
 IFB  <DEVICE>,< SIXBIT /SYS/>
		<SIXBIT /FILE/>
	EXP	-1
 IFNB <EXT>,<<SIXBIT /EXT/>!777777>
 IFB  <EXT>,<<SIXBIT /REL/>!777777>
 IFNB <PRJ>,<EXP	FX.DIR>
 IFB  <PRJ>,<EXP	0>
	EXP	0
	XWD	PRJ,PRG
 IFNB <PRJ>,<EXP	-1>
 IFB  <PRJ>,<EXP	0>
IRP	SFD,<			;GENERATE ANY SFDS
	<SIXBIT	/SFD/>
	EXP	-1
>
REPEAT	F.BFR+.ZZZ-.,<		;FILL IN BLANK SFDS
	EXP	0
>
REPEAT	F.LEN+.ZZZ-.,<		;NOW FILL IN SWITCHES (-1)
	EXP	-1
>
>
;DEFINE USER LIBRARIES BY
;MAKLIB	DEVICE,FILE,EXT,PRJ,PRJ,<SFD LIST>
LIBTBL:				;LIST OF LIBRARIES
	USELIB
USELEN==.-LIBTBL

SUBTTL	ERROR MESSAGES


CCLMES:	ASCIZ	\LINK:	Loading
\

LOASUP:	OUTSTR	[ASCIZ/LINK:
?LNKSUP Loading suppressed
/]				;[2050]

	EXIT
E$$GTF:	.OERR.	[ASCIZ/?LNKGTF	GETTAB failed while trying to get program information
/]				;[2075]
	EXIT			;[2075]

E$$IMI::.OERR.	[ASCIZ \?LNKIMI	Insufficient memory to initialize LINK
\]
	EXIT

CPOPJ:	POPJ	P,		;SOMEWHERE TO PUT IT
SUBTTL	INITIAL SYMBOLS


DEFINE SYMBOL (F,S1,S2,V)<
 IFB <F>,<
  PT.SGN!PT.SYM!PS.GLB
 >
 IFNB <F>,<
  PT.SGN!PT.SYM!PS.GLB!'F
 >
 SIXBIT \S1\
 IFB <V>,<
  IFNDEF S2,<EXTERN S2>
  EXP S2
 >
 IFNB <V>,<
  EXP	V
>>

DEFINE .JB (F,S,V)<
.%%'S:	SYMBOL	F,.JB'S,.JB'S,V
 HASH	.JB,S
>

DEFINE	JOB (F,S,V)<
%%%'S:	SYMBOL	F,JOB'S,.JB'S,V
 HASH	JOB,S
>

SALL
;ZERO ALL REQUIRED SYMBOLS
IF1,<
 DEFINE GETSYM (N) <.%'N=0>
 N=0
 REPEAT I.PRM,<GETSYM \N
  N=N+1
 >

;NOW FOR HASH MACRO (PASS1 ONLY)
 DEFINE HASH (J,S)<>
>;END IF1

;ALL WORK DONE ON PASS 2
IF2 ,<
 DEFINE HASH (J,S)<
  IFIDN <J><.JB>,<
   %%%=.%%'S
   PURGE .%%'S
  >
  IFDIF <J><.JB>,<
   %%%=%%%'S
   PURGE %%%'S
  >
  HT=(<SIXBIT /S/>)
  IFN HT-''J'',<HT=<''J''!HT>&<-1-<''J''&HT>>>
  Q=HT/I.PRM
  R=HT-Q*I.PRM
  IFGE Q-I.PRM,<Q=Q-Q/I.PRM*I.PRM>
  IFE Q,<Q=1>
  TRY=1
  ITEM Q,\R
  IFL I.PRM-TRY,<PRINTX INITIAL HASH FAILURE>
 >

 DEFINE ITEM (QT,RM) <
  IFN .%'RM,<
   R=R+Q
   IFL I.PRM-R,<R=R-R/I.PRM*I.PRM>
   IFGE I.PRM-<TRY=TRY+1>,<
    ITEM Q,\R
  >>
  IFE .%'RM,<.%'RM=HT,,%%%-GSTBL+1>
 >
>;END IF2
LSTBL:
;TITLE SYMBOLS (LOCAL FILE ONLY)
	PT.SGN!PT.EXT!PT.TTL!PT.FAK
	'JOBDAT'
	ENDSYM-LSTBL+1

	S.TTL
	'-INITI'
	'AL-SYM'

	S.TTL
	'BOLS  '
	0

	S.TTL!S.LST!S.SEG
	.JBDA			;[2254] LOW SEG ORIGIN
	.JBDA			;[2254] LOW SEG BREAK

GSTBL:
;OLD STYLE JOBDAT SYMBOLS I.E. JOBXXX
IFN .OSJOB,<			;DON'T WASTE SPACE ON OLD SYMBOLS

	JOB	,41
	JOB	,APR
	JOB	,BLT
	JOB	,CHN
IFN FTCN6,<
	JOB	,CN6
>
	JOB	,CNI
	JOB	,COR
	JOB	,DA
	JOB	,DDT
	JOB	,ERR
	JOB	,FF
	JOB	PS.DDT,HDA
	JOB	PS.DDT,HGH
	JOB	PS.DDT,HNM
	JOB	,HRL
	JOB	PS.DDT,HSM
	JOB	PS.DDT,HVR
	JOB	,INT
	JOB	,OPC
	JOB	,PFI
	JOB	,REL
	JOB	,REN
	JOB	,SA
	JOB	,SYM
	JOB	,TPC
	JOB	,USY
	JOB	,UUO
	JOB	,VER

>;END OF IFN .OSJOB
%%%BDT:	SYMBOL	PS.DDT,%JOBDT,%JOBDT
	HASH	%JO,BDT

;NEW STYLE SYMBOLS .JBXXX
	.JB	,41
	.JB	,APR
	.JB	,BLT
	.JB	,CHN
IFN FTCN6,<
	.JB	,CN6
>
	.JB	,CNI
	.JB	,COR
	.JB	,CST
	.JB	,DA
	.JB	,DDT
	.JB	,EDV,112	;[1151] VALUE HERE FOR ASSEMBLY WITH 6.03A
	.JB	,ERR
	.JB	,FF
	.JB	PS.DDT,H41
	.JB	PS.DDT,HCR
	.JB	PS.DDT,HDA
	.JB	PS.DDT,HGA
	.JB	PS.DDT,HGH
	.JB	PS.DDT,HNM
	.JB	,HRL
	.JB	PS.DDT,HRN
	.JB	PS.DDT,HSA
	.JB	PS.DDT,HSM
	.JB	PS.DDT,HVR
	.JB	,INT
	.JB	,OPC
	.JB	,OPS
	.JB	,OVL
	.JB	,PFH
	.JB	,PFI
	.JB	,REL
	.JB	,REN
	.JB	,SA
	.JB	,SYM
	.JB	,TPC
	.JB	,USY
	.JB	,UUO
	.JB	,VER


ENDSYM:!
SUBTTL	HASH TABLE


HSTBL:
IF1,<BLOCK	I.PRM>
IF2,<
 DEFINE SETVAL (N) <
	EXP	.%'N
	PURGE	.%'N
 >
 .XCREF
 N=0
 REPEAT I.PRM,<
  SETVAL \N
  N=N+1
 >
 PURGE TRY,%%%,Q,R,N,HT
 .CREF
>;END IF2
ENDHSH:!
SUBTTL	GETSEG CODE


IFE FTSINGLE,<
HICODE:
	PHASE	PHAZLO		;TOP OF FIXED DATA AREA
;HERE TO DO A GETSEG TO REQUIRED SEGMENT
;ENTERS WITH REQUIRED NAME IN T1
;GETSEG ERROR WILL CALL SEGMENT LNK999 TO HANDLE ERROR
;IF THAT FAILS A SHORT MESSAGE WILL BE OUTPUT ON TTY

SEGCOD:	SETZM	SGFLAG		;GOING FORWARDS
	EXCH	T1,SEGBLK+1	;SAVE SEGMENT NAME
	MOVEM	T1,OLDSEG	;SAVE IN
SGCOD1:	SETZM	SEGBLK+2	;CLEAR EXTENSION
	SETZM	SEGBLK+3	;AND OTHER PARAMS
	SETZM	SEGBLK+5	;AND CORE SIZE
	MOVEM	FL,SAVEAC	;NEED TO SAVE FLAGS
	MOVEM	P,SAVEAC+P	;AND P
;********************		;REMOVE WHEN MONITOR BUG IS FIXED
	MOVSI	T1,1		;GET RID OF HIGH SEGMENT FIRST
	CORE	T1,		; TO BE SURE WE HAVE ENOUGH ROOM
	  JFCL			;CAN NOT HAPPEN
;********************
	MOVEI	T1,SEGBLK	;ADDRESS OF DATA
NGTSEG:	GETSEG	T1,UU.PHY	;GET THE REQUIRED SEGMENT
	  JRST	SEGERR		;FAILED
SEGGOT:	MOVE	P,SAVEAC+P	;RESTORE P
	MOVE	FL,SAVEAC	;AND FLAGS
	MOVE	T1,OFFSET	;NORMAL OR CCL
	MOVE	T2,GTUPM	;ARG FOR GETTAB
	GETTAB	T2,		;TO FIND HIGH SEG ORIGIN
	  MOVSI	T2,%HISEG	;ASSUMED TO BE AT 400000
	SKIPN	T2		;NO NEED FOR DEFAULT ENTRY ADDRESS
				; IF NON-ZERO
	MOVSI	T2,%HISEG	;SET UP DEFAULT ADDRESS
	HLRZ	T2,T2	
	ANDCMI	T2,777		;ONLY SAVE PAGE NUMBER
	HRRZM	T2,HIORGN	;[650] SAVE FOR EVERYBODY
	ADDI	T2,.JBHDA##	;PLUS OFFSET
	MOVEM	T2,SEGPGN	;STORE IT
	MOVEI	T3,EZCOR	;SO WE CAN CHECK IF NEXT SEG IS SAME SIZE
	SKIPN	SGFLAG		;FORWARDS?
	JRST	%%ST(T2)	;YES, GO TO START CODE

	SKIPA	T3,.+1
	SAVEAC+P1,,P1
	BLT	T3,16		;RESTORE ACCS
	JRST	%%RET(T2)	;GO TO START CODE
GTUPM:	-2,,.GTUPM
OLDSEG:!	0		;STORE OLD SEG NAME
SGFLAG:!	0		;-1 IF OLDSEG WANTED
SEGPGN:!	0		;PAGE NO. OF START OF HIGH SEG

PRVSEG:	SETOM	SGFLAG		;GOING BACK
	MOVE	T1,OLDSEG	;GET NAME
	MOVEM	T1,SEGBLK+1	;STORE
	JRST	SGCOD1		;REJOIN COMMON CODE

SEGERR:	HRRM	T1,SEGBLK+2	;STORE ERROR CODE IN GETSEG BLOCK
;********************		;REMOVE WHEN MONITOR BUG IS FIXED
	MOVSI	T1,1		;GET RID OF HIGH SEGMENT FIRST
	CORE	T1,		; TO BE SURE WE HAVE ENOUGH ROOM
	  JFCL			;CAN NOT HAPPEN
;********************
	MOVEI	T1,ERRBLK	;TRY AGAIN
EGTSEG:	GETSEG	T1,UU.PHY
	  HALT			;LET MONITOR PRINT MESSAGE
	JRST	SEGGOT		;WE GOT LNK999, GO TO IT

;GETSEG BLOCK FOR LNK999
ERRBLK:	.-.		;DEVICE
	'LNK999'	;FILE NAME
	EXP	0,0,0,0	;EXT, CORE ETC

>;END IFE FTSINGLE
SUBTTL	RESTART CODE 


IFE FTSINGLE,<
;DO A RUN UUO ON FIRST SEGMENT

START:	MOVE	T1,FSTSEG	;[600] GET NAME OF INITIAL SEGMENT
	CAMN	T1,SEGBLK+1	;[600] ALREADY IN THE RIGHT SEGMENT?
	JRST	START1		;[600] RIGHT SEGMENT
	MOVEM	T1,SEGBLK+1	;STORE NAME
	SETZM	SEGBLK+2	;CLEAR EXT
	SETZM	SEGBLK+3
	SETZM	SEGBLK+5
	SKIPA	T1,.+1		;GET RID OF HIGH AND REST OF LOW SEG
		1,,.+5
	CORE	T1,		; TO BE SURE WE HAVE ENOUGH ROOM
	  JFCL			;CAN NOT HAPPEN
	MOVEI	T1,SEGBLK	;NORMAL START ADDRESS
	RUN	T1,
	  HALT			;TOO BAD
>;END IFE FTSINGLE
SUBTTL	UUO TRAP


UUOHANDLER:
	MOVEM	T1,SAVEAC+T1	;GET AN ACC
	MOVE	T1,.JBUUO	;GET UUO
	TLNN	T1,776000	;ONLY UUO 1 IS VALID
IFE FTSINGLE,<
	JRST	@SEGPGN		;ENTER HIGH SEG
>
IFN FTSINGLE,<
	JRST	%%UUO##		;WE KNOW WHERE IT IS
>
E$$IUU::.OERR.	[ASCIZ /?LNKIUU	Illegal user UUO at PC /] ;[1174]
	SOS	T2,UUOTRAP	;PC+1
	HRLO	T2,T2		;PC IN LEFT FLAG IN RIGHT
	SETZ	T1,		;RECEIVING ACC
	LSHC	T1,3		;GET NEXT CHAR
	ADDI	T1,"0"		;TURN INTO ASCII
	OUTCHR	T1
	TRNE	T2,-1		;ZERO RH WHEN DONE
	JRST	.-5
	EXIT
SUBTTL	ENTER DDT


IFN DEBSW,<
%DDT%:
IFE TOPS20,<
	SKIPN	.JBDDT		;DDT LOADED?
	POPJ	P,		;NO
>
	POP	P,.JBOPC	;SAVE PC
	PUSH	P,T1		;GET AN ACC
	OUTSTR	%DDT1
	MOVE	T1,@.JBOPC	;GET STRING PTR
	OUTSTR	@T1		;OUTPUT IT
	OUTSTR	%DDT2
	HRRZ	T1,.JBDDT	;GET DDT ADDRESS
IFN TOPS20,<
	SKIPN	T1		;REAL DDT?
	MOVEI	T1,770000	;NO, USE IDDT
>
	EXCH	T1,0(P)		;SWAP WITH CONTENTS OF T1
	POPJ	P,		;GO TO DDT

%DDT1:	ASCIZ	\
DDT:	Called from	\

%DDT2:	ASCIZ	\
\
>
SUBTTL	TTY OUTPUT LINE BUFFERING SUBROUTINE


;ROUTINE TO LOG A CHARACTER TO THE USER'S TERMINAL. USES A LINE BUFFER
;FOR SPEED. TTYIT IS THE ENTRY POINT. SAVES T1.

TTYDMP:	PUSHJ	P,TTYOUT	;[1124] OUTPUT LINE
TTYIT:	SOSGE	TTYBUF+2	;ANY SPACE LEFT
	JRST	TTYDMP		;NO, FORCE OUTPUT
	IDPB	T1,TTYBUF+1	;DEPOSIT IN LINE BUFFER
	CAIG	T1,.CHFFD	;SEE IF END-OF-LINE CHAR
	CAIGE	T1,.CHLFD
	SKIPA			;[1124] NO--JUST RETURN
	PUSHJ	P,TTYOUT	;[1124] YES--DUMP THE LINE FIRST
IFE FTSINGLE,<
TTYRET:	PUSH	P,T1		;[1124] SAVE CHAR IN T1
	MOVE	T1,SEGPGN	;[1124] GET SEGMENT ORIGIN
	ADDI	T1,%%RET	;[1124] POINT TO WHERE WE WANT TO GO
	EXCH	T1,0(P)		;[1124] SAVE GOTO ADDR, RESTORE T1
>
	POPJ	P,		;[1124] RETURN

;LOCAL ROUTINE TO DUMP THE TERMINAL BUFFER WHEN FULL OR END-OF-LINE
;CHARACTER IS SEEN. SAVES T1.

TTYOUT:	PUSH	P,T1		;[1124] SAVE PENDING CHAR
	SETZ	T1,
	IDPB	T1,TTYBUF+1	;END WITH NULL
	OUTSTR	LINBUF		;OUTPUT LINE
	MOVEI	T1,LN.CPL	;RESET
	MOVEM	T1,TTYBUF+2	;CCHAR COUNT
	SKIPA	T1,.+1
	POINT	7,LINBUF
	MOVEM	T1,TTYBUF+1	;AND BYTE PTR
	POP	P,T1		;[1124] RESTORE PENDING CHAR
	POPJ	P,		;[1124] RETURN
SUBTTL	LOG FILE OUTPUT SUBROUTINE


LOGIT:	SOSGE	RCBUF+2		;ANY SPACE LEFT
	JRST	LOGDMP		;NO
	IDPB	T1,RCBUF+1	;YES
IFE FTSINGLE,<
	JRST	TTYRET		;INCASE EXECUTE ONLY
>
IFN FTSINGLE,<
	POPJ	P,
>

LOGDMP:	OUT	RC,		;OUTPUT THIS BUFFER
	  JRST	LOGIT		;NO ERRORS
	MOVSI	T1,(POINT 0)	;NULL BYTE POINTER
	HLLM	T1,RCBUF+1	;INCASE CALLED AGAIN
	HRLOM	T1,RCBUF+2	;VERY LARGE WORD COUNT
	RELEASE	RC,		;SAVE WHAT WE HAVE
E01OEL::.OERR.	.EROEL		;[1174] LNKOEL
IFE FTSINGLE,<
	JRST	TTYRET
>
IFN FTSINGLE,<
	POPJ	P,
>

.EROEL:	.ASCIZ	<%LNKOEL	Output error on log file, file closed, load continuing
>


IFE FTSINGLE,<
HIEND==.-1
	DEPHASE


IFL LN.PLC-<HIEND-HICODE>,<
	PRINTX	?PHASED LOWSEG AREA TOO SMALL, INCREASE LN.PLC IN LNKPAR
			>
>;END IFE FTSINGLE
SUBTTL	HIGH SEGMENT PART OF RESTART CODE


;HERE TO RESTART SINGLE SEGMENT VERSION OR WHEN RESTARTING
;MULTI-SEG VERSION AND RIGHT SEGMENT IS STILL IN CORE

IFN FTSINGLE,<
START::
>
START1:
	MOVEI	T1,EZCOR	;GET RID OF JUNK IN LOW SEG
	CORE	T1,		;EASY WAY
	  JFCL			;CANNOT FAIL
	SKIPA	T1,.+1
	%LOW,,%LOW+1
	SETZM	%LOW		;CLEAR LOW SEG DATA
	BLT	T1,@.JBREL
	MOVEI	T1,LINK		;GET ORIGINAL START ADDRESS
	HRRM	T1,.JBSA	;RESET IT
	JRST	(T1)		;AND START AGAIN
SUBTTL	THE END


INILIT:	END	LINK