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

⟦b81be1401⟧ TextFile

    Length: 67584 (0x10800)
    Types: TextFile
    Names: »algpas123tx «

Derivation

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

TextFile


                                                                                                \f


; jz 1979.06.22                         algol 8, pass 12, page ...1...


s. c9, d29, f35, g10, h24, j32
w.
k = e0
j0:     g1  ; number of bytes in pass 12
h.      d0  ; entry address relative to first word
     12 < 1 ; pass mode bits

; variables, supposed to be input-parameters: std value:
;  f0  == mask for connection wanted          h0+h1+h2
;  f24 == first line   (lineno-interval)      0
;  f25 == last line + 1 (lineno-interval)     maximum
;  f29 == first line    (ident-names interv)  0
;  f30 == last line + 1 (ident-names interv)  maximum
;  j19 == name of sortarea                    wrk......
;  j27 == size of sortarea                    h18


; slang-help-variables:
h0 =   4 ; use
h1 =   2 ; assign
h2 =   1 ; declare
h3 = 135 ; error
h4 = 136 ; new line
h5 = 133 ; last normal terminator
h6 = 139 ; space
h7 = 134 ; end pass1
h8 =   2 ; addrlength (in bytes)
h9 = 116 ; last of lettertable
h11 = 512 ; bufferlength (in bytes)
h12 = h11-2; displacement for chain corresponding to element
h13 =  4 ; length (in bytes) for element
h14 = 60 ; maxpos
h15 =  6 ; printpos
h16 =  8 ; std ident lgth
h17 =  3 ; packing factor for identno.
h18 = 100; standard sortsize
h19 = -1 ; false segmno
h20 = 144; identifier (internal byte value)
h21 = 140; context
h22 = 141; exit
h23 = 142; continue
h24 = 145; stop special bytes


                                                                                                \f


; rc 1977.11.09                           algol 6, pass 12, page ...2...
; variables: meaning, local to program scan routine


w.

f0 = e71 ;  mask for connection wanted
f1:    0 ;  stored identno
f2:    0 ;  stored lineno
f3:    0 ;  identno
f4:    0 ;  lineno
f5:    0 ;  old identno
f6:    0 ;  old lineno
f7:    0 ;  old state
f9:   c7 ;  state
f10:   0 ;  paran no
f11:   0 ;  class
f12:  14 ;  mask14
f13:   0 ;  first char, char
f14:   0 ;  current word addr
f15:   0 ;  main top addr
f16:   0 ;  aux top addr
f17:   0 ;  current aux addr  ,  main link
f18:   0 ;  search word
f19:   0 ;  aux main word addr
f20: 127 < 14 ; mask for word filled
f21: 1 < 23   ; end mark
f22: 1 < 22 - 1 + 1 < 22 ; top addr for wanted identifier
f23:   0 ;  line interval ok ( 0 => false, 2 => true)
f24= e72 ;  first line
f25= e73 ; last line + 1
     1<22-1+1<22-1   ; f26-2: maximum-1
f26: 1 < 22 - 1 + 1 < 22 ; maximum number, used to mask off signbit
f28:   0 ;  requestmark (0 => not requested, 1 => requested)
f29= e74 ;  first request line;
f30= e75; last request line + 1;
f31:   0 ;  available segments of pass 0 work area;

b. a18, i41
w.

d1:  jl.  w3    i38.       ; program scan: w2 := inbyte;
     sh   w2    58         ;   if inbyte < 59 then goto first char;
     jl.        d3.        ;

                           ; central logic:
     hs.  w2    f13.+1     ;   save (inbyte);
i1:  bz.  w2  x2+j13.      ;   class := class(inbyte);
i0:  sn   w2    0          ; examine class:
     jl.        i4.        ;   if class = 0 then goto special bytes;

     rs.  w2    f11.       ;
     rl.  w1  x2+a0.       ;   control word := main control table(class);
     rl.  w3    f9.        ;   last state := state;
     ls   w1  x3           ;   delimiter control word number :=
     la.  w1    f12.       ;    (control word shift state) and mask14;
     sn   w1    0          ;   if  d c w n  = 0 then
     jl.        i4.        ;     goto reset, special bytes;

     wa   w2    2          ;   control word :=
     rl.  w1  x2+a0.       ;     main control(class +  d c w n);
     bl   w0    2          ;   state := controlword(part1);
     rs.  w0    f9.        ;
     bz   w1    3          ;
a0:  jl.      x1+a0.       ;   goto switchpart(controlword);
 
\f


 
 
; rc 1977.11.09                       algol 6, pass 12, page ...2a...
 
 
 
h.  ; special bytes:
f32: 3,15,14,20, 5,24,20,   h24; context
f33: 5,24, 9,20,            h24; exit
f34: 3,15,14,20, 9,14,21, 5,h24; continue
w.
f35: 0  ; special
 
 
i35: am      f32-f33   ; context: start := start context else
i36: am      f33-f34   ; exit   : start := start exit else
i37: al. w3  f34.      ; continue:start := start continue;
     rs. w3  f35.      ;   special := start;
     al  w0  x2        ;
     jl. w3  e3.       ;   outbyte(inbyte);
     hs. w2  i40.      ;   special in := true;
     hs. w2  i41.      ;   special out := true;
     jl.     d1.       ;   goto program scan;
 
i40 = k + 1; special in; inbyte:
i38: sn  w3  x3+0      ;   if -,special in then
     jl.     e2.       ;   goto pass0-inbyte;
 
     rl. w2  f35.      ; special input:
     al  w2  x2+1      ;   special :=
     rs. w2  f35.      ;    special + 1;
     bz  w2  x2-1      ;   byte := special bytes(special - 1);
     se  w2  h24       ;   if byte <> end special then
     jl      x3        ;   return;
 
     al  w2  0         ; end special:
     hs. w2  i40.      ;   special in := false;
     hs. w2  i41.      ;   special out := false;
     jl.     e2.       ;   goto pass0-inbyte;
 
i41 = k +1; special out; outbyte:
i39: sn  w3  x3        ;   if -,special out then
     jl.     e3.       ;   goto pass0-outbyte;
     jl      x3        ;   return;

                                                                                                \f


; rc 1977.11.09                           algol 6, pass 12, page ...3...


i4:  bz.  w2    f13.+1     ; reset, special bytes: restore (inbyte);


d4:  sh   w2    h5         ; special bytes:
     jl.        i26.       ;   if inbyte <= last normal terminator then
     sn   w2   h21        ;   if inbyte = context then
     jl.       i35.       ;   goto context;
     sn  w2  h22          ;   if inbyte = exit then
     jl.       i36.       ;   goto exit;
     sn   w2   h23        ;   if inbyte = continue then
     jl.       i37.       ;   goto continue;
     sn   w2    h20        ;     goto input1;
     jl.        d1.        ;   if inbyte = identifier then goto program scan;
     sl   w2    h6         ;
     jl.        i26.       ;   if inbyte >= space then goto input1;
     sn   w2    h4         ;
     jl.        i27.       ;   if inbyte = new line then goto newline;
     sn   w2    h3         ;
     jl.        i25.       ;   if inbyte = error then goto input2;
     sn   w2    h7         ;
     jl.        d10.       ;   if inbyte = end pass then goto ident sorting;
     jl.  w1    i32.       ;   out and inbyte;
     jl.  w1    i32.       ;   out and inbyte;
     jl.  w1    i32.       ;   out and inbyte;
i25: jl.  w1    i32.       ; input2: out and inbyte;
i26: al   w0  x2           ; input1:
     jl.  w3    i39.       ;   outbyte;
     jl.        d1.        ;   goto program scan;

i32: al   w0  x2           ; procedure out and inbyte;
     jl.  w3    i39.       ;   outbyte;
     jl.  w3    i38.       ;   inbyte;
     jl       x1           ;   return;

i27: al   w0  x2           ; new line:
     jl.  w3    e3.        ;   outbyte(new line);
     jl.  w3    e1.        ;   newline; comment in pass0;
d2:  rl.  w2    e6.        ;
     al   w0    2          ;   line wanted := true;
     al   w1    1          ;   request := true;
     sl.  w2   (f24.)      ;   if current line < first line
     sl.  w2   (f25.)      ;     or current line > last line then
     al   w0    0          ;       line wanted := false;
i28: sl.  w2   (f29.)      ;   if current line < first request line
     sl.  w2   (f30.)      ;     or current line > last request line then
     al   w1    0          ;       request := false;
