	.TITLE .SYSLD		/SYSTEM LOADER.
/
/ EDIT #30
/
/ COPYRIGHT 1969,1970 DIGITAL EQUIPMENT CORP.,MAYNARD, MASS.
/
/PDP-15 ADVANCED SOFTWARE PACKAGE - SYSTEM LOADER (ANY MEMORY BANK)
/JAMES J. MURPHY, JR.   
/4-24-70
/
/ CONDITIONAL PARAMETER ASSIGNMENT:
/   PDP9=0   FOR PDP-9 KEYBOARD MONITOR .SYSLD
/
/	***********************************
/	INTERFACE WITH NON-RESIDENT MONITOR
/	THE ADDRESS IN THE SYSTEM LOADER
/	TAGGED .SYSLD MUST BE MADE KNOWN
/	TO THE NON-RESIDENT MONITOR VIA A
/	PARAMETER ASSIGNMENT DURING ASSEMBLY
/	OF THE MONITOR.
/	***********************************
/
	.ABS
	.LOC	15400
.MED=3
.SCOM=100				/ABSOLUTE REFERENCES
	.IFUND	PDP9
PDP15=0
	.ENDC
	.IFUND	SCOM20
SCOM20=.SCOM+20
	.ENDC
	.IFUND	COMTAB
COMTAB=15000
	.ENDC
