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

⟦7300fa218⟧ TextFile

    Length: 89856 (0x15f00)
    Types: TextFile
    Names: »ftnpass23tx «

Derivation

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

TextFile

\f


;                                       fortran, pass 2, page 1

;                                       jørgen lindballe

;                       contents:

;              1        introduction
;              2        input records
;              3        output records
;              4        process

;                 4. 1      core store utilization
;                 4. 2      identifiers
;                 4. 3      logical constants
;                 4. 4      real constants
;                 4. 5      double precision constants
;                 4. 6      complex constants
;                 4. 7      trouble records

;              5        testprogram
;              6        the program
\f


;                                       fortran, pass 2, page 2






;   chapter 1: introduction


;   the purpose of pass 2 is to:

;   pack and recognize identifiers and to determine an implicit
;   type.

;   recognize reserved identifiers.

;   transform logical constants
;             real constants and
;             double precision constants.

;   recognize and transform complex constants and

;   copy all other input records.
\f


;                                       fortran, pass 2, page 3






;   chapter 2: input records


;   input  no. of                                        no.of
;   class elements basevalue bytevalue    elements       bytes

;      1     39         1    cl1base+ 0   ab...           1
;                                   +28                   1
;                                   +29   01...           1
;                                   +38   9               1

;      2      1        40    cl2base+ 0   .true.          1

;      3      1        41    cl3base+ 0   .false.         1

;      4      1        42    cl4base+ 0   <end unit>      1

;      5      2        43    cl5base+ 0   <end pass>      1
;                                   + 1    reserved       -

;      6      1        45    cl6base+ 0   <int. const.>   3

;      7      1        46    cl7base+ 0   <long const.>   5


;      8      1        47    cl8base+0    <real const.>   7

;      9      2        48    cl9base+0    <double cnst.>  9
;                                   +1    reserved        -

;     10      1        50    cl10base+0   (               1

;     11      1        51    cl11base+0   )               1

;     12      2        52    cl12base+0   +               1
;                                    +1   -               1

;     13      1        54    cl13base+0   ,               1
\f


;                                       fortran, pass 2, page 4




;     14     47        55    cl14base+0   *               1
;                                     1   /               1
;                                     2   =               1
;                                     3   .               1
;                                     4   <begin unit>    1
;                                     5   **              1
;                                     6   .lt.            1
;                                     7   .le.            1
;                                     8   .eq.            1
;                                     9   .ge.            1
;                                    10   .gt.            1
;                                    11   .ne.            1
;                                    12   .and.           1
;                                    13   .or.            1
;                                    14   .not.           1
;                                    15   .shift.         1
;                                    16  (.string.)       1
;                                    17   <end statement> 1
;                                    18   <end label>     1
;                                    19   to              1
;                                    20   goto            1
;                                    21   if              1
;                                    22   do              1
;                                    23   assign          1
;                                    24   call            1
;                                    25   continue        1
;                                    26   return          1
;                                    27   stop            1
;                                    28   read            1
;                                    29   write           1
;                                    30   program         1
;                                    31   subroutine      1
;                                    32   function        1
;                                    33   entry           1
;                                    34   logical         1
;                                    35   integer         1
;                                    36   long            1
;                                    37   real            1
;                                    38   double prec.    1
;                                    39   complex         1
;                                    40   dimension       1
;                                    41   common          1
;                                    42   data            1
;                                    43   equivalence     1
;                                    44   external        1
;                                    45   zone            1
;                                    46   <end line>      1

;     15      4       102   cl15base +0   <beg.clos.form> 3
;                                    +1   <beg.open form> 3
;                                    +2   <end format>    3
;                                    +3   <cont. format>  3

;     16      1       106   cl16base +0   <trouble>       4
\f


;                                       fortran, pass 2, page 5






;   chapter 3: output records


;          no. of                                     no.of
;         elements basevalue bytevalue    elements    bytes

;            41         1     base +  0   not used       -
;                                  + 40   not used       -

;             1        42     base +  0  <end unit>      1

;             1        43     base +  0  <end pass>      1

;             1        44     base +  0  <logical const> 2

;             1        45     base +  0  <integer const> 3

;             1        46     base +  0  <long constant> 5

;             1        47     base +  0  <real constant> 5

;             2        48     base +  0  <double const.> 9
;                                  +  1  <complex const> 9

;             1        50     base +  0   (              1

;             1        51     base +  0   )              1

;             2        52     base +  0   +              1
;                                  +  1   -              1

;             1        54     base +  0   ,              1

;            47        55     base +  0   *              1
;                                     1   /              1
;                                     2   =              1
;                                     3   .              1
;                                     4   <begin unit>   1
;                                     5   **             1
;                                     6   .lt.           1
;                                     7   .le.           1
;                                     8   .eg.           1
;                                     9   .ge.           1
;                                    10   .gt.           1
;                                    11   .ne.           1
;                                    12   .and.          1
;                                    13   .or.           1
;                                    14   .not.          1
\f


;                                       fortran, pass 2, page 6



;                                    15   .shift.        1
;                                    16  (.string.)      1
;                                    17   <end statement>1
;                                    18   <end label>    1
;                                    19   to             1
;                                    20   goto           1
;                                    21   if             1
;                                    22   do             1
;                                    23   assign         1
;                                    24   call           1
;                                    25   continue       1
;                                    26   return         1
;                                    27   stop           1
;                                    28   read           1
;                                    29   write          1
;                                    30   program        1
;                                    31   subroutine     1
;                                    32   function       1
;                                    33   entry          1
;                                    34   logical        1
;                                    35   integer        1
;                                    36   long           1
;                                    37   real           1
;                                    38   double prec.   1
;                                    39   complex        1
;                                    40   dimension      1
;                                    41   common         1
;                                    42   data           1
;                                    43   equivalence    1
;                                    44   external       1
;                                    45   zone           1
;                                    46   <end line>     1

;             4       102       base +0   <beg.clos.form>3
;                                    +1   <beg.open form>3
;                                    +2   <end format>   3
;                                    +3   <cont. format> 3

;             1       106       base +0   <trouble>      4

;             3       107       base +0   <ext. ident.>  1
;                                    +1   <impl.int.> 3+byte3
;                                    +2   <impl.real> 3+byte3

;           402       110       base +0    not used      -
;                                  +401    not used      -
\f


;                                       fortran, pass 2, page 7





;                                              reserved identifiers

;            29       512      basevalue + 0   iabs     1
;                                        + 1   abs      1
;                                        + 2   int      1
;                                        + 3   float    1
;                                        + 4   ifix     1
;                                        + 5   sngl     1
;                                        + 6   dble     1
;                                        + 7   cmplx    1
;                                        + 8   dabs     1
;                                        + 9   conjg    1
;                                        +10   dmax1    1
;                                        +11   dmin1    1
;                                        +12   dsign    1
;                                        +13   dexp     1
;                                        +14   cexp     1
;                                        +15   dlog     1
;                                        +16   clog     1
;                                        +17   dlog10   1
;                                        +18   dsin     1
;                                        +19   csin     1
;                                        +20   dcos     1
;                                        +21   ccos     1
;                                        +22   dsqrt    1
;                                        +23   csqrt    1
;                                        +24   datan    1
;                                        +25   datan2   1
;                                        +26   dmod     1
;                                        +27   res. for pass 3  -
;                                        +28   res. for pass 3  -

;           <no.>     541     base + 0   <0th identifier>1
;                                  + 1   <1st identifier>1
;                                  + 2   <2nd identifier>1
;                                 etc.
\f


;                                       fortran, pass 2, page 8





;   identifiers

;   the first time an identifier is met by pass 2 the following
;   bytes are output:

;         <ident no.>
;         <implicit type>
;         <ext. ident.>
;         <no. of bytes>
;         <packed
;          identifier,
;          3 iso-characters
;          per word>

;   where

;         <ident no.>     ::=  541 + <identifier no.>
;         <implicit type> ::=  <impl.integer> or <impl. real>
;         <ext. ident.>   ::=  107

;   if the number of characters in the identifier is not a mul-
;   tiple of 3, the last character(s) of the  record  is (are) 0.

;   the following times the identifier is met only
;         <ident no.>
;   is output.

;   it is noticed that the identifier numbers 512-538 are
;   used for reserved identifiers. the identifier numbers
;   539 and 540 are reserved for pass 3.
\f


;                                       fortran, pass 2, page 9






;   chapter 4:  process



;         4. 1  core store utilization


;   in a process of standardsize: 5000 words, the core store is
;   used in this way:

;         fileprocessor        :     768 words
;         general pass         :     561 words
;         pass 2, program      :     897 words
;                 working area :    1221 words
;         general pass buffers :     512 words
;         fileprocessor buffers:    1041 words
\f


;                                       fortran, pass 2, page 10






;         4. 2 identifiers


;         the address-table and the identifier-table.

;   the working area and the last part of the program form two
;   tables: an address-table and an identifier-table.

;   each time a new identifier is recognized it is stored in the
;   identifier-table from the first free byte. the identifiers
;   are linked together in chains by supplying each identifier
;   with the relative address of the next identifier of the chain.
;   the relative address of the first identifier of a chain is
;   stored in the address-table; this table consists of 32 bytes,
;   i.e. a byte for each of 32 chains.

;   an identifier is stored in the identifier table as shown:

;          <rel. addr. of the next ident. of the chain>
;          <identifier no.>,         <no. of halfwords>
;          <1st char <6 + 2nd char>, <3rd char <6 + 4th char>
;          <5th char <6 + 6th char>, <7th char <6 + 8th char>
;               etc.

;   it is noticed that 2 characters are packed in each byte. if
;   the number of characters is not dividible by 4, the last 
;   character(s) are packed identifier is(are) equal to 0.

;   in the last identifier - record of a chain the first two
;   byte(s) are equal to 0.

;   each time an identifier is met by pass 2, it is packed and
;   stored from the first free byte of the identifier-table,and
;   its length and a preliminary identifier no. is added. then
;   the chainnumber is calculated (the bytesum modulu 32), and
;   the contents of addresstable(chainno.) is found. this is the
;   relative address of the first identifier of the chain. the
;   two identifiers are compared, and if they are equal the ident.
;   no. is output. contrary the next record of the chain is found
;   by means of its relative address placed in the first byte of
;   the first record. the new record and the second record of
;   the chain are compared and so on.

