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

⟦5d3d5bfd8⟧ TextFile

    Length: 79872 (0x13800)
    Types: TextFile
    Names: »algpass43tx «

Derivation

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

TextFile



; jz 1979.09.27                                algol 8, pass 4, page ...1...






s. a53, b32, c46, d39, f14, g22, h11, i13, j10



d0  = 511   ; search               stackvalue
d3  = 282   ; goto bypass          outputvalue
d4  = 283   ; bypass label         outputvalue
d5  = 123   ; end head             outputvalue
d6  = 129   ; end do               stackvalue
d7  = 4     ; decl label           stackvalue
d8  = 5     ; decl for label       stackvalue
d9  = 1     ; vanished operand     inputvalue
d10 = 240   ; vanished operand     outputvalue
d12 = 120   ; end bound head       outputvalue
d13 = 2     ; array increment      byte
d14 = 119   ; end zone head        outputvalue
d15 = 125   ; end check local      outputvalue
d16 = 124   ; end decl             outputvalue
d17 = 116   ; specifications       outputvalue, stackvalue
d18 = 48    ; end spec             inputvalue
d19 = 4     ; spec array increment byte
d20 = 41    ; begin external       inputvalue
d21 = 38    ; exit proc            inputvalue
d22 = 39    ; exit type proc       inputvalue
d23 = 111   ; begin block          outputvalue
d24 = 112   ; begin external       outputvalue
d25 = 113   ; end pass 4           outputvalue
d26 = 118   ; end zone array head  outputvalue
d31 = 33    ; end clean            input value
d32 = 123   ; end block            input value
d33 = 126   ; exit block           output value
d34 = 519   ; exit                 input value
d35 = 139   ; error                output value
d36 = 21    ; error ident          <:context label:>
d37 = 2     ; error ident          <:delimiter:>
d38 = 520   ; continue             input value
d39 = 24    ; error ident          <:case elements:>
h11 = 100   ; max no of bytes in aux stack


k = e0           ;

w. h6            ; no of words in pass 4
h. h7 , 4<1 + 1  ; entry rel to e0, pass 4, change direction
w.               ;

\f

                                                                                                                                                                             

; rc 3.12.1970                               algol 6, pass 4, page ...2...




a0:   bz. w0  x2+f1.    ; stack out next:
      jl. w3  g5.       ;   w0 := stackvalue(byte);  stack;
c0:                     ; outnext:
a1:   bz. w0  x2+f2.    ;   w0 := outvalue(byte);
a2:   jl. w3  e3.       ; out:  outbyte;
c1:                     ; next:
a3:   jl. w3  e2.       ;   byte := inbyte;
a4:   al  w0  x2        ; after next:  w0 := byte;
      sl  w2  h3        ;   if byte >= no interest then
      jl.     a2.       ;   goto out;
      bl. w3  x2+f0.    ;
j0:   jl.     x3        ;   goto action(byte);
                        ; next relevant:
g0:   ds. w3  b1.       ;   save(return,byte);
a5:   jl. w3  e2.       ; input:  byte := inbyte;
      sl  w2  h0        ;   if byte > max special interest then
      jl.     a6.       ;   goto byte found;
      bl. w3  x2+f3.    ;
j1:   jl.     x3        ;   goto action aux(byte);
                        ; byte found:
a6:   al  w0  x2        ;   w0 := byte;
      rl. w2  b0.       ;   byte := saved byte;
      jl.    (b1.)      ;   return;
                        ; error 1:
c2:   al  w0  x2        ;   w0 := byte;
      jl. w3  e2.       ;   byte := inbyte;
      rx  w2  0         ;   swap(w0,byte);
      jl. w3  e3.       ;   outbyte;
      jl.     a7.       ;   goto vanished operand 1;
                        ; new line 1:
c3:   jl. w3  e1.       ;   carret;
c4:                     ; vanished operand 1:
a7:   bz. w0  x2+f2.    ;   w0 := outvalue(byte);
      jl. w3  e3.       ;   outbyte;
      jl.     a5.       ;   goto input;

b0:   0  ; saved byte   ;
b1:   0  ; saved return ;
                        ; test goto bypass:
g1:   am      d3-d4     ;   w0 := <goto bypass>;  goto test active;
g2:   al  w0  d4        ; test bypass:  w0 := <bypass>;
i0 = k + 1 ; active     ; test active:
      sn  w0  d3        ;   if w0 = active then
      jl      x3        ;   return;
      hs. w0  i0.       ;   active := w0;
      jl.     e3.       ;   goto outbyte;

\f

                                                                                                                                                                        

; rc 3.12.1970                                    algol 6, pass 4, page ...3...





g3:   al  w0  d5        ; test inhead:
i1 = k + 1 ; end head   ;   w0 := <end head>;
      sn  w0  0         ;   if inhead then
      jl      x3        ;   return;
      hs. w0  i1.       ;   inhead := true;
      jl.     e3.       ;   goto outbyte;

g4:   ds. w3  b3.       ; copy bytes:  save(return,byte);
a8:   jl. w3  e2.       ; copy:  byte := inbyte;
      rx  w2  0         ;   swap(byte,w0);
      jl. w3  e3.       ;   outbyte;
      al  w0  x2-1      ;   w0 := byte-1;
      se  w0  0         ;   if w0 <> 0 then
      jl.     a8.       ;   goto copy;
      rl. w2  b2.       ;   restore(byte);
      jl.    (b3.)      ;   return;

b2:   0  ; saved byte   ;
b3:   0  ; saved return ;
c40:                    ; output van:
a9:   al  w0  d10       ;   w0 := vanished operand;
      jl. w3  e3.       ;   outbyte;
c5:                     ;
a10:  jl. w3  g0.       ; trouble:
      bz  w2  1         ;   byte := next relevant;
      sl  w0  512       ;   if byte > 511 then
      jl.     a9.       ;   goto output van;
      sl  w0  h2        ;   if byte > max out of trouble then
      jl.     a10.      ;   goto trouble;
      sh  w0  h1        ;   if byte <= max literal then
      jl.     a11.      ;   goto skip literal;
      al  w0  1         ; trouble terminated:
      rs. w0  b12.      ;   counter := 1;
      jl.     a4.       ;   goto after next;
a11:  bl. w3  x2+f3.    ; skip literal:
      hs. w3  i12.      ;   further := auxilliary table(byte);
      al  w3  5         ;   index :=
      bs. w3  x2+f1.    ;    (5 - stackvalue(byte))*2;
      am      x3        ;   goto case index of
      jl.     x3        ;   begin skip 4; skip 3; skip 2; skip 1; end;
      jl. w3  e2.       ; skip 4: inbyte;
      jl. w3  e2.       ; skip 3: inbyte;
      jl. w3  e2.       ; skip 2: inbyte;
      jl. w3  e2.       ; skip 1: inbyte;

i12= k + 1 ; further    ;
j2:   jl.     0         ;   goto action(further);


\f

                                                                                                                                                              

; rc 3.12.1970                                 algol 6, pass 4, page ...4...





g5:   al  w1  x1+1      ; stack:
      sl. w1 (b6.)      ;   stacktop := stacktop + 1;
      jl.     a12.      ;   if stacktop >= usetop then goto stack alarm;
      hs  w0  x1        ;   corebyte(stacktop) := w0;

      rx. w1  b22.      ;   bytes in stack :=
      al  w1  x1+1      ;     bytes in stack + 1;
      sl. w1 (e9.)      ;   if bytes in stack >= inf 1 then
      rs. w1  e9.       ;   inf 1 := bytes in stack;
      rx. w1  b22.      ;
      jl      x3        ;   return;

a12:  al. w1  e10.      ; stack alarm:
      jl.     e5.       ;   alarm(<:stack:>);

g6:   bz  w0  x1        ; unstack:
      al  w1  x1-1      ;   w0 := corebyte(stacktop);
      rx. w1  b22.      ;   stacktop := stacktop - 1;
      al  w1  x1-1      ;   bytes in stack :=
      rx. w1  b22.      ;     bytes in stack - 1;
      jl      x3        ;   return;

b22:  0  ; bytes in stack ;

g7:   rx. w1  b6.       ; stack in use:
      al  w1  x1-2      ;   usetop := usetop - 2;
      sh. w1 (b6.)      ;   if usetop <= stacktop then
      jl.     a12.      ;   goto stack alarm;
      rs  w0  x1        ;   core(usetop) := w0;

      rx. w1  b23.      ;
      al  w1  x1+1      ;   words in use :=
      sl. w1 (e9.+2)    ;     words in use + 1;
      rs. w1  e9.+2     ;   if words in use >= inf 2 then
      rx. w1  b23.      ;   inf 2 := words in use;
      rx. w1  b6.       ;
      jl      x3        ;   return;

b23:  0  ; words in use ;

g8:   ds. w0  b5.       ; cancel entry in use:
      dl. w0  b8.       ;   core(entry) :=
      ds. w0 (b7.)      ;   core(entry-2) := <cancelled entry>;
      rl. w0  b5.       ;
      rx. w1  b23.      ;   words in use :=
      al  w1  x1-1      ;     words in use - 1;
      rx. w1  b23.      ;
      jl.    (b4.)      ;   return;

