program X1_ALGOL_60_compiler(input,output,lib_tape);

const
   d2         =         4;
   d3         =         8;
   d4         =        16;
   d5         =        32;
   d6         =        64;
   d7         =       128;
   d8         =       256;
   d10        =      1024;
   d12        =      4096;
   d13        =      8192;
   d15        =     32768;
   d16        =     65536;
   d17        =    131072;
   d18        =    262144;
   d19        =    524288;
   d20        =   1048576;
   d21        =   2097152;
   d22        =   4194304;
   d23        =   8388608;
   d24        =  16777216;
   d25        =  33554432;
   d26        =  67108864;
   mz         = 134217727;

   gvc0       =      138;      {0-04-10}
   tlib       =      800;      {0-25-00}
   plie       =     6783;      {6-19-31}
   bim        =      930;      {0-29-02}
   nlscop     =     31;
   nlsc0      =      48;
   mlib       =      800;      {0-25-00}
   klie       =    10165;      {9-29-21}
   crfb       =      623;      {0-19-15}
   mcpb       =      928;      {0-29-00}

var
   tlsc,plib,flib,klib,nlib,
   rht,vht,qc,scan,rfsb,rnsa,rnsb,rnsc,rnsd,
   dl,inw,fnw,dflag,bflag,oflag,
   nflag,kflag,
   iflag,mflag,vflag,aflag,sflag,eflag,jflag,pflag,fflag,
   bn,vlam,pnlv,gvc,lvc,oh,id,nid,ibd,
   inba,fora,forc,psta,pstb,spe,
   arra,arrb,arrc,arrd,ic,aic,rlaa,rlab,qa,qb,
   rlsc,flsc,klsc,nlsc       : integer;
   bitcount,bitstock   : integer;
   store      : array[0..12287] of integer;
   rns_state  : (ps,ms,virginal);
   rfs_case,nas_stock,pos        : integer;
   word_del_table: array[10..38] of integer;
   flex_table: array[0..127] of integer;
   opc_table  : array[0..112] of integer;

   rlib,mcpe       : integer;

   lib_tape   : text;

   ii         : integer;

procedure stop(n: integer);   {emulation of a machine instruction}
begin
   writeln(output);
   writeln(output,'*** stop ',n div d5:1,'-',n mod d5:2,' ***');
   halt
end {stop};

function read_flexowriter_symbol: integer;   {LK}

label
   1,2;

var
   s,fts        : integer;

begin
   1: read(input,s);
   if rfsb = 0 then
      if (s = 62 {tab}) or (s = 16 {space}) or (s = 26 {crlf}) then
         goto 2
   else if (s = 122 {lc}) or (s = 124 {uc}) or (s = 0 {blank}) then begin
      rfsb := s {new flexowriter shift};
      goto 1
   end
   else if s = 127 {erase} then
      goto 1
   else
      stop(19) {flexowriter shift undefined};
   2: fts := flex_table[s];
   if fts > 0 then
      if rfsb = 124 then
         {uppercase} read_flexowriter_symbol := fts div d8
   else      {lowercase} read_flexowriter_symbol := fts mod d8
   else if fts = -0 then
      stop(20) {wrong parity}
   else if fts = -1 then
      stop(21) {undefined punching}
   else if s = 127 {erase} then
      goto 1
   else begin
      rfsb := s {new flexowriter shift};
      goto 1
   end
end {read_flexowriter_symbol};

function next_ALGOL_symbol: integer;   {HT}

label
   1;

var
   sym,wdt1,wdt2       : integer;

