        .TITLE LINKING LOADER - V9A (EDIT #7:10-12-70)
/ COPYRIGHT 1970, DIGITAL EQUIPMENT CORPORATION, MAYNARD, MASS.
/ PDP 9/15 ADVANCED SOFTWARE PACKAGE - LINKING LOADER
/.DAT MUST BE DEFINED FOR ALL ASSEMBLIES
/PDP9 DEFINED FOR BANK ASSEMBLY
/ CONDITIONALIZED FOR I/O MONITOR/ KM9 MONITOR.
/ TO ASSEMBLE FOR THE I/O MONITOR, START WITH FOLLOWING PARAMETER TAPE:
/		PTP=0		/DEFINE A SYMBOL 'PTP'.
/		BANK=0		/0,1,2, OR 3.
/		LDSTRT=XXXX		/LOADER'S LOAD ADDRESS.
				/FUNCTION OF TOTAL SIZE OF 
				/I/O MONITOR INCLUDING TTA. AND PRA.
/		.EOT
/START ADDRESS=.LOAD
/
	.IFUND	PDP9
PDP15=0
	.ENDC
	.IFDEF PTP
	.IFUND	PDP15
	.ABS
	.IFUND BANK
BANK=0
	.ENDC
	.ENDC
	.IFDEF	PDP15
	.ABSP
	.IFUND	PAGE
PAGE=1
	.ENDC
BANK=PAGE-1/2
	.ENDC
	.LOC LDSTRT
	.ENDC
/
IDX=ISZ		/USED WHEN NO SKIP INTENDED.
	.IFUND	.DAT
	.IFDEF	PTP
.DAT=136
	.ENDC
	.IFUND	PTP
.DAT=141
	.ENDC
	.ENDC
.SCOM=100
	.IFUND	SCOM20
SCOM20=.SCOM+20
	.ENDC
.DATBG=.DAT-15              /BEGINNING OF .DAT TABLE
.DATND=.DAT+11              /END OF .DAT TABLE
LDBEG=.	/START OF LINK LOADER.
LTEMP1=.
SCOM2   .DSA    0               
	.IFDEF PTP
LSMST	.SIZE
	.ENDC
	.IFUND PTP
LSMST	.DSA	0		/START OF SYMBOL TABLE.
	.ENDC
LSMEND  .DSA    0               /END OF SYMBOL TABLE.
TVSCM5  .SCOM+5                 /.SCOM+5 TRANS. VECTOR.
TVSCM2  .SCOM+2                 /.SCOM+2 TRANS. VECTOR.
/EXIT FROM LINKING LOADER.
LOAD21	CAL 775		/.WAIT ON TTY TO COMPLETE
	12		/MEMORY MAP OUTPUT.
	LAC*	(.SCOM+1		/UPDATE .SCOM+2 TO REGISTER JUST ABOVE RESIDENT KM9 OR TO
	DAC*	TVSCM2		/START OF THIS ROUTINE, LOWEST FREE ADDRESS.
	LAC	LPRES
	DAC*	(.SCOM+3		/HIGHEST FREE ADDR.
	LAC	LP20
	SNA
	JMP	SCM20
	LAC*	LP20
	XOR	(400000
	DAC*	(SCOM20
SCM20=.
	DZM*	(.DAT-1		/CLEAR LINKING
	DZM*	(.DAT-4		/LOADER .DAT
	DZM*	(.DAT-5		/SLOTS TO DETECT INADVERTENT USER USE.
	LAC*	(.SCOM+6
	DAC	NOLOAD		/USER START ADDRESS.
	SMA!RAL
	JMP	LOAD30		/NOT $DDT
	LAC	LSMST		/START OF SYM. TAB.
	DAC*	(.SCOM+11	/SAVED FOR DDT.
	LAC	LSMEND		/HIGH ADDR.
	DAC*	TVSCM2		/SAVED FOR DDT.
	JMP* TVSCM5		/GO TO DDT.
LOAD30	SPA
	JMP*	NOLOAD		/$GLOAD - GO TO USER.
OUTBF3	IDX	WRBFPT		/CHANGE ^P TO ^S
	JMP	PRTEOM
LTEMP4	373720			/ASCII '>'<175>
LTEMP3	0
LTEMP2	0			/GENERAL TEMP. STORAGE 2.
LTEMP7	0
LTEMP8	0
WDCNT	0			/LINE BUFFER WORD COUNT.
				/ALSO USED AS TEMP. STORE.
LIBDIR	561411		/.LI 
LIBDR1	022265		/BR5
	021116		/BIN
OUTBUF	.ASCII	'LOADER V9A'<175>
LOCNT=.-1		/LOCAL SYMBOL COUNT FOR COMMON OVERLAYS.
/
/
/BUFFERS, TEMPORARY STORAGE
/
/
NOLOAD	.DSA	000000		/ SELECTIVE LOADING FLAG
LBDF	.DSA	0		/ BLOCK DATA SUBPROGRAM FLAG
LN2BUF	.DSA	L2BUFF		/ ADDRESS LINE BUFFER---2
DDTMDE	.DSA	0		/ NEGATIVE DURING LOADING OF DDT.
CWDTAL	.DSA	000000		/NON-ZERO IF NO SYMBOLS
LRELOC	.DSA	0		/ CURRENT RELOCATION FACTOR
LMAIN	.DSA	000000		/ MAIN PROG. LOADING FLAG
LPLA	.DSA	000000		/ ADDRESS GENERATED BY CODE 2 DATA WORD
LSYM1	.DSA	000000		/ FIRST WORD OF SYMBOL TEMPORARY STORAGE
LSYM2	.DSA	000000		/ SECOND WORD OF SYMBOL TEMPORARY STORAGE.
TLSMST	.DSA	0		/ TEMP. START OF SYM. TAB.
LSMW1	.DSA	000000		/ PRESENT STORE ADDRESS OF SYMBOL TABLE.
LSMPT	.DSA	000000		/ PRESENT WORD COUNTER IN SYMBOL ENTR.
LSMDEF	.DSA	000000		/ SYMBOL TAPE AND DEFINITION
LPRES	.DSA	0		/ HIGHEST FREE ADDRESS.
	.IFUND	PDP15
/
/HIGHEST FREE ADDRESS IN EACH OF THE
/FOUR MEMORY BANKS.
LPRES3	77777
LPRES2	57777
LPRES1	37777
LPRES0	17777
LPRESS	LPRES3-1
LPRESP	0
LP20	0
/
	.ENDC
	.IFDEF	PDP15
/
/HIGHEST FREE ADDRESS IN EACH
/OF THE EIGHT 4K MEMORY BANKS.
/
LPRES3	77777
	67777
LPRES2	57777
	47777
LPRES1	37777
	27777
LPRES0	17777
	07777
LPRESS	LPRES3-1
LPRESP	0
LP20	0		/NONZERO (POINTS TO FIRST FREE
				/ODD PAGE)WHEN EXTRA 4 K IS PRESENT
/
	.ENDC
LSTRNG=STSYM2			/ STRING CODE (FIRST HALF)
LCMDEF=STSYM2+1			/ ADDRESS OF COMMON BLOCK DEFINITION
LCMCHN=STSYM2+2			/ COMMON CHAIN ADDRESS (TEMP. STORAGE).
LCHN1=STSYM2+3			/ TRANSFER VECTOR ADDRESS (TEMP. STOR.).
LCHN2=STSYM2+4			/ RELATIVE ADDRESS, COMMON NAME (TEMP. STOR.)
LDATA1=STSYM2+5
LDATA2=STSYM2+6
LDATA3=STSYM2+7
RECDIN=STSYM2+10
SIZE	0		/SELECTIVE LOADING PROG. SIZE RETAINER
/LINE BUFFER #1
LNBUFF=.			/LINE BUFFER 50 (DECIMAL) WORDS.
DDTDIR	040424			/ DDT
	0
LNBUF2	021116			/ BIN
TLITRL	XCT+CNTL.T		/ADR. FOR ^T TRANFER+BIT0=1
/LINKING LOADER

/ INITIALIZATION
/
	.IFUND PTP
.LOAD	LAC*	TVSCM2		/FETCH .SCOM + 2 FOR...
	DAC	TLSMST		/ SYMBOL TABLE START
	DAC	LSMST
	DAC	LSMEND		/ SYMBOL TABLE END
	TAD M1		/(-1
	DAC	IOCONF		/IOC POINTER.
	.ENDC
	.IFDEF PTP
	.IFDEF	NOPAT
.LOAD	LAC LSMST
	NOP
	.ENDC
	.IFUND	NOPAT
.LOAD	LAC	(LDSTRT
	DAC*	(.SCOM+1
	LAC	LSMST
	.ENDC
	DAC TLSMST
	DAC* TVSCM2
	DAC LSMEND
	TAD M1
	.ENDC
	DAC*	(10		/LOW ADDRESS TO AUTO INDEX 10.
	LAC*	(.SCOM+3		/ FETCH .SCOM + 3 FOR ...
	DAC	LPRES		/ PRESENT LOAD ADDRESS
	DZM*	10		/ZERO FREE CORE.
	SAD*	(10
	SKP
	JMP	.-3
/ROUTINE TO 0 MEMORY PAGE ADDRESSES OF MEMORY BANKS/PAGES THAT DO NOT EXIST.
	LAC	LPRESS	/ADDRESS -1 OF BLOCK OF ADDRESSES
	DAC	LPRESP
BANK1	IDX	LPRESP
	LAC*	LPRESP
	DAC*	(10		/FOR CLEARING XTRA 4K IF PRESENT
	DZM*	LPRESP
	XOR	LPRES	/.SCOM+3
	.IFUND	PDP9
	AND	(70000		/PAGE MASK
	.ENDC
	.IFDEF	PDP9
	AND	(60000
	.ENDC
	SZA
	JMP	BANK1	/.SCOM+3 NOT POINTING TO THIS PAGE
	LAC	LPRES
	DAC*	LPRESP	/AVOID BOOTSTRAP
	LAC*	(SCOM20
	SMA!CLA!CMA
	JMP	BANK2		/NO XTRA 4K
/XTRA 4K, CORRECT ADDRESS TABLE AND CLEAR CORE.
	TAD	LPRESP		/BACKUP POINTER.
	DAC	LP20
	.IFUND PTP
	LAW	-10000
	DAC	LTEMP2
	DZM*	10		/CLEAR XTRA 4K
	ISZ	LTEMP2
	JMP	.-2
	LAC*	(10
	DAC*	LP20		/CORRECT ADDRESS TABLE ENTRY.
	.ENDC
	.IFDEF PTP
	LAC* (SCOM20
	AND (77777
	DAC* LP20
	DZM* 10
	SAD* (10
	SKP
	JMP .-3
	.ENDC
BANK2	LAC*	(.SCOM+6
	SMA
	JMP	LOAD02		/ NOT A SYSTEM LOAD
	.IFUND PTP
	DAC	DDTMDE		/ NEGATIVE DURING DDT LOAD.
	.ENDC
	.IFDEF PTP
	JMP .LOADT
	.ENDC
/
/THIS SPACE IS RESERVED FOR THE MEANS WHEREBY A PROGRAM IS
/LOCATED AND POSITIONED FOR INPUT---.SEEK WITH DDT ENTRY BLOCK.
/
/.INIT -1
	CAL	777
	1
	LLCTLP			/CONTROL P RETURN.
	0
/.SEEK	-1, DDTDIR
DATM1	CAL	777
	3
	DDTDIR
	LAC	DATM1	/INITIALIZE READ MACRO TO INPUT FROM THE
	DAC	LL010		/ SYSTEM DEVICE (.DAT SLOT -1).
	LAC	TLITRL		/BIT0=1; ^T XFER ADR.
	DAC	DDTCTL		/^T INIT FOR ENTRY TO DDT.
	JMS	LL000		/ LOAD SYSTEM PROGRAM - DDT
/BUFFER #1 ENDS HERE.
LTEMP5=.
	.IFUND PTP
	DAC*	TVSCM5		/PUT STARTING ADDRESS IN .SCOM+5
	.ENDC
	.IFDEF PTP
.LOADT	LAC* TVSCM5
	.ENDC
LTEMP6	DAC	TVSCM5

/.CLOSE	-1
/BUFFER #2 BEGINS HERE.
L2BUFF=.
	.IFUND PTP
	CAL	777
	6
	LAC	DDTMDE		/BIT 2=1 OF DDTNS, LOAD, OR GLOAD
	.ENDC
	.IFDEF PTP
	LAC TLITRL
	DAC DDTCTL
	LAC* (.SCOM+6
	.ENDC
LOAD02	AND	(100000
	DAC	DDTMDE		/NON-0 IF NO SYMBOLS LOADED
/FETCH COMMAND INPUT FROM KEYBOARD OR BATCH DEVICE
/RETURN TO 'RESTART' ON CONTROL P TO START FRESH COMMAND STRING
RESTART	LAC TLSMST	/RESTART COMMAND STRING BY
	DAC LSMEND	/RESETTING END OF SYM. TAB. POINTER
	DZM	PSWCH
	DZM	GSWCH
	DZM	CSWCH
	DZM	OPSWCH
/.INIT -3
	CAL 1775		/PRINT CAR. RET. LIN. FD. ON TTY.
	1
	RESTART		/CONTROL P RESTART ADR.
SYMFLG	0		/USED BELOW TO FLAG FULL SYMBOL
/.WRITE -3,2,OUTBUF-2,6
	CAL 2775		/IOPS ASCII TO TTY
	11
	OUTBUF-2		/PRINT 'LOADER V?A'
L175	175		/ASCII FOR ALT MODE.
/.INIT -3
	CAL 1775		/PRINT CAR. RET. LIN. FD. ON TTY.
	1
DDTCTL	RESTART		/IF DDT LOADED, THIS ADR WILL BE
	0		/^T TRANSFER ADR.
/.WRITE -3,3, OUTBF3,4
LOAD03	CAL 2775		/IOPS ASCII TO TTY.
	11
	OUTBF3		/PRINT '>' TO TELL USER
BUFPTR	LNBUF2		/TO TYPE IN COMMAND STRING
/.READ -2,2 LNBUFF,50.
	CAL 2776		/IOPS ASCII FROM TTY OR BATCH DEVICE
	10
	LNBUFF		/READ A LINE INTO BUFFER #1.
	-62
/.WAIT -2
	CAL 776		/WAIT FOR LINE TO BE READ IN
	12

	LAC BUFPTR	/INIT. LINE BUFFER PTR.
	DAC LTEMP1
	LAW -1		/INIT. 5/7 CHAR. BYTE COUNT.
	DAC LTEMP2
LOAD04	DZM SYMFLG	/SYMBOL FLAGGED "NOT FULL."
	DZM WDCNT		/CLEAR WORD TERMINATOR.
	LAW -2
	DAC LTEMP3	/INIT. 2-WORD SYMBOL COUNT.
	DZM LSYM2		/INIT. TEMP. SYM. AC.
SET3	LAW -3
	DAC LTEMP8	/INIT. 3 CHAR. PER WORD COUNT.
	SKP
NAMEND	DAC WDCNT		/SAVE TERMINATOR.
GETCHA	CLA!CLL
	SAD WDCNT		/SKIP IF WORD TERMINATED.
	JMP GETIT
	SAD SYMFLG	/SKIP IF SYMBOL FULL.
	JMP JUSTFY	/FILL REM. OF SYM. WITH 0'S
	JMP ENTERS	/ENTER IN SYMBOL TABLE.
GETIT	ISZ LTEMP2	/SKIP IF BYTE COUNT RUNS OUT
	JMP GETNEX
/BUFFER #2 ENDS HERE.
	LAW -5
	DAC LTEMP2	/RESET BYTE COUNT TO 5.
	LAC* LTEMP1	/GET NEXT 5/7 WORD PAIR
	DAC LTEMP5	/WORD 1
	IDX LTEMP1
	LAC* LTEMP1
	DAC LTEMP6	/WORD 2
	IDX LTEMP1
GETNEX	LAW -10
	DAC LTEMP7	/SET COUNT TO DO 7+1/2 SHIFTS
ROTMOR	LAC LTEMP6	/SHIFT WORD 2 WITH LINK
	RAL
	ISZ LTEMP7	/SKIP IF CHAR IN POSITION
	JMP DOWRD1
	AND OCT177	/MASK TO 7 BITS
	DAC LTEMP7	/SAVE FOR REFERENCE
	LAC	OPSWCH
	SZA
	JMP	NAMES
	LAC	LTEMP7
	SAD	(103	/C
	DAC	CSWCH
	SAD	(107	/G
	DAC	GSWCH
	SAD	(120	/P
	DAC	PSWCH
	SAD	(137	/_ OPTION TERMINATION
	DAC	OPSWCH
	SAD	L175	/ALT. MODE
	JMP	RESTART
	SAD	PLUS15	/CR RET
	JMP	LOAD03
	JMP	GETCHA
NAMES	LAC	LTEMP7
	SAD (54		/COMMA
	JMP NAMEND
	SAD L175		/ALT MODE
	JMP NAMEND
	SAD PLUS15	/CAR. RET.
	JMP NAMEND
	SAD PLUS12	/IGNORE LINE FEED
	JMP GETCHA
	SAD SPACE		/IGNORE SPACE
	JMP GETCHA
	LAC SYMFLG	/IGNORE IF SYMBOL FULL
	SZA!CLL
	JMP GETCHA
	LAC LTEMP7	/TRIM CHAR. TO SIXBIT
	AND (77
JUSTFY	XOR LSYM2		/ADD IN ACCUMULATED SYMBOL.
	ISZ LTEMP8	/SKIP IF HAVE 3 CHARS
	JMP LDROTA
	ISZ LTEMP3	/SKIP IF SYM. FULL.
	JMP HAFFUL
	IDX SYMFLG	/NON-ZERO TO FLAG MEANS FULL
	JMP STSYM2
HAFFUL	DAC LSYM1		/SAVE FIRST HALF
	DZM LSYM2
	JMP SET3		/RESET 3-CHAR. PER WORD COUNT

LDROTA	RTL		/SHIFT PARTIAL SYMBOL WORD LEFT 6.
	RTL
	RTL
STSYM2	DAC LSYM2		/THIS + NEXT 8 REGS. ARE USED
	JMP GETCHA	/LATER ON FOR TEMP STORAGE
DOWRD1	DAC LTEMP6	/WORD 2.
	LAC LTEMP5	/WORD 1.
	RAL
	DAC LTEMP5
	JMP ROTMOR
ENTERS	LAC LSYM1		/ENTER FILENAME IN SYMTAB
	JMS LSTSYM
	LAC LSYM2
	JMS LSTSYM
	LAC LIBDIR+2	/WITH EXTENSION NAME 'BIN'.
	JMS LSTSYM
	LAC WDCNT		/COMMA, CAR. RET., OR ALT MODE.
	SAD (54		/COMMA?
	JMP LOAD04
	SAD PLUS15	/CAR. RET.?
	JMP LOAD03
/COMMAND STRING ALL IN SYMBOL TABLE
/.INIT -3
	CAL 775		/PRINT CAR. RET. LIN. FD. ON TTY.
	1
	LLCTLP		/CONTROL P TRANSFER ADDRESS FOR
SPACE	40		/EOM RESTARTS ON INPUT.
	.WAIT	-3
	LAC	LSMEND
	DAC	LSMST		/ END OF FILE DIR. ENTRY BLOCKS.
LOAD08	LAC	TLSMST
	SAD	LSMST
	JMP	LOAD06		/ COMMAND STRING IS EXHAUSTED
	DAC	LOAD07		/ SET .SEEK ADDRESS
	TAD	(3
	DAC	TLSMST		/ UPDATE COMMAND STRING FILE BLOCK ADDR.
	DZM	RECDIN		/ INDICATES NEW READ NECESSARY.
/.INIT -4
	CAL	774
	1
DAT.	.DAT
LNBUFP	0			/LINE BUFFER POINTER
/	.SEEK	-4,X		/ FILE ORIENTED SETUP.
LODC20	CAL	000774		/ DEVICE -4
	.DSA	000003		/ SEEK CODE
LOAD07	.DSA	000000		/ ADDRESS FILE DIRECTORY BLOCK
LODM4	LAC	LODC20		/ DAT SLOT -4
	DAC	LL010
	JMS	LL000		/ LOAD THE PROGRAM UNIT
	AND	L77777
	DAC	LTEMP1		/ SAVE START ADDRESS
	LAC	LMAIN		/ 1ST PROGRAM LOADED IS MAIN PROGRAM
	SZA!CLA!CMA
	JMP	LODM4

	DAC	LMAIN
	LAC*	(.SCOM+6		/SET PROGRAM STARTING ADDRESS WHICH IS
	AND	LFTSVN		/THE STARTING ADDRESS OF THE MAIN
	XOR	LTEMP1		/ PROGRAM) IN .SCOM + 6 WITHOUT
	DAC*	(.SCOM+6		/ DISTURBING BITS 0-2
	JMP	LODM4
CLM4	.CLOSE	-4
	JMP	LOAD08
 
/IF USER TYPES CONTROL T, TRANSFER HERE.
 
CNTL.T	CAL 775		/.CLOSE -3 TO PRINT
	6		/CAR. RET. LIN. FD.
 
/ SELECTIVELY LOAD REQUESTED SUBPROGRAMS FROM THE LIBRARY (S)
/ WHEN COMMAND STRING IS EXHAUSTED.
LOAD06	DZM	LODSW
	JMS	LOAD60
	SAD	(100000
	JMP	LOAD15
	LAC	(100000
	DAC	DDTMDE		/ INHIBIT DDT SYMBOL LOADING OF LIBRARY PROGRAMS
	LAC*	(.DAT-5		/SET UP TO READ FROM EXTERNAL LIBRARY
				/ BEFORE SYSTEM DEVICE IF ONE IS
				/ AVAILABLE.
	SNA
	JMP	MDCL21
	LAC	(-5&777
	JMP	LOAD81
/	.CLOSE	X
MODCAL	CAL			/ .CLOSE LIBRARY FILE.
	6
 /NOW ASSIGN COMMON
/
LOAD15	JMS	LOAD60		/ SCAN SYMBOL TABLE FOR COMMON BLOCK NAMES
	SAD	LFTSVN
	JMP	GLOBE		/ ALL DEFINED (OR NONE EXIST)
	JMS	UFSMPT		/ ADDRESS OF COMMON BLOCK NAME
	DAC	LSYM1
	SPA
	JMS	UFSMPT
	DAC	LSYM2
	LAC	LSMPT
	TAD	(1
	DAC	LCMCHN		/ ADDRESS OF CHAIN
	TAD	(1
	DAC	LCMDEF		/ ADDRESS OF DEFINITION
	LAC*	LCMDEF
	SZA
	JMP	LOAD16		/ BLOCK ALREADY DEFINED
	LAC*	LSMW1
	AND	L77777		/BLOCK SIZE
	CMA			/ 2'S COMP.
	TAD	(1
	DAC	SIZE
	LAC	LSMEND
	DAC	UFSMPT		/ TEMPORARY STORAGE

	LAC*	(.SCOM+1		/LET LSMEND BE WHAT IT WOULD
	DAC	LSMEND		/BE AT EXECUTION TIME.
	IDX	COMFLG		/SET DEFINING-COMMON-FLAG.
	JMS	FIT
	LAC	LRELOC		/ SUBTRACT BLOCK SIZE FROM CURRENT LOAD
	DAC*	LCMDEF		/ ADDRESS TO DETERMINE BLOCK DEFINITION
	JMS	MEMAP1
	LAC	(103	/C
	LAC	LRELOC
	LAC	UFSMPT		/ ANNOUNCE AN ERROR IF MEMORY OVERFLOWS.
	DAC	LSMEND		/RESTORE END POINTER.
	JMS	DEFCOM		/ DEFINE MEMBERS OF THE COMMON BLOCK
LOAD16	LAC*	LSMW1		/ CHANGE BLOCK CODE TO 3 SO THAT IT WILL
	AND	(377777		/ NOT BE FOUND AGAIN.
	DAC*	LSMW1
	JMP	LOAD15
/SEARCH FOR REMAINING UNDEFINED GLOBALS. IF ANY MATCH COMMON
/BLOCK NAMES, DEFINE THEM TO BE THE ADDRESS OF THE COMMON BLOCK.
 
GLOBE	DZM NOLOAD
	JMS LOAD60	/ARE THERE ANY UNRESOLVED GLOBALS?
GLOBRT	SAD (100000
	JMP ANYUND	/NONE THAT CAN BE RESOLVED.
	LAC LSMPT		/SAVE POINTER TO GLOBAL ENTRY.
	DAC LTEMP8
	JMS UFSMPT	/GET GLOBAL'S NAME.
	DAC LSYM1
	JMS UFSMPT
	DAC LSYM2
	LAW		/SET MATCH CODE TO SEARCH FOR
	DAC LSMDEF	/COMMON BLOCK NAME.
	JMS LSMSCN	/IS THERE A COMMON BLOCK WITH
	SNA		/THIS GLOBAL'S NAME?
	JMP REST		/NO.
	LAC .-1		/YES. SETUP RETURN ADDRESS.
	DAC GLOBX
	IDX LSMPT		/PICKUP ADDRESS OF COMMON BLOCK.
	JMS UFSMPT
	JMP LCD10E	/GO DEFINE THE GLOBAL.
REST	LAC LTEMP8	/RESTORE THE SYMTAB PTR TO CONTINUE
	DAC LSMW1		/SEARCH FOR UNRESOLVED GLOBALS.
	LAC (GLOBRT
	DAC LOAD60
	JMP CONTIN
ANYUND	JMS LOAD60	/ANY UNRESOLVED GLOBALS?
	SAD (100000
	JMP LOAD21	/NO. PREPARE TO EXIT FROM LOADER.
JMPER3	JMP ERROR3	/YES.
 
/SUBROUTINE TO SEARCH SYMBOL TABLE FOR VIRTUALS OR BLOCK NAMES
/CALLING SEQUENCE...
/	JMS	LOAD60
/	SAD	(SYMBOL CODE
/	JMP	NOT FOUND
/	XXX	FOUND
/
LOAD60	CAL	0
	LAC	LSMST
LOAD62	DAC	LSMPT		/ CURRENT ENTRY ADDRESS
	DAC	LSMW1
	SAD	LSMEND
	JMP	LOAD61+1		/ NOT FOUND
	LAC*	LSMPT		/ FETCH SYMBOL CODE OF NEXT ENTRY
	AND	LFTSVN
	XCT*	LOAD60
				/ DOES SYMBOL CODE MATCH SEARCH CODE
	JMP	LOAD61		/ YES
CONTIN	JMS	NXCNT		/ NO, UPDATE SEARCH ADDRESS TO NEXT ENTRY
	JMP	LOAD62
LOAD61	IDX	LOAD60		/ SYMBOL FOUND
	IDX	LOAD60		/ SYMBOL NOT FOUND
	JMP*	LOAD60
/SUBROUTINE TO RESOLVE VIRTUAL GLOBALS
/
LOAD81	DAC	LL010		/ SET PROPER READ CODE
	DAC	MODCAL		/ SET UP
	DAC	MDCAL2		/ I/O
	DAC	MDSEEK		/ CAL'S
	DAC	MDINIT
	DZM	RECDIN	/SET NEW READ INDICATOR.
/.INIT X
MDINIT	CAL
	1
L77777	77777
CODEWD	0		/LOADER CODE WORD
/.SEEK X,LIBDIR
MDSEEK	CAL			/ SEEK
	3			/ LIBR
	LIBDIR			/ FILE.
LOAD82	IDX	NOLOAD		/ LOAD SELECTIVELY
	JMS	LOAD60		/ SCAN SYMBOL TABLE TO SEE IF ANY

	SAD	(100000		/ UNRESOLVED GLOBALS EXIST
	JMP	MODCAL		/ALL GLOBALS RESOLVED
READ	JMS	LL000		/SEE IF THIS PROGRAM HELPS
	LAC	NOLOAD
	SZA
	JMP	READ		/NO VIRT. RESOLVED.
	JMP	LOAD82
LODSW	5
LODSW1	SAD	LODSW
	JMP	CLM4
/.CLOSE X
MDCAL2	CAL			/ .CLOSE .LIBR
	6			/ FILE
MDCL21	LAC	(022200
	SAD	LIBDR1		/ SWITCH TO SYSTEM LIBRARY IF EXTERNAL IS
	JMP	LOAD15		/EXHAUSTED. SYSTEM LIBRARY IS EXHAUSTED
	DAC	LIBDR1
	LAC	(777
	JMP	LOAD81		/ ONLY WHEN GLOBALS CANNOT BE RESOLVED.
/SUBROUTINE TO LOAD A PROGRAM UNIT.
/RETURNS WITH STARTING ADDRESS IN AC.
/IT IS DOUBLE BUFFERED EXCEPT WHEN
/IT IS LOADING DDT IN BULK STORAGE
/SYSTEMS.
LL000	0
	LAC	LL010		/PLACE .DAT SLOT #
	DAC	LL014		/IN .WAIT CALL AND
	DAC	LL015		/IN OTHER .READ CALL.
LL002	LAC	DDTMDE
	SMA			/IS DDT BEING LOADED.
	JMP	LL017		/NO.
LL018	LAC	LNBUF		/YES.SET POINTER
	DAC	LNBUFP		/TO BUFFER A
	LAC	LN2BUF		/SET UP 2ND .READ TO
	DAC	LL016		/READ INTO L2BUFF.
/.READ X,0,LNBUFF,50		/READ ONE LINE BUFFER
LL010	CAL	0		/OF BINARY WORDS
	10			/INTO LNBUFF.
LNBUF	LNBUFF			/ADDRESS LINE BUFFER 1
	-62
/.WAIT X				/WAIT FOR BINARY INPUT.
LL014	CAL	0
	12
LL001	LAC*	LNBUFP
	AND	L17
	SAD	PLUS6
	JMP	PRTEOM
	SAD	(5		/EOF
	JMP	LODSW1
	LAC*	LNBUFP		/CHECK BITS 12
	AND	(60		/AND 13 OF 1ST
	SZA			/WORD OF L.B. HEADER
	JMP	ERROR2		/FOR PARITY, CHECKSUM, BUF. OVRFLOW
	777000			/PICK UP THE WORD
	TAD*	LNBUFP		/PAIR COUNT AND
	AND	.-2		/MULTIPLY BY 2
	CLL!RAL			/SUBTRACT 2 FOR HEADER.
	DAC	WDCNT
	LAC	DDTMDE
	SPA!CLA!CMA		/IS DDT BEING LOADED
	JMP	LL041		/YES
	DAC	RECDIN		/INDICATES .READ IN PROGRESS.
/.READ X,0,BUFFX,50

LL015	CAL	0		/READ ONE LINE OF
	10			/BINARY WORDS INTO
LL016	XX			/L2BUFF OR LNBUFF
	-62

/DATA CODE WORD FETCH ROUTINE.
/THIS ROUTINE SELECTS THE CODE WORD FROM THE LINE BUFFER AND DETER-
/MINES WHICH DATA WORD PROCESSING ROUTINE TO ENTER.
/
LL041	IDX	LNBUFP		/SET LINE BUFFER POINTER TO WORD THREE OF
	IDX	LNBUFP		/THE LINE BUFFER WHICH IS THE FIRST WORD
				/OF THIS DATA LINE.
MIN4=.
LL005	LAW	-4		/STORE CODE WORD SHIFT TALLY TO DETERMINE
	DAC	CWDTAL		/WHEN NEXT CODE WORD IS TO BE SELECTED.
	JMS	WRDCHK		/STORE CODE WORD IN TEMP STORAGE FOR
	DAC	CODEWD		/FURTHUR USE.
CODE1	LAC	CODEWD
	ISZ	CWDTAL		/DECREASE CODE TALLY WORD.
	SKP!RTL
	JMP	LL005		/GO GET NEXT CODE WORD
	RTL			/SHIFT CODE WORD SO THAT PRESENT CODE IS
	RTL			/IN LOW ORDER SIX BITS (12-17) ACC.
	DAC	CODEWD
	RAL
	AND	(77		/EXTRACT OUT EVERYTHING BUT 12-17 (CODE)
	DAC	LTEMP1		/SAVE LOADING CODE
	LAC	NOLOAD
	SNA			/ONLY SELECTIVE LOADING CODES ARE
	JMP	LL009		/EXAMINED WHEN NO-LOAD IS IN EFFECT.
	LAC	LTEMP1		/SELECTIVE LOADING.
	SAD	(1
	JMP	LL009		/PROGRAM SIZE
	SAD	(7
	JMP	LL009		/SYMBOL
	SAD	(10
	JMP	LL009		/SYMBOL
	SAD	PLUS12		/INTERNAL GLOBAL DEFINITION-CODE10
	JMP	LL009
	SAD	(27		/END OF PROGRAM UNIT-CODE 23
	JMP	LL009
	.IFDEF	PDP15
	SAD	(31		/.EBREL
	JMP	LL009
	SAD	(32		/.DBREL
	JMP	LL009
	.ENDC
	SAD	(13		/BLOCK DATA SUBPROGRAM-CODE 11
	JMP	LL008
	JMS	WRDCHK		/BYPASS DATA WORD.
	JMP	CODE1		/FETCH NEXT CODE
LL008	DZM	NOLOAD		/CLEAR FOR BLOCK DATA LOADING
LL009	LAW	-33
	TAD	LTEMP1
	SMA
	JMP	ERROR2
	TAD	LL007		/ADD START ADDRESS OF TRANSFER VECTOR TABLE
	DAC	LL006		/STORE ADDRESS IN JMS TO PROPER DATA PROC.
	JMS	WRDCHK		/LOAD DATA WORD FOR THIS CODE
LL006	JMP*	ENTRY		/JUMP TO PROPER DATA WORD PROCESSOR PROG.
/END OF MEDIUM.
/	.WRITE -3,2,EOMBUF,4
PRTEOM	CAL	2775		/PRINTS ^S AT END OF LOAD, IF $LOAD.
	11			/NORMALLY IT PRINTS ^P AT AN EOM.
WRBFPT	EOMBUF			/THIS LOC INDEXED WHEN DOING ^S.
M3100	LAW	-3100		/CONSTANT
EOMBUF	JMP	.

				/NEW MEDIUM IN DEVICE
MDATND	-.DATND
	572417			/.ASCII <136>'P'<175>
	572477			/.ASCII <136>'S'<175>
	500000			/END OF ALTMODE.
LFTFVE=.-1

/TABLE OF DATA WORD PROCESSOR ADDRESSES
/
LL007	JMP*	ENTRY
	.DSA	ERROR2		/CODE 00 - ILLEGAL
	.DSA	LCD01		/CODE 01
	.DSA	LCD02		/CODE 02
	.DSA	LCD03		/CODE 03
	.DSA	LCD04		/CODE 04
	.DSA	LCD05		/CODE 05
	.DSA	LCD06		/CODE 06
	.DSA	LCD07		/CODE 07
	.DSA	LCD08		/CODE 08
	.DSA	LCD09		/CODE 09
	.DSA	LCD10		/CODE 10
	.DSA	LCD11		/CODE 11
	.DSA	LCD12		/CODE 12
	.DSA	LCD08		/CODE 13
	.DSA	LCD14		/CODE 14
	.DSA	LCD15		/CODE 15
	.DSA	LCD16		/CODE 16
	.DSA	LCD17		/CODE 17
	.DSA	LCD18		/CODE 18
	.DSA	LCD19		/CODE 19
	.DSA	LCD20		/CODE 20
	.DSA	LCD21		/CODE 21
	.DSA	LCD22		/CODE 22
	.DSA	LCD23		/CODE 23
	.DSA	CODE1		/CODE 24 - 18 BIT PARAMETER ASSIGNMENT
	.IFDEF	PDP15
	.DSA	LCD25		/CODE 25
	.DSA	LCD26		/CODE 26
	.ENDC
	.IFUND	PDP15
	.DSA	CODE1
	.DSA	CODE1
	.ENDC
ENTRY=.
WRDCHK	0			/CHECK IF BUFFER EXHAUSTED,
	LAC	WDCNT		/IF NOT RETURN WITH
	SNA			/WORD IN AC.
	JMP	LL002		/GO READ NEXT LINE.
	TAD	TH777		/DECREMENT WORD COUNT
	DAC	WDCNT		/BY 1.
	LAC*	LNBUFP		/PICK UP WORD.
	IDX	LNBUFP		/INDEX POINTER.
	JMP*	WRDCHK
/DDT NOT BEING LOADED---DOUBLE BUFFER.
LL017	LAC	RECDIN
	SNA			/IS .READ IN PROGRESS.
	JMP	LL018		/NO.
LL019	LAC	LL016		/SET UP TO PROCESS
	DAC	LNBUFP		/BUFFER JUST FILLED
	LAC	LNBUF
	SAD	LNBUFP
	LAC	LN2BUF
LL021	DAC	LL016		/SET UP TO READ
	JMP	LL014		/INTO OTHER
/CODE 01 DATA WORD PROCESSOR -PROGRAM UNIT SIZE
/
LCD01	SPA!CMA
	JMP	LDABS		/ABSOLUTE PROG.
	TAD	(1			/TWO'S COMP. PROGRAM UNIT SIZE
	DAC	SIZE			/STORE IN TEMP STORAGE
	LAC	NOLOAD
	SZA
	JMP	LDABS			/SELECTIVE LOAD

	JMS	FIT
	JMP	CODE1
FIT		0
	LAC	LPRESS		/START LOOKING AT HIGHEST CORE BANK.
	DAC	LPRESP
FITLP	IDX	LPRESP
	.IFUND	PDP15
	LAC LPRESP
	SAD (LPRESS
	JMP ERROR1		/NO MORE CORE.
	LAC*	LPRESP
	.ENDC
	.IFDEF	PDP15
	LAC*	LPRESP
	SAD	LPRESS
	JMP	ERROR1
	.ENDC
	SNA
	JMP FITLP			/NO ROOM IN THIS BANK.
	TAD	SIZE		/COMPUTE POSSIBLE LOAD ADDRESS
	TAD	(1
	DAC	LRELOC		/STORE RELOCATION FACTOR
	DAC	LPLA		/STORE PROGRAM LOAD ADDRESS
	SPA!CMA
	JMP ERROR1		/NO ROOM IN CORE.
	TAD LSMEND
	SMA!CLA
	JMP ERROR1		/OVERLAPPED THE SYMBOL TABLE.
	SAD COMFLG		/DEFINING COMMON?
	JMP NONCOM		/NO.
	LAC* LPRESP		/YES. WILL IT FIT IN THIS BANK?
	XOR LPLA
	.IFUND	PDP15
	AND (60000
	.ENDC
	.IFDEF	PDP15
	AND	(70000
	.ENDC
	SNA!CLC
	JMP ONEBNK		/YES.
	LAC LPRESP		/NO. REQUIRES BANK OVERLAPPING.
	DAC TEMP9
COMLP	IDX TEMP9			/POINT TO NEXT LOWER BANK.
	LAC* TEMP9		/BANK MUST BE UNUSED, I.E.
	.IFUND	PDP15
	AND L17777		/POINTER MUST POINT TO
	SAD L17777		/HIGHEST REGISTER IN THE BANK.
	.ENDC
	.IFDEF	PDP15
	AND	(7777		/POINTER MUST POINT TO
	SAD	(7777		/HIGHEST REGISTER IN THE PAGE
	.ENDC
	SKP
	JMP FITLP			/BANK IS IN USE.
	LAC* TEMP9		/IS THE LOAD ADDRESS IN THIS BANK?
	XOR LPLA
	.IFUND	PDP15
	AND (60000
	.ENDC
	.IFDEF	PDP15
	AND	(70000
	.ENDC
	SZA!CLC
	JMP COMLP			/NO.
	TAD LPLA
	DAC* TEMP9		/SET NEW FREE ADR. IN LOWEST USED BANK.
ZLOOP	LAW -1			/ZERO THE HIGHER POINTERS
	TAD TEMP9			/TO THE BANKS USED.
	DAC TEMP9
	DZM* TEMP9
	LAC TEMP9
	SAD LPRESP
	JMP BITMOR
	JMP ZLOOP
NONCOM	LAC LPLA
	TAD (-20			/PREVENT LOADING INTO 0-17 OF UPPER MEM BNKS
	XOR*	LPRESP
	.IFUND	PDP15
	AND	(60000		/DOES PROGRAM LIE ENTIRELY IN THE
	.ENDC
	.IFDEF	PDP15
	AND	(70000
	.ENDC
	SZA!CLC			/CURRENT MEMORY BLOCK
	JMP FITLP
ONEBNK	TAD LPLA
	DAC* LPRESP		/SET NEW FREE ADR. PTR. FOR THIS BANK.
	.IFUND	PDP15
	AND	L17777
	SAD	L17777
	.ENDC
	.IFDEF	PDP15
	AND	(7777
	SAD	(7777	/IN CASE LOAD ADDRESS IS 1ST LOCATION IN BANK
	.ENDC
	DZM*	LPRESP
BITMOR	LAW -1			/CALCULATE THE HIGHEST REGISTER
	TAD LPLA			/AVAILABLE FOR USE BY THE
	DAC TEMP9			/SYMBOL TABLE.
	CMA!CLL
	TAD LPRES
	LAC TEMP9
	SZL
	DAC LPRES
	JMP* FIT
TEMP9	0
COMFLG	0
	.IFDEF	PDP15
LCD25	LAC	(17777
	SKP
LCD26	LAC	(7777
	DAC	ADSWCH
	JMP	CODE1
	.ENDC
/
/ABSOLUTE PROGRAM.
LDABS	DZM	LRELOC		/NO RELOCATION.
	JMP	CODE1
/CODE 02 DATA WORD PROCESSOR - PROGRAM LOAD ADDRESS
/
LCD02	TAD	LRELOC		/THE PROGRAM LOAD ADDRESS IS ABSOLUTE
	DAC	LPLA		/IF BIT 0 IS A ONE AND LRELOC CONTAINS 0.
	JMP	CODE1
/CODE 03 DATA WORD PROCESSOR - RELOCATABLE INSTRUCTION
/
/CODE 04 DATA WORD PROCESSOR - ABSOLUTE INSTR/CONST/ADDRESS
/
LCD03	JMS	LMOD13		/GO ADD CURRENT RELOCATION FACTOR[MOD 13]
LCD04	DAC*	LPLA		/TO DATA WORD. STORE DATA WORD IN ADDRESS
	IDX	LPLA		/SPECIFIED BY PRESENT LOAD ADDRESS. RETURN
	JMP	CODE1		/TO PROCESS NEXT DATA WORD.
/CODE 05 DATA WORD PROCESSOR - RELOCATABLE VECTOR
/
LCD05	TAD	LRELOC		/ADD CURRENT RELOCATION FACTOR (MOD 15)
	JMP	LCD04		/STORE DATA WORD.
/CODE 06 DATA WORD PROCESSOR - NON COMMON STORAGE ALLOCATION
/
LCD06	TAD	LPLA		/ADD CURRENT PROGRAM LOAD ADDRESS
	JMP	LCD02+1		/STORE ADJUSTED LOAD ADDRESS
				/RETURN TO PROCESS NEXT DATA WORD
/CODE 07 DATA WORD PROCESSOR - SYMBOL-FIRST THREE CHARACTERS
/			 - RADIX 50 (OCTAL)
LCD07	DAC	LSYM1		/STORE FIRST WORD OF SYMBOL IN TEMP. STORE.
	JMP	CODE1		/RETURN TO PROCESS NEXT DATA WORD.
/
/
/CODE 08 DATA WORD PROCESSOR - SYMBOL-SECOND THREE CHARACTERS
/			 - RADIX 50 (OCTAL)
LCD08	DAC	LSYM2		/STORE SECOND WORD OF SYMBOL IN TEMMPORARY
	JMP	CODE1		/STORAGE RETURN TO PROCESS NEXT DATA WORD

/CODE 09 DATA WORD PROCESSOR - VIRTUAL GLOBAL SYMBOL DEFINITION
/
LCD09	TAD	(100000		/ADD CODE FLAG FOR VIRTUAL SYMBOL DEF.
	TAD	LRELOC		/ADD RELOCATION FACTOR
	DAC	LSMDEF		/STORE IN TEMPORARY DEFINITION LOCATION.
	JMS	LSMSCN		/SCAN SYMBOL TABLE TO DETERMINE IF THIS
	SZA
	JMP	CD092
LCD09A	JMS	LSMSTR
	JMP	CODE1
/	SNA			/SYMBOL HAS BEEN PREVIOUSLY ENTERED. GO SEE
/	JMP	CD106		/IF SYMBOL HAS BEEN DEFINED
				/STORE DEFINITION AND SYMBOL IN
				/SYMBOL TABLE AS THIS SYMBOL HAS NOT BEEN
/				/PREVIOUSLY ENTERED.
CD092	DAC*	LSMDEF		/STORE DEFINITION IN TRANSFER VECTOR.
	LAC*	LSMW1
	SPA			/IF GLOBAL IS STILL A VIRTUAL, GIVE IT
	JMP	CODE1		/THE ADDRESS OF THIS TRANSFER VECTOR
	LAC	LSMDEF		/AS ITS NEW DEFINITION (EFFECTIVELY
	DAC*	LSMW1		/STRINGING VIRTUAL VECTORS).
	JMP	CODE1
/ALL GLOBALS NOT RESOLVED.
ERROR3	LAC	(107	/G
	DAC	GSWCH
	JMS	LOAD60		/PRINT NAMES
	SAD	(100000		/OF UNRESOLVED
	JMP	ERR3		/GLOBALS.
	DZM*	LSMPT		/AVOID REPETITION.
	JMS	UFSMPT		/1ST 3 CHARS
	DAC	LSYM1		/OF NAME
	JMS	UFSMPT		/2ND OF 3 CHARS.
	DAC	LSYM2		/ OF NAME
	JMS	MEMAP1		/OUTPUT NAME
	LAC	(107	/G
	CLA
	JMP	ERROR3
				/KEEP GOING
ERROR2	LAW	17544		/DATA ERROR. - ASCII 2
ERROUT	DAC	ERRNO		/7-BIT ASCII ERROR NUMBER
/.WRITE -3,2,ERRBUF,10
	CAL	2775
	11
	ERRBUF
M50	LAW	-50
/.CLOSE -3
ERRCLS	CAL	775
PLUS6	6
/.EXIT
ERR1	CAL			/RETURN TO MONITOR.
	15
L17777=.
ERRBUF	17777
M1	LAW	-1
	.ASCII	' .LOAD '<177>
ERRNO=.-1
LFTSVN=ERRNO			/USED AS A LITERAL.
L17	17
LSYMBL	SYMBOL+500000
ERR3	LAW	17546		/ASCII 3
	JMP	ERROUT

/CODE 10 DATA WORD PROCESSOR - INTERNAL GLOBAL SYMBOL DEFINITION
/
LCD10	TAD	LRELOC		/ADD RELOC FACTOR - SET SYMBOL DEF.
LCD10E	DAC	LTEMP1		/ENTRY POINT FOR GLOBE ROUTINE.
	TAD	LFTFVE		/ADD INTERNAL GLOBAL SYM. DEF. CODE TO
	DAC	LSMDEF		/TO ADDRESS. STORE IN TEMPORARY DEFINITION
	JMS	LSMSCN		/LOCATION TILL SYMBOL IS LOCATED. GO SEE IF
	SZA			/SYMBOL HAS BEEN ENTERED IN SYMBOL TABLE.
	JMP	CD102		/JUMP IF SYMBOL IS IN THE TABLE.
	SAD	NOLOAD		/UNREQUESTED INTERNAL GLOBALS ARE LOADED
	SKP
	JMP	CODE1
				/WHEN THEY FOLLOW REQUESTED GLOBALS OR
				/DURING UNCONDITIONAL LOADING.
CD106	JMS	LSMSTR		/STORE DEFINITION AND SYMBOL IN SYMBOL
	JMS	MEMAP1
	LAC	(107	/G
	LAC	LTEMP1
GLOBX	JMP	CODE1		/TABLE AS THIS SYMBOL HAS NOT BEEN PREV-
/				/IOUSLY ENTERED.
CD102	DAC	LTEMP2		/SAVE REFERENCE ADDRESS IF UNDEFINED
	LAC*	LSMW1
	SPA!CLA			/CHECK TO SEE IF GLOBAL IS DEFINED
				/IF DEFINED, IT HAS ALREADY BEEN LOADED
	JMP	CODE1		/ALREADY DEFINED.
	SAD	NOLOAD
	JMP	CD107		/NON SELECTIVE LOAD
	JMS	FIT
	DZM	NOLOAD		/CLEAR FOR LOADING
	LAC	LRELOC
	TAD	LTEMP1
	DAC	LTEMP1
	TAD	LFTFVE
	DAC	LSMDEF
CD107	LAC	LSMDEF
	DAC*	LSMW1		/DEFINE SYMBOL AS INTERNAL GLOBAL
CD104	LAC*	LTEMP2
	AND	L77777		/MASK OFF UNIT NO.
	DAC	LSMDEF		/FETCH AND SAVE NEXT REFERENCE ADDRESS
	LAC*	LTEMP2
	AND	LFTSVN		/PRESERVE UNIT NO.
	XOR	LTEMP1
	DAC*	LTEMP2
				/PUT SYMBOL DEF. IN CONTENTS OF REF. ADR.
	LAC	LSMDEF
	SAD	LTEMP2		/CHAIN COMPLETE WHEN NEXT CHAIN ADDR = SELF.
	JMP	CD106+1		/GLOBE ROUTINE PUTS 'JMP REST' HERE.
	DAC	LTEMP2
	JMP	CD104

/CODE 11 DATA WORD PROCESSOR - BLOCK DATA DECLARATION
/
LCD11	CMA			/2'S COMP
	TAD	(1		/SUBTRACT BLOCK SIZE FROM PRESENT LOAD
	DAC	SIZE		/ADDRESS TO DETERMINE NEW LOAD ADDRESS.
	IDX	COMFLG		/ALLOW BLOCKDATA TO OVERLAP BANKS.
	JMS	FIT
	DZM	COMFLG
	LAC	LRELOC
	DAC	LBDF		/NEW LOAD ADDRESS ALSO DETERMINES START
	JMP	CODE1		/RETURN TO PROCESS NEXT CODE WORD
/CODE 12 DATA WORD PROCESSOR - COMMON BLOCK DEFINITION
/
LCD12	DAC	LTEMP2		/STORE DATA WORD IN TEMPORARY STORAGE.
	TAD	LFTSVN		/ADD COMMON BLOCK CODE TO BLOCK SIZE AND
	DAC	LSMDEF		/SET IT UP AS THE DEFINITION.
	JMS	LSMSCN		/SCAN SYMBOL TABLE TO DETERMINE IF BLOCK
	SZA			/NAME HAS BEEN PREVIOUSLY ENTERED.
	JMP	CD123		/YES
	JMS	LSMSTR		/NO, ENTER BLOCK NAME FOR FIRST TIME
	LAC	LSMEND
	DAC	LCMCHN		/SET ADDRESS OF COMMON CHAIN
	DZM*	LCMCHN		/INITIALIZE CHAIN TO SHOW NO MEMBERS
	JMS	LPTCNT
	LAC	LSMEND
	DAC	LCMDEF		/SET ADDRESS OF BLOCK DEFINITION
	JMS	LPTCNT
	JMP	CD126
CD123	DAC	LTEMP1		/SAVE OLD BLOCK SIZE
	LAC	LSMPT		/INCREASE SYMBOL TABLE POINTER TO POINT
	TAD	(1		/TO COMMON CHAIN WORD START OF COMMON
	DAC	LCMCHN		/BLOCK ENTRY. STORE POINTER TO POINT AT
	TAD	(1		/BLOCK DEFINITION WORD.
	DAC	LCMDEF
CD124	LAC	LTEMP1		/COMPARE BLOCK LENGTHS TO SEE WHICH IS
	CMA			/GREATER.
	TAD	LTEMP2
	SPA
	JMP	CD126		/NEW COMMON SIZE IS NOT GREATER THAN OLD.
CD125	LAC*	LCMDEF		/IS THIS COMMON BLOCK DEFINED. IF YES, GO TO
	SZA			/ERROR AS NEW BLOCK SIZE IS LARGER THAN
	JMP	ERROR3		/THE DEFINED BLOCK SIZE.
	LAC	LSMDEF		/STORE NEW BLOCK SIZE INTO DEFINITIONS
	DAC*	LSMW1		/BLOCK SIZE WORD.
CD126	LAC	LBDF		/THE COMMON BLOCK IS DEFINED IF THIS IS
	DAC*	LCMDEF		/A BLOCK DATA SUBPROGRAM.
	SNA
	JMP	CODE1		/NO, GET NEXT DATA WORD.
	JMS	MEMAP1
	LAC	(103
	LAC	LBDF
	TAD	LTEMP2		/YES, UPDATE BLOCK STARTING ADDRESS FOR
	DAC	LBDF		/NEXT COMMON BLOCK.
	JMS	DEFCOM		/DEFINE EXISTING COMMON MEMBERS
	JMP	CODE1
/SUBROUTINE TO DEFINE COMMON BLOCK NUMBERS
/
DEFCOM	CAL	0
	LAC*	LCMCHN		/LOAD FIRST WORD OF COMMON BLOCK DEFINI-
	DZM*	LCMCHN		/TION (CHAIN START ADDRESS). IF THE CHAIN
CD127	SNA			/ADDRESS IS ZERO, RETURN TO PROCESS NEXT
	JMP*	DEFCOM		/DATA WORD.

	DAC	LCMCHN
	TAD	(1		/DETERMINE AND STORE ADDRESSES OF SECOND
	DAC	LCHN1		/(TRANSFER VECTOR ADDRESS) AND THIRD
	TAD	(1		/(RELATIVE ADDRESS) WORDS OF COMMON NAME
	DAC	LCHN2		/ENTRY TO BE ASSIGNED.
	LAC*	LCHN1
	DAC	LCHN1		/SET ADDRESS OF TRANSFER VECTOR
	LAC*	LCHN2		/LOAD RELATIVE ADDRESS OF THIS ENTRY.
	TAD*	LCMDEF		/ADD STARTING LOCATION OF THIS BLOCK.
	DAC*	LCHN1		/STORE ADDRESS IN LOCATION SPECIFIED BY
	LAC*	LCMCHN		/TRANSFER VECTOR ADDRESS. LOAD NEXT CHAIN
	AND	L77777		/MASK OFF ID BITS
	JMP	CD127		/REFERENCE AND RETURN.
/CODE 13 DATA WORD PROCESSOR - COMMON SYMBOL DEFINITION (REL. ADDR.)
/SAME AS CODE 08.
/
/CODE 14 DATA WORD PROCESSOR - COMMON SYMBOL REFERENCE DEFINITION
/(ADDRESS OF TRANSFER VECTOR)
/
LCD14	TAD	(400000		/ADD IN A ONE IN THE SIGN SO THIS ENTRY
	TAD	LRELOC
	DAC	LSYM1		/WILL LOOK LIKE A TWO WORD NAME IN THE
	LAC*	LCMDEF		/SYMBOL TABLE. CHECK IF THE COMMON BLOCK
	SZA			/WHICH THIS ENTRY IS RELATED, IS ASSIGNED.
	JMP	CD141		/IF IT IS, GO STORE THIS SYMBOL LOC. IN
	LAC*	LCMCHN		/THE TRANSFER VECTOR. IF NOT ASSIGNED,
/				/LINK SYMBOL TO THIS COMMON CHAIN. THIS IS
	TAD	(400000		/DONE BY PLACING THE ADDRESS AN THE CHAIN
	DAC	LSMDEF		/LOC. OF THE COM. BLK. DEF. IN THE CHAIN
	LAC	LSMEND		/ADDRESS OF THE NEW ENTRY, AND THE START
/				/ADDRESS OF THE NEW ENTRY IN THE COM.
	DAC*	LCMCHN		/BLK. CHAIN. THIS ENTRY IS THEN STORED BY
	JMP	LCD09A		/THE NORMAL SYMBOL STORE SUBROUTINE.
				/RETURN TO PROCESS NEXT DATA WORD.
				/COMMON BLOCK WAS ASSIGNED, THEREFORE,
CD141	TAD	LSYM2		/ADD THE LOCATION TO RELOCATION FACTOR,
	DAC*	LSYM1		/AND STORE IN TRANSFER VECTOR LOCATION.
	JMP	CODE1		/RETURN TO PROCESS NEXT DATA WORD
/CODE 15 DATA WORD PROCESSOR - DATA INITIALIZATION CONSTANT (1ST WORD)
/
LCD15	DAC	LDATA1		/STORE DATA WORD FOR FUTURE USE.
	JMP	CODE1		/RETURN TO PROCESS NEXT DATA WORD.
/
/CODE16 DATA WORD PROCESSOR - DATA INITIALIZATOOO'CONSTANT (2ND WORD)
/
LCD16	DAC	LDATA2		/STORE DATA WORD FOR FUTURE USE.
	JMP	CODE1		/RETURN TO PROCESS NEXT DATA WORD.
/
/CODE 17 DATA WORD PROCESSOR - DATA INITIALIZATION CONSTANT (3RD WORD).
/
LCD17	DAC	LDATA3		/STORE DATA WORD FOR FUTURE USE.
	JMP	CODE1		/RETURN TO PROCESS NEXT DATA WORD.
/
/CODE 18 DATA WORD PROCESSOR - DATA INITIALIZATION CONSTANT DEFINITION
/
LCD18	DAC	LTEMP1		/STORE DATA WORD IN TEMPORARY STORAGE AND
	LAC	LBDF		/TEST IF BLOCK DATA FLAG IS SET. IF THE
	SNA			/BDF IS SET ADD THE ADDRESS OF THE LAST

	JMP	CD181		/COMMON BLOCK LOADED TO THE DATA WORD LOAD
	LAC*	LCMDEF		/ADDRESS, IF BDF NOT SET, ADD PRESENT RELO-
				/CATION FACTOR TO DATA WORD ADDRESS. STORE
	SKP			/THE ADJUSTED ADDRESS IN TEMPORARY STORAGE
CD181	LAC	LRELOC		/FOR FURTHUR REFERENCE.
	TAD	LTEMP1
CD182	DAC	LTEMP1
	LAC	LDATA1		/STORE FIRST DATA INITIALIZATION CONSTANT.
	DAC*	LTEMP1
	IDX	LTEMP1		/INCREMENT STORAGE ADDRESS FOR NEXT CON-
	LAC	LTEMP1		/STANT, IF ANY TO BE STORED, EXTRACT OUT ALL
	AND	(300000		/BITS OF DEFINITION WORD EXCEPT BITS 1-2.
	SZA
	SAD	(300000		/TEST IF BITS 1-2 OF DATA WORD EQUAL 11
	JMP	CODE1		/IF SO RETURN TO PROCESS NEXT DATA WORD.
	LAC	LDATA2		/STORE SECOND DATA WORD IN SPECIFIED ADDR.
	DAC*	LTEMP1
	IDX	LTEMP1		/INCREMENT STORE ADDRESS FOR NEXT DATA WD.
	LAC	LTEMP1		/TEST BIT 1-2 OF DEFINITION WORD. IF EQUAL
	AND	(300000		/TO 01 (REAL CONSTANT) RETURN TO PROCESS
	SAD	(100000		/NEXT CODE WORD. IF NOT EQUAL TO 01, SELECT
	JMP	CODE1		/AND STORE THIRD CONSTANT WORD AS CONSTANT
	LAC	LDATA3		/MUST BE A DOUBLE PRECISION NUMBER
	DAC*	LTEMP1
	JMP	CODE1		/RETURN TO PROCESS NEXT DATA WORD
/CODE 19 DATA WORD PROCESSOR - INTERNAL SYMBOL DEFINITION/ PROGRAM NAME
/
LCD19	SPA			/IF BIT ZERO OF THE DATA WORD IS A ONE, IN-
	TAD	(200000		/DICATING PROGRAM NAME, SET CODE FLAG TO 6
	TAD	LRELOC		/ADD CURRENT RELOCATION FACTOR TO ADDRESS.
	DAC	LSMDEF		/STORE SYMBOL DEFINITION.
	RAL		/L=1, PROGRAM NAME.
	LAC	DDTMDE
	SPA!CMA
	JMP	CODE1		/DDT.
	SNL!RTL		/OUTPUT PROG NAME IN LDR. MEM. MAP
	JMP	LCD31
	JMS	MEMAP1
	LAC	(120	/P
	LAC	LRELOC
	LAC*	(.SCOM+6
LCD31	SPA
	JMS	LSMSTR		/GO TO STORE SYMBOL AND DEFINITION
	JMP	CODE1		/NOT EVEN PROGRAM NAME IF NOT DDT
LLCTLP	CAL	775		/CR/LF AFTER ECHOING ^P
	6
	JMP	LL018
OUTBF2	011000
PER50	127400			/(.) IN RADIX 50(OCTAL)
CHRTP1	XX
	40		/SPACE
SYMBOL	.BLOCK	6
	40			/SPACE
OCTAL5	.BLOCK	5
PLUS15	15			/C.R.
PLUS12	12			/L.F.
/PUT RADIX 50 SYMBOL IN LSYM1 AND LSYM2
/JMS MEMAP1
/LAC (120	/P - 120;C - 103;G - 107
/LAC VALUE	/VALUE CONTAINS NUMBER TO BE OUTPUT
GSWCH	0
CSWCH	0
PSWCH	0
OPSWCH	0
OCT177	177
MEMAP1	0
	XCT*	MEMAP1
	SAD	PSWCH
	JMP	MEMAP2
	SAD	CSWCH
	JMP	MEMAP2
	SAD	GSWCH
	SKP
	JMP*	MEMAP1
MEMAP2	LAC	LSYMBL
	DAC	LTEMP6
	CAL	775
	12		/.WAIT -3
	XCT*	MEMAP1
	DAC	CHRTP1
	ISZ	MEMAP1
	LAC	LSYM1
	AND	(177777
	JMS	CONWRD
	LAC	LSYM1
	SPA!CLA
	LAC	LSYM2
	JMS	CONWRD
	IDX	LTEMP6
	LAW	-5
	DAC	LTEMP2
	XCT*	MEMAP1
	RTL
	RTL
LCD015	RTL
	RAL
	DAC	LTEMP3
	AND	(7
	TAD	(60
	DAC*	LTEMP6
	IDX	LTEMP6
	LAC	LTEMP3
	ISZ	LTEMP2
	JMP	LCD015
	CAL	3775
	11
	OUTBF2
FFTSIX	56
	JMP*	MEMAP1
/ENTER WITH RADIX 50(OCTAL)
/WORD IN AC
CONWRD	0
	JMS	DIVIDE
	TAD	M3100		/50X50
	LAC	LTEMP7		/REMAINDER
	JMS	DIVIDE
	TAD	M50
	LAC	LTEMP7		/3RD CODE CHAR.
	JMS	CONVER
	JMP*	CONWRD
/CALLING SEQUENCE:
/RADIX 50 (OCTAL) WORD IN AC.
/JMS DIVIDE
/TAD (-3100 OR -50)
/(RETURN)
DIVIDE	0
	DZM	LTEMP5		/INITIALIZE COUNTER.
DIV1	DAC	LTEMP7		/SAVE BACKUP NUMBER.
	XCT*	DIVIDE
	SPA
	JMP	DIV2		/DIVIDE WAS NOT POSSIBLE
	IDX	LTEMP5		/INDEX COUNTER
	JMP	DIV1
DIV2	LAC	LTEMP5		/OCTAL CODE

	JMS	CONVER
	IDX	DIVIDE
	JMP*	DIVIDE
/ROUTINE TO CONVERT OCTAL CODE (RADIX 50)
/TO 7-BIT ASCII CHAR.
/CALLING SEQUENCE:
/	OCTAL CODE IN AC
/	JMS CONVER
/	(RETURN)
CONVER	0
	SNA
	LAW -40			/SPACE.
	SAD	(33
	LAW -33			/%.
	SAD	(34
	LAC (33			/.
	SAD	(47
	LAW -35			/#
	TAD .-5
	SPA
	TAD	(55		/A-Z
	TAD FFTSIX		/(56 FOR 0-9
	DAC*	LTEMP6		/SYMBOL BUFFER POINTER
	IDX	LTEMP6		/INDEX POINTER
	JMP*	CONVER
/CODE 20 DATA WORD PROCESSOR - STRING CODE (FIRST HALF)
/
LCD20	TAD	LRELOC		/ADD CURRENT RELOCATION FACTOR TO ADDRESS.
	DAC	LSTRNG		/AND STORE FOR FURTHUR USE.
	JMP	CODE1		/RETURN TO PROCESS NEXT DATA WORD.
/
/CODE 21 DATA WORD PROCESSOR - STRING CODE (SECOND HALF)
/
LCD21	JMS	LMOD13		/ADD THE PRESENT RELOCATION FACTOR (MODULO
	DAC	LTEMP1		/12/13 BITS) TO THE REPLACEMENT ADDRESS.
	.IFUND	PDP15
	LAW	0		/EXTRACT OUT THE LOW ORDER 12/13 BITTS OF THE
	.ENDC
	.IFDEF	PDP15
	LAW	10000
	.ENDC
	AND*	LSTRNG		/WORD WHOSE ADDRESS IS TO BE REPLACED BY
	TAD	LTEMP1		/THIS DATA WORD. ADD IN THIS DATA WORD AND
	DAC*	LSTRNG		/STORE ADJUSTED WORD BACK.
	JMP	CODE1		/RETURN DO PROCESS NEXT DATA WORD.
/CODE 22 DATA WORD PROCESSOR - .IODEV REQUEST.
/
LCD22	SPA
	JMP	IODALL		/.IODEV ALL.
	JMS	IOPROS		/PROCESS .IODEV REQUEST
	JMP	CODE1
/SUBROUTINE TO PROCESS .IODEV REQUESTS.
/.DAT SLOT NUMBER IN AC(9-17), 2'S COMP. WHEN NEG.
IOPROS	0
	DAC	LTEMP1		/SAVE .DAT SLOT NUMBER.
	SNA
	JMP	IOERR2		/0 ILLEGAL .DAT SLOT.
	AND	(400
	SZA!CLA

TH777	LAW	17000		/NEGATIVE .DAT SLOT.
	XOR	LTEMP1
	TAD	DAT.
	DAC	LTEMP2		/ADDRESS OF .DAT SLOT.
	TAD	MDATND		/(-.DATND
	SMA
	JMP	IOERR2		/ILLEGAL .DAT SLOT.
		-.DATBG		/LAW -.DATBG
	TAD	LTEMP2
	SPA
	JMP	IOERR2		/ILLEGAL .DAT SLOT.
	LAC*	LTEMP2
	AND	L77777
	SNA
	JMP	IOERR2		/CONTENTS 0 - ILLEGAL .DAT SLOT.
	SAD	(1
	JMP	IOTTY		/TT1.
	SAD*	(.SCOM+7
	JMP	IOSC07
	SAD*	(.SCOM+10
	JMP	IOSC10
	SAD*	(.SCOM+11
	JMP	IOSC11
	.IFUND PTP
	TAD*	IOCONF
	.ENDC
	.IFDEF PTP
	TAD IOCONF
	.ENDC
	SMA!SZA			/NEG.  OR ZERO
	JMP*	IOPROS		/.DAT SLOT ALREADY SET UP.
	.IFUND PTP
	TAD	IOCONF		/PICK UP 1ST 3 CHARS. OF SYM.
	TAD	M1
	DAC	LSYM1
	LAC*	LSYM1
	.ENDC
	.IFDEF PTP
	TAD (LAC IOCONF-1
	DAC	.+1
	HLT			/MODIFIED.
	.ENDC
	DAC	LSYM1		/1ST 3 CHARS. OF SYMBOL.
	LAC	PER50		/4TH CHAR OF SYMBOL (.).
	DAC	LSYM2		/IN RADIX 50 (OCTAL).
	LAC	LTEMP2		/ADDRESS OF .DAT SLOT.
	TAD	(100000		/ADD CODE FLAG FOR VIRTUAL SYM. DEF.
	DAC	LSMDEF		/STORE IN TEMP. DEF. LOCATION.
	JMS	LSMSCN		/SCAN SYMBOL TABLE TO
	SZA			/DETERMINE IF THIS SYMBOL
	JMP	IOALIN		/HAS BEEN PREVIOUSLY ENTERED.
	JMS	LSMSTR		/STORE IN SYMBOL TABLE.
	LAC*	LTEMP2		/MAKE 1ST T.V. OF
	AND	LFTSVN		/STRING POINT TO
	XOR	LTEMP2		/ITSELF TO TERMINATE
IOPXIT	DAC*	LTEMP2		/RESOLUTION OF GLOBALS.
	JMP*	IOPROS		/EXIT.
IOALIN	DAC	LTEMP1		/ADDRESS OF LAST T.V. IN CHAIN.
	LAC	LSMDEF
	DAC*	LSMW1
	JMP	IOPREU
IOERR2	LAW	17550		/ILLEGAL .DAT SLOT. - ASCII 4
	JMP	ERROUT
IOTTY	LAC*	(.DAT-3		/ADDRESS OF TTY HANDLER.

	JMP	IOPXIT
IOSC07	LAC*	(.DAT-1		/.DAT-1
	AND	L77777		/MASK OFF UNIT NUMBER.
	DAC	LTEMP1
	LAC	(LDBEG		/START OF LOADER.
	DAC*	(.SCOM+1		/PRESERVE LINK. LOADER HANDLERS FOR USER.
IOPREU	LAC*	LTEMP2		/PRESERVE UNIT NUMBER.
	AND	LFTSVN
	XOR	LTEMP1
	JMP	IOPXIT
IOSC10	LAC*	(.DAT-4		/.DAT-4
	JMP	IOSC07+1
IOSC11	LAC*	(.DAT-5		/.DAT-5
	JMP	IOSC07+1
	.IFUND PTP
IOCONF	0		/POINTER TO TOP OF IOC TABLE.
	.ENDC
	.IFDEF PTP
/ I/O CONFIGURATION TABLE.
TABIOC	500041		/TTA (1)
	463321		/PRA (2)
	463322		/PRB (3)
	463201		/PPA (4)
	463202		/PPB (5)
	463203		/PPC (6)
	446601		/LPA (7)
	411542		/CDB (10)
	452141		/MTA (11)
	452143		/MTC (12)
	452146		/MTF (13)
	506001		/VPA (14)
	.IFDEF	PDP9
	415721		/DRA (15)
	415722		/DRB (16)
	415723		/DRC (17)
	415724		/DRD (20)
	.ENDC
	.IFUND	PDP9
	0
	0
	0
	0
	.ENDC
IOCONF	.-TABIOC		/2'S COMPL. # OF ENTRIES.
	.ENDC
/PROCESS .IODEV ALL REQUEST.
/ALL POSITIVE .DAT SLOTS THAT DO NOT
/CONTAIN 0 ARE REQUESTED.
IODALL	DZM LTEMP4
	IDX LTEMP4
	LAC LTEMP4
	TAD DAT.
	DAC LTEMP2		/ADDRESS OF .DAT SLOT
	TAD	MDATND		/(-.DATND
	SMA!CLA
	JMP CODE1			/END OF .DAT TABLE.
	SAD* LTEMP2
	JMP IODALL+1		/BYPASS 0 SLOT.
	LAC LTEMP4
	JMS IOPROS
	JMP IODALL+1
/ CODE 23 DATA WORD PROCESSOR - END OF PROGRAM UNIT
/
LCD23	DZM	LBDF		/RESET BLOCK DATA FLAG
	.IFDEF	PDP15
	DAC	LTEMP1		/STORE TEMPORARILY
	LAC	(7777		/RESTORE PAGE MODE RELOCATION
	DAC	ADSWCH		/IN CASE THIS PROGRAM UNIT DESTROYED IT
	LAC	LTEMP1		/UFETCH START ADDRESS
	.ENDC
	TAD	LRELOC		/RETURN WITH START ADDRESS OF PROGRAM IN AC
	JMP*	LL000
/SYMBOL TABLE SCAN ROUTINE - THIS SUBPROGRAM SCANS THE SYMBOL TABLE
/   FOR EQUAL SYMBOLS AND RETURNS WITH THE SYMBOL DEFINITION
/   ENTRY IN ACCUMULATOR OR ALL ZEROS IN ACCUM.  IF NO MATCH FOUND.
/CALLING SEQUENCE
/	JMS	LSMSCN
LSMSCN	CAL	0
	LAC	LSMST		/ STORE SYMBOL TABLE STARTING ADDRESS IN
LSCN03	DAC	LSMW1		/ TEMPORARY POINTERS.
	DAC	LSMPT
	SAD	LSMEND		/ THE SYMBOL IS NOT IN THE TABLE IF ALL
	JMP	LSCN01		/ HAS BEEN SCANNED.
	LAC*	LSMW1
	XOR	LSMDEF		/ THE SYMBOL TO BE EXAMINED MUST BE THE
	AND	(300000		/ SAME TYPE AS THE SEARCH SYMBOL.
	SZA			/ I.E. GLOBAL VS. GLOBAL
	JMP	LSCN02		/ COMMON BLOCK NAME VS. SAME
	JMS	UFSMPT		/THE SYMBOL IS FOUND WHEN THE NAME
	SAD	LSYM1		/ WORK (S) MATCH.
	JMP	LSCN04
	JMP	LSCN02

LSCN04	SMA
	JMP	LSCN05
	JMS	UFSMPT
	SAD	LSYM2
	JMP	LSCN05		/ THEN A MATCH CANNOT BE MADE, THE SEARCH
LSCN02	JMS	NXCNT		/ ADDRESS IS UPDATED TO THE NEXT ENTRY IN
	JMP	LSCN03		/ THE TABLE.
LSCN05	LAC*	LSMW1
	AND	L77777		/THE DEFINITION OF THE SYMBOLL IS RETURNED
	JMP*	LSMSCN		/ AS A SIGNAL DAT THE NAME WAS FOUND.
LSCN01	CLA
	JMP*	LSMSCN		/ ZERO INDICATES THE SYMBOL WAS NOT FOUND.
/SUBROUTINE TO INCREMENT SYMBOL TABLE COUNTER
/ TO POINT TO NEXT ENTRY.
NXCNT	CAL	0
	LAC	LSMW1		/1ST WORD OF THIS ENTRY
	DAC	LSMPT
	JMS	UFSMPT		/ ALL ENTRIES IN THE SYMBOL TABLE ARE
	SPA			/ EITHER 2 OR 4 WORDS LONG (NOT COUNTING
	IDX	LSMPT		/ THE SECOND NAME WORD).
	IDX	LSMPT
	LAC*	LSMW1		/ ONLY ENTRIES FOR COMMON BLOCK NAMES
	AND	(300000		/ ARE 4 (5) WORDS IN LENGTH
	SAD	(300000		/ FOR CODES 7 AND 3
	JMP	NXCNT1
	JMP	NXCNT2
NXCNT1	IDX	LSMPT
	IDX	LSMPT		/ THE NEXT ENTRY ADDRESS IS RETURNED TO
NXCNT2	LAC	LSMPT		/ THE CALLING PROGRAM.
	JMP*	NXCNT
/SUBROUTINE TO STORE A SYMBOL AND ITS DEFINITION IN THE SYMBOL TABLE
/
LSMSTR	CAL	0
	LAC	LSMDEF		/STORE SYMBOL DEFINITION IN SYMBOL TABLE
	JMS	LSTSYM
	LAC	LSYM1		/ STORE 1ST 3 CHARS OF SYM. IN SYMTAB
	SMA			/ TEST TO SEE IF SYM.> 3 CHARS.
	JMP	SMSTR1
	JMS	LSTSYM
	LAC	LSYM2		/ STORE SECOND WORD OF SYMBOL IN TABLE.
SMSTR1	JMS	LSTSYM
	JMP*	LSMSTR		/ RETURN TO CALLING PROGRAM.
/SUBROUTINE TO INCREASE STORE ADDRESS FOR ENTERING A NEW SYMBOL IN
/SYMBOL TABLE AND CHECKING FOR SYMBOL TABLE OVERFLOW
/
LPTCNT	CAL	0
	IDX	LSMEND		/ INCREASE SYMBOL TABLE END POINTER
	LAC	LPRES
	CMA
	TAD	LSMEND		/ COMPARE SYMTAB END PTR TO END OF FREE STORAGE.
	SPA			/IF STORAGE HAS BEEN EXCEEDED, ERROR.
	JMP*	LPTCNT		/ RETURN TO CALLING PROGRAM
/MEMORY OVERFLOW
ERROR1=.
ERROR4	LAW	17542
	JMP	ERROUT
/ADD 12/13 BIT CURRENT RELOCATION FACTOR TO DATA WORD ADDRESS SUB-
/ROUTINE.
/CALLING SEQUENCE
/	JMS	LMOD13

/
	.IFDEF	PDP15
ADSWCH	7777
	.ENDC
LMOD13	CAL	0
	DAC	LTEMP1		/ STORE DATA WORD IN TEMP. STORAGE
	LAC	LRELOC		/ LOAD 15 BIT ADDRESS
	.IFUND	PDP15
	AND	L17777		/ EXTRACT OUT BITS (13) 14 AND 15
	.ENDC
	.IFDEF	PDP15
	AND	ADSWCH
	.ENDC
	TAD	LTEMP1		/ ADD DATA WORD TO 12/13 BIT ADDRESS
	JMP*	LMOD13		/ RETURN TO CALLING PROGRAM
/SUBROUTINE TO UPDATE LSMPT AND FETCH
UFSMPT	0
	IDX	LSMPT
	LAC*	LSMPT
	JMP*	UFSMPT
/SUBR. TO STORE DATA IN SYMTAB AND UPDATE LSMEND.
LSTSYM	0
	DAC*	LSMEND
	JMS	LPTCNT
	JMP*	LSTSYM
	.IFDEF PTP
	.END BANK*20000+17720
	.ENDC
	.IFUND PTP
	.END	.LOAD
	.ENDC