b4:   0  ; saved return ;
b5:   0  ; saved w0     ;
b6:   0  ; usetop       ;
b7:   0  ; entry        ;
h4:   0  ; initial usetop ;

      am    0             ; cancelled entry
b8:   am    0             ; in use stack;

\f

                                                                                                                                                                    

; rc 29.05.75                                     algol 6, pass 4, page ...5...





 
; search use stack:
;   the routine searches in use stack from usetop to first blockstop
;   for identifier given in w0; on return w0, w1, w2 are unchanged and
;   if found:    w3 = no of parameters; entry = usestack entry + 1;
;   if not found:w3 = 0;                entry = address of blockstop + 1;
; note please at return w0=w0 extract 12;


g9:   rs. w3  b9.       ; search use:
      bl  w0  1         ;
      jl. w3 (b6.)      ;   goto core(usetop);
      jl.     a13.      ;   a search in the usestack terminates
      jl.     a13.      ;   in the entry in this table corresponding
      jl.     a13.      ;   to the number of parameters;
      jl.     a13.      ;
      jl.     a13.      ;   usestack formats:
      jl.     a13.      ;
      jl.     a13.      ;   normal entry:        sn  w0  <identifier>
a13:  bz  w0  1         ;
      al  w3  x3-1      ;                        jl  w3  x3+<parameters>
      rs. w3  b7.       ;
      bz  w3  x3        ;   cancelled entry:     am      0
      jl.    (b9.)      ;                        am      0

b9:   0  ; saved return ;   block stop:          jl  w3  x3


\f

                                                                                                                                                                          

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





c6:   al  w0  d5        ; do:
      jl. w3  e3.       ;   w0 := <end head>; outbyte;

      rl. w0  b31.      ;
      bs. w0  1         ;   dolevel :=
      rs. w0  b31.      ;    dolevel - 1;
      al  w0  0         ;
      hs. w0  i3.       ;   last decl := 0;
      al  w0  x1-1      ;
      rs. w0  b10.      ;   top := stacktop - 1;

a14:  al  w1  x1-1      ; search end do:
      bz  w0  x1+1      ;   stacktop := stacktop - 1;
      se  w0  d6        ;   if corebyte(stacktop+1) <> <end do> then
      jl.     a14.      ;   goto search end do;

a15:  sn. w1 (b10.)     ; output for label list:
      jl.     a1.       ;   if stacktop = top then goto outnext;
      al  w1  x1+1      ;   stacktop := stacktop + 1;
      bz  w0  x1+1      ;   w0 := corebyte(stacktop + 1);
      sh  w0  511       ;   if  w0 < 512 then
      jl.     a17.      ;   goto change last label decl;
i2 = k + 1 ; last label ;
      am      0         ;
      se  w3  x3-d8     ;   if last label <> <decl for label> then
      jl. w3  e3.       ;   outbyte;

a16:  hs  w0  x1        ; move stack byte:  corebyte(stacktop) := w0;
      jl.     a15.      ;   goto output for label list;

a17:  hs. w0  i2.       ; change last label decl:
      al  w0  d8        ;   last label := w0;  w0 := <decl for label>;
      jl.     a16.      ;   goto move stack byte;

b10:  0  ; top          ;
b31:  0  ; dolevel

c7:   jl. w3  e1.       ; new line:
      jl.     a1.       ;   carret;  goto outnext;

c8:   al  w0  0         ; end do:
      hs. w0  i3.       ;   last decl := 0;
      rl. w0  b31.      ;
      ba. w0  1         ;   dolevel :=
      rs. w0  b31.      ;    dolevel + 1;
      jl.     a0.       ;   goto stack out next;

g10:  bz. w0  x2+f1.    ; test decl:
i3 = k + 1 ; last decl  ;   w0 := stackvalue(byte);
      sn  w0  0         ;   if w0 = last decl then
      jl      x3        ;   return;
      hs. w0  i3.       ;   last decl := w0;
      jl.     g5.       ;   goto stack;

c9:   bz. w0  x2+f1.    ; literal:  w0 := stackvaluetable(byte);
      al. w3  a1.       ;   set return(outnext);
      jl.     g4.       ;   goto copy bytes;

\f

                                                                                                                                                             

; rc 1977.11.15                                  algol 6, pass 4, page ...7...





f4:   0  ;  0  owns      ; counts(0) ;
      0  ;  2  variables ; counts(2) ;
      0  ;  4  points    ; counts(4) ;

b12:  1  ;  counter      ;
b13:  0  ;  proclevel    ;
b14:  0  ;  beginlevel   ;
      0  ;  blocklevel   ; b14+2     ;

c10:  jl. w3  g10.      ; declare simple:
      jl. w3  g3.       ;   test decl;  test inhead;
      al. w3  a3.       ;   set return(next);
g11:                    ;
      rs. w3  b11.      ; stack and copy:  save (return);
a18:  jl. w3  g0.       ; stack and copy 1:  next relevant;
      sh  w0  511       ;   if w0 < 512 then
      jl.     a19.      ;   goto end ident;

      jl. w3  g5.       ;   stack;
      jl. w3  e3.       ;   outbyte;
      bz. w3  x2+f3.    ;
      ld  w0  -6        ;   where to count := bits(0,5,auxtable(byte));
      ls  w0  -18       ;   counts(where to count) :=
      wa. w0  x3+f4.    ;    counts(where to count) +
      rs. w0  x3+f4.    ;    bits(6,11,auxtable(byte));
      jl.     a18.      ;   goto stack and copy 1;

a19:  jl. w3  e11.      ; end ident:
      bz. w3  x2+f0.    ;   repeat input byte;
      am.    (b13.)     ;
      se  w3  x3        ;   if proclevel = 0 or
      so  w3  1         ;      bit(11,actiontable(byte)) = 0 then
      jl.    (b11.)     ;   return;

      al  w0  d0        ;   w0 := <search>;
      rl. w3  b11.      ;   restore(return);
      jl.     g5.       ;   goto stack;

b11:  0  ; saved return ;

c11:  jl. w3  g10.      ; declare label:  test decl;
      jl. w3  g0.       ;   w0 := next relevant;
      jl. w3  e11.      ;   repeat input byte;
      se  w0  d34       ;   if w0 = exit
      sn  w0  d38       ;   or w0 = continue then
      jl.     a49.      ;   then goto delim error;
 
a21:  al. w3  a1.       ; declare:  set return(outnext);
      jl.     g11.      ;   goto stack and copy;
 
a49:  al  w0  d37       ; delim error:
      jl. w3  e3.       ;
      al  w0  d35       ;   outbyte(error ident(<:delimiter:>));
      jl. w3  e3.       ;   outbyte(error);
      jl.     a21.      ;   goto declare;

\f

                                                                                                                                                                          

; rc 3.12.1970                                   algol 6, pass 4, page ...8...





g12:  ls  w0  12        ; test array decl:
      hs. w0  i3.       ;   last decl := 0;
      bz  w0  0         ;
g14:  se  w3  x3        ; test zone decl:
      jl.     e3.       ;   if declaration then
                        ;   goto outbyte;
      al  w2  d11       ;   byte := <decl undef>;
      jl.     c10.      ;   goto declare simple;

c12:  al  w0  d12       ; declare array:  w0 := <end bound head>;
      jl. w3  g12.      ;   test array decl;
      al  w3  0         ;
      hs. w3  g14.+1    ;   declaration := false;
      jl. w3  g10.      ;   test decl;
      rl. w0  b12.      ;   w0 := counter - 1;
      bs. w0  1         ;
      jl. w3  g5.       ;   stack;
      rl. w3  f4.+2     ;
      wa  w3  0         ;
      wa  w3  0         ;   variables := variables +
      al  w3  x3+d13    ;                 2 * w0 + decl array increment;
      rs. w3  f4.+2     ;
      jl.     a21.      ;   goto declare;

c13:  am      d14-d26   ; declare zone:  w0 := <end zone head>; goto zone;
c14:  al  w0  d26       ; declare zone array:  w0 := <end zone array head>;
      hs. w0  i4.       ; zone:  head := w0;
      jl. w3  a41.      ;   check local;
      rl. w0  b12.      ;   w0 := counter;
      jl. w3  g14.      ;   test zone decl;
      al  w3  0         ;
      hs. w3  g14.+1    ;   declaration := false;
      jl. w3  g10.      ;   test decl;
i4 = k + 1 ; head       ;
      al  w0  0         ;   w0 := head;
      al. w3  a21.      ;   set return(declare);
      jl.     e3.       ;   outbyte;

c15:  jl. w3  g3.       ; end zone decl:
      jl. w3  g1.       ;   test inhead;  test goto bypass;
      al  w3  1         ;
      hs. w3  g14.+1    ;   declaration := true;
      al  w0  0         ;
      rs. w0  b12.      ;   counter := 0;
      hs. w0  i10.      ;   zone comma received := true;   check local := true;
      jl.     a1.       ;   goto outnext;

c39:  al. w3  c31.      ; zone comma: set return(count parameters);
i10 = k + 1 ; zo. co. re; check local:
a41:  se  w3  x3+1      ;   if zone comma received then
      jl      x3        ;    begin
      al  w0  d15       ;     w0 := <check local>;
      hs. w0  i10.      ;     zone comma received := false;  outbyte;
      jl.     e3.       ;    end;  return;

\f

                                                                                                                                                                                                   