;   as mentioned above the first byte of the last record is
;   equal to zero. especially if the chain is empty the byte of
;   the address-table is zero.
\f


;                                       fortran, pass 2, page 11




;   if the identifier is not recognized in the chain, the implicit
;   type is found and output together with the record. however.
;   the identifier itself is converted and repacked with 3 iso-
;   characters per word before it is output. the record is final-
;   ly added to the identifier-table by placing its relative
;   startaddress in the first byte of the foregoing record of the
;   chain, especially in the address-table if it is the first
;   record of the chain.

;   by the loading the ident. tab is partly filled with the iden-
;   tifier records of reserved identifiers, and the addresstable
;   is filled with the appropriate relative startaddresses.
;   if the identifier-table (except for the area occupied by the
;   reserved identifiers) consists of i bytes, and the average
;   length of packed identifiers is called <length>, then the
;   max. number of identifiers is determined by:

;                     i = max*(3 + <length>)

;   when i=2300 bytes and <length>= 6/2 bytes corresponding
;   to 6 characters, then the max. number of identifiers is ap-
;   proximately 380.


;         implicit type.

;   an identifier may be the name of a:

;         program
;         subroutine
;         function
;         statement function
;         entry
;         simple variable
;         array
;         label variable
;         zone
;         zone array
;         common

;   whatever it is pass 2 provides the identifier output-record
;   with an implicit typespecification, so that identifiers be-
;   ginning with one of the letters
;         i   j   k   l   m   n
;   are specified as integers, and all other as reals.
\f


;                                       fortran, pass 2, page 12






;         4. 3  logical constants


;   the two logical constants are transformed as follows:

;         logical constant     input            output

;              .true.      <cl2base>+0   <cl5base>+1  00..01
;              .false.     <cl3base>+0   <cl5base>+1  00..00
\f


;                                       fortran, pass 2, page 13






;         4. 4  real constants

;   a real constant is output from pass 1 as:

;   1:    4 bytes containing the mantissa as a non - negative
;         integer:

;               0 <= m <= 99 999 999 999

;   2.    2 bytes containing the adjusted exponent as an integer:

;               -1000  <= e <= 1000

;   so the value of the constant satisfies:

;         0 <= m*(10**e) <= (10**11 - 1)*(10**1000)

;   or

;         0 <= value <= 2**3359

;   let e(j) mean bit no. j of the exponent.
;   if e>= 0 then

;         e = e(14)*2**9 + ... + e(23)*2**0

;   if  e<0 then

;         e = -2**(n+2) + e(23-n)*2**n + ... + e(23)*2**0

;   where 2**(n+2) means the smallest 2 - power which is greater
;   than or equal to abs(e).

;   the real value is:
;         real = c(m) (/10**(2**(n+2))) *
;                     (10**(e(23-n)*2**n))*...*
;                     (10**(e(23)*2**0))

;   where c(m) means the mantissa converted to real format, and
;   where the floating division (/10**(2**(n+2))) is executed if
;   e<0 only.

;   if e<-512 this equality is used:

;         10**(2**10) = (10**(2**9)) * (10**(2**9))

;   i.e. the mantissa is instead divided two times by 10**512.
\f


;                                       fortran, pass 2, page 14




;   as a positive real must satisfy:

;         0.5*2**(-2048) <= real < 1*2**(2047)

;   (or      lower limit <= real <= upper limit

;   where

;         1.547173* 10**(-617)<lower limit<=1.547174*10**(-617)
;         1.615850* 10**(+616)<=upper limit<1.615851*10**(+616) )

;   it is not always possible to convert the constant. in these
;   cases overflow occurs during the floating multiplication:

;         *(10**(e(23-j)*2**(j)))

;   or underflows occurs during the last floating division:

;         /(10**(2**9))

;   and instead of the real a troublerecord no. e75+0:

;         real or complex constant outside allowed range

;   is output from pass 2.
\f


;                                       fortran, pass 2, page 15






;         4. 5 double precision constants


;   a double precision constant is output from pass 1 as:

;   1.    6 bytes containing the mantissa as a non - negative
;         integer:

;               0<= m<= (10**19) -1

;   2.    2 bytes containing the adjusted exponent as an integer:

;               -1000 <= e <= 1000

;   so the value of the constant satisfies:

;         0<= m*(10**e) <= (10**19 - 1)*(10**1000)

;   or

;         0 <= value <= 2**3385

;   let e(j) mean bit no. j of the exponent.
;   if e>= 0 then

;         e = e(14)*2**9 + ... + e (23)*2**0

;   if e<0 then

;         e = -2**(n+2) + e(23-n)*2**n+ ... + e(23)*2**0

;   where 2**(n+2) means the smallest 2 - power which is greater
;   then or equal to abs(e).

;   the double precision value is:

;         double = c(m) (/10**(2**(n+2)))*
;                       (10**(e(23-n)*2**n)) * ... *
;                       (10**(e(23)* 2**0))

;   where c(m) means the mantissa converted to double precision
;   format and where the double precision division:
;   (/10**(2**(n+2))) is executed if e<0 only.

;   if e< -512 this equality is used:

;         10**(2**10) = (10**(2**9)) * (10**(2**9))

;   i.e. the mantissa is instead divided two times by 10**512.
\f


;                                       fortran, pass 2, page 16




;   as a positive double precision constant must satisfy:

;         0.5*2**(-2048) <= double <= 1*2**(+2047)

;   (or      lower limit <= double <= upper limit
;   where
;         1.547173*10**(-617) <lower limit<=1.547174*10**(-617)
;         1.615850*10**(+616)<=upper limit<1.615851*10**(+616))

;   it is not always possible to convert the constant. in these
;   cases overflow occurs during the double precision multiplica-
;   tion:

;         *(10**(e(23-j)*2**(j)))

;   or underflow occurs during the last double precision division:

;         /(10**(2**9))

;   and instead of the double precision constant a troublerecord
;   no. e75+1:

;         double precision constant outside allowed range

;   is output from pass 2.
\f


;                                       fortran, pass 2, page 17





;        4.6 complex constants


;  a complex constant is defined in this way:

;        <complex constant> ::=
;              (<possible sign><real>,<possible sign><real>)

;  it may occur as an operand in arithmetical expressions,as
;  a parameter in the call of procedures and in data- statement.

;  without being a complex constant the construction:

;              (<possible sign><real>,<possible sign><real>)

;  may appear in a subscribted variable or in the call of a pro-
;  cedure:

;          name(<possible sign><real>,<possible sign><real>)

;  consequently a complex constant is output when pass 2 recog-
;  nizes the mentioned construction not following an identifier.
\f


;                                       fortran, pass 2, page 18






;        4.7  trouble records


;  if a programunit contains too many or too long identifiers
;  pass 2 writes:

;        process too small

;  and the translation is terminated.

;  if underflow or overflow occurs when converting a real con-
;  stant (i.e.

;        1.547174*10**(-617) <= real <= 1.615850*10**(+616)

;  is not satisfied) a troublerecord:

;         <class16base>+0   e75+0   0   0

;  (real or complex constant outside allowed range) is output
;  instead of the real or complex constant.

;  if underflow or overflouw occurs when convertering a double
;  precision constant (i.e.

;         1.547174*10**(-617)<=
;                   double precision constant <=
;                                     1.615850*10**(+616)

;   is not satisfied) a troublerecord:

;         <class 16base>+0   e75+1   0   0

;   (double precision constant outside allowed range) is output
;   instead of the double precision constant.
\f


;                                       fortran, pass 2, page 19






;   chapter 5:   testprogram



;   the testprogram fullfills the following demands:

;   the testinput contains the first record of each inputclass.
;   in this way each basevalue is tested, and furthermore the
;   first row of the action - state table is tested.

;   the number of characters of the identifiers is 1, 2, 3 or 4,
;   i.e. both odd and even characternumbers occur, and the number
;   of words of the packed identifier is 1 as well as 2.

;   the identifiers are so chosen that the chains contain 0, 1
;   or more identifiers.

;   some identifiers occur two times, and is tested that these
;   identifiers are found in the table the second time.

;   identifiers of implicit real as well as implicit integer type
;   occur, and it is tested that the right type is output.

;   the testinput contains an identifier followed by a construc-
;   tion like a complex constant. it is tested that this con-
;   struction is not taken for a complex constant, as it follows
;   an identifier.

;   it contains the reserved identifiers 2 times, so it is
;   tested that these identifiers are recognized.

;   the testprogram consists of more than one programunit, each
;   of which contains identifiers. it is tested that the identi-
;   fiertable is reset between two units.

;   it is tested that underflow and overflow during real- con-
;   verting are treated correctly. (a real constant, a real con-
;   stant in a non-complex construction and the real as well as
;   the imaginary part of a complex constant).

;   the sign of the real and imaginary part of a complex constant
;   is   1) empty,   2) +,   3) - .

;   the testinput contains a left parenthesis and a real constant
;   which do not form a complex constant. these elements must be
;   output correctly.
\f


;                                       fortran, pass 2, page 20






;      program a
;c     testprogram for pass 2
;      a1 = .true.
;      i1 = .false.
;      a12 = +12
;      i1 = 9000000
;      a12 = (-1.0)*3
;      h2 = 123456789012e-11 +
;     1     (0.0,+1.547174e-617)/(-0.99999999995,2.0)
;      1.547173e-617
;      1.615850e616
;      1.615851e616
;      (1.0,1.547173e-617,1.0)
;      (1.615851e616,1.0)
;      (1.0,1.547173e-617)
;      end



;      function i(1025.0,10000.0)
;      n1 = o1
;      format(x)
;      <illegal character>
;      end
\f


;                                       fortran, pass 2, page 21







;   chapter 6:  the program




s.   c12, d20, f26, g8, i103, j8      ;  begin pass 2
     k = e0

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

; definition of the identifiers in the identifier table:

i99=541  ; first free ident no
i100=0   ; word:      relative address of the next identifier in this chain
i101=2   ; halfword:  identifier no
i102=3   ; halfword:  no of bytes
i103=4   ; halfword:  first of text


                                     ;  action-state table

; class     1       2       3       4       5       6       7       8
;           9      10      11      12      13      14      15      16

; state

