/TSS/8 BASIC LOADER PROGRAM   (BASLDR) VERSION 12//REVISION: 13-AUG-71		IDC/GWB/PJK//COPYRIGHT 1969, 1970, 1971	DIGITAL EQUIPMENT CORP./				MAYNARD, MASSACHUSETTS//ORIGINALLY WRITTEN BY:/	INFORMATION DEVELOPMENT CORP./	DEDHAM, MASS//THE TSS/8 BASIC COMPILER GENERATES THE INPUT TO THE BASIC LOADER/PROGRAM.  THE COMPILER GENERATED CODE IS LOADED INTO CORE AND THEN/THE CORE IMAGE IS OUTPUT BACK  ONTO THE SAME DISK FILE.//THE OUTPUT OF THE TSS/8 BASIC LOADER IS THEN LOADED AS REQUIRED BY/THE TSS/8 BASIC INTERPRETER PROGRAM.//THIS FILE ALSO CONTAINS THE CODE FOR THE/COMPILE FILE SAVE FUNCTION./THE END STATEMENT PROCESSOR FROM THE BASIC/COMPILER HAS BEEN MOVED INTO THE LOADER. THE/FOLLOWING EQUATES ARE USED TO DEFINE THE/"SUPERCRITICAL" ADDRESSES COMMON TO THE LOADER/AND TO THE COMPILER.ERROR=JMS I 5JPAS=JMS I 170JSTT=JMP I 174JOTI=JMS I 163JLLA=JMS I 153JOLA=JMS I 160JOCH=JMS I 157JOWD=JMS I 167JOTN=JMS I 164TC=130T1=131CM1=47FORFG=133LS=113LT=114EL=77JT=107J=105IU=104DF=76AF=72C3=37OW=117OFS=3030ID=100ID1=101ID2=102X1=11OBUF=5115ISTACK=100CODEON=7775XEND=17RFILE=6603WFILE=6605PROT=6604CLOS=6602EXT=6611/THE CONTENTS OF PAGE ZERO HAS BEEN MOVED TO END OF LISTING!!/INTSAV IS THE HIGHEST ADDRESS WHICH IS OVERLAYED/WHEN THE INTERPRETER IS CALLED INTO CORE.INTSAV=6227INTEND=6020*400JMP I	.+1END			/FIRST PROCESS END VERBLDRWF,	      .+1	 /WRITE FILE SEQUENCE	      0 	 /DISK LOCATION (FIRST PART)	      1 	 /FILE NUMBERLDRWF3,       0 	 /NUMBER OF WORDS TO BE WRITTENLDRWF4,       LDREND-1	 /LOC OF FIRST WORD OF PROGRAM-1	      0 	 /WRITE BINARY ONTO WORD 0 OF DISKLDRWER, 0		 /WRITE FILE ERROR LOCATIONLDR50,	TAD   LDRWF3	CIA	DCA   LDRWF3	 /STORE WORD COUNT	CMA	TAD   LDREL	 /RESET CORE ADDRESS	DCA   LDRWF4	 /SET CORS ADDRESS	TAD	COMP	/TEST FOR COMPILE DIRECTIVE	SMA SZA CLA	JMP	LDMXIT	/NO--LOAD SAVER OVERLAY!!	TAD   LDRWF	 /ADDRESS OF PARAMETERS	WFILE	TAD   LDRWER	 /ERROR WORD	JMS I SYSIOE	 /CHECK FOR ERROR	JMP LDR2	 /GET NEXT LOAD CODE/THIS IS THE NEW VERSION OF THE BASIC COMPILE FUNCTION/THIS PROGRAM IS CALLED FROM THE LOADER WHEN THE/"COMPILE" DIRECTIVE HAS BEEN ISSUED.  IT WRITES/THE OUTPUT OF THE COMPILER ONTO FILE #2.  VARIOUS/ADDRESS ARE SAVED FROM LOCATIONS 10-37./WHEN DONE THE BASIC EDITOR IS RECALLED./THIS ROUTINE WRITES THE PROGRAM CODE ON FILE #2LDMXIT,	CLA CLL CML RTL	DCA	LDRWF3-1		/USE FILE 2!	TAD	LDRWF4+1	TAD	K30			/DONT WRITE FIRST 30 WORDS	DCA	LDRWF4+1	TAD	LDRWF3			/SAVE NUMBER OF WORDS	DCA	X4	JMS	DSKIO	JMP	LDR2			/CONTINUE WITH LOAD/THIS ROUTINE WRITES CONSTANTS, DATA, AND PAGE ZERO STUFF.LDEXT,	TAD	HLIMIT	DCA	LDRWF3			/SET UP NUMBER OF WORDS TO WRITE	CLA CMA	TAD	HLIMIT	DCA	LDRWF4	JMS	DSKIO			/WRITE CONSTANTS AND DATA	DCA	LDRWF4-3		/CLEAR DISK ADDRESS	DCA	LDRWF4+1	TAD	K7	DCA	LDRWF4			/WRITE 30 WORDS FROM PAGE ZERO	STA CLL RTL		/SET TO -3 FOR COMP	DCA	LDRTS			/SET COMPILE FLAG AT FRONT OF FILE	TAD ENDINT	/SAVE END OF INTERP POINTER	DCA LINE	TAD	KM30	DCA	LDRWF3			/WRITE ONLY 30 WORDS	JMS	DSKIO	TAD	COMP	PROT				/SET EXTENSION AND PROTECTION	TAD	K1000	CLOS	CLA	DCA	COMP			/RESET FLAG	JMP I	SYSPRG			/RECALL EDITOR/DISK I/O ROUTINEDSKIO,	0	TAD	LDRWF3		/SAVE UPDATED ADDRESS	CIA	TAD	LDRWF4+1	DCA	X3DSKIOP,	TAD	LDRWF	WFILE			/WRITE FILE #2	TAD	LDRWER	CLL RTR			/EOF ERROR IS 2	SNA CLA	SNL			/WAS IT ERROR #2	JMP	DSKIO1		/NO	DCA	EXTCNT		/COMPUTE LENGHT TO EXTEND FILE	TAD	LDRWF3		/COUNT LEFTDSKIO2,	TAD	K400	ISZ	EXTCNT		/COUNT SUBTRACTS	SZL	JMP	DSKIO2		/CONTINUE UNTIL POSITIVE	CLA	TAD	EXTBLK	EXT	SPA SNA			/HACK FOR DISK FULL	JMP	.+3	CLA	TAD	K7400		/FORCE DISK FULL ERROR	JMS I	SYSIOE		/CHECK FOR ERROR	TAD	X3	TAD	LDRWF3		/RESET NUMBER OF WORDS TO WRITE	DCA	LDRWF4+1	/TO REMAINDER OF BLOCK	JMP	DSKIOP		/CONTINUE WRITEDSKIO1,	TAD	LDRWER		/CHECK FOR NON-RECOVERABLE ERROR	JMS I	SYSIOE	TAD	X3		/THIS ASSUMES CORRECTLY THAT THE FILE	DCA	LDRWF4+1		/NEVER EXCEEDS 16 SEGMENTS.	JMP I	DSKIO		/OK--WRITE COMPLETEDEXTBLK,	.+1	2EXTCNT,	0K1000,	1000K400,	400K30,	30KM30,	-30K7,	7K7400,	7400BUFFER=.		/INPUT BUFFER FOR LOADERBFSIZ=400		/400 WORDS IN LENGTHLDREND=BUFFER+BFSIZ	/END OF LOADER CODEMVZ,	TAD   APZERO	 /ADDRESS OF FIRST LOC IN PG 0	DCA   10	TAD	APZCNT	 /NO. ITEMS TO BE MOVED	DCA   11	TAD   APZIMG	 /ADDRESS OF PZ INAGE	DCA   12	TAD I 12	 /MOVE PAGE DOWN	DCA I 10	ISZ   11	JMP   .-3	JMP LDR	 /PAGE ZERO  PT OF LOADERAPZIMG,       PZIMG-1APZERO,       PZERO-1APZCNT,	PZIMG-PZEND*600/CONVIENIENT FOR CONSTANTS//ENDC2,	-ISTACK		 /INITIAL STACK SIZEENDC3,   CODEON		/END OF LOAD CODE.ENDC4,	INTEND-1ITOC,	-INTSAV			/TOP OF INTERP OVERLAYJOFS=JMS I .	OFS//END-END STATEMENT PROCESSOR.//END SCANS THE TABLE AREA LOOKING FOR UNDEFINED/ LINE NUMBERS AND FUNCTIONS./ IT ALSO HANDLES THE FINAL CHAINING AND/OUTPUT OF CONSTANTS TO THE LOADER.//IT OUTPUTS THE "END" INTERP CODE,AND THE WRITE/DISK CODE AND THE END OF LOAD CODE TO THE LOADER.// CONSTANTS ARE SENT OUT BY TWO SCANS OF THE/ ASSIGNMENT TABLE. THE REFERENCES ARE CHAINED ON THE FIRST SCAN/ AND THE SECOND SENDS THE CONSTANTS TO THE LOAD STRING./END,	JPAS		 /END	-2		 /ND	TAD   TC	SZA CLA	JSTT		/ LET STT PICK  UP ERROR	JOTI	XEND		 /OUTPUT THE ENED OF IT ALL	JOFS		 /FORCE ALL OUTPUT	TAD ENDINT	/SET UP END OF INTERP POINTER	TAD ENDC4	DCA ENDINT	TAD START	/RELOCATE END OF VARIABLE AREA PTR	TAD ENDINT	DCA START	TAD   HLIMIT	 /SET-UP CONSTANT ORG	CIA	TAD   DATBND	 /REL TO END OF DATA	DCA   HLIMIT	TAD	ITOC		/TEST FOR CONSTANT AREA OVERFLOW	TAD	HLIMIT	SPA CLA	JMP	ENDPL		/SOME WOULD BE LOST SO DIE	TAD   ENDC2	 /STACK SIZE CONSTANT	TAD   HLIMIT	DCA   LLIMIT	 /SET UP .LOW LIMIT OF STACK	TAD START	/FOLLOWING MUST HOLD:  LLIMIT-START >= 1  ELSE PROG TOO BIG	CMA CLL	SMA	TAD LLIMIT	SNL CLAENDPL,	ERROR	 /****PROGRAM TOO LARGE  $$$$	1/CHECK FOR UNMATCHED FOR STATEMENTSEND01A,	TAD	FORFG	SZA CLA	ERROR	37			/****FOR WITHOUT NEXT/ LOOK FOR UNDEFINED LINESEND01,	TAD LS	CIA	TAD LT		/ TEST FOR END OF LINES	SNA CLA	JMP END1	/ GO TEST THE FUNCTIONS.	TAD I LS	SPA CLA	JMP END02	/ SO SOLLY YOU LEFT AND END UN-DONE.	ISZ LS	ISZ LS		/ BUMP THE LINE PRT	JMP END01END02,	CLA CLL CMA RAR	AND I LS	/PICK UP LINE NUMBER	DCA   LINE	ERROR	/******** UNDEFINED LINE NUMBER $$$$$$$$	27/LOOK FOR UNDEFINED FUNCTIONSEND1,	DCA   EL	 /INIT ASAN	TAD   JT	DCA   JEND2,	JLLA		 /LOAD LO ARGS OF ITEM	SNA CLA	JMP   END3	 /NO MORE IN TABLE	CLA CLL CMA RTL	TAD   IU	SNA	TAD   DF	SZA CLA	JMP   END2	 /IS A DEFINED FUNCTION	ERROR	 /****DEF STATEMENT MISSING	35/DO CONSTANT FIX-UPSEND3,	TAD   HLIMIT	DCA   T1	TAD   JT	 /IN Z SCAN	DCA   J	DCA   ELEND4,	JLLA		 /LOAD LO ARGS OF ITEM	SNA CLA	JMP   END5	 /ALL DONE	TAD   IU	SZA	JMP   END4	 /NOT A CONSTANT	TAD   T1	JOLA		 /SET LOAD LOCATION	TAD   AF	SZA		/ IGNORE UN-USED CONSTANT CHAINS.	JOCH		 /CHAIN TO REF'S	TAD   T1	TAD   C3	DCA   T1	JMP   END4	 /MOREEND5,	TAD   ENDC3	JOWD		/OUTPUT CODE TO DISK WRITE CODE	TAD   HLIMIT	JOLA		 /RESET LOADING LOCATION FOR CONSTANTS	TAD   JT	DCA   J 	 /INZ NEXT SCAN	DCA   ELEND6,	JLLA		 /GET AN ELEMENT	SNA CLA	JMP	END7	 /NO-MORE	TAD   IU	SZA CLA	JMP   END6	 /NOT A CONSTANT	TAD I X1	DCA   ID	TAD I X1	 /COPY INTO AREA	DCA   ID1	TAD I X1	DCA   ID2	JOTN		 /AND OUTPUT THE NUMBER	JMP   END6/THIS IS THE EXIT FOR THE END PROCESSORENDC1,	-OBUF		/ADDRESS OF START OF OUTPUT BUFFEREND7,	JOFS		 /TERMINATE OUTPUTEND8,	JOWD		 /OUTPUT AN END CODE	TAD   OW	 /AND FILL UP LAST B2	TAD   ENDC1	 /WORDS WITH ZEROS	SZA CLA	JMP   END8/ADJUST DATBND AND DSTBND FOR STRINGS!	TAD	DSTBND	TAD	DSTBND	TAD	DSTBND	TAD	DATBND		/STRING DATA=DATBND-3*DSTBND	DCA	DATBND	TAD	DATBND		/RESET DSTBND FOR LOAD PHASE	DCA	DSTBND	JMP I	.+1	MVZAAEND=.-ENDPZIMG=.	NOPUNCH*0COMP,	0			/COMPILE FLAG*3ENDINT,	0		/SET TO PTR TO LAST WORD OF INTERPRETER PROGRAM*6SYSIOE,	0			/CHECK FOR I/O ERRORSYSPRG,	0			/OVERLAY SYSTEM VECTORLDRTS,	0X1,	0X2,	0X3,	0X4,	0X5,	0X6,	0X7,	0*30START,	0			/TOP OF VARIABLE AREALLIMIT,	0			/LOWER LIMIT OF STACKHLIMIT,	0			/UPPER LIMIT OF STACKISTACK=100			/RUN TIME STACK SIZEDATBND,	0			/LIMIT OF DATA AREALINE,	0			/LINE NUMBER (TEMP STORE)DSTBND,	0			/LIMIT OF STRING AREA	ENPUNCHLDRCNT=LINE/! ! ! ! N O T E ! ! ! !/THIS CODE IS ASSEMBLED IN PAGE ZERO/IT IS LOADED AT END OF PROGRAM/AND MOVED TO PAGE ZERO AT RUN-TIME!PZERO,LDR90,	      0 	 /SUBROUTINE TO PICK UP ONE WORD FOR LOADER	TAD   LDRBE	 /BUFFER END	TAD   LDRBP	 /POINTER WITHIN BUFFER-BUFFER END	SPA   CLA	 /SKIP IF DISK READ IS NECESSARY	JMP   LDR92	 /GO TO PICK UP NEXT WORD FROM BUFFER	TAD   MSIZ	 /RESTORE COUNT AND ADDRESS	DCA   LDRRF3	TAD   LDBFA	DCA   LDRRF3+1	TAD   LDRRF	 /LOCATION OF PARAMETERS MUST BE IN AC	RFILE	TAD   LDRRER	 /READ ERROR WORD	JMS I SYSIOE	 /WHEN THE SYSTEM I/O IS CALLEDLDR91,	TAD   LDRBF	 /RESET BUFFER POINTER TO	DCA   LDRBP	 /POINT TO FIRST WORD OF BUFFER	TAD   LDRRF5	 /INCREMENT THE DISK READ LOCATION	TAD   PSIZ	DCA   LDRRF5	 /AND SET UP FOR NEXT READLDR92,	TAD I LDRBP	 /PICK UP NEXT LOADER WORD INTO AC	ISZ   LDRBP	 /INCREMENT THE BUFFER POINTER	JMP I LDR90	 /AND EXIT THE SUBROUTINELDR10,	CIA		 /PROCESS NORMAL LOAD	DCA   LDRCNT	 /NEGATE AND STORE COUNT OF WORDS TO BE LOADEDLDR11,	JMS   LDR90	 /LOAD 1 WORD	DCA I LDRLL	 /INTO LOCATION SPECIFIED BY LDRLL	ISZ   LDRPC	 /INCR RELATIVE LOCATION	ISZ   LDRLL	 /INCR ABSOLUTE LOCATION	ISZ I ALDWF3	 /INCREMENT WORD COUNT FOR WRITE FILE	ISZ   LDRCNT	 /INCREMENT COUNT AND SKIP WHEN FINISHED	JMP   LDR11	 /CONTINUE NORMAL LOADING UNTIL FINISHEDLDR,LDR2,	JMS   LDR90	 /PICK UP NEXT LOAD CODE	SNA		 /SKIP IF NOT AN END INDICATION	JMP   LDR20	 /GO TO TERMINATE LOADING	SMA		 /SKIP IF SPECIAL LOAD	JMP   LDR10	 /GO TO PROCESS NORMAL LOAD	IAC		 /ADD 1	SNA		 /SKIP IF LOAD CODE NOT -1	JMP   LDR30	 /GO TO RESET LOAD LOCATION POINTER	IAC		 /ADD 1	SNA		 /SKIP IF LOAD CODE NOT -2	JMP   LDR40	 /GO TO STRING LOAD LOCATION	IAC		 /ADD 1	SNA		 /SKIP IF LOAD CODE NOT -3	JMP I ALDR50	 /GO TO WRITE ON DISK	IAC	SZA CLA 	 /SKIP IF LOAD CODE -4	JMP   LDR2	 /IGNORE THIS CODE AND GO PROCESS NEXTLDR60,	JMS	LDR90		/PICK UP LOAD VALUE	SZA		/IF ZERO ITS A STRING DATA ITEM	JMP	LDR60A	CLA CLL CMA RTL	TAD	DSTBND	DCA	DSTBND	TAD	DSTBND		/USE THIS AS PC FOR LOAD!LDR60A,	DCA	LDRPC	JMP	LDR31LDR20,	TAD	COMP		/IS THIS COMPILE FUNCTION?	SMA SZA CLA	JMP I	LDX		/EXIT THRU COMPILE FUNCTION	TAD   LDRK6	 /TERMINATE LOADING BY CALLING IN THE	JMP I SYSPRG	 /INTERPRETER THROUGH THE EXECUTIVE ROUTINELDR30,	JMS   LDR90	 /RESET LOAD LOCATION POINTER	DCA   LDRPC	TAD   LDREL	 /WHICH IS RELATIVE TO FIRST LOCATION LOADEDLDR31,	TAD   LDRPC	 /TO NEXT VALUE LOADED	DCA   LDRLL	JMP   LDR2	 /LOOP TO CONTINUE LOADINGLDR40,	JMS   LDR90	 /STRING LOAD LOCATION TO NEXT LOADED VALUELDR41,	TAD   LDREL	 /FORM THE ABSOLUTE ADDRESS OF THE	DCA   LDRCNT	 /LOCATION TO WHICH TO STRING	TAD I LDRCNT	 /SAVE FOLLOWING STRING LOCATION	DCA   LDRTS	 /IN TEMPORARY STORAGE	TAD   LDRPC	 /STRING LOAD LOCATION	DCA I LDRCNT	 /INTO LOCATION SPECIFIED	TAD   LDRTS	 /PICK UP NEXT STRING LOCATION	SNA		 /SKIP IF STRINGING NOT COMPLETE	JMP   LDR2	 /LOOP TO GET NEXT LOAD CODE	JMP   LDR41	 /AND LOOP TO TEST FOR STRINGING DONELDRRF,	      .+1	 /READ FILE SEQUENCELDRRF1,       0 	 /DISK LOCATION	      1 	 /FILE NUMBERLDRRF3,       -BFSIZ	 /NO. WORDS TO BE READ	BUFFER-1	 /LOC. OF INPUT BUFFERLDRRF5,       0 	 /DISK LOCATION OF NEXT READLDRRER, 0		 /READ FILE ERROR LOCATIONPSIZ,	BFSIZMSIZ,	-BFSIZLDBFA,	BUFFER-1LDX,	LDEXTALDR50,       LDR50	 /LINK TO WRITE FILE ROUTINEALDWF3,       LDRWF3	 /WORD COUNTLDREL,	      LDREND	 /END OF LOADERLDRK6,	      6 	 /CONSTANT 6 TO CALL INTERPRETERLDRBE,	      -BUFFER-BFSIZLDRBF,	      BUFFER	 /FIRST LOC OF INPUT BUFFERLDRBP,	      BUFFER+BFSIZLDRLL,	      LDREND	 /LOAD LOCATION,ABSOLUTELDRPC,	      0 	 /LOAD LOCATION,RELATIVEPZEND=PZIMG+.-PZERO$