; jz 1979.09.27                               algol 8, pass 4, page ...9...


c17:  al  w1  x1-1      ; decl proc int or boo:
      jl.     a38.      ;   stacktop := stacktop - 1;
                        ;   goto decl parproc int or boo;
c18:  al  w1  x1-1      ; decl proc real or long:  stacktop := stacktop - 1;
c19:  am      2         ; decl parproc real or long:  w0 := 4;
c38:                    ;   goto count variables;
a38:  al  w0  2         ; decl parproc int or boo:  w0 := 2;
      wa. w0  f4.+2     ; count variables:
      rs. w0  f4.+2     ;   variables := variables + w0;
      jl. w3  g0.       ;   next relevant;
      jl. w3  e3.       ;   outbyte;
      jl. w3  e11.      ;   repeat input byte;
      jl.     a22.      ;   goto declare par proc no type;
c20:  al  w1  x1-1      ; decl proc no type:
c21:                    ;   stacktop := stacktop - 1;
a22:  rl. w3  b13.      ; decl parproc no type:
      al  w3  x3-1      ;   proclevel :=
      rs. w3  b13.      ;     proclevel - 1;
      al. w3  a20.      ;   set return(declare proc);
g13:  rs. w3  b16.      ; blockhead:
      am.    (b13.)     ;   save(return);
      sn  w3  x3        ;   if proclevel = 0 then
      jl.     a39.      ;   goto out of block;
      al  w0  1         ; collaps use stack:
      jl. w3  g9.       ;   w0 := 1;  search use;
      jl. w3  g7.       ;   stack in use;
      jl. w3  g7.       ;   stack in use;
      rs. w2  b15.      ;   save(byte);
      rl. w2  b7.       ;   usetop :=
      al  w2  x2+1      ;     entry + 1;
      rs. w2  b6.       ;   index := usetop;
a23:  al  w2  x2-4      ; collaps:
      bz  w0  x2-1      ;   index := index - 4;  w0 := byte(index-1);
      sn  w0  1         ;   if w0 = 1 then
      jl.     a24.      ;   goto finis collaps;
      jl. w3  g9.       ;   search use;
      se  w3  0         ;   if found then
      jl.     a23.      ;   goto collaps;
      rl  w0  x2        ;   w0 := core(index);
      jl. w3  g7.       ;   stack in use;
      rl  w0  x2-2      ;   w0 := core(index-2);
      jl. w3  g7.       ;   stack in use;
      jl.     a23.      ;   goto collaps;
 
c43:  al  w0  4         ; decl switch:
      wa. w0  f4.+2     ;   variables :=
      rs. w0  f4.+2     ;     variables + 4;
      jl. w3  a52.      ;   check case elements;
      jl.     a22.      ;   goto decl parproc no type;

\f


                                                                                                 

; jz 1979.09.27                            algol 8, pass 4, page ...10...




                        ; finis collaps:
a24:  rl. w2  b15.      ;   restore(byte);
a39:  jl. w3  g1.       ; out of block: test goto bypass label;
      ac. w0 (f4.+2)    ;   w0 := -variables;
      sh  w0  -2048     ;   if w0 <= -2048 then
      al  w0  -2048     ;   w0 := -2048;
      jl. w3  e3.       ;   outbyte;
      rl. w3  b14.+2    ;
      al  w3  x3-1      ;   blocklevel :=
      rs. w3  b14.+2    ;     blocklevel - 1;
i5 = k + 1 ; variables1 ;
      al  w0  0         ;   variables := variables 1;
      rs. w0  f4.+2     ;
      sl  w3  1         ;   if blocklevel > 0 then
      jl.    (b16.)     ;   return;
      bz. w0  x2+f2.    ;   w0 := outvalue(byte);
      jl. w3  e3.       ;   outbyte;
      jl.     a33.      ;   goto finis pass 4;
b15:  0  ; saved byte   ;
b16:  0  ; saved return ;
 
f11:  1  ; case elem count;
f12:  0  ; save return in check case elements;
 
c44:  rl. w0  f11.      ; end case:
      jl. w3  g21.      ;   stack in aux(case elem count);
      al  w3  1         ;
      rs. w3  f11.      ;   case elem count := 1;
      jl.     c0.       ;   goto outnext;
 
c45:  al. w3  c0.       ; set return(outnext);
a52:  rs. w3  f12.      ; check case elements:
      rl. w3  f11.      ;   save return;
      sl  w3  2047      ;   if case elem count >= 2047 then
      jl.     a50.      ;    goto case overflow;
                        ; unstack case elem count:
a51:  jl. w3  g22.      ;   unstack from aux(case elem count);
      rs. w0  f11.      ;
      jl.    (f12.)     ;   return;
 
c46:  rl. w3  f11.      ; count case elements:
      al  w3  x3+1      ;   count := case elem count + 1;
      sl  w3  2047      ;   if count >= 2047 then
      al  w3  2047      ;    count := 2047;
      rs. w3  f11.      ;   case elem count := count;
      jl.     c0.       ;   goto outnext;
 
a50:  al  w0  d39       ; case overflow:
      jl. w3  e3.       ;   outbyte(errorident,<:case elements:>);
      al  w0  d35       ;
      jl. w3  e3.       ;   outbyte(error);
      jl.     a51.      ;   goto unstack case elem count;
 
\f


 
; jz.fgs 1981.03.20                      algol 8, pass 4, page ...10a...
  
  
  
  
f13: 0  ; aux stack top
f14: 0  ; max aux stack top
 
 
g21: rx. w3  f13.      ; stack in aux:
     al  w3  x3-1      ;   top := aux stack top - 1;
     sh. w3 (f14.)     ;   if top <= max aux stack top then
     jl.     a53.      ;    goto aux stack alarm;
     hs  w0  x3        ;   aux stack(top) := w0;
     rx. w3  f13.      ;   aux stack top := top;
     jl      x3        ;   return;
 
g22: rx. w3  f13.      ; unstack from aux:
     bz  w0  x3        ;   w0 := aux stack top(top);
     al  w3  x3+1      ;   top:=aux stack top+1;
     rx. w3  f13.      ;   aux stack top := top;
     jl      x3        ;   return;
 
a53: jl. w1  e5.       ; aux stack alarm:
     <:aux stack<0>:>;
 
\f



; rc 1977.11.03                                   algol 6, pass 4, page ...11...





c22:  rl. w3  b14.      ; begin:
      al  w3  x3-1      ;   beginlevel :=
      rs. w3  b14.      ;     beginlevel - 1;
      sl  w3  1         ;   if beginlevel > 0 then
      jl.     a3.       ;   goto next;
      jl. w3  g3.       ;   test inhead;
      al  w0  d16       ;   w0 := <end decl>;
      jl. w3  e3.       ;   outbyte;
                        ; unstack decl:
a25:  jl. w3  g6.       ;   unstack;
a26:  sn  w0  0         ; test stack byte:
      jl.     a28.      ;   if w0 = 0 then goto block stop;
      al. w3  a25.      ;   set return(unstack decl);
      se  w0  d0        ;   if w0 <> <search> then
      jl.     e3.       ;   goto outbyte;
                        ; search:
a27:  jl. w3  g6.       ;   unstack;
      sh  w0  511       ;   if w0 < 512 then
      jl.     a26.      ;   goto test stack byte;
      jl. w3  g9.       ;   search use;
      se  w3  0         ;   if found then
      jl. w3  g8.       ;   cancel entry in use;
      al. w3  a27.      ;   set return(search);
      jl.     e3.       ;   goto outbyte;
                        ; block stop:
a28:  jl. w3  g6.       ;   unstack;
      rs. w0  b14.      ;   beginlevel := w0;
      jl. w3  g6.       ;   unstack;
      hs. w0  i3.       ;   last decl := w0;
      jl. w3  g6.       ;   unstack;
      hs. w0  i5.       ;   variables 1 := w0;
      jl. w3  g6.       ;
      rs. w0  b31.      ;   dolevel := unstack;
      al  w0  d17       ;   w0 := <specifications>;
      al. w3  a3.       ;   set return(next);
      sn  w2  d18       ;   if byte = <end specifications> then
      jl.     g5.       ;   goto stack;
      al  w0  0         ;
      hs. w2  i1.       ;   inhead := false;
      al. w3  a1.       ;   set return(outnext);
      jl.     g13.      ;   goto blockhead;
                        ; for element:
c23:  bz. w0  x2+f1.    ; assign:
i9 = k + 1 ; warning    ;   w0 := stackvalue(byte);
      se  w3  x3        ;   if warning then
      jl. w3  e3.       ;   outbyte;
                        ; simple for:
c24:  am      -1        ;   warning := false;  goto outnext;
c25:  al  w0  1         ; set warning:
      hs. w0  i9.       ;   warning := true;
      jl.     a1.       ;   goto outnext;

\f

                                                                                                                                                                    

; rc 3.12.1970                                    algol 6, pass 4, page ...12...





