DataMuseum.dk

Presents historical artifacts from the history of:

CP/M

This is an automatic "excavation" of a thematic subset of
artifacts from Datamuseum.dk's BitArchive.

See our Wiki for more about CP/M

Excavated with: AutoArchaeologist - Free & Open Source Software.


top - metrics - download

⟦83d6a405d⟧ TextFile

    Length: 236928 (0x39d80)
    Types: TextFile
    Names: »D14«

Derivation

└─⟦53be6501e⟧ Bits:30005867/disk02.imd Dokumenter (RCSL m.m.)
    └─⟦this⟧ »D14« 

TextFile





















         ALGOL 7 
Reference Manual 




















                                Third Edition
A/S REGNECENTRALEN                April 1979
     Information Department RCSL 42 - i 1279\f

         Author:             Hans Dinsen Hansen, Bodil Larsen 
 
        
 
 
 
 
 
 
KEY WORDS:          RC 4000, RC 6000, RC 8000, Basic Software, ALGOL, 
                   Reference Manual. 
 
 
 
 
ABSTRACT:          This manual describes the RC ALGOL 7 language. The 
                   description is based on the Reference Manual for 
                   ALGOL 60. 
 
 
 
SUPPORTING AND REFERENCED DOCUMENTS: 
                   The list of supporting and referenced documents is 
                   included just before last page of this manual. 
 
 
 
 
 
 
 
 
 
 
 
 
Reservation 
 
 
 
 
 
 
Copyright   A/S Regnecentralen, 1979 
Printed by A/S Regnecentralen, Copenhagen\f

                   TABLE OF CONTENTS                       Page 
           
           
          INTRODUCTION                                                  9 
           
          1  NOTATION                                                   10 
           
          2  BASIC SYMBOLS, IDENTIFIERS, NUMBERS AND STRINGS            11
                 2.0.1 Character set and coding                         11
                 2.0.2 Source text                                      13
                 2.0.3 Source files                                     14 
                 2.0.4 Space and New Line                               14 
             2.1 Letters                                                15 
             2.2 Digits and Logical Values                              16 
                 2.2.1 Digits                                           16 
                 2.2.2 Logical Values                                   16 
             2.3 Delimiters                                             16 
             2.4 Identifiers                                            19 
                 2.4.1 Syntax                                           19 
                 2.4.2 Examples                                         20 
                 2.4.3 Semantics                                        20 
             2.5 Numbers                                                20 
                 2.5.1 Syntax                                           20 
                 2.5.2 Examples                                         21 
                 2.5.3 Semantics                                        21 
                 2.5.4 Types                                            21 
                 2.5.5 Integer and Long Literals                        21 
                 2.5.6 Real literals                                    21 
             2.6 Strings                                                22 
                 2.6.1 Syntax                                           22 
                 2.6.2 Examples                                         23 
             2.7 Quantities, Kinds and Scopes                           23 
             2.8 Values and Types                                       23 
              
          3  EXPRESSIONS                                                25 
             3.1 Variables and Fields                                   25 
                 3.1.1 Syntax                                           25 
                 3.1.2 Examples                                         26 
                 3.1.3 Semantics                                        26 
                       3.1.3.1 Zones and Record Variables               26 
                       3.1.3.2 Fields                                   27 
                 3.1.4 Subscripts                                       27 
                       3.1.4.1 Subscripted variables                    27 
                       3.1.4.2 Subscript positions                      27 
                       3.1.4.3 Array fields                             28 \f

                 3.1.5 Initial Values of Variables                      28 
                 3.1.6 Ranges of values. Type length. Binary patterns   28 
                       3.1.6.1 Booleans                                 28 
                       3.1.6.2 Integers                                 28 
                       3.1.6.3 Longs                                    29 
                       3.1.6.4 Reals                                    29 
                 3.1.7 Reals used as semi-long integers                 29 
                 3.2 Function Designators                                   30 
                 3.2.1 Syntax                                           30 
                 3.2.2 Examples                                         31 
                 3.2.3 Semantics                                        31 
                 3.2.4 Standard functions                               31 
                 3.2.5 Transfer functions                               31 
             3.3 Arithmetic expressions                                 31 
                 3.3.1 Syntax                                           31 
                 3.3.2 Examples                                         33 
                 3.3.3 Semantics                                        33 
                     3.3.4 Operators and types                              35 
                            3.3.4.1 Operators                                35 
                       3.3.4.2 Operations                               35 
                                   3.3.4.2.1 Operation term'modfactor'    36 
                       3.3.4.3 Operation factor'**primary'            36 
                       3.3.4.4 Type of a conditional expression         36 
                       3.3.4.5 Types of the monadic operators
                               and the pattern operators                36 
                     3.3.5 Precedence of operators                          37 
                       3.3.5.1 Syntax                                   37 
                       3.3.5.2 Expression                               38 
                3.3.6 Arithmetic of real, long,
                       and integer quantities                           38 
             3.4 Boolean expressions                                    39 
                 3.4.1 Syntax                                           39 
                 3.4.2 Examples                                         40 
                 3.4.3 Semantics                                        40 
                 3.4.4 Types                                            40 
                       3.4.5 The operators                                    40 
                 3.4.6 Precedence of operators                          41 
                           3.4.6.1 Syntax                                   41 
                       3.4.6.2 The use of parentheses                   41 
                 3.4.7 Arithmetic of boolean quantities                 41 
             3.5 Designational expressions                              42 
                 3.5.1 Syntax                                           42 
                 3.5.2 Examples                                         42 
                 3.5.3 Semantics                                        42 
                 3.5.4 The subscript expression                         42 \f

                 3.5.5 Switch versus case statement                     43 
             3.6 String expressions                                     43 
                 3.6.1 Syntax                                           43 
                 3.6.2 Examples                                         43 
                 3.6.3 Semantics                                        43 
                 3.6.4 Types                                            44 
                 3.6.5 Binary patterns                                  44 
                       3.6.5.1 Text portion and short text string       44 
                       3.6.5.2 Long text string                         44 
                       3.6.5.3 Layout string                            45 
                       3.6.5.4 Reference of strings                     45 
             3.7 Zone expressions         46 
                 3.7.1 Syntax                                           46 
                 3.7.2 Examples                                         46 
                 3.7.3 Semantics                                        46 
           
          4  STATEMENTS                                                 47 
             4.1 Compound statements and blocks                         47 
                 4.1.1 Syntax                                           47 
                 4.1.2 Examples                                         48 
                 4.1.3 Semantics                                        49 
             4.2 Assignment statements                                  50 
                 4.2.1 Syntax                                           50 
                 4.2.2 Examples                                         50 
                 4.2.3 Semantics                                        51 
                                4.2.3.1 Location                                 51 
                       4.2.3.2 Expression                               51 
                       4.2.3.3 Value of the expression                  51 
                 4.2.4 Types                                            51 
             4.3 Goto statements                                        52 
                 4.3.1 Syntax                                           52 
                 4.3.2 Examples                                         52 
                 4.3.3 Semantics                                        52 
                 4.3.4 Restriction                                      52 
                 4.3.5 Goto an undefined switch designator              52 
             4.4 Dummy statements                                       52 
                 4.4.1 Syntax                                           52 
                 4.4.2 Examples                                         53 
                 4.4.3 Semantics                                        53 
             4.5 Conditional Statements                                 53 
                 4.5.1 Syntax                                           53 
                 4.5.2 Examples                                         53 
                 4.5.3 Semantics                                        54 
                       4.5.3.1 If statement                             54 
                       4.5.3.2 Conditional if statement                 54 \f

                 4.5.4 Goto into a conditional  if statement            54 
                 4.5.5 Case statement                                   55 
                       4.5.5.1 Semantic                                 55 
                       4.5.5.2 Example                                  55 
             4.6 Repetitive Statements                                  56 
                       4.6.0.1 Syntax                                   56 
                       4.6.0.2 For statements                           56 
                 4.6.1 Syntax                                           56 
                 4.6.2 Examples                                         56 
                 4.6.3 Semantics                                        56 
                 4.6.4 The for list element                             57 
                       4.6.4.1 Arithmetic expression element            57 
                       4.6.4.2 Step-until element                       57 
                       4.6.4.3 While element                            57 
                 4.6.5 The value of the controlled variable upon exit   58 
                 4.6.6 Goto leading into a for statement                58 
                 4.6.7 Repeat statement                                 58 
                 4.6.8 Syntax                                           58 
                 4.6.9 Examples                                         58 
                 4.6.10 Semantics                                       58 
                 4.6.11 While statement                                 58 
                 4.6.12 Syntax                                          58 
                 4.6.13 Examples                                        59 
                 4.6.14 Semantics                                       59 
             4.7 Procedure statements                                   59 
                 4.7.1 Syntax                                           59 
                 4.7.2 Examples                                         59 
                 4.7.3 Semantics                                        59 
                       4.7.3.1 Value assignment (call by value)         60 
                       4.7.3.2 Name replacement (call by name)          61 
                       4.7.3.3 Body replacement and execution           61 
                          4.7.4 Actual formal correspondance                     61 
                 4.7.5 Restrictions                                     61 
                       4.7.5.1 String supplied as an actual parameter   61 
                       4.7.5.2 Formal name parameter                    62 
                       4.7.5.3 Actual parmeter                          62 
                       4.7.5.4 (This section has been deleted)          62 
                       4.7.5.5 Restrictions imposed by specifications   62 
                4.7.6 (This section has been deleted)                  64 
                 4.7.7 Parameter delimiters                             64 
                 4.7.8 Procedure body expressed in slang code           64 
                 4.7.9 Standard procedures                              64 
                 4.7.10 Recursive procedures                            64 
             4.8 Context statements                                     64 
                 4.8.1 Syntax                                           64 \f

                 4.8.2 Examples                                         64 
                 4.8.3 Semantics                                        65 
 
          5  DECLARATIONS                                               67 
             5.1 Type declarations                                      68 
                 5.1.1 Syntax                                           68 
                 5.1.2 Examples                                         68 
                 5.1.3 Semantics                                        68 
             5.2 Array declarations                                     68 
                 5.2.1 Syntax                                           68 
                 5.2.2 Examples                                         69 
                 5.2.3 Semantics                                        69 
                       5.2.3.1 Subscript bounds                         69 
                       5.2.3.2 Dimensions                               69 
                       5.2.3.3 Types                                    69 
                 5.2.4 Lower upper bound expressions                    69 
                       5.2.4.1 Expressions                              69 
                       5.2.4.2 Expressions                              69 
                            5.2.4.3 Array definition                         70 
                       5.2.4.4 Expressions                              70 
                 5.2.5 (This section has been deleted)                  70 
                 5.2.6 Lexicographical ordering                         70 
                       5.2.6.1 Multi-dimensional array
                               as actual parameter                      71 
                       5.2.6.2 Multi-dimensional array as field base    71 
                 5.2.7 Bound halfwords and halfword numbering           71 
                 5.2.8 Word boundaries and addresses                    71 
             5.3 Switch declaration                                     72 
                 5.3.1 Syntax                                           72 
                 5.3.2 Examples                                         72 
                 5.3.3 Semantics                                        72 
                 5.3.4 Evaluation of expressions in the switch list     72 
                 5.3.5 Influence of scopes                              72 
             5.4 Procedure declaration                                  72 
                 5.4.1 Syntax                                           72 
                 5.4.2 Examples                                         73 
                 5.4.3 Semantics                                        74 
                 5.4.4 Values of function designators                   75 
                 5.4.5 Specifications                                   76 
                 5.4.6 Code as procedure body                           76 
                 5.4.7 Procedure translated alone                       76 
                       5.4.7.1 Example                                  77 
             5.5 Zone declarations                                      77 
                 5.5.1 Syntax                                           77 
                 5.5.2 Examples                                         77 
                 5.5.3 Semantics                                        77 \f

                      5.5.4 Types                                            79 
                      5.5.5 Scope                                            79 
                      5.5.6 Standard zones                                   80 
                      5.5.7 Standard block procedure                         80 
             5.6 Zone array declarations                                80 
                 5.6.1 Syntax                                           80 
                 5.6.2 Examples                                         80 
                 5.6.3 Semantics                                        80 
                 5.6.4 Types                                            80 
                 5.6.5 Scope                                            81 
             5.7 Field declarations                                     81 
                 5.7.1 Syntax                                           81 
                 5.7.2 Examples                                         81 
                 5.7.3 Semantics                                        81 
                 5.7.4 Location of a variable field                     81 
                 5.7.5 Location and bounds of an array field            82 
             5.8 Context declarations                                   83 
                 5.8.1 Syntax                                           83 
                 5.8.2 Examples                                         83 
                 5.8.3 Semantics                                        83 
                       5.8.3.1 Incarnation Interval                     83 
                       5.8.3.2 Initialization of Context Variables      84 
                       5.8.3.3 Storage of Context Variables             84 
                       5.8.3.4 Context Mode                             85 
                 5.8.4 Types                                            85 
 
          REFERENCES                                                    86 
          INDEX                                                         88 \f

         F_        I_n_t_r_o_d_u_c_t_i_o_n_ 
           
                   This book contains the formal description of the ALGOL language
          and the corresponding ALGOL 7 compiler used on RC 8000, RC 4000
          and RC 6000. 
           
          The description of the reference language follows the structure
          of Revised Report of ALGOL 60 (cf. ref. 11 and 12). The elements
          which are in ALGOL 7 but not in ALGOL 60 are merged into this
          description. 
           
          The book gives a syntax and a semantic description for all
          language elements. Furthermore short examples are given to
          illustrate the syntax, further examples are found in ref. 14
          ALGOL 7 User's Manual. 
           
          Hans Dinsen Hansen has delivered the first manuscript to this
          manual. Parts of the old ALGOL 6 manual are used.\f

F_       1         N_o_t_a_t_i_o_n_ 
           
           
          The syntax of the ALGOL 7 elements are described with aid of an
                 improved BNF (Backus-Naur FORM) where repetition suffixes are
                   used. (cf. ref. 15) 
           
          The following example and short explanation may help to under-
          stand at least the basic idea of the language. 
          1* 
                    transaction' ::=   tr  transdate' 0  trfield' 1 
                    transdata' ::=     day'.month'.19year' 
                                        payment' 
                    trfield' ::=       invoice' 
           
               or more compact:                                     *
     1payment' 
           transaction' ::=   tr  day'.month'.19year'  0  invoice'
1 
           
          A BNF description is composed of a set of statements, each one
          naming and defining a syntactial unit or string by means of a de-
          finition symbol ::= to the right of which the possible components
          of the string are stated. (What is in fact defined is not a sing-
          le string but a whole class of strings having the properties spe-
          cified by the right side). The components may either be other
          strings or data constants - i.e. sequences of so-called terminal
          symbols which, in fact, are nothing but typographical representa-
          tions of elements of the data spectrum. (In the example tr,. and
          19). 
           
          A string is denoted by a name enclosed in brackets '. The name,
          which may be a whole sentence, will normally be chosen to give
          the reader some associations with the information represented by
          the string. The order of the statements in a description is imma-
          terial, but all referred strings must be defined somewhere else
          in the description. On the other hand, the order of the compo-
          nents to the right of the ::= symbol prescribe exactly the order
          in which the data elements must appear. In this way concatenation
          of the real data elements is implied in the description. 
           
          Alternative data structures are described as separate lines en-
          closed in     . The same bracket is used around repetitive data
          structures. The repetive factor is specified by the lower and
                   upper bound numbers connected to the bracket. * denotes any num-
          ber. \f

F_       2         B_a_s_i_c_ _s_y_m_b_o_l_s_,_ _I_d_e_n_t_i_f_i_e_r_s_,_ _N_u_m_b_e_r_s_ _a_n_d_ _s_t_r_i_n_g_s_ 
           
           
          The Algol 7 language is built up from the following basic
          symbols:   
           
                   letter' 
          basic symbol'::=   digit'
                              logical value' 
                              delimiter' 
                    
         2.0.1     C_h_a_r_a_c_t_e_r_ _s_e_t_ _a_n_d_ _c_o_d_i_n_g_ 
                   The Algol 7 character set is a subset of the ISO 7-bit character
          set extended with the Danish letters: æ, @, , , å, Å. (See ref.
          13). At run time, the program may choose any alphabet, but the
          ISO 7-bit code is offered as  standard. It is possible in a
          simple way to use paper tapes in flexowriter code as source and
          data, because the i/o system may convert the code to ISO 7-bit
          code (see ref. 3 and 14). 
                    
          The table 2.1 shows for each character of the ISO 7-bit alphabet:
                
          V:        The internal value. 
          G:        The graphic representation or the name of the character.
          S:        The character class as source to the translator. 
          D:        The character class as data read with the standard
                    alphabet. 
           \f

T_     ____________T_a_b_l_e_ _2_._1_ _C_h_a_r_a_c_t_e_r_ _S_e_t_ _a_n_d_ _I_n_p_u_t_ _C_l_a_s_s_ ___________________
              _V_ _ _G_ _ _ _S_ _ _ _ _ _ _ _D_ _ _V_ _ _G_ _ _S_ _ _ _ _ _ _ _D_ _ _V_ _ _G_ _S_ _ _ _ _ _ _ _D_ _ _V_ _ _ _G_ _ _ _S_ _ _ _ _ _ _ _D_ _
       0 NUL blind   0  32 SP basic   7  64 @ graphic 7  96     graphic 7 
       1 SOH illegal 7  33 !  basic   7  65 A basic   6  97  a   basic   6 
       2 STX illegal 7  34 "  graphic 7  66 B basic   6  98  b   basic   6 
       3 ETX illegal 7  35 >  graphic 7  67 C basic   6  99  c   basic   6 
       4 EOT illegal 7  36 <  graphic 7  68 D basic   6  100 d   basic   6 
       5 ENQ illegal 7  37 %  graphic 7  69 E basic   6  101 e   basic   6 
       6 ACK illegal 7  38 &  basic   7  70 F basic   6  102 f   basic   6 
       7 BEL illegal 7  39   basic   5  71 G basic   6  103 g   basic   6 
 
       8 BS  illegal 7  40 (  basic   7  72 H basic   6  104 h   basic   6 
       9 HT  illegal 7  41 )  basic   7  73 I basic   6  105 i   basic   6 
      10NL  basic   8  42 *  basic   7  74 J basic   6  106 j   basic   6 
      11 VT  illegal 7  43 +  basic   3  75 K basic   6  107 k   basic   6 
         12 FF  basic   8  44 ,  basic   7  76 L basic   6  108 l   basic   6 
      13 CR  blind   0  45 -  basic   3  77 M basic   6  109 m   basic   6 
      14 SO  illegal 7  46 .  basic   4  78 N basic   6  110 nbasic   6 
      15 SI  illegal 7  47 /  basic   7  79 Obasic   6  111 o   basic   6 
       
      16 DLE illegal7  48 0  basic   2  80 P basic   6  112 p   basic   6 
      17 DC1 illegal 7  49 1  basic   2  81 Q basic   6  113 q   basic   6 
      18 DC2 illegal 7  50 2  basic   2  82 R basic   6  114 r   basic   6 
      19 DC3 illegal 7  51 3  basic   2  83 S basic   6  115 s   basic   6 
      20 DC4 illegal 7  52 4  basic   2  84 T basic   6  116 t   basic   6 
      21 NAK illegal7  53 5  basic   2  85 U basic   6  117 u   basic   6 
      22 SYN illegal 7  54 6  basic   2  86 V basic   6  118 v   basic   6 
      23 ETB illegal 7  55 7  basic   2  87 W basic   6  119 w   basic   6 
      
      24 CAN illegal 7  56 8  basic   2  88 X basic   6  120 x   basic   6 
      25 EM  basic   8  57 9  basic   2  89 Y basic   6  121 y   basic   6 
      26 SUB illegal 7  58 :  basic   7  90 Z basic   6  122 z   basic   6 
      27 ESC illegal 7  59 ;  basic   7  91 @ basic   6  123 æ   basic   6 
      28 FS  illegal 7  60   basic   7  92 Ø basic   6  124    basic   6 
      29 GS  illegal 7  61 =  basic   7  93 Å basic   6  125 å   basic   6 
      30 RS  illegal 7  62 '  basic   7  94   graphic 7  126     graphic 7 
      31 US  illegal 7  63 ?  graphic 7  95 _ in text 7  127 DEL blind   0 
      _ _ _ _________________________________________________________________
          &_
                   D_,_D_a_t_a_ _c_l_a_s_s_e_s_ 
 
                 0,blind:            The character is skipped by all read
                                procedures. 
                   1,shift character:  Not used in the standard alphabet. 
                  \f

                   2,digits:           May be used as digits in a number or in a
                                       text string.  
            3,signs:            May be used as a sign of number or in a text-
                                       string.
                   4,decimal point:    May be used as the decimal point of a number,
                                       in a text string or in a field reference. 
          5,exponent mark:    May be used as the exponent mark of a number
                              or in a text string. 
                   6,letters:          May be used as part of a text string. Will
                              terminate a number. 
                   7,delimiters:       Will terminate a number or a text string. 
                   8,terminator:       Works as class 7, but terminates a call of
                                       readall. EM (25) will immediately terminate a
                              call of read or readstring. 
 
                   S_,_S_o_u_r_c_e_ _t_e_x_t_ _c_l_a_s_s_e_s_ 

          Basic:              Significant in all contexts. 
                   Blind:              Skipped in all contexts. 
                   Graphic:            Allowed inside text strings and comments,
                              causes a warning outside. 
                   Illegal:            Produces a warning during the translation,
                              but does not harm. 
                   In text:            Works as a space inside text strings, blind
                                       outside. 
 
                   C_o_n_t_r_o_l_ _c_h_a_r_a_c_t_e_r_s_ 
 
                   The control characters which are used in algol are the following:
 
          10,NL:              New Line. The change-to-new-line character. 
                   12,FF:              Form Feed. Causes a change of page on the
                                       printer, but works syntactically as New Line
                                       outside text strings. 
                   25,EM:              End Medium. See 2.0.3.
                   32,SP:              Space. 
                   127,DEL:            Delete. Used for overpunching of wrong
                              characters. 
 
       2.0.2     S_o_u_r_c_e_ _t_e_x_t_ 
          The program consists either of one block, of one compound
          statement, or of one procedure declaration surrounded by
          "external" and "end". 
                    
                   All characters up to the first "begin" or "external" are skipped,\f

               but appear in a possible listing. 
          
         After the last "end", the compiler reads as many characters as
         are necessary to distinguish the "end" (usually a space or a new
         line). 
                   
