DataMuseum.dk

Presents historical artifacts from the history of:

RC4000/8000/9000

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

See our Wiki for more about RC4000/8000/9000

Excavated with: AutoArchaeologist - Free & Open Source Software.


top - metrics - download

⟦2b5e03808⟧ TextFile

    Length: 155904 (0x26100)
    Types: TextFile
    Names: »ftnpass53tx «

Derivation

└─⟦01e83a425⟧ Bits:30008166 Bånd med SW8010 og SW8500 source code
    └─⟦75ff9bef3⟧ 
        └─⟦this⟧ »ftnpass53tx « 

TextFile


;                                       fortran, pass 5, page 1

;                                       jørgen lindballe

;                    c o n t e n t s
;
;
;
;       1            introduction
;
;       2            input
;
;       3            output
;
;       4            process
;
;
;           4.0        general process description
;
;           4.1        label numbers and error labels
;
;           4.2        reverse processing
;
;               4.2.1        macroscopic reverse processing
;
;               4.2.2        microscopic reverse processing
;
;                   4.2.2.1        do statement
;
;                   4.2.2.2        implied do loop
;
;                   4.2.2.3        data statement
;
;                   4.2.2.4        parentheses and the stack
;
;           4.3        input - and output records
;
;           4.4        trouble records and error messages
;
;
;       5            the program
;
;
;
\f



;                                       fortran, pass 5, page 2



;              chapter 1: introduction
;
;
;   the purpose of pass 5 is to:
;
;
;   1.  replace labels by labelnumbers and to detect
;       erroneous usage of labels and
;
;
;   2.  perform such macroscopic and microscopic processing,
;       which can be done by a reserve pass only.
;
;
;   erroneous used labels are multiple declared labels and
;   not declared labels.
;
;
;   macroscopic reverse processing is processing which takes
;   place over more than one statement, for example the
;   creation of the global entry point list, the transport to
;   the declaration part of the
;
;               label variable list, and
;               local entry point list
;
;   and the transport to the beginning of a program unit of the
;
;               no. of bytes for simple local variables and stm.fct.param.
;               external list,
;               zone common list, and
;               general common list
;
;  furthermore macroscopic processing is the picking-up of external
;  representations for the global entry point list, the external list,
;  the zone common list, and the general common list, and
;  finally the replacement of each erroneous terminated do-
;  statement by a troublestatement.
;
;
;  microscopic reverse processing is processing which takes
;  place within a statement, for example the matching
;  of left parentheses to their corresponding right paren-
;  theses, including the removal of io-parentheses, the
;  replacement of <goto> by <simple goto>, <assigned goto>,
;  or <computed goto>, the replacement of <end if expression>
;  by <arithmetical if> or <logical if>, in troublestatements
;  the replacement of operands by <vanished operand> and
;  the removal of operators, the processing of do-statements,
;  implied do-loops and the pairing of constants and
;  variables in data-statements.
;
\f


;                                       fortran, pass 5, page 3



;                      chapter 2: input
;
;
;
;
;                                  1                *
;   <pass 5 input> ::=  (<trouble>) (<unit element>) <end pass>
;                                  0                1
;
;
;
;   <unit element> ::=   <end unit>

;                        <no.of bytes for loc.arrays and loc.zones>

;                        <no.of bytes for simple loc.var.and stm.fct.par.>

;                        <label variable list>

;                        <external list>

;                        <local entry point list>
;                                    *
;                       (<statement>) 
;                                    0
;                                                         *
;                       (<statement function declaration>)
;                                                         0
;                        <common variables in datastatements>
;                                                   *
;                       (<common zone declaration> )
;                       (<common array declaration>)
;                                                   0
;                        <zone common list>
;                                   *
;                        (<trouble>)
;                                   0
;                        <general common list>
;                                   *
;                        (<trouble>)
;                                   0
;                                                   *
;                       (<local zone declaration>  )
;                       (<local array declaration> )
;                                                   0
;                        <end formal declarations>
;                                                   *
;                       (<extern. zone declaration>)
;                       (<formal zone declaration> )
;                       (<formal array declaration>)
;                                                   0
;                        <end declarations>
;                                            *
;                       (<data statement>   )
;                       (<format statement> )
;                       (<trouble statement>)
;                       (<empty statement>  )
;                       (<external ident.>  )
;                                            0
;                        <begin unit>
\f


;                                       fortran, pass 5, page 4




;   <statement>    ::=   <var. assignm. statement>     or
;                        <assign statement>            or
;                        <simple goto statement>       or
;                        <assigned goto statement>     or
;                        <computed goto statement>     or
;                        <call statement>              or
;                        <logical if statement>        or
;                        <arithmetical if statement>   or
;                        <do statement>                or
;                        <entry statement>             or
;                        <return statement>            or
;                        <stop statement>              or
;                        <inout statement>             or
;                        <format statement>            or
;                        <trouble statement>           or
;                        <empty statement>
;
;
;          these elements together with
;
;                        <correct do termination>      and
;                        <erroneous do termination>
;
;    which may occur among the statements, are further
;    described in the appendix. they are all composed of the
;    belowmentioned records.
;
;    it is noticed that the <end line> - record, like the
;    <external identification> - record, may occur everywhere
;    within a programunit, and that format statements and
;    trouble statements may occur in the executable part
;    as well as in the declarative part of a unit.
;
\f


;                                       fortran, pass 5, page 5



;      base      input                no.of    action
;      value     record               bytes
;
;
;       1        not used
;      .
;      34        entry                1         0
;
;      35        data group separator 1        37
;
;      36        return               1         0
;
;      37        end unit             1         7
;
;      38        end pass             1         6
;
;      39        begin unit           1         8
;
;      40        end line             1         2
;
;      41        end statement        1         3
;
;      42        begin list           1        23
;
;      43        end list             2        20
;
;      44        call                 1        23
;
;      45        logical constant     2         1
;
;      46        integer constant     3         1
;
;      47        real constant        5         1
;                long constant
;
;      49        double constant      9         1
;                complex constant
;
;      51        statement label      3        15
;
;      52        format label         3        14
;
;      53        label declaration    3         5
;
;      54        end format           3         0
;                continue format
;
;      56        external identificat v         4
;
;      57        trouble              4        39
;
\f


;                                       fortran, pass 5, page 6



;      58        end declarations     1         7
;
;      59        end formal decl.     1         7
;
;      60        dya plus             1         0
;
;      61        not used
;
;      62        dyaminus             1         0
;
;      63        not used
;
;      64        mult star            1         0
;                div slash
;                expon
;                .shift.
;                listcom
;
;      69        iocom                1        33
;
;      70        impl.init.const.     1        53
;                impl.init.var. 
;
;      72        impl.init.gen.       1        55
;
;      73        impl.unt.const.      1        49
;                impl.unt.var.
;
;      75        impl.unt.gen.        1        51
;
;      76        impl.step const.     1        46
;                impl.step var.
;
;      78        impl.step gen.       1        47
;
;      79        do init. const.      1        52
;                do init. var.
;
;      81        do init.gen.         1        54
;
;      82        do unt.const.        1        48
;                do unt.var.
;
;      84        do unt.gen           1        50
;
;      85        do step.const.       1        46
;                do step.var.
;
;      87        do step gen          1        47
;
;      88        data star            1         0
;
;      89        data slash           1        36
;
\f


;                                       fortran, pass 5, page 7



;      90        multiple equal       1         0
;
;      91        impl.equal           1        57
;
;      92        do equal             1        56
;
;      93        arithm. equal        1         0
;                .lt.
;                .le.
;                .eq.
;                .ge.
;                .gt.
;                .ne.
;                .and.
;                .or.
;                .not.
;
;     103        begin closed format  3        18
;                begin open format
;
;     105        not used
;
;     106        goto                 1        24
;
;     107        if                   1         0
;                do
;                to
;                stop
;
;     111        read                 1        23
;                write 
;
;     113        correct do term.     1        16
;
;     114        errorn. do term.     1        17
;
;     115        arithm. left parent. 1        22
;
;     116        end call             1        25
;
;     117        spark                1         0
;
;     118        arithm.right parent. 1        19
;
;     119        io right parent.     1        21
;
;     120        impl. right parent.  1        19
;
;     121        end if-expr.         1        24
;
;     122        vanished operand     1        40
;
\f


;                                       fortran, pass 5, page 8



;     123        end simple goto      1        21
;                end comp. goto
;                end ass. goto
;                end arithm if
;                end logical if
;
;     128        end data             1        34
;
;     129        end do               1        41
;
;     130        end io               1        42
;
;     131        not used   
;                not used
;
;     150        gen.common list      v        13
;
;     151        zone common list     v        12
;
;     152        com.var.in data stm. 1 (3)    11
;
;     153        local entry point list v      10
;
;     154        external list        v         9
;
;     155        label variable list  v        44
;
;     156        no.of bytes,s.l.v.,stm.f.par2 43
;
;     157        no.of bytes,loc.arr.,zones3    7
;     
;
;     158        loc.arr.declaration  4         7
;                com.arr.declaration 
;
;     160        form.arr.declaration v         7
;
;     161        loc.zone declaration 9         7
;
;     162        com.zone declaration 4         7
;
;     163        form.zone declar.    5         7
; 
;     164        not used
;                not used
;
;     169        ext. zone decl.      3         7
;
;     170        not used
;                not used
;
\f


;                                       fortran, pass 5, page 9



; 178-185        simple local             2           1
;
; 186-193        simple common            3           1
;
; 194-201        simple param.            2           1
;
; 202-209        arr.(loc,com,param)      v           1
;
; 210-217        zone,-arr.(loc,com,par)  3           1
;
; 218-225        external                 2           1
; 226-233        external param  
; 234-241        entry point name
;
; 242-249        stm.fct.call             3           1
;
; 250-257        stm.fct descr.           7           1
;
; 258-265        simple equiv. to arr.    4           1
;
; 266-273        simple equiv. to zone    5           1
;
; 274-281        arr.equiv. to zone       v           1
;
; 282-289        common name              1           1
;
; 290-297        label var.description    2           1
;
; 298-305        trouble description      1           1
;
;     306        not used
;                not used
;
;     512        ident no. in data stm.   1          35
;                ident.no. in data stm.
;
;    2047        not used





;                     chapter 3: output
;
;
;  <pass 5 output> ::=   <end pass>
;                                  1
;                       (<trouble>)
;                                  0
;                                       *
;                       (<unit element>)
;                                       1
;                        <global entry point list>
;
;
;
\f

;                                       fortran, pass 5, page 10



;  <unit element>  ::=   <end unit>

;                        <no.of bytes for loc arrays and loc. zones>
;                                    *
;                       (<statement>)
;                                    0
;                                                         *
;                       (<statement function declaration>)
;                                                         0
;                        <local entry point list>

;                        <label variable list>
;                                                    *
;                       (<common zone declaration>  )
;                       (<common array declaration> )
;                                                    0
;                                  *
;                       (<trouble>)
;                                  0
;                                                   *
;                       (<local zone declaration>  )
;                       (<local array declaration> )
;                                                   0
;                        <end formal declarations>
;                                                   *
;                       (<extern. zone declaration>)
;                       (<formal zone declaration> )
;                       (<formal array declaration>)
;                                                   0
;                        <end declarations>
;                                            *
;                       (<data statement>   )
;                       (<format statement> )
;                       (<trouble statement>)
;                       (<empty statement>  )
;                                            0
;                        <no. of labels and no. of globals>
;                               1
;                       (<data>)
;                               0
;                                              1
;                       (<not declared labels>)
;                                              0
;                                                   1
;                       (<multiple declared labels>)
;                                                   0
;                                                           1
;                       (<declared but not referred labels>)
;                                                           0
;                        <zone common list>

;                        <general common list>

;                        <external list>

;                        <no.of bytes for simple loc. var.and stm.fct.par.>

;                        <begin unit>
;
;
\f


;                                       fortran, pass 5, page 11



;   <statement>  ::= <var. assignm. statement>       or
;                    <assign statement>              or
;                    <simple goto statement>         or
;                    <assigned goto statement>       or
;                    <computed goto statement>       or
;                    <call statement>                or
;                    <logical if statement>          or
;                    <arithmetical if statement>     or
;                    <do statement>                  or
;                    <entry statement>               or
;                    <return statement>              or
;                    <stop statement>                or
;                    <inout  statement>              or
;                    <format statement>              or
;                    <trouble statement>             or
;                    <empty statement>
;
;
;        these elements together with
;
;                    <correct do termination>
;
;  which may occur among the statements, are further described
;  in the appendix. they are all composed of the below mentioned
;  records.
;
;  it is noticed that the <end line> - record may occur
;  ewerywhere within a programunit.
\f


;                                       fortran, pass 5, page 12



;            byte-       output                no.of
;            value       record                bytes
;
;             1          not used                -
;             2          not used                -
;             .
;            33          not used                -
;            34          entry                   1
;            35          not used                -
;            36          return                  1
;            37          end unit                1
;            38          end pass                1
;            39          begin unit              1
;            40          end line                1
;            41          end stm.                1
;            42          begin list              2
;            43          end list                2
;            44          call                    2
;            45          logical const.          2
;            46          int. const.             3
;            47          real const.             5
;            48          long const.             5
;            49          double const.           9
;            50          complex const.          9
;            51          not used                -
;            52          not used                -
;            53          label declaration       1
;            54          end format              3
;            55          cont. format            3
;            56          not used                -
;            57          trouble                 4
;            58          end declarations        1
;            59          end formal decl.        1
;            60          dya plus                1
;            61          not used                -
;            62          dya minus               1
;            63          not used                -
;            64          mult. star              1
;            65          div. slash              1
;            66          expon.                  1
;            67          .shift.                 1
;            68          list com                1
;            69          iocom                   1
;            70          not used                -
;            71          not used                -
;             .
;            87          not used                -
;            88          data star               1
;            89          not used                -
;            90          multiple equal          1
;            91          not used                -
;            92          not used                -
;            93          arithm. equal           1
\f


;                                       fortran, pass 5, page 13



;            94          .lt.                    1
;            95          .le.                    1
;            96          .eq.                    1
;            97          .ge.                    1
;            98          .gt.                    1
;            99          .ne.                    1
;           100          .and.                   1
;           101          .or.                    1
;           102          .not.                   1
;           103          begin closed format     3
;           104          begin open format       3
;           105          not used                -
;           106          not used                -
;           107          if                      1
;           108          do                      1
;           109          to                      1
;           110          stop                    1
;           111          read                    2
;           112          write                   2
;           113          correct do term.        1
;           114          not used                -
;           115          arithm. left parent.    1
;           116          end call                2
;           117          spark                   1
;           118          arithm. right parent.   1
;           119          not used                -
;           120          impl. right parent.     1
;           121          not used                -
;           122          vanished operand        1
;           123          simple goto             1
;           124          comp. goto              1
;           125          ass. goto               1
;           126          end arithm. if          1
;           127          end logical if          1
;           128          not used                -
;           129          end do                  1
;           130          end io                  1
;           131          not used                -
;           132          not used                -
;           133          not used                -
;           134          not used                -
;           135          not used                -
;           136          not used                -
;           137          array data              1
;           138          data init               1
;           139          impl. left parent.      1
;           140          impl. do                1
;           141          impl. init spec.        1
;           142          impl. init gen.         1
;           143          impl. unt.              1
;           144          impl. step              1
;           145          do init. spec           1
;           146          do init. gen.           1
;           147          do unt.                 1
;           148          do step                 1
\f


;                                       fortran, pass 5, page 14



;           149          data                    1
;           150          gen. common list        v
;           151          zone common list        v
;           152          not used                -
;           153          local entry point list  v
;           154          external list           v
;           155          label variable list     v
;           156          no.of bytes, s.l.v.,s.f.par.  2
;           157          no.of bytes, loc.arr,zones    3
;           158          local array declaration 4
;           159          common arr. declaration 4
;           160          formal arr. declaration v
;           161          local zone declaration  9
;           162          com.zone declaration    4
;           163          form. zone declaration  5
;           164          not declared labels     v
;           165          multiple decl. labels   v
;           166          nulls                   v
;           167          global entry point      v
;           168          no.of labels and no. of globals  3
;           169          external zone decl.     3
;           170          not used                -
;           171          not used                -
;           172          not used                -
;           173          not used                -
;           174          not used                -
;           175          not used                -
;           176          not used                -
;           177          not used                -
;       178-185          simple local            2
;       186-193          simple common           3
;       194-201          simple param            2
;       202-209          array(loc,com,par)      v
;       210-217          zone(arr)(loc,com,par)  3
;       218-225          external                2
;       226-233          external param          2
;       234-241          entry point name        2
;       242-249          stm.fct. call           3
;       250-257          stm.fct. descr.         7
;       258-265          simple equiv. to array  4
;       266-273          simple equiv. to zone   5
;       274-281          array equiv. to zone    v
;       282-289          common name             1
;       290-297          label variable descr.   2
;       298-305          trouble description     1
;           306          not used                -
;           307          not used                -
;           .
;           511          not used                -
;           512          oth label               1
;           513          1st label               1
;           514          2nd label               1
;
\f