c16:  jl. w3  g1.       ; spec zone array:  test goto bypass;
c26:  jl. w3  g0.       ; spec search:  next relevant;
      jl. w3  e11.      ;   repeat input byte;
      jl. w3  g9.       ;   search use;
      al  w0  x3        ;   w0 := w3;
      hs. w0  i6.       ;   saved ident := w0;
      se  w3  0         ;   if found then
      jl. w3  g8.       ;   cancel entry in use;
      bz. w3  x2+f0.    ;   w3 := action table(byte);
      sz  w3  1         ;   if  bit(11,w3) = 0
      sn  w0  0         ;     or w0 = 0 then
      jl.     c28.      ;   goto spec other;
      jl. w3  g1.       ;   test goto bypass;
      jl. w3  g0.       ;   next relevant;
      jl. w3  e3.       ;   outbyte;
      bz. w0  i6.       ;   w0 := number of params;
      jl. w3  e3.       ;   outbyte;
      rl. w3  f4.+2     ;
      wa  w3  0         ;
      wa  w3  0         ;   variables := variables +
      al  w3  x3+d19    ;         2*w0 + spec array increment;
      rs. w3  f4.+2     ;
      bz. w0  x2+f1.    ;   w0 := stackvalue(byte);
      jl. w3  g5.       ;   stack;
      bz. w0  x2+f3.    ;   w0 := auxtable(byte);
      al. w3  a3.       ;   set return(next);
      jl.     e3.       ;   goto outbyte;

c27:  jl. w3  g1.       ; specvalue:  test goto bypass;

c28:  jl. w3  g0.       ; specother:  next relevant;
      al. w3  a0.       ;   set return(stack out next);
      jl.     e3.       ;   goto outbyte;

c29:  jl. w3  g3.       ; bounds:  test inhead;
      al  w3  1         ;
      hs. w3  g14.+1    ;   declaration := true;
      jl. w3  g1.       ;   test goto bypass;

a29:  al  w3  1         ; clear counter:  w3 := 1;
      jl.     a30.      ;   goto store counter;

c30:  rl. w0  b12.      ; start count:  w0 := counter;
      al. w3  a29.      ;   set return(clear counter);
      jl.     g5.       ;   goto stack;

c31:  rl. w3  b12.      ; count parameters:
      al  w3  x3+1      ;   w3 := counter + 1;
      sl  w3  511       ;   if w3 >= 511 then
      al  w3  510       ;   w3 := 510;

a30:  rs. w3  b12.      ; store counter:  counter := w3;
      jl.     a1.       ;   goto outnext;

\f

                                                                                                                                                         

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



c41:                    ; first field point:
      am      -1        ;   list kind := -,begin list else
c32:  al  w3  1         ; begin list:
      hs. w3  i13.      ;   listkind := begin list;
      jl. w3  g0.       ;   next relevant;
      jl. w3  e11.      ;   repeat input byte;
      sh  w0  511       ;   if not identifier then
      jl.     a1.       ;   goto outnext;
      am.    (b31.)     ; check exit operator:
      se  w3  x3        ;   if dolevel = 0
      se  w0  d34       ;   or ident <> exit then
      jl.     a48.      ;   goto check proc level;
      rs. w0  b32.      ;   save w0;
      al  w0  d36       ; exit in do loops:
      jl. w3  e3.       ;   outbyte(
      al  w0  d35       ;     error ident(<:context label:>),
      jl. w3  e3.       ;     error);
      rl. w0  b32.      ;   restore w0;
 
a48:  am.    (b13.)     ; check proc level:
      sn  w3  x3        ;   if proclevel = 0 then
      jl.     a31.      ;   goto output counter;
      jl. w3  g9.       ;   search use;
      se  w3  0         ;   if found then
      jl.     a44.      ;   goto get max parameters;
      hs. w0  i6.       ;   save ident := w0;
      rl. w0  b12.      ;   w0 := counter;
      bz. w3  i13.      ;
      sn  w3  0         ;   if list kind = first point then
      al  w0  1         ;   w0 := 1;
      sl  w0  15        ;   if w0 >= 15
      al  w0  15        ;   w0 := 15;
      wa. w0  b18.      ;   w0 := w0 + <jl w3 x3>;
      jl. w3  g7.       ;   stack in use;
i6 = k + 1 ; save ident ;
      al  w0  0         ;   w0 := save ident;
      bz  w0  1         ;
      wa. w0  b17.      ;   w0 := w0 + <sn w0 0>;
      jl. w3  g7.       ;   stack in use;

i13=k+1 ; list kind     ; output counter:
a31:  sn  w3  x3        ;   if list kind <> begin list then
      jl.     a1.       ;   goto outnext;
c42:  jl. w3  g6.       ; begin list field:   unstack;
      rx. w0  b12.      ;   swap(w0,counter);
      al. w3  a1.       ;   set return(outnext);
      jl.     e3.       ;   goto outbyte;

b17:  sn  w0  0         ; normal entry in use:
b18:  jl  w3  x3        ;
b32:  0  ; saved w0

a44:  sl. w3 (b12.)     ; get max parameters:
      jl.     a31.      ;   if no of param >= counter then
      bz. w3  i13.      ;   then goto output counter;
      sn  w3  0         ;   if list kind = first field point then
      jl.     a1.       ;   goto outnext;
      rl. w3  b12.      ;
      sl  w3  15        ;   no of param(entry) :=
      al  w3  15        ;   if no of param >= 15 then 15
      hs. w3 (b7.)      ;   else counter;
      jl.     a31.      ;   goto output counter;

\f

                                                                                                                                                                                                                       

; rc 3.12.1970                                 algol 6, pass 4, page ...14...





a20:  al  w0  0         ; declare proc:
      hs. w0  i3.       ;   last decl := 0;
      rl. w3  h4.       ;
      sn. w0 (b13.)     ;   if proclevel = 0 then
      rs. w3  b6.       ;   usetop := initial usetop;
      sn. w0 (b13.)     ;   if proclevel = 0
      rs. w0  b23.      ;   then words in use := 0;
      bz. w0  x2+f2.    ;   w0 := outvalue(byte);
      jl. w3  e3.       ;   outbyte;
      al  w0  d4        ;
      hs. w0  i0.       ;   active := <bypass label>;
      jl. w3  g10.      ;   test decl;
      jl. w3  g3.       ;   test inhead;
      jl. w3  g11.      ;   stack and copy;

      bz. w3  i7.       ;
      am.    (b14.+2)   ;
      sn w3  x3-1       ;   if blocklevel <> 1 or
      se  w3  d20       ;     -,external then
      jl.     a3.       ;   goto next;

      hs. w0  i7.       ;   external := w0 = <begin external>;
      jl.     a3.       ;   goto next;

c33:  jl. w3  g0.       ; end external:  next relevant;
      jl. w3  e11.      ;   repeat input byte;
      al  w3  d20       ;
      se  w0  d21       ;   if w0 = <exit proc> or
      sn  w0  d22       ;      w0 = <exit type proc> then
      hs. w3  i7.       ;   external := true;
      jl.     c36.      ;   goto exit block;

c34:  al  w0  d23       ; begin external:
      am      -d20      ;   w0 := <begin block>;
i7 = k + 1 ; external   ;
      se  w3  x3        ;   if -,external then
      hs. w0  x2+f2.    ;   outvalue(byte) := <begin block>;
      jl.     c22.      ;   goto begin;

\f


                                                                                                                          

; jz 1979.09.27                         algol 8, pass 4, page ...15...





a33:                    ; finis pass 4:
      rl. w1  f14.      ;   for usetop := stack bottom step -1
a34:  al  w1  x1-1      ;    until top of std proc suite do
      bz  w0  x1        ;   begin
      jl. w3  e3.       ;    w0 := corebyte(stacktop);
      se. w1 (b19.)     ;    outbyte;
      jl.     a34.      ;   end;
i11 = k + 1 ; ident lim ;
      al  w0  0         ;   w0 := ident lim;
      jl. w3  e3.       ;   outbyte;
      rl. w0  f4.       ;   w0 := owns;
      sl  w0  2047      ;   if w0 >= 2047 then
      al  w0  -2048     ;   w0 := -2048;
      jl. w3  e3.       ;   outbyte;
      rl. w0  f4.+4     ;   w0 := points;
      sl  w0  2047      ;   if w0>=2047 then
      al  w0  -2048     ;   w0:=-2048;
      jl. w3  e3.       ;   outbyte;
      jl.     e7.       ;   goto end pass;
b19:  -13;   top of std proc suite; (the constant is the length of an entry)

\f

                                                                                                                                                                      

; rc 1977.11.23                             algol 6, pass 4, page ...16...





c35:  jl. w3  g3.       ; exit proc:
      jl. w3  g2.       ;   test inhead;
      rl. w3  b13.      ;   test bypass;
      al  w3  x3+1      ;   proclevel := proclevel + 1;
      rs. w3  b13.      ;
      al  w0  0         ;
      hs. w0  i1.       ;   inhead := false;
 