begin
   sym := - nas_stock;
   if sym >= 0 {symbol in stock} then
      nas_stock := sym + 1{stock empty now}
   else
      sym := read_flexowriter_symbol;
   1: if sym > 101 {analysis required} then begin
         if sym = 123 {space symbol} then
            sym := 93;
         if sym <= 119 {space symbol, tab, or nlcr} then
            if qc = 0 then begin
               sym := read_flexowriter_symbol;
               goto 1
            end
         else
         else if sym = 124 {:} then begin
            sym := read_flexowriter_symbol;
            if sym = 72 then
               sym := 92 {:=}
            else begin
               nas_stock := -sym;
               sym := 90 {:}
            end
         end
         else if sym = 162 {|} then begin
            repeat
               sym := read_flexowriter_symbol
            until sym <> 162;
            if sym = 77 {^} then
               sym := 69 {|^}
            else if sym = 72 {=} then
               sym := 75 {|=}
            else if sym = 74 {<} then
               sym := 102 {|<}
            else if sym = 70 {>} then
               sym := 103 {|>}
            else
               stop(11)
         end
         else if sym = 163 {_} then begin
            repeat
               sym := read_flexowriter_symbol
            until sym <> 163;
            if (sym > 9) and (sym <= 38) {a..B} then begin
               {word delimiter}
               wdt1 := word_del_table[sym] mod 128;
               if wdt1 >= 63 then
                  sym := wdt1
               else if wdt1 = 0 then
                  stop(13)
               else if wdt1 = 1 {sym = c} then
                  if qc = 0 {outside string} then begin
                     {skip comment}
                     repeat
                        sym := read_flexowriter_symbol
                     until sym = 91 {;};
                     sym := read_flexowriter_symbol;
                     goto 1
                  end
               else
                  sym := 97 {comment}
               else begin
                  sym := read_flexowriter_symbol;
                  if sym = 163 {_} then begin
                     repeat
                        sym := 
               read_flexowriter_symbol
                     until sym <> 163;
                     if (sym > 9) and (sym <= 32) then
                        if sym = 29 {t} then begin
                           sym := 
                          read_flexowriter_symbol;
                           if sym = 163 {_} then begin
                              repeat
                                 sym := 
                                  read_flexowriter_symbol
                              until sym <> 163;
                              if sym = 14 {e} then
                                 sym :=  94 {step}
                              else
                                 sym := 113 {string}
                           end
                           else
                              stop(12)
                        end
                     else begin
                        wdt2 := 
                       word_del_table[sym] div 128;
                        if wdt2 = 0 then
                           sym := wdt1 + 64
                        else
                           sym := wdt2
                     end
                     else
                        stop(13)
                  end
                  else
                     stop(12)
               end;
               repeat
                  nas_stock := - read_flexowriter_symbol;
                  if nas_stock = - 163 {_} then
                     repeat
                        nas_stock := read_flexowriter_symbol
                     until nas_stock <> 163
               until nas_stock <= 0
            end {word delimiter}
            else if sym = 70 {>} then
               sym := 71 {>=}
            else if sym = 72 {=} then
               sym := 80 {eqv}
            else if sym = 74 {<} then
               sym := 73 {<=}
            else if sym = 76 {~} then
               sym := 79 {imp}
            else if sym = 124 {:} then
               sym := 68 {div}
            else
               stop(13)
         end
         else
            stop(14) {? or " or '}
      end;
   next_ALGOL_symbol := sym
end {next_ALGOL_symbol};

procedure read_next_symbol;   {ZY}

label
   1;

begin
   1: case rns_state of
      ps: begin
         dl := next_ALGOL_symbol;
         {store symbol in symbol store:}
         if rnsa > d7 then begin
            rnsa := rnsa div d7;
            store[rnsb] := store[rnsb] + dl * rnsa
         end
         else begin
            rnsa := d15;
            rnsb := rnsb + 1;
            store[rnsb] := dl * rnsa;
            if rnsb + 8 > plib then
               stop(25)
         end
      end;
      ms: begin
         {take symbol from symbol store:}
         dl := (store[rnsd] div rnsc) mod d7;
         if rnsc > d7 then
            rnsc := rnsc div d7
         else begin
            rnsc := d15;
            rnsd := rnsd + 1
         end
      end;
      virginal: begin
         qc := 0;
         rfs_case := 0;
         nas_stock := 1;
         if scan > 0 {prescan} then begin
            rns_state := ps;
            {initialize symbol store:}
            rnsb := bim + 8;
            rnsd := bim + 8;
            rnsa := d22;
            rnsc := d15;
            store[rnsb] := 0;
         end
         else
            rns_state := ms;
         goto 1
      end
      end {case}
end {read_next_symbol};

procedure read_until_next_delimiter;   {FT}

label
   1,3,4,5;

var
   marker,elsc,bexp       : integer;

function test1: boolean;
begin
   if dl = 88 {.} then begin
      dflag := 1;
      read_next_symbol;
      test1 := test1
   end
   else if dl = 89 {ten} then
      goto 1
   else
      test1 := dl > 9
end {test1};

function test2: boolean;
begin
   if dl = 89 {ten} then
      inw := 1;
   test2 := test1
end {test2};

function test3: boolean;
begin
   read_next_symbol;
   test3 := test1
end {test3};

begin   {body of read_until_next_delimiter}
   read_next_symbol;
   nflag := 1;
   if (dl > 9) and (dl < 63) {letter} then begin
      dflag := 0;
      kflag := 0;
      inw := 0;
      repeat
         fnw := (inw mod d6) * d21;
         inw := inw div d6 + dl * d21;
         read_next_symbol
      until (inw mod d3 > 0) or (dl > 62);
      if inw mod d3 > 0 then begin
         dflag := 1;
         fnw := fnw + d23;
         marker := 0;
         while (marker = 0) and (dl < 63) do begin
            marker := fnw mod d6 * d21;
            fnw := fnw div 64 + dl * d21;
            read_next_symbol
         end;
         while marker = 0 do begin
            marker := fnw mod d6 * d21;
            fnw := fnw div d6 + 63 * d21
         end;
         while dl < 62 do
            read_next_symbol;
      end;
      goto 4;
   end;
   kflag := 1;
   fnw := 0;
   inw := 0;
   dflag := 0;
   elsc := 0;
   if test2 {not (dl in [0..9,88,89])} then begin
      nflag := 0;
      if (dl = 116 {true}) or (dl = 117 {false}) then begin
         inw := dl - 116;
         dflag := 0;
         kflag := 1;
         nflag := 1;
         read_next_symbol;
         goto 4
      end;
      goto 5
   end;
   repeat
      if fnw < d22 then begin
         inw := 10 * inw + dl;
         fnw := 10 * fnw + inw div d26;
         inw := inw mod d26;
         elsc := elsc - dflag
      end
      else
         elsc := elsc - dflag + 1
   until test3;
   if (dflag = 0) and (fnw = 0) then
      goto 4;
   goto 3;
   1: if test3 {not (dl in [0..9,88,89]} then
         if dl = 64 {plus} then begin
            read_next_symbol;
            dflag := dl
         end
      else begin
         read_next_symbol;
         dflag := - dl - 1
      end
      else
         dflag := dl;
   while not test3 {dl in [0..9,88,89]} do begin
      if dflag >= 0 then
         dflag := 10 * dflag + dl
      else
         dflag := 10 * dflag - dl + 9;
      if abs(dflag) >= d26 then
         stop(3)
   end;
   if dflag < 0 then
      dflag := dflag + 1;
   elsc := elsc + dflag;
   3: {float}
      if (inw = 0) and (fnw = 0) then begin
         dflag := 0;
         goto 4
      end;
   bexp := 2100 {2**11 + 52; P9-characteristic};
   while fnw < d25 do begin
      inw := 2 * inw;
      fnw := 2 * fnw + inw div d26;
      inw := inw mod d26;
      bexp := bexp - 1
   end;
   if elsc > 0 then
      repeat
         fnw := 5 * fnw;
         inw := (fnw mod 8) * d23 + (5 * inw) div 8;
         fnw := fnw div 8;
         if fnw < d25 then begin
            inw := 2 * inw;
            fnw := 2 * fnw + inw div d26;
            inw := inw mod d26;
            bexp := bexp - 1
         end;
         bexp := bexp + 4;
         elsc := elsc - 1;
      until elsc = 0
   else if elsc < 0 then
      repeat
         if fnw >= 5 * d23 then begin
            inw := inw div 2 + (fnw mod 2) * d25;
            fnw := fnw div 2;
            bexp := bexp + 1
         end;
         inw := 8 * inw;
         fnw := 8 * fnw + inw div d26;
         inw := inw mod d26 + fnw mod 5 * d26;
         fnw := fnw div 5;
         inw := inw div 5;
         bexp := bexp - 4;
         elsc := elsc + 1
      until elsc = 0;
   inw := inw + 2048;
   if inw >= d26 then begin
      inw := 0;
      fnw := fnw + 1;
      if fnw = d26 then begin
         fnw := d25;
         bexp := bexp + 1
      end
   end;
   if (bexp < 0) or (bexp > 4095) then
      stop(4);
   inw := (inw div 4096) * 4096 + bexp;
   dflag := 1;
   4: oflag := 0;
   5: 
end {read_until_next_delimiter};

procedure fill_t_list(n: integer);
begin
   store[tlsc] := n;
   tlsc := tlsc + 1
end {fill_t_list};

procedure prescan;   {HK}

label
   1,2,3,4,5,6,7;

var
   bc,mbc        : integer;

procedure fill_prescan_list(n: integer);   {n = 0 or n = 1}        {HF}

var
   i,j,k          : integer;

begin   {update plib and prescan_list chain:}
   k := plib;
   plib := k - dflag - 1;
   j := k;
   for i:= 2*bc + n downto 1 do begin
      k := store[j];
      store[j] := k - dflag - 1;
      j := k
   end;   {shift lower part of prescan_list down over dfag + 1 places:}
   k := plib;
   if dflag = 0 then
      for i:= j - plib downto 1 do begin
         store[k] := store[k+1];
         k := k + 1
      end
   else begin      {shift:}
      for i:= j - plib - 1 downto 1 do begin
         store[k] := store[k+2];
         k := k + 1
      end;      {enter fnw in prescan_list:}
      store[k+1] := fnw
   end;   {enter inw in prescan_list:}
   store[k] := inw
end {fill_prescan_list};

procedure augment_prescan_list;   {HH}
begin
   dflag := 1;
   inw := plie;
   fnw := plie - 1;
   fill_prescan_list(0)
end {augment_prescan_list};

procedure block_introduction;   {HK}
begin
   fill_t_list(bc);
   fill_t_list(-1) {block-begin marker};
   mbc := mbc + 1;
   bc := mbc;
   augment_prescan_list
end {block_introduction};

begin   {body of prescan}
   plib := plie;
   store[plie] := plie - 1;
   tlsc := tlib;
   bc := 0;
   mbc := 0;
   qc := 0;
   rht := 0;
   vht := 0;
   fill_t_list(dl);   {dl should be 'begin'}
   augment_prescan_list;
   1: bflag := 0;
   2: read_until_next_delimiter;
   3: if dl <= 84 {+,-,*,/,_:,|^,>,>=,=,<=,<,|=,~,^,`,_~,_=,goto,if,then,else} then
         {skip:} goto 1;
   if dl = 85 {for} then begin
      block_introduction;
      goto 1
   end;
   if dl <= 89 {do,comma,period,ten} then      {skip:} goto 1;
   if dl = 90 {:} then begin
      fill_prescan_list(0);
      goto 2
   end;
   if dl = 91 {;} then begin
      while store[tlsc-1] < 0 {block-begin marker} do begin
         tlsc := tlsc - 2;
         bc := store[tlsc]
      end;
      if rht <> 0 then
         stop(22);
      if vht <> 0 then
         stop(23);
      goto 1
   end;
   if dl <= 97 {:=,step,until,while,comment} then      {skip:} goto 1;
   if dl <= 99 {(,)} then begin
      if dl = 98 then
         rht := rht + 1
      else
         rht := rht - 1;
      goto 1
   end;
   if dl <= 101 {[,]} then begin
      if dl = 100 then
         vht := vht + 1
      else
         vht := vht - 1;
      goto 1
   end;
   if dl = 102 {|<} then begin
      repeat
         if dl = 102 {|<} then
            qc := qc + 1;
         if dl = 103 {|>} then
            qc := qc - 1;
         if qc > 0 then
            read_next_symbol
      until qc = 0;
      goto 2
   end;
   if dl = 104 {begin} then begin
      fill_t_list(dl);
      if bflag <> 0 then
         goto 1;
      read_until_next_delimiter;
      if (dl <= 105) or (dl > 112) then
         goto 3;
      tlsc := tlsc - 1 {remove begin from t_list};
      block_introduction;
      fill_t_list(104) {add begin to t_list again};
      goto 3;
   end;
   if dl = 105 {end} then begin
      while store[tlsc-1] < 0 {block-begin marker} do begin
         tlsc := tlsc - 2;
         bc := store[tlsc]
      end;
      if rht <> 0 then
         stop(22);
      if vht <> 0 then
         stop(23);
      tlsc := tlsc - 1 {remove corresponding begin from t_list};
      if tlsc > tlib then
         goto 1;
      goto 7 {end of prescan}
   end;
   if dl <= 105 {dl = |>} then
      goto 1;
   if dl = 111 {switch} then
      if bflag = 0 then
         {declarator}
         begin
         read_until_next_delimiter {for switch identifier};
         fill_prescan_list(0);
         goto 6
      end
   else      {specifier}
      goto 5;
   4: if dl = 112 {procedure} then
         if bflag = 0 then
            {declarator}
            begin
            bflag := 1;
            read_until_next_delimiter {for procedure identifier};
            fill_prescan_list(1);
            block_introduction;
            goto 6
         end
      else
         {specificier}
         goto 5;
   if dl > 117 {false} then
      stop(8);
   5: read_until_next_delimiter;
   6: if dl <> 91 {;} then
         goto 4;
   goto 2;
   7: 
end {prescan};

procedure intro_new_block2;   {HW}

label
   1;

var
   i,w          : integer;

begin
   inba := d17 + d15;
   1: i := plib;
   plib := store[i];
   i := i + 1;
   while i <> plib do begin
      w := store[i];
      if w mod 8 = 0 {at most 4 letters/digits} then
         i := i + 1
      else begin
         store[nlib+nlsc] := store[i+1];
         i := i + 2;
         nlsc := nlsc + 1
      end;
      store[nlib+nlsc] := w;
      nlsc := nlsc + 2;
      if nlib + nlsc > i then
         stop(15);
      store[nlib+nlsc-1] := bn * d19 + inba
   end;
   if inba <> d18 + d15 then begin
      inba := d18 + d15;
      goto 1
   end;
   lvc := 0
end {intro_new_block2};

procedure intro_new_block1;   {HW}
begin
   fill_t_list(nlsc);
   fill_t_list(161);
   intro_new_block2
end {intro_new_block1};

procedure intro_new_block;   {HW}
begin
   bn := bn + 1;
   intro_new_block1
end {intro_new_block};

procedure bit_string_maker(w: integer);   {LL}

var
   head,tail,i          : integer;

begin
   head := 0;
   tail := w mod d10;   {shift (head,tail) bitcount places to the left:}
   for i:= 1 to bitcount do begin
      head := 2 * head + tail div d26;
      tail := (tail mod d26) * 2
   end {shift};
   bitstock := bitstock + tail;
   bitcount := bitcount + w div d10;
   if bitcount > 27 then begin
      bitcount := bitcount - 27;
      store[rnsb] := bitstock;
      bitstock := head;
      rnsb := rnsb + 1;
      if rnsb = rnsd then
         if nlib + nlsc + 8 < plib then begin
            {shift text, fli, kli and nli}
            for i:= nlib + nlsc - rnsd - 1 downto 0 do
               store[rnsd+i+8]:= store[rnsd+i];
            rnsd := rnsd + 8;
            flib := flib + 8;
            klib := klib + 8;
            nlib := nlib + 8
         end
      else
         stop(25)
   end
end {bit_string_maker};

procedure address_coder(a: integer);   {LS}

var
   w          : integer;

begin
   w := a mod d5;
   if w = 1 then
      w := 2048 {2*1024 +  0}
   else if w = 2 then
      w := 3074 {3*1024 +  2}
   else if w = 3 then
      w := 3075 {3*1024 +  3}
   else
      w := 6176 {6*1024 + 32} + w;
   bit_string_maker(w);
   w := (a div d5) mod d5;
   if w = 0 then
      w := 2048 {2*1024 +  0}
   else if w = 1 then
      w := 4100 {4*1024 +  4}
   else if w = 2 then
      w := 4101 {4*1024 +  5}
   else if w = 4 then
      w := 4102 {4*1024 +  6}
   else if w = 5 then
      w := 4103 {4*1024 +  7}
   else
      w := 6176 {6*1024 + 32} + w;
   bit_string_maker(w);
   w := (a div d10) mod d5;
   if w = 0 then
      w := 1024 {1*1024 + 0}
   else
      w := 6176 {6*1024 + 32} + w;
   bit_string_maker(w)
end {address_coder};

procedure fill_result_list(opc,w: integer);   {ZF}

var
   j          : 8..61;

begin
   rlsc := rlsc + 1;
   if opc < 8 then begin
      address_coder(w);
      w := (w div d15) * d15 + opc;
      if w = 21495808 {  2S   0 A  } then
         w := 3076 {3*1024 +   4}
      else if w = 71827459 {  2B   3 A  } then
         w := 3077 {3*1024 +   5}
      else if w = 88080386 {  2T 2X0    } then
         w := 4108 {4*1024 +  12}
      else if w = 71827456 {  2B   0 A  } then
         w := 4109 {4*1024 +  13}
      else if w =  4718592 {  2A   0 A  } then
         w := 7280 {7*1024 + 112}
      else if w = 71303170 {  2B 2X0    } then
         w := 7281 {7*1024 + 113}
      else if w = 88604673 {  2T   1 A  } then
         w := 7282 {7*1024 + 114}
      else if w =        0 {  0A 0X0    } then
         w := 7283 {7*1024 + 115}
      else if w =   524291 {  0A   3 A  } then
         w := 7284 {7*1024 + 116}
      else if w = 88178690 {N 2T 2X0    } then
         w := 7285 {7*1024 + 117}
      else if w = 71827457 {  2B   1 A  } then
         w := 7286 {7*1024 + 118}
      else if w =  1048577 {  0A 1X0 B  } then
         w := 7287 {7*1024 + 119}
      else if w = 20971522 {  2S 2X0    } then
         w := 7288 {7*1024 + 120}
      else if w =  4784128 {Y 2A   0 A  } then
         w := 7289 {7*1024 + 121}
      else if w =  8388608 {  4A 0X0    } then
         w := 7290 {7*1024 + 122}
      else if w =  4390912 {Y 2A 0X0   P} then
         w := 7291 {7*1024 + 123}
      else if w = 13172736 {Y 6A   0 A  } then
         w := 7292 {7*1024 + 124}
      else if w =  1572865 {  0A 1X0 C  } then
         w := 7293 {7*1024 + 125}
      else if w =   524288 {  0A   0 A  } then
         w := 7294 {7*1024 + 126}
      else begin
         address_coder(w div d15 + opc * d12);
         w := 7295 {7*1024 + 127}
      end
   end {opc < 8}
   else if opc <= 61 then begin
      j := opc;
      case j of
      8:
         w := 10624 {10*1024+384};
      9:
         w :=  6160 { 6*1024+ 16};
      10:
         w := 10625 {10*1024+385};
      11:
         w := 10626 {10*1024+386};
      12:
         w := 10627 {10*1024+387};
      13:
         w :=  7208 { 7*1024+ 40};
      14:
         w :=  6161 { 6*1024+ 17};
      15:
         w := 10628 {10*1024+388};
      16:
         w :=  5124 { 5*1024+  4};
      17:
         w :=  7209 { 7*1024+ 41};
      18:
         w :=  6162 { 6*1024+ 18};
      19:
         w :=  7210 { 7*1024+ 42};
      20:
         w :=  7211 { 7*1024+ 43};
      21:
         w := 10629 {10*1024+389};
      22:
         w := 10630 {10*1024+390};
      23:
         w := 10631 {10*1024+391};
      24:
         w := 10632 {10*1024+392};
      25:
         w := 10633 {10*1024+393};
      26:
         w := 10634 {10*1024+394};
      27:
         w := 10635 {10*1024+395};
      28:
         w := 10636 {10*1024+396};
      29:
         w := 10637 {10*1024+397};
      30:
         w :=  6163 { 6*1024+ 19};
      31:
         w :=  7212 { 7*1024+ 44};
      32:
         w := 10638 {10*1024+398};
      33:
         w :=  4096 { 4*1024+  0};
      34:
         w :=  4097 { 4*1024+  1};
      35:
         w :=  7213 { 7*1024+ 45};
      36:
         w := 10639 {10*1024+399};
      37:
         w := 10640 {10*1024+400};
      38:
         w := 10641 {10*1024+401};
      39:
         w :=  7214 { 7*1024+ 46};
      40:
         w := 10642 {10*1024+402};
      41:
         w := 10643 {10*1024+403};
      42:
         w := 10644 {10*1024+404};
      43:
         w := 10645 {10*1024+405};
      44:
         w := 10646 {10*1024+406};
      45:
         w := 10647 {10*1024+407};
      46:
         w := 10648 {10*1024+408};
      47:
         w := 10649 {10*1024+409};
      48:
         w := 10650 {10*1024+410};
      49:
         w := 10651 {10*1024+411};
      50:
         w := 10652 {10*1024+412};
      51:
         w := 10653 {10*1024+413};
      52:
         w := 10654 {10*1024+414};
      53:
         w := 10655 {10*1024+415};
      54:
         w := 10656 {10*1024+416};
      55:
         w := 10657 {10*1024+417};
      56:
         w :=  5125 { 5*1024+  5};
      57:
         w := 10658 {10*1024+418};
      58:
         w :=  5126 { 5*1024+  6};
      59:
         w := 10659 {10*1024+419};
      60:
         w := 10660 {10*1024+420};
      61:
         w :=  7215 { 7*1024+ 47}
      end {case}
   end {opc <= 61}
   else if opc = 85{ST} then
      w :=  5127 { 5*1024 +   7}
   else
      w := 10599 {10*1024 + 359} + opc;
   bit_string_maker(w)
end {fill_result_list};

procedure main_scan;   {EL}

label
   1,2,3,64,66,69,70,76,81,82,8201,8202,83,8301,84,8401,85,8501,
   86,8601,87,8701,8702,8703,8704,8705,
   90,91,92,94,95,96,98,9801,9802,9803,9804,99,100,101,
   102,104,105,1052,106,107,108,1081,1082,1083,
   109,110,1101,1102,1103,111,112,1121,1122,1123,1124;

procedure fill_t_list_with_delimiter;   {ZW}
begin
   fill_t_list(d8*oh+dl)
end {fill_t_list_with_delimiter};

procedure fill_future_list(place,value: integer);   {FU}

var
   i          : integer;

begin
   if place >= klib then begin
      if nlib + nlsc + 16 >= plib then
         stop(6);
      for i:= nlib + nlsc - 1 downto klib do
         store[i+16]:= store[i];
      klib := klib + 16;
      nlib := nlib + 16
   end;
   store[place] := value
end {fill_future_list};

procedure fill_constant_list(n: integer);   {KU}

var
   i          : integer;

begin
   if klib + klsc = nlib then begin
      if nlib + nlsc + 16 >= plib then
         stop(18);
      for i:= nlib + nlsc - 1 downto nlib do
         store[i+16]:= store[i];
      nlib := nlib + 16
   end;
   if n >= 0 then
      store[klib+klsc] := n
   else      {one's complement representation} store[klib+klsc] := mz + n;
   klsc := klsc + 1
end {fill_constant_list};

procedure unload_t_list_element(var variable: integer);   {ZU}
begin
   tlsc := tlsc - 1;
   variable := store[tlsc]
end {unload_t_list_element};

procedure fill_output(c: integer);
begin
   pos := pos + 1;
   if c < 10 then
      write(chr(c+ord('0')))
   else if c < 36 then
      write(chr(c-10+ord('a')))
   else if c < 64 then
      write(chr(c-37+ord('A')))
   else if c = 184 then
      write(' ')
   else if c = 138 then begin
      write(' ':8 - (pos - 1) mod 8);
      pos := pos + 8 - (pos - 1) mod 8
   end
   else begin
      writeln;
      pos := 0
   end
end {fill_output};

procedure offer_character_to_typewriter(c: integer);   {HS}
begin
   c := c mod 64;
   if c < 63 then
      fill_output(c)
end {offer_character_to_typewriter};

procedure label_declaration;   {FY}

var
   id,id2,i,w          : integer;

begin
   id := store[nlib+nid];
   if (id div d15) mod 2 = 0 then begin      {preceding applied occurrences}
      fill_future_list(flib+id mod d15,rlsc)
   end
   else      {first occurrence}
      store[nlib+nid] := id - d15 + 1 * d24 + rlsc;
   id := store[nlib+nid-1];
   if id mod d3 = 0 then begin      {at most 4 letters/digits}
      i := 4;
      id := id div d3;
      while (id mod d6) = 0{void} do begin
         i := i - 1;
         id := id div d6
      end;
      repeat
         offer_character_to_typewriter(id);
         i := i - 1;
         id := id div d6
      until i = 0
   end
   else begin
      id2 := store[nlib+nid-2];
      id2 := id2 div d3 + (id2 mod d3) * d24;
      w := (id2 mod d24) * d3 + id div d24;
      id := (id mod d24) * d3 + id2 div d24;
      id2 := w;
      i := 9;
      repeat
         offer_character_to_typewriter(id);
         i := i - 1;
         w := id2 div d6 + (id mod d6) * d21;
         id := id div d6 + (id2 mod d6) * d21;
         id2 := w
      until i = 0
   end;
   fill_output(138{TAB});
   w := rlsc;
   for i:= 1 to 3 do begin
      offer_character_to_typewriter(w div d10 div 10);
      offer_character_to_typewriter(w div d10 mod 10);
      w := (w mod d10) * d5;
      if i < 3 then
         fill_output(184{SPACE})
   end;
   fill_output(139{NLCR})
end {label_declaration};

procedure test_first_occurrence;   {LF}
begin
   id := store[nlib+nid];
   if (id div d15) mod 2 = 1 {first occurrence} then begin
      id := id - d15 - id mod d15 + 2 * d24 + flsc;
      if nid <= nlsc0 {MCP} then
         fill_future_list(flib+flsc,store[nlib+nid]);
      store[nlib+nid] := id;
      flsc := flsc + 1
   end
end {test_first_occurrence};

procedure new_block_by_declaration1;   {HU}
begin
   fill_result_list(0,71827456+bn) {2B 'bn' A};
   fill_result_list(89{SCC},0);
   pnlv := 5 * 32 + bn;
   vlam := pnlv
end {new_block_by_declaration1};

procedure new_block_by_declaration;   {HU}
begin
   if store[tlsc-2] <> 161{block-begin marker} then begin
      tlsc := tlsc - 1 {remove 'begin'};
      fill_result_list(0,4718592) {2A 0 A};
      fill_result_list(1,71827456+rlsc+3) {2B 'rlsc+3' A};
      fill_result_list(9{ETMP},0);
      fill_result_list(2,88080384+flsc) {2T 'flsc'};
      fill_t_list(flsc);
      flsc := flsc + 1;
      intro_new_block;
      fill_t_list(104{begin});
      new_block_by_declaration1
   end
end {new_block_by_declaration};

procedure fill_name_list;   {HN}
begin
   nlsc := nlsc + dflag + 2;
   if nlsc + nlib > plib then
      stop(16);
   store[nlib+nlsc-1] := id;
   store[nlib+nlsc-2] := inw;
   if inw mod d3 > 0 then
      store[nlib+nlsc-3] := fnw
end {fill_name_list};

procedure reservation_of_local_variables;   {KY}
begin
   if lvc > 0 then begin
      fill_result_list(0,4718592+lvc) {2A 'lvc' A};
      fill_result_list(0,8388657) {4A 17X1};
      fill_result_list(0,8388658) {4A 18X1}
   end
end {reservation_of_local_variables};

procedure address_to_register;   {ZR}
begin
   if id div d15 mod 2 = 0 {static addressing} then
      if id div d24 mod d2 = 2 {future list} then
         fill_result_list(2,
           71303168+id mod d15{2B 'FLI-address'})
   else
      fill_result_list(id div d24 mod 4,
        71827456+id mod d15{2B 'static address' A})
   else
      fill_result_list(0,
             21495808+id mod d15{2S 'dynamic address' A})
end {address_to_register};

procedure generate_address;   {ZH}

var
   opc        : integer;

begin
   address_to_register;
   if (id div d16) mod 2 = 1 then      {formal} fill_result_list(18{TFA},0)
   else begin
      opc := 14{TRAD};
      if (id div d15) mod 2 = 0 then
         opc := opc + 1{TRAS};
      if (id div d19) mod 2 = 1 then
         opc := opc + 2{TIAD or TIAS};
      fill_result_list(opc,0)
   end
end {generate_address};

procedure reservation_of_arrays;   {KN}
begin
   if vlam <> 0 then begin
      vlam := 0;
      if store[tlsc-1] = 161{block-begin marker} then
         rlaa := nlib + store[tlsc-2]
      else
         rlaa := nlib + store[tlsc-3];
      rlab := nlib + nlsc;
      while rlab <> rlaa do begin
         id := store[rlab-1];
         if (id >= d26) and (id < d25 + d26) then begin
            {value array:}
            address_to_register;
            if (id div d19) mod 2 = 0 then
               fill_result_list(92{RVA},0)
            else
               fill_result_list(93{IVA},0);
            store[rlab-1] := (id div d15) * d15 - d16 + pnlv;
            pnlv := pnlv + 8 * 32 {at most 5 indices}
         end;
         if store[rlab-2] mod d3 = 0 then
            rlab := rlab - 2
         else
            rlab := rlab - 3
      end;
      rlab := nlib + nlsc;
      while rlab <> rlaa do begin
         if store[rlab-1] >= d26 then begin
            id := store[rlab-1] - d26;
            if id < d25 then begin
               address_to_register;
               fill_result_list(95{VAP},0)
            end
            else begin
               id := id - d25;
               address_to_register;
               fill_result_list(94{LAP},0)
            end
         end;
         if store[rlab-2] mod d3 = 0 then
            rlab := rlab - 2
         else
            rlab := rlab - 3
      end;
      if nflag <> 0 then
         id := store[nlib+nid]
   end
end {reservation_of_arrays};

procedure procedure_statement;   {LH}
begin
   if eflag = 0 then
      reservation_of_arrays;
   if nid > nlscop then begin
      if fflag = 0 then
         test_first_occurrence;
      address_to_register
   end
   else begin
      fill_t_list(store[nlib+nid] mod d12);
      if dl = 98{(} then begin
         eflag := 1;
         goto 9801
      end
   end
end {procedure_statement};

procedure production_transmark;   {ZL}
begin
   fill_result_list(9+2*fflag-eflag,0)
end {production_transmark};

procedure production_of_object_program(opht: integer);   {ZS}

var
   operator,block_number: integer;

begin
   oh := opht;
   if nflag <> 0 then begin
      nflag := 0;
      aflag := 0;
      if pflag = 0 then
         if jflag = 0 then begin
            address_to_register;
            if oh > (store[tlsc-1] div d8) mod 16 then
               operator := 315{5*63}
            else begin
               operator := store[tlsc-1] mod d8;
               if (operator <= 63) or (operator > 67) then
                  operator := 315{5*63}
               else begin
                  tlsc := tlsc - 1;
                  operator := 5 * operator
               end
            end;
            if fflag = 0 then begin
               if id div d15 mod 2 = 0 then
                  operator := operator + 1;
               if id div d19 mod 2 <> 0 then
                  operator := operator + 2;
               fill_result_list(operator-284,0)
            end
            else
               fill_result_list(operator-280,0)
         end
      else if fflag = 0 then begin
         block_number := id div d19 mod d5;
         if block_number <> bn then begin
            fill_result_list
            (0,71827456+block_number);
            fill_result_list(28{GTA},0)
         end;
         test_first_occurrence;
         if id div d24 mod 4 = 2 then
            fill_result_list(2,88080384+id mod d15)
            {2T 'address'}
         else
            fill_result_list(1,88604672+id mod d15)
            {2T 'address' A}
      end
      else begin
         address_to_register;
         fill_result_list(35{TFR},0)
      end
      else begin
         procedure_statement;
         if nid > nlscop then begin
            fill_result_list(0,4718592{2A 0 A});
            production_transmark
         end
      end
   end
   else if aflag <> 0 then begin
      aflag := 0;
      fill_result_list(58{TAR},0)
   end;
   while oh <= store[tlsc-1] div d8 mod 16 do begin
      tlsc := tlsc - 1;
      operator := store[tlsc] mod d8;
      if (operator > 63) and (operator<= 80) then
         fill_result_list(operator-5,0)
      else if operator = 132 {NEG} then
         fill_result_list(57{NEG},0)
      else if (operator < 132) and (operator > 127) then begin
         {ST,STA,STP,STAP}
         if operator > 129 then begin
            {STP,STAP}
            tlsc := tlsc - 1;
            fill_result_list(0,71827456+store[tlsc]{2B 'BN' A})
         end;
         fill_result_list(operator-43,0)
      end
      else
         {special function}
         if (operator > 127) and (operator <= 141) then
            fill_result_list(operator-57,0)
      else if (operator > 141) and (operator <= 151) then
         fill_result_list(operator-40,0)
      else
         stop(22)
   end
end {production_of_object_program};

function  thenelse: boolean;   {ZN}
begin
   if (store[tlsc-1] mod 255 = 83{then})
   or (store[tlsc-1] mod 255 = 84{else}) then begin
      tlsc := tlsc - 2;
      fill_future_list(flib+store[tlsc],rlsc);
      unload_t_list_element(eflag);
      thenelse := true
   end
   else
      thenelse := false
end {thenelse};

procedure empty_t_list_through_thenelse;   {FR}
begin
   oflag := 1;
   repeat
      production_of_object_program(1)
   until not thenelse
end {empty_t_list_through_thenelse};

function do_in_t_list: boolean;   {ER}
begin
   if store[tlsc-1] mod 255 = 86 then begin
      tlsc := tlsc - 5;
      nlsc := store[tlsc+2];
      bn := bn - 1;
      fill_future_list(flib+store[tlsc+1],rlsc+1);
      fill_result_list(1,88604672{2T 0X0 A}+store[tlsc]);
      do_in_t_list := true
   end
   else
      do_in_t_list := false
end {do_in_t_list};

procedure look_for_name;   {HZ}

label
   1,2;

var
   i,w          : integer;

begin
   i := nlib + nlsc;
   1: w := store[i-2];
   if w = inw then
      if w mod 8 = 0 then
         {at most 4 letters/digits} goto 2
   else      {more than 4 letters/digits}
      if store[i-3] = fnw then
         goto 2;
   if w mod 8 = 0 then
      i := i - 2
   else
      i := i - 3;
   if i > nlib then
      goto 1;
   stop(7);
   2: nid := i - nlib - 1;
   id := store[i-1];
   pflag := id div d18 mod 2;
   jflag := id div d17 mod 2;
   fflag := id div d16 mod 2
end {look_for_name};

procedure look_for_constant;   {FW}

var
   i          : integer;

begin
   if klib + klsc + dflag >= nlib then begin      {move name list}
      if nlib + nlsc + 16 >= plib then
         stop(5);
      for i:= nlsc - 1 downto 0 do
         store[nlib+i+16]:= store[nlib+i];
      nlib := nlib + 16
   end;
   if dflag = 0 then begin      {search integer constant}
      store[klib+klsc] := inw;
      i := 0;
      while store[klib+i] <> inw do
         i:= i + 1;
   end
   else begin      {search floating constant}
      store[klib+klsc] := fnw;
      store[klib+klsc+1] := inw;
      i := 0;
      while (store[klib+i] <> fnw)
        or (store[klib+i+1] <> inw) do
         i:= i + 1;
   end;
   if i = klsc then      {first occurrence} klsc := klsc + dflag + 1;
   id := 3 * d24 + i;
   if dflag = 0 then
      id := id + d19;
   jflag := 0;
   pflag := 0;
   fflag := 0
end {look_for_constant};

begin   {body of main scan}                                          {EL}
   1: read_until_next_delimiter;
   2: if nflag <> 0 then
         if kflag = 0 then
            look_for_name
      else
         look_for_constant
      else begin
         jflag := 0;
         pflag := 0;
         fflag := 0
      end;
   3: if dl <= 65 then
         goto 64;   {+,-}                               {EH}
   if dl <= 68 then
      goto 66;   {*,/,_:}
   if dl <= 69 then
      goto 69;   {|^}
   if dl <= 75 then
      goto 70;   {<,_<,=,_>,>,|=}
   if dl <= 80 then
      goto 76;   {~,^,`,=>,_=}
   case dl of
   81:
      goto  81;   {goto}                                         {KR}
   82:
      goto  82;   {if}                                           {EY}
   83:
      goto  83;   {then}                                         {EN}
   84:
      goto  84;   {else}                                         {FZ}
   85:
      goto  85;   {for}                                          {FE}
   86:
      goto  86;   {do}                                           {FL}
   87:
      goto  87;   {,}                                            {EK}
   90:
      goto  90;   {:}                                            {FN}
   91:
      goto  91;   {;}                                            {FS}
   92:
      goto  92;   {:=}                                           {EZ}
   94:
      goto  94;   {step}                                         {FH}
   95:
      goto  95;   {until}                                        {FK}
   96:
      goto  96;   {while}                                        {FF}
   98:
      goto  98;   {(}                                            {EW}
   99:
      goto  99;   {)}                                            {EU}
   100:
      goto 100;   {[}                                            {EE}
   101:
      goto 101;   {]}                                            {EF}
   102:
      goto 102;   {|<}                                           {KS}
   104:
      goto 104;   {begin}                                        {LZ}
   105:
      goto 105;   {end}                                          {FS}
   106:
      goto 106;   {own}                                          {KH}
   107:
      goto 107;   {Boolean}                                      {KZ}
   108:
      goto 108;   {integer}                                      {KZ}
   109:
      goto 109;   {real}                                         {KE}
   110:
      goto 110;   {array}                                        {KF}
   111:
      goto 111;   {switch}                                       {HE}
   112:
      goto 112;   {procedure}                                    {HY}
   end {case};

   64: {+,-}                                                         {ES}
       if oflag = 0 then begin
          production_of_object_program(9);
          fill_t_list_with_delimiter
       end
       else if dl = 65{-} then begin
          oh := 10;
          dl := 132{NEG};
          fill_t_list_with_delimiter
       end;
   goto 1;
   66: {*,/,_:}                                                      {ET}
       production_of_object_program(10);
   fill_t_list_with_delimiter;
   goto 1;

   69: {|^}                                                          {KT}
       production_of_object_program(11);
   fill_t_list_with_delimiter;
   goto 1;

   70: {<,_<,=,_>,>,|=}                                              {KK}
       oflag := 1;
   production_of_object_program(8);
   fill_t_list_with_delimiter;
   goto 1;

   76: {~,^,`,=>,_=}                                                 {KL}
       if dl = 76{~} then begin
          oh := 83-dl;
          goto 8202
       end;
   production_of_object_program(83-dl);
   fill_t_list_with_delimiter;
   goto 1;

   81: {goto}                                                        {KR}
       reservation_of_arrays;
   goto 1;

   82:   {if}                                                        {EY}
       if eflag = 0 then
          reservation_of_arrays;
   fill_t_list(eflag);
   eflag := 1;
   8201: oh := 0;
   8202: fill_t_list_with_delimiter;
   oflag := 1;
   goto 1;

   83:   {then}                                                      {EN}
       repeat
          production_of_object_program(1)
       until not thenelse;
   tlsc := tlsc - 1;
   eflag := store[tlsc-1];
   fill_result_list(30{CAC},0);
   fill_result_list(2,88178688+flsc) {N 2T 'flsc'};
   8301: fill_t_list(flsc);
   flsc := flsc + 1;
   goto 8201;

   84:   {else}                                                      {FZ}
       production_of_object_program(1);
   if store[tlsc-1] mod d8 = 84{else} then
      if thenelse then
         goto 84;
   8401: if do_in_t_list then
            goto 8401;
   if store[tlsc-1] = 161 {block-begin marker} then begin
      tlsc := tlsc - 3;
      nlsc := store[tlsc+1];
      fill_future_list(flib+store[tlsc],rlsc+1);
      fill_result_list(12{RET},0);
      bn := bn - 1;
      goto 8401
   end;
   fill_result_list(2,88080384+flsc) {2T 'flsc'};
   if thenelse {finds 'then'!} then
      tlsc := tlsc + 1 {keep eflag in t_list};
   goto 8301;

   85:   {for}                                                       {FE}
       reservation_of_arrays;
   fill_result_list(2,88080384+flsc) {2T 'flsc'};
   fora := flsc;
   flsc := flsc + 1;
   fill_t_list(rlsc);
   vflag := 1;
   bn := bn + 1;
   8501: oh := 0;
   fill_t_list_with_delimiter;
   goto 1;

   86:   {do}                                                        {FL}
       empty_t_list_through_thenelse;
   goto 8701;   {execute part of DDEL ,}
   8601: {returned from DDEL ,}
         vflag := 0;
   tlsc := tlsc - 1;
   fill_result_list(2,20971520+flsc) {2S 'flsc'};
   fill_t_list(flsc);
   flsc := flsc + 1;
   fill_result_list(27{FOR8},0);
   fill_future_list(flib+fora,rlsc);
   fill_result_list(19{FOR0},0);
   fill_result_list(1,88604672{2T 0X0 A}+store[tlsc-2]);
   fill_future_list(flib+forc,rlsc);
   eflag := 0;
   intro_new_block1;
   goto 8501;

   87:  {,}                                                          {EK}
       oflag := 1;
   if iflag = 1 then begin      {subscript separator:}
      repeat
         production_of_object_program(1)
      until not thenelse;
      goto 1
   end;
   if vflag = 0 then
      goto 8702;   {for-list separator:}
   repeat
      production_of_object_program(1)
   until not thenelse;
   8701: if store[tlsc-1] mod d8 = 85{for} then
            fill_result_list(21{for2},0)
         else begin
            tlsc := tlsc - 1;
            if store[tlsc] mod d8 = 96{while} then
               fill_result_list(23{for4},0)
            else
               fill_result_list(26{for7},0)
         end;
   if dl = 86{do} then
      goto 8601;
   goto 1;
   8702: if mflag = 0 then
            goto 8705;   {actual parameter separator:}
   if store[tlsc-1] mod d8 = 87{,} then
      if aflag = 0 then
         if (store[tlsc-2] = rlsc)
            and (fflag = 0) and (jflag = 0) and (nflag = 1) then begin
            if nid > nlscop then begin
               if (pflag = 1) and (fflag = 0) then
                  {non-formal procedure:}
                  test_first_occurrence;
               {PORD construction:}
               if (id div d15) mod 2 = 0 then begin
                  {static addressing}
                  pstb := ((id div d24) mod d2) * d24
                         + id mod d15;
                  if (id div d24) mod d2 = 2 then
                     pstb := pstb + d17
               end
               else begin
                  {dynamic addressing}
                  pstb := d16 + (id mod d5) * d22
                         + (id div d5) mod d10;
                  if (id div d16) mod 2 = 1 then begin
                     store[tlsc-2] := pstb + d17;
                     goto 8704
                  end
               end;
               if (id div d18) mod 2 = 1 then
                  store[tlsc-2] := pstb + d20
               else if (id div d19) mod 2 = 1 then
                  store[tlsc-2] := pstb + d19
               else
                  store[tlsc-2] := pstb;
               goto 8704
            end
            else begin
               fill_result_list(98{TFP},0);
               goto 8703
            end
         end
   else
      goto 8703
   else begin      {completion of implicit subroutine:}
      store[tlsc-2] := store[tlsc-2] + d19 + d20 + d24;
      fill_result_list(13{EIS},0);
      goto 8704
   end;
   8703: {completion of implicit subroutine:}
         repeat
            production_of_object_program(1)
         until not (thenelse or do_in_t_list);
   store[tlsc-2] := store[tlsc-2] + d20 + d24;
   fill_result_list(13{EIS},0);
   8704: if dl = 87{,} then
            goto 9804 {prepare next parameter};   {production of PORDs:}
   psta := 0;
   unload_t_list_element(pstb);
   while pstb mod d8 = 87{,} do begin
      psta := psta + 1;
      unload_t_list_element(pstb);
      if pstb div d16 mod 2 = 0 then
         fill_result_list(pstb div d24, pstb mod d24)
      else
         fill_result_list(0,pstb);
      unload_t_list_element(pstb)
   end;
   tlsc := tlsc - 1;
   fill_future_list(flib+store[tlsc],rlsc);
   fill_result_list(0,4718592+psta) {2A 'psta' A};
   bn := bn - 1;
   unload_t_list_element(fflag);
   unload_t_list_element(eflag);
   production_transmark;
   aflag := 0;
   unload_t_list_element(mflag);
   unload_t_list_element(vflag);
   unload_t_list_element(iflag);
   goto 1;
   8705: empty_t_list_through_thenelse;
   if sflag = 0 then      {array declaration} goto 1;   {switch declaration:}
   oh := 0;
   dl := 160;
   fill_t_list(rlsc);
   fill_t_list_with_delimiter;
   goto 1;

   90: {:}                                                           {FN}
       if jflag = 0 then begin
          {array declaration}
          ic := ic + 1;
          empty_t_list_through_thenelse
       end
       else begin
          {label declaration}
          reservation_of_arrays;
          label_declaration
       end;
   goto 1;

   91: goto 105{end};

   92: {:=}                                                          {EZ}
       reservation_of_arrays;
   dl := 128{ST};
   oflag := 1;
   if vflag = 0 then begin
      if sflag = 0 then begin
         {assignment statement}
         if eflag = 0 then
            eflag := 1
         else
            dl := 129{STA};
         oh := 2;
         if pflag = 0 then begin
            {assignment to variable}
            if nflag <> 0 then
               {assignment to scalar} generate_address;
         end
         else begin
            {assignment to function identifier}
            dl := dl + 2{STP or STAP};
            fill_t_list((id div d19) mod d5{bn from id})
         end;
         fill_t_list_with_delimiter
      end
      else begin
         {switch declaration}
         fill_result_list(2,88080384+flsc) {2T 'flsc'};
         fill_t_list(flsc);
         flsc := flsc + 1;
         fill_t_list(nid);
         oh := 0;
         fill_t_list_with_delimiter;
         dl := 160;
         fill_t_list(rlsc);
         fill_t_list_with_delimiter
      end
   end
   else begin      {for statement}
      eflag := 1;
      if nflag <> 0 then
         {simple variable} generate_address;
      fill_result_list(20{FOR1},0);
      forc := flsc;
      fill_result_list(2,88080384+flsc) {2T 'flsc'};
      flsc := flsc + 1;
      fill_future_list(flib+fora,rlsc);
      fill_result_list(0,4718592{2A 0 A});
      fora := flsc;
      fill_result_list(2,71303168+flsc) {2B 'flsc};
      flsc := flsc + 1;
      fill_result_list(9{ETMP},0)
   end;
   goto 1;

   94: {step}                                                        {FH}
       empty_t_list_through_thenelse;
   fill_result_list(24{FOR5},0);
   goto 1;

   95: {until}                                                       {FK}
       empty_t_list_through_thenelse;
   fill_result_list(25{FOR6},0);
   goto 8501;

   96: {while}                                                       {FF}
       empty_t_list_through_thenelse;
   fill_result_list(22{FOR3},0);
   goto 8501;

   98:   {(}                                                         {EW}
       oflag := 1;
   if pflag = 1 then
      goto 9803;
   9801: {parenthesis in expression:}
         fill_t_list(mflag);
   mflag := 0;
   9802: oh := 0;
   fill_t_list_with_delimiter;
   goto 1;
   9803: {begin of parameter list:}
         procedure_statement;
   fill_result_list(2,88080384+flsc) {2T 'flsc'};
   fill_t_list(iflag);
   fill_t_list(vflag);
   fill_t_list(mflag);
   fill_t_list(eflag);
   fill_t_list(fflag);
   fill_t_list(flsc);
   iflag := 0;
   vflag := 0;
   mflag := 1;
   eflag := 1;
   flsc := flsc + 1;
   oh := 0;
   bn := bn + 1;
   fill_t_list_with_delimiter;
   dl := 87{,};
   9804: {prepare parsing of actual parameter:}
         fill_t_list(rlsc);
   aflag := 0;
   goto 9802;

   99: {)}                                                           {EU}
       if mflag = 1 then
          goto 8702;
   repeat
      production_of_object_program(1)
   until not thenelse;
   tlsc := tlsc - 1;
   unload_t_list_element(mflag);
   goto 1;

   100: {[}                                                           {EE}
        if eflag = 0 then
           reservation_of_arrays;
   oflag := 1;
   oh := 0;
   fill_t_list(eflag);
   fill_t_list(iflag);
   fill_t_list(mflag);
   fill_t_list(fflag);
   fill_t_list(jflag);
   fill_t_list(nid);
   eflag := 1;
   iflag := 1;
   mflag := 0;
   fill_t_list_with_delimiter;
   if jflag = 0 then
      generate_address {of storage function};
   goto 1;

   101: {]}                                                           {EF}
        repeat
           production_of_object_program(1)
        until not thenelse;
   tlsc := tlsc - 1;
   if iflag = 0 then begin      {array declaration:}
      fill_result_list(0,21495808+aic{2S 'aic' A});
      fill_result_list(90{RSF}+ibd,0) {RSF or ISF};
      arrb := d15 + d25 + d26;
      if ibd = 1 then
         arrb := arrb + d19;
      arra := nlib + nlsc;
      repeat
         store[arra-1] := arrb + pnlv;
         if store[arra-2] mod d3 = 0 then
            arra := arra - 2
         else
            arra := arra - 3;
         pnlv := pnlv + (ic + 3) * d5;
         aic := aic - 1
      until aic = 0;
      read_until_next_delimiter;
      if dl <> 91 then
         goto 1103;
      eflag := 0;
      goto 1
   end;
   unload_t_list_element(nid);
   unload_t_list_element(jflag);
   unload_t_list_element(fflag);
   unload_t_list_element(mflag);
   unload_t_list_element(iflag);
   unload_t_list_element(eflag);
   if jflag = 0 then begin      {subscripted variable:}
      aflag := 1;
      fill_result_list(56{IND},0);
      goto 1
   end;   {switch designator:}
   nflag := 1;
   fill_result_list(29{SSI},0);
   read_next_symbol;
   id := store[nlib+nid];
   pflag := 0;
   goto 3;

   102: {|<}                                                          {KS}
        qc := 1;
   qb := 0;
   qa := 1;
   repeat
      read_next_symbol;
      if dl = 102{|<} then
         qc := qc + 1;
      if dl = 103{|>} then
         qc := qc - 1;
      if qc > 0 then begin
         qb := qb + dl * qa;
         qa := qa * d8;
         if qa = d24 then begin
            fill_result_list(0,qb);
            qb := 0;
            qa := 1
         end
      end
   until qc = 0;
   fill_result_list(0,qb+255{end marker}*qa);
   oflag := 0;
   goto 1;

   104: {begin}                                                       {LZ}
        if store[tlsc-1] <> 161 {block-begin marker} then
           reservation_of_arrays;
   goto 8501;

   105: {end}                                                         {FS}
        reservation_of_arrays;
   repeat
      empty_t_list_through_thenelse
   until not do_in_t_list;
   if sflag = 0 then begin
      if store[tlsc-1] = 161 {blok-begin marker} then begin
         tlsc := tlsc - 3;
         nlsc := store[tlsc+1];
         fill_future_list(flib+store[tlsc],rlsc+1);
         fill_result_list(12{RET},0);
         bn := bn - 1;
         goto 105
      end
   end
   else begin      {end of switch declaration}
      sflag := 0;
      repeat
         tlsc := tlsc - 2;
         fill_result_list(1,88604672+store[tlsc])
         {2T 'stacked RLSC' A}
      until store[tlsc-1] <> 160{switch comma};
      tlsc := tlsc - 1;
      unload_t_list_element(nid);
      label_declaration;
      fill_result_list(0,85983232+48) {1T 16X1};
      tlsc := tlsc - 1;
      fill_future_list(flib+store[tlsc],rlsc)
   end;
   eflag := 0;
   if dl <> 105{end} then
      goto 1;
   tlsc := tlsc - 1;
   if tlsc = tlib + 1 then
      goto 1052;
   repeat
      read_next_symbol
   until (dl = 91{;}) or (dl = 84{else}) or (dl = 105{end});
   jflag := 0;
   pflag := 0;
   fflag := 0;
   nflag := 0;
   goto 2;

   106: {own}                                                         {KH}
        new_block_by_declaration;
   read_next_symbol;
   if dl = 109{real} then
      ibd := 0
   else
      ibd := 1;
   read_until_next_delimiter;
   if nflag = 0 then
      goto 1102;
   goto 1082;

   107: {Boolean}                                                     {KZ}
        goto 108{integer};

   108:  {integer}                                                    {KZ}
        ibd := 1;
   new_block_by_declaration;
   read_until_next_delimiter;
   1081: if nflag = 0 then begin
            if dl = 110{array} then
               goto 1101;
            goto 112{procedure}
         end;   {scalar:}
   if bn <> 0 then
      goto 1083;
   1082: {static addressing}
         id := gvc;
   if ibd = 1 then begin
      id := id + d19;
      gvc := gvc + 1
   end
   else
      gvc := gvc + 2;
   fill_name_list;
   if dl = 87{,} then begin
      read_until_next_delimiter;
      goto 1082
   end;
   goto 1;
   1083: {dynamic addressing}
         id := pnlv + d15;
   if ibd = 1 then begin
      id := id + d19;
      pnlv := pnlv + 32;
      lvc := lvc + 1
   end
   else begin
      pnlv := pnlv + 2 * 32;
      lvc := lvc + 2
   end;
   fill_name_list;
   if dl = 87{,} then begin
      read_until_next_delimiter;
      goto 1083
   end;
   read_until_next_delimiter;
   if (dl <= 106{own}) or (dl > 109{real}) then begin
      reservation_of_local_variables;
      goto 2
   end;
   if dl = 109{real} then
      ibd := 0
   else
      ibd := 1;
   read_until_next_delimiter;
   if nflag = 1 then
      goto 1083 {more scalars};
   reservation_of_local_variables;
   if dl = 110{array} then
      goto 1101;
   goto 3;

   109: {real}                                                        {KE}
        ibd := 0;
   new_block_by_declaration;
   read_until_next_delimiter;
   if nflag = 1 then
      goto 1081;
   goto 2;

   110:  {array}                                                      {KF}
        ibd := 0;
   new_block_by_declaration;
   1101: if bn <> 0 then
            goto 1103;
   1102: {static bounds, constants only:}
         id := 3 * d24;
   if ibd <> 0 then
      id := id + d19;
   repeat
      arra := nlsc;
      arrb := tlsc;
      repeat
         {read identifier list:}
         read_until_next_delimiter;
         fill_name_list
      until dl = 100{[};
      arrc := 0;
      fill_t_list(2-ibd);      {delta[0]}
      repeat
         {read bound-pair list:}
         {lower bound:}
         read_until_next_delimiter;
         if dl <> 90 {:} then
            if dl = 64{+} then begin
               read_until_next_delimiter;
               arrd := inw
            end
         else begin
            read_until_next_delimiter;
            arrd := - inw
         end
         else
            arrd := inw;
         arrc := arrc - (arrd * store[tlsc-1]) mod d26;
         {upper bound:}
         read_until_next_delimiter;
         if nflag = 0 then
            if dl = 65{-} then begin
               read_until_next_delimiter;
               arrd := - inw - arrd
            end
         else begin
            read_until_next_delimiter;
            arrd := inw - arrd
         end
         else
            arrd := inw - arrd;
         if dl = 101{[} then
            fill_t_list(- ((arrd + 1) * store[tlsc-1]) mod d26)
         else
            fill_t_list(((arrd + 1) * store[tlsc-1]) mod d26)
      until dl = 101{]};
      arrd := nlsc;
      repeat
         {construction of storage function in constant list:}
         store[nlib+arrd-1] := store[nlib+arrd-1] + klsc;
         fill_constant_list(gvc);
         fill_constant_list(gvc+arrc);
         tlsc := arrb;
         repeat
            fill_constant_list(store[tlsc]);
            tlsc := tlsc + 1
         until store[tlsc-1] <= 0;
         gvc := gvc - store[tlsc-1];
         tlsc := arrb;
         if store[nlib+arrd-2] mod d3 = 0 then
            arrd := arrd - 2
         else
            arrd := arrd - 3
      until arrd = arra;
      read_until_next_delimiter
   until dl <> 87{,};
   goto 91{;};
   1103: {dynamic bounds,arithmetic expressions:}
         ic := 0;
   aic := 0;
   id := 0;
   repeat
      aic := aic + 1;
      read_until_next_delimiter;
      fill_name_list
   until dl <> 87{,};
   eflag := 1;
   oflag := 1;
   goto 8501;

   111: {switch}                                                      {HE}
        reservation_of_arrays;
   sflag := 1;
   new_block_by_declaration;
   goto 1;

   112:  {procedure}                                                  {HY}
        reservation_of_arrays;
   new_block_by_declaration;
   fill_result_list(2,88080384+flsc) {2T 'flsc'};
   fill_t_list(flsc);
   flsc := flsc + 1;
   read_until_next_delimiter;
   look_for_name;
   label_declaration;
   intro_new_block;
   new_block_by_declaration1;
   if dl = 91{;} then
      goto 1;   {formal parameter list:}
   repeat
      read_until_next_delimiter;
      id := pnlv + d15 + d16;
      fill_name_list;
      pnlv := pnlv + 2 * d5 {reservation PARD}
   until dl <> 87;
   read_until_next_delimiter;   {for ; after )}
   1121: read_until_next_delimiter;
   if nflag = 1 then
      goto 2;
   if dl = 104{begin} then
      goto 3;
   if dl <> 115{value} then
      goto 1123 {specification part};   {value part:}
   spe := d26;   {value flag}
   1122: repeat
            read_until_next_delimiter;
            look_for_name;
            store[nlib+nid] := store[nlib+nid] + spe
         until dl <> 87;
   goto 1121;
   1123: {specification part:}
         if (dl = 113{string}) or (dl = 110{array}) then begin
            spe := 0;
            goto 1122
         end;
   if (dl = 114{label}) or (dl = 111{switch}) then begin
      spe := d17;
      goto 1122
   end;
   if dl = 112{procedure} then begin
      spe := d18;
      goto 1122
   end;
   if dl = 109{real} then
      spe := 0
   else
      spe := d19;
   if (dl <= 106) or (dl > 109) then
      goto 3;   {if,for,goto}
   read_until_next_delimiter;   {for delimiter following real/integer/boolean}
   if dl = 112{procedure} then begin
      spe := d18;
      goto 1122
   end;
   if dl = 110{array} then
      goto 1122;
   1124: look_for_name;
   store[nlib+nid] := store[nlib+nid] + spe;
   if store[nlib+nid] >= d26 then begin
      id := store[nlib+nid] - d26;
      id := (id div d17) * d17 + id mod d16;
      store[nlib+nid] := id;
      address_to_register;      {generates 2S 'PARD position' A}
      if spe = 0 then
         fill_result_list(14{TRAD},0)
      else
         fill_result_list(16{TIAD},0);
      address_to_register;      {generates 2S 'PARD position' A}
      fill_result_list(35{TFR},0);
      fill_result_list(85{ST},0)
   end;
   if dl = 87{,} then begin
      read_until_next_delimiter;
      goto 1124
   end;
   goto 1121;

   1052: 
end {main_scan};

procedure program_loader;   {RZ}

var
   i,j,ll,list_address,id,mcp_count,crfa       : integer;
   heptade_count,parity_word,read_location,stock      : integer;
   from_store: 0..1;
   use        : boolean;

function logical_sum(n,m: integer): integer;   {emulation of a machine instruction}

var
   i,w          : integer;

begin
   w := 0;
   for i:= 0 to 26 do begin
      w := w div 2;
      if n mod 2 = m mod 2 then
         w := w + d26;
      n := n div 2;
      m := m div 2
   end;
   logical_sum := w
end {logical_sum};

procedure complete_bitstock;   {RW}

var
   i,w          : integer;

begin
   while bitcount > 0 {i.e., at most 20 bits in stock} do begin
      heptade_count := heptade_count + 1;
      case from_store of
      0:
         {bit string read from store:}
         begin
         if heptade_count > 0 then begin
            bitcount := bitcount + 1;
            heptade_count := - 3;
            read_location := read_location - 1;
            stock := store[read_location];
            w := stock div d21;
            stock := (stock mod d21) * 64
         end
         else begin
            w := stock div d20;
            stock := (stock mod d20) * 128
         end
      end;
      1:
         {bit string read from tape:}
         begin
         read(lib_tape,w);
         if heptade_count > 0 then begin
            {test parity of the previous 4 heptades}
            bitcount := bitcount + 1;
            parity_word := 
               logical_sum(parity_word,parity_word div d4)
               mod d4;
            if parity_word in [0,3,5,6,9,10,12,15] then
               stop(105);
            heptade_count := -3;
            parity_word := w;
            w := w div 2
         end
         else
            parity_word := logical_sum(parity_word,w)
      end
      end {case};
      for i:= 1 to bitcount - 1 do
         w:= 2 * w;
      bitstock := bitstock + w;
      bitcount := bitcount - 7
   end {while}
end {complete_bitstock};

function read_bit_string(n: integer): integer;   {RW}

var
   i,w          : integer;

begin
   w := 0;
   for i:= 1 to n do begin
      w := 2 * w + bitstock div d26;
      bitstock := (bitstock mod d26) * 2
   end;
   read_bit_string := w;
   bitcount := bitcount + n;
   complete_bitstock
end {read_bit_string};

procedure prepare_read_bit_string1;

var
   i          : integer;

begin
   for i:= 1 to 27 - bitcount do
      bitstock:= 2 * bitstock;
   bitcount := 21 - bitcount;
   heptade_count := 0;
   from_store := 0;
   complete_bitstock
end {prepare_read_bit_string1};

procedure prepare_read_bit_string2;
begin
   bitstock := 0;
   bitcount := 21;
   heptade_count := 0;
   from_store := 0;
   complete_bitstock;
   repeat
   until read_bit_string(1) = 1
end {prepare_read_bit_string2};

procedure prepare_read_bit_string3;

var
   w          : integer;

begin
   from_store := 1;
   bitstock := 0;
   bitcount := 21;
   repeat
      read(lib_tape,w)
   until w <> 0;
   if w <> 30 {D} then
      stop(106);
   heptade_count := 0;
   parity_word := 1;
   complete_bitstock;
   repeat
   until read_bit_string(1) = 1
end {prepare_read_bit_string3};

function address_decoding: integer;   {RY}

var
   w,a,n          : integer;

begin
   w := bitstock;
   if w < d26 {code starts with 0} then begin      {0}      n := 1;
      a := 0;
      w := 2 * w
   end
   else begin      {1xxxxx} n := 6;
      a := (w div d21) mod d5;
      w := (w mod d21) * d6
   end;
   if w < d25 {00} then begin      {00} n := n + 2;
      a := 32 * a + 0;
      w := w * 4
   end
   else if w < d26 {01} then begin      {01xx} n := n + 4;
      a := 32 * a + w div d23;
      if a mod d5 < 6 then
         {010x} a := a - 3
      else
         {011x} a := a - 2;
      w := (w mod d23) * d4
   end
   else begin      {1xxxxx} n := n + 6;
      a := a * 32 + (w div d21) mod d5;
      w := (w mod d21) * d6
   end;
   if w < d25 {00} then begin      {00} n := n + 2;
      a := 32 * a + 1
   end
   else if w < d26 {01} then begin      {01x} n := n + 3;
      a := 32 * a + w div d24
   end
   else begin      {1xxxxx} n := n + 6;
      a := 32 * a + (w div d21) mod d5
   end;
   w := read_bit_string(n);
   address_decoding := a
end {address_decoding};

function read_mask: integer;   {RN}

var
   c          : 0.. 19;

begin
   if bitstock < d26 {code starts with 0} then      {0x} c := read_bit_string(2)
   else if bitstock < d26 + d25 {01} then      {10x} c := read_bit_string(3) - 2
   else      {11xxxx} c := read_bit_string(6) - 44;
   case c of
   0:
      read_mask :=   656;   {0,   2S 0   A  }
   1:
      read_mask := 14480;   {3,   2B 0   A  }
   2:
      read_mask := 10880;   {2,   2T 0 X0   }
   3:
      read_mask :=  2192;   {0,   2B 0   A  }
   4:
      read_mask :=   144;   {0,   2A 0   A  }
   5:
      read_mask := 10368;   {2,   2B 0 X0   }
   6:
      read_mask :=  6800;   {1,   2T 0   A  }
   7:
      read_mask :=     0;   {0,   0A 0 X0   }
   8:
      read_mask := 12304;   {3,   0A 0   A  }
   9:
      read_mask := 10883;   {2, N 2T 0 X0   }
   10:
      read_mask :=  6288;   {1,   2B 0   A  }
   11:
      read_mask :=  4128;   {1,   0A 0 X0 B }
   12:
      read_mask :=  8832;   {2,   2S 0 X0   }
   13:
      read_mask :=   146;   {0, Y 2A 0   A  }
   14:
      read_mask :=   256;   {0,   4A 0 X0   }
   15:
      read_mask :=   134;   {0, Y 2A 0 X0  P}
   16:
      read_mask :=   402;   {0, Y 6A 0   A  }
   17:
      read_mask :=  4144;   {1,   0A 0 X0 C }
   18:
      read_mask :=    16;   {0,   0A 0   A  }
   19:
      read_mask := address_decoding
   end {case}
end {read_mask};

function read_binary_word: integer;   {RF}

var
   w          : integer;
   opc        : 0.. 3;

begin
   if bitstock < d26 {code starts with 0} then begin      {OPC >= 8}
      if bitstock < d25 {00} then
         if bitstock < d24 {000} then
            w := 4 {code is 000x}
      else
         w := 5 {code is 001xx}
      else if bitstock < d25 + d24 {010} then
         if bitstock < d25 + d23 {0100} then
            w := 6 {0100xx}
      else
         w := 7 {0101xxx}
      else
         w := 10 {011xxxxxxx};
      w := read_bit_string(w);
      if w <  2 {000x} then
         {no change}
      else if w <  8 {001xx} then
         w := w -  2
      else if w < 24 {010xx} then
         w := w - 10
      else if w < 48 {0101xxx} then
         w := w - 30
      else
         {011xxxxxxx}   w := w - 366;
      read_binary_word := opc_table[w]
   end {0}
   else begin
      w := read_bit_string(1);
      w := read_mask;
      opc := w div d12;
      w := (w mod d12) * d15 + address_decoding;
      case opc of
      0:;
      1:
         w := w + list_address;
      2: begin
         if w div d17 mod 2 = 1 {d17 = 1} then
            w := w - d17
         else
            w := w + d19;
         w := w  - w mod d15 + store[flib + w mod d15]
      end;
      3:
         if klib = crfb then
            w := w - w mod d15 + store[mlib+w mod d15]
         else
            w := w + klib
      end {case};
      read_binary_word := w
   end {1}
end {read_binary_word};

procedure test_bit_stock;   {RH}
begin
   if bitstock <> 63 * d21 then
      stop(107)
end {test_bit_stock};

procedure typ_address(a: integer);   {RT}
begin
   writeln(output);
   write(output,a div 1024:2,' ',(a mod 1024) div 32: 2,' ',a mod 32: 2)
end {typ_address};

procedure read_list;   {RL}

var
   i,j,w          : integer;

begin
   for i:= ll - 1 downto 0 do begin
      w := read_binary_word;
      if list_address + i <= flib + flsc then begin
         {shift FLI downwards}
         if flib <= read_location then
            stop(98);
         for j:= 0 to flsc - 1 do
            store[read_location+j]:= store[flib+j];
         flib := read_location
      end;
      store[list_address+i] := w
   end {for i};
   test_bit_stock;
end {read_list};

function read_crf_item: integer;   {RS}
begin
   if crfa mod 2 = 0 then
      read_crf_item := store[crfa div 2] div d13
   else
      read_crf_item := store[crfa div 2] mod d13;
   crfa := crfa + 1
end {read_crf_item};

begin   {of program loader}
   rlib := (klie - rlsc - klsc) div 32 * 32;   {increment entries in future list:}
   for i:= 0 to flsc - 1 do
      store[flib+i]:= store[flib+i] + rlib;   {move KLI to final position:}
   for i:= klsc - 1 downto 0 do
      store[rlib+rlsc+i]:= store[klib+i];
   klib := rlib + rlsc;   {prepare mcp-need analysis:}
   mcpe := rlib;
   mcp_count := 0;
   for i:= 0 to 127 do
      store[mlib+i]:= 0;   {determine primary need of MCP's from name list:}
   i := nlsc0;
   while i > nlscop do begin
      id := store[nlib+i-1];
      if store[nlib+i-2] mod d3 = 0 then
         {at most 4 letter/digit identifier} i := i - 2
      else
         {at least 5 letters or digits} i := i - 3;
      if (id div d15) mod 2 = 0 then begin
         {MCP is used} mcp_count := mcp_count + 1;
         store[mlib+(store[flib+id mod d15]-rlib) mod d15] := 
            - (flib + id mod d15)
      end
   end;   {determine secondary need using the cross-reference list:}
   crfa := 2 * crfb;
   ll := read_crf_item {for MCP length};
   while ll <> 7680 {end marker} do begin
      i := read_crf_item {for MCP number};
      use := (store[mlib+i] <> 0);
      j := read_crf_item {for number of MCP needing the current one};
      while j <> 7680 {end marker} do begin
         use := use or (store[mlib+j] <> 0);
         j := read_crf_item
      end;
      if use then begin
         mcpe := mcpe - ll;
         if mcpe <= mcpb then
            stop(25);
         if store[mlib+i] < 0 then
            {primary need} store[-store[mlib+i]] := mcpe
         else
            {only secondary need} mcp_count := mcp_count + 1;
         store[mlib+i] := mcpe
      end;
      ll := read_crf_item
   end;   {load result list RLI:}
   ll := rlsc;
   read_location := rnsb;
   prepare_read_bit_string1;
   list_address := rlib;
   read_list;
   if store[rlib] <> opc_table[89{START}] then
      stop(101);
   typ_address(rlib);   {copy MLI:}
   for i:= 0 to 127 do
      store[crfb+i]:= store[mlib+i];
   klib := crfb;
   flsc := 0;   {load MCP's from store:}
   prepare_read_bit_string2;
   ll := read_bit_string(13) {for length or end marker};
   while ll < 7680 do begin
      i := read_bit_string(13) {for MCP number};
      list_address := store[crfb+i];
      if list_address <> 0 then begin
         read_list;
         test_bit_stock;
         mcp_count := mcp_count - 1;
         store[crfb+i] := 0
      end
      else
         repeat
            read_location := read_location - 1
         until store[read_location] = 63 * d21;
      prepare_read_bit_string2;
      ll := read_bit_string(13)
   end;   {load MCP's from tape:}
   reset(lib_tape);
   while mcp_count <> 0 do begin
      writeln(output);
      writeln(output,'load (next) library tape into the tape reader');
      prepare_read_bit_string3;
      ll := read_bit_string(13) {for length or end marker};
      while ll < 7680 do begin
         i := read_bit_string(13) {for MCP number};
         list_address := store[crfb+i];
         if list_address <> 0 then begin
            read_list;
            test_bit_stock;
            mcp_count := mcp_count - 1;
            store[crfb+i] := 0
         end
         else
            repeat
               repeat
                  read(lib_tape,ll)
               until ll = 0;
               read(lib_tape,ll)
            until ll = 0;
         prepare_read_bit_string3;
         ll := read_bit_string(13)
      end
   end;   {program loading completed:}
   typ_address(mcpe)
end {program_loader};

{main program}

begin   {initialization of word_del_table}                                 {HT}
   word_del_table[10] := 15086;
   word_del_table[11] :=    43;
   word_del_table[12] :=     1;
   word_del_table[13] :=    86;
   word_del_table[14] := 13353;
   word_del_table[15] := 10517;
   word_del_table[16] :=    81;
   word_del_table[17] := 10624;
   word_del_table[18] :=    44;
   word_del_table[19] :=     0;
   word_del_table[20] :=     0;
   word_del_table[21] := 10866;
   word_del_table[22] :=     0;
   word_del_table[23] :=     0;
   word_del_table[24] :=   106;
   word_del_table[25] :=   112;
   word_del_table[26] :=     0;
   word_del_table[27] := 14957;
   word_del_table[28] :=     2;
   word_del_table[29] :=     2;
   word_del_table[30] :=    95;
   word_del_table[31] :=  115;
   word_del_table[32] := 14304;
   word_del_table[33] :=     0;
   word_del_table[34] :=     0;
   word_del_table[35] :=     0;
   word_del_table[36] :=     0;
   word_del_table[37] :=     0;
   word_del_table[38] :=   107;
   {initialization of flex_table}                                     {LK}
   flex_table[  0] :=    -2;
   flex_table[  1] := 19969;
   flex_table[  2] := 16898;
   flex_table[  3] :=    -0;
   flex_table[  4] := 18436;
   flex_table[  5] :=    -0;
   flex_table[  6] :=    -0;
   flex_table[  7] := 25863;
   flex_table[  8] := 25096;
   flex_table[  9] :=    -0;
   flex_table[ 10] :=    -0;
   flex_table[ 11] :=    -1;
   flex_table[ 12] :=    -0;
   flex_table[ 13] :=    -1;
   flex_table[ 14] := 41635;
   flex_table[ 15] :=    -0;
   flex_table[ 16] := 31611;
   flex_table[ 17] :=    -0;
   flex_table[ 18] :=    -0;
   flex_table[ 19] := 17155;
   flex_table[ 20] :=    -0;
   flex_table[ 21] := 23301;
   flex_table[ 22] := 25606;
   flex_table[ 23] :=    -0;
   flex_table[ 24] :=    -0;
   flex_table[ 25] := 25353;
   flex_table[ 26] := 30583;
   flex_table[ 27] :=    -0;
   flex_table[ 28] :=    -1;
   flex_table[ 29] :=    -0;
   flex_table[ 30] :=    -0;
   flex_table[ 31] :=    -1;
   flex_table[ 32] := 19712;
   flex_table[ 33] :=    -0;
   flex_table[ 34] :=    -0;
   flex_table[ 35] := 14365;
   flex_table[ 36] :=    -0;
   flex_table[ 37] := 14879;
   flex_table[ 38] := 15136;
   flex_table[ 39] :=    -0;
   flex_table[ 40] :=    -0;
   flex_table[ 41] := 15907;
   flex_table[ 42] :=    -1;
   flex_table[ 43] :=    -0;
   flex_table[ 44] :=    -1;
   flex_table[ 45] :=    -0;
   flex_table[ 46] :=    -0;
   flex_table[ 47] :=    -1;
   flex_table[ 48] :=    -0;
   flex_table[ 49] := 17994;
   flex_table[ 50] := 14108;
   flex_table[ 51] :=    -0;
   flex_table[ 52] := 14622;
   flex_table[ 53] :=    -0;
   flex_table[ 54] :=    -0;
   flex_table[ 55] := 15393;
   flex_table[ 56] := 15650;
   flex_table[ 57] :=    -0;
   flex_table[ 58] :=    -0;
   flex_table[ 59] := 30809;
   flex_table[ 60] :=    -0;
   flex_table[ 61] :=    -1;
   flex_table[ 62] := 30326;
   flex_table[ 63] :=    -0;
   flex_table[ 64] := 19521;
   flex_table[ 65] :=    -0;
   flex_table[ 66] :=    -0;
   flex_table[ 67] := 12309;
   flex_table[ 68] :=    -0;
   flex_table[ 69] := 12823;
   flex_table[ 70] := 13080;
   flex_table[ 71] :=    -0;
   flex_table[ 72] :=    -0;
   flex_table[ 73] := 13851;
   flex_table[ 74] :=    -1;
   flex_table[ 75] :=    -0;
   flex_table[ 76] :=    -1;
   flex_table[ 77] :=    -0;
   flex_table[ 78] :=    -0;
   flex_table[ 79] :=    -1;
   flex_table[ 80] :=    -0;
   flex_table[ 81] := 11795;
   flex_table[ 82] := 12052;
   flex_table[ 83] :=    -0;
   flex_table[ 84] := 12566;
   flex_table[ 85] :=    -0;
   flex_table[ 86] :=    -0;
   flex_table[ 87] := 13337;
   flex_table[ 88] := 13594;
   flex_table[ 89] :=    -0;
   flex_table[ 90] :=    -0;
   flex_table[ 91] := 31319;
   flex_table[ 92] :=    -0;
   flex_table[ 93] :=    -1;
   flex_table[ 94] :=    -1;
   flex_table[ 95] :=    -0;
   flex_table[ 96] :=    -0;
   flex_table[ 97] :=  9482;
   flex_table[ 98] :=  9739;
   flex_table[ 99] :=    -0;
   flex_table[100] := 10253;
   flex_table[101] :=    -0;
   flex_table[102] :=    -0;
   flex_table[103] := 11024;
   flex_table[104] := 11281;
   flex_table[105] :=    -0;
   flex_table[106] :=    -0;
   flex_table[107] := 31832;
   flex_table[108] :=    -0;
   flex_table[109] :=    -1;
   flex_table[110] :=    -1;
   flex_table[111] :=    -0;
   flex_table[112] := 31040;
   flex_table[113] :=    -0;
   flex_table[114] :=    -0;
   flex_table[115] :=  9996;
   flex_table[116] :=    -0;
   flex_table[117] := 10510;
   flex_table[118] := 10767;
   flex_table[119] :=    -0;
   flex_table[120] :=    -0;
   flex_table[121] := 11538;
   flex_table[122] :=    -2;
   flex_table[123] :=    -0;
   flex_table[124] :=    -2;
   flex_table[125] :=    -0;
   flex_table[126] :=    -0;
   flex_table[127] :=    -2;
   {preparation of prescan}                                           {LE}
   rns_state := virginal;
   scan := 1;
   read_until_next_delimiter;

   prescan;   {HK}
   {writeln;   for bn:= plib to plie do writeln(bn:5,store[bn]:10);   writeln;}
   {preparation of main scan:}                                        {HL}
   rns_state := virginal;
   scan := - 1;
   iflag := 0;
   mflag := 0;
   vflag := 0;
   bn := 0;
   aflag := 0;
   sflag := 0;
   eflag := 0;
   rlsc := 0;
   flsc := 0;
   klsc := 0;
   vlam := 0;
   flib := rnsb + 1;
   klib := flib + 16;
   nlib := klib + 16;
   if nlib + nlsc0 >= plib then
      stop(25);
   nlsc := nlsc0;
   tlsc := tlib;
   gvc := gvc0;
   fill_t_list(161);   {prefill of name list:}
   store[nlib +  0] := 27598040;
   store[nlib +  1] :=   265358;   {read}
   store[nlib +  2] := 134217727 -        6;
   store[nlib +  3] := 61580507;
   store[nlib +  4] :=   265359;   {print}
   store[nlib +  5] := 134217727 -  53284863;
   store[nlib +  6] :=   265360;   {TAB}
   store[nlib +  7] := 134217727 -  19668591;
   store[nlib +  8] :=   265361;   {NLCR}
   store[nlib +  9] := 134217727 -        0;
   store[nlib + 10] := 134217727 -  46937177;
   store[nlib + 11] :=   265363;   {SPACE}
   store[nlib + 12] := 53230304;
   store[nlib + 13] :=   265364;   {stop}
   store[nlib + 14] := 59085824;
   store[nlib + 15] :=   265349;   {abs}
   store[nlib + 16] := 48768224;
   store[nlib + 17] :=   265350;   {sign}
   store[nlib + 18] := 61715680;
   store[nlib + 19] :=   265351;   {sqrt}
   store[nlib + 20] := 48838656;
   store[nlib + 21] :=   265352;   {sin}
   store[nlib + 22] := 59512832;
   store[nlib + 23] :=   265353;   {cos}
   store[nlib + 24] := 48922624;
   store[nlib + 25] :=   265355;   {ln}
   store[nlib + 26] := 53517312;
   store[nlib + 27] :=   265356;   {exp}
   store[nlib + 28] := 134217727 -       289;
   store[nlib + 29] := 29964985;
   store[nlib + 30] :=   265357;   {entier}

   store[nlib + 31] := 134217727 -  29561343;
   store[nlib + 32] :=   294912;   {SUM}
   store[nlib + 33] := 134217727 -  14789691;
   store[nlib + 34] := 134217727 -  15115337;
   store[nlib + 35] :=   294913;   {PRINTTEXT}
   store[nlib + 36] := 134217727 -  27986615;
   store[nlib + 37] :=   294914;   {EVEN}
   store[nlib + 38] := 134217727 -       325;
   store[nlib + 39] := 21928153;
   store[nlib + 40] :=   294915;   {arctan}
   store[nlib + 41] := 134217727 -  15081135;
   store[nlib + 42] :=   294917;   {FLOT}
   store[nlib + 43] := 134217727 -  14787759;
   store[nlib + 44] :=   294918;   {FIXT}
   store[nlib + 45] := 134217727 -      3610;
   store[nlib + 46] := 134217727 -  38441163;
   store[nlib + 47] :=   294936;   {ABSFIXT}

   intro_new_block2;
   bitcount := 0;
   bitstock := 0;
   rnsb := bim;
   fill_result_list(96{START},0);
   pos := 0;
   main_scan;   {EL}
   fill_result_list(97{STOP},0);
   {writeln; writeln('FLI:');   for bn:= 0 to flsc-1 do   writeln(bn:5,store[flib+bn]:10);}   {writeln; writeln('KLI:');   for bn:= 0 to klsc-1 do   writeln(bn:5,store[klib+bn]:10,   (store[klib+bn] mod 134217728) div 16777216 : 10,   (store[klib+bn] mod 16777216) div  2097152 : 2,   (store[klib+bn] mod  2097152) div   524288 : 3,   (store[klib+bn] mod   524288) div   131072 : 2,   (store[klib+bn] mod   131072) div    32768 : 2,   (store[klib+bn] mod    32768) div     1024 : 4,   (store[klib+bn] mod     1024) div       32 : 3,   (store[klib+bn] mod       32) div        1 : 3);}
   {preparation of program loader}
   opc_table[ 0] :=  33;
   opc_table[ 1] :=  34;
   opc_table[ 2] := 16;
   opc_table[ 3] :=  56;
   opc_table[ 4] :=  58;
   opc_table[ 5] := 85;
   opc_table[ 6] :=   9;
   opc_table[ 7] :=  14;
   opc_table[ 8] := 18;
   opc_table[ 9] :=  30;
   opc_table[10] :=  13;
   opc_table[11] := 17;
   opc_table[12] :=  19;
   opc_table[13] :=  20;
   opc_table[14] := 31;
   opc_table[15] :=  35;
   opc_table[16] :=  39;
   opc_table[17] := 61;
   opc_table[18] :=   8;
   opc_table[19] :=  10;
   opc_table[20] := 11;
   opc_table[21] :=  12;
   opc_table[22] :=  15;
   for ii:= 23 to 31 do
      opc_table[ii]:= ii - 2;
   opc_table[32] :=  32;
   opc_table[33] :=  36;
   opc_table[34] := 37;
   opc_table[35] :=  38;
   for ii:= 36 to 51 do
      opc_table[ii]:= ii + 4;
   opc_table[52] :=  57;
   opc_table[53] :=  59;
   opc_table[54] := 60;
   for ii:= 55 to 102 do
      opc_table[ii]:= ii + 7;

   store[crfb+ 0] :=   30 * d13 +    0;
   store[crfb+ 1] := 7680 * d13 +   20;
   store[crfb+ 2] :=    1 * d13 + 7680;
   store[crfb+ 3] :=   12 * d13 +    2;
   store[crfb+ 4] := 7680 * d13 +   63;
   store[crfb+ 5] :=    3 * d13 + 7680;
   store[crfb+ 6] :=   15 * d13 +    4;
   store[crfb+ 7] :=    3 * d13 + 7680;
   store[crfb+ 8] :=  100 * d13 +    5;
   store[crfb+ 9] := 7680 * d13 +  134;
   store[crfb+10] :=    6 * d13 +   24;
   store[crfb+11] := 7680 * d13 +   21;
   store[crfb+12] :=   24 * d13 + 7680;
   store[crfb+13] := 7680 * d13 + 7680;

   store[mcpb] := 63 * d21;
   store[mcpb+1] := 63 * d21;

   program_loader;

   writeln(output);
   writeln(output);
   writeln(output);
   for ii:= mcpe to rlib + rlsc + klsc - 1 do
      writeln(output,ii:5,store[ii]:9);
end.