2.0.3     S_o_u_r_c_e_ _f_i_l_e_s_ 
The source text to the compiler consists of one or more f_i_l_e_s_ of
         text as specified in the File Processor command that started the
                   translation. The compiler may read source files from standard
          input devices such as paper tape,  cards, typewriter, magnetic
          tape, and backing storage. 
          
         A file terminates either when an E_M_-character is read from the
         file or when the file physically is exhausted. A file on a roll
          of paper tape is exhausted when the tape end is met. A file on
          the backing storage is exhausted when the end of the backing
          storage area is met. A file on magnetic tape is exhausted when
          tape mark is met. 
          
         When the compiler meets the file termination before the source
         text is complete, it looks for the next file specified in the
                File Processor command and continues reading from that file. If
         the list of files is exhausted, the compiler prints an error
         message, generates the necessary number of string terminations
         and "end"s, and compiles the program completed in this way. 
          
         The compiler handles the peripheral devices in accordance with
         the rules of the File Processor (ref. 6 or 7). 
           
2.0.4     S_p_a_c_e_ _a_n_d_ _N_e_w_ _L_i_n_e_ 
           Space and New Line may be used freely in numbers and between
         identifiers, compound symbols, and other delimiters. They are
                not, however, allowed inside identifiers, compound symbols, or
         delimiters. 
          
         Space and New Line are significant characters in a text string
         and will be printed out at run time when the string is printed. 
          
         The character "_" represents a space inside strings, but is
         completely blind outside. The latter property may be used to
         divide identifiers and compound symbols (cf. 2.3). \f

T_       2.1       L_e_t_t_e_r_s_ 
 
 
                              aA
            bB
          cC
dD
eE
fF
                   small letter'::=     g                capital letter'::=G
hH
iI
jJ
kK
lL
mM
nN
oO
pP
qQ
          rR
                    sS
                                         t      T
uU
          vV
 wW
  xX
  y      Y
         zZ
æ@
Ø
åÅ
           
    small letter' 
          letter' ::=  capital letter' 

          Letters do not have individual meaning. They are used for forming
          identifiers and strings (cf. sections 2.10 Identifiers, 2.12
&_        Strings). 
           \f

  T_     2.2       D_i_g_i_t_s_ _a_n_d_ _L_o_g_i_c_a_l_ _V_a_l_u_e_s_ 
           
     2.2.1     D_i_g_i_t_s_ 
          0
                                    1 
                               2
3
                   digit' ::=4
                         5
      6
      7
8
9

&_          Digits are used for forming numbers, identifiers, and strings. 
           
           
T_       2.2.2     L_o_g_i_c_a_l_ _v_a_l_u_e_s_ 
           
          logical value' ::=           true 
                                       false 
           
&_          The logical values have a fixed obvious meaning. 
           
           
T_2.3       D_e_l_i_m_i_t_e_r_s_ 
           
          The underlined delimiters (compound symbols) of the reference
          language are written without underlining. A Space or a New Line
&_            is required to separate a compound symbol from a preceding iden-
                  tifier or a succeeding letter or digit. Thus the delimiter space
          is forbidden inside a delimiter, but the symbol " _" may be used
          instead. The delimiter "goto" and "boolean" may not be written as
          "go to" and "Boolean". 


                              operator' 
                              separator' 
          delimiter' ::=     bracket' 
                              declarator' 
                              specificator' 
                              compiler directive' 
               \f

         T_                            arithmetic operator' 
                              relational operator' 
                   operator' ::=      logical operator' 
                              sequential operator' 
                                       pattern operator' 
         &_                           context operator' 
           
         T_                                      +
                                       -
                *
          /
          //
          arithmetic operator' ::=mod
          **
          round
          abs
          entier
         &_        extend 
           
         T_                                      
           =
       relational operator' ::==
'=
'
&_'
          
         T_                                      ==
='
                                        or
    logical operator' ::=! 
                                        and 
               & 
         &_                                      -,
                    
T_                                      goto 
                                        if 
                                        then 
                                                 else 
          sequential operator' ::=     for 
                                        do 
                                        case 
                                        of 
                                                 repeat 
&_                                      while 
 
         T_                                      real 
          transfer operator' ::=       long 
         &_                                      string 
           \f

         T_        context operator' ::=        exit 
                                        continue 
               
                    
                                        add 
                   pattern operator' ::=        extract 
                                        extend 
         &_                                      shift 
                    
                    
         T_; 
                                        , 
                                        . 
                                        , 
                                                 : 
          separator' ::=               := 
                                        _ 
                                        step 
                                        until 
                                                 while 
         &_                                      comment 
                    
                    
T_                                      (
)
         :
          bracket' ::=:'

'
*
*'
         begin 
         &_                                      end 
       T_           
                              own 
                              boolean 
                              integer 
                                long 
                                real
         declarator' ::=    array 
                              switch 
                              zone 
                              procedure 
       &_                              context 
                              field 
                               \f

       T_                                       string 
          specificator' ::=           label 
       &_                                       value 
                               
                               
       T_                                        algol 
                   compiler directive' ::=      external 
       &_                                        message 
            
          Delimiters have a fixed meaning which for the most part is
                  obvious, or else will be given at the appropriate place in the
                sequel. 
           
               For the purpose of including text among the symbols of a program
          the following "comment" conventions hold: 
                  
         T_       The sequence of basic symbols:              is equivalent with
            
                  ;commentany sequence not containing";"';;
                   begin commentany sequence not containing";"';          begin 
                end any sequence not containing "end",";", 
             "else" or "until"'                                   end
          ;message any sequence not containing";"';              ;  
          begin message any sequence not containing";"';         begin 
       &_          * any sequence not containing "*" or "*'" ' *' space 
            
By equivalence is here meant that any of the structures shown in
the left hand column may, in any occurrence outside of strings,
be replaced by the symbol shown on the same line in the right
hand column without any effect on the action of the program. The
         comment structure encountered first in the text when reading from
left to right has precedence in being replaced over later struc-
tures contained in the sequence. 
          
 
T_2.4       I_d_e_n_t_i_f_i_e_r_s_  
       
2.4.1     S_y_n_t_a_x_ 
          * 
                   identifier' ::= letter'    letter'
                  digit'
&_                    0
               
          The words for compound symbols (see 2.6.1 and 2.7) can never be
            used as identifiers. 
           \f

T_       2.4.2     E_x_a_m_p_l_e_s_:_ 
                     q 
                             Soup 
                    V17a 
                    a34kTMNs 
                         MARILYN 
                    goto  go _to         Both are interpreted as the deli-
                              miter "goto". 
                       go to               An erroneous construction consis-
                              ting of two identifiers. 
                    13 do a7:=          The number 13, the delimiter "do",
                              the identifier a7, and the delimi-
                              ter := 
                          begin of _line : =   An erroneous construction consis-
                              ting of the delimiter "begin", the
                              identifier "of _line", the delimiter :
                              and the delimiter = 
  &_     
 
 2.4.3     S_e_m_a_n_t_i_c_s_ 
          Identifiers have no inherent meaning, but serve for the identifi-
                cation of simple variables, arrays, labels, switches, procedures,
          field variables, zones, and zone arrays. They may be chosen free-
          ly, except for the limitation mentioned above. 
            
           The same identifier cannot be used to denote two different quan-
          tities except when these quantities have disjoint scopes as de-
           fined by the declarations of the program (cf. section 2.7 Quan-
          tities, Kinds and Scopes and section 5. Declarations). 
                    
 
T_      2.5       N_u_m_b_e_r_s_ 
                 
      2.5.1     S_y_n_t_a_x_ 
                    * 
                   unsigned integer'::=  digit'   
&_                 1       
T_                        +  1 
&_                 integer'::=  -  0  unsigned integer' 
 
          decimal fraction'::=  .unsigned integer' 
           
          exponent part'::=  "integer' \f

T_ 1 
          decimal number'::=   unsigned integer' decimal fraction'
&_                                 decimal fraction'                  0 
T_            1 
          unsigned number'::=  decimal number' exponent part' 
&_                    exponent part'   0 
T_                +1
&_             number'::=  -0unsigned number' 
           
          The numbers of digits are restricted, (cf. sections 2.5.5 and
          2.5.6). 
 
T_       2.5.2     E_x_a_m_p_l_e_s_ 
                    0         -200.084          -.083"-02 
                  177          +07.43"8             -"7 
                  .5384          9.34"+10           "-4 
&_                +0.7300          2"-4              +"+5 
 
2.5.3     S_e_m_a_n_t_i_c_s_ 
          Decimal numbers have their conventional meaning. The exponent
            part is a scale factor expressed as an integral power of 10. 
 
2.5.4     T_y_p_e_s_ 
          Integers are either of type integer or of type long, depending
          on the value. All other representable numbers are of type real. 
 
         2.5.5     I_n_t_e_g_e_r_ _a_n_d_ _l_o_n_g_ _l_i_t_e_r_a_l_s_ 
          Integers and longs may not exceed the interval 
           
          -140 737 488 355 327  _ integer  _ 140 737 488 355 327. 
           
                   If the literal is within the interval 
           
          -8 388 607  _ integer  _ 8 388 607 
             
                  it is classified as being of type integer. Outside this interval
          it is classified as being of type long (cf. section 3.3.4).
       
 2.5.6     R_e_a_l_ _l_i_t_e_r_a_l_s_ 
          The real may not have more than 14 significant digits or 14 deci-
         mals. The exponent part may not exceed the interval
                  -1000  exponent  1000. The total number is confined to the
                  range -1.6"616 _ number _ 1.6"616. 
             
           The number is converted to internal binary form using the same\f

          methods as the procedures read and readall. The relative error
               of the result is about 3>-11. 
                   
                 
T_       2.6       S_t_r_i_n_g_s_ 
           
2.6.1     S_y_n_t_a_x_ 
      
          string literal'::=    text string' 
                                 layout string' 
&_ 
            text string'::= 
              :any sequence of text symbols not containing ":'"or ":"':'
          
               layout string'::=  layout' ' 
 
layout'::= 
T_11   1 
&_          spaces' 0 sign' 0 layout number part' layout exponent part'  0 
           
T_*
&_          spaces'::=  space' 1 
                 
               space'::=   _ 
               
T_               +
&_                 sign'::=  - 
T_            first letter'd>s'.d>s'zeroes' 
&_          layout number part'::=  first letter'd>s'zeroes'.zeroes' 

T_             z 
                              d 
          first letter'::=   f 
&_                              b 
T_1*
&_          d>s'::=        space' 0  d  0 
           
T_          1* 
&_          zeroes'::=     space' 0  0  0 
 
          layout exponent part'::=  >sign'first letter'd>s' 
 
          A text symbol is a character belonging to one of the classes
          basic, graphic, or in text (see 2.0.1) or it is a positive
        integer of at most 3 digits enclosed in '. The latter construc-\f

        tion has precedence over the character by character interpreta-
tion, and represents the character with the integer as internal
value.  The value must obey 0 value 128. The general string
concept is described in 3.6. 
       
T_    2.6.2    E_x_a_m_p_l_e_s_ 
                            :ab 99''d:'      will be printed by a running
                                                program as 
                      ab c'd 
&_                     _-d.ddd>+d'       is a layout string. 
         
                  
T_       2.7      Q_u_a_n_t_i_t_i_e_s_,_ _k_i_n_d_s_ _a_n_d_ _s_c_o_p_e_s_ 
                    
          The following k_i_n_d_s_ of quantities are distinguished: simple va-
&_          riables, arrays, labels, switches, procedures, field variables,
           zones and zone arrays. 
           
          The s_c_o_p_e_ of a quantity is the set of statements and expressions
                  in which the declaration of the identifier associated with that
                   quantity is valid. For labels see section 4.1.3. 
 
                    
T_       2.8       V_a_l_u_e_s_ _a_n_d_ _t_y_p_e_s_ 
                    
           A v_a_l_u_e_ is an ordered set of numbers (special case: a single
&_                number), an ordered set of logical values (special case: a
           single logical value), or a label. 
                    
          Certain of the syntactic units are said to possess values. These
          values will in general change during the execution of the pro-
          gram. The values of expressions and their constituents are de-
          fined in section 3. The value of an array identifier is the or-
          dered set of values of the corresponding array of subscripted
          variables (cf. section 3.1.4.1). 
           
                The value of a zone is a set of values called the zone descrip-
               tor, plus a set of values in the zone buffer area, plus a set of
              values called the share descriptors (see 5.5). 
           
          The value of a zone array is the set of values of the correspon-
          ding subscripted zones. 
           
                   The various t_y_p_e_s_ (integer, real, long, boolean) basically de-
          note properties of values. The types associated with syntactic
          units refer to the values of these units. \f

           
          A field variable possesses an integer value, but has an associa-
          ted type denoting the type of a field. A field is either a simple
          field or an array field. Fields are subsets of arrays or
          zones. Variable fields posses a single value. Array fields are
          one dimensional arrays. \f

F_       3         E_x_p_r_e_s_s_i_o_n_s_
                 
            
                In the language the primary constituents of the programs descri-
                  bing algorithmic processes are arithmetic, boolean, designatio-
           nal, zone, and string expressions. Constituents of these expres-
          sions, except for certain delimiters, are logical values, num-
          bers, variables, function designators, and elementary arithmetic,
                 relational, logical, pattern, and sequential operators. Since the
                syntactic definition of both variables and function designators
          contains expressions, the definition of expressions, and their
                   constituents, is necessarily recursive. 
           
         T_                           arithmetic expression' 
                   boolean expression' 
              expression'::=    designational expression' 
                             string expression' 
&_                   zone expression' 
                    
           
        3.1       V_a_r_i_a_b_e_l_s_ _a_n_d_ _f_i_e_l_d_s_ 
                 
      3.1.1     S_y_n_t_a_x_ 
                 variable identifier'   ::= identifier' 
                simple variable'       ::= variable identifier' 
          simple field variable' ::= identifier' 
          array field variable'  ::= identifier' 
                 field variable'        ::= simple field variable' 
                                      array field variable' 
           subscript expression'  ::= arithmetic expression' 
           * 
          subscript list' ::= subscript expression' ,subscript expression' 0 
          array identifier'      ::= identifier' 
           zone identifier'       ::= identifier' 
          zone array identifier' ::= identifier' 
          zone expression'       ::= zone identifier'
                                      zone array identifier'(subscript expr.') 
          field base'            ::= array identifier' 
                                            zone expression' 
                                      array field' 
                  array field'           ::= field base'.array field variable' 
          simple field'          ::= field base'.simple field variable' 
         record variable' ::= zone identifier'(subscript expression')
                                     zone array ident.'(subscr. expr.',subscr. expr.')\f

T_          subscripted variable' ::= array identifier'(subscript list')
&_                                     array field'(subscript expression') 
    T_                                simple variable' 
                             simple field' 
            variable' ::=     subscripted variable' 
                             record variable' 
&_                                  field variable' 
T_                field reference' ::=      array field' 
                                            simple field' 
&_          field' ::=                field reference' 
        
T_ 3.1.2     E_x_a_m_p_l_e_s_ 
                     epsilon 
                   detA 
                   a17 
                   Q(7, 2) 
                   x(sin(n*pi/2), Q(3, n, 4)) 
                          P.type 
&_                   term (termno).entry 
                
 3.1.3     S_e_m_a_n_t_i_c_s_ 
         A v_a_r_i_a_b_l_e_ is a designation given to a single value. This value
             may be used in expressions for forming other values and may be
          changed at will by means of assignment statements (section 4.2). 
          
         The t_y_p_e_ _o_f_ _a_ _s_i_m_p_l_e_ _v_a_r_i_a_b_l_e_ is defined in the declaration of
         the variable itself (cf. section 5.1 Type declaration). 
           
         The t_y_p_e_ _o_f_ _a_ _v_a_r_i_a_b_l_e_ _f_i_e_l_d_ is defined in the declaration of the
         simple field variable (cf. section 5.7 Field declaration). 
          
         The t_y_p_e_ _o_f_ _a_ _s_u_b_s_c_r_i_p_t_e_d_ _v_a_r_i_a_b_l_e_ is defined in the declaration
         of the array identifier (cf. section 5.2 Array declaration) or in
         the declaration of the ultimate array field variable defining the
         array field (cf. section 5.7 Field declaration). 
          
         The t_y_p_e_ _o_f_ _a_ _r_e_c_o_r_d_ _v_a_r_i_a_b_l_e_ is real, and the type of a field
               variable is integer. 
           
3.1.3.1   Z_o_n_e_s_ _a_n_d_ _r_e_c_o_r_d_ _v_a_r_i_a_b_l_e_s_._ Record variables designate values
which are components of zone buffer areas. The subscript expres-
sions are evaluated like subscripts of ordinary subscripted va-
 riables. 
          
          In case of a zone array with subscripts, the first subscript ex-\f

         pression selects a zone from the zone array. This subscript must
  obey 
        
                  1_subscript_number of zones declared in zone array. 
          
         The last subscript selects a variable within the zone record,
         which in turn is a set of consecutive variables of the selected
         zone buffer area. This subscript must obey 

             1_subscript_number of variables currently in the record. 
         
          When an expression is assigned to a record variable, the location
         (see 4.2.3) of the selected buffer element is not influenced by
         possible changes of the record caused by procedure calls in the
         right hand expression. 
          
T_       3.1.3.2   F_i_e_l_d_s_ 
                   Fields are subsets of arrays and zone records. A field consists of
         a number of halfwords located within an array or a zone. This ar-
&_ray or zone is the field base for the field. A field variable is
a pointer indicating a field within an array, a zone record, or
an array field. The type of the field depends only upo a type de-
clared together with the field variable (cf. section 5.7 Field
declaration). All the halfwords of a simple field must be located
within the field base. 
                    
T_      3.1.4   S_u_b_s_c_r_i_p_t_s_ 
              
 3.1.4.1 S_u_b_s_c_r_i_p_t_e_d_ _v_a_r_i_a_b_l_e_s_ may designate values which are components
of multidimensional arrays (cf. section 5.2 Array declarations).
&_Each arithmetic expression of the subscript list occupies one
subscript position of the subscripted variable, and is called a
subscript. The complete list of subscripts is enclosed in the
subscript brackets (). The array component referred to by a sub-
scripted variable is specified by the actual numerical value of
its subscripts (cf. section 3.3 Arithmetic expressions). 
          
T_     3.1.4.2 E_a_c_h_ _s_u_b_s_c_r_i_p_t_ _p_o_s_i_t_i_o_n_ acts like a variable of type integer and
         the evaluation of the subscript is understood to be equivalent
&_           to an assignment to this fictive variable (cf. section 4.2.4). 
           
          The value of the subscripted variable is defined only if the  
           value of the subscript expression is within the subscript bounds 
          of the array (cf. section 5.2 Array declarations). \f

T_3.1.4.3   A_n_ _a_r_r_a_y_ _f_i_e_l_d_ is an array always considered one dimensional. The
ordering of the halfwords in the field base and in the array
field follows the lexicographical ordering (cf. 5.2.6 Lexicogra-
&_phical ordering) The subscript bounds are defined by means of the
halfword bounds (cf. 5.2.7). The halfword bounds for the array
field are obtained by subtracting the value of the array field
variable from the halfword bounds of the field base (possibly an
         array field). An element must be located within the field base. 
          
T_3.1.5     I_n_i_t_i_a_l_ _v_a_l_u_e_s_ _o_f_ _v_a_r_i_a_b_l_e_s_ 
        The value of a variable, not declared own or context, is unde-
fined from entry into the block in which it is declared until an
&_assignment is made to it.  
 
The value of a variable declared own or context is binary zero
(if arithmetic) or false (if boolean) on first entry to the block
in which it is declared. On subsequent entries it has the same
value as at the preceding exit from the block. 
           
T_       3.1.6     R_a_n_g_e_s_ _o_f_ _v_a_l_u_e_s_._ _T_y_p_e_ _l_e_n_g_t_h_._ _B_i_n_a_r_y_ _p_a_t_t_e_r_n_s_ 
Depending on the type, each variable is represented by an inte-
&_gral number of halfwords. Each halfword is of 12 bits. The number
of halfwords representing a variable is called the t_y_p_e_ _l_e_n_g_t_h_.
The type length may some times be expressed in bits. 
           
T_       3.1.6.1   B_o_o_l_e_a_n_s_ are represented as 12 bits quantities. The type length
          of a boolean variable is 1 halfword. The binary pattern of a
&_boolean is extended with zeroes to the left whenever needed. The
last of the 12 bits is 0 when the boolean is false, 1 when it is
true. 
 
The logical constants "true" and "false" and the result of apply-
ing the relational operators will always be 12 zeroes for false,
12 ones for true. Other binary patterns may be obtained by ap-
plying the operators add and shift. The 5 logical operators work
on all 12 bits in parallel. 
                    
T_     3.1.6.2   I_n_t_e_g_e_r_s_ are represented in 24-bits, 2"s complement, binary form.
          This gives the range: 
          -8 388 608 _ integer _ 8 388 607. 
&_The type length of an integer variable is 2 halfwords, and the
binary pattern of an integer is the 24 bites of its representa-
tion extended with zeroes to the left whenever needed. The binary
patterns are used in connection with the operators add, extract,
and shift. \f

T_     3.1.6.3   L_o_n_g_s_ are represented in 48 bits, 2"s complement, binary form.
          The range of longs should be confined to: 
       -140 737 488 355 327 _ long _ 140 737 488 355 327.  
&_The type length of a long variable is 4 halfwords, and the binary
pattern of a long is the 48 bits of its representation. The
binary patterns are used in connection with the operators add,
extract, and shift.  
    
T_3.1.6.4   R_e_a_l_s_ are represented as 48-bits built-in floating point numbers. This
          gives the following range of non-zero real values: 
&_                    1.6"-617  abs(real)  1.6"616 
          The precision of real values correspond to 35 significant bits.
          Thus one unit added to the last binary place will correspond to a
            relative change of the number of between 6"-11 and 3"-11. 
 
                   The type length of a real variable is 4 halfwords. The 3 first
halfwords are used for the number part and the last halfword for
exponent part of the real. 
          
         The binary pattern of a real consists of a 36-bits, 2"s comple-
         ment, number part followed by a 12-bits, 2"s complement, exponent
         part so that the real value is: 
                   number*2**exponent. 
         The number is either 0 or in the range -1 _ number  -0.5, 0.5 _
number  1. The exponent is in the range -2048 _ exponent _ 2047.
The exponent of 0.0 is -2048, but other exponents might be ob-
tained by the operator "add". 
          
         If r is a floating point zero with an exponent '-2048, the re-
         lation r = 0 will be false because the operands are compared bit
         by bit. The relations r _ 0 or r '_ 0 will both be true, however.
         Operations like r + b cannot be expected to give b (see ref. 4). 
          
T_      3.1.7  R_e_a_l_s_ _u_s_e_d_ _a_s_ _s_e_m_i_-_l_o_n_g_ _i_n_t_e_g_e_r_s_ 
         As there is neither built-in long multiplication nor built-in
&_         long division, programs using many of these operations on large
         integers may be speeded up some what by representing them as real
         variables. 
          
         This can be done with full accuracy as long as all results are
         kept in the range 
            -2**35 = -34 359 738 368 _ real _ 34 359 738 367 = 2**35 - 1 
         If the results exceeds this range, the last bits of the semi-long
             integer are lost. \f

A kind of integer division may be obtained by a real division fol-
                   lowed by a cut-off of decimals caused by the addition of a large
          constant. For results in the range 0 _ result _ 2**34, this is
          done as follows: 
T_                   roundconstant: = 2**34, 
&_                   result: = r1/r2 + roundconstant - roundconstant, 
         Safety against loss of accuracy may be obtained by scaling the
         semilong integers so that loss of accuracy will cause a floating
         point overflow. The scale factor f is chosen so that f*2**35 =
T_         2**2048 and f*(-2**35) = -2**2048. This is fulfilled by f =
         2**2013. Addition (i1 + i2) and multiplication (i1 * i2) with
check for loss of accuracy may be performed like this: 
                     r1: = i1*f,         r2: = i2*f, 
&_                           r1 + r2             r1/f*r2 
            
           
T_ 3.2     F_u_n_c_t_i_o_n_ _d_e_s_i_g_n_a_t_o_r_s_ 
          
     3.2.1   S_y_n_t_a_x_ 
&_                 procedure identifier' ::=   identifier' 
               
T_                                              string literal' 
                             expression' 
                             array identifier' 
                   actual parameter' ::=       array field' 
                             switch identifier' 
                             procedure identifier' 
                             zone identifier' 
&_                             zone array identifier' 
T_          *
&_                 letter string' ::=          letter'0

T_parameter delimiter' ::=         , 
&_                              )letter string':( 
           