h.

   g1:   i2,j2,  i5,j1,  i6,j1, i11,j1, i12,j1,  i1,j1,  i1,j1,  i7,j1,
         i8,j1,  i2,j3,  i1,j1,  i1,j1,  i1,j1,  i1,j1,  i1,j1,  i1,j1,

   g2:   i2,j2,  i3,j1,  i3,j1,  i3,j1,  i3,j1,  i3,j1,  i3,j1,  i3,j1,
         i3,j1,  i4,j1,  i3,j1,  i3,j1,  i3,j1,  i3,j1,  i3,j1,  i3,j1,

   g3:  i10,j1, i10,j1, i10,j1, i10,j1, i10,j1, i10,j1, i10,j1,  i2,j5,
        i10,j1, i10,j1, i10,j1,  i2,j4, i10,j1, i10,j1, i10,j1, i10,j1,

   g4:  i10,j1, i10,j1, i10,j1, i10,j1, i10,j1, i10,j1, i10,j1,  i2,j5,
        i10,j1, i10,j1, i10,j1, i10,j1, i10,j1, i10,j1, i10,j1, i10,j1,

   g5:  i10,j1, i10,j1, i10,j1, i10,j1, i10,j1, i10,j1, i10,j1, i10,j1,
        i10,j1, i10,j1, i10,j1, i10,j1,  i2,j6, i10,j1, i10,j1, i10,j1,

   g6:  i10,j1, i10,j1, i10,j1, i10,j1, i10,j1, i10,j1, i10,j1,  i2,j8,
        i10,j1, i10,j1, i10,j1,  i2,j7, i10,j1, i10,j1, i10,j1, i10,j1,

   g7:  i10,j1, i10,j1, i10,j1, i10,j1, i10,j1, i10,j1, i10,j1,  i2,j8,
        i10,j1, i10,j1, i10,j1, i10,j1, i10,j1, i10,j1, i10,j1, i10,j1,

   g8:  i10,j1, i10,j1, i10,j1, i10,j1, i10,j1, i10,j1, i10,j1, i10,j1,
        i10,j1, i10,j1,  i9,j1, i10,j1, i10,j1, i10,j1, i10,j1, i10,j1,


   j0 = k
\f


;                                       fortran, pass 2, page 22






  b.                                 ;  head program

  ;   the head program first initializes pass 2 and then for
  ;   every input record it goes through an action(state,class)
  ;   into a new state(state,class) until pass 2 is finished
  ;   after having read and written 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.   w3             d13.  ;  entry pass 2
   d1:    rl.   w3             f10.  ;  class :=
          am.                  (f9.) ;    class(next record)
          rl    w2    x3         0   ;
          ad    w3             -12   ;  action :=
          as    w3             -12   ;     table(state,class)
          al.   w3    x3        j0.  ;  state :=
          rs.   w3              f9.  ;    table(state,class)
          jl.         x2        j0.  ;  goto action

  e.


w.                                   ;  global constants

   f1:                           0   ;  fba of free identifier table
   f2:                         541   ;  identifier number
   f3:                           0   ;  ffb of identifier table
   f4:                           0   ;  lwa of buffer
   f6:                           0   ;  upper buffer pointer
   f7:                           0   ;  lower buffer pointer
   f8:                           0   ;  length of last record
   f9:                           0   ;  state
  f10:                           0   ;  2x(class  - 1)
h.f11:            0,             1   ;  .true.
  f12:            0,             0   ;  .false.
  f13:            0,       e83 + 0   ;  trouble-
                  0,             0   ;    record no. e83 + 0
  f14:            0,       e83 + 1   ;  trouble-
                  0,             0   ;    record no. e83 + 1
                                 0   ;  recout(-1)
  f19:                     0, r. 9   ;  recout(0:8)
w.f20:                          32   ;  2x(no.of classes)
h.                               0   ;  record(-1)
  f21:                     0, r. 9   ;  record(0:8)
w.f22:                           0   ;  no. of classes - 1
h.f23:  39,1,1,1,2, 1,1,1,           ;  no.of elements
         2,1,1,2,1,47,4,1            ;              (class 1-16)
  f24:                   1, 0, r.15  ;  class base  (class 1-16)
  f25:  1,1,1,1,1, 3,5,7,            ;  no. of bytes(class 1-16)
        9,1,1,1,1, 1,3,4
w.f26:                           0   ;  flow
\f


;                                       fortran, pass 2, page 23





  b.                                 ;  action  1

  ;   action 1 writes a record and reads the next record.

  w.

   c1:    rl.   w0              f8.  ;  begin
          al.   w1             f21.  ;
          bl    w2    x1        +0   ;    write(length,record)
          jl.   w3              d4.  ;
          sn    w2             101   ;    if record = end line
          jl.   w3              e1.  ;       then carret.
          jl.   w3              d3.  ;    read record
          jl.                   d1.  ;  end

  e.


  b.  a1                             ;  action  2

  ;   action 2 stores an input record in the buffer and reads
  ;   the next record.

  w.

   c2:    al    w1               0   ;  begin
      a1: hl.   w0    x1       f21.  ;    for i := 0 step 1
          jl.   w3              d5.  ;        until (no - 1) do
          al    w1    x1         1   ;    bufin(record(i))
          se.   w1             (f8.) ;
          jl.                   a1.  ;
          jl.   w3              d3.  ;    read record
          jl.                   d1.  ;  end

  e.


  b.                                 ;  action  3


  ;   action 3 calls packmatch.

  w.                                 ;  begin
   c3:    jl.   w3             d11.  ;    packmatch
          jl.                   d1.  ;  end

  e.
\f


;                                       fortran, pass 2, page 24





  b.                                 ;  action  4

  ;   action 4 calls packmatch, it outputs the left parenthesis
  ;   and reads the next record.

  w.

   c4:    jl.   w3             d11.  ;  begin
          al    w0               1   ;    packmatch
          al.   w1             f21.  ;    write(1,record)
          jl.   w3              d4.  ;
          jl.   w3              d3.  ;    read record
          jl.                   d1.  ;  end

  e.


  b.  b1                             ;  action  5

  ;   action 5 writes a .true. - record and reads the next
  ;   record.
  w.
   c5:    al    w0               2   ;  begin
          al.   w1             f11.  ;
          jl.   w3              d4.  ;    write(2,true)
          jl.   w3              d3.  ;    read record
          jl.                   d1.  ;  end

  e.


  b.  b1                             ;  action  6

  ;   action 6 writes a .false. - record and reads the next
  ;   record.
  w.
   c6:    al    w0               2   ;  begin
          al.   w1             f12.  ;
          jl.   w3              d4.  ;    write(2,false)
          jl.   w3              d3.  ;    read record
          jl.                   d1.  ;  end

  e.
\f


;                                       fortran, pass 2, page 25





  b.  a1                             ;  action  7

  ;   action 7 converts and writes a real constant and reads the
  ;   next record.

  ;   if under- or overflow occurs, a troublerecord is output
  ;   instead of the real constant.

  w.
   c7:    al.   w1         1 + f21.  ;  begin
          jl.   w3              d8.  ;    convert real(record(1))
          al    w0               5   ;
          al.   w1             f21.  ;
          am.                 (f26.) ;    if flow = true
          sn    w1    x1         0   ;      then
          jl.                   a1.  ;      write(4,troublerec)
          al    w0               4   ;
          al.   w1             f13.  ;      else
      a1: jl.   w3              d4.  ;      write(5,record)
          jl.   w3              d3.  ;    read record
          jl.                   d1.  ;  end

  e.


  b.  a1                             ;  action  8

  ;   action 8 converts and writes a double precision constant
  ;   and it reads the next record.

  ;   if under- or overflow occurs, a troublerecord is output
  ;   instead of the double precision constant.

  w.

   c8:    al.   w1         1 + f21.  ;  begin
          jl.   w3              d7.  ;    convert double
          al    w0               9   ;              (record(1))
          al.   w1             f21.  ;
          am.                 (f26.) ;    if flow = true
          sn    w1    x1         0   ;      then
          jl.                   a1.  ;      write(4,troublerec)
          al    w0               4   ;
          al.   w1             f14.  ;      else
      a1: jl.   w3              d4.  ;      write(9,record)
          jl.   w3              d3.  ;    read record
          jl.                   d1.  ;  end

  e.
\f


;                                       fortran, pass 2, page 26





  b.  a2                             ;  action  9

  ;   in action 9 the contents of the buffer is converted to a
  ;   complex constant, the complex constant record is written
  ;   and the next record is read.

  ;   if under- or overflow occurs when converting the real or
  ;   the imaginary part, a troublerecord is output instead of
  ;   the complex constant.

  ;   it is noticed that the right parenthesis of the input
  ;   constant is not stored in the buffer.


  w.                                 ;  begin
   c9:    jl.   w3              d9.  ;    convert complex
          am.                 (f26.) ;
          sn    w1    x1         0   ;    if flow = true then
          jl.                   a1.  ;    begin
          al    w0               4   ;      write(4,troublerec)
          al.   w1             f13.  ;      goto read
          jl.   w3              d4.  ;    end
          jl.                   a2.  ;
      a1: hl.   w0         8 + f24.  ;
          ba.   w0               1   ;    record(0) :=
          hs.   w0             f21.  ;          cl9base + 1
          al    w0               9   ;
          al.   w1             f21.  ;
          jl.   w3              d4.  ;    write(9,record)
      a2: jl.   w3              d3.  ;    read record
          jl.                   d1.  ;  end

  e.
\f