c36:  rl. w0  b31.      ; exit block:
      jl. w3  g5.       ;   stack dolevel);
      al  w0  0         ;
      rs. w0  b31.      ;   dolevel := 0;
 
      rl. w0  f4.+2     ;   w0 := variables;
      sl  w0  2043      ;   if two many variables
      al  w0  2042      ;   then variables := great;
      jl. w3  g5.       ;   w0 := variables;  stack;
      bz. w0  i3.       ;   w0 := last decl;
      jl. w3  g5.       ;   stack;
      rl. w0  b14.      ;   w0 := beginlevel;
      jl. w3  g5.       ;   stack;
      al  w0  0         ;
      rs. w0  f4.+2     ;   variables := w0 :=
      hs. w0  i3.       ;    last decl := 0;
      al  w3  1         ;
      rs. w3  b14.      ;   begin level := 1;
      jl. w3  g5.       ;   stack;
      rl. w3  b14.+2    ;
      al  w3  x3+1      ;   blocklevel :=
      rs. w3  b14.+2    ;    blocklevel + 1 ;
      al  w0  d3        ;
      hs. w0  i0.       ;   active := <goto bypass>;
      rl. w0  b21.      ;   w0 := <use block stop>;
      jl. w3  g7.       ;   stack in use;
      jl.     a1.       ;   goto outnext;

b21:  jl  w3  x3        ; useblockstop;

c37:  rl. w3  b14.      ; end clean:
      al  w3  x3+1      ;
      rs. w3  b14.      ;   beginlevel := beginlevel + 1;
      jl.     a3.       ;   goto next;
\f




; rc 3.12.1970                                   algol 6, pass 4, page ...17...


; action table (1)

; the marks +1 are used in some actions to
; distinguish variants of the same action


h.              ; input                          action
                ;
f0:   c7-j0     ;  0   new line                  new line
      c0-j0     ;  1   vanished operand          outnext
      c0-j0     ;  2   internal operand          outnext
      c9-j0     ;  3   error                     literal

h0 = k - f0     ;
; max special interest

      c9-j0     ;  4   integer literal           literal
      c9-j0     ;  5   real literal              literal
      c9-j0     ;  6   long literal              literal
      c9-j0     ;  7   boolean literal           literal
      c9-j0     ;  8   string first              literal
      c9-j0     ;  9   string next               literal

h1 = k - 1 - f0 ;
; max literal
; inputbytes from here to <max out of trouble> terminates trouble

      c10-j0    ; 10   decl simple integer       declare simple
      c10-j0    ; 11   decl simple real          declare simple
      c10-j0    ; 12   decl simple long          declare simple
      c10-j0    ; 13   decl simple boolean       declare simple
      c10-j0    ; 14   decl integer field        declare simple
      c10-j0    ; 15   decl real field           declare simple
      c10-j0    ; 16   decl long field           declare simple
      c10-j0    ; 17   decl boolean field        declare simple
      c10-j0    ; 18   decl integer array field  declare simple
      c10-j0    ; 19   decl real array field     declare simple
      c10-j0    ; 20   decl long array field     declare simple
      c10-j0    ; 21   decl boolean array field  declare simple
      c13-j0+1  ; 22   decl zone                 declare zone
      c11-j0    ; 23   decl label                declare label
      c10-j0    ; 24   decl own integer          declare simple
      c10-j0    ; 25   decl own real             declare simple
      c10-j0    ; 26   decl own long             declare simple
      c10-j0    ; 27   decl own boolean          declare simple
      c12-j0+1  ; 28   decl integer array        declare array
      c12-j0+1  ; 29   decl real array           declare array
      c12-j0+1  ; 30   decl long array           declare array
      c12-j0+1  ; 31   decl boolean array        declare array
      c14-j0+1  ; 32   decl zone array           declare zone array

      c37-j0    ; 33   end clean                 end clean
      c36-j0    ; 34   exit block                exit block
      c33-j0    ; 35   end external              end external
      c29-j0    ; 36   end bounds                bounds
      c15-j0    ; 37   end zone decl             end zone decl
      c35-j0    ; 38   exit proc no type         exit proc
      c35-j0    ; 39   exit proc type            exit proc

\f

                                                                                                       

; jz 1979.09.27                            algol 8, pass 4, page ...18...


; action table (2)


                ; input                         action

      c22-j0    ; 40  begin                     begin
      c34-j0    ; 41  begin external            begin external
      c1 -j0    ; 42  ;                         next
      c6 -j0    ; 43  do                        do
      c0 - j0   ; 44  then statm                outnext
      c0 -j0    ; 45  else statm                outnext
      c0 -j0    ; 46  of statm                  outnext
      c44-j0    ; 47  end case statm            end case
      c22-j0    ; 48  end spec                  begin
      c46-j0    ; 49  case semicolon            count case elements
      c8 -j0    ; 50  end do                    end do
      c8 -j0    ; 51  end single do             end do
 
; max out of trouble
h2 = k - f0     ;
 
      c30-j0    ; 52  end list one              start count
      c30-j0    ; 53  end list more             start count
      c31-j0    ; 54  first comma               count parameters
      c31-j0    ; 55  not first comma           count parameters
      c41-j0    ; 56  first point               first field point
      c0 -j0    ; 57  not first point           outnext
      c39-j0    ; 58  zone comma                zone comma
      c31-j0    ; 59  bound colon               bound colon, count param
      c32-j0    ; 60  begin list                begin list
      c42-j0    ; 61  begin list field          output counter
      c5 -j0    ; 62  trouble                   trouble

      c21-j0+1  ; 63  decl parproc no type      decl parproc no type
      c38-j0+1  ; 64  decl parproc integer      decl parproc int or boo
      c19-j0+1  ; 65  decl parproc real         decl parproc real or long
      c19-j0+1  ; 66  decl parproc long         decl parproc real or long
      c38-j0+1  ; 67  decl parproc boolean      decl parproc int or boo
      c43-j0+1  ; 68  decl switch               decl switch
      c20-j0    ; 69  decl proc no type         decl proc no type
      c17-j0    ; 70  decl proc integer         decl proc int or boo
      c18-j0    ; 71  decl proc real            decl proc real or long
      c18-j0    ; 72  decl proc long            decl proc real or long
      c17-j0    ; 73  decl proc boolean         decl proc int or boo
      c20-j0+1  ; 74  decl proc undef           decl proc no type

d11 = k - 1 - f0;

      c28-j0    ; 75  spec simple integer       spec other
      c28-j0    ; 76  spec simple real          spec other
      c28-j0    ; 77  spec simple long          spec other
      c28-j0    ; 78  spec simple boolean       spec other
      c28-j0    ; 79  spec integer field        spec other
      c28-j0    ; 80  spec real field           spec other
      c28-j0    ; 81  spec long field           spec other
      c28-j0    ; 82  spec boolean field        spec other
\f



                                                                                    

; jz 1979.09.27                            algol 8, pass 4, page ...19...


; action table (3)


                ; input                              action

      c28-j0    ; 83  spec integer array field       spec other
      c28-j0    ; 84  spec real array field          spec other
      c28-j0    ; 85  spec long array field          spec other
      c28-j0    ; 86  spec boolean array field       spec other
      c26-j0    ; 87  spec zone                      spec search
      c28-j0    ; 88  spec string                    spec other
      c28-j0    ; 89  spec label                     spec other
      c27-j0    ; 90  spec value integer             spec value
      c27-j0    ; 91  spec value real                spec value
      c27-j0    ; 92  spec value long                spec value
      c27-j0    ; 93  spec value boolean             spec value
      c27-j0    ; 94  spec value integer field       spec value
      c27-j0    ; 95  spec value real field          spec value
      c27-j0    ; 96  spec value long field          spec value
      c27-j0    ; 97  spec value boolean field       spec value
      c27-j0    ; 98  spec value integer array field spec value
      c27-j0    ; 99  spec value real array field    spec value
      c27-j0    ; 100 spec value long array field    spec value
      c27-j0    ; 101 spec value boolean array field spec value
      c26-j0+1  ; 102 spec integer array             spec search
      c26-j0+1  ; 103 spec real array                spec search
      c26-j0+1  ; 104 spec long array                spec search
      c26-j0+1  ; 105 spec boolean array             spec search
      c16-j0    ; 106 spec zone array                spec zone array
      c26-j0    ; 107 spec proc no type              spec search
      c26-j0    ; 108 spec proc integer              spec search
      c26-j0    ; 109 spec proc real                 spec search
      c26-j0    ; 110 spec proc long                 spec search
      c26-j0    ; 111 spec proc boolean              spec search
      c26-j0    ; 112 spec switch                    spec search
      c26-j0    ; 113 spec undef                     spec search
      c26-j0    ; 114 spec general                   spec search

      c24-j0    ; 115 simple for elem                simple for
      c23-j0    ; 116 :=for                          for element
      c23-j0    ; 117 step elem                      for element
      c23-j0    ; 118 while elem                     for element
      c25-j0    ; 119 while                          set warning
      c25-j0    ; 120 end assign                     set warning 
      c23-j0    ; 121 :=                             assign
      c23-j0    ; 122 first:=                        assign
      c0 -j0    ; 123 end block                      outnext
      c0 -j0    ; 124 end zone block                 outnext
      c0 -j0    ; 125 of expr                        outnext
      c44-j0    ; 126 end case expr                  end case
      c46-j0    ; 127 case comma                     count case elements
      c0 -j0    ; 128 of switch                      outnext
      c44-j0    ; 129 end switch                     end case
      c45-j0    ; 130 case                           check case elements

; no interest:
h3 = k - f0     ;

\f

                                                                                                                          

; rc 3.12.1970                                   algol 6, pass 4, page ...20...


; stackvalue table (1)


h.              ; input                          stackvalue
                ;
f1:   0         ;  0   new line                  not used
      0         ;  1   vanished operand          not used
      0         ;  2   internal operand          not used
      1         ;  3   error                     bytes to copy