;                                       fortran, pass 5, page 15



;                        chapter 4: process
;
;                  4.0 general process description
;
;
;
;   the purpose of pass 5 is to
;
;   1.  replace labels by labelnumbers and to
;       detect erroneous usage of labels and
;
;   2.  perform such macroscopic and microscopic processing,
;       which can be done by a reverse pass only.
;
;
;   the core store utilization during the processing of the
;   executable part and during the declarative part of a
;   programunit is shown below.
;
;
;
\f


;                                       fortran, pass 5, page 16



;                     4.1  assignment of label numbers and
;                    detection of erroneous usage of labels
;
;   after having received the local entry point list, pass 5 opens
;   the label table:
;
;
;    label no. label  ds  df  rs  rf
;             -----------------------
;        512  !     !   !   !   !   !  ds: declared statement label
;             -----------------------
;        513  !     !   !   !   !   !  df: declared format    label
;             -----------------------
;          .  !     !   !   !   !   !  rs: referred statement label
;             ----------------------- 
;          .  !     !   !   !   !   !  rf: referred format    label
;             -----------------------

;
;
;   a label may be recognized in a labeldeclaration (it is then
;   examined whether it is a format label (i.e. a declaration
;   in a format statement), or a statement label), or
;   in a label reference (it is then explicitly given whether
;   it is a formatlabel (i.e. referenced in an inout-statement),
;   or a statementlabel). a search through the table is
;   performed; if the label is not found it is added to the
;   table and the 4 counters are set to zero. then one of
;   the four counters is increased by one. instead of the label,
;   the label no. is output.
;
;   at the <begin unit> - record the <no.of labels and globals> is cal-
;   culated and output, and then a search for error labels is
;   performed, and if any, one or two errorlabel-lists
;   (not declared labels and multiple declared labels) are
;   output. furthermore if any, a list of nulls (that is de-
;   clared, but not referred labels) is output.
;
;   a correct label is given by:
;
;   ds=1, df=0, rf=0, if rs=0 then null (statementlabel) or
;   ds=0, df=1, rs=0, if rf=0 then null (format label)
;
;
;   not declared labels are labels which are referred, but not
;   declared:
;
;
;         ds=0, rs>0        (statement label)  or
;         df=0, rf>0        (format label)
;
;
;   multiple declared labels are labels which are declared more
;   than once, i.e.
;
;
;               ds + df > 1
;
;
;   it is noticed that a label at the same time may be
;   -not declared- as well as -multiple declared- for
;   example a label which is declared in two formatstatements,
;   but referred to as a statementlabel.
\f


;                                       fortran, pass 5, page 17



;
;
;             core store utilization during the processing of:
;
;          executable part        no.of       declarative part
;                                 words
;
;   -----------------------------  ---  -------------------------------
;   !       file processor      !  768  !         file processor      !
;   !                           !       !                             !
;   -----------------------------  ---  -------------------------------
;   !       general pass        !  561  !         general pass        !
;   !                           !       !                             !
;   -----------------------------  ---  -------------------------------
;   !         pass 5            ! 1650  !           pass 5            !
;   !                           !       !                             !
;   -----------------------------  ---  -------------------------------
;   !  global entry point list  !       !  global entry point list    !
;   !   incl. local entries     !       !  incl. local entries        !
;   -----------------------------       -------------------------------
;   !        lable table        !       !          lable table        !
;   !                           !       !                             !
;   -----------------------------       -------------------------------
;   ! input- output record      !       !     input-output record     !
;   -----------------------------       -------------------------------
;   !                           !       !   error lables and nulls    !
;   !                           !       -------------------------------
;   !        not used           !       !       not used              !
;   !                           !       -------------------------------
;   !                           !  468  ! <end list>-stack in data    !
;   -----------------------------       -------------------------------
;   !                           !       !       data buffer           !
;   !                           !       -------------------------------
;   ! stack for:                !       !    general common list      !
;   !                           !       -------------------------------
;   !     parentheses           !       !    zone common list         !
;   !     goto, if              !       -------------------------------
;   !     do loops              !       !  com. var. in data stm.     !
;   -----------------------------       -------------------------------
;   ! local entry point list    !       !  local entry point list     !
;   !                           !       !                             !
;   -----------------------------       --------------------------------
;   !     external list         !       !       external list         !
;   !                           !       !                             !
;   -----------------------------       -------------------------------
;   !  lable variable list      !       !    lable variable list      !
;   !                           !       !                             !
;   -----------------------------  ---  -------------------------------
;   !  general pass buffer      !  512  !    general pass buffer      !
;   !                           !       !                             !
;   -----------------------------  ---  -------------------------------
;   !  file processor buffer    ! 1041  !  file processor buffer      !
;   !                           !       !                             !
;   -----------------------------  ---  -------------------------------
;                                 5000
;
;
\f


;                                       fortran, pass 5, page 18



;              4.2  reverse processing

;        4.2.1  macroscopic reverse processing
;
;
; when initialized pass 5 outputs the end pass record, and
; when the end pass record is input, the global entry point
; list is output.
;
; within each unit the following lists are stored:
;
;    no. of bytes for simple loc. var. and stm. fct. param.
;    label variable list
;    external list
;    local entry point list
;    common variables in data statements
;    zone common list
;    general common list
;
; and the local entry point list is copied to the global entry
; point list.
;
; after the executable statements the
;
;    local entry point list and
;    label variable list
;
; are output.
;
; when the begin unit record is met, the following lists
; are output:
;
;    external list
;    zone common list
;    general common list
;    no. of bytes for simple loc. var. and stm. fct. param.
;
; besides the number of labels and the number of globals, and
; the two error label lists, and the nulls, mentioned above.
; if a unit contains datastatements the data record is
; output just before the possible error label lists.
;
; input of an external identification involves a search through
;
;    external list
;    global entry point list
;    zone common list
;    general common list
;
; and if the identnumber is found, the 8-byte external
; representation is added to the list.

; if the correct do termination record or the erroneous
; do termination record is met, a true or a false element
; respectively is added to the stack. when the end do
; record is input an element is taken from the stack;
; if the element is false a trouble statement is output
; instead of the do statement.
\f


;                                       fortran, pass 5, page 19




;        4.2.2  microscopic reverse processing
;
;
; the parentheses are processed in this way by means of the stack:
;
;    <io)> is removed.

;    <arithmetical (> is
;       copied if the right parenthesis was <arithmetical)>.
;       altered to <implied (> if the right parenthesis
;              was <implied )>.
;       removed if the right parenthesis was <io)>.
;
; the number of listelements is copied from the <end list> -
; or the <end call> - record to the <begin list> - , the
; <call> -, the <read> - or to the <write> - record.
;
; <goto> is replaced by <simple goto>, <assigned goto> or
; <computed goto>.
;
; in logical and arithmetical if statements the <end logical if> and
; the <end arithmetical if>, respectively, is removed, replacing
; the <end if expression>.
;
; in a troublestatement each operand (i.e. 1) constant
; (logical -, integer -, long -, real -, double - or complex
; constant), 2) variable description (or in data statements
; the identnumber) (simple variable, label variable, array, zone,
; procedure), and 3) label reference) is replaced by
; the <vanished operand> - record. the <vanished
; operand> - records after the first <trouble> - record,
; the <end statement> - and the <trouble> -
; records are copied. the <end line> -, the <external
; identification> -, and the <label declaration> -
; records are processed in the usual way, the rest of
; the records (including the <vanished operand> - records
; before the first <trouble> - record) are removed.

;          4.2.2.1  do statement
;
;
; if each of the 3 parametres is
;
;    either an integerconstant
;
;    or a simple integervariable (whether this is
;    formal, local, equivalized to en element of an
;    array or a zone)
;
; the <do init. special> - record is output after the
; parametres. contrary the <do init. general> - record is
; output.
;
; the <do equal> - record are removed.
;
;
\f


;                                       fortran, pass 5, page 20



;         4.2.2.2  implied do loop
;
;
; if each of the 3 parametres is
;
;    either an integerconstant
;
;    or a simple integervariable (whether this is
;    formal, local, equivalized to an element of an
;    array or a zone)
;
; the <implied init. special> - record is output after the
; parametres. contrary the <implied init. general> - record
; is output.
;
; the <implied equal> - record is removed.

;          4.2.2.3  data statement
;
;
; the constants and the variables are paired, and the
; <end data> -, <data slash> -, <data group separator>
; -records are removed.
;
; it is checked that the number of constants corresponds
; to the number of variables, and if this is not the case,
; a <trouble> - record is output at the end of the datagroup.
;
; for each identifier number the description is found in
; the <common variables in data statements> - list. if
; the description is not found, the variable is not in common,
; and a <trouble> - description and a <trouble> - record are
; output instead of the missing description.
;
; for each assignment the <spark> - record is output.
;
; if the constants are followed by an (not subscripted)
; arraydescription, the <array data> is output before each
; constantgroup, and before the arraydescription the
; <data init> is output.
;
; between the constant and the simple variable - or the
; subscripted variable description the <arithmetical equal>
; - record is output.
;
; if a repetitionfactor is equal to one, neither this nor the
; datastar are output.

; within each datastatement the datagroups are counted.
\f


;                                       fortran, pass 5, page 21




;           4.2.2.4  parentheses and the stack
;
;   the input to pass 5 contains a structure of parentheses:
;
;
;
;       left parenthesis:          right parenthesis:
;
;       <end do>                   <correct do termination>
;       <end do>                   <erroneous do termination>
;       <end if expression>        <end arithmetical if>
;       <end if expression>        <end logical if>
;       <goto>                     <end simple goto>
;       <goto>                     <end assigned goto>
;       <goto>                     <end computed goto>
;       <arithmetical(>            <io)>
;       <arithmetical(>            <arithmetical)>
;       <arithmetical(>            <implied)>
;       <begin list>               <end list>
;       <read>                     <end list>
;       <write>                    <end list>
;       <call>                     <end list>
;       <call>                     <end call>
;
;
;
;
;   pass 3 is so designed that if it
;   recognizes a trouble before the left parenthesis
;   neither the left nor the right parenthesis are out-
;   put, if a trouble is recognized between the
;   parentheses only the left one is output, and if
;   a trouble after the right parenthesis or no trouble
;   is recognized both the left and the right parenthesis
;   are output.
;
;
;   consequently pass 5 is so designed that the right
;   parenthesis is stacked only if a trouble is not yet
;   recognized within the statement, and a paren-
;   thesis is unstacked when the left parenthesis is
;   met only if a trouble is not yet recognized.
;
;
\f


;                                       fortran, pass 5, page 22





;         4.3  input - and output records
;
;
; the records are input, stored and output as described
; below (the stored record is showed in the right column):
;
;
; 1.  fixed length record:
;
;       pass 4 output     pass 6 input
;
;          a               <directing byte>
;          b                    a
;          c                    b
;        <directing byte>       c
;
;       pass 5 input       pass 5 output
;
;
; 2. variable length record:
;
;        pass 4 output    pass 6 input
;
;             a          <directing byte>
;             b          <no. of bytes>
;             c               a
;       <no. of bytes>        b
;       <directing byte>      c
;
;       pass 5 input     pass 5 output
\f


;                                       fortran, pass 5, page 23




;     4.4 trouble records and error messages
;
;
; when a do - range is erroneous terminated, the do statement
; is replaced by this trouble record:
;
;        0  0  e86+0  <direction byte>
;
;
; if the number of constants do not equal the number of
; elements in a data group of a datastatement, this
; troublerecord is output:
;
;        0  <datagroup no.>  e86+1  <direction byte>
;
;
; if in a datastatement a simple variable or an array is not
; in common the troublerecord:
;
;        0  <datagroup no.>  e86+2  <direction byte>
;
; is output instead of the rest of the data group.
;
;
; if the listsize, the stacksize, or the size of a record
; exceeds the size of the free core, the translation is terminated
; after the message:
;
;        process too small
;
; a greater process must be created.
;
;
; when pass 5 receives an unknown record, the translation is
; terminated after the message:
;
;        <direction byte> unknown record to pass 5
;
; this is due to an programming error in pass 4 or pass 5.
;
;
; (furthermore the
;
;        <not declared labels> - record
;        <multiple declared labels> - record
;       (<declared but not referred labels> - record)
;
; may be taken as a kind of troublerecords).
;
\f


;                                       fortran, pass 5, page 24



;                       chapter 5: the program
;
;
;                        the usage of labels
;
;                      a:   local labels
;                      b:   local variables
;                      c:   action entries
;                      d:   procedure entries
;                      e:   not used (general pass)
;                      f:   global constants and variables
;                      g:   stepping stones
;                      h:   not used (file processor)
;                      i:   miscellaneous
;                      j:   miscellaneous

s.   c99, d20, f55, g21, i25, j99    ;  begin pass 5
     k = e0

w.   i20:                      i21   ;  no.of bytes in pass 5
h.                             i22   ;  entry point rel. to 1st word
                           5<1 + 1   ;  pass no.<1 + direction change

  b.  a1                             ;  action 0

  ;   if trouble is false, the record is output.

  w.
   c0:    am.                 (f38.) ;  begin
          se    w1    x1         0   ;
          jl.                   a1.  ;    if not trouble then
          dl.   w1              f8.  ;      outrec(length,record)
          jl.   w3             g15.  ;
      a1: jl.                   d1.  ;  end

  e.

  b.                                 ;  action 1

  ;   if trouble is false the record is output, contrary the
  ;   <vanished operand> - record is output.

  w.
   c1:    al    w0               1   ;  begin
          al.   w1             f46.  ;
          al    w1    x1        21   ;
          am.                 (f38.) ;    outrec(length,
          sn    w1    x1         0   ;      if trouble
          dl.   w1              f8.  ;        then <van. op.>
          jl.   w3             g15.  ;        else record)
          jl.                   d1.  ;  end

  e.
\f


;                                       fortran, pass 5, page 25




  b.                                 ;  action 2

  ;   the <end line> - record is output, and a jump back to
  ;   inrec is performed.

  w.
   c2:    jl.   w3              g1.  ;  begin
          dl.   w1              f8.  ;    carret.
          jl.   w3             g15.  ;    outrec(1,<end line>)
          jl.                  g14.  ;  end

  e.

  b.                                 ;  action 3

  ;   datagroup no. is set to zero.
  ;   trouble and format label declaration are both set to false,
  ;   the <end statement> - record is output, and a jump back to
  ;   inrec is performed.

  w.
   c3:    al    w0               0   ;  begin
          rs.   w0             f38.  ;    trouble := false
          rs.   w0             f37.  ;    form.lab.decl. := false
          rs.   w0             f54.  ;    datagroupno. := 0
          dl.   w1              f8.  ;
          jl.   w3             g15.  ;    outrec(1,<end stm.>)
          jl.                  g14.  ;  end

  e.
\f


;                                       fortran, pass 5, page 26




  b.  a8                             ;  action 4

  ;   a search for the ident no. is performed through the:
  ;             external list
  ;             global entry point list (local part)
  ;             zone common list
  ;             general common list
  ;   until the ident no. is found and the external representation
  ;   has been inserted.
  ;   finally a jump back to inrec is performed.

  w.
   c4:    dl.   w1              f8.  ;  begin
          am                    (0)  ;
          bl    w0    x1        -1   ;
          rl.   w1             f26.  ;
          sn    w1               0   ;    if fba - external list=0
          jl.                   a2.  ;      or
          al    w2               9   ;      listsearch
          hs    w2               0   ;        (fba+3,lba-8,9,ident)
          al    w1    x1         3   ;        = 0
          rl.   w2             f27.  ;
          al    w2    x2        -8   ;      then
          jl.   w3             g20.  ;
          se    w1               0   ;
          jl.                   a8.  ;
      a2: rl.   w1              f3.  ;
          sn    w1               0   ;    if fwa - glob.ep.list=0
          jl.                   a4.  ;      or
          al    w2              12   ;      listsearch
          hs    w2               0   ;        (fwa+0,lwa-10,12,ident)
          rl.   w2              f4.  ;        =0
          al    w2    x2       -10   ;      then
          jl.   w3             g20.  ;
          se    w1               0   ;
          jl.                   a8.  ;
      a4: rl.   w1             f20.  ;
          sn    w1               0   ;    if fba - zone com. list=0
          jl.                   a6.  ;      or
          al    w2              17   ;      listsearch
          hs    w2               0   ;        (fba+2,lba-1,17,ident)
          al    w1    x1         2   ;        = 0
          rl.   w2             f21.  ;
          al    w2    x2        -1   ;      then
          jl.   w3             g20.  ;
          se    w1               0   ;
          jl.                   a8.  ;
      a6: rl.   w1             f18.  ;
          sn    w1               0   ;    if fba - gen.com.list=0
          jl.                   a8.  ;      or
          al    w2              12   ;      listsearch
          hs    w2               0   ;        (fba+2,lba-12,12,ident)
          al    w1    x1         2   ;        = 0
          rl.   w2             f19.  ;
          al    w2    x2       -12   ;      then
          jl.   w3             g20.  ;
      a8: jl.                  g14.  ;  end

  e.