T_          actual parameter list' ::=   *
&_        actual parameter' parameter delimiter'actual parameter'0
1
           actual parameter part' ::=         (actual parameter list')0 
            
T_          function designator' ::=  
&_                           procedure identifier'actual parameter part' 
           \f

T_          The parameter delimiter' known as "fat comma" defined by )let-
          ter string':( may not contain compound symbols, to prevent code
&_                 errors. Comment strings may not be used either. 
T_    
3.2.2     E_x_a_m_p_l_e_s_ 
                             sin (a - b) 
                           J(v + s, n) 
                   R 
                   S(s - 5)Temperature:(T)Pressure:(P) 
&_                     write(out, :good morning:', d.ddddd', folks) 
                
T_ 3.2.3   S_e_m_a_n_t_i_c_s_ 
               Function designators define single numerical or logical values,
               which result through the application of given sets of rules
&_         defined by a procedure declaration (cf. section 5.4 Procedure
         Declarations) to fixed sets of actual parameters. The rules
         governing specification of actual parameters are given in section
         4.7 Procedure Statements. Not every procedure declaration defines
         the value of a function designator. 
T_        
3.2.4     S_t_a_n_d_a_r_d_ _f_u_n_c_t_i_o_n_s_ The numerical standard functions of ALGOL 7  
          are listed below. They are described in detail in User>s Manual,
          ref. 14. 
                    
                    arcsin    cos       random  sin 
                   arctan    exp       sgn     sinh 
&_                        arg       ln        sign    sqrt 
               
T_     3.2.5   T_r_a_n_s_f_e_r_ _f_u_n_c_t_i_o_n_s_ 
           The operators add, extend, entier, extract, long, real, round and
          string take care of type transfers. 
          
 
T_      3.3       A_r_i_t_h_m_e_t_i_c_ _e_x_p_r_e_s_s_i_o_n_s_ 
          
     3.3.1   S_y_n_t_a_x_ 
         adding operator' ::=  + 
&_                       - 
T_          *
multiplying operator' ::=/
                              // 
&_          mod 
 
T_                                   shift  
   pattern operator' ::=        add  
&_                              extract 
                  \f

T_                                     abs  
                              entier  
monadic operator' ::=        round  
                              extend  
                              real  
&_                                               string 
                                        long 
                  
T_                                  unsigned number' 
                                 variable' 
                                 1function designator' 
                   primary' ::= monadic operator'   (arithmetic expression')  
                                            0 real string primary' 
&_                                          long string primary' 
                
  
T_                        factor'**
         factor' ::=       factor'pattern operator'    primary' 
&_                            boolean basic' extract 
T_         1
term' ::=         term'multiplying operator'    factor' 
&_              0
T_simple arithmetic expression' ::= 
           11
           simple arithmetic expression'   adding operator'   term' 
&_                 00
if clause' ::= if boolean expression' then 
         case clause' ::= case arithmetic expression' of 
           
T_arithmetic expression list' ::=*
&_         arithmetic expression' ,arithmetic expression'0
 
T_arithmetic expression' ::=   
              simple arithmetic expression'    
          if clause'simple arithmetic expression'elsearithmetic expression'
&_          case clause' (arithmetic expression list')  
                    
          string primary'              cf. 3.6.1 
            
                   boolean basic'               cf. 3.4.1 
           
                   boolean expression'          cf. 3.4.1 
           \f

 T_      3.3.2     E_x_a_m_p_l_e_s_ 
            Primaries: 
                7.394"-8 
     sum 
     w(i+2,8) 
     cos(y+z*3) 
     (a-3/y+vu**8) 
     long(if b then :abc:' else dd.d0') 
     abs round ra(i) 
         entier cos(y+z) 
                   Factors: 
   omega 
   round r shift (-6) add j 
   (a  b) extract 1 
   sum ** cos (y+z*3) 
&_   7-394"-8**w (i+2,8) ** (a-3/y+vu**8) 
          
T_                 Terms: 
            U 
&_            omega * sum**cos(y+z*3)/7.394"-8**w(i+2,8)**(a-3/y+vu**8) 
          
T_         Simple arithmetic expression: 
&_            U-Yu+omega*sum**cos(y+z*3)/7.394"-8**w(i+2,8)**(a-3/y+vu**8) 
          
T_         Arithmetic expressions: 
            w * u - Q(S+Cu)**2 
            if q'0 then S+3 * Q/A else 2 * S+3 * Q 
            if a0 then U+V else if a * b=17 then U/V  
                                  else if k'y then V/U else 0  
             a * sin (omega * t) 
            0.57"12 * a(N * (N - 1)/2, 0) 
            (A * arctan(y) + Z) ** (7 + Q) 
            if q then n-1 else n 
            if a0 then A/B else if b=0 then B/A else z 
            case 1 + f of (i mod j, if b then r**j else i, case i of (j)) 
&_            if b then (case i of (j,r)) else case i of (1,5) 
                    
T_      3.3.3     S_e_m_a_n_t_i_c_s_ 
         An arithmetic expression is a rule for computing a numerical va-
           lue. In the case of simple arithmetic expressions this value is
&_           obtained by executing the indicated arithmetic operations on the
           actual numerical values of the primaries of the expression, as
            explained in detail in Section 3.3.4 below. The actual numerical
           value of a primary is obvious in the case of numbers. For varia-
                   bles it is the current value (assigned last in the dynamic sen-\f

                   se), and for function designators it is the value rising from the
computing rules defining the procedure (see Section 5.4.4 Values
of function designators) when applied to the current values of
the procedure parameters given in the expression.  Finally, for
arithmetic expressions enclosed in parentheses the value must
through a recursive analysis be expressed in terms of the values
of primaries of the other three kinds. 
 
I_f_ 
            In the more general arithmetic expressions, which include i_f_ _c_l_a_u_-
s_e_s_, one out of several simple arithmetic expressions is selected
on the basis of the actual values of the boolean expressions (see
Section 3.4 Boolean expressions). This selection is made as fol-
lows: The boolean expressions of the if clauses are evaluated one
by one in sequence from left to right until one having the value
true is found. The value of the arithmetic expression is then the
value of the first arithmetic expression following this boolean.
If none of the boolean expressions has the value true, then the
         value of the arithmetic expression is the value of the expression
          following the final else. 
 
         C_a_s_e_ 
         The expressions of an expression list in a case expression are
separated by commas and numbered 1, 2, 3,... 
 
A_ _c_a_s_e_ _e_x_p_r_e_s_s_i_o_n_ is evaluated as follows: First, evaluate the
arithmetic expression and if necessary round it to an integer.
Next, select the list element corresponding to the result. If no
such list element exists, the run is terminated. Evaluate the
selected expression and take the result as the value of the case-
expression. 
 
The order of evaluation of primaries within an expression is not
defined. If different orders of evaluation would produce diffe-
rent results, due to the action of side effects of function de-
signators, then the program is undefined. 
          
         In evaluating an arithmetic expression, it is understood that all
         the primaries within that expression are evaluated, except those
         within any arithmetic expression that is governed by an if clause
                  but not selected by it. In the special case where an exit is made
           from a function designator by means of a goto statement (see sec-
           tion 5.4.4), the evaluation of the expression is abandoned, when
           the goto statement is executed. 
                    \f

T_       3.3.4     O_p_e_r_a_t_o_r_s_ _a_n_d_ _t_y_p_e_s_ 
         Apart from the boolean expressions of if clauses, the constitu-
         ents of simple arithmetic expressions must be of real, long or
&_integer types (see Section 5.1 Type declarations). The meaning of
the basic operators and the types of the expressions to which
they lead are given by the following rules:  
          
T_      3.3.4.1   T_h_e_ _o_p_e_r_a_t_o_r_s_ +, -, and * have the conventional meaning (addition,
                   subtraction, and multiplication). The type of the expression will
&_                 be integer if both of the operands are of integer type. The type
          is real if at least one of the operands is of real type.
          Otherwise the type is long. 
          
T_      3.3.4.2   T_h_e_ _o_p_e_r_a_t_i_o_n_s_  term / factor and term // factor both denote di-
                  vision.  The operations are undefined if the factor has the fac-
           tor value zero, but are otherwise to be understood as a multipli-
&_         cation of the term by the reciprocal of the factor with due re-
T_         gard to the rules of precedence (see Section 3.3.5). Thus for
         example 
                             a/b * 7/(p - q) * v/s 
         means 
              ((((a * (bUU-1DD)) * 7) * ((p - q)UU-1DD)) * v) * (sUU-1DD). 
         The operator / is defined for all nine combinations of real,
         long, and integer and will yield results of real type in any
&_         case. 
 
The operator // is defined only for operands of integer or long
type. The result is integer if both operands are integer and long
otherwise. 
T_         The result can be defined by the function: 
         long procedure div (a,b); 
         value               a,b; 
         long                a,b; 
         if b = 0 then 
         begin 
         if  spilltest then div:=a 
                       else alarm (:integer:') 
         end 
           else 
                   begin long q,r; 
             q:=0, r:=abs a; 
             for r:=r - abs b while r'=0 do q:=q+1; 
             div:= if a0 == b'0 then -q else q 
         &_        end; 
          \f

         If both operands are integer, an equivalent algorithm where all
         long specifications and declarations are replaced by integer spe-
         cifications and declarations, must be used as definition. 
            
T_     3.3.4.2.1 T_h_e_ _o_p_e_r_a_t_i_o_n_ term' mod factor' is defined where // is defined,
&_and yields values of the same types as //.  For long resulting
                   values, the result may be defined by the function: 
         T_                  long procedure modulus (a,b); 
                  value                    a,b; 
                  long                     a,b; 
         &_                  modulus:=     a - div(a,b)*b;  
                    
         3.3.4.3   T_h_e_ _o_p_e_r_a_t_i_o_n_ factor'**primary' denotes exponentation where the
          factor is the base and the primary is the exponent. Thus for
          example 
                  2**n**k means (2UUUnDDD)UUUkDDD 
        while 
                  2**(n**m) means 2UU(nUUmDD)DD 
The result of an exponentation is always real. The precision of
the exponentation is explained in ref. 14. 
 
    T_   3.3.4.4   T_y_p_e_ _o_f_ _a_ _c_o_n_d_i_t_i_o_n_a_l_ _e_x_p_r_e_s_s_i_o_n_. 
        The result of 
                     if clause'simple arithmetic expression' else 
                  arithmetic expression' 
&_        is of type integer if both expressions are of type integer, of
        type real if at least one expression is of type real, and of type
        long otherwise. 
        The result of 
                            case clause'(arithmetic expression list') 
        is of type integer if all expressions in the list are of type
        integer, of type real if at least one expression is of type real,
        and of type long otherwise. 
         
     3.3.4.5   T_y_p_e_s_ _o_f_ _t_h_e_ _m_o_n_a_d_i_c_ _o_p_e_r_a_t_o_r_s_ _a_n_d_ _t_h_e_ _p_a_t_t_e_r_n_ _o_p_e_r_a_t_o_r_s_ 
                    
          Pattern operators: can be used in arithmetic and boolean
expressions. 
                    
        add       This dyadic pattern operator will perform a binary ad-
          dition. The type of the left hand operand will yield
                    the type of the result. 
           
               extract   This pattern operator extracts a number of the\f

                             rightmost bits. The result is of type integer. 
                    
               shift     This pattern operator will perform a logical shift of
the left hand operand. 
           
               Monadic operators: 
                    
abs       This operator yields the absolute value of integer,
long or real expressions. 
 
The following monadic operators are the transfer functions: 
                
extend    This operator converts an integer expression into a
type long. 
 
          entier    This operator transfers a real expression to the
          largest integer not greater than the expression. 
           
          long      This operator changes the type of a string or real
          expression into type long. 
           
          real      This operator changes the type of a string or long
          expression into type real. 
           
          round     This operator rounds the value of a real or long
                             expression to the nearest integer.
 
                   string    This operator changes type of real or long expression
          into type string. 
           
               Further description see Algol 7 User"s Manual ref. 14. 
                    
T_      3.3.5     P_r_e_c_e_d_e_n_c_e_ _o_f_ _o_p_e_r_a_t_o_r_s_ 
          Function calls in an expression may cause "side-effects", but the
&_          result will correspond to a left to right evaluation of the ex-
          pression, so that side-effects may only influence variables to
          the right of the function call. 
         
T_     3.3.5.1   A_c_c_o_r_d_i_n_g_ _t_o_ _t_h_e_ _s_y_n_t_a_x_ _g_i_v_e_n_ in section 3.3.1 the following
         rules of precedence hold: 
          
                   first:    abs    entier   real     round   long  extend  string
second:   **     add      extract  shift 
         third:    *      /        //       mod 
&_           fourth:   +      - \f

T_       3.3.5.2   T_h_e_ _e_x_p_r_e_s_s_i_o_n_ between a left parenthesis and the matching right
               parenthesis is evaluated by itself and this value is used in sub-
&_          sequent calculations. Consequently the desired order of execution
          of operations within an expression can always be arranged by ap-
          propriate positioning of parentheses. 
            
T_       3.3.6     A_r_i_t_h_m_e_t_i_c_ _o_f_ _r_e_a_l_,_ _l_o_n_g_,_ _a_n_d_ _i_n_t_e_g_e_r_ _q_u_a_n_t_i_t_i_e_s_. 
         The operations + - * / ** (for integer, long or real exponents)
are performed by the built in floating point operations whenever
&_the result is of type real, and by the fixed point operations
whenever the result is of type integer. Whenever the result is of
type long, + and - are performed by the built in double length
operations, whereas the operation * is performed by a subrou-
tine. 
          
         The operations // and mod are performed by the built in fixed
         point division whenever the result is of type integer, and by a
         subroutine whenever the result is of type long. 
          
         When necessary integer operands are floated by means of the built
         in float operation or converted to a long by extension of the
         sign. Conversion of operands of type long to type real is per-
         formed by a subroutine. 
          
         The range of values of type real and integer is given in 3.1.6.
         The action when the range of reals is exceeded, is controlled at
         run time by means of the two standard integer variables "over-
         flows" and "underflows" (cf. ref. 14). The action when the range
of integers or longs is exceeded, is determined at translation
          time by means of the translation parameter "spill" (cf.ref. 14).
           
(In the RC 4000 and RC 6000, the precision of real arithmetic may
          be decreased from 36 bits to 33 bits.  This option is controlled
          at run time by means of the standard procedure "system". The re-
          sults of the numerical standard functions are distorted corre-
          spondingly when the low precision is selected.) 
          
          \f

T_ 3.4       B_o_o_l_e_a_n_ _e_x_p_r_e_s_s_i_o_n_s_ 
 
    3.4.1     S_y_n_t_a_x_ 
    
= 
relational operator' ::=    = 
'= 
                             ' 
&_' 
 
T_and' ::=           and 
&_                    & 
 
T_or' ::=            or 
&_                   !
                    
T_                 relation' ::= 
                  simple arithmetic expression'relational operator' 
&_                 simple arithmetic expression' 
                
T_boolean pattern operator' ::=          add  
&_                                        shift 
                
T_boolean basic' ::= 
          logical value' 
          variable' 
                   function designator' 
                   boolean basic'boolean pattern operator'primary' 
&_             (boolean expression') 
                
T_               boolean primary' ::=        boolean basic' 
&_                             relation' 
T_               1
&_                 boolean secondary' ::=       -, 0  boolean primary' 
T_            1 
&_          boolean factor' ::=  boolean factor'and' 0 boolean secondary' 
T_                 1 
&_          boolean term' ::=  boolean term'or'  0  boolean factor' 
T_                 1 
&_                 implication' ::=     implication' =' 0 boolean term' 
            
T_                 1 
&_                 simple boolean' ::=       simple boolean'== 0  implication' 
                    \f

T_boolean expression list' ::= *
&_          boolean expression' ,boolean expression list'0 
          
T_         boolean expression' ::= 
                             simple boolean' 
                   if clause'simple boolean' else boolean expression' 
&_                           case clause'(boolean expression list') 
                    
T_     3.4.2     E_x_a_m_p_l_e_s_ 
                     if b add 1 shift 3 then (case i of (true, b or c)) else
                   case j of ((u=v) shift 1, false) 
          
         x = -2 
                   Y ' V or z  q 
         a + b ' -5 and z - d ' q **2 
         p or q and x ' y 
         g == -, a and b and -,c or d or e =' -,f 
                             if k  1 then s ' w else h= c 
&_         if if if a then b else c then d else f then g else h  k 
         
T_3.4.3     S_e_m_a_n_t_i_c_s_ 
           A boolean expression is a rule for computing a logical value.
                   The principles of evaluation are entirely analogous to those
&_           given for arithmetic expressions in Section 3.3.3. 
T_     3.4.4     T_y_p_e_s_ 
         Variables and function designators entered as boolean primaries
         must be declared boolean (see Section 5.1 Type declarations and
&_              Section 5.4.4 Values of function designators). 
           
T_      3.4.5     O_p_e_r_a_t_o_r_s_ 
         The relational operators ,=,=,'=,', ' have the meaning: less
           than, less than or equal to, equal to, greater than or equal to,
&_           greater than, not equal to, respectively. A relation take on the
value true whenever the corresponding relation is satisfied for
the expressions involved, otherwise false. 
          
         The meaning of the logical operators -, (not), and', or', 
         =' (implies), == (equivalent), is given by the following function
         table: 
          \f

         T_        b1                  false    false    true     true 
         b_2_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _f_a_l_s_e_ _ _ _ _t_r_u_e_ _ _ _ _ _f_a_l_s_e_ _ _ _ _t_r_u_e_ _ 
         -, b1               true     true     false    false 
         b1 and b2           false    false    false    true 
         b1 or b2            false    true     true     true 
                   b1 =' b2            true     true     false    true 
         &_      b1 == b2            true     false    false    true 
          
T_     3.4.6    P_r_e_c_e_d_e_n_c_e_ _o_f_ _o_p_e_r_a_t_o_r_s_ 
                   The sequence of operations within an expression is generally
evaluated from left to right, with the following additional
&_rules: 
          
T_  3.4.6.1  A_c_c_o_r_d_i_n_g_ _t_o_ _t_h_e_ _s_y_n_t_a_x_ given in Section 3.4.1 the following
         rules of precedence hold: 
         first:    arithmetic expressions and pattern operators according
                   to Section 3.3.5 
         second:   ,,=,=,'=,' 
third:    -, 
         fourth:   &, and (both notations equivalent) 
         fifth:    !, or (both notations equivalent) 
         sixth:    =' 
&_         seventh:  == 
          
T_      3.4.6.2  T_h_e_ _u_s_e_ _o_f_ _p_a_r_e_n_t_h_e_s_e_s_ will be interpreted in the sense given in
&_         Section 3.3.5.2. 
          
T_       3.4.7     A_r_i_t_h_m_e_t_i_c_ _o_f_ _b_o_o_l_e_a_n_ _q_u_a_n_t_i_t_i_e_s_ 
          The representation of booleans and some rules for boolean arith-
          metic is given in 3.1.6. Here, we add the rules for relational
&_          operators: 
          
T_                 ,=,'=,' are in most cases executed as a subtraction (floating
          point or fixed point) of the two operands. Thus, you
&_          must be prepared for overflow, underflow, or spill. 
T_               =,'      are always performed as a bit by bit comparison of the
          two operands. This may for instance be utilised to
          compare two text strings packed into real variables
&_          without risk of overflow. 
          
 \f

T_       3.5      D_e_s_i_g_n_a_t_i_o_n_a_l_ _e_x_p_r_e_s_s_i_o_n_s_ 
          
         3.5.1    S_y_n_t_a_x_ 
         label' ::= identifier' 
         switch identifier' ::= identifier' 
         switch designator' ::=  
&_switch identifier'(subscript expression') 
T_           simple designational expression' ::= label' 
                                                  switch designator' 
&_                                      (designational expression')
T_                 designational expression list' ::=*
&_                 designational expression'  ,designational expression' 0
T_                 designational expression' ::=   
         simple designational expression' 
         if clause'simple designational expression'elsedesignational expression'
&_           case clause'(designational expression list') 
          
T_       3.5.2    E_x_a_m_p_l_e_s_ 
                   L17 
         p9 
                      Choose(n-1) 
                      Town(if y  0 then N else N+1) 
         if Ab  c then L17 
                   else q (if w =0 then 2 else n) 
&_                           case p+q of (L17, P13, Choose(n-1)) 
                    
T_      3.5.3     S_e_m_a_n_t_i_c_s_ 
         A designational expression is a rule for obtaining a label of a
         statement (see Section 4 Statements). Again the principle of the
&_         evaluation is entirely analogous to that of arithmetic expressions
         (see Section 3.3.3). In the general case the booleanexpressions
                   of the if clauses will select a simple designational expression.
If this is a label the desired result is already found. A switch
designator refers to the corresponding switch declaration (see
Section 5.3 Switch declarations) and by the actual numerical va-
lue of its subscript expression selects one of the designational
          expressions listed in the switch declaration by counting these
          from left to right from 1 and up. Since the designational expres-
          sion thus selected may again be a switch designator this evalua-
          tion is obviously a recursive process. 
          
T_      3.5.4    T_h_e_ _s_u_b_s_c_r_i_p_t_ _e_x_p_r_e_s_s_i_o_n_ 
         The evaluation of the subscript expression is analogous to that