; max special interest

      2         ;  4   integer literal           bytes to copy
      4         ;  5   real literal              bytes to copy
      4         ;  6   long literal              bytes to copy
      1         ;  7   boolean literal           bytes to copy
      4         ;  8   string first              bytes to copy
      4         ;  9   string next               bytes to copy

; max literal
; inputbytes from here to <max out of trouble> terminates trouble

      48        ; 10   decl simple integer       decl simple integer
      49        ; 11   decl simple real          decl simple real
      50        ; 12   decl simple long          decl simple long
      51        ; 13   decl simple boolean       decl simple boolean
      52        ; 14   decl integer field        decl integer field
      53        ; 15   decl real field           decl real field
      54        ; 16   decl long field           decl long field
      55        ; 17   decl boolean field        decl boolean field
      56        ; 18   decl integer array field  decl integer array field
      57        ; 19   decl real array field     decl real array field
      58        ; 20   decl long array field     decl long array field
      59        ; 21   decl boolean array field  decl boolean array field
      7         ; 22   decl zone                 decl zone
      4         ; 23   decl label                decl label
      60        ; 24   decl own integer          decl own integer
      61        ; 25   decl own real             decl own real
      62        ; 26   decl own long             decl own long
      63        ; 27   decl own boolean          decl own boolean
      64        ; 28   decl integer array        decl integer array
      65        ; 29   decl real array           decl real array
      66        ; 30   decl long array           decl long array
      67        ; 31   decl boolean array        decl boolean array
      8         ; 32   decl zone array           decl zone array

      0         ; 33   end clean                 not used
      0         ; 34   exit block                not used
      0         ; 35   end external              not used
      0         ; 36   end bounds                not used
      0         ; 37   end zone decl             not used
      0         ; 38   exit proc no type         not used
      0         ; 39   exit proc type            not used

\f

                                                                                                       

; jz 1979.09.14                              algol 8, pass 4, page ...21...


; stackvalue table (2)


                ; input                         stackvalue

      0         ; 40  begin                     not used
      0         ; 41  begin external            not used
      0         ; 42  ;                         not used
      0         ; 43  do                        not used
      0         ; 44  then statm                not used
      0         ; 45  else statm                not used
      0         ; 46  of statm                  not used
      0         ; 47  end case statm            not used
      116       ; 48  end spec                  specifications
      0         ; 49  case semicolon            not used
      129       ; 50  end do                    end do
      129       ; 51  end single do             end do
 
; max out of trouble
 
      0         ; 52  end list one              not used
      0         ; 53  end list more             not used
      0         ; 54  first comma               not used
      0         ; 55  not first comma           not used
      0         ; 56  first point               not used
      0         ; 57  not first point           not used
      0         ; 58  zone comma                not used
      0         ; 59  bound colon               not used
      0         ; 60  begin list                not used
      0         ; 61  begin list field          not used
      0         ; 62  trouble                   not used

      44        ; 63  decl parproc no type      decl parproc no type
      40        ; 64  decl parproc integer      decl parproc integer
      41        ; 65  decl parproc real         decl parproc real
      42        ; 66  decl parproc long         decl parproc long
      43        ; 67  decl parproc boolean      decl parproc boolean
      3         ; 68  decl switch               decl switch
      36        ; 69  decl proc no type         decl proc no type
      32        ; 70  decl proc integer         decl proc integer
      33        ; 71  decl proc real            decl proc real
      34        ; 72  decl proc long            decl proc long
      35        ; 73  decl proc boolean         decl proc boolean
      6         ; 74  decl proc undef           decl proc undef

      302       ; 75  spec simple integer       spec simple integer
      303       ; 76  spec simple real          spec simple real
      304       ; 77  spec simple long          spec simple long
      301       ; 78  spec simple boolean       spec simple boolean
      302       ; 79  spec integer field        spec simple integer
      302       ; 80  spec real field           spec simple integer
      302       ; 81  spec long field           spec simple integer
      302       ; 82  spec boolean field        spec simple integer

\f

                                                                                    

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


; stackvalue table (3)


                ; input                              stackvalue

      302       ; 83  spec integer array field       spec simple integer
      302       ; 84  spec real array field          spec simple integer
      302       ; 85  spec long array field          spec simple integer
      302       ; 86  spec boolean array field       spec simple integer
      307       ; 87  spec zone                      spec zone
      308       ; 88  spec string                    spec string
      309       ; 89  spec label                     spec label
      312       ; 90  spec value integer             spec value integer
      313       ; 91  spec value real                spec value real
      314       ; 92  spec value long                spec value long
      311       ; 93  spec value boolean             spec value boolean
      312       ; 94  spec value integer field       spec value integer
      312       ; 95  spec value real field          spec value integer
      312       ; 96  spec value long field          spec value integer
      312       ; 97  spec value boolean field       spec value integer
      312       ; 98  spec value integer array field spec value integer
      312       ; 99  spec value real array field    spec value integer
      312       ; 100 spec value long array field    spec value integer
      312       ; 101 spec value boolean array field spec value integer
      324       ; 102 spec integer array             spec integer array
      325       ; 103 spec real array                spec real array
      326       ; 104 spec long array                spec long array
      323       ; 105 spec boolean array             spec boolean array
      329       ; 106 spec zone array                spec zone array
      330       ; 107 spec proc no type              spec proc no type
      332       ; 108 spec proc integer              spec proc integer
      333       ; 109 spec proc real                 spec proc real
      334       ; 110 spec proc long                 spec proc long
      331       ; 111 spec proc boolean              spec proc boolean
      337       ; 112 spec switch                    spec switch
      340       ; 113 spec undef                     spec undef
      338       ; 114 spec general                   spec general

      0         ; 115 simple for elem                not used
      280       ; 116 :=for                          while label
      280       ; 117 step elem                      while label
      280       ; 118 while elem                     while label
      0         ; 119 while                          not used
      0         ; 120 end assign                     not used
      281       ; 121 :=                             prep assign
      281       ; 122 first:=                        prep assign
      0         ; 123 end block                      not used
      0         ; 124 end zone block                 not used
      0         ; 125 of expr                        not used
      0         ; 126 end case expr                  not used
      0         ; 127 case comma                     not used
      0         ; 128 of switch                      not used
      0         ; 129 end switch                     not used
      0         ; 130 case                           not used

; no interest:

\f

                                                                                       

; rc 7.12.1970                                   algol 6, pass 4, page ...23...


; output table (1)


h.              ; input                          output value
                ;
f2:   110       ;  0   new line                  new line
      240       ;  1   vanished operand          vanished operand
      241       ;  2   internal operand          internal operand
      139       ;  3   error                     error

; max special interest

      133       ;  4   integer literal           integer literal
      134       ;  5   real literal              real literal
      135       ;  6   long literal              long literal
      136       ;  7   boolean literal           boolean literal
      137       ;  8   string first              string first
      138       ;  9   string next               string next

; max literal
; inputbytes from here to <max out of trouble> terminates trouble

      0         ; 10   decl simple integer       not used
      0         ; 11   decl simple real          not used
      0         ; 12   decl simple long          not used
      0         ; 13   decl simple boolean       not used
      0         ; 14   decl integer field        not used
      0         ; 15   decl real field           not used
      0         ; 16   decl long field           not used
      0         ; 17   decl boolean field        not used
      0         ; 18   decl integer array field  not used
      0         ; 19   decl real array field     not used
      0         ; 20   decl long array field     not used
      0         ; 21   decl boolean array field  not used
      108       ; 22   decl zone                 label colon
      117       ; 23   decl label                label colon
      0         ; 24   decl own integer          not used
      0         ; 25   decl own real             not used
      0         ; 26   decl own long             not used
      0         ; 27   decl own boolean          not used
      104       ; 28   decl integer array        begin bounds integer
      105       ; 29   decl real array           begin bounds real
      106       ; 30   decl long array           begin bounds long
      107       ; 31   decl boolean array        begin bounds boolean
      109       ; 32   decl zone array           begin zone array

      0         ; 33   end clean                 not used
      126       ; 34   exit block                exit block
      127       ; 35   end external              end external
      121       ; 36   end bounds                end bounds
      122       ; 37   end zone decl             end zone decl
      131       ; 38   exit proc no type         exit proc no type
      132       ; 39   exit proc type            exit proc type

\f

                                                                         

; jz 1979.09.14                           algol 8, pass 4, page ...24...


; output table (2)


                ; input                         output value

      111       ; 40  begin                     begin block
      112       ; 41  begin external            begin external
      0         ; 42  ;                         not used
      128       ; 43  do                        do
      258       ; 44  then statm                then statm
      259       ; 45  else statm                else statm
      260       ; 46  of statm                  of statm
      261       ; 47  end case statm            end case statm
      0         ; 48  end spec                  end spec
      239       ; 49  case semicolon            case semicolon
      129       ; 50  end do                    end do
      130       ; 51  end single do             end single do
 