i30: rs.  w0    f23.       ;   line interval wanted := line wanted;
     rs.  w1    f28.       ;   requestmark := request;
     lo   w1    0          ;   identifier wanted :=
     hs.  w1    i9.        ;     line wanted or request;
     se.  w2    (f30.)     ;   if current line = last request line + 1 then
     jl.        i31.       ;
     rl.  w1    f15.       ;     top addr for wanted identifier :=
     rs.  w1    f22.       ;       main top addr;
                           ;   comment: this ensures, that as soon as all
                           ;            identifiers in the interval (first-,
                           ;            last request line) have been found
                           ;            and included in main/aux tables,
                           ;            no more identifiers are stored. this
                           ;            reduces the needs for core area if
                           ;            a xref of only a few identifiers is
                           ;            wanted;
i31: jl.        d1.        ;   goto program scan;

                                                                                                \f


; rc 3.2.1971                                   algol 6, pass 12, page 4


                           ; first char:
d3:  hs.  w2    f13.       ;   first char := inbyte;
     al   w0    0          ;   main(top-1) := main(top) := 0;

; i9 == identifier wanted,  0 => false;

i9 = k + 1
     sn   w0    0          ;   if identifier not wanted then
     jl.        i26.       ;     goto input1;
     al   w1    0          ;
     ds.  w1    (f15.)     ;

i10: jl.  w1    i32.       ; next char: out and inbyte;
     sl   w2    69         ;   w2 := inbyte;
     jl.        i11.       ;   if inbyte < 69 then begin
     hs.  w2    f13.+1     ;     char := inbyte;
     jl.  w3    d5.        ;     packchar;
     jl.        i10.       ;     goto next char end;

i11: sn   w2    h3         ;   if inbyte <> error then
     jl.        i12.       ;     begin
     jl.  w3    e11.       ;     repeat inputbyte;  
     al   w2    h20        ;     inbyte := identifier;  
     hs.  w2    f13.+1     ;     save (inbyte);
     jl.  w3    d6.        ;     search;
     am         j11        ;     class := if identifier not wanted
     al   w2    j10        ;       then 0 else identifier class;
     jl.        i0.        ;     goto examine class; end;

i12: jl.  w1    i32.       ;   out and inbyte; comment-error and identification;
     jl.        i10.       ;   goto next char;



;  procedure packchar shifts the current word 7 bits, adds
;  char and restores the result in the main table if there
;  is space in a main word, otherwise in an aux word.

d5:  rl.  w1    (f14.)     ; procedure packchar;
     sz.  w1    (f20.)     ;   if current word not filled then
     jl.        i13.       ;     begin
     ls   w1    7          ;     current word := current word * 128
     ba.  w1    f13.+1     ;       + char;
     rs.  w1    (f14.)     ;     return;
     jl       x3           ;     end

i13: rl.  w2    f17.       ;   else begin
     al   w2  x2-2         ;     current aux addr := current aux addr - 2;
     sh.  w2    (f15.)     ;     if current aux addr <= main top addr then
     jl.        d12.       ;       goto stack overflow;
     rs.  w2    f17.       ;     current word addr := current aux addr;
     rs.  w2    f14.       ;     current aux word + 2 := current word;
     bz.  w0    f13.+1     ;     current word := char;
     ds   w1  x2+2         ;     return;
     bz.  w2    f13.+1     ;
     jl       x3           ;     end;

                                                                                                \f


; rc 3.2.1971                                   algol 6, pass 12, page 5





;  procedure search ensures that the current word is filled up
;  with nulls. bit0 of the current word is set to 1. the search
;  then proceeds through the main table for linking and then
;  through either the main or aux table looking for an identifier
;  equal to the last packed identifier. it is then examined
;  whether the identifier is to be selected or not. if it is
;  wanted, it is included in the main and/or the aux table.

d6:  rl.  w1    f14.       ; procedure search;

     rl   w2  x1           ;
     sz.  w2    (f20.)     ;  repeat: if current word not filled then
     jl.        i15.       ;     begin current word := current word * 128;
     ls   w2    7          ;     goto repeat;
     sz.  w2    (f20.)     ;
     jl.        i15.       ;
     ls   w2    7          ;     end;

i15: lo.  w2    f21.       ;   current word := current word or 1 (bit0);
     rs   w2  x1           ;
     rs.  w2    f18.       ;   search word := current word;
     bz.  w2    f13.       ;   w0 := letter table (first char);
     ls   w2    1          ;
     al.  w2  x2+g0.       ;
     rl   w0  x2-2         ;
     se.  w1    (f15.)     ;   if current word addr <> main top addr then
     jl.        i18.       ;     goto aux search;

i16: sh   w0    1          ; check link: if link =< 1 then
     jl.        i22.       ;     goto not found
     rl   w2    0          ;   else if main(link) = search word then
     dl   w1  x2           ;     goto found;
     se.  w1    (f18.)     ;   else goto check link;
     jl.        i16.       ;
     jl.        i23.       ;

                                                                                                \f


; rc 3.2.1971                                   algol 6, pass 12, page 6

i17: rl.  w0    f17.       ; load link: w0 := main link;
     rl.  w2    f19.       ;            w2 := aux main word addr;
i18: sh   w0    1          ; aux search:
     jl.        i21.       ;   if link > 1 then
     rl   w2    0          ;     begin
     dl   w1  x2           ;
     sz.  w1    (f21.)     ;     if bit0 (main(link)) = 1 then
     jl.        i18.       ;       goto aux search;
     rs.  w0    f17.       ;     main link := link;
     rs.  w2    f19.       ;     aux main word addr := last link;
     rl.  w2    f16.       ;
i19: rl   w0  x1           ;     for w1 := main(link) step -1,
     se   w0 (x2)          ;     and w2 := aux top addr step -1
     jl.        i17.       ;       while aux(w1) = aux(w2) do
     sz.  w0    (f21.)     ;         if bit0 (aux(w1)) = 1 then
     jl.        i20.       ;           begin
     al   w1  x1-2         ;           current aux addr := aux top addr;
     al   w2  x2-2         ;           goto found;
     jl.        i19.       ;           end;
i20: rl.  w2    f19.       ;     goto load link; comment compare new strings;
     rl.  w1    f16.       ;
     rs.  w1    f17.       ;
     jl.        i23.       ;     end

i21: rl.  w1    f16.       ;   else
     rl.  w0    f15.       ;     if identifier not wanted then
     sl.  w0    (f22.)     ;       current aux addr := aux top addr
     jl.        i33.       ;     else
     rs.  w1    (f15.)     ;     begin
     rl.  w1    f14.       ;     main(top) := aux top addr;
     al   w1  x1-2         ;     aux top addr := current aux addr :=
     sh.  w1    (f15.)     ;                     current word addr - 2;
     jl.        d12.       ;     if aux top addr <= main top addr
     rs.  w1    f16.       ;       then goto stack overflow;
i33: rs.  w1    f17.       ;     end;

i22: al   w1  x2           ; not found:  save (last link);
     rl.  w2    f15.       ;   w2 := main top addr;
     sl.  w2    (f22.)     ;   if identifier not wanted then
     jl.        i23.       ;     goto found;
     lo   w2  x1-2         ;   last iden(link) := main top addr;
     rs   w2  x1-2         ;   comment: last identifier may be
     rl.  w2    f15.       ;     requestmarked;
     al   w1  x2+4         ;   w1 := main top addr + 4;
     sl.  w1    (f16.)     ;   if w1 >= aux top addr then
     jl.        d12.       ;     goto stack overflow;
     rs.  w1    f15.       ;   main top addr := w1;

i23:                       ; found:
     rl.  w1    f15.       ; identno:
i24: rs.  w1    f14.       ;   current word addr := main top addr;
     sl.  w2    (f22.)     ;   if identifier not wanted then
     jl       x3           ;     not wanted return;
     rl   w0  x2-2         ;   if identifier requested then
     lo.  w0    f28.       ;     request mark;
     rs   w0  x2-2         ;
     am         2047       ;
     al.  w0    g3.        ;   identifierno :=
     ws   w2    0          ;     (identifier addr - main bottom addr) // 4;
     ls   w2    -2         ;
     ls   w2    h17        ;   identno := identifierno shift h17;
     rs.  w2    f3.        ;
     rl.  w2    e6.        ;   lineno := current lineno;
     rs.  w2    f4.        ;   if -, line interval wanted then
     am.        (f23.)     ;     not wanted return else
     jl       x3           ;     wanted return;

                                                                                                \f


; rc 3.2.1971                                   algol 6, pass 12, page 7



;  output stored identifier (if any) as:

a1:  am   w0    h0-h1      ;   connection := use;

a2:  am   w0    h1-h2      ;   connection := assign;

a3:  al   w0    h2         ;   connection := declare;