.DTBEG=17663			/REGISTERS
.DTSRC=17644			/IN
.DTBLK=17637			/SYSTEM
.DTCA=17640			/BOOTSTRAP
.DTWC=17641
DBA=707762
EBA=707764
IDX=ISZ
/
/BUFFERS AND TEMPORARY STORAGE.
/
LNBUFF=.				/LINE BUFFER HEADER.
LNBUF2=.+2			/LINE BUFFER BODY
L2BUFF=.+62			/LINE BUFFER #2
/
/
/ PROGRAM ENTRY
/
.SYSLD	DAC SCOM5S		/SAVE ADDR. OF JMP.T1
	CAL+771			/.INIT -7
	1
	0
	0
	LAW	-7
	TAD*	(.SCOM+23
	DAC	.DATM7
	TAD	(2
	DAC	.DATM5
	TAD	(1
	DAC	.DATM4
	TAD	(1
	DAC	.DATM3
	TAD	(2
	DAC	.DATM1
	LAC*	(.SCOM+2		/LOWEST FREE ADDRESS.
	DAC	LPRES		/PRESENT LOAD ADDRESS.
	DAC	LPRES0		/LOWEST FREE ADDRESS IN 1ST PAGE(BANK).
	DAC* (10
	LAC*	(.SCOM+3		/HIGHEST FREE ADDRESS.
	DAC	IOCONF		/ADDRESS OF TOP OF IOC TABLE.
	LAW	-1
	TAD*	IOCONF
	DAC	MOVCNT		/2'S COMP. OF SIZE OF IOC TABLE.
	TAD	IOCONF
	DAC	MOVADD
	ISZ	MOVADD		/BOTTOM OF IOC TABLE.
	DAC*	(.SCOM+3		/NEW .SCOM+3
	DAC	LSMST		/SYMBOL TABLE START
	DAC	LSMEND		/SYMBOL TABLE END
	DZM* 10
	SAD* (10
	SKP			/ADJUST TO MEM. BANK.
	JMP .-3
/BANK RELOCATION
	AND	(060000)
	DAC	XBANK
	DAC	XXBANK
	XOR	BRATTV
	DAC	LTEMP1
BRL	LAC*	LTEMP1
	SPA
	JMP	FPRGCD
	XOR	XBANK
	DAC	LTEMP2
	LAC*	LTEMP2
	XOR	XBANK
	DAC*	LTEMP2
	ISZ	LTEMP1
	JMP	BRL
/
BRATBL	CPXAD		/BANK RELOCATION ADDRESS TABLE
	LNBUF
	LN2BUF
	XKMD01
	XKMD02
	XKMD04
	LPRESS
	XCTTMP
	-1		/END OF TABLE
/
FPRGCD	LAC*	(.SCOM+5)	/FETCH PROGRAM CODE
	SAD	(13)	/EXECUTE?
	SKP
	JMP	SYSBCK	/NO
	CAL+776		/YES -- SETUP ^P TRANSFER ADDRESS
	1
CPXAD	CPTED
	0
	LAC	EXEFIL	/CHANGE SEEK DATA
	DAC	LLDDIR	/FROM '.LOAD@BIN' TO
	LAC	EXEFIL+1	/'EXECUTBIN'.
	DAC	LLDDIR+1
	LAC	JMPEXC	/DON'T MOVE IOC TABLE
	DAC	MOVBCK	/FOR EXECUTE.
	LAC*	SCOM11	/IF .SCOM+11 CONTAINS
	SAD	XCT6BT	/.SIXBT 'XCS', EXECUTE
	JMP	SYSBCK	/AND .SYSLD WILL USE
			/THE SAME I/O DEVICE.
/
/ .SCOM+11 CONTAINS 'XCS' -- TWO COPIES OF THE SYSTEM DEVICE
/ HANDLERS WILL BE LOADED.  ONE IN HIGH CORE FOR .SYSLD'S USE 
/  VIA .DAT-7, AND THE OTHER IN LOW CORE FOR EXECUTE'S USE VIA
/ .DAT-4.
/ NORMALLY, .DAT-7 IS RE-ASSIGNED TO EXECUTE'S DEVICE (FROM .DAT-4)
/ DURING THE READING OF THE 'XCT' FILE.  HOWERVER, IN THIS CASE, BOTH
/ .DAT-4 & .DAT-7 POINT TO DIFFERENT COPIES OF HANDLERS FOR THE SAME
/ DEVICE.  THEREFORE, THE "RE-ASSIGNMENT" OF .DAT-7 IS TO: .SYSLD'S
/ COPY OF THE HANDLER WITH EXECUTE'S UNIT NUMBER!
/
	IDX*	SCOM11	/CHANGE 'XCS' TO 'XCT'
	LAC*	.DATM7	/SETUP A .DAT SLOT CONTENT WITH THE
	AND	(077777)	/ENTRY POINT FOR .SYSLD'S COPY OF THE
	DAC	DM7XCT	/SYSTEM DEV HANDLER FROM .DAT-7, AND THE
	LAC*	.DATM4	/UNIT NUMBER FOR EXECUTE'S DEVICE FROM 
	AND	(700000)	/.DAT-4.
	XOR	DM7XCT
	DAC	DM7XCT
	.IFUND	PDP9	/IF PDP-15, NOP 'DBA' INSTRUCTIONS
	LAC	(740000)	/BECAUSE .SYSLD'S HANDLER, WHICH IS LOADED 
	DAC	EPM	/FOR BANK MODE EXECUTION, WILL BE USED
	.ENDC		/TO READ THE XCT FILE.
	JMP	SYSBCK
/
EXEFIL	.SIXBT	/EXECUT/
JMPEXC	JMP	EXECUT	/*LIT
SCOM11	.SCOM+11		/*LIT
BRATTV	BRATBL		/*LIT
XCT6BT	.SIXBT	/XCT/
	.IFPOZ LNBUFF+143-.
	.BLOCK LNBUFF+144-.
	.ENDC
/ ^^^^^^  END OF INPUT BUFFERS  ^^^^^^
NOLOAD	0		/SELECTIVE LOADING FLAG
RECDIN	0		/0=START OF NEW FILE
LNBUF	LNBUFF		/ADDRESS OF LINE BUFFER #1
LN2BUF	L2BUFF		/ADDRESS OF LINE BUFFER #2
LNBUFP	0		/LINE BUFFER POINTER
/
WDCNT	0			/LINE BUFFER WORD COUNT.
CODEWD	0			/BINARY CODE WORD (3 CODES).
CWDTAL	0			/CODE WORD COUNT.
LRELOC	0			/CURRENT RELOCATION FACTOR
LPLA	0			/LOAD ADDRESS.
LSYM1	0			/1ST WORD OF SYMBOL.
LSYM2	0			/2ND WORD OF SYMBOL.
LSMDEF	0			/SYMBOL TYPE AND DEF.
LPRES	0			/LOWEST FREE ADDRESS.
LSMST	0			/SYMBOL TABLE START.
LSMEND	0			/SYMBOL TABLE END.
LSMW1	0			/PRESENT STORE ADDRESS OF SYMBOL TABLE.
LSMPT	0			/PRESENT WORD COUNTER IN SYMBOL ENTRY
SYSPNT	0			/POINTER TO SYS. PROG. TABLE ENTRY.
IODVCT	0			/.IODEV COUNTER.
LDATA1	0
LDATA2	0
LDATA3	0
XBANK	0			/MEMORY BANK BITS.
XXBANK	0
LSTRNG	0			/STRING CODE
LLDDIR	.SIXBT	/.LOAD@BIN/	/CHANGED TO /EXECUTBIN/
				/WHEN LOADING EXECUTE.
SCOM5	0			/START ADDRESS OF SYSTEM PROG.
SCOM5S	0			/SAVE JMP.T1 ADDR.
LTEMP1	0			/GENERAL TEMP. STORAGE 1
LTEMP2	0			/GENERAL TEMP. STORAGE 2
LTEMP4	0			/GENERAL TEMP. STORAGE 4
LIBDIR	.SIXBT	/.LIBR@BIN/
	0
ERRFLG	0			/SELECTIVE LOADING
LLPRES	0			/BACKUP CELLS.
MOVCNT	0			/2'S COMP OF SIZE OF IOC TABLE.
MOVADD	0			/BOTTOM ADDRESS OF IOC TABLE.
/
	.EJECT
/ROUTINE TO CLEAR MEMORY BANK POINTERS
/OF MEMORY BANKS THAT DO NOT EXIST.
SYSBCK	LAC	LPRESS
	DAC	LPRESP
	LAC* (SCOM20)	/.SCOM+20 BIT-0 IS SET
	RAL			/LINK=1 IF XTRA 4K PRESENT.
	LAC*	(.SCOM		/PAGE MASK.
	AND	(70000		/FIND PAGE THAT .SCOM POINTS TO.
	XOR	(20
	IDX	LPRESP
	SAD*	LPRESP
	SKP
	JMP	.-3
.SBACK	IDX	LPRESP
	LAC*	LPRESP
	SAD	LPRESS
	JMP	.SCONT		/DONE
	SZL!CLL
	DAC	LPRESX		/XTRA 4K POINTER
	DZM*	LPRESP		/AND CLEAR
	JMP	.SBACK		/ALL OTHER POINTERS
.SCONT	LAC*	(.SCOM+5		/SYS. PROG. CODE
	SAD	(13
	JMP	MOD15		/EXECUTE
	SZA			/LINKING LOADER
	JMP	.SDONE
 
/SET UP MASKS FOR 12-BIT RELOCATION.
MOD15	DZM	LPRESX		/DON'T USE XTRA 4K
	.IFUND	PDP9	/IF PDP-15, SETUP FOR PAGE ADDRESSING
	LAW	10000
	DAC	OVER
	LAC	(7777)
	DAC	MASK
	.ENDC
.SDONE	LAC* (.SCOM+5
	SZA
	JMP	NOTLL		/DONT CHANCE .SCOM REGS UNLESS L.L.
	LAC*	.DATM1		/SAVE LINK. LDR'S. DEVICE
	AND	(77777		/MASK OFF UNIT NUMBER.
	DAC*	(.SCOM+7		/NUMBERS TO AVOID DUPLICATE
	LAC*	.DATM4		/LOADING IF USER REQUIRES
	AND	(77777
	DAC*	(.SCOM+10		/SAME DEVICES.
	LAC*	.DATM5
	AND	(77777
	DAC*	(.SCOM+11
NOTLL	LAC	(COMTAB
	XOR	XBANK
	DAC	SYSPNT
	TAD	COMTAB
	TAD*	(.SCOM+5
	DAC	COMTAB
	DAC	IODVCT
	ISZ	IODVCT
	LAC*	COMTAB
	TAD	SYSPNT
	DAC	COMTAB
	LAC*	IODVCT
	TAD	SYSPNT
	DAC	IODVCT
SWITCH=.	/THIS REGISTER IS USED AS A SWITCH -- ZEROED FOR
	/SECOND LIBR SEARCH WHEN LOADING EXECUTE'S HANDLERS.
CHKMRE	LAC	COMTAB
	SAD	IODVCT
	JMP	SEEKLB	/ALL.IODEV REQUESTS MADE
	LAC*	COMTAB
	ISZ	COMTAB
	SPA
	JMP	IODALL		/.IODEV ALL.
	JMS	IOPROS		/PROCESS .IODEV REQUEST.
	JMP	CHKMRE
SEEKLB	CAL	771		/SEEK A SYSTEM LIBR ON .DAT-7
	3
XKMD01	LIBDIR
	DZM	RECDIN	/NEW FILE
OVRPRO	ISZ	NOLOAD		/LOAD SELECTIVELY.
/
	JMS	SUGR	/ARE THERE ANY UNRESOLVED GLOBALS?
	JMP	IORES	/NO -- END LIBRARY SEARCH
READ	JMS	LL000	/YES -- SEE IF THIS PROGRAM HELPS
/
/CHECK FOR END OF LIBRARY FILE.
	SZL
	JMP	EOFCHK		/NO DATA...CHECK FOR EOF.
	LAC	NOLOAD
	SZA
	JMP	READ		/NO VIRTUALS RESOLVED.
	JMP	OVRPRO		/VIRTUALS RESOLVED.
EOFCHK	LAC*	LNBUFP
	AND	(17
	SAD	(5
	SKP			/EOF. ALL GLOBALS NOT RESOLVED.
	JMP	OVRPRO		/KEEP TRYING.
	CAL	771		/.CLOSE .LIBR
	6			/FILE
	JMP	ERROR3
/
IORES	CAL	771		/.CLOSE .LIBR
	6
	LAC	SWITCH	/CHECK IF 2ND LIBBARY
	SNA		/SEARCH DONE FOR EXECUT
	JMP	GOTOEX
	LAC*	(.SCOM+5
	SAD	(13)
	JMP	FILELD
	SZA
	JMP	NONLLD	/NOT EXECUTE OR LINKING LDR
/
	.EJECT
/ RELOCATE AND LOAD EXECUTE OR LINKING LOADER
/
FILELD	CAL	771		/.SEEK .LOAD/EXECUTE FILE
	3			/ ON SYSTEM DEVICE
XKMD02	LLDDIR
	DZM	NOLOAD		/NON-SELECTIVE LOADING.
	DZM	RECDIN		/NEW FILE.
	JMS	LL000		/READ IN LINK. LOADER. OR EXECUTE
	DAC*	(.SCOM+5		/STARTING ADDRESS.
	DAC	SCOM5
	CAL	771		/.CLOSE .LOAD/EXECUTE FILE
	6
/ REGISTER MOVBCK IS MODIFIED TO "JMP EXECUT" WHEN LOADING EXECUTE 
MOVBCK	LAC*	MOVADD		/ROUTINE TO MOVE
	DAC*	LPRES		/IOC TABLE FROM
	ISZ	MOVADD		/SYSTEM LOADER AREA
	ISZ	LPRES		/TO LINKING LOADER
	ISZ	MOVCNT		/AREA .
	JMP	MOVBCK
GOTOEX	LAC	LPRES
	DAC*	(.SCOM+2		/LOWEST FREE ADDRESS.
	LAC*	(.SCOM
	DAC*	(.SCOM+3		/HIGHEST FREE ADDRESS
	DZM*	.DATM7		/CLEAR .DAT SLOT -7
	.IFUND	PDP9	/IF PDP-15, ENTER PAGE ADDRESSING MODE
	LAC	(2000
	XOR*	(.SCOM+4
	DAC*	(.SCOM+4
	DBA		/BEFORE GOING TO LOADER OR EXECUTE.
	JMP* SCOM5&767777
	.ENDC
	.IFDEF	PDP9
	JMP*	SCOM5
	.ENDC
/
/ EXECUTE -- GET .IODEV INFORMATION FROM 'XCT' FILE
/
EXECUT	LAC*	.DATM7	/REASSIGN .DAT-7 TO READ
	DAC	DM7BUF	/THE 'XCT' FILE.  (SPECIAL
	LAC	DM7XCT	/REASSIGNMENT WHEN EXECUTE
	SNA		/AND .SYSLD USE THE SAME DEV.
	LAC*	.DATM4
	DAC*	.DATM7
	.IFUND	PDP9	/IF PDP-15, ENTER PAGE MODE IF NECESSARY
	XCT	EPM
	.ENDC
	CAL	771	/.INIT -7 FOR INPUT
	1
	0
	0
	CAL	771	/.SEEK -7
	3
	.SCOM+7		/FILENAME XCT
	.IFUND	PDP9	/IF PDP-15, ENTER BANK MODE IF NECESSARY
	EBA
	.ENDC
XREAD=.
	.IFUND	PDP9	/IF PDP-15, ENTER PAGE MODE IF NECESSARY
	XCT	EPM
	.ENDC
	CAL	771	/.READ -7 (IOPS BIN)
	10
XKMD04	L2BUFF
	-62
	CAL	771	/.WAIT -7
	12
	.IFUND	PDP9	/IF PDP-15, ENTER BANK MODE IF NECESSARY
	EBA
	.ENDC
	LAC	L2BUFF	/GET HEADER
	AND	(077)
	SNA
	JMP	XCTROK	/NORMAL READ -- EXAMINE RECORD
			/ABNORMAL READ -- TEST FOR
			/EOF, EOM, OR ERR
	SAD	(005)
	JMP	XREAD	/EOF -- IGNORE, READ NEXT RECORD
	AND	(057)
	SAD	(006)
	JMP	XCTEOM	/EOM -- WAIT FOR ^P
	JMP	ERROR2	/ERR -- TERMINATE
XCTEOM	LAW	-1	/SET FLAG TO ACCEPT ^P TYPEIN
	DAC	CPFLAG
	JMS	TYPE	/TYPE "LD & ^P"
	EOMMES
	JMP	.	/WAIT HERE FOR ^P TYPEIN
CPFLAG	0		/FLAG -- ACCEPT ^P IFF FLAG=-1
CPTED	ISZ	CPFLAG	/^P TYPED IN -- ACCEPT ^P ?
	JMP	EXIT	/NO -- EXIT
	JMS	TYPE	/YES -- RETURN CARRIAGE AND ATTEMPT
	CARRTN		/       ANOTHER READ
	JMP	XREAD
/
XCTROK	LAC	L2BUFF+2	/GET SUBRECORD HEADER
	AND	(700000)
	SAD	(100000)	/TYPE-ONE RECORD?
	SKP
	JMP	XREAD	/NO -- READ NEXT RECORD
	LAC	L2BUFF+3	/YES -- .DAT INFO RECORD?
	SAD	(377777)	/        (LINK #377777)
	SKP		/YES -- LOAD I/O HANDLERS FOR THE 
			/       OVERLAY SYSTEM TO BE RUN
	JMP	XREAD	/NO -- READ NEXT RECORD
BITCNT=.	/THIS REGISTER IS ALSO USED AS BIT COUNTER FOR NEXT LOOP
	.IFUND	PDP9	/IF PDP-15, ENTER PAGE MODE IF NECESSARY
	XCT	EPM
	.ENDC
	CAL	771	/.CLOSE -7
	6
	.IFUND	PDP9	/IF PDP-15, ENTER BANK MODE IF NECESSARY
	EBA
	.ENDC
	LAC	DM7BUF	/RESTORE .DAT-7 ASSIGNMENT 
	DAC*	.DATM7
/
XCTLP1	IDX	XCTTMP	/SETUP TO EXAMINE A MAP-WORD REPRESENTING
	LAW	-22	/18 .DAT SLOTS.  (FOUR WORDS FOR SLOTS
	DAC	BITCNT	/.DAT-18 THRU .DAT+53)
/
XCTLP2	LAC*	XCTTMP	/MAKE A GLOBAL SYMBOL REFERENCE TO THE 
	RCL		/HANDLER ASSIGNED TO EACH .DAT SLOT WITH
	DAC*	XCTTMP	/ITS CORESPONDING MAP-WORD-BIT SET.
	SNL
	JMP	WICK1	/BIT NOT SET
	LAC	IODVNM	/.IODEV SLOT #
	SNA
	JMP	IODALL		/.DAT+0 MEANS ALL POSITIVE
	JMS	IOPROS	/PROCESS .IODEV
WICK1	ISZ	IODVNM
	NOP
	ISZ	BITCNT
	JMP	XCTLP2
	ISZ	WRDCNT
	JMP	XCTLP1
	DZM	SWITCH	/ALL HANDLERS "REFERENCED" -- CLEAR SWITCH
			/TO INDICATE SECOND LIBRARY SEARCH (IF ANY)
	JMS	SUGR	/IS A SECOND LIBRARY SEARCH NECESSARY?
	JMP	GOTOEX	/NO -- GE TO EXECUTE
	JMP	SEEKLB	/YES -- START SECOND LIBRARY SEARCH
/
DM7BUF	0	/BUFFER FOR NORMAL .DAT-7 ASSIGNMENT WHILE READING 'XCT' FILE 
DM7XCT	0	/SPECIAL .DAT-7 ASSIGNMENT FOR READING THE 'XCT' FILE
		/IF ZERO, THE .DAT-4 ASSIGNMENT IS MADE FOR .DAT-7 TO
		/READ THE 'XCT' FILE.
XCTTMP	L2BUFF+12	/RECORD BUFFER POINTER
WRDCNT	-4	/4 .IODEV WORDS
IODVNM	-22	/START WITH .DAT-22
/
NONLLD	LAC*	(SCOM20		/SET .SCOM+20 TO LOWEST
	XOR	LPRESX		/FREE ADDRESS IN
	DAC*	(SCOM20		/XTRA 4K.		
	LAC	LPRES
	DAC*	(.SCOM+2		/LOWEST FREE ADDRESS
	DZM*	.DATM7
	LAC*	(.SCOM+5		/MULTIPLY BY 7
	RCL
	TAD*	(.SCOM+5
	RCL
	TAD*	(.SCOM+5
	TAD	SYSPNT
	TAD	(3
	DAC	SYSPNT
	LAC*	SYSPNT
	DAC	.DTBLK
	IDX	SYSPNT
	IDX	SYSPNT
	LAC*	SYSPNT		/STARTING LOAD ADDRESS-1
	TAD	(-1
	XOR	XBANK		/EX. MEM. BITS
	ISZ	SYSPNT
	DAC*	(.SCOM+3		/HIGHEST FREE ADDRESS.
	DAC	.DTCA		/SETUP FOR SYSTEM BOOTSTRAP.
	CMA
	TAD	LPRES
	SMA
	JMP	ERROR4		/MEMORY OVERFLOW
	LAC*	SYSPNT		/SIZE (2'S COMP.)
	ISZ	SYSPNT
	TAD	(-1
	CMA
	DAC	.DTWC		/SETUP FOR SYS. BOOTSTRAP
	LAC	SCOM5S
	DAC*	(.SCOM+5		/SETUP TO TURN ON PIC&API
	IOF+10			/TURN OFF PIC
	ISA			/AND API IN CASE OF SELECT ERR IN BOOTSTRAP
	LAC*	SYSPNT		/ENTRY POINT
	XOR	XBANK		/EX. MEM. BITS.
	DAC*	(0
	LAC	(21000		/TALKING TO
	DAC	.DTSRC		/DECTAPE UNIT 0
	LAC	(.DTBEG
	XOR	XXBANK		/EX. MEM. BITS.
	DAC*	(.MED
	JMP	.DTBEG		/GO TO SYSTEM BOOTSTRAP
/
	.EJECT
/PROCESS .IODEV ALL REQUEST.
/ALL POSITIVE .DAT SLOTS THAT DO NOT
/CONTAIN 0 ARE REQUESTED.
/
IODALL	LAC	(1	
	DAC	LTEMP4		/.DAT SLOT NO.
	TAD*	(.SCOM+23
	DAC	LTEMP2		/ADDRESS OF .DAT SLOT.
	LAW	-11
	TAD	LTEMP4
	SMA!CLA
	JMP	SEE1		/END OF .DAT TABLE
	LAC*	LTEMP2
	SNA
	JMP	NULDAT		/BYPASS 0 SLOT.
	LAC	LTEMP4
	JMS	IOPROS
NULDAT	LAC	LTEMP4
	TAD	(1
	JMP	IODALL+1
SEE1	SAD	IODVNM
	JMP	WICK1
	JMP	CHKMRE
	.EJECT
/ SUGR -- SUBROUTINE TO SCAN (SYMBOL TABLE) FOR UNRESOLVED GLOBAL REFERENCES
/
/ RETURN AT JMS+1 -- NO UNRESOLVED GLOBALS FOUND
/ RETURN AT JMS+2 -- AN UNRESOLVED GLOBAL REFERENCE HAS BEEN FOUND
/
SUGR	0
	LAC	LSMST
SUGR1	DAC	LSMPT
	DAC	LSMW1
	SAD	LSMEND
	JMP*	SUGR	/RETURN AT JMS+1
	LAC*	LSMPT
	AND	(700000)
	SAD	(100000)
	JMP	.+3
	JMS	NXCNT
	JMP	SUGR1
	ISZ	SUGR	/RETURN AT JMS+2
	JMP*	SUGR
	.EJECT
/SUBROUTINE TO LOAD A PROGRAM UNIT.
/RETURNS WITH STARTING ADDRESS IN AC.
/IT IS DOUBLE BUFFERED.
/
LL000	0
LL002	LAC	RECDIN			/IS .READ IN PROGRESS.
	SZA
	JMP	LL019			/YES
LL018	LAC	LNBUF			/NO. SET POINTER
	DAC	LNBUFP			/TO BUFFER A.
	DAC	LL010+2
	LAC	LN2BUF			/SET UP 2ND .READ TO
	DAC	LL016			/READ INTO L2BUFF.
/.READ	.-7,B,LNBUFF,50			/READ ONE LINE BUFFER.
LL010	CAL	771			/OF BINARY WORDS
	10				/INTO LNBUFF.
	LNBUFF
	-62
/.WAIT	,.-7				/WAIT FOR BINARY INPUT
LL014	CAL	771
	12
LL001	LAC*	LNBUFP			/CHECK BITS 12
	AND	(60			/AND 13 OF 1ST
	SZA				/WORD OF L.B. HEADER
	JMP	ERROR2			/FOR PARITY, CHECKSUM, BUF. OVERFLOW
	LAC*	LNBUFP			/PICK UP THE WORD
	AND	(377000			/PAIR COUNT AND
	CLL!RAL				/MULTIPLY BY 2
	TAD	(776000			/SUBTRACT 2 FOR HEADER
	DAC	WDCNT
	SNA!CLL!CML			/L=1,NO DATA WORDS.
	JMP*	LL000			/POSSIBLY EOF LINE.
/
/.READ	,.-7,B,BUFFX,50			/NO
LL015	CAL	771			/READ ONE LINE OF
	10				/BINARY WORDS INTO
LL016	XX			/L2BUFF OR LNBUFF.
	-62
	CLA!CMA				/INDICATES READ
	DAC	RECDIN			/IS IN PROGRESS.
/
	.EJECT
/DATA CODE WORD FETCH ROUTINE
/THIS ROUTINE SELECTS THE CODE WORD FROM THE LINE
/BUFFER AND DETERMINES WHICH DATA WORD PROCESSING
/ROUTINE TO ENTER
/
LL041	ISZ	LNBUFP		/SET LINE BUFFER POINTER TO
	ISZ	LNBUFP		/BEGINNING OF DATA
LL005	LAW	-4		/COUNT TO DETERMINE WHEN
	DAC	CWDTAL		/NEXT CODE WORD IS TO BE SELECTED
	JMS	WRDCHK		/PICK UP WORD MOVE BUFFER POINTER
	DAC	CODEWD		/STORE CODE WORD
CODE1	ISZ	CWDTAL		/DECREASE CODE TALLY WORD
	SKP
	JMP	LL005		/GO  GET NEXT CODE WORD.
	LAC	CODEWD		/SHIFT CURRENT CODE
	RTL			/TO BITS (12-17) OF AC
	RTL
	RTL
	DAC	CODEWD
	RAL
	AND	(77
	DAC	LTEMP1		/CODE IN BITS (12-17)
	LAC	NOLOAD
	SNA
	JMP	LL009		/NON-SELECTIVE LOADING
	LAC	LTEMP1		/SELECTIVE LOADING.
	SAD	(12		/INTERNAL GLOBAL DEF. (CODE 10)
	JMP	LL009
	SAD	(1		/PROGRAM SIZE (CODE 1)
	JMP	LL009
	SAD	(7		/1ST 3 CHARS. OF SYMBOL
	JMP	LL009		/ (CODE 7)
	SAD	(10		/2ND 3 CHARS  OF SYMBOL
	JMP	LL009		/ (CODE 8)
	SAD	(27		/END OF PROGRAM UNIT (CODE23)
	JMP	LL009
	JMS	WRDCHK		/BYPASS DATA WORD.
	JMP	CODE1		/FETCH NEXT CODE
LL009	LAC	LTEMP1		/CODE (BITS 12-17)
	TAD	(-33
	SMA
	JMP	ERROR2		/>32
	LAC	LTEMP1
	TAD	(JMP ENTRY	/DISPATCH TO APPROPRIATE
	DAC	.+2		/DATA WORD PROCESSOR
	JMS	WRDCHK		/LOAD DATA WORD.
	XX
/
	.EJECT
/TABLE OF DATA WORD PROCESSOR ADDRESSES
ENTRY	JMP	ERROR2	/CODE 00 - ILLEGAL
	JMP	LCD01	/CODE 01
	JMP	LCD02	/CODE 02
	JMP	LCD03	/CODE 03
	JMP	LCD04	/CODE 04
	JMP	LCD05	/CODE 05
	JMP	LCD06	/CODE 06
	JMP	LCD07	/CODE 07
	JMP	LCD08	/CODE 08
	JMP	LCD09	/CODE 09
	JMP	LCD10	/CODE 10
	JMP	CODE1	/CODE 11 IGNORED
	JMP	CODE1	/CODE 12 IGNORED
	JMP	CODE1	/CODE 13 IGNORED
	JMP	CODE1	/CODE 14 IGNORED
	JMP	LCD15	/CODE 15
	JMP	LCD16	/CODE 16
	JMP	LCD17	/CODE 17
	JMP	LCD18	/CODE 18
	JMP	CODE1	/CODE 19 IGNORED
	JMP	CODE1	/CODE 20 IGNORED
	JMP	CODE1	/CODE 21 IGNORED
	JMP	CODE1	/CODE 22 IGNORED
	JMP	LCD23	/CODE 23
	JMP	CODE1	/CODE 24 IGNORED - 18 BIT PAR. ASSIGNMENT
	JMP	CODE1	/CODE 25 IGNORED
	JMP	CODE1	/CODE 26 IGNORED
/
	.EJECT
/CODE 01 DATA WORD PROCESSOR-PROGRAM UNIT SIZE.
/
LCD01	SPA
	JMP	LDABS		/ABSOLUTE PROGRAM
	DZM	ERRFLG		/CLEAR MEM. OVERFLOW FLAG.
	DAC	LTEMP1		/PROG. UNIT SIZE
/ (PROG UNIT SIZE TEST REMOVED -- ASSUME THAT NO LIBRARY
/ (ROUTINE WILL BE GREATER THAN 4K WORDS)
/THIS MAY BE A SELECTIVE LOAD THAT DOES NOT
/MAKE IT.
	LAC	(70000		/4K BLOCK INITIALLY
	DAC	ADDR		/THE MAXIMUM.
	LAC	LPRESS
	DAC	LPRESP
FITLP	IDX	LPRESP
	LAC*	LPRESP
	SAD	LPRESS
	JMP	ERROR1		/NO ROOM IN CORE.
	SZA
	JMP	LCD013
.SMOD	LAW	10000		/THIS BANK NOT USABLE.		
	SAD	OVER
	JMP	FITLP		/PDP-15 MODE
	LAC	(60000		/8K BLOCK NOW ALLOWABLE.
	DAC	ADDR
	IDX	LPRESP		/CHECK 8K POINTERS ONLY.
	JMP	FITLP
LCD013	DAC	LRELOC		/RELOCATION FACTOR.
	DAC	LPLA		/PROGRAM LOAD ADDRESS
	TAD	LTEMP1		/PROG UNIT SIZE
	DAC	LLPRES		/NEW LOWEST
	XOR	LPLA		/FREE ADDRESS. DOES PROG LIE ENTIRELY
	AND	ADDR		/IN THE CURRENT
	SZA!CMA			/MEMORY BLOCK.
	JMP	.SMOD		/NO
LCD012	TAD	LPRESP
	SAD	LPRESS
	SKP!CLA			/IF XTRA 4K DO NOT CHECK FOR SYMBOL TABLE OVERFLOW.
	LAC	LLPRES		/NEW LOWEST FREE ADDRESS.
	JMS	LCOMP		/2'S COMP.
	TAD	LSMEND
	SPA
	JMP	ERROR1		/MEMORY OVERFLOW
	LAC	NOLOAD
	SNA
	JMS	AJUST		/UPDATE ADDRESS TABLE AND LPRES. IF NON-CONDITIONAL LOAD.
	JMP	CODE1		/FETCH NEXT DATA WORD.
LDABS	DZM	LRELOC		/ABSOLUTE LOAD
	JMP	CODE1
/
	.EJECT
WRDCHK	0			/CHECK IF BUFFER EXHAUSTED,
	LAC	WDCNT		/IF NOT RETURN WITH
	SNA			/WORD IN AC.
	JMP	LL002		/GO READ NEXT LINE.
	TAD	(777000		/DECREMENT WORD COUNT
	DAC	WDCNT		/BY 1.
	LAC*	LNBUFP		/PICK UP WORD.
	ISZ	LNBUFP		/INDEX POINTER.
	JMP*	WRDCHK
LL019	LAC	LL016		/SET UP TO PROCESS
	DAC	LNBUFP		/BUFFER JUST FILLED
	SAD	LNBUF
	JMP	LL020		/SET UP TO READ
	LAC	LNBUF		/INTO OTHER.
LL021	DAC	LL016
	JMP	LL014		/GO TO .WAIT
LL020	LAC	LN2BUF
	JMP	LL021
/
	.EJECT
/CODE 02 DATA WORD PROCESSOR - PROGRAM LOAD ADDRESS
/
				/THE PROGRAM LOAD ADDRESS IS ABSOLUTE
LCD02	TAD	LRELOC		/IF BIT 0 IS A ONE---LRELOC=0
	DAC	LPLA
	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
	ISZ	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
	DAC	LPLA		/STORE ADJUSTED LOAD ADDRESS
	JMP	CODE1		/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
/
	.EJECT
/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			/SYMBOL HAS BEEN PREVIOUSLY ENTERED. GO SEE
	JMP	CD092		/IF SYMBOL HAS BEEN DEFINED
	JMS	LSMSTR		/STORE DEFINITION AND SYMBOL IN
	JMP	CODE1		/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
ERROR1	ISZ	ERRFLG
	LAC	NOLOAD		/MAY NOT BE
	SZA			/ERROR IF
	JMP	CODE1		/SELECTIVE LOAD.
ERROR4	LAW	1		/MEMORY OVERFLOW - SYSLD 01
	JMP	ERROUT
ERROR3	LAW	3		/ALL GLOBALS NOT RESOLVED - .SYSLD 03
	JMP	ERROUT
ERROR2	LAW	2		/DATA ERROR - .SYSLD 02
	JMP	ERROUT
/
	.EJECT
/CODE 10 DATA WORD PROCESSOR - INTERNAL GLOBAL SYMBOL DEFINITION
/
LCD10	TAD	LRELOC		/ADD RELOCATION FACTOR
	DAC	LTEMP1		/SET SYMBOL DEFINITION
	TAD	(500000		/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.
	LAC	NOLOAD		/UNREQUESTED INTERNAL GLOBALS ARE LOADED
	SNA			/WHEN THEY FOLLOW REQUESTED GLOBALS OR
				/DURING UNCONDITIONAL LOADING.
	JMS	LSMSTR		/STORE DEFINITION AND SYMBOL IN SYMBOL
	JMP	CODE1		/TABLE AS THIS SYMBOL HAS NOT BEEN PREV-
/				/IOUSLY ENTERED.
CD102	DAC	LTEMP2		/SAVE REFERENCE ADDRESS IF UNDEFINED
	LAC*	LSMW1
	SMA			/CHECK TO SEE IF GLOBAL IS DEFINED
	JMP	CD103		/IF DEFINED, IT HAS ALREADY BEEN LOADED
	LAC	NOLOAD
	SZA
	JMP	CODE1
	ISZ	NOLOAD		/BACK UP POINTERS
	LAC	AJUST1		/AS THIS ROUTINE IS
	DAC*	LPRESP		/NOT BEING LOADED
	LAC	AJUST2
	DAC	LPRES
				/SO THE NO LOAD IS PUT INTO EFFECT AND
	JMP	CODE1		/THIS PART IS IGNORED.
CD103	LAC	ERRFLG
	SZA
	JMP	ERROR4		/ROUTINE DID NOT FIT.
	LAC	NOLOAD
	SZA
	JMS	AJUST		/NOW MOVE POINTER
	DZM	NOLOAD		/CLEAR FOR LOADING
	LAC	LSMDEF
	DAC*	LSMW1		/DEFINE SYMBOL AS INTERNAL GLOBAL
CD104	LAC*	LTEMP2
	AND	(77777		/MASK OFF UNIT NO.
	DAC	LSMDEF		/FETCH AND SAVE NEXT REFERENCE ADDRESS
	LAC*	LTEMP2
	AND	(700000		/PRESERVE UNIT NO.
	XOR	LTEMP1
	DAC*	LTEMP2
				/PUT SYMBOL DEF. IN CONTENTS OF REF. ADR.
	LAC	LSMDEF
	SAD	LTEMP2		/CHAIN IS COMPLETE WHEN NEXT CHAIN ADDR.
	JMP	CODE1		/IS EQUAL TO SELF.
	DAC	LTEMP2
	JMP	CD104
	.EJECT
/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 INITIALIZATION 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
/
				/ADD PRESENT RELOCATION FACTOR TO DATA
LCD18	TAD	LRELOC		/WORD ADDRESS. STORE THE ADJUSTED ADDRESS
CD182	DAC	LTEMP1		/IN TEMPORARY STORAGE FOR FURTHER REFERENCE.
	LAC	LDATA1		/STORE FIRST DATA INITIALIZATION CONSTANT.
	DAC*	LTEMP1
	ISZ	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.
	SAD	(300000		/TEST IF BITS 1-2 OF DATA WORD EQUAL 11
	JMP	CODE1		/IF SO RETURN TO PROCESS NEXT DATA WORD.
	SNA
	JMP	CODE1
	LAC	LDATA2		/STORE SECOND DATA WORD IN SPECIFIED ADDR.
	DAC*	LTEMP1
	ISZ	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
/
	.EJECT
ADDR	60000			/70000 IF 4K MODE
OVER	760000			/770000 IF 4K MODE
MASK	17777			/7777 IF 4K MODE
/
	.EJECT
/SUBROUTINE TO PROCESS .IODEV REQUESTS.
/
.DATM7	0
.DATM5	0
.DATM4	0
.DATM3	0
.DATM1	0
SLOT1	0
IOPROS	0
	AND	(000777)	/ACCEPT POSITIVE, 18-BIT 2'S COMPL 
	TAD	(777400)	/NEGATIVE, OR 9-BIT 2'S COMPL .DAT
	XOR	(777400)	/SLOT REPRESENTATIONS.
	DAC	SLOT1
	TAD*	(.SCOM+23
	DAC	LTEMP2		/ADDRESS OF .DAT SLOT.
	LAW	-11
	TAD	SLOT1
	SMA
	JMP	IOERR2		/ILLEGAL .DAT SLOT.
	LAC	(15
	TAD	SLOT1
	SPA
	JMP	IOERR2		/ILLEGAL .DAT SLOT.
	LAC*	LTEMP2
	AND	(77777
	SNA
	JMP*	IOPROS		/IGNORE .DAT SLOT WHEN 0
	SAD	(1
	JMP	IOTTY		/TT1.
	TAD	MOVCNT		/2'S COMP OF SIZE OF IOC TABLE.
	SMA			/NEG.
	JMP*	IOPROS		/.DAT SLOT ALREADY SET UP.
	TAD	IOCONF		/PICK UP 1ST 3 CHARS. OF SYMBOL.
	AND	(17777
	XOR	(200000		/LAC
	DAC	.+1
	HLT			/MODIFIED.
	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	(700000		/STRING POINT TO
	XOR	LTEMP2		/ITSELF TO TERMINATE
	DAC*	LTEMP2		/RESOLUTION OF GLOBALS.
	JMP*	IOPROS		/EXIT.
/
	.EJECT
IOALIN    DAC        LTEMP1                /ADDRESS OF LAST T.V. IN CHAIN.
			/LTEMP1 CONTAINS THE SYMBOL DEFINITION (HANDLER
			/ENTRY POINT) IF HANDLER HAS ALREADY BEEN LOADED.
			/THIS CONDITION WILL OCCUR WHEN AN OVERLAY SUSTEM
			/USES EXECUTE'S I/O DEVICE.
/
	LAC*	LSMW1	/IF DEFINED, SET DEFINITION IN BITS 3-17 OF .DAT
	SPA		/SLOT INSTEAD OF STRINGING REFERENCES.
	JMP	IOPREU
          LAC        LSMDEF
          DAC*       LSMW1
          JMP        IOPREU
IOERR2	LAW	4		/ILLEGAL .DAT SLOT - SYSLD
          JMP        ERROUT
IOTTY     LAC*       .DATM3               /ADDRESS OF TTY HANDLER.
          DAC*       LTEMP2
          JMP*       IOPROS
/
IOPREU    LAC*       LTEMP2                /PRRESERVE UNIT NO.
          AND        (700000
          XOR        LTEMP1
          JMP        IOTTY+1
IOCONF	0			/TOP ADDRESS OF IOC TABLE.
PER50	127400			/(.) IN RADIX 50(OCTAL).
/
	.EJECT
/ CODE 23 DATA WORD PROCESSOR - END OF PROGRAM UNIT
/
LCD23	TAD	LRELOC		/ RETURN WITH START ADDRESS OF PGM.
	CLL
	JMP*	LL000		/ UNIT
/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!CLA!CMA			/IE. GLOBAL VS. GLOBAL
	JMP	LSCN02		/ COMMON BLOCK NAME VS. SAME
	TAD	LSMPT
	DAC	LSMPT
	LAC*	LSMPT		/ THE SYMBOL IS FOUND WHEN THE NAME
	SAD	LSYM1		/ WORD(S) MATCH.
	JMP	LSCN04
	JMP	LSCN02
LSCN04	SMA!CLA!CMA
	JMP	LSCN05
	TAD	LSMPT
	DAC	LSMPT
	LAC*	LSMPT
	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	(77777		/ THE DEFINITION OF THE SYMBOL IS RETURNED
	JMP*	LSMSCN		/ AS A SIGNAL DAT THE NAME WAS FOUND.
LSCN01	CLA
	JMP*	LSMSCN		/ ZERO INDICATES THE SYMBOL WAS NOT FOUND.
/
	.EJECT
/SUBROUTINE TO INCREMENT SYMBOL TABLE COUNTER
/TO POINT TO NEXT ENTRY.
NXCNT	0
	LAC	LSMW1		/ALL ENTRIES IN THE SYMBOL
	TAD	(777777		/TABLE ARE EITHER 2 OR 3
	DAC	LSMPT		/WORD LONG, DEPENDING ON
	LAC*	LSMPT		/THE NO. OF CHARS. IN
	SPA!CLA			/THE SYMBOL.
	TAD	(777777
	TAD	(777777
	TAD	LSMPT		/RETURN WITH NEXT ENTRY
	DAC	LSMPT		/ADDRESS IN THE AC.
	JMP*	NXCNT
/
/SUBROUTINE TO DECREASE STORE ADDRESS FOR
/ENTERING A NEW SYMBOL IN SYMBOL TABLE AND
/CHECKING FOR SYMBOL TABLE OVERFLOW.
LPTCNT	0
	LAC	LSMEND
	TAD	(777777		/DECREASE SYMBOL TABLE
	DAC	LSMEND		/END POINTER.
	CMA			/1'S COMP. SUBROUTINE.
	TAD	LPRES		/COMPARE SYMBOL TABLE END
	SMA			/POINTER TO END OF FREE
	JMP	ERROR4		/STORAGE. --- OVERFLOW ERROR
	JMP*	LPTCNT
/
	.EJECT
/SUBROUTINE TO STORE A SYMBOL AND ITS DEFINITION IN THE SYMBOL TABLE
/
LSMSTR	CAL	0
	LAC	LSMDEF		/STORE SYMBOL DEFINITION IN SYMBOL TABLE
	DAC*	LSMEND
	JMS	LPTCNT
	LAC	LSYM1		/ STORE FIRST THREE CHARACTERS OF SYMBOL IN
	DAC*	LSMEND		/ SYMBOL TABLE.  TEST SYMBOL WORD TO SEE IF
	SMA			/ SYMBOL IS MORE THAN THREE CHARACTERS.
	JMP	SMSTR1
	JMS	LPTCNT
	LAC	LSYM2		/ STORE SECOND WORD OF SYMBOL IN TABLE.
	DAC*	LSMEND
SMSTR1	JMS	LPTCNT
	JMP*	LSMSTR		/ RETURN TO CALLING PROGRAM.
/
/ADD THIRTEEN BIT CURRENT RELOCATION FACTOR TO DATA WORD ADDRESS SUB-
/ROUTINE.
/CALLING SEQUENCE
/	JMS	LMOD13
/
LMOD13	CAL	0
	DAC	LTEMP1		/ STORE DATA WORD IN TEMP. STORAGE
	LAC	LRELOC		// LOAD 15 BIT ADDRESS
	AND	MASK		/ EXTRACT OUT BITS 14 AND 15
	TAD	LTEMP1		/ ADD DATA WORD TO 13 BIT ADDRESS
	JMP*	LMOD13		/ RETURN TO CALLING PROGRAM
/
	.EJECT
/TWOS COMPLEMENT ACCUMULATOR SUBROUTINE
/CALLING SEQUENCE
/	JMS	LCOMP
/
LCOMP	CAL	0
	CMA			/ ONE COMP. ACCUMULATOR
	TAD	(1		/ ADD ONE TO BIT 17
	JMP*	LCOMP		/ RETURN TO CALLING PROGRAM
/
ERROUT	CLL		/SET ERR NUMBER (IN AC) IN
	RTR		/ERROR MESSAGE
	RTR
	XOR	(031400)	/(CAR RTN)
	DAC	ERRMES+3
	JMS	TYPE
	ERRMES
EXIT	.EXIT	/EXIT
/
/ TYPE -- SUBROUTINE TO TYPE THE MESSAGE WHOSE ADDRESS 
/         FOLLOWS THE JMS TYPE
/
TYPE	0
	LAW	-2
	TAD*	TYPE
	XOR	XXBANK
	DAC	.+3
	.WRITE	-3,2,XX,0
	.WAIT	-3
	ISZ	TYPE
	JMP*	TYPE
/
EOMMES	.ASCII	/LD [777] & ^P /<175>
ERRMES	.ASCII	/.SYSLD 7/
CARRTN	064000	/CAR RTN
/
/LOWEST FREE ADDRESS IN EACH OF THE
/EIGHT 4K MEMORY BANKS.
/
LPRESX	0			/EXTRA 4K BANK
	0			/DUMMY ENTRY.
LPRES0	XX			/CONTENTS OF .SCOM+2
	10020
LPRES1	20020
	30020
LPRES2	40020
	50020
LPRES3	60020
	70020
LPRESS	LPRESX-1
LPRESP	0
/
/SUBROUTINE TO STORE NEW LOWEST FREE ADDRESS
/IN PROPER ENTRY IN BANK POINTERS TABLE
/AND UPDATE LPRES IF NEED BE.
AJUST	0
	LAC*	LPRESP		/IN CASE ROUTINE
	DAC	AJUST1		/BY SAME NAME
	LAC	LPRES		/ALREADY LOADED
	DAC	AJUST2
	CLL!CLA!CMA!CML
	TAD	LPRESP		/0 TO LINK
	SAD	LPRESS
	CML			/XTRA 4K BANK.
	LAC	LLPRES		/UPDATE TABLE
	DAC*	LPRESP		/ENTRY.
	SZL!CMA
	JMP*	AJUST
	TAD	LPRES		/NOT XTRA 4K.
	LAC	LLPRES		/KEEP HIGHER
	SNL			/ADDRESS.
	DAC	LPRES
	JMP*	AJUST
AJUST1	0
AJUST2	0
/
	.IFUND	PDP9
EPM	DBA	/ENTER PAGE MODE INSTRUCTION
		/NOP WHEN XCT FILE IS READ USING 
		/.SYSLD'S I/O HANDLER
	.ENDC
	.END