&_         of subscripted variables (see Section 3.1.4.2). The value of a
         switch designator is defined only if the subscript expression\f

         assumes one of the positive values 1,2,3...,n, where n is the
         number of entries in the switch list. 
          
T_      3.5.5    S_w_i_t_c_h_ _v_e_r_s_u_s_ _c_a_s_e_ _s_t_a_t_e_m_e_n_t_ 
                  It is recommended to use the case statements instead of "goto
         sw(i)". Case statements are much faster and may give a clearer
&_         program. 
          
 
T_       3.6       S_t_r_i_n_g_ _e_x_p_r_e_s_s_i_o_n_s_ 
          
      3.6.1    S_y_n_t_a_x_ 
&_             formal string' ::= identifier' 
T_                                            
                             formal string' 
                                   string literal' 
                string primary' ::=         string arithmetic expression' 
                               (string expression')  
&_                                      string primary' add primary' 
              
T_                 string expression list' ::= * 
&_                       string expression', 0 string expression' 
          
T_       string expression' ::=   
         string primary'  
                  if clause'string primary' else string expression'  
&_                  case clause'(string expression list') 
          
T_       3.6.2    E_x_a_m_p_l_e_s_ 
                   if b then :ok:' else :error:' 
                        case i of (:first:',:second',string ra(increase(j))) 
                   if b then (case i of (string r,fs)) 
&_                                    else case i of(:ab:',d.dd') 
          
         3.6.3     S_e_m_a_n_t_i_c_s_ 
         A string expression is a rule for computing a string value. The
         principles of evaluation are analogous to the evaluation of an
         arithmetic expression. The monadic operator "string" changes the
         type of a real or long expression into type string. The value of
         string real' or string long' has the same bit pattern as the
value of the operand (see below). 
 
         String expressions are used as actual parameters and as arguments
         of the operator "real". 
          \f

T_         The value of a string expression is 
          
         a short text string      (a literal text string of at most 5
                                    characters, for example :abcde:'),
              a long text string       (a literal text string of more than
                                     5 characters, for example :result:'), 
         a layout string          (for example dd.dd"+d'), or 
         a text portion           (6 characters none of which are Nulls.
                                  This cannot occur as a literal text, but
                                  may be obtained by the operators
                                  "string" or "add", for example 
&_                                  :abcde:'add 92). 
          
T_     3.6.4     T_y_p_e_s_ 
         The argument of the operator "string" must be of type real or
         long. A formal string must be a formal parameter specified as
&_         string. 
          
T_     3.6.5     B_i_n_a_r_y_ _p_a_t_t_e_r_n_ 
         The binary pattern of a string value is 48 bits with the values
&_         given below. 
          
T_       3.6.5.1   T_e_x_t_ _p_o_r_t_i_o_n_ _a_n_d_ _s_h_o_r_t_ _t_e_x_t_ _s_t_r_i_n_g_. The characters of the text
         string (omitting the string quotes) are represented as their in-
         ternal value (see 2.0.1) and packed as 8-bit bytes from left to
&_         right. The 48 bits are filled up to the right with zeroes. 
            
T_     3.6.5.2   L_o_n_g_ _t_e_x_t_ _s_t_r_i_n_g_. The text strings are stored in portions of 48
&_           bits (two words). These words may contain 
          
T_long text string reference: 
word 1 (24 bits): segm shift 12 add rel 
word 2 (24 bits): 1 followed by some undefined bits 
character portion: 
word 1:       char N+3 shift 16 add char N+4 shift 8 add char N+5
               word 2:       char N shift 16 add char N+1 shift 8 add char N+2 
or 
&_short text string. 
 
The long text string is referenced with a long text string refe-
rence specifying on which segment (segm) and at which relator
(rel) the text starts. 
 
The characters of the text string are stored as text portions on
the backing storage area which is occupied by the algol program.\f

                   The first text portion representing the first 6 characters is
found on segment "segm" word rel//2-1 and rel//2 (the 256 words
of a segment are numbered 0, 1, 2, ...). The next text portions
are found in word rel//2-3 and rel//2-2 and so on, until 48 bits
representing a new long text string are found (which specifies
the continuation of the string on a new segment) or until 48 bits
representing a short text string are found (signaling the string
end). 
                    
T_3.6.5.3L_a_y_o_u_t_ _s_t_r_i_n_g_. The first 24 bits represent the spaces of the lay-
out as follows: 
         First, a 1 followed by a 1 for each leading space of the layout.
&_         Second, one 0. 
 
The following bits correspond to the digit positions of the num-
ber part (z, f, d, and 0). A bit is 1 if the corresponding digit
position is followed by a space, otherwise 0. 
         T_       The last 24 bits contain: 
          
               bit  0    0 
         bit  1-5  b  = number of significant digits (z, b, f, and d). 
         bit  6-9  h  = number of digit positions before the point. 
         bit 10-13 d  = number of digit positions after the point. 
         bit 14-15 pn = first letter of number part (z=10, f=01, d=00,
                        b=11). 
         bit 16-17 fn = sign of number part (+ =10, - =01, no sign =00).
               bit 18-19 s  = number of digits in exponent. 
         bit 20-21 pe = first letter of exponent part (z=10, f=01, d=00).
         &_      bit 22-23 fe = sign of exponent part coded as fn. 
                 
T_    3.6.5.4   R_e_f_e_r_e_n_c_e_ _o_f_ _s_t_r_i_n_g_s_ 
                  When a standard procedure references a string parameter and
  obtains a text portion as the result, it will accept these 6
&_  characters as the first part of the string and reference the
  parameter again and again to obtain the next text portions. When
  a short or a long text string is obtained, the string end is met
(null character). This rule implies that the string parameter
must have side-effects to supply new text portions when it is
referenced repeatedly. The standard procedure "increase" assists
you with this tasks as explained in the following example. 
 \f

T_Example: 
         Let the real array ra(1:n) hold a sequence of text
          portions terminated by a null character. 
           
          This variable text may be used as a string parameter in
          this way, for instance: 
                    i:= 1; write(out,string ra(increase(i))); 
          Write will reference the second parameter, which in
                   turn calls increase(i) and yields the value of ra(1).
                          At the same time i becomes 2. Write will print the text
          portion held in ra(2) and if it does not contain a null
          character, write will reference the second parameter
          again, and so on until the null character signals the
&_                      end of the text. 
 
 
T_3.7Z_o_n_e_ _e_x_p_r_e_s_s_i_o_n_s_ 
                  
     3.7.1     S_y_n_t_a_x_ 
&_         zone expression'     cf. 3.1.1 
             
T_      3.7.2    E_x_a_m_p_l_e_s_ 
                   in 
          polyfase (p) 
&_          polyfase (input(i)) 
          
T_      3.7.3    S_e_m_a_n_t_i_c_s_ 
         The value of a zone expression is a zone. Zone expressions are
&_         used as actual parameters. 
          
         The arithmetic expression is evaluated as a subscript expression.
         It selects a zone from the zone array. The subscript must obey 
              1 _ subscript _ number of zones declared in the array. 
                \f

F_      4.        S_t_a_t_e_m_e_n_t_s_ 
          
          
         The units of operation within the language are called statements.
         They will normally by executed consecutively as written. However,
         this sequence of operations may be broken by go to statements,
         which define their successor explicitly, shortened by conditional
         statements, which may cause certain statements to be skipped, and
         lengthened by repetitive statements which cause certain statements
to be repeated. 
          
           In order to make it possible to define a specific dynamic succes-
         sion, statements may be provided with labels. 
          
         Since sequences of statements may be grouped together into com-
         pound statements and blocks the definition of statement must ne-
         cessarily be recursive. Also declarations are supposed to be al-
ready defined as they are used in syntactic definition of state-
ments. 
 
          
T_      4.1       C_o_m_p_o_u_n_d_ _s_t_a_t_e_m_e_n_t_s_ _a_n_d_ _b_l_o_c_k_s_ 
                    
        4.1.1     S_y_n_t_a_x_ 
              assignment statement' 
         1goto statement' 
         basic statement' ::=  label':  dummy statement' 
                                        0procedure statement' 
&_           context statement' *) 
                
T_                   basic statement' 
         unconditional statement' ::=      compound statement' 
&_                                           block' 

T_             unconditional statement' 
          statement' ::=     conditional statement' 
&_                                    repetitive statement' 
 
T_                                end 
&_                 compound tail' ::=statement'      ;compound tail' 
                    
 begin
*
T_          simple block head' ::= simple block head'  ;simple declaration'1  
&_          
          *) NOTE: a context statement' is only allowed within a context 
                   block. \f

T_                 context block head' ::=        *
&_             begin context declaration'  ;context variable declaration' 0
                     
          context block' ::=          context block head';compound tail'
           
T_          simple block head' 
&_              block head' ::=    context block head' 
           
          unlabelled compound' ::=     begin compound tail' 
           
T_          compound statement' ::= 
                                  1     unlabelled compound' 
&_                         label': 0     compound statement' 
               
T_          1block head';compound tail' 
&_          block' ::=    label': 0     block' 
               
T_          block' 
          program' ::=       compound statement' 
&_                                     external procedure declaration';end 
                    
          This syntax may be illustrated as follows: Denoting arbitrary
          statements, declarations, and labels, by the letters S, D, and L,
          respectively, the basic syntactic units take the forms: 
           
T_                 Compound statement: 
            
           L:L:...begin S;S;...S;S end 
         Block: 
&_         L:L:...begin D;D;...D;S;S;...S;S end 
            
It should be kept in mind that each of the statements S may again be a
complete compound statement or block. 
            
T_     4.1.2     E_x_a_m_p_l_e_s_ 
              Basic statements: 
                   a:= p+q 
                     goto Naples 
&_                        START:CONTINUE: W:= 7.993 
                \f

T_          Compound statement: 
                   begin x: = 0; 
                               for y:= 1 step 1 until n do x:= x + A(y); 
                               if x ' q then goto STOP 
                               else if x ' w - 2 then goto S; 
                   Aw: St: W:= x + bob 
&_                   end 
                    
T_                 Block: 
                   Q: begin integer i,k, real w; 
                             for i:= 1 step 1 until m do 
                             for k:= i + 1 step 1 until m do 
                             begin w:= A(i,k); 
                                         A(i,k) := A(k,i); 
                                         A(k,i) := w 
                             end for i and k 
&_                   end block Q 
                    
T_          Context block: 
                   R: begin context (i,r,mode); 
                   integer q1,q2;real w; 
                             if i = type 1 then 
                                w:= B(i,1) 
                                else 
                                w:= B(i,2) 
&_                   end block R 
           
T_          Program: 
                   external procedure X(p); 
                   integer p; 
                   p:= p + 1; 
&_                   end external 
           
T_      4.1.3     S_e_m_a_n_t_i_c_s_ 
         Every block automatically introduces a new level of nomenclature.
         This is realized as follows: Any identifier occurring within the
&_         block may through a suitable declaration (see Section 5 Declara-
         tions) be specified to be local to the block in question. This
         means (a) that the entity represented by this identifier inside
         the block has no existence outside it and (b) that any entity
         represented by this identifier outside the block is completely
         inaccessible inside the block. 
          
         Identifiers (except those representing labels) occuring within a
         block and not being declared to this block will be non-local to\f

                   it, i.e. will represent the same entity inside the block and in
              the level immediately outside it. A label separated by a colon
          from a statement, i.e. labelling that statement, behaves as
               though declared in the head of the smallest embracing block, i.e.
          the smallest block whose brackets "begin" and "end" enclose that
statement. 
          
                   A label is said to be i_m_p_l_i_c_i_t_l_y_ _d_e_c_l_a_r_e_d_ in this block head, as
         distinct from the explicit declaration of all other local identi-
         fiers. In this context a procedure body, or the statement follow-
         ing a for clause, must be considered as if it were enclosed by
         begin and end and treated as a block, this block being nested
          within the fictive block of Section 4.7.3.1 in the case of a pro-
          cedure with parameters by value. 
 
A label that is not within any block of the program (nor within a
                   procedure body, or the statement following a for clause) is impli-
citly declared in the head of the environmental block. 
          
         Since a statement of a block may again itself be a block, the
concepts local and non-local to a block must be understood re-
          cursively. Thus an identifier which is non-local to a block A,
          may or may not be non-local to the block B in which A is a state-
          ment. 
          
          
T_  4.2      A_s_s_i_g_n_m_e_n_t_ _s_t_a_t_e_m_e_n_t_s_ 
          
      4.2.1    S_y_n_t_a_x_ 
         destination' ::=  variable' 
&_                   procedure identifier' 
          
T_left part' ::= destination' := 
            * 
&_left part list' ::= left part'  1 
 
T_            assignment statement' ::= left part list'arithmetic expression'
&_                           left part list'boolean expression' 
  
T_       4.2.2     E_x_a_m_p_l_e_s_ 
                            s:= p(0):= n:= n + 1 + s 
                      n:= n + 1 
                      A:= B/C - v - q * S 
                      S(v,k + 2):= 3 - arctan(s * zeta) 
&_                      V:= Q ' Y and Z \f

T_       4.2.3    S_e_m_a_n_t_i_c_s_ 
            Assignment statements serve for assigning the value of an expres-
&_          sion to one or several destinations.  
 
Assignment to a procedure identifier may only occur within the
body of a procedure defining the value of the function designator
denoted by that identifier (see Section 5.4.4).  
                   If assignment is made to a subscripted variable, the values of
          all the subscripts must lie within the appropriate subscript
          bounds. 
 
The location of a zone buffer element designated by a record
variable is not influenced by expressions to the right of the
record variable, even if these change the position of the record
within the zone buffer. 
 
The l_o_c_a_t_i_o_n_ of a variable is an absolute address in the RC 8000.
The assignment process takes place in three steps as follows. 
          
T_     4.2.3.1   T_h_e_ _l_o_c_a_t_i_o_n_ of all variables, including subscripted variables,
             record variables, and simple fields, occuring in the left part
&_         are evaluated from left to right. 
          
T_     4.2.3.2   T_h_e_ _e_x_p_r_e_s_s_i_o_n_ of the statement is evaluated. 
          
     4.2.3.3   T_h_e_ _v_a_l_u_e_ _o_f_ _t_h_e_ _e_x_p_r_e_s_s_i_o_n_ is assigned to all the left part va-
         riables with locations as evaluated in step 4.2.3.1 in sequence
&_         from right to left. 
          
T_      4.2.4     T_y_p_e_s_ 
         The type associated with all destinations of a left part list
&_         must be the same. 
 
If this type is boolean, the expression must likewise be boolean.
If the type is real, long, or integer, the expression must be
arithmetic. 
 
If the type of the arithmetic expression differs from that asso-
ciated with the destinations, an appropriate transfer function is
automatically performed. For transfer from real to long or inte-
ger type the transfer function yields a result which is the lar-
gest integral quantity not exceeding E + 0.5 in the mathematical
sence (i.e. without rounding error) where E is the value of the
expression. It should be noted that E, being of real type, is de-\f

fined with only finite accuracy (see Section 3.3.6). 
The type associated with a procedure identifier is given by the
declarator which appears as the first symbol of the corresponding
procedure declaration (see Section 5.4.4). 
          
         Field variables may be used as variables of type integer. 
The conversion of a real value to an integer or long and the con-
version from a long value to an integer are performed so that
                   spill alarm (see User"s Manual ref. 14) may occur. 
          
          
T_    4.3       G_o_t_o_ _s_t_a_t_e_m_e_n_t_s_ 
          
     4.3.1     S_y_n_t_a_x_ 
&_           goto statement' ::= goto designational expression' 
          
T_     4.3.2     E_x_a_m_p_l_e_s_ 
                        goto L8 
                        goto exit(n + 1) 
                        goto Town(if y  0 then N else N + 1) 
                        goto if Ab  c then L17 
                             else q(if w  0 then 2 else n) 
&_                        goto case p + q of (L17, p13, choose(n-1)) 
          
T_     4.3.3     S_e_m_a_n_t_i_c_s_ 
         A goto statement interrupts the normal sequence of operations, by
         defining its successor explicitly by the value of a designational
         expression. Thus the next statement to be executed will be the
&_         one having this value as its label. 
          
T_     4.3.4     R_e_s_t_r_i_c_t_i_o_n_ 
         Since labels are inherently local, no goto statement can lead
         from outside into a block. A goto statement may, however, lead
&_         from outside into a compound statement. 
          
T_     4.3.5     G_o_t_o_ _a_n_ _u_n_d_e_f_i_n_e_d_ _s_w_i_t_c_h_ _d_e_s_i_g_n_a_t_o_r_ 
         A goto statement will terminate the program with an alarm if the
         designational expression is a switch designator whose value is
&_         undefined. 
          
          
T_      4.4       D_u_m_m_y_ _s_t_a_t_e_m_e_n_t_s_ 
          
      4.4.1     S_y_n_t_a_x_ 
&_         dummy statement' ::= empty' \f

T_      4.4.2     E_x_a_m_p_l_e_s_ 
                        L: 
&_                        begin statements;John:end 
                   
T_       4.4.3     S_e_m_a_n_t_i_c_s_ 
                 A dummy statement executes no operation. It may serve to place a
&_         label. 
          
 
T_      4.5       C_o_n_d_i_t_i_o_n_a_l_ _s_t_a_t_e_m_e_n_t_s_ 
          
     4.5.1     S_y_n_t_a_x_ 
           case statement' ::= case clause' begin statement set' end 
                    
&_          if statement' ::= if clause'unconditional statement' 
                    
T_                 conditional if statement' ::=    
                                       *         if statement' 
                             label':  0         if clause' else statement' 
&_                                               if clause'rep. statement'
T_                  
                                                  conditional if statement' 
                   conditional statement' ::=             * 
&_                                                label': 0  case statement' 
                    
T_* 
&_                 statement set' ::= statement'  ;statement'  0 
 
T_                 case clause'               cf. 3.3.1 
                   if clause'                 cf. 3.3.1 
&_                 unconditional statement'   cf. 4.1.1 
                   repetitive statement'      cf. 4.6.0.1 
           
T_       4.5.2     E_x_a_m_p_l_e_s_ 
                   if x ' 0 then n:= n + 1 
                   if v ' u then V: q:= n + m else goto R 
                         if s  0 or P = Q then 
                                   AA: begin if q  v then a:= v/s 
                                             else y:= 2 * a 
                                       end 
                         else if v ' s then a:= v - q 
&_                         else if v ' s - 1 then goto S 
          \f

T_     4.5.3     S_e_m_a_n_t_i_c_s_ 
         Conditional statements cause certain statements to be executed or
         skipped depending on the running values of specified boolean ex-
&_         pressions or arithmetic expressions. 
          
T_     4.5.3.1   I_f_ _s_t_a_t_e_m_e_n_t_. An if statement is of the form 
                            if B then Su 
               where B is a boolean expression and Su is an unconditional state-
         ment. In execution, B is evaluated; if the result is true, Su is
&_         executed; if the result is false, Su is not executed. 
          
         If Su contains a label, and a goto statement leads to the label,
         then B is not evaluated, and the computation continues with
         execution of the labelled statement. 
 
T_      4.5.3.2   C_o_n_d_i_t_i_o_n_a_l_ _i_f_ _S_t_a_t_e_m_e_n_t_. Three forms of unlabelled conditional
statement exist, namely: 
                   if B then Su 
                   if B then Sfor 
                   if B then Su else S 
         where Su is an unconditional statement, Sfor is a for statement
&_         and S is a statement. 
          
         The meaning of the first form is given in Section 4.5.3.1. 
T_         The second form is equivalent to 
&_                   if B then begin Sfor end 
T_         The third form is equivalent to 
                   begin 
                   if B then begin Su; goto localL end; 
          S; 
                   localL: end 
&_           Where localL is an anonymous local label. 
                  
T_     4.5.4     G_o_t_o_ _i_n_t_o_ _a_ _c_o_n_d_i_t_i_o_n_a_l_ _i_f_ _s_t_a_t_e_m_e_n_t_ 
         The effect of a goto statement leading into a conditional
         statement follows directly from the above explanation of the
&_         execution of a conditional statement. 
          \f

T_ 4.5.5     C_a_s_e_ _s_t_a_t_e_m_e_n_t_ 
 
         4.5.5.1   S_e_m_a_n_t_i_c_ 
                   The case statement 
                             case i of 
                             begin S1; S2;...; SN end 
                   where S1;...SN are statements 
                   is equivalent to 
                             switch SWIT := SWIT1, SWIT2,...SWITN 
                             goto SWIT(i); 
                             SWIT1:    S1; goto STOP; 
                             . 
                             . 
                             . 
                             SWIT2:    S2; goto STOP; 
                             SWITN:    SN; 
&_                           STOP: 
                    
                   The statements of the statement set are separated by semicolons
                   and numbered 1, 2, 3.... 
                    
                   A case construction is executed as follows: First, evaluate the
                   arithmetic expression and if necessary round it to an integer.
          Next, select the set element corresponding to the result. If no
          such set element exists, the run is terminated. Execute the se-
                   lected statement and continue the execution after the complete
          case-statement (provided that a goto was not executed). 
           
T_       4.5.5.2   E_x_a_m_p_l_e_ 
                    case i of 
                      begin 
                           a:= p+1; 
                           begin 
                              q:=p; 
                              r:=q+1 
                           end; 
                           p:=q 
&_                      end 
           
           \f

T_       4.6       R_e_p_e_t_i_t_i_v_e_ _s_t_a_t_e_m_e_n_t_s_  
                  
         4.6.0.1   S_y_n_t_a_x_ 
  for statement' 
repetitive statement' ::=    repeat statement' 
&_                             while statement' 
                    
T_4.6.0.2F_o_r_ _s_t_a_t_e_m_e_n_t_s_ 
          
     4.6.1     S_y_n_t_a_x_ 
         for list element' ::=   
          arithmetic expression' 
         arithm. express.'steparithm. express.'untilarithm. express'. 
&_           arithmetic expression'whileboolean expression' 
T_          *
&_          for list' ::= for list element' ,for list element'0 
          
    for clause' ::= for variable identifier' := for list' do 
            
T_                                         1 
&_           for statement' ::=    label':  0  for clause'statement' 
                    
   T_    4.6.2     E_x_a_m_p_l_e_s_ 
                             for q:= 1 step s until n do A(q):= B(q) 
                             for k:= 1, V1 * 2 while V1  N do 
                             for j:= I + G, L, 1 step 1 until N, C + D do 
&_                           A(k,j):= B(k,j) 
          
      4.6.3    S_e_m_a_n_t_i_c_s_ 
         A for clause causes the statement S which it precedes to be re-
         peatedly executed zero or more times. In addition it performs a
         sequence of assignments to its controlled variable, which must be
         a simple variable of real, long, or integer type or a field vari-
         able. The process may be visualized by means of the following
         picture: 
T_                            - - - - - - - - - - -
             Initialize ; test ; statement S ; advance ; successor 
                            - - - - - - - - - - - - - - - - -
&_for list exhausted 
          
         In this picture the word initialize means: perform the first
         assignment of the for clause. Advance means: perform the next
         assignment of the for clause. Test determines if the last as-
         signment has been done. If so the execution continues with the
successor of the for statement. If not the statement following\f

the for clause is executed. 
               
     4.6.4    T_h_e_ _f_o_r_ _l_i_s_t_ _e_l_e_m_e_n_t_s_ 
         The for list gives a rule for obtaining the values which are con-
         secutively assigned to the controlled variable. This sequence of
         values is obtained from the for list elements by taking these one
         by one in the order in which they are written. 
 
The sequence of values generated by each of the three species of
for list elements and the corresponding execution of the state-
ment S are given by the following rules: 
          
T_     4.6.4.1  A_r_i_t_h_m_e_t_i_c_ _e_x_p_r_e_s_s_i_o_n_ _e_l_e_m_e_n_t_ 
         If X is an arithmetic expression then 
                             for V := X do S 
         is equivalent to 
                            begin 
                            V := X;S 
                                   end 
&_                 where S is treated as if it were a block (see Section 4.3.1) 
          
T_       4.6.4.2   S_t_e_p_-_u_n_t_i_l_ _e_l_e_m_e_n_t_ 
         If A, B and C are arithmetic expressions and V the controlled
         variable then 
                   A step B until C do S 
is equivalent to 
          V:= A; localB:= B; 
            L1:    if (V-C)*localB ' 0 then goto Element _exhausted; 
                      S; 
                             localB:= B; V:= V + localB; 
&_                     goto L1; 
          
Where localB is an anonymous variable and Element _exhausted is
the end of this step-until-element. 
 
T_     4.6.4.3   W_h_i_l_e_ _e_l_e_m_e_n_t_ 
If E is an arithmetic expression, F a boolean expression and V the
          controlled variable then 
         E while F do S 
is equivalent to 
                        L3:V:=E; 
                             if -, F then goto Element _exhaused; 
            S; 
                         goto L3; 
&_            where the notation is the same as in 4.6.4.2 above. \f

  4.6.5    T_h_e_ _v_a_l_u_e_ _o_f_ _t_h_e_ _c_o_n_t_r_o_l_l_e_d_ _v_a_r_i_a_b_l_e_ _u_p_o_n_ _e_x_i_t_. 
             Upon exit from a for statement, the value of the controlled
         variable is defined by the algorithms in 4.6.4.2, 4.6.4.1, and
         4.6.4.3 above. 
          
  4.6.6    G_o_t_o_ _l_e_a_d_i_n_g_ _i_n_t_o_ _a_ _f_o_r_ _s_t_a_t_e_m_e_n_t_. 
         Any occurrence outside a for statement of a label which labels a
             statement inside the for statement is forbidden. 
          
T_  4.6.7     R_e_p_e_a_t_ _s_t_a_t_e_m_e_n_t_ 
            
  4.6.8     S_y_n_t_a_x_ 
                repeat statement' ::=
&_                     repeat statement set'until boolean expression' 
              
T_  4.6.9     E_x_a_m_p_l_e_s_ 
          
            repeat 
                      a:= a+1; 
                    sum:= sum+a 
                   until a ' 99 
                    
&_                      repeat AP(3,4,i) until i=0 
   
T_      4.6.10    S_e_m_a_n_t_i_c_ 
                   The statement  
          repeat S1; S2;...;SN until boo 
                             is equivalent to the ALGOL construction:
                             for i:= i, i while -,boodo 
                    begin 
              S1; S2;...;SN; 
                    end 
 
&_Nesting of repeat statements is allowed. 
                  
T_       4.6.11    W_h_i_l_e_ _s_t_a_t_e_m_e_n_t_ 
           
         4.6.12    S_y_n_t_a_x_ 
          while statement' ::= 
&_                    while boolean expression' do statement' 
           \f

T_      4.6.13    E_x_a_m_p_l_e_s_ 
                    
                    while a'b do a:=b 
                    while A(i) do 
                                   begin 
                            a(i,j):=5; 
                            a(j,i):=7 
&_                                 end 
           
T_       4.6.14    S_e_m_a_n_t_i_c_s_ 
                   The statement  
                             while boo do S 
                             is equivalent to the ALGOL construction: 
                    for i:= i while boo do 
                    S 

&_                 Nesting of while statements is allowed. 
 
T_4.7      P_r_o_c_e_d_u_r_e_ _s_t_a_t_e_m_e_n_t_s_ 
                    
      4.7.1     S_y_n_t_a_x_
          
                   procedure statement' ::= 
&_                   procedure identifier'actual parameter part' 
 
  actual parameter part'       cf. 3.2.1 
                    
T_       4.7.2     E_x_a_m_p_l_e_s_ 
                   Transpose (W, v+1) 
                    Spur (A)Order:(7)Result to:(V)  
          is equivalent to Spur (A,7,V) 
                             Absmax (A)beginof search:(N)endof search:(M,Yy,I) 
          is equivalent to Absmax (A,N,M,Yy,I) 
                         Innerproduct(A(t,P,u),B(P),10,P,Y) 
&_         These examples correspond to examples given in section 5.4.2. 
          
     4.7.3     S_e_m_a_n_t_i_c_s_ 
             A procedure statement serves to invoke (call for) the execution
         of a procedure body (cf. section 5.4 Procedure declarations).
         Where the procedure body is a statement written in ALGOL. The ef-
fect of this execution will be equivalent to the effect of per-
forming the following operations on the program at the time of
execution of the procedure statement: 
          
                  The zone of a zone expression is always evaluated before the pro-\f

                   cudure is entered. 
           An array field is evaluated before the procedure is entered. The
         evaluation is made like this: 
          
           a) The bound halfwords are computed as shown in section 5.7.5. 
             b) The lower bound halfword is adjusted relative to the value
                found above. The adjustment will assure that all halfwords in
   the lowest array element are available. The adjustment is made
   as follows: 
                
         T_           lower _bound _halfword:= 
                    lower_bound_halfword + 
                             (1-lower_bound_halfword) extract log2(type_length) 
          
                      where 
         &_           log2(x) = ln(x)/ln(2) 
                    
           c) A description of a one-dimensional array of the resulting type
            and with these bound bytes is set up local to the procedure. 
            If the procedure uses this array as an actual array field
            parameter in subsequent procedure calls, this cutting may be
            performedagain. Thus, from a certain step, the bytes of an
            array may be unaccessible from the procedures, if the values
            of the array field variables are not chosen appropriately. 
          
         A parameter specified as a field variable may correspond to an
                   actual parameter of type integer. A field variable as an actual
         parameter behaves as a variable of type integer. 
          
                  A parameter specified as a field variable cannot be called by
