The Project Gutenberg EBook of The Oak Ridge ALGOL Compiler for the Control Data Corporation 1604, by L. L. Bumgarner This eBook is for the use of anyone anywhere in the United States and most other parts of the world at no cost and with almost no restrictions whatsoever. You may copy it, give it away or re-use it under the terms of the Project Gutenberg License included with this eBook or online at www.gutenberg.org. If you are not located in the United States, you'll have to check the laws of the country where you are located before using this ebook. Title: The Oak Ridge ALGOL Compiler for the Control Data Corporation 1604 Preliminary Programmer's Manual Author: L. L. Bumgarner Release Date: November 17, 2015 [EBook #50468] Language: English Character set encoding: UTF-8 *** START OF THIS PROJECT GUTENBERG EBOOK THE OAK RIDGE ALGOL COMPILER *** Produced by David Starner, Stephen Hutcheson, and the Online Distributed Proofreading Team at http://www.pgdp.net (This book was produced from images made available by the HathiTrust Digital Library.) ORNL-3460 UC-32—Mathematics and Computers TID-4500 (23rd ed.) THE OAK RIDGE ALGOL COMPILER FOR THE CONTROL DATA CORPORATION 1604 PRELIMINARY PROGRAMMER'S MANUAL L. L. Bumgarner OAK RIDGE NATIONAL LABORATORY operated by UNION CARBIDE CORPORATION for the U.S. ATOMIC ENERGY COMMISSION Printed in USA. Price: $1.25 Available from the Office of Technical Services U. S. Department of Commerce Washington 25, D. C. LEGAL NOTICE This report was prepared as an account of Government sponsored work. Neither the United States, nor the Commission, nor any person acting on behalf of the Commission: A. Makes any warranty or representation, expressed or implied, with respect to the accuracy, completeness, or usefulness of the information contained in this report, or that the use of any information, apparatus, method, or process disclosed in this report may not infringe privately owned rights; or B. Assumes any liabilities with respect to the use of, or for damages resulting from the use of any information, apparatus, method, or process disclosed in this report. As used in the above, “person acting on behalf of the Commission” includes any employee or contractor of the Commission, or employee of such contractor, to the extent that such employee or contractor of the Commission, or employee of such contractor prepares, disseminates, or provides access to, any information pursuant to his employment or contract with the Commission, or his employment with such contractor. ORNL-3460 Contract No. W-7405-eng-26 Mathematics Division THE OAK RIDGE ALGOL COMPILER FOR THE CONTROL DATA CORPORATION 1604—PRELIMINARY PROGRAMMER’S MANUAL L. L. Bumgarner DATE ISSUED JAN 30 1964 OAK RIDGE NATIONAL LABORATORY Oak Ridge, Tennessee operated by UNION CARBIDE CORPORATION for the U.S. ATOMIC ENERGY COMMISSION CONTENTS I. Introduction 1 II. Language Restrictions 2 III. Modes of Operation of the Compiler 4 IV. Input-Output and Intermediate Tape 5 Input-Output 5 READ 5 PAGE 7 Lists and the List Declaration 7 PRINT 9 WRITE 9 PUNCH 10 Formats and the Format Declaration 10 INPUT 11 OUTPUT 12 Intermediate Tape Procedures 13 BINREAD 13 BINWRITE 14 ENDFILE 14 REWIND 14 BACKUP 14 Tape-Checking Procedures 14 EOF 15 READERR 15 WRITERR 15 V. The External Declaration 16 VI. Standard Procedures 16 VII. Error Checking and Diagnostics 17 VIII. Running Programs 19 ALGOL Control System 20 EOP Card 20 Compile and Execute: ALGO 21 PROGRAM Card 22 Compile/Execute: ALDAP 22 ALDAP Control Statement 22 Job Deck: ALDAP Compilation/Execution 23 Examples 25 APPENDICES A. Adjuncts to Algol 60 30 B. Hardware Representation 32 C. Structure of Procedure Calling Sequence 35 D. Internal Representation of Strings 37 E. Program Efficiency 38 F. Controversial Features of Algol 60 40 G. Fortran Subprograms in an Algol Program 41 THE OAK RIDGE ALGOL COMPILER FOR THE CONTROL DATA CORPORATION 1604—PRELIMINARY PROGRAMMER’S MANUAL L. L. Bumgarner ABSTRACT This document is a preliminary programmer’s manual for use of the Control Data 1604 Algol Compiler. The compiler was constructed by the Programming Research Group of the Mathematics Division in cooperation with Control Data Corporation. A knowledge of Algol 60 is assumed. Included are descriptions of input-output facilities and details for operation under the monitor system. I. Introduction This document is to serve as a programmer’s manual for the Algol compiler constructed as a cooperative project by Control Data Corporation and the Mathematics Division of Oak Ridge National Laboratory. The compiler is designed for the Control Data 1604 and 1604-A computers. The document is preliminary in that the compiler is not thoroughly tested and may undergo further development. The reader is assumed to be familiar with Algol 60. The defining descriptions are the two reports on Algol 60 available in the following references: 1. P. Naur et al, “Report on the Algorithmic Language Algol 60,” Comm. Assoc. Comp. Mach., 3 (1960), No. 5, 299-314. 2. P. Naur et al, “Revised Report on the Algorithmic Language Algol 60,” Comm. Assoc. Comp. Mach., 6 (1963), No. 1, 1-17. The second report clears up certain ambiguities that appeared in the first report. The reports are not easy reading for the novice. The following expositions are more readable: 1. Baumann, Bauer, Feliciano and Samelson, Introduction to Algol, Prentice-Hall, Inc. (to be published in late 1963). 2. Bottenbruch, H., “Structure and Use of Algol 60,” Jour. Assoc. Comp. Mach., 9 (1962), No. 2, 161-221, and ORNL-3148. The Baumann publication also contains the revised Algol 60 report. Throughout this document various examples of statements and declarations appear without the semicolon which is always required for separating them. This is to avoid the implication that the semicolon is part of the statement or the declaration. In sentences, a comma or period may appear where a semicolon or other delimiter would be indicated in the context of a program. Word delimiters rendered in bold-face type in the Algol report are herein indicated by underlining. II. Language Restrictions The compiler correctly handles programs written in Algol 60 subject to the following restrictions. 1. The use of an integer label as an actual parameter will cause an incorrect program to be compiled. 2. A GO TO statement with an undefined switch designator as the designational expression will cause incorrect operation of the final program. 3. Type restrictions: (a) The exponentiation expression x ↑ y will have type real unless x is of type integer and y is a non-negative integer constant. This differs slightly from the definition in the Algol report but will generally cause no difficulty. (b) In the construction else the arithmetic expressions must have the same type, or else an incorrect program will be compiled. For example, in the statement x := if a < b then z else w z and w should both be declared real or both integer. (c) In a procedure call (procedure statement or function call) each actual parameter having an arithmetic value must have the same type as the corresponding formal parameter in the procedure declaration. The type of the formal parameter is that designated in the specification part if it appears there. If a formal parameter representing an arithmetic quantity does not appear in the specification part, it is assumed to be specified real. Full use of specifications is desirable for descriptive purposes and for optimization. Caution. Restriction (c) is more likely to cause errors than the other restrictions. It is very easy to write P(1,2) when the parameters of P are specified real, but incorrect coding will result. The call P(1.0,2.0) works correctly. 4. Standard procedure names (see section VI) used as parameters in procedure calls will cause an incorrect program to be compiled. A call, therefore, such as P(sin) is incorrect. Note, however, that a call of the type Q(sin(x)) causes no trouble. The case P(sin) can be programmed in another way. Make the declaration real procedure sin 1 (t); real t; sin 1 := sin(t). The call P(sin 1) is then correct. 5. Arrays called by value are not handled. If an array identifier appears in the value part, an incorrect program will be compiled. 6. “Dynamic” own arrays are not handled. This means that all own arrays are treated as having constant subscript bounds; this constitutes one possible interpretation of the Algol 60 report. An own array may be declared with variable subscript bounds, but only one allocation of storage will be made, and if the bounds change, this will be ignored. 7. Recursive procedures are not handled. This restriction encompasses all cases of a function designator appearing in the actual parameter part of a call of the same function, unless that function is a standard function. Thus f(f(x)) is not permitted in general, but sin(sin(x)) is allowed. III. Modes of Operation of the Compiler There are two distinct modes of operation: ALGO and ALDAP. ALGO is a compile-and-execute mode in which the two phases cannot be separated. The Algol program is translated into a machine language program in core memory, and execution of the program immediately and automatically follows. There is no assembly program phase. ALDAP makes use of the CODAP assembly program facilities. It is possible to compile procedures separately and reference them from an Algol program. The procedures may be written in Algol, CODAP or Fortran. This provision is made possible with the aid of the external declaration discussed in section V. The ALGO mode provides significantly faster compilation than the ALDAP mode for most programs. The target programs produced in the two modes are essentially the same. In the ALGO mode, program checkout may be done at the Algol language level. In the ALDAP mode, checkout may also be done at the machine and assembly language levels, and modifications may be made at these levels. IV. Input-Output and Intermediate Tape There are seven standard procedures for input-output, five for intermediate tape, and three for checking tape conditions. Two declarations, format and list, are additions to the language. Input-Output The input-output procedures are: READ, PAGE, PRINT, WRITE, PUNCH, INPUT, and OUTPUT. READ The READ procedure is used to input numbers and Boolean values. A READ statement has the form READ (V1, V2, ..., Vn) where n is any positive integer and each Vk is a variable. For example, the statement READ (X, Y, A[1], B[1]) will input values into the four variables listed. For inputing values into an array, a statement such as the following might be used: for I := 1 step 1 until 100 do READ (A[I]) . The READ procedure inputs numbers and truth values. A number must be a legal Algol number (although an E may be substituted for the symbol ₁₀). For input into a Boolean variable, the truth values true and false are accepted; also, a non-negative number or a plus sign is interpreted as false and a negative number or a minus sign is interpreted as true. A blank is read as zero. With the READ procedure, the type of a number on a data card does not have to be the same as the type of the variable to which it is assigned. Any necessary type conversions are done automatically. If N is the next number in the data, the statement READ (V) is equivalent to the statement V := N . The data cards are free field. The number of values per card, the length of numbers, and the number of spaces are arbitrary. A comma, however, must follow each number, including the last one on the last data card. In reading a value into a subscripted variable, the current value of the subscript expression is not affected by that READ statement. For example, in the statement READ (I, A[I]) the old value of I is used in A[I]. The READ procedure will input data from the standard input medium only. PAGE The PAGE procedure is used to cause a page ejection on the standard output medium. PAGE has no parameters. It is called by simply writing PAGE . Lists and the List Declaration The input and output procedures described in the rest of this section, as well as the binary read and write procedures, make use of the concept of a list. A list[1] is a sequence of expressions. An example is U + V, C[0], if B then X else Y . It may be inconvenient in some cases to write down all of the expressions explicitly. The loop expression[1] may be used as a shorthand device in a list. It is an Algol-like construction of which the following is an example: for I := 1 step 1 until 1000 do A[I] . This is equivalent to the list A[1], A[2], ..., A[1000] . The entity following do in a loop expression may itself be a list, but this list must be enclosed in parentheses if it contains more than one member. The loop expression for I := 1 step 1 until 1000 do (A[I], B[I]) is equivalent to the list A[1], B[1], A[2], B[2], ..., A[1000], B[1000] . The loop expression for I := 1 step 1 until 10 do (A[I], for J := 1 step 1 until 20 do B[I,J]) is equivalent to the list A[1], B[1,1], B[1,2], ..., B[1,20], A[2], B[2,1], B[2,2], ..., B[2,20], .................................... A[10], B[10,1], B[10,2], ..., B[10,20] . A list may be given a name through a list declaration. A list declaration has the form list identifier := list . Examples are: list L := X, A + B list M := for I := 1 step 1 until N do A[I] . A list identifier may itself appear in a list. One of the above examples might be written with the aid of the following declaration: list L := for J := 1 step 1 until 20 do B[I,J] . The loop expression is then for I:= 1 step 1 until 10 do (A[I], L) . A list declaration obeys the same rules of syntax and scope as do other declarations. A list identifier may be used as an actual parameter of a procedure call, with the requirement that the corresponding formal parameter be specified list. However, an actual list may appear as a parameter only in calls of the standard procedures, as described. PRINT The PRINT procedure is used to output numbers in a simple, rigid manner. A PRINT statement has the form PRINT (list), where list is described above. An example of a PRINT statement is PRINT (A, if N = 0 then S else T). A PRINT statement always puts out at least one line printer image. A line may contain up to 6 numbers, each of which is in scientific notation with 10 decimal places. Each number is right-justified in a field of 20 columns. (The format is 6E20.10.) The above PRINT statement will output two numbers in the first forty spaces, and the rest of the line will be blank. A PRINT statement such as PRINT (for I := 1 step 1 until 10 do A[I]) will output one line of 6 numbers followed by one line of 4 numbers. Single spacing between lines is automatic. The PRINT procedure always outputs on the standard output medium. WRITE The WRITE procedure is used to output strings. Examples of WRITE statements are: WRITE ('TABLE') WRITE (if D < 0 then 'TRUE' else 'FALSE') . Each parameter must be a string expression (see Appendix A for definition of string expression). There may be any number of parameters, but each string will appear on a separate line. If a string is too long to go on one line, it will be continued on the next line. A string should not contain another string. Lines are single spaced. Each WRITE statement causes at least one line printer image to be put out. The WRITE procedure always outputs on the standard output medium. PUNCH The PUNCH procedure is used to output numbers on punched cards in a form which can be input by the READ procedure. Each number punched will be followed by a comma. Each card punched may contain up to four numbers. Each number will be of type real, but since the READ procedure makes any necessary type conversions this is unimportant. A PUNCH statement has the same form as a PRINT statement. Each PUNCH statement causes at least one card image to be put out. The PUNCH procedure always outputs on the standard punch medium. Formats and the Format Declaration The two input and output procedures remaining to be described make use of formats. The formats are exactly those used in Fortran, and readers unfamiliar with Fortran will find it necessary to refer to the Control Data Fortran-62 Reference Manual for details on the use of formats. A format is treated as a string. Formats will be written, for example, as follows: '(6E20.10)' '(1H0, 9X, 5HTABLE, I3)' . Note that the parentheses are part of the format, and both parentheses and string quotes are required. As will be indicated below, a format string may appear explicitly in an INPUT or OUTPUT statement. If the same format string is used more than once, however, it may be convenient to give it a name through a format declaration. A format declaration has the form format Identifier := '(Fortran format)' . Examples are: format F := '(6E20.10)' format G := '(1H0, 9X, 5HTABLE, I3)' . A format declaration obeys the same rules of syntax and scope as do other declarations. Format identifiers may be used as parameters, and format is a specifier. INPUT The INPUT procedure is used to input numbers and Hollerith information in accordance with Fortran-type formats. An INPUT statement has one of the forms INPUT (M,F,list) INPUT (M,F) where: (1) M is the logical unit designation. M may be any arithmetic expression. If it is not integral-valued, the action M := entier (M + 0.5) will take place. The standard input unit is 50. (2) F is a format expression. It may be an actual format string, a format identifier, a conditional format expression, or any variable which contains the starting address of a format string. Caution. In the case of a conditional format expression, format strings and format identifiers should not be mixed. For example, (a) and (b) below are permitted, but (c) will cause an incorrect program to be compiled: (a) if B then '(E20.7)' else '(E20.6)' (b) if B then F1 else F2 (c) if B then F1 else '(E20.6)' . (3) list is as defined previously. Of course, for INPUT all expressions must be variables. The following are examples of an INPUT statement: INPUT (50, '(4E20.8)', N, for I := 1 step 1 until N do A[I]). INPUT (if A < B then M else N, F, X, Y, Z) . Each INPUT statement causes at least one card image to be read. Note that the INPUT procedure does not make type checks between the data and the program variables. A floating point number, for example, is stored as such regardless of the type of the variable to which it is assigned. Caution. It is strongly recommended that not both READ and INPUT be used in the same program. Each buffers ahead one card image. Furthermore, each INPUT statement causes at least one card image to be read while a READ statement may not cause a new card image to be read. Mixing the two statements will require quite careful use of blank cards in the data to allow for the buffering. OUTPUT The OUTPUT procedure is used to output numbers and Hollerith information in accordance with Fortran-type formats. An OUTPUT statement has one of the forms OUTPUT (M,F) OUTPUT (M,F,list) where M, F, and list are as indicated above. The following are examples of OUTPUT statements: OUTPUT (51, '(5HTABLE)') OUTPUT (51, '(1H0,9X,10E10.2)', for I := 1 step 1 until 100 do A[I]) . Each OUTPUT statement causes at least one line printer image to be put out. The standard output unit is 51, and the standard punch unit is 52. Intermediate Tape Procedures There are five standard procedures for making use of magnetic tape for auxiliary storage: BINREAD, BINWRITE, ENDFILE, REWIND and BACKUP. BINREAD A BINREAD statement has the form BINREAD (M, list) where M and list are the same as for INPUT. Each BINREAD statement causes the designated unit to move forward one logical record, reading in binary format into the variables of the list. If fewer variables appear in the list than are on the record, only those values are read and the tape moves on to the end of the record. If more variables appear in the list than are on the record, this is treated as an error and the program is terminated. The following is an example of a BINREAD statement: BINREAD (6, for I := 1 step 1 until 1000 do A[I]) . BINWRITE A BINWRITE statement has the form BINWRITE (M, list) where M and list are the same as for OUTPUT. Each BINWRITE statement causes the values of the list expressions to be written in one logical record in binary format on the designated unit. ENDFILE An ENDFILE statement has the form ENDFILE (M) where M is a unit designation as before. The statement causes an end-of-file record to be written on the designated unit. REWIND A REWIND statement has the form REWIND (M) where M is a unit designation as before. The statement causes the designated unit to be rewound to the load point. BACKUP A BACKUP statement has the form BACKUP (M) where M is a unit designation as before. The statement causes the designated unit to be backspaced one logical record of binary information or one physical record of BCD information. Tape-Checking Procedures The checking procedures are: EOF, READERR, and WRITERR. These are Boolean procedures. EOF An EOF call has the form EOF (M) where M is a logical unit designation as before. It yields the value true if the previous read operation encountered an end-of-file or the previous write operation encountered an end-of-tape; otherwise it yields the value false. An example of the use of an EOF call is: if EOF(6) then goto ALARM . READERR A READERR call has the form READERR (M) where M is a logical unit designation as before. It yields the value true if the previous read operation produced a parity error; otherwise it yields the value false. READERR should not be used for testing the operation of a READ statement. The READ procedure has its own facilities for checking, making multiple attempts in case of errors, and terminating the program if necessary. WRITERR A WRITERR call has the form WRITERR (M) where M is a logical unit designation as before. It yields the value true if the previous write operation produced a parity error; otherwise it yields the value false. V. The External Declaration An external declaration is required for each nonstandard library procedure or procedure compiled separately from the calling program, whether in Algol, Fortran or CODAP. Standard Algol procedures are described in Section VI. Note that a CODAP subroutine must take account of the special structure of the Algol calling sequence as described in Appendix C or be treated as a Fortran subprogram. The use of Fortran subprograms is described in Appendix G. The external declaration has one of the following forms: external I1, ..., In real external I1, ..., In integer external I1, ..., In Boolean external I1, ..., In where each Ik is an identifier and n is any positive integer. A type declarator preceding the declarator external signifies a function procedure having that type. Note that no information about parameters appears in an external declaration. See Appendix A for syntactical definition. In the ALGO mode, LIB cards must be included in the job deck for nonstandard library routines, in addition to the external declarations. Details are found in Section VIII. VI. Standard Procedures Certain procedures are used without being declared. These include the standard functions listed in the Algol 60 report and the input-output and intermediate tape procedures. The complete list is as follows: ABS SIGN SQRT SIN COS ARCTAN LN EXP ENTIER EOF READERR WRITERR FORTRANF FTNF READ PAGE PRINT WRITE PUNCH INPUT OUTPUT BINREAD BINWRITE ENDFILE REWIND BACKUP FORTRAN FTN These procedures are global to the program. They behave as though declared in a fictitious block surrounding the entire program. VII. Error Checking and Diagnostics In a complete compilation the compiler makes two passes on the Algol source program. If errors which the compiler cannot correct are detected in the first pass, then the second, or translation, pass will not be made. The following types of errors are detected: 1. syntactical error 2. undeclared identifier 3. identifier declared twice in the same block head 4. misspelled delimiter (corrected in many cases) 5. missing escape symbol (corrected unless both are missing for the same delimiter, in which case the delimiter is treated as an identifier). The program listing and any diagnostics always appear on the standard output medium. In the case of a syntactical error, a message will appear in the program listing one or several lines below the error. The location of the error in the program will be further pinpointed in the line of symbols immediately below the error message. This line will be a short portion of the program with the last symbol in the line being the one which indicates the error. For example, a declaration might be out of place as follows: . . . x := a + b; 'INTEGER' K; **** LAST CHARACTER INDICATES SYNTACTICAL ERROR. x := a + b; INTEGER . . . In some cases the line below the message may differ slightly from the corresponding string of symbols above; for example, an identifier might be rendered by Ident. It is possible for a single syntactical error to cause more than one diagnostic. A few syntactical errors are corrected by the compiler, and a message is put out to this effect. An example is a semicolon immediately preceding else. According to the comment conventions of Algol, any string of symbols following end and not containing end, else or a semicolon is treated as comment. As a result, the omission of one of these symbols following end does not always cause an error in compilation but will cause a portion of the program to be skipped over by the compiler. Thus for example, in ... x := a + b end for i := 1 step 1 ... the FOR statement will be skipped at least in part. The compiler will put out a caution message in this and some other cases, but it will not change the program. If an identifier is not declared (or possibly declared in the wrong place), a message is put out below the program listing together with the undeclared identifier. The compiler does not check the type of identifiers. Therefore, such errors as a Boolean variable in an arithmetic expression, or the brackets of a subscripted variable replaced by parentheses, are not detected, and an incorrect program may be compiled. VIII. Running Programs The Algol program is punched on cards in the hardware representation described in Appendix B. The format is essentially free field: spaces have no significance except within escape symbols and string quotes. Only the first 72 columns, however, are interpreted by the compiler. The remaining columns may be used for identification purposes. Care must be taken when a string is continued onto the next card, as the continuation will begin in column 1. The program listing will have the same format as the cards. In the following discussion the symbol Ø signifies the letter O where necessary for emphasis, and the symbol Δ signifies a 7-9 punch in card column 1. ALGOL Control System The compiler operates under the ALGOL Control System. This system is a subordinate control routine of the Master Control System of the CO-OP Monitor Programming System. ALGOL is quite similar to the subordinate control routine COOP. ALGOL is called with an MCS (Master Control System) card having ALGOL punched beginning in column 2. Other details of this card are available in descriptions of the CO-OP Monitor. It should be noted in selecting a standard recovery procedure that the concept of COMMON is not used in Algol. Following the MCS card will be a control card giving instructions to the control routine ALGOL. It will name one of the following routines: ALGO, ALDAP, EXECUTE, BINARY, FORTRAN, REWIND or DEFINE. These will be discussed below. EOP Card The EOP (end-of-program) card has the characters 'EØP' punched in columns 10-14. In the ALGO mode, one EOP card must be used to terminate the program. In the ALDAP mode, one EOP card must be used to terminate each Algol program or Algol procedure being compiled separately. Compile and Execute: ALGO The ALGO mode of running an Algol program is the simplest and the fastest. It will be the more suitable for a large number of programs. Unless the programmer has special reasons for using the ALDAP mode, the ALGO mode is recommended. The Algol program must be self-contained except for standard procedures and library procedures on the library-systems tape. The job deck must have the following cards in the specified order: 1. MCS control card. The subordinate control routine name must be ALGØL. 2. ALGOL control card. This will appear as ΔALGØ. or ΔALGØ,t. where t is an integer specifying a time limit in minutes for compilation and execution. (The period is required on every control card.) 3. LIB cards. If necessary. One LIB card is required for each non-standard library procedure called in the program, namely those declared external. The format of a LIB card is as follows: the characters LIB punched in columns 10-12 and the name of a library entry point beginning in column 20. There may be no more than 20 LIB cards. 4. PROGRAM card. If desired. This may be used to identify the program. Its format is described in the next paragraph. 5. Algol program deck. 6. EOP card. 7. Data. If required. PROGRAM Card The PROGRAM card is optional. It is useful for identification purposes, and in the ALDAP mode it serves to name the program entry point. The format of the card is free field. The characters PRØGRAM must appear followed by the program name, which must be alphanumeric. Compile/Execute: ALDAP The ALDAP mode is used to compile an Algol program or procedure to a relocatable binary or a CODAP format. Execution is optional. For compilation only, the program deck may consist of any mixture of Algol programs and procedures, any number of which may be in CODAP. If execution is desired, part or all of the program deck may have been previously compiled, so that the deck may have Algol, CODAP and relocatable binary cards. ALDAP Control Statement The format of the ALDAP statement is: ΔALDAP,L,B,n. where L is a program listing key, B is a punched card output key, n is a logical unit number. A period may terminate the statement at any point, with remaining fields treated as zero. If the program listing key (L) is a 1, an assembled listing of the CODAP object code will be produced on the standard output medium. If the key is zero or blank, no such listing will be produced. A listing of the Algol program and any diagnostics will always be produced on the standard output medium. If the punched card output key (B) is a 1, a relocatable binary deck will be produced on the standard punch medium. If the key is a 2, a CODAP symbolic deck will be produced on the standard punch medium. If the key is a 3, both a symbolic deck and a relocatable binary deck will be produced on the standard punch medium, with the symbolic deck appearing first. If the key is zero or blank, no deck will be produced. The logical unit number (n) specifies the unit which is to be the load-and-go tape if it is one of the integers 1-49 or 56. If n is some other integer or blank, no load-and-go tape will be written. The load-and-go tape is required when execution of the program is to follow. Examples: (a) ΔALDAP, 1, 1, 56. This statement will cause the Algol/CODAP deck to be compiled, an assembled listing to be produced on the standard output medium, a relocatable binary deck to be produced on the standard punch medium, and a load-and-go tape written on logical unit 56. (b) ΔALDAP, 1. This statement will cause the Algol/CODAP deck to be compiled, and an assembled listing to be produced on the standard output medium. Job Deck: ALDAP Compilation/Execution For compilation only of an Algol/CODAP program deck, the job deck should contain the following cards in the specified order: 1. MCS control card. With ALGØL as the subordinate control routine name. 2. ALGOL control card. With the appropriate ALDAP control statement. 3. PROGRAM card. If desired. 4. Program deck. Any mixture of Algol and CODAP programs and procedures, with all their subroutines except the standard procedures and those on the library-systems tape. Each Algol program or procedure must be terminated by an EOP card. 5. FINIS card. This card contains the characters FINIS punched in columns 10-14. It signals the end of all compilations. For compilation and execution of an Algol/CODAP program deck, a load-and-go tape must be requested in the ALDAP control statement. If no relocatable binary cards follow the last subprogram to be compiled, then the program deck must be terminated by an EOP card which is in addition to the EOP card or END card (the latter for a CODAP subprogram) which terminates the last program or procedure. The FINIS card then follows this additional EOP card. An EOP card always causes a TRA card image to be written on the load-and-go tape. The control statements EXECUTE, BINARY, FORTRAN, REWIND and DEFINE may be used as described in the “CO-OP Monitor Programmer’s Guide”. BINARY is useful for loading a relocatable binary deck onto the load-and-go tape prior to compilation of an Algol calling program, where the subprogram in relocatable form might have the same name as a library routine. If the Algol program preceded the relocatable deck, the library routine would be fetched by the loader and an error indication given. The CO-OP control statements LOAD and EXECUTER are not used by ALGOL. Examples Each of the following examples describes a job deck which illustrates a different way of compiling and executing the same Algol program. The program calls a library procedure with entry point named BESSEL, and the program contains at least one other procedure. On the MCS card only the first field is indicated, as the others may vary from one installation to another. Example 1 This job uses the ALGØ mode. ΔALGØL, ... . ΔALGØ. LIB BESSEL PRØGRAM SAMPLE Algol Program (with external declaration of BESSEL) 'EØP' Data Example 2 This job uses the ALDAP mode, compiling the entire program at once. The ALDAP control statement calls for an assembled listing, a binary deck, and a load-and-go tape on logical unit 56. The execute card gives a two minute time limit on the execution. ΔALGØL, ... . ΔALDAP,1,1,56. PRØGRAM SAMPLE Algol Program (with external declaration of BESSEL) 'EØP' 'EØP' FINIS ΔEXECUTE,2. Data Example 3 This job consists simply of the execution of the relocatable program deck obtained in example 2. ΔALGØL, ... . ΔEXECUTE,2. Relocatable Deck Data Example 4 This example is similar to example 2. Here the main program and one of its procedures are to be compiled separately. ΔALGØL, ... . ΔALDAP,1,1,56. PRØGRAM SAMPLE Algol Program (with external declaration of both BESSEL and the procedure being compiled separately) 'EØP' Algol Procedure 'EØP' 'EØP' FINIS ΔEXECUTE,2. Data Example 5 In this example the procedure which was compiled separately in example 4 is being compiled by itself, i.e., the calling program is not in the deck at all. Of course there is no execution in this case. Note that no load-and-go tape is requested and only one EOP card is used. There cannot be a PROGRAM card. ΔALGØL, ... . ΔALDAP,1,1. Algol Procedure 'EØP' FINIS Example 6 Here the procedure compiled by itself in example 5 appears in the program deck in relocatable binary form, while the calling program is in the Algol language. ΔALGØL, ... . ΔALDAP,1,1,56. PRØGRAM SAMPLE Algol Program (with external declaration of both BESSEL and the procedure in relocatable form) 'EØP' FINIS ΔEXECUTE,2. Relocatable Deck Data The relocatable deck here must be terminated by two TRA cards. One of these is generated by the compiler when it processes the EOP card which must terminate the procedure for compilation, as in example 5. The second TRA card can be obtained by using a second EOP card, as in example 2. Alternatively, the second TRA card can be added to the relocatable deck before execution. Note that this second TRA card must not be used when the relocatable deck is loaded by a BINARY control statement. This is illustrated in the next example. Example 7 In this case the previously compiled procedure has the same name as a routine on the library-systems tape. ΔALGØL, ... . ΔBINARY,56. Relocatable Deck (terminated by one TRA card) ΔALDAP,1,1,56. PRØGRAM SAMPLE Algol Program (with external declaration of both BESSEL and the procedure in relocatable form) 'EØP' 'EØP' FINIS ΔEXECUTE, 2. Data The logical unit number on the BINARY control statement must agree with that which specifies the load-and-go tape in the ALDAP control statement. APPENDIX A Adjuncts to Algol 60 List Entities The delimiter list is a declarator and a specifier. ::= ::= | | () ::= | | ::= | , ::= list := Format Entities The delimiter format is a declarator and a specifier. ::= ::='([2])' | ::= | else ::= format := String Expression ::= | else External Declaration The delimiter external is a declarator. ::= ::= | , ::= external | external APPENDIX B Hardware Representation One keypunch character is reserved as an “escape symbol”, which we shall here suppose is the apostrophe. This symbol is used to delineate word delimiters and truth values, which are written in boldface type in Algol reference language and publication language and indicated by underlining in this manual. The hardware representation of a word delimiter such as begin is therefore 'BEGIN'. No distinction is made between upper and lower case letters in the hardware language. The transliteration rules for the non-word delimiters are comprised in the following table. This assumes a 48 character hardware set and is consistent with the usage in the ALCOR group. For some basic symbols alternatives are tolerated, as indicated. Reference Hardware Tolerated Hardware < 'LS' 'LESS' ≤ 'LQ' 'LSEQ', 'NOTGREATER', 'NOT GREATER' = 'EQ' 'EQUAL' ≥ 'GQ' 'GREQ', 'NOTLESS', 'NOT LESS' > 'GR' 'GREATER' ≠ 'NQ' 'NTEQ', 'NOTEQUAL', 'NOT EQUAL' ¬ 'NOT' ∧ 'AND' ∨ 'OR' ⊃ 'IMP' 'IMPLIES', 'IMPL' ≡ 'EQV' 'EQUIV' ₁₀ ' 'E','T' × * ↑ ** 'POWER' ÷ // 'DIV' : .. ; $ ., := = .=, ..= [ (/ ] /) ‘ " '(' ’ " ')' In the case of the string quotes, the tolerated symbols are required for the inner strings of a nest of strings. Actually, the compiler can tolerate many other spellings of word delimiters because of its facility for correcting misspellings. The delimiter go to is accepted with or without the space between the two words, but it is treated as a single delimiter: 'GOTO' or 'GO TO'. The compiler can also accept a 64 character hardware representation: the full set available on the line printer. In preparing programs, overpunching is used on the 48 character keypunch in this case. The table below indicates the keypunching rules in use at Oak Ridge National Laboratory. Reference Hardware < 1-8 punch ≤ 1-5 punch ≥ 1-9 punch > 2-7 punch ≠ 2-6 punch ∧ 3-7 punch ∨ 2-4 punch ₁₀ 1-6 punch ↑ 2-5 punch ÷ 3-5 punch : 2-8 punch ; 2-9 punch [ 3-6 punch ] 3-4 punch The other basic symbols are either in the 48 character set or are replaced by word delimiters as above. The symbol := is treated as two symbols in the 64 character set, and = is punched as such. APPENDIX C Structure of Procedure Calling Sequence The following information is necessary for the user writing a non-Algol procedure to be called from an Algol program. The calling sequence differs from that found in many other languages. The first word of the non-Algol procedure must have a simple jump instruction in its upper half, and the exit line is provided by a jump to this first word. The entry automatically causes the proper return address to be placed in the address portion of the first half-word. Upon entry to the procedure, index register six contains an address which is used to reference each parameter. To establish linkage with the first parameter, the instruction LDA 6 0 is performed. This brings into the accumulator a word of one of the following types: 1. SLJ 0 ENA V 2. SLJ 0 RTJ L In case (1), V is the address of the parameter. In case (2), L is the starting address of a piece of coding for computing the address of the parameter and leaving it in the accumulator (if the parameter is an expression, the address in the accumulator will be that of a temporary containing its value). Case (1) always holds if the parameter is a simple variable, string, array identifier, switch identifier, or procedure identifier. In case (2) the same temporary will be used for all the expressions. Both cases can be provided for by setting aside two locations for each parameter in the procedure body and placing the instruction SLJ *-1 in the upper half of each second location. Then after LDA 6 0 mentioned above, STA RES1, where RES1 is the first reserved location for the first parameter, makes the two locations into a closed subroutine. After this, the instruction RTJ RES1 causes the address of the first parameter to be placed in the accumulator anytime it is performed. This accommodates expressions called by name. In general, the K^th parameter is referenced as above, but beginning with LDA 6 (K - 1). This description does not apply to the standard procedures, each of which has its own special calling sequence. APPENDIX D Internal Representation of Strings The address representing a string is that of the first word of string characters. Each left string quote is represented internally by the word 00 ... 03454 , and each right string quote by 00 ... 05474 . The characters of the string which are not string quotes are packed in BCD eight characters per word. These words are in the natural order, the first immediately following the left string quote and the last immediately followed by the right string quote. If the last word before a right quote is not full, the rest of that word is filled out with zeros (not BCD blanks). APPENDIX E Program Efficiency The following information may be of interest to programmers desiring an efficient program: 1. The FOR statement is defined with more generality than is useful in most programs. In particular, the arithmetic expressions in the FOR clause are allowed to change in value during execution of the FOR statement. The compiler does not attempt to determine which FOR statements make use of this flexibility and treats all of them in the most general way. Therefore, in a statement such as for I := 1 step M + N until abs(A - B) do ... , the expression M + N is evaluated twice for each iteration, and the expression abs(A - B) is evaluated once for each iteration. If M, N, A , and B do not change in the loop, this is unnecessary. Such inefficiency can be avoided by programming in a slightly different way. The above example can be written as follows: T1 := M + N; T2 := abs(A - B) ; for I := 1 step T1 until T2 do ... . 2. The concept of call by value is a device applied to procedures to eliminate unneeded flexibility in procedure calls. If a parameter having a value is referenced more than once in the procedure body and the flexibility of call by name is not needed, then the program is more efficient if the parameter is included in the value part of the procedure heading. If such a parameter is referenced only once, it is more efficient if it is not included in the value part. 3. Array identifiers which are parameters should be specified. APPENDIX F Controversial Features of Algol 60 A few features of the language have been subject to more than one interpretation. Fortunately, the vast majority of programs will not involve these ambiguities, but for the few that do it will be necessary to know what decisions the compiler makes. This appendix indicates these decisions for the more controversial areas. 1. Side effects in function designators. The evaluation of primaries in expressions is not strictly left to right allowing for precedence rules. In particular, the value of a variable in an expression is never stored in a temporary simply to preserve its value from change by the evaluation of a function designator in the expression. Otherwise, the evaluation does proceed from left to right and according to precedence rules, including the referencing of formal parameters and the calculation of the address of subscripted variables. All function designators are evaluated in Boolean expressions. 2. Own variables and arrays in procedures. The own quantities local to the body of a procedure which is called from more than one point in a program record the history of the procedure as opposed to a history of each point of reference. In other words, only one copy of the own quantities is preserved. APPENDIX G Fortran Subprograms in an Algol Program The standard procedures FORTRAN, FORTRANF, FTN, and FTNF are used to call compiled Fortran subroutines and functions from within an Algol program. Each procedure has one parameter which is a call of the desired Fortran subprogram. The Fortran subprogram must be declared external as described in Section V. The use of these procedures simply causes a Fortran calling sequence to be generated by the compiler. Of course the subprogram could be written in CODAP as well as Fortran, provided it is designed to link through a Fortran-type calling sequence. The procedures are used as follows: FORTRAN—generates a Fortran 62 calling sequence for a subroutine FORTRANF—generates a Fortran 62 calling sequence for a function FTN—generates a Fortran 63 calling sequence for a subroutine FTNF—generates a Fortran 63 calling sequence for a function Each of these procedures is standard, i.e., available without declaration. FORTRANF and FTNF are used in expressions. Examples: x := FTNF (ALPHA(T,A[0,0])) FORTRAN (SUB(I + J)) . The following restrictions must be observed: labels, procedures with no parameters, standard procedure names, and array names cannot be used as arguments of a call of a Fortran subprogram. However, in the case of an array, the subscripted variable which is the first element of the array will satisfy a Fortran subroutine which has an array name as a formal parameter. The name of the Fortran subprogram cannot be a formal parameter. Literals must be enclosed in string quotes. Footnotes [1]See Appendix A for syntactical definition. [2]For definition of Fortran format, see Control Data Fortran-62 Reference Manual. Acknowledgment The author was greatly assisted in the preparation of this document by several persons who have contributed labors or advice to the construction of the compiler. These include N. B. Alexander and A. A. Grau, also K. A. Wolf of Control Data Corporation, and especially R. G. Stueland of Control Data Corporation. ORNL-3460 UC-32—Mathematics and Computers TID-4500 (23rd ed.) INTERNAL DISTRIBUTION 1. Biology Library 2-4. Central Research Library 5. Reactor Division Library 6-7. ORNL--Y-12 Technical Library Document Reference Section 8-27. Laboratory Records Department 28. Laboratory Records, ORNL R.C. 29. R. K. Adams 30. Nancy Alexander 31. E. D. Arnold 32. Don Arnurius 33. George J. Atta 34. Susie E. Atta 35. S. J. Ball 36. J. E. Bigelow 37. R. E. Biggers 38. Craig Brandon 39. J. C. Bresee 40-41. L. L. Bumgarner 42. W. R. Burrus 43. H. P. Carter 44. D. K. Cavin 45. Arline Culkowski 46. W. Davis, Jr. 47. H. J. de Bruin 48. P. B. DeNee 49. A. C. Downing 50. L. C. Emerson 51. Margaret Emmett 52. R. L. Ferguson 53. B. R. Fish 54. P. A. Haas 55. M. Feliciano 56. Barbara Ann Flores 57. T. B. Fowler 58. R. E. Funderlic (K-25) 59. D. A. Gardiner 60. C. D. Griffies 61. D. A. Griffin 62. D. G. Gosslee 63. M. T. Harkrider 64. M. C. Hill 65. A. S. Householder 66. W. H. Jordan 67. H. W. Joy 68. F. B. K. Kam 69. George Kidd 70. L. J. King 71. Ann Klein 72. K. A. Kraus 73. C. E. Larson 74. M. E. LaVerne 75. Elmon Leach 76. R. P. Leinius 77-78. M. P. Lietzke 79. Erlie McDaniel 80. C. D. Martin 81. K. O. Martin 82. Betty F. Maskewitz 83. R. P. Milford 84. F. L. Miller, Jr. 85. R. V. Miskell 86. S. E. Moore 87. J. F. Murdock 88. C. W. Nestor, Jr. 89. V. K. Pare 90. Carl E. Parker 91. S. K. Penny 92. A. M. Perry 93. D. C. Ramsey 94. M. T. Robinson 95. R. M. Rush 96. Y. Shima 97. J. E. Simpkins 98. M. J. Skinner 99. C. D. Scott 100. C. D. Susano 101. J. A. Swartout 102. M. E. Tsagaris 103. D. K. Trubey 104. J. S. Watson 105. A. M. Weinberg 106. M. E. Whatley 107. C. S. Williams 108. H. A. Wright 109. Y-12 Central Files 110. J. H. Zeigler (K-25) 111. H. Zeldes EXTERNAL DISTRIBUTION 112. T. H. Elrod, Control Data Corporation, Computer Division, 3330 Hillview Avenue, Palo Alto, California 113. A. A. Grau, Department of Mathematics, Northwestern University, Evanston, Illinois 114. R. G. Stueland, Control Data Corporation, Computer Division, 3330 Hillview Avenue, Palo Alto, California 115. K. A. Wolf, Control Data Corporation, Programing Systems, 501 Park Avenue, Minneapolis 15, Minnesota 116. R. A. Zemlin, Control Data Corporation, Computer Division, 3330 Hillview Avenue, Palo Alto, California 117. Research and Development Division, AEC, ORO 118-728. Given distribution as shown in TID-4500 (23rd ed.) under Mathematics and Computers category (75 copies--OTS) Transcriber’s Notes In the HTML version, represented code in a monospaced font, with keywords in boldface as in the Revised Report. Corrected a few palpable typos. Created an original cover image, using elements from the printed book, for free and unrestricted use with this eBook. End of the Project Gutenberg EBook of The Oak Ridge ALGOL Compiler for the Control Data Corporation 1604, by L. L. Bumgarner *** END OF THIS PROJECT GUTENBERG EBOOK THE OAK RIDGE ALGOL COMPILER *** ***** This file should be named 50468-0.txt or 50468-0.zip ***** This and all associated files of various formats will be found in: http://www.gutenberg.org/5/0/4/6/50468/ Produced by David Starner, Stephen Hutcheson, and the Online Distributed Proofreading Team at http://www.pgdp.net (This book was produced from images made available by the HathiTrust Digital Library.) Updated editions will replace the previous one--the old editions will be renamed. Creating the works from print editions not protected by U.S. copyright law means that no one owns a United States copyright in these works, so the Foundation (and you!) can copy and distribute it in the United States without permission and without paying copyright royalties. Special rules, set forth in the General Terms of Use part of this license, apply to copying and distributing Project Gutenberg-tm electronic works to protect the PROJECT GUTENBERG-tm concept and trademark. Project Gutenberg is a registered trademark, and may not be used if you charge for the eBooks, unless you receive specific permission. If you do not charge anything for copies of this eBook, complying with the rules is very easy. You may use this eBook for nearly any purpose such as creation of derivative works, reports, performances and research. They may be modified and printed and given away--you may do practically ANYTHING in the United States with eBooks not protected by U.S. copyright law. Redistribution is subject to the trademark license, especially commercial redistribution. START: FULL LICENSE THE FULL PROJECT GUTENBERG LICENSE PLEASE READ THIS BEFORE YOU DISTRIBUTE OR USE THIS WORK To protect the Project Gutenberg-tm mission of promoting the free distribution of electronic works, by using or distributing this work (or any other work associated in any way with the phrase "Project Gutenberg"), you agree to comply with all the terms of the Full Project Gutenberg-tm License available with this file or online at www.gutenberg.org/license. Section 1. General Terms of Use and Redistributing Project Gutenberg-tm electronic works 1.A. By reading or using any part of this Project Gutenberg-tm electronic work, you indicate that you have read, understand, agree to and accept all the terms of this license and intellectual property (trademark/copyright) agreement. If you do not agree to abide by all the terms of this agreement, you must cease using and return or destroy all copies of Project Gutenberg-tm electronic works in your possession. If you paid a fee for obtaining a copy of or access to a Project Gutenberg-tm electronic work and you do not agree to be bound by the terms of this agreement, you may obtain a refund from the person or entity to whom you paid the fee as set forth in paragraph 1.E.8. 1.B. "Project Gutenberg" is a registered trademark. It may only be used on or associated in any way with an electronic work by people who agree to be bound by the terms of this agreement. There are a few things that you can do with most Project Gutenberg-tm electronic works even without complying with the full terms of this agreement. See paragraph 1.C below. There are a lot of things you can do with Project Gutenberg-tm electronic works if you follow the terms of this agreement and help preserve free future access to Project Gutenberg-tm electronic works. See paragraph 1.E below. 1.C. The Project Gutenberg Literary Archive Foundation ("the Foundation" or PGLAF), owns a compilation copyright in the collection of Project Gutenberg-tm electronic works. Nearly all the individual works in the collection are in the public domain in the United States. If an individual work is unprotected by copyright law in the United States and you are located in the United States, we do not claim a right to prevent you from copying, distributing, performing, displaying or creating derivative works based on the work as long as all references to Project Gutenberg are removed. Of course, we hope that you will support the Project Gutenberg-tm mission of promoting free access to electronic works by freely sharing Project Gutenberg-tm works in compliance with the terms of this agreement for keeping the Project Gutenberg-tm name associated with the work. You can easily comply with the terms of this agreement by keeping this work in the same format with its attached full Project Gutenberg-tm License when you share it without charge with others. 1.D. The copyright laws of the place where you are located also govern what you can do with this work. Copyright laws in most countries are in a constant state of change. If you are outside the United States, check the laws of your country in addition to the terms of this agreement before downloading, copying, displaying, performing, distributing or creating derivative works based on this work or any other Project Gutenberg-tm work. The Foundation makes no representations concerning the copyright status of any work in any country outside the United States. 1.E. Unless you have removed all references to Project Gutenberg: 1.E.1. The following sentence, with active links to, or other immediate access to, the full Project Gutenberg-tm License must appear prominently whenever any copy of a Project Gutenberg-tm work (any work on which the phrase "Project Gutenberg" appears, or with which the phrase "Project Gutenberg" is associated) is accessed, displayed, performed, viewed, copied or distributed: This eBook is for the use of anyone anywhere in the United States and most other parts of the world at no cost and with almost no restrictions whatsoever. You may copy it, give it away or re-use it under the terms of the Project Gutenberg License included with this eBook or online at www.gutenberg.org. If you are not located in the United States, you'll have to check the laws of the country where you are located before using this ebook. 1.E.2. If an individual Project Gutenberg-tm electronic work is derived from texts not protected by U.S. copyright law (does not contain a notice indicating that it is posted with permission of the copyright holder), the work can be copied and distributed to anyone in the United States without paying any fees or charges. If you are redistributing or providing access to a work with the phrase "Project Gutenberg" associated with or appearing on the work, you must comply either with the requirements of paragraphs 1.E.1 through 1.E.7 or obtain permission for the use of the work and the Project Gutenberg-tm trademark as set forth in paragraphs 1.E.8 or 1.E.9. 1.E.3. If an individual Project Gutenberg-tm electronic work is posted with the permission of the copyright holder, your use and distribution must comply with both paragraphs 1.E.1 through 1.E.7 and any additional terms imposed by the copyright holder. Additional terms will be linked to the Project Gutenberg-tm License for all works posted with the permission of the copyright holder found at the beginning of this work. 1.E.4. Do not unlink or detach or remove the full Project Gutenberg-tm License terms from this work, or any files containing a part of this work or any other work associated with Project Gutenberg-tm. 1.E.5. Do not copy, display, perform, distribute or redistribute this electronic work, or any part of this electronic work, without prominently displaying the sentence set forth in paragraph 1.E.1 with active links or immediate access to the full terms of the Project Gutenberg-tm License. 1.E.6. You may convert to and distribute this work in any binary, compressed, marked up, nonproprietary or proprietary form, including any word processing or hypertext form. However, if you provide access to or distribute copies of a Project Gutenberg-tm work in a format other than "Plain Vanilla ASCII" or other format used in the official version posted on the official Project Gutenberg-tm web site (www.gutenberg.org), you must, at no additional cost, fee or expense to the user, provide a copy, a means of exporting a copy, or a means of obtaining a copy upon request, of the work in its original "Plain Vanilla ASCII" or other form. Any alternate format must include the full Project Gutenberg-tm License as specified in paragraph 1.E.1. 1.E.7. Do not charge a fee for access to, viewing, displaying, performing, copying or distributing any Project Gutenberg-tm works unless you comply with paragraph 1.E.8 or 1.E.9. 1.E.8. You may charge a reasonable fee for copies of or providing access to or distributing Project Gutenberg-tm electronic works provided that * You pay a royalty fee of 20% of the gross profits you derive from the use of Project Gutenberg-tm works calculated using the method you already use to calculate your applicable taxes. The fee is owed to the owner of the Project Gutenberg-tm trademark, but he has agreed to donate royalties under this paragraph to the Project Gutenberg Literary Archive Foundation. Royalty payments must be paid within 60 days following each date on which you prepare (or are legally required to prepare) your periodic tax returns. Royalty payments should be clearly marked as such and sent to the Project Gutenberg Literary Archive Foundation at the address specified in Section 4, "Information about donations to the Project Gutenberg Literary Archive Foundation." * You provide a full refund of any money paid by a user who notifies you in writing (or by e-mail) within 30 days of receipt that s/he does not agree to the terms of the full Project Gutenberg-tm License. You must require such a user to return or destroy all copies of the works possessed in a physical medium and discontinue all use of and all access to other copies of Project Gutenberg-tm works. * You provide, in accordance with paragraph 1.F.3, a full refund of any money paid for a work or a replacement copy, if a defect in the electronic work is discovered and reported to you within 90 days of receipt of the work. * You comply with all other terms of this agreement for free distribution of Project Gutenberg-tm works. 1.E.9. If you wish to charge a fee or distribute a Project Gutenberg-tm electronic work or group of works on different terms than are set forth in this agreement, you must obtain permission in writing from both the Project Gutenberg Literary Archive Foundation and The Project Gutenberg Trademark LLC, the owner of the Project Gutenberg-tm trademark. Contact the Foundation as set forth in Section 3 below. 1.F. 1.F.1. Project Gutenberg volunteers and employees expend considerable effort to identify, do copyright research on, transcribe and proofread works not protected by U.S. copyright law in creating the Project Gutenberg-tm collection. Despite these efforts, Project Gutenberg-tm electronic works, and the medium on which they may be stored, may contain "Defects," such as, but not limited to, incomplete, inaccurate or corrupt data, transcription errors, a copyright or other intellectual property infringement, a defective or damaged disk or other medium, a computer virus, or computer codes that damage or cannot be read by your equipment. 1.F.2. LIMITED WARRANTY, DISCLAIMER OF DAMAGES - Except for the "Right of Replacement or Refund" described in paragraph 1.F.3, the Project Gutenberg Literary Archive Foundation, the owner of the Project Gutenberg-tm trademark, and any other party distributing a Project Gutenberg-tm electronic work under this agreement, disclaim all liability to you for damages, costs and expenses, including legal fees. YOU AGREE THAT YOU HAVE NO REMEDIES FOR NEGLIGENCE, STRICT LIABILITY, BREACH OF WARRANTY OR BREACH OF CONTRACT EXCEPT THOSE PROVIDED IN PARAGRAPH 1.F.3. YOU AGREE THAT THE FOUNDATION, THE TRADEMARK OWNER, AND ANY DISTRIBUTOR UNDER THIS AGREEMENT WILL NOT BE LIABLE TO YOU FOR ACTUAL, DIRECT, INDIRECT, CONSEQUENTIAL, PUNITIVE OR INCIDENTAL DAMAGES EVEN IF YOU GIVE NOTICE OF THE POSSIBILITY OF SUCH DAMAGE. 1.F.3. LIMITED RIGHT OF REPLACEMENT OR REFUND - If you discover a defect in this electronic work within 90 days of receiving it, you can receive a refund of the money (if any) you paid for it by sending a written explanation to the person you received the work from. If you received the work on a physical medium, you must return the medium with your written explanation. The person or entity that provided you with the defective work may elect to provide a replacement copy in lieu of a refund. If you received the work electronically, the person or entity providing it to you may choose to give you a second opportunity to receive the work electronically in lieu of a refund. If the second copy is also defective, you may demand a refund in writing without further opportunities to fix the problem. 1.F.4. Except for the limited right of replacement or refund set forth in paragraph 1.F.3, this work is provided to you 'AS-IS', WITH NO OTHER WARRANTIES OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO WARRANTIES OF MERCHANTABILITY OR FITNESS FOR ANY PURPOSE. 1.F.5. Some states do not allow disclaimers of certain implied warranties or the exclusion or limitation of certain types of damages. If any disclaimer or limitation set forth in this agreement violates the law of the state applicable to this agreement, the agreement shall be interpreted to make the maximum disclaimer or limitation permitted by the applicable state law. The invalidity or unenforceability of any provision of this agreement shall not void the remaining provisions. 1.F.6. INDEMNITY - You agree to indemnify and hold the Foundation, the trademark owner, any agent or employee of the Foundation, anyone providing copies of Project Gutenberg-tm electronic works in accordance with this agreement, and any volunteers associated with the production, promotion and distribution of Project Gutenberg-tm electronic works, harmless from all liability, costs and expenses, including legal fees, that arise directly or indirectly from any of the following which you do or cause to occur: (a) distribution of this or any Project Gutenberg-tm work, (b) alteration, modification, or additions or deletions to any Project Gutenberg-tm work, and (c) any Defect you cause. Section 2. Information about the Mission of Project Gutenberg-tm Project Gutenberg-tm is synonymous with the free distribution of electronic works in formats readable by the widest variety of computers including obsolete, old, middle-aged and new computers. It exists because of the efforts of hundreds of volunteers and donations from people in all walks of life. Volunteers and financial support to provide volunteers with the assistance they need are critical to reaching Project Gutenberg-tm's goals and ensuring that the Project Gutenberg-tm collection will remain freely available for generations to come. In 2001, the Project Gutenberg Literary Archive Foundation was created to provide a secure and permanent future for Project Gutenberg-tm and future generations. To learn more about the Project Gutenberg Literary Archive Foundation and how your efforts and donations can help, see Sections 3 and 4 and the Foundation information page at www.gutenberg.org Section 3. Information about the Project Gutenberg Literary Archive Foundation The Project Gutenberg Literary Archive Foundation is a non profit 501(c)(3) educational corporation organized under the laws of the state of Mississippi and granted tax exempt status by the Internal Revenue Service. The Foundation's EIN or federal tax identification number is 64-6221541. Contributions to the Project Gutenberg Literary Archive Foundation are tax deductible to the full extent permitted by U.S. federal laws and your state's laws. The Foundation's principal office is in Fairbanks, Alaska, with the mailing address: PO Box 750175, Fairbanks, AK 99775, but its volunteers and employees are scattered throughout numerous locations. Its business office is located at 809 North 1500 West, Salt Lake City, UT 84116, (801) 596-1887. Email contact links and up to date contact information can be found at the Foundation's web site and official page at www.gutenberg.org/contact For additional contact information: Dr. Gregory B. Newby Chief Executive and Director gbnewby@pglaf.org Section 4. Information about Donations to the Project Gutenberg Literary Archive Foundation Project Gutenberg-tm depends upon and cannot survive without wide spread public support and donations to carry out its mission of increasing the number of public domain and licensed works that can be freely distributed in machine readable form accessible by the widest array of equipment including outdated equipment. Many small donations ($1 to $5,000) are particularly important to maintaining tax exempt status with the IRS. The Foundation is committed to complying with the laws regulating charities and charitable donations in all 50 states of the United States. Compliance requirements are not uniform and it takes a considerable effort, much paperwork and many fees to meet and keep up with these requirements. We do not solicit donations in locations where we have not received written confirmation of compliance. To SEND DONATIONS or determine the status of compliance for any particular state visit www.gutenberg.org/donate While we cannot and do not solicit contributions from states where we have not met the solicitation requirements, we know of no prohibition against accepting unsolicited donations from donors in such states who approach us with offers to donate. International donations are gratefully accepted, but we cannot make any statements concerning tax treatment of donations received from outside the United States. U.S. laws alone swamp our small staff. Please check the Project Gutenberg Web pages for current donation methods and addresses. Donations are accepted in a number of other ways including checks, online payments and credit card donations. To donate, please visit: www.gutenberg.org/donate Section 5. General Information About Project Gutenberg-tm electronic works. Professor Michael S. Hart was the originator of the Project Gutenberg-tm concept of a library of electronic works that could be freely shared with anyone. For forty years, he produced and distributed Project Gutenberg-tm eBooks with only a loose network of volunteer support. Project Gutenberg-tm eBooks are often created from several printed editions, all of which are confirmed as not protected by copyright in the U.S. unless a copyright notice is included. Thus, we do not necessarily keep eBooks in compliance with any particular paper edition. Most people start at our Web site which has the main PG search facility: www.gutenberg.org This Web site includes information about Project Gutenberg-tm, including how to make donations to the Project Gutenberg Literary Archive Foundation, how to help produce our new eBooks, and how to subscribe to our email newsletter to hear about new eBooks.