; max out of trouble
 
      262       ; 52  end list one              end list one
      263       ; 53  end list more             end list more
      264       ; 54  first comma               first comma
      265       ; 55  not first comma           not first comma
      266       ; 56  first point               first point
      267       ; 57  not first point           not first point
      268       ; 58  zone comma                zone comma
      269       ; 59  bound colon               bound colon
      114       ; 60  begin list                begin list
      115       ; 61  begin list field          begin list field
      0         ; 62  trouble                   not used

      20        ; 63  decl parproc no type      begin parproc no type
      16        ; 64  decl parproc integer      begin parproc integer
      17        ; 65  decl parproc real         begin parproc real
      18        ; 66  decl parproc long         begin parproc long
      19        ; 67  decl parproc boolean      begin parproc boolean
      15        ; 68  decl switch               begin switch
      28        ; 69  decl proc no type         begin proc no type
      24        ; 70  decl proc integer         begin proc integer
      25        ; 71  decl proc real            begin proc real
      26        ; 72  decl proc long            begin proc long
      27        ; 73  decl proc boolean         begin proc boolean
      28        ; 74  decl proc undef           begin proc undef

      84        ; 75  spec simple integer       formal simple integer
      85        ; 76  spec simple real          formal simple real
      86        ; 77  spec simple long          formal simple long
      87        ; 78  spec simple boolean       formal simple boolean
      88        ; 79  spec integer field        formal integer field
      89        ; 80  spec real field           formal real field
      90        ; 81  spec long field           formal long field
      91        ; 82  spec boolean field        formal boolean field

\f

                                                                                    

; jz 1979.09.27                            algol 8, pass 4, page ...25...


; output table (3)


                ; input                              output value

      92        ; 83  spec integer array field       formal int array field
      93        ; 84  spec real array field          formal rea array field
      94        ; 85  spec long array field          formal lon array field
      95        ; 86  spec boolean array field       formal boo array field
      13        ; 87  spec zone                      formal zone
      96        ; 88  spec string                    formal string
      9         ; 89  spec label                     formal label
      72        ; 90  spec value integer             take value integer
      73        ; 91  spec value real                take value real
      74        ; 92  spec value long                take value long
      75        ; 93  spec value boolean             take value boolean
      72        ; 94  spec value integer field       take value integer
      73        ; 95  spec value real field          take value real
      74        ; 96  spec value long field          take value long
      75        ; 97  spec value boolean field       take value boolean
      72        ; 98  spec value integer array field take value integer
      73        ; 99  spec value real array field    take value real
      74        ; 100 spec value long array field    take value long
      75        ; 101 spec value boolean array field take value boolean
      100       ; 102 spec integer array             anonymous array integer
      101       ; 103 spec real array                anonymous array real
      102       ; 104 spec long array                anonymous array long
      103       ; 105 spec boolean array             anonymous array boolean
      14        ; 106 spec zone array                take zone array
      80        ; 107 spec proc no type              formal proc no type
      76        ; 108 spec proc integer              formal proc integer
      77        ; 109 spec proc real                 formal proc real
      78        ; 110 spec proc long                 formal proc long
      79        ; 111 spec proc boolean              formal proc boolean
      12        ; 112 spec switch                    formal switch
      11        ; 113 spec undef                     formal unspec
      10        ; 114 spec general                   formal general

      270       ; 115 simple for elem                simple for elem
      271       ; 116 :=for                          :=for
      272       ; 117 step elem                      step elem
      273       ; 118 while elem                     while elem
      274       ; 119 while                          while
      275       ; 120 end assign                     end assign
      276       ; 121 :=                             :=
      277       ; 122 first:=                        first:=
      278       ; 123 end block                      end block
      279       ; 124 end zone block                 end zone block
      236       ; 125 of expr                        of expr
      237       ; 126 end case expr                  end case expr
      238       ; 127 case comma                     case comma
      224       ; 128 of switch                      of switch
      225       ; 129 end switch                     end switch
      235       ; 130 case                           case

; no interest:

\f

                                                                                     

; rc 7.1.1971                                   algol 6, pass 4, page ...26...


; auxilliary table (1)


h.              ; input                          table content
                ;
f3:   c3-j1     ;  0   new line                  action: new line 1
      c4-j1     ;  1   vanished operand          action: vanished operand 1
      c4-j1     ;  2   internal operand          action: vanished operand 1
      c2-j1     ;  3   error                     action: error 1

; max special interest

      c40-j2    ;  4   integer literal           action: output van
      c40-j2    ;  5   real literal              action: output van
      c40-j2    ;  6   long literal              action: output van
      c40-j2    ;  7   boolean literal           action: output van
      c40-j2    ;  8   string first              action: output van
      c5 -j2    ;  9   string next               action: trouble

; max literal
; inputbytes from here to <max out of trouble> terminates trouble

                                                 ;where to count what
      2<6 + 2   ; 10   decl simple integer       variables        2
      2<6 + 4   ; 11   decl simple real          variables        4
      2<6 + 4   ; 12   decl simple long          variables        4
      2<6 + 2   ; 13   decl simple boolean       variables        2
      2<6 + 2   ; 14   decl integer field        variables        2
      2<6 + 2   ; 15   decl real field           variables        2
      2<6 + 2   ; 16   decl long field           variables        2
      2<6 + 2   ; 17   decl boolean field        variables        2
      2<6 + 2   ; 18   decl integer array field  variables        2
      2<6 + 2   ; 19   decl real array field     variables        2
      2<6 + 2   ; 20   decl long array field     variables        2
      2<6 + 2   ; 21   decl boolean array field  variables        2
      2<6 + e52 ; 22   decl zone                 variables        zone descr
      4<6 + 1   ; 23   decl label                points           1
      0<6 + 2   ; 24   decl own integer          owns             2
      0<6 + 4   ; 25   decl own real             owns             4
      0<6 + 4   ; 26   decl own long             owns             4
      0<6 + 2   ; 27   decl own boolean          owns             2
      2<6 + 2   ; 28   decl integer array        variables        2
      2<6 + 2   ; 29   decl real array           variables        2
      2<6 + 2   ; 30   decl long array           variables        2
      2<6 + 2   ; 31   decl boolean array        variables        2
      2<6 + 4   ; 32   decl zone array           variables        4

      0         ; 33   end clean                 not used
      0         ; 34   exit block                not used
      0         ; 35   end external              not used
      0         ; 36   end bounds                not used
      0         ; 37   end zone decl             not used
      0         ; 38   exit proc no type         not used
      0         ; 39   exit proc type            not used

 \f

                                                                                                       

; jz 1979.09.14                         algol 8, pass 4, page ...27...


; auxilliary table (2)


                ; input                         table content

      0         ; 40  begin                     not used
      0         ; 41  begin external            not used
      0         ; 42  ;                         not used
      0         ; 43  do                        not used
      0         ; 44  then statm                not used
      0         ; 45  else statm                not used
      0         ; 46  of statm                  not used
      0         ; 47  end case statm            not used
      0         ; 48  end spec                  not used
      0         ; 49  case semicolon            not used
      0         ; 50  end do                    not used
      0         ; 51  end single do             not used
 
; max out of trouble
 
      0         ; 52  end list one              not used
      0         ; 53  end list more             not used
      0         ; 54  first comma               not used
      0         ; 55  not first comma           not used
      0         ; 56  first point               not used
      0         ; 57  not first point           not used
      0         ; 58  zone comma                not used
      0         ; 59  bound colon               not used
      0         ; 60  begin list                not used
      0         ; 61  begin list field          not used
      0         ; 62  trouble                   not used

                                                ;where to count what
      4<6 + 1   ; 63  decl parproc no type      points           1
      4<6 + 1   ; 64  decl parproc integer      points           1
      4<6 + 1   ; 65  decl parproc real         points           1
      4<6 + 1   ; 66  decl parproc long         points     1
      4<6 + 1   ; 67  decl parproc boolean      points           1
      4<6 + 1   ; 68  decl switch               points           1
      4<6 + 1   ; 69  decl proc no type         points           1
      4<6 + 1   ; 70  decl proc integer         points           1 
      4<6 + 1   ; 71  decl proc real            points           1
      4<6 + 1   ; 72  decl proc long            points           1
      4<6 + 1   ; 73  decl proc boolean         points           1
      4<6 + 1   ; 74  decl proc undef           points           1

      0         ; 75  spec simple integer       not used
      0         ; 76  spec simple real          not used
      0         ; 77  spec simple long          not used
      0         ; 78  spec simple boolean       not used
      0         ; 79  spec integer field        not used
      0         ; 80  spec real field           not used
      0         ; 81  spec long field           not used
      0         ; 82  spec boolean field        not used

\f

                                                                                    

; rc 3.12.1970                                 algol 6, pass 4, page ...28...


; auxilliary table (3)


                ; input                              table content

      0         ; 83  spec integer array field       not used
      0         ; 84  spec real array field          not used
      0         ; 85  spec long array field          not used
      0         ; 86  spec boolean array field       not used
      0         ; 87  spec zone                      not used
      0         ; 88  spec string                    not used
      0         ; 89  spec label                     not used
      0         ; 90  spec value integer             not used
      0         ; 91  spec value real                not used
      0         ; 92  spec value long                not used
      0         ; 93  spec value boolean             not used
      0         ; 94  spec value integer field       not used
      0         ; 95  spec value real field          not used
      0         ; 96  spec value long field          not used
      0         ; 97  spec value boolean field       not used
      0         ; 98  spec value integer array field not used
      0         ; 99  spec value real array field    not used
      0         ; 100 spec value long array field    not used
      0         ; 101 spec value boolean array field not used
      68        ; 102 spec integer array             output:  take array int
      69        ; 103 spec real array                output:  take array real
      70        ; 104 spec long array                output:  take array long
      71        ; 105 spec boolean array             output:  take array boo