value. 
 
T_      4.7.3.1  V_a_l_u_e_ _a_s_s_i_g_n_m_e_n_t_ _(_c_a_l_l_ _b_y_ _v_a_l_u_e_)_. All formal parameters quoted in
               the value part of the procedure declaration heading (see Sections
&_           5.4 and 4.7.4) are assigned the values (cf. section 2.8 Values
           and types) of the corresponding actual parameters, these assign-
           ments being considered as being performed explicitly before ente-
           ring the procedure body. The effect is as though an additional
         block embracing the procedure body were created in which these
assignments were made to variables local to this fictive block
with types as given in the corresponding specifications (cf.
section 5.4.5). As a consequence, variables called by value may
be considered as non local to the body of the procedure, but
local to the fictive block (cf. section 5.4.3). \f

         4.7.3.2   N_a_m_e_ _r_e_p_l_a_c_e_m_e_n_t_ _(_c_a_l_l_ _b_y_ _n_a_m_e_)_. Any formal parameter not quoted
in the value list is replaced, throughout the procedure body, by
the corresponding actual parameter, after enclosing this latter
in parentheses wherever syntactically possible. Possible conflict
between identifiers inserted through this process and other iden-
tifiers already present within the procedure body will be avoided
by suitable systematic changes of the formal or local identifiers
involved. 
 
         4.7.3.3   B_o_d_y_ _r_e_p_l_a_c_e_m_e_n_t_ _a_n_d_ _e_x_e_c_u_t_i_o_n_. Finally the procedure body, modi-
fied as above, is inserted in place of the procedure statement
and executed. If the procedure is called from a place outside the
scope of any non-local quantity of the procedure body the con-
flicts between the identifiers inserted through this process of
body replacement and the identifiers whose declarations are valid
at the place of the procedure statement or function designator
will be avoided through suitable systematic changes of the latter
identifiers. 
 
         4.7.4     A_c_t_u_a_l_ _-_f_o_r_m_a_l_ _c_o_r_r_e_s_p_o_n_d_a_n_c_e_. 
The correspondance between the actual parameters of the procedure
statement and the formal parameters of the procedure heading is
established as follows: The actual parameter list of the proce-
dure statement must have the same number of entries as the formal
parameter list of the procedure declaration heading. The corre- 
spondence is obtained by taking the entries of these two lists in
the same order. 
 
         4.7.5     R_e_s_t_r_i_c_t_i_o_n_s_. 
For a procedure statement to be defined it is usually necessary
that the operations on the procedure body defined in section
4.7.3.1 and 4.7.3.2 lead to a correct ALGOL 7 statement. 
 
This poses the general restriction on any procedure statement
that the kind and type of each actual parameter be compatible
with the kind and type of the corresponding formal parameter. For
reasons of effectivity of the compiled code certain deviations
from this general rule are imposed. Some particular cases of this
rule together with the deviations are listed in the following: \f

4.7.5.1I_f_ _a_ _s_t_r_i_n_g_ _i_s_ _s_u_p_p_l_i_e_d_ _a_s_ _a_n_ _a_c_t_u_a_l_ _p_a_r_a_m_e_t_e_r_ in a procedure
statement or function designator, where the procedure body is an
ALGOL 7 statement (as opposed to non-ALGOL code, cf. section
4.7.8), then this string can only be used within the procedure
body as an actual parameter in further procedure calls. Ultimate-
ly it can only be used by a procedure body expressed in non-ALGOL
         code. (In very specific cases this rule may be circumvented, if
       the actual string parameters are short strings (cf. Section
3.6.3.)).
            
4.7.5.2A_ _f_o_r_m_a_l_ _n_a_m_e_ _p_a_r_a_m_e_t_e_r_ which occurs as a left part variable in
an assignment statement within the procedure, may actually be an
expression which is not a variable (a constant for instance). In
this case, the assignment takes place to a fictive variable. 
       
  If the actual parameter is a constant, the future value will be
  taken from this fictive variable, and if it is an expression, the
  assignment disappears as the fictive variable is a normal used
       work variable (UV cf. ref. 10). 
                 
  4.7.5.3  A_n_ _a_c_t_u_a_l_ _p_a_r_a_m_e_t_e_r_ which is an array identifier can only corre-
         spond to a formal array parameter with the same number of sub-
         scripts or with one subscript. In the latter case, the lexicogra-
         phical ordering of the array elements is used as explained in  
          5.2.6. An array field is considered as a one-dimensional array
          (see 4.7.3). 
        
         The number, kind and type of any parameters of a formal procedure
        parameter must be compatible with those of the actual parameter.
           If a formal parameter is specified as a field variable, it is not
      checked whether the actual parameter is a field variable. A for-
 mal parameter specified as real array may actually be a zone ex-
      pression. In this case, the array elements are that part of the
        zone buffer which is selected as the zone record at the moment of
        the call. 
         
4.7.5.4  (_T_h_i_s_ _s_e_c_t_i_o_n_ _h_a_s_ _b_e_e_n_ _d_e_l_e_t_e_d_)_ 
         
4.7.5.5  R_e_s_t_r_i_c_t_i_o_n_s_ _i_m_p_o_s_e_d_ _b_y_ _s_p_e_c_i_f_i_c_a_t_i_o_n_s_ of formal parameters must
         be observed. The correspondence between actual and formal parame-
ters should be in accordance with the following table. 
 
If the actual parameter is itself a formal parameter the corre-
spondence (as in the table on the previous page) must be with the
specification of the immediate actual parameter rather than with
the declaration of the ultimate actual parameter. \f

         T_       F_o_r_m_a_l_ _p_a_r_a_m_e_t_e_r_ _ _ _ ___M_o_d_e_ _ _ _ _ _ _A_c_t_u_a_l_ _p_a_r_a_m_e_t_e_r_ _________________
         integer             value     arithmetic expression yielding a
                                         real or integer value.
                             name      arithmetic expression yielding an 
                                       integer value 
         long                value     arithmetic expression yielding a 
                                       long value 
                             name      arithmetic expression yielding a 
                                       long value 
         real                value     arithmetic expression yielding a 
                                       real or integer value 
                             name      arithmetic expression yielding a 
                                       real value 
         boolean             value     boolean expression 
                             name      boolean expression 
               label               name      designational expression 
           
         integer array       name      integer array 
         long array          name      long array 
         real array          name      real array or zone 
          boolean array       name      boolean array  
 
               integer field       name      arithmetic expression yielding an 
                                        integer value 
                  long field          name      arithmetic expression yielding an 
                                       integer value 
         real field          name      arithmetic expression yielding an 
                                       integer value 
         boolean field       name      arithmetic expression yielding an 
                                       integer value 
         integer array field name      arithmetic expression yielding an 
                                       integer value 
         long array field    name      arithmetic expression yielding an 
                                       integer value 
         real array field    name      arithmetic expression yielding an 
                                       integer value 
         boolean array field name      arithmetic expression yielding an 
                                       integer value 
           
         typeless procedure  name      arithmetic procedure, or typeless
                                             procedure, or boolean procedure 
          integer procedure   name      integer procedure 
         long procedure      name      long procedure 
          real procedure      name      real procedure 
         boolean procedure   name      boolean procedure 
                    
          switch              name      switch 
string                name      string expression 
zone                  name      zone expression 
&_zone array            name      zone array \f

      4.7.6     (_T_h_i_s_ _s_e_c_t_i_o_n_ _h_a_s_ _b_e_e_n_ _d_e_l_e_t_e_d_)_ 
            
      4.7.7    P_a_r_a_m_e_t_e_r_ _d_e_l_i_m_i_t_e_r_s_. 
         All parameter delimiters are understood to be equivalent. No cor-
         respondence between the parameter delimiters used in a procedure
         statement and those used in the procedure heading is expected be-
         yond their number being the same. Thus the information conveyed
         by using the elaborate ones (known as "fat commas") is entirely
         optional. 
          
      4.7.8    P_r_o_c_e_d_u_r_e_ _b_o_d_y_ _e_x_p_r_e_s_s_e_d_ _i_n_ _s_l_a_n_g_ _c_o_d_e_. 
         The restrictions imposed on a procedure statement calling a pro-
         cedure having its body expressed in non-ALGOL code can only be
         derived from the characteristics of the code used and the intent
         of the user. Therefore it is outside the scope of this part of
the manual. 
          
      4.7.9    S_t_a_n_d_a_r_d_ _p_r_o_c_e_d_u_r_e_s_ 
         The standard procedures belonging to the ALGOL 7 system are de-
         scribed in ref. 14. 
          
      4.7.10   R_e_c_u_r_s_i_v_e_ _p_r_o_c_e_d_u_r_e_s_ 
         Recursive procedures are handled fully in ALGOL 7, note however
         the possible "cutting" of array parameters which are actually
         arrays fields described in 4.7.3. 
 
If a variable is declared "own" in a procedure body and the proce-
dure is called recursively, the same own variable is used in all
the dynamic incarnations of the procedure. 
          
T_       4.8       C_o_n_t_e_x_t_ _s_t_a_t_e_m_e_n_t_s_ 
           
         4.8.1     S_y_n_t_a_x_ 
          exit statement' 
          context statement' ::=       continue statement' 
           
          exit statement' ::=  exit (designational expression') 
           
&_          continue statement' ::=      continue 
           
T_    4.8.2     E_x_a_m_p_l_e_s_ 
                    exit (L) 
                    exit (Q(1)) 
&_                    continue 
           \f

    4.8.3     S_e_m_a_n_t_i_c_s_ 
          The context statement serves to control special jumps out of a
          context block and within a context block. The statements should
          be found in a context block only. 
           
          E_x_i_t_ 
          The exit statement is a goto statement, which leaves a context
          block in such a manner that the same incarnation (cf. 5.8.1) can
          start the execution next time with the ALGOL statement immediate-
          ly following the exit call. 
           
          The block level at which an exit statement is found shall be
          identical with the level of the context block. 
                    
          The statement shall be found outside for-statements embedded in
          context blocks. 
           
          The exit statement has the following effect: 
          The return point (also known as the c_o_n_t_i_n_u_e_ _p_o_i_n_t_), i.e. the
          logical address for the ALGOL statement following immediately
          after the exit statement, is stored in an anonymous context
          variable (cf. 5.8.3). This variable is known as the c_o_n_t_e_x_t_ _l_a_b_e_l_
          belonging to the incarnation. 
           
          Jumping to the value of designational expression', is done
          exactly in the same manner as via a goto statement (cf. 3.3). 
           
          Several exit statements are permittet in the same context block,
          and each incarnation has its specific c_o_n_t_e_x_t_ _l_a_b_e_l_. 
           
                   The value of a context label is either a continue point or 0
          (zero). A continue point can be defined solely by exit. The zero
          value can be obtained in the following manner: 
           
T_                    First time this incarnation is executed. 
                    When read bit has not been set. 
                    When "new block bit" or "new incarnation bit" is set. 
&                    (cf. 5.8.3). 
           
          C_o_n_t_i_n_u_e_ 
The continue statement is a goto statement that jumps to a con-
text label. The block label at which it is found may be different
from the context block level (i.e. inner block). The statement
                   has the following effect: 
           \f

                   If the context label belonging to the incarnation is zero, the
          statement is blind. This means that the block goes on with the
          next ALGOL statement. 
           
          If the context label belonging to the incarnation has the value
          of a continue point, the block jumps to the point concerned. 
           
                \f

F_     5.        D_e_c_l_a_r_a_t_i_o_n_s_ 
          
          
         Declarations serve to define certain properties of the quantities
         used in the program, and to associate them with identifiers. A
         declaration of an identifier is valid for one block. Outside this
         block the particular identifier may be used for other purposes
         (see Section 4.1.3). 
          
         Dynamically this implies the following: at the time of an entry
         into a block (through the begin since the labels inside are local
         and therefore inaccessible from outside) all identifiers declared
         for the block assume the significance implied by the nature of
         the declarations given. If these identifiers had already been de-
         fined by other declarations outside they are for the time being
         given a new significance. Identifiers which are not declared for
         the block, on the other hand, retain their old meaning. 
          
         At the time of an exit from a block (through end, or by a go to
         statement) all identifiers which are declared for the block lose
         their local significance. 
                
         A declaration of a simple variable may be marked with the addi-
         tional declarator own. This has the following effect: upon a re-
         entry into the block, the values of own quantities will be un-
         changed from their values at the last exit, while the values of
         declared variables which are not marked as own are undefined. Va-
riables declared in a context block will behave as if they were
marked with the declarator own. 
          
         No identifier may be declared either explicitly or implicitly
         (see Section 4.1.3) more than once in any one block head. 
          
         All programs may be thought of as surrounded by one common block
         (the standard identifier block). The declarations of this block
         are given in the backing storage catalog of the RC 8000. New pro-
cedure declarations are inserted in this block when external pro-
cedures are translated (see 5.4.7). Procedures expressed in ma-
chine language, simple variables, and zones may be inserted in
the standard identifier block as described in ref. 10. 
 
Apart from labels, formal parameters of procecure declarations,
and identifiers declared in the environmental block, each iden-
tifier appearing in a program must be explicitly declared within
the program. \f

T_                S_y_n_t_a_x_ 
                   simple declaration' 
&_                 declaration' ::=   context declaration' 
                    
T_                                              context variable declaration' 
              simple declaration' ::=     zone declaration' 
&_                                           zone array declaration' 
                
T_                                                    type declaration' 
                                      array declaration' 
context variable declaration' ::=     switch declaration' 
                                      procedure declaration' 
                                      field declaration' 
&_                  
T_       5.1       T_y_p_e_ _d_e_c_l_a_r_a_t_i_o_n_s_ 
          
     5.1.1     S_y_n_t_a_x_ 
         *
&_         type list' ::= simple variable' ,simple variable' 0 
          
T_                       real 
type' ::=          long 
                    integer 
&_                    boolean 
T_1
&_         type declaration' ::=   own 0  type'type list' 
          
T_     5.1.2     E_x_a_m_p_l_e_s_ 
                   integer p,q,s 
                   own boolean Acryl,n 
&_         long lg 
          
     5.1.3     S_e_m_a_n_t_i_c_s_ 
         Type declarations serve to declare certain identifiers to repre-
                   sent simple variables of a given type. The range and representa-
          tion of variables are given in 3.1. 
          
          
T_     5.2       A_r_r_a_y_ _d_e_c_l_a_r_a_t_i_o_n_s_ 
          
     5.2.1     S_y_n_t_a_x_ 
         lower bound' ::= arithmetic expression' 
&_         upper bound' ::= arithmetic expression' 
         bound pair' ::=  lower bound':upper bound' \f

T_         *
&_bound pair list' ::= bound pair' ,bound pair' 0 
 