\f


;                                       fortran, pass 5, page 27




  b. a0, b0                          ;  action 5

  ;   trouble is set to false, labelsearch is called, and the
  ;   <label declaration> - record is output.
  ;   finally a jump back to inrec is performed.

  w. b0:                       0   ;  saved old trouble
   c5:    al    w0               0   ;  begin
          rx.   w0             f38.  ;    trouble := false
          rs.   w0              b0.  ;    save (old trouble);
          am.                  (f8.) ;
          dl    w1              +2   ;    labelsearch(label,
          ld    w1             +12   ;      if form.lab. then df
          rl.   w1             f37.  ;                   else ds)
          jl.   w3             g16.  ;
          rl.   w0              b0.  ;
          rl.   w1             f37.  ;
          se    w0               0   ;    if old trouble
          sn    w1               0   ;    and format label then
          jl.                   a0.  ;      begin
          al    w0               1   ;
          rl.   w3             f52.  ;      w3 := last found label-entry;
          ba    w0    x3        +2   ;      increase(counter(label,ds);
          sh    w0            2047   ;      (unless overflow)
          hs    w0    x3        +2   ;
      a0:                            ;      end;
          al    w0               1   ;
          al.   w1             f41.  ;    outrec(1,
          al    w1    x1        33   ;      <label decl.>)
          jl.   w3             g15.  ;
          jl.                  g14.  ;  end

  e.

  b.                                 ;  action 6

  ;   the length of the global entry point list is calculated,
  ;   and the list is output.
  ;   finally pass 5 is finished.

  w.
   c6:    dl.   w2              f2.  ;  begin
          ws    w2               2   ;    glob.ep.list(1) :=
          hs    w2    x1        +1   ;      no. of bytes
          al    w0    x2         2   ;    glob.ep.list(0) :=
          am                     9   ;
          bl.   w2             f48.  ;      bytevalue
          al    w2    x2         4   ;    outrec
          hs    w2    x1        +0   ;      (length,<glob.ep.list>)
          jl.   w3             g15.  ;    finish
          jl.                   g7.  ;  end

  e.

  b.                                 ;  action 7

  ;    the record is output.

  w.
   c7:    dl.   w1              f8.  ;  begin
          jl.   w3             g15.  ;    outrec(length, record)
          jl.                   d1.  ;  end

  e.
\f


;                                       fortran, pass 5, page 28




  b. a2, b1                         ;  action 8

  ;   the <no. of labels - and the no. of globals> - record
  ;   is output.
  ;   if data is true, the <data> - record is output.
  ;   a search for not declared labels is performed, and if any,
  ;   a list is output.
  ;   a search for multiple declared labels is performed, and if
  ;   any, a list is output.
  ;   a search for declared but not referred labels (nulls) is
  ;   performed, and if any, a list is output.
  ;   the zone common list, the general common list, and the
  ;   external list are output.
  ;   the first free word and the last free word are recalculated.
  ;   the <no. of bytes for simple local variables and stm. fct.
  ;   param.> - record is output.
  ;   the fba and the lba  for common variables in data statements
  ;   are set to zero.
  ;   trouble is set to false
  ;   the <begin unit> - record is output.

  h.  b0:                        0   ;  <begin unit>-record
  w.  b1:                        6   ;
\f


;                                       fortran, pass 5, page 29




   c8:    bl.   w0             (f8.) ;  begin
          hs.   w0              b0.  ;
          rl.   w0             f35.  ;
          al.   w1             f53.  ;    no. of globals :=
          ba    w0    x1        +2   ;      no. of globals +
          hs    w0    x1        +2   ;      data
          rl.   w1              f6.  ;
          ws.   w1              f5.  ;    number :=
          al    w1    x1        +2   ;      (lwa - fwa + 2)/6 +
          al    w0               0   ;        511
          wd.   w1              b1.  ;
          al    w1    x1       511   ;
          am.                  f53.  ;
          hs    w1              +1   ;
          al    w0               3   ;    outrec(3,
          al.   w1             f53.  ;      <no. of labels, globals>)
          jl.   w3             g15.  ;
          al    w0               1   ;
          se.   w0            (f35.) ;
          jl.                   a2.  ;    if data then
          al.   w1             f33.  ;      outrec(1,
          al    w1    x1        13   ;
          jl.   w3             g15.  ;        <data>)
      a2: jl.   w3             g21.  ;    tablesearch
          rl.   w1             f20.  ;
          al    w0               2   ;    outrec(length,
          ba    w0    x1        +1   ;           <zone com. list>)
          jl.   w3             g15.  ;
          rl.   w1             f18.  ;
          al    w0               2   ;    outrec(length,
          ba    w0    x1        +1   ;           <gen. com. list>)
          jl.   w3             g15.  ;
          rl.   w1             f26.  ;
          al    w0               2   ;    outrec(length,
          ba    w0    x1        +1   ;           <external list>)
          jl.   w3             g15.  ;
          jl.   w3              g9.  ;    lfw :=
          rs.   w0             f11.  ;      last free word

; the following is just to facilitate the 'names.yes' option in pass 7
          al    w0               1   ;
          al.   w1             f55.  ;   outrec(1,<number of local entries>);
          jl.   w3             g15.  ;

          al    w0               2   ;
          al.   w1             f36.  ;    outrec(2,<no. of bytes>)
          jl.   w3             g15.  ;
          al    w0               0   ;    fba := lba := 0 for
          rs.   w0             f22.  ;      com. var. in data-stm.
          rs.   w0             f23.  ;
          rs.   w0             f18.  ;    fba(gen com list) := 0;
          rs.   w0             f20.  ;    fba(zone com list) := 0;
          rs.   w0             f38.  ;    trouble := false
          rl.   w1              f4.  ;
          al    w1    x1         2   ;    ffw := 2 +
          rs.   w1             f10.  ;      lwa - local entries
          rs.   w1              f8.  ;
          al    w0               1   ;
          al.   w1              b0.  ;    outrec(1,<begin unit>)
          jl.   w3             g15.  ;
          jl.                   d1.  ;  end

  e.
\f


;                                       fortran, pass 5, page 30




  b.  a1, b2                         ;  action 9

  ;   the external list including 8 bytes per external is sto-
  ;   red, the fba, the lba, and the lfw are calculated.
  ;   the new length of the list is calculated.
  ;   it is checked that the free core store is not exceeded.

  w.  b0:                        0   ;  n
      b1:                        9   ;
      b2:                        2   ;

   c9:    rl.   w0             (f8.) ;  begin
          bl    w1               1   ;    i := record(1)
          al    w3    x1        -1   ;
          al    w2               0   ;
          wd.   w3              b2.  ;    n := (i - 1)/2
          rs.   w3              b0.  ;
          wm.   w3              b1.  ;
          al    w3    x3         1   ;    m := 1 + 9*n
          hl    w0               7   ;
          rl.   w2             f11.  ;
          al    w2    x2         1   ;
          rs.   w2             f27.  ;    lba := 1 + lwa
          ws    w2               6   ;
          al    w2    x2        -1   ;
          rs.   w2             f26.  ;    fba := lba - m - 1
          al    w2    x2        -2   ;
          la.   w2             f39.  ;    lwa :=
          rs.   w2             f11.  ;      (fba - 2) and mask
          am.                  (f8.) ;
          al    w2    x3        -1   ;
          sl.   w2            (f11.) ;    if record + m > lfw
          jl.                  g17.  ;      then stackerror
          rl.   w2             f26.  ;
          hs    w0    x2        +1   ;    list(1) := m
          ls    w0             -12   ;
          hs    w0    x2        +0   ;    list(0) := record(0)
          wa.   w1              f8.  ;
          rl.   w2             f27.  ;
          al    w2    x2        -8   ;
          bl    w0    x1        +1   ;    list(m+1) :=
          hs    w0    x2        +8   ;      record(i+1)
      a1: bl    w0    x1        +0   ;    for j := n step -1
          hs    w0    x2        +0   ;      until 1 do
          bl    w0    x1        -1   ;    begin
          hs    w0    x2        -1   ;      list(9*j-6):=rec(2*j+1)
          al    w0               1   ;
          hs    w0    x2        +7   ;   (entry contains an ident no := true)
          al    w1    x1        -2   ;      list(9*j-7):=rec(2*j+0)
          al    w2    x2        -9   ;
          sl.   w2            (f26.) ;    end
          jl.                   a1.  ;
          jl.                   d1.  ;  end

  e.
\f


;                                       fortran, pass 5, page 31




  b.  a4, b6                         ;  action 10

  ;   the local entry point list is stored, and the fba, the lba,
  ;   and the lfw is calculated.
  ;   the descriptions of the local entries are added to the glo-
  ;   bal entry point list, and the lwa of the global entry point
  ;   list is recalculated.
  ;   it is checked that the free core store is not exceeded.
  ;   the label table is opened, and the fwa of the inout-record
  ;   is recalculated.
  ;   the lwa of the data buffer is set to zero.
  ;   the fba and lba of the empty stack is calculated.
  ;   data is set to false.
  ;   the counter of the <no. of globals> - record is set to one.

  w.
      b1:                        0   ;  n
f55 = b1+1 ; number of local entries
      b2:                        2   ;
      b3:                       12   ;
      b4:                        0   ;  loc(rec(i))
    b5:                        0   ; save parameter
    b6:                        0   ; description

  c10:    rl.   w0             (f8.) ;  begin
          bl    w1               1   ;
          al    w3    x1        -4   ;
          al    w2               0   ;
          wd.   w3              b2.  ;    n := (i - 4)/2
          rs.   w3              b1.  ;
          hl    w0               7   ;    m := n
          rl.   w2             f11.  ;
          al    w2    x2         1   ;
          rs.   w2             f25.  ;    lba := lfw + 1
          ws    w2               7   ;
          al    w2    x2        -1   ;
          rs.   w2             f24.  ;    fba := lba - m - 1
          al    w2    x2        -2   ;
          la.   w2             f39.  ;    lfw :=(fba - 2) and mask
          rs.   w2             f11.  ;
          rl.   w2             f24.  ;
          hs    w0    x2        +1   ;    local(1) := m
          ls    w0             -12   ;
          hs    w0    x2        +0   ;    local(0) := record(0)
          rl.   w1              f2.  ;
          al    w2    x1         2   ;    fwa - local entries :=
          rs.   w2              f3.  ;      2 + lwa - global
          rl.   w3              b1.  ;
          wm.   w3              b3.  ;    lwa - global :=
          wa    w1               6   ;      lwa - local :=
          rs.   w1              f4.  ;      lwa - global +
          rs.   w1              f2.  ;        12*n
          sl.   w1            (f24.) ;    if lwa - global ep. list
          jl.                   d7.  ;      >= fba then stackerror
\f


;                                       fortran, pass 5, page 32
       rl.  w2             f8.   ; w2=base of in-out record
       ba   w2    x2       +1    ; w2=w2+no. of bytes in record
       dl   w1    x2             ; w0,w1=param description
       ds.  w1             b6.   ; save param description
       al.  w1             b6.   ; save address of
       rs.  w1             b4.   ; param description
       al   w2    x2       -4    ; w2=address of main entry no.



          rl.   w1             f25.  ;
          al    w1    x1        -1   ;
          rl.   w3              f4.  ;      until 1 do
          al    w3    x3       -10   ;    begin
      a4: bl    w0    x2        +1   ;      local(1 + j) :=
          hs    w0    x1        +1   ;        record(1 + 2*j)
          bl    w0    x2        +0   ;      global(0 + 12*(j-1)):=
          hs    w0    x3        +0   ;        record(0 + 2*j)
          rx.   w2              b4.  ;
          bl    w0    x2        +1   ;      global(11 + 12*(j-1)):=
          hs    w0    x3       +11   ;        record(i + 1)
          bl    w0    x2        +0   ;      global(10 + 12*(j-1)):=
          hs    w0    x3       +10   ;        record(i+0)
          bl    w0    x2        -1   ;      global(9 + 12*(j-1)):=
          hs    w0    x3        +9   ;        record(i-1)
          bl    w0    x2        -2   ;      global(8 + 12*(j-1)):=
          hs    w0    x3        +8   ;        record(i-2)
          al    w0               1   ;
          hs    w0    x3        +7   ;   (entry contains an ident no := true)
          rx.   w2              b4.  ;
          al    w1    x1        -1   ;
          al    w2    x2        -2   ;
          al    w3    x3       -12   ;
          sl.   w3             (f3.) ;
          jl.                   a4.  ;    end
          rl.   w1              f2.  ;    lwa - label table :=
          rs.   w1              f6.  ;      lwa - global ep. list
          al    w1    x1         2   ;    fwa - label table :=
          rs.   w1              f5.  ;      2 + lwa - label table
          al    w1    x1         2   ;    fwa - inout record :=
          rs.   w1              f8.  ;      2 + lwa - label table
          al    w1               0   ;    lwa - data buffer
          am                     2   ;
          rs.   w1             f15.  ;      := 0
          rl.   w1             f11.  ;
          al    w1    x1         1   ;    lba - stack :=
          rs.   w1             f17.  ;      lfw + 1
          al    w1    x1         1   ;    fba - stack :=
          rs.   w1             f16.  ;      lba + 1
          al    w0               0   ;    data :=
          rs.   w0             f35.  ;      false
          al    w0               1   ;
          am.                  f53.  ;    no. of globals := 1
          hs    w0              +2   ;
          jl.                   d1.  ;  end

  e.
\f


;                                       fortran, pass 5, page 33

  b.  a4                             ;  action 11

  ;   the record containing descriptions of the common variables
  ;   in data - statements is stored, and the fwa and the lwa
  ;   are calculated.
  ;   the address of the lfw is recalculated.
  ;   the local entry point list, if any, is output, and the fba and 
  ;   lba are set to zero.
  ;   the label variable list, if any, is output, and the fba
  ;   and the lba are set to zero.
  ;   trouble is set to false.

  w.
  c11:    am.                  (f8.) ;  begin
          bl    w1              +2   ;
          rl.   w2             f11.  ;
          al    w2    x2         1   ;    lba := 1 + lfw
          rs.   w2             f23.  ;
          ws    w2               3   ;
          al    w0    x2         2   ;    fba := lba-(rec(2)-1)+1
          rs.   w0             f22.  ;    if fba < fwa
          sh.   w0             (f8.) ;      then stackerror
          jl.                   d7.  ;    addr := fba
      a0: sl.   w0            (f23.) ;    for i := n step -1
          jl.                   a1.  ;      until 1 do
          rl    w1               0   ;    begin
          jl.   w3              d3.  ;      inrec(addr;
          rl.   w3              f7.  ;        length, dummy)
          wa    w0               6   ;      addr := addr + length
          sh    w3               3   ;      if array then
          jl.                   +14   ;      begin
          jl.   w3              g2.  ;        inbyte(<elemno>,addr)
          hs    w2              (0)  ;        addr := addr + 1
          ba.   w0               1   ;      end
   jl. w3  g2.
   hs  w2  (0)
   ba. w0  1
          jl.   w3              g2.  ;      inbyte(<ident.no.>,addr)
          hs    w2              (0)  ;
          ba.   w0               1   ;      addr := addr + 1
          jl.                   a0.  ;    end
      a1: rl.   w2             f22.  ;
          al    w2    x2        -2   ;    lwa :=
          la.   w2             f39.  ;      (fba - 2) and mask
          rs.   w2             f11.  ;
          al    w0               0   ;    trouble :=
          rs.   w0             f38.  ;      false
          rl.   w1             f24.  ;
          sn    w1               0   ;    if fba-loc. ep. list
          jl.                   a2.  ;      <> 0 then
          al    w0               2   ;    begin
          ba    w0    x1         1   ;      outrec(length,
          jl.   w3              d5.  ;             <loc.ep.list>)
          al    w0               0   ;
          rs.   w0             f24.  ;      fba := lba := 0
          rs.   w0             f25.  ;    end
      a2: rl.   w1             f28.  ;
          sn    w1               0   ;    if fba-label var.list
          jl.                   a4.  ;      <> 0 then
          al    w0               2   ;    begin
          ba    w0    x1         1   ;      outrec(length,
          jl.   w3              d5.  ;             <lab.var.list>)
          al    w0               0   ;
          rs.   w0             f28.  ;      fba := lba := 0
          rs.   w0             f29.  ;    end
      a4: jl.                   d1.  ;  end

  e.
\f


;                                       fortran, pass 5, page 34





  b.  a6, b2                         ;  action 12

  ;   the zone common list incl. 8 bytes per block is stored,
  ;   and the fba and lba are calculated.
  ;   the lfw is recalculated.
  ;   if the free core store is exceeded, stackerror is called.

  w.  b0:                       10   ;
      b1:                        0   ;  list(0), list(1)
      b2:                       17   ;

  c12:    rl.   w0             (f8.) ;  begin
          bl    w1               1   ;
          rl.   w3             f11.  ;
          al    w3    x3        +1   ;    lba := 1 + lfw
          rs.   w3             f21.  ;
          al    w3    x1        -1   ;
          al    w2               0   ;    no. := (i - 1)/10
          wd.   w3              b0.  ;
          wm.   w3              b2.  ;
          al    w3    x3         1   ;    m := 1 + 17*no.
          hs    w3               1   ;
          rs.   w0              b1.  ;
          am.                  (f8.) ;
          al    w2    x3        +0   ;
          sl.   w2            (f11.) ;    if m + record > lfw
          jl.                   d7.  ;      then stackerror
          rl.   w2             f21.  ;
          ws    w2               6   ;    fba :=
          al    w2    x2        -1   ;      lba - m - 1
          rs.   w2             f20.  ;
          al    w2    x2        -2   ;
          la.   w2             f39.  ;    lfw :=
          rs.   w2             f11.  ;      (fba - 2) and mask
          wa.   w1              f8.  ;
          rl.   w2             f21.  ;    list(m + 1) :=
          al    w2    x2        -1   ;      record(i + 1)
          bl    w0    x1        +1   ;    for j := no. of blocks
          hs    w0    x2        +1   ;      step -1 until 1 do
      a2: am.                 (f20.) ;    begin
          sn    w2              +1   ;
          jl.                   a6.  ;
          al    w3              10   ;
      a4: bl    w0    x1         0   ;
          hs    w0    x2         0   ;
          al    w1    x1        -1   ;      copy(9 bytes)
          al    w2    x2        -1   ;
          al    w3    x3        -1   ;
          se    w3               0   ;      reserve(7 bytes)
          jl.                   a4.  ;
          al    w2    x2        -7   ;
          hs    w0    x2        +1   ;      copy(ident no.)
          al    w0               1   ;
          hs    w0    x2        +8   ;   (entry contains an entry no := true)
          jl.                   a2.  ;    end
      a6: rl.   w0              b1.  ;
          hs    w0    x2         0   ;    list(1) := m
          ls    w0             -12   ;
          hs    w0    x2        -1   ;    list(0) := record(0)
          jl.                   d1.  ;  end

  e.
\f


;                                       fortran, pass 5, page 35




  b.  a6, b2                         ;  action 13

  ;   the general common list incl. 8 bytes per block is stored,
  ;   and the fba and lba are calculated.
  ;   the lfw is recalculated.
  ;   if the free core store is exceeded, stackerror is called.

  w.  b0:                        5   ;
      b1:                        0   ;  list(0), list(1)
      b2:                       12   ;

  c13:    rl.   w0             (f8.) ;  begin
          bl    w1               1   ;
          rl.   w3             f11.  ;
          al    w3    x3        +1   ;    lba := 1 + lfw
          rs.   w3             f19.  ;
          al    w3    x1        -1   ;
          al    w2               0   ;    no. := (i - 1)/5
          wd.   w3              b0.  ;
          wm.   w3              b2.  ;
          al    w3    x3         1   ;    m := 1 + 12*no.
          hs    w3               1   ;
          rs.   w0              b1.  ;
          am.                  (f8.) ;
          al    w2    x3        +0   ;
          sl.   w2            (f11.) ;    if m + record > lfw
          jl.                   d7.  ;      then stackerror
          rl.   w2             f19.  ;
          ws    w2               6   ;    fba :=
          al    w2    x2        -1   ;      lba - m - 1
          rs.   w2             f18.  ;
          al    w2    x2        -2   ;
          la.   w2             f39.  ;    lfw :=
          rs.   w2             f11.  ;      (fba - 2) and mask
          wa.   w1              f8.  ;
          rl.   w2             f19.  ;    list(m + 1) :=
          al    w2    x2        -1   ;      record(i + 1)
          bl    w0    x1        +1   ;    for j := no. of blocks
          hs    w0    x2        +1   ;      step -1 until 1 do
      a2: am.                 (f18.) ;    begin
          sn    w2              +1   ;
          jl.                   a6.  ;
          al    w3               5   ;
      a4: bl    w0    x1         0   ;
          hs    w0    x2         0   ;
          al    w1    x1        -1   ;      copy(4 bytes)
          al    w2    x2        -1   ;
          al    w3    x3        -1   ;
          se    w3               0   ;      reserve(7 bytes)
          jl.                   a4.  ;
          al    w2    x2        -7   ;
          hs    w0    x2        +1   ;      copy(ident no.)
          al    w0               1   ;
          hs    w0    x2        +8   ;   (entry contains an entry no := true)
          jl.                   a2.  ;    end
      a6: rl.   w0              b1.  ;
          hs    w0    x2         0   ;    list(1) := m
          ls    w0             -12   ;
          hs    w0    x2        -1   ;    list(0) := record(0)
          jl.                   d1.  ;  end

  e.
\f


;                                       fortran, pass 5, page 36




  b.                                 ;  action 14

  ;   a search for the referred format label is performed through
  ;   the label table.

  w.
  c14:    am.                  (f8.) ;  begin
          dl    w1              +2   ;
          ld    w1              12   ;    labelsearch(label,3)
          al    w1               3   ;
          jl.   w3             g16.  ;
          jl.                   d1.  ;  end

  e.

  b.                                 ;  action 15

  ;   a search for the referred statement label is performed
  ;   through the label table.

  w.
  c15:    am.                  (f8.) ;  begin
          dl    w1              +2   ;
          ld    w1              12   ;    labelsearch(label,2)
          al    w1               2   ;
          jl.   w3             g16.  ;
          jl.                   d1.  ;  end

  e.

  b.                                 ;  action 16

  ;   a true - element is stacked, and the <correct do termination>
  ;   - record is output.

  w.
  c16:    al    w0               1   ;  begin
          jl.   w3              d8.  ;    stack(true)
          al    w0               1   ;
          rl.   w1              f8.  ;    outrec(1,<corr.do term.>)
          jl.   w3              d5.  ;
          jl.                   d1.  ;  end

  e.

  b.                                 ;  action 17

  ;   a false - element is stacked.
  ;   it is noticed that the <erroneous do termination> -
  ;   record is not output.

  w.
  c17:    al    w0               0   ;  begin
          jl.   w3              d8.  ;    stack(false)
          jl.                   d1.  ;  end

  e.
\f


;                                       fortran, pass 5, page 37




  b.                                 ;  action 18

  ;   format label declaration is set to true, and if trouble is
  ;   false, the <begin format> - record is output.

  w.
  c18:    al    w2               1   ;  begin
          rs.   w2             f37.  ;    form. lab. decl. := true
          dl.   w1              f8.  ;    if not trouble then
          se.   w2            (f38.) ;      outrec
          jl.   w3              d5.  ;        (length,<beg.form.>)
          jl.                   d1.  ;  end

  e.

  b.  a1                             ;  action 19

  ;   if trouble is false, the recordbyte is stacked and output.

  w.
  c19:    am.                 (f38.) ;  begin
          se    w1    x1         0   ;    if not trouble then
          jl.                   a1.  ;    begin
          al    w0               1   ;      spec :=
          rs.   w0             f30.  ;        true
          bl.   w0             (f8.) ;      stack(record)
          jl.   w3              d8.  ;      outrec(length,record)
          dl.   w1              f8.  ;
          jl.   w3              d5.  ;    end
      a1: jl.                   d1.  ;  end

  e.

  b.  a1                             ;  action 20

  ;   if trouble is false, -(no. of elements) is stacked, and
  ;   the <end list> - record are output.

  w.
  c20:    am.                 (f38.) ;  begin
          se    w1    x1         0   ;
          jl.                   a1.  ;    if not trouble then
          am.                  (f8.) ;    begin
          bl    w0              +1   ;      stack
          ac    w0              (0)  ;        (-no.of elements)
          jl.   w3              d8.  ;      outrec
          dl.   w1              f8.  ;        (length,<end list>)
          jl.   w3              d5.  ;    end
      a1: jl.                   d1.  ;  end

  e.
\f


;                                       fortran, pass 5, page 38




  b.                                 ;  action 21

  ;   if trouble is false, the recordbyte is stacked.

  w.
  c21:    bl.   w0             (f8.) ;  begin
          am.                 (f38.) ;
          sn    w1    x1         0   ;    if not trouble then
          jl.   w3              d8.  ;      stack(record)
          jl.                   d1.  ;  end

  e.

  b.  a4                             ;  action 22

  ;   if trouble is false an element is taken from the stack.
  ;   if this element is the <arithm.)> or the <impl.)>, the
  ;   <aritm.(> or the <impl.(>,respectively, is output.

  w.
  c22:    am.                 (f38.) ;  begin
          se    w1    x1         0   ;    if trouble
          jl.                   a4.  ;      then goto a4
          jl.   w3              d9.  ;    unstack(byte)
          al    w0               1   ;
          rl.   w1              f8.  ;    outrec
          am                     5   ;
          bl.   w2             f46.  ;
          sn    w3    x2         0   ;      if byte = <arithm.)>
          jl.                   a2.  ;        then (1,<arithm.(>)
          al.   w1             f33.  ;        else
          al    w1    x1         3   ;
          am                    13   ;
          bl.   w2             f46.  ;      if byte = <impl.)>
          sn    w3    x2         0   ;        then (1,<impl.(>)
      a2: jl.   w3              d5.  ;
      a4: jl.                   d1.  ;  end

  e.

  b.  a1                             ;  action 23

  ;   if trouble is false, -(no. of elements) is unstacked, and
  ;   the no. of elements is added to the record, which is then
  ;   output.

  w.
  c23:    am.                 (f38.) ;  begin
          se    w1    x1         0   ;    if not trouble then
          jl.                   a1.  ;    begin
          jl.   w3              d9.  ;      unstack
          ac    w3    x3         0   ;        (-no. of elements)
          rl.   w1              f8.  ;      record(1) :=
          hs    w3    x1        +1   ;        no. of elements
          al    w0               2   ;      outrec(2,record)
          jl.   w3              d5.  ;    end
      a1: jl.                   d1.  ;  end

  e.
\f


;                                       fortran, pass 5, page 39




  b.  a1, b0                         ;  action 24
  

  ;   if trouble is false, an element is unstacked and then output.

  h.  b0:                        0   ;  output record
  w.
  c24:    al    w0               1   ;  begin
          sn.   w0            (f38.) ;    if not trouble then
          jl.                   a1.  ;    begin
          jl.   w3              d9.  ;      unstack(rec)
          al.   w1              b0.  ;      outrec
          hs    w3    x1        +0   ;        (1, rec)
          jl.   w3              d5.  ;    end
      a1: jl.                   d1.  ;  end

  e.



b.  a2                             ;  action 25

;   if trouble is false, the <end call> - record is supplied
;   with a zero - byte, which is stacked, and the record is
;   output.

w.
c25:    al    w0               0   ;  begin
        se.   w0            (f38.) ;    if not trouble then
        jl.                   a2.  ;    begin
        rl.   w1              f8.  ;      no := 0
        hs    w0    x1        +1   ;      record :=
        jl.   w3              d8.  ;        <end call><no>
        al    w0               2   ;      stack(-no)
        jl.   w3              d5.  ;      outrec(2,record)
    a2: jl.                   d1.  ;    end
                                   ;  end

e.
\f


;                                       fortran, pass 5, page 40


  b.                                 ;  stepping stones
                                     ;    for the fileprocessor
                                     ;    and some procedures

  w.                                 ;  begin

   g1:    jl.                   e1.  ;    carret.

   g2:    jl.                   e2.  ;    inbyte

   g3:    jl.                   e3.  ;    outbyte

   g5:    jl.                   e5.  ;    alarm

   g7:    jl.                   e7.  ;    terminate pass

   g9:    rl.   w0          4 + e9.  ;    last word
          jl          x3        +0   ;  

  g10:    jl.                  e14.  ;    write integer

  g14:    jl.                   d4.  ;    inrec

  g15:    jl.                   d5.  ;    outrec

  g16:    jl.                   d6.  ;    labelsearch

  g17:    jl.                   d7.  ;    stackerror

  g20:    jl.                  d10.  ;    listsearch

  g21:    jl.                  d11.  ;    tablesearch

                                     ;  end

  e.


  b.                                 ;  head program

  ;   the head program first initializes pass 5 and then for
  ;   every input record it goes through an action(class)
  ;   until pass 5 is finished after having read the <end pass>
  ;   record.

  ;   it is noticed that all procedures (but not the actions)
  ;   store and reload the w - registers.

  w.  i22 = k - i20


   d0:    jl.                  d13.  ;  entry pass 5, initialize
   d1:    rl.   w1              f8.  ;    inrec(record;
          jl.   w3              d3.  ;          length,action)
   d2:    am.                  (f9.) ;
          jl.                   i0.  ;    action

  e.


  i0 = k
\f


;                                       fortran, pass 5, page 41





;       no.of
;       elem. basev. length action

h.f40:     33 ,    1 ,    1 ,  j99   ;  not used
            1 ,    0 ,    1 ,   j0   ;  entry
            1 ,    0 ,    1 ,  j37   ;  data group sep.
            1 ,    0 ,    1 ,   j0   ;  return
            1 ,    0 ,    1 ,   j7   ;  end unit
            1 ,    0 ,    1 ,   j6   ;  end pass
            1 ,    0 ,    1 ,   j8   ;  begin unit
            1 ,    0 ,    1 ,   j2   ;  end line
            1 ,    0 ,    1 ,   j3   ;  end statement
            1 ,    0 ,    1 ,  j23   ;  begin list
  f41:      1 ,    0 ,    2 ,  j20   ;  end list
            1 ,    0 ,    1 ,  j23   ;  call
            1 ,    0 ,    2 ,   j1   ;  logical const.
            1 ,    0 ,    3 ,   j1   ;  integer const.
            2 ,    0 ,    5 ,   j1   ;  real and long const.
            2 ,    0 ,    9 ,   j1   ;  double and complex const.
            1 ,    0 ,    3 ,  j15   ;  statement label
            1 ,    0 ,    3 ,  j14   ;  format label
            1 ,    0 ,    3 ,   j5   ;  label declaration
  f42:      2 ,    0 ,    3 ,   j0   ;  end format,continue format
            1 ,    0 ,    0 ,   j4   ;  external ident.
            1 ,    0 ,    4 ,  j39   ;  trouble
            1 ,    0 ,    1 ,   j7   ;  end declarations
            1 ,    0 ,    1 ,   j7   ;  end formal declarations
            1 ,    0 ,    1 ,   j0   ;  dya plus
            1 ,    0 ,    1 ,  j99   ;  not used
            1 ,    0 ,    1 ,   j0   ;  dya minus
            1 ,    0 ,    1 ,  j99   ;  not used
            5 ,    0 ,    1 ,   j0   ;  mult star,...,listcom
            1 ,    0 ,    1 ,  j33   ;  iocom
  f43:      2 ,    0 ,    1 ,  j53   ;  impl. init. const., var.
            1 ,    0 ,    1 ,  j55   ;  impl. init. gen.
            2 ,    0 ,    1 ,  j49   ;  impl. until const., var.
            1 ,    0 ,    1 ,  j51   ;  impl. unt. gen.
            2 ,    0 ,    1 ,  j46   ;  impl. step const., var.
            1 ,    0 ,    1 ,  j47   ;  impl. step gen.
            2 ,    0 ,    1 ,  j52   ;  do init. const., var.
            1 ,    0 ,    1 ,  j54   ;  do init. gen.
            2 ,    0 ,    1 ,  j48   ;  do unt. const., var.
            1 ,    0 ,    1 ,  j50   ;  do unt. gen.
  f44:      2 ,    0 ,    1 ,  j46   ;  do step const., var.
            1 ,    0 ,    1 ,  j47   ;  do step gen.
            1 ,    0 ,    1 ,   j0   ;  data star
            1 ,    0 ,    1 ,  j36   ;  data slash
            1 ,    0 ,    1 ,   j0   ;  multiple equal
            1 ,    0 ,    1 ,  j57   ;  impl. equal
\f


;                                       fortran, pass 5, page 42



            1 ,    0 ,    1 ,  j56   ;  do equal
  f45:     10 ,    0 ,    1 ,   j0   ;  arithm.equal,lt,...,not
            2 ,    0 ,    3 ,  j18   ;  beg. form. (cl.,op.)
            1 ,    0 ,    1 ,  j99   ;  not used
            1 ,    0 ,    1 ,  j24   ;  goto
            4 ,    0 ,    1 ,   j0   ;  if,...,stop
            2 ,    0 ,    1 ,  j23   ;  read, write
            1 ,    0 ,    1 ,  j16   ;  correct do term.
            1 ,    0 ,    1 ,  j17   ;  errorn.do term.
            1 ,    0 ,    1 ,  j22   ;  arit. left parent.
            1 ,    0 ,    1 ,  j25   ;  end call
  f46:      1 ,    0 ,    1 ,   j0   ;  spark
            1 ,    0 ,    1 ,  j19   ;  arit. right parent.
            1 ,    0 ,    1 ,  j21   ;  io right parent.
            1 ,    0 ,    1 ,  j19   ;  impl. right parent.
            1 ,    0 ,    1 ,  j24   ;  end if-expr.
            1 ,    0 ,    1 ,  j40   ;  vanished operand
            5 ,    0 ,    1 ,  j21   ;  end sim.goto,...,end log if
            1 ,    0 ,    1 ,  j34   ;  end data
            1 ,    0 ,    1 ,  j41   ;  end do
            1 ,    0 ,    1 ,  j42   ;  end io
  f47:     19 ,    0 ,    1 ,  j99   ;  not used
            1 ,    0 ,    0 ,  j13   ;  gen. common list
            1 ,    0 ,    0 ,  j12   ;  zone common list
            1 ,    0 ,    3 ,  j11   ;  com.var.in data stm.
            1 ,    0 ,    0 ,  j10   ;  loc. entry point list
            1 ,    0 ,    0 ,   j9   ;  external list
            1 ,    0 ,    0 ,  j44   ;  label variable list
            1 ,    0 ,    2 ,  j43   ;  length(s.l.v.,s.f.p.)
            1 ,    0 ,    3 ,   j7   ;  length(loc.arr.,zones)
            2 ,    0 ,    4 ,   j7   ;  decl.(loc. and com. arr.)
            1 ,    0 ,    0 ,   j7   ;  decl.(formal array)
  f48:      1 ,    0 ,    9 ,   j7   ;  decl.(loc. zone)
         1 ,     0 ,     4 ,    j7  ;  decl.(common zone)
            1 ,    0 ,    5 ,   j7   ;  decl.(formal zone)
            5 ,    0 ,    1 ,  j99   ;  not used
            1 ,    0 ,    3 ,   j7   ;  ext. zone decl.
            8 ,    0 ,    1 ,  j99   ;  not used
            8 ,    0 ,    2 ,   j1   ;  simple local
            8 ,    0 ,    3 ,   j1   ;  simple common
            8 ,    0 ,    2 ,   j1   ;  simple param
            8 ,    0 ,    0 ,   j1   ;  array (loc.,com.,par.)
            8 ,    0 ,    3 ,   j1   ;  zone(arr)(loc.,com.,par.)
           24 ,    0 ,    2 ,   j1   ;  external, ext. param.,ep name
  f49:      8 ,    0 ,    3 ,   j1   ;  stm.fct.call
            8 ,    0 ,    7 ,   j1   ;  stm.fct. descr.
            8 ,    0 ,    4 ,   j1   ;  simple equiv. to arr.
            8 ,    0 ,    5 ,   j1   ;  simple equiv. to zone
            8 ,    0 ,    0 ,   j1   ;  array equiv. to zone
            8 ,    0 ,    1 ,   j1   ;  common name
            8 ,    0 ,    2 ,   j1   ;  label var. descr.
            8 ,    0 ,    1 ,   j1   ;  trouble descr.
          206 ,    0 ,    1 ,  j99   ;  not used
         1535 ,    0 ,    1 ,  j35   ;  ident.no. in data-stm.
            0 ,    0 ,    1 ,  j99   ;  not used
\f


;                                       fortran, pass 5, page 43





w.                                   ;  global constants

   f1:                           0   ;  fwa, global entry point list
   f2:                           0   ;  lwa, global entry point list
   f3:                           0   ;  fwa, local entries
   f4:                           0   ;  lwa, local entries
   f5:                           0   ;  fwa, label table
   f6:                           0   ;  lwa, label table
  f52:                           0   ;  addr of last used label-entry
   f7:                           0   ;  length, input-output record
   f8:                           0   ;  fwa   , input-output record
   f9:                           0   ;  action, input record
  f10:                           0   ;  first free word
  f11:                           0   ;  last  free word
  f12:                           0   ;  fba, error labels and nulls
  f13:                           0   ;  lba, error labels and nulls
  f14:                           0   ;  upperpointer, data buffer
  f15:                           0   ;  lowerpointer, data buffer
                                 0   ;  lwa, data buffer
  f16:                           0   ;  fba, stack
  f17:                           0   ;  lba, stack
  f18:                           0   ;  fba, general common list
  f19:                           0   ;  lba, general common list
  f20:                           0   ;  fba, zone common list
  f21:                           0   ;  lba, zone common list
  f22:                           0   ;  fba, com. var. in data stm.
  f23:                           0   ;  lba, com. var. in data stm.
  f24:                           0   ;  fba, local entry point list
  f25:                           0   ;  lba, local entry point list
  f26:                           0   ;  fba, external list
  f27:                           0   ;  lba, external list
  f28:                           0   ;  fba, label variable list
  f29:                           0   ;  lba, label variable list
  f30:                           0   ;  special
  f31:                           0   ;  implied equal
  f32:                           0   ;  no. of classes * 4
h.f33:                    0, r. 14   ;  new records
  f34:                    0, r.  5   ;  troublerecord,<trouble int. descr.>
w.f35:                           0   ;  data
  f36:                           0   ;  <no.of bytes> - record
  f37:                           0   ;  format label declaration
  f38:                           0   ;  trouble
  f39:                          -2   ;  mask
w.f50:                           0   ;  subscripted
  f51:                     0, r. 6   ;  integer table
h.f53:                     0, r. 3   ;  <no. of labels, globals>
w.f54:                           0   ;  datagroup no.
; f55 , see action c10
\f


;                                       fortran, pass 5, page 44




  b.  a4                             ;  action 33

  ;   if trouble is true, the action is skipped.
  ;   if implied equal is true, the <implied do> - record is
  ;   output, and implied equal is set to false.
  ;   the <io comma> - record is output.

  w.
  c33:    al    w1               0   ;  begin
          se.   w1            (f38.) ;    if not trouble then
          jl.                   a4.  ;    begin
          sn.   w1            (f31.) ;      if impl. equal then
          jl.                   a2.  ;      begin
          rs.   w1             f31.  ;        impl. equal:=false
          al    w0               1   ;
          al.   w1         4 + f33.  ;        outrec(1,<impl.do>)
          jl.   w3              d5.  ;      end
      a2: dl.   w1              f8.  ;      outrec(1,<io comma>)
          jl.   w3              d5.  ;    end
      a4: jl.                   d1.  ;  end

  e.

b.  a2                             ;  action 34

;   trouble is set to false, data is set to true, and the lower -
;   as well as the upperpointer of the databuffer are reset.
;   the datagroup no. is increased by one.
;   the constants of the datagroup and the <data slash> -
;   record are input, and the constants are stored in the data
;   buffer.

w.
c34:    al    w0               0   ;    begin
        rs.   w0             f38.  ;      trouble := false
        rl.   w0             f54.  ;
        ba.   w0               1   ;      datagroupno. :=
        rs.   w0             f54.  ;        datagroupno. + 1
        al    w0               1   ;      data := true
        rs.   w0             f35.  ;      if lwa-databuffer = 0
        rl.   w1         2 + f15.  ;        then
        sn    w1               0   ;        lwa-databuffer:=lwa
        rl.   w1             f11.  ;      lowerpointer :=
        rs.   w1         2 + f15.  ;        upperpointer :=
        rs.   w1             f14.  ;          lwa - databuffer
        rs.   w1             f15.  ;
    a2: rl.   w1              f8.  ;      for i := 1 step 1
        jl.   w3              d3.  ;        while
        rl.   w3              f9.  ;        rec <> <data slash>
        sn    w3             j36   ;          and
        jl.                   +6   ;        rec <> <trouble>
        se    w3             j39   ;          and
        sn    w3             j40   ;        rec <> <van. op.> do
        jl.                   d2.  ;        bufin(inrec)
        dl.   w1              f8.  ;      comment: <data slash>
        jl.   w3             d16.  ;        has been read.
        jl.                   a2.  ;    end
        jl.                   d1.  ;    comment: read next rec.

e.
\f


;                                       fortran, pass 5, page 45






b. a14, b3                         ;  action 35

;   if trouble is true, the <vanished operand> - record is
;   output.
;   if trouble is false, commonsearch is called.
;   if the identifier is a simple variable, the <spark> - record,
;   a constant and the <arithm. equal> - record are output.
;   if the identifier is a subscripted variable, <spark>, the constant
;   and the <arithm. equal> - record have allready been output.
;   if the identifier is an array, <spark> and a number of constans corre-
;   sponding to the number of elements in the array is output,
;   followed by the <data init.> - record. before each constant-
;   group, the <array data> - record is output.
;   finally subscripted is set to false, and the variable -
;   description is output, and the next record is input.
;   if this record is the <spark> - record, <spark>, one constant and
;   the <arithm. equal> - record are output, and subscripted is
;   set to true.

w.  b1:                        0   ;  no
    b2:                        0   ;  length
    b3:                        0   ;  description

c35:    al    w0               1   ;  begin
        sn.   w0            (f38.) ;    if not trouble then
        jl.                  a14.  ;    begin
        bl.   w0             (f8.) ;      commonsearch
        jl.   w3             d20.  ;        (ident. no.; array,
        rs.   w1              b1.  ;         no, length, descr.)
        ds.   w3              b3.  ;
        am.                 (f50.) ;      if subscripted then
        se    w1    x1         0   ;         goto a10
        jl.                  a10.  ;
        sn    w0               0   ;      if not array then
        jl.                   a6.  ;         goto a6
    a2: al    w0               1   ;      comment: array
        al.   w1         1 + f46.  ;      outrec(1,
        jl.   w3              d5.  ;        <spark>)
    a3: al    w0               1   ;
        al.   w1         1 + f33.  ;      outrec(1,
        jl.   w3              d5.  ;        <array data>)
        rl.   w0              b1.  ;      outconst(no; del)
        jl.   w3             d19.  ;
        sl.   w0             (b1.) ;      if del = no then
        jl.                   a4.  ;        goto a4
\f


;                                       fortran, pass 5, page 46



        rl.   w1              b1.  ;
        ws    w1               0   ;      no := no - del
        rs.   w1              b1.  ;
        rl.   w1             f54.  ;
        ba.   w0               3   ;      if del > 0 then
        sn    w0         1 + e86   ;        goto a3
        jl.                  d18.  ;      if del = 0 then
        jl.                   a3.  ;        error(1+e86,datagroupno.)
    a4: al    w0               1   ;
        al.   w1         2 + f33.  ;      outrec(1,
        jl.   w3              d5.  ;        <data init>)
        jl.                  a10.  ;      goto a10
    a6: al    w0               1   ;      comment: simple var.
        al.   w1         1 + f46.  ;      outrec(1,
        jl.   w3              d5.  ;        <spark>)
        al    w0               1   ;
        jl.   w3             d19.  ;      outconst(1; del)
        rl.   w1             f54.  ;
        ba.   w0               3   ;      if del = 0 then
        sn    w0         1 + e86   ;
        jl.                  d18.  ;        error(1+e86,datagroupno.)
        al    w0               1   ;
        al.   w1         1 + f45.  ;      outrec(1,
        jl.   w3              d5.  ;        <arithm. equal>)
   a10: al    w0               0   ;      subscripted :=
        rs.   w0             f50.  ;        false
        dl.   w1              b3.  ;      outrec(length,
        jl.   w3              d5.  ;        <description>)
        rl.   w1              f8.  ;
        jl.   w3              d3.  ;      inrec(record)
        al    w2              j0   ;      if record =
        se.   w2             (f9.) ;        <spark> then
        jl.                  a12.  ;      begin
        al    w0               1   ;        outrec(1,
        al.   w1         1 + f46.  ;          <spark>)
        jl.   w3              d5.  ;
        al    w0               1   ;        subscripted :=
        rs.   w0             f50.  ;          true
        jl.   w3             d19.  ;        outconst(1; del)
        rl.   w1             f54.  ;
        ba.   w0               3   ;        if del = 0 then
        sn    w0         1 + e86   ;          error(1+e86,datagroupno.)
        jl.                  d18.  ;          <arithm. equal>)
        al    w0               1   ;
        al.   w1         1 + f45.  ;      end
        jl.   w3              d5.  ;      goto action
   a12: jl.                   d2.  ;    end
   a14: al.   w1        21 + f46.  ;    outrec(1,
        jl.   w3              d5.  ;      <vanished operand>)
        jl.                   d1.  ;  end

e.
\f


;                                       fortran, pass 5, page 47






b.  a4                             ;  action 36

;   if trouble is false,
;   the lba and the fba of the empty stack (for <end list> -
;   records in data statements) are calculated.
;   the next record is read, and if this is the <spark> -
;   record, subscripted is set to true, the <spark>,
;   the next constant and the <arithm. equal> - record are output.

w.
c36:    al    w1               1   ;  begin
        sn.   w1            (f38.) ;    if not trouble then
        jl.                   a4.  ;    begin
        wa.   w1             f11.  ;      lba - stack :=
        rs.   w1             f17.  ;        lfw + 1
        al    w1    x1         1   ;      fba - stack :=
        rs.   w1             f16.  ;        lba + 1
        rl.   w1              f8.  ;      inrec(record)
        jl.   w3              d3.  ;
        al    w0               0   ;      subscripted :=
        rs.   w0             f50.  ;        false
        al    w1              j0   ;      if rec=<spark> then
        se.   w1             (f9.) ;      begin
        jl.                   a2.  ;
        al    w0               1   ;
        al.   w1         1 + f46.  ;        outrec(1,<spark>)
        jl.   w3              d5.  ;        subscripted :=
        al    w0               1   ;          true
        rs.   w0             f50.  ;        outconst(1, del)
        jl.   w3             d19.  ;
        rl.   w1             f54.  ;        if del = 0 then
        ba.   w0               3   ;          error(1+e86,datagroupno.)
        sn    w0         1 + e86   ;        outrec(1,
        jl.                  d18.  ;          <arithm. equal>)
        al    w0               1   ;
        al.   w1         1 + f45.  ;      end
        jl.   w3              d5.  ;      goto action
    a2: jl.                   d2.  ;    end
    a4: jl.                   d1.  ;  end

e.



b.                                 ;  action 37


;   if the databuffer is not empty, error(1 + e86) is called.

w.
c37:    al    w0         1 + e86   ;  begin
        rl.   w1             f54.  ;
        rl.   w2             f14.  ;    if not empty buffer
        se.   w2            (f15.) ;      then
        jl.                  d18.  ;      error(1+e86,datagroupno.)
        jl.                   d1.  ;  end

e.
\f


;                                       fortran, pass 5, page 48







  b.                                 ;  action 38

  ;   if trouble is false, the <mon. minus> - record is output.

  w.
  c38:    dl.   w1              f8.  ;  begin
          se.   w0            (f38.) ;    if not trouble then
          jl.   w3              d5.  ;      outrec(1,<mon. min>)
          jl.                   d1.  ;  end

  e.



  b.                                 ;  action 39

  ;   trouble is set to true, and the <trouble> - record is output.

  w.
  c39:    al    w0               1   ;  begin
          rs.   w0             f38.  ;    trouble := true
          dl.   w1              f8.  ;    outrec
          jl.   w3              d5.  ;      (length, trouble)
          jl.                   d1.  ;  end

  e.

  b.                                 ;  action 40

  ;   if trouble is true, the <vanished operand>-record is output.

  w.
  c40:    al    w0               1   ;  begin
          al.   w1        21 + f46.  ;    if trouble then
          sn.   w0            (f38.) ;      outrec(1,<van. op.>)
          jl.   w3              d5.  ;
          jl.                   d1.  ;  end

  e.
\f


;                                       fortran, pass 5, page 49




  b.  a2                             ;  action 41

  ;   special is set to true, and an element is taken from the stack.
  ;   if this element is false, the <trouble> - record no. e86+0 is
  ;   output, and the following records until the <lab.ref.> - record
  ;   (or until a <trouble> - record) are skipped. trouble is set to true.
  ;   if the stackelement is true, the <end do> - record is output.

  w.
  c41:    al    w0               1   ;  begin
          rs.   w0             f30.  ;    spec := true
          jl.   w3              d9.  ;
          sn    w3               0   ;    if unstack then
          jl.                   a1.  ;      outrec(length, <end do>)
          dl.   w1              f8.  ;    else
          jl.   w3              d5.  ;
          jl.                   d1.  ;    begin
      a1: al    w0               1   ;      trouble :=
          rs.   w0             f38.  ;        true
          al    w0         0 + e86   ;
          al.   w1             f34.  ;
          hs    w0    x1        +1   ;      outrec(4,
          al    w0               4   ;        troublerec. no. e86+0)
          jl.   w3              d5.  ;
          rl.   w1              f8.  ;      for i := 1 step 1
          bl.   w0         9 + f42.  ;
          bl.   w2        25 + f41.  ;        while
      a2: jl.   w3              d3.  ;        rec <> <stm.lab.> and
          bl    w3    x1        +0   ;        rec <> <trouble> do
          se    w2    x3        +0   ;      inrec(record)
          sn    w0    x3        +0   ;
          jl.                   d2.  ;    end
          jl.                   a2.  ;  end

  e.

  b.                                 ;  action 42

  ;   the <end io> - and the <io comma> - record are output.

  w.
  c42:    dl.   w1              f8.  ;  begin
          jl.   w3              d5.  ;    outrec(length,<end io>)
          al    w0               1   ;
          al.   w1        41 + f42.  ;
          jl.   w3              d5.  ;    outrec(1,<io comma>)
          jl.                   d1.  ;  end

  e.



  b.                                 ;  action 43

  ;   the <no. of bytes for simple local variables and stm. fct.
  ;   param.> - record is stored.

  w.
  c43:    rl.   w0             (f8.) ;  begin
          rs.   w0             f36.  ;    no.of bytes := record
          jl.                   d1.  ;  end

  e.
\f


;                                       fortran, pass 5, page 50






  b.  a2                             ;  action 44

  ;   the <label variable list> is stored, and the fba and the
  ;   lba are calculated.
  ;   the lfw is recalculated.

  w.
  c44:    rl.   w1              f7.  ;  begin
          rl.   w2             f11.  ;
          al    w2    x2         1   ;    lba - label var. list :=
          rs.   w2             f29.  ;      1 + lfw
          ws    w2               3   ;
          al    w2    x2         1   ;    fba :=
          rs.   w2             f28.  ;      lba - length + 1
          al    w2    x2        -2   ;    lwa :=
          la.   w2             f39.  ;      (fba - 2) and mask
          rs.   w2             f11.  ;
      a2: am.                  (f8.) ;
          bl    w0    x1        -1   ;    for i := length
          am.                 (f28.) ;      step -1 until 1 do
          hs    w0    x1        -1   ;
          al    w1    x1        -1   ;      list(i) :=
          se    w1               0   ;        record(i)
          jl.                   a2.  ;
          jl.                   d1.  ;  end

  e.

  b.                                 ;  action 46

  ;   if trouble is false, integersearch is called.

  w.
  c46:    am.                 (f38.) ;  begin
          sn    w1    x1         0   ;    if not trouble then
          jl.   w3             d15.  ;      integersearch
          jl.                   d1.  ;  end

  e.


  b.                                 ;  action 47

  ;   special is set to false.

  w.
  c47:    al    w0               0   ;  begin
          rs.   w0             f30.  ;    spec := false
          jl.                   d1.  ;  end

  e.
\f


;                                       fortran, pass 5, page 51




  b.  a2                             ;  action 48

  ;   if trouble is false the <do step> - record is output, and
  ;   integersearch is called.

  w.
  c48:    al    w0               1   ;  begin
          sn.   w0            (f38.) ;    if not trouble then
          jl.                   a2.  ;    begin
          al.   w1        12 + f33.  ;      outrec(1,<do step>)
          jl.   w3              d5.  ;      integersearch
          jl.   w3             d15.  ;    end
      a2: jl.                   d1.  ;  end

  e.

  b.  a2                             ;  action 49

  ;   if trouble is false the <impl. step> - record is output,
  ;   and integersearch is called.

  w.
  c49:    al    w0               1   ;  begin
          sn.   w0            (f38.) ;    if not trouble then
          jl.                   a2.  ;    begin
          al.   w1         8 + f33.  ;      outrec(1,<impl.step>)
          jl.   w3              d5.  ;      integersearch
          jl.   w3             d15.  ;    end
      a2: jl.                   d1.  ;  end

  e.

  b.  a2                             ;  action 50

  ;   if trouble is false, the <do step> - record is output, and
  ;   special is set to false.

  w.
  c50:    al    w0               1   ;  begin
          sn.   w0            (f38.) ;    if not trouble then
          jl.                   a2.  ;    begin
          al.   w1        12 + f33.  ;      outrec
          jl.   w3              d5.  ;        (1,<do step>)
          al    w0               0   ;      spec := false
          rs.   w0             f30.  ;    end
      a2: jl.                   d1.  ;  end

  e.
\f


;                                       fortran, pass 5, page 52




  b.  a2                             ;  action 51

  ;   if trouble is false the <impl. step> - record is output,
  ;   and special is set to false.

  w.
  c51:    al    w0               1   ;  begin
          sn.   w0            (f38.) ;    if not trouble then
          jl.                   a2.  ;    begin
          al.   w1         8 + f33.  ;      outrec
          jl.   w3              d5.  ;        (1,<impl. step>)
          al    w0               0   ;      spec := false
          rs.   w0             f30.  ;    end
      a2: jl.                   d1.  ;  end

  e.

  b.  a2                             ;  action 52

  ;   if trouble is false the <do unt.> - record is output, and
  ;   integersearch is called.

  w.
  c52:    al    w0               1   ;  begin
          sn.   w0            (f38.) ;    if not trouble then
          jl.                   a2.  ;    begin
          al.   w1        11 + f33.  ;      outrec(1,<do unt.>)
          jl.   w3              d5.  ;      integersearch
          jl.   w3             d15.  ;    end
      a2: jl.                   d1.  ;  end

  e.

  b.  a2                             ;  action 53

  ;   if trouble is false the <impl. unt.> - record is output,
  ;   and integersearch is called:

  w.
  c53:    al    w0               1   ;  begin
          sn.   w0            (f38.) ;    if not trouble then
          jl.                   a2.  ;    begin
          al.   w1         7 + f33.  ;      outrec(1,<impl. unt.>)
          jl.   w3              d5.  ;      integersearch
          jl.   w3             d15.  ;    end
      a2: jl.                   d1.  ;  end

  e.
\f


;                                       fortran, pass 5, page 53




  b.  a2                             ;  action 54

  ;   if trouble is false the <do unt.> - record is output, and
  ;   special is set to false.

  w.
  c54:    al    w0               1   ;  begin
          sn.   w0            (f38.) ;    if not trouble then
          jl.                   a2.  ;    begin
          al.   w1        11 + f33.  ;      outrec
          jl.   w3              d5.  ;        (1,<do unt.>)
          al    w0               0   ;      spec := false
          rs.   w0             f30.  ;    end
      a2: jl.                   d1.  ;  end

  e.

  b.  a2                             ;  action 55

  ;   if trouble is false the <impl. unt.> - record is output,
  ;   and special is set to false.

  w.
  c55:    al    w0               1   ;  begin
          sn.   w0            (f38.) ;    if not trouble then
          jl.                   a2.  ;    begin
          al.   w1         7 + f33.  ;      outrec
          jl.   w3              d5.  ;        (1,<impl. unt.>)
          al    w0               0   ;      spec := false
          rs.   w0             f30.  ;    end
      a2: jl.                   d1.  ;  end

  e.

  b.  a2                             ;  action 56

  ;   if trouble is true, this action is skipped.
  ;   contrary the <do init. spec.> - or the <do init. gen.> -
  ;   record is output, when special is true and false,
  ;   respectively.
  ;   the no. of globals is increased by (2 - special).

  w.
  c56:    al    w0               1   ;  begin
          sn.   w0            (f38.) ;    if not trouble then
          jl.                   a2.  ;      outrec(1,
          al.   w1         9 + f33.  ;        if spec then
          se.   w0            (f30.) ;          <do init spec>
          al.   w1        10 + f33.  ;                else
          jl.   w3              d5.  ;          <do init gen>
          bl.   w1         2 + f53.  ;
          al    w1    x1        +1   ;    no. of globals :=
                                     ;      no. of globals + 1;
          hs.   w1         2 + f53.  ;
      a2: jl.                   d1.  ;  end

  e.
\f


;                                       fortran, pass 5, page 54




  b.  a2                             ;  action 57

  ;   if trouble is true, this action is skipped.
  ;   contrary implied equal is set to true, and the <impl. init.
  ;   spec.> - or the <impl. init. gen.> - record is output,
  ;   when special is true and false, respectively.
  ;   the no. of globals is increased by 2.

  w.
  c57:    al    w0               1   ;  begin
          sn.   w0            (f38.) ;    if not trouble then
          jl.                   a2.  ;    begin
          al.   w1         5 + f33.  ;      outrec(1,
          se.   w0            (f30.) ;        if spec
          al.   w1         6 + f33.  ;        then <impl.init.spec.>
          jl.   w3              d5.  ;        else <impl.init.gen.>
          al    w0               1   ;      impl. equal := true
          rs.   w0             f31.  ;    
          bl.   w1         2 + f53.  ;      no. of globals :=
          al    w1    x1        +1   ;        no. of globals + 1
          hs.   w1         2 + f53.  ;    end
      a2: jl.                   d1.  ;  end

  e.



  b.  b1                             ;  action 99

  ;   after the message:
  ;             <bytevalue> unknown record to pass 5
  ;   the translation is terminated.

  w.  b1: <: unknown record to pass 5<0>:>
  c99:    bz.   w0             (f8.) ;  begin
          jl.   w3             g10.  ;
                         32<12 + 5   ;    print(bytevalue)
          al.   w1              b1.  ;    print(unknown record)
          jl.                   g5.  ;    terminate translation
                                     ;  end
  e.
\f


;                                       fortran, pass 5, page 55





;   assignments to the elements of the action table:

       j0 =  c0 - i0,    j20 = c20 - i0,    j40 = c40 - i0,
       j1 =  c1 - i0,    j21 = c21 - i0,    j41 = c41 - i0,
       j2 =  c2 - i0,    j22 = c22 - i0,    j42 = c42 - i0,
       j3 =  c3 - i0,    j23 = c23 - i0,    j43 = c43 - i0,
       j4 =  c4 - i0,    j24 = c24 - i0,    j44 = c44 - i0,
       j5 =  c5 - i0,    j25 = c25 - i0,    
       j6 =  c6 - i0,                       j46 = c46 - i0,
       j7 =  c7 - i0,                       j47 = c47 - i0,
       j8 =  c8 - i0,                       j48 = c48 - i0,
       j9 =  c9 - i0,                       j49 = c49 - i0,
      j10 = c10 - i0,                       j50 = c50 - i0,
      j11 = c11 - i0,                       j51 = c51 - i0,
      j12 = c12 - i0,                       j52 = c52 - i0,
      j13 = c13 - i0,    j33 = c33 - i0,    j53 = c53 - i0,
      j14 = c14 - i0,    j34 = c34 - i0,    j54 = c54 - i0,
      j15 = c15 - i0,    j35 = c35 - i0,    j55 = c55 - i0,
      j16 = c16 - i0,    j36 = c36 - i0,    j56 = c56 - i0,
      j17 = c17 - i0,    j37 = c37 - i0,    j57 = c57 - i0,
      j18 = c18 - i0,
      j19 = c19 - i0,    j39 = c39 - i0,    j99 = c99 - i0,




  b. a10, b3                         ;  proc inrec
                                     ;    (record;length,action)

  ;   the procedure inrec reads the next record, and it finds
  ;   its length and action.
  ;   if the record is <end line>, <end statement>, <ext. ident.>,
  ;   or <label decl.> the appropriate action is performed, and
  ;   the next record is input.
  ;   if the size of the record exceeds the size of the free core
  ;   store, stackerror is called.
  ;   it is called from the head, and from action 11, 34, 35, 36, 41
  ;   and integersearch in this way:
  ;
  ;       al.   w1        <addr.,proposed>.
  ;       jl.   w3              d3.

  ;   it is noticed, that if a declaration of a new label is
  ;   input, the proposed startaddress is altered due to the
  ;   growth of the label table.

  w.  b0:                        0   ;  w0 - store
      b1:                        0   ;  w1 - store
      b2:                        0   ;  w2 - store
      b3:                        0   ;  w3 - store
\f


;                                       fortran, pass 5, page 56




   d3:    ds.   w1              b1.  ;  begin
          ds.   w3              b3.  ;
      a2: jl.   w3              g2.  ;    record(0) :=
          hs.   w2             (b1.) ;      inbyte
          al    w0    x2         0   ;    find
          jl.   w3             d12.  ;      (record(0);no,action)
          rs.   w1              f9.  ;
          al    w1               0   ;    i := 0
          se    w0               0   ;    if no = 0 then
          jl.                   a4.  ;
          al    w1               1   ;    begin
          jl.   w3              g2.  ;      i := 1
          am.                  (b1.) ;      record(1) := inbyte
          hs    w2              +1   ;      no := 2 + record(1)
          al    w0    x2        +2   ;    end
      a4: rs.   w0              f7.  ;    length := no
          rx    w0               2   ;
          al    w3    x1        -2   ;
          wa.   w3              b1.  ;
          sl.   w3            (f11.) ;    if rec. + length - 2
          jl.                   d7.  ;      > lwa then stackerror
      a6: al    w1    x1        -1   ;
          sh    w1              (0)  ;
          jl.                   a8.  ;    for j := length - 1
          jl.   w3              g2.  ;      step -1
          am.                  (b1.) ;      while j>i do
          hs    w2    x1         0   ;      record(j) := inbyte
          jl.                   a6.  ;
      a8: rl.   w1              f9.  ;    if <end line>    or
          sl    w1              j2   ;       <end stm >    or
          sl    w1          1 + j5   ;       <ext. ident.> or
          jl.                  a10.  ;       <label decl.> then
          jl.         x1        i0.  ;    begin
   d4:    rl.   w3              f8.  ;
          rs.   w3              b1.  ;      action
          jl.                   a2.  ;
     a10: dl.   w1              b1.  ;      goto a2
          dl.   w3              b3.  ;    end
          jl          x3        +0   ;  end

  e.
\f


;                                       fortran, pass 5, page 57




  b.  a2, b3                         ;  proc outrec
                                     ;    (length,record)

  ;   the procedure outrec, which outputs a record, is called
  ;   from most actions in this way:
  ;
  ;       al    w0        <no. of bytes>
  ;       al.   w1        <startaddress>.
  ;       jl.   w3              d5.

  w.  b2:                        0   ;  w2 - store
      b3:                        0   ;  w3 - store

   d5:    ds.   w3              b3.  ;  begin
          rl    w2               0   ;
      a2: al    w2    x2        -1   ;
          am          x2         0   ;    for i := length - 1
          bl    w0    x1         0   ;      step -1 until 0 do
          jl.   w3              g3.  ;      outbyte(record(i))
          se    w2               0   ;
          jl.                   a2.  ;
          rl.   w2              b2.  ;
          jl.                  (b3.) ;  end

  e.

  b.  a4, b5                         ;  proc labelsearch
                                     ;    (lab, counter)

  ;   a search for the label is performed through the label table.
  ;   if the label is not found, the label is added to the table,
  ;   and the 4 counters are reset; the fwa of the inout - record
  ;   is increased by 6. if the counter is equal to 2 or 3 (i.e.
  ;   a label reference), the no. of globals is increased by 1.
  ;   the counter is increased by 1, and the label no. is output.
  ;   if trouble is true, the <vanished operand> - record is out-
  ;   put instead of the label no.
  ;   the procedure is called from action 5, 14, and 15 in this
  ;   way:
  ;
  ;       rl.   w0        <label addr.>.
  ;       al    w1          <counter>
  ;       jl.   w3              d6.
  ;
  ;   where   <counter> := 0  (declared statement label) or
  ;                        1  (declared format    label) or
  ;                        2  (referred statement label) or
  ;                        3  (referred format    label)

  w.  b0:                        0   ;  w0 - store
      b1:                        0   ;  w1 - store
      b2:                        0   ;  w2 - store
      b3:                        0   ;  w3 - store
      b4:                        6   ;
  h.  b5:                        0   ;  label no.
\f


;                                       fortran, pass 5, page 58




  w.
   d6:    ds.   w1              b1.  ;  begin
          ds.   w3              b3.  ;
          rl.   w2              f5.  ;    for i := 1 step 1
      a2: sl.   w2             (f6.) ;      until n do
          jl.                   a3.  ;
          sn    w0   (x2        +0)  ;
          jl.                   a4.  ;      if label(i) = lab
          al    w2    x2        +6   ;        then goto a4
          jl.                   a2.  ;
      a3: rs    w0    x2        +0   ;    label(i) := lab
          al    w3    x2        +4   ;    lwa - label table :=
          rs.   w3              f6.  ;      lwa + 6
          al    w3    x3         2   ;    fwa - inoutrecord :=
          rs.   w3              f8.  ;      2 + lwa-labeltable
          al    w0               0   ;
          rs    w0    x2        +2   ;    ds(i) := df(i) :=
          rs    w0    x2        +4   ;    rs(i) := rf(i) := 0
          sh    w1               1   ;    if counter = 2 or
          jl.                   a4.  ;       counter = 3 then
          bl.   w1         2 + f53.  ;       no. of globals :=
          al    w1    x1        +1   ;         no. of globals + 1
          am.                 (f38.) ;       (unless trouble)
          sn    w1    x1             ;
          hs.   w1         2 + f53.  ;
      a4: am.                  (b1.) ;
          al    w3    x2        +2   ;
          rs.   w2            f52.  ;   save addr of label-entry;
          al    w0               1   ;    counter(i) :=
          ba    w0    x3         0   ;      counter(i) + 1
          sh    w0           2047    ;    (unless overflow)
          hs    w0    x3         0   ;
          ws.   w2              f5.  ;
          al    w1               0   ;    label no. :=
          wd.   w2              b4.  ;      511 + i
          al    w2    x2       512   ;
          hs.   w2              b5.  ;
          al    w0               1   ;
          al.   w1              b5.  ;    outrec(length,
          am.                 (f38.) ;      if trouble
          se    w1    x1         0   ;        then <van. op.>
          al.   w1        21 + f46.  ;        else <label no.>)
          jl.   w3              d5.  ;
          rl.   w2              b2.  ;
          jl.                  (b3.) ;  end

  e.

  b.  b1                             ;  proc stackerror

  ;   after the message: process too small, the translation is terminated.
  ;   if the size of the free core store is too small, this pro-
  ;   cedure is called from inrec, tabelsearch, action 9, 10, 11, 12,
  ;   and 13 in this way:
  ;
  ;       jl.                   d7.

  w.  b1: <:<10>process too small<0>:>
                                     ;  begin
   d7:    al.   w1              b1.  ;    print(process too small)
          jl.                   g5.  ;    terminate translation
                                     ;  end
  e.
\f


;                                       fortran, pass 5, page 59




  b.  b0                            ;  proc stack(byte)

  ;   the byte is stacked, and the address of the last free word
  ;   is recalculated.
  ;   the procedure is called from action 16, 17, 19, 20, 21 and 25
  ;   in this way:
  ;
  ;       bl.   w0         <byte addr.>.
  ;       jl.   w3              d8.

  w.  b0:                        0   ;  return address

   d8:    rs.   w3              b0.  ;  begin
          rl.   w3             f16.  ;
          al    w3    x3        -1   ;    fba := fba - 1
          rs.   w3             f16.  ;
          hs    w0    x3         0   ;    stack(fba) := byte
          al    w3    x3        -2   ;
          la.   w3             f39.  ;    lwa :=
          rs.   w3             f11.  ;      (fba - 2) and mask
          jl.                  (b0.) ;  end

  e.

  b.  b0                             ;  proc unstack(byte)

  ;   a byte is unstacked, and the address of the last free word
  ;   is recalculated.
  ;   the procedure is called from action 22, 23, 24, and 41 in
  ;   this way:
  ;
  ;       jl.   w3              d9.  ;
  ;                                  ;  (w3) = byte

  w.  b0:                        0   ;  return address

   d9:    rs.   w3              b0.  ;  begin
          rl.   w3             f16.  ;
          al    w3    x3        +1   ;    fba := fba + 1
          rs.   w3             f16.  ;
          al    w3    x3        -2   ;
          la.   w3             f39.  ;    lfw :=
          rs.   w3             f11.  ;      (fba - 2) and mask
          am.                 (f16.) ;
          bl    w3              -1   ;    byte := stack(fba - 1)
          jl.                  (b0.) ;  end

  e.
\f


;                                       fortran, pass 5, page 60




  b.  a8, b9                         ;  proc listsearch
                                     ;    (fba,lba,dist,ident)

  ;   listsearch searches for the ident no. in the bytes:
  ;         fba, fba + dist, fba + 2*dist,..., lba.
  ;   if the ident no. is not found, listsearch is set to false.
  ;   contrary listsearch is set to true, and the external repre-
  ;   sentation is stored into 8 bytes, the first byte being
  ;   ident; if the external representation is longer than 11
  ;   characters, it is shortened to this length; if it is shor-
  ;   ter than 11 characters, the last positions are filled with
  ;   zeroes.
  ;   it is called from action 4 in this way:
  ;
  ;             input               output
  ;
  ;     w0:   dist, ident           ident
  ;     w1:   fba                   listsearch
  ;     w2:   lba                   undefined
  ;     w3:   return address        undefined

  w.  b1:                        0   ;  i
      b2:                        0   ;  lba
      b3:                        0   ;  return address
      b4:                        0   ;  ident. no.
      b5:                        0   ;  dist
      b8:               8.77777400   ;
      b9:                        0   ;  1 + no.of bytes
\f


;                                       fortran, pass 5, page 61




  d10:    hs.   w0          1 + b4.  ;  begin
          ls    w0             -12   ;
          rs.   w0              b5.  ;
          ds.   w2              b2.  ;    for i := fba
          rs.   w3              b3.  ;      step dist
          rl.   w0              b4.  ;      until lba do
      a2: sh.   w1             (b2.) ;    begin
          jl.                   +4   ;
          jl.                   a7.  ;
          bl    w2    x1        +7   ;
          bl    w1    x1        +0   ;
          sn    w0    x1         0   ;      if (i) = ident
          se    w2               1   ;      and entry contains an ident no then
          jl.                   a5.  ;      begin
          am.                  (f8.) ;
          bl    w2              +1   ;        for j := 1
          rs.   w2              b9.  ;          step 1 until 8 do
          al    w2               1   ;
      a4: am.                  (f8.) ;
          bl    w0    x2        +1   ;
          sl.   w2             (b9.) ;        i(j) :=
          al    w0               0   ;          if j > no.of bytes
          am.                  (b1.) ;          then 0
          hs    w0    x2        -1   ;          else ident(j)
          al    w2    x2        +1   ;
          sh    w2               8   ;
          jl.                   a4.  ;
          la.   w0              b8.  ;
          am.                  (b1.) ;        i(8) := i(8) and
          hs    w0    x2        -2   ;          2.00000000
          al    w1               1   ;
          jl.                   a8.  ;      end
      a5: rl.   w1              b1.  ;
          wa.   w1              b5.  ;
          rs.   w1              b1.  ;      i := i + dist
          jl.                   a2.  ;    end
      a7: al    w1               0   ;    listsearch := false
      a8: rl.   w0              b4.  ;
          jl.                  (b3.) ;  end

  e.
\f


;                                       fortran, pass 5, page 62




  b. a18, b6                         ;  proc tablesearch

  ;   this procedure performs 3 searches through the label table,
  ;   for not declared labels, for multiple declared labels, and
  ;   for declared but not referred labels (nulls).
  ;   if such labels occur, the corresponding list is formed and
  ;   output.
  ;   if the free core store is exceeded when forming a list,
  ;   stackerror is called.
  ;   the procedure is called from action 8 in this way:
  ;
  ;       jl.   w3             d11.

  w.  b0:                        0   ;  w0 - store
      b1:                        0   ;  w1 - store
      b2:                        0   ;  w2 - store
      b3:                        0   ;  w3 - store
      b5:                        6   ;
      b6:                        0   ;  2 * list no.

                                     ;  begin

      a2: bl    w2    x1        +2   ;    proc not decl. label
          se    w2               0   ;    begin
          jl.                    8   ;
          bl    w2    x1        +4   ;
          sl    w2               1   ;      not decl. label :=
          jl.                  a14.  ;        if
          bl    w2    x1        +3   ;        (ds(i) = 0  and
          se    w2               0   ;         rs(i) > 0)  or
          jl.                  a16.  ;        (df(i) = 0  and
          bl    w2    x1        +5   ;         rf(i) > 0)
          sl    w2               1   ;        then true
          jl.                  a14.  ;        else false
          jl.                  a16.  ;    end

      a4: bl    w2    x1        +2   ;    proc mult. decl. label
          ba    w2    x1        +3   ;    begin
          sh    w2               1   ;      mult. decl. label :=
          jl.                  a16.  ;        if ds(i)+df(i) > 1
          jl.                  a14.  ;        then true else false
                                     ;    end

                                     ;    proc null
      a6: rl    w3    x1        +4   ;    begin
          sn    w3               0   ;      null := if
          jl.                  a14.  ;        rs(i)+rf(i) = 0
          jl.                  a16.  ;        then true else false
                                     ;    end
\f


;                                       fortran, pass 5, page 63




  d11:    ds.   w1              b1.  ;    comment: entry point
          ds.   w3              b3.  ;
          rl.   w1              f6.  ;
          al    w1    x1        +2   ;    fba := 2 +
          rs.   w1             f12.  ;      lwa - label table
          al    w1               2   ;
          rs.   w1              b6.  ;    for list := 1, 2, 3 do
     a10: rl.   w1             f12.  ;    begin
          al    w1    x1         1   ;
          rs.   w1             f13.  ;      lba - list := fba + 1
          rl.   w1              f5.  ;      for i:=1 step 1 until n do
     a12: sl.   w1             (f6.) ;      begin
          jl.                  a17.  ;
          am.                  (b6.) ;
          jl.                   +0   ;        if (list=1 and n.d.l.) or
          jl.                   a2.  ;           (list=2 and m.d.l.) or
          jl.                   a4.  ;           (list=3 and null)
          jl.                   a6.  ;          then
     a14: rl.   w2             f13.  ;        begin
          al    w2    x2        +1   ;          lba := lba + 1
          rs.   w2             f13.  ;
          sl.   w2            (f11.) ;          if lba>lfw then
          jl.                   d7.  ;            stackerror
          al    w3    x1         0   ;          list(lba) :=
          ws.   w3              f5.  ;            
          al    w2               0   ;
          wd.   w3              b5.  ;            then 511 + i
          al    w3    x3       512   ;
          hs.   w3            (f13.) ;        end
     a16: al    w1    x1         6   ;
          jl.                  a12.  ;      end
     a17: rl.   w1             f12.  ;
          rl.   w2             f13.  ;
          ws    w2               2   ;      if lba-fba-1 > 0 then
          al    w2    x2        -1   ;
          sh    w2               0   ;
          jl.                  a18.  ;
          al    w0    x2         2   ;      begin
          rl.   w3              b6.  ;
          ls    w3              -1   ;        list(1):=lba-fba-1
          ba.   w3         9 + f48.  ;        list(0):=byte+list
          hs    w3               4   ;        outrec
          rs    w2    x1         0   ;          (list(1)+2,list)
          jl.   w3              d5.  ;      end
     a18: rl.   w1              b6.  ;
          al    w1    x1         2   ;
          rs.   w1              b6.  ;
          sh    w1               6   ;
          jl.                  a10.  ;    end
          dl.   w1              b1.  ;
          dl.   w3              b3.  ;
          jl          x3         0   ;  end

  e.
\f


;                                       fortran, pass 5, page 64





  b.  a2, b1                         ;  proc find
                                     ;       (ident;no,action)

  ;   the procedure, which is called from inrec and commonsearch,fetches
  ;   from the inputclass-table the action and the length
  ;   for the actual record identification.

  ;   it is called in this way:

  ;       bz.   w0     <identbyte addr.>.
  ;       jl.   w3             d12.
  ;                                  ;  (w0) = no. of bytes
  ;                                  ;  (w1) = action

  w.
      b1:                        0   ;  returnaddress

  d12:    rs.   w3              b1.  ;  begin
          rl.   w1             f32.  ;    class := no. of classes
      a1: bz.   w3    x1   1 + f40.  ; 
          se    w1               0   ;    if class > 0 and
          sl    w0    x3         0   ;       ident < base(class)
          jl.                   a2.  ;    then
          al    w1    x1        -4   ;    begin
          jl.                   a1.  ;      class := class - 1
      a2: bz.   w0    x1   2 + f40.  ;      goto a1
          bl.   w1    x1   3 + f40.  ;    end
          jl.                  (b1.) ;    no := numb(class)
                                     ;    act := action(class)
                                     ;  end

  e.

  b.  a6                             ;  proc initialize

  ;   when initializing pass 5 the basevalue of each inputclass
  ;   and the number of classes are calculated.
  ;   then the addresses of the first free word and the last free
  ;   word are calculated.
  ;   a table of the new records is filled, and the leading byte
  ;   for a troublerecord is set.
  ;   the integer - table is filled with the bytevalues of integer-
  ;   constant and simple integer - descriptions (local,
  ;   common, parameter, equiv. to array, and equiv. to zone).
  ;   the directionbyte of the <no. of labels - and the no. of
  ;   globals> - record is set.
  ;   finally the <end pass> - record is output.
  ;
  ;   the procedure is called from the head program in this way:
  ;
  ;       jl.                  d13.  ;  initialize
\f


;                                       fortran, pass 5, page 65




  w.
  d13:    al    w3               0   ;  begin
          bl.   w0         1 + f40.  ;
      a2: ba.   w0    x3       f40.  ;    for i := 1 step 1
          sn.   w0   (x3       f40.) ;      while no(i) > 0 do
          jl.                   a4.  ;      basevalue(i + 1) :=
          al    w3    x3         4   ;        basevalue(i) + no(i)
          hs.   w0    x3   1 + f40.  ;
          jl.                   a2.  ;
      a4: rs.   w3             f32.  ;    no. of classes := i
          jl.   w3              g9.  ;    lfw :=
          rs.   w0             f11.  ;      last free word
          al.   w3             i25.  ;    fwa - glob.ep.list :=
          rs.   w3              f1.  ;      lwa - glob.ep.list :=
          rs.   w3              f2.  ;      first free word
          al    w3    x3         2   ;    fwa - inout record :=
          rs.   w3              f8.  ;      ffw :=
          rs.   w3             f10.  ;      first free word + 2
          al    w1               0   ;
      a6: al    w2    x1       136   ;    for i := 0
          hs.   w2    x1       f33.  ;      step 1 until 13 do
          al    w1    x1         1   ;
          sh    w1              13   ;      table(i) := 136 + i
          jl.                   a6.  ;
          bl.   w0         9 + f42.  ;
          hs.   w0             f34.  ;    troublerecord
          bl.   w1        13 + f41.  ;    inttab(0) :=
          rs.   w1         0 + f51.  ;      <int. constant>
          bl.   w1        25 + f48.  ;  
          al    w1    x1         2   ;    inttab(1) :=
          rs.   w1         2 + f51.  ;      <simple loc. int. var.>
          bl.   w1        29 + f48.  ;  
          al    w1    x1         2   ;    inttab(2) :=
          rs.   w1         4 + f51.  ;      <simple com. int. var.>
          bl.   w1        33 + f48.  ;  
          al    w1    x1         2   ;    inttab(3) :=
          rs.   w1         6 + f51.  ;      <simple par. int. var.>
          bl.   w1         9 + f49.  ;  
          al    w1    x1         2   ;    inttab(4) :=
          rs.   w1         8 + f51.  ;      <sim.int.var.equiv.arr.>
          al    w1    x1         8   ;    inttab(5) :=
          rs.   w1        10 + f51.  ;      <sim.int.var.equiv.zone>
          bl.   w1        13 + f48.  ;
          al    w1    x1        +4   ;    <no. of labels, globals> :=
          hs.   w1             f53.  ;      directionbyte
          al    w0               1   ;
          al.   w1        21 + f40.  ;    outrec
          jl.   w3              d5.  ;      (1, <end pass>)
          jl.                   d1.  ;  end

  e.
\f


;                                       fortran, pass 5, page 66



  b.  a8, b3                         ;  proc bufback
                                     ;         (record, length)
  ;   the record and the recordlength are replaced in the bottom
  ;   of the (perhaps empty) databuffer.
  ;   the lowerpointer (pointing at the record in the buffer) is
  ;   increased by (1 + the recordlength).
  ;   the procedure is called from outconst in this way:
  ;
  ;       al    w0        <no. of bytes>
  ;       al.   w1        <startaddress>.
  ;       jl.   w3             d14.

  w.  b0:                        0   ;  length
      b1:                        0   ;  startaddress
      b3:                        0   ;  returnaddress

  d14:    ds.   w1              b1.  ;  begin
          rs.   w3              b3.  ;
          sh    w0               0   ;
          jl.                   a8.  ;    if upperpointer =
          ba.   w0               1   ;       lowerpointer
          rl.   w1             f15.  ;       then
          se.   w1            (f14.) ;       upperpointer :=
          jl.                   a2.  ;         upperpointer
          ws    w1               0   ;         - length - 1
          rs.   w1             f14.  ;       else
          jl.                   a4.  ;       lowerpointer :=
      a2: wa    w1               0   ;         lowerpointer
          rs.   w1             f15.  ;         + length + 1
      a4: rl.   w1             f15.  ;
          ws.   w1              b0.  ;    for i := 1 step 1
          al    w3               0   ;      until length do
      a6: am.                  (b1.) ;      databuffer(i +
          bl    w0    x3        +0   ;        lowerpointer
          am          x1        +0   ;        - length - 1) :=
          hs    w0    x3        +0   ;        record(i)
          al    w3    x3        +1   ;
          se.   w3             (b0.) ;    databuffer
          jl.                   a6.  ;      (lowerpointer) :=
          hs.   w3            (f15.) ;        length
      a8: jl.                  (b3.) ;  end

  e.



  b.  a4, b3                         ;  proc integersearch

  ;   the next record, which is a constant or a simple variable 
  ;   description, is read and written.
  ;   if this record was neither an integer constant nor an inte-
  ;   ger variable (local, common, parameter, equiv. to array,
  ;   equiv. to zone), special is set to false.
  ;   this procedure is called from action 46, 48, 49, 52, and 53
  ;   in this way:
  ;
  ;       jl.   w3             d15.

  w.  b0:                        0   ;  w0 - store
      b1:                        0   ;  w1 - store
      b3:                        0   ;  return address
\f


;                                       fortran, pass 5, page 67




  d15:    ds.   w1              b1.  ;  begin
          rs.   w3              b3.  ;
          rl.   w1              f8.  ;    inrec(record;length)
          jl.   w3              d3.  ;
          dl.   w1              f8.  ;    outrec(length,record)
          jl.   w3              d5.  ;
          bl.   w1             (f8.) ;
          al    w3              10   ;    if (rec<>int.const.  and
      a2: al    w3    x3        -2   ;        rec<>s.loc.int.v.and
          sn.   w1   (x3       f51.) ;        rec<>s.com.int.v.and
          jl.                   a4.  ;        rec<>s.i.param.  and
          se    w3               0   ;        rec<>s.i.v.eq.ar.and
          jl.                   a2.  ;        rec<>s.i.v.eq.z.)then
          rs.   w3             f30.  ;        spec := false
      a4: dl.   w1              b1.  ;
          jl.                  (b3.) ;  end

  e.


  b.  a4, b1                         ;  proc bufin(record,length)

  ;   the recordlength and the record are put into the databuffer.
  ;   the upperpointer (pointing at the first free byte of the
  ;   buffer) is decreased by (1 + the recordlength), and  the
  ;   lwa is recalculated.
  ;   the procedure is called from action 34 and outconst in this way:
  ;
  ;       al    w0        <no. of bytes>
  ;       al.   w1       <start address>.
  ;       jl.   w3             d16.

  w.  b0:                        0   ;  length
      b1:                        0   ;  startaddress

  d16:    sh    w0               0   ;  begin
          jl.                   a4.  ;    if length > 0 then
          ds.   w1              b1.  ;    begin
          ba.   w0               1   ;      upperpointer :=
          ac    w0              (0)  ;        upperpointer
          wa.   w0             f14.  ;          - length - 1
          rs.   w0             f14.  ;      lwa :=
          bs.   w0               1   ;
          la.   w0             f39.  ;        (upperpointer-1) and mask
          rs.   w0             f11.  ;
          al    w1               0   ;      for i := 1 step 1
      a2: am.                  (b1.) ;        until length do
          bz    w0    x1         0   ;      begin
          am.                 (f14.) ;        databuffer(i +
          hs    w0    x1        +1   ;          upperpointer) :=
          al    w1    x1         1   ;          record(i)
          se.   w1             (b0.) ;      end
          jl.                   a2.  ;      databuffer(1+length+
          rl.   w0              b0.  ;        upperpointer) :=
          am.                 (f14.) ;        length
          hs    w0    x1        +1   ;    end
      a4: jl          x3        +0   ;  end

  e.
\f


;                                       fortran, pass 5, page 68




  b.  a4, b3                         ;  proc bufout(record;length)

  ;   the next record is taken form the databuffer.
  ;   the lowerpointer (pointing at the record of the buffer) is
  ;   decreased by (1 + the recordlength).
  ;   if the buffer is now empty, the lower - as well as the upper-
  ;   pointer are reset, and the lwa is recalculated.
  ;   if the buffer was empty, <length> is set to zero.
  ;   the procedure is called from outconst in this way:
  ;
  ;       al.   w1       <start address>.
  ;       jl.   w3             d17.
  ;                                  ;  w0 = length

  w.  b1:                        0   ;  start address
      b3:                        0   ;  return address

  d17:    rs.   w1              b1.  ;  begin
          rs.   w3              b3.  ;
          al    w0               0   ;    length := 0
          rl.   w3             f15.  ;    if lowerpointer >
          sh.   w3            (f14.) ;      upperpointer then
          jl.                   a4.  ;    begin
          bl    w0    x3         0   ;      length :=
          ws    w3               0   ;        buffer(lowerpointer)
          al    w3    x3        -1   ;      lowerpointer :=
          rs.   w3             f15.  ;        lowerpointer
          al    w1               0   ;          - length - 1
      a2: am.                 (f15.) ;      for i := 1 step 1
          bz    w3    x1        +1   ;          until length do
          am.                  (b1.) ;          record(i) :=
          hs    w3    x1        +0   ;            buffer(i +
          al    w1    x1         1   ;              lowerpointer)
          se    w1              (0)  ;
          jl.                   a2.  ;      if lowerpointer =
          rl.   w3             f14.  ;          upperpointer then
          se.   w3            (f15.) ;
          jl.                   a4.  ;          lowerpointer :=
          rl.   w3         2 + f15.  ;            upperpointer :=
          rs.   w3             f11.  ;              lwa :=
          rs.   w3             f14.  ;              lwa-databuffer
          rs.   w3             f15.  ;    end
      a4: jl.                  (b3.) ;  end

  e.
\f


;                                       fortran, pass 5, page 69




  b.                                 ;  proc error(no,param)

  ;   trouble is set to true, and troublerecord no. <no> ,parameter
  ;   <param> is output. return is made to the head program.
  ;   it is called from action 35, 36, and 37 in this way:
  ;
  ;       al    w0             <no>
  ;       rl.   w1           <param>.
  ;       jl.                  d18.

  w.
  d18:    hs.   w0         1 + f34.  ;  begin
          hs.   w1         2 + f34.  ;
          al    w0               1   ;    trouble := true
          rs.   w0             f38.  ;    outrec(4,
          al    w0               4   ;      <troublerec. no. <no>>)
          al.   w1             f34.  ;
          jl.   w3              d5.  ;    goto read next record
          jl.                   d1.  ;  end

  e.

  b. a16, b12                        ;  proc outconst
                                     ;    (wanted; delivered)

  ;   this procedure tries to output one constant or one constant-
  ;   group, but not more than the wanted number of constants.
  ;   the constants are taken from the databuffer.
  ;   delivered is set to the number of constants delivered.
  ;   this number may be equal to zero if the buffer is empty.
  ;   if a repetitionfactor is equal to one, neither this nor the
  ;   datastar are output.
  ;   the procedure is called from action 35 and 36 in this way:
  ;
  ;       al    w0          <wanted> ;
  ;       jl.   w3             d19.  ;
  ;                                  ;  w0 = <delivered>

  w.  b0:                        0   ;  wanted
      b1:                        0   ;  w1 - store
      b2:                        0   ;  w2 - store
      b3:                        0   ;  return address
  h.  b4:                        0   ;  dyamin
      b5:                  0, r. 9   ;  record 1
      b6:                        0   ;  datastar
      b7:                  0, r. 9   ;  record 2
  w.  b8:                        0   ;  delivered
      b9:                        0   ;  length 1
     b10:                        0   ;  length 2
  h. b11:                  0, r. 3   ;  record 3
  w. b12:                        0   ;  length 3
\f


;                                       fortran, pass 5, page 70




  d19:    ds.   w1              b1.  ;  begin
          ds.   w3              b3.  ;
          al    w0               0   ;    dyamin := 0
          hs.   w0              b4.  ;
          al.   w1              b5.  ;    bufout(record1;length1)
          jl.   w3             d17.  ;
          rs.   w0              b9.  ;    if length1 = 0 then
          se    w0               0   ;    begin
          jl.                   a6.  ;      delivered := 0
          rs.   w0              b8.  ;      goto a16
          jl.                  a16.  ;    end
      a6: al.   w1              b5.  ;
          jl.   w3              d5.  ;    outrec(length1,record1)
      a8: al    w0               0   ;    datastar
          hs.   w0              b6.  ;      := 0
          al.   w1              b6.  ;    bufout(datastar;
          jl.   w3             d17.  ;           length2)
          rs.   w0             b10.  ;
          bl.   w0              b6.  ;    if datastar =
          bl.   w1        29 + f42.  ;      <dyamin> then
          se    w0    x1        +0   ;    begin
          jl.                   a9.  ;      dyamin := <dyamin>
          hs.   w0              b4.  ;      outrec(1,
          al    w0               1   ;        <dyamin>)
          al.   w1              b4.  ;      bufout(record3,
          jl.   w3              d5.  ;             length3)
          al.   w1             b11.  ;
          jl.   w3             d17.  ;      outrec(length3,
          rs.   w0             b12.  ;             record3)
          al.   w1             b11.  ;      goto a8
          jl.   w3              d5.  ;    end
          jl.                   a8.  ;    if datastar <>
      a9: bl.   w1              b6.  ;      <datastar> then
          bl.   w2         9 + f44.  ;
          sn    w1    x2        +0   ;    begin
          jl.                  a10.  ;      bufback(datastar,
          rl.   w0             b10.  ;             length2)
          al.   w1              b6.  ;
          jl.   w3             d14.  ;      delivered := 1
          al    w0               1   ;      goto a16
          rs.   w0              b8.  ;
          jl.                  a16.  ;    end
     a10: al.   w1              b7.  ;    bufout(record2;
          jl.   w3             d17.  ;           length2)
          rs.   w0             b10.  ;
          rl.   w0          1 + b7.  ;    if record2 >
          ws.   w0              b0.  ;       wanted then
          sh    w0               0   ;    begin
          jl.                  a15.  ;      record2 :=
          rs.   w0          1 + b7.  ;        record2 - wanted
          rl.   w0             f14.  ;      if databuffer
          sn.   w0            (f15.) ;         not empty then
\f

;                                       fortran, pass 5, page 71



          jl.                  a12.  ;      begin
          al    w0               3   ;        bufback(record2, 3)
          al.   w1              b7.  ;  
          jl.   w3             d14.  ;  
          al    w0               1   ;        bufback(datastar, 1)
          al.   w1              b6.  ;  
          jl.   w3             d14.  ;  
          bl.   w0              b4.  ;  
          sn    w0               0   ;        if dyamin <> 0 then
          jl.                  a11.  ;        begin
          rl.   w0             b12.  ;          bufback(record3,
          al.   w1             b11.  ;                  length3)
          jl.   w3             d14.  ;
          al    w0               1   ;  
          al.   w1              b4.  ;          bufback(dyamin, 1)  
          jl.   w3             d14.  ;        end  
     a11: rl.   w0              b9.  ;        bufback(record1,
          al.   w1              b5.  ;                length1)
          jl.   w3             d14.  ;      end
          jl.                  a14.  ;      else
     a12: rl.   w0              b9.  ;      begin
          al.   w1              b5.  ;
          jl.   w3             d16.  ;        bufin(record1,
          bl.   w0              b4.  ;              length1)
          sn    w0               0   ;
          jl.                  a13.  ;        if dyamin <> 0 then
          al    w0               1   ;        begin
          al.   w1              b4.  ;          bufin(dyamin, 1)
          jl.   w3             d16.  ;
          rl.   w0             b12.  ;          bufin(record3,
          al.   w1             b11.  ;                length3)
          jl.   w3             d16.  ;        end
     a13: al    w0               1   ;        bufin(datastar, 1)
          al.   w1              b6.  ;
          jl.   w3             d16.  ;
          al    w0               3   ;        bufin(record2, 3)
          al.   w1              b7.  ;
          jl.   w3             d16.  ;      end
     a14: rl.   w0              b0.  ;      record2 := wanted
          rs.   w0          1 + b7.  ;    end
     a15: rl.   w0          1 + b7.  ;
          rs.   w0              b8.  ;    delivered := record2
          sh    w0               1   ;
          jl.                  a16.  ;    if record2 = 1
          al    w0               1   ;      then goto a16
          al.   w1              b6.  ;
          jl.   w3              d5.  ;    outrec(1, <datastar>)
          al    w0               3   ;
          al.   w1              b7.  ;    outrec(record2,3)
          jl.   w3              d5.  ;
     a16: rl.   w0              b8.  ;
          dl.   w2              b2.  ;
          jl.                  (b3.) ;  end

  e.
\f


;                                       fortran, pass 5, page 72




  b. a16, b7                         ;  proc commonsearch
                                     ;    (ident. no.;
                                     ;     array,no,length,start)

  ;   a search for the ident. no. is performed through the list
  ;   containing descriptions of the commonvariables in data
  ;   statements.
  ;   if the ident. no. is not found, a <trouble integer description>
  ;   and a <trouble> - record no. e86+2 are formed.
  ;   contrary array is set to true, if it is an identifier of an
  ;   array, no. is set to the number of elements (no. = 1 for a
  ;   simple variable), and the length and the startaddress of the
  ;   description are found.
  ;   this procedure is called from action 35 in this way:
  ;
  ;                 input             output
  ;
  ;         w0:     ident.no.         array
  ;         w1:     irrelevant        no
  ;         w2:     irrelevant        length
  ;         w3:     return addr.      startaddr.

  w.  b0:                        0   ;  ident. no.
      b3:                        0   ;  return address
      b4:                        0   ;  array
      b5:                        0   ;  no
      b6:                        0   ;  length
      b7:                        0   ;  startaddress
\f


;                                       fortran, pass 5, page 73




  d20:    rs.   w0              b0.  ;  begin
          rs.   w3              b3.  ;    pointer := fba-com.var.
          rl.   w2             f22.  ;    for i := 1 step 1
      a4: sl.   w2            (f23.) ;      while pointer <
          jl.                  a12.  ;        lba-com.var. do
          rs.   w2              b7.  ;    begin
          al    w0               0   ;      start := pointer
          rs.   w0              b4.  ;      array := false
          bz    w0    x2        +0   ;      find(rec(pointer);
          jl.   w3             d12.  ;        length, dummy)
       rs. w0 b6.        ; length if not array
          se    w0               0   ;      if length = 0 then
          jl.                   a6.  ;      begin
          al    w0               1   ;        array := true
          rs.   w0              b4.  ;        pointer :=
          al    w2    x2         1   ;          pointer + 1
          bl    w1    x2         0   ;        length :=
          al    w0    x1         2   ;          2 + record(pointer)
          rs.   w0              b6.  ;      end
       ba. w0 +1
     a6: wa  w2 0        ; pointer:=
          bl    w0    x2         0   ;        pointer + length
          se.   w0             (b0.) ;      if record(pointer) =
          jl.                  a10.  ;        ident. no. then
          al    w0               1   ;      begin
          se.   w0             (b4.) ;        no:=if not array
       jl.     +8
       bl  w0  x2-1    ; change to two
       ls  w0  12      ; bytes for no of elements
       hl  w0  x2-2    ; in array in data statements
          rs.   w0              b5.  ;          else rec(point.-1)
          jl.                  a14.  ;          goto a14
     a10: al    w2    x2        +1   ;      end
          jl.                   a4.  ;      pointer := pointer + 1
     a12: bl.   w1        29 + f49.  ;    end
          al    w1    x1        +2   ;    comment: not found
          hs.   w1         4 + f34.  ;
          al    w0         2 + e86   ;
          hs.   w0         1 + f34.  ;
          rl.   w0             f54.  ;
          hs.   w0         2 + f34.  ;
          al    w0               0   ;      array := false
          al    w1               1   ;      no := 1
          al    w2               5   ;      length := 4 + 1
          al.   w3             f34.  ;      start := trouble
          jl.                  a16.  ;
     a14: dl.   w1              b5.  ;
          dl.   w3              b7.  ;
     a16: jl.                  (b3.) ;  end

  e.

  w.  i25:                       0   ;  first free word

      i21 = k - i20

e30 = e30 + i21     ; length := length + length pass 5;


      i.

e.                                   ;  end pass 5


m. rc 83.08.29 fortran, pass 5
▶EOF◀