;                                       fortran, pass 2, page 27





  b.  a5, b1                         ;  action 10

  ;   the buffer now contains one or more records which do not
  ;   form a complex constant.

  ;   action 10 empties the buffer to records, and if real con-
  ;   stants occur, they are converted to correct real constants;
  ;   the records are output.

  w.  b0:                        0   ;  length of record
      b1:                        0   ;  2*(class - 1)

  c10:                               ;  begin
      a1: jl.   w3              d6.  ;
          hs.   w0             f19.  ;    bufout(recout(0))
          jl.   w3             d12.  ;    find(recout,class,no)
          rs.   w0              b0.  ;
          rs.   w1              b1.  ;
          al    w2               1   ;    for i := 1 step 1
      a2: sl.   w2             (b0.) ;        until no-1 do
          jl.                   a3.  ;
          jl.   w3              d6.  ;
          hs.   w0    x2       f19.  ;    bufout(recout(i))
          al    w2    x2         1   ;
          jl.                   a2.  ;
      a3: rl.   w0              b0.  ;
          am.                  (b1.) ;
          se    w1    x1  -2*(:8-1:) ;    if class = 8 then
          jl.                   a4.  ;    begin
          al.   w1         1 + f19.  ;      convert real
          jl.   w3              d8.  ;              (recout(1))
          al    w0               5   ;      no := 5
          am.                 (f26.) ;      if flow = true then
          sn    w1    x1         0   ;      begin
          jl.                   a4.  ;        recout :=
          al    w0               4   ;          troublerecord
          al.   w1             f13.  ;        no := 4
          jl.                   a5.  ;      end
      a4: al.   w1             f19.  ;    end
      a5: jl.   w3              d4.  ;    write(no,recout)
          rl.   w0              f6.  ;    if upperpointer
          sl.   w0             (f7.) ;       .ge. lowerpointer
          jl.                   d1.  ;       then goto end
          jl.                   a1.  ;       else goto a1
                                     ;  end

  e.
\f


;                                       fortran, pass 2, page 28





  b.  a3                             ;  action 11

  ;   action 11 clears the free part of id-tab. by resetting the
  ;   address table, the address of the first free byte of the
  ;   identifier table and the identifier number, it
  ;   writes the end-unit record and it reads the next record.

  w.

                                     ;  begin


   c11:    jl.   w3             d20.  ;  initialize identifiers
          rl.   w0              f8.  ;
          al.   w1             f21.  ;
          jl.   w3              d4.  ;    write(length,end unit)
          jl.   w3              d3.  ;    read record
          jl.                   d1.  ;  end

  e.


  b.                                 ;  action 12

  ;   action 12 writes the end - pass record and finis pass 2.

  w.

  c12:    rl.   w0              f8.  ;  begin
          al.   w1             f21.  ;    write(length,end pass)
          jl.   w3              d4.  ;    goto finis
          jl.                  d14.  ;  end

  e.
\f


;                                       fortran, pass 2, page 29






; assignments to the elements of the action - state table


     i1 =  c1 - j0 ,     j1 =  g1 - j0,
     i2 =  c2 - j0 ,     j2 =  g2 - j0,
     i3 =  c3 - j0 ,     j3 =  g3 - j0,
     i4 =  c4 - j0 ,     j4 =  g4 - j0,
     i5 =  c5 - j0 ,     j5 =  g5 - j0,
     i6 =  c6 - j0 ,     j6 =  g6 - j0,
     i7 =  c7 - j0 ,     j7 =  g7 - j0,
     i8 =  c8 - j0 ,     j8 =  g8 - j0,
     i9 =  c9 - j0 ,
    i10 = c10 - j0 ,
    i11 = c11 - j0 ,
    i12 = c12 - j0



  b.  a1, b2                         ;  proc initiate

  ;   the procedure initiate calculates the fba of the identi-
  ;   fier table and the lwa of the buffer, and initializes the
  ;   identifiers

  ;   furthermore the pointer of the identifier table and the
  ;   upper as well as the lower pointer of the buffer are reset.

  ;   the interrupt mask and the startaddress of the interrupt-
  ;   sequence are set, so that under- and overflow are responced
  ;   when a real or double is converted. the exception register
  ;   is set for high precision.

  ;   finally the initial state is set to 1, the input class
  ;   table is filled, and the first record is read.

  ;   the procedure is called from the headprogram in this way:

  ;       jl.   w3             d13.
\f


;                                       fortran, pass 2, page 30




  w.  b1:                        0   ;  return address
      b2:               8.30000000   ;  interrupt mask

  d13:    rs.   w3              b1.  ;  begin
          al.   w3             i25.  ;
          rs.   w3              f1.  ;    fba of ident. table
            jl.   w3               d20.  ;    initialize identifiers
          rl.   w3          4 + e9.  ;  
          rs.   w3              f4.  ;    lwa of buffer
          rs.   w3              f6.  ;    upperpointer :=
          rs.   w3              f7.  ;      lowerpointer := lwa
          rl.   w0              b2.  ;    set interrupt
          al.   w3             d15.  ;      (interrupt addr.,
          jd              1<11 + 0   ;       interrupt mask )
          xl.                    0   ;    precision := high
          al.   w3              g1.  ;
          rs.   w3              f9.  ;    state := 1
          rl.   w3             f20.  ;
          al    w3    x3        -2   ;
          ls    w3              -1   ;
          rs.   w3             f22.  ;    no.of classes - 1
          al    w2               0   ;
          bz.   w3             f24.  ;    for class := 1
      a1: ba.   w3    x2       f23.  ;        step 1 until
          hs.   w3    x2   1 + f24.  ;        (no.of classes-1) do
          al    w2    x2         1   ;        base(class+1):=
          se.   w2            (f22.) ;        base(class)+no(class)
          jl.                   a1.  ;
          bz.   w0         4 + f24.  ;
          ba.   w0               1   ;    true(0) :=
          hs.   w0             f11.  ;       false(0) :=
          hs.   w0             f12.  ;       cl5base + 1
          bz.   w0        15 + f24.  ;    troublerecord(0) :=
          hs.   w0             f13.  ;      cl16base
          hs.   w0             f14.  ;
          jl.   w3              d3.  ;    read record
          jl.                  (b1.) ;  end

  e.
\f


;                                       fortran, pass 2, page 31





  b.                                 ;  proc finis

  ;   the procedure finis performs a jump return to the general
  ;   pass. it is called from action 12 in this way:

  ;       jl.                  d14.  ;  goto finis

  w.                                 ;  begin
  d14:    jl.                   e7.  ;    goto general pass
                                     ;  end

  e.


  b.  a2, b3                         ;  proc read record

  ;   the procedure read record reads the next record and stores
  ;   it in the array record(0:8), and it finds the class and
  ;   the length of the record; it is called from initiate and
  ;   from most actions in this way:

  ;       jl.   w3              d3.  ;  read record

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

   d3:    ds.   w1              b1.  ;  begin
          ds.   w3              b3.  ;
          jl.   w3              e2.  ;
          hs.   w2             f21.  ;    record(0) := inbyte
          bz    w0               5   ;
          jl.   w3             d12.  ;    find
          rs.   w1             f10.  ;      (record(0),class,no)
          rs.   w0              f8.  ;
          al    w1               0   ;
      a1: al    w1    x1         1   ;
          sl.   w1             (f8.) ;    for i := 1 step 1
          jl.                   a2.  ;        until n - 1 do
          jl.   w3              e2.  ;
          hs.   w2    x1       f21.  ;    record(i) := inbyte
          jl.                   a1.  ;
      a2: dl.   w1              b1.  ;
          dl.   w3              b3.  ;
          jl          x3         0   ;  end

  e.
\f


;                                       fortran, pass 2, page 32





  b.  a2, b3                         ;  proc write record
                                     ;       (no., startaddress)

  ;   the procedure write record, which is called from most
  ;   actions and from packmatch writes a record. it is called
  ;   in this way:

  ;       al    w0   <no. of bytes>
  ;       al.   w1   <startaddress>.
  ;       jl.   w3              d4.

  w.  b1:                        0   ;  no. of bytes
      b2:                        0   ;  w2 - store
      b3:                        0   ;  return - address

   d4:    rs.   w0              b1.  ;  begin
          ds.   w3              b3.  ;
          al    w2               0   ;    i := 0
      a1: sl.   w2             (b1.) ;    if i<no then
          jl.                   a2.  ;    begin
          am          x2         0   ;
          hl    w0    x1         0   ;
          jl.   w3              e3.  ;      outbyte(startaddr.+i)
          al    w2    x2         1   ;      i := i + 1
          jl.                   a1.  ;      goto a1
      a2: rl.   w2              b2.  ;    end
          jl.                  (b3.) ;  end

  e.
\f


