/ EDIT #102
/
/ COPYRIGHT 1969, DIGITAL EQUIPMENT CORP., MAYNARD, MASS.
/
/ CHAIN V1A	     26 JAN 70	        H. KREJCI
/
/ COMMAND INPUT -- ALL KEYED IN INFORMATION IS ACCEPTED IN LOGICAL
/ LINES.  A CARRIAGE RETURN IS USED TO CONTINUE A LOGICAL LINE
/ ONTO THE NEXT PHYSICAL LINE.  AN ALTMODE IS USED TO TERMINATE
/ A LOGICAL LINE.  A LINE CONSISTS OF NAMES (ROUTINES, OPTIONS,
/ PARAMETERS), LIBRARY INDICATORS, AND BREAK CHARACTERS (NAME
/ TERMINATORS).  BLANKS ARE IGNORED.  NAMES MAY CONSIST OF 1-6
/ ALPHANUMERIC CHARACTERS.  A LIBRARY INDICATOR (#) MAY APPEAR ANY
/ WHERE WITHIN A NAME TO INDICATE THAT THE BINARY UNIT OF
/ A ROUTINE IS NOT TO BE FOUND ON THE USER'S DEVICE, BUT RATHER
/ WITHIN A LIBRARY.
/ THE FOLLOWING CHARACTERS ARE RECOGNIZED AS BREAK CHARACTERS,
/ BUT ONLY ACCEPTED AS VALID BREAK CHARACTERS WHEN APPROPRIATE:
/ EQUAL SIGN, COLON, COMMA, SLASH, & ALTMODE.  WHEN A COMMAND
/ INPUT ERROR IS DETECTED, THE ENTIRE LOGICAL LINE IS REJECTED.
/ IOPS ASCII EDITING (RUBOUT AND ^U) APPLY ONLY TO PHYSICAL LINES.
/
/ ^P USES:
/ TO RESTART CHAIN DURING COMMAND INPUT
/ TO RESTART A READ OPERATION AFTER EOM
/ TO READ A FILE FROM A NON-FILE-ORIENTED DEVICE
/ (THE REQ'D FILE NAME IS TYPED OUT BEFORE READING)
/ TO CONTINUE AFTER A PAUSE
/ AT ANY OTHER TIME, ^P WILL EXIT TO MONITOR.
/
/ INDICATOR WORDS -- INDICATOR WORDS USED IN TABLES (RCL, LDT, ODT, 
/ & TTL'S) HAVE THE FOLLOWING BIT DESIGNATIONS:
/    BIT 17 -- THIS ENTRY DEFINES A LINK NAME
/    BIT 16 -- THIS ENTRY DEFINES AN EXTERNAL LINK COMPONENT
/    BIT 15 -- THIS ENTRY DEFINES AN INTERNAL LINK COMPONENT
/    BIT 14 -- ROUTINE IS ON USER'S DEVICE
/    BIT 13 -- ROUTINE IS IN A LIBRARY
/    BIT 11 -- ROUTINE IS RESIDENT (RCL ENTRY)
/
/ CHAIN IS WRITTEN TO RUN AS AN ABSOLUTE SYSTEM PROGRAM (BANK
/ ADDRESSING) ON A PDP-15 UNDER THE KEYBOARD MONITOR.  DEFINING
/ THE FOLLOWING PARAMETERS WILL CONDITIONALIZE CHAIN FOR OTHER
/ ENVIRONMENTS.
/
/ PDP9=0	PDP-9
/ BF=0	B/F MONITOR
/ PTP=0	I/O (PAPER TAPE) MONITOR
/	WHEN ASSEMBLING FOR A PAPER TAPE MONITOR, THE SYSTEM 
/	CORE SIZE MUST BE SPECIFIED AS FOLLOWS.
/	FOR A PDP-15, DEFINE:
/	PAGE=N	WHERE N IS ONE LESS THAN THE NUMBER OF 4K PAGES
/	FOR A PDP-9, DEFINE:
/	BANK=N	WHERE N IS ONE LESS THAN THE NUMBER OF 8K BANKS
/
	.EJECT
	.ABS
/
	.IFUND	PTP
	.LOC	10000
	.ENDC
	.IFDEF	PTP
	.IFUND	PDP9
	.IFUND	PAGE
	.END	ERR -- PAGE MUST BE DEFINED
	.ENDC
	.LOC	PAGE+1/2*2-1*10000
	.ENDC
	.IFDEF	PDP9
	.IFUND	BANK
	.END	ERR -- BANK MUST BE DEFINED
	.ENDC
	.LOC	BANK*20000+10000
	.ENDC
	.ENDC
/
	.IFDEF	BF
BFM=0
	.ENDC
/
.SCOM=100
SL=-1	/SYSTEM LIBRARY
CI=-2	/COMMAND INPUT
TO=-3	/TYPED OUTPUT
UD=-4	/USER PROGRAM DEVICE
UL=-5	/USER'S LIBRARY
RO=-6	/RELOCATED OUTPUT
	.EJECT
/ PROGRAM ENTRY
/
START	LAC*	(.SCOM)	/SAVE BANK BITS
	AND	(060000)
	DAC	BNKBTS
	LAC	(BRTBL-1)	/SET BANK BITS ON ALL ADDRESSES
	JMS	SETBBS	/LISTED IN THE BANK RELOCATION
	DAC*	(10)	/TABLE (BRTBL)
BRL	LAC*	10
	SPA
	JMP	INTLIZ
	JMS	SETBBS
	DAC	TEMP1
	LAC*	TEMP1
	JMS	SETBBS
	DAC*	TEMP1
	JMP	BRL
/
	.EJECT
INTLIZ	DZM	MAX.XX	/INITIALIZE MAX BLANK COMMON BLOCK SIZE
ICIZ	.INIT CI,0,CPTYPD	/SETUP ^P TRANSFER ADDRESS
	JMS	TYPE	/TYPE PROGRAM NAME AND VERSION
	MES1
/
/ DETERMINE XCT FILE NAME AND .ENTER IN OUTPUT DEVICE DIRECTORY
/
	JMS	CRTN	/REQUEST XCT FILE NAME
	JMS	TYPE
	MES20
/
DXNSNL	JMS	RFAN	/READ A LINE AND FETCH FIRST NAME
	LAC	FANM	/ERR 101 IF 0 OR 7 CHAR NAME
	SZA
	JMP	.+4
	JMS	ERR1
	MES101
	JMP	DXNSNL
	DAC	ROFNAM
	LAC	FANM+1
	DAC	ROFNAM+1
	LAC	FANB	/ERR 103 IF OTHER THAN ALTMODE BREAK
	SAD	(175)
	JMP	.+4
	JMS	ERR3
	MES103
	JMP	DXNSNL
	JMS	CRTN
IROD	.INIT	RO,1,0	/OPEN XCU OR DUMMY XCT FILE
ERO1Z	.ENTER	RO,ROFNAM
	LAC	IROD+3	/SET DUMMY FILE SWITCH IF RO DEVICE IS
	AND	(700)	/FILE-ORIENTED.  OTHERWISE, CLEAR SWITCH
	DAC	DFSW
	.EJECT
/ FETCH AND RECORD OPTIONS AND PARAMETERS
/
	JMS	TYPE	/REQUEST OPTIONS & PARAMETERS
	MES30
FROSNL=.			/SET DEFAULT PARAMETERS & OPTIONS
	.IFUND	BFM
	.IFUND	PDP9
	LAC*	(.SCOM+20)
	SMA
	JMP	.+4
	AND	(070000)
	XOR	(007777)
	JMP	.+4
	.ENDC
	.ENDC
	LAC*	(.SCOM)
	AND	(070000)
	TAD	BSADR
	DAC	LDLMT
	DZM	BFFLAG
	DZM	SZFLAG
	DZM	GMFLAG
	DZM	PSFLAG
	LAC	(+1)
	DAC	LMFLAG
	LAW	-1
	DAC	FGDBSE
	.IFDEF	PDP9
	LAC	(17777)
	.ENDC
	.IFUND	PDP9
	LAC	(07777)
	.ENDC
	DAC	ADRMSK
	CMA
	DAC	OPCMSK
/
	JMS	RFAN	/READ LINE AND FETCH FIRST NAME
	JMS	ZLLX	/ZERO LENGTH LINE?
	JMP	FROENV	/YES -- NO OPTIONS OR PARAMETERS SPECIFIED
FRONX	LAC	FANM	/NO -- ERR 101 IF 0 OR 7 CHAR NAME
	SZA
	JMP	.+4
	JMS	ERR1
	MES101
	JMP	FROSNL
	LAC	FANB	/ERR 103 IF BREAK CHAR IS NOT A
	SAD	(054)	/COMMA, ALTMODE, OR COLON
	JMP	FRONC
	SAD	(175)
	JMP	FRONC
	SAD	(072)
	SKP		/COLON BREAK, ACCEPT ONLY IF 
	JMP	FRO103	/FGD OPTION
	LAC	FANM
	SAD	(060704)
	JMP	FROFFB
FRO103	JMS	ERR3
	MES103
	JMP	FROSNL
/
FROFFB	DZM	FGDBSE	/SPECIAL CASE -- FGD:XXX -- ACCEPT
FROFB1	JMS	FAC	/OCTAL CHARACTERS (0-7) TERMINATED BY A
	SAD	(054)	/COMMA OR ALTMODE.  IF MORE THAN 
	JMP	FROFB2	/FIVE OCTAL CHARACTERS, ACCEPT ONLY 
	SAD	(175)	/THE LAST FIVE.  ERR 32 IF A NON-OCTAL
	JMP	FROFB2	/CHARACTER IS FOUND.
	AND	(077)
	XOR	(060)
	DAC	TEMP11
	AND	(070)
	SZA
	JMP	FROFB3
	LAC	FGDBSE
	RCL
	RTL
	AND	(077770)
	XOR	TEMP11
	DAC	FGDBSE
	JMP	FROFB1
/
FROFB2	DAC	FANB	/SET BREAK CHAR AS IF FOUND BY SUB 'FAN'
	JMP	FROFGD
/
FROFB3	LAC	(727777)	/NON-OCTAL CHAR FOUND, TYPE:
	DAC	FANM+1	/   UNRECOGNIZED SYMBOL -- FGD:??
	JMP	FRO32
/
FRONC	LAC	FANM+1	/COMPARE NAME WITH RECOGNIZED OPTION
	SZA		/AND PARAMETER SYMBOLS, ERR 32 IF MATCH 
	JMP	FRO32	/NOT FOUND
	LAC	FANM
	SAD	(060704) /FGD
	JMP	FROFGD
	SAD	(020704) /BGD
	JMP	FROBGD
	SAD	(200122) /PAR
	JMP	FROPAR
	SAD	(200114) /PAL
	JMP	FROPAL
	SAD	(207100) /P9
	JMP	FROP9
	SAD	(206165) /P15
	JMP	FROP15
	SAD	(161500) /NM
	JMP	FRONM
	SAD	(071500) /GM
	JMP	FROGM
	SAD	(233200) /SZ
	JMP	FROSZ
	SAD	(701300) /8K
	JMP	FRO8K
	SAD	(616613) /16K
	JMP	FRO16K
	SAD	(626413) /24K
	JMP	FRO24K
	SAD	(636213) /32K
	JMP	FRO32K
	SAD	(616213) /12K
	JMP	FRO12K
	SAD	(626013) /20K
	JMP	FRO20K
	SAD	(627013) /28K
	JMP	FRO28K
FRO32	JMS	ERR2	/SYMBOL NOT RECOGNIZED
	MES32
	JMP	FROSNL
/
FROFGD	LAC	(001)	/SET B/F FLAG = 1 (FGD)
	SKP
FROBGD	CLA		/SET B/F FLAG = 0 (BGD)
	DAC	BFFLAG
	JMP	FROLNX
FROPAR	LAC	PSFLAG	/SETUP TO 'PAUSE AFTER RESIDENT' IF PAUSE
	SNA		/FLAG IS CLEARED (ZERO).
	LAW	-1
	SKP
FROPAL	LAC	(+1)	/SETUP TO 'PAUSE AFTER LINK' (INCLUDING 
	DAC	PSFLAG	/RESIDENT CODE)
	JMP	FROLNX
FROP9	LAC	(017777)	/SET ADDRESS AND OPCODE MASKS FOR PDP-9
	DAC	ADRMSK
	CMA
	DAC	OPCMSK
	JMP	FROLNX
FROP15	LAC	(007777)	/SET ADDRESS AND OPCODE MASKS FOR PDP-15
	DAC	ADRMSK
	CMA
	DAC	OPCMSK
	JMP	FROLNX
FRONM	DZM	LMFLAG	/CLEAR LOAD MAP FLAG
	JMP	FROLNX
FROGM	ISZ	GMFLAG	/SET GLOBAL MAP FLAG
	JMP	FROLNX
FROSZ	ISZ	SZFLAG	/SET SIZE FLAG
	JMP	FROLNX
FRO8K	LAC	(10000)	/SETUP MAX ADDRESS FOR AN "8K SYSTEM"
	SKP
FRO16K	LAC	(30000)
	SKP
FRO24K	LAC	(50000)
	SKP
FRO32K	LAC	(70000)
	TAD	BSADR
	DAC	LDLMT
	JMP	FROLNX
FRO12K	LAC	(27777)	/SETUP MAX ADDRESS FOR A "12K SYSTEM"
	SKP
FRO20K	LAC	(47777)
	SKP
FRO28K	LAC	(67777)
	DAC	LDLMT
	JMP	FROLNX
/
FROLNX	LAC	FANB	/LAST NAME TEST
	SAD	(175)	/ALTMODE BREAK?
	JMP	FROINT	/YES -- INITIALIZE PER ACCEPTED OPTIONS & PARAMS
	JMS	FAN	/NO -- FETCH ANOTHER NAME
	JMP	FRONX
/
FROINT	LAC	SZFLAG	/INCREASE MAP LINE LENGTH IF SIZE OPTION
	SNA
	JMP	FROENV
	LAC	(016000)
	DAC	MAPBUF
	LAC	(040)
	DAC	MAPFAD+13
FROENV	LAC	ADRMSK	/SET ENVIRONMENT INDICATOR
	AND	(010000)	/  BIT-16 FOR PDP-9
	RCL		/  BIT-17 FOR FGD
	JMS	LCS7
	XOR	BFFLAG
	DAC	ENVIND
	LAC	ADR10	/SETUP CORE-LIMITS-TABLE (CLT) CONSISTING
	DAC	CLTX1	/OF UPPER LIMITS OF EACH EXITSING CORE
	LAC	LDLMT	/BANK OR PAGE (PDP-9/PDP-15) TERMINATED BY
FROCT1	DAC*	CLTX1	/A -1 (MAX 9 WORDS)
	SAD	(-1)
	JMP	FROCT2
	AND	OPCMSK
	TAD	(-1)
	ISZ	CLTX1
	JMP	FROCT1
/
FROCT2	LAC	CLT	/"12K SYSTEM"?
	AND	(7777)
	SAD	(7777)
	SKP		/YES -- TEST FOR "12K PDP-9"
	JMP	FROLMT	/NO -- CLT IS COMPLETE
	LAC	ADRMSK	/PDP-9 (NON 12-BIT ADDRESS)?
	SAD	(07777)
	JMP	.+4
	JMS	ERR1	/YES -- ERR 33
	MES33
	JMP	FROSNL
	LAC	CLT+1	/NO -- ADJUST SECOND CLT WORD FOR
	AND	(770000)	/BOOTSTRAP
	XOR	BSADR
	DAC	CLT+1
/
FROLMT	LAC	BFFLAG	/SET LDLMT TO A LOW CORE LIMIT IF 
	SNA		/BUILDING A FGD CHAIN
	JMP	FRORCL
	LAC	FGDBSE
	SPA
	.IFUND	BFM
	LAC	FGDLMT
	.ENDC
	.IFDEF	BFM
	LAC*	(.SCOM+106)
	.ENDC
	DAC	LDLMT
/
	.EJECT
/ READ ONE LINE OF RESIDENT CODE NAMES (MINIMUN, ONE NAME) AND
/ CONSTRUCT THE RESIDENT-CODE-LIST (RCL).
/ RCL ENTRY FORMAT:
/    INDICATOR WORD
/    ROUTINE NAME (TWO WORDS
/    .SIXBT RT FILLED WITH ZEROS)
/
FRORCL	JMS	CRTN		/REQUEST RESIDENT CODE LIST
	JMS	TYPE
	MES50
	LAC*	(.SCOM+2)		/SET BASE OF RCL 
	DAC	RCLBSE		/RCL ENTRY INDEX
/
RCLSNL	LAC	RCLBSE		/START NEW LINE -- SET ENTRY
	DAC	LDTX1		/INDEX
	JMS	RFAN		/READ A LINE AND FETCH AN NAME
	LAC	FANM
	SZA			/ ERR 51 IF ZERO LENGTH LINE
	JMP	RCLIX		/ OTHERWISE, ERR 101 IF 0 OR 7 CHARACTER NAME
	LAC	FANM+1		/
	SNA			/ OTHERWISE, ACCEPT NAME
	JMP	.+4		/ AS NAME OF MAIN PROGRAM
RCL101	JMS	ERR1		/ IF COMMA OR ALTMODE BREAK
	MES101			/ CHARACTER
	JMP	RCLSNL
	LAC	FANB
	SAD	(175)
	SKP
	JMP	RCL101
	JMS	ERR1
	MES51
	JMP	RCLSNL
RCLIX	LAC	FANI		/ERR 52 IF LIB INDICATOR
	AND	(020)		/ON MAIN PROG NAME
	SNA
	JMP	RCLBX
	JMS	ERR1
	MES52
	JMP	RCLSNL
RCLBX	LAC	FANB		/BREAK CHARACTER TEST --
	SAD	(054)		/ERR 103 IF OTHER THAN
	JMP	RCLNX		/COMMA OR ALTMODE.
	SAD	(175)
	JMP	RCLNX
	JMS	ERR3
	MES103
	JMP	RCLSNL
RCLNX	LAC	RCLBSE		/ERR 118 IF NAME HAS
	JMS	LDTSCN		/ALREADY BEEN ENTERED IN RCL
	SPA
	JMP	.+4
	JMS	ERR2
	MES118
	JMP	RCLSNL
	LAC	FANI		/MAKE RCL ENTRY
	AND	(070)
	XOR	(100)
	DAC	FANI
	JMS	LDTENT
/
	LAC	FANB		/ALTMODE BREAK CHARACTER?
	SAD	(175)
	JMP	RCLLDT		/YES -- END OF LIST
/
	JMS	FAN		/NO -- FETCH ANOTHER NAME
	LAC	FANM		/ ERR 101 IF 0 OR 7 CHARS
	SZA
	JMP	RCLBX
	JMP	RCL101
/
	.EJECT
RCLLDT	LAC	LDTX1	/END RCL AND START LDT.  RCL WILL BE
	DAC	LDTBSE	/FOLLOWED BY AN INDICATOR FOR A LINK DEFINITION
	DAC	LDTLSX	/(001) EVEN IF THERE ARE NO LINK DEFINITIONS.
			/THIS IS NECESSARY WHEN RELOCATING THE RESIDENT
			/CODE (TERMINATES LIST SCAN IN SUBROUTINE RAO).
/
/ READ LINK DEFINITIONS (IF ANY) AND CONSTRUCT THE
/ LINK-DEFINITION-TABLE (LDT) FOLLOWING THE RCL.
/ LDT ENTRY FORMAT
/    INDICATOR -- SAME AS RCL
/    NAME -- SAME AS RCL
/
	JMS	CRTN
	JMS	TYPE		/TYPE --
	MES60			/"DESCRIBE LINKS & STRUCTURE"
/
LDTSNL	DZM	LDTEIF		/START NEW LINE, SET E/I FLAG TO EXT.
	JMS	RFAN		/READ LINE AND FETCH FIRST NAME
	LAC	FANM		/ERR 101 IF 0 OR 7 CHAR NAME
	SZA
	JMP	LDTECX
	LAC	FANM+1	/INTERPRET ZERO LENGTH LINE AS 'RESIDENT ONLY' 
	SNA
	JMP	RCO
	JMS	ERR1
	MES101
	JMP	LDTRSL
LDTECX	LAC	FANB		/TEST FOR EQUALS OR COLON BREAK CHAR
	SAD	(075)		/ IF EQUAL SIGN -- LINK DEFINITION
	JMP	LDTSN1		/ IF COLON -- END LINK DEFINITIONS
	SAD	(072)		/ AND START OVERLAY DESCRIPTION
	JMP	LDTODT		/ IF OTHER -- ERR 103
	JMS	ERR3
	MES103
	JMP	LDTRSL
LDTSN1	LAC	RCLBSE		/SCAN RCL & LDT FOR NAME
	JMS	LDTSCN		/JUST FETCHED FROM COMMAND STRING
	SPA			/ERR 102 IF FOUND
	JMP	.+4
	JMS	ERR2
	MES102
	JMP	LDTRSL
	LAC	FANI		/TEST FETCHED NAME INDICATOR FOR
	AND	(020)		/BIT-13. ERR 113 IF 
	SNA			/SET. OTHERWISE, SET INDICATOR
	JMP	.+4		/FOR A LINK NAME LDT ENTRY.
	JMS	ERR2		/I.E., SET BIT-17 & CLEAR OTHERS.
	MES113
	JMP	LDTRSL
	LAC	(001)
	DAC	FANI
	JMS	LDTENT		/ENTER INDICATOR & NAME IN LDT
/
LDTFAN	JMS	FAN		/FETCH ANOTHER NAME
	LAC	FANM		/ERR 101 IF 0 OR 7 CHAR NAME
	SZA
	JMP	.+4
	JMS	ERR1
	MES101
	JMP	LDTRSL
	LAC	FANB		/TEST FOR COMMA, ALTMODE, OR SLASH
	SAD	(054)		/BREAK CHARACTER. ERR 103 IF OTHER.
	JMP	LDTSFX
	SAD	(175)
	JMP	LDTSFX
	SAD	(057)
	JMP	LDTSSF
	JMS	ERR3
	MES103
	JMP	LDTRSL
LDTSSF	LAC	LDTEIF		/SLASH BREAK, ERR 103 IF
	SNA			/E/I FLAG IS ALREADY SET
	JMP	.+4		/INTERNAL.  OTHERWISE, SET E/I
	JMS	ERR3		/TO EXTERNAL 
	MES103
	JMP	LDTRSL
	ISZ	LDTEIF
	JMP	LDTSN3
LDTSFX	LAC	LDTEIF		/COMMA OR ALTMODE BREAK, TEST FOR
	SNA			/SLASH READ
	JMP	LDTSN3
	LAC	RCLBSE		/INTERNAL COMPONENT NAME -- SCAN
LDTSN2	JMS	LDTSCN		/RCL & LDT FOR NAME.  ERR 116
	SPA			/IF NAME IS FOUND AND IS NOT
	JMP	LDTSN4		/ALSO AN INTERNAL COMPONENT
	DAC	TEMP1		/NAME
	LAC*	TEMP1
	AND	(004)
	SNA
	JMP	.+4
	LAC	TEMP1
	TAD	LDTESZ
	JMP	LDTSN2
	JMS	ERR2
	MES116
	JMP	LDTRSL
/
LDTSN4	LAC	LDTLSX		/ERR 104 IF NAME IS FOUND IN 
	JMS	LDTSCN		/CURRENT LINE
	SMA
	JMP	.+3
	LAC	(004)		/(BIT-15 FOR INT SUB NAME)
	JMP	LDTEN2
	JMS	ERR2
	MES104
	JMP	LDTRSL
				/EXTERNAL LINK COMPONENT NAME --
LDTSN3	LAC	RCLBSE		/SCAN RCL & LDT FOR NAME, ERR 105
	JMS	LDTSCN		/IF FOUND.
	SMA
	JMP	.+3
	LAC	(002)		/(BIT-16 FOR EXT SUB NAME)
	JMP	LDTEN2
	JMS	ERR2
	MES105
	JMP	LDTRSL
LDTEN2	XOR	FANI		/SET INDICATOR AND MAKE
	DAC	FANI		/LDT ENTRY
	JMS	LDTENT
	LAC	FANB		/END OF LINE?
	SAD	(175)
	SKP
	JMP	LDTFAN		/NO -- FETCH ANOTHER NAME
	LAC	LDTX1		/YES -- UPDATE LINE START
	DAC	LDTLSX		/INDEX AND START A NEW
	JMP	LDTSNL		/LINE
/
LDTRSL	LAC	LDTLSX	/ERROR DETECTED, RESTART LOGICAL LINE
	DAC	LDTX1
	JMP	LDTSNL
/
/ LDTENT -- SUBROUTINE TO MAKE A RCL OR LDT ENTRY.
/           THE INDICATOR AND NAME ARE TAKEN FROM FANI, FANM,
/           & FANM+1.
/           LDTX1 IS UPDATED TO POINT TO THE NEXT LDT ENTRY
/
LDTENT	0
	LAC	FANI
	JMS	LDTENS
	LAC	FANM
	JMS	LDTENS
	LAC	FANM+1
	JMS	LDTENS
	JMP*	LDTENT
/
LDTENS	0
	DAC*	LDTX1
	ISZ	LDTX1
	JMP*	LDTENS
/
/ LDTSCN -- SUBROUTINE TO SCAN THE RCL OR LDT FOR
/           THE NAME CONTAINED IN FANM & FANM+1.  THE SCAN 
/           START INDEX IS TAKEN FROM AC.  IF NAME IS
/           FOUND, THE LDT ENTRY INDEX IS RETURNED IN AC.
/           IF NOT FOUND, AC IS SET TO -1
/           TEMP1 IS USED TO SCAN ENTRIES
/           TEMP2 IS USED TO SCAN WITHIN ENTRIES
/
LDTSCN	0
LDTSC1	SAD	LDTX1	/TEST FOR END OF TABLE
	JMP	LDTSC3
	DAC	TEMP1
	DAC	TEMP2
	ISZ	TEMP2	/COMPARE TWO WORD NAME
	LAC*	TEMP2
	SAD	FANM
	SKP
	JMP	LDTSC2	/FIRST WORD, NO MATCH
	ISZ	TEMP2
	LAC*	TEMP2
	SAD	FANM+1
	SKP
	JMP	LDTSC2	/SECOND WORD, NO MATCH
	LAC	TEMP1	/NAME MATCH, EXIT WITH AC CONTAINING THE
	JMP*	LDTSCN	/INDEX OF ENTRY WITH MATCHING NAME.
/
LDTSC2	LAC	TEMP1	/NO MATCH, AUGMENT ENTRY INDEX
	TAD	LDTESZ
	JMP	LDTSC1
/
LDTSC3	LAW	-1	/NAME NOT FOUND IN LDT, EXIT WITH
	JMP*	LDTSCN	/AC=-1
/
	.EJECT
LDTODT	LAC	(001)	/TERMINATE LDT WITH AN INDICATOR FOR A
	DAC*	LDTX1	/LINK DEFINITION.
	LAC	LDTX1	/INITIALIZE ODT
	TAD	(001)
	DAC	ODTX1	/ODT IS PRECEDED BY AN ALTMODE TO PROVIDE
	LAC	(175)	/A 'PREVIOUS BREAK CHARACTER' FOR THE
	DAC*	ODTX1	/FIRST ODT ENTRY.
	ISZ	ODTX1
	LAC	ODTX1
	DAC	ODTBSE
	DAC	ODTLSX
	JMP	ODTSN1
/
/ READ OVERLAY DESCRIPTION COMMANDS AND CONSTRUCT THE
/ OVERLAY DESCRIPTION TABLE (ODT) FOLLOWING THE LDT.
/ ODT ENTRY FORMAT:
/    INDICATOR--SAME AS IN LDT
/    NAME--SAME AS IN LDT
/    REGISTER USED WHEN PROCESSING LDT (BACK POINTER)
/    BREAK CHARACTER (IMAGE ALPHA)
/
ODTSNL	NOP			/START NEW LINE
	JMS	RFAN		/READ COMMAND LINE  & FETCH FIRST NAME
	LAC	FANM		/TEST FOR NAME SIZE ERROR
	SZA
	JMP	ODTCX1
	LAC	FANM+1		/NAME SIZE ERROR -- IF ZERO
	SNA			/LENGTH NAME & ALTMODE BREAK
	JMP	.+4		/(I.E., ZERO LENGTH LINE), TERMINATE
ODT101	JMS	ERR1		/ODT, OTHERWISE ERR 101
	MES101
	JMP	ODTRSL
	LAC	FANB
	SAD	(175)
	SKP
	JMP	ODT101
	LAC	ODTX1		/ZERO LENGTH LINE, TERMINATE
	SAD	ODTBSE		/ODT, UNLESS ZERO LENGTH ODT.
	JMP	ODT101
	JMP	ODTTTL
ODTCX1	LAC	FANB		/BREAK FOLLOWING FIRST NAME MUST
	SAD	(072)		/BE A COLON--ERROR IF NOT.
	JMP	ODTSN1		/  EQUAL SIGN, ERR 107
	SAD	(075)		/  OTHER, ERR 108
	JMP	.+4
	JMS	ERR1
	MES108
	JMP	ODTRSL
	JMS	ERR1
	MES107
	JMP	ODTRSL
/
ODTFAN	JMS	FAN		/FETCH ANOTHER NAME
	LAC	FANM		/ERR 101 IF 0 OR 7 CHAR NAME
	SNA
	JMP	ODT101
ODTSN1	LAC	RCLBSE		/SCAN RCL & LDT FOR NAME
	JMS	LDTSCN
	SMA
	JMP	ODTS1A
	LAC	FANI		/NOT FOUND--SET EXTERNAL NAME
	XOR	(002)		/BIT (16) IN FETCHED NAME INDICATOR
	DAC	FANI
	JMP	ODTCX2
ODTS1A	DAC	TEMP1		/NAME FOUND--
	LAC*	TEMP1		/ ERR 106 IF NAME IS A LINK COMPONENT
	AND	(100)		/ERR 117 IF NAME OF RESIDENT ROUTINE
	SNA
	JMP	.+4
	JMS	ERR2
	MES117
	JMP	ODTRSL
	LAC*	TEMP1
	AND	(001)		/ERR 113 IF NAME IS A LINK NAME
	SZA			/ AND A LIBRARY INDICATOR WAS
	JMP	.+4		/ KEYED IN.
	JMS	ERR2		/ OTHERWISE, ACCEPT NAME AND
	MES106			/ SET INDICATOR BIT-17 (CLEAR OTHERS)
	JMP	ODTRSL		/ IN NAME FETCH INDICATOR (PREPARE
	LAC	FANI		/ FOR OTD ENTRY
	AND	(020)
	SNA
	JMP	.+4
	JMS	ERR2
	MES113
	JMP	ODTRSL
	LAC	(001)
	DAC	FANI
ODTCX2	LAC	FANB		/TEST BREAK CHARACTER FOR COLON.
	SAD	(072)		/COMMA OR ALTMODE.
	JMP	ODTLC		/ERR 103 IF OTHER
	SAD	(054)
	JMP	ODTRC
	SAD	(175)
	JMP	ODTRC
	JMS	ERR3
	MES103
	JMP	ODTRSL
ODTRC	LAC	ODTBSE		/BREAK CHARACTER IS COMMA OR ALTMODE.
	JMS	ODTSCN		/SINCE FIRST NAME MUST BE FOLLOWED
	SPA			/BY A COLON, THIS NAME MUST FOLLOW
	JMP	ODTE1		/A COLON.  A NAME MAY APPEAR ONCE
	JMS	ERR2		/ON THE RIGHT OF A COLON AND IF
	MES110			/USED LEFT OF A COLON IT MUST
	JMP	ODTRSL		/HAVE BEEN USED ON THE RIGHT FIRST.
				/THEREFORE, ERR 110 IF NAME IS
				/ALREADY IN THE ODT.
/
ODTLC	LAC	ODTX1		/COLON BREAK CHAR, I.E., NAME IS
	TAD	(-1)		/USED LEFT OF COLON -- TEST PREVIOUS
	DAC	TEMP1		/BREAK CHARACTER FOR COLON OR
	LAC*	TEMP1		/ALTMODE.  ERR 109 IF OTHER.
	SAD	(072)
	JMP	ODTCNC
	SAD	(175)
	JMP	ODTANC
	JMS	ERR1
	MES109
	JMP	ODTRSL
ODTCNC	LAC	ODTBSE		/COLON-NAME-COLON  NAME USED BOTH
	JMS	ODTSCN		/RIGHT & LEFT OF COLONS, AND
	SPA			/SHOULD NOT APPEAR AGAIN
	JMP	ODTE1		/IN THE ODT. ERR 111 IF FOUND
	JMS	ERR2
	MES111
	JMP	ODTRSL
ODTANC	LAC	ODTBSE		/ALTMODE-NAME-COLON  NAME IS USED
	JMS	ODTSCN		/LEFT OF COLON.  THEREFORE IF NAME
	SPA			/CAN BE FOUND IN THE ODT, IT MUST
	JMP	ODTE1		/BE RIGHT OF A COLON AND NOT ALSO
	TAD	(-1)		/LEFT OF A COLON (I.E., IT MUST
	TAD	ODTESZ		/NOT HAVE A COLON BREAK).  ERR 112
	DAC	TEMP1		/IF NAME IS FOUND WITH COLON BREAK.
	LAC*	TEMP1
	ISZ	TEMP1
	SAD	(072)
	SKP
	JMP	.+4
	JMS	ERR2
	MES112
	JMP	ODTRSL
	LAC	TEMP1		/NAME FOUND, BUT RIGHT OF COLON ONLY.
	JMS	ODTSCN		/CONTINUE ODT SCAN, ERR 111 IF
	SPA			/NAME IS FOUND AGAIN.
	JMP	ODTE1
	JMS	ERR2
	MES111
	JMP	ODTRSL
/
ODTE1	JMS	ODTENT		/MAKE ODT ENTRY
	LAC	FANB		/END OF LINE?
	SAD	(175)
	SKP
	JMP	ODTFAN		/NO--FETCH ANOTHER NAME
	LAC	ODTX1		/YES -- UPDATE LINE START
	DAC	ODTLSX		/INDEX AND START A NEW
	JMP	ODTSNL		/LINE
/
ODTRSL	LAC	ODTLSX	/ERROR DETECTED, RESTART LOGICAL LINE
	DAC	ODTX1
	JMP	ODTSNL
/
/ ODTENT -- SUBROUTINE TO MAKE AN OVERLAY-DESCRIPTION-TABLE ENTRY.
/	    THE INDICATOR, NAME, & BREAK CHARACTER ARE
/	    TAKEN FROM FANI, FANM, FANM+1, & FANB
/	    ODTX1 IS UPDATED TO POINT TO THE NEXT ODT ENTRY
/
ODTENT	0			/FORMAT: INDICATOR
	LAC	FANI		/         NAME
	JMS	ODTENS		/         NAME
	LAC	FANM		/         ZERO
	JMS	ODTENS		/         BREAK
	LAC	FANM+1
	JMS	ODTENS
	CLA
	JMS	ODTENS
	LAC	FANB
	JMS	ODTENS
	JMP*	ODTENT
/
ODTENS	0
	DAC*	ODTX1
	ISZ	ODTX1
	JMP*	ODTENS
/
/ ODTSCN -- SUBROUTINE TO SCAN THE OVERLAY-DESCRIPTION-TABLE
/	    FOR THE NAME CONTAINED IN FANM & FANM+1.  THE
/	    SCAN START INDEX IS TAKEN FROM AC.  IF NAME
/	    IS FOUND, THE LDT ENTRY INDEX IS LEFT IN AC.
/	    IF NOT FOUND, AC IS SET TO -1.
/             TEMP1 IS USED TO SCAN ENTRIES
/             TEMP2 IS USED TO SCAN WITHIN ENTRIES
/
ODTSCN	0
ODTSC1	SAD	ODTX1		/TEST FOR END OF TABLE
	JMP	ODTSC3
	DAC	TEMP1
	DAC	TEMP2
	ISZ	TEMP2		/COMPARE TWO WORDS
	LAC*	TEMP2
	SAD	FANM
	SKP
	JMP	ODTSC2		/FIRST WORD, NO MATCH
	ISZ	TEMP2
	LAC*	TEMP2
	SAD	FANM+1
	SKP
	JMP	ODTSC2		/SECOND WORD, NO MATCH
	LAC	TEMP1		/NAME MATCH, EXIT WITH AC CONTAINING THE
	JMP*	ODTSCN		/INDEX OF ENTRY WITH MATCHING NAME
ODTSC2	LAC	TEMP1		/NO MATCH, AUGMENT ENTRY INDEX
	TAD	ODTESZ
	JMP	ODTSC1
ODTSC3	LAW	-1		/NOT FOUND, EXIT WITH AC=-1
	JMP*	ODTSCN
/
	.EJECT
ODTTTL	LAC	ODTX1	/END OF ODT, START TTL
	DAC	TTLBSE
	DAC	TTLX1
	JMP	TTLSNL
/
/ PROCESS ODT TO BUILD "TRUNK-TO-TWIG LISTS" (TTL'S).
/ ONE LIST FOR EACH SET OF "LINKS WITH SOME COMMON CORE".
/ EACH LIST BEGINS WITH A LINK THAT IS NOT DEFINED AS OVERLAYING
/ ANOTHER LINK (TRUNK), FOLLOWED BY LINKS THAT ARE DEFINED AS 
/ BOTH OVERLAYING AND OVERLAYED (IF ANY), AND ENDING WITH
/ A LINK THAT IS NOT DEFINED AS OVERLAYED BY ANOTHER LINK (TWIG).
/ TTL ENTRY FORMAT (3 WDS):
/    INDICATOR -- SAME AS IN LDT
/    LINK NAME -- SAME AS IN LDT
/ EACH LIST IS TERMINATED BY ONE WORD SET TO -1
/
TTLSNL	LAW	-1	/START NEW LIST -- SET POINTER TO -1
	DAC	TTLPNT
	LAC	ODTBSE	/SET TTLX2 TO POINT TO FIRST ODT ENTRY
	DAC	TTLX2
TTLFO1	LAC	TTLX2	/FETCH ODT ENTRY PER TTLX2
	JMS	TTLFOE
	LAC	TTLOEN	/BLANK (ZERO) NAME?
	SZA
	JMP	TTLE1	/NO -- ENTER INDICATOR AND NAME IN TTL
	LAC	TTLX2	/YES -- TEST FOR END OF ODT.  IF NOT, FETCH
	TAD	ODTESZ	/ANOTHER ODT ENTRY
	DAC	TTLX2	/IF END OF ODT AND THE ENTIRE ODT HAS NOT BEEN
	SAD	ODTX1	/BLANKED (ZEROED), TERMINATE THIS TLL
	SKP		/AND PROCEDE TO START ANOTHER TTL
	JMP	TTLFO1	/IF ENTIRE ODT HAS BEEN BLANKED (POINTER=-1)
	LAC	TTLPNT	/ALL TTL'S HAVE BEEN MADE.
	SMA
	JMP	TTLTRM
	JMP	TTLLTB
/
TTLE1	LAC	TTLOEI	/NON-BLANK  NAME FOUND -- ENTER INDICATOR
	JMS	TTLENT	/AND NAME IN TTL
	LAC	TTLOEN
	JMS	TTLENT
	LAC	TTLOEN+1
	JMS	TTLENT
/
TTLSP1	LAC	TTLX2	/SET POINTER IN ODT, SET ODT ENTRY
	TAD	(003)	/INDEX IN POINTER, AND AUGMENT ODT INDEX
	DAC	TEMP1
	LAC	TTLPNT
	DAC*	TEMP1
	LAC	TTLX2
	DAC	TTLPNT
	TAD	ODTESZ
	DAC	TTLX2
	LAC	TTLOEB	/SEARCH FOR AN OVERLAYING LINK.  IF A 
	SAD	(072)	/COLON BREAK CHAR, AN OVERLAYING LINK
	JMP	TTLFO1	/FOLLOWS IN ODT.  OTHERWISE, REMAINDER
	LAC	TTLOEN	/ODT MUST BE SEARCHED.
	DAC	TEMP3
	LAC	TTLOEN+1
	DAC	TEMP4
TTLOS1	LAC	TTLX2	/SCAN ODT FOR NAME IN TEMP3 & TEMP4
	SAD	ODTX1
	JMP	TTLTRM	/NOT FOUND, TERMINATE TTL & BLANK NAME
	JMS	TTLFOE
	LAC	TTLOEN
	SAD	TEMP3
	SKP
	JMP	TTLOS2
	LAC	TTLOEN+1
	SAD	TEMP4
	JMP	TTLSP1	/NAME FOUND, SET POINTER IN ODT AND 
			/SEARCH FOR ANOTHER OVERLAYING LINK.
TTLOS2	LAC	TTLX2
	TAD	ODTESZ
	DAC	TTLX2
	JMP	TTLOS1
/
TTLTRM	LAW	-1	/TERMINATE A TTL
	JMS	TTLENT
/
TTLBE1	LAC	TTLPNT	/SAVE POINTER-1 (TO FETCH PREVIOUS
	DAC*	(10)	/BREAK CHAR), BLANK (ZERO) NAME IN ODT
	TAD	(-1)	/ENTRY INDICATED BY POINTER, AND NEW
	DAC	TEMP1	/POINTER FROM BLANKED ODT ENTRY.
	DZM*	10
	DZM*	10
	LAC*	10
	DAC	TTLPNT
/
TTLBE2	LAC*	TEMP1	/SCAN PREVIOUS BREAK CHARACTERS TIL A
	SAD	(072)	/COLON OR ALTMODE IS FOUND.
	JMP	TTLBE3
	SAD	(175)
	JMP	TTLBE3
	LAC	TEMP1
	TAD	ODTMES
	DAC	TEMP1
	JMP	TTLBE2
/
TTLBE3	LAC	TEMP1	/SCAN ODT FROM NAME FOLLOWING COLON OR
	TAD	(001)	/ALTMODE THRU A NAME TERMINATED BY COLON
	DAC	TTLX2	/OR ALTMODE FOR A NON-BLANK NAME.  IF NOT
TTLBE4	JMS	TTLFOE	/FOUND, FOLLOW POINTER BACK TO BLANK THE
	LAC	TTLOEN	/NAME OF THE LINK OVERLAYED BY THIS
	SZA		/LINK OR GROUP OF LINKS.
	JMP	TTLSNL	/IF FOUND, START NEW LIST
	LAC	TTLOEB
	SAD	(072)
	JMP	TTLBE5
	SAD	(175)
	JMP	TTLBE5
	LAC	TTLX2
	TAD	ODTESZ
	DAC	TTLX2
	JMP	TTLBE4
/
TTLBE5	LAC	TTLPNT
	SMA
	JMP	TTLBE1
	JMP	TTLSNL
/
/ TTLFOE -- SUBROUTINE TO FETCH THE ODT ENTRY WHOSE INDEX IS IN AC.
/           THE ENTRY IS LEFT IN THE FIVE FOLLOWING REGISTERS:
/
TTLOEI	0	/INDICATOR
TTLOEN	.BLOCK 2	/NAME
TTLOEP	0	/POINTER
TTLOEB	0	/BREAK CHAR
/
TTLFOE	0
	TAD	(-1)
	DAC*	(10)
	LAC	ADR5
	DAC*	(11)
	LAW	-5
	DAC	TTLFOC
TTLFOL	LAC*	10
	DAC*	11
	ISZ	TTLFOC
	JMP	TTLFOL
	JMP*	TTLFOE
/
TTLFOC	0
/
/ TTLENT -- SUBROUTINE TO ENTER THE WORD IN AC IN TTL
/
TTLENT	0
	DAC*	TTLX1
	ISZ	TTLX1
	JMP*	TTLENT
/
	.EJECT
/ RFAN -- SUBROUTINE TO READ A COMMAND LINE (LOGICAL) AND
/	  FETCH THE FIRST NAME. I.E. TO SET THE FOUR
/	  FOLLOWING WORDS. THE BREAK CHARACTER IS LEFT IN AC.
/		FANI	INDICATOR
/		FANM	6-SIX BIT CHARACTER NAME (TWO WORDS)
/		FANM+1
/		FANB	BREAK CHARACTER (TERMINATING NAME)
/	  INDICATOR BITS SET AS FOLLOWS:
/		BIT-14 USER FILE
/		BIT-13 USER LIBRARY
/		BIT-12 SYSTEM LIBRARY
/	NAME IS RIGHT JUSTIFIED, LEFT FILLED WITH ZEROS.
/	FANM IS SET ZERO TO INDICATE A NAME LENGTH ERROR.
/	FANM+1 IS SET: 0 FOR ZERO LENGTH NAME
/	FANM+1 IS SET -1 FOR LENGTH GREATER THAN SIX CHAR
/
FANI	0		/FILE SOURCE INDICATOR
FANM	.BLOCK	2	/FILE NAME BUFFER
FANB	0		/BREAK CHAR BUFFER
CBUF	.BLOCK	42	/COMMAND BUFFER (80 CHARACTERS)
/
RFAN	0
	JMS	CRTN	/RETURN CARRIAGE
	JMS	TYPE	/TYPE ANGLE BRACKET
	CAGB
	JMS	RFRD	/READ COMMAND LINE (PHYSICAL LINE)
	JMS	FAN	/FETCH FIRST NAME
	JMP*	RFAN	/EXIT
/
CAGB	.ASCII	/>/<175>
CHYP	.ASCII	/-/<175>
/
RFRD	0		/SUBROUTINE TO READ A LINE AND RESET
RFRDZ	.READ	CI,2,CBUF,34	/FACX1 & FACX2 IN FAC
	.WAIT	CI
	LAC	ADR9
	DAC	FACX1
	LAC	ADR13
	DAC	FACX2
	JMP*	RFRD
/
/ FAN -- SUBROUTINE TO "FETCH A NAME". REGISTERS FANI, FANM, & FANB
/	 ARE SET AS DESCRIBED UNDER "RFAN".
/
FAN	0
	LAC	(010)		/SET INDICATOR BIT-14
	DAC	FANI		/TO INDICATE USER DEVICE SRC
	DZM	FANM
	DZM	FANM+1
	LAC	ADR14		/SETUP TO READ UP TO SIX CHARACTERS
	DAC*	(10)		/INTO FANBF THRU FANBF+5
	LAW	-7
	DAC	FANX1
FAN1	JMS	FAC		/FETCH A CHARACTER
	SAD	(043)		/TEST FOR LIB INDICATOR (#)
	JMP	FAN5
	SAD	(072)		/BREAK CHARACTERS TEST --
	JMP	FAN2		/COLON
	SAD	(054)
	JMP	FAN2		/COMMA
	SAD	(075)
	JMP	FAN2		/EQUAL SIGN
	SAD	(057)
	JMP	FAN2		/SLASH
	SAD	(175)
	JMP	FAN2		/ALTMODE
	AND	(077)		/MASK TO SIX-BIT
	DAC*	10		/SAVE CHAR
	ISZ	FANX1
	JMP	FAN1
	DAC	FANB		/NAME TOO LONG--USE SEVENTH CHARACTER
	DZM	FANM		/AS BREAK CHAR, CLEAR FIRST NAME
	LAW	-1		/WORD AND SET SECOND NAME WORD
	DAC	FANM+1		/TO -1, AND EXIT
	JMP	FAN4
FAN2	DAC	FANB		/SAVE BREAK CHARACTER
	DZM*	10		/CLEAR TRAILING CHARACTERS THRU
	ISZ	FANX1		/SEVENTH (EXTRA WORD TO SAVE CODE)
	JMP	.-2
	LAC	ADR14		/SETUP TO PACK SIX CHARACTERS
	DAC*	(10)		/INTO FANM & FANM+1
	LAC	ADR18
	DAC	FANX1
	LAW	-6
	DAC	FANX2
FAN3	LAC*	FANX1		/PACK NAME
	CLL
	JMS	LCS6
	XOR*	10
	DAC*	FANX1
	LAC	FANX2
	SAD	(-4)
	ISZ	FANX1
	ISZ	FANX2
	JMP	FAN3
FAN4	LAC	FANB		/LOAD AC WITH BREAK CHARACTER
	JMP*	FAN		/AND EXIT
/
FAN5	LAC	(020)		/LIBRARY INDICATOR FOUND
	DAC	FANI		/SET INDICATOR BIT-13
	JMP	FAN1		/(CLEAR OTHER BITS)
/
FANX1	0
FANX2	0
FANBF	.BLOCK	7
/
/ FAC -- SUBROUTINE TO FETCH A CHARACTER FROM THE COMMAND
/	 BUFFER AND LEAVE IT IN AC. IF CHAR IS A CARRIAGE
/	 RETURN, ANOTHER LINE WILL BE READ. IF CHAR IS
/	 AN ALTMODE (END OF LINE), IT WILL RETURNED FOR THIS
/	 AND ALL SUCCEEDING CALLS UNTIL A NEW LINE IS READ.
/          IF CHARACTER IS A BLANK, IT WILL BE IGNORED.
/	 FACX1 & FACX2 ARE RESET WHEN A NEW LINE IS READ.
/
FAC	0
FAC0	LAC	FACX1		/TEST FOR EMPTY CHARACTER FACB
	SAD	ADR9
	JMP	FAC2
FAC1	LAC*	FACX1		/FETCH CHARACTER FROM FACB
	AND	(177)
	SAD	(040)		/IGNORE BLANKS
	JMP	FAC4
	SAD	(015)		/IF THE CARRIAGE RETURN, READ A
	JMP	FAC3		/CONTINUATION LINE, TO FETCH CHARACTER.
	SAD	(175)		/AUGMENT FACB INDEX & EXIT, UNLESS
	JMP*	FAC		/CHARACTER WAS ALTMODE, THEN
	ISZ	FACX1		/EXIT WITHOUT AUGMENTING THE
	JMP*	FAC		/FACB INDEX.
/
FAC2	LAC*	FACX2		/UNPACK FIVE CHARACTERS FROM COMMAND
	ISZ	FACX2		/BUFFER AND STORE AS 7-BIT IMAGE
	RCL
	JMS	LCS7
	DAC	FACB
	JMS	LCS7
	DAC	FACB+1
	JMS	LCS7
	AND	(170)
	DAC	FACB+2
	LAC*	FACX2
	ISZ	FACX2
	RTL
	RTL
	DAC	FACB+3
	AND	(007)
	XOR	FACB+2
	DAC	FACB+2
	LAC	FACB+3
	JMS	LCS7
	DAC	FACB+3
	JMS	LCS7
	DAC	FACB+4
	LAC	ADR15		/RESET FACB INDEX
	DAC	FACX1
	JMP	FAC1		/TO FETCH A CHAR FROM FACB
/
FAC3	JMS	TYPE		/TYPE HYPHEN TO INDICATE CONTINUATION
	CHYP			/OF IS EXPECTED.
	JMS	RFRD		/READ A NEW LINE & RESET FACX1 & FACX2
	JMP	FAC2		/TO FETCH A CHAR FROM FACB
/
FAC4	ISZ	FACX1
	JMP	FAC0
/
FACX1	0			/FACB INDEX
FACX2	0			/COMMAND BUFFER INDEX
FACB	.BLOCK	5		/FIVE CHARACTER BUFFER
/
/ ERR1, ERR2, & ERR3 -- SUBROUTINES TO OUTPUT ERROR MESSAGES.
/ EACH TAKES THE ADDRESS OF THE MESSAGE FROM THE WORD FOLLOWING
/ THE CALL (JMS).
/ ERR1  OUTPUTS A MESSAGE AND RETURNS
/ ERR2  OUTPUTS A MESSAGE, THE NAME IN FANM&FANM+1, AND RETURNS
/ ERR3  OUTPUTS A MESSAGE, THE BREAK CHAR IN FANB, AND RETURNS.
/
ERR1	0
	LAC*	ERR1
	ISZ	ERR1
	JMS	ERRTO
	JMP*	ERR1
/
ERR2	0
	LAC*	ERR2
	ISZ	ERR2
	JMS	ERRTO
	JMS	TYPE
	MES100
	LAC	FANM
	JMS	ERR6BO
	LAC	FANM+1
	JMS	ERR6BO
	JMP*	ERR2
/
ERR3	0
	LAC*	ERR3
	ISZ	ERR3
	JMS	ERRTO
	JMS	TYPE
	MES100
	LAC	FANB
	DAC	ERR6BF+2
ERR3Z	.WRITE	TO,3,ERR6BF,0
	.WAIT	TO
	JMP*	ERR3
/
ERR6BO	0	/.SIXBT OUTPUT
	DAC	TEMP1
	LAW	-3
	DAC	TEMP3
ERR6BL	LAC	TEMP1
	JMS	LCS7
	DAC	TEMP2
	RAR
	DAC	TEMP1
	LAC	TEMP2
	AND	(077)
	SNA
	JMP	ERR6BA
	XOR	(040)
	TAD	(040)
	DAC	ERR6BF+2
ERR6BZ	.WRITE	TO,3,ERR6BF,0
	.WAIT	TO
ERR6BA	ISZ	TEMP3
	JMP	ERR6BL
	JMP*	ERR6BO
/
ERR6BF	002000
	0
	0
	177
/
/
ERRTO	0
	JMS	SETBBS
	TAD	(-2)
	DAC	ERRTOW+2
	JMS	CRTN
ERRTOW	.WRITE	TO,2,XX,0
	.WAIT	TO
	JMP*	ERRTO
/
/ ZLLX -- SUBROUTINE TO TEST FOR A ZERO 
/         LENGTH LINE (ALTMODE ONLY)
/	RETURN AT JMS+1 IF YES
/	RETURN AT JMS+2 IF NO
/
ZLLX	0
	LAC	FANM
	SZA
	JMP	ZLL1
	LAC	FANM+1
	SZA
	JMP	ZLL1
	LAC	FANB
	SAD	(175)
	JMP*	ZLLX	/YES
ZLL1	ISZ	ZLLX	/NO
	JMP*	ZLLX
/
/
/ TELETYPE OUTPUT MESSAGES.  THE TWO WORDS PRECEDING EACH
/ MESSAGE ARE USED AS AN IOPS ASCII HEADER.  THE ONLY HEADER
/ REQUIREMENT FOR TTY OUTPUT IS A GREATER THAN ONE WORD-
/ PAIR COUNT.
/
MES1	.ASCII	/CHAIN V2A/<15>
MES20	.ASCII	/NAME XCT FILE/<175>
MES30	.ASCII	/LIST OPTIONS & PARAMETERS/<175>
MES32	.ASCII	/^ UNRECOGNIZED SYMBOL/<175>
MES33	.ASCII	/^ 12K PDP-9/<175>
MES50	.ASCII	/DEFINE RESIDENT CODE/<175>
MES51	.ASCII	/^ RES ROUTINE REQ'D/<175>
MES52	.ASCII	/^ LIB IND ON MAIN PROG NAME/<175>
MES60	.ASCII	/DESCRIBE LINKS & STRUCTURE/<175>
MES100	.ASCII	/ -- /<175>
MES101	.ASCII	/^ NAME LENGTH ERR/<175>
MES102	.ASCII	/^ LINK NAME USED PRV/<175>
MES103	.ASCII	/^ IMPROPER BREAK CHAR/<175>
MES104	.ASCII	/^ INTERNAL NAME REPEATED IN LINE/<175>
MES105	.ASCII	/^ EXTERNAL NAME USED PRV/<175>
MES106	.ASCII	/^ COMPONENT NAME USED AS LINK NAME/<175>
MES107	.ASCII	/^ LINK DEF WITHIN OVERLAY DESCRIPTION/<175>
MES108	.ASCII	/^ COLON MUST FOLLOW FIRST LINK NAME/<175>
MES109	.ASCII	/^ MORE THAN ONE LINK OVERLAYED/<175>
MES110	.ASCII	/^ NAME RIGHT OF COLON USED PRV/<175>
MES111	.ASCII	/^ NAME USED MORE THAN TWICE/<175>
MES112	.ASCII	/^ NAME USED LEFT OF COLON TWICE/<175>
MES113	.ASCII	/^ LIB IND ON LINK NAME/<175>
MES116	.ASCII	/^ INTERNAL NAME USED PRV/<175>
MES117	.ASCII	/^ RES ROUTINE NAME USED AS LINK NAME/<175>
MES118	.ASCII	/^ NAME USED MORE THAN ONCE/<175>
/
/
/ BANK RELOCATION ADDRESS TABLE -- EACH POSITIVE WORD CONTAINS
/ THE ADDRESS OF A TRANSFER VECTOR REQUIRING BANK BITS (EACH
/ ADDRESS ALSO REQUIRES BANK BIT INITIALIZATION).  THE TABLE
/ IS TERMINATED BY A NEGATIVE ENTRY.
/
BRTBL	RFRDZ+2
	ERR3Z+2
	ERR6BZ+2
	ERO1Z+2
	ERO2Z+2
	ERO3Z+2
	T6BNZ+2
	TMAPZ+2
	READ1+2
	PAUSZ+2
	WOB1+2
	ICIZ+2
	TRTTL
	OUTBEG
	OUTEND
	CPTVA
	ADR1
	ADR2
	ADR3
	ADR4
	ADR5
	ADR6
	ADR7
	ADR8
	ADR9
	ADR10
	ADR11
	ADR12
	ADR13
	ADR14
	ADR15
	ADR16
	ADR17
	ADR18
	ADR19
	ADR20
	-1	/BRT
	-1	/  PATCH
	-1	/    AREA
	-1		/END OF TABLE
	.EJECT
/ ALL COMMAND INPUT HAS BEEN ACCEPTED
/
/ THE OVERLAY-DESCRIPTION-TABLE, AND THE CODE REQUIRED TO GENERATE 
/ THE RCL, LDT, ODT, & TTL'S, ARE NO LONGER NEEDED -- LEAVE  
/ RCL &  LDT IN THEIR PRESENT LOW CORE POSITION AND MOVE THE TTL'S 
/ TO AS HIGH CORE AS POSSIBLE.
/
TTLLTB	LAC	ADR2	/RESTART VIA ^P IS NO LONGER POSSIBLE,
	DAC	CPTVA	/SET ^P TRANSFER ADDRESS TO EXIT IF ^P.
	LAC	TTLBSE		/CHANGE TTLBSE & TTLX1 AND
	TAD	(-1)		/SETUP TO MOVE TTL'S
	DAC*	(10)
	LAC	TTLX1
	JMS	TWC
	TAD	TTLBSE
	DAC	TEMP1
	LAC	TRTTL
	TAD	(001)
	TAD	TEMP1
	DAC	TTLBSE
	TAD	(-1)
	DAC*	(11)
	LAC	TRTTL
	DAC	TTLX1
	JMS	CRTN
	JMP	MOVTTL
TRTTL	.	/THE TOP OF THE RELOCATED TTL'S WILL OVERLAY 
		/THIS WORD.
/
/^^^^^^^^^^^^^^^^^^^^^ CORE PRECEDING THIS ^^^^^^^^^^^^^^^^^^^^^
/^^^^^^^^^^^^^^^^^^^ LOCATION IS WRITTEN OVER ^^^^^^^^^^^^^^^^^^
/
MOVTTL	LAC*	10	/MOVE TTL'S
	DAC*	11
	ISZ	TEMP1
	JMP	MOVTTL
/
	.EJECT
/ CONSTRUCT THE PRELIMINARY LINK TABLE (LTB) BY SCANNING THE
/ TTL'S AND GENERATING AN LTB ENTRY FOR EACH NEW ROUTINE (LINK
/ OR LINK COMPONENT) NAME.  THE ONLY PERMANENT ENTRY ELEMENT IN THE
/ PRELIMINARY LTB IS THE LINK NUMBER.
/
/ LINK TABLE ENTRY FORMATS:
/
/   PRELIMINARY	FINAL		WHEN LINK
/   CONSTRUCTION	CONSTRUCTION	IS RESIDENT
/
/     IND. (TTL)	  0		  0
/     LINK-	  DAC  BUF	  DAC  BUF
/        NAME	  JMS* (EXU)	  LAC  .-2
/     COMPONENT	  DAC* .+3	  DAC* .+3
/        NAME	  LAC  BUF	  LAC  BUF
/     R-FLAG	  JMP* .+2	  JMP* .+2
/     0		  ENTRY		  ENTRY
/     0		  ENTRY+1		  ENTRY+1
/     LINK #	  LINK #		  LINK #
/     INDEX	  MIN ADR		  MIN ADR
/     0		  MAX ADR		  MAX ADR
/
/ IND AND LINK NAME ARE
/ USED ONLY IN THE FIRST
/ LDT ENTRY FOR EACH LINK
/ (ZEROED IN OTHERS)
/
/ R-FLAG IS INITIALLY ZERO
/ AND IS SET NON-ZERO WHEN 
/ LINK IS RELOCATED & OUTPUT.
/
/ INDEX -- THE LDT INDEX OF
/ THE FIRST COMPONENT OF THIS
/ LINK.  ZERO IF LINK NAME AND
/ LONE COMPONENT ARE THE SAME
/ (NO LINK DEFINITION).
/
/ DEFINITION: SCL -- SINGLE COMPONENT LINK.  A LINK WHOSE SINGLE
/ COMPONENT HAS THE SAME NAME.  I.E., A LINK THAT IS NOT DEFINED
/ IN THE LINK DEFINITION TABLE (LDT).
/
	LAC	TTLBSE	/INITIALIZE LTB
	DAC	LTBX2
	TAD	(-1)
	DAC	LTBTOP
	DAC	LTBBSE
	DZM	LNKNUM
	LAC	TTLBSE	/SETUP FOR TTL SCAN (LTBX3)
	JMP	CPLT1A
CPLT1	LAC	LTBX3	/FETCH NEXT TTL ENTRY
	TAD	TTLESZ
CPLT1A	DAC	LTBX3
	JMS	FETTTL
	LAC	TTLETY	/END OF TTL?
	SMA
	JMP	CPLT2	/NO -- SCAN LTB FOR LINK NAME
	LAC	LTBX3	/YES -- END OF LAST TTL?
	SAD	TTLX1
	JMP	DLTBL	/YES -- DETERMINE SIZE AND LOCATION 
			/       AT EXECUTE TIME
	TAD	(001)	/NO -- AUGMENT LTBX3 AND FETCH
	JMP	CPLT1A	/      NEXT TTL ENTRY
CPLT2	LAC	LTBTOP	/SETUP FOR LTB SCAN (LTBX2)
	DAC	LTBX2	/(SCAN FROM TOP TO BASE)
CPLT3	LAC	LTBX2	/INDEX AT BASE?
	SAD	LTBBSE
	JMP	CPLT4	/YES -- NAME NOT FOUND, ADD ENTRY AT BASE
	TAD	LTBMES	/NO -- DECREMENT INDEX AND FETCH NEXT
	DAC	LTBX2	/LTB ENTRY
	JMS	FETLTB
	LAC	LTBETY+1	/NAME FOUND?
	SAD	TTLETY+1
	SKP
	JMP	CPLT3	/NO -- FETCH NEXT LTB ENTRY
	LAC	LTBETY+2
	SAD	TTLETY+2
	JMP	CPLT1	/YES -- FETCH NEXT TTL
	JMP	CPLT3	/NO -- FETCH NEXT LTB ENTRY
/
CPLT4	LAC	TTLETY+1	/SETUP LTB ENTRY FOR A SCL (SINGLE COMPONENT 
	DAC	LTBETY+1	/LINK).
	DAC	LTBETY+3
	LAC	TTLETY+2
	DAC	LTBETY+2
	DAC	LTBETY+4
	DZM	LTBETY+5
	DZM	LTBETY+6
	DZM	LTBETY+7
	ISZ	LNKNUM
	LAC	LNKNUM
	DAC	LTBETY+10
	DZM	LTBETY+11
	DZM	LTBETY+12
	LAC	TTLETY	/TEST FOR A SCL
	DAC	LTBETY
	AND	(001)
	SZA
	JMP	CPLT5	/NO -- ENTER EXTERNAL COMPONENTS IN LTB
	LAC	LTBBSE	/YES -- MAKE SINGLE LTB ENTRY
	TAD	LTBMES
	DAC	LTBBSE
	JMS	SETLTB
	JMP	CPLT1
/
CPLT5	LAC	LDTBSE	/SCAN LDT FOR LINK NAME
	DAC	LTBX4
CPLT6	LAC	LTBX4
	JMS	FETLDT
	LAC	LTBX4
	TAD	LDTESZ
	DAC	LTBX4
	LAC	LDTETY+1
	SAD	LTBETY+1
	SKP
	JMP	CPLT6
	LAC	LDTETY+2
	SAD	LTBETY+2
	SKP
	JMP	CPLT6
	LAC	LTBX4	/NAME FOUND, SET INDEX OF FIRST COMPONENT 
	DAC	LTBETY+11	/IN LTB ENTRY
CPLT7	JMS	FETLDT	/FETCH COMPONENT NAME
	LAC	LDTETY	/EXTERNAL NAME?
	AND	(002)
	SNA
	JMP	CPLT1	/NO -- END OF ENTRIES FOR THIS LINK
	LAC	LDTETY+1	/YES -- SET COMPONENT NAME IN LDT ENTRY
	DAC	LTBETY+3
	LAC	LDTETY+2
	DAC	LTBETY+4
/
	LAC	LTBBSE	/ADD LTB ENTRY
	TAD	LTBMES
	DAC	LTBBSE
	JMS	SETLTB
	DZM	LTBETY	/BLANK (ZERO) IND, NAME, AND INDEX
	DZM	LTBETY+1
	DZM	LTBETY+2
	DZM	LTBETY+11
	LAC	LTBX4
	TAD	LDTESZ
	DAC	LTBX4
	JMP	CPLT7
/
/ DETERMINE THE LIMITS OF CORE THAT WILL BE OCCUPIED
/ BY THE LINK TABLE (LOW CORE FOR FOREGROUND, HIGH CORE FOR
/ BACKGROUND), SET THE MAX (BGD) OR MIN (FGD) REGISTER 
/ REQUIRED, ADJUST LOAD LIMIT 'LDLMT'.
/(THE LINK TABLE INCLUDES A ONE WORD BUFFER BELOW LTBBSE OR LTBBAD)
/
DLTBL	LAC	BFFLAG	/BGD OR FGD CHAIN?
	SZA
	JMP	DLTBLF
	LAC	LDLMT	/BGD CHAIN -- THE LINK TABLE WILL RESIDE IN 
	DAC	LTBTAD	/DECREASING CORE FORM LDLMT
	DAC	MAXREG	/SET MAX REG REQ
	LAC	LTBBSE
	JMS	TWC
	TAD	LTBTOP
	JMS	TWC
	TAD	LDLMT
	DAC	LTBBAD
	TAD	(-2)	/(INCLUDE AC BUFFER BELOW LTBBSE)
	DAC	LDLMT	/UPDATE LDLMT
	DAC	CLT
	JMP	CGST
/
DLTBLF	LAC	LTBBSE	/FGD CHAIN -- LINK TABLE WILL RESIDE IN INCREASING
	JMS	TWC	/CORE FROM LDLMT2
	TAD	LTBTOP	/IF NECESSARY, LDLMT IS INCREASED TO PREVENT THE
	DAC	TEMP10	/LINK TABLE FROM CROSSING A PAGE OR BANK BOUND
	TAD	(001)
	TAD	LDLMT
	AND	OPCMSK
	DAC	TEMP11
	LAC	LDLMT
	AND	OPCMSK
	SAD	TEMP11
	JMP	.+3
	LAC	TEMP11
	DAC	LDLMT
	LAC	LDLMT	/AVIOD AUTO-INDEX REGISTERS
	AND	ADRMSK
	AND	(777760)
	SZA
	JMP	.+4
	LAC	TEMP11
	XOR	(020)
	DAC	LDLMT
	LAC	LDLMT
	DAC	MINREG	/SET MIN REG REQ
	TAD	(001)
	DAC	LTBBAD	/SET LTB LIMITS
	TAD	TEMP10
	DAC	LTBTAD
	TAD	(001)	/UPDATE LDLMT
	DAC	LDLMT
/
/ CONSTRUCT GLOBAL SYMBOL TABLE ENTRIES FOR ALL EXTERNAL LINK
/ COMPONENT NAMES.  SYMBOLS ARE DEFINED AS POINTING TO
/ THE REGISTER THAT THE FIRST WORD OF THE CORESPONDING 
/ LINK TABLE WILL OCCUPY AT EXECUTE TIME.
/
CGST	LAC	LTBBSE	/INITIALIZE SYMBOL TABLE TO BE CONSTRUCTED
	TAD	(-1)	/IN DECREASING CORE BELOW THE LINK TABLE
	DAC	SYMBEG
	DAC	SYMEND
	LAC	LTBTAD
	DAC	TEMP5
	LAC	LTBTOP
	DAC	LTBX2
CGST1	LAC	LTBX2
	SAD	LTBBSE
	JMP	CGST2
	TAD	LTBMES
	DAC	LTBX2
	JMS	FETLTB
	LAC	LTBETY+3
	JMS	CTR50
	DAC	SYM1
	LAC	LTBETY+4
	JMS	CTR50
	DAC	SYM2
	SNA
	JMP	.+4
	LAC	SYM1
	XOR	(400000)
	DAC	SYM1
	LAC	TEMP5
	TAD	LTBMES
	DAC	TEMP5
	XOR	(500000)
	DAC	SYMDEF
	JMS	DEFSYM
	JMP	CGST1
/
CGST2	LAC	SYMEND
	DAC	SYMEB1
/
/ INITIALIZE PATCH TABLE TO BE CONSTRUCTED IN INCREASING CORE
/ FROM THE END OF THE LINK DEFINITION TABLE (LTB).  I.E., TO 
/ WRITE OVER THE OVERLAY DESCRIPTION TABLE (OTB)
/
	LAC	ODTBSE
	DAC	PTBBSE
	JMP	WRC
	.EJECT
/ NO OVERLAY DESCRIPTION -- RESIDENT CODE ONLY
/
RCO	ISZ	ROFLAG	/SET 'RESIDENT ONLY' FLAG
	LAC	(001)	/TERMINATE RCL WITH AN LDT INDICATOR
	DAC*	LDTX1	/TO STOP RESIDENT CODE SCAN
	LAC	LDTX1	/INITIALIZE PATCH TABLE TO FOLLOW THE RCL
	TAD	(001)
	DAC	PTBBSE
	LAC	TRTTL	/INITIALIZE SYMBOL TABLE TO START WHERE THE
	DAC	SYMBEG	/TTL'S WOULD HAVE STARTED IF OVERLAYS 
	DAC	SYMEB1	/EXISTED
	DZM	LTBTAD	/INDICATE ZERO LENGTH LINK TABLE.  THIS WILL
	DZM	LTBBAD	/CAUSE EXECUTE TO NOT LOAD A LINK 
			/AND TO NOT SET A T.V. IN ITS HIGHEST REG.
	JMS	CRTN	/RETURN CARRIAGE
	LAC	BFFLAG	/BGD OR FGD CHAIN?
	SZA
	JMP	RCO1
	LAC	LDLMT	/BGD CHAIN, SET MAX REG
	DAC	MAXREG
	JMP	WDXCT
RCO1	LAC	LDLMT	/FGD CHAIN, SET MIN REG
	DAC	MINREG
	JMP	WDXCT
/
	.EJECT
WRC	LAC	LDLMT	/INITIALIZE BLANK COMMON LOAD LIMIT
	DAC	LDLMT3
/
	LAC	LMFLAG	/IF MAP FLAG IS SET, TYPE:
	SNA
	JMP	WDXCT	/   LINK TABLE
	JMS	TYPE	/          XXXXX XXXXX
	MES602		/   RESIDENT CODE
	DZM	SYM1
	JMS	SYMMAP
	LAC	LTBBAD
	TAD	(-1)	/(INCL AC BUFFER IN LTB SIZE)
	DAC	SLIMFA
	LAC	LTBTAD
	DAC	SLIMLA
	JMS	SLIM
	JMS	TYPMAP
	JMS	CRTN
	JMS	TYPE
	MES603
/
/ WRITE DUMMY XCT FILE (XCU EXTENSION) IF DUMMY FILE SWITCH IS SET
/ (THIS IS TO RESERVE PRIME SPACE FOR THE XCT FILE)
/
WDXCT	LAC	DFSW	/IS SWITCH SET?
	SZA
	JMP	WXCTF	/YES -- WRITE DUMMY XCT FILE
	JMP	WXCUF	/NO -- WRITE XCU FILE
/
WDXCTR	DZM	DFSW	/DUMMY FILE WRITTEN, CLEAR SWITCH
	.INIT	RO,1,0	/AND OPEN ACTUAL XCU FILE
ERO2Z	.ENTER	RO,ROFNAM
/
/ WRITE XCU FILE
/
WXCUF	DZM	LNKNUM	/RELOCATE AND OUTPUT RESIDENT CODE
	LAC	RCLBSE
	DAC	RAOX
	JMS	RAO
	LAC	LDLMT2	/UPDATE LDLMT
	DAC	LDLMT
	LAC	SYMEND	/SYMBOL TABLE ENTRIES GENERATED BEYOND THIS
	DAC	SYMEB1	/POINT ARE DELETED AFTER RELOCATION OF
			/EACH LINK.
/
	LAC	ROFLAG	/SKIP RELOCATION OF LINKS IF 'RESIDENT ONLY'
	SNA
	JMP	REL1
/
	LAC	LDLMT2	/SETUP BLANK COMMON LIMIT FOR RESIDENT ONLY
	DAC	LDLMT3
	JMP	REL70
/
	.EJECT
/ RELOCATION LOOP --
/ THE TTL'S AND THE LTB HAVE BEEN ORDERED SUCH THAT AS A
/ LINK NAME IF FETCHED FROM THE TTL'S AND THE LTB IS SCANNED
/ FOR THAT NAME, THE NAMES PASSED ARE NAMES OF LINKS THAT HAVE
/ BEEN RELOCATED AND OUTPUT AND ARE NOT OVERLAYED BY THE LINK 
/ WHOSE NAME WAS FETCHED FROM THE TTL'S.  I.E., THEY DETERMINE
/ A LOAD LIMIT FOR THE LINK WHOSE NAME WAS FETCHED FROM THE TTL'S.
/
REL1	LAC	TTLBSE	/RESET TTL SCAN INDEX (LTBX3)
	DAC	LTBX3
REL10	LAC	LTBTOP	/RESET LTB SCAN INDEX (LTBX2)
	DAC	LTBX2
REL20	LAC	LTBX3	/FETCH A TTL ENTRY
	JMS	FETTTL
	LAC	TTLETY	/END OF TTL?
	SMA
	JMP	REL30	/NO -- FETCH AN LTB ENTRY
	LAC	LTBX3	/YES -- END OF LAST TTL?
	SAD	TTLX1
	JMP	REL70	/YES -- ALL LINKS RELOCATED & OUTPUT
	TAD	(001)	/NO -- AUGMENT TTL SCAN INDEX, RESET LTB
	DAC	LTBX3	/      SCAN INDEX, AND CONTINUE SCANNING
	JMP	REL10
/
REL30	LAC	LTBX2	/FETCH NEXT LTB ENTRY
	TAD	LTBMES
	DAC	LTBX2
	JMS	FETLTB
	LAC	LTBETY+1	/SKIP ENTRY IF BLANK LINK NAME
	SNA
	JMP	REL30
	SAD	TTLETY+1	/DO LINK NAMES (TTL & LTB) MATCH?
	SKP
	JMP	REL40	/NO -- UPDATE LOAD LIMIT
	LAC	LTBETY+2
	SAD	TTLETY+2
	JMP	REL50	/YES -- RELOCATE AND OUTPUT UNLESS R-FLAG 
REL40	LAC	BFFLAG	/BGD OR FGD CHAIN?
	SZA
	JMP	REL42
	LAC	LTBETY+11	/BGD -- UPDATE LDLMT
	JMS	TWC
	TAD	LDLMT
	SPA
	JMP	REL30
	LAC	LTBETY+11
	TAD	(-1)
	DAC	LDLMT
	JMP	REL30
REL42	LAC	LDLMT	/FGD -- UPDATE LDLMT
	JMS	TWC
	TAD	LTBETY+12
	SPA
	JMP	REL30
	LAC	LTBETY+12
	TAD	(+1)
	DAC	LDLMT
	JMP	REL30
/
REL50	LAC	LTBETY+5	/IS R-FLAG SET?
	SZA		/NO -- RELOCATE AND OUTPUT LINK
	JMP	REL60	/YES -- LINK HAS ALREADY BEEN RELOCATED & OUTPUT
/
	JMS	PAUSX	/PAUSE IF PAUSE FLAG IS SET -- THE PAUSE IS FOR
			/THE PREVIOUSLY OUTPUT LINK.  THIS IS DONE SO
			/THE PAUSE AFTER THE LAST LINK CAN BE DONE
			/AFTER THE XCU FILE 'CLOSE', THUS PREVENTING
			/AN ISOLATED EOF RECORD ON PAPER TAPE
			/IF MANUAL FEED AT PAUSE.
/
/ PREPARE TO RELOCATE AND OUTPUT A LINK
/
	LAC	LTBETY+10	/SET LINK NUMBER
	DAC	LNKNUM
/
	LAC	LTBETY+11	/SETUP DUMMY LDT ENTRY IF SINGLE
	SZA		/COMPONENT LINK
	JMP	REL51
	LAC	LTBETY
	DAC	DUMLDT
	LAC	LTBETY+1
	DAC	DUMLDT+1
	LAC	LTBETY+2
	DAC	DUMLDT+2
	LAC	ADR16
REL51	DAC	RAOX	/SET RAOX TO POINT TO THE FIRST
			/COMPONENT DESCRIPTION.
	LAC	LMFLAG	/TYPE LINK NAME IF
	SNA		/MAP FLAG IS SET
	JMP	REL53
	JMS	CRTN
	JMS	TYPE
	MES604
	LAC	LTBETY+1
	DAC	T6BW1
	LAC	LTBETY+2
	DAC	T6BW2
	JMS	T6BN
	JMS	CRTN
			/------------------------
REL53	JMS	RAO	/RELOCATE AND OUTPUT LINK
			/------------------------
	LAC	BFFLAG	/BGD OR FGD CHAIN?
	SZA
	JMP	REL52
	LAC	LDLMT3	/BGD -- UPDATE BLANK COMMON LIMIT
	JMS	TWC
	TAD	LDLMT2
	SMA
	JMP	REL54
	LAC	LDLMT2
	DAC	LDLMT3
	JMP	REL54
REL52	LAC	LDLMT2	/FGD -- UPDATE BLANK COMMON LIMIT
	JMS	TWC
	TAD	LDLMT3
	SMA
	JMP	REL54
	LAC	LDLMT2
	DAC	LDLMT3
	JMP	REL54
/
/ SET CORE LIMITS IN ALL LTB ENTRIES FOR THE LINK JUST
/ RELOCATED AND OUTPUT.
/
REL54	LAC	BFFLAG	/BGD OR FGD CHAIN?
	SZA
	JMP	REL56
	LAC	LDLMT2	/BGD
	TAD	(+1)
	DAC	MINLAD
	LAC	LDLMT
	DAC	MAXLAD
	JMP	REL57
REL56	LAC	LDLMT2	/FGD
	TAD	(-1)
	DAC	MAXLAD
	LAC	LDLMT
	DAC	MINLAD
/
REL57	LAC	LTBX2
	JMS	FETLTB
REL55	LAC	LTBETY+5	/IS R-FLAG SET?
	SNA
	JMP	REL58	/NO -- TERMINAL ERROR
	LAC	MINLAD	/YES -- SET CORE LIMITS IN LTB ENTRY
	DAC	LTBETY+11
	LAC	MAXLAD
	DAC	LTBETY+12
	LAC	LTBX2
	JMS	SETLTB
	LAC	LTBX2
	SAD	LTBBSE
	JMP	REL60
	TAD	LTBMES
	JMS	FETLTB
	LAC	LTBETY+1
	SZA
	JMP	REL60
	LAC	LTBX2
	TAD	LTBMES
	DAC	LTBX2
	JMP	REL55
/
REL58	JMS	TYPE	/R-FLAG WAS NOT SET DURING RAO.
	MES720		/I.E., A GLOBAL DEFINITION FOR THE 
	LAC	LTBETY+3	/EXTERNAL LINK COMPONENT NAME DID NOT
	DAC	T6BW1	/EXIST. 
	LAC	LTBETY+4	/TYPE:
	DAC	T6BW2	/  "MISSING GLOBAL DEFINITION -- NAME"
	JMS	T6BN
	JMS	CRTN
	JMP	EXIT
/
REL60	LAC	LTBX3	/AUGMENT TTL SCAN INDEX
	TAD	TTLESZ
	DAC	LTBX3
	JMP	REL20
	.EJECT
/ ALL LINKS HAVE BEEN RELOCATED AND OUTPUT
/
REL70	LAC	LDLMT2
	DAC	LDLMT
	.CLOSE	RO	/CLOSE XCU FILE
	JMS	PAUSX	/PAUSE IF PAUSE FLAG IS SET
	LAW	-1	/CHANGE EXTENSION FROM XCU TO XCT
	TAD	ROFNAM+2
	DAC	ROFNAM+2
	.INIT	RO,1,0	/OPEN XCT FILE
ERO3Z	.ENTER	RO,ROFNAM
/
/ WRITE XCT FILE RECORD (LINK #377777)
/
WXCTF	LAC	(377777)
	DAC	LNKNUM
	DAC	OUTBUF+3
	LAC	(010000)
	DAC	OUTBUF
	LAC	(100000)
	DAC	OUTBUF+2
	LAC	BFFLAG	/BGD OR FGD CHAIN?
	SZA
	JMP	WXCT1
	LAC	MAX.XX	/BGD -- BASE OF BLANK COMMON
	CMA
	TAD	(002)
	TAD	LDLMT3
	DAC	LDLMT2	/SAVE BLK COM BASE IN LDLMT2
	DAC	OUTBUF+4
	DAC	MINREG	/SET MIN REG REQ
	SMA
	JMP	WXCT2
	JMS	TYPE	/MIN REG IS NEGATIVE -- TERMINAL ERROR
	MES702
	JMP	EXIT
WXCT1	LAC	LDLMT3	/FGD -- BASE OF BLANK COMMON
	DAC	LDLMT2	/SAVE BASE OF BLK COM IN LDLMT2
	DAC	OUTBUF+4
	TAD	(-1)
	TAD	MAX.XX
	DAC	MAXREG	/SET MAX REG REQ
	TAD	MAX.XX	/CORRECT LDLMT2 IF MAX.XX=0
	SAD	MAXREG
	DAC	LDLMT2
WXCT2	LAC	MAINEP	/MAIN PROG ENTRY POINT
	DAC	OUTBUF+5
	LAC	LTBBAD	/ADDRESS OF BASE OF LTB
	DAC	OUTBUF+6
	LAC	LTBTAD	/ADDRESS OF TOP OF LTB
	DAC	OUTBUF+7
	LAC	MINREG	/MINIMUM REGISTER REQUIRED
	DAC	OUTBUF+10
	LAC	MAXREG	/MAXIMUM REGISTER REQUIRED
	DAC	OUTBUF+11
	LAC	ENVIND	/ENVIRONMENT INDICATOR
	DAC	OUTBUF+12
	LAC	DATMAP	/.IODEV INFORMATION
	DAC	OUTBUF+13
	LAC	DATMAP+1
	DAC	OUTBUF+14
	LAC	DATMAP+2
	DAC	OUTBUF+15
	LAC	DATMAP+3
	DAC	OUTBUF+16
	JMS	WOB
/
	LAC	ROFLAG	/DON'T WRITE LINK TABLE IF RESIDENT ONLY
	SZA
	JMP	WLTB3
/
/ WRITE OUT LINK TABLE
/
	LAC	LTBBAD
	DAC	LOADADR
	LAC	LTBBSE
WLTB1	DAC	LTBX2
	SAD	LTBTOP
	JMP	WLTB2
	JMS	FETLTB	/FETCH AN LTB ENTRY
			/"DAC*  LOADADR" EACH WORD OF ENTRY
/
	CLA		/ZERO
	JMS	WLTS
	LAW	-1	/DAC   BUF
	TAD	LTBBAD
	AND	ADRMSK
	DAC	TEMP10
	XOR	(040000)
	JMS	WLTS
	LAC	LTBTAD	/JMS*  (EXECUTE)
	AND	ADRMSK
	XOR	(120000)
	JMS	WLTS
	LAC	LOADADR	/DAC*  .+3
	TAD	(003)
	AND	ADRMSK
	XOR	(060000)
	JMS	WLTS
	LAC	TEMP10	/LAC   BUF
	XOR	(200000)
	JMS	WLTS
	LAC	LOADADR	/JMP*  .+2
	TAD	(002)
	AND	ADRMSK
	XOR	(620000)
	JMS	WLTS
	LAC	LTBETY+6	/ENTRY POINT
	JMS	WLTS
	LAC	LTBETY+7	/ENTRY POINT PLUS ONE
	JMS	WLTS
	LAC	LTBETY+10	/LINK NUMBER
	JMS	WLTS
	LAC	LTBETY+11	/MIN ADR
	JMS	WLTS
	LAC	LTBETY+12	/MAX ADR
	JMS	WLTS
	LAC	LTBX2
	TAD	LTBESZ
	JMP	WLTB1
/
WLTS	0
	JMS	STORE
	ISZ	LOADADR
	JMP*	WLTS
/
WLTB2	JMS	FROP	/WRITE PARTIAL RECORD
WLTB3	JMS	WNPPR	/WRITE DUMMY CODE-3 RECORD
/
	.CLOSE	RO	/CLOSE XCT FILE
	LAC	DFSW	/DUMMY XCT FILE?
	SZA		/NO -- OUTPUT COMPLETE
	JMP	WDXCTR	/YES -- WRITE XCU FILE
/
	JMS	PAUSX	/PAUSE IF PAUSE FLAG IS SET
	LAC	LMFLAG	/TYPE BLANK COMMON (.XX) BOUNDS
	SNA		/IF BLANK COMMON EXISTS AND IF
	JMP	TOCREQ	/MAP FLAG IS SET
	LAC	MAX.XX
	SNA
	JMP	TOCREQ
	JMS	CRTN
	JMS	TYPE
	MES605
	LAC	(131330)
	DAC	SYM1
	DZM	SYM2
	JMS	SYMMAP
	LAC	LDLMT2
	DAC	SLIMFA
	TAD	(-1)
	TAD	MAX.XX
	DAC	SLIMLA
	JMS	SLIM
	JMS	TYPMAP
TOCREQ	JMS	CRTN	/TYPE OUT CORE REQUIRED
	JMS	TYPE
	MES690
	DZM	SYM1
	JMS	SYMMAP
	LAC	MINREG
	DAC	SLIMFA
	LAC	MAXREG
	DAC	SLIMLA
	JMS	SLIM
	ISZ	LMFLAG
	JMS	TYPMAP
/
EXIT	.EXIT
	.EJECT
/WFCP -- SUBROUTINE TO WAIT FOR ^P AND RETURN CONTROL TO CALLER
/
WFCP	0
	LAC	CPTVA	/SAVE ^P TRANS VECTOR
	DAC	CPBUF
	LAC	ADR1	/SET ^P TV TO TRANSFER TO WFCPR 
	DAC	CPTVA	/WHEN ^P IS TYPED IN
	JMP	.	/WAIT HERE FOR ^P
WFCPR	LAC	CPBUF	/RESTORE CONTENTS OF ^P TV
	DAC	CPTVA
	JMP*	WFCP	/EXIT
/
CPTVA	START
CPBUF	0
/
/ ^P HANDLER -- TRANSFER CONTROL PER CPTVA
/
CPTYPD	JMS	CRTN
	JMP*	CPTVA
/
/ FETLDT -- SUBROUTINE TO FETCH THE LDT ENTRY WHOSE INDEX IS IN AC.
/           THE ENTRY IS RETURNED IN LDTETY THRU LDTETY+2
/
FETLDT	0
	TAD	(-1)
	DAC*	(10)
	LAC*	10
	DAC	LDTETY
	LAC*	10
	DAC	LDTETY+1
	LAC*	10
	DAC	LDTETY+2
	JMP*	FETLDT
/
/ FETTTL -- SUBROUTINE TO FETCH THE TTL ENTRY WHOSE INDEX IS IN AC.
/           THE ENTRY IS RETURNED IN TTLETY THRU TTLETY+2
/
FETTTL	0
	TAD	(-1)
	DAC*	(10)
	LAC*	10
	DAC	TTLETY
	LAC*	10
	DAC	TTLETY+1
	LAC*	10
	DAC	TTLETY+2
	JMP*	FETTTL
/
/ FETLTB -- SUBROUTINE TO FETCH THE LTB ENTRY WHOSE INDEX IS IN AC.
/           THE ENTRY IS RETURNED IN LTBETY THRU LTBETY+10
/
FETLTB	0
	TAD	(-1)
	DAC*	(10)
	LAC	ADR17
	DAC*	(11)
	LAW	-13
	DAC	TEMP1
	LAC*	10
	DAC*	11
	ISZ	TEMP1
	JMP	.-3
	JMP*	FETLTB
/
/ SETLTB -- SUBROUTINE TO SET THE LTB ENTRY WHOSE INDEX IN IN AC
/           THE ENTRY IS TAKEN FROM LTBETY TO LTBETY+10
/
SETLTB	0
	TAD	(-1)
	DAC*	(11)
	LAC	ADR17
	DAC*	(10)
	LAW	-13
	DAC	TEMP1
	LAC*	10
	DAC*	11
	ISZ	TEMP1
	JMP	.-3
	JMP*	SETLTB
/
/ TWC -- SUBROUTINE TO TWO'S COMPLIMENT AC
/
TWC	0
	CMA
	TAD	(001)
	JMP*	TWC
/
/ T6BN -- SUBROUTINE TO TYPE THE .SIXBT NAME IN T6BW1 & T6BW2
/         THRU THE FIRST BLANK OR SIXTH CHARACTER
/
T6BN	0
	LAC	T6BW1
	JMS	T6BNS
	LAC	T6BW2
	JMS	T6BNS
	JMP*	T6BN
/
T6BNS	0
	DAC	T6BX1
	LAW	-3
	DAC	T6BX3
T6BNL	LAC	T6BX1
	JMS	LCS7
	DAC	T6BX2
	RAR
	DAC	T6BX1
	LAC	T6BX2
	AND	(077)
	SNA
	JMP*	T6BN
	XOR	(040)
	TAD	(040)
	DAC	T6BNB+2
T6BNZ	.WRITE	TO,3,T6BNB,0
	.WAIT	TO
	ISZ	T6BX3
	JMP	T6BNL
	JMP*	T6BNS
/
T6BW1	0
T6BW2	0
T6BX1	0
T6BX2	0
T6BX3	0
T6BNB	002000
	0
	XX
	177
/
/ TYPE -- SUBROUTINE TO TYPE A MESSAGE
/
/ CALLING SEQUENCE:
/	JMS	TYPE
/	MESXX
/	...
/ MESXX	.ASCII	/MESSAGE/
/
/ THE TWO WORDS PRECEDING THE MESSAGE ARE USED AS AN IOPS ASCII
/ HEADER.  THE ONLY HEADER REQUIREMENTS FOR TTY OUTPUT IS A GREATER
/ THAN ONE WORD PAIR COUNT.
/
TYPE	0
	LAC*	TYPE
	JMS	SETBBS
	TAD	(-2)
	DAC	.+3
	.WRITE	TO,2,XX,0
	.WAIT	TO
	ISZ	TYPE
	JMP*	TYPE
/
/ CRTN -- SUBROUTINE TO RETURN CARRIAGE
/
CRTN	0
	JMS	TYPE
	CRTNX
	JMP*	CRTN
/
CRTNX	.ASCII	<015>
/
/ SETBBS -- SUBROUTINE TO OR BANK BITS INTO THE WORD (ADR) IN AC
/
SETBBS	0
	AND	(017777)
	XOR	BNKBTS
	JMP*	SETBBS
/
/ LCS6 -- LEFT-CIRCULAR-SHIFT SIX
/
LCS6	0
	RTL
	RTL
	RTL
	JMP*	LCS6
/
/ LCS7 -- LEFT-CIRCULAR-SHIFT SEVEN
/
LCS7	0
	RAL
	RTL
	RTL
	RTL
	JMP*	LCS7
/
	.EJECT
RCLBSE	0	/BASE OF RESIDENT CODE LIST
LDTBSE	0	/BASE OF LINK DEFINITION TABLE
LDTLSX	0	/LDT LINE START INDEX
LDTEIF	0	/LDT EXTERNAL (000)/INTERNAL (001) SUB NAME FLAG
LDTX1	0	/RCL & LDT ENTRY INDEX (POINTS TO NEXT ENTRY)
LDTESZ	3	/LDT & RCL ENTRY SIZE
ODTBSE	0	/BASE OF OVERLAY-DESCRIPTION-TABLE
ODTLSX	0	/ODT LINE START INDEX
ODTX1	0	/ODT ENTRY INDEX (POINTS TO NEXT ENTRY)
ODTESZ	+5	/ODT ENTRY SIZE
ODTMES	-5	/2S COMP OF ODT ENTRY SIZE
TTLBSE	0	/BASE OF TRUNK-TO-TWIG LISTS
TTLPNT	0	/BACK POINTER (TO REF'ING ODT ENTRY)
TTLESZ	3	/TTL ENTRY SIZE
TTLX1	0	/TTL INDEX (POINTS TO NEXT ENTRY)
TTLX2	0	/INDEX USED TO SCAN ODT
LTBTOP	0	/TOP OF LINK TABLE (ADR OF T.V. TO EXECUTE)
LTBBSE	0	/BASE OF LTB
LTBMES	-13	/2S COMPL OF LDTB ENTRY SIZE
LTBESZ	+13	/LTB ENTRY SIZE
LTBTAD	0	/LTB TOP ADR (AT EXECUTE TIME)
LTBBAD	0	/LTB BASE ADR (AT EXECUTE TIME)
LTBX2	0	/INDEX USED TO SCAN LTB
LTBX3	0	/INDEX USED TO SCAN TTL'S
LTBX4	0	/INDEX USED TO SCAN LDT
PTBBSE	0	/BASE OF PATCH TABLE (PTB)
PTBX1	0	/PTB INDEX (POINTS TO NEXT ENTRY)
PTBX2	0	/PTB SCAN INDEX
LNKNUM	0	/LINK NUMBER
MINLAD	0	/MIN LINK ADR
MAXLAD	0	/MAX LINK ADR
MINREG	0	/MIN REGISTER REQUIRED FOR OVERLAY SYSTEM TO RUN
MAXREG	0	/MAX REGISTER REQUIRED 
MAINEP	0	/ENTRY POINT TO MAIN PROG
MAX.XX	0	/SIZE OF LARGEST BLANK COMMON
BNKBTS	0	/BANK BITS (FOR BANK RELOCATION)
LDLMT	0	/LOAD LIMIT BEFORE RELOCATION (TO SUB RAO)
LDLMT2	0	/LOAD LIMIT AFTER RELOCATION (FROM SUB RAO)
LDLMT3	0	/LIMIT OF BLANK COMMON
LTBETY	.BLOCK 13	/LTB ENTRY BUFFER
TTLETY	.BLOCK 3	/TTY ENTRY BUFFER
LDTETY	.BLOCK 3	/LDT ENTRY BUFFER
DUMLDT	.BLOCK 3	/DUMMY LDT ENTRY
	000001	/(MUST FOLLOW DUMLDT)
CLT	.BLOCK 11	/CORE LIMITS TABLE (CLT)
CLTX1	0	/POINTS TO END OF CLT (TERMINATOR)
CLTX2	0	/CLT SCAN INDEX
ADR1	WFCPR
ADR2	EXIT
ADR3	DATA1
ADR4	MAPNAM
ADR5	TTLOEI-1
ADR6	MAPFAD
ADR7	DATMAP
ADR8	SKDATA
ADR9	FACB+5
ADR10	CLT
ADR11	FITRHL
ADR12	CODTAB+31
ADR13	CBUF+2
ADR14	FANBF-1
ADR15	FACB
ADR16	DUMLDT
ADR17	LTBETY-1
ADR18	FANM
ADR19	INBUF
ADR20	PSNB+2
TEMP1	0
TEMP2	0
TEMP3	0
TEMP4	0
TEMP5	0
TEMP10	0
TEMP11	0
FGDBSE	0	/FGD BASE OPTION (NEG IF NOT SET)
FGDLMT	17500	/LOW CORE LIMIT FOR FGD CHAINS
BSADR	07636	/12-BIT BOOTSTRAP ADDRESS MINUS ONE
LMFLAG	1	/LOAD MAP FLAG   ZERO:OFF::NON-ZERO:ON
GMFLAG	0	/GLOBAL MAP FLAG   ZERO:OFF::NON-ZERO:ON
SZFLAG	0	/SIZE OUTPUT FLAG   ZERO:OFF::NON-ZERO:ON
BFFLAG	0	/BGD/FGD FLAG   0:OFF::NON-ZERO:ON
ROFLAG	0	/RESIDENT ONLY FLAG   0:OFF::NON-ZERO:ON
PSFLAG	0	/PAUSE FLAG:
		/NON-ZERO -- PAUSE AFTER RELOCATION OF A LINK OR
		/THE RESIDENT CODE.  FLAG IS INCREMENTED AT EACH PAUSE.
		/ZERO -- NO PAUSE
		/NOTE: SETTING PSFLAG=-1 WILL RESULT IN A PAUSE ONLY
		/AFTER RELOCATING THE RESIDENT CODE.
/ PDP 9/15 MASKS	PDP-9	PDP-15
ADRMSK	0 /	017777	007777
OPCMSK	0 /	760000	770000
/
ROFNAM	.SIXBT	/------XCU/
DFSW	0	/DUMMY FILE SWITCH  ZERO:OFF::NON-ZERO:ON
ENVIND	0	/ENVIRONMENT INDICATOR
		/  BIT-16 SET FOR FGD, RESET FOR BGD
		/  BIT-17 SET FOR PDP-9, RESET FOR PDP-15
	.EJECT
/ RAO -- SUBROUTINE TO RELOCATE AND OUTPUT A LINK
/
/ 'RAOX' POINTS TO EITHER:
/ 1. THE FIRST RCL ENTRY WHEN RELOCATING THE RESIDENT CODE.
/ 2. THE SECOND LDT ENTRY OF A LINK DESCRIPTION WHEN RELOCATING
/    A NON-SCL LINK.
/ 3. THE DUMMY LDT ENTRY WHEN RELOCATING A SCL.
/
/ IN ANY CASE 'RAOX' POINTS TO AN TABLE ENTRY THAT DEFINES
/ A ROUTINE TO BE RELOCATED & OUTPUT (AN INDICATOR WORD
/ AND A TWO-WORD NAME).  IN THE CASE OF A MULTI-ROUTINE
/ LINK OR MORE THAN ONE RESIDENT ROUTINE, SUCCEDING ENTRIES
/ INDICATE OTHER ROUTINES TO BE RELOCATED.  IN ANY CASE,
/ NAMES OF ROUTINES ARE FETCHED AND THE ROUTINES RELOCATED
/ AND OUTPUT UNTIL AN INDICATOR WITH BIT-17 SET IS FOUND.
/
/ ROUTINES ARE RELOCATED BELOW (BGD) OR ABOVE (FGD) THE
/ ADDRESS IN 'LDLMT'.  WHEN FINISHED RELOCATING A LINK (OR THE
/ RESIDENT CODE), 'LDLMT2' POINTS TO THE WORD BELOW (BKG) OR ABOVE
/ (FGD) THE LAST ROUTINE RELOCATED & OUTPUT.
/
/ LDLMT2 IS LEFT POINTING TO THE NEXT AVAILABLE REGISTER
/ LDLMT IS NOT ALTERED
/
/ SYMBOL TABLE ENTRY CODES:
/	0 -- DELETED GLOBAL SYMBOL ENTRY
/	1 -- UNRESOLVED GLOBAL SYMBOL REFERENCE *
/	5 -- GLOBAL SYMBOL DEFINITION, OR RESOLVED
/	     GLOBAL SYMBOL REFERENCE *
/	6 -- DUMMY GLOBAL SYMBOL ENTRY  
/	     USED TO INSURE THE RELOCATION OF A
/	     LIBRARY ROUTINE. (IT MIGHT NOT BE 
/	     REFERENCED FROM WITHIN THE LINK OR
/	     RESIDENT CODE BEING RELOCATED, OR
/	     IT MAY BE ONLY REFERENCED BY ROUTINES
/	     FOLLOWING IT IN THE LIBRARY.)
/	7 -- UNDEFINED COMMON BLOCK NAME *
/	3 -- DEFINED COMMON BLOCK NAME *
/	4 -- COMMON ELEMENT REFERENCE *
/ 			* SAME AS LINKING LOADER
/
RAOX	0
/
RAO	0
	LAC	SYMEB1	/RESET END OF SYMBOL TABLE
	DAC	SYMEND
	LAC	PTBBSE	/RESET BEGINNING OF PATCH TABLE
	DAC	PTBX1
	LAC	ADR8	/SETUP SEEK DATA POINTER
	DAC	SDPTR
	LAC	ADR11	/RESET REMAINING HOLES LIST INDEX
	DAC	FITX1
	LAC	(002000)	/WRITE LINK HEADER RECORD
	DAC	OUTBUF
	LAC	(100000)
	DAC	OUTBUF+2
	LAC	LNKNUM
	DAC	OUTBUF+3
	JMS	WOB
	LAC	LDLMT
	DAC	LDLMT2
	LAC	RAOX
RAOFCN	JMS	FETLDT	/FETCH COMPONENT LDT ENTRY
	LAC	LDTETY	/NEXT LINK DESCRIPTION?
	AND	(001)
	SZA		/NO -- RELOCATE OR MAKE DUMMY SYMTAB ENTRY
	JMP	RAOCUD	/YES -- CLOSE FILE ON USER'S DEV
/
	LAC	LDTETY+1	/SET FILE NAME IN SEEK DATA AND IN
	DAC	SKDATA	/SYM1 & SYM2 (RADIX50).
	JMS	CTR50
	DAC	SYM1
	LAC	LDTETY+2
	DAC	SKDATA+1
	JMS	CTR50
	DAC	SYM2
	SNA
	JMP	.+4
	LAC	SYM1
	XOR	(400000)
	DAC	SYM1
	LAC	LDTETY	/WAS THIS ROUTINE FLAGED AS RESIDING IN
	AND	(020)	/IN A LIBRARY?
	SNA
	JMP	RAORAO	/NO -- RELOCATE AND OUTPUT
	LAC	(677777)	/YES -- MAKE DUMMY SYMBOL TABLE ENTRY
	DAC	SYMDEF	/TO INSURE LOADING DURING LIBRARY SEARCH
	JMS	DEFSYM	/EVEN IF ROUTINE IS NOT CALLED OR CALLING
	JMP	RAOAUX	/ROUTINE(S) FOLLOW THIS ROUTINE IN LIBRARY.
/
RAORAO	JMS	SYMMAP	/SET NAME IN MEMORY MAP LINE
	LAW	UD	/'SEEK' A FILE ON THE USER'S DEVICE
	JMS	SEEK
	LAW	-1
	DAC	NUFILE
	LAW	UD
	JMS	LDPROG
/
RAOAUX	LAC	RAOX	/AUGMENT RAOX
	TAD	LDTESZ
	DAC	RAOX
	JMP	RAOFCN
/
/ ALL ROUTINES FROM USER'S DEVICE HAVE BEEN RELOCATED
/
RAOCUD	.CLOSE	UD	/CLOSE FILE ON USER'S DEVICE
	JMS	VIRTUAL	/ARE THERE ANY UNRESOLVED GLOBALS?
	JMP	TROR	/NO -- TERMINATE RELOCATED OUTPUT RECORD
	LAC	SDPTR
	TAD	(003)
	DAC	SDPTR
	LAC*	DATP	/YES -- SCAN USER'S LIBRARY IF 
	TAD	(UL)	/A DEVICE IS ASSIGNED
	DAC	TEMP1
	LAC*	TEMP1
	SNA
	JMP	RAOSSL	/(NO USER'S LIB, SCAN SYS LIB)
	LAW	UL
	JMS	LIBRARY
/
	JMS	VIRTUAL	/ARE THERE ANY UNRESOLVED GLOBALS?
	JMP	TROR	/NO -- TERMINATE RELOCATED OUTPUT RECORD
RAOSSL	LAC	SDPTR	/YES -- SCAN SYS LIB
	TAD	(003)
	DAC	SDPTR
	LAW	SL
	JMS	LIBRARY
/
	JMS	VIRTUAL	/ARE THERE ANY UNRESOLVED GLOBALS?
	JMP	TROR	/NO -- TERMINATE RELOCATED OUTPUT RECORD
	JMS	TYPE	/YES -- TYPE OUT NAMES AND EXIT
	MES710
	JMS	SHTMAP	/SHORTEN MAP LINE AND SET MAP FLAG
GLBERR	JMS VIRTUAL	/ANY UNDEFINED GLOBALS?
	JMP	EXIT	/NO -- EXIT
	DZM* SYMWD1	/YES. KILL THE ENTRY IN THE SYMBOL TABLE
			/TO AVOID SEEING IT AGAIN.
	JMS NEXSYM	/PICK UP GLOBAL NAME
	DAC SYM1
	JMS NEXSYM
	DAC SYM2
	JMS	SYMMAP	/SET NAME IN MAP LINE
	JMS	TYPMAP	/TYPE MAP LINE
	JMP GLBERR	/CONTINUE UNTIL THEY'RE ALL DONE
/
TROR	JMS	FROP	/TERMINATE AND WRITE RELOCATED OUTPUT
			/RECORD.
/
/ RESOLVE UNDEFINED COMMON BLOCKS
/
	JMS	BEGSYM	/SCAN SYMBOL TABLE FOR UNDEFINED COMMON 
RCB1	SAD	SYMEND	/BLOCK ENTRIES (CODE=7). 
	JMP	OUTPTB
	LAC*	SYMWD1
	AND	(700000)
	SAD	(700000)
	JMP	RCB10
RCB2	JMS	NXNTRY
	JMP	RCB1
/
RCB10	LAC*	SYMPTR	/UNDEFINED COMMON BLOCK ENTRY FOUND
	AND	(077777)	/SAVE BLOCK SIZE
	DAC	TEMP1
	JMS	TWC	/SAVE 2'S COMPL OF SIZE AND SET BLOCK FLAG
	DAC	SIZE
	DAC	BLKFLG
	JMS	DECSPT	/GET NAME AND TEST FOR BLANK COMMON
	LAC*	SYMPTR	/DEFINITION (RADIX 50 FOR '.XX' IS 131330)
	SAD	(131330)
	JMP	RCB20
/
			/NAMED COMMON FOUND --
	DAC	SYM1	/SAVE NAME FOR MAP LINE
	SMA
	JMP	.+4
	JMS	DECSPT
	LAC*	SYMPTR
	DAC	SYM2
	JMS	SYMMAP	/ENTER NAME IN MAP LINE
	JMS	FIT	/FIND CORE
	JMS	TYPMAP	/TYPE MAP LINE IF MAP FLAG IS SET
	LAC*	SYMWD1	/COMMON BLOCK IS NOW DEFINED, CHANGE SYMBOL
	AND	(377777)	/TABLE CODE FROM 7 TO 3.
	DAC*	SYMWD1
	JMS	DECSPT	/SET BASE OF BLOCK (DEFINITION) IN
	JMS	DECSPT	/SYMBOL TABLE, AND LEAVE SYMPTR POINTING
	LAC	LOADADR	/TO THE SYMTAB CHAIN ADDRESS
	DAC*	SYMPTR
	ISZ	SYMPTR
/
	JMS	DEFCOM	/FOLLOW SYMBOL TABLE CHAIN MAKING PATCH
	JMP	RCB2	/TABLE ENTRIES (CODE=0) FOR EACH TRANSFER 
			/VECTOR  TO THIS NAMED COMMON BLOCK.
/
			/BLANK COMMON FOUND --
RCB20	LAC	TEMP1	/UPDATE LARGEST-BLANK-COMMON-BLOCK
	JMS	TWC	/IF NECESSARY.
	TAD	MAX.XX
	SPA
	CLA
	TAD	TEMP1
	DAC	MAX.XX
/
	JMS	DECSPT	/FOLLOW SYMBOL TABLE CHAIN MAKING 
	LAC*	SYMPTR	/PATCH TABLE ENTRIES (CODE=2) FOR
			/EACH TRANSFER VECTOR TO BLANK COMMON
/
	DZM*	SYMPTR	/INDICATE NO STRING (FOR FUTURE ENTRIES)
RCB21	SNA
	JMP	RCB2
	DAC	SYMPTR
	JMS	DECSPT
	LAC*	SYMPTR
	AND	(077777)
	XOR	(200000)
	DAC	PTBW1
	JMS	DECSPT
	LAC*	SYMPTR
	DAC	PTBW2
	JMS	PTBENT
	ISZ	SYMPTR
	ISZ	SYMPTR
	LAC*	SYMPTR
	AND	(077777)
	JMP	RCB21
/
/ OUTPUT PATCH TABLE
/
OUTPTB	LAC	PTBBSE	/SETUP HEADER --
	JMS	TWC	/  BITS 0-2 -- CODE=3
	TAD	PTBX1	/  BITS 3-17 -- WORD LENGTH OF PATCH TBL
	SNA
	JMP	OPTB4	/SPECIAL CASE: ZERO LENGTH PATCH TABLE
	RCR
	XOR	(300000)
	DAC	OUTBUF+2
	LAC	PTBBSE
	DAC	PTBX2
	LAC	OUTBEG
	TAD	(002)
	DAC	TEMP1
OPTB1	LAC	TEMP1
	DAC	TEMP2
	DZM	OUTBUF+3
	LAC	(002000)
	DAC	OUTBUF
OPTB2	LAC	PTBX2
	SAD	PTBX1
	JMP	OPTB3
	LAC*	PTBX2
	ISZ	PTBX2
	DAC*	TEMP2
	ISZ	TEMP2
	LAC*	PTBX2
	ISZ	PTBX2
	DAC*	TEMP2
	ISZ	TEMP2
	ISZ	OUTBUF+3
	LAC	OUTBUF
	TAD	(001000)
	DAC	OUTBUF
	SAD	(021000)
	SKP
	JMP	OPTB2
	JMS	WOB
	JMP	OPTB1
/
OPTB3	LAC	OUTBUF
	SAD	(002000)
	SKP
	JMS	WOB
	JMP*	RAO
/
OPTB4	JMS	WNPPR	/WRITE NO PATCH PATCH-RECORD
/
	JMP*	RAO	/EXIT RAO SUBROUTINE
/
/ PAUSX -- SUBROUTINE TO PAUSE AND TYPE OUT LINK 
/          NUMBER IF PAUSE FLAG IS SET
/
PAUSX	0
	LAC	PSFLAG	/IS PAUSE FLAG SET?
	SNA
	JMP*	PAUSX	/NO -- EXIT
	ISZ	PSFLAG	/YES -- TURN OFF IF 'PAUSE AFTER RESIDENT'
	NOP
	JMS	TYPE	/TYPE "PAUSE #XXX "
	MES610
	LAC	ADR20
	DAC	MAPX1
	LAC	LNKNUM
	JMS	ADROUT
	LAW	040
	DAC	PSNB+2
	LAW	043
	DAC	PSNB+3
PAUSZ	.WRITE	TO,3,PSNB,0
	JMS	WFCP	/WAIT FOR ^P
	JMP*	PAUSX	/EXIT
/
	.EJECT
/ GLEANED FROM:
/ B/F .SYSLD V1A - 21 MAY 1969 - JEAN-CLAUDE P. PROTEAU
/
/ MAIN SUBROUTINE LDPROG: LOAD A PROGRAM UNIT VIA THE 'CAL .DAT SLOT' IN
/ THE AC. NORMALLY, RETURN IS BY A JMP* LDPROG WITH THE 15-BIT STARTING
/ ADDRESS (OF THE PROGRAM UNIT JUST LOADED) IN THE AC. WHEN LOADING FROM
/ A LIBRARY FILE, IF END-OF-FILE IS ENCOUNTERED, RETURN IS A 'JMP LIBCLOS'.
/
IDX=ISZ
SET=ISZ
/
LDPROG	0		/CAL .DAT SLOT IS IN THE AC.
	AND (777
	DAC	READ1
	DAC	WAIT1
	LAC	SYMEND	/SAVE SYMEND TO BE RESTORED IF LIBRARY
	DAC	SYMEB2	/ROUTINE IS NOT RELOCATED
	DZM	DGSNB	/CLEAR DUPLICATE GLOBAL NAME INDICATION
	DZM	BLKFLG	/CLEAR BLOCK FLAG
	LAC	NUFILE
	SNA
	JMP	BUFCHK
	DZM	NUFILE
BUFMPTY	LAC	ADR19
	DAC	BUFPTR
READ1	.READ	0,0,INBUF,50
WAIT1	.WAIT	0
/ TEST THE HEADER WORDS IN THE BUFFER JUST READ INTO.
 
	LAC* BUFPTR	/PICKUP HEADER WORD 1.
	AND	(017)	/MASK TO FUNCTION BITS
	SAD	(006)	/END OF MEDIUM?
	JMP PRTEOM
	SAD (5		/END OF FILE?
	JMP LIBCLOS	/YES. ABNORMAL EXIT. CLOSE LIBRARY FILE.
	LAC* BUFPTR
	AND (60		/GET BITS 12 AND 13.
	SNA		/PARITY, CHECKSUM, BUFFER OVERFLOW?
	JMP	PLIT9
	LAC	(MES705)
	JMP	TERR
PLIT9	LAW -1000		/LAC (777000
	TAD* BUFPTR	/PICKUP WORD PAIR COUNT, SUBTRACT
	AND .-2		/1 FOR HEADER PAIR, MULTIPLY BY 2
	CLL!RAL		/TO GET WORD COUNT (IN BITS 0 THRU 8).
	DAC WRDCNT
 
/ HEADER IS OK. NOW UPDATE THE BUFFER POINTER TO 1ST DATA WORD - 1.
/ INITIALIZE CODE WORD COUNT SO 1ST WORD IS TAKEN TO BE A CODE WORD.
/ ISSUE NEXT READ.
 
	IDX BUFPTR
	LAW -1
	DAC CDWCNT
 
 
/ CHECK IF BUFFER IS EMPTY. RETURN HERE WHENEVER READY TO PROCESS
/ ANOTHER DATA WORD.
 
BUFCHK	IDX BUFPTR	/POINT TO NEXT BUFFER WORD.
	LAC WRDCNT	/IS BUFFER EMPTY?
	SNA
	JMP BUFMPTY	/YES. READ IN SOME MORE.
	TAD PLIT9		/(777000
	DAC WRDCNT	/SUBTRACT 1 FROM THE WORD COUNT.
	ISZ CDWCNT	/READY FOR NEXT CODE WORD?
	JMP GETCOD	/NO. THERE ARE MORE CODES LEFT IN OLD ONE.
	LAW -4		/YES. RESET COUNT FOR 3 CODES PER WORD.
	DAC CDWCNT
	LAC* BUFPTR	/GET NEXT CODE WORD.
	DAC CODEWD
	JMP BUFCHK
 
	.EJECT
/ UNPACK THE NEXT CODE.
 
GETCOD	LAC CODEWD	/SHIFT CODE WORD SO THAT NEXT CODE
	RTL		/IS IN LOW ORDER AC BITS (12 THRU 17).
	RTL
	RTL
	DAC CODEWD
	RAL
	AND (77
	DAC TEMP1		/SAVE CODE FOR TESTING.
 
	LAC LIBFLG	/IS LIBRARY SEARCH MODE IN EFFECT?
	SNA
	JMP LOADIT	/NO. ALL LOADER CODES ARE IN EFFECT.
 
/ WHILE LIBRARY SEARCH MODE IS IN EFFECT, EXAMINE ONLY SPECIFIC
/ LOADER CODES; IGNORE ALL OTHERS.
 
	LAC TEMP1
	SAD (001)		/CODE 1 - PROGRAM SIZE.
	JMP LOADIT
	SAD (7		/CODE 7 - SYMBOL (1ST 3 CHARS).
	JMP LOADIT
	SAD (10		/CODE 8 - SYMBOL (2ND 3 CHARS).
	JMP LOADIT
	SAD (012)		/CODE 10 - INTERNAL GLOBAL DEFINITION.
	JMP LOADIT
	SAD (27		/CODE 23 - END OF PROGRAM UNIT.
	JMP LOADIT
	SAD (13		/CODE 11 - BLOCK DATA SUBPROGRAM.
	SKP
	JMP BUFCHK	/IGNORE ALL OTHER CODES.
	DZM LIBFLG	/CLEAR SELECTIVE LOADING FLAG SO THAT
			/THIS BLOCKDATA SUBPROGRAM IN THE USER'S
			/LIBRARY WILL BE LOADED IN (A FEATURE!!)
 
/ CODE ACCEPTED FOR PROCESSING. PICKUP THE ASSOCIATED DATA WORD AND
/ JUMP TO THE APPROPRIATE DATA PROCESSING ROUTINE.
 
LOADIT	LAW -31		/-25 DECIMAL.
	TAD TEMP1
	SMA		/IS THIS CODE >24 DECIMAL?
	JMP ERR106	/YES. BAD CODE.
 
	TAD ADR12		/(CODTAB+31
	DAC TEMP1		/SAVE DISPATCH ADDRESS.
	LAC* BUFPTR	/PICKUP DATA WORD.
	JMP* TEMP1	/PROCESS IT.
 
	.EJECT
/ DISPATCH TABLE TO CODE PROCESSING ROUTINES.
/ CODES 11 THRU 18, 20 AND 21 ARE GENERATED ONLY BY FORTRAN.
 
CODTAB	JMP ERR106	/CODE 0 IS ILLEGAL.
	JMP CODE1
	JMP CODE2
	JMP CODE3
	JMP CODE4
	JMP CODE5
	JMP CODE6
	JMP CODE7
	JMP CODE8
	JMP CODE9
	JMP CODE10
	JMP CODE11
	JMP CODE12
	JMP CODE8		/CODE 13 IS PROCESSED JUST LIKE CODE 8.
	JMP CODE14
	JMP CODE15
	JMP CODE16
	JMP CODE17
	JMP CODE18
	JMP CODE19
	JMP CODE20
	JMP CODE21
	JMP CODE22
	JMP CODE23
	JMP BUFCHK	/CODE 24 (18-BIT PARAMETER ASSIGNMENT)
			/IS PASSED ON BY MACRO BUT IS IGNORED.
 
/ WHEN END OF MEDIUM IS DETECTED WHILE TRYING TO READ IN A PROGRAM,
/ TRANSFER HERE. PRINT ^P AND WAIT FOR THE USER TO TYPE CONTROL P.
 
PRTEOM	JMS	TYPE
	MES703
	JMS	WFCP	/WAIT FOR ^P
	JMP	READ1
	.EJECT
/ CODE 1 PROCESSOR: PROGRAM UNIT'S SIZE. COMPUTE LOAD ADDRESS AND
/ RELOCATION FACTORS.
 
CODE1	SPA!CMA		/ABSOLUTE OR RELOCATABLE PROGRAM?
	JMP ERR115	/ABSOLUTE.
	TAD (001)
	DAC SIZE		/SAVE 2'S COMPLEMENT OF PROGRAM SIZE.
 
/ IF IN LIBRARY SEARCH MODE, DON'T CHECK IF THIS PROGRAM UNIT CAN FIT
/ IN CORE UNTIL IT IS KNOWN THAT IT WILL BE LOADED (SEE CODE 10).
 
	LAC LIBFLG	/ARE WE IN LIBRARY SEARCH MODE?
	SZA
	JMP ABSOLU	/YES. DON'T CHECK FOR FIT YET.
 
/ SEE IF PROGRAM WILL FIT IN AVAILABLE CORE. COMPUTE THE PROGRAM'S
/ LOAD ADDRESS AND RELOCATION FACTOR.
 
	JMS FIT
	JMP BUFCHK
 
ABSOLU	DZM RELOC		/0 THE RELOCATION FACTOR.
	JMP BUFCHK	/GO TO PROCESS THE NEXT DATA WORD.
 
	.EJECT
/ CODE 2 PROCESSOR: PROGRAM'S LOAD ADDRESS.
 
CODE2	SPA
	JMP	ERR115
	TAD	RELOC
	DAC	LOADADR
	JMP BUFCHK
 
/ CODE 3 PROCESSOR: RELOCATABLE INSTRUCTION.
 
/ CODE 4 PROCESSOR: A NON-MEMORY REFERENCING INSTRUCTION, A NON-
/ RELOCATABLE MEMORY REFERENCING INSTRUCTION, AN ABSOLUTE ADDRESS,
/ OR A CONSTANT.
 
CODE3	DAC	TEMP1	/ADD IN THE RELOCATION FACTOR
	LAC	RELOC	/(MODULO 13-BITS) TO THE ADDRESS
	AND	ADRMSK	/FIELD.
	TAD	TEMP1
CODE4	JMS STORE		/STORE THE WORD IN CORE.
	IDX LOADADR
	JMP	BUFCHK
 
/ CODE 5 PROCESSOR: RELOCATABLE PROGRAM ADDRESS (VECTOR).
 
CODE5	TAD RELOC		/ADD IN THE 15-BIT
	JMP CODE4		/RELOCATION FACTOR.
 
	.EJECT
/ CODE 6 PROCESSOR: NON-COMMON VARIABLE AND ARRAY STORAGE ALLOCATION.
 
CODE6	TAD LOADADR	/INCREASE THE PRESENT LOAD ADDRESS BY THE
	DAC	LOADADR	/STORAGE SIZE.
	JMP	BUFCHK
 
 
/ CODE 7 PROCESSOR: 1ST 3 CHARACTERS OF A SYMBOL.
 
CODE7	DAC SYM1		/SAVE RADIX 50 SYMBOL CODE.
	JMP BUFCHK
 
 
/ CODE 8 PROCESSOR: LAST 3 CHARACTERS OF A SYMBOL.
/ (CODE 13 ALSO STARTS HERE).
 
CODE8	DAC SYM2		/SAVE RADIX 50 SYMBOL CODE.
	JMP BUFCHK
 
 
/ CODE 9 PROCESSOR:  GLOBAL SYMBOL REFERENCE.
/ CONTAINS UNRELOCATED ADDRESS OF A TRANSFER VECTOR, WHICH
/ HAS BEEN SETUP TO POINT TO ITSELF.
 
CODE9	TAD RELOC		/ADD RELOCATION FACTOR,
	TAD (100000)		/ADD CODE (1) FOR A VIRTUAL GLOBAL,
	JMS SCAN		/SCAN THE SYMBOL TABLE TO SEE IF THIS SYMBOL
			/HAS ALREADY BEEN ENTERED.
	JMP CDE9A		/YES.
	JMS DEFSYM	/ENTER IN SYMTAB.
	LAC	SYMDEF
	AND	(077777)
 
/ GLOBAL SYMBOL IS  IN THE SYMBOL TABLE. IF UNRESOLVED, AC HAS
/ THE ADDRESS OF THE 1ST TRANSFER VECTOR IN THE CHAIN. IF RESOLVED,
/ AC HAS TRUE ADDRESS OF THE GLOBAL. IN EITHER CASE, STORE THIS
/ ADDRESS IN THE TRANSFER VECTOR.
/
CDE9A	DAC	PTBW2	/STORE 15-BIT DEFINITION IN A
	LAC	SYMDEF	/TRANSFER VECTOR IN THE PATCH TABLE
	AND	(077777)
	DAC	PTBW1
	JMS	PTBENT
	LAC* SYMWD1	/GET 1ST WORD OF GLOBAL ENTRY.
	SPA		/IS IT STILL VIRTUAL?
	JMP BUFCHK	/NO. PROCESS NEXT DATA WORD.
 
/ SINCE THE GLOBAL IS STILL VIRTUAL, ENTER THE ADDRESS OF THE LATEST
/ TRANSFER VECTOR INTO THE SYMBOL TABLE ENTRY FOR THE GLOBAL, THEREBY
/ RECLOSING THE CHAIN.
 
	LAC SYMDEF
	DAC* SYMWD1
	JMP BUFCHK
 
/ CODE 10 PROCESSOR:  GLOBAL SYMBOL DEFINITION -- AC  CONTAINS
/ THE UNRELOCATED DEFINITION (ADDRESS) OF THE LAST SYMBOL 
/ (CODES 7 & 8) ENCOUNTERED.
/
/ 1. IF THE SYMBOL HAS NOT BEEN REFERENCED (OR DEFINED), 
/    ENTER THE DEFINITION IN THE SYMBOL TABLE.
/    IF IN LIBRARY SEARCH AND THE ROUTINE IN NOT RELOCATED, 
/    THE END OF THE SYMBOL TABLE IS RETRACTED, EFFECTIVELY 
/    DELETING ANY DEFINITIONS MADE FOR THE ROUTINE THAT WAS
/    READ THRU BUT NOT RELOCATED.
/ 2. IF THE SYMBOL HAS BEEN REFERENCED, DEFINE SYMBOL AND 
/    RESOLVE ALL REFERENCES TO IT.  IF IN LIBRARY SEARCH, 
/    SETUP TO RELOCATE FROM LIBRARY (JMS SUTLFL).
/ 3. IF THE SYMBOL HAS BEEN DEFINED AND THE DEFINITION 
/    IS A LINK TABLE ENTRY, SET THE ACTUAL DEFINITION IN
/    THE LINK TABLE ENTRY.
/ 4. IF THE SYMBOL HAS BEEN DEFINED AND THE DEFINITION IS
/    NOT A LINK TABLE ENTRY, SAVE THE SYMBOL NAME TO FLAG
/    A DUPLICATE SYMBOL DEFINITION.  IF THE ROUTINE IS REL-
/    OCATED (NOT IN LIBRARY SEARCH, OR IN LIB SEARCH AND 
/    ANOTHER DEFINITION MATCHED AN UNRESOLVED REFERENCE), THE
/    SET DUPLICATE SYMBOL FLAG WILL RESULT IN A TERMINAL
/    ERROR. 
/
CODE10	TAD RELOC		/ADD RELOCATION FACTOR.
	DAC TEMP3
	TAD (500000)	/(500000 ADD CODE FOR DEFINED GLOBAL.
	JMS SCAN		/IS THERE A GLOBAL WITH THE SAME NAME
			/ALREADY IN THE SYMBOL TABLE?
	JMP INTABLE	/YES.
/ SYMBOL NOT IN TABLE -- ENTER DEFINITION (CODE 5).
/   IF IN LIB SEARCH AND ROUTINE IS NOT RELOCATED, THE ENTRY
/   WILL BE DELETED.
/   IF IN LIB SEARCH, AND THE ROUTINE IS LOADED, ANY GLOBAL
/   SYMBOL DEFINITIONS MADE WILL BE RELOCATED WHEN CORE FOR
/   THE ROUTINE IS ALLOCATED.
	JMS DEFSYM	/ENTER SYMBOL AND ITS DEFINITION.
/
/ GLOBAL DEF DOES NOT MATCH AN UNRESOLVED GLOBAL REF --
/ IF IN LIBRARY SEARCH, TEST FOR: GLOBAL SYMBOL DEF
/ MATCHING A DUMMY GLOBAL SYMBOL REF.  IF FOUND, SET UP TO
/ LOAD FROM LIBRARY (JMS SUTLFL)
/
	LAC	LIBFLG
	SNA
	JMP	BUFCHK
	LAC	(600000)
	JMS	SCAN
	JMS	SUTLFL
	JMP	BUFCHK
/
	.EJECT
/ GLOBAL ALREADY IN SYMBOL TABLE.
 
INTABLE	DAC TEMP4		/SAVE 15-BIT DEFINITION FROM SYMTAB ENTRY.
	LAC* SYMWD1	/IS IT ALREADY DEFINED?
	SPA!CLA
	JMP	LTBCHK	/YES
	SAD LIBFLG	/NO. ARE WE IN LIBRARY SEARCH MODE?
	JMP RESOLVE	/NO. DEFINE THE GLOBAL ENTRY.
	JMS	SUTLFL
	JMP	RESOLVE
 
/ LIBFLG ON MEANS THE LOADER IS SEARCHING THRU SOME LIBRARY FOR INTERNAL
/ (DEFINED) GLOBALS WHICH ARE REQUESTED IN THE SYMBOL TABLE. JUST FOUND
/ ONE. NOW TEST IF THIS LIBRARY PROGRAM WILL FIT IN AVAILABLE CORE AND
/ SETUP THE RELOCATION FACTOR. IF IT FITS,
/ CLEAR LIBFLG TO INDICATE THAT A GLOBAL WAS RESOLVED (SEE INSTRUCTIONS
/ AT NEXLIB) AND ALSO SO THAT THE REMAINDER OF THIS PROGRAM ( UP TO THE
/ END-OF-PROGRAM CODE (23) ) WILL BE LOADED IN (INCLUDING SUBSEQUENT
/ GLOBAL DEFINITIONS).
/
SUTLFL	0		/SET UP TO LOAD FROM LIBRARY
	JMS	SYMMAP	/ENTER NAME IN MEM MAP BUFFER
	JMS FIT		/TEST IF LIBRARY PROGRAM FITS IN CORE AND
			/COMPUTE LOAD ADDRESS AND RELOC FACTOR.
	DZM LIBFLG	/CLEAR LIBRARY MODE FLAG SO REST OF PROGRAM
			/WILL BE LOADED AND TO SIGNAL THAT IT WAS.
/
	LAC	SYMPTR	/SCAN SYMBOL TABLE ENTERIES GENERATED
	DAC	TEMP10	/SINCE THIS LIB ROUTINE WAS FIRST ENCOUNTERED
	LAC	SYMWD1	/AND RELOCATE ANY GLOBAL SYMBOL DEFINITIONS
	DAC	TEMP11	/(SYMWD1 & SYMPTR WILL BE RESTORED)
	LAC	SYMEB2
	DAC	SYMWD1
SUTL1	SAD	SYMEND
	JMP	SUTL2
	LAC*	SYMWD1
	AND	(700000)
	SAD	(500000)
	SKP
	JMP	.+4
	LAC*	SYMWD1
	TAD	RELOC
	DAC*	SYMWD1
	JMS	NXNTRY
	JMP	SUTL1
SUTL2	LAC	(600000)	/SCAN FOR A DUMMY GLOBAL SYMBOL ENTRY
	JMS	SCAN	/AND KILL IF FOUND.
	DZM*	SYMWD1
	LAC	TEMP10	/(RESTORE SYMWD1 & SYMPTR)
	DAC	SYMPTR
	LAC	TEMP11
	DAC	SYMWD1
	LAC TEMP3		/ADD RELOCATION FACTOR AGAIN (TO GLOBAL
	TAD RELOC		/ADDRESS) BECAUSE IT WAS 0 PREVIOUSLY.
	DAC TEMP3
	TAD (500000)	/(500000
	DAC SYMDEF	/SAVE FOR SYMBOL DEFINITION.
	JMP*	SUTLFL
/
/ GLOBAL SYMBOL ALREADY IN TABLE AND DEFINED!
/
LTBCHK	LAC	TEMP4	/SAVE LAST DUPL NAME UNLESS ORIGINAL
	JMS	TWC	/DEFINITION POINTED TO A LINK TABLE ENTRY.
	TAD	LTBTAD	/THEN, THE NEW DEFINITION IS THE ENTRY
	SPA		/POINT TO AN EXTERNAL LINK COMPONENT.
	JMP	DUPGBL
	LAC	LTBBAD
	JMS	TWC
	TAD	TEMP4
	SPA
	JMP	DUPGBL
/
	LAC	LIBFLG	/GLOBAL SYMBOL DEFINED AS LINK TABLE ENTRY.
	SNA		/IF IN LIBRARY SEARCH, SETUP TO LOAD ONLY
	JMP	SLTEPO	/IF A DUMMY GLOBAL (CODE 6) EXISTS.
	LAC	(600000)
	JMS	SCAN
	SKP
	JMP	BUFCHK
	JMS	SUTLFL
SLTEPO	LAC	LTBTAD	/SET R-FLAG TO INDICATE THAT THIS
	JMS	TWC	/COMPONENT HAS BEEN RELOCATED, SET ENTRY
	TAD	LTBTOP	/POINT, AND ENTRY POINT PLUS ONE,
	TAD	TEMP4	/IN THE APPROPRIATE LINK TABLE ENTRY.
	TAD	(005)
	DAC	TEMP5
	ISZ*	TEMP5	/(R-FLAG)
	ISZ	TEMP5
	LAC	TEMP3	/(ENTRY)
	DAC*	TEMP5
	ISZ	TEMP5
	TAD	(001)	/(ENTRY+1)
	DAC*	TEMP5
	JMP	BUFCHK
/
DUPGBL	LAC	SYM1	/SAVE LAST DUPLICATE GLOBAL NAME
	DAC	DGSNB
	LAC	SYM2
	DAC	DGSNB+1
	JMP	BUFCHK
/
	.EJECT
/ RESOLVE THE VIRTUAL GLOBAL ENTRY IN THE SYMBOL TABLE BY FOLLOWING THE
/ CHAIN (OF TRANSFER VECTORS POINTING TO OTHER TRANSFER VECTORS) AND
/ REPLACING EACH LINK WITH THE REAL DEFINITION.
 
RESOLVE	LAC*	SYMWD1	/SAVE TRANSFER VERTOR POINTER AND MAKE
	AND	(077777)	/DEFINITION ENTRY IN SYMBOL TABLE
	DAC	TEMP1
	LAC	SYMDEF
	DAC*	SYMWD1
	AND	(077777)	/SAVE 15-BIT DEFINITION
	DAC	TEMP3
/
RVPRS1	LAC	PTBBSE	/FOLLOW CHAIN OF TRANSFER VECTORS
	DAC	PTBX2	/(IN PATCH TABLE) REPLACING POINTERS
RVPRS2	LAC*	PTBX2
	SAD	TEMP1
	JMP	.+4
	ISZ	PTBX2
	ISZ	PTBX2
	JMP	RVPRS2
	ISZ	PTBX2
	LAC*	PTBX2
	DAC	TEMP2
	LAC	TEMP3
	DAC*	PTBX2
	LAC	TEMP2
	SAD	TEMP1
	JMP	BUFCHK
	DAC	TEMP1
	JMP	RVPRS1
/ CODE 11 PROCESSOR: BLOCK DATA SUBPROGRAM DECLARATOR.
 
CODE11	JMS TWC
	DAC SIZE		/2'S COMPLEMENT OF BLOCKDATA PROGRAM SIZE.
	DAC BLKFLG	/TELL FIT THAT BLOCKDATA IS BEING LOADED.
	JMS FIT		/SEE IF BLOCK FITS IN CORE; COMPUTE LOAD
			/ADDRESS AND RELOCATION FACTOR.
	LAC RELOC		/NEW RELOCATION FACTOR STORED AS BLOCK
	DAC BLKFLG	/BASE ADDRESS IN BLOCK DATA FLAG WHICH
	JMP BUFCHK	/SETS THE FLAG NON-ZERO.
 
	.EJECT
/ CODE 12 PROCESSOR: COMMON BLOCK DEFINITION (SIZE). IF BLOCK DATA FLAG
/ IS SET, THEN THE COMMON BLOCK IS DEFINED NOW RATHER THAN AFTER ALL THE
/ LIBRARY PROGRAMS HAVE BEEN LOADED.
/
/ COMMON BLOCK MAY HAVE BEEN DEFINED BY RESIDENT CODE
/ AND REFERENCED BY A LINK.  I.E., A BLOCK MAY BE DEFINED
/ WITH BLOCK DATA FLAG OFF.
/
CODE12	DAC TEMP1		/SAVE COMMON BLOCK SIZE.
	LAC BLKFLG	/IS BLOCK DATA FLAG ON?
	SNA!CLA
	TAD (400000	/NO. ADD UNDEFINED BLOCK CODE (7).
	TAD (300000	/YES. ADD DEFINED BLOCK CODE (3).
	TAD TEMP1
	JMS SCAN		/DOES THE SYMBOL TABLE ALREADY HAVE AN
			/ENTRY FOR THIS COMMON BLOCK?
	JMP COM.IN	/YES.
 
/ NO. THIS IS THE FIRST TIME THIS COMMON BLOCK NAME HAS BEEN SEEN.
/ ENTER IT INTO THE SYMBOL TABLE.
 
	JMS DEFSYM	/ENTER INTO SYMBOL TABLE.
	LAC SYMEND	/SETUP POINTER TO COMMON CHAIN POINTER IN
	DAC COMCHN	/THE SYMTAB ENTRY.
	DZM* COMCHN	/INIT ENTRY'S POINTER TO 0 TO INDICATE
			/THERE'S NO CHAIN YET.
	JMS UPSYM		/MOVE SYMEND DOWN ONE.
	LAC SYMEND	/SETUP POINTER TO THE WORD IN THE COMMON
	DAC COMDEF	/BLOCK ENTRY WHICH HAS THE BLOCK ADDRESS.
	JMS UPSYM		/MOVE SYMEND DOWN ONE.
 
/ IF BLKFLG=0, THE BASE ADDRESS OF THIS COMMON BLOCK IS SET TO 0
/ INDICATING THAT IT IS UNDEFINED. OTHERWISE, BLKFLG CONTAINS THE
/ BASE ADDRESS OF THE COMMON BLOCK.
 
DACDEF	LAC BLKFLG	/SET COMMON BLOCK BASE ADDRESS IN THE
	DAC* COMDEF	/SYMBOL TABLE ENTRY.
	SNA		/IS BLOCK DATA MODE ON?
	JMP BUFCHK	/NO. PROCESS NEXT DATA WORD.
	DAC RELOC
	TAD TEMP1		/YES. ADD THE COMMON BLOCK SIZE
	DAC BLKFLG	/TO GET THE BASE ADDRESS OF THE NEXT
			/COMMON BLOCK.
	LAC	COMCHN	/DEFINE ALL MEMBERS OF THE COMMON CHAIN.
	DAC	SYMPTR
	LAC*	COMDEF
	DAC	LOADADR
	JMS	DEFCOM
	JMP BUFCHK
 
	.EJECT
/ AN ENTRY FOR THIS COMMON BLOCK ALREADY EXISTS IN THE SYMBOL TABLE.
 
COM.IN	DAC TEMP2		/SAVE THE BLOCK SIZE PICKED UP
			/FROM THE SYMTAB ENTRY.
	LAC SYMPTR	/SETUP POINTERS TO THE COMMON CHAIN POINTER
	TAD (-1)		/AND THE COMMON BLOCK ADDRESS.
	DAC COMCHN
	TAD (-1)
	DAC COMDEF
 
/ IF THE BLOCK HAS ALREADY BEEN DEFINED AND THE NEW SIZE IS LARGER THAN
/ THE ONE IN THE SYMBOL TABLE, THAT'S AN ERROR.
 
	LAC TEMP2		/SYMTAB BLOCK SIZE.
	CMA
	TAD TEMP1		/NEW BLOCK SIZE.
	SPA		/SKIP IF NEW SIZE > OLD SIZE.
	JMP EQLTST
 
DEFTST	LAC* COMDEF	/IS BLOCK ALREADY DEFINED?
	SZA
	JMP	LCBSZE	/YES. ERROR.
	LAC SYMDEF	/NO. REPLACE OLD SIZE WITH THE NEW ONE.
	DAC* SYMWD1
	JMP DACDEF
 
/ IF BLOCK DATA MODE IS ON, THE SIZES HAD BETTER BE THE SAME.
 
EQLTST	SAD (-1)	
	SKP!CLA		/SIZES ARE EQUAL.
	JMP LESSTH	/NOT EQUAL.
 
	SAD BLKFLG	/BLOCK DATA MODE ON?
	JMP BUFCHK	/NO. PROCESS NEXT DATA WORD.
	JMP DEFTST	/YES. EVEN THOUGH THE SIZES ARE THE
			/SAME, SINCE THIS IS BLOCK DATA MODE,
			/THE BLOCK HAD BETTER NOT BE DEFINED YET.
 
/ NEW SIZE < OLD SIZE. BLOCK DATA MODE BETTER BE OFF.
 
LESSTH	LAC BLKFLG
	SNA
	JMP BUFCHK	/OK.
	JMP	LCBSZE	/BLOCK DATA MODE ON AND THE BLOCK SIZE
			/IN THE SYMBOL TABLE IS LARGER THAN THE
			/ONE IN THIS BLOCKDATA SUBPROGRAM.
/
/ LABELED COMMON BLOCK SIZE ERROR
/
LCBSZE	JMS	TYPE	/TYPE:
	MES707		/  COMMON BLOCK SIZE ERR -- XXXXXX
	JMS	SYMMAP
	JMS	SHTMAP
	JMS	TYPMAP
	JMP	EXIT
/ CODE 13 PROCESSOR: COMMON SYMBOL DEFINITION (ADDRESS RELATIVE TO THE
/ START OF THE COMMON BLOCK). USE SAME CODE AS CODE8.
/ (RELATIVE ADDRESS TO SYM2)
 
 
/ CODE 14 PROCESSOR: COMMON SYMBOL REFERENCE DEFINITION (UNRELOCATED
/ ADDRESS OF THE TRANSFER VECTOR).
 
CODE14	TAD RELOC		/ADD THE RELOCATION FACTOR TO
	AND	(077777)	/POINT TO WHERE THE TV IS NOW
	DAC	PTBW1	/SAVE TV ADR FOR POSSIBLE PATCH TBL ENTRY
	XOR	(400000)	/SAVE TV ADR FOR POSSIBLE SYMBOL TBL ENTRY
	DAC	SYM1
	LAC* COMDEF	/0 OR THE BLOCK'S BASE ADDRESS.
	TAD SYM2		/COMMON SYMBOL'S RELATIVE POSITION.
	DAC	PTBW2	/SAVE TV FOR POSSIBLE PATCH TBL ENTRY
	DAC	SYM2	/SAVE REL POS FOR POSSIBLE SYMBOL TBL ENTRY
	LAC* COMDEF	/IS THE BLOCK DEFINED?
	SZA
	JMP	CDE14A	/YES -- MAKE PATCH TABLE ENTRY
 
/ BLOCK IS NOT DEFINED. MAKE AN ENTRY IN THE SYMBOL TABLE AND INSERT
/ THE ENTRY IN THE COMMON CHAIN.
 
	LAC* COMCHN	/POINTER TO 1ST LINK IN CHAIN.
	TAD (400000	/TACK ON CODE 4.
	DAC SYMDEF
	LAC SYMEND	/END OF SYMBOL TABLE IS WHERE THE 1ST
			/WORD OF THIS ENTRY WILL GO.
	DAC* COMCHN	/MAKE THE NEW ENTRY BECOME THE 1ST LINK.
	JMS	DEFSYM	/MAKE 3-WORD ENTRY IN THE SYMBOL TABLE.
	JMP	BUFCHK
/
CDE14A	JMS	PTBENT	/MAKE PATCH TABLE ENTRY (CODE=0) FOR
	JMP	BUFCHK	/A REFERENCE TO A DEFINED COMMON BLOCK.
 
/ CODE 15 PROCESSOR: DATA INITIALIZATION CONSTANT (1ST WORD).
 
CODE15	DAC DATA1
	JMP BUFCHK
 
 
/ CODE 16 PROCESSOR: DATA INITIALIZATION CONSTANT (2ND WORD).
 
CODE16	DAC DATA2
	JMP BUFCHK
 
	.EJECT
/ CODE 17 PROCESSOR: DATA INITIALIZATION CONSTANT (3RD WORD).
 
CODE17	DAC DATA3
	JMP BUFCHK
 
 
/ CODE 18 PROCESSOR: DATA INITIALIZATION CONSTANT DEFINITION. 
/  BITS 1-2 INDICATE DATA TYPE (NUMBER OF WORDS) AND BITS 3-17 CONTAIN
/  THE LOCATION OF THE FIRST WORD OF THE CONSTANT RELATIVE TO THE
/  LOAD ADDRESS OF OF THE ROUTINE (RELOC) OR, IF BLOCK DATA, RELATIVE
/  TO THE BASE OF THE LAST COMMON BLOCK DEFINED (* COMDEF)
CODE18	DAC TEMP1		/SAVE DATA WORD.
	LAC	BLKFLG
	SNA
	JMP	.+4
	LAC*	COMDEF
	AND	(077777)
	SKP
	LAC	RELOC
	TAD	TEMP1
	DAC	TEMP1	/DETERMINE 2S COMPLIMENT OF NUMBER
	RTL		/OF WORDS TO BE STORED FROM CODE BITS
	RTL		/IN THE ADDRESS WORD
	AND	(003)
	CMA
	SAD	(-4)
	LAW	-1
	DAC	TEMP10
	LAC	ADR3
	DAC	TEMP11
	LAC*	TEMP11
	DAC	ROPWB
	LAC	TEMP1
	JMS	ROP
	ISZ	TEMP1
	ISZ	TEMP11
	ISZ	TEMP10
	JMP	.-7
	JMP BUFCHK
 
	.EJECT
/ CODE 19 PROCESSOR: INTERNAL SYMBOL OR PROGRAM NAME
/
CODE19	AND	(400000)	/IGNORE INTERNAL SYMBOL
	SNA
	JMP	BUFCHK
	LAC	GMFLAG	/IGNORE  PROG NAME IF GLOBAL MAP FLAG
	SNA		/IS SET, OTHERWISE, SET NAME IN 
	JMS	SYMMAP	/MAP LINE
	JMP	BUFCHK
/
	.EJECT
/ CODE 20 PROCESSOR: STRING CODE (FIRST HALF) - UNRELOCATED POINTER
/ TO AN INSTRUCTION WHOSE ADDRESS PART IS TO BE REPLACED (CODE 21).
 
CODE20	TAD RELOC		/ADD RELOCATION FACTOR.
	DAC STRING	/SAVE POINTER TO THE INSTRUCTION.
	JMP BUFCHK
 
/ CODE 21 PROCESSOR: STRING CODE (SECOND HALF) - UNRELOCATED ADDRESS
/ WHICH IS TO REPLACE THE ADDRESS PART OF AN INSTRUCTION (SEE CODE 20).
 
CODE21	TAD	RELOC	/MAKE PATCH TABLE ENTRY FOR
	AND	ADRMSK	/STRING CODE MODIFICATION
	DAC	PTBW2
	LAC	STRING
	XOR	(100000)
	DAC	PTBW1
	JMS	PTBENT
	JMP BUFCHK
 
/ CODE 22 PROCESSOR -- .IODEV REQUESTS -- OR APPROPRIATE
/ BIT (OR BITS IF .IODEV ALL) INTO DATMAP
/
	JMP	.+3	/(SET ALL IF ZERO)
	LAW	-1
	JMP	CDE22A
CODE22	SNA
	JMP	CDE22D	/.IODEV ALL
	TAD	(777400)
	XOR	(777400)
	DAC	TEMP1
	.DEC
	TAD	(+18)	/ACCEPTABLE RANGE:  -19<.DAT>+54
	SPA		/IGNORE OUT OF RANGE .DAT SLOT NOS.
	JMP	BUFCHK
	TAD	(-72)
	SMA
	JMP	BUFCHK
	LAC	ADR7
	DAC	TEMP2
	LAC	TEMP1
CDE22A	SPA
	JMP	CDE22B
	TAD	(-18)
	.OCT
	ISZ	TEMP2
	JMP	CDE22A
CDE22B	DAC	TEMP3
	CLA!STL
CDE22C	RAL
	ISZ	TEMP3
	JMP	CDE22C
	DAC	TEMP3
	CMA
	AND*	TEMP2
	XOR	TEMP3
	DAC*	TEMP2
	JMP	BUFCHK
/
CDE22D	LAC	(277600)	/.IODEV ALL (1-10)
	DAC	DATMAP+1
	JMP	BUFCHK
/
/ CODE 23 PROCESSOR: END OF PROGRAM UNIT (PROGRAM START ADDRESS).
 
CODE23	DZM BLKFLG	/TURN OFF BLOCKDATA SUBPROGRAM FLAG
			/IN CASE IT WAS ON.
	TAD RELOC		/ADD RELOCATION FACTOR TO THE
	AND (77777	/PROGRAM START ADDRESS.
	DAC	TEMP1	/USE FIRST ENTRY POINT FOUND AS 
	LAC	MAINEP	/ENTRY TO MAIN PROG
	SZA
	JMP	.+3
	LAC	TEMP1
	DAC	MAINEP
	LAC	LIBFLG	/WAS A ROUTINE RELOCATED?
	SZA
	JMP	CDE23A	/NO -- DELETE ANY SYM TAB ENTRIES MADE
	JMS	TYPMAP	/YES -- TYPE MAP LINE IF MAP FLAG IS SET
	LAC	DGSNB	/WERE THERE ANY DUPL GLOBAL SYMBOL
	SZA		/NAMES DURING THIS ROUTINE?
	JMP	CDE23B	/YES -- TERMINAL ERROR
	LAC	TEMP1	/NO -- EXIT LDPROG
	JMP*	LDPROG
/
CDE23A	LAC	SYMEB2	/ROUTINE NOT LOADED, RESTORE SYMEND TO
	DAC	SYMEND	/VALUE BEFORE THIS ROUTINE WAS ENCOUNTERED
	JMP*	LDPROG
/
CDE23B	JMS	TYPE	/DUPLICATE GLOBALS FOUND -- TYPE
	MES721		/NAME OF LAST DUPLICATE FOUND AND
	LAC	DGSNB	/EXIT TO MONITOR
	DAC	SYM1
	LAC	DGSNB+1
	DAC	SYM2
	JMS	SYMMAP
	JMS	SHTMAP
	JMS	TYPMAP
	JMP	EXIT
	.EJECT
/ SUBROUTINE FIT: DETERMINE IF PROGRAM SEGMENT WILL FIT INTO AVAILABLE
/ CORE AND COMPUTE THE LOAD ADDRESS AND RELOCATION FACTOR.
 
FIT	0
	LAC	BFFLAG	/BGD OR FGD FIT?
	SZA		/BGD FIT
	JMP	FITFGD	/FGD FIT
/
/ BACKGROUND FIT REQUEST
/
	LAC	ADR10
	DAC	CLTX2
	LAC	ADR11
	DAC	FITX2
	LAC	BLKFLG	/SETUP TO EFFECTIVELY INCREASE SIZE OF
	SNA		/PROGRAM (NOT BLK DATA OR COMMON BLOCK)
	LAW	-20	/BY 20 REGISTERS TO PREVENT RELOCATING
	DAC	FITXTR	/CODE TO LOCATIONS 10-17 OF A BANK OR PAGE.
/
FIT1	LAC	FITX2	/IS THERE ANY UNUSED CORE WITHIN THIS LINK
	SAD	FITX1	/AND ABOVE LDLMT2 (HOLES) THAT HAS NOT BEEN 
			/CHECKED FOR POSSIBLE USE?
	JMP	FIT3	/NO -- RELOCATE BELOW LDLMT2
	LAC*	FITX2	/YES -- WILL ROUTINE FIT IN HOLE?
	JMS	FITX
	JMP	FIT10	/YES -- UPDATE HOLE LIMIT AND ASSIGN LOAD ADR
	ISZ	FITX2	/NO -- NEXT HOLE
	JMP	FIT1
/
FIT3	LAC	BLKFLG	/TEST FOR BLOCK DATA OR COMMON BLOCK FIT
	SZA		/REQUEST -- SKIP CORE BOUND TEST IF FOUND
	JMP	FIT5
	LAC	LDLMT2	/WILL ROUTINE FIT BELOW LDLMT2 AND WITHIN
	JMS	FITX	/THIS CORE BANK OR PAGE?
	JMP	FIT20	/YES -- UPDATE LDLMT2 AND ASSIGN LOAD ADR
	LAC	LDLMT2	/NO -- LEAVE A HOLE
	DAC*	FITX1
	ISZ	FITX1
FIT4	ISZ	CLTX2	/MOVE LDLMT2 TO THE NEXT LOWEST MEMORY BOUND
	LAC*	CLTX2
	SPA
	JMP	FIT99	/NO MORE CORE
	JMS	TWC
	TAD	LDLMT2
	SPA!SNA
	JMP	FIT4
	LAC*	CLTX2
	DAC	LDLMT2
	JMP	FIT3
/
FIT5	LAC	LDLMT2	/BLOCK DATA OR COMMON BLOCK FIT REQUEST
	DAC	FITTAD
	JMP	FIT20
/
FIT10	LAC*	FITX2	/UPDATE HOLE LIMIT
	TAD	SIZE
	DAC*	FITX2
	JMP	FIT30
/
FIT20	LAC	LDLMT2	/UPDATE LDLMT2
	TAD	SIZE
	DAC	LDLMT2
	SPA
	JMP	FIT99
/
FIT30	LAC	FITTAD	/ASSIGN LOAD ADDRESS AND RELOCATION BIAS
	TAD	SIZE
	TAD	(001)
	DAC	LOADADR
	DAC	RELOC
	LAC	LOADADR	/SET LOAD LIMITS (AND SIZE) IN MAP LINE
	DAC	SLIMFA
	LAC	FITTAD
	DAC	SLIMLA
	JMS	SLIM
/
	JMP*	FIT	/EXIT FIT ROUTINE
/
/ FITX -- SUBROUTINE TO DETERMINE WHETHER BGD ROUTINE WILL FIT IN THE
/ REMAINDER OF A PAGE OR BANK.  THE FIRST AVAILABLE REGISTER IS IN AC AT
/ ENTRY.  RETURN AT JMS+1 IF FIT.  RETURN AT JMS+2 IF NO FIT.
/
FITX	0
	DAC	FITTAD
	AND	ADRMSK
	TAD	(001)
	TAD	SIZE
	TAD	FITXTR
	SPA
	ISZ	FITX
	JMP*	FITX
FITXTR	0
/
/ FOREGROUND FIT REQUEST
/
FITFGD	LAC	SIZE	/RE-COMPLIMENT ROUTINE SIZE
	JMS	TWC
	DAC	SIZE
	LAC	CLTX1
	DAC	CLTX2
	LAC	ADR11
	DAC	FITX2
/
FFT1	LAC	FITX2	/IS THERE ANY UNUSED CORE WITHIN THIS LINK
	SAD	FITX1	/AND BELOW LDLMT2 (HOLES) THAT HAS NOT BEEN 
			/CHECKED FOR POSSIBLE USE?
	JMP	FFT3	/NO -- RELOCATE ABOVE LDLMT2
	LAC*	FITX2	/YES -- WILL ROUTINE FIT IN HOLE?
	JMS	FFTX
	JMP	FFT10	/YES -- UPDATE HOLE LIMIT AND ASSIGN LOAD ADR
	ISZ	FITX2	/NO -- NEXT HOLE
	JMP	FFT1
/
FFT3	LAC	BLKFLG	/TEST FOR BLOCK DATA OR COMMON BLOCK FIT
	SZA		/REQUEST -- SKIP CORE BOUND TEST IF FOUND
	JMP	FFT20
	LAC	LDLMT2	/WILL ROUTINE FIT ABOVE LDLMT2 AND WITHIN
	JMS	FFTX	/THIS CORE BANK OR PAGE?
	JMP	FFT20	/YES -- UPDATE LDLMT2 AND ASSIGN LOAD ADR
	LAC	LDLMT2	/NO -- LEAVE A HOLE
	DAC*	FITX1
	ISZ	FITX1
FFT4	LAC	CLTX2	/MOVE LDLMT2 TO THE NEXT HIGHEST MEMORY BOUND
	SAD	ADR10
	JMP	FIT99	/TERMINAL ERROR IF OUT OF CORE
	TAD	(-1)
	DAC	CLTX2
	LAC	LDLMT2
	JMS	TWC
	TAD*	CLTX2
	SPA!SNA
	JMP	FFT4
	LAC	BLKFLG	/AVOID AUTO INDEX REGISTERS UNLESS BLOCK DATA
	SNA		/OR COMMON BLOCK FIT REQUEST
	LAC	(020)
	TAD	(001)
	TAD*	CLTX2
	DAC	LDLMT2
	JMP	FFT3
/
FFT10	LAC*	FITX2	/UPDATE HOLE LIMIT
	DAC	FITT1
	TAD	SIZE
	DAC*	FITX2
	JMP	FFT30
/
FFT20	LAC	LDLMT2	/UPDATE LDLMT2
	DAC	FITT1
	TAD	SIZE
	DAC	LDLMT2
/
FFT30	LAC	FITT1	/ASSIGN LOAD ADDRESS AND RELOCATION BIAS
	DAC	LOADADR
	DAC	RELOC
	DAC	SLIMFA	/SET LOAD LIMITS (AND SIZE) IN MAP LINE
	TAD	SIZE
	TAD	(-1)
	DAC	SLIMLA
	JMS	SLIM
/
	LAC	SIZE	/RE-RE-COMPLIMENT ROUTINE SIZE
	JMS	TWC
	DAC	SIZE
	JMP*	FIT	/EXIT FIT ROUTINE
/
/ FFTX -- SUBROUTINE TO DETERMINE WHETHER FGD ROUTINE WILL FIT IN THE
/ REMAINDER OF A PAGE OR BANK.  THE FIRST AVAILABLE REGISTER IS IN AC AT
/ ENTRY.  RETURN AT JMS+1 IF FIT.  RETURN AT JMS+2 IF NO FIT.
/
FFTX	0
	DAC	FITT1
	AND	ADRMSK
	TAD	SIZE
	TAD	(-1)
	AND	OPCMSK
	SZA
	ISZ	FFTX
	JMP*	FFTX
/
/
FITT1	0
FITTAD	0
FITRHL	.BLOCK 11	/REMAINING-HOLES-LIST (RHL)
FITX1	0	/RHL INDEX (POINTS TO NEXT ENTRY)
FITX2	0	/RHL SCAN INDEX
/
FIT99	JMS	TYPE	/OUT OF CORE -- TYPE ERROR MESSAGE
	MES702		/AND EXIT TO MONITOR
	JMP	EXIT
/
	.EJECT
/ VIRTUAL -- SUBROUTINE TO SEARCH FOR AN UNRESOLVED GLOBAL
/            SYMBOL REFERENCE (CODES 1 OR 5) OR A DUMMY 
/	  GLOBAL SYMBOL ENTRY (CODE 6).
/
VIRTUAL	0
 
	JMS BEGSYM	/START AT BEG OF SYMTAB.
	JMS FINDCOD	/SEARCH FOR
	100000		/VIRTUAL GLOBAL ENTRY.
	JMP	.+3	/RETURN HERE IF NOT FOUND
	IDX VIRTUAL	/HERE IF FOUND.
	JMP* VIRTUAL
	JMS	BEGSYM	/START AT BEG OF SYMTAB
	JMS	FINDCOD	/SEARCH FOR
	600000		/DUMMY GLOBAL ENTRY
	JMP*	VIRTUAL	/RETURN HERE IF NOT FOUND
	IDX	VIRTUAL	/HERE IF FOUND
	JMP*	VIRTUAL
/
/ SUBROUTINE FINDCOD: STARTING AT THE CURRENT POSITION OF SYMWD1, SEARCH THRU
/ THE SYMBOL TABLE FOR AN ENTRY WHOSE CODE MATCHES THE CODE FOLLOWING THE
/ JMS FINDCOD. SKIP ON RETURN IF FOUND.
 
FINDCOD	0
 
	LAC SYMWD1	/ARE WE AT THE END OF
NEXCOD	SAD SYMEND	/THE SYMBOL TABLE?
	JMP NOFIND	/YES.
 
	LAC* SYMWD1	/GET 1ST WORD OF ENTRY IN SYMTAB.
	AND (700000)	/(700000 MASK TO CODE BITS.
	SAD* FINDCOD	/MATCH?
	JMP .+3		/YES.
 
NOMATCH	JMS NXNTRY	/MOVE POINTER TO THE NEXT ENTRY.
	JMP NEXCOD
 
FOUND	IDX FINDCOD
NOFIND	IDX FINDCOD
	JMP* FINDCOD
 
	.EJECT
/ LIBRARY SEARCH SUBROUTINE: LOAD IN ALL REQUESTED
/ LIBRARY ROUTINES.
 
LIBRARY	0
	AND (777
	DAC LIBCLOS		/SETUP LIBRARY .CLOSE.
	JMS	SEEK		/'SEEK' FILE ON DEVICE WHOSE
				/.DAT SLOT NUMBER IS IN AC
	SET NUFILE		/TELL SUBROUTINE LDPROG THAT A .SEEK
				/WAS JUST DONE.
MORLIB	SET LIBFLG		/SET LIBR MODE FLAG FOR SELECTIVE
				/LOADING.
	JMS VIRTUAL		/ARE THERE ANY UNRESOLVED GLOBALS?
	JMP LIBCLOS		/NO.
 
NEXLIB	LAC	LIBCLOS		/GET CAL TO THE CORRECT DAT SLOT.
	JMS LDPROG		/LOAD IN LIBRARY SUBPROGRAM ONLY
				/IF IT IS REQUESTED IN THE SYMBOL
				/TABLE AS A VIRTUAL GLOBAL. IF
				/LIBRARY END OF FILE IS ENCOUN-
				/TERED, CONTROL IS RETURNED TO
				/LOCATION 'LIBCLOS'. IF THE NEXT
				/PROGRAM IN THE LIBRARY WAS
				/INDEED LOADED, LIBFLG WILL BE 0
				/ON RETURN.
	LAC LIBFLG		/WAS NEXT LIBR PROGRAM READ IN?
	SZA
	JMP NEXLIB		/NO. TRY NEXT SUBPROGRAM.
	JMP MORLIB		/YES. DO ANY MORE NEED TO BE READ IN?
 
/ IF SUBROUTINE LDPROG DETECTS THE LIBRARY END-OF-FILE,
/ IT WILL RETURN CONTROL HERE.
 
LIBCLOS	.CLOSE 0			/.CLOSE THE LIBRARY FILE.
	DZM LIBFLG
	JMP* LIBRARY
 
/ SUBROUTINE DEFSYM: ENTER 3 WORDS INTO THE SYMBOL TABLE: SYMBOL
/ DEFINITION, SYMBOL 1, AND SYMBOL 2.
 
DEFSYM	0
 
	LAC SYMDEF	/1ST WORD IS THE DEFINITION.
	JMS ENTSYM
	LAC SYM1		/IF BIT0=1, THERE IS A SYM2.
	SMA
	JMP .+3		/SYMBOL NAME IS <4 CHARS.
	JMS ENTSYM	/ENTER 1ST HALF OF SYMBOL NAME.
	LAC SYM2		/2ND HALF OF SYMBOL NAME.
	JMS ENTSYM	/ENTER WORD2 OR WORD3.
	JMP* DEFSYM
 
/ SUBROUTINE ENTSYM: ENTER THE WORD IN THE AC AT THE END OF THE SYMBOL
/ TABLE AND MOVE THE POINTER TO THE END OF THE SYMBOL TABLE UP ONE.
 
ENTSYM	0
 
	DAC* SYMEND	/STORE DATA AT END OF TABLE.
	JMS UPSYM		/INDEX END POINTER.
	JMP* ENTSYM
 
/ SUBROUTINE UPSYM: INDEX POINTER TO END OF SYMBOL TABLE AND TEST
/ FOR OVERFLOW.
 
UPSYM	0
 
	LAW -1
	TAD SYMEND
	DAC SYMEND
	JMS TWC
	TAD PTBX1		/LOWEST REGISTER AVAILABLE TO SYMTAB.
	SPA!SNA		/OVERFLOW?
	JMP* UPSYM	/NO.
	LAC	(MES701)
	JMP	TERR
 
	.EJECT
/ SUBROUTINE NXNTRY: MOVE SYMBOL TABLE POINTERS OVER THE CURRENT ENTRY
/ TO THE BEGINNING OF THE NEXT ENTRY.
 
NXNTRY	0
 
	LAC SYMWD1	/POINTER TO 1ST WORD OF CURRENT ENTRY.
	DAC SYMPTR
	JMS NEXSYM	/GET 1ST HALF OF SYMBOL NAME.
	SPA		/IF BIT0=1, NAME IS 2 WORDS LONG.
	JMS DECSPT
	JMS DECSPT
 
	LAC* SYMWD1	/LOOK AT CODE BITS IN WORD 1.
	AND (300000	/LOOK FOR COMMON BLOCK CODE: 3 OR 7.
	SAD (300000	/COMMON BLOCK?
	SKP		/YES.
	JMP .+3		/NO.
	JMS DECSPT	/COMMON BLOCK ENTRY IS 2 WORDS LONGER
	JMS DECSPT	/THAN ALL OTHERS.
 
	LAC SYMPTR	/POINTING AT 1ST WORD OF NEXT ENTRY.
	DAC SYMWD1
	JMP* NXNTRY
 
/ SUBROUTINE NEXSYM: INDEX THE SYMBOL TABLE POINTER AND PICK UP THE
/ NEXT WORD.
 
NEXSYM	0
 
	JMS DECSPT
	LAC* SYMPTR
	JMP* NEXSYM
 
/ SUBROUTINE DECSPT:
 
DECSPT	0
 
	LAW -1
	TAD SYMPTR
	DAC SYMPTR
	JMP* DECSPT
 
/ SUBROUTINE BEGSYM:
 
BEGSYM	0
 
	LAC SYMBEG
	DAC SYMWD1
	DAC SYMPTR
	JMP* BEGSYM
 
	.EJECT
/ SCAN -- SUBROUTINE TO SCAN THE SYMBOL TABLE FOR THE NAME
/	IN SYM1 & SYM2 WITH THE SAME CODE BITS 1 & 2 AS THE
/	WORD IN AC.
/
/ IF FOUND -- RETURN AT JMS+1 WITH 15-BIT DEFINITION IN AC
/ IF NOT FOUND -- RETURN AT JMS+2 WITH ZERO IN AC
/
/ SEARCH FROM THE BEGINNING OF THE SYMBOL TABLE FOR:
/ A COMMON BLOCK NAME ENTRY (CODE 3 OR 7), A GLOBAL
/ SYMBOL ENTRY (CODE 1 OR 5), OR A DUMMY GLOBAL ENTRY (CODE 6)
/ WHOSE NAME MATCHES SYM1 AND SYM2. RETURN 0 IF NOT FOUND. RETURN
/ 15-BIT DEFINITION OF THE ENTRY IF FOUND.
/
/ WHEN A NAME MATCH IS FOUND, SYMPTR IS LEFT POINTING TO THE LAST WORD
/ OF THE NAME & SYMWD1 IS LEFT POINTING TO THE ID/BLOCK-SIZE WORD.
/
SCAN	0
	DAC	SYMDEF	/SAVE SYMBOL DEFINITION WITH CODE BITS
	JMS BEGSYM	/START AT BEGINNING OF SYMTAB.
NEXSCAN	SAD SYMEND	/END OF SYMBOL TABLE?
	JMP RTNZERO	/YES. NO MATCH. RETURN 0.
 
	LAC* SYMWD1	/PICKUP ENTRY'S 1ST WORD.
	XOR SYMDEF	/MATCH WITH SEARCH CODE BITS.
	AND (300000
	SZA		/SKIP IF PROPER CODE.
	JMP MORSCAN
 
	JMS NEXSYM	/GET 1ST HALF OF SYMBOL NAME.
	SAD SYM1		/MATCH?
	SKP		/YES.
	JMP MORSCAN	/NO.
 
	SMA		/IS NAME 2 WORDS LONG?
	JMP RTNDEF	/NO. ENTRY HAS BEEN FOUND.
 
	JMS NEXSYM	/GET 2ND HALF OF SYMBOL NAME.
	SAD SYM2		/MATCH?
	JMP RTNDEF	/YES. ENTRY HAS BEEN FOUND.
 
MORSCAN	JMS NXNTRY	/NO. SKIP TO BEGINNING OF NEXT ENTRY.
	JMP NEXSCAN
 
RTNZERO	CLA!SKP		/RETURN 0 IN AC WHEN NOT FOUND.
RTNDEF	LAC* SYMWD1	/RETURN 15-BIT DEFINITION OF THE ENTRY
	AND (77777	/WITHOUT THE CODE BITS.
	SNA		/0 RETURNED IN AC IF NOT FOUND.
	IDX SCAN		/NOT FOUND.
	JMP* SCAN		/FOUND.
 
/ SUBROUTINE DEFCOM: GO THROUGH THE COMMON BLOCK CHAIN AND DEFINE
/ EACH MEMBER (IF ANY) OF THE COMMON BLOCK.
 
DEFCOM	0
 
	LAC*	SYMPTR	/GET STARTING ADDRESS OF THE CHAIN.
	DZM*	SYMPTR	/SET CHAIN WORD TO 0 TO INDICATE THAT
			/THERE ARE NO UNRESOLVED CHAIN MEMBERS.
 
DEFLOOP	SNA		/ARE THERE ANY MORE CHAIN MEMBERS?
	JMP* DEFCOM	/NO.
	DAC	SYMPTR	/FOLLOW SYMBOL TABLE CHAIN, MAKING
	JMS	DECSPT	/A PATCH TABLE ENTRY (CODE=0) FOR EACH
	LAC*	SYMPTR	/TRANSFER VECTOR TO THE DEFINED COMMON BLOCK.
	AND	(077777)
	DAC	PTBW1
	JMS	DECSPT
	LAC*	SYMPTR
	TAD	LOADADR
	DAC	PTBW2
	JMS	PTBENT
	ISZ	SYMPTR
	ISZ	SYMPTR
	LAC*	SYMPTR
	AND	(077777)
	JMP	DEFLOOP
/
ERR106	LAC	(MES706)
	JMP	TERR
ERR115	LAC	(MES715)
	JMP	TERR
/
/ TELETYPE OUTPUT MESSAGES.  THE TWO WORDS PRECEDING EACH
/ MESSAGE ARE USED AS AN IOPS ASCII HEADER.  THE ONLY HEADER
/ REQUIREMENT FOR TTY OUTPUT IS A GREATER THAN ONE WORD-
/ PAIR COUNT.
/
MES602	.ASCII	/LINK TABLE/<015>
MES603	.ASCII	/RESIDENT CODE/<015>
MES604	.ASCII	/LINK -- /<175>
MES605	.ASCII	/BLANK COMMON/<015>
MES610	.ASCII	/PAUSE/<175>
MES620	.ASCII	/LOAD: /<175>
MES621	.ASCII	/ & ^P /<175>
MES690	.ASCII	/CORE REQ'D/<015>
MES701	.ASCII	/TABLE OVERLAP/<15>
MES702	.ASCII	/CORE OVERFLOW/<15>
MES703	.ASCII	/EOM, ^P TO RESTART /<175>
MES705	.ASCII	/READ ERROR/<15>
MES706	.ASCII	/ILLEGAL LOADER CODE/<15>
MES707	.ASCII	/LABELED COMMON BLK SIZE ERR -- /<175>
MES710	.ASCII	/UNRESOLVED GLOBAL(S):/<15>
MES715	.ASCII	/ABS PROG/<15>
MES720	.ASCII	/MISSING GLOBAL DEF -- /<175>
MES721	.ASCII	/DUPLICATE GLOBAL DEF -- /<175>
/
SIZE	0		/2'S COMPLEMENT OF PROGRAM SIZE.
WRDCNT	0		/IOPS BINARY BLOCK WORD COUNT.
CDWCNT	0		/CODE WORD BLOCK COUNTER.
CODEWD	0		/CODE WORD CONTAINS 3 LOADER CODES.
SYMDEF	0		/TEMP REGISTER FOR THE 1ST WORD OF A SYMTAB
			/ENTRY: CODE + DEFINITION.
SYM1	0		/1ST 3 CHARS OF A SYMBOL.
SYM2	0		/2ND 3 CHARS OF A SYMBOL.
DATA1	0		/TEMP STORAGE FOR A DATA INITIALIZATION CONSTANT.
DATA2	0		/(DATA1, DATA2, & DATA3 MUST BE CONTIGUOUS
DATA3	0		/AND IN THIS ORDER)
DGSNB	.BLOCK 2		/DUPL GLOBAL SYMBOL NAME BUFFER
COMCHN	0
COMDEF	0
STRING	0
		/.DAT MAP
DATMAP	0	/-18  -1
	0	/  0  +17
	0	/+18  +35
	0	/+36  +53
/
DATP=.			/.DAT ZERO POINTER
	.IFDEF	BFM
	117
	.ENDC
	.IFUND	BFM
	.IFDEF	PDP9
	135
	.ENDC
	.IFUND	PDP9
	136
	.ENDC
	.ENDC
	.EJECT
/ SYMMAP -- SUBROUTINE TO CONVERT THE SYMBOL NAME IN SYM1 & SYM2
/           FROM RADIX 50 TO 7-BIT IMAGE ALPHA AND STORE THE
/           RESLUTING SIX WORDS IN MAPNAM THRU MAPNAM+5
/
SYMMAP	0
	LAC	ADR4
	DAC	MAPX1
	LAC	SYM1
	AND	(377777)
	JMS	CONVERT
	LAC	SYM1
	SMA
	DZM	SYM2
	LAC	SYM2
	AND	(377777)
	JMS	CONVERT
	JMP*	SYMMAP
/
CONVERT	0
	JMS	DIVIDE
	-3100
	JMS	DIVIDE
	-50
	JMS	DIVIDE
	-1
	JMP*	CONVERT
/
DIVIDE	0
	DZM	DIVQUO
DIVLP	DAC	DIVREM
	TAD*	DIVIDE
	SPA
	JMP	.+3
	ISZ	DIVQUO
	JMP	DIVLP
/
	LAC	DIVQUO
	SNA
	LAW -40
	SAD (33
	LAW -33
	SAD (34
	LAC (33
	SAD (47
	LAW -35
	TAD (-33
	SPA
	TAD (55
	TAD (56
	DAC*	MAPX1
	ISZ	MAPX1
	LAC	DIVREM
	ISZ	DIVIDE
	JMP*	DIVIDE
/
DIVQUO	0
DIVREM	0
/
/ ADROUT -- SUBROUTINE TO CONVERT THE OCTAL ADDRESS (5-DIGITS)
/           IN AC TO IMAGE ALPHA AND STORE THE FIVE RESULTING
/           WORDS STARTING AT THE ADDRESS IN 'MAPX1'
/	  MAPX1 IS LEFT POINTING TO THE LAST CHARACTER
/	  ADDRESS PLUS TWO.
/
ADROUT	0
	RTL
	RTL
	DAC	CTRBF
	LAW	-5
	DAC	CTRC1
ADROT1	LAC	CTRBF
	RAL
	RTL
	DAC	CTRBF
	AND	(007)
	XOR	(060)
	DAC*	MAPX1
	ISZ	MAPX1
	ISZ	CTRC1
	JMP	ADROT1
	ISZ	MAPX1
	JMP*	ADROUT
	.EJECT
/ CTR50 -- SUBROUTINE TO CONVERT THE THREE SIXBIT CHARACTERS IN
/          AC TO RADIX 50 AND LEAVE THE RESULT IN AC
/
CTR50	0
	DAC	CTRBF
	LAW	-3
	DAC	CTRC1
	DZM	CTRAC
CTRLOP	LAC	CTRBF
	RTL
	RTL
	RTL
	RAL
	DAC	CTRCB
	RAR
	DAC	CTRBF
	LAC	CTRCB	/PROCESS .SIXBT CHARACTER (BLANK=00)
	AND	(077)
	TAD	(-33)
	SPA
	JMP	CTRAZB	/ A-Z  BLANK
	SAD	(23)
	LAC	(24)	/ .
	SAD	(12)
	LAC	(23)	/ %
	SAD	(10)
	LAC	(37)	/ #
	TAD	(-23)	/ 0-9  .  %  #
CTRAZB	TAD	(+33)	/ A-Z  BLANK  0-9  .  %  #
	TAD	CTRAC
	ISZ	CTRC1
	SKP
	JMP*	CTR50
	DAC	CTRAC
	LAW	-50
	DAC	CTRC2
	CLA
	TAD	CTRAC
	ISZ	CTRC2
	JMP	.-2
	DAC	CTRAC
	JMP	CTRLOP
/
CTRBF	0
CTRCB	0
CTRAC	0
CTRC1	0
CTRC2	0
	.EJECT
/ SEEK -- SUBROUTINE TO PREPARE A FILE TO BE READ.
/         IF FROM A FILE-ORIENTED DEVICE, SEEK FILE.
/         IOPS13 IF FILE NOT FOUND.
/         IF FROM A NON FILE ORIENTED DEVICE, THE REQ'D 
/         FILE NAME IS TYPED OUT, AND CHAIN WAITS FOR
/         A ^P BEFORE READING THE FILE.
/
SEEK	0		/ENTER WITH .DAT SLOT NO IN AC 
	AND	(0777)	/SET .DAT SLOT NOS IN CALLS
	DAC	SKIT
	DAC	SKSK
/
SKIT	.INIT	0,0,0	/INITIALIZE DEVICE HANDLER
	LAC	SKIT+3	/FILE ORIENTED DEVICE (BUF SIZE > 63)?
	AND	(700)
	SNA		/YES -- SEEK FILE 
	JMP	SKCP	/NO -- TYPE NAME & WAIT FOR ^P
SKSK	.SEEK	0,0	/SEEK FILE & EXIT
	JMP*	SEEK
SDPTR=SKSK+2	/EXTERNALLY MODIFIED SEEK DATA POINTED IS
		/WITHIN .SEEK MACRO.
/
SKCP	LAC	SDPTR	/TYPE:
	DAC	TEMP11	/   LOAD XXXXX & ^P
	LAC*	TEMP11
	DAC	T6BW1
	ISZ	TEMP11
	LAC*	TEMP11
	DAC	T6BW2
	JMS	TYPE
	MES620
	JMS	T6BN
	JMS	TYPE
	MES621
	JMS	WFCP	/WAIT FOR ^P
	JMP*	SEEK
/
/ SEEK DATA TABLE
SKDATA	.SIXBT /------BIN/	/NO INSERTION BETWEEN SEEK DATA TRIPLITS!!
	.SIXBT /.LIBR5BIN/
	.IFDEF	BFM
	.SIXBT /.F4LIBBIN/
	.ENDC
	.IFUND	BFM
	.SIXBT /.LIBR@BIN/
	.ENDC
	.EJECT
INBUF	.BLOCK 62
/
OUTBUF	021000
	.BLOCK 41
OUTEND	.
OUTBEG	OUTBUF+2
/
PSNB	004000	/PAUSE NUMBER BUFFER
	.BLOCK 6
	040
/
MAPBUF	013000	/MAP LINE HEADER -- WORD-PAIR COUNT IS SET 
	0	/TO 016 IF SIZE IS TO BE OUTPUT
MAPNAM	.BLOCK 6	/NAME
	040
MAPFAD	.BLOCK 5	/FIRST WORD ADDRESS
	055
	.BLOCK 5	/LAST WORD ADDRESS
	015
	012	/SIZE IF SZFLAG IS SET
	.BLOCK 4
	015
	012
MAPX1	0	/MAP LINE INDEX
/
/ SLIM -- SUBROUTINE TO SET THE CORE LIMITS IN 'SLIMFA' & 'SLIMLA'
/	INTO THE LOAD MAP LINE BUFFER.  IF SZFLAG IS SET, THE
/	SIZE (SLIMLA-SLIMFA+1) IS ALSO SET IN THE MAP LINE.
/
SLIMFA	0	/FIRST WORD ADDRESS
SLIMLA	0	/LAST WORD ADDRESS
/
SLIM	0
	LAC	ADR6
	DAC	MAPX1
	LAC	SLIMFA
	JMS	ADROUT
	LAC	SLIMLA
	JMS	ADROUT
	LAC	SZFLAG
	SNA
	JMP*	SLIM
	LAC	SLIMFA
	JMS	TWC
	TAD	(001)
	TAD	SLIMLA
	JMS	ADROUT
	JMP*	SLIM
	.EJECT
/ SHTMAP -- SUBROUTINE TO SET MAP FLAG AND
/           TO SHORTEN MAP LINE TO NAME ONLY
/
SHTMAP	0
	LAC	(005000)
	DAC	MAPBUF
	DAC	LMFLAG
	LAC	ADR6
	TAD	(-1)
	DAC	MAPX1
	LAC	(015)
	DAC*	MAPX1
	ISZ	MAPX1
	LAC	(012)
	DAC*	MAPX1
	JMP*	SHTMAP
/
/ TYPMAP -- SUBROUTINE TO TYPE A MAP LINE
/           IF MAP FLAG IS SET
/
TYPMAP	0
	LAC	LMFLAG
	SNA
	JMP*	TYPMAP
TMAPZ	.WRITE	TO,3,MAPBUF,0
	.WAIT	TO
	JMP*	TYPMAP
	.EJECT
/ POINTERS:
 
SYMBEG	0		/TO BEG OF SYMBOL TABLE.
SYMEND	0		/TO LAST SYMTAB REGISTER - 1.
SYMEB1	0		/SYMEND BUFFER (TO RESTORE SYMEND 
			/FOR A NEW LINK)
SYMEB2	0		/SYMEND BUFFER (TO RESTORE SYMEND
			/FOR NON-RELOCATED LIBRARY ROUTINE)
SYMWD1	0		/TO 1ST WORD OF A SYMTAB ENTRY.
SYMPTR	0		/TO SOMEWHERE WITHIN A SYMTAB ENTRY.
LOADADR	0		/PROGRAM'S LOAD ADDRESS.
LAST	0		/PROGRAM'S LAST REGISTER.
RELOC	0		/RELOCATION FACTOR.
BUFPTR	0		/TO LINE BUFFER #1 OR #2.
 
/ FLAGS:
 
NUFILE	0		/SET NON-0 AFTER A .SEEK.
LIBFLG	0		/SET NON-0 WHEN IN LIBRARY SEARCH MODE.
BLKFLG	0		/SET NON-0 (WITH THE LOAD ADDRESS) WHEN
			/A BLOCKDATA SUBPROGRAM IS BEING LOADED.
	.EJECT
/ STORE -- SUBROUTINE TO EFFECT:  DAC*  LOADADR
/
STORE	0
	DAC	ROPWB
	LAC	LOADADR
	JMS	ROP
	JMP*	STORE
/
/ ROP --  SUBROUTINE TO OUTPUT THE RELOCATED WORD IN ROPWB
/	TO BE LOADED AT THE ADDRESS IN AC.
/
/	RECORD FORMAT:
/	    IOPS BINARY HEADER
/	    SUB-RECORD HEADER	(SUB-RECORDS ARE
/	    RELOCATED WORD(S)	BLOCKS OF CONTIGUOUS
/	    SUB-RECORD HEADER	CORE LOADINGS)
/	    RELOCATED WORD(S)
/	      .         .
/	      .         .
/	    END-OF-RECORD IND.
/	SUB-RECORD HEADER FORMAT:
/	    TYPE CODE (BITS 0-8) & WORD COUNT (BITS 9-17)   CODE=0
/	    LOAD ADDRESS OF FIRST WORD
/
ROP	0			/ENTER WITH ADDRESS IN AC
	DAC	ROPLA
	LAC	ROPFEF		/FIRST ENTRY TEST
	SZA
	JMP	ROP10
	ISZ	ROPFEF
	DZM	ROPBWC
	JMP	ROP35
ROP10	LAC	ROPLA		/BREAK IN ADDRESS SEQUENCE?
	SAD	ROPLLA
	JMP	ROP20		/NO -- SET WORD IN BUFFER
	LAC	OUTEND		/YES -- SET NEW SUB-HDR & WORD IN BUF
	CMA			/IS THERE ROOM IN BUFFER FOR FOUR
	TAD	(004)		/MORE WORDS (HDR,WORD, & END-OF REC)?
	TAD	ROPX1
	SMA
	JMP	ROP30		/NO -- END RECORD & SET WDS IN NEXT BUF
	JMP	ROP40		/YES -- SET THREE WORDS IN BUFFER
/
ROP20	LAC	OUTEND		/IS THERE ROOM IN BUFFER FOR TWO
	CMA			/MORE WORDS (WORD & END-OF-REC)?
	TAD	(002)
	TAD	ROPX1
	SMA
	JMP	ROP30		/NO -- END RECORD & SET WORD IN NEXT BUF
	JMP	ROP50		/YES -- SET WORD IN BUFFER
/
ROP30	LAW	-1		/SET END-OF-RECORD INDICATOR (-1) IN
	JMS	ROPSW		/BUFFER AND OUTPUT
	JMS	ROPWOB		/WRITE OUTPUT BUFFER
/
ROP35	LAC	OUTBEG		/SETUP FOR NEW RECORD
	DAC	ROPX1
/
ROP40	LAC	ROPX1		/SET NEW SUB-RECORD HEADER IN BUFFER,
	DAC	ROPX2		/SAVE HEADER INDEX, & SET LAST-
	LAC	(200000)		/LOAD-ADR-PLUS-ONE
	JMS	ROPSW
	LAC	ROPLA
	DAC	ROPLLA
	JMS	ROPSW
/
ROP50	LAC	ROPWB		/SET RELOCATED WORD IN BUFFER, UPDATE
	JMS	ROPSW		/LAST-LOAD-ADR-PLUS-ONE, & AGUMENT SUB-
	ISZ	ROPLLA		/RECORD WORD COUNT
	ISZ*	ROPX2
/
	JMP*	ROP		/EXIT
/
ROPSW	0			/SET WORD SUBROUTINE
	DAC*	ROPX1
	ISZ	ROPX1
	ISZ	ROPBWC
	JMP*	ROPSW
/
ROPWOB	0
	LAC	ROPBWC
	TAD	(003)
	JMS	LCS6
	RTL
	AND	(777000)
	DAC	OUTBUF
	JMS	WOB
	DZM	ROPBWC
	JMP*	ROPWOB
/
ROPLA	0			/LOAD ADDRESS
ROPLLA	-1			/LAST LOAD ADDRESS PLUS ONE
ROPFEF	0			/FIRST ENTRY FLAG
ROPX1	0			/BUF INX AT WHICH WORD IS TO BE STORED
ROPX2	0			/INDEX OF LAST SUB-RECORD HEADER
ROPBWC	0			/BUFFER WORD COUNT
ROPWB	0			/WORD BUFFERS
/
/ FROP -- FINISH PARTIAL RECORD STARTED BY ROP
/
FROP	0
	LAC	ROPX1
	SAD	OUTBEG
	JMP*	FROP
	LAW	-1
	JMS	ROPSW
	JMS	ROPWOB
	DZM	ROPFEF
	JMP*	FROP
/
/ WNPPR -- SUBROUTINE TO WRITE A NO PATCH PATCH-RECORD
/
WNPPR	0
	LAC	(002000)
	DAC	OUTBUF
	LAC	(300000)
	DAC	OUTBUF+2
	DZM	OUTBUF+3
	JMS	WOB
	JMP*	WNPPR
/
/ WOB -- SUBROUTINE TO WRITE OUTPUT BUFFER
/
WOB	0
WOB1	.WRITE RO,0,OUTBUF,0
	.WAIT  RO
	JMP*	WOB
/
/ PTBENT -- SUBROUTINE TO ENTER PTBW1 & PTBW2 IN THE PATCH TABLE
/
PTBW1	0	/BITS 0-2 CODE
		/BITS 3-17 ADDRESS
		/	CODE=0 -- STORE THE WORD IN PTBW2
		/		AT ADDRESS
		/	CODE=1 -- SET BITS 5=17 OF THE WORD IN
		/		IN PTBW2 IN BITS 5-17 AT ADDRESS
		/	CODE=2 -- ADD THE BASE OF BLANK COMMON
		/		TO THE WORD IN PTBW2 AND STORE
		/		AT ADDRESS
PTBW2	0	/WORD TO BE STORED PER CODE
		/ IF AN ENTRY FOR AN ADDRESS ALREADY EXISTS, IT
		/WILL BE WRITTEN OVER.
/
PTBENT	0
	LAC	PTBBSE	/SCAN PATCH TABLE FOR AN ENTRY FOR THE
PTBEN1	DAC	PTBX2	/ADDRESS IN PTBW1 BITS 3-17
	SAD	PTBX1
	JMP	PTBEN3	/ADR NOT FOUND (END OF TABLE)
	LAC*	PTBX2
	XOR	PTBW1
	AND	(077777)
	SNA
	JMP	PTBEN2	/ADDRESS FOUND
	LAC	PTBX2
	TAD	(002)
	JMP	PTBEN1
/
PTBEN2	LAC	PTBW1	/ENTER PTBW1 & PTBW2 OVER PREVIOUS ENTRY
	DAC*	PTBX2	/FOR SAME ADDRESS
	ISZ	PTBX2
	LAC	PTBW2
	DAC*	PTBX2
	JMP*	PTBENT	/EXIT
/
PTBEN3	LAC	PTBW1	/ADD PTBW1 & PTBW2 TO PATCH TABLE
	DAC*	PTBX1
	ISZ	PTBX1
	LAC	PTBW2
	DAC*	PTBX1
	ISZ	PTBX1
	LAC	SYMEND	/DO SYMBOL AND PATCH TABLES OVERLAP?
	CMA
	TAD	PTBX1
	SPA!SNA
	JMP*	PTBENT	/NO -- EXIT
	LAC	(MES701)	/YES -- TERMINAL ERROR
/
/ TERMINAL ERROR WHILE RELOCATING A ROUTINE -- TYPE OUT 
/  THE MESSAGE WHOSE ADDRESS IS IN AC.  FOLLOWED BY
/ A MAP LINE (IF MAP FLAG IS SET).
/ AND EXIT TO MONITOR
/
TERR	JMS	SETBBS
	TAD	(-2)
	DAC	.+3
	.WRITE	TO,2,XX,0
	.WAIT	TO
	JMS	TYPMAP
	JMP	EXIT
/
	.IFDEF	PTP
	.IFUND	PDP9
	.END	PAGE+1/2*2-1*10000+7720
	.ENDC
	.IFDEF	PDP9
	.END	BANK*20000+17720
	.ENDC
	.ENDC
	.IFUND	PTP
	.END
	.ENDC