T_array segment' ::= array identifier'  (bound pair list') 
&_                                                  ,array segment' 
T_         *
&_array list' ::= array segment' ,array segment'0 
T_         1
&_array declarer' ::=         type' 0 array 
T_         1
&_array declaration' ::=      type' 0 array array list' 
          
T_      5.2.2     E_x_a_m_p_l_e_s_ 
                   array a, b, c(7:n, 2:m), s(-2:10, -5:-1, 7:10, 13:i) 
                       real array q(-7:if c  0 then 2 else 1) 
&_                   long array zjjj(1:case i of (7, i, 3)) 
          
  5.2.3     S_e_m_a_n_t_i_c_s_ 
         An array declaration declares one or severel identifiers to re-
         present multidimensional arrays of subscripted variables and
         gives the dimensions of the arrays, the bounds of the subscripts,
         and the types of the variables. 
          
  5.2.3.1   S_u_b_s_c_r_i_p_t_ _b_o_u_n_d_s_. The subscript bounds for any array are given in
         the first subscript brackets following the identifier of this ar-
         ray in the form of a bound pair list.  Each item of this list
         gives the lower and upper bounds of a subscript in the form of
         two arithmetic expressions separated by the delimiter :. The bound
         pair list gives the bounds of all subscripts taken in order from
         left to right. 
          
  5.2.3.2   D_i_m_e_n_s_i_o_n_s_. The dimensions are given as the number of entries in
         the bound pair lists. 
          
  5.2.3.3   T_y_p_e_s_. All arrays declared in one declaration are of the same
         quoted type.  If no type declarator is given the real type is
         understood. 
          
  5.2.4     L_o_w_e_r_ _u_p_p_e_r_ _b_o_u_n_d_ _e_x_p_r_e_s_s_i_o_n_s_. 
         At least one element must be declared. 
          
  5.2.4.1   T_h_e_ _e_x_p_r_e_s_s_i_o_n_s_ will be evaluated in the same way as subscript
         expressions (see Section 3.1.4.2). 
          
  5.2.4.2   T_h_e_ _e_x_p_r_e_s_s_i_o_n_s_ cannot include any identifier that is declared\f

                   either explicitly or implicitly (see Section 4.1.3), in the same
         block head as the array in question. Own variables, having an
initial value may however be used. 
                    
5.2.4.3A_n_ _a_r_r_a_y_ _i_s_ _d_e_f_i_n_e_d_ only when the values of all upper subscript
   bounds are not smaller than those of the corresponding lower
bounds. The array should be declared so that: 
 
The product of the lower subscript bounds and the type_length is
'-2**22. 
 
The product of the upper subscript bounds and the type_length is
2**22. 
 
The product of the number of subscribt elements and the type_length
is 2**22. 
                
   5.2.4.4  T_h_e_ _e_x_p_r_e_s_s_i_o_n_s_ will be evaluated once at each entrance into the
         block. 
          
   5.2.5    (_T_h_i_s_ _s_e_c_t_i_o_n_ _h_a_s_ _b_e_e_n_ _d_e_l_e_t_e_d_)_ 
          
         5.2.6     L_e_x_i_c_o_g_r_a_p_h_i_c_a_l_ _o_r_d_e_r_i_n_g_ 
         The elements of an array are stored in a sequence, and a
         multi-dimensional array declared 
             
                       Am(low1:up1,low2:up2,...lown:upn) 
          
         may in certain connections (specified in 5.2.6.1 and 5.2.6.2) be
         considered as a one-dimensional array 
          
                   Ao(low:up). 
          
         Whenever the mapping of Am and Ao makes sense, the element 
          
                   Am(i1,i2,...,in) 
          
         may be found as 
          
                   Ao(...((i1*c2+i2)*c3+i3)*...+in) 
          
         where 
          
                   c2 = up2 - low2 + 1, c3 = up3 - low3 + 1, and so on. \f

         This mapping of elements is called the lexicographical ordering
              because it is a linear ordering of the elements obtained by
          varying the first subscripts at the lowest rate. 
          
T_         The values of low and up may be seen to be: 
                   low = ...((low1*c2 + low2)*c3 + low3)* ... + lown 
                   up  = ...((up1 *c2 + up2 )*c3 + up3 )* ... + upn 
             It may also be seen that the (possibly fictive) element
&_         Am(0,0,...,0) is the same as Ao(0). 
                    
         5.2.6.1  M_u_l_t_i_-_d_i_m_e_n_s_i_o_n_a_l_ _a_r_r_a_y_ _a_s_ _a_c_t_u_a_l_ _p_a_r_a_m_e_t_e_r_. A multi-dimensional
                   array may occur as an actual parameter where the corresponding
       formal is a one dimensional array. The mapping above is used in
that case. 
 
         5.2.6.2   M_u_l_t_i_-_d_i_m_e_n_s_i_o_n_a_l_ _a_r_r_a_y_ _a_s_ _f_i_e_l_d_ _b_a_s_e_. Whenever a multi-dimensio-
         nal array is used in a field reference as the (ultimate) field
          base, the halfword numbering and addressing described in 5.2.7
    and 5.2.8 is found by mapping the multi-dimensional field base on
a one-dimensional field base according to the rules above. 
           
5.2.7    B_o_u_n_d_ _h_a_l_f_w_o_r_d_s_ _a_n_d_ _h_a_l_f_w_o_r_d_ _n_u_m_b_e_r_i_n_g_._ 
            Each element of an array is represented by a number of halfwords.
       This number is the type length explained in section 3.1.6. 
        
T_              The first halfword in an array is called the lower bound halfword
and the last one the upper bound halfword. Let an array be de-
clared 
        
                 A(low:up)
       then 
                 lower _bound _halfword = (low - 1)*type _length + 1 
&_                 upper _bound _halfword = up*type _length. 
        
          The halfwords of an array are numbered relative to the rightmost
halfword in the (possibly fictive) element A(O). The element A(i)
T_contains the halfwords 
&_           (i - 1)*type _length + 1 = halfword _number = i* type _length.
              
5.2.8    W_o_r_d_ _b_o_u_n_d_a_r_i_e_s_ _a_n_d_ _a_d_d_r_e_s_s_e_s_. 
       When an array is declared, it is created so that the word
       boundaries are between an even numbered halfword and its odd
numbered successor. 
        
An array element, A(i), is addressed within the array be the half- 
          word with the number i*type_length. \f

T_  5.3      S_w_i_t_c_h_ _d_e_c_l_a_r_a_t_i_o_n_ 
 
       5.3.1    S_y_n_t_a_x_ 
                   switch list' ::= *
        designational expression' ,designational expression' 0 
                
&_switch declaration' ::= switchswitch identifier':= switch list'
 
T_ 5.3.2   E_x_a_m_p_l_e_s_ 
                   switch S:= S1,S2,Q(m), if v ' -5 then S3 else S4 
&_                   switch Q:= p1,w 
          
        5.3.3     S_e_m_a_n_t_i_c_s_ 
         A switch declaration defines the set of values of the correspon-
         ding switch designators. These values are given one by one as the
         values of the designational expressions entered in the switch
         list. With each of these designational expressions there is asso-
         ciated a positive integer, 1, 2,..., obtained by counting the
         items in the list from left to right. The value of the switch de-
         signator corresponding to a given value of the subscript expres-
         sion (see Section 3.5 Designational expressions) is the value of
         the designational expression in the switch list having this given
         value as its associated integer. 
          
     5.3.4     E_v_a_l_u_a_t_i_o_n_ _o_f_ _e_x_p_r_e_s_s_i_o_n_s_ _i_n_ _t_h_e_ _s_w_i_t_c_h_ _l_i_s_t_. 
         An expression in the switch list will be evaluated every time the
         item of the list in which the expression occurs is referred to,
         using the current values of all variables involved. 
          
     5.3.5     I_n_f_l_u_e_n_c_e_ _o_f_ _s_c_o_p_e_s_ 
         If a switch designator occurs outside the scope of a quantity
         entering into a designational expression in the switch list, and
         an evaluation of this switch designator selects this designatio-
         nal expression, then the conflicts between the identifiers for
         the quantities in this expression and the identifiers whose de-
         clarations are valid at the place of the switch designator will
         be avoided through suitable systematic changes of the latter
         identifiers. 
                    
 
T_5.4P_r_o_c_e_d_u_r_e_ _d_e_c_l_a_r_a_t_i_o_n_ 
          
     5.4.1     S_y_n_t_a_x_ 
&_           formal parameter' ::= identifier' 
                \f

T_formal parameter list' ::=  *
                   formal parameter'  parameter delimiter'formal parameter' 0 
          
                                                                  1 
&_         formal parameter part' ::=   (formal parameter list') 0 
T_       * 
&_   identifier list' ::= identifier' ,identifier' 0 
                    
T_            1 
&_          value part' ::=    value identifier list';  0 
  
T_                                  string 
                             type' 
                             array 
                                                type' array 
                             label 
                                                switch 
specifier' ::=              procedure 
                             type' procedure 
                                                type' field 
                             array field 
                                    type' array field 
                             zone 
&_                                    zone array 
T_               1 
&_     specification part' ::= specifier'identifier list';  0 
           
T_          procedure heading' ::= 
&_             procedure identifier'formal parameter part';value part'specification part'
             
                   procedure body' ::=         statement' 
        
T_procedure declaration' ::= 
                           1
&_                        type' 0 procedureprocedure heading'procedure body' 
          
    T_   5.4.2     E_x_a_m_p_l_e_s_ 
                  procedure Spur(a,n,s); 
      value n; real array a; integer n; real s; 
          *sum all elements in the diagonal up to element a(n,n)*' 
                        begin integer k; 
                              s:=0; 
                          for k:= 1 step 1 until n do s := s + a(k,k) 
&_                          end 
       \f

T_            procedure Transpose(a,n); 
value n; array a; integer n; 
                      begin real w; integer i,k; 
                         for i:= 1 step 1 until n do 
                     for k:= 1 + i step 1 until n do 
                       begin w:= a(i,k); 
                          a(i,k):= a(k,i); 
                          a(k,i):= w 
               end 
&_                           end transpose 
 
T_integer procedure stepfct(u); 
value u; real u; 
&_stepfct:= if 0=u and u=1 then 1 else 0 
 
T_          procedure Absmax(a,n,m,y,i); 
                   value n,m;real array a;integer n,m,i;real y; 
* The absolute greatest element in the vector a, and with a
subscript interval n= index =m is transferred to y, and the
subscript of this element to i *' 
                    begin integer p; 
                               y:= 0; i:= n; 
                      for p:= n step 1 until m do 
                      if abs a(p) ' y then 
                      begin y:= abs a(p); 
                        i:=p 
                      end 
&_                      end Absmax 
                
T_                 procedure Innerproduct(a,b) Order:(k,p) Result:(y); 
* here the fat comma )letter string':( is used as parameter
delimiter, the above is equivalent to procedure Innerproduct
(a,b,k,p,y);*' integer k,p; real y,a,b; 
                   begin real s; 
                     s:=0; 
                     for p:= 1 step 1 until k do s:= s + a * b; 
                      y:=s 
&_                         end Innerproduct 
          
      5.4.3    S_e_m_a_n_t_i_c_s_ 
         A procedure declaration serves to define the procedure associated
         with a procedure identifier. The principal constituent of a pro-
         cedure declaration is a statement or a piece of code, the proce-
         dure body, which through the use of procedure statements and/or
         function designators may be activated from other parts of the\f

         block in the head of which the procedure declaration appears. As-
         sociated with the body is a heading, which specifies certainiden-
         tifiers occurring within the body to represent formal parameters.
         Formal parameters in the procedure body will, whenever the proce-
         dure is activated (cf. section 3.2 Function designators and sec-
         tion 4.7 Procedure statements) be assigned the values of or re-
         placed by actual parameters. Identifiers in the procedure body
         which are not formal will be either local or non-local to the bo-
         dy depending on whether they are declared within the body or not.
         Those of them which are non-local to the body may well be local
         to the block in the head of which the procedure declaration ap-
         pears. 
          
         The procedure body always acts like a block, whether it has the
         form of one or not. Consequently the scope of any label labelling
                   a statement within the body or the body itself can never extend
         beyond the procedure body. In addition, if the identifier of a
formal parameter is declared anew within the procedure body (in-
cluding the case of its use as a label as in section 4.1.3), it
it is thereby given a local significance and actual parameters
which correspond to it are inaccessible throughout the scope of
this inner local quantity. If the procedure body is a block, an
identifier of a formal parameter must not be declared anew in
this outermost block. 
          
         No identifier may appear more than once in any formal parameter
                   list, nor may a formal parameter list contain the procedure iden-
         tifier of the same procedure heading. 
             
         5.4.4     V_a_l_u_e_s_ _o_f_ _f_u_n_c_t_i_o_n_ _d_e_s_i_g_n_a_t_o_r_s_. 
         For a procedure declaration to define the value of a function
         designator there should, within the procedure body, occur one or
         more uses of the procedure identifier as a destination, at least
         one of these should be executed. The type associated with the
         procedure identifier must be declared through the appearance of a
         type declarator as the very first symbol of the procedure decla-
         ration. The last value so assigned is used to continue the evalu-
         ation of the expression in which the function designator occurs.
         Any occurrence of the procedure identifier within the body of the
         procedure other than as a destination in an assignment statement
         denotes activation of the procedure. 
          
         If a goto statement within the procedure, or within any other
         procedure activated by it, leads to an exit from the procedure,
         other than through its end, then the execution, of all statements\f

                   that have been started but not yet completed and which do not con-
         tain the label to which the go to statement leads, is abandoned.
         The values of all variables that still have significance remain
         as they were immediately before execution of the go to statement.
          
         If a function designator is used as a procedure statement, then
         the resulting value is discarded, but such a statement may be
         used, if desired, for the purpose of invoking side-effects (cf.
         3.3.5).  
 
5.4.5     S_p_e_c_i_f_i_c_a_t_i_o_n_s_ 
         The heading includes a specification part, giving information
         about the kinds and types of all the formal parameters. In this
         part no formal parameter may occur more than once. 
 
Restrictions on the actual/formal correspondence are listed in
                   section 4.7.5.5. 
 
Note that arrays cannot be value specified. 
           
         5.4.6     C_o_d_e_ _a_s_ _p_r_o_c_e_d_u_r_e_ _b_o_d_y_ 
         Procedures may be expressed in machine language and introduced
         into the standard identifier block (see the introduction to chap-
         ter 5) as it is explained in ref. 10. 
            
      5.4.7     P_r_o_c_e_d_u_r_e_s_ _t_r_a_n_s_l_a_t_e_d_ _a_l_o_n_e_ 
         Procedures expressed in Algol may be translated alone, provided
         that they have at most seven parameters. A procedure translated
         alone will be introduced into the standard identifier block men-
         tioned in the introduction to chapter 5. In order to translate
         the procedure alone, the procedure declaration must be surrounded
         by the delimiters external and end, and a semicolon (;) must de-
         limit the procedure declaration from the end. 
          
         A procedure translated in this way becomes a standard procedure
         included in the standard identifier block. The name of the proce-
         dure is the name of the backing storage area into which the pro-
          cedure is translated. 
          
         All identifiers used as standard identifiers by the procedure
         must be present at the time of compilation. The name of an ex-
         ternal procedure must not contain capital letters as these are
forbidden in names of backing storage areas. 
          \f

T_5.4.7.1   E_x_a_m_p_l_e_ 
         external real procedure greatest (x,y,i); 
         value x,y;real x,y;integer i; 
         begin 
                    real work; 
  i:= 0;    
  work:= if x ' y then x else y; 
           if work = y then i:= 1; 
         greatest:= work;
end; 
&_         end 
 
 
T_5.5Z_o_n_e_ _d_e_c_l_a_r_a_t_i_o_n_s_ 
                    
      5.5.1    S_y_n_t_a_x_ 
         length' ::= arithmetic expression' 
&_            shares' ::= arithmetic expression' 
         block proc' ::= procedure identifier' 
T_            zone segment' ::=   
         zone identifier'    (length',shares',block proc') 
&_                                                ,zone segment' 
T_         * 
zone list' ::= zone segment'   ,zone segment'0 
&_         zone declaration' ::= zone zone list' 
             
T_       5.5.2    E_x_a_m_p_l_e_s_ 
                   zone master(2*bl,2,stderror) 
&_                      zone m1,m2(a,b,c),m3(900,3,pr) 
          
5.5.3     S_e_m_a_n_t_i_c_s_
A zone declaration declares one or several identifiers to repre-
sent zones. The arithmetic expressions in the declaration are
evaluated once for each entrance into the block. Each zone con-
sists of: 
                a b_u_f_f_e_r_ _a_r_e_a_ 
                a z_o_n_e_ _d_e_s_c_r_i_p_t_o_r_ 
                one or more s_h_a_r_e_ _d_e_s_c_r_i_p_t_o_r_s_ (often just called s_h_a_r_e_s_) 
          
         Inside the block, a zone identifier may occur as an actual para-
         meter, as a constituent of a record variable, or as a field base
         (cf. 3.1). 
          
         B_u_f_f_e_r_ _a_r_e_a_ 
         The length in reals of the buffer area for any zone is given by
length' in the first parenthesis following the zone identifier. \f

         Each element of the buffer area may be used as a real variable as
         explained for zone record below. The elements are in some connec-
         tions identified by a halfword number in the range 
          1 = halfword number = 4*length. 
          
                  Z_o_n_e_ _d_e_s_c_r_i_p_t_o_r_ 
         A zone descriptor consists of the following set of quantities,
         which specify a process or a document (see ref. 1) connected to
         the zone and the state of this process: 
          
           process name      A text string specifying the name of a pro-
                                   cess or a document connected to the zone. 
           mode and kind     An integer specifying mode and kind for a
                                   document (see ref. 14, open). 
           logical position  A set of integers specifying the current po-
                             sition of a document. 
                 give up mask      An integer specifying the conditions under
                             which  block proc  is to be called. 
                 state             An integer specifying the latest operation on
                             the zone. 
                 record            Two integers specifying the part of the buf-
                             fer area nominated as the zone record. 
                 used share        An integer specifying the share descriptor 
                             within the zone, which is used for the moment.
                 last halfword     An integer specifying the end of a physical
                             block on a document. 
                 block procedure   The procedure  block proc  in the first pa-
                             renthesis following the zone identifier. 
                    The give up mask and status of the connected
                    document specifies when this procedure is
                    called. 
 
                   S_h_a_r_e_ _d_e_s_c_r_i_p_t_o_r_ 
         Each zone contains the number of share descriptors given by
               shares in the first parenthesis following the zone identifiers.
         The share descriptors are numbered 1, 2,..., shares . 
          
         A share descriptor consists of a set of quantities which describe
         an external activity sharing a part of the buffer area with the
         running program. 
 
An activity may be a parallel process transferring data between a
document and the buffer area, or it may be a child process execu-
ted in the buffer area under supervisiory control of the algol
program. See ref. 14. \f

                  The set of quantities forming one share descriptor is: 
          
                 share state       An integer describing the kind of activity
                             going on in the shared area. 
                 shared area       Two integers specifying the part of the
                             buffer area shared with another process by
                                   means of the share descriptor. 
                 operation         Specifies the latest operation performed by
                             means of the share descriptor. 
          
         Z_o_n_e_ _r_e_c_o_r_d_ 
         A number of consecutive halfwords of the buffer area may at run
time be nominated as the zone record. The halfwords of the zone
record may be available as r_e_c_o_r_d_ _v_a_r_i_a_b_l_e_s_, which may be thought
of as a kind of real subscripted variables. The record variables
are numbered 1, 2...,  record length (the max addressable word in
the buffer), and referenced as described in 3.1. 
 
All halfwords of the record may be referenced by means of field
references, as the zone may be used as a field base. 
          
Z_o_n_e_ _a_f_t_e_r_ _d_e_c_l_a_r_a_t_i_o_n_ 
                   The following parts of the zone is defined just after declara-
tion. 
T_         used share          is set to first share 
         record              is set to the entire buffer area 
         block proc 
&_       The entire buffer area can be accessed as one zone record. 
 
T_5.5.4T_y_p_e_s_ 
         The two expressions length' and shares' must be of type inte-
         ger. The procedure block proc' must be declared like this: 
          
&_                   procedure block proc' (z,s,b); zone z; integer s,b; 
          
     5.5.5     S_c_o_p_e_ 
                 All identifiers occuring in length' and shares' must be non-
         local to the block. However, block proc' may also be local. 
          
         At the time of exit from the block (through end, or by a go to
                  statement), the activities described by the share descriptors are
         terminated as follows: A communication with a parallel process is
         completed by means of the monitor function wait answer (see ref. 1).
         A running child process is stopped (but not removed, see ref.1).\f

     5.5.6     S_t_a_n_d_a_r_d_ _z_o_n_e_s_ 
         Two zones, "in" and "out", are available without declarations.
                   The declaration is similar to zone in,out (128,1,stderror). (See
         ref. 14). 
                    
5.5.7     S_t_a_n_d_a_r_d_ _b_l_o_c_k_ _p_r_o_c_e_d_u_r_e_ 
A procedure "stderror" exists which can be used as standard block
          procedure without declaration (cf. ref. 14). 
 
 
T_     5.6       Z_o_n_e_ _a_r_r_a_y_ _d_e_c_l_a_r_a_t_i_o_n_s_ 
          
     5.6.1     S_y_n_t_a_x_ 
         zones' ::=        arithmetic expression' 
&_         length' ::=       arithmetic expression' 
         shares' ::=       arithmetic expression' 
         block proc' ::=   procedure identifier' 
T_              zone array list' ::=   
    zone array list',zone array list'  
             zone array identifier'(zones',length',shares',block proc')
&_         zone array declaration' ::=          zone array zone array list'
          
T_     5.6.2     E_x_a_m_p_l_e_s_ 
         zone array inmerge(3,2*600,2,stderror), 
&_                     outmerge(3,2*600,2,stderror) 
          
     5.6.3     S_e_m_a_n_t_i_c_s_ 
         A zone array declaration declares one or more identifiers to re-
         present one-dimensional arrays of zones. The arithmetic expres-
         sions in the declaration are evaluated once for each entrance
         into the block. Each zone array consists of as many zones as spe-
         cified by  zones . All these zones' are declared with length',
shares', and block proc' as specified (cf. section 5.5). The
         zones of a zone array are numbered 1, 2,..., zones'. 
         Inside a block, a zone array identifier may occur as an actual
         parameter, as a constituent of a subscripted zone occurring as a
         parameter (cf. 3.7), or as a constituent of a record variable
         (cf. 3.1). 
          
     5.6.4     T_y_p_e_s_ 
         zones' must be of type integer. See section 5.5.4 for length',
         shares', and block proc'. 
             \f

         5.6.5     S_c_o_p_e_ 
All identifiers occurring in  zones  must be non-local to the
block. See section 5.5.5 for length', shares', block proc',
and the exit from the block. 
          
 
T_   5.7       F_i_e_l_d_ _d_e_c_l_a_r_a_t_i_o_n_s_ 
          
     5.7.1     S_y_n_t_a_x_   * 
&_         field list' ::=   field variable' ,field variable'  0 
          
simple field declaration' ::= type' field field list' 
T_         1
&_array field declaration' ::=   type' 0 array field field list'
               
T_         field declaration' ::=      simple field declaration' 
&_                                      array field declaration' 
          
T_     5.7.2     E_x_a_m_p_l_e_s_ 
                   integer field           if1, if2 
                   long field              lf1 
                   boolean array field     bfa1, bfa2 
&_          array field             rfa1, rfa2, rfa3  
 
     5.7.3     S_e_m_a_n_t_i_c_s_ 
         A field declaration serves to declare one or several identifiers
         as field variables. 
 
Field variables are integers and may be used whereever an integer
variable may be used. 
          
         A variable field declaration declares simple field variables and
         an array field declaration declares array field variables. 
 
The type declared together with the field variables, the associa-
ted type, has no meaning outside field references. 
          
                   All field variables declared in one declaration have the same
         associated type. If no type declarator is given in an array field
         declaration the type real is understood. 
          
     5.7.4     L_o_c_a_t_i_o_n_ _o_f_ _a_ _v_a_r_i_a_b_l_e_ _f_i_e_l_d_ 
         A variable field is located within a field base which may be an
array, a zone record, or an array field. 
 
The denotation of a variable field is shown in section 3.1. \f