;                                       fortran, pass 2, page 33





  b.  a1, b2                         ;  proc bufin(byte)

  ;   the procedure bufin which is called from action 2 and
  ;   from packmatch places the byte in the buffer, and the upper
  ;   buffer pointer (pointing at the first free byte) is de-
  ;   creased by one.

  ;   before this it is checked that the buffer does not reach
  ;   the ident table; if this occurs the translation is termi-
  ;   nated after the message:

  ;                   process too small.

  ;   the byte may be a letter or a digit of an identifier or it
  ;   may be ( + - , or a part of a real constant in an expected
  ;   complex constant.

  ;   the number of bytes in the buffer is equal to:

  ;         lower buffer pointer  -  upper buffer pointer

  ;   it may be called in this way:

  ;       hl.   w0      <byteaddr.>.
  ;       jl.   w3              d5.

  w.  b1:                        0   ;  return address
      b2: <:<10>process too small<0>:>

   d5:    rs.   w3              b1.  ;  begin
          rl.   w3              f6.  ;  if upper pointer <
          sl.   w3             (f3.) ;       ffw of ident table
          jl.                   a1.  ;    then
          al.   w1              b2.  ;    alarm(process too small)
          jl.                   e5.  ;    else
      a1: hs    w0    x3         0   ;    begin
          al    w3    x3        -1   ;      buffer(u.p.) :=byte
          rs.   w3              f6.  ;      u.p. := u.p. - 1
          jl.                  (b1.) ;    end
                                     ;  end

  e.
\f


;                                       fortran, pass 2, page 34





  b.  a1, b1                         ;  proc bufout(byte)

  ;   the procedure bufout, which is called from packmatch,
  ;   convert complex and from action 10, takes the next byte
  ;   from the buffer, and the lower buffer pointer (which
  ;   points at this byte) is decreased by one.

  ;   if the buffer is now empty, the lower as well as the upper
  ;   buffer pointer are reset.

  ;   if the buffer is empty, the outputbyte is equal to zero.

  ;   the byte may be a letter or a digit in an identifier or it
  ;   may be ( + - , or a part of a real constant.

  ;   the number of bytes in the buffer is equal to:

  ;         lower buffer pointer  -  upper buffer pointer

  ;   it must be called in this way:

  ;                                  ;  if lower > upper then
  ;       jl.   w3              d6.  ;    bufout(byte)
  ;                                  ;    (w0) = byte

  w.  b1:                        0   ;  return address

   d6:    rs.   w3              b1.  ;  begin
          rl.   w3              f7.  ;  
          bz    w0    x3         0   ;    byte := buffer(l.p.)
          al    w3    x3        -1   ;    l.p. := l.p. - 1
          rs.   w3              f7.  ;
          sh.   w3             (f6.) ;    if l.p. <= u.p.
          jl.                   a1.  ;
      a0: jl.                  (b1.) ;      then
      a1: rl.   w3              f4.  ;    begin
          rs.   w3              f6.  ;      lowerpointer :=
          rs.   w3              f7.  ;      upperpointer := lwa
          rs    w0    x3         0   ;      buffer(0) := 0
          jl.                   a0.  ;    end
                                     ;  end

  e.
\f


;                                       fortran, pass 2, page 35





  b.  a6, b13                        ;  proc convert double
                                     ;              (io-addr.)

  ;   the procedure convert double converts an 8-byte double
  ;   precision constant to a correct 8-byte output double pre-
  ;   cision constant. the constant is positive as a + or - is
  ;   already output.

  ;   if under- or overflow occurs the boolean flow is set
  ;   to true.

  ;   when a double has been read this procedure is called from
  ;   action 8 in this way:

  ;       al.   w1    <in-out startaddr.>.
  ;       jl.   w3              d7.


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

  h.             0,    4,  320,    0 ;  10**(2**0)
                 0,    0,    0,    0 ;

                 0,    7,  400,    0 ;  10**(2**1)
                 0,    0,    0,    0 ;

                 0,   14,  312, 2048 ;  10**(2**2)
                 0,    0,    0,    0 ;

                 0,   27,  381, 1924 ;  10**(2**3)
                 0,    0,    0,    0 ;

                 0,   54,  284,  889 ;  10**(2**4)
               111, 3088,    0,    0 ;

                 0,  107,  315, 2229 ;  10**(2**5)
               362,  173,  389, 2767 ;

                 0,  213,  388, 3843 ;  10**(2**6)
               466, 2047,  125,  875 ;

                 0,  426,  295, 1864 ;  10**(2**7)
               498, 1539,  332, 1648 ;

                 0,  851,  340, 4061 ;  10**(2**8)
               254, 3703,  462, 3911 ;

      b5:        0, 1701,  454,  820 ;  10**(2**9)
                43, 2712,  116, 2275 ;

  w.  b7:                        0   ;  exp < -512
\f


;                                       fortran, pass 2, page 36



      b8:                       23   ;
      b9:                       46   ;

   w.                            0   ; exp0
                                 0   ;
                                 0   ;
     b10:                        0   ; op0

                                 0   ; exp1
                                 0   ;
                                 0   ;
     b11:                        0   ; op1

     b12:                        0   ;
     b13:                        0   ;




   d7:    ds.   w1              b1.  ;  begin
          ds.   w3              b3.  ;
          rs.   w3              b7.  ;
          al    w0               0   ;    flow := false
          rs.   w0             f26.  ;
          rl.   w1              b1.  ;    double :=
          al.   w2             b11.  ;      convert(m1)
          jl.   w3             d16.  ;
          rl.   w0        -6 + b11.  ;    double :=
          wa.   w0              b9.  ;      double * (2**46)
          rs.   w0        -6 + b11.  ;
          am.                  (b1.) ;
          al    w1              +2   ;    double0 :=
          al.   w2             b10.  ;      convert(m2)
          jl.   w3             d16.  ;
          rl.   w0        -6 + b10.  ;    double0 :=
          wa.   w0              b8.  ;      double0 * (2**23)
          rs.   w0        -6 + b10.  ;
          al.   w0             b10.  ;
          al.   w1             b11.  ;    double :=
          al.   w2             b11.  ;      double + double0
          jl.   w3             d18.  ;
          am.                  (b1.) ;
          al    w1              +4   ;    double0 :=
          al.   w2             b10.  ;     convert(m3)
          jl.   w3             d16.  ;
          al.   w0             b10.  ;
          al.   w1             b11.  ;    double :=
          al.   w2             b11.  ;      double + double0
          jl.   w3             d18.  ;
\f


;                                       fortran, pass 2, page 36a



          am.                  (b1.) ;
          rl    w3              +6   ;
          ns    w3               5   ;
          bl    w2               5   ;
          al    w2    x2        14   ;    l := 14
          ls    w2               3   ;    if e<0 then
          sl    w3               0   ;    begin
          jl.                   a3.  ;      l := 23 - n
          ls    w3               1   ;      double :=
          al    w2    x2        -8   ;        double:
          rs.   w2              b7.  ;        10**(2**(n+2))
          rs.   w3             b13.  ;    end
          al.   w0             b11.  ;
          sn    w2               0   ;
          am                    -8   ;
          al.   w1    x2   14 + b5.  ;
          al.   w2             b11.  ;
          jl.   w3             d19.  ;
          rl.   w2              b7.  ;
          rl.   w3             b13.  ;
      a3: ls    w3               1   ;    for j := l
          al    w2    x2        -8   ;      step 1 until 23 do
          sn    w3               0   ;      if e(j) = 1 then
          jl.                   a5.  ;        double := double*
          sl    w3               0   ;               10**(2**(23-j))
          jl.                   a3.  ;
          ds.   w3             b13.  ;
          al.   w0             b11.  ;
          al.   w1    x2    6 + b5.  ;
          al.   w2             b11.  ;
          jl.   w3             d17.  ;
          dl.   w3             b13.  ;
          jl.                   a3.  ;
      a5: am.                  (b7.) ;    if exp < -512 then
          se    w1    x1         0   ;       double := double :
          jl.                   a6.  ;          10**(2**9)
          al.   w0             b11.  ;
          al.   w1          6 + b5.  ;
          al.   w2             b11.  ;
          jl.   w3             d19.  ;
      a6: dl.   w1        -4 + b11.  ;
          dl.   w3             b11.  ;
          am.                  (b1.) ;
          ds    w1              +2   ;
          am.                  (b1.) ;
          ds    w3              +6   ;
          dl.   w1              b1.  ;
          dl.   w3              b3.  ;
          jl          x3        +0   ;  end


  e.
\f


;                                       fortran, pass 2, page 37





  b.  a6, b7                         ;  proc convert real
                                     ;              (io-addr.)

  ;   the procedure convert real converts a 6-byte real constant
  ;   to a correct 4-byte output real constant. the constant is
  ;   positive as a + or - is already output.

  ;   the procedure is called from action 7 when a real constant
  ;   is read, from action 10 when a real (in a non-complex con-
  ;   stant) is taken from the buffer and from convert complex
  ;   when a complex constant in the buffer is converted.

  ;   if underflow or overflow occurs the boolean flow is set
  ;   to true.

  ;   it is called in this way:

  ;       al.   w1      <in-out startaddr.>.
  ;       jl.   w3              d8.


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

  h.          1280,    0,    0,    4 ;  10**(2**0)
              1600,    0,    0,    7 ;  10**(2**1)
              1250,    0,    0,   14 ;  10**(2**2)
              1525, 3600,    0,   27 ;  10**(2**3)
              1136, 3556, 3576,   54 ;  10**(2**4)
              1262,  726, 3393,  107 ;  10**(2**5)
              1555, 3087, 2640,  213 ;  10**(2**6)
              1181, 3363, 3660,  426 ;  10**(2**7)
              1363, 3957, 4061,  851 ;  10**(2**8)
      b5:     1816, 3280, 1397, 1701 ;  10**(2**9)

  w.  b7:                        0   ;  exp < -512
\f


;                                       fortran, pass 2, page 38




   d8:    ds.   w1              b1.  ;  begin
          ds.   w3              b3.  ;
          rs.   w3              b7.  ;
          al    w0               0   ;    flow := false
          rs.   w0             f26.  ;
          rl.   w1             (b1.) ;    real :=
          ci    w1              23   ;      convert(m)
          am.                  (b1.) ;
          rl    w3              +2   ;
          ci    w3               0   ;
          fa    w1               6   ;
          am.                  (b1.) ;
          rl    w3              +4   ;
          ns    w3               5   ;
          bl    w2               5   ;
          al    w2    x2        14   ;    l := 14
          ls    w2               2   ;
          sl    w3               0   ;    if e<0 then
          jl.                   a3.  ;      l := 23 - n
          ls    w3               1   ;      real :=
          al    w2    x2        -4   ;        real:
          sn    w2               0   ;        10**(2**(n+2))
          am                    -4   ;
      a1: fd.   w1    x2    6 + b5.  ;
      a2: rs.   w2              b7.  ;
      a3: ls    w3               1   ;    for j := l
          al    w2    x2        -4   ;      step 1 until 23 do
          sn    w3               0   ;      if e(j) = 1 then
          jl.                   a5.  ;        real := real*
          sh    w3               0   ;               10**(2**(23-j))
          fm.   w1    x2    2 + b5.  ;
          jl.                   a3.  ;
      a5: am.                  (b7.) ;    if exp < -512 then
          sn    w1    x1         0   ;      real := real:
          fd.   w1          2 + b5.  ;           10**(2**9)
      a6: am.                  (b1.) ;
          ds    w1              +2   ;
          dl.   w1              b1.  ;
          dl.   w3              b3.  ;
          jl          x3        +0   ;  end


  e.
\f


;                                       fortran, pass 2, page 39





  b.  a9, b7                         ;  proc convert complex

  ;   the procedure convert complex converts a complex constant
  ;   to a correct 8-byte output complex constant.

  ;   it is called from action 9 when a complex constant (except
  ;   for )) is stored in the buffer. the output constant is
  ;   stored in the array record.

  ;   the procedure is called in this way:

  ;       jl.   w3              d9.  ;  convert complex

  w.  b0:                        0   ;  w0 - store
      b1:                        0   ;  w1 - store
      b2:                        0   ;  w2 - store
      b3:                        0   ;  w3 - store
      b4:                        0   ;  sign
  h.  b5:                  0, r. 6   ;  real(0:5)
  w.  b6:                        0   ;  temp. address
                        8.40000000   ;
      b7:               8.00000000   ;  -1.0
\f


;                                       fortran, pass 2, page 40




      a1: rs.   w3              b6.  ;  begin
          jl.   w3              d6.  ;    begin sign
          al    w0              +1   ;      bufout(( or ,)
          rs.   w0              b4.  ;      sign := +1
      a2: jl.   w3              d6.  ;
          bz.   w1         7 + f24.  ;      temp := bufout
          sn    w0    x1         0   ;      if temp=real ident
          jl.                   a3.  ;        then goto end sign
          al    w2              -1   ;        else
          bz.   w1        11 + f24.  ;        if temp = -
          sn    w0    x1         1   ;        then sign := -1
          rs.   w2              b4.  ;      goto a2
          jl.                   a2.  ;
      a3: jl.                  (b6.) ;    end sign

      a4: rs.   w3              b6.  ;    begin real
          al    w1               0   ;      for i := 0 step 1
      a5: jl.   w3              d6.  ;        until 5 do
          hs.   w0    x1        b5.  ;        real(i) := bufout
          al    w1    x1         1   ;
          sh    w1               5   ;
          jl.                   a5.  ;
          al.   w1              b5.  ;      convert real
          jl.   w3              d8.  ;        (real(0))
          dl.   w3          2 + b5.  ;
          am.                  (b4.) ;
          se    w1    x1        +1   ;
          jl.                   a6.  ;      if sign = -1
          fm.   w3              b7.  ;        then real:=real*(-1.0)
      a6: jl.                  (b6.) ;    end real

   d9:    ds.   w1              b1.  ;    comment: entry
          ds.   w3              b3.  ;
          jl.   w3              a1.  ;    1st sign
          jl.   w3              a4.  ;    1st real
          am.                 (f26.) ;    if flow = true
          sn    w1    x1         0   ;      then
          jl.                   a8.  ;      begin
      a7: rl.   w0              f7.  ;        for i := 1 step 1
          sh.   w0             (f6.) ;          while lower>upper do
          jl.                   a9.  ;          bufout
          jl.   w3              d6.  ;        goto end
          jl.                   a7.  ;      end
      a8: ds.   w3         3 + f21.  ;    record(1) := sign*real
          jl.   w3              a1.  ;
          jl.   w3              a4.  ;    2nd sign
          ds.   w3         7 + f21.  ;    2nd real
      a9: dl.   w1              b1.  ;    record(5) := sign*real
          dl.   w3              b3.  ;
          jl         x3          0   ;  end

  e.
\f


;                                       fortran, pass 2, page 41






  b.  a4, b14                        ;  proc idpack

  ;   the procedure idpack packs and outputs a new identifier.
  ;   3 iso - characters are packed in each word, and empty posi-
  ;   tions in the last word are filled with zeroes.

  ;   it is called from packmatch in this way:

  ;       al    w0         <no. of char.>
  ;       al.   w1      <startaddr. of ident.>.
  ;       jl.   w3             d10.

  w.  b0:                        0   ;  charno.
      b1:                        0   ;  start-addr.
      b2:                        0   ;  w2-store
      b3:                        0   ;  return-addr.
      b4:                        0   ;  bytno., next
      b5:                        2   ;
      b6:                        3   ;
     b10:                        0   ;  word
     b11:                        0   ;  char.
     b12:                        0   ;  byte
     b13:                        0   ;  i
\f


;                                       fortran, pass 2, page 42




  d10:    ds.   w1              b1.  ;  begin
          ds.   w3              b3.  ;
          wa.   w0              b5.  ;
          al    w3               0   ;    bytno :=
          wd.   w0              b6.  ;      ((charno+2)/3)*2
          ls    w0               1   ;
          rs.   w0              b4.  ;
          al    w0               1   ;    write(1,bytno)
          al.   w1          1 + b4.  ;
          jl.   w3              d4.  ;
          al    w3               3   ;    next := 3
          rs.   w3              b4.  ;
          al    w3               0   ;    for i := 0 step 1
      a0: se.   w3             (b4.) ;      until (charno - 1) do
          jl.                   a1.  ;    begin
          ds.   w1             b11.  ;      if i=next then
          ds.   w3             b13.  ;
          al    w0               2   ;      begin
          al.   w1             b10.  ;        write(2,word)
          jl.   w3              d4.  ;
          rl.   w1              b4.  ;        next := next + 3
          al    w1    x1         3   ;
          rs.   w1              b4.  ;
          dl.   w1             b11.  ;      end
          dl.   w3             b13.  ;
      a1: sz    w3               1   ;
          jl.                   a2.  ;      if i=even then
          bz.   w2             (b1.) ;      begin
          rl.   w1              b1.  ;        byte := start(i/2)
          al    w1    x1         1   ;
          rs.   w1              b1.  ;        byte := byte<12
          ls    w2              12   ;      end
      a2: al    w1               0   ;
          ld    w2               6   ;
          sh    w1              29   ;      char := byte<6
          al    w1    x1        78   ;      if char<30 then
          al    w1    x1        18   ;        char := char + 96 else
          ls    w1              16   ;        char := char + 18
          ld    w1               8   ;
          al    w3    x3         1   ;      word := word<8 + char
          se.   w3             (b0.) ;
          jl.                   a0.  ;    end
      a3: sl.   w3             (b4.) ;
          jl.                   a4.  ;    for i := i + 1
          ld    w1               8   ;      while i<next do
          al    w3    x3         1   ;      word := word<8 + 0
          jl.                   a3.  ;
      a4: rs.   w0             b10.  ;    write(2,word)
          al    w0               2   ;
          al.   w1             b10.  ;
          jl.   w3              d4.  ;
          rl.   w2              b2.  ;
          jl.                  (b3.) ;  end

  e.
\f


;                                       fortran, pass 2, page 43





  b.  a11, b7                        ;  proc packmatch

  ;   the procedure packmatch is called from action 3 and 4 in
  ;   this way:

  ;       jl.   w3             d11.

  ;   the new identifier is taken from the buffer and packed
  ;   (2 characters per byte) in the identifiertable from the
  ;   first free byte; at the same time its chainnumber is cal-
  ;   culated.

  ;   then a search trough its chain is performed; if the iden-
  ;   tifier is found and identno.>0 its identifier number is output.

  ;   if the identno. is < 0 the sign is reversed, the implicit
  ;   type is determined, and the identifier record is output.

  ;   contrary the new identifier is linked to the chain, and
  ;   the identifier number and the address of the first free
  ;   byte are updated.  then the implicit type is determined and
  ;   the identifier record is output.

  w.  b1:                        0   ;  returnaddress
      b2:                        0   ;  bytno
      b4:                        0   ;  l(oldident)
  h.  b5:           0,         107   ;  impltype, extident
  w.  b6:                 2.011111
      b7:                        0   ;  no. of char.
\f


;                                       fortran, pass 2, page 44




  d11:    rs.   w3              b1.  ;  begin packmatch

          al    w2               0   ;    begin pack
          rs.   w2              b2.  ;      bytno := sum := 0
      a1: jl.   w3              d6.  ;      comment : next pack
          ls    w0               6   ;
          rl    w1               0   ;      tempack :=
          jl.   w3              d6.  ;        bufout<6 + bufout
          wa    w0               2   ;
          wa    w2               0   ;      sum := sum + tempack
          rl.   w1              b2.  ;
          al    w1    x1         1   ;      bytno := bytno + 1
          rs.   w1              b2.  ;
          am.                  (f3.) ;      newident(2+bytno) :=
          hs    w0    x1    i103-1   ;        tempack
          rl.   w3              f6.  ;      if upperpointer <
          se.   w3             (f7.) ;         lowerpointer
          jl.                   a1.  ;         then goto nextpack
            al    w3                  0   ;
            am.                    (f3.)  ;
            hs    w3    x1         i103   ;      store a zero halfword
          al    w3              -1   ;      charno :=
          sz    w0              63   ;        if last char = 0
          al    w3               0   ;        then -1
          rs.   w3              b7.  ;        else 0
          rl.   w3              f3.  ;
          rl.   w0              b2.  ;      newident(2) := bytno
          hs    w0    x3      i102   ;
          ls    w0               1   ;      charno :=
          wa.   w0              b7.  ;        charno +
          rs.   w0              b7.  ;          bytno*2
          rl.   w0              f2.  ;      newident(1) := idno
          hs    w0    x3      i101   ;
          al    w0               0   ;      newident(0) := 0
          rs    w0    x3         0   ;      chainno := sum mod 32
          la.   w2              b6.  ;    end pack
            ls    w2                   1   ;

          al.   w2    x2       i23.  ;    begin search
          rs.   w2              b4.  ;      l(oldid):=l(at(chain))
      a3: rl.   w2             (b4.) ;      comment : next ident
          sn    w2               0   ;      reladdr := oldident
          jl.                   a9.  ;      if reladdr = 0
          wa.   w2              b4.  ;        then goto notfound
          rs.   w2              b4.  ;      l(oldident) :=
          al    w1               0   ;        l(oldident)+reladdr
      a5: am.                  (b4.) ;      j := 0
          bz    w0    x1      i102   ;      comment: next byte
          am.                  (f3.) ;      if oldident(2+j) .ne.
          bz    w3    x1      i102   ;         newident(2+j)
          se    w0    x3         0   ;         then goto next id
          jl.                   a3.  ;         else if j<oldid(2)
      a7: al    w1    x1         1   ;
          am.                  (b4.) ;         then goto next byte
          bz    w3            i102   ;         else goto found
          sh    w1    x3         0
          jl.                   a5.  ;    end search
\f


;                                       fortran, pass 2, page 45




          rl.   w2              b4.  ;    begin found
          bl    w0    x2      i101   ;      if identno. < 0 then
          sl    w0               0   ;      begin
          jl.                   a8.  ;        identno. :=
          ac    w0              (0)  ;          -identno.
          hs    w0    x2      i101   ;        goto a10
          jl.                  a10.  ;      end
      a8: al    w0               1   ;
          rl.   w1              b4.  ;
          al    w1    x1      i101   ;      write(1,oldident(1))
          jl.   w3              d4.  ;      goto end packmatch
          jl.                  a11.  ;    end found

      a9: rl.   w2              f3.  ;    begin notfound
          al    w1    x2        +0   ;
          ws.   w1              b4.  ;      oldident(0) :=
          rs.   w1             (b4.) ;        l(newid)-l(oldid)
          al    w1    x2    i103+1   ;
          wa.   w1              b2.  ;      l(newident) :=
            ls    w1              -1   ;
            ls    w1               1   ;
          rs.   w1              f3.  ;        l(newident)+3+bytno
          rl.   w1              f2.  ;
          al    w1    x1        +1   ;      idno :=
          rs.   w1              f2.  ;        idno + 1
     a10: bz    w1    x2      i103   ;
          ls    w1              -6   ;      impltype :=
          al    w3             108   ;        if i .le. firstchar
          sl    w1               9   ;             .and.
          sl    w1              15   ;           firstchar .le. n
          al    w3    x3        +1   ;           then integer
          hs.   w3              b5.  ;           else real
          al    w0               1   ;
          al    w1    x2      i101   ;
          jl.   w3              d4.  ;      write(1, idno)
          al    w0               2   ;
          al.   w1              b5.  ;      write(2,
          jl.   w3              d4.  ;        impltype + extident)
          rl.   w0              b7.  ;      write(charno.,
          al    w1    x2      i103   ;            newident(2))
          jl.   w3             d10.  ;    end not found


     a11: jl.                  (b1.) ;  end packmatch


  e.
\f


b. a5, b3    ; proc initialize identifiers

w.                                      ;

; w3=return

    b1:     31                          ;
    b2:     -2                          ;
    b3:     0                           ;  return address

    d20:    rs.   w3              b3.   ;  save return
            al    w0               0    ;
            al    w1               0    ;
    a2:     rs.   w0    x1       i23.   ;  clear address table
            al    w1    x1        +2    ;
            sh    w1              62    ;
            jl.                   a2.   ;
            al    w1             i99    ;  idno:=first free ident no
            rs.   w1              f2.   ;
            al.   w3             i24.   ;  address of the first identifier
    a3:     bl    w1    x3      i101    ;next identifier:
            ac    w1    x1              ;
            sh    w1               0    ;
            hs    w1    x3      i101    ;  if identno>0 then identno:=-identno
            al    w1               0    ;
            rs    w1    x3      i100    ;  chain:=0
            al    w2    x3    i103-1    ;
            ba    w2    x3      i102    ;  last byte of the text
    a4:     ba    w1    x2              ;  calculate sum
            al    w2    x2        -1    ;
            sl    w2    x3      i103    ;
            jl.                   a4.   ;
            la.   w1              b1.   ;  chain no:= sum mod 32
            ls    w1               1    ;
            al.   w1    x1       i23.   ;
            al    w0               0    ;
    a5:     wa    w1    x1      i100    ;  find the last identifier of the chain
            se    w0   (x1      i100)   ;
            jl.                   a5.   ;
            ac    w0    x1              ;
            wa    w0               6    ;
            rs    w0    x1      i100    ;  chain the identifier
            ba    w3    x3      i102    ;  compute the address of the next identifier
            al    w3    x3    i103+1    ;
            la.   w3              b2.   ;
            se.   w3             i25.   ;
            jl.                   a3.   ;  goto next identifier
            rl.   w0              f1.   ;
            rs.   w0              f3.   ;  ffb:=fba
            jl.                  (b3.)  ;  return
e.                                      ;
\f


;                                       fortran, pass 2, page 46





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

  ;   the procedure find, which is called from action 10 and
  ;   from read record, fetches from the inputclass-table the
  ;   class and the length for the actual record identification.

  ;   it is called in this way:

  ;       bz.   w0     <identbyte>.
  ;       jl.   w3             d12.
  ;                                  ;  (w0) = no. of bytes
  ;                                  ;  (w1) = 2*(class - 1)

  w.
      b1:                        0   ;  returnaddress

  d12:    rs.   w3              b1.  ;  begin
          rl.   w1             f22.  ;    class := no. of classes
      a1: bz.   w3    x1       f24.  ; 
          se    w1               0   ;    if class > 0 and
          sl    w0    x3         0   ;       ident < base(class)
          jl.                   a2.  ;    then
          al    w1    x1        -1   ;    begin
          jl.                   a1.  ;      class := class - 1
      a2: bz.   w0    x1       f25.  ;      goto a1
          ls    w1               1   ;    end
          jl.                  (b1.) ;    no := numb(class)
                                     ;  end

  e.



  b.                                 ;  proc int. seq.

  ;   floating (integer) under- or overflow has occurred when a real 
  ;   (double) is converted, and the boolean flow is set to true.

  w.
  d15:                           0   ;  w0
                                 0   ;  w1
                                 0   ;  w2
                                 0   ;  w3
                                 0   ;  exc. reg.
                                 0   ;  instruction counter
                                 0   ;  interrupt cause
        jl. 2,r.(:d15.+e100+2:)>1 ; if rc8000 then extend dump area

          al.   w2             d15.  ;  begin
          am.            (12 + d15.) ;    if not integer
          sn    w2    x2        -2   ;       under- or overflow
          jl.                   +8   ;         and
          am.            (12 + d15.) ;      not floating point
          se    w2    x2        -4   ;      under- or overflow
          jl.                  e36.  ;    then goto e36
          al    w2               1   ;    else
          rs.   w2             f26.  ;    flow := true
          rl.   w2         4 + d15.  ;
          jl.            (10 + d15.) ;  end

  e.
\f


;                                       fortran, pass 2, page 46a

b. b20, c14 w.
b.   w.

; convert integer to double-real.

; w0 = irrelevant
; w1 = addr. of integer
; w2 =   -    - result (7th byte)
; w3 = return

d16:ds.w1     b1.  ; icd
    ds.w3     b3.  ;save w23
    rl.w1    (b1.) ;
    ci w1      0   ;convert integer
    bl w3      3   ;load exp
    al w2      0   ;load zero frac3
    hl w1      5   ;load zero frac2 right
    ad w1     -2   ;shiftretur frac12
    ls w1     -3   ;shiftretur frac2
    ds.w2    (b2.) ;
    am.      (b2.) ;
    ds w0     -4   ;
    rl.w0     b0.  ;
    jl.      (b3.) ;return
e.




; multiplication of double-precision reals: g*h

; w0 = addr. of h      (7th byte)
; w1 =   -    - g      ( -    - )
; w2 =   -    - result ( -    - )
; w3 = return

b.a2   w.
d17:  ds.w1    b1.    ; dmd
      ds.w3    b3.    ;
      al w1  x1-2     ;
      rs.w1    b4.    ;
      al w1  x1-2     ;
      rs.w1    b5.    ;
      rl.w2    b0.    ; w2=address of op2 (h)
      dl w0    x2     ;
      ds.w0    b18.   ; (b17,b18):=(w3w0):=(h2,h3);
      dl w2    x2-4   ;
      ds.w2    b16.   ; (b15,b16):=(w1w2):=(exph,h1);
      wm.w2   (b1.)   ; (w1w2):= h1*g3;
      wm.w0   (b5.)   ; (w3w0):= h3*g1
      aa w0    4      ;        + h1*g3;
\f


;                                       fortran, pass2, page 46b


      rl.w2   (b4.)   ;
      wm.w2    b17.   ; (w1w2):= g2*h2;
      aa w0    4      ; (w3w0):=(w3w0+g2*h2)*2**(-21);
      ad w0    -21    ;
      rl.w2   (b4.)   ;
      wm.w2    b16.   ; (w1w2):= g2*h1;
      aa w0    4      ;
      dl.w2   (b5.)   ; (w1w2):=(expg,g1);
      wa.w1    b15.   ;
      rs.w1    b15.   ; b15:=w1:= expg+exph;
      wm.w2    b17.   ; (w1w2):= g1*h2;
      aa w0    4      ;
      ad w0    3      ; (w3w0):=(fv2,fv3);
      rs.w0    b14.   ; save fv3: b14:= fv3*2**3;
      bl w2    6      ;
      bl w2    4      ; w2:= sign(fv2);
      rl.w1   (b5.)   ;
      wm.w1    b16.   ; (w0w1):= g1*h1;
      sn w0    0      ; if h1*g1=0 then
      jl.     a2.     ; goto a2
      aa w3    2      ; (w2w3):=(fv1,fv2);
      rs.w3    b6.    ; dr3:= fv2*2**3;
      nd w3    3      ; (w2w3):= normalized(fv1,fv2);
      bl w1    3      ; w1:=n:= norm.exp.
      ad w3   -2      ;
      ls w3   -3      ; w3:= f2;
      rs.w2    b4.    ; w2:=dr1:= f1;
      rx.w3    b14.   ; w3:= fv3*2**3;
      rl.w2    b6.    ; b14:= f2;
      am.     (b15.)  ; w2:= fv2*2**3;
      al w0    x1+5   ; w0:= n+5+expg+exph;
      ac w1    x1     ; n:= -n;
      ld w3  x1-5     ; (w2w3) := (fv2,fv3)shift(-n-5)
      lo.w2    b14.   ; w2:= f2;
      la.w2    b9.    ; (g5=mask)
      ls w3    -3     ;
      rl.w1    b4.    ;
a1:   ds.w3   (b2.)   ; store (f2,f3)
      as w0    12     ; test
      bl w0     0     ;   for overflow
      am.     (b2.)   ;
      ds w1    -4     ; store (expf,f1)
      jl.     (b3.)   ; return
a2:   al w1    0      ;
      dl w3    2      ;
      al w0 -2048     ;
      jl.     a1.     ;

e.
\f


;                                       fortran, pass 2, page 46c

b0:            0   ; w0
b1:            0   ; w1
b2:            0   ; w2
b3:            0   ; w3

b4:            0   ;

b5:            0   ; exp1
               0   ;
               0   ;
b6:            0   ; op1

               0   ; exp2
               0   ;
               0   ;
b7:            0   ; op2

               0   ; exp3
               0   ;
               0   ;
b8:            0   ; op3

b9:       1<21-1   ;

b10:           0   ; double-
b11:           4   ;   constant

b14:           0   ;

b15:           0   ; exp4
b16:           0   ;
b17:           0   ;
b18:           0   ; op4

b19:       -1<21   ;
b20:           1   ;


; addition of double-reals.

; w0 = addr. of a1     (7th byte)
; w1 =   -    - a2     ( -    - )
; w2 =   -    - result ( -    - )
; w3 = return
\f


;                                       fortran, pass 2, page 46d


b. a5  w.

d18:ds.w1     b1.  ; dad
    ds.w3     b3.  ;
    dl.w2     b1.  ;
    rl w3 x1-6     ;load op-exp
    sh w3(x2-6)    ;if opexpdrexp
    rx w1      5   ;then exchange addresses
    rs.w1     b4.  ;store max-address
    rl w3 x2-6     ;load min-exp
    rl w0 x1-6     ;load max-exp
    ws w3      1   ;compute shifts
    rs.w0     b5.  ;store max-exp
    dl w1 x2-2     ;load min-op
    rl w2 x2       ;
    sl w3     -21  ;if shifts-21
    jl.       a3.  ;then goto shift1
    sl w3     -64  ;if shifts-64
    jl.       a2.  ;then goto add2
    rl.w3     b4.  ;load max-addr
    dl w2 x3       ;load max-op frac3
    dl w0 x3-4     ;load max-op frac12
    jl.       c11. ;goto exit
a2: dl w2      3   ;add2:shift frac12 -21
    ls w2      3   ;shift frac3
    al w0      0   ;load zero
    rs.w0     b14. ;store at keep frac2
    sh w1     -1   ;if op<0
    al w0     -1   ;then load -1
    al w3 x3+21    ;change shifts
    jl.       a4.  ;goto shift2
a3: sn w3      0   ;shift1:if shifts=0
    jl.       a5.  ;then goto add3
    rs.w1     b14. ;store frac2
    ld w2      3   ;shift frac23
    ad w1 x3       ;shift frac12  shifts
    ls w1     -3   ;shiftretur frac2
    rx.w1     b14. ;exchange frac2
a4: ad w2 x3       ;shift2:shift frac23  shifts
    lo.w1     b14. ;compute frac2
    aa.w2     b11. ;round
    ls w2     -3   ;shiftretur frac3
a5: rl.w3     b4.  ;fradd:load addresses
    lo.w2     b19. ;prepare doubleadd
    aa w2 x3       ;doubleadd frac23
    la.w2      b9. ;remove signbits
    sz.w1    (b19.);if overflow
    wa.w0     b20. ;then add 1
    la.w1      b9. ;remove signbits
    wa w0 x3-4     ;add frac1
    jl.       c10. ;continue

e.
\f


;                                       fortran, pass 2, page 46e

c10:rs.w1     b14. ;exit:normalize
    ld w2      3   ;shift frac23
    nd w1      7   ;normalize frac12
    bl w3      7   ;load-shifts
    ad w1     -2   ;shiftretur frac12
    sh w3    -21   ;if shifts21
    jl.       c13. ;then goto highdiff
    ls w1     -3   ;shift retur frac2
    rx.w1     b14. ;exchange frac2
    ac w3 x3+2     ;shifts=2-shifts
    ld w2 x3       ;shift frac23 shifts
    la.w1     b9. 
    ls w2     -3   ;shiftretur frac3
    lo.w1     b14. ;compute frac2
    ac w3 x3       ;load-shifts
    jl.       c14. ;goto normend
c13:la.w0     b19. ;highdiff:keep sign
    lo.w0     b14. ;frac1=frac2
    rl w1      5   ;frac2=frac3
    al w2      0   ;frac3=0
    nd w1      7   ;normalize frac12
    bl w3      7   ;load-shifts
    sn w3   -2048  ;if shifts=-2048
    jl.       c11. ;goto exit1
    ad w1     -2   ;shiftretur frac12
    ls w1     -3   ;shift retur frac2
    al w3 x3-21    ;compute -shifts
c14:wa.w3     b5.  ;normend:add exp
    as w3     12   ;test exp
    bl w3      6   ;load exp
c11:ds.w2    (b2.) ;exit1:store op
    am.      (b2.) ;
    ds w0     -4   ;
c12:jl.      (b3.) ;exit2: return
\f


;                                       fortran, pass 2, page 46f
                                                                           
b.a4
w.
;division of double-reals g/h

; w0 = addr. of g      (7th byte)
; w1 =   -    - h      ( -    - )
; w2 =   -    - result ( -    - )
; w3 = return

d19:  ds.w1    b1.     ; ddd
      ds.w3    b3.     ;
      rl.w2    b1.     ; w2=address of op2
      dl w0    x2      ; (w3w0):=(h2h3);
      ds.w0    b7.     ; b7: op2
      dl w2   x2-4     ; (w1w2):=(exph,h1)
      ds.w2   b7.-4    ;
      am.     (b0.)    ;
      dl w1    -4      ; (w0w1):=(expg,g1);
      sn w1   0        ; if op1=0
      jl.     a4.      ; then goto a4
      ds.w1   b6.-4    ; g1: op1
      ls w3    3       ;
      nd w3    7       ; (w2w3):=
      ds.w3   b18.     ; dr1:= fl.(h1h2);
      dl.w3   (b0.)    ; (w1w2w3):=(g1g2g3);
      ds.w3    b6.     ;
      ls w2    3       ;
      nd w2    5       ; (w1w2):= fl.(g1g2);
      fd.w2   b18.     ; (w1w2):=kv1:= fl.(g1g2)/fl.(h1h2);
      ds.w2    b8.     ; g3:= kv1;
      bl w3    5       ; w3:= exp(kv1);
      hl.w2    b10.    ; byte(5):= fl.exp:= 0;
      ad w2   x3-2     ; convert to double-format
      ds.w2   b8.-4    ; (w1w2)=(u1,u2)
      ad w2   -23      ;
\f


;                                       fortran, pass 2, page 46g

;calculate remainder
      wm.w2   b7.      ; (w1w2):= h3*(u1+u2*2**(-21))
      rl.w0   b8.-4    ; w0:= u2;
      ls w0   -2       ;
      wm.w0   b7.-2    ; (w3w0):=h2*u2;
      aa w0    4       ; (w3w0):= h2*u2 + h3*u1;
      ad w0   -22      ;
      rl.w2   b8.-6    ; w2:= u1;
      wm.w2   b7.-2    ; (w1w2):= u1*h2;
      aa w0    4       ;
      rl.w2   b8.-4    ;
      ls w2   -3       ;
      wm.w2   b7.-4    ;
      aa w0    4       ; (w3w0):=(w3w0) +h1*u2;
      rl.w2   b9.      ; w2:= mask
      la w2    0       ; w2:=fv3:= w0!mask
      ws.w2   b6.      ; w2:= rest3:= fv3-g3
      ci w2   -65      ; (w1w2):= fl.(rest3);
      ds.w2   b7.      ;
      ad w0   -21      ;
      rl.w2   b8.-6    ;
      wm.w2   b7.-4    ; (w1w2):= h1*u1;
      aa w0    4       ;
      dl.w2   b6.-2    ; (w1w2):= (g1g2);
      ls w2    3       ;
      ad w2   -3       ;
      ss w2    0       ; rest12:=(w1w2):=(g1g2-(w3w0))
      ci w2   -44      ; (w1w2):= fl.(rest12);
      fs.w2    b7.     ; comment w1:=sign(w2)
      fd.w2   b18.     ; kv2:=(w1w2):=rest12+rest3)/fl.(h1h2);
      bl w3     5      ; w3:= exp(kv2) -
      bs.w3   b8.+1    ;       exp(kv1);
      ad w2   x3+19    ; (w1w2):=(w1w2)*2**(exp(kv2)-exp(kv1));
      bl.w3   b8.+1    ;
      wa.w3   b6.-6    ; w3:= b5:= exp(kv1)+expg
      ws.w3   b7.-6    ;       - exph;
      ds.w3   b5.      ;
      bl w0    2       ;
      bl w0    0       ; w0:= sign(kv2);
      dl.w3   b8.      ;
      hl.w3   b10.     ; exp(kv1):= 0;
      ad w3   -5       ; (w2w3):= kv1 shift -5;
      aa w1    6       ; (w0w1):= (fv1fv2):= kv1+kv2;
      ld w1    3       ;
      rl.w2   b5.-2    ;  w2:= fv3;
      ld w2   -3       ;
      jl.      c10.    ; goto normalize
a4:   ld w0   24       ;
      al w2    0       ;
      jl.    c11.      ;

e.
e.

\f


;                                       fortran, pass 2, page 47

w.    i23:  0, r.32                      ;  address table

                                      ;  identifier table

    i24:                              ;     reserved identifiers
    w. 0, h. -512,2, 577, 147,       ;  iabs
    w. 0, h. -513,2,  66,1216,       ;  abs
    w. 0, h. -514,2, 590,1280,       ;  int
    w. 0, h. -515,3, 396, 961,1280,  ;  float
    w. 0, h. -516,2, 582, 600,       ;  ifix
    w. 0, h. -517,2,1230, 460,       ;  sngl
    w. 0, h. -518,2, 258, 773,       ;  dble
    w. 0, h. -519,3, 205,1036,1536,  ;  cmplx
    w. 0, h. -520,2, 257, 147,       ;  dabs
    w. 0, h. -521,3, 207, 906, 448,  ;  conjg
    w. 0, h. -522,3, 269,  88,1984,  ;  dmax1
    w. 0, h. -523,3, 269, 590,1984,  ;  dmin1
    w. 0, h. -524,3, 275, 583, 896,  ;  dsign
    w. 0, h. -525,2, 261,1552,       ;  dexp
    w. 0, h. -526,2, 197,1552,       ;  cexp
    w. 0, h. -527,2, 268, 967,       ;  dlog
    w. 0, h. -528,2, 204, 967,       ;  clog
    w. 0, h. -529,3, 268, 967,2014,  ;  dlog10
    w. 0, h. -530,2, 275, 590,       ;  dsin
    w. 0, h. -531,2, 211, 590,       ;  csin
    w. 0, h. -532,2, 259, 979,       ;  dcos
    w. 0, h. -533,2, 195, 979,       ;  ccos
    w. 0, h. -534,3, 275,1106,1280,  ;  dsqrt
    w. 0, h. -535,3, 211,1106,1280,  ;  csqrt
    w. 0, h. -536,3, 257,1281, 896,  ;  datan
    w. 0, h. -537,3, 257,1281, 928,  ;  datan2
    w. 0, h. -538,2, 269, 964,       ;  dmod
    w. 0, h. -539,3,2128,  83,1216,  ;  3pass (reserved)
    w. 0, h. -540,3,2128,  83,1216,  ;  3pass (reserved)

w.h. i25:                   0, r. 2   ;  first free byte of ident-tab.

     i21 = k - i20

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


      i.

e.                                    ;  end pass 2


m. rc 83.08.29 fortran, pass 2
▶EOF◀