a4:  wa.  w0    f1.        ;   w0 := stored identno + connection;
     rl.  w1    f2.        ;   w1 := stored lineno;
     sz.  w0    (f0.)      ;   if connection wanted
     sh   w0    h0+h1+h2   ;     and stored identno <> 0 then
     jl.        a5.        ;
     jl.  w3    d14.       ;     put 2 words;

;  store new identifier (if any):

a5:  dl.  w1    f4.        ;   stored lineno := lineno;
     rl.  w3    f11.       ;   stored identno :=
     se   w3    j10        ;     if class <> identifier class then
i5:  al   w0    0          ;
     ds.  w1    f2.        ;     0 else identno;
     jl.        i4.        ;   goto reset, special bytes;

; first point:

a11: am         -1         ;   paran no := 0;

;  first parantesis: store old identifier:
a6:  al   w1    1          ;   paran no := 1;
     rs.  w1    f10.       ;

     dl.  w1    f2.        ;   old identno := stored identno;
     ds.  w1    f6.        ;   old lineno  := stored lineno;
     rs.  w3    f7.        ;   old state   := last state;
     jl.        i5.        ;   goto store new identifier;
                           ;   comment but there is no new ident... ;

;  further parantesis:

a7:  rl.  w1    f10.       ;   paran no := paran no + 1;
     al   w1  x1+1         ;
     rs.  w1    f10.       ;
     jl.        i4.        ;   goto reset, special bytes;

;  right parantesis:

a8:  rl.  w1    f10.       ;   paran no := paran no - 1;
     al   w1  x1-1         ;
     rs.  w1    f10.       ;
     sh   w1    -1         ;   if paran no < 0 then
     jl.        a9.        ;     goto reset all;
     se   w1    0          ;   if paran no > 0 then
     jl.        a1.        ;     goto output as use;

a14: dl.  w1    f6.        ;   identno := old identno;
     ds.  w1    f4.        ;   lineno  := old lineno;
     al   w1    j10        ;   class := identifier class;
     rs.  w1    f11.       ;
     rl.  w1    f7.        ;   state   := old state;
     rs.  w1    f9.        ;
     jl.        a1.        ;   goto output as use;

                                                                                                \f


; jz.fgs 1985.10.28                         algol 6, pass 12, page ...8...

;  reset all:

a9:  al   w2    c7         ;   state := 7;
     rs.  w2    f9.        ;

;  reset:

a10: al   w1    0          ;   paran no := 0;
     rs.  w1    f10.       ;
     jl.        a5.        ;   goto store new identifier;
; reset parenthesis error:
a16: al   w1    0          ;   paren no:=0;
     rs.  w1    f10.       ;

; first delimiter after field:

a13: jl.  w3    e11.       ;   repeat inputbyte;
     al   w3    h20        ;   inbyte := dummy byte;
     rs.  w3    f13.+1     ;
     jl.        a14.       ;   goto take old identifier;

; first parantesis after field:

a15: al   w3    c4         ;   oldstate := after identifier;
     rs.  w3    f7.        ;
     al   w1    1          ;   paran no := 1;
     rs.  w1    f10.       ;
     jl.        a1.        ;   goto output (use);
d23: al.  w3    a17.       ; end pass 12: writetext(out,<:
     jl.  w1    e13.       ;   no. of identifiers=:>);
     <:<10>no. of identifiers=<0>:>
a17: rl.  w0    f0.        ;
     jl.  w3    e14.       ;   write(out,<<d>,maxidentno);
     32<12+1               ;
     al   w0    12         ;
     jl.  w3    e12.       ;   printchar (ff);
     jl.        a18.       ;   goto set return;
d25: hs.  w0    d29.       ; backing store fault:
     am         e69-e5     ;   save result
d12: am         e5-e7      ; stack overflow:
d22:
a18: al.  w2    e7.        ; set return:

c. e77<3 ; if system 3 then begin
     al.  w1    g0.        ;   w1 := tail address;
     al.  w3    j19.       ;   w3 := sort name address;
     jd         1<11+42    ;   lookup entry(sort area);
     al   w0    0          ;   tail(1) := 0;
     rs.  w0    g0.        ;
     jd         1<11+44    ;   change entry (sort area);
     al  w0    e86         ;   1 slice left for erroroutput
     al  w1  0             ;   no zone
     rs. w2  g0.           ;   save w2
     al. w2  e79.          ;   work area name
     am           -1000    ;
     jl. w3  e78.+11000    ;   connect output
     rl. w2  g0.           ;   restore w2
     al. w1  g0.           ;   lookup area
     al. w3  e79.          ;
     jd      1<11+42       ;   lookup(work)
     rl. w0  g0.           ;
     rs. w0  e9.-2         ;   restore(available segm);
z.         ; end system 3;

\f


;rc 1977.11.09                      algol 6, pass 12, page ...8a...


     se.  w2    e5.        ;   if not stack overflow
     am         j32; =j24-e10; then w1:=answer address
     al.  w1    e10.       ;   else w1:= addr(<:stack:>);
d28 = k + 1 ; selfmade sortarea: 0<10 == false , 1<10 == true
     al   w0    0          ;   w0 := pass 12 mode bits;
     al.  w3    j19.       ;   w3 := sortname address;
     sz   w0    1<10       ;   if selfmade sortarea then
     jd         1<11+48    ;     remove entry;
d29=k+1                    ;   saved transport result:
     al   w0    0          ;   w0:=result;
     jl       x2           ;   goto next pass or alarm; comment in pass 0;

; ************* stepping stone ******************
c9:  jl.       e12.       ;  goto pass0-writechar;

; letter table:
w.

g0 = k
   0 , r. 58   ;   lettertable, used for linking to main table
g8 = k-1 ;   connection identification:
h.   68  ; d
     65  ; a
     85  ; u

g7 = k-1 ;   output table:
h.
 97,  98,  99, 100, 101, 102, 103      ; a b c d e f g
104, 105, 106, 107, 108, 109, 110      ; h i j k l m n
111, 112, 113, 114, 115, 116, 117      ; o p q r s t u
118, 119, 120, 121, 122, 123, 124, 125 ; v w x y z æ ø å
 65,  66,  67,  68,  69,  70,  71      ; a b c d e f g
 72,  73,  74,  75,  76,  77,  78      ; h i j k l m n
 79,  80,  81,  82,  83,  84,  85      ; o p q r s t u
 86,  87,  88,  89,  90,  91,  92,  93 ; v w x y z æ ø å
 48,  49,  50,  51,  52,  53,  54      ; 0 1 2 3 4 5 6
 55,  56,  57                          ; 7 8 9

                                                                                                \f


; rc 12.11.1975                                   algol 6, pass 12, page 9



; shortnames for states : meaning            : preceding symbol (class numbers)

c1 = -20  ; state 1  ==  expecting decl      : 1
c2 = -17  ; state 2  ==  in decl             : 2
c3 = -14  ; state 3  ==  in value            : 3
c4 = -11  ; state 4  ==  after identifier    : 7, 10
c5 =  -8  ; state 5  ==  after fieldpoint    : 8, 10
c6 =  -5  ; state 6  ==  in parantesislist   : 6, 7, 10
c7 =  -2  ; state 7  ==  in neutral          : 4, 5, 9
          ; state 8  ==  not used



; main control table

;        states      new state  switchpart

w. k = k - a0

; begin end <;> :
w. j1:  8.0123 4520 , h. c1   ,  a3 -a0 ; output(decl)
                         c1   ,  i4 -a0 ; reset, special bytes
                         c1   ,  a1 -a0 ; output(use)
                         c1   ,  a13-a0 ; first delimiter after field
                        c1   ,  a16-a0 ; reset parenthesis error

; integer long real boolean zone field array procedure label switch string:
w. j2:  8.1000 0000 , h. c2   ,  i4 -a0 ; reset, special bytes

; value:
w. j3:  8.1000 0000 , h. c3   ,  i4 -a0 ; reset, special bytes

; <:>:
w. j4:  8.0001 0000 , h. c7   ,  a3 -a0 ; output(decl)

; <:=>:
w. j5:  8.0102 3400 , h. c7   ,  a3 -a0 ; output(decl)  (i.e. switch)
                         c7   ,  a2 -a0 ; output(ass)
                         c7   ,  a13-a0 ; first delimiter after field
                        c7   ,  a16-a0 ; reset parenthesis error

; <(> :
w. j6:  8.0101 2300 , h. c6   ,  a6 -a0 ; first parantesis
                         c6   ,  a15-a0 ; first parantesis after field
                         c6   ,  a7 -a0 ; further parantesis

; <)> :
w. j7:  8.0000 0100 , h. c6   ,  a8 -a0 ; right parantesis

; <.> :
w. j8:  8.0001 0000 , h. c5   ,  a11-a0 ; first field point;