The variable field consists of as many halfwords as the type
length of the associated type shows. 
 
A variable field cannot occupy halfwords  outside the bound half-
words (cf. section 5.2.7 and section 3.1.4.3). 
          
                  The integer value of the field variable specifies a halfword num-
         ber.This halfword number is used as an address in the correspon-
         ding field base. 
                
Boolean fields are addressed by their halfword number. Integer,
long, and real fields are synchronized with the word boundaries
(cf. section 5.2.8) of the RC 8000. Integer fields are addressed
by one of the 2 bytes forming the integer word. Long and real
fields are addressed by one of the 2 halfwords in the right hand
word. The address must be  
          '= lower bound halfword + type length - 1  
and it must be = upper bound halfword, of the corresponding
         field base. 
          
     5.7.5     L_o_c_a_t_i_o_n_ _a_n_d_ _b_o_u_n_d_s_ _o_f_ _a_n_ _a_r_r_a_y_ _f_i_e_l_d_ 
         An array field is located within the field base. For an array
field variable the halfword number should be lower bound half-
word -1, where lower bound halfword is the lower bound of the
wanted array addressed within the field base. The halfword number
referring to a certain piece of data in the array field is found
by subtracting the value of the array field variable from the
corresponding halfword number in the field base. 
 
If the field base is an array field, this rule may be used recur-
sively. 
         The bound halfword numbers are given by the formula: 
          
 T_           bound halfword of array field = 
 &_           bound halfword of field base - value of array field variable.
                
         A subscripted element in an array field is addressed according to
         the rule in section 5.2.8. The address of a subscripted element
         must be '= lower bound halfword + type length - 1  
and it must be = upper bound halfword. 
          
 \f

T_       5.8       C_o_n_t_e_x_t_ _d_e_c_l_a_r_a_t_i_o_n_s_ 
           
         5.8.1     S_y_n_t_a_x_ 
            context declaration' ::= 
&_              context(incarnation',no of incarnations',context mode') 
           
          incarnation' ::=             arithmetic expression' 
          no of incarnations' ::=      arithmetic expression' 
          context mode' ::=            arithmetic expression' 
           
T_       5.8.2     E_x_a_m_p_l_e_s_ 
                    context (i, M+N, 3) 
                    context (if p then 1 else 4, Q, 1 shift 1) 
&_           
         5.8.3     S_e_m_a_n_t_i_c_ 
                   A context declaration serves to indicate that the actual block is
          a context block (cf. 4.1.1). The variables declared in the block
are denoted context variables. 
           
          A context declaration defines a number of incarnations of the de-
          clared block; these incarnations are numbered: 1, 2, 3 ..., no
          of incarnations'; the declarator parameter incarnation' repre-
          sents such an incarnation number. To each execution of a context
block is related an incarnation number. If two different execu-
tions of a context block have the same incarnation number, they
define the same incarnation of the context block. The number of
different incarnations is thus equal to the value of the declara-
tor parameter: no of incarnations'. 
           
          The effect of a context declaration is now that the context va-
          riables declared in the context block are initialized to values
          depending on the incarnation before the first statement in the
          block is executed. When the block is left (via the last end in
          the block or by means of a goto statement) the values of its con-
          text variables are stored, and these variables will be initialized
          to the stored values in the following execution of the same incar-
          nation of the block. 
           
                   The parameter context mode' affects this initialization and sto-
          ring of context variables. See 5.8.3.4. In more detail, the con-
          text declarator functions as follows: 
           
     5.8.3.1   I_n_c_a_r_n_a_t_i_o_n_ _I_n_t_e_r_v_a_l_. When a context block is executed first
                   time, the actual value of no of incarnations' defines the number
          of different incarnations of the block. This value will then re-\f

          main unchanged for the rest of the program run, although the va-
          lue may be changed by the program during the run. The value can
be changed using the context mode "new block bit" (cf. 5.8.3.4).
This value defines the incarnation interval: 1 = incarnation =
no of incarnations.  
                
5.8.3.2   I_n_i_t_i_a_l_i_z_a_t_i_o_n_ _o_f_ _C_o_n_t_e_x_t_ _V_a_r_i_a_b_l_e_s_. When a context block is en-
          tered, and before the first statement is executed, the following
               is done: 
           
The value of incarnation' is evaluated, and it is verified that
it is within the incarnation interval. This incarnation is used
                   throughout the execution of the context block, although the value
of incarnation' may be changed in the block. This concept is si-
milar to value parameters in procedures. To an incarnation is re-
lated just one record, the fields of which are identical with the
declared context variables. To each context block are thus con-
nected no of incarnations' records. Such records are known as
context records. The context variables of the block are initia-
lized if the incarnation concerned has been executed before, the
contents of the corresponding context record will be transferred
to the context variables of the block. If it is a first-time exe-
cution of the incarnation concerned, all the context variables of
the block are set to 0. This zero-set of all variables is perfor-
med when "new incarnation bit" is specified, too (cf. 5.8.3.4). 
           
          The actual array lengths defines at the same time the maximum
          array lengths applicable to this incarnation. This means that an
          array length, in all subsequent runs of this incarnation, shall
          be less than or equal to the maximum length.Transfer of values
          between context records and context variables is done in accor-
          dance with the common lexicographic procedure. 
                
5.8.3.3   S_t_o_r_a_g_e_ _o_f_ _C_o_n_t_e_x_t_ _V_a_r_i_a_b_l_e_s_. When a context block is left (via
          the last end in the block, an exit statement, or a goto state-
          ment) the context variables of the block are stored in the con-
          text record belonging to the incarnation, as follows: 
                    
                   If it was the first time the incarnation was executed the corre-
          sponding context record is established in the virtual memory con-
          nected with the program. 
           
          The values of the context variables of the block are transferred
          to the context record belonging to the block and its incarnation.
           
          If several context blocks are nested into one another, and if\f

          jump-outs occur from several block levels, the process described
          above will develop for each of the context blocks thus being
          left. 
           
     5.8.3.4   C_o_n_t_e_x_t_ _M_o_d_e_. The actual value of context mode' affects the pro-
          cess described in 5.8.3.3. The value is regarded as a bit pattern:
           
T_                    1 shift 0 (read bit): 
                             The updating of the context record described in 5.8.3.3
                    is not executed unless read bit is set; if read bit is
                    not set, solely the zerosetting of context variables is
&_                    performed. 
           
T_                    1 shift 1 (write bit): 
                    The updating of the context record in virtual memory
described in 5.8.3.3 is not executed unless write bit
is set. Write bit = 0 is therefore usable for referen-
&_ces to and searching in context records. 
           
T_                    1 shift 2 (save bit): 
                    Every time a context block is left the context variables
                          of the actual incarnation are saved on backing storage
&_          and in virtual memory. 
 
T_1 shift 3 (new block bit): 
                       Same function as if this context block was executed
                    first time. If context records has been established, 
&_                    such records are ignored. 
           
T_                    1 shift 4 (new incarnation bit): 
                    Same function as if this incarnation was executed first
&_                    time. 
           
T_   5.8.4     T_y_p_e_s_ 
          incarnation', no of incarnations' and context mode' must all
&_          be of type integer. \f

         F_        R_E_F_E_R_E_N_C_E_S_:_ 
           
           
                   Ref. 1:   RC 8000 Monitor, Part 1, Design Philosophy, 
                    A/S Regnecentralen, Copenhagen, 1978 
           
Ref. 2:   RC 8000 Monitor, Part 2, Reference Manual 
                        A/S Regnecentralen, Copenhagen, 1978 
           
Ref. 3:   RC 8000 Monitor, Part 3, External Processes 
                    A/S Regnecentralen, Copenhagen, 1978 
               
Ref. 4:   RC 4000, Computer, Reference Manual 
                    A/S Regnecentralen, Copenhagen, 1969 
           
Ref. 5:   RC 8000, Computer, Reference Manual 
                    A/S Regnecentralen, Copenhagen, 1976
               
Ref. 6:   Utility programs, File processor Part 1-3 
                    A/S Regnecentralen, Copenhagen, 1977 
           
Ref. 7:   BOSS 2, User"s Manual 
                    A/S Regnecentralen, Copenhagen, 1975 
           
Ref. 8:   Operating System S 
                    A/S Regnecentralen, Copenhagen, 1978 
           
Ref. 9:   RC Fortran, User"s Manual 
                    A/S Regnecentralen, Copenhagen, 1977 
           
                   Ref. 10:  Code procedures and the run time organisation of algol
          programs.  
                    A/S Regnecentralen, Copenhagen, 1970 
           
   Ref. 11:  R.M. De Morgan et al.: Modified Report on the
          Algorithmic Language Algol 60. The computer Journal,
          Vol 19, no. 4 pp 364-379 
                    
Ref. 12: J.W. Backus, et al.: Revised Report on the Algorithmic 
                    Language Algol 60 (ed. Peter Naur), 
                    A/S Regnecentralen, Copenhagen, 1962 
                    Comm. ACM 6 no. 1 (1963), pp 1-17 
           
Ref. 13:  ISO: R646 - 1967 (E), 6 and 7 bit coded character set
          for information processing interchange \f

Ref. 14:  ALGOL 7, User"s Manual 
                    A/S Regnecentralen, Copenhagen, 1978 
           
                   Ref. 15:  Paul Lindgreen: A comprehensive method for input data
          description. Eddap notes no. 14, 
                    A/S Regnecentralen, Copenhagen, 1976 \f

F_                 INDEX 
           
          All references are given through section numbers. The references
          are given in three groups: 
           
                   Definition:  Following the word "definition", reference tothe 
             syntactic definition (if any) is given. 
               Use:         Following the word "use", references to the occur-
                                rences in metalinguistic formulae are given. Refe-
                       rences already quoted in the def-group are not re-
                            peated. 
             Text:        Following the word "text", the references to defini-
tions given in text are given. 
              
 
+  see:   plus 
-  see:   minus 
                   *  see:   multiply 
/ // see: divide 
** see:   exponentiation 
              = = '= ' ' see: relational operator' 
== =' and & or ! -, see: logical operator' 
,  see:   comma 
.  see:   decimal point 
"  see:   exponent 
:  see:   colon 
;  see:   semicolon 
:= see:   colon equal 
() see:   parentheses or subscript bracket 
: :' see: string quote 
                   abs 
  use................................. 3.3.1 
  text................................ 3.2.5, 3.3.4.5, 3.3.5.1 
actual parameter' 
   definition.......................... 3.2.1 
actual parameter list' 
   definition.......................... 3.2.1 
actual parameter part' 
                      definition.......................... 3.2.1 
       use................................. 4.7.1 
      add 
  use................................. 3.3.1, 3.4.1 
  text................................ 3.2.5, 3.3.4.5, 3.3.5.1 
adding operator' 
                      definition.......................... 3.3.1 \f

algol 
   use................................. 2.3 
alphabet 
   text................................ 2.1 
             and' 
  definition.......................... 3.4.1 
arithmetic 
   text................................ 3.3.6 
                   arithmetic expression' 
   definition.......................... 3.3.1 
                 use................................. 3, 3.1.1, 3.4.1, 4.2.1,
                                                           4.6.1, 5.2.1, 5.5.1, 5.8.1
                      text................................ 3.3.3 
                   arithmetic operator' 
   definition.......................... 2.3 
                      text................................ 3.3.4 
array
   use................................. 2.3, 5.2.1 
array 
   text................................ 3.1.4.1 
array declaration' 
   definition.......................... 5.2.1 
   use................................. 5 
   text................................ 5.2.3 
array declarer' 
   definition.......................... 5.2.1 
   use................................. 5.4.1 
array identifier' 
   definition.......................... 3.1.1 
   use................................. 3.2.1, 4.7.1, 5.2.1 
   text................................ 2.8 
array field 
  use................................. 5.4.1, 5.7.1 
array field' 
  definition.......................... 3.1.1 
  use................................. 3.2.1 
  text................................ 3.1.4.3 
array field declaration' 
  definition.......................... 5.7.1 
array field variable' 
  definition.......................... 3.1.1 
array list' 
   definition.......................... 5.2.1 
array segment' 
   definition.......................... 5.2.1 \f

assignment statement' 
   definition.......................... 4.2.1 
   use................................. 4.1.1 
   text................................ 1, 4.2.3 
 
basic statement' 
   definition.......................... 4.1.1 
   use................................. 4.5.1 
                   basic symbol' 
   definition.......................... 2 
 begin 
                  use................................. 2.3, 4.1.1 
block' 
   definition.......................... 4.1.1 
   use................................. 4.5.1 
   text................................ 1, 4.1.3, 5 
block head' 
   definition.......................... 4.1.1 
block proc' 
                      definition.......................... 5.5.1 
   use................................. 5.6.1 
                   boolean 
             use................................. 2.3, 5.1.1 
             text................................ 5.1.3
          boolean expression' 
             definition.......................... 3.4.1 
             use................................. 3, 3.3.1, 4.2.1, 4.5.1,
                                                  4.6.1, 4.6.8, 4.6.12 
                  text................................ 3.4.3 
          boolean factor' 
             definition.......................... 3.4.1 
          boolean primary' 
             definition.......................... 3.4.1 
          boolean secondary' 
             definition.......................... 3.4.1 
          boolean term' 
             definition.......................... 3.4.1 
          bound pair' 
             definition.......................... 5.2.1 
          bound pair list' 
             definition.......................... 5.2.1 
          bracket' 
             definition.......................... 2.3 
          buffer area 
  text................................ 5.5.3 \f

capital letter' 
  definition...........................2.2  
case clause' 
   definition...........................3.3.1 
  use................................. 3.4.1, 3.5.1, 3.6.1, 4.5.1
  text................................ 3.3.3 
case statement' 
  definition.......................... 4.5.1 
  text................................ 4.5.5 
          closed string' 
             definition.......................... 2.6.1 
          code' 
             use................................. 5.4.1 
             text................................ 4.7.8, 5.4.6 
          colon: 
             use................................. 2.3, 3.2.1, 4.1.1, 4.5.1,
                                                  4.6.1, 4.7.1, 5.2.1 
               colon equal := 
             use................................. 2.3, 4.2.1, 4.6.1, 5.3.1 
          comma, 
             use................................. 2.3, 3.1.1, 3.2.1, 4.6.1,
                                                  4.7.1, 5.1.1, 5.2.1,
                                                       5.3.1, 5.4.1 
               comment 
             use................................. 2.3 
          comment convention 
                      text................................ 2.3 
          compound statement' 
             definition.......................... 4.1.1 
             use................................. 4.5.1 
             text................................ 1 
                   compound tail' 
             definition.......................... 4.1.1 
          compund symbols 
   definition.......................... 2.3 
conditional if statement' 
  definition.......................... 4.5.1 
  text................................ 4.5.3 
conditional statement' 
             definition.......................... 4.5.1 
             use................................. 4.1.1 
             text................................ 4.5.3, 4.5.5 
          context 
  use................................. 2.3 
  text................................ 5.8.1 
context block' 
  definition.......................... 4.1.1 
  text................................ 5.8.3 \f

context block head' 
  definition.......................... 4.1.1 
context declaration' 
  definition.......................... 5.8.1 
  use................................. 5 
  text................................ 5.8.3 
context label.......................... 4.8.3 
context mode' 
                      definition.......................... 5.8.1 
             text................................ 5.8.3.4 
          context operator' 
             definition.......................... 2.3 
          context statement' 
             definition.......................... 4.8.1 
             use................................. 4.1.1 
             text................................ 4.8.3 
          context variable....................... 5.8.3 
          context variable declaration' 
             definition.......................... 5 
             use................................. 4.1.1 
          continue point......................... 4.8.3 
          continue statement' 
             definition.......................... 4.8.1 
             text................................ 4.8.3 
           
                   decimal fraction' 
             definition.......................... 2.5.1 
          decimal number' 
             definition.......................... 2.5.1 
             text................................ 2.5.3 
          decimal point 
             use................................. 2.3, 2.5.1 
          declaration' 
             definition.......................... 5 
             use................................. 4.1.1 
             text................................ 1, 5 
          declarator' 
             definition.......................... 2.3 
          delimiter' 
             definition.......................... 2.3 
             use................................. 2 
          designational expression' 
             definition.......................... 3.5.1 
             use................................. 3, 4.5.1, 5.3.1 
             text................................ 3.5.3 \f

          destination' 
             definition.......................... 4.2.1 
          digit' 
             definition.......................... 2.2.1 
             use................................. 2, 2.4.1, 2.5.1 
          dimension 
             text................................ 5.2.3.2 
          divide / // 
             use................................. 2.3, 3.3.1 
             text................................ 3.3.4.2 
do 
                      use................................. 2.3, 4.6.1 
                   d"s' 
  definition.......................... 2.6.1 
dummy statement' 
             definition.......................... 4.4.1 
             use................................. 4.1.1 
             text................................ 4.4.3 
           
                   else 
             use................................. 2.3, 3.3.1, 3.4.1, 3.5.1,
                                                  4.5.1 
                  text................................ 4.5.3.2 
          empty' 
             definition.......................... 1.1 
             use................................. 2.6.1, 3.2.1, 4.4.1,
                                                  4.7.1, 5.1.1, 5.4.1 
               end 
             use................................. 2.3, 4.1.1 
          entier 
   use................................. 3.3.1 
   text................................ 3.2.5, 3.3.4.5, 3.3.5.1 
exponent " 
             use................................. 2.3, 2.5.1 
          exponentiation ** 
             use................................. 2.3, 3.3.1 
             text................................ 3.3.4.3 
          exponent part' 
             definition.......................... 2.5.1 
             text................................ 2.5.3 
               expression' 
             definition.......................... 3 
             use................................. 3.2.1, 4.7.1 
             text................................ 3 \f

                   exit statement' 
                      definition.........................  4.8.1 
  text................................ 4.8.3 
extend 
  use................................. 3.3.1 
  text................................ 3.2.5, 3.3.4.5, 3.3.5.1 
external 
  use................................. 2.3 
extract 
  use................................. 3.3.1 
  text................................ 3.2.5, 3.3.4.5, 3.3.5.1 
 
factor' 
             definition.......................... 3.3.1 
          false 
                      use................................. 2.2.2 
               fat comma.............................. 3.2.1 
field 
  use................................. 2.3, 5.4.1, 5.7.1 
field' 
  definition.......................... 3.1.1 
field base' 
  definition.......................... 3.1.1 
field declaration' 
  definition.......................... 5.7.1 
  use................................. 5 
  text................................ 5.7.3 
field list' 
  definition.......................... 5.7.1 
field reference' 
  definition.......................... 3.1.1 
field variable' 
  definition.......................... 3.1.1 
  text................................ 3.1.3.2 
first letter' 
  definition.......................... 2.6.1 
for 
             use................................. 2.3, 4.6.1 
          for clause' 
             definition.......................... 4.6.1 
             text................................ 4.6.3 
          for list' 
             definition.......................... 4.6.1 
             text................................ 4.6.4 \f

                   for list element' 
   definition.......................... 4.6.1 
             text................................ 4.6.4.1, 4.6.4.2, 4.6.4.3
          formal parameter' 
             definition.......................... 5.4.1 
             text................................ 5.4.3 
          formal parameter list' 
             definition.......................... 5.4.1 
          formal parameter part' 
             definition.......................... 5.4.1 
                   for statement' 
             definition.......................... 4.6.1 
             use................................. 4.1.1, 4.5.1 
             text................................ 4.6 
          function designator' 
             definition.......................... 3.2.1 
             use................................. 3.3.1, 3.4.1 
                      text................................ 3.2.3, 5.4.4 
                    
goto 
             use................................. 2.3, 4.3.1 
          goto statement' 
             definition.......................... 4.3.1 
             use................................. 4.1.1 
             text................................ 4.3.3 
           
          identifier' 
             definition.......................... 2.4.1 
             use................................. 3.1.1, 3.2.1, 3.5.1,
                                                  5.4.1 
                  text................................ 2.4.3 
          identifier list' 
             definition.......................... 5.4.1 
          if 
             use................................. 2.3, 3.3.1, 4.5.1 
          if clause' 
             definition.......................... 3.3.1, 
             use................................. 3.4.1, 3.5.1, 4.5.1 
             text................................ 3.3.3, 4.5.3.2 
          if statement' 
             definition.......................... 4.5.1 
             text................................ 4.5.3.1 
          implication' 
             definition.......................... 3.4.1 
               incarnation' 
            definition.......................... 5.8.1 
                      text................................ 5.8.3 \f

                integer 
                   use................................. 2.3, 5.1.1 
             text................................ 5.1.3 
          integer' 
             definition.......................... 2.5.1 
             text................................ 2.5.4 
           
          label 
             use................................. 2.3, 5.4.1 
                   label' 
             definition.......................... 3.5.1 
             use................................. 4.1.1, 4.5.1, 4.6.1 
             text................................ 1, 4.1.3, 4.7.6 
          layout' 
  definition.......................... 2.6.1 
layout external part' 
  definition.......................... 2.6.1 
layout number part' 
  definition.......................... 2.6.1 
layout string' 
  definition.......................... 2.6.1 
  text................................ 3.6.5.3 
left part' 
             definition.......................... 4.2.1 
          left part list' 
             definition.......................... 4.2.1 
          length' 
   definition.......................... 5.5.1 
   use................................. 5.5.1 
letter' 
             definition.......................... 2.1 
             use................................. 2, 2.4.1, 3.2.1 
          letter string' 
             definition.......................... 3.2.1 
          local 
             text................................ 4.1.3 
                   local or own' 
             definition.......................... 5.1.1 
             use................................. 5.4.1 
                   location 
   text................................ 4.2.3 
logical operator' 
             definition.......................... 2.3 
             use................................. 3.4.1 
text................................ 3.4.5 \f

          logical value' 
             definition.......................... 2.2.2 
             use................................. 2, 3.4.1 
          long 
  use................................. 2.3, 5.1.1 
long 
  use................................. 3.3.1 
  text................................ 3.2.5, 3.3.4.5, 3.3.5.1 
lower bound' 
             definition.......................... 5.2.1 
             text................................ 5.2.4 
           
minus - 
             use................................. 2.3, 2.5.1, 3.3.1 
             text................................ 3.3.4.1 
          mod 
  use................................. 3.3.1 
  text................................ 3.2.5, 3.3.4.5 
multiply * 
             use................................. 2.3, 3.3.1 
             text................................ 3.3.4.1 
                   multiplying operator' 
             definition.......................... 3.3.1 
                    
          non-local 
             text................................ 4.1.3 
          no of incarnations' 
  definition.......................... 5.8.1 
  text................................ 5.8.3 
number' 
             definition.......................... 2.5.1 
             text................................ 2.5.3, 2.5.4 
           
          open string' 
             definition.......................... 2.6.1 
                   operator' 
             definition.......................... 2.3 
          or' 
  definition.......................... 3.4.1 
own 
             use................................. 2.3, 5.1.1 
             text................................ 5, 5.2.5 
           \f

                   parameter delimiter' 
   definition.......................... 3.2.1 
             use................................. 5.4.1 
             text................................ 4.7.7 
          parentheses () 
             use................................. 2.3, 3.2.1, 3.3.1, 3.4.1,
                                                  3.5.1, 4.7.1, 5.4.1 
                  text................................ 3.3.5.2 
          plus + 
             use................................. 2.3, 2.5.1, 3.3.1 
             text................................ 3.3.4.1 
               primary' 
             definition.......................... 3.3.1 
          procedure 
             use................................. 2.3, 5.4.1 
               procedure body' 
             definition.......................... 5.4.1 
          procedure declaration' 
             definition.......................... 5.4.1 
             use................................. 5 
             text................................ 5.4.3 
          procedure heading' 
             definition.......................... 5.4.1 
             text................................ 5.4.3 
          procedure identifier' 
             definition.......................... 3.2.1 
             use................................. 3.2.1, 4.2.1, 4.7.1,
                                                  5.4.1, 5.5.1 
                  text................................ 4.7.5.4 
          procedure statement' 
             definition.......................... 4.7.1 
             use................................. 4.1.1 
             text................................ 4.7.3 
          program' 
             definition.......................... 4.1.1 
             text................................ 1 
          proper string' 
             definition.......................... 2.6.1 
           
                   quantity 
             text................................ 2.7 \f

                   real 
  use................................. 2.3, 5.1.1 
text................................ 5.1.3 
real 
   use................................. 3.3.1 
  text................................ 3.2.5, 3.3.4.5, 3.3.5.1 
record variable 
  text................................ 3.1.3.1, 5.5.3 
record variable' 
  definition.......................... 3.1.1 
relation' 
             definition.......................... 3.4.1 
             text................................ 3.4.5 
          relational operator' 
             definition.......................... 2.3, 3.4.1 
                   repeat 
  use................................. 4.6.8 
repeat statement' 
  definition.......................... 4.6.8 
round 
  use................................. 3.3.1 
  text................................ 3.2.5, 3.3.4.5, 3.3.5.1 
 
          scope 
             text................................ 2.7 
          semicolon; 
             use................................. 2.3, 4.1.1, 5.4.1 
          separator' 
             definition.......................... 2.3 
          sequential operator' 
             definition.......................... 2.3 
          shares' 
             definition.......................... 5.5.1 
             use................................. 5.6.1 
          share descriptor....................... 5.5.3 
          shift 
             use................................. 3.3.1, 3.4.1 
             text................................ 3.2.5, 3.3.4.5, 3.3.5.1 
          sign' 
             definition.......................... 2.6.1 
              simple arithmetic expression' 
             definition.......................... 3.3.1 
             use................................. 3.4.1 
             text................................ 3.3.3 
          simple block head' 
  definition.......................... 4.1.1 
simple boolean' 
                      definition.......................... 3.4.1 \f

                   simple declaration' 
                      definition.......................... 5 
  use................................. 4.1.1 
simple designational expression' 
             definition.......................... 3.5.1 
          simple field' 
  definition.......................... 3.1.1 
  use................................. 5.5.3 
  text................................ 2.8, 5.5.3 
simple field declaration' 
   definition.......................... 5.7.1 
simple variable' 
   definition.......................... 3.1.1 
   use................................. 5.1.1 
             text................................ 2.4.3 
          simple variable field' 
            definition.......................... 3.1.1 
          small letter' 
  definition.......................... 2.1 
spaces' 
  definition.......................... 2.6.1 
specification part' 
             definition.......................... 5.4.1 
             text................................ 5.4.5 
          specificator' 
             definition.......................... 2.3 
          specifier' 
             definition.......................... 5.4.1 
                   standard block procedure............... 5.5.7 
     standard functions and procedures 
                      text................................ 3.2.4 
                   standard procedures 
             text................................ 4.7.9 
            statement' 
                      definition.......................... 4.1.1 
                      use................................. 4.5.1, 4.6.1, 4.6.12,
                                                 5.4.1 
   text................................ 4 
          statement bracket see: begin end 
          stderror............................... 5.5.7 
step 
             use................................. 2.3, 4.6.1 
             text................................ 4.6.4.2 
          statement set' 
  definition.......................... 4.5.1 
  use................................. 4.6.8, 4.9.1 \f

string 
   use................................. 2.3, 5.4.1 
string 
  use................................. 3.3.1 
  text................................ 3.2.5, 3.3.4.5, 3.3.5.1 
string' 
             definition.......................... 2.6.1 
             use................................. 3.2.1, 4.7.1 
             text................................ 2.6.3 
          string quotes : :' 
             use................................. 2.3, 2.6.1 
             text................................ 2.6.3 
          subscript 
             text................................ 3.1.4.1 
          subscript bound 
             text................................ 5.2.3.1 
          subscript brackets () 
             use................................. 2.3, 3.1.1, 3.5.1, 5.2.1 
          subscripted variable' 
             definition.......................... 3.1.1 
             text................................ 3.1.4.1 
          subscript expression' 
             definition.......................... 3.1.1 
             use................................. 3.5.1 
          subscript list' 
             definition.......................... 3.1.1 
          successor 
             text................................ 4 
          switch 
             use................................. 2.3, 5.3.1, 5.4.1 
          switch declaration' 
             definition.......................... 5.3.1 
             use................................. 5 
             text................................ 5.3.3 
          switch designator' 
             definition.......................... 3.5.1 
             text................................ 3.5.3 
          switch identifier' 
             definition.......................... 3.5.1 
             use................................. 3.2.1, 4.7.1, 5.3.1 
                   switch list' 
             definition.......................... 5.3.1 
           
          term' 
             definition.......................... 3.3.1 
                   then 
             use................................. 2.3, 3.3.1, 4.5.1 \f

          true 
             use................................. 2.2.2 
          type' 
             definition.......................... 5.1.1 
             use................................. 5.4.1 
             text................................ 2.8 
          type declaration' 
             definition.......................... 5.1.1 
             use................................. 5 
             text................................ 5.1.3 
          type list' 
             definition.......................... 5.1.1 
           
          unconditional statement' 
             definition.......................... 4.1.1 
             use................................. 4.5.1 
unlabelled basic statement' 
                      definition.......................... 4.1.1 
          unlabelled block' 
             definition.......................... 4.1.1 
          unlabelled compound' 
             definition.......................... 4.1.1 
          unsigned integer' 
             definition.......................... 2.5.1 
                   unsigned number' 
             definition.......................... 2.5.1 
             use................................. 3.3.1 
          until 
             use................................. 2.3, 4.6.1 
             text................................ 4.6.4.2 
          upper bound' 
             definition.......................... 5.2.1 
             text................................ 5.2.4 
           
          value 
             use................................. 2.3, 5.4.1 
          value 
             text................................ 2.8, 3.3.3 
                   value part' 
             definition.......................... 5.4.1 
             text................................ 4.7.3.1 \f

          variable' 
   definition.......................... 3.1.1 
   use................................. 3.3.1, 3.4.1, 4.2.1 
             text................................ 3.1.3 
          variable identifier' 
             definition.......................... 3.1.1 
             use................................. 4.6.1 
           
          while 
             use................................. 2.3, 4.6.1 
             text................................ 4.6.4.3 
          while statement' 
             definition.......................... 2.6.1 
                    
          zeroes' 
   definition.......................... 2.6.1 
zone 
             use................................. 2.3, 5.4.1, 5.5.1 
             text................................ 5.5.3 
          zones' 
             definition.......................... 5.6.1 
          zone array 
             use................................. 5.4.1, 5.6.1 
             text................................ 5.6.3 
          zone array declaration' 
             definition.......................... 5.6.1 
             use................................. 5 
          zone array identifier' 
             definition.......................... 3.1.1 
             use................................. 3.2.1 
          zone array list' 
             definition.......................... 5.6.1 
          zone declaration' 
             definition.......................... 5.5.1 
             use................................. 5 
             text................................ 5.5.3 
          zone descriptor........................ 5.5.3 
          zone expression' 
             definition.......................... 3.1.1 
             use................................. 3 
          zone identifier' 
             definition.......................... 3.1.1 
             use................................. 3.2.1 
          zone list' 
             definition.......................... 5.5.1 
                   zone record............................ 5.5.3 
          zone segment' 
             definition.......................... 5.5.1 \f

                                                 i 
           
          F_O_R_E_W_O_R_D_ 
           
          Errorlog is an external process used to registrate different kind
          of errors. 
           
          Errorlog is activated when an internal process sends one or more
          messages to errorlog. The message shall point out an area inside
          the calling process where the testrecords can be delivered. When
          the area is filled, errorlog will return an answer specifying the
          number of halfwords delivered. 
           
           \f

                                                 ii 
           \f

                                                 iii 
           
          T_A_B_L_E_ _O_F_ _C_O_N_T_E_N_T_S_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _P_A_G_E_ 
           
          1.  ERRORKINDS ............................................   1 
           
          2.  COMMUNICATION WITH ERRORLOG ...........................   2 
           
          3.  RECORD FORMATS ........................................   3 
              3.1  Internal Interrupts and Break 6 ..................   3 
              3.2  Discerror ........................................   3 
                   3.2.1  Current Status ............................   5 
                   3.2.2  Event Status ..............................   5 
              3.3  FPA Transmission Error ...........................   6 
                   3.3.1  Current Status ............................   6 
                   3.3.2  Event Status ..............................   7 
                   3.3.3  Start Byte ................................   7 
                   3.3.4  Status Byte ...............................   8 
              3.4  Subprocess Error .................................   8 
                   3.4.1  Subkind, Type .............................   9 
           
          A_P_P_E_N_D_I_X_: 
           
          A.  REFERENCES ............................................  11 
           \f

                                                 iv 
           \f

F_       1_._ _ _ _ _ _ _ _ _E_R_R_O_R_K_I_N_D_S_         1.
           
          The following kinds of errors are registrated: 
           
          Internal interrupt 0, 1, 2, and break 6 (monitor call break). 
           
          Discerror. An abnormal result on a disctransfer will cause
          errorlog to generate a record. The record will be generated
          before the discdriver takes action to repair the error, e.g.
          repair by ecc or repeat the transfer. 
           
          FPA transmission error. An abnormal result on a transfer will
          cause errorlog to generate a record. As for the disc, the record
          will be generated before any actions are taken to repair the
          error. 
           
          Subprocess error. Errorlog will generate a record if one or more
          of the following statusbits are set in an answer (statusbit 0 =
          Msb): 
           
          Statusbit  1; Parity error 
          -          2; Timer 
          -          3; Data overrun 
          -          4; Block length error (MT) 
          -          9; Mode error (MT) 
          -         10; Read error (Card Reader) 
          -         11; Card reject or disc error. 
           
           \f

F_       2_._ _ _ _ _ _ _ _ _C_O_M_M_U_N_I_C_A_T_I_O_N_ _W_I_T_H_ _E_R_R_O_R_L_O_G_    2.
           
          Errorlog accepts messages of the following format 
           
               19 < 12 + 0 
               First adr 
               Last adr 
               0 
           
          First and last adr. must point inside the calling process. The
          size must be greater than 76 Hw. 
           
          Errorlog copies the records into the buffer. 
           
          The message is returned in two cases: 
          1) when the rest size in the buffer is less than 76 Hw, 
          2) when copying is rejected maybe because the sender is stopped. 
           
          In both cases errorlog will return an answer stating number of
          halfwords moved. 
           
          It is possible to send several messages to errorlog. The buffers
          will be filled and returned one after one. 
           
          Although it is an i/o message errorlog allows the message
          currently being processed, to be regretted. 
           
          In this case number of halfwords will always be zero. 
           
          Please note that messages sent to errorlog but not under
          processing will cause break 6 if they are regretted. 
           
           \f

