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

⟦59c91cabc⟧ TextFile

    Length: 79104 (0x13500)
    Types: TextFile
    Names: »algpass63tx «

Derivation

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

TextFile



; rc 11.1.1971                                 algol 6, pass 6, page ...0...



; pass 6 makes a type and kind check on all operands and outputs the
; text in reverse polish notation. some operators are deleted after
; the type check (e.g. pos) - other operators are added (e.g. convert
; top etc.). two stacks are used:

; operator stack:  entries consist of double words beginning with the
;                  first free double word after pass 6 and continuing
;                  higher in the store as needed.

; operand stack :  entries consist of words beginning with the last free
;                  word accessible by pass 6 and continuing lower in
;                  the store as needed. operand kinds and types are
;                  designated as follows:

;                  bit     7 = 1<16 : expression
;                   -      8 = 1<15 : variable
;                   -      9 = 1<14 : formal procedure
;                   -     10 = 1<13 : no parameter procedure
;                   -     11 = 1<12 : parameter procedure
;                   -     12 = 1<11 : array
;                   -     13 = 1<10 : zone array
;                   -     14 = 1<9  : zone
;                   -     15 = 1<8  : field
;                   -     16 = 1<7  : array field
;                   -     17 = 1<6  : no type
;                   -     18 = 1<5  : label
;                   -     19 = 1<4  : string
;                   -     20 = 1<3  : integer
;                   -     21 = 1<2  : real
;                   -     22 = 1<1  : long
;                   -     23 = 1<0  : boolean

; briefly, the action proceeds as follows: a byte is input and used to
; index an entry in the input table. this entry is stored in the control
; word and also compared to operator stack(top). if the priority of ope-
; rator stack(top) is greater than the priority of the control word, ope-
; rator stack pointer is decreased and the new operator stack top is com-
; pared to the control word. eventually, if not initially, the priority
; of the control word will be greater than that of operator stack top and
; the input actions will ensue. frequently required tasks such as stacking
; and outputing are accomplished within the central logic, while special
; actions requiring entry addresses stored in input and operator table en-
; tries are jumped to from the central logic. often special actions by-pass
; the priority check which results in simply calling a new input byte.

; errors encountered in the pass and error identification bytes from previ-
; ous passes cause the output of error messages. usually such messages are
; accompanied by the transmission of the trouble byte to pass 7. cascading
; effects of errors are surpressed.