; other delimiters:
w. j9:  8.1001 2000 , h. c7   ,  a1 -a0 ; output(use)
                         c7   ,  a13-a0 ; first delimiter after field

; identifiers:
w. j10: 8.1203 4510 , h. c4   ,  a5 -a0 ; store new identifier
                         c2   ,  a3 -a0 ; output(decl)
                         c4   ,  a1 -a0 ; output(use)
                         c5   ,  a1 -a0 ; output(use)
                         c6   ,  a1 -a0 ; output(use)
j11 = - j10

                                                                                                \f


; jz 1979.06.22                            algol 8, pass 12, page ...10...

w. k = k + a0 h.

; class table

j13 = k - 59

;  class             ; input

0, r.10              ; numbers 0-9
 0, j8, j9, j9, j4   ; '          .        +         -        :
 0, j1,  0,  0, j9   ; goto       begin    external  for      if
 0, j2, r.11         ; own        integer ... label
j3, j1, j1, j9, j6   ; value      ;        end       else     (
 0, j9, j9, j9, j9   ; -,         step     until     while    ,
j5, j9,  0, j9,  0   ; :=         then     trouble   do       abs
j9, j9,  0,r.3, j9   ; case       of       round ... extend   fatcomma
j7,j2,0, 0, j9, r.18 ; ) disable  true     false     * / ** ... add
0,r.6, j2, 0,0,0     ; endpass ...  context ... wordterminator

; bufferdescriptors:

w.
j14:         2 + 0 ; inbuffer 1 : displacement, first byte (and input)
                g5 ;              bufferbase (relative to d13)
                 0 ;              absolute address of inputword(s)

j15:         2 + 0 ; inbuffer 2 : displacement, first byte (and input)
                g6 ;              bufferbase (relative to d13)
                 0 ;              absolute address of inputword(s)

j16:         2 + 1 ; outbuffer  : displacement, first byte (and output)
                g4 ;              bufferbase (relative to d13)
                 0 ;              absolute address of next outputword(s)


; miscelaneous i/o - variables:

j17:             0 ; returnaddress  (used at close)
j18:   h19  ,  r.3 ; queue of free segmentno.es

j19= e76          ; name and name table addr
j27:           h18 ; tail (predefined standard sortsize)
j20:             0 ; message: operation code
j21:             0 ;          first core
j22:             0 ;          last core
j23:             0 ;          segm.no

j24: 0,0,0,0,0,0,0,0; answer
j32=j24-e10        ;used in stack overflow and end pass

                 0 ; saved w2  (used at transfer)
j25:             0 ; saved w3  (used at transfer)

j26:             0 ; relative address of queue (rel. to j18)
j28:             0 ; returnaddr (for put and get)
                 0 ; saved w0   (for put and get)
j29:             0 ; saved w1   (for put and get)


i.

e.
; end of program scan routine ;

                                                                                                \f


; rc 3.2.1971                                   algol 6, pass 12, page 11



; entries to i/o :
b. i19
w.
; variables, used with the earlier content and meaning:
;  f26 == maximum


d13: al.  w2    j16.       ; put (textpart): put 1 word:
     rs.  w3    j28.       ;   save (returnaddr);
     rs.  w1    j29.       ;   save (textpart);
     al   w1    2          ;   length := 2 bytes;
     jl.  w3    i2.        ;   buffering;
     rl.  w1    j29.       ;
     rs   w1 (x2+4)        ;   store (textpart);
c. (:e15 > 12 a. 1:) - 1   ;   if special testoutput pass12 then
     jl.        i13.       ;     goto testoutput 1 word;
z.
c. -(:e15 > 12 a. 1:)      ;
     jl.        (j28.)     ;   else return;
z.

d14: al.  w2    j16.       ; put (element): put 2 words:
     rs.  w3    j28.       ;   save (returnaddr);
     ds.  w1    j29.       ;   save (element);
     al   w1    4          ;   length := 4 bytes;
     jl.  w3    i2.        ;   buffering;
     dl.  w1    j29.       ;
     ds   w1 (x2+4)        ;   store (element);
c. (:e15 > 12 a. 1:) - 1   ;   if special testoutput pass12 then
     jl.        i12.       ;     goto testoutput 2 words;
z.
c. -(:e15 > 12 a. 1:)      ;
     jl.        (j28.)     ;   else return;
z.

d15: al.  w2    j14.       ; get (textpart) : get 1 word;
     al   w1    2          ;   length := 2 bytes;
     rs.  w3    j28.       ;   save (returnaddr);
     jl.  w3    i2.        ;   buffering;
     rl   w1 (x2+4)        ;
c. (:e15 > 12 a. 1:) - 1   ;   if special testoutput pass12 then
     jl.        i13.       ;     goto testoutput 1 word;
z.
c. -(:e15 > 12 a. 1:)      ;
     jl.        (j28.)     ;   else return;
z.

d16: am         j14-j15    ; get elem (inbuffer1) : get 2 words;
d17: al.  w2    j15.       ; get elem (inbuffer2) : get 2 words;
     al   w1    4          ;   length := 4 bytes;
     rs.  w3    j28.       ;   save (returnaddr);
     jl.  w3    i2.        ;   buffering;
     dl   w1 (x2+4)        ;
c. (:e15 > 12 a. 1:) - 1   ;   if special testoutput pass12 then
     jl.        i12.       ;     goto testoutput 2 words;
z.
c. -(:e15 > 12 a. 1:)        ;
     jl.        (j28.)     ;   else return;
z.

                                                                                                \f


; rc 03.06.1975                                   algol 6, pass 12, page 12
                           ; open input:
d11: rs.  w0    (j14.+2)   ;   store segmno.es in first word of buffers;
     rs.  w1    (j15.+2)   ;
     al   w0    h11        ;   displacements := too much...;
     hs.  w0    j14.       ;
     hs.  w0    j15.       ;
     al   w0    0          ;   queuebase := 0;
     rs.  w0    j26.       ;
     jl       x3           ;   return;

d19: bl.  w1    j16.+1     ; open output;
     hs.  w1    j16.       ;   displacement := first byte;
     wa.  w1    j16.+2     ;   abs address := bufferstart + disp;
     rs.  w1    j16.+4     ;
     rs.  w0    (j16.+2)   ;   store segmno in first word of buffer;
     jl       x3           ;   return;

d20: rs.  w3    j17.       ; close output: save (returnaddress);
     rl.  w2    (j16.+2)   ;   first segmno of queue :=
     al   w3    h19        ;     first word in buffer;
     ds.  w3    j18.+2     ;   second segmno of queue := false segmno;
i1:  dl.  w1    f26.       ; repeat:
     al.  w3    d9.        ;   if close ident then
     sl.  w3    (j17.)     ;
     am         d14-d13    ;     put 1 word (maximum)
d24 = k + 2                  ;   comment: this address is used at
                             ;   initialize outputtransfer to select
                             ;   linked output of the segments;
     jl.  w3    d13.       ;   else put 2 words (maximum);
     rl   w1 (x2+2)        ;   if first word of buffer <>
     se   w1    h19        ;     false segmentno then
     jl.        i1.        ;     goto repeat;
     jl.        (j17.)     ;   return;

d27: al.  w2    j16.       ; empty outbuffer:
     rs.  w3    j28.       ;   save return
     bl   w1  x2           ;   length := 0;
     jl.        i5.        ;   transfer and return;

                                                                                                \f


; rc 1975.9.9                                   algol 6, pass 12, page 13




; buffering:
; register usage:
; w1 = length of element (2 or 4 bytes)
; w2 = addr of buffer-descriptor
; w3 = return addr