F_       3_._ _ _ _ _ _ _ _ _R_E_C_O_R_D_ _F_O_R_M_A_T_S_         3.
           
          All records have the following fields in common: 
           
          +0 Kind;  (halfword) 
          +2  - +8  name of process 
          +30 - +32 time of record (fetched from the monitor table). 
           
           
3_._1_ _ _ _ _ _ _ _I_n_t_e_r_n_a_l_ _I_n_t_e_r_r_u_p_t_s_ _a_n_d_ _B_r_e_a_k_ _6_ 3.1
           
          Format 
          +0 ; Kind=0, 0 
           
          +2 - +8 name of internal process 
           
          +10; w0 
          +12; w1 
          +14; w2 
          +16; w3 
          +18; status 
          +20; IC 
          +22; cause 
          +24; SB 
          +26; (IC-4)   ; last two instructions 
          +28; (IC-2)   ; executed 
          +30; Time1    ; 
          +32; Time2    ; 
           
          A description of the status and cause registers is found in ref.
          1. 
           
           
3_._2_ _ _ _ _ _ _ _D_i_s_c_e_r_r_o_r_ 3.2
           
          An i/o message may be split up in several transfers, each con-
          cerning a consequtive group of segments. If one of these trans-
          fers is unsuccessful errorlog will generate a record. The pro-
          cessname in the record will be the name of the receiver of the\f

          message, i.e. the name of the areaprocess the logical disc or the
          physical disc. The kind will always be 62. 
           
          +0 Kind=62, 0 
          +2 - +8 name of process 
          +10; operation, mode of message 
          +12; first address           ; in primary storage 
          +14; first segment number    ; in current transfer 
          +16; number of segments      ; in current transfer 
          +18; i/o result 
          +20; remaining characters    ; in current transfer 
          +22; current status 
          +24; event status 
          +26; detailed status 
          +28; process description adr.; of physical discprocess 
          +30; time1 
          +32; time2 
           
          I/o result is a result generated by the monitor as action on a
          received external interrupt or a software timeout. It is inter-
          preted as follows: 
           
          i/o result 0; normal termination    ; interrupt received 
                     1; bus reject, busy      ; device not started.(ex.bit23) 
                     2; bustimeout, disconnect; device not started.(ex.bit22) 
                     3; software timeout      ; no interrupt received 
                     4; abnormal termination  ; interrupt received 
                     5; waitprogram terminated; interrupt received 
                     6; power restart         ; software generated 
           
          In case of i/o result 1, 2, 3, 6 the halfwords +20 - +26 will be
          zero as no status has been delivered from the controller. 
           
          In case of i/o result 5 the halfwords +2 - +16 will hold no
          relevant information. 
           
          I/o result 4 means that an interrupt was received but the last
          command executed was not a stop or a wait command. 
           \f

                   The standard channel program always contains a sense command. The
          current status and event status are formed by logical or of
          status from the sense command and the status from the stop
          command, e.g. the standard status. 
           
          Note that remaining characters are undefined if the read or write
          command is not executed. 
           
          A detailed description of the status is found in ref. 2. 
           
           
     3_._2_._1_ _ _ _ _ _C_u_r_r_e_n_t_ _S_t_a_t_u_s_    3.2.1
           
          (bit 0 = Msb) 
          bit 0    : power low in disc/adaptor 
          bit 1    : local 
          bit 5    : seek error 
          bit 8    : write protect 
          bit 9    : high density 
          bit 10   : mode (strobe offset used) 
          bit 16-23: devicekind = 5 
           
           
3_._2_._2_ _ _ _ _ _E_v_e_n_t_ _S_t_a_t_u_s_ 3.2.2
           
          bit 0 : intervention (power change) 
          bit 1 : dataerror    (parity error) 
          bit 3 : data overrun 
          bit 4 : hard error 
          bit 5 : position error 
          bit 20: communication error 
          bit 21: interrupt error 
          bit 22: bus timeout 
          bit 23: bus parity error 
           
           \f

         3_._3_ _ _ _ _ _ _ _F_P_A_ _T_r_a_n_s_m_i_s_s_i_o_n_ _E_r_r_o_r_         3.3
           
          Format of record 
           
          +0 kind, 0                     ; FPA receiver    : kind = 86 
          +2 - +8 NAME of rec/trm process; FPA transmitter : Kind = 88 
                                         ; 
          +10 - +16 standard status 
          +18 - +24 status from first sense 
                +26 startbyte, statusbyte 
                +28 process descr. adr. 
                +30 time 
                +32 time 
          +34 - +40 status from second sense 
          +42 - +74 channel program 
           
          The status areas are formatted as follows: 
          +0 channel progran adr of next command 
          +2 remaining characters 
          +4 current status 
          +6 event status 
           
          For details about channel program and status, see ref. 3. 
           
           
3_._3_._1_ _ _ _ _ _C_u_r_r_e_n_t_ _S_t_a_t_u_s_ 3.3.1
           
          bit 0 : front end disconnected 
          bit 21: device kind ; receiver : 0 transmitter : 1 
          bit 23: always 1 : blockoriented device 
           
          Remaining bits are zero. 
           
           \f

         3_._3_._2_ _ _ _ _ _E_v_e_n_t_ _S_t_a_t_u_s_         3.3.2
           
          bit 0 : reset received from front end (only receiver) 
          bit 1 : parity error in medium 
          bit 2 : time out 
          bit 4 : block length error 
          bit 21: status transfer error 
          bit 22: bus timeout 
          bit 23: bus communication error 
           
          Remaining bits are zero. 
           
          Before a channel program is started the statusareas will be set
          to -1 indicating that status has not been received. 
           
           
3_._3_._3_ _ _ _ _ _S_t_a_r_t_ _B_y_t_e_ 3.3.3
           
          The startbyte and the statusbyte hold information concerning the
          line protocol. 
           
          All transfers on the fpaline are opened with a startbyte. 
           
          Format of startbyte. 
           
          bit 0: blocknumber 
          bit 4: data follows 
          bit 5: header bit 
          bit 6: data flag 
          bit 7: special function 
           
          Special functions are: 
               1 1 1 1 1 1 1 1   master clear 
          and  1 1 0 1 1 1 1 1   accept master clear. 
           
           \f

         3_._3_._4_ _ _ _ _ _S_t_a_t_u_s_ _B_y_t_e_         3.3.4
           
          All transfers are answered with a statusbyte which specifies the
          result of the transmission. 
           
          The format of the statusbyte is: 
           
          bit 12   : blocknumber 
          bit 16-17: block control 
          bit 18   : blocklength error 
          bit 19   : parity error 
           
          Blockcontrol contains acceptance or rejection of a header
          received. The field is dummy if the parity bit is set. 
           
          The values of blockcontrol are: 
          0  accepted 
          1  wait. The operation cannot be received yet due to missing
             resources in the frontend 
          2  skip. The header and data should be cancelled 
          3  reject. Unintelligible function or line not initialized. 
           
          Detailed information about the startbyte and the statusbyte are
          found in ref. 4. 
           
           
3_._4_ _ _ _ _ _ _ _S_u_b_p_r_o_c_e_s_s_ _E_r_r_o_r_ 3.4
           
          Format of record 
           
          +0 : kind, subkind 
          +2 - +8 name of external process 
          +10 message (1) 
          +12 -       (2) 
          +14 -       (3) 
          +16 -       (4) 
          +18 answer  (1)  ; status 
          +20 -       (2)  ; characters transferred 
          +22 -       (3)  ; halfwords transferred \f

          +24 answer  (4)  ; 
          +26 -       (5)  ; 
           
          Kind will be 84 or 85 representing a remote link or a local
          link. 
           
          Subkind holds information about the kind of device represented by
          the subprocess. 
           
          Information about the format of message and answer is found in
          the external process manual representing the current subkind. 
           
           
     3_._4_._1_ _ _ _ _ _S_u_b_k_i_n_d_,_ _T_y_p_e_     3.4.1
           
           0  ,general sequential device; 
           4  ,areaprocess              ; see ref. 5 
           6  ,disc                     ; see ref. 6 
           8  ,typewriter               ; see ref. 7 
          12  ,papertape punch          ; see ref. 8 
          14  ,lineprinter              ; see ref. 9 
          16  ,cardreader               ; see ref. 10 
          18  ,magnetic tape            ; see ref. 11, 12 
          22  ,diskette                 ; see ref. 13 
           
           \f

F_                  
           \f

F_       A_._ _ _ _ _ _ _ _ _R_E_F_E_R_E_N_C_E_S_         A.
           
          1  RCSL No 42-i1235: 
               RC8000 Computer Family, Reference Manual 
                
          2  RCSL No 30-M43: 
               DSC801, Disc Storage Controller, Reference Manual 
                
          3  RCSL No 52-AA661: 
               FPA801 Front End Processor Adaptor, Reference Manual 
                
          4  RCSL No 31-D496: 
               FPA Line Control Protocol 
                
          5  RCSL No 31-D539: 
               RC8000 Backing Storage Area Process 
                
          6  RCSL No 31-D546: 
               RC8000 Disc Process (RC36xx) 
                
          7  RCSL No 31-D580: 
               RC8000 Terminal Process 
                
          8  RCSL No 31-D534: 
               RC8000 Paper Tape Punch Process 
                
          9  RCSL No 31-D536: 
               RC8000 Line Printer Process 
                
          10 RCSL No 31-D537: 
               RC8000 Punched Card Reader Process 
                
          11 RCSL No 31-D533: 
               RC8000 Magnetic Tape Process (9-track) 
               RCSL No 31-D540: 
               RC8000 Magnetic Tape Process (7-track) 
                
          12 RCSL No 31-D542: 
               RC8000 Cassette Tape Process 
                \f

                   13 RCSL No 31-D543: 
               Flexible Disc Process 
                
                \f

                    
           \f

                                                 i 
                    
          T_A_B_L_E_ _O_F_ _C_O_N_T_E_N_T_S_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _P_A_G_E_ 
           
          1.  DESCRIPTION ...........................................   1 
           \f

                                                 ii 
                    \f

F_       1_._ _ _ _ _ _ _ _ _D_E_S_C_R_I_P_T_I_O_N_ 1.
           
          DSF138 is a display feature used in the ELITE 1521B display.
          ELITE 1521B is an alphanumeric display used in RC819, RC822B, and
          RC828B. Different character sets are available to make different
          alphabets. 
           
          DSF138 is replacing the normal character ROM and consists of a
          standard RC character generator ROA296. The standard RC character
          generator is shown in fig. 1, and makes the alphabet known as
          EXTENDED DANISH ALPHABET. 
           
          Fig. 2 shows the logic diagram for DSF138. 
           
           \f

F_                  
           
           
           
           
           
           
           
           
           
           
           
           
           
           
           
           
           
           
           
           
           
           
           
           
           
           
           
           
           
           
           
           
           
           
           
           
          Figure 1: Contents of ROA296. Values 32 to 127 make the "EXTENDED
                    DANISH ALPHABET". \f

F_                  
           
           
           
           
           
           
           
           
           
           
           
           
           
           
           
           
           
           
           
           
           
           
           
           
           
           
           
           
           
           
           
           
           
           
           
           
           
          Figure 2: DSF138 Display feature. Circuit diagram. \f

F_\f

«eof»