PDP-11 ALGOL COMPILER, VERSION 6.6.019 FRIDAY MARCH 5, 1976 AT 5:34 AM. COMPILER COMPILED FRIDAY MARCH 5, 1976 AT 1:15 AM. 0000 % P D P - 1 1 A L G O L C O M P I L E R L E V E L 6 . 6 0000 % 0000 % COPYRIGHT (C) 1976, GREGORY D. HOSLER 0000 % THIS LISTING IS TO SERVE ONLY AS PARTIAL DOCUMENTATION. 0000 % ANY ATTEMPTS TO TURN IT INTO A SOURCE FILE, AND/OR REPRODUCE IT 0000 % IN ANY WAY, SHAPE, OR FORM ARE FORBIDDEN WITHOUT WRITTEN 0000 % PERMISSION OF THE AUTHOR. 0000 % 0000 % G R E G O R Y D A V I D H O S L E R 0000 % 0000 % VERSION 6.3 -- ARRAY LINKS, TABS, OCTAL OUTPUT 0000 % 0000 % 1 5 - A U G - 7 4 0000 % 0000 % 0000 % VERSION 6.4 -- COMMAND STRING DECODER IN COMPILER. 0000 % NEW IMPROVED SYMBOL TABLE. 0000 % 0000 % 2 7 - A U G - 7 4 0000 % 0000 % 0000 % VERSION 6.5 -- READ BECOMES OPTIONAL BOOLEAN FUNCTION 0000 % RETURNING EOF INFORMATION. 0000 % STRINGS TO BECOME 2 CHARACTERS/WORD. 0000 % CASE & THRU STATEMENTS IMPLEMENTED. 0000 % DIV & / OPERATORS FULLY IMPLEMENTED. 0000 % ARRAYS TO BE DYNAMICALLY ALLOCATED WITH 0000 % RE-MAPPING ALLOWED WHEN PASSED TO A 0000 % PROCEDURE. 0000 % POINTERS AND TRUTHSETS IMPLEMENTED. 0000 % TOGETHER WITH SCAN AND REPLACE STMTS. 0000 % FIRSTONE, ONES OPERATORS IMPLEMENTED. 0000 % FOR STMT IMPLEMENTED AS SHOULD BE. 0000 % FUNCTION REFS ALLOWED WITHOUT STORE. 0000 % BOOLEAN ARRAYS SCANNED PROPERLY. 0000 % VARIABLE REFS OF LOWER LEVELS ALLOWED. 0000 % SEVERAL FILE ATTRIBUTES IMPLEMENTED. 0000 % DEFINES CHANGED FOR THE BETTER! 0000 % DEFINES MAY NOW BE ARBITRARILY LONG. 0000 % ALSO MAY HAVE DEFINES WITH UP TO 10 0000 % PARAMETERS. 0000 % LITERAL STRINGS NOT LIMITED TO 72 CHARS. 0000 % INTEGER CONSTANTS CAN NOW BE QUOTED. 0000 % CONCATENATION ADDED TO ARITHMETIC AND 0000 % BOOLEAN EXPRESSIONS. 0000 % FILE DECLARATIONS CHANGED FOR THE BETTER. 0000 % (SEE FILEDEC). 0000 % CONTEXT SENSITIVE RESERVED WORDS ADDED. 0000 % ALL IN ALL ONE BIG MOTHER CHANGE FOR THE BETTER. 0000 % 0000 % 5 - S E P - 7 4 0000 % 0000 % BOOTED 2 0 - F E B - 7 5 PDP-11 ALGOL COMPILER, VERSION 6.6.019 3/5/76 PAGE 2 0000 BEGIN 0000 1 DEFINE REVNO="66"#, B.0000 IS SEGMENT 001 ******** 0001 UPDATE="019"#; OMIT @O OMIT C O M P I L E R U P D A T E S OMIT OMIT 6.5.001 ALGOL BASE COMPILER. OMIT 6.5.002 OMITTED LISTING FIXED. OMIT 6.5.003 INCLUDE & CHAIN CONTROL CARDS FIXED. OMIT 6.5.004 PATCH TO LIST ERROR MESSAGES ON KB IF NO LIST FILE. OMIT 6.5.005 PATCH INVALID INDEX IN GETATTRIBUTE. OMIT 6.5.006 PATCH TO AVOID STR TO INT CONVERT ERR IN GETNEXT FOR INT CONSTS OMIT PATCH TO PRINT OUT DOUBLE CHAR TOKENS IN ERROR (I.E. := ). OMIT 6.5.007 OPTION SCANNER ADDED TO COMMAND STRING INTERPRETER. OMIT 6.5.008 PATCH TO GAURD AGAINST UPLEVEL ATTACHS TO POINTER PARAMETERS OMIT BY VALUE. OMIT PATCH TO FIX INVALID INDEX IN CASESTMT. OMIT 6.5.009 PATCH (AGAIN) TO FIX INVALID INDEX IN GETATTRIBUTE. OMIT 6.5.010 CHANGE DEFAULT ARRAY PARAMS TO INTEGER INSTEAD OF REAL OMIT MAKE COMMAND STRING INTERPRETER BETTER & SMALLER. OMIT 6.5.011 PATCH COMPOUNDTAIL SO THAT GO TO EOJ IF FINAL END OMIT NOT FOLLOWED BY A PERIOD. OMIT 6.5.012 OPTIMIZE PURGEIT A LITTLE, TAKE 'CLOSE' OUT OF CLASS 3 OMIT RESERVED WORD LIST. OMIT 6.5.013 MNEMONIC FILE ATTRIBUTES IMPLEMENTED PROPERLY. OMIT 6.5.014 MAKE FORMS FROM INPUT FILE PRINT IN NICE PLACES IN OUTPUT FILE. OMIT 6.5.015 MAKE THE SCANNER FASTER. OMIT 6.5.016 COMPOUND TAIL - FORCE EOF IF NOT ENOUGH END'S (EVEN WITH A '.') OMIT 6.5.017 DEFAULT EXTERNAL FILE NAMES TO BE THE INTERNAL FILE NAME OMIT 6.5.018 BUILD DECLARATIONS OF NESTED BLOCKS NOT IN PROCEDURES OMIT IN THE STACK. OMIT 6.5.019 SWITCHES OUT OF PRIMARY AND STMT. OMIT ALLOW PARTIAL WORDS OF BUILD-IN FUNCTIONS. OMIT 6.5.020 DEFINES CAN BE INVOKED WITH BRACKETS AS WELL AS PARENS. OMIT DOCUMENTATION ADDED FOR DEFINES. OMIT FORMS IGNORED IF NO PRINT ACTION TO BE TAKEN. OMIT 6.5.021 CLOSE STATEMENT FIXED UP (SO DOESN'T PURGE FILE BY DEFAULT) OMIT 6.5.022 UIC REMOVED FROM ERROR FILE FILE-NAME. (FOR USE UNDER RT-11) OMIT 6.5.023 COMMAND STRING INTERPRETER FIXED TO TAKE UICS OMIT AND PUT THEM AFTER DEFAULT EXTENSIONS OMIT 6.6.001 MAXRECSIZE OF CODE FILE CHANGED TO 256. OMIT 6.6.002 COMMAND STRING INTERPRETER CHANGED TO ALLOW INDIRECT FILES. OMIT FORMATTING FIXED IN FILL STMT (START OF SEG LINE). OMIT 6.6.003 CHAIN STATEMENT IMPLEMENTED. OMIT 6.6.004 COMPILE-AND-GO SWITCH ADDED TO COMMAND STRING INTERPRETER OMIT 6.6.005 POLISH MADE GENERIC IN 'VARIABLE'. OMIT STRING EXPRESSIONS ALLOWED TO HAVE 'CASE' OR 'IF' OMIT EXPRESSIONS AS SUBEXPRESSIONS. OMIT 6.6.006 FIX PROBLEM WITH EXPANDING DEFINES > 72 CHARS. OMIT 6.6.007 LISTING CHANGED TO PRINT NAMES ASSOCIATED WITH PRT INFO. OMIT COMMAND STRING INTERPRETER CHANGED TO ALLOW MORE THAN OMIT ONE INPUT FILE. OMIT SPEED UP LEXICAL SCANNER A LITTLE. OMIT FIX COMPOUND TAIL TO PRINT END COUNTERS OF OMIT BEGIN-END PAIRS IN RIGHT PLACE. OMIT FIX NEXTCHAR SCANNER TO NOT PRINT EXTRANIOUS LINES. PDP-11 ALGOL COMPILER, VERSION 6.6.019 3/5/76 PAGE 3 OMIT 6.6.008 REWRITE PURGEIT A LITTLE TO OMIT 1) SPEED IT UP SLIGHTLY AND OMIT 2) FIX PROBLEM WITH ADDRESS EQUATING A VARIABLE OMIT TO BE IN A LEVEL OTHER THAN ITS OWN. OMIT 6.6.009 FIX PROBLEM WITH ADDRESS EQUATION TO LOWER LEVELS. OMIT 6.6.010 ALLOW REPLACE FILE.TITLE BY FILE.TITLE. OMIT FIX FILEATTRIBUTE SO THAT MYUSE IS REFERENCED AS A BYTE. OMIT FIX READCARD TO NOT PRINT GARBAGE LINE AT EOF. OMIT FIX ENTRY TO NOT ALLOW RE-DEFINING IDS. OMIT FIX CSI SCANNER TO ACCEPT EXTENSIONS. OMIT 6.6.011 IMPLEMENT EXTERNALS AND STUFF FOR THE BINDER. OMIT 6.6.012 FIX 'BLOK' DEALING WITH MAKING MARKSTACK DESCRIPTORS OMIT AUTOMATICALLY GLOBAL. OMIT RENAME ERROR FILE. OMIT FIX FILE NAME SPACE SUPPRESSING OF INPUT FILE. OMIT FIX INIT CODE TO PRINT ERROR MESSAGE IF NOT GIVEN OMIT PROPER INPUT. OMIT 6.6.013 FIX 'GOSTMT' NOT TO CRAP OUT WHEN GIVEN NON-LABEL. OMIT FIX 'BLOK' TO ALLOCATE LOCAL WORK CELLS AFTER DECLARATIONS. OMIT 6.6.014 ADD 'ENTRYCOUNT' TO SPEED UP SYMBOL TABLE CLEANUP. OMIT CHANGE CLEANIT TO PRINT STRINGS IN ASCII IF GETTING OMIT A CODE LISTING. OMIT CHANGE DEFAULT MAXRECSIZE OF BINARY FILES TO BE 256 OMIT IN FILEDEC. OMIT FIX 'ENTRY' TO ENTER ALL REDEFINABLES PROPERLY. OMIT 6.6.015 FIX INIT CODE TO COMPILE SEPARATELY COMPILED PROCEDURES OMIT AT LEVEL 2. OMIT 6.6.016 BUG FIXS - ALLOW REDEFINABLES > 127 TO BE REDEFINED. OMIT ALLOW CLOSE TO BE REDEFINED. OMIT 6.6.017 CHANGE DEFAULT MAXRECSIZE IN FILEDEC TO BE 0, OMIT OPEN CODE AND LIST FILES FOR MAXRECNO=0. OMIT 6.6.018 CHANGE INIT CODE TO NOT DELETE CURRENT CODE AND LIST FILES. OMIT 6.6.019 FIX ARRAYDEC TO PROPERLY BUILD MULTIPLE ARRAYS FROM OMIT A SINGLE DECLARATION IN A PROCEDURE. OMIT I.E. FIX THE 'ARRAY A,B,C[0:10];' DECLARATION IN PROCS. PDP-11 ALGOL COMPILER, VERSION 6.6.019 3/5/76 PAGE 4 OMIT A L G O L E R R O R M E S S A G E S OMIT OMIT 1 DECLARATION NOT FOLLOWED BY SEMICOLON. OMIT 2 IDENTIFIER DECLARED TWICE IN SAME BLOCK. OMIT 3 SPECIFICATION PART IDENTIFER NOT IN FORMAL PARAMETER PART. OMIT 4 NONIDENTIFIER IN IDENTIFER LIST OF DECLARATION. OMIT 5 PROCEDURE IDENTIFIER NOT FOLLOWED BY '(' OR ';'. OMIT 6 FORMAL PARAMETER LIST NOT FOLLOWED BY ')'. OMIT 7 FORMAL PARAMETER LIST NOT FOLLOWED BY ';'. OMIT 8 VALUE PART CONTAINS IDENTIFIER NOT IN FORMAL PARAMETER LIST. OMIT 9 VALUE PART NOT ENDED BY ';'. OMIT 10 MISSING OR ILLEGAL SPECIFICATION PART. OMIT 11 ILLEGAL USE OF 'OWN'. OMIT 12 ILLEGAL USE OF 'SAVE'. OMIT 13 SAME EXTERNAL VARIABLES DO NOT AGREE IN TYPE. OMIT 14 ILLEGAL USE OF 'OWN','SAVE' OR 'EXTERNAL'. OMIT 15 ARRAY IDENTIFIER NOT FOLLOWED BY '['. OMIT 16 LOWER BOUND IN ARRAY DECLARATION NOT FOLLOED BY ':'. OMIT 17 BOUND PAIR IN ARRAY DECLARATION NOT FOLLOWED BY ']'. OMIT 18 ILLEGAL LOWER BOUND DESIGNATOR IN ARRAY SPECIFICATION. OMIT 19 DECLARATOR ILLEGALLY PRECEDED BY 'OWN','SAVE' OR 'EXTERNAL'. OMIT 20 NOT PROPER VALUE FOR THIS FILE ATTRIBUTE. OMIT 21 ILLEGAL RE-USE OF INITIALIZATION ATTRIBUTE. OMIT 22 MISSING ')' IN FILE DECLARATION. OMIT 23 NUMBER OF NEXTED BLOCKS > 31. OMIT 24 MUST BE BOOLEAN OR INTEGER IDENTIFIER. OMIT 25 NUMBER OF PARAMETERS INCONSISTENT WITH FORWARD DECLARATION. OMIT 26 PARAMETER TYPE DOES NOT AGREE WITH FORWARD DECLARATION. OMIT 27 VALUE PART INCONSISTENT WITH FORWARD DECLARATION. OMIT 28 UNDECLARED IDENTIFIER. OMIT 29 'BEGIN' EXPECTED IN CASE STATEMENT. OMIT 30 PRIMARY MAY NOT BEGIN WITH THIS TYPE QUANTITY. OMIT 31 MISSING '('. OMIT 32 MISSING ')'. OMIT 33 PRIMARY MAY NOT START WITH DECLARATORS. OMIT 34 NOT BOOLEAN EXRESSION. OMIT 35 NO EXPRESSION MAY BEGIN WITH THIS TYPE QUANITY. OMIT 36 MISSING ':'. OMIT 37 MISSING ','. OMIT 38 MISSING OR ILLEGAL CONSTANT. OMIT 39 MISSING 'THEN'. OMIT 40 MISSING '['. OMIT 41 MISSING ']'. OMIT 42 MISSING ';' OR 'END'. OMIT 43 MISSING 'END'. OMIT 44 ACTUAL AND FORMAL PARAMETERS NOT SAME TYPE. OMIT 45 ACTUAL AND FORMAL ARRAYS DIFFER IN NUMBER OF DIMENSIONS. OMIT 46 ACTUAL AND FORMAL PARAMETERS DO NOT AGREE IN NUMBER. OMIT 47 MISSING 'UNTIL'. OMIT 48 MISSING 'DO'. OMIT 49 MISSING ':' AFTER LABEL. OMIT 50 LABEL NOT DECLARED IN THIS BLOCK. OMIT 51 LABEL HAS ALREADY OCCURRED. OMIT 52 EQUIVALENCE OPERATOR EXPECTED. OMIT 53 FINAL 'END' NOT FOLLOWED BY PERIOD. OMIT 54 FUNCTION REFERENCE CANNOT OCCUR ON THE LEFT OF AN ASSIGNMENT. OMIT 55 STATEMENT MAY NOT START WITH THIS TYPE QUANITY. PDP-11 ALGOL COMPILER, VERSION 6.6.019 3/5/76 PAGE 5 OMIT 56 STATEMENT MAY NOT START WITH A DECLARATOR. OMIT 57 MORE THAN 1024 PROGRAM REFERENCE CELLS REQUIRED. OMIT 58 MORE THAN 2048 STACK CELLS REQUIRED FOR THIS PROCEDURE. OMIT 59 IMPROPER INDEX VARIABLE IN 'FOR' STATEMENT. OMIT 60 MISSING ':=' FOLLOWING INDEX VARIABLE. OMIT 61 MISSING 'UNTIL' OR 'WHILE' IN 'STEP' ELEMENT. OMIT 62 MISSING 'DO' IN 'FOR' CLAUSE. OMIT 63 MISSING 'ELSE'. OMIT 64 DECLARED LABEL DID NOT OCCUR. OMIT 65 DECLARED FORWARD PROCEDURE DID NOT OCCUR. OMIT 66 SEGMENT TOO LARGE (>2047 WORDS). OMIT 67 MISSING ':='. OMIT 68 MISSING LABEL. OMIT 69 IDENTIFIER FOLLOWING 'FILL' OPERATOR NOT ARRAY IDENTIFIER. OMIT 70 MISSING 'WITH' IN 'FILL' STATEMENT. OMIT 71 IMPROPER ROW DESIGNATOR. OMIT 72 MISSING '(' IN I/O STATEMENT. OMIT 73 MISSING FILE IDENTIFIER IN I/O STATEMENT. OMIT 74 MISSING ']' IN FILE INDEX PART. OMIT 75 MISSING '[' IN ARRAY ROW DESIGNATOR. OMIT 76 MISSING '*' IN ARRAY ROW DESIGNATOR. OMIT 77 MISSING ']' IN ARRAY ROW DESIGNATOR. OMIT 78 ILLEGAL CHARACTER - IGNORED. OMIT 79 CONSTANT TABLE OVERFLOW - INSERT DUMMY 'GO TO' STATEMENT. OMIT 80 TOO MANY CHARACTERS IN STRING. OMIT 81 MISSING STRING IDENTIFIER. OMIT 82 RECURSIVE DEFINES NESTED MORE THAN 7 DEEP. OMIT 83 FORMAL PARAMETER NOT IN SPECIFICATION PART-DEFAULTED TO INTEGER. OMIT 84 MISSING OR ILLEGAL BASED VARIABLE. OMIT 85 MISSING 'BASED' IN FIELD DECLARATION. OMIT 86 MISSING OR ILLEGAL REFERENCE IF 'SAVE' FUNSTION. OMIT 87 MISSING OR ILLEGAL REFERENCE IN 'ADDR' FUNCTION. OMIT 88 MISSING OR ILLEGAL REFERENCE IN 'RELEASE' FUNCTION. OMIT 89 MISSING OR ILLEGAL ARRAY'S IN 'SWAP' STMT. OMIT 90 MISSING OR ILLEGAL STRING IN 'CHAIN' STATEMENT. OMIT 91 SYMBOL TABLE OVERFLOW - THAT'S IT. OMIT 92 TOO MANY PARAMETERS IN PROCEDURE DECLARATION. OMIT 93 TOO MANY ERRORS - COMPILER TERMINATED. OMIT 94 NO EXTERNAL PROCEDURES IN SEPARATELY COMPILED PROCEDURES. OMIT 95 TOO MANY CASES IN CASE BODY. OMIT 96 NOT PROPER FILE ATTRIBUTE. OMIT 97 MISSING 'OF' IN CASE EXPRESSION OR CASE STATEMENT. OMIT 98 ILLEGAL USE OF 'LONG'. OMIT 99 IDENTIFIER EXPECTED. OMIT 100 NUMBER OF PARAMETERS DEFINE NOT SAME AS IN DEFINE DECLARATION. OMIT 101 DEFINE TABLE OVERFLOW - COMPILE TERMINATED. OMIT 102 NOT POINTER EXPRESSION. OMIT 103 'BY' EXPECTED IN REPLACE STATEMENT. OMIT 104 'DIGIT' OR 'DIGITS' EXPECTED IN ARITHMETIC CONVERSION. OMIT 105 'IN' OR RELATIONAL OPERATOR EXPECTED. OMIT 106 TRUTHSET IDENTIFIER EXPECTED. OMIT 107 'WHILE' OR 'UNTIL' EXPECTED. OMIT 108 POINTER IDENTIFIER EXPECTED. OMIT 109 ARRAY NOT DIMENSIONED SAME AS IN FORWARD DECLARATION. OMIT 110 ARRAY NOT TYPED SAME AS IN FORWARD DECLARATION. OMIT 111 THIS CONSTRUCT IS NOT IMPLEMENTED YET. OMIT 112 LABEL OR SWITCH NOT DECLARED IN SAME BLOCK OR SAME PROCEDURE. PDP-11 ALGOL COMPILER, VERSION 6.6.019 3/5/76 PAGE 6 OMIT 113 NOT MEMBERSHIP PRIMARY. OMIT 114 RELATIONAL OPERATOR EXPECTED. OMIT 115 'FOR' EXPECTED. OMIT 116 MUST BE ARITHMETIC IDENTIFIER OR '(ARITHMETIC EXPRESSION)' OMIT 117 MUST BE POINTER OR STRING. OMIT 118 STRING EXPECTED. OMIT 119 '.TITLE' EXPECTED. OMIT 120 CANNOT INCLUDE FROM INCUDE FILE. INCLUDE IGNORED. OMIT 121 UNEXPECTED END OF INPUT. COMPILATION TERMINATED. OMIT 122 NOT ENOUGH CONTIGUOUS DISK. COMPILATION TERMINATED. OMIT 123 ILLEGAL FILE MNEMONIC. OMIT 124 'BEGIN' OR PROCEDURE DECLARATION EXPECTED. OMIT 125 EXTERNAL PROCEDURES MUST BE DECLARED AT LEVEL 1. 0001 @O PDP-11 ALGOL COMPILER, VERSION 6.6.019 3/5/76 PAGE 7 0001 DEFINE STACKSIZE=4607#, % SYMTAB CAN'T BE > EXTERNALSIZE-1 0001 EXTERNALSIZE=16000#, % SWITCH FOR EXTERNAL DECS. 0001 MAXDEFINELEVEL=10#; % MAX LEVEL OF DEFINES TO BE EXPANDED IS 0001 % ARBITRARY BUT FINITE (<=2**15-1) 0001 INTEGER 0001 ADDRESS, % ADDRESS OF DECLARED IDENTIFIER 0001 % SET BY GETNEXT 000062-P = ADDRESS 0001 ADDRESSF, % ADDRESS OF VARIABLE THAT IS BEING ENTERED 0001 % INTO THE SYMBOL TABLE BY ENTRY 000063-P = ADDRESSF 0001 ADRS, % USED TO KEEP TRACK OF EACH BLOCKS PRT CELL 000064-P = ADRS 0001 AMTLEFT, % AMOUNT OF DEFINE LEFT TO EXPAND 000065-P = AMTLEFT 0001 BEGINCTR, % KEEPS TRACK OF BEGIN END PAIRS 000066-P = BEGINCTR 0001 C, % COUNT OF THE NUMBER OF ENTRIES INTO THE 0001 % A ARRAY WHICH CONTAINS THE SCANNED SYMBOL 0001 % IN SYMBOL TABLE FORMAT 000067-P = C 0001 CLASS, % THIS VARIABLE CONTAINS THE CLASS NUMBER OF 0001 % THE INFORMATION CURRENTLY UNDER SCRUTINY. 000070-P = CLASS 0001 CLASSF, % CLASS TYPE OF VARIABLE THAT IS BEING ENTERED 0001 % INTO THE SYMBOL TABLE BY ENTRY 000071-P = CLASSF 0001 CLEAN, % A POINTER INTO THE ARRAY CONST WHICH HOLDS 0001 % CONSTANTS AND STRING CONSTANTS 000072-P = CLEAN 0001 DA, % KEEPS TRACK OF FAR INTO THE CODE FILE WE 0001 % HAVE WRITTEN 000073-P = DA 0001 DEFINDEX, % POINTER INTO ELBAT (DEFINE TABLE) OR SYMTABLE 0001 % DEPENDING WHERE DEFINE IS AT, 000074-P = DEFINDEX 0001 DEFLEVEL, % LEVEL OF NESTED DEFINES THAT WE ARE CURRENTLY AT 000075-P = DEFLEVEL 0001 EI, % KEEPS TRACK OF HOW MUCH HAS ACTUALLY 0001 % BEEN PLACED IN THE EXTERNAL SYMBOL TABLE 000076-P = EI 0001 ELBATI, % POINTER INTO THE DEFINE EXPANSION TABLE 000077-P = ELBATI 0001 ENTRYCOUNT, % KEEPS TRACK OF THE # OF ITEMS ENTERED INTO THE SYMBOL 0001 % TABLE AT A GIVEN LEVEL. THIS IS USED TO SPEED UP 0001 % SYMBOL TABLE CLEAN UP. 000100-P = ENTRYCOUNT 0001 ERRORCOUNT, % KEEPS TRACK OF THE NUMBER OF ERRORS 0001 % ENCOUNTERED IN THE PROGRAM 000101-P = ERRORCOUNT 0001 I, % POINTER TO LAST WORD USED IN THE ARRAY 0001 % STACK - CARE SHOULD BE USED BECAUSE I 0001 % IS USED AS LOCAL IN SOME PROCEDURES 000102-P = I 0001 INF, % INF POINTS TO THE INFORMATION JUST 0001 % ENTERED BY ENTRY INTO STACK 000103-P = INF PDP-11 ALGOL COMPILER, VERSION 6.6.019 3/5/76 PAGE 8 0001 INFO, % A POINTER INTO STACK OF ANY ADDITIONAL 0001 % INFORMATION CONCERNING THIS VARIABLE. 000104-P = INFO 0001 INREAL, % CONTAINS THE VALUE OF THE INTEGER CONSTANT 0001 % JUST CONVERTED BY CONVERT. 000105-P = INREAL 0001 INSYM, % POINTER TO LAST SYMBOL SCANNED BY GETNEXT 0001 % THIS POINTS AT THE CHARACTERS OF THE SYMBOL 0001 % NOT THE INFO WORDS 000106-P = INSYM 0001 J, % TEMP VARIABLE - CAN BE USED BY ANYONE 0001 % BE CAREFUL 000107-P = J 0001 L, % A POINTER INTO THE EDOC OR CODE ARRAY TO 0001 % KEEP TRACK OF CODE EMITTED. 000110-P = L 0001 LASTCOL, % COL # OF LAST IDENTIFIER SCANNED 000111-P = LASTCOL 0001 LASTI, % POINTS TO WHERE SYMBOL TABLE OF THIS LEVEL 0001 % GETS CUT BACK TO. 0001 % USED TO ALLOW ADDRESS EQUATES TO LOWER LEVELS. 000112-P = LASTI 0001 LENGTH, % LENGTH OF QUOTED STRING JUST PARSED BY QUOTE 000113-P = LENGTH 0001 LEVEL, % LEVEL KEEPS TRACK OF WHAT LEVEL WE ARE 0001 % CURRENTLY COMPILING CODE FOR 000114-P = LEVEL 0001 LINECOUNT, % COUNTS THE NUMBER OF LINES SCANNED 000115-P = LINECOUNT 0001 LINSTR, % CONTAINS THE NUMBER OF CHARACTERS MOVED INTO 0001 % THE STRING INSTR BY THE SCAN PROCEDURE. 000116-P = LINSTR 0001 LNCT, % KEEPS TRACK OF THE NUMBER OF LINES WRITTEN 0001 % ON THE OUTPUT FILE SO WE CAN PAGE IT 000117-P = LNCT 0001 MAXDATA, % KEEPS COUNT OF HOW MUCH ARRAY (OVERLAYABLE) 0001 % HAS BEEN DECLARED THIS IS 0001 % THE MAXIMUM OF ALL DECLARATIONS 0001 % IT IS USED TO FIGURE CORE REQUIREMENTS 000120-P = MAXDATA 0001 MAXI, % THE MAXIMUM INDEX INTO THE SYMBOL TABLE 0001 % DURING THE COMPILATION 0001 % SO WE CAN FOUND HOW HOW MUCH SYMBOL TABLE WAS 0001 % ACTUALLY NEEDED FOR THE COMPILATION 000121-P = MAXI 0001 MAXSEG, % USED TO OBTAIN THE MAX SEGMENT EMITTED 0001 % THIS IS USED TO FIQURE CORE REQUIREMENT 000122-P = MAXSEG 0001 PGCT, % HOLDS THE PAGE COUNT FOR PAGE HEADINGS 000123-P = PGCT 0001 PINF, % POINTER TO LAST DECLARED PROCEDURE INFO 0001 % USED TO COMMUNICATE BETWEEN BLOCK AND 0001 % PRODEC 000124-P = PINF 0001 PLL, % PROGRAM LOW LINK. 0001 % POINTS TO THE 1ST WORD OF THE PROGRAM DESCRIPOTR 0001 % OF THE 1ST PROGRAM SEGMENT TO GET COMPILED PDP-11 ALGOL COMPILER, VERSION 6.6.019 3/5/76 PAGE 9 0001 % THE 2ND WORD OF THAT DESCRIPTOR THEN POINTS 0001 % TO THE NEXT PROGRAM DESCRIPTOR IN A LINKED FASHION 000125-P = PLL 0001 PROADDRESS, % THE ADDRESS OF THE PROCEDURE CURENNTLY BEGIN 0001 % COMPILED 000126-P = PROADDRESS 0001 PRTMAX, % CONTAINS THE NUMBER OF PRT CELLS THAT WERE 0001 % ASSIGNED BY THE COMPILER 000127-P = PRTMAX 0001 SAVEIT, % THIS CONTAINS THE AMOUNT OF SAVE STORAGE 0001 % THAT THE COMPILED PROGRAM NEEDS. THIS IS 0001 % USED IN FIQURING CORE REQUIREMENT. 000130-P = SAVEIT 0001 SGNO, % THE NUMBER OF THE SEGMENT WE ARE CURRENTLY 0001 % COMPILING 000131-P = SGNO 0001 SGAVL, % THE NEXT AVAILABEL SEGMENT NUMBER THAT 0001 % CAN BE USED 000132-P = SGAVL 0001 SKAN, % CONTAINS TYPE OF TOKEN JUST SCANNED BY SCANNER 000133-P = SKAN 0001 STACKCTR, % CONTAINS THE CURRENT STACK ASSIGNMENT CELL 0001 % NUMBER 000134-P = STACKCTR 0001 SYMBOLTABLESIZE,% CONTAINS THE MINIMUM SIZE OF THE SYMBOL TABLE 0001 % USED TO SPEED UP 'PURGEIT' 000135-P = SYMBOLTABLESIZE 0001 TIME1, % TIME IN MINUTES (CLOCK TIME) AT THE 0001 % START OF COMPILATION 000136-P = TIME1 0001 TOTSEG, % TOTAL AMOUNT OF OBJECT CODE PRODUCED 0001 % BY THE COMPILER 000137-P = TOTSEG 0001 VM, % CALULATES THE TOTAL MEMORY 0001 % REQUIREMENT FOR A PROGRAM IF IT WOULD 0001 % FIT INTO CORE AS A WHOLE 000140-P = VM 0001 WCL, % PC OF WORKING CELL ALLOCATOR 000141-P = WCL 0001 WORKCELLCOUNT; % CONTAINS THE # OF WORK CELLS NEEDED IN A 0001 % PARTICULAR BLOCK 000142-P = WORKCELLCOUNT PDP-11 ALGOL COMPILER, VERSION 6.6.019 3/5/76 PAGE 10 0001 BOOLEAN 0001 ACTIONTOG, % SET TO TRUE BY WRITESTMT WHEN PASSING AN 0001 % ACTION LABEL TO GOSTMT 000143-P = ACTIONTOG 0001 ASTRISK, % SET TO TRUE FOR ':= *' TO SCAN THE '*' 0001 % IN PRIMARY AND BOOPRIM 000144-P = ASTRISK 0001 BOOLREADTOG, % WHEN TRUE INDICATES READ TO RETURN A BOOLEAN 0001 % RESULT 000145-P = BOOLREADTOG 0001 COMPILEANDGO, % /G OPTION OF COMMAND STRING INTERPRETER 000146-P = COMPILEANDGO 0001 CRUNCHOPTION, % /C OPTION ( FOR DOS ONLY ! ) 000147-P = CRUNCHOPTION 0001 DEBUGTOG, % IF SET TO TRUE PRODUCES A DEBUGGING LISTING 0001 % ON THE OUTPUT TO HELP IN DEBUGGING 000150-P = DEBUGTOG 0001 EIGHTYCOL, % SET TO TRUE IF ONLY EIGHTY COL LISTING IS DESRIRE 0001 % I.E. COLS 81 & GTR ARE TRUNCATED (TABS COUNT AS SHOULD) 000151-P = EIGHTYCOL 0001 EPROC, % TRUE IF EXTERNAL PROCEDURES NEEDED 000152-P = EPROC 0001 EOPTION, % IF SET TO TRUE MEANS THAT ONLY ERRORS ARE 0001 % PRINTED ON THE OUTPUT 000153-P = EOPTION 0001 ERRORTOG, % USED BY THE ERROR ROUTINES TO SUPPRESS 0001 % EXTRA ERROR MESSAGES. SET TO TRUE TO ALLOW 0001 % ERROR MESSAGES. 000154-P = ERRORTOG 0001 EXPANDIT, % WHEN SET TO TRUE WE ARE ABOUT TO EXPAND A 0001 % DEFINE 000155-P = EXPANDIT 0001 EXTENSION, % USED TO DETERMINE IF A FILE NAME HAS AN EXTENSION 000156-P = EXTENSION 0001 EXTERNALCODE, % SET TO TRUE WHEN GENERATING CODE OF AN EXTERNAL 0001 % PROCEDURE. THIS IS SO THAT WE CAN OPTIMIZE IN 0001 % MINIMAL CODE GENERATION AND HANDLE THE EXTERNAL 0001 % SYMBOL TABLE PROPERLY. 000157-P = EXTERNALCODE 0001 EXTERNALTOG, % WHEN SET TO TRUE WE ARE SCANNING AN EXTERNAL 0001 % DECLARATION WHICH IS HANDLED ALMOST 0001 % IDENTICALLY TO A REGULAR DECLARATION. 0001 % EXTERNALS ARE HANDLED SUCH THAT THE SAME 0001 % EXTERNAL DECLARATION IN TWO DISJOINT PROCEDURES 0001 % ARE THE SAME - WE DO THIS BY MOVING ALL 0001 % EXTERNAL DECLARATIONS OUT TO LEVEL 1 AND ENTRY 0001 % TAKES CARE TO SEE THAT A LOCAL EXTERNAL 0001 % VARIABLE IS THE SAME AS OTHER EXTERNALS WITH 0001 % SAME NAME - THIS CHECK ALSO PREVENTS FROM 0001 % ENTERING THE SAME SYMBOL INTO THE SYMBOL TABLE 0001 % TWICE. 000160-P = EXTERNALTOG 0001 FORMOPTION, % PASS FORM FEEDS TO OUTPUT FILE 000161-P = FORMOPTION 0001 FUNCTION, % INDICATES WE ARE PARSING FUNCTION AS OPPOSED 0001 % TO A MAIN PROGRAM 000162-P = FUNCTION PDP-11 ALGOL COMPILER, VERSION 6.6.019 3/5/76 PAGE 11 0001 INCLUDETOG, % IF TRUE READ FROM INCLUDE FILE 000163-P = INCLUDETOG 0001 INSYMTABLE, % IF SET TO TRUE THEN CURRENT DEFINE IS IN THE 0001 % SYMBOLTABLE (STACK) ELSE IN THE DEFINETABLE 0001 % (ELBAT) 000164-P = INSYMTABLE 0001 LASTWASAGOGO, % SET TO TRUE IF LAST STMT SCANNED WAS A GOTO 000165-P = LASTWASAGOGO 0001 LONGTOG, % WHEN SET TO TRUE WE ARE SCANNING A LONG 0001 % DECLARATION. ONLY ONE DIMENSIONAL ARRAYS 0001 % MAY BE DECLARED LONG. IF LONG THEN THEY ARE 0001 % NOT SEGMENTED OTHERWISE THEY ARE SEGMENTED 0001 % IN GROUPS OF 128 WORDS 000166-P = LONGTOG 0001 LOCAL, % IF TRUE MEANS WERE ARE COMPILING DECLARATIONS 0001 % THAT ARE LOCAL TO A PROCEDURE 000167-P = LOCAL 0001 NEWCARD, % IF TRUE THEN WE HAVE A NEW CARD IMAGE IN 'CARD' 000170-P = NEWCARD 0001 NOHEADING, % IF TRUE MEANS THAT THE HEADING HAS NOT BEEN 0001 % WRITTEN YET 000171-P = NOHEADING 0001 NOLISTFILE, % INDICATES THAT THERE IS NO LIST FILE IF 0001 % SET TO TRUE 000172-P = NOLISTFILE 0001 NOCODEFILE, % INDICATES THAT THERE IS NO CODE FILE TO BE 0001 % GENERATED IF SET TO TRUE 000173-P = NOCODEFILE 0001 OMITTOG, % SET TO TRUE TO INHIBIT SOURCE FROM BEING COMPILED 000174-P = OMITTOG 0001 OWNTOG, % WHEN SET TO TRUE WE ARE SCANNING AN OWN 0001 % DECLARATION 000175-P = OWNTOG 0001 PARAMTOG, % IF SET TO TRUE. WE ARE SCANNING PARAMETERS 0001 % IN ACTUALPARAPART 000176-P = PARAMTOG 0001 PRTTOG, % WHEN SET TO TRUE GIVES ALL PRT, SAT AND AIT 0001 % ENTRIES THAT ARE MADE 000177-P = PRTTOG 0001 PTRPRIM, % SET IN VARIABLE PRIOR TO CALL TO PEXP. 0001 % WHEN SET TO TRUE INDICATES THAT WE JUST SCANNED 0001 % A POINTER PRIMARY. ELSE INDICATES THAT WE JUST 0001 % SCANNED A POINTER EXPRESSION. 000200-P = PTRPRIM 0001 QUOTING, % SET TO TRUE IF SCANNING A QUOTED STRING 000201-P = QUOTING 0001 RESERVED, % TRUE IF ID SCANNED IS A RESERVED WORD 0001 % FALSE OTHERWISE 000202-P = RESERVED 0001 SAVETOG, % WHEN SET TO TRUE WE ARE SCANNING A SAVE 0001 % DECLARATION. ARRAYS, STRING, AND PROCEDURES 0001 % CAN BE DECLARED SAVED, 0001 % THUS SPEEDING UP RUNNING 0001 % OF SOME PROGRAMS. ONLY ONE-DIMENSONAL ARRAYS 0001 % MAY BE SAVED, AND SAVED PROCEDURES ARE 0001 % LOCKED INTO CORE BY CODE EMITTED IN 0001 % THE OUTER BLOCK PDP-11 ALGOL COMPILER, VERSION 6.6.019 3/5/76 PAGE 12 000203-P = SAVETOG 0001 STOPDEFINE, % WHEN SET TO TRUE STOPS THE EXPANSION OF 0001 % DEFINES 000204-P = STOPDEFINE 0001 STARTDEFINE, % WHEN SET TO TRUE INDICATES THAT WE ARE ABOUT 0001 % TO START EXPANDING A DEFINE 000205-P = STARTDEFINE 0001 SWITCHDECTOG, % SET TO TRUE WHEN IN SWITCHDEC, FALSE OTHERWISE 000206-P = SWITCHDECTOG 0001 TOBEWRITTEN, % SET TO TRUE WHEN WE ARE TO WRITE OUT THE NEXT 0001 % CARD 000207-P = TOBEWRITTEN 0001 UIC, % USED TO DETERMINE IF A FILE HAS A UICOR SIZE OPTION 000210-P = UIC 0001 WRITEAFORM; % USED TO PRINT FORMS FROM INPUT IN NICE PLACES 0001 % ON OUTPUT. 000211-P = WRITEAFORM PDP-11 ALGOL COMPILER, VERSION 6.6.019 3/5/76 PAGE 13 0001 INTEGER ARRAY 0001 A[0:32], % HOLDS THE LAST SCANNED IDENTIFIER IN SYMBOL 000213-P = A 0010 % TABLE FORMAT - THIS IS USED TO SPEED UP 0010 % SYMBOL TABLE SEARCHES 0010 ADRSR[0:63], % HOLDS THE RETURN ADDRESS FOR BLOCK EXITS 000220-P = ADRSR 0017 % SUCH THAT A NON-LOCAL BRANCH FROM BLOCK 0017 % TO ANOTHER WILL WORK 0017 ATTRIBUTEDHASH[0:110], % THIS HASH TABLE HOLDS THE CLASS 3,F 000225-P = ATTRIBUTEDHASH 0026 % RESERVED WORDS OF ALGOL 0026 CARD[0:36], % THIS IS THE STRING USED BY THE SCANNER. 000232-P = CARD 0035 % THE INPUT MECHANISM UNPACKS AND PUTS ONE 0035 % LINE AT A TIME IN THIS STRING 0035 CARDEF[0:MAXDEFINELEVEL,0:51], % HOLDS CARD IMAGES 000237-P = CARDEF 0046 % & PERTINATE INFO AS WE SCAN DEFINES 0046 CONST[0:2047], % THIS ARRAY HOLDS ALL CONSTANTS EXCEPT THOSE A 000244-P = CONST 0055 % LITERAL CALL CAN HANDLE. THE FIRST WORD 0055 % ENTRY IS THE LOCATION OF THE CALL, THE SECOND 0055 % WORD IS THE NUMBER OF CONSTANTS ENTERED, 0055 % FOLLOWED BY THE CONSTANTS. 0055 CSI[0:99], % USED BY COMPILER FOR COMMAND STRING INTERPERATER 000251-P = CSI 0064 DATE[0:3], % HOLDS TODAYS DATE IN MM/DD/YR FORM 000256-P = DATE 0073 EDOC[0:2047], % CODE IS EMITTED INTO THIS ARRAY BY THE 000263-P = EDOC 0102 % EMIT ROUTINES 0102 ELBAT[0:STACKSIZE],% HOLDS PARAMETERS OF DEFINES DURING EXPANSION 000270-P = ELBAT 0111 ESTACK[0:1000], % THE EXTERNAL SYMBOL TABLE - NOTE THAT 000275-P = ESTACK 0120 % THIS WON'T GET ALLOCATED UNTIL IT IS USED 0120 HEADING[0:21], % HOLDS THE COMPILERS HEADING 000302-P = HEADING 0127 INSTR[0:31], % EVERY ITEM SCANNED, I.E. SPECIAL CHARACTER, 000307-P = INSTR 0136 % NUMBER,OR IDENTIFIER IS PLACED IN THIS STRING 0136 % LEFT-JUSTIFIED WITH THE VALUE OF LINSTR SET 0136 % TO THE NUMBER OF ITEMS MOVED INTO INSTR. 0136 LEVELS[0:31], % PRT ADDRESS OF EACH LEVEL AS USED FOR 000314-P = LEVELS 0145 % NESTED LEVELS & MARK-STACK CONTROL WORDS 0145 LINEOUT[0:41], % OUTPUT STRING FOR THE LINE PRINTER 000321-P = LINEOUT 0154 OP[0:131], % THIS STRING IS FILLED WITH THE MNEMONIC OP 000326-P = OP 0163 % CODES DURING DEBUGGING 0163 PERMDEC[0:7], % USED IN EVALUATING MEMBERSHIP EXPRESSIONS 000333-P = PERMDEC 0172 % BY MEMBERSHIPEXP,MEMBERSHIPPRIMARY, & TRUTHSETDEC 0172 PRTA[0:8191]; % THIS ARRAY IS FILLED WITH ALL DESCRIPTORS 000340-P = PRTA PDP-11 ALGOL COMPILER, VERSION 6.6.019 3/5/76 PAGE 14 0201 % POINTING TO ARRAYS AND PROGRAM SEGMENTS 0201 % SPACE IS ALSO RESERVED FOR GLOBAL VARIABLES 0201 SAVE INTEGER ARRAY 0201 SAUSAGE[0:63], % THIS ARRAY IS THE HASH TABLE FOR THE 000345-P = SAUSAGE 0213 % RESERVED WORDS TO HELP SPEED UP THE 0213 % SYMBOL TABLE LOOKUP SCHEME 0213 SCRAMBLEDEGGS[0:63],% THIS ARRAY IS THE HASH TABLE TO POINT INTO 000352-P = SCRAMBLEDEGGS 0225 % THE STACK ARRAY. 0225 SPECIAL[0:36]; % THIS ARRAY IS USED TO HOLD THE CLASS 000357-P = SPECIAL 0237 % NUMBER OF ALL THE SPECIAL CHARATERS 0237 INTEGER ARRAY 0237 SPACEOUT[0:32], % USED BY GETSPACE FOR OUTPUTTING PRT INFO. 000364-P = SPACEOUT 0246 STACK[0:STACKSIZE],% THIS ARRAY CONTAINS LINK LISTS WHICH MAKE 000371-P = STACK 0255 % UP THE COMPILIER,S SYMBOL TABLE USING HASHING. 0255 STR[0:39]; % USED BY ERROR TO CONTAIN ERROR MESSAGE 000376-P = STR 0264 % READ IN FROM DISK TO PRINTED ON 0264 % OUTPUT LISTING. 0264 LABEL EOJ; PDP-11 ALGOL COMPILER, VERSION 6.6.019 3/5/76 PAGE 15 0264 % 0264 % 0264 % THE DEFINES GIVE THE NAMES OF THE WORD MODE OPERATORS 0264 % USED IN THE INTERPRETER. 0264 % 0264 DEFINE 0264 CONSTANTCLEAN=IF CLEAN NEQ 0 THEN CLEANIT#, 0264 SEGSIZE=3"1777"#, 0264 LOCALSPACE=3"30001"#, 0264 BUMPL =L:=L+3#, 0264 JUNK=6#, 0264 FP =0#, 0264 FS =1#, 0264 O3(X) = X FOR 3 OCTAL DIGITS#, 0264 O4(X) = X FOR 4 OCTAL DIGITS#, 0264 O6(X) = X FOR 6 OCTAL DIGITS#, 0264 ZS(X,Y) = X FOR Y ZEROSUPPRESSED DIGITS#, 0264 0264 % 0264 % THESE DEFINES ARE THE MNEMONICS FOR THE INTERPRETER OPERATORS. 0264 % 0264 0264 ADD =0#, % ADD 0264 AOC =1#, % ARRAY OPERAND CALL 0264 ASD =2#, % ARRAY STORE DESTRUCTIVE 0264 ASN =3#, % ARRAY STORE NON-DESTRUCTIVE 0264 BRUN=4#, % BRANCH UNCONDITIONAL 0264 BRTR=5#, % BRANCH TRUE 0264 BRFL=6#, % BRANCH FALSE 0264 ENTR=7#, % ENTER 0264 CHS =8#, % CHANGE SIGN 0264 COM =9#, % COMMUNICATE 0264 DEL =10#, % DELETE TOP OF STACK 0264 DIVR=11#, % DIVIDE 0264 DUP =12#, % DUPLICATE 0264 NE =13#, % B NOT EQL TO A 0264 EQ =14#, % B EQUAL TO A 0264 GE =15#, % B GREATER THAN OR EQUAL TO A 0264 LS =16#, % B LESS THAN A 0264 GT =17#, % B GREATER THEN A 0264 LE =18#, % B LESS THAN OR EQUAL TO A 0264 LOD =19#, % LOAD 0264 LOR =20#, % LOGICAL OR 0264 LND =21#, % LOGICAL AND 0264 MKS =22#, % MARK THE STACK 0264 REP =23#, % MOVE 0264 MUL =24#, % MULTIPLY 0264 LNG =25#, % LOGICAL NEGATE 0264 REL =26#, % RELEASE 0264 RTN =27#, % RETURN FROM SUBROUTINE 0264 SAV =28#, % SAVE 0264 SBR =29#, % SUBROUTINE CALL 0264 SHLL=30#, % SHIFT LEFT 0264 SHRR=31#, % SHIFT RIGHT 0264 STD =32#, % STORE DESTRUCTIVE 0264 STN =33#, % STORE NON-DESTRUCTIVE 0264 SUB =34#, % SUBTRACT PDP-11 ALGOL COMPILER, VERSION 6.6.019 3/5/76 PAGE 16 0264 XCH =35#, % EXCHANGE A AND B 0264 SCN =36#, % MOVE CHARACTER 0264 MD =37#, % MOD A AND B 0264 ADC =38#, % ARRAY DESCRIPTOR CALL 0264 % FDI =39#, % FIELD ISOLATE 0264 BPS =40#, % BUMP STACK POINTER 0264 SWP =41#, % SWAP TWO ARRAYS 0264 EXP =42#, % EXPONENT-INTEGERS ONLY 0264 FID =43#, % FIELD ISOLATE DYNAMIC 0264 RSDN=44#, % ROTATE STACK DOWN (IE TOS DOWN TO 4(SP)) 0264 RSUP=45#, % ROTATE STACK UP (IE 4(SP) UP TO TOS) 0264 INOP=46#, % IN OPERATOR TESTS FOR IN-NESS OF TRUTHSET 0264 OCX =47#, % OCCURS INDEX (FOR CASE INDEXING) 0264 LODB=48#, % LOAD BYTE OPERATOR TO BE IMPLEMENTED 0264 % WITH POINTERS 0264 DIVT=49#, % DIVISION YIELDING INTEGER RESULT VIA TRUNCATION 0264 FISO=50#, % FIELD INSERT 0264 FISD=51#, % FIELD INSERT DYNAMIC 0264 FIND=52#, % FIND ADDRESS NOT ON SAME LEVEL OR IN PRT 0264 ONESS=53#, % ONES OPERATOR, RETURNS THE # OF BITS THAT 0264 % ARE ON 0264 FONES=54#, % RETURNS THE LEFT MOST BIT # OF BIT THAT IS ON 0264 B1D =55#, % BUILD 1 DIMENSIONAL ARRAY DESCRIPTOR 0264 B2D =56#, % BUILD 2 DIMENSIONAL ARRAY DESCRIPTOR 0264 DPL =57#, % DUPLICATE ARRAY ON TOS & LOAD 0264 BLD =58#, % BUILD ARRAY DESCRIPTOR 0264 PLOD=59#, % POINTER LOAD VALUE 0264 PART=60#, % OBTAIN PARTIAL WORD PART 0264 PSTN=61#, % POINTER STORE NON-DESTRUCT 0264 PSTD=62#, % POINTER STORE DESTRUCT 0264 CMP= 63#, % POINTER COMPARE 0264 PLNK=64#, % POINTER LINK PDP-11 ALGOL COMPILER, VERSION 6.6.019 3/5/76 PAGE 17 0264 % 0264 % THESE DEFINES ARE THE SCANNER'S TOKEN CLASSES. 0264 % 0264 0264 % UNKNOWNID = 0#, 0264 PROCID = 1#, 0264 BOOPROCID = 2#, 0264 % REALPROCID = 3#, 0264 INTPROCID = 4#, 0264 BOOID = 5#, 0264 REALID = 6#, 0264 INTID = 7#, 0264 ARRAYID = 8#, 0264 % 9 0264 STRINGID =10#, 0264 ICONSTANT =11#, 0264 % RCONSTANT =12#, 0264 QUOTEOP =13#, 0264 ATSIGN =14#, 0264 TRUTH =15#, 0264 FALSEV =16#, 0264 LFTPAREN =17#, 0264 ENDV =18#, 0264 SEMICOLON =19#, 0264 ELSEV =20#, 0264 UNTILV =21#, 0264 BEGINV =22#, 0264 BOOLEANV =23#, 0264 REALV =24#, 0264 INTEGERV =25#, 0264 OWNV =26#, 0264 LONGV =26#, 0264 SAVEV =26#, 0264 EXTERNALV =26#, 0264 LABELV =27#, 0264 SWITCHV =28#, 0264 ARRAYV =29#, 0264 DEFINEV =30#, 0264 FILEV =31#, 0264 PROCEDUREV =32#, 0264 POINTERV =33#, 0264 TRUTHSETV =34#, 0264 READV =35#, 0264 WRITEV =36#, 0264 FORV =37#, 0264 WHILEV =38#, 0264 DOV =39#, 0264 IFV =40#, 0264 GOV =41#, 0264 FILLV =42#, 0264 CASEV =43#, 0264 REPLACEV =44#, 0264 SCANV =45#, 0264 THRUV =46#, 0264 LABELID =47#, 0264 % 48 0264 INV =49#, PDP-11 ALGOL COMPILER, VERSION 6.6.019 3/5/76 PAGE 18 0264 OUTV =50#, 0264 IOV =51#, 0264 MODV =52#, 0264 DIVV =53#, 0264 % 54 0264 STEPV =55#, 0264 TOV =56#, 0264 THENV =57#, 0264 ANDV =58#, 0264 ORV =59#, 0264 NOTV =60#, 0264 FACTOP =61#, 0264 NEQOP =62#, 0264 EQLOP =63#, 0264 GEQOP =64#, 0264 LSSOP =65#, 0264 GTROP =66#, 0264 LEQOP =67#, 0264 LFTBRKT =68#, 0264 RTBRKT =69#, 0264 COMMA =70#, 0264 COLON =71#, 0264 ADDOP =72#, 0264 SUBOP =73#, 0264 MULOP =74#, 0264 DIVOP =75#, 0264 AMPER =76#, 0264 POUND =77#, 0264 % 78 0264 MAXSIZEV =79#, 0264 DEFINEID =80#, 0264 FORWARDV =81#, 0264 WITHV =82#, 0264 DOTOP =83#, 0264 ASSIGNOP =84#, 0264 RTPAREN =85#, 0264 VALUEV =86#, 0264 COMMENTV =87#, 0264 SWITCHID =88#, 0264 FILEID =89#, 0264 FIELDV =90#, 0264 FIELDID =91#, 0264 BOOFIELDID =92#, 0264 EXPOP =93#, 0264 ATPOUNDV =95#, 0264 FORMATV =96#, % SHOULD BE MOVED UP TO AFTER TRUTHSETV AFTER 0264 LISTV =97#, % IMPLEMENTATION. DECLARATION & STMT SHOULD BE CHANGED APP 0264 OFV =98#, 0264 TRUTHID =99#, 0264 BINV =100#, 0264 DISKV =101#, 0264 TTYV =102#, 0264 TEKTV =103#, 0264 LPV =104#, 0264 KINDV =105#, 0264 TITLEV =106#, 0264 OPENV =107#, PDP-11 ALGOL COMPILER, VERSION 6.6.019 3/5/76 PAGE 19 0264 PRESENTV =108#, 0264 PURGEV =109#, 0264 MYUSEV =110#, 0264 SIZEV =111#, 0264 MAXRECV =112#, 0264 CURRECV =113#, 0264 0264 % THESE THAT FOLLOW ARE THE RE-DEFINE-ABLE RESERVED WORDS 0264 POLISHV =114#, 0264 SIGNV =115#, 0264 ONESV =116#, 0264 TIMEV =117#, 0264 DELTAV =118#, 0264 SHLV =119#, 0264 SHRV =120#, 0264 SHIFTV =121#, 0264 ABSV =122#, 0264 MAXV =123#, 0264 MINV =124#, 0264 ADDRV =125#, 0264 FONEV =126#, 0264 COMPILTIMEV =127#, 0264 LOCKV =128#, 0264 RELEASEV =129#, 0264 SWAPV =130#, 0264 CHAINV =131#, 0264 CLOSEV =132#, 0264 BYV =133#, 0264 BINARYV =134#, 0264 OCTALV =135#, 0264 HEXV =136#, 0264 DECIMALV =137#, 0264 WORDV =138#, 0264 WORDSV =139#, 0264 DIGITV =140#, 0264 DIGITSV =141#, 0264 % 142 0264 % 143 0264 ZEROSUPV =144#, 0264 REDEFINABLE =114#, 0264 CLASSMAX =145#; PDP-11 ALGOL COMPILER, VERSION 6.6.019 3/5/76 PAGE 20 0264 POINTER IFP, % INPUT FILE NAME POINTER. 000402-P = IFP 0267 P, % USED TO POINT INTO THE CARD ARRAY 000405-P = P 0272 PS:=SPACEOUT, % USED TO PASS SYMBOL NAMES TO GETSPACE. 000410-P = PS 0301 Q; % TEMPORARY POINTER. POINTS INTO CSI. 0301 % 0301 % 000413-P = Q 0304 TRUTHSET 0304 OPS(FACTOP OR DIVOP OR MULOP OR DIVV OR MODV), % FOR TERM 000416-P = OPS 0304 REDEFINABLES(WRITEV OR READV OR PURGEV OR HEXV OR OCTALV OR 000426-P = REDEFINABLES 0304 TOV OR ANDV OR ORV OR NOTV OR EQLOP OR NEQOP OR 0304 LSSOP OR LEQOP OR GEQOP OR GTROP OR DECIMALV OR 0304 INV OR BYV OR FILLV OR WITHV OR CASEV OR DIVV OR 0304 CLOSEV OR OFV OR LOCKV OR THRUV OR REPLACEV OR 0304 RELEASEV OR SHLV OR SHRV OR TIMEV OR SCANV OR 0304 SIZEV OR MAXV OR MODV OR MINV OR SHIFTV OR ABSV OR 0304 ADDRV OR DELTAV OR POLISHV OR SIGNV OR CHAINV OR 0304 ONESV OR FONEV OR SWAPV OR WORDV OR WORDSV OR 0304 DIGITV OR DIGITSV OR BINARYV OR ZEROSUPV OR 0304 COMPILTIMEV), 0304 SPACES(" " OR " "), % TABS OR SPACES TO BE IGNORED 000436-P = SPACES 0304 TERMINATORS("%" OR 0); % NULLS OR "%" TERMINATE A CARD 000446-P = TERMINATORS 0304 % 0304 % *********** F I L E D E C L A R A T I O N S *********** 0304 % 0304 FILE CARDIN(KIND=DISK,MAXRECSIZE=40), 000456-P = CARDIN 0305 CODE(KIND=BINARY,MAXRECSIZE=256,MYUSE=OUT), 000463-P = CODE 0317 LINE(MYUSE=OUT), 000470-P = LINE 0331 INCLUDE(KIND=DISK,MAXRECSIZE=40), 000475-P = INCLUDE 0343 ERRORF(KIND=BINARY,MAXRECSIZE=36,TITLE="ALGOL.ERR[001,002]"), 000502-P = ERRORF 0366 TTY(KIND=TTY,MAXRECSIZE=40); % USED TO READ IN THE COMMAND STRING 000507-P = TTY 0367 % 0367 % F O R W A R D D E C L A R A T I O N S 0367 % 0367 PROCEDURE CASEORIF(X);INTEGER X; FORWARD; 000514-P = CASEORIF 0400 PROCEDURE AEXP; FORWARD; 000520-P = AEXP 0400 PROCEDURE BEXP; FORWARD; 000524-P = BEXP 0400 PROCEDURE PEXP; FORWARD; 000530-P = PEXP 0400 PROCEDURE TERM(B); VALUE B; BOOLEAN B; FORWARD; 000534-P = TERM PDP-11 ALGOL COMPILER, VERSION 6.6.019 3/5/76 PAGE 21 0400 PROCEDURE ARITHSEC; FORWARD; 000540-P = ARITHSEC 0400 PROCEDURE PRIMARY; FORWARD; 000544-P = PRIMARY 0400 INTEGER PROCEDURE BOOSEC; FORWARD; 000550-P = BOOSEC 0400 INTEGER PROCEDURE BOOPRIM; FORWARD; 000554-P = BOOPRIM 0400 PROCEDURE BOOPTRPRIM(B); VALUE B; BOOLEAN B; FORWARD; 000560-P = BOOPTRPRIM 0400 PROCEDURE MEMBERSHIPEXP; FORWARD; 000564-P = MEMBERSHIPEXP 0400 PROCEDURE BLOK(FROM); VALUE FROM; INTEGER FROM; FORWARD; 000570-P = BLOK 0400 PROCEDURE DECLARATION; FORWARD; 000574-P = DECLARATION 0400 PROCEDURE ERROR(X); VALUE X; INTEGER X; FORWARD; 000600-P = ERROR 0400 INTEGER PROCEDURE EXPRESS; FORWARD; 000604-P = EXPRESS 0400 PROCEDURE FLAG(X); VALUE X; INTEGER X; FORWARD; 000610-P = FLAG 0400 PROCEDURE MOVECODE; FORWARD; 000614-P = MOVECODE 0400 PROCEDURE GOSTMT; FORWARD; 000620-P = GOSTMT 0400 PROCEDURE WRITESTMT; FORWARD; 000624-P = WRITESTMT 0400 PROCEDURE SKIPSPACES; FORWARD; 000630-P = SKIPSPACES 0400 INTEGER PROCEDURE NEXTCHAR; FORWARD; 000634-P = NEXTCHAR 0400 PROCEDURE STMT; FORWARD; 000640-P = STMT 0400 BOOLEAN PROCEDURE FILENAMESCAN(A); ARRAY A[0]; FORWARD; 000644-P = FILENAMESCAN PDP-11 ALGOL COMPILER, VERSION 6.6.019 3/5/76 PAGE 22 0400 % 0400 % RELATIVE ADDRESSING SCHEME: 0400 % 0400 % DECIMAL OCTAL WHERE 0400 % ----------- ----------- ----- 0400 % 0- 8191 00000-17777 PRT 0400 % 8192-12287 20000-27777 IPC 0400 % 12288-14335 30000-33777 F+ 0400 % 14336-16383 34000-37777 F- 0400 % 0400 SAVE PROCEDURE WRITEALINE(X); 000650-P = WRITEALINE 0400 VALUE X; 0400 INTEGER X; 0400 BEGIN 0400 2 INTEGER I; WRITEALINE IS SEGMENT 002 ******** 030005-S = I 0002 LABEL EXIT; 0002 IF EOPTION OR NOLISTFILE 0005 THEN GO EXIT; 0013 IF NOT LNCT = 100 0015 THEN WRITE(LINE,X,LINEOUT); 0033 IF LNCT:=LNCT + 1 GTR 56 0041 THEN BEGIN 0044 3 LINEOUT[0]:=3"14"; 0050 WRITE(LINE[0],1,LINEOUT); 0062 REPLACE LINEOUT BY HEADING FOR 38," " FOR 20, DATE FOR 8, 0103 " " FOR 8-(I:=REAL(PGCT:=*+1 GTR 9)+REAL(PGCT GTR 99)), 0126 "PAGE",ZS(PGCT,I+2); 0142 WRITE(LINE,40,LINEOUT); 0155 WRITE(LINE[1],LNCT:=REAL(WRITEAFORM:=FALSE),LINEOUT) 0167 END; 0173 3 EXIT: END; WRITEALINE(002) IS 0206 LONG, NEXT SEGMENT 001 ******** PDP-11 ALGOL COMPILER, VERSION 6.6.019 3/5/76 PAGE 23 0465 2 PROCEDURE CODETHEDAY(DA,MO,YR,HR,MN,P,O); 000654-P = CODETHEDAY 0465 VALUE DA,MO,YR,HR,MN,O; 0465 INTEGER DA,MO,YR,HR,MN,O; 0465 POINTER P; 0465 BEGIN 0465 2 INTEGER I:=YR-1900,J:=MO-2,DAY; CODETHEDAY IS SEGMENT 003 ******** 030005-S = I 030006-S = J 030007-S = DAY 0010 BOOLEAN PM:=HR GTR 12; 030010-S = PM 0013 POINTER PX; 030013-S = PX 0021 ARRAY X[0:20]; 030017-S = X 0032 IF MO LSS 3 0036 THEN BEGIN 0041 3 J:=MO+10; 0046 I:=*-1 0050 END; 0053 3 HR:=*+12*(REAL(HR EQL 0) - REAL(PM)); 0066 DAY:=((J*26-2) DIV 10 + DA + I + I DIV 4) MOD 7; 0111 REPLACE P BY " " FOR 42; 0124 REPLACE PX:X BY CASE DAY OF ( 0133 "MON","TUES","WEDNES","THURS","FRI","SATUR","SUN"), 0225 "DAY ",CASE MO-1 OF("JANURARY","FEBRUARY", 0264 "MARCH","APRIL","MAY","JUNE","JULY","AUGUST", 0333 "SEPTEMBER","OCTOBER","NOVEMBER","DECEMBER"), 0413 ZS(DA,2-REAL(DA LSS 10)),",",ZS(YR,5)," AT", 0443 ZS(HR,2+REAL(HR GEQ 10)),":",MN FOR 2 DIGITS, 0466 IF PM THEN " P" ELSE " A","M."; 0524 REPLACE P+((I:=(80-O-DELTA(X,PX))/2)+O) BY X FOR 42; 0563 P:=*+I 0567 END OF CODE-THE-DAY; 0575 2 CODETHEDAY(003) IS 0603 LONG, NEXT SEGMENT 001 ******** 0465 PROCEDURE DAYTIME; 000660-P = DAYTIME 0465 BEGIN 0465 2 INTEGER DA,MO,YR; DAYTIME IS SEGMENT 004 ******** 030005-S = DA 030006-S = MO 030007-S = YR 0003 POINTER P; 030012-S = P 0011 REPLACE P:=LINEOUT BY " " FOR 21, 0024 "PDP-11 ALGOL COMPILER, VERSION ",REVNO FOR 1, 0036 ".",SHR(REVNO,8) FOR 1,"." UPDATE " "; 0063 REPLACE HEADING BY LINEOUT+21 FOR 38; 0072 WRITEALINE(REAL(BOOLEAN(30))); 0076 CODETHEDAY(DA:=TIME(3),MO:=TIME(4),YR:=TIME(5), 0116 TIME(2),TIME(1),P,0); 0130 WRITEALINE(0); 0134 WRITEALINE(40); PDP-11 ALGOL COMPILER, VERSION 6.6.019 3/5/76 PAGE 24 0140 WRITEALINE(LNCT:=0); 0146 REPLACE DATE BY ZS(MO,2),"/",ZS(DA,1+REAL(DA GTR 9)),"/", 0200 YR FOR 2 DIGITS," " FOR REAL(DA LEQ 9); 0214 P:=LINEOUT; 0220 CODETHEDAY(COMPILETIME(3),COMPILETIME(4),COMPILETIME(5), 0224 COMPILETIME(2),COMPILETIME(1),P,18); 0232 REPLACE P BY "COMPILER COMPILED"; 0241 WRITEALINE(40); 0245 WRITEALINE(0); 0251 WRITEALINE(REAL(NOHEADING:=FALSE)) 0255 END OF DAYTIME; DAYTIME(004) IS 0340 LONG, NEXT SEGMENT 001 ******** PDP-11 ALGOL COMPILER, VERSION 6.6.019 3/5/76 PAGE 25 0465 2 PROCEDURE SETTOGGLES; 000664-P = SETTOGGLES 0465 BEGIN 0465 2 INTEGER T; SETTOGGLES IS SEGMENT 005 ******** 030005-S = T 0002 IF T:=REAL(P+1,1) EQL "O" 0015 THEN OMITTOG:=NOT OMITTOG % TOG THE OMITTER TOG 0020 ELSE 0024 IF T = "P" 0030 THEN PRTTOG:=?PRTTOG % TOG PRT LISTING (STACK LISTING) 0033 ELSE 0037 IF T = "D" 0043 THEN DEBUGTOG:=?DEBUGTOG % TOG THE CODE LISTING 0046 ELSE 0052 IF T = "I" % INCLUDE OPTION 0056 THEN BEGIN 0061 3 IF NOT INCLUDETOG % IN INCLUDE MODE? 0061 THEN BEGIN 0064 4 INCLUDETOG:=TRUE; 0067 REPLACE INCLUDE.TITLE BY P+2 0073 END 0107 4 ELSE FLAG(120) 0113 END 0115 3 ELSE 0115 IF T = "F" AND LNCT NEQ 0 % FORM OPTION (PAGE) 0124 THEN BEGIN % REPLY ONLY IF NOT BLANK PAGE 0130 3 LNCT:=100; 0133 WRITEALINE(1) % WRITE IT OUT 0135 END 0137 3 ELSE 0137 IF T = "E" % ERROR ONLY (LIST) 0143 THEN 0146 IF ?EOPTION:=? EOPTION % IF TURNING ON THE LISTING 0146 THEN 0154 IF NOHEADING % THEN IF THIS IS THE 1ST TIME THAT 0154 THEN DAYTIME % LIST WAS ON THEN PRINT HEADING 0160 ELSE 0162 ELSE 0162 ELSE 0162 IF T EQL "C" % CHAIN OPTION ! 0166 THEN 0171 IF INCLUDETOG 0171 THEN BEGIN 0174 3 INCLUDE.OPEN:=FALSE; 0202 REPLACE INCLUDE.TITLE BY P+2 0206 END 0222 3 ELSE BEGIN 0224 3 CARDIN.OPEN:=FALSE; 0232 REPLACE CARDIN.TITLE BY P+2 0236 END 0252 3 END OF CONTROL CARDS; SETTOGGLES(005) IS 0253 LONG, NEXT SEGMENT 001 ******** PDP-11 ALGOL COMPILER, VERSION 6.6.019 3/5/76 PAGE 26 0465 2 SAVE PROCEDURE WRITECARD; 000670-P = WRITECARD 0465 BEGIN 0465 2 INTEGER I,J,K,X; WRITECARD IS SEGMENT 006 ******** 030005-S = I 030006-S = J 030007-S = K 030010-S = X 0003 OWN INTEGER PBC; 000674-P = PBC 0003 POINTER Q; 030013-S = Q 0011 IF WRITEAFORM 0013 THEN BEGIN 0016 3 WRITEAFORM:=BOOLEAN(LNCT:=100); 0023 WRITEALINE(1) 0025 END; 0027 3 IF OMITTOG 0027 THEN REPLACE Q:LINEOUT BY "OMIT" 0035 ELSE REPLACE Q:LINEOUT BY O4(L); 0054 IF PBC EQL BEGINCTR 0055 THEN REPLACE Q:Q BY " " 0064 ELSE REPLACE Q:Q BY ZS(MAX(PBC,PBC:=BEGINCTR),2); 0116 IF ERRORCOUNT EQL 0 0120 THEN REPLACE Q:Q BY " " 0126 ELSE REPLACE Q:Q BY ZS(ERRORCOUNT,2); 0145 REPLACE Q BY POINTER(CARD) FOR 72; 0154 IF EIGHTYCOL % SHORT FORM? 0154 THEN BEGIN % YES 0157 3 DEFINE SEGMENTIT=#; 000675-P = MARKSTACK DESCRIPTOR FOR LEVEL 2 000676-P = B.0001 B.0001 IS SEGMENT 007 ******** 0000 K:=-1; 0006 DO BEGIN 0006 4 IF X:=REAL(POINTER(LINEOUT)+K:=*+1,1) EQL 3"11" 0021 THEN I:=I DIV 8 * 8 + 8 0032 ELSE I:=*+1; 0044 J:=*+1 0046 END 0051 4 UNTIL I GEQ 80 OR X EQL 0 0056 END 0062 3 ELSE J:=132; % FOR LONG PRINTERS B.0001(007) IS 0073 LONG, NEXT SEGMENT 006 ******** 0211 WRITEALINE(J DIV 2); 0217 TOBEWRITTEN:=FALSE 0220 END OF WRITTING THE CARDS OUT; PDP-11 ALGOL COMPILER, VERSION 6.6.019 3/5/76 PAGE 27 OMIT 2 @O OMIT % D E F I N E E X P A N S I O N OMIT % =========== ================= OMIT % OMIT % 'DEFLEVEL' IS AN INDICATOR AS TO WHETHER OR NOT WE ARE OMIT % EXPANDING DEFINES. IT IS THE LEVEL OF DEFINE NESTING. IF IT OMIT % IS ZERO, THEN THERE ISN'T A DEFINE TO EXPAND AND THE NEXT OMIT % CARD IMAGE COMES FROM THE PRIMARY OR SECONDARY INPUT FILE. OMIT % OTHERWISE THERE IS A DEFINE TO EXPAND AND THE FOLLOWING OMIT % GLOBALS CONTAIN THE FOLLOWING INFORMATION : OMIT % OMIT % 'AMTLEFT' - IF THIS IS ZERO, THEN WE ARE FINISHED EXPANDING OMIT % THE DEFINE WE PREVIOUSLY WERE EXPANDING AND IT IS TIME OMIT % TO UNNEST THE DEFINES 1 LEVEL. OMIT % IF THIS IS POSITIVE, IT INDICATES THE # OF OMIT % CHARACTERS LEFT TO EXPAND. DEFINES ARE EXPANDED IN GROUPS OMIT % OF 72 CHARACTERS. OMIT % IF THIS IS NEGATIVE THEN WE ARE TO EXPAND THE OMIT % DEFINE FOR THE FIRST TIME. OMIT % OMIT % EXPANDIT' - IF ZERO THEN THE DEFINE IS A DECLARED DEFINE AND OMIT % THE DEFINED TEXT IS FOUND IN THE SYMBOL TABLE ('STACK'). OMIT % IF THIS VALUE IS ONE (1) THEN THE DEFINE IS OMIT % A PARAMETER TO A DEFINE AND THE DEFINED TEXT IS FOUND OMIT % IN THE 'ELBAT' ARRAY. OMIT % OMIT % 'DEFINDEX' - POINTS TO WORD BEFORE NEXT WORD OF TEXT TO BE OMIT % EXPANDED. INDEX INTO 'STACK' OR 'ELBAT' DEPENDING UPON OMIT % 'EXPANDIT'. OMIT % OMIT % OMIT % DEFINES ARE NESTED OR STACKED VIA AN ARRAY CALLED 'CARDEF'. OMIT % THE STACKING MECHINISM IS INSIDE OF GETNEXT AT THE POINT OF OMIT % INVOCATION OF THE DEFINE. THAT ROUTINE ALSO BUMPS 'DEFLEVEL'. OMIT % HENCE THE REASON FOR THE TEST OF 'DEFLEVEL' GREATER THAN ZERO. OMIT % EACH LEVEL OF EXPANSION HAS AN ARRAY ROW OF 'CARDEF' ASSOCIATED OMIT % WITH IT. WHEN LEVEL UNEXPANDS TO , OMIT % THE ROW 'CARDEF[DEFLEVEL,*]' CONTAINS THE FOLLOWING INFORMATION : OMIT % OMIT % 0-35 CARD IMAGE INTERRUPTED FROM. OMIT % 36 BYTE INDEX INTO CARD IMAGE (AFTER DEFINE) OMIT % 37 NOT USED ! OMIT % OMIT % IF 'DEFLEVEL' NEQ ZERO THEN THE FOLLOWING APPLIES : OMIT % OMIT % 38 'DEFINDEX' TO PREVIOUS DEFINE OMIT % 39 'AMTLEFT' TO PREVIOUS DEFINE OMIT % 40 'EXPANDIT' TO PREVIOUS DEFINE OMIT % 41-50 WHERE, IN 'ELBAT', TEXT FOR PARAMETERS OF THIS OMIT % DEFINE ARE STORED. OMIT % 41 POINTS TO PARAMETER 0, 50 TO PARAMETER 9. 0222 @O WRITECARD(006) IS 0223 LONG, NEXT SEGMENT 001 ******** PDP-11 ALGOL COMPILER, VERSION 6.6.019 3/5/76 PAGE 28 0467 SAVE PROCEDURE READCARD; 000702-P = READCARD 0467 BEGIN 0467 2 INTEGER I,N,P1; READCARD IS SEGMENT 010 ******** 030005-S = I 030006-S = N 030007-S = P1 0003 OWN INTEGER PREVBEGINCTR,EOF; 000706-P = PREVBEGINCTR 000707-P = EOF 0003 LABEL L1,EXIT; 0003 IF DEFLEVEL EQL 0 % GET NEXT CARD IMAGE 0007 THEN BEGIN % THIS COMMENT FAKES OUT THE SCANNER. 0012 3 L1: IF INCLUDETOG % READ FROM INCLUDE FILE 0012 THEN 0015 IF READ(INCLUDE,20,CARD) 0024 THEN BEGIN 0033 4 INCLUDE.OPEN:=INCLUDETOG:=FALSE; 0043 GO L1 0045 END 0045 4 ELSE 0045 ELSE 0045 IF READ(CARDIN,30,CARD) % CHECK FOR EOF 0056 THEN BEGIN 0065 4 LABEL L3; % FORCE NEW SEGMENT. 000710-P = B.0002 B.0002 IS SEGMENT 011 ******** 0000 ARRAY A[0:10]; % FOR FILE NAME; 030015-S = A 0011 IF IFP EQL "," % SEE IF ANOTHER FILE. 0015 THEN BEGIN % YEP. 0023 5 IFP:=*+1; % SKIP THE "," 0030 CLOSE(CARDIN); 0036 FILENAMESCAN(A);% SCAN THE FILE NAME. 0051 L3: REPLACE Q BY ".SRC" FOR 4*(1-REAL(EXTENSION)), 0064 A UNTIL EQL 0, 0 FOR 1; 0102 REPLACE CARDIN.TITLE BY STR; 0120 IF NOT CARDIN.PRESENT % IS FILE HERE? 0120 THEN BEGIN 0126 6 EXTENSION:=TRUE; % OTHER FILE SHOULD BE. 0131 GO L3 0142 END; 0142 6 GO L1 % TRY AGAIN 0156 END 0156 5 ELSE 0156 IF CARD[1]:=EOF+1 EQL 2 0171 THEN ERROR(121); % UNEXPECTED END OF INPUT 0200 P:=CARD; 0204 GO EXIT % DONT SET NEW CARD OR TOBEWRITTEN. 000714-P = GO TO SOLVER WORK CELL 0220 END; B.0002(011) IS 0231 LONG, NEXT SEGMENT 010 ******** 0076 4 LINECOUNT:=LINECOUNT+1; % ANOTHER LINE READ 0103 IF REAL(P:=CARD,1) EQL 3"14" % FORM ? 0112 THEN BEGIN % YES 0115 4 IF WRITEAFORM AND NOT (EOPTION OR NOLISTFILE) PDP-11 ALGOL COMPILER, VERSION 6.6.019 3/5/76 PAGE 29 0121 THEN BEGIN 0125 5 LNCT:=100; 0130 WRITEALINE(1) 0132 END; 0134 5 WRITEAFORM:=FORMOPTION AND LNCT NEQ 0 0137 AND NOT (EOPTION OR NOLISTFILE); 0150 GO TO L1 % IN EITHER CASE, FORMS GET IGNORED 0152 END; 0152 4 IF P EQL "@" AND NOT QUOTING % CONTROL CARD 0160 THEN BEGIN 0165 4 SETTOGGLES; % SCAN IT 0170 WRITECARD; % PRINT OUT THE CARD 0173 GO L1 % GET NEXT CARD 0176 END; 0176 4 IF OMITTOG % CARDS BEING OMITTED DON'T GET COMPILED 0176 THEN BEGIN % WRITE OUT THIS CARD. (EVEN THOUGH IT'S OMMITED) 0201 4 WRITECARD; 0204 GO L1 % GET NEXT CARD 0206 END 0206 4 ELSE TOBEWRITTEN:=TRUE 0211 END 0213 3 ELSE % READ CARD FROM DEFINES 0213 IF AMTLEFT EQL 0 % ALL DONE SCANNING THIS DEFINE 0217 THEN BEGIN % SO CLEAN UP AFTER IT AND GET PREVIOUS 0222 3 REPLACE P:=CARD BY POINTER(CARDEF[DEFLEVEL:=*-1,*]) FOR 72,0; 0264 AMTLEFT:=CARDEF[DEFLEVEL,29]; % AMOUNT LEFT TO EXPAND 0266 % NEXT DEFINE 0272 IF EXPANDIT % FROM ELBAT 0272 THEN ELBATI:=CARDEF[DEFLEVEL,51]; % RESET DEFINE TABLE POINTER 0303 EXPANDIT:=BOOLEAN(CARDEF[DEFLEVEL,40]); 0311 DEFINDEX:=CARDEF[DEFLEVEL,28]; % WHERE NEXT DEFINE LOCATED AT 0317 P:=*+CARDEF[DEFLEVEL,26]; 0327 SKIPSPACES % CLEAN UP AFTER OLD DEFINE 0330 END 0332 3 ELSE BEGIN % CONTINUE TO SCAN EXISTING DEFINE 0334 3 IF AMTLEFT LSS 0 % SET UP FOR 1ST TIME 0336 THEN AMTLEFT:= 0341 IF EXPANDIT 0341 THEN ELBAT[DEFINDEX] % FROM PARAMETER 0345 ELSE STACK[DEFINDEX]; 0360 IF I:=AMTLEFT GTR 70 % SEE IF GTR A FULL CARD IMAGE LEFT 0364 THEN I:=70; % IF SO THEN TAKE THE 1ST 70 CHARS 0370 % ONLY THE 1ST 70 COLS BECAUSE DONT WANT COL 73 TO BE 0370 % ANY THING BUT NULL. 0372 REPLACE P:=CARD BY IF EXPANDIT 0376 THEN POINTER(ELBAT[DEFINDEX+1]) 0415 ELSE POINTER(STACK[DEFINDEX+1]) FOR I, 0436 " " FOR REAL(I EQL AMTLEFT), % A SPACE ONLY ON THE LAST TIME. 0445 0 FOR 1; % AND THEN A NULL TO 0447 % FORCE CONTINUITY 0456 DEFINDEX:=*+I DIV 2; 0465 AMTLEFT:=AMTLEFT-I 0466 END; 0472 3 NEWCARD:=TRUE; 0475 EXIT: END; READCARD(010) IS 0502 LONG, NEXT SEGMENT 001 ******** PDP-11 ALGOL COMPILER, VERSION 6.6.019 3/5/76 PAGE 30 0471 2 SAVE PROCEDURE SKIPSPACES; 0471 BEGIN 0471 2 LABEL AGAIN; SKIPSPACES IS SEGMENT 012 ******** 0001 AGAIN: SCAN P:P WHILE IN SPACES; 0011 IF P IN TERMINATORS 0017 THEN BEGIN 0021 3 IF TOBEWRITTEN 0021 THEN WRITECARD; 0032 GO AGAIN 0035 END 0035 3 END; 0035 2 0035 SKIPSPACES(012) IS 0036 LONG, NEXT SEGMENT 001 ******** 0473 SAVE INTEGER PROCEDURE SCANNER; 000715-P = SCANNER 0473 BEGIN 0473 2 POINTER Q; SCANNER IS SEGMENT 013 ******** 030007-S = Q 0007 BOOLEAN B; 030010-S = B 0010 INTEGER T; 030011-S = T 0011 OWN BOOLEAN FIRSTTIME:=TRUE; 000721-P = FIRSTTIME 0011 LABEL IDENT,NUM,CHECK; 0011 IF FIRSTTIME OR STARTDEFINE 0014 THEN BEGIN 0020 3 SKIPSPACES; 0023 FIRSTTIME:=STARTDEFINE:=FALSE 0024 END; 0030 3 LASTCOL:=DELTA(CARD,P); 0043 IF NEWCARD 0043 THEN BEGIN 0046 3 NEWCARD:=FALSE; 0051 REPLACE STR BY CARD FOR 72 % IN CASE OF AN ERROR 0056 END; % AND SCAN AHEAD READS A NEW CARD 0060 3 IF TOBEWRITTEN % BECAUSE OF LOOK AHEAD 0060 THEN WRITECARD; 0066 Q:=POINTER(INSTR); 0072 T:=63; % MAXLENGTH 0075 IF P IN ALPHAONLY 0103 THEN BEGIN 0105 3 Q:=A+1; 0111 IDENT: REPLACE Q:Q BY P:P FOR T:T WHILE IN ALPHANUMERIC; 0132 B:=TOGGLE; 0135 IF REAL(P,1) EQL 0 % HIT END OF CARD ! 0142 THEN BEGIN % SO GET NEXT CARD! 0145 4 IF TOBEWRITTEN 0145 THEN WRITECARD; 0153 READCARD; 0156 GO IDENT 0162 END; 0162 4 REPLACE Q BY 0 FOR 1; % END OF SYMBOL INDICATOR PDP-11 ALGOL COMPILER, VERSION 6.6.019 3/5/76 PAGE 31 0175 A[0].[7:8]:=INSTR[0]:= 8"0"+LINSTR:=63-T; 0220 C:=SHR(LINSTR+2,1); 0227 SCANNER:=SKAN:=1; 0234 CHECK: 0234 IF B 0234 THEN BEGIN 0237 4 LABEL AGAIN; 000722-P = B.0003 B.0003 IS SEGMENT 014 ******** 0000 AGAIN: SCAN P:P WHILE IN ALPHA; 0010 IF REAL(P,1) EQL 0 0015 THEN BEGIN 0020 5 IF TOBEWRITTEN 0020 THEN WRITECARD; 0026 READCARD; 0031 GO AGAIN 0034 END 0034 5 END 0034 4 END B.0003(014) IS 0045 LONG, NEXT SEGMENT 013 ******** 0253 3 ELSE 0253 IF P IN NUMERIC % NUMBER ! 0263 THEN BEGIN 0265 3 NUM: REPLACE Q:Q BY P:P FOR T:T WHILE IN NUMERIC; 0306 B:=TOGGLE; 0311 IF REAL(P,1) EQL 0 % ON ANOTHER CARD ! 0316 THEN BEGIN 0321 4 IF TOBEWRITTEN 0321 THEN WRITECARD; 0327 READCARD; 0332 GO NUM 0335 END; 0335 4 LINSTR:=63-T; % LENGTH OF NUMBER 0342 SCANNER:=SKAN:=3; 0347 GO CHECK 0351 END 0351 3 ELSE BEGIN % SPECIAL CHAR 0353 3 INSTR[0]:=REAL(P,1); 0362 P:=*+LINSTR:=1; 0371 SCANNER:=SKAN:=3 0372 END; 0376 3 IF INSTR[0] NEQ """ 0402 THEN SKIPSPACES 0406 END OF SCANNER; PDP-11 ALGOL COMPILER, VERSION 6.6.019 3/5/76 PAGE 32 OMIT 2 @O OMIT % T H E S Y M B O L T A B L E OMIT % ===== =========== ========= OMIT % OMIT % OMIT % HASHING FUNCTION - (2*VALUE OF 1ST CHAR OF IDENTIFIER OMIT % PLUS LENGTH) MOD 64 OMIT % OMIT % THERE TWO HASH TABLES. OMIT % THE 1ST IS FOR THOSE WHO WANT SAUSAGE AND THE 2ND OMIT % IS FOR THOSE WHO WANT SCRAMBLED EGGS. OMIT % OMIT % THE 1ST TABLE (SAUSAGE) IS USED TO SEE IF THE IDENTIFIER IS A OMIT % RESERVED WORD. THIS IS USED TO SPEED UP TABLE SEARCH. OMIT % THE 2ND TABLE (SCRAMBLEDEGGS) IS USED FOR LOOKING UP ANY IDENTIFIERS OMIT % NOT FOUND IN THE RESERVED WORD TABLE. OMIT % OMIT % FIRST WE APPLY THE HASHING FUNCTION TO OUR IDENTIFIER. OMIT % THE VALUE RETURNED (HASH VALUE) IS AN INDEX INTO EITHER SCRAMBLEDEGGS OMIT % OR SAUSAGE. (IF SEARCH THRU SCRAMBLEDEGGS FAILS THEN USE SAUSAGE). OMIT % THE VALUE RETURNED FROM INDEXING (HASH POINTER) POINTS OMIT % (IF NOT ZERO) TO A RESERVED WORD OR IDENTIFIER BLOCK. OMIT % OMIT % THE 1ST WORD OF THE IDENTIFIER BLOCK IS A LINK (OR 0) TO NEXT OMIT % IDENTIFIER OR RESERVED WORD THAT HAD SAME HASH VALUE. OMIT % THE 2ND WORD OF IN EACH IDENTIFIER BLOCK IS THE TOKEN VALUE (CLASS) OMIT % OR POINTER TO A DATA BLOCK OF THE MOST RECENT DECLARATION OMIT % OF THAT IDENTIFIER (OR RESERVED WORD). OMIT % THE 3RD-4+(LENGTH OF IDENTIFIER DIV 2)TH WORDS OF THE IDENTIFIER OMIT % BLOCK IS THE IDENTIFIER IN SYMBOL TABLE FORMAT. OMIT % OMIT % SYMBOL TABLE FORMAT IS DEFINED TO BE THE OMIT % PRECONCATED TO THE IDENTIFIER. OMIT % OMIT % THE FOR IDENTIFIERS OF LENGTH LESS THAN 10 OMIT % IS THE CHARACTER ASSOCIATED WITH THAT NUMBER. OMIT % I.E. "1" FOR LENGTH OF 1, "9" FOR LENGTH OF NINE. OMIT % FOR IDENTIFIERS OF LENGTH LONGER THAN 9 THE OMIT % ASSOCIATED WITH THAT LENGTH IS 60(OCTAL) [OR "0"] PLUS OMIT % THE NUMERIC VALUE OF THE LENGTH. OMIT % I.E. FOR LENGTH 10 YOU GET ":", FOR LENGTH 17 YOU GET "A". OMIT % OMIT % OMIT % EXAMPLE OF IDENTIFIER BLOCK FOR THE RESERVED WORD 'BEGIN' OMIT % OMIT % (LINK OR 0) OMIT % BEGINV [TOKEN VALUE OR CLASS] OMIT % "5B" = "5"+256*"B" OMIT % "EG" = "E"+256*"G" OMIT % "IN" = "I"+256*"N" OMIT % OMIT % ***NOTE*** THAT STRINGS ARE STORED FROM BOTTOM OF WORD TO TOP OF WORD OMIT % VERY CONVIENT FOR PDP-11 AUTO INDEXING MODE. OMIT % OMIT % OMIT % IF THE TOKEN VALUE IN THE IDENTIFIER BLOCK IS A POINTER OMIT % (GREATER THAN MAXIMUM TOKEN VALUE [CLASSMAX]) PDP-11 ALGOL COMPILER, VERSION 6.6.019 3/5/76 PAGE 33 OMIT % THEN IT IS A POINTER TO A DATA BLOCK ON THAT IDENTIFIER OMIT % OMIT % THE 1ST WORD OF A DATA BLOCK CONTAINS THE CLASS TYPE OF THE MOST OMIT % RECENT DECLARATION OF THAT VARIABLE AND ITS EXTERNAL USAGE. OMIT % CURRENTLY THE USAGE FIELDS ARE AS FOLLOWS: OMIT % [ 7:8] - CLASS ( ONLY NEED THAT MANY BITS.) OMIT % [12:5] - UNUSED (ALWAYS SET TO ZERO). OMIT % [13:1] - EXTERNAL-LOCAL BIT. OMIT % [14:1] - EXTERNAL-DECLARATION BIT. OMIT % [15:1] - UNUSED (ALWAYS SET TO ZERO). OMIT % WHEN A BLOCK, PROCEDURE, OWN VARIABLE, OR WORK-CELL IS OMIT % ALLOCATED IN AN EXTERNAL PROCEDURE, IT GOES INTO THE SYMBOL OMIT % TABLE WITH THE PROPER CLASS AND THE 'EXTERNAL-LOCAL' BIT ON. OMIT % THIS IS TO INDICATE THAT THIS EXTERNAL IS OT TO BE CONSIDERED OMIT % AS A CANDIDATE FOR A MATCH IN THE HOST. RATHER, THIS ENTITY OMIT % MUST BE ADDED TO THE HOST PRT REGARDLESS. THE BINDER OMIT % UNDERSTANDS THIS. OMIT % WHEN AN EXTERNAL PROCEDURE IS DECLARED, THE 'EXTERNAL-DECLARATION' OMIT % BIT IS SET. THIS INDICATES TO THE BINDER THAT THE PROCEDURE OMIT % BY THIS EXTERNAL NAME IS DECARED IN THIS FILE. OMIT % THIS ALLOWS A PROCEDURE TO BIND IN A SECOND WHICH THEN BINDS OMIT % IN A THIRD ECT. OMIT % THE 2ND WORD OF A DATA BLOCK IS THE ADDRESS OF THAT PARTICULAR OMIT % DECLARATION. OMIT % THE 3RD WORD OF THAT BLOCK IS THE LEVEL OF THAT DECLARATION. OMIT % THE 4TH WORD IS A POINTER TO THE NEXT MOST RECENT DECLARATION OMIT % IN A PREVIOUS (OUTER) BLOCK. OMIT % OMIT % IN THIS WAY, IT IS NOT NECESSARY TO MAKE MULTIPLE COPIES OF THE OMIT % IDENTIFIER FOR DIFFERENT DECLARATIONS OF THE SAME IDENTIFIER. OMIT % OMIT % OMIT % EXAMPLE OF IDENTIFIER AND DATA BLOCKS FOR VALIABLE "I". OMIT % DECLARED IN LEVEL 3 AS A BOOLEAN OMIT % AND THEN REDECLARED IN A LEVEL 5 BLOCK AS A INTEGER OMIT % OMIT % HASH VALUE IS 2*VALUE(I)+1 = 2*9+1 = 19. OMIT % OMIT % SYMBOL TABLE FORMAT IS "1I". OMIT % OMIT % OMIT % SAUSAGE[19] ---> --+ OMIT % ! OMIT % V OMIT % ! OMIT % [LINK OR POINTER] <--- <--+ OMIT % [POINTER] ---> --+ OMIT % "1I" ! OMIT % . ! OMIT % . V OMIT % . ! OMIT % INTEGERV <--- <--+ OMIT % ADDRESS FOR THIS DECLARATION OMIT % LEVEL (I.E. 5) OMIT % [POINTER] ---> --+ OMIT % ! OMIT % V PDP-11 ALGOL COMPILER, VERSION 6.6.019 3/5/76 PAGE 34 OMIT % ! OMIT % BOOLEANV <--- <--+ OMIT % ADDRESS FOR THIS DECLARATION OMIT % LEVEL (I.E. 3) OMIT % [0] - GROUND OMIT % OMIT % OMIT % FOR LABELS, WORD 4 IS USED TO LINK INTO THE EDOC OMIT % ARRAY TO THE LAST BRANCH UNCONDITIONAL TO THAT LABEL. OMIT % THAT WORD THEN POINTS TO THE NEXT MOST RECENT BRANCH OMIT % UNTIL THE FIRST REFERENCE OF THAT LABEL, WHICH POINTS OMIT % TO 0. WHEN THE LABEL IS DECLARED, THE LINKS ARE UNDONE OMIT % AND BRUN'S ARE PUT IN THEIR PLACE. THIS WORD IS THEN OMIT % CLEARED TO INDICATE THAT THERE ARE NO OPEN BRANCHES. OMIT % THE 5TH WORD IS USED TO POINT INTO THE PRT. OMIT % IF A BRANCH OCCURS FROM AN INNER BLOCK TO AN OUTER OMIT % BLOCK AND AT COMPILATION OF THE BRANCH, WE DON'T OMIT % KNOW WHERE WE ARE GOING, THEN WHEN WE DO FIND OUT OMIT % WE PUT THE ANSWER INTO THE PRT. THIS WORD IS THE OMIT % INDEX INTO THE PRT THAT WE PUT THE ANSWER. OMIT % OMIT % FOR SWITCHES: WORD 4 CONTAINS THE NUMBER OF SWITCHES OMIT % IE. THE MAX INDEX ! OMIT % WORD 5 CONTAINS THE ADDRESS OF WHERE THE 1ST BRANCH OMIT % OF OUR SWITCH TABLE IS. EVERY BRANCH IS 2 WORDS (4 BYTES) OMIT % LONG. OMIT % OMIT % FOR ARRAYS: WORD 4 CONTAINS THE # OF DIMENSIONS OMIT % IF BIT #0 IS 0 THEN THE ARRAY IS 1-DIM. ELSE IT IS 2-DIM. OMIT % IF THE ARRAY IS A PARAMETER TO A PROCEDURE, OMIT % THEN IF BIT #1 IS ON THEN THE DOPE VECTOR (OF A 2-DIM ARRAY) OMIT % OR THE ARRAY ROW (OF 1 DIM ARRAYS) IS RE-MAPPED. OMIT % IF BIT #2 IS ON THEN THE ARRAY ROWS OF A 2-DIM OMIT % ARRAY ARE RE-MAPPED. OMIT % ELSE BITS #1 AND #2 WILL BE 0 OMIT % WORD 5 CONTAINS THE TYPE OF ARRAY (IE INTID OR BOOLID) OMIT % IF THE ARRAY IS A PARAMETER, THEN WORD 6 WILL CONTAIN OMIT % THE LOWER BOUND OF THE ARRAY ROW (DOPE VECTOR OF OMIT % A 2-DIM ARRAY) IF IT IS RE-MAPPED AND OMIT % WORD 7 WILL CONTAIN THE LOWER BOUND OF THE ARRAY ROW OMIT % OF A 2-DIM ARRAY IF IT IS RE-MAPPED OMIT % OMIT % FOR TRUTHSETS: WORDS 4-11 CONTAIN THE TRUTHSET OMIT % THIS IS SO THAT WE CAN AND AND OR THE TRUTHSETS TOGETHER OMIT % AT COMPILATION TIME OMIT % OMIT % FOR PROCS: THIS GETS COMPILCATED. OMIT % 3 CASES OMIT % CASE 1 - WE ARE INSIDE OF THE PROC BEING COMPILED OMIT % WORD 4 POINTS TO THE 9TH ENTRY (WORD 8) OMIT % OF THE 1ST PARAMETER. OMIT % WORD 0 OF THAT ENTRY IS A REGULAR IDENTIFIER ENTRY OMIT % WORD 8 IS 0 OR POINTS TO THE NEXT ENTRY. OMIT % OMIT % CASE 2 - WE ARE OUTSIDE OF THE PROCEDURE. OMIT % EACH PARAMETER WAS INTEGER AND BY VALUE. OMIT % THIS WORD CONTAINS THE # OF SUCH PARAMS. PDP-11 ALGOL COMPILER, VERSION 6.6.019 3/5/76 PAGE 35 OMIT % OMIT % CASE 3 - WE ARE OUTSIDE OF THE PROCEDURE BUT NOT EACH OMIT % PARAM WAS INTEGER AND VALUE. OMIT % THEN THIS WORD (WORD 4) POINTS TO A -1 OMIT % THE WORD AFTER THAT IS CODED AS FOLLOWS OMIT % BIT #15, IF ON, INDICATES THAT THIS PARAM (THE 1ST) OMIT % IS BY NAME. BITS #13:14 IS THE CLASS OF THE PARAM. OMIT % THE NEXT WORD IS FOR PARAM # 2. OMIT % ECT. UNTIL A 0 WORD IS REACHED. OMIT % OMIT % IF THERE ARE NO PARAMS THEN WORD 4 WILL CONTAIN A ZERO. OMIT % WORD #5 CONTIANS THE OFFSET USED BY ALL OF THE OMIT % PARAMETERS PUT TOGETHER IN THEIR PASSING. OMIT % IE. 2 PARAMS, ONE BY NAME AND ONE BY VALUE WILL USE OMIT % THREE WORDS. (TWO FOR THE ONE BY VALUE) OMIT % SO WORD 5 WOULD CONTAIN A 3 OMIT % PDP-11 ALGOL COMPILER, VERSION 6.6.019 3/5/76 PAGE 36 OMIT % D E F I N E I N V O C A T I O N S OMIT % =========== ===================== OMIT % OMIT % WHEN A DEFINED IDENTIFIER IS ENCOUNTERED AND WE ARE ALLOWED OMIT % TO EXPAND IT ('STOPDEFINE' IS FALSE), WE NEST THE CURRENT CARD OMIT % IMAGE, COLUMN INDICATOR, ECT. IN COLS 0-41 OF CARDEF[DEFLEVEL,*]. OMIT % IF THIS DEFINE HAS PARAMETERS, THEN THE DEFINED TEXT IS STORED OMIT % IN THE 'ELBAT' ARRAY IN THE SAME FASHION AS DEFINES ARE STORED OMIT % IN THE SYMBOL TABLE (# OR CHARACTERS FOLLOWED BY THE TEXT). OMIT % POINTERS INTO 'ELBAT' ARE STORED IN CARDEF FOR EACH PARAMETER OMIT % IN CARDEF[DEFLEVEL,41+PARAM-NUMBER] WHERE 0 IS THE FIRST PARAM. OMIT % HENCE THE ONLY WAY TO PASS THRU A 'FREE' ')',']',OR ',' IS TO OMIT % DEFINE SOME IDENTIFIER TO BE THAT ENTITY AND PASS THE DEFINED OMIT % IDENTIFIER THRU IN THE DEFINE. OMIT % OMIT % EXAMPLES : OMIT % OMIT % DEFINE ONE(A) = A]#, OMIT % TWO(A,B)= A,B]#, OMIT % A(A,B) = A[B#; OMIT % ARRAY A1[0:5],A2[0:5,0:5]; OMIT % A(A1,5]):=1; OMIT % A[A1,ONE(5)]:=1; OMIT % A(A2,TWO[5,5]):=1; OMIT % OMIT % OMIT % WHEN A PARAMETER FROM A DEFINE IS ENCOUNTERED, IT IS EXPANDED OMIT % IMMEDIATELY. PARAMETERS ARE MARKED BY 'DEFINEDEC' TO BE OMIT % 3"177" FOLLOWED BY "0"+PARAMNUMBER (0 TO 9). OMIT % 0410 @O PDP-11 ALGOL COMPILER, VERSION 6.6.019 3/5/76 PAGE 37 SCANNER(013) IS 0411 LONG, NEXT SEGMENT 001 ******** 0475 SAVE PROCEDURE GETNEXT; 000726-P = GETNEXT 0475 BEGIN 0475 2 INTEGER I,X,T,S,PNO; GETNEXT IS SEGMENT 015 ******** 030005-S = I 030006-S = X 030007-S = T 030010-S = S 030011-S = PNO 0003 BOOLEAN B; 030012-S = B 0003 LABEL START,L1,L2,L3,L4,IDENT,ROSE,EXIT,DEF; 0003 RESERVED:=BOOLEAN(INFO:=0); % RESET RESERVED WORD INDICATOR 0012 START: IF T:=SCANNER = 1 THEN 0024 BEGIN 0024 3 IF B:= 0024 T:=SAUSAGE[S:=REAL(BOOLEAN(LINSTR+SHR(A[0],8)*2) AND BOOLEAN(63))] 0041 NEQ 0 0046 THEN GO IDENT; 0055 L1: IF T:=SCRAMBLEDEGGS[S] = 0 0063 THEN BEGIN CLASS:=0; GO EXIT; END; 0073 IDENT: IF POINTER(STACK[T+2]) NEQ POINTER(A) FOR C*2 0113 THEN GO ROSE; 0122 RESERVED:=B; % SET RESERVED TOG TO WHAT IT 0122 % SHOULD BE 0125 IF CLASS:=STACK[T+2] < CLASSMAX THEN 0140 BEGIN 0140 4 IF CLASS NEQ COMMENTV 0141 THEN GO EXIT; 0147 WHILE NEXTCHAR NEQ ";" DO; 0161 SKIPSPACES; 0164 GO TO START; 0166 END; 0166 4 % EXTERNAL TOG IN UPPER BYTE ! (FROM PROCDEC) 0166 CLASS:=REAL(BOOLEAN(STACK[INFO:=CLASS]) AND BOOLEAN(3"377")); 0177 IF CLASS = DEFINEID THEN 0204 IF NOT STOPDEFINE THEN 0207 BEGIN 0207 4 CARDEF[DEFLEVEL,40]:=REAL(EXPANDIT); % SAVE WHERE CURNT 1 IS 0214 CARDEF[DEFLEVEL,28]:=DEFINDEX; % WHERE TO EXPAND THIS ONE FROM 0221 DEFINDEX:=INFO+4; % POINT TO LENGTH OF DEFINE 0226 IF PNO:=STACK[INFO+2] NEQ 0 % # OF PARAMS IN DECLARATION 0236 THEN BEGIN 0241 5 INTEGER ARRAY NESTS[0:25]; % FOR NESTING PARENS & THINGS 000732-P = B.0004 B.0004 IS SEGMENT 016 ******** 030020-S = NESTS 0011 BOOLEAN DONE,INQUOTE,LASTWASASPACE; 030022-S = DONE 030023-S = INQUOTE 030024-S = LASTWASASPACE 0013 INTEGER B,COUNT,QCOUNT,NESTLEVEL,I,PARAMNO,TEMPI,T; 030025-S = B 030026-S = COUNT 030027-S = QCOUNT PDP-11 ALGOL COMPILER, VERSION 6.6.019 3/5/76 PAGE 38 030030-S = NESTLEVEL 030031-S = I 030032-S = PARAMNO 030033-S = TEMPI 030034-S = T 0013 DEFINE ENDBKT = (T EQL "[" AND I EQL "]" OR 0013 T EQL "(" AND I EQL ")") #; 0013 CARDEF[DEFLEVEL,51]:=ELBATI; % SO WE KNOW WHERE TO CUT BACK TO 0022 I:=SCANNER; % SEE WHAT WE GOTS 0030 IF T:=INSTR[0] NEQ "(" AND T NEQ "["% SEE IF WE GOT A '(' 0041 THEN BEGIN 0045 6 ERROR(100); % # OF PARAMS DONT MATCH THE DEF 0051 GO START 0065 END; 0065 6 DO BEGIN 0065 6 CARDEF[DEFLEVEL,41+PARAMNO]:=TEMPI:=ELBATI; 0076 DONE:=BOOLEAN(COUNT:=0); % INITIALIZE EACH TIME THRU LOOP 0103 WHILE NOT DONE 0103 DO BEGIN % SCAN THE PARAMETERS 0106 7 I:=NEXTCHAR; % GET NEXT CHARACTER 0114 IF INQUOTE % IF IN NESTED QUOTES 0114 THEN 0117 IF QCOUNT:=QCOUNT+2 GEQ 2 AND I EQL """ 0130 THEN INQUOTE:=FALSE 0135 ELSE 0137 ELSE BEGIN 0141 8 IF LASTWASASPACE 0141 THEN 0144 WHILE I EQL " " 0146 DO I:=NEXTCHAR; % SCAN OUT MULTIPLE SPACES 0162 LASTWASASPACE:=I EQL " "; % SET INDICATOR FOR NEXT TIME 0167 IF I EQL """ 0171 THEN BEGIN 0174 9 INQUOTE:=TRUE; 0177 QCOUNT:=0 0200 END; 0202 9 IF (ENDBKT OR I EQL ",") AND NESTLEVEL EQL 0 0227 THEN DONE:=TRUE % NON-NESTED ',' OR CLOSE BRACKET 0234 ELSE 0236 IF I EQL "[" OR I EQL "(" 0245 THEN NESTS[NESTLEVEL+1]:=I % UN-NESTED THING 0256 ELSE 0261 IF NESTLEVEL NEQ 0 % WE ARE NESTED 0265 THEN NESTLEVEL:=*-REAL( % SO SEE IF WE CAN 0271 I EQL "]" AND NESTS[NESTLEVEL] EQL "[" OR 0302 I EQL ")" AND NESTS[NESTLEVEL] EQL "(") 0314 END; 0317 8 IF NOT DONE % SEE IF TO ADD TO THE DEFINE TABLE 0317 THEN 0322 IF BOOLEAN(COUNT:=COUNT+1) 0327 THEN B:=I % NOT YET, SAVE 0331 ELSE 0334 IF ELBATI+1 LEQ STACKSIZE 0341 THEN ELBAT[ELBATI:=ELBATI+1]:=B+256*I 0354 ELSE ERROR(101); % DEFINE TABLE OVERFLOW 0367 END; 0371 7 IF BOOLEAN(COUNT) % SEE IF A LEFT OVER PDP-11 ALGOL COMPILER, VERSION 6.6.019 3/5/76 PAGE 39 0372 THEN IT WAS NECESSARY TO REDUCE THE SIZE OF THE LISTING FILE TO MAKE IT FIT ON A SINGLE DEC-TAPE. THIS WAS ONE OF THE PAGES THAT VOLUNTEERED TO GO. PDP-11 ALGOL COMPILER, VERSION 6.6.019 3/5/76 PAGE 40 0534 ELSE 0537 IF T = "<" 0543 THEN CLASS:=LEQOP 0546 ELSE 0551 IF T = "?" OR T = "^" 0560 THEN CLASS:=NEQOP; 0567 IF T = "!" AND X = "!" 0574 THEN CLASS:=AMPER 0600 ELSE 0603 IF T = "*" AND X = "*" 0612 THEN CLASS:=EXPOP 0616 ELSE 0621 IF T EQL "@" 0625 THEN 0630 IF X EQL "#" 0632 THEN CLASS:=ATPOUNDV 0635 ELSE BEGIN 0642 4 CLASS:=ATSIGN; 0645 GO EXIT 0647 END; 0647 4 IF T EQL "<" AND X EQL ">" 0654 THEN CLASS:=NEQOP; 0663 IF CLASS = 0 0665 THEN GO TO L4; 0672 P:=*+1; 0677 SKIPSPACES; 0702 REPLACE INSTR+1 BY X FOR 1; 0715 LINSTR:=2; 0720 GO EXIT; 0723 L4: IF T:=REAL(BOOLEAN(T) AND BOOLEAN(63))-27 < 0 OR T > 36 0736 THEN BEGIN 0742 4 FLAG(78); 0746 GO START 0750 END; 0750 4 CLASS:=SPECIAL[T]; 0755 GO EXIT 0757 END; 0757 3 L2: CLASS:=ICONSTANT; 0762 INREAL:=0; % INITIALIZE VALUE OF INTEGER CONS 0765 IF P EQL """ AND LINSTR LEQ 2 0775 AND (IF POINTER(INSTR) EQL "0" 1001 THEN FALSE % AVOID /0 1010 ELSE 8 MOD (I:=REAL(POINTER(INSTR),1)-"0") EQL 0 OR I EQL 3) 1034 AND (IF LINSTR EQL 2 1037 THEN REAL(POINTER(INSTR)+1,1) EQL "0" 1047 ELSE TRUE) 1053 THEN BEGIN % QUOTED STRING CONSTANT 1056 3 INTEGER MAX,TEMP:=LINSTR; % FORCE NEW SEGMENT ! 000736-P = B.0005 B.0005 IS SEGMENT 017 ******** 030015-S = MAX 030016-S = TEMP 0002 LABEL IERR; 0002 NEXTCHAR; % SCAN THE '"' 0011 S:=-1; 0015 IF TEMP EQL 2 0017 THEN BEGIN % LEFT JUSTIFY PDP-11 ALGOL COMPILER, VERSION 6.6.019 3/5/76 PAGE 41 IT WAS NECESSARY TO REDUCE THE SIZE OF THE LISTING FILE TO MAKE IT FIT ON A SINGLE DEC-TAPE. THIS WAS ONE OF THE PAGES THAT VOLUNTEERED TO GO. PDP-11 ALGOL COMPILER, VERSION 6.6.019 3/5/76 PAGE 42 1113 ELSE INREAL:=INTEGER(INSTR,LINSTR); 1126 EXIT: STOPDEFINE:=FALSE 1127 END; GETNEXT(015) IS 1135 LONG, NEXT SEGMENT 001 ******** PDP-11 ALGOL COMPILER, VERSION 6.6.019 3/5/76 PAGE 43 0477 2 PROCEDURE GETATTRIBUTE; 000743-P = GETATTRIBUTE 0477 BEGIN 0477 2 INTEGER I; GETATTRIBUTE IS SEGMENT 020 ******** 030005-S = I 0002 BOOLEAN DONE; 030006-S = DONE 0003 GETNEXT; % GET NEXT TOKEN 0010 IF RESERVED OR SKAN NEQ 1 % SEE IF COULD BE ATTRIBUTE 0013 THEN % NO, 0017 ELSE % YES 0017 DO 0017 IF DONE:=POINTER(ATTRIBUTEDHASH[I+2]) EQL A FOR MIN(C,120-I)*2 0052 THEN CLASS:=ATTRIBUTEDHASH[I+1] % GET REAL CLASS 0064 UNTIL I:=ATTRIBUTEDHASH[I] EQL 0 OR DONE 0077 END OF GETTING CONTEXT SENSITIVE RESERVED WORDS (CLASS 3,F); GETATTRIBUTE(020) IS 0104 LONG, NEXT SEGMENT 001 ******** PDP-11 ALGOL COMPILER, VERSION 6.6.019 3/5/76 PAGE 44 0477 2 PROCEDURE FLAG(X); 0477 VALUE X; 0477 INTEGER X; 0477 BEGIN 0477 2 BOOLEAN T,B; FLAG IS SEGMENT 021 ******** 030005-S = T 030006-S = B 0003 INTEGER I,J1,K; 030007-S = I 030010-S = J1 030011-S = K 0003 POINTER Q,R; 030014-S = Q 030017-S = R 0017 INTEGER ARRAY AB[0:35]; 030023-S = AB 0030 IF ERRORTOG 0032 THEN BEGIN 0035 3 IF ERRORCOUNT:=ERRORCOUNT+1>99 0043 THEN X:=93; 0051 T:=EOPTION; 0054 EOPTION:=FALSE; 0057 IF B:=NOLISTFILE 0057 THEN BEGIN 0064 4 NOLISTFILE:=FALSE; 0067 IF NOT LINE.OPEN 0067 THEN LINE.KIND:=VALUE(KB) 0102 END; 0106 4 IF NOHEADING 0106 THEN DAYTIME; 0114 IF T OR DEFLEVEL NEQ 0 0117 THEN BEGIN 0123 4 IF J1:=DEFLEVEL = 0 0127 THEN % CLEAN CARD - NO 0132 REPLACE LINEOUT BY O4(L)," ",POINTER(CARD) FOR 72 0151 ELSE 0153 WHILE J1 GTR 0 0157 DO BEGIN 0162 5 REPLACE LINEOUT BY "DEFINED TO BE "; 0171 WRITEALINE(7); 0175 REPLACE R:LINEOUT BY " " FOR 8; 0205 Q:=POINTER(CARDEF[J1-1,*]); 0227 THRU 72 0230 DO BEGIN 030025-S = THRU CLAUSE WORK CELL 0236 6 IF REAL(Q,1) EQL 3"177" 0243 THEN REPLACE R:R BY "?" 0251 ELSE REPLACE R:R BY Q FOR 1; 0270 Q:=*+1 0272 END; 0302 6 IF J1:=J1-1 GTR 0 0310 THEN WRITEALINE(40) 0315 END; 0343 5 WRITEALINE(40) 0345 END; 0347 4 IF B PDP-11 ALGOL COMPILER, VERSION 6.6.019 3/5/76 PAGE 45 0347 THEN BEGIN 0352 4 REPLACE LINEOUT BY O4(L)," ",STR FOR 72; 0373 WRITEALINE(40) 0375 END; 0377 4 R:=STR; 0403 THRU LASTCOL 0403 DO I:= 030026-S = THRU CLAUSE WORK CELL 0412 IF R:R EQL " " 0415 THEN I DIV 8 * 8 + 8 0431 ELSE I+1; 0453 REPLACE LINEOUT BY " " FOR I+8, 0464 IF SKAN EQL 1 % WHERE IS LAST TOKEN? 0466 THEN A+1 % IN THE A ARRAY! 0473 ELSE INSTR FOR LINSTR," "; 0511 WRITEALINE((I+9+LINSTR) DIV 2); 0523 READ(ERRORF[X-1],26,AB); 0537 REPLACE LINEOUT BY "*" FOR 8,POINTER(AB) FOR 72; 0553 WRITEALINE(40); 0557 EOPTION:=T; 0562 NOLISTFILE:=B 0562 END; 0565 3 IF X = 93 OR X = 91 OR X = 101 OR X = 82 OR X = 121 OR X EQL 122 0612 THEN BEGIN 0616 3 J:=DA; % FOR EXIT ROUTINE (IF CRUNCHED FILES) 0621 GO EOJ 000747-P = GO TO SOLVER WORK CELL 0626 END 0626 3 END; 0626 2 0626 FLAG(021) IS 0635 LONG, NEXT SEGMENT 001 ******** 0477 PROCEDURE ERROR(X); 0477 VALUE X; 0477 INTEGER X; 0477 BEGIN 0477 2 LABEL NOTYET; ERROR IS SEGMENT 022 ******** 0001 FLAG(X); 0007 ERRORTOG:=FALSE; 0012 NOTYET: IF CLASS = BEGINV THEN STMT; 0022 IF CLASS NEQ ENDV AND CLASS NEQ SEMICOLON 0026 THEN BEGIN 0033 3 STOPDEFINE:=TRUE; 0036 GETNEXT; 0041 GO NOTYET 0043 END 0043 3 END ERROR; PDP-11 ALGOL COMPILER, VERSION 6.6.019 3/5/76 PAGE 46 0043 2 % 0043 % THIS SECTION CONTAINS THE EMITTERS 0043 % 0043 % THEY PRODUCE CODE AND DEBUGGING OUTPUT 0043 % ERROR(022) IS 0044 LONG, NEXT SEGMENT 001 ******** 0477 SAVE PROCEDURE EMITC (COD); 000750-P = EMITC 0477 VALUE COD; 0477 INTEGER COD; 0477 IF L LSS 2048 EMITC IS SEGMENT 023 ******** 0005 THEN BEGIN % SEG NOT TOO BIG YET ! 0010 2 EDOC[L]:=COD; 0014 L:=L + 1 0016 END 0021 2 ELSE BEGIN 0023 2 FLAG (66); % SEG TOO BIG 0027 L:=0 0030 END; 0032 2 EMITC(023) IS 0033 LONG, NEXT SEGMENT 001 ******** 0501 SAVE PROCEDURE EMITL (LITERAL); 000754-P = EMITL 0501 VALUE LITERAL; 0501 INTEGER LITERAL; 0501 BEGIN 0501 2 EMITC(J:=SHL(LITERAL,2)); EMITL IS SEGMENT 024 ******** 0013 IF DEBUGTOG 0013 THEN BEGIN 0016 3 REPLACE LINEOUT BY " " FOR 18,O6(L-1)," LITC ",O6(LITERAL), 0046 " ",O6(J); 0060 WRITEALINE(23) 0062 END 0064 3 END OF EMITL; 0064 2 EMITL(024) IS 0076 LONG, NEXT SEGMENT 001 ******** 0503 SAVE PROCEDURE EMIT(OPERATOR); 000760-P = EMIT 0503 VALUE OPERATOR; 0503 INTEGER OPERATOR; 0503 BEGIN 0503 2 EMITC(J:=SHL(OPERATOR,2)+1285); % 1281 IS BASE FOR OPS EMIT IS SEGMENT 025 ******** 0015 IF DEBUGTOG 0015 THEN BEGIN 0020 3 REPLACE LINEOUT BY " " FOR 18,O6(L-1)," ", 0043 POINTER(OP[OPERATOR*2]) FOR 4," " FOR 10,O6(J); 0074 WRITEALINE(23) 0076 END 0100 3 END OF EMIT; 0100 2 EMIT(025) IS 0110 LONG, NEXT SEGMENT 001 ******** 0505 PROCEDURE EMITO(ADDRESS); 000764-P = EMITO 0505 VALUE ADDRESS; PDP-11 ALGOL COMPILER, VERSION 6.6.019 3/5/76 PAGE 47 0505 INTEGER ADDRESS; 0505 BEGIN 0505 2 EMITC(J:=SHL(ADDRESS,2)+2); EMITO IS SEGMENT 026 ******** 0015 IF DEBUGTOG 0015 THEN BEGIN 0020 3 REPLACE LINEOUT BY " " FOR 18,O6(L-1)," VALC ", 0043 O6(ADDRESS)," ",O6(J); 0062 WRITEALINE(22) 0064 END 0066 3 END OF EMITO; 0066 2 EMITO(026) IS 0100 LONG, NEXT SEGMENT 001 ******** 0505 PROCEDURE EMITD(ADDRESS); 000770-P = EMITD 0505 VALUE ADDRESS; 0505 INTEGER ADDRESS; 0505 BEGIN 0505 2 EMITC(J:=SHL(ADDRESS,2)+2); EMITD IS SEGMENT 027 ******** 0015 IF DEBUGTOG 0015 THEN BEGIN 0020 3 REPLACE LINEOUT BY " " FOR 18,O6(L-1)," NAMC ", 0043 O6(ADDRESS)," ",O6(J); 0062 WRITEALINE(23) 0064 END 0066 3 END; 0066 2 EMITD(027) IS 0100 LONG, NEXT SEGMENT 001 ******** 0505 SAVE PROCEDURE EMITB(BRANCH,FROM,TOO); 000774-P = EMITB 0505 VALUE BRANCH,FROM,TOO; 0505 INTEGER BRANCH,FROM,TOO; 0505 BEGIN 0505 2 INTEGER TL:=L; EMITB IS SEGMENT 030 ******** 030005-S = TL 0011 EMITL(TOO+2); 0021 EMIT(BRANCH); 0025 L:=TL; 0030 END OF EMITB; EMITB(030) IS 0031 LONG, NEXT SEGMENT 001 ******** 567 END OF CODE-THE-DAY; 0575 2 CODETHEDAY(003) IS 0603 LONG, NEXT SEGMENT 001 ******** 0465 PROCEDURE DAYTIME; 000660-P = DAYTIME 0465 BEGIN 0465 2 INTEGER DA,MO,YR; DAYTIME IS SEGMENT 004 ******** 030005-S = DA 030006-S = MO 030007-S = YR 0003 POINTER P; 030012-S = P 0011 REPLACE P:=LINEOUT BY " " FOR 21, 0024 "PDP-11 ALGOL COMPILER, VERSION ",REVNO FOR 1, 0036 ".",SHR(REVNO,8) FOR 1,"." UPDATE " "; 0063 REPLACE HEADING BY LINEOUT+21 FOR 38; 0072 WRITEALINE(REAL(BOOLEAN(30))); 0076 CODETHEDAY(DA:=TIME(3),MO:=TIME(4),YR:=TIME(5), 0116 TIME(2),TIME(1),P,0); 0130 WRITEALINE(0); 0134 WRITEALINE(40); PDP-11 ALGOL COMPILER, VERSION 6.6.019 3/5/76 PAGE 24 0140 WRITEALINE(LNCT:=0); 0146 REPLACE DATE BY ZS(MO,2),"/",ZS(DA,1+REAL(DA GTR 9)),"/", 0200 YR FOR 2 DIGITS," " FOR REAL(DA LEQ 9); 0214 P:=LINEOUT; 0220 CODETHEDAY(COMPILETIME(3),COMPILETIME(4),COMPILETIME(5), 0224 COMPILETIME(2),COMPILETIME(1),P,18); 0232 REPLACE P BY "COMPILER COMPILED"; 0241 WRITEALINE(40); 0245 WRITEALINE(0); 0251 WRITEALINE(REAL(NOHEADING:=FALSE)) 0255 END OF DAYTIME; DAYTIME(004) IS 0340 LONG, NEXT SEGMENT 001 ******** PDP-11 ALGOL COMPILER, VERSION 6.6.019 3/5/76 PAGE 25 0465 2 PROCEDURE SETTOGGLES; 000664-P = SETTOGGLES 0465 BEGIN 0465 2 INTEGER T; SETTOGGLES IS SEGMENT 005 ******** 030005-S = T 0002 IF T:=REAL(P+1,1) EQL "O" 0015 THEN OMITTOG:=NOT OMITTOG % TOG THE OMITTER TOG 0020 ELSE 0024 IF T = "P" 0030 THEN PRTTOG:=?PRTTOG % TOG PRT LISTING (STACK LISTING) 0033 ELSE 0037 IF T = "D" 0043 THEN DEBUGTOG:=?DEBUGTOG % TOG THE CODE LISTING 0046 ELSE 0052 IF T = "I" % INCLUDE OPTION 0056 THEN BEGIN 0061 3 IF NOT INCLUDETOG % IN INCLUDE MODE? 0061 THEN BEGIN 0064 4 INCLUDETOG:=TRUE; 0067 REPLACE INCLUDE.TITLE BY P+2 0073 END 0107 4 ELSE FLAG(120) 0113 END 0115 3 ELSE 0115 IF T = "F" AND LNCT NEQ 0 % FORM OPTION (PAGE) 0124 THEN BEGIN % REPLY ONLY IF NOT BLANK PAGE 0130 3 LNCT:=100; 0133 WRITEALINE(1) % WRITE IT OUT 0135 END 0137 3 ELSE 0137 IF T = "E" % ERROR ONLY (LIST) 0143 THEN 0146 IF ?EOPTION:=? EOPTION % IF TURNING ON THE LISTING 0146 THEN 0154 IF NOHEADING % THEN IF THIS IS THE 1ST TIME THAT 0154 THEN DAYTIME % LIST WAS ON THEN PRINT HEADING 0160 ELSE 0162 ELSE 0162 ELSE 0162 IF T EQL "C" % CHAIN OPTION ! 0166 THEN 0171 IF INCLUDETOG 0171 THEN BEGIN 0174 3 INCLUDE.OPEN:=FALSE; 0202 REPLACE INCLUDE.TITLE BY P+2 0206 END 0222 3 ELSE BEGIN 0224 3 CARDIN.OPEN:=FALSE; 0232 REPLACE CARDIN.TITLE BY P+2 0236 END 0252 3 END OF CONTROL CARDS; SETTOGGLES(005) IS 0253 LONG, NEXT SEGMENT 001 ******** PDP-11 ALGOL COMPILER, VERSION 6.6.019 3/5/76 PAGE 26 0465 2 SAVE PROCEDURE WRITECARD; 000670-P = WRITECARD 0465 BEGIN 0465 2 INTEGER I,J,K,X; WRITECARD IS SEGMENT 006 ******** 030005-S = I 030006-S = J 030007-S = K 030010-S = X 0003 OWN INTEGER PBC; 000674-P = PBC 0003 POINTER Q; 030013-S = Q 0011 IF WRITEAFORM 0013 THEN BEGIN 0016 3 WRITEAFORM:=BOOLEAN(LNCT:=100); 0023 WRITEALINE(1) 0025 END; 0027 3 IF OMITTOG 0027 THEN REPLACE Q:LINEOUT BY "OMIT" 0035 ELSE REPLACE Q:LINEOUT BY O4(L); 0054 IF PBC EQL BEGINCTR 0055 THEN REPLACE Q:Q BY " " 0064 ELSE REPLACE Q:Q BY ZS(MAX(PBC,PBC:=BEGINCTR),2); 0116 IF ERRORCOUNT EQL 0 0120 THEN REPLACE Q:Q BY " " 0126 ELSE REPLACE Q:Q BY ZS(ERRORCOUNT,2); 0145 REPLACE Q BY POINTER(CARD) FOR 72; 0154 IF EIGHTYCOL % SHORT FORM? 0154 THEN BEGIN % YES 0157 3 DEFINE SEGMENTIT=#; 000675-P = MARKSTACK DESCRIPTOR FOR LEVEL 2 000676-P = B.0001 B.0001 IS SEGMENT 007 ******** 0000 K:=-1; 0006 DO BEGIN 0006 4 IF X:=REAL(POINTER(LINEOUT)+K:=*+1,1) EQL 3"11" 0021 THEN I:=I DIV 8 * 8 + 8 0032 ELSE I:=*+1; 0044 J:=*+1 0046 END 0051 4 UNTIL I GEQ 80 OR X EQL 0 0056 END 0062 3 ELSE J:=132; % FOR LONG PRINTERS B.0001(007) IS 0073 LONG, NEXT SEGMENT 006 ******** 0211 WRITEALINE(J DIV 2); 0217 TOBEWRITTEN:=FALSE 0220 END OF WRITTING THE CARDS OUT; PDP-11 ALGOL COMPILER, VERSION 6.6.019 3/5/76 PAGE 27 OMIT 2 @O OMIT % D E F I N E E X P A N S I O N OMIT % =========== ================= OMIT % OMIT % 'DEFLEVEL' IS AN INDICATOR AS TO WHETHER OR NOT WE ARE OMIT % EXPANDING DEFINES. IT IS THE LEVEL OF DEFINE NESTING. IF IT OMIT % IS ZERO, THEN THERE ISN'T A DEFINE TO EXPAND AND THE NEXT OMIT % CARD IMAGE COMES FROM THE PRIMARY OR SECONDARY INPUT FILE. OMIT % OTHERWISE THERE IS A DEFINE TO EXPAND AND THE FOLLOWING OMIT % GLOBALS CONTAIN THE FOLLOWING INFORMATION : OMIT % OMIT % 'AMTLEFT' - IF THIS IS ZERO, THEN WE ARE FINISHED EXPANDING OMIT % THE DEFINE WE PREVIOUSLY WERE EXPANDING AND IT IS TIME OMIT % TO UNNEST THE DEFINES 1 LEVEL. OMIT % IF THIS IS POSITIVE, IT INDICATES THE # OF OMIT % CHARACTERS LEFT TO EXPAND. DEFINES ARE EXPANDED IN GROUPS OMIT % OF 72 CHARACTERS. OMIT % IF THIS IS NEGATIVE THEN WE ARE TO EXPAND THE OMIT % DEFINE FOR THE FIRST TIME. OMIT % OMIT % EXPANDIT' - IF ZERO THEN THE DEFINE IS A DECLARED DEFINE AND OMIT % THE DEFINED TEXT IS FOUND IN THE SYMBOL TABLE ('STACK'). OMIT % IF THIS VALUE IS ONE (1) THEN THE DEFINE IS OMIT % A PARAMETER TO A DEFINE AND THE DEFINED TEXT IS FOUND OMIT % IN THE 'ELBAT' ARRAY. OMIT % OMIT % 'DEFINDEX' - POINTS TO WORD BEFORE NEXT WORD OF TEXT TO BE OMIT % EXPANDED. INDEX INTO 'STACK' OR 'ELBAT' DEPENDING UPON OMIT % 'EXPANDIT'. OMIT % OMIT % OMIT % DEFINES ARE NESTED OR STACKED VIA AN ARRAY CALLED 'CARDEF'. OMIT % THE STACKING MECHINISM IS INSIDE OF GETNEXT AT THE POINT OF OMIT % INVOCATION OF THE DEFINE. THAT ROUTINE ALSO BUMPS 'DEFLEVEL'. OMIT % HENCE THE REASON FOR THE TEST OF 'DEFLEVEL' GREATER THAN ZERO. OMIT % EACH LEVEL OF EXPANSION HAS AN ARRAY ROW OF 'CARDEF' ASSOCIATED OMIT % WITH IT. WHEN LEVEL UNEXPANDS TO , OMIT % THE ROW 'CARDEF[DEFLEVEL,*]' CONTAINS THE FOLLOWING INFORMATION : OMIT % OMIT % 0-35 CARD IMAGE INTERRUPTED FROM. OMIT % 36 BYTE INDEX INTO CARD IMAGE (AFTER DEFINE) OMIT % 37 NOT USED ! OMIT % OMIT % IF 'DEFLEVEL' NEQ ZERO THEN THE FOLLOWING APPLIES : OMIT % OMIT % 38 'DEFINDEX' TO PREVIOUS DEFINE OMIT % 39 'AMTLEFT' TO PREVIOUS DEFINE OMIT % 40 'EXPANDIT' TO PREVIOUS DEFINE OMIT % 41-50 WHERE, IN 'ELBAT', TEXT FOR PARAMETERS OF THIS OMIT % DEFINE ARE STORED. OMIT % 41 POINTS TO PARAMETER 0, 50 TO PARAMETER 9. 0222 @O WRITECARD(006) IS 0223 LONG, NEXT SEGMENT 001 ******** PDP-11 ALGOL COMPILER, VERSION 6.6.019 3/5/76 PAGE 28 0467 SAVE PROCEDURE READCARD; 000702-P = READCARD 0467 BEGIN 0467 2 INTEGER I,N,P1; READCARD IS SEGMENT 010 ******** 030005-S = I 030006-S = N 030007-S = P1 0003 OWN INTEGER PREVBEGINCTR,EOF; 000706-P = PREVBEGINCTR 000707-P = EOF 0003 LABEL L1,EXIT; 0003 IF DEFLEVEL EQL 0 % GET NEXT CARD IMAGE 0007 THEN BEGIN % THIS COMMENT FAKES OUT THE SCANNER. 0012 3 L1: IF INCLUDETOG % READ FROM INCLUDE FILE 0012 THEN 0015 IF READ(INCLUDE,20,CARD) 0024 THEN BEGIN 0033 4 INCLUDE.OPEN:=INCLUDETOG:=FALSE; 0043 GO L1 0045 END 0045 4 ELSE 0045 ELSE 0045 IF READ(CARDIN,30,CARD) % CHECK FOR EOF 0056 THEN BEGIN 0065 4 LABEL L3; % FORCE NEW SEGMENT. 000710-P = B.0002 B.0002 IS SEGMENT 011 ******** 0000 ARRAY A[0:10]; % FOR FILE NAME; 030015-S = A 0011 IF IFP EQL "," % SEE IF ANOTHER FILE. 0015 THEN BEGIN % YEP. 0023 5 IFP:=*+1; % SKIP THE "," 0030 CLOSE(CARDIN); 0036 FILENAMESCAN(A);% SCAN THE FILE NAME. 0051 L3: REPLACE Q BY ".SRC" FOR 4*(1-REAL(EXTENSION)), 0064 A UNTIL EQL 0, 0 FOR 1; 0102 REPLACE CARDIN.TITLE BY STR; 0120 IF NOT CARDIN.PRESENT % IS FILE HERE? 0120 THEN BEGIN 0126 6 EXTENSION:=TRUE; % OTHER FILE SHOULD BE. 0131 GO L3 0142 END; 0142 6 GO L1 % TRY AGAIN 0156 END 0156 5 ELSE 0156 IF CARD[1]:=EOF+1 EQL 2 0171 THEN ERROR(121); % UNEXPECTED END OF INPUT 0200 P:=CARD; 0204 GO EXIT % DONT SET NEW CARD OR TOBEWRITTEN. 000714-P = GO TO SOLVER WORK CELL 0220 END; B.0002(011) IS 0231 LONG, NEXT SEGMENT 010 ******** 0076 4 LINECOUNT:=LINECOUNT+1; % ANOTHER LINE READ 0103 IF REAL(P:=CARD,1) EQL 3"14" % FORM ? 0112 THEN BEGIN % YES 0115 4 IF WRITEAFORM AND NOT (EOPTION OR NOLISTFILE) PDP-11 ALGOL COMPILER, VERSION 6.6.019 3/5/76 PAGE 29 0121 THEN BEGIN 0125 5 LNCT:=100; 0130 WRITEALINE(1) 0132 END; 0134 5 WRITEAFORM:=FORMOPTION AND LNCT NEQ 0 0137 AND NOT (EOPTION OR NOLISTFILE); 0150 GO TO L1 % IN EITHER CASE, FORMS GET IGNORED 0152 END; 0152 4 IF P EQL "@" AND NOT QUOTING % CONTROL CARD 0160 THEN BEGIN 0165 4 SETTOGGLES; % SCAN IT 0170 WRITECARD; % PRINT OUT THE CARD 0173 GO L1 % GET NEXT CARD 0176 END; 0176 4 IF OMITTOG % CARDS BEING OMITTED DON'T GET COMPILED 0176 THEN BEGIN % WRITE OUT THIS CARD. (EVEN THOUGH IT'S OMMITED) 0201 4 WRITECARD; 0204 GO L1 % GET NEXT CARD 0206 END 0206 4 ELSE TOBEWRITTEN:=TRUE 0211 END 0213 3 ELSE % READ CARD FROM DEFINES 0213 IF AMTLEFT EQL 0 % ALL DONE SCANNING THIS DEFINE 0217 THEN BEGIN % SO CLEAN UP AFTER IT AND GET PREVIOUS 0222 3 REPLACE P:=CARD BY POINTER(CARDEF[DEFLEVEL:=*-1,*]) FOR 72,0; 0264 AMTLEFT:=CARDEF[DEFLEVEL,29]; % AMOUNT LEFT TO EXPAND 0266 % NEXT DEFINE 0272 IF EXPANDIT % FROM ELBAT 0272 THEN ELBATI:=CARDEF[DEFLEVEL,51]; % RESET DEFINE TABLE POINTER 0303 EXPANDIT:=BOOLEAN(CARDEF[DEFLEVEL,40]); 0311 DEFINDEX:=CARDEF[DEFLEVEL,28]; % WHERE NEXT DEFINE LOCATED AT 0317 P:=*+CARDEF[DEFLEVEL,26]; 0327 SKIPSPACES % CLEAN UP AFTER OLD DEFINE 0330 END 0332 3 ELSE BEGIN % CONTINUE TO SCAN EXISTING DEFINE 0334 3 IF AMTLEFT LSS 0 % SET UP FOR 1ST TIME 0336 THEN AMTLEFT:= 0341 IF EXPANDIT 0341 THEN ELBAT[DEFINDEX] % FROM PARAMETER 0345 ELSE STACK[DEFINDEX]; 0360 IF I:=AMTLEFT GTR 70 % SEE IF GTR A FULL CARD IMAGE LEFT 0364 THEN I:=70; % IF SO THEN TAKE THE 1ST 70 CHARS 0370 % ONLY THE 1ST 70 COLS BECAUSE DONT WANT COL 73 TO BE 0370 % ANY THING BUT NULL. 0372 REPLACE P:=CARD BY IF EXPANDIT 0376 THEN POINTER(ELBAT[DEFINDEX+1]) 0415 ELSE POINTER(STACK[DEFINDEX+1]) FOR I, 0436 " " FOR REAL(I EQL AMTLEFT), % A SPACE ONLY ON THE LAST TIME. 0445 0 FOR 1; % AND THEN A NULL TO 0447 % FORCE CONTINUITY 0456 DEFINDEX:=*+I DIV 2; 0465 AMTLEFT:=AMTLEFT-I 0466 END; 0472 3 NEWCARD:=TRUE; 0475 EXIT: END; READCARD(010) IS 0502 LONG, NEXT SEGMENT 001 ******** PDP-11 ALGOL COMPILER, VERSION 6.6.019 3/5/76 PAGE 30 0471 2 SAVE PROCEDURE SKIPSPACES; 0471 BEGIN 0471 2 LABEL AGAIN; SKIPSPACES IS SEGMENT 012 ******** 0001 AGAIN: SCAN P:P WHILE IN SPACES; 0011 IF P IN TERMINATORS 0017 THEN BEGIN 0021 3 IF TOBEWRITTEN 0021 THEN WRITECARD; 0032 GO AGAIN 0035 END 0035 3 END; 0035 2 0035 SKIPSPACES(012) IS 0036 LONG, NEXT SEGMENT 001 ******** 0473 SAVE INTEGER PROCEDURE SCANNER; 000715-P = SCANNER 0473 BEGIN 0473 2 POINTER Q; SCANNER IS SEGMENT 013 ******** 030007-S = Q 0007 BOOLEAN B; 030010-S = B 0010 INTEGER T; 030011-S = T 0011 OWN BOOLEAN FIRSTTIME:=TRUE; 000721-P = FIRSTTIME 0011 LABEL IDENT,NUM,CHECK; 0011 IF FIRSTTIME OR STARTDEFINE 0014 THEN BEGIN 0020 3 SKIPSPACES; 0023 FIRSTTIME:=STARTDEFINE:=FALSE 0024 END; 0030 3 LASTCOL:=DELTA(CARD,P); 0043 IF NEWCARD 0043 THEN BEGIN 0046 3 NEWCARD:=FALSE; 0051 REPLACE STR BY CARD FOR 72 % IN CASE OF AN ERROR 0056 END; % AND SCAN AHEAD READS A NEW CARD 0060 3 IF TOBEWRITTEN % BECAUSE OF LOOK AHEAD 0060 THEN WRITECARD; 0066 Q:=POINTER(INSTR); 0072 T:=63; % MAXLENGTH 0075 IF P IN ALPHAONLY 0103 THEN BEGIN 0105 3 Q:=A+1; 0111 IDENT: REPLACE Q:Q BY P:P FOR T:T WHILE IN ALPHANUMERIC; 0132 B:=TOGGLE; 0135 IF REAL(P,1) EQL 0 % HIT END OF CARD ! 0142 THEN BEGIN % SO GET NEXT CARD! 0145 4 IF TOBEWRITTEN 0145 THEN WRITECARD; 0153 READCARD; 0156 GO IDENT 0162 END; 0162 4 REPLACE Q BY 0 FOR 1; % END OF SYMBOL INDICATOR PDP-11 ALGOL COMPILER, VERSION 6.6.019 3/5/76 PAGE 31 0175 A[0].[7:8]:=INSTR[0]:= 8"0"+LINSTR:=63-T; 0220 C:=SHR(LINSTR+2,1); 0227 SCANNER:=SKAN:=1; 0234 CHECK: 0234 IF B 0234 THEN BEGIN 0237 4 LABEL AGAIN; 000722-P = B.0003 B.0003 IS SEGMENT 014 ******** 0000 AGAIN: SCAN P:P WHILE IN ALPHA; 0010 IF REAL(P,1) EQL 0 0015 THEN BEGIN 0020 5 IF TOBEWRITTEN 0020 THEN WRITECARD; 0026 READCARD; 0031 GO AGAIN 0034 END 0034 5 END 0034 4 END B.0003(014) IS 0045 LONG, NEXT SEGMENT 013 ******** 0253 3 ELSE 0253 IF P IN NUMERIC % NUMBER ! 0263 THEN BEGIN 0265 3 NUM: REPLACE Q:Q BY P:P FOR T:T WHILE IN NUMERIC; 0306 B:=TOGGLE; 0311 IF REAL(P,1) EQL 0 % ON ANOTHER CARD ! 0316 THEN BEGIN 0321 4 IF TOBEWRITTEN 0321 THEN WRITECARD; 0327 READCARD; 0332 GO NUM 0335 END; 0335 4 LINSTR:=63-T; % LENGTH OF NUMBER 0342 SCANNER:=SKAN:=3; 0347 GO CHECK 0351 END 0351 3 ELSE BEGIN % SPECIAL CHAR 0353 3 INSTR[0]:=REAL(P,1); 0362 P:=*+LINSTR:=1; 0371 SCANNER:=SKAN:=3 0372 END; 0376 3 IF INSTR[0] NEQ """ 0402 THEN SKIPSPACES 0406 END OF SCANNER; PDP-11 ALGOL COMPILER, VERSION 6.6.019 3/5/76 PAGE 32 OMIT 2 @O OMIT % T H E S Y M B O L T A B L E OMIT % ===== =========== ========= OMIT % OMIT % OMIT % HASHING FUNCTION - (2*VALUE OF 1ST CHAR OF IDENTIFIER OMIT % PLUS LENGTH) MOD 64 OMIT % OMIT % THERE TWO HASH TABLES. OMIT % THE 1ST IS FOR THOSE WHO WANT SAUSAGE AND THE 2ND OMIT % IS FOR THOSE WHO WANT SCRAMBLED EGGS. OMIT % OMIT % THE 1ST TABLE (SAUSAGE) IS USED TO SEE IF THE IDENTIFIER IS A OMIT % RESERVED WORD. THIS IS USED TO SPEED UP TABLE SEARCH. OMIT % THE 2ND TABLE (SCRAMBLEDEGGS) IS USED FOR LOOKING UP ANY IDENTIFIERS OMIT % NOT FOUND IN THE RESERVED WORD TABLE. OMIT % OMIT % FIRST WE APPLY THE HASHING FUNCTION TO OUR IDENTIFIER. OMIT % THE VALUE RETURNED (HASH VALUE) IS AN INDEX INTO EITHER SCRAMBLEDEGGS OMIT % OR SAUSAGE. (IF SEARCH THRU SCRAMBLEDEGGS FAILS THEN USE SAUSAGE). OMIT % THE VALUE RETURNED FROM INDEXING (HASH POINTER) POINTS OMIT % (IF NOT ZERO) TO A RESERVED WORD OR IDENTIFIER BLOCK. OMIT % OMIT % THE 1ST WORD OF THE IDENTIFIER BLOCK IS A LINK (OR 0) TO NEXT OMIT % IDENTIFIER OR RESERVED WORD THAT HAD SAME HASH VALUE. OMIT % THE 2ND WORD OF IN EACH IDENTIFIER BLOCK IS THE TOKEN VALUE (CLASS) OMIT % OR POINTER TO A DATA BLOCK OF THE MOST RECENT DECLARATION OMIT % OF THAT IDENTIFIER (OR RESERVED WORD). OMIT % THE 3RD-4+(LENGTH OF IDENTIFIER DIV 2)TH WORDS OF THE IDENTIFIER OMIT % BLOCK IS THE IDENTIFIER IN SYMBOL TABLE FORMAT. OMIT % OMIT % SYMBOL TABLE FORMAT IS DEFINED TO BE THE OMIT % PRECONCATED TO THE IDENTIFIER. OMIT % OMIT % THE FOR IDENTIFIERS OF LENGTH LESS THAN 10 OMIT % IS THE CHARACTER ASSOCIATED WITH THAT NUMBER. OMIT % I.E. "1" FOR LENGTH OF 1, "9" FOR LENGTH OF NINE. OMIT % FOR IDENTIFIERS OF LENGTH LONGER THAN 9 THE OMIT % ASSOCIATED WITH THAT LENGTH IS 60(OCTAL) [OR "0"] PLUS OMIT % THE NUMERIC VALUE OF THE LENGTH. OMIT % I.E. FOR LENGTH 10 YOU GET ":", FOR LENGTH 17 YOU GET "A". OMIT % OMIT % OMIT % EXAMPLE OF IDENTIFIER BLOCK FOR THE RESERVED WORD 'BEGIN' OMIT % OMIT % (LINK OR 0) OMIT % BEGINV [TOKEN VALUE OR CLASS] OMIT % "5B" = "5"+256*"B" OMIT % "EG" = "E"+256*"G" OMIT % "IN" = "I"+256*"N" OMIT % OMIT % ***NOTE*** THAT STRINGS ARE STORED FROM BOTTOM OF WORD TO TOP OF WORD OMIT % VERY CONVIENT FOR PDP-11 AUTO INDEXING MODE. OMIT % OMIT % OMIT % IF THE TOKEN VALUE IN THE IDENTIFIER BLOCK IS A POINTER OMIT % (GREATER THAN MAXIMUM TOKEN VALUE [CLASSMAX]) PDP-11 ALGOL COMPILER, VERSION 6.6.019 3/5/76 PAGE 33 OMIT % THEN IT IS A POINTER TO A DATA BLOCK ON THAT IDENTIFIER OMIT % OMIT % THE 1ST WORD OF A DATA BLOCK CONTAINS THE CLASS TYPE OF THE MOST OMIT % RECENT DECLARATION OF THAT VARIABLE AND ITS EXTERNAL USAGE. OMIT % CURRENTLY THE USAGE FIELDS ARE AS FOLLOWS: OMIT % [ 7:8] - CLASS ( ONLY NEED THAT MANY BITS.) OMIT % [12:5] - UNUSED (ALWAYS SET TO ZERO). OMIT % [13:1] - EXTERNAL-LOCAL BIT. OMIT % [14:1] - EXTERNAL-DECLARATION BIT. OMIT % [15:1] - UNUSED (ALWAYS SET TO ZERO). OMIT % WHEN A BLOCK, PROCEDURE, OWN VARIABLE, OR WORK-CELL IS OMIT % ALLOCATED IN AN EXTERNAL PROCEDURE, IT GOES INTO THE SYMBOL OMIT % TABLE WITH THE PROPER CLASS AND THE 'EXTERNAL-LOCAL' BIT ON. OMIT % THIS IS TO INDICATE THAT THIS EXTERNAL IS OT TO BE CONSIDERED OMIT % AS A CANDIDATE FOR A MATCH IN THE HOST. RATHER, THIS ENTITY OMIT % MUST BE ADDED TO THE HOST PRT REGARDLESS. THE BINDER OMIT % UNDERSTANDS THIS. OMIT % WHEN AN EXTERNAL PROCEDURE IS DECLARED, THE 'EXTERNAL-DECLARATION' OMIT % BIT IS SET. THIS INDICATES TO THE BINDER THAT THE PROCEDURE OMIT % BY THIS EXTERNAL NAME IS DECARED IN THIS FILE. OMIT % THIS ALLOWS A PROCEDURE TO BIND IN A SECOND WHICH THEN BINDS OMIT % IN A THIRD ECT. OMIT % THE 2ND WORD OF A DATA BLOCK IS THE ADDRESS OF THAT PARTICULAR OMIT % DECLARATION. OMIT % THE 3RD WORD OF THAT BLOCK IS THE LEVEL OF THAT DECLARATION. OMIT % THE 4TH WORD IS A POINTER TO THE NEXT MOST RECENT DECLARATION OMIT % IN A PREVIOUS (OUTER) BLOCK. OMIT % OMIT % IN THIS WAY, IT IS NOT NECESSARY TO MAKE MULTIPLE COPIES OF THE OMIT % IDENTIFIER FOR DIFFERENT DECLARATIONS OF THE SAME IDENTIFIER. OMIT % OMIT % OMIT % EXAMPLE OF IDENTIFIER AND DATA BLOCKS FOR VALIABLE "I". OMIT % DECLARED IN LEVEL 3 AS A BOOLEAN OMIT % AND THEN REDECLARED IN A LEVEL 5 BLOCK AS A INTEGER OMIT % OMIT % HASH VALUE IS 2*VALUE(I)+1 = 2*9+1 = 19. OMIT % OMIT % SYMBOL TABLE FORMAT IS "1I". OMIT % OMIT % OMIT % SAUSAGE[19] ---> --+ OMIT % ! OMIT % V OMIT % ! OMIT % [LINK OR POINTER] <--- <--+ OMIT % [POINTER] ---> --+ OMIT % "1I" ! OMIT % . ! OMIT % . V OMIT % . ! OMIT % INTEGERV <--- <--+ OMIT % ADDRESS FOR THIS DECLARATION OMIT % LEVEL (I.E. 5) OMIT % [POINTER] ---> --+ OMIT % ! OMIT % V PDP-11 ALGOL COMPILER, VERSION 6.6.019 3/5/76 PAGE 34 OMIT % ! OMIT % BOOLEANV <--- <--+ OMIT % ADDRESS FOR THIS DECLARATION OMIT % LEVEL (I.E. 3) OMIT % [0] - GROUND OMIT % OMIT % OMIT % FOR LABELS, WORD 4 IS USED TO LINK INTO THE EDOC OMIT % ARRAY TO THE LAST BRANCH UNCONDITIONAL TO THAT LABEL. OMIT % THAT WORD THEN POINTS TO THE NEXT MOST RECENT BRANCH OMIT % UNTIL THE FIRST REFERENCE OF THAT LABEL, WHICH POINTS OMIT % TO 0. WHEN THE LABEL IS DECLARED, THE LINKS ARE UNDONE OMIT % AND BRUN'S ARE PUT IN THEIR PLACE. THIS WORD IS THEN OMIT % CLEARED TO INDICATE THAT THERE ARE NO OPEN BRANCHES. OMIT % THE 5TH WORD IS USED TO POINT INTO THE PRT. OMIT % IF A BRANCH OCCURS FROM AN INNER BLOCK TO AN OUTER OMIT % BLOCK AND AT COMPILATION OF THE BRANCH, WE DON'T OMIT % KNOW WHERE WE ARE GOING, THEN WHEN WE DO FIND OUT OMIT % WE PUT THE ANSWER INTO THE PRT. THIS WORD IS THE OMIT % INDEX INTO THE PRT THAT WE PUT THE ANSWER. OMIT % OMIT % FOR SWITCHES: WORD 4 CONTAINS THE NUMBER OF SWITCHES OMIT % IE. THE MAX INDEX ! OMIT % WORD 5 CONTAINS THE ADDRESS OF WHERE THE 1ST BRANCH OMIT % OF OUR SWITCH TABLE IS. EVERY BRANCH IS 2 WORDS (4 BYTES) OMIT % LONG. OMIT % OMIT % FOR ARRAYS: WORD 4 CONTAINS THE # OF DIMENSIONS OMIT % IF BIT #0 IS 0 THEN THE ARRAY IS 1-DIM. ELSE IT IS 2-DIM. OMIT % IF THE ARRAY IS A PARAMETER TO A PROCEDURE, OMIT % THEN IF BIT #1 IS ON THEN THE DOPE VECTOR (OF A 2-DIM ARRAY) OMIT % OR THE ARRAY ROW (OF 1 DIM ARRAYS) IS RE-MAPPED. OMIT % IF BIT #2 IS ON THEN THE ARRAY ROWS OF A 2-DIM OMIT % ARRAY ARE RE-MAPPED. OMIT % ELSE BITS #1 AND #2 WILL BE 0 OMIT % WORD 5 CONTAINS THE TYPE OF ARRAY (IE INTID OR BOOLID) OMIT % IF THE ARRAY IS A PARAMETER, THEN WORD 6 WILL CONTAIN OMIT % THE LOWER BOUND OF THE ARRAY ROW (DOPE VECTOR OF OMIT % A 2-DIM ARRAY) IF IT IS RE-MAPPED AND OMIT % WORD 7 WILL CONTAIN THE LOWER BOUND OF THE ARRAY ROW OMIT % OF A 2-DIM ARRAY IF IT IS RE-MAPPED OMIT % OMIT % FOR TRUTHSETS: WORDS 4-11 CONTAIN THE TRUTHSET OMIT % THIS IS SO THAT WE CAN AND AND OR THE TRUTHSETS TOGETHER OMIT % AT COMPILATION TIME OMIT % OMIT % FOR PROCS: THIS GETS COMPILCATED. OMIT % 3 CASES OMIT % CASE 1 - WE ARE INSIDE OF THE PROC BEING COMPILED OMIT % WORD 4 POINTS TO THE 9TH ENTRY (WORD 8) OMIT % OF THE 1ST PARAMETER. OMIT % WORD 0 OF THAT ENTRY IS A REGULAR IDENTIFIER ENTRY OMIT % WORD 8 IS 0 OR POINTS TO THE NEXT ENTRY. OMIT % OMIT % CASE 2 - WE ARE OUTSIDE OF THE PROCEDURE. OMIT % EACH PARAMETER WAS INTEGER AND BY VALUE. OMIT % THIS WORD CONTAINS THE # OF SUCH PARAMS. PDP-11 ALGOL COMPILER, VERSION 6.6.019 3/5/76 PAGE 35 OMIT % OMIT % CASE 3 - WE ARE OUTSIDE OF THE PROCEDURE BUT NOT EACH OMIT % PARAM WAS INTEGER AND VALUE. OMIT % THEN THIS WORD (WORD 4) POINTS TO A -1 OMIT % THE WORD AFTER THAT IS CODED AS FOLLOWS OMIT % BIT #15, IF ON, INDICATES THAT THIS PARAM (THE 1ST) OMIT % IS BY NAME. BITS #13:14 IS THE CLASS OF THE PARAM. OMIT % THE NEXT WORD IS FOR PARAM # 2. OMIT % ECT. UNTIL A 0 WORD IS REACHED. OMIT % OMIT % IF THERE ARE NO PARAMS THEN WORD 4 WILL CONTAIN A ZERO. OMIT % WORD #5 CONTIANS THE OFFSET USED BY ALL OF THE OMIT % PARAMETERS PUT TOGETHER IN THEIR PASSING. OMIT % IE. 2 PARAMS, ONE BY NAME AND ONE BY VALUE WILL USE OMIT % THREE WORDS. (TWO FOR THE ONE BY VALUE) OMIT % SO WORD 5 WOULD CONTAIN A 3 OMIT % PDP-11 ALGOL COMPILER, VERSION 6.6.019 3/5/76 PAGE 36 OMIT % D E F I N E I N V O C A T I O N S OMIT % =========== ===================== OMIT % OMIT % WHEN A DEFINED IDENTIFIER IS ENCOUNTERED AND WE ARE ALLOWED OMIT % TO EXPAND IT ('STOPDEFINE' IS FALSE), WE NEST THE CURRENT CARD OMIT % IMAGE, COLUMN INDICATOR, ECT. IN COLS 0-41 OF CARDEF[DEFLEVEL,*]. OMIT % IF THIS DEFINE HAS PARAMETERS, THEN THE DEFINED TEXT IS STORED OMIT % IN THE 'ELBAT' ARRAY IN THE SAME FASHION AS DEFINES ARE STORED OMIT % IN THE SYMBOL TABLE (# OR CHARACTERS FOLLOWED BY THE TEXT). OMIT % POINTERS INTO 'ELBAT' ARE STORED IN CARDEF FOR EACH PARAMETER OMIT % IN CARDEF[DEFLEVEL,41+PARAM-NUMBER] WHERE 0 IS THE FIRST PARAM. OMIT % HENCE THE ONLY WAY TO PASS THRU A 'FREE' ')',']',OR ',' IS TO OMIT % DEFINE SOME IDENTIFIER TO BE THAT ENTITY AND PASS THE DEFINED OMIT % IDENTIFIER THRU IN THE DEFINE. OMIT % OMIT % EXAMPLES : OMIT % OMIT % DEFINE ONE(A) = A]#, OMIT % TWO(A,B)= A,B]#, OMIT % A(A,B) = A[B#; OMIT % ARRAY A1[0:5],A2[0:5,0:5]; OMIT % A(A1,5]):=1; OMIT % A[A1,ONE(5)]:=1; OMIT % A(A2,TWO[5,5]):=1; OMIT % OMIT % OMIT % WHEN A PARAMETER FROM A DEFINE IS ENCOUNTERED, IT IS EXPANDED OMIT % IMMEDIATELY. PARAMETERS ARE MARKED BY 'DEFINEDEC' TO BE OMIT % 3"177" FOLLOWED BY "0"+PARAMNUMBER (0 TO 9). OMIT % 0410 @O PDP-11 ALGOL COMPILER, VERSION 6.6.019 3/5/76 PAGE 37 SCANNER(013) IS 0411 LONG, NEXT SEGMENT 001 ******** 0475 SAVE PROCEDURE GETNEXT; 000726-P = GETNEXT 0475 BEGIN 0475 2 INTEGER I,X,T,S,PNO; GETNEXT IS SEGMENT 015 ******** 030005-S = I 030006-S = X 030007-S = T 030010-S = S 030011-S = PNO 0003 BOOLEAN B; 030012-S = B 0003 LABEL START,L1,L2,L3,L4,IDENT,ROSE,EXIT,DEF; 0003 RESERVED:=BOOLEAN(INFO:=0); % RESET RESERVED WORD INDICATOR 0012 START: IF T:=SCANNER = 1 THEN 0024 BEGIN 0024 3 IF B:= 0024 T:=SAUSAGE[S:=REAL(BOOLEAN(LINSTR+SHR(A[0],8)*2) AND BOOLEAN(63))] 0041 NEQ 0 0046 THEN GO IDENT; 0055 L1: IF T:=SCRAMBLEDEGGS[S] = 0 0063 THEN BEGIN CLASS:=0; GO EXIT; END; 0073 IDENT: IF POINTER(STACK[T+2]) NEQ POINTER(A) FOR C*2 0113 THEN GO ROSE; 0122 RESERVED:=B; % SET RESERVED TOG TO WHAT IT 0122 % SHOULD BE 0125 IF CLASS:=STACK[T+2] < CLASSMAX THEN 0140 BEGIN 0140 4 IF CLASS NEQ COMMENTV 0141 THEN GO EXIT; 0147 WHILE NEXTCHAR NEQ ";" DO; 0161 SKIPSPACES; 0164 GO TO START; 0166 END; 0166 4 % EXTERNAL TOG IN UPPER BYTE ! (FROM PROCDEC) 0166 CLASS:=REAL(BOOLEAN(STACK[INFO:=CLASS]) AND BOOLEAN(3"377")); 0177 IF CLASS = DEFINEID THEN 0204 IF NOT STOPDEFINE THEN 0207 BEGIN 0207 4 CARDEF[DEFLEVEL,40]:=REAL(EXPANDIT); % SAVE WHERE CURNT 1 IS 0214 CARDEF[DEFLEVEL,28]:=DEFINDEX; % WHERE TO EXPAND THIS ONE FROM 0221 DEFINDEX:=INFO+4; % POINT TO LENGTH OF DEFINE 0226 IF PNO:=STACK[INFO+2] NEQ 0 % # OF PARAMS IN DECLARATION 0236 THEN BEGIN 0241 5 INTEGER ARRAY NESTS[0:25]; % FOR NESTING PARENS & THINGS 000732-P = B.0004 B.0004 IS SEGMENT 016 ******** 030020-S = NESTS 0011 BOOLEAN DONE,INQUOTE,LASTWASASPACE; 030022-S = DONE 030023-S = INQUOTE 030024-S = LASTWASASPACE 0013 INTEGER B,COUNT,QCOUNT,NESTLEVEL,I,PARAMNO,TEMPI,T; 030025-S = B 030026-S = COUNT 030027-S = QCOUNT PDP-11 ALGOL COMPILER, VERSION 6.6.019 3/5/76 PAGE 38 030030-S = NESTLEVEL 030031-S = I 030032-S = PARAMNO 030033-S = TEMPI 030034-S = T 0013 DEFINE ENDBKT = (T EQL "[" AND I EQL "]" OR 0013 T EQL "(" AND I EQL ")") #; 0013 CARDEF[DEFLEVEL,51]:=ELBATI; % SO WE KNOW WHERE TO CUT BACK TO 0022 I:=SCANNER; % SEE WHAT WE GOTS 0030 IF T:=INSTR[0] NEQ "(" AND T NEQ "["% SEE IF WE GOT A '(' 0041 THEN BEGIN 0045 6 ERROR(100); % # OF PARAMS DONT MATCH THE DEF 0051 GO START 0065 END; 0065 6 DO BEGIN 0065 6 CARDEF[DEFLEVEL,41+PARAMNO]:=TEMPI:=ELBATI; 0076 DONE:=BOOLEAN(COUNT:=0); % INITIALIZE EACH TIME THRU LOOP 0103 WHILE NOT DONE 0103 DO BEGIN % SCAN THE PARAMETERS 0106 7 I:=NEXTCHAR; % GET NEXT CHARACTER 0114 IF INQUOTE % IF IN NESTED QUOTES 0114 THEN 0117 IF QCOUNT:=QCOUNT+2 GEQ 2 AND I EQL """ 0130 THEN INQUOTE:=FALSE 0135 ELSE 0137 ELSE BEGIN 0141 8 IF LASTWASASPACE 0141 THEN 0144 WHILE I EQL " " 0146 DO I:=NEXTCHAR; % SCAN OUT MULTIPLE SPACES 0162 LASTWASASPACE:=I EQL " "; % SET INDICATOR FOR NEXT TIME 0167 IF I EQL """ 0171 THEN BEGIN 0174 9 INQUOTE:=TRUE; 0177 QCOUNT:=0 0200 END; 0202 9 IF (ENDBKT OR I EQL ",") AND NESTLEVEL EQL 0 0227 THEN DONE:=TRUE % NON-NESTED ',' OR CLOSE BRACKET 0234 ELSE 0236 IF I EQL "[" OR I EQL "(" 0245 THEN NESTS[NESTLEVEL+1]:=I % UN-NESTED THING 0256 ELSE 0261 IF NESTLEVEL NEQ 0 % WE ARE NESTED 0265 THEN NESTLEVEL:=*-REAL( % SO SEE IF WE CAN 0271 I EQL "]" AND NESTS[NESTLEVEL] EQL "[" OR 0302 I EQL ")" AND NESTS[NESTLEVEL] EQL "(") 0314 END; 0317 8 IF NOT DONE % SEE IF TO ADD TO THE DEFINE TABLE 0317 THEN 0322 IF BOOLEAN(COUNT:=COUNT+1) 0327 THEN B:=I % NOT YET, SAVE 0331 ELSE 0334 IF ELBATI+1 LEQ STACKSIZE 0341 THEN ELBAT[ELBATI:=ELBATI+1]:=B+256*I 0354 ELSE ERROR(101); % DEFINE TABLE OVERFLOW 0367 END; 0371 7 IF BOOLEAN(COUNT) % SEE IF A LEFT OVER PDP-11 ALGOL COMPILER, VERSION 6.6.019 3/5/76 PAGE 39 0372 THEN IT WAS NECESSARY TO REDUCE THE SIZE OF THE LISTING FILE TO MAKE IT FIT ON A SINGLE DEC-TAPE. THIS WAS ONE OF THE PAGES THAT VOLUNTEERED TO GO. PDP-11 ALGOL COMPILER, VERSION 6.6.019 3/5/76 PAGE 40 0534 ELSE 0537 IF T = "<" 0543 THEN CLASS:=LEQOP 0546 ELSE 0551 IF T = "?" OR T = "^" 0560 THEN CLASS:=NEQOP; 0567 IF T = "!" AND X = "!" 0574 THEN CLASS:=AMPER 0600 ELSE 0603 IF T = "*" AND X = "*" 0612 THEN CLASS:=EXPOP 0616 ELSE 0621 IF T EQL "@" 0625 THEN 0630 IF X EQL "#" 0632 THEN CLASS:=ATPOUNDV 0635 ELSE BEGIN 0642 4 CLASS:=ATSIGN; 0645 GO EXIT 0647 END; 0647 4 IF T EQL "<" AND X EQL ">" 0654 THEN CLASS:=NEQOP; 0663 IF CLASS = 0 0665 THEN GO TO L4; 0672 P:=*+1; 0677 SKIPSPACES; 0702 REPLACE INSTR+1 BY X FOR 1; 0715 LINSTR:=2; 0720 GO EXIT; 0723 L4: IF T:=REAL(BOOLEAN(T) AND BOOLEAN(63))-27 < 0 OR T > 36 0736 THEN BEGIN 0742 4 FLAG(78); 0746 GO START 0750 END; 0750 4 CLASS:=SPECIAL[T]; 0755 GO EXIT 0757 END; 0757 3 L2: CLASS:=ICONSTANT; 0762 INREAL:=0; % INITIALIZE VALUE OF INTEGER CONS 0765 IF P EQL """ AND LINSTR LEQ 2 0775 AND (IF POINTER(INSTR) EQL "0" 1001 THEN FALSE % AVOID /0 1010 ELSE 8 MOD (I:=REAL(POINTER(INSTR),1)-"0") EQL 0 OR I EQL 3) 1034 AND (IF LINSTR EQL 2 1037 THEN REAL(POINTER(INSTR)+1,1) EQL "0" 1047 ELSE TRUE) 1053 THEN BEGIN % QUOTED STRING CONSTANT 1056 3 INTEGER MAX,TEMP:=LINSTR; % FORCE NEW SEGMENT ! 000736-P = B.0005 B.0005 IS SEGMENT 017 ******** 030015-S = MAX 030016-S = TEMP 0002 LABEL IERR; 0002 NEXTCHAR; % SCAN THE '"' 0011 S:=-1; 0015 IF TEMP EQL 2 0017 THEN BEGIN % LEFT JUSTIFY PDP-11 ALGOL COMPILER, VERSION 6.6.019 3/5/76 PAGE 41 IT WAS NECESSARY TO REDUCE THE SIZE OF THE LISTING FILE TO MAKE IT FIT ON A SINGLE DEC-TAPE. THIS WAS ONE OF THE PAGES THAT VOLUNTEERED TO GO. PDP-11 ALGOL COMPILER, VERSION 6.6.019 3/5/76 PAGE 42 1113 ELSE INREAL:=INTEGER(INSTR,LINSTR); 1126 EXIT: STOPDEFINE:=FALSE 1127 END; GETNEXT(015) IS 1135 LONG, NEXT SEGMENT 001 ******** PDP-11 ALGOL COMPILER, VERSION 6.6.019 3/5/76 PAGE 43 0477 2 PROCEDURE GETATTRIBUTE; 000743-P = GETATTRIBUTE 0477 BEGIN 0477 2 INTEGER I; GETATTRIBUTE IS SEGMENT 020 ******** 030005-S = I 0002 BOOLEAN DONE; 030006-S = DONE 0003 GETNEXT; % GET NEXT TOKEN 0010 IF RESERVED OR SKAN NEQ 1 % SEE IF COULD BE ATTRIBUTE 0013 THEN % NO, 0017 ELSE % YES 0017 DO 0017 IF DONE:=POINTER(ATTRIBUTEDHASH[I+2]) EQL A FOR MIN(C,120-I)*2 0052 THEN CLASS:=ATTRIBUTEDHASH[I+1] % GET REAL CLASS 0064 UNTIL I:=ATTRIBUTEDHASH[I] EQL 0 OR DONE 0077 END OF GETTING CONTEXT SENSITIVE RESERVED WORDS (CLASS 3,F); GETATTRIBUTE(020) IS 0104 LONG, NEXT SEGMENT 001 ******** PDP-11 ALGOL COMPILER, VERSION 6.6.019 3/5/76 PAGE 44 0477 2 PROCEDURE FLAG(X); 0477 VALUE X; 0477 INTEGER X; 0477 BEGIN 0477 2 BOOLEAN T,B; FLAG IS SEGMENT 021 ******** 030005-S = T 030006-S = B 0003 INTEGER I,J1,K; 030007-S = I 030010-S = J1 030011-S = K 0003 POINTER Q,R; 030014-S = Q 030017-S = R 0017 INTEGER ARRAY AB[0:35]; 030023-S = AB 0030 IF ERRORTOG 0032 THEN BEGIN 0035 3 IF ERRORCOUNT:=ERRORCOUNT+1>99 0043 THEN X:=93; 0051 T:=EOPTION; 0054 EOPTION:=FALSE; 0057 IF B:=NOLISTFILE 0057 THEN BEGIN 0064 4 NOLISTFILE:=FALSE; 0067 IF NOT LINE.OPEN 0067 THEN LINE.KIND:=VALUE(KB) 0102 END; 0106 4 IF NOHEADING 0106 THEN DAYTIME; 0114 IF T OR DEFLEVEL NEQ 0 0117 THEN BEGIN 0123 4 IF J1:=DEFLEVEL = 0 0127 THEN % CLEAN CARD - NO 0132 REPLACE LINEOUT BY O4(L)," ",POINTER(CARD) FOR 72 0151 ELSE 0153 WHILE J1 GTR 0 0157 DO BEGIN 0162 5 REPLACE LINEOUT BY "DEFINED TO BE "; 0171 WRITEALINE(7); 0175 REPLACE R:LINEOUT BY " " FOR 8; 0205 Q:=POINTER(CARDEF[J1-1,*]); 0227 THRU 72 0230 DO BEGIN 030025-S = THRU CLAUSE WORK CELL 0236 6 IF REAL(Q,1) EQL 3"177" 0243 THEN REPLACE R:R BY "?" 0251 ELSE REPLACE R:R BY Q FOR 1; 0270 Q:=*+1 0272 END; 0302 6 IF J1:=J1-1 GTR 0 0310 THEN WRITEALINE(40) 0315 END; 0343 5 WRITEALINE(40) 0345 END; 0347 4 IF B PDP-11 ALGOL COMPILER, VERSION 6.6.019 3/5/76 PAGE 45 0347 THEN BEGIN 0352 4 REPLACE LINEOUT BY O4(L)," ",STR FOR 72; 0373 WRITEALINE(40) 0375 END; 0377 4 R:=STR; 0403 THRU LASTCOL 0403 DO I:= 030026-S = THRU CLAUSE WORK CELL 0412 IF R:R EQL " " 0415 THEN I DIV 8 * 8 + 8 0431 ELSE I+1; 0453 REPLACE LINEOUT BY " " FOR I+8, 0464 IF SKAN EQL 1 % WHERE IS LAST TOKEN? 0466 THEN A+1 % IN THE A ARRAY! 0473 ELSE INSTR FOR LINSTR," "; 0511 WRITEALINE((I+9+LINSTR) DIV 2); 0523 READ(ERRORF[X-1],26,AB); 0537 REPLACE LINEOUT BY "*" FOR 8,POINTER(AB) FOR 72; 0553 WRITEALINE(40); 0557 EOPTION:=T; 0562 NOLISTFILE:=B 0562 END; 0565 3 IF X = 93 OR X = 91 OR X = 101 OR X = 82 OR X = 121 OR X EQL 122 0612 THEN BEGIN 0616 3 J:=DA; % FOR EXIT ROUTINE (IF CRUNCHED FILES) 0621 GO EOJ 000747-P = GO TO SOLVER WORK CELL 0626 END 0626 3 END; 0626 2 0626 FLAG(021) IS 0635 LONG, NEXT SEGMENT 001 ******** 0477 PROCEDURE ERROR(X); 0477 VALUE X; 0477 INTEGER X; 0477 BEGIN 0477 2 LABEL NOTYET; ERROR IS SEGMENT 022 ******** 0001 FLAG(X); 0007 ERRORTOG:=FALSE; 0012 NOTYET: IF CLASS = BEGINV THEN STMT; 0022 IF CLASS NEQ ENDV AND CLASS NEQ SEMICOLON 0026 THEN BEGIN 0033 3 STOPDEFINE:=TRUE; 0036 GETNEXT; 0041 GO NOTYET 0043 END 0043 3 END ERROR; PDP-11 ALGOL COMPILER, VERSION 6.6.019 3/5/76 PAGE 46 0043 2 % 0043 % THIS SECTION CONTAINS THE EMITTERS 0043 % 0043 % THEY PRODUCE CODE AND DEBUGGING OUTPUT 0043 % ERROR(022) IS 0044 LONG, NEXT SEGMENT 001 ******** 0477 SAVE PROCEDURE EMITC (COD); 000750-P = EMITC 0477 VALUE COD; 0477 INTEGER COD; 0477 IF L LSS 2048 EMITC IS SEGMENT 023 ******** 0005 THEN BEGIN % SEG NOT TOO BIG YET ! 0010 2 EDOC[L]:=COD; 0014 L:=L + 1 0016 END 0021 2 ELSE BEGIN 0023 2 FLAG (66); % SEG TOO BIG 0027 L:=0 0030 END; 0032 2 EMITC(023) IS 0033 LONG, NEXT SEGMENT 001 ******** 0501 SAVE PROCEDURE EMITL (LITERAL); 000754-P = EMITL 0501 VALUE LITERAL; 0501 INTEGER LITERAL; 0501 BEGIN 0501 2 EMITC(J:=SHL(LITERAL,2)); EMITL IS SEGMENT 024 ******** 0013 IF DEBUGTOG 0013 THEN BEGIN 0016 3 REPLACE LINEOUT BY " " FOR 18,O6(L-1)," LITC ",O6(LITERAL), 0046 " ",O6(J); 0060 WRITEALINE(23) 0062 END 0064 3 END OF EMITL; 0064 2 EMITL(024) IS 0076 LONG, NEXT SEGMENT 001 ******** 0503 SAVE PROCEDURE EMIT(OPERATOR); 000760-P = EMIT 0503 VALUE OPERATOR; 0503 INTEGER OPERATOR; 0503 BEGIN 0503 2 EMITC(J:=SHL(OPERATOR,2)+1285); % 1281 IS BASE FOR OPS EMIT IS SEGMENT 025 ******** 0015 IF DEBUGTOG 0015 THEN BEGIN 0020 3 REPLACE LINEOUT BY " " FOR 18,O6(L-1)," ", 0043 POINTER(OP[OPERATOR*2]) FOR 4," " FOR 10,O6(J); 0074 WRITEALINE(23) 0076 END 0100 3 END OF EMIT; 0100 2 EMIT(025) IS 0110 LONG, NEXT SEGMENT 001 ******** 0505 PROCEDURE EMITO(ADDRESS); 000764-P = EMITO 0505 VALUE ADDRESS; PDP-11 ALGOL COMPILER, VERSION 6.6.019 3/5/76 PAGE 47 0505 INTEGER ADDRESS; 0505 BEGIN 0505 2 EMITC(J:=SHL(ADDRESS,2)+2); EMITO IS SEGMENT 026 ******** 0015 IF DEBUGTOG 0015 THEN BEGIN 0020 3 REPLACE LINEOUT BY " " FOR 18,O6(L-1)," VALC ", 0043 O6(ADDRESS)," ",O6(J); 0062 WRITEALINE(22) 0064 END 0066 3 END OF EMITO; 0066 2 EMITO(026) IS 0100 LONG, NEXT SEGMENT 001 ******** 0505 PROCEDURE EMITD(ADDRESS); 000770-P = EMITD 0505 VALUE ADDRESS; 0505 INTEGER ADDRESS; 0505 BEGIN 0505 2 EMITC(J:=SHL(ADDRESS,2)+2); EMITD IS SEGMENT 027 ******** 0015 IF DEBUGTOG 0015 THEN BEGIN 0020 3 REPLACE LINEOUT BY " " FOR 18,O6(L-1)," NAMC ", 0043 O6(ADDRESS)," ",O6(J); 0062 WRITEALINE(23) 0064 END 0066 3 END; 0066 2 EMITD(027) IS 0100 LONG, NEXT SEGMENT 001 ******** 0505 SAVE PROCEDURE EMITB(BRANCH,FROM,TOO); 000774-P = EMITB 0505 VALUE BRANCH,FROM,TOO; 0505 INTEGER BRANCH,FROM,TOO; 0505 BEGIN 0505 2 INTEGER TL:=L; EMITB IS SEGMENT 030 ******** 030005-S = TL 0011 EMITL(TOO+2); 0021 EMIT(BRANCH); 0025 L:=TL; 0030 END OF EMITB; EMITB(030) IS 0031 LONG, NEXT SEGMENT 001 ******** PDP-11 ALGOL COMPILER, VERSION 6.6.019 3/5/76 PAGE 48 0507 2 PROCEDURE EMITNUM(X); 001000-P = EMITNUM 0507 VALUE X; 0507 INTEGER X; 0507 IF X GEQ 0 AND X LSS 16384 EMITNUM IS SEGMENT 031 ******** 0010 THEN EMITL(X) 0016 ELSE 0020 IF CLEAN GEQ 2040 0024 THEN BEGIN 0027 2 FLAG(79); 0033 END 0033 2 ELSE BEGIN 0035 2 CONST[CLEAN:=CLEAN+1]:=L; 0045 CONST[CLEAN:=CLEAN+1]:=0; 0055 CONST[CLEAN:=CLEAN+1]:=X; 0067 END; 0072 2 EMITNUM(031) IS 0074 LONG, NEXT SEGMENT 001 ******** 0507 SAVE PROCEDURE EMITPAIR(LITERAL,OPERATOR); 001004-P = EMITPAIR 0507 VALUE LITERAL,OPERATOR; 0507 INTEGER LITERAL,OPERATOR; 0507 BEGIN 0507 2 EMITNUM(LITERAL); EMITPAIR IS SEGMENT 032 ******** 0007 EMIT(OPERATOR); 0013 END OF EMITPAIR; 0013 2 EMITPAIR(032) IS 0014 LONG, NEXT SEGMENT 001 ******** 0511 BOOLEAN PROCEDURE INLEVEL(INFO,ACTUALLEVEL); % GET LEVEL OF PROC OF DECL 001010-P = INLEVEL 0511 VALUE INFO; 0511 INTEGER INFO,ACTUALLEVEL; 0511 BEGIN 0511 2 INTEGER I:=LEVEL-1,J:=STACK[INFO+2]-1; INLEVEL IS SEGMENT 033 ******** 030005-S = I 030006-S = J 0013 INLEVEL:=TRUE; 0020 IF ACTUALLEVEL:=J+1 NEQ LEVEL AND STACK[INFO+1] GTR 3"4000" 0035 THEN BEGIN % MAY NOT BE IN SAME BLOCK 0041 3 DO % SEE IF IN SAME PROC 0041 IF ADRSR[2*I:=I-1] EQL 0 % IF GOING THRU PROC BLOCK 0053 THEN INLEVEL:=* AND ADRS NEQ PROADDRESS AND I EQL J 0064 UNTIL I EQL J; 0076 INLEVEL:=* AND ADRS NEQ PROADDRESS 0100 END 0105 3 END; INLEVEL(033) IS 0106 LONG, NEXT SEGMENT 001 ******** PDP-11 ALGOL COMPILER, VERSION 6.6.019 3/5/76 PAGE 49 0511 2 PROCEDURE EMITPROCAORV(INFO,AORV); % EMIT ADDRESS OR VALUE OF PROC ID 001014-P = EMITPROCAORV 0511 VALUE INFO,AORV; 0511 INTEGER INFO; 0511 BOOLEAN AORV; 0511 BEGIN 0511 2 INTEGER J,NEWLEVEL:=STACK[INFO+2]+1,OFFSET:=STACK[INFO+5], EMITPROCAORV IS SEGMENT 034 ******** 030005-S = J 030006-S = NEWLEVEL 030007-S = OFFSET 0016 K:=STACK[INFO+1]; 030010-S = K 0023 STACK[INFO+1]:=3"33000"; % FUDGE FOR INLEVEL ! 0033 IF LEVEL LSS NEWLEVEL % REF TO FUNCTION IN BLOCK OF DECLARATION 0034 THEN FLAG(54); % AS DECLARED AT. NOT ALLOWED. 0044 STACK[INFO+2]:=NEWLEVEL; % RAISE PROC TO LEVEL OF ITS PARAMS 0052 IF INLEVEL(INFO,J) % FUNCTION IN THIS BLOCK? 0056 THEN 0062 IF AORV % SEE IF WANT ADDRESS OR VALUE 0062 THEN EMITD(3"33004"+OFFSET) % WANT ADDRESS 0071 ELSE EMITO(3"34004"+OFFSET) % WANT VALUE 0101 ELSE BEGIN % NOT ON SAME LEVEL SO SEARCH RCW'S UNTIL 0105 3 EMITNUM(2*OFFSET+8);% OFFSET TO FUNCTION FROM RCW 0115 EMITL(J); % LEVEL OF RCW 0121 EMIT(FIND); % DO A STACK SEARCH TO FIND IT 0125 IF NOT AORV % SEE IF REALLY WANT THE VALUE 0125 THEN EMIT(LOD) % YES SO LOAD VALUE! 0132 END; 0134 3 STACK[INFO+2]:=NEWLEVEL-1; % PUT PROC BACK TO IT'S LEVEL 0144 STACK[INFO+1]:=K % GET ORIGIONAL ADDRESS BACK ! 0147 END OF GETTING THE ADDRESS OR VALUE OF A PROC; EMITPROCAORV(034) IS 0153 LONG, NEXT SEGMENT 001 ******** PDP-11 ALGOL COMPILER, VERSION 6.6.019 3/5/76 PAGE 50 0511 2 SAVE PROCEDURE EMITADDRESS(INDEX,OFFSET); 001020-P = EMITADDRESS 0511 VALUE INDEX,OFFSET; 0511 INTEGER INDEX,OFFSET; 0511 BEGIN 0511 2 INTEGER I1:=STACK[INDEX+1],I2:=STACK[INDEX+2],I3:=STACK[INDEX+3]; EMITADDRESS IS SEGMENT 035 ******** 030005-S = I1 030006-S = I2 030007-S = I3 0020 LABEL L1; 0020 J:=I1+(IF I1 LSS 3"100" OR I1 GEQ 3"44000" 0030 THEN OFFSET ELSE -OFFSET); 0044 IF I2 EQL 1 OR I2 EQL LEVEL 0050 THEN 0055 L1: IF I3 GEQ 0 % NOT A PROC NAME PARAM 0057 THEN 0062 IF DEBUGTOG % DOES HE HAVE CODE SET ? 0062 THEN EMITD(J) % YES. LET EMITD HANDLE IT 0067 ELSE EMITC(SHL(J,2)+2) % OTHERWISE WE CAN HANDLE IT 0101 ELSE % PROC NAME PARAM! 0103 IF DEBUGTOG 0105 THEN EMITO(J) % FOR CODE THAT'S SET 0112 ELSE EMITC(SHL(J,2)+3) 0124 ELSE BEGIN 0130 3 IF INLEVEL(INDEX,I2) % SEE IF IN PROC DECLARATION WAS IN 0134 THEN GO L1; 0142 EMITNUM((4*I1.[11:1]-2)*I1.[10:11]); % OFFSET FROM RCW 0162 EMITL(I2); % LEVEL RCW FOUND AT 0166 EMIT(FIND); % FIND ADDRESS 0172 IF I3 LSS 0 % NAME TOG 0174 THEN EMIT(LOD); 0203 IF OFFSET NEQ 0 % OFFSET FROM HERE? 0205 THEN EMITPAIR(2*OFFSET,ADD) % YES 0215 END 0217 3 END OF EMITADDRESS; EMITADDRESS(035) IS 0220 LONG, NEXT SEGMENT 001 ******** PDP-11 ALGOL COMPILER, VERSION 6.6.019 3/5/76 PAGE 51 0513 2 PROCEDURE EMITVALUE(INDEX,OFFSET); 001024-P = EMITVALUE 0513 VALUE INDEX,OFFSET; 0513 INTEGER INDEX,OFFSET; 0513 BEGIN 0513 2 INTEGER I1:=STACK[INDEX+1],I2:=STACK[INDEX+2],I3:=STACK[INDEX+3]; EMITVALUE IS SEGMENT 036 ******** 030005-S = I1 030006-S = I2 030007-S = I3 0020 LABEL L1; 0020 J:=I1+(IF I1 LSS 3"100" OR I1 GEQ 3"44000" 0030 THEN OFFSET ELSE -OFFSET); 0044 IF I2 EQL 1 OR I2 EQL LEVEL % IN SAME PROC DECLARED IN 0050 THEN BEGIN 0055 3 L1: IF DEBUGTOG 0055 THEN EMITO(J) 0062 ELSE EMITC(SHL(J,2)+4); 0076 IF STACK[INDEX] NEQ ARRAYID AND I3 LSS 0 0105 THEN EMIT(LOD) % LB'S OF ARRAYS PASSED BY VALUE ! 0113 END 0115 3 ELSE BEGIN 0117 3 IF INLEVEL(INDEX,I2) % IN SAME PROC AS DECLARATION ? 0123 THEN GO L1; 0131 EMITADDRESS(INDEX,OFFSET); 0136 EMIT(LOD) % LOAD VALUE 0140 END 0142 3 END; EMITVALUE(036) IS 0143 LONG, NEXT SEGMENT 001 ******** PDP-11 ALGOL COMPILER, VERSION 6.6.019 3/5/76 PAGE 52 0513 2 INTEGER PROCEDURE GETSPACE(X); 001030-P = GETSPACE 0513 VALUE X; 0513 INTEGER X; 0513 BEGIN 0513 2 INTEGER C,I; GETSPACE IS SEGMENT 037 ******** 030005-S = C 0001 % LENGTH TO ALLOCATE 0001 % 8 FOR TRUTHSETS 0001 % 5 FOR FILE DESCRIPTORS 0001 % 4 FOR PROGRAM SEGMENTS OR ARRAY ID'S 0001 % 3 FOR POINTERS 0001 % 2 FOR REALS 0001 % 1 FOR BOOLEANS OR INTEGERS 030006-S = I 0003 I:=REAL(CLASSF=ARRAYID OR 0010 CLASSF GEQ PROCID AND CLASSF LEQ INTPROCID)*3 0021 + REAL(CLASSF EQL REALID) 0025 + REAL(CLASSF EQL STRINGID)*2 0032 + REAL(CLASSF EQL FILEID)*4 0040 + REAL(CLASSF EQL TRUTHID)*7+1; 0054 IF BOOLEAN(X) OR EXTERNALTOG 0055 THEN 0061 IF C:=PRTMAX:=PRTMAX + 1 > 8192-I 0071 THEN FLAG(PRTMAX:=C:=57) 0104 ELSE 0106 ELSE 0106 IF C:=STACKCTR:=STACKCTR+I GEQ 14330 0120 THEN FLAG(STACKCTR:=C:=58); 0133 IF PRTTOG 0133 THEN BEGIN 0136 3 REPLACE LINEOUT BY " ",O6(C),"-", 0157 IF BOOLEAN(X) 0160 THEN 0160 IF FUNCTION 0162 THEN "X" 0165 ELSE "P" 0177 ELSE "S", 0211 " = ",PS FOR 33 WORDS; 0223 WRITEALINE(40) 0225 END; 0227 3 GETSPACE:=C; % RETURN VALUE 0232 IF BOOLEAN(X) OR EXTERNALTOG % IN PRT ? 0233 THEN PRTMAX:=PRTMAX+I-1 % GET TRUE LENGTH OF PRT THEN ! 0243 END; 0246 2 GETSPACE(037) IS 0255 LONG, NEXT SEGMENT 001 ******** 0513 PROCEDURE CLEANIT; 001034-P = CLEANIT 0513 BEGIN 0513 2 BOOLEAN STRING; CLEANIT IS SEGMENT 040 ******** 030005-S = STRING 0002 INTEGER C,LOLD,B:=L,T:=1; 030006-S = C 030007-S = LOLD PDP-11 ALGOL COMPILER, VERSION 6.6.019 3/5/76 PAGE 53 030010-S = B 030011-S = T 0006 IF EXTERNALCODE % DO WE NEED THIS FOR THE BINDER? 0010 THEN BUMPL; % YEP. BETTER PUT IT IN. 0020 WHILE T LEQ CLEAN 0021 DO BEGIN 0025 3 LOLD:=L; 0030 L:=CONST[T]; 0035 IF STRING:=C:=CONST[T:=T+1] NEQ 0 0047 THEN EMITD(LOLD-L+3"1777") 0062 ELSE EMITO(LOLD-L+3"1777"); 0076 L:=LOLD; 0101 C:=T + C+ REAL(C EQL 0); 0112 WHILE T:=T+1 LEQ C 0117 DO BEGIN 0123 4 EMITC(CONST[T]); 0131 IF DEBUGTOG 0131 THEN BEGIN 0134 5 REPLACE LINEOUT BY " " FOR 18,O6(L-1)," " FOR 16, 0157 O6(CONST[T])," " FOR 6,CONST[T]; 0206 WRITEALINE(23+REAL(STRING)*4) 0214 END 0216 5 END 0216 4 END; 0231 3 IF EXTERNALCODE 0231 THEN BEGIN 0234 3 LOLD:=L; % PUT STUFF FOR BINDER HERE. 0237 L:=B; 0242 EMITD(-1); % MARK CONSTANT FOR BINDER 0247 EMITC(LOLD-L); % NUMBER OF CONSTANTS (PLUS ONE) 0255 IF DEBUGTOG 0255 THEN BEGIN 0260 4 REPLACE LINEOUT BY " " FOR 18,O6(L-1)," " FOR 16, 0303 O6(LOLD-L); 0312 WRITEALINE(23) 0314 END; 0316 4 L:=LOLD 0316 END OF BINDER STUFF; 0321 3 CLEAN:=0 0322 END; CLEANIT(040) IS 0331 LONG, NEXT SEGMENT 001 ******** PDP-11 ALGOL COMPILER, VERSION 6.6.019 3/5/76 PAGE 54 0513 2 PROCEDURE SATBLDR(ADDRESS,DA); 001040-P = SATBLDR 0513 VALUE ADDRESS,DA; 0513 INTEGER ADDRESS,DA; 0513 BEGIN 0513 2 OWN INTEGER PLLB; SATBLDR IS SEGMENT 041 ******** 001044-P = PLLB 0001 PRTA[PLLB+1]:=PLLB:=ADDRESS; 0013 IF PLL = 0 0015 THEN PLL:=ADDRESS; 0023 PRTA[ADDRESS]:=L/2; 0027 PRTA[ADDRESS+2]:=DA; 0035 PRTA[ADDRESS+3]:=SGNO; 0043 IF DEBUGTOG 0043 THEN BEGIN 0046 3 REPLACE LINEOUT BY " " FOR 17,O6(ADDRESS)," ",O6(L), 0074 " ",O6(DA)," ",O6(SGNO)," "; 0125 WRITEALINE(24) 0127 END 0131 3 END; 0131 2 SATBLDR(041) IS 0144 LONG, NEXT SEGMENT 001 ******** 0513 PROCEDURE QUOTE; 001045-P = QUOTE 0513 BEGIN 0513 2 LABEL EXIT,L1; QUOTE IS SEGMENT 042 ******** 0001 INTEGER J,T; 030005-S = J 030006-S = T 0003 CONST[CLEAN:=CLEAN+1]:=L; 0015 T:=CLEAN:=CLEAN+LENGTH:=1; 0026 CONST[CLEAN:=CLEAN+1]:=NEXTCHAR; 0041 WHILE J:=NEXTCHAR NEQ """ 0050 DO BEGIN 0053 3 L1: IF BOOLEAN(LENGTH) 0054 THEN CONST[CLEAN].[15:8]:=J 0063 ELSE 0070 IF CLEAN:=CLEAN + 1 GTR 2040 0100 THEN BEGIN 0103 4 CLEAN:=0; 0106 ERROR(79); 0112 GO EXIT 0114 END 0114 4 ELSE CONST[CLEAN]:=J; 0122 LENGTH:=LENGTH+1 0124 END; 0131 3 SKIPSPACES; % CHECK FOR "STRING" "STRING" 0134 GETNEXT; % IN CASE OF DEFINES 0137 IF CLASS EQL QUOTEOP 0140 THEN BEGIN % THAT'S WHAT WE HAVE! 0144 3 J:=NEXTCHAR; % SCAN TO THE CHAR AFTER 0152 GO L1 0154 END; 0154 3 CONST[T]:=SHR(LENGTH+1,1); 0164 L:=L +1; PDP-11 ALGOL COMPILER, VERSION 6.6.019 3/5/76 PAGE 55 0171 EXIT: END; QUOTE(042) IS 0172 LONG, NEXT SEGMENT 001 ******** PDP-11 ALGOL COMPILER, VERSION 6.6.019 3/5/76 PAGE 56 0513 2 INTEGER PROCEDURE NEXTCHAR; 0513 BEGIN 0513 2 IF QUOTING:=REAL(P,1) EQL 0 NEXTCHAR IS SEGMENT 043 ******** 0010 THEN BEGIN 0015 3 IF TOBEWRITTEN 0015 THEN WRITECARD; 0023 READCARD; % GET NEXT CARD 0026 REPLACE STR BY CARD FOR REAL(NEWCARD:=BOOLEAN(72)); 0037 IF TOBEWRITTEN % ONLY WRITE CARD OUT IF 0037 THEN WRITECARD % NOT A DEFINE EXPANSION 0043 END; 0045 3 INSTR[REAL(QUOTING:=FALSE)]:=NEXTCHAR:=REAL(P,LINSTR:=1); 0062 LASTCOL:=DELTA(CARD,P); 0077 END; NEXTCHAR(043) IS 0104 LONG, NEXT SEGMENT 001 ******** PDP-11 ALGOL COMPILER, VERSION 6.6.019 3/5/76 PAGE 57 0513 2 PROCEDURE GETROW(MUSTBEFACTOP); % LOOKS AT SUBSCRIPTED ARRAY NAME 001051-P = GETROW 0513 VALUE MUSTBEFACTOP; % AND GENERATES THE CODE TO ALLOCATE 0513 BOOLEAN MUSTBEFACTOP; % THE DOPE VECTORS IF NEED BE LEAVING 0513 % A ARRAY ROW DESCRIPTOR ON TOS 0513 BEGIN 0513 2 LABEL EXIT; GETROW IS SEGMENT 044 ******** 0001 BOOLEAN INDEXED,B; 030005-S = INDEXED 030006-S = B 0003 INTEGER T,I:=INFO,RC:=STACK[4+I]; 030007-S = T 030010-S = I 030011-S = RC 0011 IF CLASS NEQ ARRAYID% IF NOT ARRAY ID THER ERROR 0014 THEN BEGIN 0020 3 FLAG(71); % IMPROPER ROW DESIGNATOR 0024 GO EXIT 0026 END; 0026 3 GETNEXT; % SCAN THE ARRAY NAME 0031 IF CLASS NEQ LFTBRKT AND BOOLEAN(RC) % SHOULD BE A '[' 0035 THEN BEGIN 0040 3 FLAG(75); % MISSING '[' IN ROW DESIGNATOR 0044 GO EXIT 0046 END; 0046 3 IF INDEXED:=CLASS EQL LFTBRKT % HAVE A '[' 0047 THEN GETNEXT; % AND WANT TO SKIP OVER IT 0060 IF BOOLEAN(RC) % NOW FOR SOME TRICKORY 0061 THEN BEGIN % AND KLUDGING 0063 3 AEXP; 0066 IF STACK[I+2] LSS 0 % IS ARRAY A PARAMETER? 0074 THEN BEGIN % YES. 0077 4 IF BOOLEAN(SHR(RC,1)) % IS DV RE-MAPPED? 0102 THEN % YES! 0104 IF T:=STACK[I+5] NEQ 0 % CAN WE OPTIMIZE 0114 THEN EMITPAIR(T,SUB) % NO 0122 ELSE % YES 0124 ELSE BEGIN % GET LOWER BOUND FROM PARAM LIST 0126 5 EMITVALUE(I,1); % GET IT 0133 EMIT(SUB) % SUBTRACT FROM INDEX 0135 END; 0137 5 EMITADDRESS(I,0); % GET ACTUAL LB FROM DESCRIPTOR 0151 EMIT(LOD); % AND HERE'S THE VALUE 0155 EMIT(ADD); % ADD TO INDEX 0161 EMITADDRESS(I,0); % GET ADDRESS OF DESCRIPTOR 0166 EMITPAIR(4,ADD); % GET ADDRESS OF ADDRESS OF DV 0173 EMIT(LOD) % LOAD ADDRESS OF DV 0175 END 0177 4 ELSE EMITVALUE(I,1); % OTHERWISE GET ADDRESS FROM DESCRIPTOR 0206 EMITPAIR(8,ADD); % POINT TO IT 0213 EMIT(LOD); % LOAD VALUE 0217 EMITL(0); % FUDGE FOR ADC 0223 EMITADDRESS(I,0); 0230 EMIT(ADC); % CHECK INDEXING 0234 EMIT(XCH); % GET OUR FUDGE FACTOR ON TOS! PDP-11 ALGOL COMPILER, VERSION 6.6.019 3/5/76 PAGE 58 IT WAS NECESSARY TO REDUCE THE SIZE OF THE LISTING FILE TO MAKE IT FIT ON A SINGLE DEC-TAPE. THIS WAS ONE OF THE PAGES THAT VOLUNTEERED TO GO. PDP-11 ALGOL COMPILER, VERSION 6.6.019 3/5/76 PAGE 60 0513 2 PROCEDURE ACTUALPARAPART(BOOL); 001055-P = ACTUALPARAPART 0513 VALUE BOOL; 0513 BOOLEAN BOOL; 0513 BEGIN 0513 2 BOOLEAN B,N; ACTUALPARAPART IS SEGMENT 045 ******** 030005-S = B 030006-S = N 0003 INTEGER A,C,P,AT:=INFO,T:=STACK[4+AT]; 030007-S = A 030010-S = C 030011-S = P 030012-S = AT 030013-S = T 0011 LABEL EXIT; 0011 T:=STACK[4+AT:=INFO]; % POINTER TO PARAM LIST 0024 EMIT(MKS); 0030 IF BOOL 0030 THEN GETNEXT; % POSSIBLE GETNEXT DONE BY VARIABLE 0036 IF T NEQ 0 % WE HAVE PARAMS 0040 THEN BEGIN 0043 3 IF CLASS NEQ LFTPAREN 0044 THEN BEGIN % NO '(' 0050 4 ERROR(31); 0054 GO EXIT 0056 END; 0056 4 IF T < CLASSMAX % ALL INTEGER BY VALUE 0057 THEN BEGIN 0063 4 GETNEXT; % SCAN THE '(' OR THE ',' 0066 AEXP; % GET VALUE 0071 WHILE T:=T - 2 GTR 0 0077 DO BEGIN 0102 5 IF CLASS NEQ COMMA % NOT FOLLOWED BY A COMMA 0103 THEN BEGIN 0107 6 ERROR(46); 0113 GO EXIT 0115 END; 0115 6 GETNEXT; % SCAN THE ',' 0120 AEXP; 0123 END 0123 5 END 0125 4 ELSE BEGIN % PARAMETER LIST 0127 4 IF B:=STACK[T] = -1 % LIST IS PACKED 0133 THEN T:=T+1; 0146 DO BEGIN 0146 5 GETNEXT; % GET TO START OF NEXT PARAM 0151 IF B 0151 THEN BEGIN % PACKED LIST 0154 6 C:=STACK[T].[13:14];% CLASS OF NEXT PARAM 0164 N:=STACK[T] < 0 ; % NAME 0173 END 0173 6 ELSE BEGIN % POINTER FROM DECLARATION TO LIST 0175 6 C:=STACK[T-8]; % CLASS 0204 N:=STACK[T-5] < 0; % NAME 0215 END; 0215 6 IF N PDP-11 ALGOL COMPILER, VERSION 6.6.019 3/5/76 PAGE 61 IT WAS NECESSARY TO REDUCE THE SIZE OF THE LISTING FILE TO MAKE IT FIT ON A SINGLE DEC-TAPE. THIS WAS ONE OF THE PAGES THAT VOLUNTEERED TO GO. PDP-11 ALGOL COMPILER, VERSION 6.6.019 3/5/76 PAGE 62 0312 8 EMITPAIR(2,ADD); 0317 EMIT(LOD); 0323 EMITPAIR(8,ADD) 0326 END 0330 8 ELSE EMITPAIR(6,ADD); % GET ADDRESS OF LB 0337 EMIT(LOD); % LOAD LB 0343 EMIT(XCH) % PUT STACK IN PROPER ORDER 0345 END; 0347 7 IF BOOLEAN(P) % ARRAY GOING INTO 2-DIM 0350 THEN BEGIN 0352 7 GETNEXT; % SEE IF FOLLOWED BY '[' 0355 T1:=0; 0360 IF CLASS EQL LFTBRKT % YES 0361 THEN BEGIN 0365 8 DO BEGIN 0365 9 GETNEXT; % SCAN THE '[' OR ',' 0370 IF B1:=CLASS NEQ FACTOP % TO GET A '*' 0371 THEN FLAG(76)% '*' EXPECTED 0401 ELSE BEGIN 040510 GETNEXT; % SCAN THE '*' 0410 IF B1:=CLASS NEQ 0411 IF BOOLEAN(T1) 0412 THEN RTBRKT % CHECK FOR ']' 0412 ELSE COMMA % OR ',' 0415 THEN FLAG( % ERROR 0426 IF BOOLEAN(T1) 0427 THEN 77 % ']' EXPECTED 0432 ELSE 37) % ',' EXPECTED 0435 END 043710 END 0437 9 UNTIL B1 OR T1+1 EQL 2; 0452 IF B1 % THERE WAS AN ERROR 0452 THEN GO EXIT 001065-P = GO TO SOLVER WORK CELL 0471 ELSE GETNEXT 0472 END; 0474 8 EMITADDRESS(A1,0) 0477 END 0501 7 END 0501 6 ELSE BEGIN % NOT ARRAY B.0006(046) IS 0512 LONG, NEXT SEGMENT 045 ******** 0263 6 IF CLASS GEQ PROCID AND CLASS LEQ INTPROCID 0267 THEN % TYPE IS PROC 0274 IF STACK[INFO+4] NEQ 0 % > 1 PARAM. NO GO IN THE SNOW 0302 THEN FLAG(44); 0311 EMITADDRESS(INFO,0); % PUT OUT THE ADDRESS 0316 GETNEXT % SCAN THE ID 0317 END 0321 6 ELSE % VALUE 0321 IF C EQL BOOID % BOOLEAN VALUE 0324 THEN BEXP 0331 ELSE 0333 IF C EQL INTID % INTEGER VALUE 0336 THEN AEXP 0343 ELSE BEGIN % POINTER VALUE 0347 6 EMITL(0); % FOR POINTER LINK! 0351 % FILLED IN BY PROC ENTRY ! PDP-11 ALGOL COMPILER, VERSION 6.6.019 3/5/76 PAGE 63 0353 PEXP; % GET EXPRESSION 0356 EMIT(XCH) % REVERSE FOR PROPER ORDER 0360 END 0362 6 END 0362 5 UNTIL P:=IF B 0362 THEN T:=STACK[T] 0372 ELSE STACK[T:=T+1] 0377 EQL 0 OR CLASS NEQ COMMA; 0415 IF P NEQ 0 0417 THEN BEGIN 0422 5 ERROR(46); 0426 GO EXIT 0430 END 0430 5 END; 0430 4 IF CLASS NEQ RTPAREN % NOT FOLLOWED BY ')' 0431 THEN BEGIN 0435 4 ERROR(32); 0441 GO EXIT 0443 END; 0443 4 GETNEXT 0444 END 0446 3 ELSE 0446 IF STACK[AT+2] EQL 0 % MUST BE TOGGLE 0456 THEN BEGIN 0461 3 L:=*-2; % GET RID OF MKS & LITC 0 0466 EMITO(STACK[AT+1]); % GET IT'S ADDRESS 0476 GO EXIT 0500 END; 0500 3 IF T:=STACK[AT+1] LSS 0 % MAKE ADDRESS POS IF FORWARD REF 0510 THEN STACK[AT+1]:=-T; 0522 EMITADDRESS(AT,0); % ADDRESS OF PROCEDURE DESCRIPTOR MAY BE 0525 % IN STACK (IN PARAM LIST) 0527 STACK[AT+1]:=T; % PUT BACK TO WHAT IT SHOULD BE 0535 EMIT(SBR); % SUBROUTINE ENTRANCE 0541 EXIT: END; ACTUALPARAPART(045) IS 0542 LONG, NEXT SEGMENT 001 ******** PDP-11 ALGOL COMPILER, VERSION 6.6.019 3/5/76 PAGE 64 0513 2 PROCEDURE POLISHIT;; 001066-P = POLISHIT POLISHIT IS SEGMENT 047 ******** POLISHIT(047) IS 0004 LONG, NEXT SEGMENT 001 ******** 0513 PROCEDURE VARIABLE(FROM); 001072-P = VARIABLE 0513 VALUE FROM; 0513 INTEGER FROM; 0513 BEGIN 0513 2 INTEGER A:=ADDRESS,PT:=INFO,T:=CLASS,C,T2; VARIABLE IS SEGMENT 050 ******** 030005-S = A 030006-S = PT 030007-S = T 030010-S = C 030011-S = T2 0006 BOOLEAN BOOL,B:=T EQL BOOPROCID OR T EQL INTPROCID; 030012-S = BOOL 030013-S = B 0015 LABEL EXIT,L1,L2; 0015 IF CLASS EQL POLISHV OR B 0022 THEN BEGIN 0026 3 DEFINE RUNFASTER=#; 001076-P = B.0007 B.0007 IS SEGMENT 051 ******** 0000 IF NOT B % POLISH 0002 THEN BEGIN 0005 4 GETNEXT; 0010 IF CLASS EQL ASSIGNOP 0011 THEN BEGIN 0015 5 GETNEXT; % SCAN THE ':=' 0020 EXPRESS % ALLOW POLISH TO BE GENERIC 0020 END 0025 5 ELSE 0025 IF FROM EQL FS 0030 THEN 0034 IF CLASS EQL LFTPAREN 0035 THEN POLISHIT 0042 ELSE FLAG(67); % ":=" EXPECTED 0052 GO EXIT 001102-P = GO TO SOLVER WORK CELL 0066 END; 0066 4 GETNEXT; % FIND OUT WHAT TO DO 0071 IF CLASS EQL ASSIGNOP OR CLASS EQL DOTOP % ASSIGNMENT 0075 THEN BEGIN 0102 4 INFO:=PT; 0105 IF T EQL BOOPROCID 0106 THEN T:=BOOID 0112 ELSE T:=INTID; 0122 BOOL:=TRUE 0123 END 0125 4 ELSE BEGIN 0127 4 INFO:=PT; 0132 ADDRESS:=A; 0135 EMITL(0); 0141 ACTUALPARAPART(FALSE); 0145 IF FROM EQL FS PDP-11 ALGOL COMPILER, VERSION 6.6.019 3/5/76 PAGE 65 IT WAS NECESSARY TO REDUCE THE SIZE OF THE LISTING FILE TO MAKE IT FIT ON A SINGLE DEC-TAPE. THIS WAS ONE OF THE PAGES THAT VOLUNTEERED TO GO. PDP-11 ALGOL COMPILER, VERSION 6.6.019 3/5/76 PAGE 66 0300 EMIT(ADD) % ADD TO INDEX 0302 END 0304 5 END; 0304 4 IF CLASS NEQ RTBRKT % SEE IF FOLLOWED BY A ']' 0305 THEN BEGIN 0311 4 ERROR(41); % MISSING ']' 0315 GO EXIT 0331 END 0331 4 END; B.0008(052) IS 0342 LONG, NEXT SEGMENT 050 ******** 0055 3 L1: IF NOT BOOL 0055 THEN GETNEXT; % DELAY GETNEXT IF TYPED-PROC ID 0063 IF CLASS = DOTOP AND FROM = FS AND T NEQ STRINGID 0073 THEN BEGIN % PARTIAL WORD ASSIGNMENT 0100 3 DEFINE SEG=#; % FORCE A SEG CAUSE NOT OFTEN USED 001107-P = B.0009 B.0009 IS SEGMENT 053 ******** 0000 GETNEXT; 0005 IF CLASS NEQ LFTBRKT % SEE IF A '[' 0006 THEN BEGIN 0012 4 ERROR(40); % NO 0016 GO EXIT % GIVE UP 0032 END; 0032 4 GETNEXT; % SCAN IT 0035 AEXP; % GET LEFT-BIT-TO 0040 IF T = ARRAYID % FOR ARRAYS, SHOVE LEFT-BIT-TO UNDER INDICIES 0041 THEN EMIT(IF BOOLEAN(C) THEN RSUP ELSE XCH); 0057 IF CLASS NEQ COLON % FOLLOWED BY A ':'? 0060 THEN BEGIN 0064 4 ERROR(36); % NO 0070 GO EXIT % NO HOPE FOR THIS GUY 0104 END; 0104 4 GETNEXT; % SCAN THE ':' 0107 AEXP; % GET # OF BITS 0112 IF T EQL ARRAYID % FOR ARRAYS MOVE # OF BITS UNDER INDICIES 0113 THEN EMIT(IF BOOLEAN(C) THEN RSUP ELSE XCH); 0131 IF CLASS NEQ RTBRKT % FOLLOWED BY A ']' 0132 THEN BEGIN 0136 4 ERROR(41); % NO 0142 GO EXIT 0156 END; 0156 4 GETNEXT; % SCAN THE ']' 0161 IF CLASS NEQ ASSIGNOP % FOLLOWED BY AN ASSIGNMENT? 0162 THEN BEGIN % BETTER BE! 0166 4 ERROR(67); % ERROR! 0172 GO EXIT 0206 END; 0206 4 GETNEXT; % SCAN IT 0211 IF T EQL BOOID OR (T EQL ARRAYID AND STACK[PT+5] EQL BOOID) 0227 THEN BEXP 0233 ELSE AEXP; 0242 IF BOOL % SEE IF OPERATING ON FUNCTION 0242 THEN EMITPROCAORV(PT,TRUE) % GET ADDRESS OF PROC 0250 ELSE EMITADDRESS(PT,0); % OTHERWISE PUT OUT JUST THE ADDR 0261 IF T = ARRAYID % FOR ARRAYS DO ARRAY DESCRIPTOR CALL 0262 THEN EMIT(ADC); % TO FIGURE WHERE WE GOING PDP-11 ALGOL COMPILER, VERSION 6.6.019 3/5/76 PAGE 67 IT WAS NECESSARY TO REDUCE THE SIZE OF THE LISTING FILE TO MAKE IT FIT ON A SINGLE DEC-TAPE. THIS WAS ONE OF THE PAGES THAT VOLUNTEERED TO GO. PDP-11 ALGOL COMPILER, VERSION 6.6.019 3/5/76 PAGE 68 0273 IF STACK[PT+3] LSS 0 % BY NAME ? 0301 THEN BEGIN % YES 0304 6 EMITADDRESS(PT,1); % GET ADDRESS OF POINTER 0311 EMITPAIR(2,ADD); % GET ADDRESS OF WORD 2 0316 EMIT(LOD) % LOAD VALUE 0320 END 0322 6 ELSE EMITVALUE(PT,1) % ONLY CHANGING THE INDEX 0327 END; 0331 5 L2: PEXP; % POINTER EXPRESSION (PRIMARY SET) 0334 PTRPRIM:=FALSE % THEN RESET 0335 END 0337 4 ELSE AEXP; 0344 IF BOOL 0344 THEN EMITPROCAORV(PT,TRUE) % GET ADDRESS OF PROC NAME 0352 ELSE 0354 IF STACK[PT+3] LSS 0 % BY NAME ? 0364 THEN BEGIN 0367 4 EMITADDRESS(PT,1); % GET ADDRESS OF 1ST WORD 0374 IF B AND T EQL STRINGID % WANT 2ND WORD ? 0376 THEN EMITPAIR(2,ADD) % IF SO THEN THIS WILL DO IT 0406 END 0410 4 ELSE EMITADDRESS(PT,REAL(B AND T EQL STRINGID));% FOR POINTER OPTIM 0423 BOOL:=FROM EQL FP; % FROM PRIMARY 0430 IF T EQL ARRAYID % FIGURE OUT THE KIND OF STORE WE WANT 0431 THEN EMIT(IF BOOL THEN ASN ELSE ASD) 0445 ELSE 0447 IF T EQL STRINGID AND NOT B % POINTER STORES 0454 THEN EMIT(IF BOOL THEN PSTN ELSE PSTD) 0471 ELSE EMIT(IF BOOL THEN STN ELSE STD) % A GROCIERY STORE ! 0505 END 0507 3 ELSE 0507 IF FROM EQL FP % FROM PRIMARY 0512 THEN BEGIN 0516 3 IF T EQL ARRAYID % NEED ADDRESS FOR ARRAY'S 0517 THEN BEGIN 0523 4 EMITADDRESS(PT,1); % GET ADDRESS 0530 EMIT(AOC) % AND GET VALUE 0532 END 0534 4 ELSE BEGIN 0536 4 IF BOOL % PROC VALUE ? 0536 THEN EMITPROCAORV(PT,FALSE) % GET VALUE 0544 ELSE EMITVALUE(PT,1); % FROM ONE OR THE OTHER 0555 IF PTRPRIM:=T EQL STRINGID 0556 THEN 0564 IF STACK[PT+3] LSS 0 % BY NAME ? 0572 THEN BEGIN % YES 0575 5 EMITADDRESS(PT,1); % GET ADDRESS OF WORD 1 0602 EMITPAIR(2,ADD); % GET ADDRESS OF WORD 2 0607 EMIT(LOD) 0611 END 0613 5 ELSE EMITVALUE(PT,1) % ELSE GET INDEX FROM POINTER 0620 END 0622 4 END 0622 3 ELSE ERROR(67); % ASSIGNMENT OP EXPECTED 0630 EXIT: END OF VARIABLE; VARIABLE(050) IS 0631 LONG, NEXT SEGMENT 001 ******** PDP-11 ALGOL COMPILER, VERSION 6.6.019 3/5/76 PAGE 69 0513 2 PROCEDURE CONCAT(X); % HANDLES CONCATANATIONS 001117-P = CONCAT 0513 VALUE X; 0513 BOOLEAN X; 0513 BEGIN 0513 2 LABEL EXIT; CONCAT IS SEGMENT 055 ******** 0001 DO BEGIN % AS LONG AS WE'RE CONCATING 0003 3 GETNEXT; % SCAN THE '&' 0006 IF CLASS EQL LFTPAREN % '(AE)' 0007 THEN % SEE WHO HANDLES THIS ONE 0013 IF X % BOOPRIM 0013 THEN BOOPRIM 0016 ELSE PRIMARY % OR PRIMARY 0026 ELSE 0030 IF X % WAS A BOOLEAN CONCAT 0032 THEN BEGIN % ONLY CAN BE '()' 0035 4 ERROR(31); % '(' EXPECTED 0041 GO EXIT 0043 END 0043 4 ELSE % PRIMARILY FROM PRIMARY 0043 IF CLASS EQL INTID OR CLASS EQL INTPROCID OR 0054 CLASS EQL ARRAYID AND STACK[INFO+5] EQL INTID 0064 THEN VARIABLE(FP) % FROM PRIMARY 0074 ELSE BEGIN % ERROR 0100 4 FLAG(116); % MUST BE ID OR '(AE)' 0104 GO EXIT 0106 END; 0106 4 IF CLASS NEQ LFTBRKT% CONCAT WITH LEFT BRAKET 0107 THEN FLAG(40) % '[' EXPECTED 0115 ELSE BEGIN 0121 4 GETNEXT; % SCAN THE '[' 0124 AEXP; % GET LEFT-MOST BIT TO # 0127 IF CLASS NEQ COLON% SHOULD BE FOLLOWED BY A ':' 0130 THEN FLAG(36) % ':' EXPECTED 0136 ELSE BEGIN 0142 5 GETNEXT; % SCAN THE ':' 0145 AEXP; % GET # OF BITS OR FROM-BIT # 0150 IF CLASS EQL RTBRKT % # OF BITS 0151 THEN BEGIN 0155 6 EMIT(FISD); % FIELD ISOLATE DYNAMIC 0161 GETNEXT % SCAN THE ']' 0162 END 0164 6 ELSE 0164 IF CLASS NEQ COLON % ':' THERE? 0167 THEN FLAG(41) % NO. ']' EXPECTED 0175 ELSE BEGIN 0201 6 GETNEXT; % SCAN IT 0204 AEXP; % GET # OF BITS 0207 IF CLASS NEQ RTBRKT % FOLLOWED BY A ']' ? 0210 THEN FLAG(41)% NO. ']' EXPECTED 0216 ELSE GETNEXT;% SCAN IT 0225 EMIT(FISO) % FIELD ISOLATE 0227 END 0231 6 END 0231 5 END 0231 4 END PDP-11 ALGOL COMPILER, VERSION 6.6.019 3/5/76 PAGE 70 0231 3 UNTIL CLASS NEQ AMPER; % SCAN ALL THE CONCATS AT ONCE 0236 EXIT: END OF CONCATENATION; 0236 2 0236 CONCAT(055) IS 0237 LONG, NEXT SEGMENT 001 ******** 0513 PROCEDURE DOT; 001123-P = DOT 0513 BEGIN 0513 2 LABEL EXIT; DOT IS SEGMENT 056 ******** 0001 GETNEXT; % SEE IF OPEN BRACKET 0006 IF CLASS NEQ LFTBRKT THEN 0013 BEGIN ERROR(40); GO EXIT; END; 0021 GETNEXT; % SCAN IT ! 0024 AEXP; % GET LEFT BIT FROM 0027 IF CLASS NEQ COLON THEN BEGIN ERROR(36); GO EXIT END; GETNEXT; 0045 AEXP; % GET NUMBER OF BITS 0050 EMIT(PART); % GET PARTIAL VALUE 0054 IF CLASS NEQ RTBRKT THEN ERROR(41) ELSE GETNEXT; 0072 EXIT: END; DOT(056) IS 0073 LONG, NEXT SEGMENT 001 ******** PDP-11 ALGOL COMPILER, VERSION 6.6.019 3/5/76 PAGE 71 0513 2 BOOLEAN PROCEDURE EACHCASE(X); 001127-P = EACHCASE 0513 % X =-1 DESIGNATIONAL EXPRESSION (GO TO) 0513 % 0 QUOTED STRING EXPRESSION 0513 % 1 ARITHMETIC EXPRESSION 0513 % 2 POINTER EXPRESSION 0513 % 3 BOOLEAN EXPRESSION 0513 % 4 POINTER, STRING, OR ARITHMETIC (REPLACE STMT) 0513 % 5 POINTER OR ARITHMETIC (PRIMARY - REAL FUNCTION) 0513 % 6 POINTER,ARITHMETIC OR BOOLEAN (BOOPRIM - BOOLEAN()) 0513 % 7 POINTER OR QUOTED STRING (BOOPTRPRIM) 0513 INTEGER X; 0513 BEGIN 0513 2 LABEL L1,L2; EACHCASE IS SEGMENT 057 ******** 0001 BOOLEAN B; 030005-S = B 0002 INTEGER I:=ERRORCOUNT; % USED TO SEE IF ANY ARROWS 030006-S = I 0003 IF X LEQ 3 % ALREADY KNOW WHAT TO DO 0010 THEN 0013 CASE X+1 OF 0021 BEGIN 0022 3 BEGIN % DESIGNATIONAL EXPRESSION 0022 4 ACTIONTOG:=TRUE; 0025 GOSTMT 0026 END; 0030 4 BEGIN % STRING EXPRESSION 0032 4 IF CLASS EQL CASEV OR CLASS EQL IFV 0036 THEN CASEORIF(X) % PASS THE BUCK. 0045 ELSE 0047 IF CLASS NEQ QUOTEOP 0052 THEN FLAG(118) % STRING EXPECTED 0060 ELSE BEGIN 0064 5 QUOTE; % GET STRING 0067 EMITL(LENGTH) % AND IT'S LENGTH 0071 END 0073 5 END; 0073 4 AEXP; % ARITHMETIC EXPECTED 0100 PEXP; % POINTER 0105 BEXP % BOOLEAN 0110 END 0114 3 ELSE 0121 IF CLASS EQL IFV OR B:=CLASS EQL CASEV 0127 THEN BEGIN % LET CASEORIF HANDLE IT 0136 3 CASEORIF(X); 0142 IF B THEN GO L1 0147 END 0147 3 ELSE % JUST A REGULAR CASE. 0147 IF CLASS EQL LFTPAREN % '(' 0152 THEN BEGIN 0156 3 GETNEXT; % STRIP THE ')' 0161 EACHCASE:=EACHCASE(X); % NOW SEE WHAT IT IS 0170 IF CLASS NEQ RTPAREN % NOT FOLLOWED BY A ')' 0171 THEN FLAG(32) 0177 ELSE GETNEXT; 0206 L1: IF X GEQ 1 AND X LEQ 3 PDP-11 ALGOL COMPILER, VERSION 6.6.019 3/5/76 PAGE 72 0215 THEN % MAKE EXPRESSIONS ! IT WAS NECESSARY TO REDUCE THE SIZE OF THE LISTING FILE TO MAKE IT FIT ON A SINGLE DEC-TAPE. THIS WAS ONE OF THE PAGES THAT VOLUNTEERED TO GO. PDP-11 ALGOL COMPILER, VERSION 6.6.019 3/5/76 PAGE 73 0524 THEN EMIT(LOR) 0530 ELSE ERROR(35) 0536 END 0540 5 END 0544 4 END 0550 3 ELSE 0550 IF CLASS EQL STRINGID OR CLASS EQL POINTERV % POINTER CASE 0556 OR CLASS EQL ARRAYID AND REAL(P,4) NEQ "[" 0571 OR CLASS NEQ QUOTEOP AND X EQL 7 % 7 IS SE OR PE 0602 THEN BEGIN % SO TRY A POINTER EXPRESSION 0607 3 X:=2; % SET TO POINTER; 0612 PEXP; 0615 IF CLASS GEQ NEQOP AND CLASS LEQ LEQOP OR CLASS EQL INV 0625 THEN BEGIN % WOOPS! REALLY A BOOLEAN! 0632 4 BOOPTRPRIM(FALSE); % POINTER ALREADY SCANNED! 0636 X:=3 % INDICATE BOOLEAN! 0637 END 0641 4 END 0641 3 ELSE 0641 IF CLASS EQL QUOTEOP AND X EQL 4 % QUOTED STRING 0651 THEN BEGIN 0655 3 X:=0; % SET TO STRING EXPRESSION 0660 QUOTE; 0663 EMITL(LENGTH) 0665 END 0667 3 ELSE 0667 IF BOOLEAN(X:=REAL(X NEQ 6)) % MUST BE AE 0677 THEN AEXP 0702 ELSE X:=EXPRESS*2+1; % AE OR BE 0720 EACHCASE:=I NEQ ERRORCOUNT; 0725 END OF EACH CASE; EACHCASE(057) IS 0726 LONG, NEXT SEGMENT 001 ******** PDP-11 ALGOL COMPILER, VERSION 6.6.019 3/5/76 PAGE 74 0513 2 PROCEDURE CASEORIF(X); 0513 INTEGER X; 0513 BEGIN 0513 2 INTEGER ARRAY CASES[0:255]; CASEORIF IS SEGMENT 060 ******** 030010-S = CASES 0012 INTEGER TL,EL,CC,T,I; 030012-S = TL 030013-S = EL 030014-S = CC 030015-S = T 030016-S = I 0014 BOOLEAN N; 030017-S = N 0014 LABEL EXIT; 0014 IF CLASS EQL IFV % IF EXPRESSION 0017 THEN BEGIN % LETTUCE PARCELY IT 0023 3 GETNEXT; % SCAN THE 'IF' 0026 BEXP; % BOOLEAN EXPRESSION 0031 IF CLASS NEQ THENV % FOLLOWED BY A 'THEN'? 0032 THEN BEGIN 0036 4 FLAG(39); % 'THEN' EXPECTED 0042 GO EXIT 0045 END; 0045 4 IF X GEQ 0 % NOT DESIGNATIONAL 0050 THEN GETNEXT; % SO SCAN THE THEN (ELSE GOSTMT DOES) 0056 IF N:=EDOC[L-1] EQL 1281+4*LNG AND EDOC[L] GEQ 0 % OPTIMIZE OUT NO 0075 THEN L:=L-1; 0110 TL:=BUMPL; % SAVE THE 'THEN' L 0117 IF EACHCASE(X) % SEE WHAT WE GOTS. 0122 THEN GO EXIT; 0130 IF CLASS NEQ ELSEV % FOLLOWED BY A 'ELSE'? 0131 THEN BEGIN 0135 4 FLAG(63); % 'ELSE' EXPECTED 0141 GO EXIT 0143 END; 0143 4 IF X GEQ 0 % NOT DESIGNATIONAL 0146 THEN GETNEXT; % OTHERWISE GOSTMT WILL SCAN IT 0154 EL:=BUMPL; % BRANCH OUT OF THIS CASE 0163 CONSTANTCLEAN; % DUMP FLOATING POOL ARRAYS 0173 EMITB(IF N THEN BRTR ELSE BRFL,TL,L); 0207 IF EACHCASE(X) % GET NEXT CASE 0212 THEN GO EXIT; 0220 EMITB(BRUN,EL,L) % BRANCH AROUND THE ELSE CASE 0224 END 0226 3 ELSE BEGIN % CASE'S 0230 3 DEFINE ABC = #; % SEG THIS SEGMENT 001133-P = B.0011 B.0011 IS SEGMENT 061 ******** 0000 GETNEXT; % SCAN THE 'CASE' 0005 TL:=BUMPL; % LEAVE ROOM FOR THE STACK BUILDING CODE 0014 AEXP; % GET CASE INDEX 0017 EMIT(OCX); % DO OCCURS INDEX INTO CASE BODY 0023 EL:=L; % WHERE 1ST INDICIE IS AT 0026 IF CLASS NEQ OFV % MISSING 'OF' 0027 THEN BEGIN 0033 4 FLAG(97); % TELL HIM PDP-11 ALGOL COMPILER, VERSION 6.6.019 3/5/76 PAGE 75 0037 GO EXIT 001137-P = GO TO SOLVER WORK CELL 0053 END; 0053 4 GETNEXT; % SCAN THE 'OF' 0056 IF CLASS NEQ LFTPAREN % MISSING '(' 0057 THEN BEGIN 0063 4 FLAG(31); % TELL HIM 0067 GO EXIT 0103 END; 0103 4 IF X GEQ 0 % IF NOT DESIGNATIONAL EXPRESSION 0106 THEN GETNEXT; % ELSE GOSTMT WILL SCAN IT 0114 CC:=-1; % INIT THE CASE COUNT 0120 DO BEGIN % SCAN THE CASE BODY 0120 4 CASES[CC:=CC+1]:=L;% SAVE START OF EACH EXPRESSION 0130 IF EACHCASE(X) % SEE IF A VALID CASE 0133 THEN GO EXIT; % NO 0153 CASES[CC:=CC+1]:=BUMPL; % WHERE TO LEAVE FROM 0167 CONSTANTCLEAN; % DUMP FLOATING POOL ARRAYS 0177 IF CLASS EQL COMMA OR N:=CLASS EQL RTPAREN 0203 THEN 0212 IF X GEQ 0 OR N % IF CALLING GOSTMT 0216 THEN GETNEXT % THEN LET HIM SCAN IT 0223 ELSE 0225 ELSE BEGIN % MISSING ')' 0227 5 FLAG(32); 0233 GO EXIT 0247 END 0247 5 END 0247 4 UNTIL N; 0252 EMITD(3"17777"+(T:=L)-(L:=TL-2)); % GO BACK TO FILL IN THE 0266 % STACK BUILDING CODE 0270 EMITL(CC DIV 2); % NUMBER OF CASES 0276 L:=T; % BACK TO BUILD THE TABLE 0301 T:=0; 0304 DO BEGIN 0304 4 I:=CASES[T]*2+2; % OFFSET TO THE OCCURS INDEX 0315 IF DEBUGTOG % CODE SET? 0315 THEN BEGIN % YES. (SHIT!) 0320 5 REPLACE LINEOUT BY " " FOR 18,O6(L)," " FOR 16,O6(I); 0346 WRITEALINE(23) 0350 END; 0352 5 EMITC(I) % PUT OUT THE CODE 0354 END 0356 4 UNTIL T:=T+2 GTR CC;% STOP WHEN OUT OF BOUNDS 0367 T:=T-1; 0374 DO EMITB(BRUN,CASES[T],L) % BRANCH OUT 0402 UNTIL T:=T-2 LSS 0 % ALL DONE 0412 END; B.0011(061) IS 0432 LONG, NEXT SEGMENT 060 ******** 0241 3 IF EDOC[L]:=-1 GEQ 0 % FAKE IT OUT FOR GOOD CASES 0247 THEN % THE ABOVE ASSIGNMENT DONE TO HELP OPTIMIZATION 0252 EXIT: X:=4; % RESET INDICATOR TO SAY A FAILURE 0255 END OF CASE OR IF EXPRESSIONS; CASEORIF(060) IS 0256 LONG, NEXT SEGMENT 001 ******** PDP-11 ALGOL COMPILER, VERSION 6.6.019 3/5/76 PAGE 76 0513 2 PROCEDURE IMPFUN; % IMPLEMENTED FUNCTIONS 001140-P = IMPFUN 0513 BEGIN 0513 2 BOOLEAN B,C; IMPFUN IS SEGMENT 062 ******** 030005-S = B 030006-S = C 0003 INTEGER I:=CLASS; 030007-S = I 0004 DEFINE CHECKIT(A,B)=IF CLASS NEQ A THEN FLAG(B) ELSE GETNEXT#; 0004 GETNEXT; % SCAN THE FUNCTION NAME 0011 CHECKIT(LFTPAREN,31); 0027 CASE I-SIGNV OF 0034 BEGIN 0035 3 0: % SIGN( ) 0035 AEXP; 0040 EMIT(DUP); 0044 EMITPAIR(0,LS); 0051 EMITPAIR((L+7)*4,BRFL); 0062 EMIT(DEL); 0066 EMITNUM(-1); 0073 EMITPAIR((L+5)*2,BRUN); 0104 EMITPAIR(0,NE); 0111 1: % ONES 0113 AEXP; 0116 EMIT(ONESS); 0122 2: % TIME 0124 AEXP; 0127 EMITPAIR(10,COM); 0134 3: % DELTA 0136 PEXP; % GET 1ST POINTER EXPRESSION 0141 CHECKIT(COMMA,37); % CHECK FOR A COMMA 0157 PEXP; % GET 2ND POINTER EXPRESSION 0162 EMIT(RSUP); % GET ARRAY DESCRIPTOR 0166 EMIT(DEL); % SKIP IT 0172 EMIT(SUB); % SUBTRACT THE TWO INDEXES 0176 EMIT(XCH); % GET 1ST ARRAY DESCRIPTOR 0202 EMIT(DEL); % SKIP THAT ONE ALSO 0206 4-5: % SHL AND SHR 0210 B:=I EQL SHRV; % CHECK FOR SHR. 0215 AEXP; 0220 CHECKIT(COMMA,37); 0236 AEXP; 0241 EMIT(IF B THEN SHRR ELSE SHLL); 0253 6: % SHIFT 0255 AEXP; 0260 CHECKIT(COMMA,37); 0276 AEXP; 0301 EMIT(DUP); 0305 EMITPAIR(0,LS); 0312 EMITPAIR((L+7)*2,BRFL); 0323 EMIT(CHS); 0327 EMIT(SHRR); 0333 EMITPAIR((L+4)*2,BRUN); 0344 EMIT(SHLL); 0350 7: % ABS 0352 AEXP; PDP-11 ALGOL COMPILER, VERSION 6.6.019 3/5/76 PAGE 77 IT WAS NECESSARY TO REDUCE THE SIZE OF THE LISTING FILE TO MAKE IT FIT ON A SINGLE DEC-TAPE. THIS WAS ONE OF THE PAGES THAT VOLUNTEERED TO GO. PDP-11 ALGOL COMPILER, VERSION 6.6.019 3/5/76 PAGE 78 0733 EMIT(FONES); 0737 12: % COMPILETIME 0741 IF CLASS NEQ ICONSTANT OR INREAL LSS 0 OR INREAL GTR 5 0752 THEN FLAG(38) 0760 ELSE BEGIN 0764 4 EMITL(TIME(INREAL)); 0772 GETNEXT 0773 END 0775 4 END OF CASES; 1014 3 CHECKIT(RTPAREN,32) % ')' SHOULD FOLLOW INTRINSICS 1030 END; IMPFUN(062) IS 1033 LONG, NEXT SEGMENT 001 ******** PDP-11 ALGOL COMPILER, VERSION 6.6.019 3/5/76 PAGE 79 0513 2 BOOLEAN PROCEDURE FILEATTRIBUTES(FROM,EXPRESSIONKIND); 001144-P = FILEATTRIBUTES 0513 VALUE FROM,EXPRESSIONKIND; 0513 INTEGER FROM; 0513 BOOLEAN EXPRESSIONKIND; 0513 BEGIN 0513 2 INTEGER I:=INFO,J; FILEATTRIBUTES IS SEGMENT 063 ******** 030005-S = I 030006-S = J 0003 BOOLEAN B1; 030007-S = B1 0004 LABEL L1; 0004 GETATTRIBUTE; 0011 IF CLASS NEQ DOTOP 0012 THEN FLAG(96) % NOT PROPER FILE ATTRIBUTE 0020 ELSE BEGIN 0024 3 GETATTRIBUTE; 0027 IF EXPRESSIONKIND 0027 THEN 0032 IF J:=REAL(CLASS EQL PRESENTV)+2*REAL 0036 (CLASS EQL OPENV) EQL 0 0046 THEN GO L1 0053 ELSE BEGIN 0053 4 FILEATTRIBUTES:=TRUE; 0056 GETNEXT; 0061 IF STACK[I+3] GEQ 0 0067 THEN EMITADDRESS(I,REAL(J EQL 2 AND CLASS NEQ ASSIGNOP)) 0103 ELSE BEGIN % FILE IS A PARAM ! 0107 5 EMITADDRESS(I,0); % GET ADDRESS OF FILE DESCRIPTOR 0114 IF J EQL 2 AND CLASS NEQ ASSIGNOP 0120 THEN EMITPAIR(2,ADD) % GET TO ADDRESS OF FIB POINTER 0130 END; 0132 5 IF B1:=CLASS EQL ASSIGNOP 0133 THEN BEGIN % FILE.OPEN,FILE.PRESENT:=BEXP 0141 5 GETNEXT; 0144 BEXP; 0147 EMITL(REAL(FROM EQL FS)); 0155 EMITL(J-1); 0163 EMITPAIR(6,COM) 0166 END 0170 5 ELSE 0170 IF J EQL 2 0174 THEN BEGIN % FILE.OPEN 0177 5 EMIT(LOD); 0203 EMITPAIR(2,ADD); 0210 EMIT(LOD); 0214 EMITPAIR(15,SHRR) 0217 END 0221 5 ELSE BEGIN % FILE.PRESENT ? 0223 5 EMITL(2); 0227 EMITPAIR(6,COM) 0232 END 0234 5 END 0234 4 ELSE L1: 0236 IF J:=REAL(CLASS EQL KINDV)+2*REAL(CLASS EQL MAXRECV)+ 0247 3*REAL(CLASS EQL CURRECV)+4*REAL(CLASS EQL MYUSEV)+ PDP-11 ALGOL COMPILER, VERSION 6.6.019 3/5/76 PAGE 80 0263 5*REAL(CLASS EQL MAXSIZEV)-1 0267 EQL 0 0274 THEN FLAG (96) 0301 ELSE BEGIN 0305 4 GETNEXT; 0310 IF CLASS EQL ASSIGNOP 0311 THEN BEGIN 0315 5 EMITADDRESS(I,0); % ADDRESS OF FILE DESC 0322 GETNEXT; % GET TO START OF ARITHMETIC EXPRESSION 0325 AEXP; % PARSE IT ! 0330 EMITL(REAL(FROM EQL FS)); % STD,STN TOG 0336 EMITL(J-1); % WHAT TO CHANGE 0344 EMITPAIR(10,COM) % CHANGE IT 0347 END 0351 5 ELSE 0351 IF CLASS NEQ ASSIGNOP AND FROM EQL FS 0357 THEN FLAG(67) 0366 ELSE BEGIN 0372 5 IF STACK[I+3] GEQ 0 0400 THEN EMITADDRESS(I,IF J LEQ 2 THEN 0 ELSE 0413 J-2+REAL(J EQL 5)) 0424 ELSE BEGIN % FILE IS A PARAMETER 0430 6 EMITADDRESS(I,0); % GET ADDRESS OF FD 0435 IF J GTR 2 0437 THEN EMITPAIR(2*(J-2+REAL(J EQL 5)),ADD) 0455 END; 0457 6 CASE J-1 OF 0464 BEGIN 0465 6 BEGIN % KIND 0465 7 EMIT(LOD); 0471 EMITPAIR(10,LND) 0474 END; 0476 7 BEGIN % MAXRECSIZE 0500 7 EMIT(LOD); 0504 EMITPAIR(3,SHRR) 0507 END; 0511 7 BEGIN % CURRENTRECNO 0513 7 EMIT(LOD); 0517 EMITPAIR(2,ADD); 0524 EMIT(LOD); 0530 EMITPAIR(3"7777",LND) 0533 END; 0535 7 EMIT(LODB); % MYUSE 0544 EMIT(LOD) % MAXRECNO 0550 END 0554 6 END 0561 5 END 0561 4 END 0561 3 END; FILEATTRIBUTES(063) IS 0562 LONG, NEXT SEGMENT 001 ******** PDP-11 ALGOL COMPILER, VERSION 6.6.019 3/5/76 PAGE 81 0513 2 PROCEDURE PRIMARY; 0513 BEGIN 0513 2 INTEGER J,T; PRIMARY IS SEGMENT 064 ******** 030005-S = J 030006-S = T 0003 LABEL LE,LDOT,EXIT,LB,L2,L9; 0003 BOOLEAN B; 030007-S = B 0003 IF CLASS EQL FACTOP AND ASTRISK %:=* 0010 THEN BEGIN 0014 3 ASTRISK:=FALSE; 0017 GETNEXT; % SCAN TO THE NEXT TOKEN TO MAKE EVERYBODY HAPPY 0022 GO LDOT % FOLLOWED BY MAYBE A DOT 0024 END; 0024 3 ASTRISK:=FALSE; 0027 IF CLASS EQL ATPOUNDV 0030 THEN GO L9; % CHECK FOR @# (BYTE POINTER) 0036 IF CLASS EQL POLISHV 0037 THEN GO L2 0045 ELSE 0045 IF CLASS EQL FILEID 0046 THEN BEGIN 0052 3 B:=FILEATTRIBUTES(FP,FALSE); 0062 GO LDOT END; 0064 3 IF BOOLEAN(J:=REAL(CLASS EQL CASEV)) % CASE EXPRESSION 0071 THEN BEGIN 0073 3 CASEORIF(J); % 1 IS ARITHMETIC 0077 GO LDOT 0101 END; 0101 3 IF CLASS EQL VALUEV % VALUE ( ) 0102 THEN BEGIN 0106 3 LABEL ALT; % MAKE NEW SEGMENT! 001150-P = B.0012 B.0012 IS SEGMENT 065 ******** 0000 GETNEXT; % SEE IF A '(' 0005 IF CLASS NEQ LFTPAREN 0006 THEN FLAG(31) % NOPE. TOO BAD! 0014 ELSE BEGIN 0020 4 GETATTRIBUTE; % OTHERWISE GET MNEMONIC-FILE ATTRIBUTE 0023 IF CLASS GEQ BINV AND CLASS LEQ LPV % 'KIND'-MNEMONIC 0027 THEN BEGIN 0034 5 EMITL(CLASS-BINV); 0042 GO ALT 0044 END 0044 5 ELSE 0044 IF CLASS GEQ INV AND CLASS LEQ IOV % 'MYUSE'-MNEMONIC 0052 THEN BEGIN 0057 5 EMITL(CLASS-INV+1); 0067 ALT: GETNEXT % SCAN THE MNEMONIC 0070 END 0072 5 ELSE FLAG(123); % ILLEGAL FILE-MNEMONIC. 0100 IF CLASS NEQ RTPAREN% FOLLOWED BY A ')' ?