; bufferdescriptor is built like this:
; byte  x2   : displacement , bytenumber in buffer (to be used by
;                             the next load or store.
; byte  x2+1 : first byte   , bytenumber in buffer of first relevant
;                             byte.
;                         nb  uneven for output, even for input.
; word  x2+2 : bufferstart  , address of first byte of buffer
; word  x2+4 : abs address  , absolute address of the bytes to
;                             be used by next load or store.

i2:  ba   w1  x2           ;   displacement := displacement + length;
     sl   w1    h11        ;   if displacement < bufferlength then
     jl.        i5.        ;     begin
     hs   w1  x2           ;
     wa   w1  x2+2         ;     absaddress := bufferstart + disp;
     rs   w1  x2+4         ;     return;
     jl       x3           ;     end;

; a segment transfer is needed. the bufferdescriptor 
; is initialized.

i5:  bs   w1  x2           ;   w1 := length;
     ba   w1  x2+1         ;   displacement := first byte + length;
     hs   w1  x2           ;
     wa   w1  x2+2         ;   absaddress := bufferstart + disp;
     rs   w1  x2+4         ;
     bz   w1  x2+1         ;
     sz   w1    1          ;   if first byte is uneven then
     jl.        i7.        ;     goto initialize outputtransfer;

; initialize inputtransfer:

     rl   w0 (x2+2)        ;   segmno := first word in buffer;
     rs.  w0    j23.       ;
     rl.  w1    j26.       ;   store segmno in queue;
     rs.  w0  x1+j18.      ;

     se   w0    h19        ;   if segmno = false segmno then
     jl.        i3.        ;     begin
     rl.  w1    f26.       ;     w0w1:=end of string;
     al   w0  x1           ;
     ds   w1 (x2+4)        ;
     jl       x3+2         ;     exception return; end;
i3:  al.  w1    d21.      ;   if list output then
     sh.  w1    (j28.)    ;
     jl.        i6.       ;     goto set code;
     rl.  w1    j26.      ;   store segm.no in queu
     rs.  w0  x1+j18.     ;
     al   w1  x1+2         ;   increase (queuerelative);
     rs.  w1    j26.       ;

i6:  al   w0    3          ; set code:  operationcode := input;
     jl.        i10.       ;   goto transfer;

                                                                                                \f


; rc 03.06.75                                   algol 6, pass 12, page 14



; initialize outputtransfer:

i7:  rl.  w1     j28.      ;   if called from close or
     se.  w1     d24.      ;      called from sort-merge of linenumbers
     sl.  w1     d9.       ;      then goto linked output;
     jl.         i8.       ;
     rl   w1 (x2+2)        ;     segmno := first word in buffer;
     rs.  w1    j23.       ;
     al   w1  x1+1         ;     first word in buffer := segmno + 1;
     rs   w1 (x2+2)        ;
     jl.        i9.        ;     goto set output code;

i8:  rl.  w1    j26.       ;   linked output:
     al   w1  x1-2         ;     decrease queue;
     rs.  w1    j26.       ;
     rl.  w1    j18.       ;     segmno := first segmno of queue;
     rs.  w1    j23.       ;
     dl.  w1    j18.+4     ;     first word of buffer :=
     rs   w0 (x2+2)        ;       second segmno of queue;
     ds.  w1    j18.+2     ;

i9:  al   w0    5          ;   operationcode := output;


i10: hs.  w0    j20.       ; transfer: move operationcode to message;
     ds.  w3    j25.       ;   save (w2, w3);
c. (:e15 > 12 a. 1:) - 1   ;   if special testoutput pass12 then
     al.  w1    i19.       ;     begin
     jl.  w3    e13.       ;     writetext (<:oper: :>);
     jl.  w3    e14.       ;     write (<<dd>, operationcode);
       32 < 12 + 2         ;     end;
z.
     rl   w1  x2+2         ;
     rs.  w1    j21.       ;   move first core to message;
     al   w1  x1+h11-2     ;   move last core to message;
     rs.  w1    j22.       ;
c. (:e15 > 12 a. 1:) - 1   ;
     rl.  w0    j23.       ;   if special testoutput pass12 then
     jl.  w3    e14.       ;     write (<<dddd>, segmentno);
       32 < 12 + 4         ;
z.
     rl.  w0    j23.       ;   if segmentno > sortareasize then
     sh.  w0   (j27.)      ;     begin
     jl.        i11.       ;     set return (end pass 12);
     al   w0    0          ;     writetext (<:***xref too big:>);
     al.  w3     d23.       ;     end;
     jl.  w1    e13.       ;
     <:<10>***xref too big<0>:>);

i11: al.  w3    j19.       ; repeat message:  w3 := name address
     al.  w1    j20.       ;   w1 := message address;
     jd         1<11 + 16  ;   send message;
     al.  w1    j24.       ;   w1 := answer address;
     jd         1<11 + 18  ;   wait answer;
     am      (x1)          ;
     sn   w3  x3           ;   if statusword <> 0
     se   w0    1          ;   or result <> 1 then
     jl.         d25.      ;     goto  backing store fault;
     am      (x1+2)        ;
     sn   w3  x3           ;   if no of bytes transferred = 0 then
     jl.        i11.       ;     goto repeat message;
     dl.  w3    j25.       ;   restore (w2, w3);
     jl       x3           ;   return;

                                                                                                \f


; rc 3.2.1971                                   algol 6, pass 12, page 15


c. (:e15 > 12 a. 1:) - 1   ;   if special testoutput pass12 then

i12: am         i16        ; testoutput 2 words:
i13: al.  w3    i14.       ; testoutput 1 word:

     rl.  w1    e17.       ;   if -, testoutput then
     so   w1    1<5        ;
     jl.        i17.       ;     goto reestablish registers;

     al   w1  x2+i18       ;   writetext (case buffer of
     jl.        e13.       ;     <:in1: :>, <:in2: :>, <:out: :>);
                           ;   goto case testoutput of (1 word, 2 words);

i14: rl   w1 (x2+4)        ; 1 word:
     ls   w1    3          ;
     jl.  w3    i15.       ;   writechar (1. char);
     jl.  w3    i15.       ;   writechar (2. char);
     jl.  w3    i15.       ;   writechar (3. char);
     jl.        i17.       ;   goto reestablish registers;

i15: al   w0    0          ; procedure writechar (char);
     ld   w1    7          ;   unpack (char);
     am         (0)        ;
     bz.  w0    +g7.       ;   w0 := converted char;
     jl.        e12.       ;   write (char) and return;
i16 = k - i14

     dl   w1 (x2+4)        ; 2 words:
     ld   w1    -h17       ;   unpack (identno);
     jl.  w3    e14.       ;   write (<<ddddd>, identno);
       32 < 12 + 5         ;
     al   w0    0          ;
     ld   w1    h17        ;   unpack (connection);
     jl.  w3    e14.       ;   write (<<dd>, connection);
       32 < 12 + 2         ;
     rl   w0 (x2+4)        ;
     jl.  w3    e14.       ;   write (<<dddddddd>, lineno);
       32 < 12 + 8         ;

i17: dl   w1 (x2+4)        ; reestablish registers:
     jl.        (j28.)     ;   return;
i18 = k - j14

     <:<10>in1: :>, 0      ;
     <:<10>in2: :>, 0      ;
     <:<10>out: :>, 0      ;   comment the length of the text must be the
i19: <:<10>oper: <0>:>     ;     same as the buffer-descriptor length;

z.                         ; end of special testoutput;
i.

e.

; end of i/o-routines      ;

                                                                                                \f


; rc 1977.02.11                         algol 6, pass 12, page ...16...
b. i20
w.

; meaning of variables, local to ident sort:
;  f0  == no of identifiers
;  f1  == pointer to addr of current smallest identifier
;  f2  == addr of current smallest identifier
;  f3  == addr of textstart of current smallest identifier
;  f4  == pointer to addr of current identifier
;  f5  == addr of current identifier
;  f6  == addr of textstart of current identifier
;  f7  == saved w2
;  f9  == letteraddr
;  f28 == segmentbase of identifiernames

; variables, used with the earlier content and meaning
;  f15 == main top addr
;  f21 == end mark (i.e. nul characters with end-mark)
;  f26 == maximum (mask off signbit)

; variables, passed on to next phase:
;  f0
;  f26
;  f28

d10: al   w0  x2           ; ident sorting:
     jl.  w3    e3.        ;   outbyte (endpass);
     jl.  w3    d20.       ;
     rl.  w0    j23.       ;   close output;
     ba.  w0    1          ;
     rs.  w0    f28.       ;   save ident-segmentbase;
     jl.  w3    d19.       ;   open output;
     al   w2    0          ;
     rs.  w2    f0.        ;   no. of identfiers:=0;


;  i1 + 1 == letterrelative

i1:  al   w2    0          ; next letter: 
     al   w2  x2+h8        ;   letterrelative := letterrelative + addrlength;
     sl   w2    h9+2       ;   if letterrelative > last of lettertable then
     jl.        i19.       ;     goto create new identno-table:
     hs.  w2    i1.+1      ;
     al.  w2  x2+g0.       ;   letter addr := letterrelative 
     rs.  w2    f9.        ;     + lettertable base;

i2:                        ; restart same letter:
     rl   w3  x2-2         ;   addr of smallest := head (letter addr);
     sh   w3    1          ;   if addr of smallest =< 1 then
     jl.        i1.        ;     goto next letter;
     rl   w1  x3-2         ;   if addrpart of smallest not requestmarked then
     sz   w1    1          ;     begin
     jl.        i4.        ;     remove from letterchain
     rs   w1  x2-2         ;       (first identifier);
     rl.  w1    f26.       ;     head (first identifier) := maximum;
     rs   w1  x3-2         ;       comment see below: ident out;
     jl.        i2.        ;     goto restart same letter;
                           ;     end;