; table entries corresponding to the
; following inputbytes are not used
\f



; rc 06.05.71                                   algol 6, pass 4, page ...29...


; during initialization the store layout is:
;                     ================
; lowest address:    (  pass 4 code   )
;                    (                )
;                    (                )
;                    (                )
;                     ================
;                    (  pass 4        )
;                    (  initialization)
;                    (  code          )   <- stack bottom
;                     ================           -
;                    (                )          -      reference table
;                          .....                 -       (1 byte/entry)
;                    (                )          - 
;                     ================    <- base of interval table
;                    (                )          -      interval table
;                          .....                 -       (4 bytes/entry)
;                    (                )   <- stack top
;                     ----------------
;                    (                )
;                    (                )
;                          .....
;                    (                )
;                    (                )
;                    (                )
;                    (                )
;                     ----------------
;                    (                )   <- use top
;                          .....                 -      std proc table
;                    (                )          -       (13 bytes/entry)
; last work for pass (                )          -
;                     ================    <- use bottom   
\f


; jz 1979.09.26                            algol 8, pass 4, page ...30...


w.
h5:   rl. w3    e9.+4   ; start pass 4:
      rs. w3    f13.    ;   aux stack top := last work for pass;
      al  w3  x3-h11    ;   max aux stack top := aux stack top - h11;
      ls  w3    -1      ;
      ls  w3     1      ;   <* max aux stack top is even *>
      rs. w3    f14.    ;   <* h11 is an installation parameter *>
      rs. w3     b6.    ;   usetop := max aux stack top;
      al. w1    h8.     ;   stacktop:= last word pass 4;

      jl. w3    e2.     ;   inbyte;
      hs. w2    i11.    ;   ident lim:= byte;

; the reference table is initialized to zero, indicating that none
; of the identifiers appear in the catalog. reading a standard
; identifier, two things may occur:
;  1. the corresponding reference table element is zero:
;     the interval is stored in the interval table, and the
;     reference table element is set to the index of the interval
;     table. the identifier name and the specifications are stored
;     in the standard proc table.
;  2. the reference table element is different from zero:
;     the new interval is compared to the interval, outpointed by
;     the reference table element. if the new interval is better
;     than the other, the old interval is exchanged by the new,
;     and the corresponding specifications are exchanged too.

      al. w3    a42.    ;   set return from stack;
      al  w0    0       ;   
a42:  al  w2  x2-1      ;   for i:= 513 step 1 until ident limit do
      sl  w2    512     ;     stack;
      jl.       g5.     ;
      so  w1    1       ;   comment: the interval table must start
      jl. w3    g5.     ;            on an even address;
      rs. w1    b20.    ;   base of interval table:= stacktop;
      al  w2    0       ;
      jl. w3    g15.    ;   stackbyte in usestack;

; the standard identifiers are read and treated one by one, until
; a zero is met.

a35:  jl. w3    e2.     ; next std proc suite:   w2:= inbyte;
      sn  w2    0       ;   if byte = 0 then
      jl.       a45.    ;     goto finish initialization;

      hs. w2    i8.     ;   saved identno:= byte;
      al  w0    12      ;   for w0:= 12 step -1 until 1 do
a36:  jl. w3    e2.     ;     begin
      jl. w3    g15.    ;     w2:= inbyte;
      bs. w0    1       ;     stackbyte in usestack;
      se  w0    0       ;     end;
      jl.       a36.    ;
      al  w0    2       ;   for w0 := 2 step -1 until 1 do
a46:  bs. w0    1       ;     begin comment read interval;
      jl. w3    e2.     ;     w2 := inbyte;
      rx  w2    0       ;
      jl. w3    g5.     ;     stack; comment: used for the next byte...;
      jl. w3    g5.     ;     stack;
      al  w0  x2        ;
      jl. w3    e2.     ;     w2 := inbyte;
      hs  w2  x1-1      ;     stack(stacktop-1) := byte;
      se  w0    0       ;     end;
      jl.       a46.    ;

i8=   k+1  ;   saved identno;
      al  w2            ;   w2:= saved identno;
      jl. w3    g15.    ;   stackbyte in usestack;

\f


; jz 1979.10.13                                   algol 6, pass 4, page ...31...


; at this point, the interval is stacked in the stack, while the
; identifier name and specifications and identno is stacked in
; usestack.

      al  w2  x2-512    ; 
      bz  w2     5       ;   identno:= identno extract 12;
     bz. w3  x2+h8.    ;   if reference table(identno) = 0 then
      se  w3    0       ;     begin
      jl.       a43.    ;     comment: this is case 1;
      al  w3  x1        ;     index:= (stacktop -
      ws. w3    b20.    ;       base of interval table)// 4;
      ls  w3    -2      ;     reference table(identno):= index;
      hs. w3  x2+h8.    ;     goto next std proc suite;
      jl.       a35.    ;     end;

; case 2.  the interval, identifier name, specifications and
; identno are unstacked. (at entry w3 holds the index of the old
; interval).

a43:  al  w1  x1-4      ;   unstack 4 interval bytes;
      rx. w1    b22.    ;
      al  w1  x1-4      ;
      rx. w1    b22.    ;
      rx. w1    b6.     ;   unstack std proc suite;
      al  w1  x1+13     ;
      rx. w1    b6.     ;

      hs. w3    i8.     ;   save index in identno;
      ls  w3    2       ;
      wa. w3    b20.    ;
      al  w0  x3        ;   w0:= addr of old interval;
      dl  w3  x3        ;   w2w3:= old interval;
      al  w2  x2+1      ;   comment: w2 = upper, w3 = lower;

      sh  w3 (x1+4)     ;   if -, new interval is contained
      sh  w2 (x1+2)     ;     in old interval then
      jl.       a35.    ;     goto next std proc suite;

      al  w2  x2-1      ;   interval.identifier:=
      ds  w3   (0)      ;     new interval;
      bz. w3    i8.     ;   w3:= addr of old std proc suite
      wm. w3    b19.    ;     of identifier;
      wa. w3    f14.    ;
      rl. w2    b6.     ;   w2:= usetop;
      bl  w0  x2-1      ;   specifications.identifier:=
      hs  w0  x3+11     ;     new specifications;
      bl  w0  x2-2      ;
      hs  w0  x3+10     ;
      bl  w0  x2-3      ;
      hs  w0  x3+9      ;
      bl  w0  x2-4      ;
      hs  w0  x3+8      ;
      jl.       a35.    ;   goto next std proc suite;
\f


; jz 1979.09.27                            algol 8, pass 4, page ...32...


; procedure stackbyte in usestack;  the byte in w2 is stacked;

g15:  rx. w1    b6.     ;
      al  w1  x1-1      ;   usetop:= usetop - 1;
      sh. w1   (b6.)    ;   if usetop <= stacktop then
      jl.       a12.    ;     goto stack alarm;
      hs  w2  x1        ;   corebyte(usetop):= w2;
      rx. w1    b6.     ;
      jl      x3        ;   return;

; the stacks must be initialized. (at entry w2 is zero).

a45:  al. w1    h5.-1   ; finish initialization:
      rs. w2    b22.    ;   stacktop:= stackbottom;
      al  w0  x2        ;   words in stack:= 0;
      jl. w3    g5.     ;   stack;

      rl. w3    b6.     ;   top of std proc suite:= usetop;
      rs. w3    b19.    ;
      ls  w3    -1      ;   usetop:= usetop//2 *2;
      ls  w3    1       ;
      rs. w3    b6.     ;
      al  w2  x3-2      ;   initial usetop:= usetop - 2;
      rs. w2    h4.     ;

      ac  w3  x3        ;   words in usestack:=
      wa. w3    f14.    ;     (max aux stack top - usetop)//2;
      ls  w3    -1      ;
      rs. w3    b23.    ;

      rl. w0    b21.    ;   w0:= <useblock stop>;
      jl. w3    g7.     ;   stack in use;

      al  w0    d25     ;   w0:= <end pass>;
      am       -2047    ;
      jl. w3    e3.+2047;   outbyte;

      am      -2047     ;
      jl. w3  e2.+2047  ; test end:  inbyte;
      sn  w2  d31       ;   if byte <> <end clean> then
      jl.     a47.      ;   begin
      am     -2047
      jl. w3  e11.+2047 ;    repeat input byte;
      jl.     a3.       ;    goto next;
                        ;   end;
a47:  al  w0  d33       ;   w0 := <exit block>;
      am     -2047      ;
      jl. w3  e3.+2047  ;   outbyte;
      al  w2  d32       ;   w2 := <end block input>;
      jl.     c36.      ;   goto exit block;

b20:   0  ;   base addr of interval table


h6 = k - e0  ;   no of bytes in pass 4;
e30=e30+h6
h7 = h5 - e0 ;   entry pass 4 rel to first of pass 4;
h8 = k - 1   ;   stackbottom;
i.           ; id list
e.           ; end pass 4 segment;
m. jz 1981.03.20 algol 8, pass 4


\f

▶EOF◀