/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 $