i4:  ds.  w3    f2.        ;   pointer to addr of smallest := letter addr;
     al   w2  x3           ;   current identifier := first identifier;
     jl.  w1    i3.        ;   find textstart;
     rs.  w3    f3.        ;
     jl.        i12.       ;   goto check for last ident;

                                                                                                \f


; rc 3.2.1971                                   algol 6, pass 12, page 17




; procedure find textstart returns register w3 with
; the address of the identifiertext, addressed by w3.
; the text is in main or aux table depending on
; bit0 of w0.

i3:  rl   w0  x3           ; procedure find textstart;
     sl   w0    0          ;   if bit0 = 1 then text in main table
     rl   w3    0          ;               else text in aux  table;
     jl       x1           ;   return;



; the next identifier from the unsorted chain is
; selected as the current identifier and is compared
; to the current smallest identifier.
; at entry register w3 holds the address of the next
; identifier, and w2 holds the addr of the old
; current identifier.

i5:  ds.  w3    f5.        ; next identifier: store pointers to current ident;
     jl.  w1    i3.        ;   find textstart;
     rs.  w3    f6.        ;
     rl.  w1    f3.        ;


; register usage:
; w0 = textpart of smallest identifier
; w1 = addr of this textpart
; w2 = textpart of current identifier
; w3 = addr of this textpart

i8:  rl   w0  x1           ; compare textparts:
     rl   w2  x3           ;   load w0 and w2 with textparts
     la.  w0    f26.       ;     and remove (bit0);
     la.  w2    f26.       ;
     se   w0  x2           ;   if textparts equal then
     jl.        i9.        ;     begin
     rl   w0  x1           ;     if textpart of smallest identifier
     sh   w0    -1         ;       stops here then
     jl.        i10.       ;         goto same smallest;
     rl   w2  x3           ;     if textpart of current identifier
     sh   w2    -1         ;       stops here then
     jl.        i11.       ;         goto new smallest;
     al   w1  x1-2         ;     select the next textparts;
     al   w3  x3-2         ;     goto compare textparts;
     jl.        i8.        ;     end;

i9:  sl   w0  x2           ;   if textpart(smallest) >=
     jl.        i11.       ;      textpart(current) then goto new smallest;

; the comparison is ended.
; if the current identifier is found to be smaller
; than the current smallest, the current identifier
; is selected as the current smallest identifier.
; register w2 is reestablished, pointing at the
; current identifier.

i10: rl.  w2    f5.        ; same smallest: reestablish;
     jl.        i12.       ;   goto check for last identifier;

i11: dl.  w2    f5.        ; new smallest: reestablish;
     ds.  w2    f2.        ;   smallest identifier := current identifier;
     rl.  w3    f6.        ;
     rs.  w3    f3.        ;

                                                                                                \f


; rc 1977.02.11                         algol 6, pass 12, page ...18...



; register usage:
; w0   not used
; w1   destroyed
; w2 = addr of current identifier
; w3 = addr of next identifier

i12: rl   w3  x2-2         ; check for last identifier:
     sh   w3    1          ;   if addr of next ident > 1 then
     jl.        i13.       ;     begin
     rl   w1  x3-2         ;     if addrpart of next ident request marked then
     sz   w1    1          ;       goto next identifier;
     jl.        i5.        ;     remove from letterchain
     al   w0    1          ;   ensure that current identifier
     lo   w1    0          ;     is requestmarked;
     rs   w1  x2-2         ;       (next identifier);
     rl.  w1    f26.       ;     head (next identifier) := maximum;
     rs   w1  x3-2         ;       comment see below: ident out;
     jl.        i12.       ;     goto check for last identifier;
                           ;     end;

i13: dl.  w2    f2.        ;   remove from unsorted chain
     rl   w0  x2-2         ;     (smallest identifier);
     rs   w0  x1-2         ;
     rl.  w3    f0.        ;
     al   w3  x3+1         ;   increase(
     rs.  w3    f0.        ;   no. of identifiers);
     rs   w3  x2-2         ;   head(cur ident):=new identno;

; the identifiertext, addressed by register w2, is dumped on the
; current textsegment;
     rs.  w2    f7.        ;   save (w2);
     bz.  w1    i1.+1      ;   first char := letterrelative // 2;
     ls   w1    -1         ;
     jl.  w3    d13.       ;   put 1 word (first char);
     rl.  w2    f7.        ;   restore (w2);

     rl   w1  x2           ;
     sl   w1    0          ;   if text in aux then adjust w2;
     al   w2  x1           ;
i15: rl   w1  x2           ; next: load textpart in w1;
     rs.  w2    f7.        ;   save (w2);
     jl.  w3    d13.       ;   put (textpart);
     rl.  w2    f7.        ;   restore (w2);
     rl   w1  x2           ;
     sh   w1    -1         ;   if text is longer then
     jl.        i16.       ;     begin
     al   w2  x2-2         ;     select next textpart;
     jl.        i15.       ;     goto next;
i16: sz   w1    127        ;     end
     jl.        i17.       ;   else
     jl.        i18.       ;     if last char <> nul then
i17: al.  w2    f21.       ;       begin insert nul characters;
     jl.        i15.       ;       goto next; end;
i18: rl.  w2    f9.        ;
     jl.        i2.        ;   goto restart same letter;

                                                                                                \f


; rc 1977.02.11                         algol 6, pass 12, page ...19...



i19:                       ; create new identno-table:
     rl.  w2    f15.       ;   main table addr := main top addr - 4;
     al   w2  x2-4         ;
     rl.  w1    e9.+4      ;   new table addr := last word in pass;

; the new identno-table is stored in the upper end of storage.

i20: sh.  w2    g9.        ; next comprime:
     jl.        d9.        ;   if w2 =< main bottom addr then goto presorting;
     rl   w0  x2-2         ;   new table(new table addr) :=
     rs   w0  x1           ;     main table(main table addr);
     al   w2  x2-4         ;   select new values;
     al   w1  x1-2         ;
     jl.        i20.       ;   goto next comprime;
i.

e.
; end of ident sorting routine;

                                                                                                \f


; rc 3.2.1971                                   algol 6, pass 12, page 20



; the sorting is accomplished by means of a binary
; tree-sorting, the elements being placed in inbuffer1
; and the links at the corresponding places in
; inbuffer2 (which for this purpose is called chain).

b. i9                      ; presorting:
w.

; meaning of variables, local to presort:
;  f1  == new identno table base
;  f2  == addr of first chain
;  f3  == saved w1

; variables, used with the earlier content and meaning:
;  f26 == maximum

; variables, passed on to next phase:
;  f0
;  f26
;  f28
d9:  sh.  w1    g10.       ;   if newtable addr <= last byte of inbuffer2 then
     jl.        d12.       ;     goto stack overflow;


     rs.  w1    f1.        ;   new table base := new table addr;
     jl.  w3    d20.       ;   close ident;
     bz.  w1    j15.+1     ;   addr of first chain :=
     am.        (j15.+2)   ;     (addr of first-use-byte
     al   w1  x1+h13-2     ;           of inbuffer2) + length of element - 2;
     rs.  w1    f2.        ;
     jl.  w3    d19.       ;   open output;
     al   w0    0          ;   elem := segmentno := 0;
     jl.  w3    d11.       ;   open input;

                                                                                                \f


; rc 1977.02.11                         algol 6, pass 12, page ...21...



; register usage:
; w0 == elem
; w1 == pointer
; w2 == addr of inbuffer1-descriptor (= j14)
; w3    miscellaneous purposes

; select a new element and prepare it for being hooked
; on to the tree.

i1:  jl.  w3    d16.       ; next to tree: get next elem;
     sl.  w0    (f26.-2)   ;   if next element<=maximum-1 then proceed;
     jl.        i9.        ;

; replace the old identno by the corresponding new identno.

     ld   w1    -h17       ;   w0 := old identno(elem);
     ls   w0    1          ;
     wa.  w0    f1.        ;
     rl   w0    (0)        ;   w0 := new identno(old identno);
     ld   w1    h17        ;

i9:  rl   w1  x2+4         ;   w1 := addr of elem;
     rs   w0  x1-2         ;   elem := w0;

     al   w1  x1+h12       ;   pointer := displacement + addr of elem;
     al   w3    0          ;
     rs   w3  x1           ;   chain(pointer) :=
     rs   w3  x1+2         ;   chain(pointer+1) := 0;
     rl.  w3    f2.        ;   w3 := addr of first chain;
     sn   w3  x1           ;   if pointer = addr of first chain
     jl.      i1.          ;     then goto next to tree;