; the pass terminates when end pass (or end external and the subsequent
; standard procedure information bytes have been copied from input to output.

\f

                                                                                           

; rc 1977.11.03                                algol 6, pass 6, page ...0.1...




s. a35, b27, c70, d35, f49, g11, h54, j3, i6
w.
k = e0

; list of slang-names in global block and pages, where defined:

; a0   5,  a5   5,  a10  7,  a15 19,  a20  3,  a25   ,  a30 20
; a1   4,  a6  16,  a11 10,  a16 18,  a21 18,  a26   ,  a31 12
; a2   4,  a7   5,  a12   ,  a17 19,  a22 15,  a27 17,  a32 12
; a3   5,  a8   5,  a13 14,  a18 15,  a23 16,  a28 17,  a33  8
; a4   5,  a9   7,  a14 11,  a19 21,  a24 18,  a29  4,  a34  8
; a35  13,

; b0    ,  b4    ,  b8    ,  b12   ,  b16   ,  b20  5,  b24
; b1    ,  b5    ,  b9    ,  b13   ,  b17   ,  b21 15,  b25 20
; b2    ,  b6    ,  b10   ,  b14   ,  b18   ,  b22 15,  b26 20
; b3    ,  b7    ,  b11   ,  b15   ,  b19  5,  b23 15,  b27 20

; c0   4,  c10 10,  c20  9,  c30  8,  c40 14,  c50 21,  c60 20
; c1   7,  c11  9,  c21 12,  c31  8,  c41 14,  c51  3,  c61 20
; c2   8,  c12 11,  c22 14,  c32  8,  c42 15,  c52  3,  c62 20
; c3   8,  c13 10,  c23 12,  c33  8,  c43 17,  c53  7,  c63 11
; c4   8,  c14  7,  c24 12,  c34 13,  c44  8,  c54  9,  c64 11
; c5   9,  c15 11,  c25 12,  c35 13,  c45 18,  c55  9,  c65 11
; c6   9,  c16 11,  c26 14,  c36 13,  c46 18,  c56 20,  c66 12
; c7   9,  c17 11,  c27 13,  c37  8,  c47 11,  c57 20,  c67 11
; c8  10,  c18 11,  c28 12,  c38 13,  c48 19,  c58 20,  c68  7
; c9  10,  c19  9,  c29 13,  c39 13,  c49 21,  c59 20,  c69 13, c70  3

; d0   4,  d6  14,  d12 14,  d18 17,  d24 21,  d30 21
; d1   4,  d7   6,  d13 16,  d19 17,  d25 21,  d31 17
; d2   4,  d8  11,  d14 16,  d20   ,  d26 21,  d32  9
; d3   5,  d9  11,  d15 17,  d21 18,  d27 21,  d33  9
; d4    ,  d10 14,  d16 17,  d22 18,  d28 21,  d34 11
; d5  15,  d11 14,  d17 17,  d23 21,  d29 21,  d35  7

; f0   1,  f7   1,  f14 21,  f21  1,  f28   ,  f35  1,  f42  1,  f49  1
; f1   1,  f8   1,  f15   ,  f22   ,  f29   ,  f36  1,  f43  1
; f2   1,  f9   1,  f16  1,  f23   ,  f30  1,  f37  1,  f44  1
; f3   1,  f10   ,  f17   ,  f24   ,  f31  1,  f38  1,  f45  1
; f4   1,  f11  1,  f18   ,  f25   ,  f32  1,  f39  1,  f46  1
; f5   1,  f12   ,  f19   ,  f26   ,  f33  1,  f40  1,  f47  1
; f6   1,  f13 21,  f20   ,  f27   ,  f34  1,  f41  1,  f48  1

; g0    ,  g2  24,  g4  33,  g6  33,  g8  26,  g10 23
; g1  27,  g3    ,  g5  33,  g7  26,  g9  26,  g11

; h0    ,  h7   2,  h14  2,  h21  2,  h28   ,  h35  2,  h42   ,  h49  2
; h1    ,  h8   2,  h15   ,  h22  2,  h29   ,  h36  2,  h43  2,  h50  2
; h2    ,  h9   2,  h16  2,  h23  2,  h30   ,  h37  2,  h44  2,  h51  2
; h3   2,  h10  2,  h17  2,  h24   ,  h31  2,  h38  2,  h45  2,  h52  2
; h4   2,  h11  2,  h18  2,  h25   ,  h32   ,  h39  2,  h46  2,  h53  2
; h5   2,  h12  2,  h19  2,  h26   ,  h33  2,  h40  2,  h47  2,  h54  2
; h6   2,  h13   ,  h20  2,  h27   ,  h34   ,  h41  2,  h48  2,

; i0   6,  i1   6,  i2   6,  i3   6,  i4  20,  i5  20,  i6  20

; j0   1,  j1   6,  j2   6,  j3   6

\f



; rc 23.1.1971                                     algol 6, pass 6, page ...1...





j0:   g5          ;  no of byes in pass 6
h.    d0, 6<1 + 0 ;  entry , passno<1 + scan direction
w.                ;

      0<12 + 0    ;  control word (part 0 and 1)
f0:   0<12 + 0    ;  control word (part 2 and 3)

f1:   0           ;  operator stack pointer
f2:   0           ;  operand stack pointer
f3:   0           ;  pseudo stack pointer

f30=1<0           ;  boolean
f31=1<1           ;  long
f32=1<2           ;  real
f33=1<3           ;  integer
f34=1<4           ;  string
f35=1<5           ;  label
f36=1<6           ;  no type
f37=1<7           ;  array field
f38=1<8           ;  field
f39=1<9           ;  zone
f40=1<10          ;  zone array

f45=127           ;  all types
f46= 15           ;  all declarable types

f4:   1<17-1      ;  undefined operand, standard operand mask
f6:   127         ;  all type mask
f7:   1<16        ;  expression mask
f8:   f32+f34     ;  real-string mask
f9:   1<15        ;  variable mask
f11:  47<9        ;  begin list mask
f16:  0           ;
f5:   0<12 + 0    ;  no.operands in line, no.zones specs
f21:  1<15+f33    ;  variable and integer

f41:  1<11        ;  array
f42:  1<12        ;  parameter procedure
f43:  1<13        ;  no parameter procedure
f44:  1<14        ;  formal procedure
f47:  f46         ;  all declarable types
f48:  -1<14       ;  formal proc and undefined operand
f49:  f39+f32     ;  zone and real

\f

                                                                                                              

; rc 15.2.1971                              algol 6, pass 6, page ...2...




h3  = 0        ; output base for operators
h4  = h3 + 107 ; call no param                     output value
h5  = h3 + 38  ; not (-,)                          output value
h6  = 145      ; if                                operator table value
h7  = 146      ; while elem do                     operator table value
h8  = h3 + 99  ; begin param                       output value
h9  = h3 + 106 ; end call                          output value
h10 = h3 + 100 ; end subscripts one                output value
h11 = h3 + 101 ; end subscripts more               output value
h12 = h3 + 105 ; zone indexing                     output value
h14 = 336      ; no.zones error spec               operator table index
h16 = h3 + 118 ; trouble                           output value
h17 = 144      ; output base for operands
h18 = h3 + 102 ; first comma                       output value
h19 = 148      ; then - of ex                      operator table index
h20 = h3 + 113 ; end zone decl                     output value
h21 = h3 + 97  ; end value param                   output value
h22 = h3 + 96  ; end name param                    output value
h23 = h3 + 98  ; end addr param                    output value

h31 = h3 + 127 ; convert top     real to int       output value
h33 = h3 + 128 ; convert top     real to long      output value
h35 = h3 + 124 ; convert top     int to real       output value
h36 = h3 + 130 ; convert nexttop int to real       output value
h37 = h3 + 123 ; convert top     int to long       output value
h38 = h3 + 129 ; convert nexttop int to long       output value
h39 = h3 + 126 ; convert top     long to real      output value
h40 = h3 + 131 ; convert nexttop long to real      output value
h41 = h3 + 125 ; convert top     long to int       output value

h43 = h3 + 132 ; field boolean                     output value
h44 = h3 + 134 ; field long                        output value
h45 = h3 + 135 ; field real                        output value
h46 = h3 + 133 ; field integer                     output value
h47 = h3 + 136 ; array field boolean               output value
h48 = h3 + 138 ; array field long                  output value
h49 = h3 + 139 ; array field real                  output value
h50 = h3 + 137 ; array field integer               output value
h51 = h3 + 140 ; field subscr boolean              output value
h52 = h3 + 142 ; field subscr long                 output value
h53 = h3 + 143 ; field subscr real                 output value
h54 = h3 + 141 ; field subscr integer              output value

\f

                                                                                

; rc 15.3.1971                             algol 6, pass 6, page ...3...




c51:  al  w1  0         ; end external:  bytes out := 0;
      jl.     a20.      ;   goto end bytes;

c52:  al  w1  4         ; end pass:  bytes out := 4;
a20:  jl. w3  e2.       ; endbytes:
      al  w0  x2        ;   for w1 := bytes out step 1 until 6 do
      jl. w3  e3.       ;    outbyte(inbyte);
      al  w1  x1+1      ;
      se  w1  6         ;
      jl.     a20.      ;

      sn  w2  0         ;   if last inbyte = 0 then goto next pass;
      jl.     e7.       ;
      ls  w2  1         ;
      wm  w2  2         ;
      rs. w2  f0.       ;   control word := 12*no.stdprocs;
      al  w1  0         ;

a21:  jl. w3  e2.       ;   for w1 := 1 step 1 until controlword do
      al  w0  x2        ;    outbyte(inbyte);
      jl. w3  e3.       ;
      al  w1  x1+1      ;
      se. w1 (f0.)      ;
      jl.     a21.      ;
      jl.     e7.       ;   goto next pass;

c70:  rl. w0  f0.-2     ; delete call:
      rl. w1 (f2.)      ;   w0:=part 1(control word);
      sl  w1  f45+1     ;   w1:=top(operand stack);
      jl. w3  d3.       ;   if kind <> 0 then
      bz. w0  f0.       ;   check operand;
      jl. w3  e3.       ;   outbyte(part 3(control word));
      jl.     c28.      ;   goto decrease operand stack;

\f

                                                                              

; jz 1979.06.22                         algol 8, pass 6, page ...4...




w.
d0 = k - j0 ; entry pass 6

      al. w2  g2.       ; start pass 6:
      al  w2  x2+g6     ;
      rs. w2  f1.       ;   operator stack pointer := bottom;
      rl. w0  e9.+4     ;
      rs. w0  f2.       ;   operand stack pointer := bottom;
      jl. w3  e2.       ;
      al  w0  x2        ;   inbyte(no of own bytes);
      jl. w3  e3.       ;   outbyte;

c0:   jl. w3  e2.       ; inbyte:
      al  w2  x2-198    ;   byte := inbyte - 198;
      ls  w2  2         ; get table index:
      dl. w3  x2+g1.    ;   control word :=
      ds. w3  f0.       ;    input table ( byte*4);

d1:   dl. w1 (f1.)      ; priority check:
      sl  w0  x2        ;   if priority(operator stack top) > priority(contr.word)
      jl.     a0.       ;   then goto unstacking actions;

d2:   bz  w0  7         ; test control word:
      so  w0  1<2       ;   if stack bit(control word) = 1 then
      jl.     a1.       ;   begin
      rl. w1  f1.       ;    operator stack pointer :=
      al  w1  x1+4      ;    operator stack pointer + 4;
      sl. w1 (f2.)      ;    if operator stack and operand stack collide
      jl.     d23.      ;    then goto stack overflow;
      rs. w1  f1.       ;  
      bz. w2  f0.       ;    operator stack(top) :=
      dl. w3  x2+g2.    ;    operator table(part 3(control word));
      ds  w3  x1        ;   end;

a1:   so  w0  1<1       ;   if output bit(control word) = 1 then
      jl.     a2.       ;   begin
      bz. w0  f0.-1     ;    byte := output part(control word);
      jl. w3  e3.       ;    outbyte;
                        ;   end;
a2:   bz. w2  f0.+1     ;   action no := part 4(control word);
a29:  ls  w2  -5        ; jump:  action no := action no shift (-5);
      bl. w2  x2+g10.   ;   action := action table(action no);
      jl.     x2+c0.    ;   switch to action;

\f

                                                                                        

; rc 15.04.1971                              algol 6, pass 6, page ...5...



a0:   am.    (f1.)      ; unstacking actions:
      bz  w0  1         ;   bits := part 4(operator stack(top));
      so  w0  1<4       ;   if typecheckbit <> 1 then
      jl.     a4.       ;   goto action jump;
      rl. w2  f2.       ;   w2 := operand stack pointer;
      so  w0  1<3       ;   if (top+1) bit = 1 then
      jl.     a3.       ;   begin
      al  w2  x2+2      ;    w1 := top(operand stack);
      rs. w2  f2.       ;    operand stack pointer :=
      am      -2        ;    operand stack pointer + 2;
a3:   rl  w1  x2        ;   end
      am.    (f1.)      ;   else w1 := top(operand stack);
      rl  w0  -2        ;   w0 := top(operator stack);
      jl. w3  d3.       ;   check operand;
      sn. w1 (f4.)      ;   if operand = undef then
      rs. w1 (f2.)      ;   top(operand stack):= undef;

a4:   am.    (f1.)      ; action jump:
      bz  w2  1         ;   action no := part 4(operator stack top);
      jl.     a29.      ;   goto jump;

; procedure check operand;
; call:  w0=mask; w1=operand; jl. w3 d3.
; exit:  w1=kind and type(may be undef  after error)

d3:   rs. w3  b19.      ; check operand:  save return;
      sn. w1 (f4.)      ;   if operand = undef then
      jl      x3        ;   return;
      la  w1  0         ;   w1 := mask and operand;
      sz  w1  f45       ;   if type correct then goto kind check;
      jl.     a5.       ;

a8:   jl. w2  d25.      ; type error:  type error;
      rl. w1  f4.       ;   w1 := undef;
      jl.    (b19.)     ;   return;

a5:   sh  w1  f45       ; kind check:
      jl.     a8.       ;   if kind incorrect then goto type error;

      sz. w1 (b20.)     ;   if no parproc or formal proc 
      jl.     a7.       ;   then goto convert operand;
      jl.    (b19.)     ;   return;

a7:   al  w0  h4        ; convert operand:
      jl. w3  e3.       ;   outbyte(call no param);
      la. w1  f6.       ;   w1 := w1 and all type;
      wa. w1  f7.       ;   w1 := w1+expression;
      jl.    (b19.)     ;   return;

b19:  0         ; saved return
b20:  1<13+1<14 ; mask (no parproc or formal proc)

\f

                                                                                      

; rc 18.1.1971                              algol 6, pass 6, page ...6...




; procedure arith pair;
; call:  w0=left operand; w1=right operand;
;        jl. w2 d7.
; exit:  w1=type of result; 
; the procedure may output a convert (top or nexttop) operator;

d7:   la. w0  i2.       ; arith pair:
      la. w1  i2.       ;   comment: w0=left op.; w1=right op.;
      ns  w0  1         ; compute table index:
      bl  w0  1         ;   normalize(left operand and arith type mask);
      ba. w0  j3.       ;
      wm. w0  i3.       ;   row := (exponent+21)*no.arith types;
      ns  w1  3         ;   normalize(right operand and arith type mask);
      bl  w1  3         ;   column := exponent;
      am     (0)        ;
j3 = k + 1 ; 21         ;
      al  w1  x1+21     ;   index := row + column + 21;
      bl. w0  x1+i0.    ;   byte := convert operand(index);
      bz. w1  x1+i1.    ;   arith pair := arith pair result(index);
      se  w0  -1        ;   if operand types not the same
      jl. w3  e3.       ;   then outbyte;
      jl      x2        ;   return;

; in the following two matrix-tables, the row-index is the left operand
; and the column-index the right operand

; convert operator table(output value):

h.    ; long real integer ;
i0:      -1,  h40,  h37   ; long
        h39,   -1,  h35   ; real
j1:     h38,  h36,   -1   ; integer
j2 = k - j1

; arith pair result table:

      ; long real integer ;
i1:      f31, f32, f31    ; long
         f32, f32, f32    ; real
         f31, f32, f33    ; integer
w.

i2:   f31+f32+f33 ; arith type mask
i3:   j2          ; no of arith types

\f

                                                                      

; rc 11.3.1971                              algol 6, pass 6, page ...7...




c53:  rl. w1  f4.       ; load undefined operand:  w1 := undef;
c14:  rs. w1 (f2.)      ; store operand:  operand stack(top) := operand;

c1:   am.    (f1.)      ; bit actions:
      bz  w1  1         ;   bits := part 4(operator stack top);

      so  w1  1<2       ; test no result:
      jl.     a9.       ;   if no result bit = 1 then
      rl. w2  f2.       ; unstack operand:
      al  w2  x2+2      ;   operand stack pointer :=
      rs. w2  f2.       ;   operand stack pointer + 2;

a9:   so  w1  1<1       ; output self:
      jl.     a10.      ;   if output self bit = 1 then
      bz. w0 (f1.)      ;   begin  byte := part 3(operator stack top);
      jl. w3  e3.       ;    outbyte;
                        ;   end;
a10:  rl. w2  f1.       ; unstack operator:
      al  w2  x2-4      ;   operator stack pointer :=
      rs. w2  f1.       ;   operator stack pointer - 4;
      dl. w3  f0.       ;   (w2,w3) := control word;
      so  w1  1<0       ;   if terminate unstack bit = 0 then
      jl.     d1.       ;   goto priority check;
      jl.     d2.       ;   goto test control word;

d35:  rx. w1  f1.       ; stack operator:
      al  w1  x1+4      ;   operator stack pointer :=
      sl. w1 (f2.)      ;   operator stack pointer + 4;
      jl.     d23.      ;   if operator stack and operand stack collide
      ds  w0  x1        ;   then goto stack overflow;
      rx. w1  f1.       ;   top(operator stack) := (w3,w0);
      jl      x2        ;   return;

c68:  al  w0  2         ; end else ex:  end case ex:
      rl. w1 (f2.)      ;   type:=2; operand:=top(operand stack);
      sz  w1  f30+f33   ;   if operand=boo or int then
      al  w0  0         ;    type:=0;
      sz  w1  f32+f33   ;   if operand=real or integer then
      ba. w0  1         ;    type := type+1;
      jl. w3  e3.       ;   outbyte(type);
      jl.     c0.       ;   goto inbyte;

\f

                                                                 

; rc 18.1.1971                            algol 6, pass 6, page ...8...




a33:  rl. w1  f2.       ; stack and output operand:
      al  w1  x1-2      ;   operand stack pointer :=
      sh. w1 (f1.)      ;   operand stack pointer - 2;
      jl.     d23.      ;   if operand stack and operator stack collide
      rs. w1  f2.       ;   then goto stack overflow;

      rl. w0  f0.-2     ; stack operand:
      la. w0  f4.       ;   item := first word(control word) and standard;
      rs  w0  x1        ;   top(operand stack) := item;

      bz. w1  f5.       ; count operands:
      al  w1  x1+1      ;   no.operands in line :=
      hs. w1  f5.       ;   no.operands in line + 1;

a34:  bz. w0  f0.       ; output operand:
      jl.     e3.       ;   outbyte(part 3(control word));  return;

c31:  jl. w3  e2.       ; inout 4:
      al  w0  x2        ;
      jl. w3  e3.       ;   outbyte(inbyte);

c33:  jl. w3  e2.       ; inout 3:
      al  w0  x2        ;
      jl. w3  e3.       ;   outbyte(inbyte);

c30:  jl. w3  e2.       ; inout 2:
      al  w0  x2        ;
      jl. w3  e3.       ;   outbyte(inbyte);

c32:  jl. w3  e2.       ; inout 1:
      al  w0  x2        ;
      jl. w3  e3.       ;   outbyte(inbyte);

      jl.     c0.       ;   goto inbyte;

c2:   rl. w1  f1.       ; parproc:
      rs. w1  f3.       ;   pseudotop := operator stack pointer;

c3:   am      c30-c31   ; operand and word literal: set return(inout 2) else
c37:  am      c31-c32   ; double word literals: set return(inout 4) else
c44:  al. w3  c32.      ; boolean literal: set return(inout 1);
      jl.     a33.      ;   goto stack and output operand;

c4:   al. w3  c31.      ; string next:  set return(inout 4);
      jl.     a34.      ;   goto output operand;

\f

                                                                      

; rc 21.1.1971                             algol 6, pass 6, page ...9...




c11:  al  w0  h5        ; imply:
      jl. w3  e3.       ;   outbyte(-,);

c5:   rl. w1 (f2.)      ; diadic input:
      rl. w0  f0.-2     ;   w1 := top(operand stack);
      jl. w3  d3.       ;   w0 := first word(control word);
      la. w1  f6.       ;   check operand;
      wa. w1  f7.       ;   top(operand stack top) :=
      rs. w1 (f2.)      ;   type bits + expression;
      jl.     c0.       ;   goto inbyte;

c54:  rl. w1  f1.       ; then expression:
      bz  w0  x1-1      ;
      se  w0  h6        ;   if top(operator stack )= if
      jl.     c55.      ;   then
      am      h19       ;
      dl. w3  g2.       ;   top(operator stack) :=
      ds  w3  x1        ;   then-of-expression;

c55:  rl. w0  f0.-2     ; monadic input:
      rl. w1 (f2.)      ;   w0 := part 1(control word);
      jl. w3  d3.       ;   w1 := top(operand stack);
      bz. w0  f0.       ;   check operand;
      jl. w3  e3.       ;   outbyte(part 3(control word));
      jl.     c28.      ;   goto decrease operand stack;

c6:   rl. w0 (f2.)      ; arith operator:
      sn. w0 (f4.)      ;   if top(operand stack) = undef
      jl.     c1.       ;   then goto bit actions;
      jl. w2  d7.       ;   arith pair;
      lo. w1  f7.       ;   top(operand stack) :=
      rs. w1 (f2.)      ;   arith pair result + expression;
      jl.     c1.       ;   goto bit actions;

c7:   al  w3  f33       ; extract:
      wa. w3  f7.       ;   top(operand stack) :=
      rs. w3 (f2.)      ;   integer + expression;

c19:  al. w3  c1.       ; round top:  set return(bit actions);
d32:  sz  w1  f33       ; round:  if operand = integer then return;
      jl      x3        ;   byte := convert top(long to integer);
      al  w0  h41       ;   if operand = real then
      sz  w1  f32       ;   byte := convert top(real to integer);
      al  w0  h31       ;   outbyte(byte);
      jl.     e3.       ;   return;

c20:  al. w3  c1.       ; float top:  set return(bit actions);
d33:  sz  w1  f32       ; float:  if operand = real then return;
      jl      x3        ;   byte := convert top(long to real);
      al  w0  h39       ;   if operand = integer then
      sz  w1  f33       ;   byte := convert top(integer to real);
      al  w0  h35       ;   outbyte(byte);
      jl.     e3.       ;   return;

\f

                                                                             

; rc 05.04.1971                             algol 6, pass 6, page ...10...




c8:   rl. w1 (f2.)      ; divide-exponentiation:
      rl. w0  f0.-2     ;   w1 := operand; w0 := mask;
      jl. w3  d3.       ;   check operand;
      jl. w3  d33.      ;   float;
      al  w1  f32       ;
      wa. w1  f7.       ;   top(operand stack) :=
      rs. w1 (f2.)      ;   real + expression;
      jl.     c0.       ;   goto inbyte;
c13:  la. w1  f6.       ; abs-neg:
      wa. w1  f7.       ;   top(operand stack):=
      rs. w1 (f2.)      ;   type + expression;
c9:   sz  w1  f33       ; modify output:
      jl.     c1.       ;   if operand = integer then
      bz. w3 (f1.)      ;   goto bit actions;
      so  w1  f31       ;   if operand = long then
      am      1         ;   incr := 1 else incr := 2;
      al  w3  x3+1      ;   part 3(operator stack top) :=
      hs. w3 (f1.)      ;   part 3(operator stack top) + incr;
      jl.     c1.       ;   goto bit actions;

c10:  rl. w0 (f2.)      ; rel pair:
      sn. w0 (f4.)      ;   if top(operand stack) = undef
      jl.     c1.       ;   then goto bit actions;
      jl. w2  d7.       ;   arith pair;
      al  w1  f30       ;
      wa. w1  f7.       ;   top(operand stack) :=
      rs. w1 (f2.)      ;   boolean + expression;

      bz. w0  f0.+1     ; get relation variant:
      so  w0  1<0       ;   if (while elem,do) bit of control word = 0
      jl.     c1.       ;   then goto bit actions;
      am.    (f1.)      ;
      bz  w1  -4        ;
      al  w0  6         ;   relation variant := 6;
      sn  w1  h6        ;   if nexttop(operator stack) = <if,else>
      jl.     a11.      ;   then goto store variant;
      se  w1  h7        ;   if nexttop(operator stack) <> <while>
      jl.     c1.       ;   then goto bit actions;
      al  w0  12        ;   relation variant := 12;

a11:  ba. w0 (f1.)      ; store variant:
      se  w1  h6        ;   part 3(control word) :=
      am      -1        ;   part 3(operator stack top) + relation variant;
      hs. w0  f0.       ;
      al  w1  0         ;
      jl.     a10.      ;   goto unstack operator;

\f

                                                                               

; rc 21.1.1971                            algol 6, pass 6, page ...11...




c12:  am      f33-f32   ; entier:   type := integer; goto set operand;
c15:  am      f32-f34   ; real:  type := real;  goto set operand;
c63:  am      f34-f31   ; string:  type := string;  goto set operand;
c64:  al  w1  f31       ; long:  type := long;
      wa. w1  f7.       ; set operand:  operand := type + expression;
      jl.     c14.      ;   goto store operand;

c16:  rl. w1 (f2.)      ; first assign:
      sz  w1  f46       ;   if operand type = declarable
      jl.     a14.      ;   then goto variable check;

d9:   jl. w2  d25.      ; assign error:
      rl. w1  f4.       ;   type error;  operand := undef;
d8:   rs. w1 (f2.)      ; restore assign variable:
      jl.     c0.       ;   top(operand stack) := operand; goto inbyte;

a14:  sz. w1 (f9.)      ; variable check:
      jl.     c0.       ;   if operand kind = variable then goto inbyte;
      jl.     d9.       ;   goto assign error;

c17:  am.    (f2.)      ; assign:
      rl  w1  2         ;   w1 := nexttop(operand stack);
      sn. w1 (f4.)      ;   if w1 = undef then
      jl.     d8.       ;   goto restore assign variable;
      rl. w0 (f2.)      ;   w0 := top(operand stack);
      sn  w0  x1        ;   if w0 = w1 then
      jl.     c0.       ;   goto inbyte;
      jl.     d9.       ;   goto assign error;

c18:  bz. w2  f0.       ; prep assign:  index := prep assign boolean;
      rl. w0 (f2.)      ;   operand := top(operand stack);
      sz  w0  f31+f33   ;   if operand = long or operand = integer
      al  w2  x2+4      ;   then index := index + 4;
      sz  w0  f31+f32   ;   if operand = long or operand = real
      al  w2  x2+8      ;   then index := index + 8;
      sn. w0 (f4.)      ;   if operand = undef
      al  w2  x2+4      ;   then index := index + 4;
      dl. w0  x2+g2.    ;   check operator := operator table(index);
      jl. w2  d35.      ;   stack operator(check operator);
      jl.     c0.       ;   goto inbyte;

c67:  al  w3  f31       ; extend:
      wa. w3  f7.       ;   top(operand stack) :=
      rs. w3 (f2.)      ;   long + expression;

c65:  al. w3  c1.       ; long top:   set return(bit actions);
d34:  sz  w1  f31       ; long:
      jl      x3        ;   if operand = long then return;
      al  w0  h33       ;   byte := convert top(real to long);
      sz  w1  f33       ;   if operand = integer then
      al  w0  h37       ;   byte := convert top(integer to long);
      jl.     e3.       ;   outbyte(byte);   return;

c47:  al  w3  f33       ; round:
      wa. w3  f7.       ;   top(operandstack) :=
      rs. w3 (f2.)      ;   integer + expression;
      jl.     c19.      ;   goto round top;


\f

                                                                         

; rc 17.3.1971                                algol 6, pass 6, page ...12...




c21:  rl. w1  f2.       ; else ex - case comma:
      al  w1  x1+2      ;   operand := top(operand stack);
      rs. w1  f2.       ;   unstack operand;
      rl  w1  x1-2      ;
      la. w1  f6.       ; get check operator:
      ns  w1  3         ;
      bl  w1  3         ;
      al  w1  x1+22     ;   index :=
      ls  w1  2         ;   typebit*4;
      dl. w0  x1+g3.    ;   check operator := operator table(index+checkbase);
      jl. w2  d35.      ;   stack operator;
      jl.     c0.       ;   goto inbyte;

c23:  jl. w3  d33.      ; real check operator:  float;
      al  w1  f32       ;   operand := real;
      jl.     a31.      ;   goto add expr bit;

c66:  so  w1  f32       ; long check operator:
      al  w1  f31       ;   if operand <> real then operand := long;
      la. w1  f6.       ;   operand := operand and standard type mask;
a31:  wa. w1  f7.       ; add expr bit: operand := operand + expression;
      jl.     c14.      ;   goto store operand;

c24:  rl. w2 (f2.)      ; integer div - mod:
      sn. w2 (f4.)      ;   if top(operand stack) = undef
      jl.     c1.       ;   then goto bitactions;
      al  w0  h38       ;   byte := convert nexttop(integer to long);
      sz  w2  f33       ;   if nexttop(operand stack) = integer
      jl. w3  e3.       ;   then outbyte;
      al  w3  0         ; get variant:  variant := 0;
      sz  w1  f31       ;   if top(operand stack) <> long then
      jl.     a32.      ;   begin
      so  w2  f31       ;    if nexttop(operand stack) = long then
      am      1         ;    variant := 1 else variant := 2;
      al  w3  1         ;   end;
a32:  al  w1  f31       ; modify nexttop operand:
      sn  w3  2         ;   operand := long;
      al  w1  f33       ;   if variant = 2 then operand := integer;
      ba. w3 (f1.)      ;   part 3(top(operator stack)) :=
      hs. w3 (f1.)      ;   part 3(top(operator stack)) + variant;
      jl.     a31.      ;   goto add expr bit;

c25:  rl. w1  f1.       ; decrease operator stack:
      al  w1  x1-4      ;   operator stack pointer :=
      rs. w1  f1.       ;   operator stack pointer - 4;
      jl.     c0.       ;   goto inbyte;

c28:  rl. w1  f2.       ; decrease operand stack:
      al  w1  x1+2      ;   operand stack pointer :=
      rs. w1  f2.       ;   operand stack pointer + 2;
      jl.     c0.       ;   goto inbyte;

\f

                                                                           

; rc 1977.11.03                             algol 6, pass 6, page ...13...




c27:  rl. w0 (f2.)      ; for pair:
      sn. w0 (f4.)      ;   if operand = undef
      jl.     c1.       ;   then goto bit actions;
      sz  w0  f31       ;   if top(operand stack) = long then
      jl.     c65.      ;   goto long top;
      sz  w0  f32       ;   if top(operand stack) = real then
      jl.     c20.      ;   goto float top;
      jl.     c19.      ;   goto round top;

c29:  rl. w1 (f2.)      ; goto:
      so  w1  f35       ;   if top(operand stack) <> label
      jl. w2  d25.      ;   then type error;
      jl.     c28.      ;   goto decrease operand stack;

c34:  am      2         ; vanished operand:  increment := 1 else
c35:  al  w1  -1        ; internal operand: increment := -1;
a35:                    ; count operand:
      ba. w1  f5.       ;   no.operands in line :=
      hs. w1  f5.       ;   no.operands in line + increment;
      jl.     c0.       ;   goto inbyte;

c36:  al  w1  0         ; newline:
      hs. w1  f5.       ;   no.operands in line := 0;
      jl. w3  e1.       ;   carret;
      jl.     c0.       ;   goto inbyte;

c38:  jl. w3  e2.       ; dope description:
      al  w0  x2        ;
      jl. w3  e3.       ;   outbyte(inbyte);
      jl. w3  e2.       ;
      rs. w2  f3.       ;   no.array elements := inbyte;
      al  w0  x2        ;
      jl. w3  e3.       ;   outbyte(no.array elements);
      jl.     c0.       ;   goto inbyte;

c39:  rl. w1  f3.       ; specifications input:
      al  w1  x1+4      ;   pseudo top := pseudo top + 4;
      sl. w1 (f2.)      ;   if pseudo top >= operand stack pointer
      jl.     d23.      ;   then goto stack overflow;
      rs. w1  f3.       ; stack spec operator:
      bz. w2  f0.       ;   operator stack(pseudo top) :=
      dl. w3  x2+g2.    ;   operator table(part 3(control word));
      ds  w3  x1        ;
      jl.     c0.       ;   goto inbyte;

c69:  rl. w0 (f2.)      ; until:
      se. w0 (f4.)      ;   if operand <> undef
      jl. w2  d7.       ;   then arith pair;
      jl.     c1.       ;   goto bit actions;

\f

                                                                                 

; rc 05.04.1971                            algol 6, pass 6, page ...14...




c22:  al  w1  h23       ; spec addr general:
      rl. w0 (f2.)      ;   param := end addr param;
      sz. w0 (f9.)      ;   if param = variable then
      jl.     a13.      ;   goto store end param;
      al  w1  h22       ;   param := end name param;
      so. w0 (f7.)      ;   if param <> expression then
      jl.     a13.      ;   goto store end param;
      so  w0  f34       ;   if param <> string then
      al  w1  h21       ;   param := end value param;
a13:  hs. w1 (f1.)      ; store end param:  end param := param;

c41:  bz. w0  f0.-1     ; spec general:
      se  w0  h10       ;   if inbyte = end subscr one
      sn  w0  h11       ;   or inbyte = end subscr more
      jl.     c40.      ;   then goto spec;
      al. w0  d5.       ;   operand proc addr :=
      rs. w0  b21.      ;   check name operand addr;
      rl. w2  f1.       ;   w2 := operator stack pointer;
      jl.     d12.      ;   goto save end param;

c26:  al. w0  d3.       ; spec value:
      jl.     d10.      ;   operand proc addr := check operand addr else

c40:  al. w0  d5.       ; spec:
d10:  rs. w0  b21.      ;   operand proc addr :=
      rl. w2  f1.       ;   check name operand addr;
      al  w1  x2-4      ;   operator stack pointer :=
      rs. w1  f1.       ;   operator stack pointer-4;

d12:  bz  w0  x2        ; save end param:
      rs. w0  b22.      ;   end param := part 3(oldtop(operator stack));
      rl. w1 (f2.)      ;
      sn. w1 (f4.)      ;   if top(operand stack) = undef
      jl.     d6.       ;   then goto no type param;
      rl  w0  x2-2      ;   w0 := first word(top(operator stack));
      jl. w3 (b21.)     ;   operand proc;
      la. w1  f6.       ;   type := w1 and all type mask;
      sn. w1 (f6.)      ;   if type = undef then
d6:   al  w1  0         ; no type param:  type := 0;
d11:  rl. w0  b22.      ; out end param:
      jl. w3  e3.       ;   outbyte(end param);
      sz  w1  f36       ;   if type = no type then
      al  w1  0         ;   type := 0;

\f

                                                                                           

; rc 2.1.1971                                  algol 6, pass 6, page ...15...




      sh  w1  4         ;   if type <= 4 then
      jl.     a18.      ;   goto output parameter type;
      ls  w1  -2        ;   type :=
      al  w1  x1+1      ;   type//4 + 1;
a18:  bz. w0  x1+b23.   ; output parameter type:
      jl. w3  e3.       ;   outbyte(newtype(type));

      al  w0  h8        ; output begin param or end call:
      bz. w1  f0.-1     ;   byte := begin param;
      se  w1  h10       ;   if inbyte = end subscr one
      sn  w1  h11       ;   or inbyte = end subscr more
      al  w0  h9        ;   then byte := end call;
      jl. w3  e3.       ;   outbyte(byte);
      jl.     c28.      ;   goto decrease operand stack;

b21:  0  ; operand proc addr
b22:  0  ; end param

; newtype table:
b23:  0<12 + 1<0  ; no type   , boolean
      4<12 + 2<0  ; long      , integer
      3<12 +   0  ; real      , string
      0<12 +   0  ; not used  , not used
      0<12 + 7<0  ; not used  , label

d5:   la  w1  0         ; check name operand:
      sh  w1  f45       ;   if kind incorrect then
      jl.     a22.      ;   goto param error;
      la. w1  f6.       ; type check:
      sn. w1 (f6.)      ;   if type = undef then
      jl.     d6.       ;   goto no type param;
      se  w1  0         ;   if type correct then
      jl.     d11.      ;   goto out end param;

a22:  jl. w2  d25.      ; param error:  type error;
      jl.     d6.       ;   goto no type param;

c42:  jl. w3  e2.       ; begin list:
      rl. w0 (f2.)      ;   w2 := no.elements;
      rl  w1  0         ;   w0 := w1 := top(operand stack);
      sn. w0 (f4.)      ;   if operand = undef then
      jl.     a23.      ;   goto output begin call;
      la. w1  f11.      ;   operand kind := w1 and begin list mask;
      la. w0  f6.       ;   operand type := w0 and all type mask;
      sz. w1 (f41.)     ;   if kind = array then
      jl.     d13.      ;   goto array;
      sz  w1  f39       ;   if kind = zone then
      jl.     d14.      ;   goto zone;
      sz  w1  f40       ;   if kind = zone array then
      jl.     d15.      ;   goto zone array;

\f

                                                                             

; rc 15.3.1971                            algol 6, pass 6, page ...16...



      so  w0  f36       ; procedure call: if type = no type
      wa. w0  f7.       ;   then kind:=0 else kind := expr;
      rs. w0 (f2.)      ;   top(operand stack) := kind + type;

a23:  bz. w0  f0.-1     ; output begin call:
      jl. w3  e3.       ;   outbyte(begin call);
      al  w0  x2        ;
      jl. w3  e3.       ;   outbyte(no of parameters);
      al  w0  h8        ;
      jl. w3  e3.       ;   outbyte(begin param);
      sz. w1 (f48.)     ;   if kind = formal proc or undef
      jl.     d18.      ;   then goto begin call formal;
      sn  w1  0         ;   if kind = 0 then
      jl.     d17.      ;   goto begin call error;
      rl. w1 (f2.)      ;
      sz  w1  f35       ;   if top(operand stack) = label
      jl.     d16.      ;   then goto switch;

      rl. w1  f3.       ; check no of parameters:
      rl  w0  2         ;   w1 := pseudo top;
      ws. w0  f1.       ;
      ls  w0  -2        ;   no.specs := (pseudo top - top)//4;
      sn  w0  x2        ;   if no.specs = no.parameters then
      jl.     a6.       ;   goto store pseudo top;
      sl  w0  x2        ;   if no.specs >= no.parameters then
      jl.     d17.      ;   goto begin call error;
      am.    (f1.)      ;
      bl  w0  5         ;   w0 := part 4(top(operator stack));
      sn  w0  g7        ;   if spec general then
      jl.     a6.       ;   goto store pseudo top;
      se  w0  g8        ;   if -,spec addr general then
      jl.     d17.      ;   goto begin call error;

a6:   rs. w1  f1.       ; store pseudo top:
      jl.     c0.       ;   operator stack pointer := pseudo top;
                        ;   goto inbyte;

d13:  wa. w0  f9.       ; array:
      rs. w0 (f2.)      ;   top(operand stack) := variable + type;
      se. w2 (f3.)      ;   if no.elements <> no.subscripts
      jl. w2  d27.      ;   then subscript error;
      al  w1  4         ;   addr incr := 4;
      jl.     d19.      ;   goto stack begin element;

d14:  wa. w0  f9.       ; zone:
      rs. w0 (f2.)      ;   top(operand stack) := variable+type;
      se  w2  1         ;   if no.elements then
      jl. w2  d28.      ;   zone error;
      al  w1  8         ;   addr incr := 8;
      jl.     d19.      ;   goto stack begin element;

\f

                                                                                  

; rc 5.1.1971                          algol 6, pass 6, page ...17...




d15:  rl. w1  f9.       ; zone array:  operand := variable;
      sn  w2  1         ;   if no.elements = 1 then
      al  w1  f39       ;   operand := zone;
      al  w1  x1+f32    ;   operand := operand + real;
      rs. w1 (f2.)      ;   top(operand stack) := operand;
      sl  w2  3         ;   if no.elements >= 3 then
      jl. w2  d28.      ;   zone error;
      al  w1  12        ;   addr incr := 12;
      jl.     d19.      ;   goto stack begin element;

d16:  al  w1  16        ; switch:  addr incr := 16;
      sn  w2  1         ;   if no.elements = 1 then
      jl.     d19.      ;   goto stack begin element;

d17:  jl. w2  d26.      ; begin call error:  call error;
d18:  al  w1  0         ; begin call formal:  addr incr := 0;
d19:  ba. w1  f0.       ; stack begin element:
d31:  dl. w0  x1+g2.    ;   index := addr incr + part 3(control word);
      jl. w2  d35.      ;   stack operator(operator table(index));
      jl.     c0.       ;   goto inbyte;

c43:  rl. w1 (f2.)      ; zone subscripts:
      am.    (f1.)      ;   w1 := top(operand stack);
      rl  w0  -2        ;   w0 := first word(top(operator stack));
      jl. w3  d3.       ;   check operand;
      jl. w3  d32.      ;   round;
      bz. w1  f0.-1     ;
      bz. w0 (f1.)      ;   w0 := part 3(operator stack top);
      sn  w1  h10       ;   if list one
      jl.     a27.      ;   then goto unstack zone list;
      sn  w1  h18       ;   if first comma then
      jl.     a28.      ;   goto out list delimiter;
      al  w0  h12       ;   w0 := end record;
      se  w1  h11       ;   if -,end list more then
      jl.     a28.      ;   goto out list delimiter;

a27:  rl. w1  f1.       ; unstack zone list:
      al  w1  x1-4      ;   operator stack pointer :=
      rs. w1  f1.       ;   operator stack pointer - 4;
a28:  jl. w3  e3.       ; out list delimiter:
      jl.     c28.      ;   outbyte(w0);  goto decrease operand stack;

\f

                                                                                

; rc 2.1.1971                           algol 6, pass 6, page ...18...




c45:  jl. w3  e2.       ; decl zone:
      hs. w2  f5.+1     ;   save no.commas := inbyte;
      jl. w3  e2.       ;
      al  w0  x2        ;   no.zones := inbyte;
      jl. w3  e3.       ;   outbyte(no.zones);
      jl. w3  e2.       ;
      al  w0  x2        ;   bl.rel := inbyte;
      jl. w3  e3.       ;   outbyte(bl.rel);
      bz. w1  f5.+1     ;
      sn  w1  2         ;   if no.commas = 2 then
      jl.     d21.      ;   goto stack pseudospecs 1;
      jl. w2  d29.      ;   zone decl. error;
      al  w2  h14+4     ;   w2 := first zone comma error spec addr;

a16:  bz. w1  f5.+1     ; zone error:
      sn  w1  0         ;   if no.commas = 0 then goto inbyte;
      jl.     c0.       ;   no.commas := 0;
      al  w0  0         ;
      hs. w0  f5.+1     ;
      jl.     d22.      ;   goto stack pseudospecs 2;

c46:  jl. w3  e2.       ; decl zone array:
      hs. w2  f5.+1     ;   no.commas := inbyte;
      jl. w3  e2.       ;
      al  w0  x2        ;   no.zones := inbyte;
      jl. w3  e3.       ;   outbyte(no.zones);
      bz. w1  f5.+1     ;
      sn  w1  3         ;   if no.commas = 3 then
      jl.     d21.      ;   goto stack pseudospec 1;
      jl. w2  d29.      ;   zone decl. error;
      al  w2  h14       ;   w2 := no.zones error spec addr;
      jl.     a16.      ;   goto zone error;

d21:  bz. w2  f0.       ; stack pseudospecs 1:  w2 := spec addr;
d22:  ls  w1  2         ; stack pseudospecs 2:
      wa. w1  f1.       ;   pseudo top := stackref :=
      sl. w1 (f2.)      ;     4*(no.commas) + operatos stack pointer;
      jl.     d23.      ;   if pseudo top >= operand stack top then
      rs. w1  f3.       ;   goto stack overflow;

a24:  dl. w0  x2+g2.    ; stack pseudospec:
      ds  w0  x1        ;   operator stack(stack ref) := operator table(w2);
      al  w1  x1-4      ;   stackref := stackref - 4;
      sh  w2  h14+8     ;   if w2 <=error spec + 4 then
      al  w2  x2+4      ;   w2 := w2 + 4;
      se. w1 (f1.)      ;   if stackref <> operator stack pointer
      jl.     a24.      ;   then goto stack pseudo spec;

      rl. w1  f3.       ; reset top:
      rs. w1  f1.       ;   operator stack pointer := pseudo top;
      jl.     c0.       ;   goto inbyte;

\f

                                                                    

; rc 2.1.1971                          algol 6, pass 6, page ...19...




c48:  bz. w0  f5.+1     ; zone block proc:
      sn  w0  0         ;   if no.commas = 0
      jl.     c1.       ;   then goto bitactions;
      rl. w0 (f2.)      ;
      sn. w0 (f4.)      ;   if top(operand stack) = undef
      jl.     c1.       ;   then goto bit actions;

      am.    (f1.)      ; check kind and type:
      la  w0  -2        ;   kind-type := operand and operator mask;
      so  w0  f36       ;   if type <> no type then
      jl.     a15.      ;   goto block proc error;
      sz. w0 (f42.)     ;   if kind = parameter procedure then
      jl.     a17.      ;   goto block proc spec check;
      so. w0 (f44.)     ;   if kind <> formal proc then
a15:  jl. w2  d30.      ; block proc error:  block proc;
      jl.     c1.       ;   goto bit actions;

a17:  rl. w0  f3.       ; block proc spec check:
      ws. w0  f1.       ;
      se  w0  12        ;   if no.specs <> 3 then
      jl.     a15.      ;   goto block proc error;
      rl. w1  f1.       ;
      bz  w0  x1+3      ;
      so  w0  f33       ;   if third param <> integer
      jl.     a15.      ;   then goto block proc error;

      bz  w0  x1+7      ;
      so  w0  f33       ;   if second param <> integer
      jl.     a15.      ;   then goto block proc error;

      bz  w0  x1+11     ;
      so. w0 (f49.)     ;   if first param <> real zone
      jl.     a15.      ;   then goto block proc error;

      jl.     c1.       ;   goto bit actions;

\f

                                                                                                    

; rc 11.1.1971                            algol 6, pass 6, page ...20...




; field operands and operators:


b25 = k + 1 ; outside field
c56:  rl. w0  f21.      ; field operand:  if outside field
      rs. w0  f0.-2     ;   then begin kind(control word) := variable;
      jl.     c3.       ;    type(control word) := integer;
                        ;   end;  goto stack and output operand;

c58:  jl. w3  e2.       ; begin list field input:  skip(no of list elements);
      am      f21-f0+2  ;   outside field := true else
c57:  al  w3  f0-2-b25+1; first point input: outside field:=false;
      hs. w3  b25.      ; not first point input:
c59:  rl. w1 (f2.)      ;   w1 := top(operand stack);
      rl. w0  f0.-2     ;   w0 := kind-type(control word);
      jl. w3  d3.       ;   check operand;
      jl.     c0.       ;   goto inbyte;

c60:  dl. w3  g9.       ; begin list field:
      am.    (f1.)      ;   nexttop(operator stack) :=
      ds  w3  -4        ;   check operator(array field subscr);
      al  w2  -1<5      ; remove bits from control word:
      la. w2  f0.       ;
      bz. w3  f0.-1     ;
      se  w3  h10       ;   if latest inbyte = end list one
      sn  w3  h11       ;   or latest inbyte = end list more
      rs. w2  f0.       ;   then bits(control word) := 0;
      jl.     c19.      ;   goto round top;

c61:  al. w3  i6.       ; array field subscript: field operator:=field subscr;
      jl.     a30.      ;   goto modify top operand;

c62:  al. w3  i4.       ; first point: field operator := field;
      so  w1  f38       ;   if kind <> simple field then
      am      f41-f9    ;   kind := array else
a30:  rl. w0  f9.       ; modify top operand:
      la. w1  f47.      ;   kind := variable;
      lo  w0  2         ;   type := operand and declarable type mask;
      rs. w0 (f2.)      ;   top(operand stack) := kind + type;

                        ; output field operator:
      ns. w1  b26.      ;   type no := normalize(kind-type and all type mask);
      so. w0 (f9.)      ;   if kind <> variable then
      am      b27       ;   type index := type no
b26 = k + 1 ; type no   ;   else
      al  w3  x3        ;   type index := type index + 22;
      bz  w0  x3+22     ;   byte := field operator(type index);
      jl. w3  e3.       ;   outbyte;
      al  w3  f21-b25+1 ;
      hs. w3  b25.      ;   outside field := true;
      jl.     c1.       ;   goto bit actions;

h.  ; field operators (output values):

i4:   h43, h44, h45, h46; simple field:  boolean, long, real, integer
i5:   h47, h48, h49, h50; array field :  boolean, long, real, integer
i6:   h51, h52, h53, h54; field subscr:  boolean, long, real, integer
b27 = i5 - i4           ; field arr incr
w.
; action on not first point is: c14 (store operand)

\f

                                                                             

; fgs.jz 1986.02.18                        algol 8, pass 6, page ...21...




f13:  <:.:>
f14:  <:  :>


d23:  al. w1  e10.      ; stack overflow:
      jl.     e5.       ;   goto pass 0 alarm (<:stack:>);

c50:  al  w0  h16       ; undeclared:
      jl. w3  e3.       ;   outbyte(trouble);
      jl.     c3.       ;   goto stack and output operand;

c49:  jl. w3  e2.       ; error:
      bl  w1  5         ;   increment := signed byte;
      sh  w1  0         ;   if increment <=0 then
      jl.     a35.      ;   goto count operand;
      ls  w2  1         ;
      rl. w1  x2+g4.    ;   w1 := error text address;
      al. w1  x1+g11.   ;
      al. w2  c0.       ;   set return(inbyte);
      sz  w1  1         ;   if bit(23,text addr table) = 1 then
      jl.     a19.      ;   goto output error messages;

d24:  al  w0  h16       ; trouble:
      jl. w3  e3.       ;   outbyte(trouble);

a19:  rs. w1  f16.      ; output error messages:
      al. w1  f13.      ;
      jl. w3  e4.       ;   message(<:operand:>);
      bz. w0  f5.       ;
      jl. w3  e14.      ;   write integer(no.operands in line);
      32<12 + 3         ;
      al. w1  f14.      ;
      jl. w3  e13.      ;   writespace;
      rl. w1  f16.      ;
      jl. w3  e13.      ;   writetext(error identification);
      al  w0  1<10      ; set warning bit:
      lo. w0  e29.      ;   modebit(warning) := true;
      rs. w0  e29.      ;   comment: pass 0 variable;

      jl      x2        ;   return;

d25:  jl. w1  d24.      ; type error:
      <:type:>          ;

d26:  jl. w1  d24.      ; call error:
      <:call:>          ;

d27:  jl. w1  d24.      ; subscript error:
      <:subscripts:>    ;

d28:  jl. w1  d24.      ; zone error:
      <:zone:>          ;

d29:  jl. w1  d24.      ; zone decl. error:
      <:zone declaration:>;

d30:  jl. w1  d24.      ; block proc:
      <:block proc:>    ;

\f

                                                                                     

; jz 1979.09.27                          algol 8, pass 6, page ...22...




b. a70, b16, i17, j26 ; begin block tables
w.                    ;


; types:

i0 = 1<0              ; boolean
i1 = 1<1              ; long
i2 = 1<2              ; real
i3 = 1<3              ; integer
i4 = 1<4              ; string
i5 = 1<5              ; label
i6 = 1<6              ; no type

i7 = 7<1              ; all arith types
i8 = 63               ; all except no type
i9 = 127              ; all types
i10= i9-i5            ; all types except label
i11= i1+i3            ; long and integer

i12= i9-i6-i5         ; all types except label and no type
i13= i0+i1+i2+i3      ; all declarable types
i14= i2+i4            ; real and string
i15= i1+i4            ; long and string
i16= i1+i2            ; long and real
i17= i2+i3            ; real and integer

; kinds:

j7 = 1<7              ; array field
j8 = 1<8              ; field
j9 = 1<9              ; zone
j10= 1<10             ; zone array
j11= 1<11             ; array
j12= 1<12             ; parameter procedure
j13= 1<13             ; no parameter procedure
j14= 1<14             ; formal procedure
j15= 1<15             ; variable
j16= 1<16             ; expression

j17= j13+j14+j15+j16  ; no param proc, formal proc, variable, expression
j18= j12+j14+j16      ; parameter procedure, formal procedure, expression
j19= j13+j14          ; no param proc, formal proc
j20= j18-j14          ; param procedure, expression
j21= j7+j8            ; array field, field
j22= j9+j11           ; zone, array
j23= 1023<7           ; all kinds
j24= j12+j13+j14      ; all procedures
j25= j12+j14          ; param proc, formal proc
j26= j12+j16          ; param proc, expression

\f

                                                                               

; rc 15.3.1971                            algol 6, pass 6, page ...23...




; priority:

b0 = 0<18, b1 = 1<18, b2 = 2<18, b3 = 3<18, b4 = 4<18, b5 = 5<18
b6 = 6<18, b7 = 7<18, b8 = 8<18, b9 = 9<18, b10=10<18, b11=11<18
b12=12<18, b13=13<18, b14=14<18, b15=15<18, b16=16<18


; action:

a0 = 0<5, a1 = 1<5, a2 = 2<5, a3 = 3<5, a4 = 4<5
a5 = 5<5, a6 = 6<5, a7 = 7<5, a8 = 8<5, a9 = 9<5
a10=10<5, a11=11<5, a12=12<5, a13=13<5, a14=14<5
a15=15<5, a16=16<5, a17=17<5, a18=18<5, a19=19<5
a20=20<5, a21=21<5, a22=22<5, a23=23<5, a24=24<5
a25=25<5, a26=26<5, a27=27<5, a28=28<5, a29=29<5
a30=30<5, a31=31<5, a32=32<5, a33=33<5, a34=34<5
a35=35<5, a36=36<5, a37=37<5, a38=38<5, a39=39<5
a40=40<5, a41=41<5, a42=42<5, a43=43<5, a44=44<5         
a45=45<5, a46=46<5, a47=47<5, a48=48<5, a49=49<5
a50=50<5, a51=51<5, a52=52<5, a53=53<5, a54=54<5
a55=55<5, a56=56<5, a57=57<5, a58=58<5, a59=59<5
a60=60<5, a61=61<5, a62=62<5, a63=63<5, a64=64<5
a65=65<5, a66=66<5, a67=67<5, a68=68<5, a69=69<5
a70=70<5


; action table:
h.
g10:

c0 - c0, c1 - c0, c2 - c0, c3 - c0, c4 - c0
c5 - c0, c6 - c0, c7 - c0, c8 - c0, c9 - c0
c10- c0, c11- c0, c12- c0, c13- c0, c14- c0
c15- c0, c16- c0, c17- c0, c18- c0, c19- c0
c20- c0, c21- c0, c22- c0, c23- c0, c24- c0
c25- c0, c26- c0, c27- c0, c28- c0, c29- c0
c30- c0, c31- c0, c32- c0, c33- c0, c34- c0
c35- c0, c36- c0, c37- c0, c38- c0, c39- c0
c40- c0, c41- c0, c42- c0, c43- c0, c44- c0        
c45- c0, c46- c0, c47- c0, c48- c0, c49- c0
c50 -c0, c51- c0, c52- c0, c53- c0, c54- c0
c55- c0, c56- c0, c57- c0, c58- c0, c59- c0
c60- c0, c61- c0, c62- c0, c63- c0, c64- c0
c65- c0, c66- c0, c67- c0, c68- c0, c69- c0
c70- c0

\f

                                                                               

; rc 15.2.1971                                  algol 6, pass 6, page ...24...




; operator table (1):

; table format:
;     1. word:  <18: priority
;               <7 : kind
;               <0 : type
;     2. word:  <12: output value
;               <5 : action no
;               <0 : bits: typecheck<4 + (top+1 check)<3 + noresult<2
;                           + outputself<1 + terminateunstack<0

w.
g2 = k + 2

;   <18   <7    <0      <12      <5    <0      ; table index

w.  b11 + j17 + i7  ,h. h3+0   , a19 + 2.11010 ; 0   add
w.  b11 + j17 + i7  ,h. h3+1   , a7  + 2.11010 ; 4   extract
w.  b11 + j17 + i7  ,h. h3+2   , a19 + 2.11010 ; 8   shift
w.  b9  + j17 + i7  ,h. h3+44  , a9  + 2.11010 ; 12  **
w.  b7  + j17 + i7  ,h. h3+5   , a6  + 2.11010 ; 16  *
w.  b7  + j17 + i7  ,h. h3+6   , a6  + 2.11010 ; 20  /
w.  b7  + j17 + i11 ,h. h3+32  , a24 + 2.11010 ; 24  //
w.  b7  + j17 + i11 ,h. h3+35  , a24 + 2.11010 ; 28  mod
w.  b5  + j17 + i7  ,h. h3+9   , a6  + 2.11010 ; 32  +
w.  b5  + j17 + i7  ,h. h3+10  , a6  + 2.11010 ; 36  -
w.  b3  + j17 + i7  ,h. h3+11  , a10 + 2.11010 ; 40  <
w.  b3  + j17 + i7  ,h. h3+12  , a10 + 2.11010 ; 44  <=
w.  b3  + j17 + i7  ,h. h3+13  , a10 + 2.11010 ; 48  =
w.  b3  + j17 + i7  ,h. h3+14  , a10 + 2.11010 ; 52  >=
w.  b3  + j17 + i7  ,h. h3+15  , a10 + 2.11010 ; 56  >
w.  b3  + j17 + i7  ,h. h3+16  , a10 + 2.11010 ; 60  <>
w. -b1  + j17 + i0  ,h. h3+29  , a1  + 2.11010 ; 64  and
w. -b3  + j17 + i0  ,h. h3+30  , a1  + 2.11010 ; 68  or
w. -b5  + j17 + i0  ,h. h3+31  , a1  + 2.11010 ; 72  ==
w.  b11 + j17 + i2  ,h. h3+53  , a12 + 2.10010 ; 76  entier
w.  b11 + j17 + i16 ,h. 0      , a47 + 2.10000 ; 80  round
w.  b11 + j17 + i7  ,h. h3+50  , a13 + 2.10010 ; 84  abs
w.  b5  + j17 + i7  ,h. h3+47  , a13 + 2.10010 ; 88  neg
w.  b5  + j17 + i7  ,h. 0      , a14 + 2.10000 ; 92  pos
w.  b1  + j17 + i0  ,h. h3+38  , a14 + 2.10010 ; 96  -,
w.  b11 + j17 + i3  ,h. 0      , a67 + 2.10000 ; 100 extend
w.  b11 + j17 + i14 ,h. h3+120 , a64 + 2.10010 ; 104 oplong
w.  b11 + j17 + i15 ,h. h3+121 , a15 + 2.10010 ; 108 opreal
w.  b11 + j17 + i16 ,h. h3+122 , a63 + 2.10010 ; 112 opstring
w. -b9  +     0     ,h. h3+40  , a1  + 2.00111 ; 116 first:=
w. -b9  +     0     ,h. h3+40  , a1  + 2.00110 ; 120 :=
w. -b9  + j17 + i0  ,h. h3+41  , a1  + 2.10110 ; 124 prep:=boolean
w. -b9  + j17 + i7  ,h. h3+41  , a19 + 2.10110 ; 128 prep:=integer
w. -b9  + j17 + i7  ,h. h3+41  , a20 + 2.10110 ; 132 prep:=real
w. -b9  + j17 + i7  ,h. h3+41  , a65 + 2.10110 ; 136 prep:=long
w. -b9  +     0     ,h. h3+41  , a1  + 2.00110 ; 140 prep:=notype

\f

                                                                              

; jz 1981.02.25                            algol 8, pass 6, page ...25...




; operator table (2):

; table format:
;     1. word:  <18: priority
;               <7 : kind
;               <0 : type
;     2. word:  <12: output value
;               <5 : action no
;               <0 : bits: typecheck<4 + (top+1 check)<3 + noresult<2
;                           + outputself<1 + terminateunstack<0


;   <18   <7    <0      <12      <5    <0      ; table index

w. -b9  +       h6  ,h. h6     , a1  + 2.00001 ; 144 if; else st
w. -b9  + j17 + i8  ,h.   0    , a14 + 2.10001 ; 148 then ex; of ex
w. -b9  + j17 + i7  ,h.   0    , a19 + 2.10101 ; 152 case
w. -b9  + j20 + i5  ,h.   0    , a1  + 2.10001 ; 156 of switch
w. -b9  + j15 + i7  ,h.   0    , a1  + 2.10001 ; 160 for
w. -b9  + j17 + i7  ,h.   0    , a27 + 2.11001 ; 164 for elements
w. -b9  + j17 + i0  ,h. h7     , a1  + 2.11001 ; 168 while
w. -b9  +     0     ,h.   0    , a1  + 2.00001 ; 172 (subex
w. -b9  + j17 + i7  ,h.   0    , a19 + 2.10101 ; 176 bound elements
w.  b13 + j21 + i13 ,h.   0    , a62 + 2.11000 ; 180 first point
w.  b15 + j21 + i13 ,h. h3+9   , a14 + 2.11010 ; 184 not first point
w. -b9  + j17 + i7  ,h.   0    , a60 + 2.11001 ; 188 begin list field

w. -b9  + j17 + i3  ,h. h3+96  , a40 + 2.00000 ; 192 spec integer
w. -b9  + j17 + i2  ,h. h3+96  , a40 + 2.00000 ; 196 spec real
w. -b9  + j17 + i1  ,h. h3+96  , a40 + 2.00000 ; 200 spec long
w. -b9  + j17 + i0  ,h. h3+96  , a40 + 2.00000 ; 204 spec boolean
w. -b9  + j9  + i2  ,h. h3+96  , a40 + 2.00000 ; 208 spec zone
w. -b9  + j16 + i4  ,h. h3+96  , a40 + 2.00000 ; 212 spec string
w. -b9  + j16 + i5  ,h. h3+96  , a40 + 2.00000 ; 216 spec label
w. -b9  + j17 + i7  ,h. h3+97  , a26 + 2.00000 ; 220 spec value real, int, long
w. -b9  + j17 + i0  ,h. h3+97  , a26 + 2.00000 ; 224 spec value boolean
w. -b9  + j11 + i3  ,h. h3+96  , a40 + 2.00000 ; 228 spec array integer
w. -b9  + j22 + i2  ,h. h3+96  , a40 + 2.00000 ; 232 spec array real
w. -b9  + j11 + i1  ,h. h3+96  , a40 + 2.00000 ; 236 spec array long
w. -b9  + j11 + i0  ,h. h3+96  , a40 + 2.00000 ; 240 spec array boolean
w. -b9  + j10 + i2  ,h. h3+96  , a40 + 2.00000 ; 244 spec zone array
w. -b9  + j24 + i6  ,h. h3+96  , a40 + 2.00000 ; 248 spec proc no type
w. -b9  + j24 + i3  ,h. h3+96  , a40 + 2.00000 ; 252 spec proc integer
w. -b9  + j24 + i2  ,h. h3+96  , a40 + 2.00000 ; 256 spec proc real
w. -b9  + j24 + i1  ,h. h3+96  , a40 + 2.00000 ; 260 spec proc long
w. -b9  + j24 + i0  ,h. h3+96  , a40 + 2.00000 ; 264 spec proc boolean
w. -b9  + j12 + i5  ,h. h3+96  , a40 + 2.00000 ; 268 spec switch
w. -b9  + j23 + i9  ,h. h3+96  , a40 + 2.00000 ; 272 spec undef (one param)
w. -b9  + j23 + i9  ,h. h3+96  , a41 + 2.00000 ; 276 spec general

\f

                                                                                                     

; jz 1980.02.25                            algol 8, pass 6, page ...26...




; operator table (3):

; table format:
;     1. word:  <18: priority
;               <7 : kind
;               <0 : type
;     2. word:  <12: output value
;               <5 : action no
;               <0 : bits:  typecheck<4 + (top+1 check)<3 + noresult<2
;                            + outputself<1 + terminateunstack<0


;   <18   <7    <0      <12      <5    <0      ; table index

w. -b9  + j17 + i3  ,h. h3+98  , a40 + 2.00000 ; 280 spec addr integer
w. -b9  + j17 + i2  ,h. h3+98  , a40 + 2.00000 ; 284 spec addr real
w. -b9  + j17 + i1  ,h. h3+98  , a40 + 2.00000 ; 288 spec addr long
w. -b9  + j17 + i0  ,h. h3+98  , a40 + 2.00000 ; 292 spec addr boolean
w. -b9  + j23 + i9  ,h. h3+98  , a22 + 2.00000 ; 296 spec addr general
w. -b9  +     0     ,h. h3+96  , a40 + 2.00000 ; 300 spec unacceptable
w. -b9  + j23 + i9  ,h. h3+96  , a41 + 2.00000 ; 304 spec repeat general

w. -b9  + j17 + i7  ,h.   0    , a19 + 2.10101 ; 308 begin list array
w. -b9  + j17 + i7  ,h. h3+105 , a43 + 2.00111 ; 312 begin list zone
w. -b9  + j17 + i7  ,h. h3+104 , a43 + 2.00111 ; 316 begin list zone array
w. -b9  + j17 + i7  ,h. h3+97  , a40 + 2.00000 ; 320 begin list switch
w. -b9  + j17 + i3  ,h. h3+110 , a1  + 2.10111 ; 324 no.zones pseudospec
w. -b9  + j17 + i3  ,h. h3+111 , a1  + 2.10111 ; 328 1st comma pseudospec
w. -b9  + j17 + i3  ,h. h3+112 , a1  + 2.10111 ; 332 2nd comma pseudospec
w. -b9  +     0     ,h. h3+110 , a1  + 2.00111 ; 336 no.zones error spec
w. -b9  +     0     ,h. h3+111 , a1  + 2.00111 ; 340 1st comma error spec
w. -b9  +     0     ,h. h3+112 , a1  + 2.00111 ; 344 2nd comma error spec
w. -b9  + j25 + i6  ,h. h3+113 , a48 + 2.00111 ; 348 end zone local

g3 = k + 2                                     ; check operators
w. -b9  + j17 + i0  ,h. h6     , a14 + 2.10001 ; 352 boolean
w. -b9  + j17 + i7  ,h. h6     , a66 + 2.10001 ; 356 long
w. -b9  + j17 + i7  ,h. h6     , a23 + 2.10001 ; 360 real
w. -b9  + j17 + i7  ,h. h6     , a14 + 2.10001 ; 364 integer
w. -b9  + j16 + i4  ,h. h6     , a1  + 2.10001 ; 368 string
w. -b9  + j26 + i5  ,h. h6     , a1  + 2.10001 ; 372 label
w. -b9  +     0     ,h. h6     , a53 + 2.00001 ; 376 no type

w.  b13 + j21 + i13 ,h.   0    , a61 + 2.11000 ; 380 array field subscript
g9 = k - 2

w. -b9  + j17 + i7  ,h.   0    , a69 + 2.11001 ; 384 until
g7 = a41 + 2.00000
g8 = a22 + 2.00000
\f



                                                                                    

; jz 1980.02.25                           algol 6, pass 6, page ...27...




; input table:  operators (1):

; table format:
;     1. word:  <18: priority
;               <7 : kind or empty
;               <0 : type or output value or empty
;     2. word:  <12: output value or operator table index or empty
;               <5 : action no
;               <0 : bits: stack<2 + output<1 + (then,while elem do)<0


g1 = k + 2

;   <18   <7    <0      <12      <5    <0    ; input value

w.  b14 +   h17+31  ,h.   0    , a0  + 2.010 ; 198 disable
w.  b14 +   h17+32  ,h.   0    , a0  + 2.010 ; 199 enable
w.  b14 + j19 + i9  ,h. h3+94  , a55 + 2.000 ; 200 proc;
w.  b14 +   h3+42   ,h. 144    , a0  + 2.110 ; 201 if
w. -b8  + j17 + i0  ,h. h3+43  , a54 + 2.001 ; 202 thenex
w. -b10 +   h3+3    ,h.   0    , a21 + 2.010 ; 203 elseex
w.  b14 + j18 + i10 ,h. h3+95  , a70 + 2.000 ; 204 delete call
w. -b10 +   h3+4    ,h.   0    , a68 + 2.010 ; 205 end else ex
w. -b10 +   h3+55   ,h.   0    , a0  + 2.010 ; 206 end else st
w. -b10 +   h3+55   ,h.   0    , a0  + 2.010 ; 207 end then st
w.  b14 +   h3+74   ,h.   0    , a29 + 2.010 ; 208 end goto
w.  b14 +   h3+59   ,h. 160    , a0  + 2.110 ; 209 for
w. -b10 +   h3+62   ,h. 164    , a0  + 2.110 ; 210 step
w. -b10 +   h3+63   ,h. 384    , a0  + 2.110 ; 211 until
w.  b6  + j17 + i11 ,h. 28     , a5  + 2.100 ; 212 mod
w.  b4  + j17 + i7  ,h. 32     , a5  + 2.100 ; 213 +
w.  b4  + j17 + i7  ,h. 36     , a5  + 2.100 ; 214 -
w.  b6  + j17 + i7  ,h. 16     , a5  + 2.100 ; 215 *
w.  b6  + j17 + i7  ,h. 20     , a8  + 2.100 ; 216 /
w.  b6  + j17 + i11 ,h. 24     , a5  + 2.100 ; 217 //
w.  b8  + j17 + i7  ,h. 12     , a8  + 2.100 ; 218 **
w.  b10 + j17 + i12 ,h. 8      , a5  + 2.100 ; 219 shift
w.  b10 + j17 + i12 ,h. 4      , a5  + 2.100 ; 220 extract
w.  b10 + j17 + i12 ,h. 0      , a5  + 2.100 ; 221 add
w. -b10 +    h3+88  ,h. 176    , a0  + 2.110 ; 222 first bound
w. -b10 +    h3+89  ,h. 176    , a0  + 2.110 ; 223 not first bound
w. -b10 +    h3+58  ,h. 156    , a0  + 2.110 ; 224 of switch
w. -b10 +    h3+119 ,h. 0      , a28 + 2.010 ; 225 end switch
w. -b2  + j17 + i0  ,h. 64     , a5  + 2.100 ; 226 and
w. -b4  + j17 + i0  ,h. 68     , a5  + 2.100 ; 227 or
w. -b4  + j17 + i0  ,h. 68     , a11 + 2.100 ; 228 imply
w. -b6  + j17 + i0  ,h. 72     , a5  + 2.100 ; 229 ==
w.  b14 +     0     ,h. 172    , a0  + 2.100 ; 230 (subex
w. -b10 +     0     ,h.  0     , a0  + 2.000 ; 231 )subex
w. -b10 +   h3+67   ,h.  0     , a28 + 2.010 ; 232 simple for do
w. -b10 +   h3+68   ,h.  0     , a28 + 2.010 ; 233 step elem do
w. -b10 +   h3+69   ,h.  0     , a28 + 2.011 ; 234 while elem do

\f

                                                                                    

; rc 22.1.1971                             algol 6, pass 6, page ...28...




; input table:  operators (2):

; table format:
;     1. word:  <18: priority
;               <7 : kind or empty
;               <0 : type or output value or empty
;    2. word:   <12: output value or operator table index or empty
;               <5 : action no
;               <0 : bits: stack<2 + output<1 + (then,while elem do)<0


;   <18   <7    <0      <12      <5    <0    ; input value

w.  b14 +   h3+79   ,h. 152    , a0  + 2.110 ; 235 case
w. -b10 +   h3+80   ,h. 148    , a0  + 2.110 ; 236 of ex
w. -b10 +   h3+8    ,h.   0    , a68 + 2.010 ; 237 end case ex
w. -b10 +   h3+7    ,h.   0    , a21 + 2.010 ; 238 case comma
w.  b14 +   h3+56   ,h.   0    , a0  + 2.010 ; 239 case semicolon
w.  b14 +     0     ,h.   0    , a34 + 2.000 ; 240 vanished operand
w.  b14 +     0     ,h.   0    , a35 + 2.000 ; 241 internal operand
w.  b2  + j17 + i7  ,h. 40     , a5  + 2.100 ; 242 <
w.  b2  + j17 + i7  ,h. 44     , a5  + 2.100 ; 243 <=
w.  b2  + j17 + i7  ,h. 48     , a5  + 2.100 ; 244 =
w.  b2  + j17 + i7  ,h. 52     , a5  + 2.100 ; 245 >=
w.  b2  + j17 + i7  ,h. 56     , a5  + 2.100 ; 246 >
w.  b2  + j17 + i7  ,h. 60     , a5  + 2.100 ; 247 <>
w.  b0  +     0     ,h. 96     , a0  + 2.100 ; 248 -,
w.  b12 +     0     ,h. 76     , a0  + 2.100 ; 249 entier
w.  b4  +     0     ,h. 92     , a0  + 2.100 ; 250 pos
w.  b4  +     0     ,h. 88     , a0  + 2.100 ; 251 neg
w.  b12 +     0     ,h. 84     , a0  + 2.100 ; 252 abs
w.  b12 +     0     ,h. 80     , a0  + 2.100 ; 253 round
w.  b12 +     0     ,h. 100    , a0  + 2.100 ; 254 extend
w.  b12 +     0     ,h. 104    , a0  + 2.100 ; 255 oplong
w.  b12 +     0     ,h. 108    , a0  + 2.100 ; 256 opreal
w.  b12 +     0     ,h. 112    , a0  + 2.100 ; 257 opstring
w. -b8  + j17 + i0  ,h. h3+43  , a55 + 2.001 ; 258 then st
w. -b10 +   h3+54   ,h. 144    , a0  + 2.110 ; 259 else st
w. -b10 +   h3+80   ,h.   0    , a0  + 2.010 ; 260 of st
w.  b14 +   h3+57   ,h.   0    , a0  + 2.010 ; 261 end case st
w. -b10 +   h3+100  ,h.   0    , a0  + 2.010 ; 262 end list one
w. -b10 +   h3+101  ,h.   0    , a0  + 2.010 ; 263 end list more
w. -b10 +   h3+102  ,h. 308    , a0  + 2.110 ; 264 first comma
w. -b10 +   h3+103  ,h. 308    , a0  + 2.110 ; 265 not first comma
w.  b12 + j22 + i13 ,h. 180    , a57 + 2.100 ; 266 first point
w.  b14 + j7  + i13 ,h. 184    , a59 + 2.100 ; 267 not first point
w. -b10 +     0     ,h.   0    , a0  + 2.000 ; 268 zone comma
w. -b10 +     0     ,h. 176    , a0  + 2.100 ; 269 bound colon
w. -b10 +   h3+61   ,h. 164    , a0  + 2.110 ; 270 simple for elem

\f

                                                                                       

; rc 1976.08.17                             algol 6, pass 6, page ...29...




; input table:  operators (3):

; table format:
;     1. word:  <18: priority
;               <7 : kind or empty
;               <0 : type or output value or empty
;     2. word:  <12: output value or operator table index or empty
;               <5 : action no
;               <0 : bits: stack<2 + output<1 + (then,while elem do)<0


;   <18   <7    <0      <12      <5    <0    ; input value

w. -b10 +   h3+60   ,h. 164    , a0  + 2.110 ; 271 :=for
w. -b10 +   h3+64   ,h. 164    , a0  + 2.110 ; 272 step elem
w. -b10 +   h3+66   ,h. 164    , a0  + 2.110 ; 273 while elem
w. -b10 +   h3+65   ,h. 168    , a0  + 2.111 ; 274 while
w. -b10 +     0     ,h.   0    , a0  + 2.000 ; 275 end assign
w.  b12 +   h3+39   ,h. 120    , a17 + 2.110 ; 276 :=
w.  b12 +   h3+39   ,h. 116    , a16 + 2.110 ; 277 first:=
w.  b14 +   h3+83   ,h.   0    , a0  + 2.010 ; 278 end block
w.  b14 +   h3+93   ,h.   0    , a0  + 2.010 ; 279 end zone block
w.  b14 +   h3+116  ,h.   0    , a0  + 2.010 ; 280 while label
w.  b14 +     0     ,h. 124    , a18 + 2.000 ; 281 prep assign
w.  b14 +   h3+72   ,h.   0    , a0  + 2.010 ; 282 goto bypass label
w.  b14 +   h3+73   ,h.   0    , a0  + 2.010 ; 283 bypass label
w.  b14 +     0     ,h. 348    , a0  + 2.100 ; 284 end zone local
w.  b14 +     0     ,h.   0    , a0  + 2.000 ; 285 do
w.  b14 +   h3+70   ,h.   0    , a0  + 2.010 ; 286 end do
w.  b14 +   h3+71   ,h.   0    , a0  + 2.010 ; 287 end single do
w.  b16 +   h3+117  ,h.   0    , a36 + 2.010 ; 288 new line
w.  b14 +   h3+81   ,h.   0    , a0  + 2.010 ; 289 beg external
w.  b14 +   h3+82   ,h.   0    , a32 + 2.010 ; 290 beg block
w.  b14 +   h3+92   ,h.   0    , a30 + 2.010 ; 291 beg proc
w.  b14 +   h3+76   ,h.   0    , a30 + 2.010 ; 292 take array
w.  b14 +   h3+77   ,h.   0    , a0  + 2.010 ; 293 take zone array
w.  b14 +   h3+78   ,h.   0    , a28 + 2.010 ; 294 take value
w.  b14 +   h3+90   ,h.   0    , a25 + 2.010 ; 295 end bounds
w. -b10 +     0     ,h.   0    , a0  + 2.000 ; 296 end zone decl
w.  b14 +   h3+84   ,h.   0    , a0  + 2.010 ; 297 exit block
w.  b14 +   h3+115  ,h.   0    , a51 + 2.010 ; 298 end external
w.  b14 +   h3+85   ,h.   0    , a0  + 2.010 ; 299 exit proc not
w.  b14 +   h3+86   ,h.   0    , a0  + 2.010 ; 300 exit type proc
w.  b14 +   h3+75   ,h.   0    , a32 + 2.010 ; 301 label colon
w.  b14 +   h3+91   ,h. 304    , a42 + 2.000 ; 302 begin list
w.  b14 + j7  + i13 ,h. 188    , a58 + 2.100 ; 303 begin list field
w.  b14 +   h3+87   ,h. 176    , a33 + 2.110 ; 304 begin bounds
w.  b14 +   h3+108  ,h. 328    , a45 + 2.010 ; 305 begin zone
w.  b14 +   h3+109  ,h. 324    , a46 + 2.010 ; 306 begin zone array
w.  b14 +     0     ,h.   0    , a49 + 2.000 ; 307 error
w.  b14 +   h3+114  ,h.   0    , a52 + 2.010 ; 308 end pass

\f

                                                                                  

; rc 15.2.1971                              algol 6, pass 6, page ...30...




; input table:  operands (1):

; table format:
;     1. word:  <18: priority
;               <7 : kind
;               <0 : type
;     2. word:  <12: output value
;               <5 : action no


;   <18   <7    <0      <12      <5  ; input value

w.  b16 + j23 + i9  ,h. h17+5  , a50 ; 309 undeclared
w.  b16 + j16 + i5  ,h. h17+28 , a3  ; 310 label
w.  b16 + j12 + i5  ,h. h17+18 , a3  ; 311 switch
w.  b16 + j16 + i5  ,h. h17+10 , a3  ; 312 formal label
w.  b16 + j12 + i5  ,h. h17+18 , a3  ; 313 formal switch
w.  b16 + j13 + i3  ,h. h17+21 , a3  ; 314 proc no par integer
w.  b16 + j13 + i2  ,h. h17+23 , a3  ; 315 proc no par real
w.  b16 + j13 + i1  ,h. h17+22 , a3  ; 316 proc no par long
w.  b16 + j13 + i0  ,h. h17+20 , a3  ; 317 proc no par boolean
w.  b16 + j13 + i6  ,h. h17+24 , a3  ; 318 proc no par not
w.  b16 + j12 + i3  ,h. h17+17 , a2  ; 319 proc par integer
w.  b16 + j12 + i2  ,h. h17+19 , a2  ; 320 proc par real
w.  b16 + j12 + i1  ,h. h17+18 , a2  ; 321 proc par long
w.  b16 + j12 + i0  ,h. h17+16 , a2  ; 322 proc par boolean
w.  b16 + j12 + i6  ,h. h17+24 , a2  ; 323 proc par not
w.  b16 + j15 + i3  ,h. h17+5  , a3  ; 324 simple integer
w.  b16 + j15 + i2  ,h. h17+7  , a3  ; 325 simple real
w.  b16 + j15 + i1  ,h. h17+6  , a3  ; 326 simple long
w.  b16 + j15 + i0  ,h. h17+4  , a3  ; 327 simple boolean
w.  b16 + j8  + i3  ,h. h17+5  , a56 ; 328 integer field
w.  b16 + j8  + i2  ,h. h17+5  , a56 ; 329 real field
w.  b16 + j8  + i1  ,h. h17+5  , a56 ; 330 long field
w.  b16 + j8  + i0  ,h. h17+5  , a56 ; 331 boolean field
w.  b16 + j7  + i3  ,h. h17+5  , a56 ; 332 integer array field
w.  b16 + j7  + i2  ,h. h17+5  , a56 ; 333 real array field
w.  b16 + j7  + i1  ,h. h17+5  , a56 ; 334 long array field
w.  b16 + j7  + i0  ,h. h17+5  , a56 ; 335 boolean array field
w.  b16 + j9  + i2  ,h. h17+25 , a3  ; 336 zone
w.  b16 + j11 + i3  ,h. h17+13 , a3  ; 337 integer array
w.  b16 + j11 + i2  ,h. h17+15 , a3  ; 338 real array
w.  b16 + j11 + i1  ,h. h17+14 , a3  ; 339 long array
w.  b16 + j11 + i0  ,h. h17+12 , a3  ; 340 boolean array
w.  b16 +     0     ,h.    0   , a38 ; 341 dope description
w.  b16 + j10 + i2  ,h. h17+27 , a3  ; 342 zone array

\f

                                                                           

; rc 15.2.1971                             algol 6, pass 6, page ...31...




; input table:  operands (2):

; table format:
;     1. word:  <18: priority
;               <7 : kind
;               <0 : type
;     2. word:  <12: output value
;               <5 : action no


;   <18   <7    <0      <12     <5  ; input value

w.  b16 + j14 + i3  ,h. h17+17 ,a3  ; 343 formal proc integer
w.  b16 + j14 + i2  ,h. h17+19 ,a3  ; 344 formal proc real
w.  b16 + j14 + i1  ,h. h17+18 ,a3  ; 345 formal proc long
w.  b16 + j14 + i0  ,h. h17+16 ,a3  ; 346 formal proc boolean
w.  b16 + j14 + i6  ,h. h17+24 ,a3  ; 347 formal proc not
w.  b16 + j15 + i3  ,h. h17+9  ,a3  ; 348 formal simple integer
w.  b16 + j15 + i2  ,h. h17+11 ,a3  ; 349 formal simple real
w.  b16 + j15 + i1  ,h. h17+10 ,a3  ; 350 formal simple long
w.  b16 + j15 + i0  ,h. h17+8  ,a3  ; 351 formal simple boolean
w.  b16 + j8  + i3  ,h. h17+9  ,a56 ; 352 formal integer field
w.  b16 + j8  + i2  ,h. h17+9  ,a56 ; 353 formal real field
w.  b16 + j8  + i1  ,h. h17+9  ,a56 ; 354 formal long field
w.  b16 + j8  + i0  ,h. h17+9  ,a56 ; 355 formal boolean field
w.  b16 + j7  + i3  ,h. h17+9  ,a56 ; 356 formal int array field
w.  b16 + j7  + i2  ,h. h17+9  ,a56 ; 357 formal real array field
w.  b16 + j7  + i1  ,h. h17+9  ,a56 ; 358 formal long array field
w.  b16 + j7  + i0  ,h. h17+9  ,a56 ; 359 formal boo array field
w.  b16 + j16 + i4  ,h. h17+10 ,a3  ; 360 formal string
w.  b16 + j11 + i3  ,h. h17+9  ,a3  ; 361 anonymous array integer
w.  b16 + j11 + i2  ,h. h17+11 ,a3  ; 362 anonymous array real
w.  b16 + j11 + i1  ,h. h17+10 ,a3  ; 363 anonymous array long
w.  b16 + j11 + i0  ,h. h17+8  ,a3  ; 364 anonymous array boolean
w.  b16 + j9  + i2  ,h. h17+26 ,a3  ; 365 formal zone
w.  b16 + j16 + i3  ,h. h17+1  ,a3  ; 366 integer literal
w.  b16 + j16 + i2  ,h. h17+3  ,a37 ; 367 real literal
w.  b16 + j16 + i1  ,h. h17+2  ,a37 ; 368 long literal
w.  b16 + j16 + i0  ,h. h17+0  ,a44 ; 369 boolean literal
w.  b16 + j16 + i4  ,h. h17+29 ,a37 ; 370 string first
w.  b16 +     0     ,h. h17+30 ,a4  ; 371 string next

\f

                                                                                     

; jz 1980.02.15                            algol 8, pass 6, page ...32...




; input table:  specifications:

; table format:
;     1. word:  <18: priority
;                rest unused
;     2. word:  <12: operator table index
;               <5 : action no
;               rest unused


;   <18     <12   <5 ; input value

w.  b16 ,h. 204 , a39; 372 spec simple boolean
w.  b16 ,h. 192 , a39; 373 spec simple integer
w.  b16 ,h. 196 , a39; 374 spec simple real
w.  b16 ,h. 200 , a39; 375 spec simple long 
w.  b16 ,h. 300 , a39; 376 spec simple long real
w.  b16 ,h. 300 , a39; 377 spec complex
w.  b16 ,h. 208 , a39; 378 spec zone
w.  b16 ,h. 212 , a39; 379 spec string
w.  b16 ,h. 216 , a39; 380 spec label
w.  0   ,h. 0   , 0  ; 381 not possible
w.  b16 ,h. 224 , a39; 382 spec value boolean
w.  b16 ,h. 220 , a39; 383 spec value integer
w.  b16 ,h. 220 , a39; 384 spec value real
w.  b16 ,h. 220 , a39; 385 spec value long
w.  b16 ,h. 300 , a39; 386 spec value long real
w.  b16 ,h. 300 , a39; 387 spec value complex
w.  b16 ,h. 292 , a39; 388 spec address boolean
w.  b16 ,h. 280 , a39; 389 spec address integer
w.  b16 ,h. 284 , a39; 390 spec address real
w.  b16 ,h. 288 , a39; 391 spec address long
w.  b16 ,h. 300 , a39; 392 spec address long real
w.  b16 ,h. 300 , a39; 393 spec address complex
w.  b16 ,h. 240 , a39; 394 spec array boolean
w.  b16 ,h. 228 , a39; 395 spec array integer
w.  b16 ,h. 232 , a39; 396 spec array real
w.  b16 ,h. 236 , a39; 397 spec array long
w.  b16 ,h. 300 , a39; 398 spec array long real
w.  b16 ,h. 300 , a39; 399 spec array complex
w.  b16 ,h. 244 , a39; 400 spec zone array
w.  b16 ,h. 248 , a39; 401 spec proc no type
w.  b16 ,h. 264 , a39; 402 spec proc boolean
w.  b16 ,h. 252 , a39; 403 spec proc integer
w.  b16 ,h. 256 , a39; 404 spec proc real
w.  b16 ,h. 260 , a39; 405 spec proc long
w.  b16 ,h. 300 , a39; 406 spec proc long real
w.  b16 ,h. 300 , a39; 407 spec proc complex
w.  b16 ,h. 268 , a39; 408 spec switch
w.  b16 ,h. 276 , a39; 409 spec general
w.  b16 ,h. 296 , a39; 410 spec address general
w.  b16 ,h. 272 , a39; 411 spec undefined

i.  ; id list
e.  ; end block tables

\f

                                                                                             

; jz.fgs.1981.03.02                            algol 8, pass 6, page ...33...




b. b24  ; begin block error texts
w.      ;
g11:

b0:   <:-delimiter:>
b1:   <:delimiter:>,0
b2:   <:-operand:>
b3:   <:operand:>
b4:   <:termination:>
b5:   <:head:>
b6:   <:external:>
b7:   <:char or illegal:>,0
b9:   <:comment:>
b10:  <:layout:>,0
b11:  <:right par improper:>,0
b12:  <:begin ends:>
b14:  <:undeclared:>
b15:  <:+declaration<0>:>
b16:  <:for label:>,0
b17:  <:local:>
b18:  <:constant:>
b19:  <:text:>
b20:  <:context label<0>:>
b21:  <:context zone<0>:>
b22:  <:context proc<0>:>
b23:  <:case elements<0>:>
b24:  <:compiler directive syntax:>

; error text address table:

g4 = k - 2
b0-b0    , b1 -b0   , b2 -b0   , b3 -b0   , b4-b0    ;   1- 5  
b5 -b0   , b6 -b0   , b7 -b0+1 ,      0   , b9-b0    ;   6-10
b10-b0   , b11-b0   , b12-b0   ,      0   , b14-b0+1  ; 11-15
b15-b0+1 , b16-b0   , b17-b0   , b18-b0   , b19-b0    ; 16-20
b20-b0   , b21-b0   , b22-b0   , b23-b0   , b24-b0    ; 21-25

g0 = k + 2  ; operator stack bottom:
-11<19      ;

g5 = (:k-j0:)
e30=e30+g5
g6 = (:g0-g2:)

i.  ; id list
e.  ; end block error texts

i.  ; id list
e.  ; end pass 6

m. jz 1986.02.27 algol 8, pass 6

\f

▶EOF◀