; the search starts at the top of the tree.
; if the present elem is less than the current outpointed element
; in the tree, the search continues via the left branch -
; indicated by chain(pointer) - else via the rigth branch -
; indicated by chain(pointer+1) - until a free place is found.

i2:  rl   w1    6          ; search: pointer := w3;
     se   w0 (x1-h12-2)    ;   if elem = inbuffer(pointer - disp)
     jl.        i3.        ;
     rl   w3 (x2+4)        ;      and
     sl   w3 (x1-h12)      ;      lineno(elem) >= lineno(inbuffer)
     jl.        i4.        ;
     jl.        i5.        ;

i3:  sl   w0 (x1-h12-2)    ;   or elem >= inbuffer(pointer - disp)
i4:  al   w1  x1+2         ;   then pointer := pointer + 1;

i5:  rl   w3  x1           ;   w3 := chain(pointer);
     se   w3    0          ;   if w3 <> 0 then
     jl.        i2.        ;     goto search;

; a free place is found, and the present elem is hooked on to the tree.

     am      (x2+4)        ;   chain(pointer) :=
     al   w3       + h12   ;     addr of elem + displacement;
     rs   w3  x1           ;

     bz   w1  x2           ;   if the element is not the last
     sh   w1    h11-h13    ;     in the inbuffer then
     jl.        i1.        ;       goto next to tree;

                                                                                                \f


; rc 07.06.1972                                   algol 6, pass 12, page 22




; the tree is broken down and output. (postorder-traversing).
; the routine starts at the top of the tree.

; if there is a left-branch (there is an element smaller than
; the topelement) the tree is rearranged, so that the node
; of this branch becomes the top of the tree, while still keeping
; the structure of the tree.
; else the topelement is the smallest and can be output. the
; top is cut off, and the node of the rigth-branch becomes
; the new top.
; when there is no rigth-branch the routine is ended.

; register usage:
; w0 == chain(nextpointer+1)
; w1 == pointer
; w2 == next pointer
; w3 == chain (next pointer)

     rl.  w1    f2.        ;   pointer := addr of first chain;
                           ; examine top:
i6:  rl   w2  x1           ;   next pointer := chain(pointer);

i7:  sn   w2    0          ; examine the left-branch:
     jl.        i8.        ;   if next pointer <> 0 then begin

; there is a left-branch. rearrange.
     rl   w0  x2+2         ;   chain(pointer) := chain(nextpointer+1);
     rs   w0  x1           ;
     rs   w1  x2+2         ;   chain(nextpointer+1) := pointer;
     al   w1  x2           ;   pointer := nextpointer;
     jl.        i6.        ;   goto examine top; end;

i8:  rs.  w1    f3.        ; output top and examine rigth-branch:
     dl   w1  x1-h12       ;   put (top-element);
     jl.  w3    d14.       ;
     rl.  w1    f3.        ;

     rl   w1  x1+2         ;   pointer := chain(pointer+1);
     se   w1    0          ;   if pointer <> 0 then
     jl.        i6.        ;     goto examine top;
     al.  w3    i1.        ;   prepare return from procedure empty outbuffer;
     rl.  w1    (j14.+2)   ;   if next segment no of input
     se   w1    h19        ;   is not false segment no then
     jl.        d27.       ;     goto next to tree after empty outbuffer;
i.

e.
; end of presorting-routine;

                                                                                                \f


; rc 3.2.1971                                   algol 6, pass 12, page 23



b. i4
w.

; meaning of variables, local to merge-routine:
;  f1  == last segmno
;  f2  == no of strings
;  f3  == first segmno
;  f4  == string length
;  f5  == saved w0
;  f6  == saved w1

; variables, used with the earlier content and meaning:
;  f26 == maximum
;  f28 == segmentbase for identifiernames

; variables, passed on to next phase:
;  f0
;  f28


d18: al   w0    h11>9      ; merge: stringlength := bufferlength/512;
     rl.  w2    f28.       ;   last segmno :=
     rs.  w2    f1.        ;     segmentbase for identifiernames;

     ad   w3    -24        ;   no of strings :=
     wd   w3    0          ;     last segmno // stringlength;
     rs.  w3    f2.        ;
     jl.        i1.        ;   stringlength := stringlength/2;

i0:  rl.  w0    f4.        ; next total merge:
     wa   w0    0          ;   stringlength := 2 * stringlength;
i1:  rs.  w0    f4.        ;
     rl.  w1    f2.        ;   if no of strings =< 1 then
     sh   w1    1          ;
     jl.        d21.       ;     goto list output;
     ac   w0    (0)        ;   first segmno := 0 - stringlength;
     rs.  w0    f3.        ;

                                                                                                \f


; rc 3.2.1971                                   algol 6, pass 12, page 24


i2:  dl.  w1    f4.        ; next string merge:
     wa   w0    2          ;   w0 := first segmno + stringlength;
     wa   w1    0          ;   w1 := w0 + stringlength;
     rs.  w1    f3.        ;   first segmno := w1;
     sl.  w1    (f1.)      ;   if w1 >= last segmno then
     jl.        i0.        ;     goto next total merge;

; comment: if there is only one string left un-paired in this round,
; it is left for next round;

     rl.  w2    f2.        ;   no of strings := no of strings -1;
     al   w2  x2-1         ;
     rs.  w2    f2.        ;
     ds.  w1    f6.        ;   save (w0, w1);
     jl.  w3    d27.       ;   empty outbuffer;
     dl.  w1    f6.        ;   restore (w0, w1);
     jl.  w3    d11.       ;   open input;
     jl.  w3    d16.       ;   get 2 words 1;
     jl.  w3    d17.       ;   get 2 words 2;

i3:  dl.  w1    (j15.+4)   ; next elem:
     ss.  w1    (j14.+4)   ;   if compareelem (inbuffer1)
     sl   w0    0          ;    > compareelem (inbuffer2) then
     jl.        i4.        ;     begin
     dl.  w1    (j15.+4)   ;
     jl.  w3    d14.       ;     put 2 words;
     jl.  w3    d17.       ;     get 2 words 2;
     jl.        i3.        ;     end

i4:  dl.  w1    (j14.+4)   ;   else begin
     sl.  w0    (f26.)     ;     if compareelem(inbuffer1) = maximum then
     jl.        i2.        ;       goto next string merge;
     jl.  w3    d14.       ;     put 2 words;
     jl.  w3    d16.       ;     get 2 words 1;
     jl.        i3.        ;     end;
                           ;   goto next elem;
i.

e.
; end of merge;

                                                                                                \f


; rc 1977.02.11                         algol 6, pass 12, page ...25...


; the last phase... list output:
; the output is listed on the current output.

b. i15
w.

; meaning of variables, local to list output:
;  f1  == old ident (i.e. identno and connection)
;  f2  == old lineno
;  f3  == saved w0
;  f4  == saved w3
;  f5  == saved return
;  f6  == old identno (without connection)

; variables, used with the earlier content and meaning:
;  f0  == no of identifiers
;  f28 == segmentbase for identifiernames


d21: jl.  w3    d27.       ; list output: empty outbuffer;
     rl.  w0    f28.       ;   w0 := first segmno for identifiernames;
     al   w1    0          ;   w1 := first segmno for occurrencies;
     rs.  w1    f1.        ;   old ident := 0;
     rs.  w1    f6.        ;   oldidentno:=0;
     jl.  w3    d11.       ;   open input;

i1:  jl.  w3    d17.       ; read: w0w1 := (new ident, new lineno);

i2:  se.  w0    (f1.)      ; comp: if new ident = old ident then
     jl.        i6.        ;     begin
     sh.  w1    (f3.)      ;     if new lineno =< old lineno then
     jl.        i1.        ;       goto read;
     al   w0  x1           ;
     rs.  w0    f3.        ; output lineno: old lineno := new lineno;
; i4 + 1 = linepos;
i4:  al   w1    0          ;
     sh   w1    h14-h15    ;     if linepos+printpos > maxpos then
     jl.        i5.        ;       begin
     al   w1    h16+2      ;       w1 := linepos := std ident lgth + 2;
     jl.  w3    i13.       ;       newline(linepos);
     rl.  w0    f3.        ;
i5:  al   w1  x1+h15       ;       end;
     hs.  w1    i4.+1      ;     linepos := linepos + printpos;
     jl.  w3    e14.       ;     writeinteger(out, layout, new lineno);
w.    32 < 12 + h15        ;       comment layout;
     jl.        i1.        ;     goto read;
                           ;     end of comp;

                                                                                                \f


; rc 1977.11.09                         algol 6, pass 12, page ...26...



; an extra lineshift - accompanied by some text - is requested.
; the text may be either a new identifiertext or a
; connection-identification (i.e. d,a,u) or both.
i6:  rl.  w2    f6.        ; new text:
     ld   w1    -h17       ;   unpack (new ident);
     sn   w0  x2           ;   if new identno = old identno then
     jl.        i12.       ;     goto new connection;

; output next identifiertext.
     am          -2000      ;
     rl.  w3     f0.+2000   ;
     sl   w2     x3         ;   if old identno >= no of identifiers then
     jl.        d23.       ;     goto end pass 12;

     al   w2  x2+1         ;   old identifier := old identifier + 1;
     rs.  w2    f6.        ;
     ls   w2    h17        ;   old ident := pack (old identno);
     rs.  w2    f1.        ;

     al   w2    0          ;   no of identletters := 0;
     hs.  w2    i4.+1      ;
     jl.  w3    d15.       ;   w1 := first char;
     al   w0    10         ;   writetext(<:<10>:>);
     jl.  w3    e12.       ;
     ls   w1    17         ;
     al   w0  x1           ;
     jl.  w3    i10.       ;   writechar (first char);

i8:  jl.  w3    d15.       ; output identifier textpart:
     ls   w1    3          ;   for ever while char <> 0 do begin
     jl.  w3    i10.       ;     writechar(1. char);
     jl.  w3    i10.       ;     writechar(2. char);
     al.  w3    i8.        ;     writechar(3. char); end;
                           ;   goto repeat input;
i10: rl.  w2    i4.+1      ; procedure writechar(char);
     al   w0    0          ;   w2 := linepos;
     ld   w1    7          ;   w0 := char;
     sn   w0    0          ;   if char = 0 then
     jl.        i11.       ;     goto repeat input;
     al   w2  x2+1         ;   linepos := linepos + 1;
     hs.  w2    i4.+1      ;
     am         (0)        ;   w0 := outputtable(char);
     bz.  w0    +g7.       ;   write(char);
     jl.        e12.       ;   return;

i11: al   w1    0          ; repeat input:
     rs.  w1    f3.        ;   old lineno := 0;
     dl.  w1    (j15.+4)   ;   repeat input(inbuffer 2);
     jl.        i2.        ;   goto comp;

                                                                                                \f


; rc 1977.11.09                            algol 6, pass 12, page ...27...



; output next connection.

i12: ld   w1    h17        ; next connection:
     rs.  w0    f1.        ;   old ident := new ident;
     al   w1    h0+h1+h2   ;   w1 := mask;
     la   w0    2          ;   w0 := connection bits;
     sl   w0    4          ;   w0 := min (3, w0);
     al   w0    3          ;
     am         (0)        ;
     bz.  w0    +g8.       ;   w0 := connection identification;
     rs.  w0    f4.        ;   save (w0);

     al   w1    h16        ;   w1 := std ident lgth;
     bz.  w2    i4.+1      ;   w2 := linepos;
     sh   w2  x1           ;   if w2 > w1 then
     am         i14        ;     new line(std ident lgth)
     jl.  w3    i13.       ;   else spaces(std ident lgth - linepos);
     al   w1  x1+2         ;   linepos := std ident lgth + 2;
     hs.  w1    i4.+1      ;

     rl.  w0    f4.        ;   restore (w0);
     jl.  w3    c9.        ;   writechar( d, a or u );
     al   w0    58         ;   write (colon);
     jl.  w3    c9.        ;
     jl.        i11.       ;   goto repeat input;

i13: rs.  w3    f5.        ; procedure newline(linepos);
     al   w0    10         ;   save (return);
     jl.  w3    c9.        ;   writecr;
     al   w2    0          ;   spaces(linepos);
     jl.        i15.       ;   return;
i14 = k - i13

     rs.  w3    f5.        ; procedure spaces(linepos);
i15: sh   w1  x2-1         ;   save (return);
     jl.        (f5.)      ;   for w2 := w2+1 while w2 < w1 do
     al   w2  x2+1         ;
     al   w0    32         ;     writesp;
     jl.  w3    c9.        ;   return;
     jl.        i15.       ;

i.
e.
; end of list output;

                                                                                                \f


; jz.fgs 1981.03.03                           algol 6, pass 12, page ...28...


g4 = k         ; outbuffer
g5 = g4 + h11  ; inbuffer 1
g6 = g5 + h11  ; inbuffer 2
g2 = g5 + 2    ; main top
g3 = g2 -4-2047; main bottom
g9 = g2 -2     ; main bottom
g10= g6 + h11-1; last byte of inbuffer2;

b. i3
w.
d0 = k - j0                ; start pass 12:
     al   w2    -2048      ;

     al.  w1    g2.        ; current word addr :=
     rs.  w1    f14.       ;     main top addr :=
     rs.  w1    f15.       ;       lower main limit;
     rl.  w1  x2+e9.+4+2048; current aux addr :=
     rs.  w1    f16.       ;     aux top addr :=
     rs.  w1    f17.       ;       last word in pass;
     al.  w0    g5.        ;   compute bufferbases
     rs.  w0    j14.+2     ;     (inbuffer 1,
     al.  w0    g6.        ;
     rs.  w0    j15.+2     ;      inbuffer 2,
     al.  w0    g4.        ;
     rs.  w0    j16.+2     ;      outbuffer);
     al.  w0    g6.+h11-1  ;   w0 := last core (inbuffer2);
     sl   w0  x1           ;   if w0 >= last word in pass then
     jl.        d12.       ;     goto stack overflow;
     al   w0    0          ;
     jl.  w3    d19.       ;   open output;
     am         -2048      ;   w2 := name address;
     al.  w2    j19.+2048  ;

c. e77<3 ; if system 3 then begin
     rl   w0  x2-j19+e9-4  ;   available segments := used segments;
     rs   w0  x2-j19+e9-2  ;
z.         ; end system 3;

     am      (x2)          ;   if first parts of name = 0 then
     se   w2  x2           ;     begin
     jl.        i0.        ;

c. e77<2 ; if system 2 then begin
     al   w3  x2           ;     w3 := name address;
     al.  w1    j27.       ;     w1 := tail address;
     jd         1<11+40    ;     create entry(sort area);
     se   w0    0          ;     if result <> 0 then
     jl.        i1.        ;       goto error;
z.         ; end system 2;

c. e77<3 ; if system 3 then begin
     al   w3  x2-j19+e79   ;     w3 := pass 0 work area name address;
     al.  w1    g6.        ;     w1 := tail address;
     jd         1<11+42    ;     lookup entry (work area);
     rl   w0  x2-j19+e9-4  ;     tail(1) := used segments;
     rs.  w0    g6.        ;
     jd         1<11+44    ;     change entry (work area);
     se   w0    0          ;     if result <> 0 then
     jl.        i1.        ;       goto error;
z.         ; end system 3;
 
\f


 
; jz.fgs.1986.03.14                        algol 6, pass 12, page ...29...





     al   w0    1<10       ;     selfmade sortarea := true;
     hs.  w0    d28.       ;     end selfmade sortarea;

i0:  al   w1    0          ; prepare connect: comment: no zone;
     al   w0    e81        ;   comment: take standard actions for sortarea;
     am      (x2-j19+e23)  ;
     jl   w3    +e78       ;   connect output;

     bz   w1  x2+1         ;   if connect trouble
     sn   w0    0          ;     or kind of sortarea <> bs then
     se   w1    4          ;     goto error;
     jl.        i1.        ;

     am         -2048      ;   move name of sort area to name address;
     al.  w3    j19.+2048  ;
     dl   w1  x2+4         ;
     ds   w1  x3+2         ;
     dl   w1  x2+8         ;
     ds   w1  x3+6         ;

     jd         1<11+8     ;   reserve process;

     jd         1<11+4     ;   process description (sort area);
     se   w0    0          ;   if process does not exist then
     jl.        i2.        ;     begin

i1:  al.  w3    d22.       ; error: set return (end pass 12);
     jl   w1  x3-d22+e13   ;     outtext(<:***algol sort area:>);
     <:***algol sort area<10><0>:> ;
                           ;     end;

i2:  am        (0)         ;   comment: find number of segments
     rl   w1    +18        ;     in area process;
     al   w1  x1-1         ;   sortsize := segments - 1;
     rs.  w1    j27.       ;   comment: see transfer;
c.e77<3 ; if system 3 then
     am       -2048        ;
     al. w2  j19.+2048     ;
     al  w0   0            ;   segm number of
     rs  w0  x2-j19+e79+16 ;   byteoutput:= -1;
z.

     jl.        d2.        ;

i.

e.
; end of initialize pass 12;



g1 = k - j0    ; number of bytes in pass 12
e30=e30+g1
i.
e.
m. jz 1986.03.20 algol 8, pass 12
\f


▶EOF◀