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

⟦fa42ed1bd⟧ TextFile

    Length: 121344 (0x1da00)
    Types: TextFile
    Names: »talgpass8«

Derivation

└─⟦00964e8f7⟧ Bits:30007478 RC8000 Dump tape fra HCØ.
    └─⟦b2ec5d50f⟧ 
        └─⟦this⟧ »talgpass8« 

TextFile

                                                                               

; jz 1979.09.14                             algol 8, pass 8, page ...1...

k=e0

s. a100,b50,c115,f72,g97,h10,j10;

w.   h10                ;   no. of bytes in pass
h.   c99     , 8<1 + 1  ;   entry to pass 8, change direction

h8=(:e15 a. 1<8:)-1<8   ;   h8=test mode

; usage of names:
; a-names: local references within actions
; b-names: local variables in actions
; c-names: global action entries. used in tables and other actions.
; f-names: global constants and variables. all defined on page 15
; g-names: g0, g1, g2, g60 are bases for tables. other g-names are
;          entries to main and continue table. most of them are
;          relative to g0.
; h-names: h8 defines test mode versions. h10 is pass length.
; j-names: global variables hidden in actions
\f

                                                                                                                                  

; rc  12.2.1971                         algol 6, pass 8, page ...2...

; operand table. each entry corresponds to one kind of operand:
;    *  opand app actions, normal opand and addr. opand
;    *            * opand store actions, normal opand and addr.opand
;    *            *           * address modifier added to opand rel.
h.
b1:  a4. , a22., a8. , a30., aw x3 , 0 ; local zone, global var
b2:  a23., a23., c24., a28., aw x2 , 0 ; local var
b7:  a23., a23., c24., a28., aw x1 , 0 ; x1 addressing
b4:  a6. , a2. , c29., a33., aw.( ), 0 ; external or uv
b5:  a3. , a23., a8. , a23., aw x3 , 0 ; global formal zone
b6:  a23., a22., c24., a33., aw(x2), 0 ; local indirect
b3:  a7. , a25., a9. , a35., aw x3 , 0 ; own var
b8:  a1. , a26., a11., a28., aw.   , 0 ; literal, b8+4 used as a constant
b15: a37., a23., a9. , a23., aw x3 , 0 ; external zone
w.
c3:  bl  w0    5        ; read operand: w0:=block:=byte read;
     sz  w0    1        ;   if block even then
     jl.       a13.     ;   begin
     al  w1    b1-b1    ;    w1:=global var entry;
     sn. w0   (f9.)     ;    if block=current block then
     al  w1    b2-b1    ;    w1:=local var entry;
     sn  w0    -4       ;    if block=own block then
     al  w1    b3-b1    ;    w1:=own var entry;
     jl.       a14.     ;   end else
a13: al  w0  x2-1       ;   begin block:=block-1; w1:=ext var entry
     al  w1    b4-b1    ;   end;

c30:                    ; local indirect: w1=x1 addressing entry;
a14: hs. w0    f56.     ; read relative: opand block:=opand block,block;
     jl. w3    e2.      ;   w2:=inbyte;

a15: al. w3  x1+b1.     ; common opand: w1=var entry, w2=relative.
     ba. w3  x1+b1.     ;   opand appetite action:=
     al. w0  x1+1+b1.   ;   opand table(var entry) abs;
     ba. w0  x1+1+b1.   ;   address opand appetite action:=
     ds. w0    f53.     ;   opand table(var entry+1)abs;
     al. w3  x1+2+b1.   ;
     ba. w3  x1+2+b1.   ;   opand store action:=
     al. w0  x1+3+b1.   ;   opand table(var entry+2)abs;
     ba. w0  x1+3+b1.   ;   address opand store action:=
     ds. w0    f55.     ;   opand table(var entry+3)abs;
     wa. w2  x1+4+b1.   ;   opand rel
     rs. w2    f4.      ;   :=opand rel+opand table(var entry+4);
     jl.       c0.      ;   goto next in;

                        ; x1-addressing: w1=x1 addressing;
c31: al  w2    0        ;   w2:=relative:=0;
     jl.       a15.     ;   goto common opand;
\f


; rc 3.3.1971                       algol 6, pass 8, page ...3...

c32: al  w2    12       ; uv: w1=external or uv entry;
     wa. w2    f10.     ;   w2:=relative:=rs entry 12+no.of exts;
     jl.       a15.     ;   goto common opand;

                        ; zone addressing: w1=global formal zone entry;
c33: rl. w0    f11.     ;   w0:=block:=zone block;
     sz  w0    1        ;   if zone block odd then
     al  w1    b15-b1   ;   w1:=external zone entry;
     se. w0   (f9.)     ;   if zone block<>current block then
     jl.       a14.     ;   goto read relative;
     bz. w0    f52.     ;   w0:=block:=zone rel;
     al  w1    b1-b1    ;   w1:=global var entry;
     jl.       a14.     ;   goto read relative;

c37: ac  w2  x1-4       ; literal: w2:=modifier:=literal length;
     sn  w2    1        ;   if literal length=1 then
     al  w2    2        ;   w2:=literal length:=2;
     al  w1    b8-b1    ;   w1:=literal entry;
     jl.       a15.     ;   goto common opand;

c38: al  w2    4        ; string next: return saved; app:=4;
a21: al  w0    4        ; store string first: w2=app;
     rs. w0    f4.      ;   opand rel:=4;
     rl. w0    f14.     ;
     ws. w0    f15.     ;   w0:=point:=last constant-segm base
     wa. w0    f16.     ;   +1<23+1<12;
     jl. w3    c19.     ;   if test and change(app) then
     jl.       a18.     ;   goto string on next segment;
a19: jl. w3    c112.    ;   store string;
     jl.      (f2.)     ;   return;
a18: rl. w2    f14.     ; string on next segm:
     al  w2  x2+2       ;   last const:=last const+2;
     rs. w2    f14.     ;
     rs  w0  x2         ;   segm(last const):=negative;
     jl. w3    c14.     ;   point appetite;
     jl. w3    c15.     ;   point store;
     jl.       a19.     ;   store string and return;

c39: al  w2    8        ; string first: app:=4+point+rl;
     al. w3    a17.     ;   return:=continue;
     rs. w3    f2.      ;
     jl.       a21.     ;   call store string first;
a17: rl. w0    f14.     ;
; the point may not resemble a point pointing to code

     ws. w0    f23.     ;   w0:=point:=last const-point base
      ba. w0  1         ;   +1;
     ws. w0    f15.     ;   -segment base;
     al  w1    -2048    ;   w0:=point:=
     hs  w1    0        ;   1<11, point;
     jl. w3    c14.     ;   point appetite;
     jl. w3    c15.     ;   point store;
     ws. w1    f7.      ;   instr:=
     hs. w1    f51.     ;   instr, rel point addr-top instr;
     wa. w1    f7.      ;
     jl. w3    c103.    ;   set point modifier(rel point addr);
     jl.       c2.      ;   goto interprete next;
\f

                                                                                         

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

c40: bz. w0    f52.     ; zone base:
     ls  w0    12       ;   w0:=zone rel, zone block;
     hl. w0    f61.     ;
     se. w0   (f58.)    ;   if zone rel, zone block<>2 bytes read then
     jl. w3    c41.     ;   clear w3;
     bl. w0    f59.     ;
     rs. w0    f11.     ;   zone block:=first byte read;
     bl. w0    f58.     ;
     hs. w0    f52.     ;   zone rel:=second byte read;
     jl.       c0.      ;   goto next in;

c45: al  w2    0        ; beg block: point define:=0. dummy definition,
     jl.       a66.     ;   may be program entry. skip.
c46: jl. w3    e2.      ; beg proc: point define:=inbyte*2;
     ls  w2    1        ;
a66: wa. w2    f33.     ;
     rs. w2    f34.     ;   point define:=work0:=point define+global base;
     jl. w3    c48.     ;
     hs. w0    f42.     ;   work2:=block app:=unstack;
     ac  w2   (0)       ;
     hs. w2    f43.     ;   work3:=abs block app:=-block app;
     al  w2  x2-2       ;   copy to:=abs block app-2;
     al  w1    -2       ;   copy from:=-2;
     ds. w2    f47.     ;
     hs. w2    f49.     ;   work9:=abs block app-2;
     rl. w1    f9.      ;
     hs. w1    f48.     ;   work8:=current block;
     al  w1  x1+2       ;   current block:=current block+2;
     rs. w1    f9.      ;
     ac  w0  x1+6       ;
     hs. w0    f44.     ;   times:=-current block-6;
     ba. w1    f43.     ;
     hs. w1    f46.     ;   work6:=new displ elem:=
     al  w2    g3       ;   current block+abs block appetite;
     sn  w0    -2       ;   continue:=if times=-2 then
     al  w2    g4       ;   enter block-6 else
     jl.       c1.      ;   enter inner block; goto interprete;

c54: jl. w3    e2.      ; define label:
     ls  w2    1        ;
     wa. w2    f33.     ;   point define:=inbyte*2+global base;
     rs. w2    f34.     ;
c52: rl. w1    f7.      ; define global:
     al  w1  x1+2       ;
     ws. w1    f15.     ;   global(point define):=top instr+2-segment base
     wa. w1    f24.     ;   +current segm;
     rs. w1   (f34.)    ; 
     jl.      (f2.)     ;   return;

c48: rl. w1    f35.     ; unstack: w3=return.
     al  w1  x1-2       ;   stack top:=stack top-2;
     rs. w1    f35.     ;
     rl  w0  x1         ;   w0:=unstack:=stack(stack top);
     jl      x3         ;   return;
\f

                                                                                       

; rc  1977.11.24                              algol 6, pass 8, page ...5...

c49: rl. w2    f0.     ; begin copy: w3:=table pointer;
     jl.       a67.    ;   skip;
c50: rl. w2    f0.     ; end copy:
     al  w2  x2+8      ;   w2:=table pointer+8, ready for dl, ds.
a67: bl. w1    f44.    ;   w1:=times; called from c75.
     sh  w1    0       ;   table pointer:=w2:=
     al  w2  x2-4      ;   if times<=0 then w2-4-8, end rl, rs else
     sh  w1    2       ;   if times<=2 then
     al  w2  x2-8      ;   w2-8, ready for rl, rs else w2;
     al  w1  x1-4      ;
     hs. w1    f44.    ;   times:=work4:=times-4;
     rs. w2    f0.     ;
     dl. w2    f46.    ;
     al  w2  x2-4      ;   work7:=
     al  w1  x1-4      ;   copy to:=copy to-4;
     hs. w2    f47.    ;   work5:=
     hs. w1    f45.    ;   copy from:=copy from-4;
     jl.       c2.     ;   goto interprete next;
 
c113:bl. w1    f43.    ; adjust copy to:
     ba. w1    f48.    ;   work7 := copy to :=
     hs. w1    f47.    ;   abs block + current block;
     jl.       c2.     ;   goto interprete next;

c56: bl. w0    f59.    ; end block: w0:=block appetite:=byte read;
     jl. w3    c57.    ;   stack(block appetite);
     rl. w1    f9.     ;
     al  w1  x1-2      ;   current block:=current block-2;
     rs. w1    f9.     ;
     jl.      (f2.)    ;   return;

c70: al  w0  x1        ; stack(modif): w0:=modif;
c57: rl. w1    f35.    ; stack:
     rs  w0  x1        ;   stack(stack top):=w0;
     al  w1  x1+2      ;
     rs. w1    f35.    ;   stack top:=stack top+2;
     sh. w1   (f36.)   ;   if stack top<=greatest top then
     jl      x3        ;   return;
     rs. w1    f36.    ;   greatest top:=stack top;
     sh. w1   (f33.)   ;   if stack top<=global base then
     jl      x3        ;   return;
     al. w1    e10.    ;
     jl.       e5.     ;   alarm(<:stack:>);

c58: rl. w1    f9.     ; proc value:
     al  w1  x1-2-e101  ;
     hs. w1    f51.    ;   instr:=instr, current block-2-no of anonym. bytes for blocks;
     jl.      (f2.)    ;   return;

c69: jl. w3    c57.    ; stack point: stack(dummy);
     al  w1  x1-2      ;   w1:=define:=work0:=old top;
c84: rs. w1    f34.    ; store point: define:=w1;
     jl.       c52.    ;   goto define global;

c71: rl. w1    f35.    ; unstack 3:
     al  w1  x1-6      ;   stack top:=stack top-6;
     rs. w1    f35.    ;
     jl      x3        ;   return;
\f

                                                                                             

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

h.                     ; condition table:
b32:   6   , g18       ; 0: app=6, cont g18: skip, am, al
       4   , g19       ; 2: app=4, cont g19: skip, jl top-2
       4   , g20       ; 4: app=4, cont g20: skip, jl top-6
w.
c62: rl. w0  x1+b32.   ; set condition(modifier):
     rs. w0    f34.    ;   work0:=cond app, cond cont:=cond table(modif);
     jl.      (f2.)    ;   return;

c64: bl. w2    f34.    ; 34: skip direct(instr,modifier):
     jl.       a72.    ;   w2:=cond app; skip;
c63: bl. w2    f34.    ; 28: skip opand(addr opand+instr):
     jl. w3   (f53.)   ;   w2:=cond app+addr opand app;
a72: ld  w2    30      ;   w1:=appetite shift 6;
     bl. w2    f41.    ;   w2:=condition continue;
     am.      (f40.)   ;
     wa  w1  x2+2      ;   continuation table(condition continue):=
     am.      (f40.)   ;   continuation table(condition continue+2)
     rs  w1  x2+0      ;   +appetite shift 6; adjusts appetite in table.
     al  w1    6-28+1  ;
     rl. w3    f40.    ;
     am.      (f0.)    ;   continuation table(skip instr):=
     wa  w1  x3+0      ;   table(table pointer)+6-28+1; the skip instruc
     rs  w1  x3+g21    ;   tion will be stored according to the main table.
     jl.       c1.     ;   goto interprete;

c66: jl. w3    c48.    ; take forlab: unstack; w1:=new stack top;
     bl  w2  x1-4      ;   w0:=forlabel;
     bs. w2    f24.    ;   if segment(repeat jump)<>current segment then
     sn  w2    0       ;
     jl.       a76.    ;   begin
     bs  w0  x1+1      ;    work0:=segment,0:=forlab segment;
     rs. w0    f34.    ;
     rl. w0    f30.    ;
     hl  w0  x1+1      ;    work 8:=jl x3+forlab rel;
     rs. w0    f48.    ;
     al  w2    g22     ;    w2:=cont forlab;
     jl.       c1.     ;    goto interprete
a76: bl  w0  x1+1      ;   end;
     bs  w0  x1-3      ;   w0:=forlab rel-repeat jump rel;
     bl  w1  x1-3      ;
     wa. w1    f15.    ;   segm(repeat jump rel +segm base)
     hs  w0  x1+1      ;   :=jl. forlab rel-repeat jump rel;
h.   al  w0 , jl.      ;
w.   hs  w0  x1        ;
     jl.       c0.     ;   goto next in;

; stack snapshot when for is processed:
; top-6  enddo label
; top-4  0 for enddo, address of repeat jump for end single do
; top-2  do label
; top    forlabel, released by take forlab
; top+2  step label, put in this position and released by step

; stack snapshot when if is processed:
; top-6  2 for int expr, 4 for long expr, 6 for real expr
; top-4  end else label
; top-2  else label, stacked by end else, changed by else
\f

                                                                             

; rc  10.3.1971                          algol 6, pass 8, page ...7...

c72: jl. w3    c48.    ; step: unstack forlabel;
     rx  w0  x1-2      ;   w0:=step label; stack(stack top-2):=forlabel;
     rs  w0  x1        ;   stack(stack top):=step label;
     al  w2    g26     ;   w2:=cont constant step;
     bl. w0    f37.    ;
     sn  w0    0       ;   if var step=0 then
     jl.       c1.     ;   goto interprete;
     hs. w0    f34.    ;   work0:=var step;
     al  w0    0       ;   var step:=0;
     hs. w0    f37.    ;
     al  w2    g27     ;   w2:=cont variabel step;
     jl.       c1.     ;   goto interprete;

c73: bl. w0    f54.    ; test first:
     hs. w0    f37.    ;   var step:=opand rel
     al  w2    g28     ;   w2:=cont test first
     jl.       c1.     ;   goto interprete;

c74: wa. w1     f35.   ; test top+modifier: used in else and case comma.
     bl  w1  x1        ;   total type := stack(stack top + modifier);
     jl. w3     e2.    ;   type := inbyte;
     sl  w2  x1        ;   if type >= total type
     jl.        c0.    ;   then goto next in;
     am      x1        ;   continue := case type+total type-2 of
     rl. w2  x2+b42.   ;    (g51, g52, g53);
     jl.        c1.    ;   goto interprete;
 b42=k-6, g51,g52,g53 ;

c75: jl. w3    e2.     ; take array: w2:=no.of subscr;
     ls  w2    1       ;   work4:=times:=(no.of subscr)*2+2;
     al  w2  x2+2      ;
     hs. w2    f44.    ;
     hs. w2    f45.    ;   work5:=copy from:=times;
     jl. w3    e2.     ;   w2:=dope rel;
     al  w1  x2-4      ;
     hs. w1    f46.    ;   work6:=base word rel:=dope rel-4;
     ba. w2    f44.    ;
     hs. w2    f47.    ;   work7:=copy to:=dope rel+times;
     al  w2    g39     ;   w2:=table pointer:=copy dope;
     jl.       a67.    ;   goto begin copy, w2 loaded

c78: hs. w1    f57.    ; stop: stop:=0, true;
     al  w2    g46     ;   w2:=cont stop;
     jl.       c1.     ;   goto interprete;

\f

                                                                               

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

c79: rl. w1    e9.+4    ; end pass: w1:=last work for pass;
     rl. w0   (f34.)    ;   entry point:=entry point, latest point defined;
     hs  w0  x1-7       ;
     jl. w3    e2.      ;   core length:=no of owns:=in byte;
     rx  w2  x1         ;   w2:=no.of points, no.of catalog exts;
     bl. w3    f24.     ;
     ac  w3  x3         ;   w3:=no of code segments:=-current segment;
     hs  w3  x1         ;
     rs. w3    f34.     ;   work0:=no.of code segments;
     rl. w3    f24.     ;   work 4:=first code segm:=current segm;
     rs. w3    f44.     ;   double global(global base):=current segm,
     wa. w2    f24.     ;   no.of points+current segm, no.of cat. exts;
     ds. w3   (f33.)    ;   current segm subtracted later.
     rl. w3    f15.     ;
     rl  w2  x3+e39-2   ;   last on segment:=last on segment + begin mark;
     al  w2  x2+4       ;
     rs  w2  x3+e39-2   ;
     al  w1  x1-8       ;   ext list addr:=last work for pass-8;
a78: al  w1  x1-2       ; rep:
     rs. w1    f42.     ;   ext list addr:=ext list addr-2;
     rl  w0  x1         ;   instr:=
     sh. w1   (f62.)    ;   if ext list addr <= last global then
     ws. w0    f44.     ;   global(ext list addr)-first code segm
     rs. w0    f1.      ;   else global(ext list addr);
     jl. w3    c25.     ;   store instr;
     al  w0    0        ;   w3 claim:=0;
     hs. w0    j0.      ;   change segment may have occured.
     rl. w1    f42.     ;
     sl. w1   (f33.)    ;   if ext list addr>=global base then
     jl.       a78.     ;   goto rep;
     rl. w1    f7.      ;
     al  w1  x1+2       ;
     ws. w1    f15.     ;   start of ext list:=top instr+2-segment base;
     am.      (e9.+4)   ;
     hs  w1    -1       ;
     al  w1    c104     ;   out segm action:=return to end pass;
     hs. w1    j6.      ;
     jl. w3    c22.     ;   change segment;

c105:al. w2    e9.      ;   w2:=pass inf 1 addr;
     ac. w1   (f35.)    ;
     wa. w1    f36.     ;   w1:=-stack top+greatest top;
     jl. w3    a79.     ;   call set pass inf;
     al. w2    e9.+2    ;   w2:=pass inf 2 addr;
     bl. w1    j2.      ;   w1:=max line change;
     jl. w3    a79.     ;   call set pass inf;
     jl.       e7.      ;   goto end pass;

a79: wm. w1    f38.     ; set pass inf:
     rx  w1  x2         ;   w1:=pass inf;  pass inf:=w1*1000;
     wd. w1    f34.     ;
     wa  w1  x2         ;   pass inf:=pass inf+w1//no of code segments;
     rs  w1  x2         ;
     jl      x3         ;   return;
\f


                                                                                             
; rc 10.3.1971                               algol 6, pass 8, page ...9...



b48=k+2, 0   ,  1<10   ; round constant
 b46=k-6, b43,b44,b45 ; convert action table

c81: jl. w3     e2.    ; case elem lit:
     rl. w3     f35.   ;   w2 := elem type := inbyte;
     bl  w3  x3-1      ;   w3 := total type := stack(top-1);
     sl  w2  x3        ;   if elem type >= total type
     jl.        a97.   ;   then goto store length of constant;
     am      x3        ;   convert action :=
     rl. w2  x2+b46.   ;    case elemtype+total type -6 of
     dl. w1     f58.   ;     (lit int to long, lit int to real, lit long to real);
     jl.     x2+c81.   ;   (w0,w1) := constant;  switch to action;

b43=k-c81              ; lit int to long:
     bl  w0     2      ;   extend sign of
     bl  w0     0      ;   integer to w0;
     jl.        a96.   ;   goto store constant;

b44=k-c81              ; lit int to real:
     ci  w1     0      ;   (w0,w1) := float(w0,w1);
     jl.        a96.   ;   goto store constant;

b45=k-c81              ; lit long to real:
     nd  w1     5      ;   normalize double(exp1,w0,w1);
     ad  w1     -1     ;
     aa. w1     b48.   ;   add round constant;
     nd. w1     b47.   ;   normalize double(exp2,w0,w1);
b47=k+1                ;
     al  w2  x2        ;
     al  w2  x2+48     ;   exp(w0,w1) := exp1 + exp2 + 47;
     sn  w0     0      ;   if mantissa(w0,w1) = 0 then
     al  w2    -2048   ;   exp(w0,w1) := -2048;
     hs  w2     3      ;

a96: ds. w1     f58.   ; store constant:  constant := (w0,w1);
a97: al  w1  x3        ; store length of constant:  w1 := total type;
     sl  w3     4      ;   if total type >= 4 then
     al  w3     4      ;   total type := 4;
     hs. w3     f54.   ;   opand rel := total type;
     jl.        c83.   ;   goto stack3(w0:=opand type);

c82: jl. w3     e2.    ; stack inbyte:
     al  w0  x2        ;   w0 := inbyte;
     jl. w3     c57.   ;   stack(w0);
     jl.       (f2.)   ;   return;
\f

                                                                                    

; rc  12.2.1971                           algol 6, pass 8, page ...10...

c80: rl. w1    f35.     ; begin case elem: w1:=stack top;
     dl  w0  x1-8       ;
     wa. w0    f18.     ;   case elements:=case elements+1;
     rx  w3  x1-4       ;
     rx  w0  x1-2       ;   swop double stack(stack top-8),
     ds  w0  x1-8       ;        double stack(stack top-2);
     rl  w0  x1-6       ;
     al  w1  x1-8       ;   w1:=define:=stack top-8;
     se  w0    0        ;   if elem type<>variabel then
     jl.      (f2.)     ;   return;
     jl.       c84.     ;   goto store point(define);

; at this point the stack contains:
; top-10   literal of case elem or dummy
; top-8    literal of case elem or point of case element
; top-6    element type: 0=var, 2=int lit, 4=long lit, 6=real lit
; top-4    end case label
; top-2    no.of case elements, total type (2 ,4 or 6)
; next, the case comma stacks on top of this:
;          element type
;          literal or dummy
;          literal or dummy
c83: al  w0  x1         ; stack3: w0:=modifier;
     jl. w3    c57.     ;   stack(w0);
     rl. w0    f13.     ;
     jl. w3    c57.     ;   stack(first of constant)
     rl. w0    f58.     ;
     jl. w3    c57.     ;   stack(last of constant);
     jl.      (f2.)     ;   return;

c85: rl. w2    f0.      ; first case look-up:
     rs. w2    f34.     ;   work0:=table pointer;
     rl. w3    f40.     ;
     rl  w1  x3+g57     ;   continuation table(below segment limit):=
     rs  w1  x3+g58     ;   jl. w3 (case alarm);
     rl. w2    f35.     ;   w2:=
     al  w2  x2-4       ;   stack top:=last scanned:=
     rs. w2    f35.     ;   stack top-4;
     rs. w2    b35.     ;   end case label is now in top.
     bl  w1  x2+2       ;
     hs. w1    b36.     ;   elements:=stack(stack top+2);
     al  w1  x1+1       ;
     rs. w1    f44.     ;   work4:=elements+1;
\f

                                                                            

; rc 12.2.1971                       algol 6, pass 8, page ...11...

     al  w1    0        ;   w1:=
     hs. w1    f46.     ;   next segm limit:=0;
     jl.       a80.     ;   goto prepare next look-up;

c86: bl. w1    f46.     ; end case look-up: w1:=next segm limit;
     rl. w0   (f35.)    ;   w0:=end case label:=stack(stack top);
     rl. w3    b35.     ;
     rs. w3    f35.     ;   stack top:=last scanned;
     rs  w0  x3         ;   stack(last scanned):=end case label;
     rl. w2    f34.     ;   table pointer:=saved table pointer:=work 0;
     rs. w2    f0.      ;
     bl. w3    b36.     ;
     sl  w1  x3         ;   if next segm limit>=elements then
     jl.       c2.      ;   goto interprete next;
     rl. w2    b37.     ;
     am.      (f40.)    ;   continuation table(below segment limit):=
     rs  w2    g58      ;   jl. end of segment;
     jl. w3    c22.     ;   change segment;
     jl. w3    c41.     ;   clear w3
; w1=next segm limit    ; prepare next look-up:
a80: hs. w1    f43.     ;   segm limit:=next segm limit;
     al  w2    14+3     ;   w2:=appetite:=7 look up instructions+abs word
     rl. w0   (f35.)    ;
     jl. w3    c18.     ;   for alarm+1 byte+jump app(end case label);
     jl.       a81.     ;
     jl.       a82.     ;   if direct jump then goto next case look-up;
a81: jl. w3    c11.     ;   abs store;
     al  w2    16+3     ;   w2:=appetite:=8 look up instructions+3;

a82: bl. w1    f46.     ; next case look-up: w1:=next segm limit;
a83: rs. w2    b38.     ; rep: look up appetite:=w2;
b36=k+1; elements       ;
     sl  w1    0        ;   if next segm limit>=elements then
     jl.       a84.     ;   goto output case table;
     rl. w3    b35.     ;   w3:=last scanned;
     dl  w1  x3-2       ;   w1:=element type:=stack(last scanned-2);
     se  w1    0        ;   if element type=var then
     jl.       a85.     ;   begin w0=point.
     jl. w3    c18.     ;   w2:=look up appetite+jump app;
     jl.       a86.     ;   if direct jump then
     jl. w3    c20.     ;   begin if test then
     jl.       a84.     ;    goto output case table;
     bl. w1    f51.     ;    w1:=point rel
     jl.       a87.     ;   end else
a86: al  w2  x2+2       ;   begin w2:=appetite:=w2+jl;
     jl. w3    c20.     ;    if test then
     jl.       a84.     ;    goto output case table;
     jl. w3    c7.      ;    set w3 abs;
h.   al  w1 ,  jl x3    ;
w.   hs. w1    f1.      ;    instr:=jl x3, instr
     jl. w3    c25.     ;    call store instr;
     jl. w3    c41.     ;    clear w3;
     rl. w1    f7.      ;
     al  w1  x1+2       ;    w1:=top instr+2-segment base;
     ws. w1    f15.     ;
     jl.       a87.     ;   end end else
\f

                                                                                

; rc  12.2.1971                     algol 6, pass 8, page ...12...

a85: hs. w1    f54.     ;   begin element type=constant.
     dl  w1  x3-4       ;    opand rel:=element type;
     ds. w1    f58.     ;    constant:=stack(last scanned-4);
     jl. w3    c12.     ;    w2:=look up appetite+const app;
     jl. w3    c20.     ;    if test then
     jl.       a84.     ;    goto output case table;
     jl. w3    c13.     ;    const store; w1:=const addr-segm base;
     ws. w1    f15.     ;   end;
a87: dl. w3    b35.     ;
     rs  w1  x3-4       ;   stack(last scanned-4):=const or instr address;
     al  w2  x2+1       ;   w2:=look up appetite+1;
     al  w3  x3-6       ;   w3:=last scanned:=last scanned-6;
     rs. w3    b35.     ;
     bl. w1    f46.     ;
     al  w1  x1+1       ;   w1:=next segm limit:=next segm limit+1;
     hs. w1    f46.     ;
     jl.       a83.     ;   goto rep;

a84: ac. w2   (b38.)    ; output case table:
     sz  w2    1        ;   w2:=(if look up appetite odd then
     al  w2  x2+1       ;   (-look up appetite+1)else(-look up appetite))
     ac  w1  x2+7       ;
     wa. w2    f7.      ;   +top instr-segment base; w1 used later;
     ws. w2    f15.     ;   w2 is now the relative address of the first
     al  w0  x2+12      ;   look up word-4.
     rs. w0    f48.     ;   address base:=work8:=w2+12; future jl x1.
     ac  w0  x2+18-e39  ;
     hs. w0    f42.     ;   end of segm:=work 2:=512-w2-18;
     bs. w1    f46.     ;   look up base:=work7:=even(look up app)-7
     hs. w1    f47.     ;   -next segment base; future bl. w1 x1.
     rl. w1    b35.     ;   current elem:=last scanned;
a88: rs. w1    b39.     ; rep:
     dl  w0  x1+10      ;   w0:=elem type(current elem+10);
     rl. w1    f7.      ;   w1:=top instr-1; prepare set modifier.
     al  w1  x1-1       ;
     ws. w3    f48.     ;   w3:=const or instr address-address base;
     hs. w3    f1.      ;   instr:=w3, instr;
     se  w0    0        ;   if element type<>var then
     jl. w3    c87.     ;   set byte modifier;
     rl. w1    b39.     ;
     dl  w0  x1+4       ;   w0:=element type(current elem+4);
     ws. w3    f48.     ;   instr:=instr,
     hs. w3    f51.     ;   const or instr address-address base;
     se  w0    0        ;   if element type<>var then
     jl. w3    c27.     ;   set modifier;
     jl. w3    c25.     ;   call store instr;
     rl. w1    b39.     ;
     al  w1  x1+12      ;   current elem:=current elem+12;
     al  w2    g59      ;   w2:=pointer to look-up suite;
     sl. w1   (f35.)    ;   if current elem>=stack top then
     jl.       c1.      ;   goto interprete;
     jl.       a88.     ;   goto rep;
\f

                                                                                                                   

; rc  12.2.1971                       algol 6, pass 8, page ...13...

b39: 0                  ; current elem, used in output case table
b37: jl.       2<6 + 10 ; jl. end of segm =work2, used in end case look up
b38: 0                  ;-2: look-up appetite
b35: 0                  ; last scanned

; during case look-up generation the working     the stack looks like this:
; locations are used in this way:                old stack top ->
; work 0 saved table pointer
; work 2 end of segm rel, segm limit             last scanned ->
; work 4 elements+1                              current elem ->
; work 6 next segm limit, look up base
; work 8 address base                            stack top -> end case lab

c88: rl. w2    e9.+4    ; end external: w2:=last work for pass;
     dl. w1    f58.     ;
     ds  w1  x2-4       ;   kind and spec:=4 bytes read;
     al  w1    1        ;
     hs. w1    j3.      ;   segment type:=external procedure;
     am.    (f15.)      ;   last on segment:= segment type;
     rs  w1    +e39-2   ;
     jl.      (f2.)     ;   return;

c89: bl. w1    f57.     ; end call:
     hs. w1    f13.     ;   last of constant=formal count, literal count
     bl. w1    f59.     ;   first of const:=stop, -lit app-1
     ac  w1  x1+1       ;
     hs. w1    f60.     ;
     al  w1    1        ;
     hs. w1    f57.     ;   stop:=1;
     rl. w0    f3.      ;
     al  w2    g63      ;
     se. w0    a6.      ;   if opand app action<>external then
     rs. w2    f0.      ;   table pointer:=call formal proc;
     jl.       c83.     ;   goto stack 3;

; during procedure calls the stack looks like this:
; top-10  return point
; top-8   beg param action, kind+type
; top-6   old stop, call appetite
; top-4   formal count, literal count
; top-2   bypass to transfer next param

c90: rl. w1    f35.     ; begin param:  w1:=stack top;
     rl  w0  x1-8       ;
     hs. w0    f42.     ;   work2:=kind+type;
     rl. w2    f33.     ;
     rs. w2    f34.     ;   define:=global base;
     al  w2    g64      ;   w2:=if begin param action<0 then
     sl  w0    0        ;   thunk parameter else
     al  w2    g65      ;   define bypass;
     jl.       c1.      ;   goto interprete;
\f

                                                                                 

; rc  15.06.72                        algol 6, pass 8, page ...14...

c91: rl. w1    f35.     ; begin call: w1:=stack top;
     bl  w2  x1-6       ;
     bl. w0    f57.     ;   w0:=stop;
     hs. w2    f57.     ;   stop:=stacked stop;
     al  w1  x1-10      ;
     rs. w1    f35.     ;   stack top:=stack top-10;
     al  w2    g46      ;   w2:=pointer to jl.w3 (stop)
     sn  w0    0        ;   if old stop=0 then
     jl.       c1.      ;   goto interprete;
     bl  w2  x1+5       ;
     hs. w2    f45.     ;   work 5:=call app;
     rl  w0  x1         ;   w0:=return point;
     hs. w0    f49.     ;   work 9:=return rel;
     bs. w0    f49.     ;
     rs. w0    f34.     ;   work 0:=return segment, 0;
     ac  w2  x2+6       ;
     hs. w2    f48.     ;   work 8:=-call app-6;
     jl.       c2.      ;   goto interprete next;

c94: al  w2    -4       ; store formal: w2:=stack top-4;
     jl.       a89.     ;   points to formal count, skip.
c95: al  w2    -3       ; store literal: w2:=stack top-3;
a89: wa. w2    f35.     ;   points to literal count. w1=appetite.
     bl  w3  x2         ;
     hs. w3    f51.     ;   instr:=instr, formal or lit count;
     al  w3  x3-4       ;   formal or lit count:=
     hs  w3  x2         ;   formal or lit count-4;
h.   al  w0 , ds w0 x1  ;
w.   hs. w0    f1.      ;   instr:=ds w0 x1+formal or lit count;
     al  w2  x1         ;
     jl. w3    c21.     ;   test and change(modifier);
     jl.       2        ;
     jl. w3    c41.     ;   clear w3;
     jl.       c24.     ;   goto store instr, return saved;
c109:jl. w3    e2.      ; end array field param:
     jl. w3    e11.     ;  type:=inbyte; repeat inbyte;
     ls  w2    1        ;
     rl. w3  x2+b50.    ;  set constants to round
     rs. w3    f68.     ;    lower bound to a
     ac  w3  x3         ;    multiple of 
     hs. w3    f67.     ;    typelength(type);
     al  w2    4        ;  w2:=4;
     al  w0    g87      ;   (dope rel in runtime stack);
     al  w1    16       ;   w0:=continue(store bounds);
     jl.       a90.     ;   w1:=kind(array);  goto end param+4;
b50=k-2                 ; table for rounding lower bound
; typel.-1, log2(typel.);
      0 < 12  +  0      ;  boolean
      1 < 12  +  1      ;  integer
      3 < 12  +  2      ;  real
      3 < 12  +  2      ;  long

\f


;rc 03.03.1972                     algol6  pass 8, page ...15...



c92: jl. w3    e2.      ; end array param: w2:=dope rel to base;
     al  w0    g69      ;   w0:=continue array param;
     al  w1    16       ;   w1:=kind:=16;
     jl.       a90.     ;   skip
c96: bl. w0    f1.      ; 44: end param: w1=kind; w0:=continue;
     al  w2    6        ;   w2:=record dope;
a90: rs. w0    f0.      ;   table pointer:=continue;
     hs. w2    f48.     ;
     jl. w3    e2.      ;   work 8:=dope rel to base;
     wa  w2    2        ;   work 9:=inbyte(type)+kind;
     hs. w2    f49.     ;   w2=type+kind;
     rl. w1    f35.     ;   w1:=stack top;
     sl  w0    g80      ;   if continue>=thunks then
     wa. w2    f17.     ;   w2:=1 shift 23+type+kind;
     rs  w2  x1-8       ;   top-8:=beg param action, kind+type;
\f

                                                                                                             

; rc  12.2.1971                     algol 6, pass 8, page ...16...

     bl  w3  x1-3       ;   work 2:=literal count;
     hs. w3    f42.     ;
     sl  w0    g80      ;   if continue>=thunks then
     jl. w3    c41.     ;   clear w3;
     jl.       c2.      ;   goto interprete next;

c98:                    ; change out segment:
c. -1-h8              ; if no testoutput from pass 8 then load
b. a5  w.             ;
     rl. w3     e17.  ;
     so  w3     1<5   ;  if testoutput on then
     jl.        a0.   ;  begin
     rl. w3     e42.  ;    printcount:=printcount+1;
     al  w3  x3+1     ;
     sh  w3     9     ;    if printcount>9 then
     jl.        a1.   ;    begin
     jl. w3     e19.+2;      print line head;
     al  w3     0     ;      print count:=0;
a1:  rs. w3     e42.  ;    end;
     jl. w3     e27.  ;    print line count;
a0:                   ;  end;
e.
z.
c.510-e39               ;   if short segment mode then
w.   rl. w3    f15.     ;   begin
     al  w3  x3+e39     ;    w3:=segment base:=segment base+length;
     sh. w3   (e20.-4)  ;    if segment base<=last on segment
     jl.       c97.     ;    then goto after change;
z.                      ;   end;
c104=c105-k             ;   define return to end pass;
j6=k+1; out segm action ;
     jl. w3    e8.      ;   call gpa out segm or return to end pass;
c101:rl. w3    e20.-2   ;   w3:=segment base;
     jl.       c97.     ;   goto after change;

c19: jl.       c21.     ; stepping stone to test and change:

c107:rl. w2    f13.     ; restore opand rel:
     rs. w2    f4.      ;   opand rel:=first of const; return;
     jl.      (f2.)     ;   see simple zone param, g69.
c112:jl.       c36.     ; stepping stone to store string;
c103:jl.       c28.     ; stepping stone to set point modifier:
\f

                                                                                                  

; jz 1979.06.07                            algol 8, pass 8, page ...17...

; global constants and working locations.

f0:  g83                ; table pointer: index in main or continue table.
f51=k+1, f1: 0          ; instr:  instruction assembled here.
f2:  0                  ; return: return address from central actions.
f3:  0                  ; opand app action
f53: 0                  ; +2 addr opand app action
f54=k+1, f4: 0          ; opand rel: index mark+modif part, rel
                        ;   in case of const opand, rel signals length of
                        ;   constant.
f5:  0                  ; opand store action
f55: 0                  ; + 2  addr opand store action
f56=k+1, f6: rl w3 x2   ; opand block: rl w3 x2, block
f7:  0                  ; top instr:abs address of next instr on segment
f8:  0                  ; load w3: instr to load current value of w3
f10: 0                  ; no.of exts: no.of global points+no.of std.iden-
                        ;   tifiers.
f61=k+1, f11: 0         ; zone block: block of latest zone base.
f52=k+1, f12: rl w3 x3  ; zone rel: rl w3 x3, rel of latest zone base.
                        ;   used together with f8, if w3 claim=4.
f14: 0                  ; last const: abs address of last const on segment.
f15: 0                  ; segment base: abs address of byte 0 on segment.
f16: 1<23+1<12          ;   used in change segment.
f17: 1<23               ;
f18:      1<12          ;
f19: aw  (0)            ;   used in addr opand store and opand store.
f20: 0                  ; alternate return: assists f2 sometimes.
f21:h. am (x2),am ( )   ;
f22:w. rl. w3 ( )       ; used in w3 abs app
f23: 0                  ; point base: abs address of first const on segment
f26: 0                  ; +2  top point: abs address of next point on segm.
f24: 0 <12              ; current segment, 0
f25: 0                  ; last abs: abs address of last absword on segment
f27: 0                  ; line block: next instr where line inf is packed.
f28: 0                  ; prev line: line count of previous line block.
f29: 0                  ; line alarm addr: addr where line inf. is packed.
f50=k+1, f30: jl x3     ; jl x3 rel address
f31: 1<22-1             ; mask
f32: 23                 ;   used in set modifier etc
f33: 0                  ; global base: base addr for global points.
f35: 0                  ; stack top: addr of first free stack word.
f36: 0                  ; greatest top: greatest stack top yet used.
f57=k+1, f37: 0         ; var step, stop: boolean addr for step until,
                        ;   byte cleared when stop byte is input.
f38: 1000               ;   used in end pass
f40: 0                  ; abs value of g0 (outside range for some actions).
f62: 0                  ; abs address of last global

f41=k+1,f42=k+2,f43=k+3 ; work cells for special actions: define point,
f44=k+4,f45=k+5,f46=k+6 ;   conditions, take forlab, test first, of, etc.,
f47=k+7,f48=k+8,f49=k+9 ;   copy(begin block, take array), proc call.
f34: 0, 0, 0, 0, 0      ;   central action 10 stores instruction+byte
                        ;   found in work (modifier).
f9: -4                  ; +10  current block: initially
f60=k+1,f58=k+2,f59=k+3 ;   fictive std proc block.
f13: 0, 0               ; +12, +14  constant: latest constant input.
h.   f63=k-f34, -65     ; used in : store instr+(-65);
     f71=k-f34, f72: 0  ; used in : action 50 and 52
     f64=k-f34, f67: 0  ;  -   -  : c109, store bounds
w.h. f65=k-f34, f68: 0  ;  -   -  :   -     -     -
                        ;        (addressed as word and byte)
     f66=k-f34,    0 w. ; used in : c109, store bounds;
\f

                                                                                           

; jz 1979.06.07                            algol 8, pass 8, page ...18...

; interpreter: unpacks a table word given either by main table (inbyte),
; continue table (table pointer), or continue table (table pointer:=
; table pointer -2). the table word is split into instr (bits 0-11),
; w1=signed modifier (bits 12-17), and central action number (bits 18-23,
; positive). the return address is set to nextin or interprete next 
; depending on bit 23=1 or 0.
; finally the designated central action is entered.

c0:  jl. w3    e2.      ; next in: w0 unchanged; w2:=inbyte;
     sl  w2    500      ;   if w2>control byte then
     jl.       c3.      ;   goto read operand;
c1:  al. w3    c0.      ; interprete: w2=table pointer; prepare return
     rs. w2    f0.      ;   to next in; save table pointer;
     bl. w1  x2+g0.     ;
     hs. w1    f1.      ;   instruction:=control table (table pointer);
     bl. w1  x2+g1.     ;
     ad  w2    -6       ;   w1:=modifier:=bits 12-17 (table pointer+1);
     ls  w2    -18      ;   w2:=central action:=bits18-23(table pointer+1);
     so  w2    1        ;   if not last in sequence then
     al. w3    c2.      ;   w3:=return to interprete next;
     rs. w3    f2.      ;   save return;
     jl.    x2+b0.      ;   switch to central action(w2);
c2:  rl. w2    f0.      ; interprete next:
     al  w2  x2-2       ;   w2:=table pointer:=table pointer-2;
     jl.       c1.      ;   goto interprete;

                        ; switch to central actions:
b0:  jl.       c4.      ; 0: store opand+instr+modif.
     jl.       c34.     ; 2: call instr(modifier)
     jl.       c35.     ; 4: input modif bytes, call instr(modifier)
     jl.       c42.     ; 6: store addr opand+instr
     jl.       c110.    ; 8: store instr+rs entry (modifier)
     jl.       c47.     ; 10: store instr+work(modifier)
     jl.       c23.     ; 12: store instr+modifier
     jl.       c24.     ; 14: store instr, return saved
     jl.       c51.     ; 16: cont(instr), test(modifier)
     jl.       c53.     ; 18: clear w3, call instr
     jl.       c55.     ; 20: clear w3, cont(instr), test(modifier)
     jl.       c59.     ; 22: may be short lit(modifier)
     jl.       c60.     ; 24: store instr+ext chain
     jl.       c111.    ; 26: store instr+rs segm(modifier)
     jl.       c63.     ; 28: skip opand(addr opand+instr)
     jl.       c65.     ; 30: test (modif), jump(top+instr)
     jl.       c67.     ; 32: store instr+const
     jl.       c64.     ; 34: skip direct(instr,modif)
     jl.       c68.     ; 36: store instr+segment abs
     jl.       c76.     ; 38: store instr+ext point(modif)
     jl.       c77.     ; 40: store instr+sref
     jl.       c93.     ; 42: store instr+latest point
     jl.       c96.     ; 44: end param, cont instr, kind=modif
     jl.       c102.    ; 46: clear w3 + rs entry(modif)
     jl.       c108.    ; 48: cont(instr), test(modif), clear
     jl.       c114.    ; 50: define param
     jl.       c115.    ; 52: store instr + rs entry(param)

c110:la. w1    b49.     ;
     jl.       c26.     ;

c111:la. w1    b49.     ;
     jl.       c61.     ;

b49: 2.111111           ;
\f

                                                                

; rc  12.2.1971                                algol 6, pass 8, page ...19...

c4:  wa. w1    f4.      ; 0: store opand+instr+modif:
     rs. w1    f4.      ;   opand rel:=opand rel+modif;
a36: al  w2    2        ;   store opand+instr: rep: w2:=appetite:=2
     jl. w3   (f3.)     ;   +opand appetite;
     jl. w3    c21.     ;   if test and change then
     jl.       a36.     ;   goto rep;
c5:  rl. w0    f1.      ; opand+instr store: w0=instr.
a29: hl. w0    f4.+1    ;   instr:= (instr,opand rel) or opand rel;
     lo. w0    f4.      ;
     rs. w0    f1.      ;
     jl.      (f5.)     ;   switch to opand store action;

; opand appetite actions; literal: switches to constant appetite via a1
;a23: local var: local indirect: x1: return;

a3:  al  w1    4        ; global formal zone: new w3 app:=4;
     jl.       a5.      ;   skip;
a4:  al  w1    2        ; local zone: global var: new w3 app:=2;
a5:  rl. w0    f6.      ;   w2:=appetite:=w2
     jl.       c8.      ;   +w3 appetite(opand block); return;

a6:  bl. w0    f4.+1    ; external or uv:
     ls  w0    12       ;   w2:=appetite:=w2
     jl.       c10.     ;   +abs appetite(opand rel shift 12); return;

a7:  al  w0    0        ; own: w2:=appetite:=w2
     jl.       a10.     ;   +w3 abs appetite(0, odd return); return;

a37: bl. w0    f12.+1   ; external zone:
     ls  w0    12       ;   w2:=appetite:=w2
a10: al  w3  x3+1       ;   +w3 abs appetite(zonerel shift 12, odd return);
     jl.       c6.      ;   return;

; opand store actions   ; local var: indirect: x1: switches to store instr.

a8:  jl. w3    c9.      ; local zone: global var: global formal zone:
     jl.       c24.     ;   set w3; goto store instr, return saved.

                        ; external or uv: switches to instr+rs entry store.
a9:  jl. w3    c7.      ; own: external zone: set w3 abs;
     jl.       c24.     ;   goto store instr, return saved.

a11: jl. w3    c13.     ; literal: w1:=rel const addr:=const store;
a12: ws. w1    f7.      ;   called from c76.
     hs. w1    f1.+1    ;   instr:=instr, w1-top instr;
     jl. w3    c27.     ;   set modifier;
     jl.       c24.     ;   goto store instr, return saved.
\f

                                                                   

; rc  12.2.1971                                   algol 6, pass 8, page ...20...

c35: ac  w1  x1-4       ; 4: input modif bytes, call instr(4-modif):
     hs. w1    b10.     ;   w1:=4-modif;
     al  w1    4        ;   for w1:=3 step -1 until 4-modif do
a16: jl. w3    e2.      ;
     al  w1  x1-1       ;   constant(w1):=inbyte;
     hs. w2  x1+f13.    ;
b10=k+1; 4-modif        ;
     se  w1    0        ;
     jl.       a16.     ;   w1=4-modif

c34: bz. w2    f1.      ; 2: call instr(modif): w1=modifier;
     ws. w2    f18.     ;
     wa. w2    f0.      ;   w2:=table pointer+instr-4096;
     jl.     x2+g0.     ;   goto table pointer+instr+table base;

c42: al  w2    2        ; 6: store addr opand+instr:
     jl. w3   (f3.+2)   ; rep: w2:=appetite:=2+addr opand appetite;
     jl. w3    c21.     ;   if test and change then
     jl.       c42.     ;   goto rep;
     bl. w0    f1.      ;
     ls  w0    12       ;   w0:=instr,0;
     jl.      (f5.+2)   ;   switch to addr opand store action.

; addr opand appetite actions. also called from 22,may be short lit.

a22: al  w2  x2+2       ; global var: local indirect: w2:=app:=app+2;
a23: jl      x3         ; local var: x1 addressing: return;

a2:  bl. w0    f4.+1    ; external or uv:
     ls  w0    12       ;   w0:=abs word:=opand rel shift 12;
     jl.       a24.     ;   skip.
a25: al  w0    0        ; own var: w0:=abs word:=0;
a24: al  w2  x2+2       ;   w2:=appetite:=appetite:=appetite+2
     jl.       c10.     ;   +abs appetite(abs word);

a26: rl. w0    f13.+2   ; literal:
     sh  w0    2047     ;   if constant > 2047
     sh  w0   -2048     ;   ! constant < -2047 then
a1:  jl.       c12.     ; opand app lit: goto constant appetite;
     al. w0    a27.     ;
     rs. w0    f5.+2    ;   store addr opand:=byte lit; tested in c59.
     jl      x3         ;   return;

           \f

                                                                                                    

; jz 1979.06.07                           algol 8, pass 8, page ...21...

; addr opand store actions; literal switches to a11, previous page.

a27: rl. w0    f13.+3   ; byte lit:
     hs. w0    f1.+1    ;   instr:=instr, last byte of lit;
     jl.       c24.     ;   goto store instr, return saved.

a28: lo. w0    f19.     ; literal: local var: x1 addressing: w0:=instr( );
     jl.       a29.     ;   goto opand+instr store;

a30: al. w1    a31.     ; global var: w1:=am action:=global var am;
     jl.       a32.     ;   goto x3ref;

a33: al. w1    a36.     ; local indirect: external or uv: w1:=am action
     jl.       a34.     ;   :=store opand+instr; goto indirect ref;

a35: al. w1    c29.     ; own: w1:=am action:=instr+abs word store;
a32: hl. w0    f4.+1    ; x3ref: w0:=instr, opand rel;

a34: lo. w0    f19.     ; indirect ref:
     rs. w0    f1.      ;   instr:=instr( );
     rs. w1    b11.     ;   save am action;
     rl. w0    f2.      ;
     rs. w0    f20.     ;   alternate return:=return;
     jl. w3    c25.     ;   call store instr;
     bl. w0    f21.+1   ;
     hs. w0    f1.      ;   instr:=am(0);
     rl. w3    f20.     ;   w3:=return:=alternate return;
     rs. w3    f2.      ;
     jl.      (b11.)    ;   switch to am action;
b11: 0                  ; saved am action.

a31: rl. w0    f21.     ; global var am:
     hl. w0    f6.+1    ;   instr:=am(x2+opand block);
     rs. w0    f1.      ;
     jl.       c24.     ;   goto store instr; return saved

b22=k+1; saved modif    ;
a58: al  w1    0        ; rep: w1:=saved modif;
c102:jl. w3    c41.     ; 46: clear w3 + rs entry(modif): clear w3;
c26: hs. w1    b22.     ;  8: store instr + rs entry(modif):
     wa. w1    f10.     ;   save modif;
     ld  w1    36       ;   w0:=abs word:=(modifier+no of exts) shift 12;
     al  w2    2        ;
     jl. w3   c10.      ;   w2:=appetite:=2+abs app(abs word);
     jl. w3    c21.     ;   if test and change then
     jl.       a58.     ;   goto rep;
c29: jl. w3    c11.     ; instr+abs word store: abs store;
     ws. w1    f7.      ;
     hs. w1    f1.+1    ;   instr:=instr, abs word addr-top instr;
     rl. w0    f1.      ;
     lo. w0    b8.+4    ;   instr:=instr.;
     rs. w0    f1.      ;
     jl.       c24.     ;   goto store instr, w3 saved;
  
c114:bz. w1    f1.      ;  50: define param::
     hs. w1    f72.     ;   param := bits(0,11,controlword);
     jl.      (f2.)     ;   return;

c115:bz. w1    f72.     ; 52: store instr+rs entry(param):
     jl.       c26.     ;   modif:=param; goto store instr+rs entry(modif);
\f

                                                                                                                    

; jz 1979.09.12                            algol 8, pass 8, page ...22...

c47: bl. w1  x1+f34.    ; 10: store instr+work(modif): modif:=work(modif);
c23: hs. w1    f1.+1    ; 12: store instr+modifier: instr:=instr, modifier;
c25: rs. w3    f2.      ; 14: store instr: called from a34,c79.
                        ;   save return;
c24: rl. w2    f7.      ; store instr, return saved: w2:=top instr;
     al  w1  x2-2       ;   w1:=top instr-2;
     am.      (f14.)    ;
j0=k+1; w3 claim        ;   if top instr<=last const+w3 claim then
     sh  w2    +0       ;
     jl.       a54.     ;   change or half up; saves w1 only.
a56: sh. w1   (f27.)    ;   if top instr-2 <=line block then
     jl. w3    c44.     ;   store line inf;
     rs. w1    f7.      ;   top instr:=top instr-2;
     rl. w0    f1.      ;
     rs  w0  x1+2       ;   segment(top instr+2):=instr;
c.h8                    ; if test mode then
     rl. w2    e17.     ; begin
     sz  w2    1<5      ;   if test mode then
     jl.       c43.     ;   goto instr print
z.                      ; end;
     jl.      (f2.)     ; return;

a54: al  w2    2        ; change or half up:
     jl. w3    c21.     ;   if test and change(2) then
     jl.       c24.     ;   goto store instr, return saved
     jl. w3    a52.     ;   half up;
     jl.       a56.     ;   return to store instr;

c44: al  w0  x3         ; store line inf: w1 saved; w0:=return;
     rl. w3    e6.      ;
     rx. w3    f28.     ;   w3:=line change:=prev line-line count;
     ws. w3    f28.     ;   prev line:=line count;
     sl  w3    32       ;   if line change>=32 then
     al  w3    31       ;   line change:=31;
j2=k+1; max line change ;
     sl  w3    0        ;   if line change>=max line change then
     hs. w3    j2.      ;   max line change:=line change; pass inf.
     al  w2    0        ;
j1=k+1; line inf shifts ;   w2-w3:=segment(line alarm addr)
     ld  w3    3        ;   :=line change shift line inf shifts
     aa. w3   (f29.)    ;   +segment(line alarm addr);
     ds. w3   (f29.)    ;
     rl. w3    f27.     ;   line block:=line block-34;
     al  w3  x3-34      ;
     rs. w3    f27.     ;
     bl. w3    j1.      ;   line inf shifts:=line inf shifts+5;
     al  w3  x3+5       ;
     hs. w3    j1.      ;
     sh  w3    43       ;   if line inf shifts<=43 then
     jl       (0)       ;   return;
     al  w3    0        ;
     hs. w3    j1.      ;   line inf shifts:=0;
     rl. w3    f29.     ;
     al  w3  x3-4       ;   line alarm addr:=line alarm addr-4;
     rs. w3    f29.     ;
     jl       (0)       ;   return;
\f

                                                                                   

; rc  12.2.1971                          algol 6, pass 8, page ...23...

c55: jl. w3    c41.     ; 20: clear w3, cont, test: clear w3;
c108:al. w0    c41.     ; 48: cont,test,clear:
     jl.       a95.     ;   w0:=change action:=clear w3; skip;
c51: al. w0    c2.      ; 16: cont(instr), test(modif):
a95: bl. w2    f1.      ;   w0:=change action:= interprete;
     rs. w2    f0.      ;   table pointer:=instr;
     al  w2  x1         ;   appetite:=modifier;
     jl. w3    c21.     ;   if test and change then
     jl  w3   (0)       ;   clear w3 or interprete;
     jl.       c2.      ;   goto interprete;

c53: jl. w3    c41.     ; 18: clear w3, call instr: clear w3;
     jl.       c34.     ;   goto call instr;

c59: hs. w1    b30.     ; 22: may be short lit: save modifier;
     jl. w3   (f3.+2)   ;   addr opand appetite;
     rl. w0    f5.+2    ;   w0:=addr opand store action;
     al  w1    0        ;   modifier:=0. prepare jump to store opand+modif.
     se. w0    a27.     ;   if addr opand store action<>byte lit then
     jl.       c4.      ;   goto store opand+instr+modifier;
b30=k+1; saved modif    ;
     al  w2    0        ;   w2:=saved modifier;
     se  w2    0        ;   if modifier>0
j5=k+1; int overflow    ;   and integer overflow wanted then goto
     jl.       2;or c4. ;   store opand+instr+modifier; note: wa, ws.
     bl. w0  x2+b31.    ;
     hs. w0    f1.      ;   instr:=short operations(modifier);
     rl. w1    f13.+2   ;
     sn  w2    2        ;   w1:=modifier:=if modifier<>2 then constant
     ac. w1   (f13.+2)  ;   else -constant; note: ws.
     hs. w1    f1.+1    ;   instr:=instr,modif;
     jl.       c24.     ;   goto store instr, return saved;
h.
b31: al  w1 , al w1 x1  ; short operations: rl, wa
     al  w1 x1  , 0     ;                   ws, not used
w.

c60: bl. w1    f4.+1    ; 24: store instr+ext chain: w1:=extno:=opand rel;
     jl.       a70.     ;   skip;
c61: wa. w1    f10.     ; 26: store instr+rs segm(modif): w1:=ext no:=
a70: hs. w1    b34.     ;   modifier+no.of exts;
a71: al  w2    2        ; rep: w2:=appetite:=2
     jl. w3    c16.     ;   +chain app+(w3 chain app);
     jl. w3    c21.     ;   if test and change then
     jl.       a71.     ;   goto rep;
     jl. w3    c7.      ;   set w3 abs; w1:=abs word addr;
     bl  w0  x1+1       ;   instr:=instr, chain of abs word;
     hs. w0    f1.+1    ;
     rl. w2    f7.      ;
     al  w2  x2+1       ;   chain of abs word:=top instr+1-segment base;
     ws. w2    f15.     ;
     hs  w2  x1+1       ;
     jl.       c24.     ;   goto store instr, w3 saved
\f

                                                                                                     

; rc  12.2.1971                           algol 6, pass 8, page ...24...

; central action 28, skip opand, see special actions, c62, c63, c64.

c65: hs. w1    b33.     ; 30: test(modif), jump(top+instr):
b33=k+1; saved appetite ;   save appetite:=modif;
a73: al  w2    0        ; rep: w2:=saved appetite;
     rl. w1    f35.     ;
     ba. w1    f1.      ;   w1:=stack top+instr;
     rl  w0  x1         ;
     sz  w1    1        ;   if instr odd then
     hs. w0    j4.      ;   uncondit jump:=true;
     jl. w3    c18.     ;   w2:=app:=w2+jump app(stack(w1));
     jl.       a74.     ;   if direct jump then
     jl. w3    c21.     ;   begin if test and change then
     jl.       a73.     ;     goto rep;
     bl. w1    f1.+1    ;
     ws. w1    f7.      ;     instr:=instr, point rel-top instr
     wa. w1    f15.     ;     +segment base;
     hs. w1    f1.+1    ;
h.   al  w1, jl.        ;     w1:=jl.
w.   jl.       a75.     ;   end else
a74: jl. w3    c21.     ;   begin if test and change then
     jl.       a73.     ;     goto rep;
     jl. w3    c7.      ;     set w3 abs;
h.   al  w1, jl x3      ;     w1:=jl x3
w.                      ;   end;
a75: hs. w1    f1.      ;   instr:=w1, instr;
     al  w0    0        ;
     hs. w0    j4.      ;   uncondit jump:=false;
     jl.       c24.     ;   goto store instr, return saved;

c67: rl. w2    f4.      ; 32: store instr+const:
     rs. w2    f13.     ;   first of const:=opand rel;
     al  w2    2        ;   saved for c107, restore opand rel.
     hs. w2    f4.+1    ;   opand rel:=const length:=2;
     rl. w0    f48.     ;
     rs. w0    f58.     ;   last of const:=work 8;
     jl. w3    c12.     ;   w2:=2+const app;
     jl. w3    c21.     ;   if test and change then
     jl.       c67.     ;   goto store instr+const;
     jl.       a11.     ;   goto literal, opand store actions;

; central action 34, skip direct, see special actions, c62, c63, c64.

c68: rl. w0    f34.     ; 36: store instr+segment abs:
     ws. w0    f24.     ;   w0:=work0-current segment+1<23;
     wa. w0    f17.     ;
     al  w2    2        ;
     jl. w3    c10.     ;   w2:=app:=2+abs app(w0);
     jl. w3    c21.     ;   if test and change then
     jl.       c68.     ;   goto store instr+segment abs;
     jl.       c29.     ;   goto instr+abs word store;
\f

                                                                                           

; rc  12.2.1971                            algol 6, pass 8, page ...25...

c76: se  w1    0        ; 38: store instr+ext point:
     wa. w1    f10.     ;   if modifier<>0 then ext:=modifier+no.of exts;
     sn  w1    0        ;   if modifier=0 then
     bl. w1    f4.+1    ;   ext:=opand rel;
     ld  w1    36       ;   w0:=point:=ext shift 12;
a77: al  w2    2        ; rep:
     jl. w3    c14.     ;   w2:=appetite:=2+point app;
     jl. w3    c21.     ;   if test and change then
     jl.       a77.     ;   goto rep;
     jl. w3    c15.     ;   w1:=rel point addr:=point store;
     jl.       a12.     ;   goto literal, store opand+instr;

c77: bl. w1    f6.+1    ; 40: store instr+sref: w1:=modifier:=opand block
     se. w1   (f9.)     ;   if opand block<>current block then
     jl.       c23.     ;   goto store instr+modifier;
     bl. w1    f1.      ;
     al  w1 x1+11<6-20<6;   w1:=instr:=instr+al-rl, 0;
     ls  w1    12       ;
     rs. w1    f1.      ;
     jl.       c24.     ;   goto store instr;

c93: rl. w0   (f34.)    ; 42: store instr+latest point: w0:=point(define)
     wa. w0    f17.     ;   +1<23 - current segm;
     ws. w0    f24.     ;
     jl.       a77.     ;   goto rep in store instr+ext point;

; central action 44, end param, see special actions c92, c96.
; central action 46, clear w3+rs entry, see page 19.

c99=k-e0                ; stepping stone to entry pass 8:
     jl.       c100.    ;   goto entry pass 8;
\f

                                                                                                     

; rc  12.2.1971                        algol 6, pass 8, page ...26...

c41: bl. w0    j0.   ; clear w3: w3=return, w2, w1 saved
     sn  w0    0     ;   if w3 claim=0 then
     jl      x3      ;   return;  swop w1,top instr;
     rx. w1  f7.     ;   there is always room for load w3 instructions
     sh  w0    2     ;   between instructions and constants.
     jl.       a20.  ;   if w3 app>2 then
     rl. w0    f12.  ;   begin
     rs  w0  x1      ;     segment(top instr):=zone rel;
     al  w1  x1-2    ;     top instr:=top instr-2
a20: rl. w0    f8.   ;   end;
     sz. w0   (b8.+4);   if load w3 relative marked then
     ws  w0    2     ;   load w3 address:=load w3 address-top instr;
     hs. w0    f8.+1 ;
     rl. w0    f8.   ;   segment(top instr):=w0:=
     rs  w0  x1      ;   load w3, load w3 address;
     al  w1  x1-2    ;   top instr:=
     rx. w1    f7.   ;   top instr-2; get saved w1;
     al  w0    0     ;
     hs. w0    j0.   ;   w3 claim:=load w3:=0;
     rs. w0    f8.   ;
     jl      x3      ;   return;

c18: hs. w0    f1.+1 ; jump app: w0=point, w3=return, w2=appetite;
     bs. w0    f1.+1 ;   instr:=instr, point rel;
     sn. w0   (f24.) ;   if point-point rel=current segment then
     jl      x3+2    ;   return direct jump;
     ws. w0    f24.  ;   w0:=abs word:=point-point rel-current segm
     wa. w0    f17.  ;   +1<23;
c6:  rs. w3    b12.  ; w3 abs app: w0=abs word, w3=return;
                     ;   w3odd signals no (); save return;
     jl. w3    c10.  ;   w2:=appetite:=w2+abs app;
c17: hs. w1    f22.+1; w3 chain app: called from chain app;
     rl. w0    f22.  ;   w0:=next load w3:=rl. w3 abs word addr;
     al  w1    2     ;   next w3 claim:=2;
     rl. w3    b12.  ;   get return;
     sz  w3    1     ;   if odd return then
     ws. w0    f19.  ;   remove ();
c8:  rs. w0    b13.  ; w3 app: wo=next load w3, w1=next w3 claim, w2=app;
     hs. w1    b14.  ;   save next load w3, next w3 claim;
     wa  w2    2     ;   w2:=appetite:=w2+next w3 claim;
     bs. w1    j0.   ;
     sn  w1    0     ;   if w3 claim<>next w3 clai m
     se. w0   (f8.)  ;   or load w3<>next load w3 then
     jl.       c41.  ;   goto clear w3;
     bs. w2    b14.  ;   w2:=appetite:=w2-next w3 claim;
     jl      x3      ;   return;
b12: 0               ; saved return
b13: 0               ; next load w3

c7:  rs. w3    b12.  ; set w3 abs: save return;
     jl. w3    c11.  ;   abs store; w1 used in c60, c61.
     rl. w3    b12.  ;   get return;
c9:  rl. w0    b13.  ; set w3:
     rs. w0    f8.   ;   load w3:=next load w3;
b14=k+1; next w3 claim;
     al  w0    0     ;   w3 claim:=next w3 claim;
     hs. w0    j0.   ;
     jl      x3      ;   return;
\f

                                                                                              

; rc  13.06.72                        algol 6, pass 8, page ...27... 

                     ; point app: w0=point, w2=app, w3=return.
c14: rl. w1    f23.  ;   w1:=point base;
a43: al  w1  x1-2    ; rep: w1:=point addr:=w1-2;
     se. w1   (f26.) ;   if point addr<>top point
     sn  w0 (x1)     ;   and point<>segment(point addr)
     jl.       a44.  ;   then
     jl.       a43.  ;   goto rep;
a44: sn. w1   (f26.) ;   if point addr=top point then
     al  w2  x2+2    ;   w2:=appetite:=w2+2;
     ds. w1    b16.  ;   save point, point addr;
     jl      x3      ;   return;

c15: dl. w1    b16.  ; point store: w3=return; w1:=point addr;
     al  w2  x1-2    ;   w2:=possible new top point:=point addr-2;
     ws. w1    f23.  ;   w1:=rel point addr:=point addr-point base;
     sl. w2   (f26.) ;   if point addr-2>=top point then
     jl      x3      ;   return;
     rs. w2    f26.  ;   top point:=new top point;
     rx  w0  x2+2    ;   swop point, segment(point addr);
     sl. w2   (f25.) ;   if new top>=last abs then
     jl      x3      ;   return;
     jl.       a40.  ;   goto half down;

c12: rs. w3    b18.  ; const app: w2=return, opand rel=const length
     rl. w1    f23.  ;   save return; w1:=const addr:=point base;
     bl. w3    f4.+1 ;   w3:=opand rel;
     al  w0    a45   ;   first no match:=exit;
     sh  w3    2     ;   if long lit then
     jl.       a46.  ;   begin
     al  w1  x1+2    ;     w1:=const addr:=point base+2;
     al  w0    a47   ;     first no match:=rep;
a46: hs. w0    b19.  ;   end;  set first no match;
     dl. w0    f13.+2;   w3-0:=constant;
a48: sh. w1   (f14.) ; rep: if const addr>last const then
     jl.       a49.  ;   begin
     ba. w2    f4.+1 ;     w2:=appetite:=w2+const length;
     rl. w1    f14.  ;     w1:=const.addr:=last const+const length;
     ba. w1    f4.+1 ;
a50: rs. w1    b20.  ; exit: save const addr;
     jl.      (b18.) ;     return;
a49: al  w1  x1+2    ;   end;  w1:=const addr:=w1+2;
     se  w0 (x1-2)   ;   if last of lit<>segm(const addr-2) then
     jl.       a48.  ;   goto rep;
     se  w3 (x1-4)   ;   if first of lit<>segm(const addr-4) then
b19=k+1; first no match;
     jl.       0     ;   goto rep or continue;
a45=  k-b19+1        ;
     al  w1  x1-2    ;   const addr:=w1-2;
a47=a48-b19+1        ;
     jl.       a50.  ;   goto exit
b18: 0               ; saved return
b20: 0               ; const addr, claimed (half up).
\f

                                                                                                      

; rc  13.06.72                       algol 6, pass 8, page ...28...

                     ; abs app: w0=abs word,  w2=app,  w3=return.
c10: rl. w1    f15.  ;   w1:=abs word addr:=segment base;
a38: sh. w1   (f25.) ; rep: if abs word addr<=last abs
     sn  w0 (x1)     ;   and abs word<>segment(abs word addr)
     jl.       a39.  ;   then begin
     al  w1  x1+2    ;   w1:=abs word addr:=w1+2;
     jl.       a38.  ;   goto rep end;
a39: sh. w1   (f25.) ;   if abs word addr>last abs then
     am        -2    ;
     al  w2  x2+2    ;   w2:=appetite:=w2+2;
     ds. w1    b16.  ;   save abs word, abs word addr;
     jl      x3      ;   return; w1 used in w3 abs app. w0 used in c26.
     0               ; saved abs word, point. 
b16: 0               ; saved abs word addr, point addr. 

c11: dl. w1    b16.  ; abs store: w3=return; w1:=abs word addr;
     sh. w1   (f25.) ;   if abs word addr<=last abs then
     jl      x3      ;   return;
     rs. w1    f25.  ;   last abs:=abs word addr;
     rx  w0  x1      ;   swop abs word, segment(abs word addr);
     sh. w1   (f26.) ;   if abs word addr<=top point then
     jl      x3      ;   return;
     rx  w0  x1      ;   swop abs word, segment(abs word addr);

a40: ds. w1    b41.  ; half down: w1=result of abs or point store,
     rl. w1    f7.   ;   w0=segment(last abs), save.
     ws. w1    f14.  ;   w1:=left on segment:=top instr-last const
     bs. w1    j0.   ;   -w3 claim;
     ls  w1    -2    ;
     ls  w1    1     ;   displacement:=left on segment//4*2;
     hs. w1    b17.  ;   at least 2 words are free  (instr+abs word).
     rl. w2    f14.  ;   w2:=last const;
a41: sh. w2   (f26.) ; rep: if w2>top point then
     jl.       a42.  ;   begin
     dl  w1  x2      ;     double segm(w2+displacement):=
b17=k+1; displacement;     double segm(w2);
     ds  w1  x2+0    ;
     al  w2  x2-4    ;     w2:=w2-4; goto rep
     jl.       a41.  ;   end;
a42: dl. w1    f26.  ; adjust moveable part:
     ba. w0    b17.  ;   w0:=point base:=point base+displacement;
     ba. w1    b17.  ;   w1:=top point:=top point+displacement;
     ds. w1    f26.  ;
     rl. w1    f14.  ;
     ba. w1    b17.  ;   w1:=last const:=last const+displacement;
     rs. w1    f14.  ;
     dl. w1    b41.  ;   w1:=saved w1;
     rs. w0   (f25.) ;   segment(last abs):=saved abs word;
     al. w2    c0.     ;   w2:=stepping stone;
     rl  w0  x2+e9+2-c0;
     ba. w0    1       ;   total moves:=pass inf 2:=total moves+1;
     rs  w0  x2+e9+2-c0;
     jl      x3        ;    return;

     0                 ;
b41: 0                 ; work for half up, half down, save w0-1
\f

                                                                

; rc  12.2.1971                           algol 6, pass 8, page ...29...

c36: rl. w2    f14.  ; store string:
     al  w2  x2+4    ;   w2:=const addr:=last const+4;
     jl.       a51.  ;   skip.
c13: rl. w2    b20.  ; const store: w2:=const addr;
a51: al  w1  x2      ;
     ws. w1    f23.  ;   w1:=rel const addr:=const addr-point base;
     sh. w2   (f14.) ;   if const addr<=last const then
     jl      x3      ;   return;
     rs. w3    b18.  ;   save return;
     rs. w2    f14.  ;   last const:=const addr;
     ba. w2    j0.   ;
     am.      (f7.)  ;
     sl  w2    +2    ;   if last const+w3 claim>top instr then
     jl. w3    a52.  ;   half up;
     dl. w0    f13.+2;   w3-0:=constant;
     rx. w1    f14.  ;   swop rel const addr, last const;
     rs  w0  x1      ;   segm(last const):=last of lit;
     bl. w2    f4.+1 ;
     sl  w2    4     ;   if opand rel=long lit then
     rs  w3  x1-2    ;   segm(last const-2):=first of lit;
     rx. w1    f14.  ;   swop last const, rel const addr;
     jl.      (b18.) ;   return;

a52: rl. w0   (f25.) ; half up: w1 saved, w3=return; w0:=segm(last abs);
     ds. w1    b41.  ;   save w0-1. prepare adjust moveable part.
     rl. w1    f14.  ;
     ws. w1    f7.   ;   w1:=claimed:=last const-top instr
     ba. w1    j0.   ;   +w3 claim;
     rs. w1    b20.  ;
     wa. w1    f25.  ;   w1:=-left on segment:=claimed+last abs
     ws. w1    f26.  ;   -top point;
     ls  w1    -2    ;
     ls  w1    1     ;   w1:=displacement:=(-left on segment)//4*2
     ws. w1    b20.  ;   -claimed;
     hs. w1    b17.  ;   set displacement;
     hs. w1    b21.  ;
     rl. w2    f26.  ;   w2:=top point;
a53: sl. w2   (f14.) ; rep: if w2>=last const then
     jl.       a42.  ;   goto adjust moveable part;
     al  w2  x2+2    ;   w2:=w2+2;
     rl  w1  x2      ;
b21=k+1; displacement;   segm(w2+displacement):=
     rs  w1  x2-0    ;   segm(w2);
     jl.       a53.  ;   goto rep;
\f

                                                                                                                                                                   
; rc  12.2.1971                            algol 6, pass 8, page ...30...

c16: rs. w3    b12.     ; chain app: w2=appetite, w3=return;
b34=k+1                 ;
     al  w0    0        ;   save return, common with w3 chain app.
     rl. w1    f15.     ;   w0:=ext no.; w1:=segment base;
a69: al  w1  x1+2       ; rep: w1:=abs word addr:=w1+2;
     bl  w3  x1         ;   w3:=left part of abs word;
     sh. w1   (f25.)    ;   if abs word addr<=last abs
     sn  w0  x3         ;   and ext no<>left part of abs word
     jl.       a68.     ;   then
     jl.       a69.     ;   goto rep;
a68: sh. w1   (f25.)    ;   if abs word addr>last abs then
     am        -2       ;
     al  w2  x2+2       ;   w2:=appetite:=w2+2;
     ls  w0    12       ;   w0:=new abs word:=ext no shift 12;
     ds. w1    b16.     ;   save abs word, abs word addr;
     jl.       c17.     ;   goto w3 chain app;

c20: ba. w2    j0.      ; test: w2=appetite, w3=return;
     wa. w2    f14.     ;   if appetite+w3 claim+last const
     ws. w2    f26.     ;
     wa. w2    f25.     ;   -(top point-last abs)
     sh. w2   (f7.)     ;   >top instr then return segment exceeded;
     jl      x3+2       ;   return appetite accepted;
     jl      x3         ;

c21: rs. w3    b24.     ; test and change: w2=appetite, w3=return;
     jl. w3    c20.     ;   save return; if test then
     jl.       a59.     ;   goto change;
     rl. w3    b24.     ;
     jl      x3+2       ;   return appetite accepted;
b24: 0                  ; saved return

c22: rs. w3    b24.     ; change segment: save return
a59: ds. w1    b25.     ; change: save w0-1;
     jl. w3    c41.     ;   clear w3;
     rl. w0    f17.     ;   fill unused points. w0:=dummy point. 1<23.
     rl. w1    f25.     ;   w1:=fill addr:=last abs;
a61: sl. w1   (f26.)    ; rep: if fill address<top point then
     jl.       a60.     ;   begin
     al  w1  x1+2       ;    fill addr:=fill addr+2;
     rs  w0  x1         ;    segment(fill addr):=dummy point;
     jl.       a61.     ;    goto rep
a60: rl. w1    f23.     ;   end;
     ws. w1    f15.     ;   ( used in load boolean)
     hs. w1    b27.     ;   rel point base:=point base-segment base;
     al  w1  x1-2       ;   segment byte(0):=point base-2-segment base;
     hs. w1   (f15.)    ;  

     rl. w1    f23.     ;   modify references from point to constants.
     al  w1  x1-23      ;   w1:=point base-23. w1 is the byte address
     al  w2    0        ;   corresponding to bit 22 of modifier table(0).
h.   al  w0 , bs w1 x3  ;
w.   jl. w3    a62.     ;   w2:=base of modifier table; w0:=add distance;
     2<12      +0       ;   modify, modifier table increment=2;
\f

                                                                                   

; jz 1979.09.13                           algol 8, pass 8, page ...31...

; modify references from instructions to moveable part

     rl. w1    f15.     ;
     al  w1  x1+503     ;   w1:=segment base+503. w1 is the byte address
     al  w2    44       ;   corresponding to bit 22 of modifier table(44).
h.   al  w0 , ba w1 x3  ;
w.   jl. w3    a62.     ;   w2:=last of modifier table; w0:=subtr dist;
     -2<12     +0       ;   modify, modifier table increment=-2;
; first part of modifier table was cleared in previous call (this is utili-
; sed for easy scan now). rest is cleared in this call.

     jl. w3    c44.     ;   store line inf;
     rl. w2    f15.     ;   w2:=segment base;
     rl. w1    f25.     ;   segment byte(1):=last abs-segment base;
     ws. w1    f15.     ;
     hs  w1  x2+1       ;
     rl. w1    f14.     ;
     ws. w1    f15.     ;   pass inf1:=pass inf1+last const-segment base;
     al. w3    c0.      ;   w3:=stepping stone to gpa;
     wa  w1  x3+e9-c0   ;
     rs  w1  x3+e9-c0   ;
     ac  w1  x2-2       ;
     wa. w1    f7.      ;   jump:=jump, top instr+2-segment base;
     hs. w1    f30.+1   ;
     jl.       c98.     ;   change out segment;
c97: rs. w3    f15.     ; after change: segment base:=w3;
     rl. w1    f28.     ;
     ld  w1    30       ;   double segment(506):=prev line shift(24+6);
     ds  w1  x3+e39-6   ;
j3=k+1; segment type, initially main program.
     al  w2    2        ;   double segment(510):=segment type;
     ds  w2  x3+e39-2   ;
     al  w0    3        ;   line inf shifts:=3;
     hs. w0    j1.      ;   w0=3, used in test uncondit jump, below.
     al  w1  x3+e39-2   ;   line alarm addr:=last on segment;
     rs. w1    f29.     ;
     al  w1  x3+e39-36  ;   line block:=last on segment-17 words;
     rs. w1    f27.     ;
b27=k+1; rel point base, initially 1/4 segment ;
     al  w1  x3+e39>2   ;   w1:=point base:=segment base+rel point base;
     al  w2  x1-2       ;   w2:=top point
     ds. w2    f26.     ;   :=last const:=point base-2;
     rs. w2    f14.     ;
     rs. w3    f25.     ;   last abs:=segment base;
     bl. w1    f24.     ;
     al  w1  x1-1       ;   current segment:=current segment-1;
     hs. w1    f24.     ;
     al  w1  x3+e39-10  ;   w1:=top instr:=last on segment-4 words;
     rs. w1    f7.      ;
j4=k+1; uncondit jump, initially true;
     sh  w0    3        ;   if 3>uncondit jump then
     jl.       a55.     ;   begin
     rl. w0    f30.     ;
     rs  w0  x1         ;    segment(top instr):=jump;
     al  w1  x1-2       ;    top instr:=top instr-2;
     rs. w1    f7.      ;
     rl. w0    f16.     ;
     jl. w3    c6.      ;    w3 abs appetite (1<23+1<12);
     jl. w3    c7.      ;    set w3 abs;

\f

                                         

; rc  12.2.1971                      algol 6, pass 8, page ...32...

a55: dl. w1    b25.     ;   end; reestablish w0-1;
     rl. w2    f17.     ;   segment(0):=1 shift 23;
     rs. w2   (f15.)    ;
     hs. w2    j4.      ;   uncondit jump:=false;
     jl.      (b24.)    ;   return;
     0                  ;
b25: 0                  ; saved w0-1.

a62: hs. w0    b29.     ; modify: bs ba:=w0; w2=modifier ind
a64: rs. w1    b28.     ; next pattern: segment addr:=w1;
a57: rl. w0  x2+g2.     ; normalize: w0:=modifier pattern:=
     sn  w0    0        ;   modifier table(modifier index);
     jl.       a63.     ;   if mod pattern<>0 then
     ns  w0  x3+1       ;   begin call1:=distance to next;
     la. w0    f31.     ;    modifier table(modifier index):=
     rs. w0  x2+g2.     ;    normalized pattern-bit 22;
b29: bs  w1  x3+1; or ba;    w1:=w1+-distance to next;
     bl  w0  x1         ;
     wa. w0    f23.     ;    segment byte(w1):=segment byte(w1)
      lo. w0  1         ;   + point base + 1 (if even);
     hs  w0  x1         ;    
     jl.       a57.     ;    goto normalize
a63: rl. w1    b28.     ;   end; w1:=segm addr;
     sh. w1   (f26.)    ;   if segm addr<=top point then
     jl      x3+2       ;   return;
     al  w1  x1-23      ;   w1:=segm addr:=segm addr-23;
     ba  w2  x3         ;   w2:=modifier index:=modifier index+call 0;
     jl.       a64.     ;   goto next pattern;
b28: 0                  ; segm addr


c28: ac  w1  x1+2       ; set point modifier: w1=rel point addr.
     jl.       a65.     ;   w1:=-(2+rel point addr); goto set;
c27: rl. w1    f7.      ; set modifier: w1:=top instr;
c87: ws. w1    f15.     ; set byte modifier: w1=top instr-1.
     al  w1  x1+26      ;   w1:=w1-segment base+26;
a65: al  w0    0        ; set: w0=bit position:=w1 mod 23;
     wd. w1    f32.     ;   w1:=modifier index:=w1//23*2;
     ls  w1    1        ;
     al  w2    1        ;
     ls  w2   (0)       ;   modifier table(modifier index)
     wa. w2  x1+g2.     ;   :=modifier table(modifier index)
     rs. w2  x1+g2.     ;   +1 shift bit position;
     jl      x3         ;   return;

; modifier table contains one bit for each byte on a segment, stored with
; 23 bits a word. the first part of the table corresponds to point bytes
; referencing constants, the second part to instructions referencing points
; and constants. bit=1 designates a byte to be modified with the final
; value of point base+1. the bits are allocated like this:
;           bit 22             bit 0
;     g2:  point base-23     point base-1
;     g2+2:point base-46     point base-24
;     g2+42:  480               458
;     g2+44:  503               481
\f

                                                                                

; rc  12.2.1971                        algol 6, pass 8, page ...33...

c.h8  b. b12,a2         ; if test mode then load:
w.
c43: al  w1  x1+2       ; instr print: return in f2, w0=instr, w1=addr-2.
     ws. w1    f15.     ;   w0:=rel address:=top instr+2-segment base;
     rx  w1    0        ;   w1:=instr;
     al. w2    c0.      ;   w2:=stepping stone to gpa;
     al  w3    10       ;
     rs  w3  x2+e42-c0   ;  print count:=10;
     jl  w3  x2+e16-c0   ;  print byte(rel address);
     bz. w0    f24.      ;
     jl  w3  x2+e14-c0   ;  write integer(current segm,
     32<12     +6        ;  blanks, max 6 positions);

     al  w3    0        ;
     al  w0  x1         ;   w0:=instr;
     ld  w0    6        ;   w3:=basic oparation part
     ls  w3    1        ;   *2;
     rl. w1  x3+b0.     ;
     rs. w1    b1.      ;   text1:=mnemonics(basic oparation part);
     al  w3    0        ;
     ld  w0    3        ;   w3:=w part and relative mark
     ls  w3    1        ;   *2;
     rl. w1  x3+b6.     ;
     rs. w1    b2.      ;   text 2:=w table(w3);
     rl. w1    b8.      ;
     sh  w0    -1       ;
     rl. w1    b9.      ;   end text:=if relative mark then
     rs. w1    b5.      ;   <:)nl:> else <:nl:>;
     al  w3    0        ;
     ld  w0    3        ;   w3:=indirect and xpart
     ls  w3    1        ;   *2;
     rl. w1  x3+b7.     ;
     rs. w1    b3.      ;   text3:=xtable(w3);
     rl. w1    b10.     ;   w1:=sign:=<:+:>;
     sl  w0    0        ;   if displacement<0 then
     jl.       a0.      ;   begin
     rl. w1    b11.     ;    w1:=sign:=<:-:>;
     ac  w0   (0)       ;    displacement:=-displacement
a0:  ls  w0    -12      ;   end;
     rs. w1    b4.      ;   text4:=sign;
     al. w1    b1.      ;
     jl  w3  x2+e13-c0  ;   writetext(text1 to 4);
     jl  w3  x2+e14-c0  ;   writeinteger(displacement,nuls,max 4 pos.);
     0<12      +4       ;
     al. w1    b5.      ;
     jl  w3  x2+e13-c0  ;   writetext(end text);
     jl.      (f2.)     ;   return;

b1:0,b2:0,b3:0,b4:0,b5:0       ; text 1,...text 4, end text
b6:<: w0.w0 w1.w1 w2.w2 w3.w3:>; w table
b7:<:    x1 x2 x3(  (x1(x2(x3:>; x table
b8:<: :>, b9: <:):>            ; end texts
b10:<:+:>  , b11:<:-:>         ; sign of displacement

b0: <: aw io bl hl la lo lx wa ws am wm al ml jl jd je:> ; mnemonics
    <: xl bs ba bz rl sp kl rs wd rx hs xs pl ps ms is:> ;
    <: ci ac ns nd as ad ls ld sh sl se sn so sz sx ic:> ;
    <: fa fs fm ks fd cf dl ds aa ss 58 59 60 61 62 63:> ;
e.z.                    ; end test mode
\f




; jz 1979.12.18                                algol 8, pass 8, page ...34...

; main control table 1.
;  each entry consists of: 12 bits called instr and usually used as the 
;  first part of a generated instruction, 6 bits called modifier, and
;  6 bits designating a central action. central actions with an even
;  number will interprete the preceeding table word afterwards, while
;  odd central actions will return to next in. the comment to the entry
;  describes the actual meaning of these 3 parts.

;    content of entry:                      meaning of:
; instr modif central action                instr      (modifier)
g1 = k + 1, h.
g0:
 c33.+4096,b5<6-b1<6+3;0 ,zone addressing: call zone addr(global zone entry)
 c30.+4096,b6<6-b1<6+3;2 ,local indirect:  call local ind(local ind,entry)
 c31.+4096,b7<6-b1<6+3;4 ,x1 addressing:   call x1 addr(x1 addr entry)
 c32.+4096,b4<6-b1<6+3;6 ,uv:              call uv(ext or uv entry)
 g84      ,0<6  +16;  8, string first:     cont g84, test(0)
 c38.+4096,4<6   +5; 10, string next:      input(4 bytes), call string next
 c37.+4096,4<6   +5; 12, long literal:     input(4 bytes), call literal(0)
 c37.+4096,2<6   +5; 14, med literal:      input(2 bytes), call literal(2)
 c37.+4096,1<6   +5; 16, short literal:    input(1 byte),  call literal(3)
 c40.+4096,2<6   +5; 18, zone base:        input(2 bytes), call zone base

 c45.+4096,      18; 20, beg block:        clear w3, call beg block
                   ;                       cont g3 or g4
 c46.+4096,      18; 22, beg proc:         clear w3, call beg proc.
                   ;                       cont g3 or g4
 g6       ,18<6 +20; 24, end block:        clear w3, cont g6, test(18)
 g7       ,18<6 +20; 26, end zone block:   clear w3, cont g7, test(18)
 rl w2 x2 ,11<6 +11; 28, exit block:       store instr+work(current block)
 jl.  ()  ,8<6   +9; 30, exit proc no type:store instr+rsentry(endaddrexpr)
 g8       ,24<6 +16; 32, exit type proc:   cont g8, test(24)
 c54.+4096,      19; 34, label colon:      clear w3, call define label

 bz w1    ,       1; 36, bz w1 opand       store opand+instr+0
 rl w1    ,0<6  +23; 38, rl(al) w1 opand   may be short lit(0)
 dl w1    ,       1; 40, dl w1 opand       store opand+instr+0
 g43      ,2<6  +16; 42, load point        cont g43, test(dummy)
 ba w1    ,       1; 44, ba w1 opand       store instr+opand+0
 wa w1    ,1<6  +23; 46, wa w1(al w1 x1)+opand  store instr+opand
 aa w1    ,       1; 48, aa w1 opand       store opand+instr+0
 fa w1    ,       1; 50, fa w1 opand       store opand+instr+0
 ws w1    ,2<6  +23; 52, ws w1(al w1 x1-)+opand  store opand+instr
 ss w1    ,       1; 54, ss w1 opand       store instr+opand+0
 fs w1    ,       1; 56, fs w1 opand       store opand+instr+0
 wm w1    ,       1; 58, wm w1 opand       store opand+instr+0
 fm w1    ,       1; 60, fm w1 opand       store opand+instr+0
 wd w1    ,       1; 62, wd w1 opand       store opand+instr+0
 fd w1    ,       1; 64, fd w1 opand       store opand+instr+0
 g9       ,22<6 +20; 66, long div          clear w3, cont g9, test(call)
 rl w1    ,0<6  +13; 68, mod               store instr+0
 g32      ,22<6 +20; 70, long mod          clear w3, cont g32, test(call)
 g31      ,22<6 +20; 72, long mult         clear w3, cont g31, test(call)
 hs w1    ,       1; 74, hs w1 opand       store opand+instr+0
 rs w1    ,       1; 76, rs w1 opand       store opand+instr+0
 ds w1    ,       1; 78, ds w1 opand       store opand+instr+0
 g11      ,4<6  +16; 80, abs int           cont g11, test(sh, ac w1)
 g10      ,10<6 +16; 82, abs long          cont g10, test(sl,jl.,ld,ss)
 g12      ,8<6  +16; 84, abs real          cont g12, test(sl,fm,-1.0)

\f

                                                                                                   

; rc 12.06.1975                            algol 6, pass 8, page ...35...

; main control table 2

 ac w1 x1 , 0<6 +13;  86, ac w1 x1        store instr+0
 ac w1    ,       7;  88, ac w1 addropand store addr opand+instr+0
 al w0    , 0<6 +13;  90, al w0 0         store instr+0
 la w1    , 0<6 +13;  92, la w1 0         store instr+0
 la w1    ,       1;  94, la w1 opand     store opand+instr+0
 lo w1    ,       1;  96, lo w1 opand     store opand+instr+0
 g91      , 6<6 +20;  98, lx w1 opand     clear w3, cont g91, test(se,lx)
 cf w1    , 0<6 +13; 100, cf w1 0         store instr+0
 ci w1    , 0<6 +13; 102, ci w1 0         store instr+0
 g76      ,22<6 +20; 104, float long      clear w3, cont g76, test(call)
 g88      ,22<6 +20; 106, long round      clear w3, cont g88, test(call)
 g13      , 2<6 +16; 108, shift short     cont g13, test(dummy)
 ls w1    ,       7; 110, ls w1 addropand store addr opand + instr + 0
 ld w1    ,       7; 112, ld w1 addropand store addr opand + instr + 0
 g14      , 2<6 +16; 114, create mask     cont g14, test(dummy)
 lo w0    , 2<6 +13; 116, lo w0 2         store instr+2
 al w0    ,       1; 118, prep uv op      store opand+instr+0
 g15      ,22<6 +20; 120, **integer       clear w3, cont g15, test(call)
 g16      ,22<6 +20; 122, **real          clear w3, cont g16, test(call)
 sh w1    ,      28; 124, sh w1 opand     skip opand(sh w1), cont g18-g21
 sl w1    ,      28; 126, sl w1 opand     skip opand(sl w1), cont g18-g21
 se w1    ,      28; 128, se w1 opand     skip opand(se w1), cont g18-g21
 sn w1    ,      28; 130, sn w1 opand     skip opand(sn w1), cont g18-g21
 sl w1    , 1<6 +34; 132, sl w1 1         skip direct(sl w1),cont g18-g21
 sh w1    ,-1<6 +34; 134, sh w1 -1        skip direct(sh w1),cont g18-g21
 sz w1    , 1<6 +34; 136, sz w1 1         skip direct(sz w1),cont g18-g21
 so w1    , 1<6 +34; 138, so w1 1         skip direct(so w1),cont g18-g21
 sn w0    , 0<6 +34; 140, sn w0 0         skip direct(sn w0),cont g18-g21
 se w0    , 0<6 +34; 142, se w0 0         skip direct(se w0),cont g18-g21
 sl w0    , 1<6 +34; 144, sl w0 1         skip direct(sl w0),cont g18-g21
 sl w0    , 0<6 +34; 146, sl w0 0         skip direct(sl w0),cont g18-g21
 sh w0    ,-1<6 +34; 148, sh w0 -1        skip direct(sh w0),cont g18-g21
 sh w0    , 0<6 +34; 150, sh w0 0         skip direct(sh w0),cont g18-g21
 sl w1    , 0<6 +34; 152, sl w1 0         skip direct(sl w1),cont g18-g21
 bl w0    , 2<6 +13; 154, bl w0 2         store instr+2
 bl w0    , 0<6 +13; 156, bl w0 0         store instr+0
 ld w1    ,f63<6+11; 158, shift long -65   store instr+work(=-65)
 g92      , 6<6 +20; 160, lx w0 opand     clear w3, cont g92, test(se,lx)
 c62.+4096, 0<6 + 3; 162, boolean         call set condition(0)
 c62.+4096, 2<6 + 3; 164, cond jump       call set condition(2)
 c62.+4096, 4<6 + 3; 166, cond bypass     call set condition(4)
 -6+1     , 2<6 +31; 168, bypass abs      test(2), jump(top-6), uncond. jump
 -4+1     , 2<6 +31; 170, do abs          test(2), jump(top-2), uncond. jump
 c66.+4096,       2; 172, take forlab     call take forlab, may continue g22
 c69.+4096,      19; 174, bypass label    clear w3, call stack point
 g23      , 2<6 +16; 176, goto bypass     cont g23, test(dummy)
 g24      , 0<6 +20; 178, end do          clear w3, cont g24, test(0)
 g25      , 0<6 +20; 180, end single do   clear w3, cont g25, test(0)
 c71.+4096,       3; 182, for,if          call unstack 3
 c72.+4096,       2; 184, step            call step, cont g26 or g27
 c73.+4096,       2; 186, test first      call test first, cont g28
 g29      , 0<6 +20; 188, else            clear w3, cont g29, test(0)
 g30      , 0<6 +20; 190, end else        clear w3, cont g30, test(0)
 jl  x3   ,      25; 192, goto local      store instr + ext chain
 g33      , 6<6 +16; 194, goto computed   cont g33, test(sl,jl,abs)

\f

                                                   

; rc 13.07.71                            algol 6, pass 8, page ...36...

; main control table 3

 g34      , 6<6 +20; 196, take formal     clear w3, cont g34,test(so,jl,abs)
 g35      , 6<6 +20; 198, take int value  clear w3, cont g35,test(rl,sz,cf)
 g36      , 6<6 +20; 200, take real value clear w3, cont g36,test(rl,so,ci)
 g38      , 2<6 +16; 202, take zone array cont g38, test(dummy)
 c75.+4096,      18; 204, take array      clear w3, call take array,cont g39
 g40      ,10<6 +48; 206, test index      cont g40, test(ls,sh,sh,jl,abs)
                   ;                      clear
 as w1    , 0<6 +13; 208, shift 0         store instr+modifier
 as w1    , 1<6 +13; 210, shift 1         store instr+modifier
 as w1    , 2<6 +13; 212, shift 2         store instr+modifier
 g41      , 8<6 +48; 214, test zone index cont g41, test(sh,sh,jl,abs)
                   ;                      clear
 g42      , 2<6 +20; 216, init zones      clear w3, cont g42, test(dummy)
 sh w1 () , 4<6 + 1; 218, record check    store opand+instr+4
 sh w1    , 0<6 +13; 220, record check 0  store instr+0
 sh w1    , 1<6 +13; 222, record check 1  store instr+0
 sh w1    , 3<6 +13; 224, record check 3  store instr+3
 g54      ,10<6 +48; 226, index alarm     cont g54, test(10), clear w3
 g61      , 2<6 +16; 228, field check     cont g61, test(dummy)
 sl w0 x1 , 0<6 +13; 230, field check 0   store instr+0
 sl w0 x1 ,-1<6 +13; 232, field check 1   store instr-1
 sl w0 x1 ,-3<6 +13; 234, field check 3   store instr-3
 g62      ,12<6 +48; 236, field alarm     cont g62, test(12), clear w3
 g44      , 2<6 +16; 238, load zone segm  cont g44, test(dummy)
 g45      , 2<6 +20; 240, reserve array   clear w3, cont g45, test(dummy)
 c78.+4096,      18; 242, stop            clear w3, call stop, cont g46
 e1. +4096,       3; 244, new line        call pass 0 carret
 c79.+4096,      19; 246, end pass        clear w3, call end pass
 c88.+4096, 4<6 + 5; 248, end external    input 4 bytes, call end external
 g47      , 0<6 +20; 250, end case lit    clear w3, cont g47, test(0)
 g48      , 0<6 +20; 252, end case var    clear w3, cont g48, test(0)
 g49      , 0<6 +20; 254, case lit        clear w3, cont g49, test(0)
 g50      , 0<6 +20; 256, case var        clear w3, cont g50, test(0)
 g55      ,26<6 +20; 258, of              clear w3, cont g55, test(lookup)
 g56      ,26<6 +20; 260, switch          clear w3, cont g56, test(lookup)
 g66      , 0<6 +20; 262, end call        clear w3, cont g66, test(0)
 c90.+4096,      18; 264, begin param     clear w3, call beg param
                   ;                      cont g64, g65
 g67      , 6<6 +20; 266, begin call      clear w3, cont g67, test(rl abs, ds)
 g68      ,10<6 +16; 268, test mult       test(sh,am,se,jl abs), cont g68
 c41.+4096,       3; 270, load w3         call clear w3
 g85      , 2<6 +16; 272, store base      cont g85, test(dummy)
 g86      , 2<6 +16; 274, get dope rel    cont g86, test(dummy)
 se w1    , 0<6 +13; 276, se w1 0         store instr+modifier
 se w0    , 0<6 +13; 278, se w0 0         store instr+modifier
 lo w1    , 0<6 +13; 280, lo w1 0          store instr+modifier
\f



; jz 1979.10.17                             algol 8, pass 8, page ...37...




 g69      ,20<6 +44; 282+ 0, end zone param end param(20+type), cont g69
 g70      ,      44;    + 2, end formal param : end param(dummy), cont g70
 g71      ,13<6 +44;    + 4, end zone array - : end param(13+type), cont g71
 g72      , 0<6 +44;    + 6, end proc       - : end param(0+type) , cont g72
 g72      , 8<6 +44;    + 8, end proc nopar - : end param(8+type) , cont g72
 g73      ,24<6 +44;    +10, end simple     - ; end param(24+type), cont g73
 g74      ,24<6 +44;    +12, end literal    - : end param(24+type), cont g74
 g75      ,24<6 +44;    +14, end label      - : end param(24+type), cont g75
 c92.+4096,       2;    +16, end array      - : call end array param,cont g69
 g77      ,20<6 +44;    +18, end zone expr  - : end param(20+type), cont g77
 g78      ,24<6 +44;    +20, end addr expr  - : end param(24+type), cont g78
 g79      ,24<6 +44;    +22, end value expr - : end param(24+type), cont g79
 c109.+4096,      2;    +24, end array field- : call end array field  param,contg87
 g80      , 8<6 +44;    +26, end subscr. expr-: end param(8+type) , cont g80
 g81      , 8<6 +44;    +28, end register exp-: end param(8+type) , cont g81
 g82      , 8<6 +44;    +30, end uv expr    - : end param(8+type) , cont g82
 g93      ,10<6 +20; 314   , disable activity, clear w3, test(se,jl,abs), cont g93
 g94      ,10<6 +20; 316   , enable activity , clear w3, test(se,jl,abs), cont g94
 g96      ,10<6 +20; 318   , long compare    , test(6),clearw3,cont g96

\f

                                                           

; jz 1979.12.18                 algol 8, pass 8, page ...38...

; continuation table 1. format as main control table. the name of a section
; of words is placed at the end of the section (interpretation proceeds
; upwards)

 c52.+4096,     +19; define proc entry:   clear w3,call define global
 al w1    ,2<6  +10; al w1+block app:     store instr+work(block app)
 jl.w3( ) ,3<6  +46; jl.w3(reserve):      clear w3+rs entry(reserve)
 al w0    ,8<6  +10; al w0 block no.:     store instr+work(block no.)
 ds w1 x1 ,9<6  +10; ds w1 x1-bl.app-2:   store instr+work(abs bl.app-2)
 al w0    ,0<6  +12; al w0 0              store instr+0
 rl.w3 () ,0<6  +52; rl.w3 (trapchain)    store instr + rsentry(param)
       91 ,0<6  +50; define param         param := 91
 ds w0 x1 ,7<6  +10; ds w0 x1+traplabel   store instr+work(copy to)
 k-g0     ,8<6  +20; test for al,rl.,ds   clear w3,continue next,test(8)
 c113.+4096,     +2;                      call adjust copy to
 rl w0 x2 ,5<6  +10; copy single word:    store instr+work(copy from)
 rs w0 x1 ,7<6  +10; copy single word:    store instr+work(copy to)
 c50.+4096,      +2;                      call end copy
 dl w0 x2 ,5<6  +10; copy double word:    store instr+work(copy from)
 ds w0 x1 ,7<6  +10; copy double word:    store instr+work(copy to)
 k-g0     ,4<6  +20; test for dl. ds :    clear w3, continue(next), test(4)
 c49.+4096,      +2;                      call begin copy
g5=k-g0            ; copy display
 rs w2 x1 ,6<6  +10; store old sref:      store instr+work(new displ elem)
 al w2 x1 ,3<6  +10; load new sref:       store instr+work(abs bl.app)
g3=k-2-g0          ; enter inner block
 g5       ,2<6  +16;                      cont(copy display),test(dummy)
 al w2 x1 ,3<6  +10; load new sref:       store instr+work(abs bl.app)
g4=k-2-g0          ; enter block-6

 c56.+4096,1<6   +5; stack block app:     input(1 byte),call end block
 rs.w2 ( ),13<6  +8; rs.w2 (last used):   store instr+rs entry(last used)
 jl.w3 ( ),10<6 +46; jl.w3(rel zones):    store instr+rs entry(rel zones)
 am  (x2) ,-4<6 +12; am  (x2-4)           store instr+modifier
 rl w1 x2 ,-2<6 +12; rl w1 x2-2           store instr+modifier
 rs.w1 () ,0<6  +52; rs.w1 (trapchain)    store instr+rs entry(param)
       91 ,0<6  +50; define param         param := 91
g7=k-g0            ; end zone block
g6=k-g0            ; end block

 dl w1 x2 ,      15; dl w1 x2+proc value: store instr
 c58.+4096,       2;                      call proc value
 jl.  ( ) ,6<6   +8; jl.(end regexpr):    store instr+rs entry(end reg expr)
g8=k-g0            ; exit type proc

 sl w0    ,0<6  +13; sl w0 0              store instr+0
 jl.      ,6<6  +12; jl.   6              store instr+6
 ld w1    ,f63<6+10; ld w1 -65            store instr-65 (work(f63))
 ss w1    ,0<6   +0; ss w1 opand          store instr+opand+0
g10=k-g0           ; abs long
 sh w1    ,-1<6 +13; sh w1 -1:            store instr-1
 ac w1 x1 ,0<6  +12; ac w1 x1:            store instr+0
g11=k-g0           ; abs int
 sh w0    ,-1<6 +13; sh w0 -1:            store instr-1
 fm w1    ,       0; fm w1 opand:         store opand+instr+0, opand=-1.0
g12=k-g0           ; abs real
 bz w1    ,3<6  +13; bz w1 3:             store instr+3
 ls w1    ,       6; ls w1 addr op:       store addr opand+instr
g13=k-g0           ; shift short
 al w0    ,0<6  +13; al w0 0:             store instr+0
 al w1    ,-1<6 +12; al w1 -1:            store instr-0
 ld w1    ,       6; ld w1 addr op:       store addr opand+instr
g14=k-g0           ; create mask
\f

                                                                           

; 3.3.1971                             algol 6, pass 8, page ...39...

; continuation table 2.

 al w1    ,       1; al w1 exponent:      store opand+instr+0
 ds.w1( ) ,12<6  +8; ds w1 (uv):          store instr+rs entry(uv)
g17=k-g0           ; continue from ** real,longdiv,longmod and longmult
 jl w3 x3 ,2<6  +26; jl w3 x3+**integ:    store instr+rs segm(**integ)
g15=k-g0           ; **integ
 g17      ,2<6  +16;                      continue g17, test(dummy)
 jl w3 x3 ,1<6  +26; jl  w3 x3+**real:    store instr+rs segm(**real)
g16=k-g0           ; **real
g21=k-g0           ; skip instr:
 0        ,  0     ; sh w1 addr opand, se w0 0, etc, inserted here
 0        ,  0     ; test(modif),jump(top-6) inserted here.
g20=k-2-g0         ; cond bypass
 -6       ,0<6  +30; total app added      test(total app),jump(top-6)
 g21+2    ,2<6  +16;                      cont g21, test(dummy)
 0        ,  0     ; test(modif),jump(top-2) inserted here
g19=k-2-g0         ; cond jump
 -2       ,0<6  +30; total app added      test(total app), jump(top-2)
 g21+2    ,2<6  +16;                      cont g21,test(dummy)
 am       ,1<6  +12; am 1                 store instr+modifier
 al w1    ,-1<6 +12; al w1 -1             store instr+modifier
 0        ,  0     ; cont next, test(modif) inserted here
g18=k-2-g0         ; boolean
 g18      ,0<6  +16; total app added, cont next, test(total app)

 rl.w0    ,      37; rl.w0 forlab segm: store instr+segment abs
 rl.w1    ,      32; rl.w1<jl x3+forlab rel>: store instr+const
 ds w1    ,       0; ds w1 forlab work: store opand+instr+0
g22=k-2-g0         ; forlab
 c48.+4096,       3; unstack point
 -2+1     ,2<6  +30; test(2), jump(top-2), unconditional jump
g23=k-g0           ; goto bypass

 c70.+4096,0<6   +3; stack 0               call stack modif(0)
 rl w3 ( ),-2<6  +0; rl w3 (x2+forlab work): store opand+instr-2
 jl       ,0<6   +0; jl    x2+forlab work: store opand+instr+0
 k-g0     ,4<6  +20;                       clear w3,cont next, test(rl.jl)
 c69.+4096,       2;                       call stack point
g24=k-g0           ; end do
 c69.+4096,       3; stack point
 rl w3( ) ,-2<6  +0; rl w3 (x2+forlab work):store opand+instr-2
 jl       ,0<6   +0; jl     x2+forlab work:store opand+instr+0
 k-g0     ,4<6  +20;                       clear w3,cont next, test(rl,jl)
 c69.+4096,       2;                       call stack point
g25=k-g0           ; end single do
 0        ,2<6  +31;                       test(2),jump(top+0)
g26=k-2-g0         ; constant step:
 al w1    ,1<6  +13;                       store instr+modifier
 rs w1 x2 ,0<6  +10;                       store instr+work(0)
g27=k-2-g0         ; variabel step
\f

                                                                                                                      

; jz 1979.03.22                           algol 8, pass 8, page ...40...

; continuation table 3

 al w1    ,0<6  +13; al w1 0              store instr+modifier
 rx w1    ,0<6   +0; rx w1 x2+var step     store opand+instr+0
g28=k-2-g0         ; test first

 bl w0    ,2<6  +13; bl w0 2               store instr+2
 bl w0    ,0<6  +12; bl w0 0               store instr+0
g51=k-2-g0         ; convert int to long   continue from else, case comma

 ci w1    ,0<6  +13; ci w1 0               store instr+0
g52=k-2-g0         ; convert int to real   continue from else, case comma

 jl w3 x3 ,46<6 +27; jl w3 x3+floatlong     store instr+rssegm(floatlong)
 k-g0     ,8<6  +20;                       clear w3, test(8), cont next
g53=k-2-g0         ; convert long to real  continue from else, case comma

 c74.+4096,-5<6  +2; test top-5, may continue with g53,g52,g51 or terminate
 -4       ,2<6  +30;                       test(2), jump(top-4)
 c69.+4096,       2; stack new else        call stack point
 c48.+4096,       2; unstack else label    call unstack
g29=k-g0           ; else

 c74.+4096,-5<6  +3; test top-5, may continue with g53,g52,g51 or terminate
 c69.+4096,       2; stack else label      call stack point
 c69.+4096,       2; stack end else label  call stack point
 c82.+4096,       2; stack(total type)     call stack inbyte
g30=k-g0           ; end else

 sl w0    ,1<6  +13; sl w0 1               store instr+modifier
 jl.w3 () ,11<6  +8; jl. (goto computed)   store instr+rs entry(goto comp)
g33=k-g0           ; goto computed
 dl w1    ,0<6   +1; dl w1 formals         store opand+instr+0
 so w0    ,16<6 +12; so w0 16              store instr+modifier
 jl.w3 ( ),4<6   +8; jl. w3 (take expr):   store instr+rs entry(take expr)
g34=k-g0           ; take formal
 dl w1 x1 ,0<6  +13; dl w1 x1              store instr+modifier
 rl w3    ,-2<6  +0; rl w3 formal-2        store opand+instr-2
g37=k-g0           ; cont take real value
 sz w3    ,1<6  +12; sz w3 1               store instr+modifier
 cf w1    ,0<6  +12; cf w1 0               store instr+modifier
g35=k-g0           ; take int value
 g37      ,2<6  +16;                       cont take real value,test(dummy)
 so w3    ,1<6  +12; so w3 1               store instr+modifier
 ci w1    ,0<6  +12; ci w1 0               store instr+modifier
g36=k-g0           ; take real value
 bl w1    ,-1<6  +1; bl w1 opand-1         store opand+instr-1
 rs w1    ,-2<6  +0; rs w1 opand-2         store opand+instr-2
g38=k-g0           ; take zone array
 rl w3 x1 ,0<6  +13; rl w3 x1              store instr+modifier
 rs w3 x2 ,6<6  +10; rs w3 x2+dope rel-4:  store instr+work6
 k-g0     ,4<6  +20;                       clear w3, cont next, test(rl,rs)
 ba w1    ,0<6  +12; ba w1 0               store instr+modifier
 rl w0 x1 ,5<6  +10; copy single word      store instr+work(copy from)
 rs w0 x2 ,7<6  +10; copy single word      store instr+work(copy to)
 c50.+4096,       2;                       call end copy
 dl w0 x1 ,5<6  +10; copy double word      store instr+work(copy from)
 ds w0 x2 ,7<6  +10; copy double word      store work(copy to)
 k-g0     ,4<6  +20;                       clear w3, cont next, test(dl,ds)
g39=k-g0           ; copy dope vector
\f

                                                                                                                      

; rc 3.3.1971                        algol 6, pass 8, page ...41...

; continuation table 4

 sh w1 ( ),-2<6  +1; sh w1 (opand-2):      store opand+instr-2
 sh w1 ( ),0<6   +0; sh w1 (opand):        store opand+instr+0
 jl.w3 ( ),17<6  +8; jl.w3 (index):        store instr+rs entry(index)
g40=k-g0           ; test index
 sh w1 ( ),-2<6  +1; sh w1 (opand-2)       store opand+instr-2
 sh w1    ,0<6  +12; sh w1 0               store instr+modifier
 jl.w3 ( ),18<6  +8; jl.w3 (zone):         store instr+rs entry(zone)
g41=k-g0           ; test zone index
 ds w1 ( ),12<6  +9; ds w1(uv)             store instr+rs entry(uv)
 rl.w1    ,9<6  +38; rl.w1 init zones      store instr+ext point(initzones)
 jl.w3 ( ),4<6   +8; jl.w3(take expr)      store instr+rs entry(take expr)
g42=k-g0           ; init zones
 rl w0 x2 ,      41; rl w0 x2+block or al w0 x2: store instr+sref
 rl.w1    ,0<6  +38; rl.w1 point of opand: store instr+ext point(0)
g43=k-g0           ; load point
 al w0    ,15<6 +11; al w0 no of zones     store instr+work(last of const)
 c2.+4096 ,1<6   +4;                       input(no of zones), call dummy
 al w1    ,0<6   +0; al w1 base of zones:  store opand+instr+0
g44=k-g0           ; load zone segm
 jl.w3 ( ),28<6 +47; jl.w3 (res array):    clear w3+rs entry(res array)
 rs w1 x2 ,-2<6 +12; rs w1 x2-2            store instr+modifier
g45=k-g0           ; reserve array
 jl.w3 ( ),20<6  +9; jl.w3 (stop)          store instr+rs entry(stop)
g46=k-2-g0         ; stop

 c81.+4096,       3; stack, convert lit    call case elem lit
 c82.+4096,       2; stack(total type)     call stack inbyte
 c69.+4096,       2; stack end case        call stack point
g47=k-g0           ; end case lit

 c74.+4096,-7<6  +2; test top-7, may continue with g51,g52,g53 or term.
 c83.+4096,0<6   +2; stack(0,dummy,dummy)  call stack 3
 c82.+4096,       2; stack(total type)     call stack inbyte
 c69.+4096,       2; stack end case        call stack point
g48=k-g0           ; end case var

 c81.+4096,       3; stack, convert lit    call case elem lit
 c80.+4096,       2;                       call begin case elem
g49=k-g0           ; case comma lit

 c74.+4096,-7<6  +2; test top-7, may continue with g51,g52,g53 or term.
 c83.+4096,0<6   +2; stack(0,dummy,dummy)  call stack 3
 -4+1     ,2<6  +30; test(2), jump(top-4)  unconditional jump
 c80.+4096,       2;                       call begin case elem
g50=k-g0           ; case comma var

\f

                                                                             

; jz 1979.06.08                         algol 8, pass 8, page ...42...

; continue table 5.

 sl w1    ,5<6  +11; sl w1 no.of elements+1:store instr+work(5)
g57=k-g0           ; constant for begin case list
 jl.w3 ( ),19<6  +8; jl.w3 (case):         store instr+rs entry(19)
 k-g0     ,6<6  +16;                       cont next,test(sl,jl abs)
 c85.+4096,       2; call first case look-up, cont g59
 c80.+4096,       2;                       call begin case element
g55=k-g0           ; of
 al w0    ,0<6  +13; al w0 0:              store instr+modifier
 sl w1    ,1<6  +12; sl w1 1:              store instr+modifier
 sl w1    ,5<6  +10; sl w1 no.of elements+1:store instr+work(5)
 0        ,6<6  +30; jl end case:          test(sl,sl,jl), jump(top+0)
 c85.+4096,       2; call first case look-up, cont g59
 c80.+4096,       2;                       call begin case element
g56=k-g0           ; of switch
 c86.+4096,       2; call end case look-up, may cont g59
 sh w1    ,3<6  +10; sh w1 index limit for segment: store instr+work(3)
g58=k-g0           ;
 0        ,       0; jl. end of segm or jl. w3(case) inserted here
 bl.w1 x1 ,7<6  +10; bl.w1 x1+list base:  store instr+work(7)
 sl w1    ,0<6  +12; sl w1 0:              store instr+modifier
 jl.   x1 ,0<6  +12; jl.  x1:              store instr+modifier
 dl.w1 x1 ,-2<6 +12; dl.w1 x1-2:           store instr+modifier
 k-g0     ,0<6  +20;                       clear w3, cont next, test(dummy)
 0        ,2<6  +30; jl end case:          test(dummy),jump(top+0)
g59=k-2-g0         ; look-up suite

 c69.+4096,      19; stack bypass:         clear w3,call stack point
 dl w1    ,       0; dl w1 formal:         store opand+instr
 jl.   ( ),5<6   +8; jl.(goto point):      store instr+rs entry(5)
g63=k-g0           ; call formal proc
 c69.+4096,      19; stack bypass:         clear w3,call stack point
 rl w2 x2 ,      40; rl w2 x2+block:       store instr+sref
 jl    x3 ,      24; jump to proc:         store instr+ext chain
 c89.+4096,2<6   +4;                       input 2 bytes, call end call
 c69.+4096,       2; stack return point:   call stack point
g66=k-g0           ; end call
 
 al  w0   ,0<6  +13; al  w0  0             store instr + modif
 rl. w1 (),0<6  +52; rl. w1 (rsentry param) store instr+rs entry(param)
 se  w1   ,0<6  +12; se  w1  0             store instr + modif
 jl. w3 (),4<6   +8; jl. w3 (take expr)    store instr+rs entry(modif)
g95=k-g0           ; disable/enable
 
      90  ,0<6  +50; define param          param := 90
g94=k-g0           ; enable
 
     g95  ,2<6  +16;                       continue next,test(dummy)
     89   ,0<6  +50; define param          param := 89
g93=k-g0           ; disable
 
\f



; rc 3.3.1971                              algol 6, pass 8, page ...43...

; continue table 6.

 c69.+4096,      19; define bypass         clear w3,call stack point
 c48.+4096,       2;                       call unstack
g65=k-2-g0         ; define bypass
 rl.w0    ,      42; rl.w0 thunk point:    store instr+latest point
 k-g0     ,4<6  +16;                       cont next,test(point+instr)
 al w3 x2 ,0<6  +12; al w3 x2              store instr+0
 ls w3    ,4<6  +12; ls w3  4              store instr+4
 al w3 x3 ,2<6  +10; al w3 x3+kind+type:   store instr+work 2
 c94.+4096,8<6   +2; ds w0 x1+formal:      call store formal(app=8)
 -2+1     ,2<6  +30; jl  bypass     :      test(dummy), jump(top-2),uncondit
 c52.+4096,       2; define thunk   :      call define global
g64=k-2-g0         ; thunk parameter
 al w1    ,5<6  +11; al w1 call app:       store instr+work5
 jl.w3 ( ),3<6  +46; jl.w3 (reserve):      clear w3+rs entry 3
 rs w2 x1 ,0<6  +12; rs w2 x1:             store instr+0
 rl.w0    ,      32; rl.w0 <-app-6,rel>:   store instr+constant
 rl.w3    ,      36; rl.w3 return segm:    store instr+segment abs
 ds w0 x1 ,5<6  +12; ds w0 x1+5:           store instr+5
 c91.+4096,       2;                       call begin call
g67=  k-g0         ; begin call

 sh w1    ,-1<6 +13; sh w1 -1:             store instr-1
 am       ,-1<6 +12; am    -1:             store instr-1
 se w0    ,0<6  +12; se w0 0:              store instr+0
 jl.w3 ( ),25<6  +8; jl.w3 (mult alarm):   store instr+rs entry 25
g68=k-g0           ; test mult

 al w0    ,0<6   +1; al w0 opand:          store opand+instr+0
 c107.+4096,0<6  +2; call restore opand rel
 rl.w3    ,      32; rl.w3 <dope,kind>:    store instr+constant
 c94.+4096,6<6   +2; ds w0 x1+formal:      call storeformal(app=4+constant)
g69=k-g0           ; simple zone param, array param
 dl w0    ,0<6   +1; dl w0 opand:          store opand+instr+0
 c94.+4096,6<6   +2; ds w0 x1+formal:      call storeformal(app=4+w3 claim)
g70=k-g0           ; formal param
 dl w0    ,0<6   +1; dl w0 opand:          store opand+instr+0
 ls w3    ,12<6 +12; ls w3 12:             store instr+12
 al w3 x3 , 9<6 +10; al w3 x3+kind:        store instr+work 9
 c94.+4096,10<6  +2; ds w0 x1+formal:      call storeformal(app=8+w3 claim)
g71=k-g0           ; zone array param
 rl.w0    ,0<6  +39; rl.w0 ext point:      store instr+ext point(opand)
 rl w3 x2 ,      40; rl w3 x2+block:       store instr+sref
 ls w3    ,4<6  +12; ls w3 4:              store instr+4
 al w3 x3 , 9<6 +10; al w3 x3+kind:        store instr+work 9
 c94.+4096,8<6   +2; ds w0 x1+formal:      call store formal (app=8)
g72=k-g0           ; procedure param
 al w0    ,0<6   +1; al w0 opand:          store opand+instr
 al w3    , 9<6 +10; al w3 kind:           store instr+work 9
 c94.+4096,4<6   +2; ds w0 x1+formal:      call store formal (app=4)
g73=k-g0           ; simple param
 dl w0    ,0<6   +1; dl w0 opand:          store opand+instr
 c95.+4096,8<6   +2; ds w0 x1+literal:     call store lit(app=4+constant)
 al w0 x1 ,2<6  +10; al w0 x1+literal:     store instr+work2
 al w3    , 9<6 +10; al w3 kind:           store instr+work 9
 c94.+4096,4<6   +2; ds w0 x1+formal:      call store formal (app=4)
g74=k-g0           ; literal param
\f

                                                                           

; jz 1979.09.14                          algol 8, pass 8, page ...44...

; continuation table 7

 rl.w0    ,0<6  +39; rl.w0 ext point:      store instr+ext point(opand)
 rl w3 x2 ,      40; rl w3 x2+block:       store instr+sref
 c95.+4096,4<6   +2; ds w0+literal:        call store literal (app=4)
 al w0 x1 ,2<6  +10; al w0 x1+literal:     store instr+work 2
 al w3    , 9<6 +10; al w3 kind:           store instr+work 9
 c94.+4096,4<6   +2; ds w0 x1+formal:      call store formal(app=4)
g75=k-g0           ; label param
 al w0 x1 ,0<6  +13; al w0 x1 :            store instr+0
 rl.w1 ( ),13<6  +8; rl.w1 (last used):    store instr+rs entry13
 rl.w3    ,      32; rl.w3 <6,kind>:       store instr+constant
 c94.+4096,6<6   +2; ds w0 x1+formal:      call storeformal(app=4+constant)
g77=k-g0           ; zone expr param
 al w0 x1 ,0<6  +13; al w0 x1:             store instr+0
 rl.w1 ( ),13<6  +8; rl.w1 (last used):    store instr+rs entry 13
 al w3    , 9<6 +10; al w3 kind :          store instr+work 9
 c94.+4096,4<6   +2; ds w0 x1+formal:      call store formal (app=4)
g78=k-g0           ; addr expr param
 rl w3    ,0<6  +13; rl w3 0:              store instr+0
 al w0 x1 ,0<6  +12; al w0 x1:             store instr+0
 rl.w1 ( ),13<6  +8; rl.w1 (last used):    store instr+rs entry 13
 c95.+4096,10<6  +2; ds w0 x1+literal:     call store literal (app=8+abs)
 al w0 x1 ,2<6  +10; al w0 x1+literal:     store instr+work2
 al w3    , 9<6 +10; al w3 kind:           store instr+work 9
 c94.+4096,4<6   +2; ds w0 x1+formal:      call store formal (app=4)
g79=k-g0           ; value expr param

 al w1    ,-1<6 +13; al w1 -1 :            store instr-1
 rl.w0    ,      14; rl.w0 string point:   store instr
 c27.+4096,       2;                       call set modifier
 c39.+4096,4<6   +4; input(4 bytes), call string first
g84=k-g0           ; string first

 al w0    ,-10<6+13; al w0 cause:          store instr-10
 jl.w3 ( ),21<6  +8; jl.w3 (alarm):        store instr+rs entry 21
g83=k-g0           ; end run
 lx w1    , 0<6   +1; lx w1 opand:          store opand+instr
g91=k-g0            ; xorw1, may be preceded by se w1
 lx w0    , 0<6   +1; lx w0 opand:          store opand+instr
g92=k-g0            ; xorw0, may be preceded by se w0 or w1
 
 al w3    , 0<6   +1; al w3 opand           store instr+opand
 lx w0 x3 ,-2<6  +12; lx w0 x3-2            store instr-2
 lx w1 x3 , 0<6  +12; lx w1 x3              store instr
g96=k-g0            ; long compare
\f

                                                                                 

; jz 1979.12.18                             algol 8, pass 8, page ...45...

; continue table 8.

 jl w3 x3  ,46<6 +27; jl. w3 (floatlong)    store instr+rssegm(floatlong)
g76=k-g0            ; float long
 jl w3 x3  ,43<6 +27; jl. w3 (longround)    store instr+rssegm(longround)
g88=k-g0            ; long round
 g17       ,2<6  +16;                       continue g17, test(dummy)
 jl w3 x3  ,55<6 +26; jl w3 x3+longmult     store instr+rssegm(longmult)
g31=k-g0            ; long mult
 g17       ,2<6  +16;                       continue g17, test(dummy)
 jl w3 x3  ,44<6 +26; jl w3 x3+longmod      store instr+rssegm(longmod)
g32=k-g0            ; long mod
 g17       ,2<6  +16;                       continue g17, test(dummy)
 jl w3 x3  ,56<6 +26; jl w3 x3+longdiv      store instr+rssegm(longdiv)
g9=k-g0             ; long div

 jl.w3 ( ) ,17<6  +9; jl. w3 (indexalarm)   store instr+rsentry 17
g54=k-g0            ; index alarm
 jl.w3 ( ) ,54<6  +9; jl. w3 (fieldalarm)   store instr+rsentry 54
g62=k-g0            ; field alarm
 rl w0     ,2<6   +1; rl w0 opand           store opand+instr+2
 sh w1 ( ) ,-2<6  +0; sh w1 (opand-2)       store opand+instr-2
g61=k-g0            ; field check

 rl w0     ,0<6   +1; rl w0 arraybase       store opand+instr+0
 wa w0     ,2<6  +12; wa w0 2               store instr+2
 rl.w1 ( ) ,13<6  +8; rl. w1 (last used)    store instr+rsentry 13
 c95.+4096 ,2<6   +2; ds w0 x1+literal      call store literal (app=2)
g85=k-g0            ; store base

 al w3 x1  ,2<6  +11; al w3 x1+literal      store instr+work(2)
 al w0 x3  ,-4<6 +12; al w0 x3-4            store instr - 4
 rl.w3     ,      32; rl. w3 <2,kind>       store instr+constant
 c94.+4096 ,10<6  +2; ds w0 x1+formal       call store formal (app=8+cons)
 k-g0      ,      20;                       clear w3, cont next, test(0)
 dl w0     ,0<6   +0; dl w0 dope            store opand+instr+0
g86=k-g0            ; get dope rel

 ws w3     ,0<6   +1; ws w3 field           store opand+instr+0
 ws w0     ,0<6   +0; ws w0 field           store opand+instr+0
 rx w3     ,0<6  +12; rx w3 0               store instr+modif
 al w3 x3  ,f65<6+10; al w3 x3+<typel.-1>   store instr+work f65
 as w3     ,f64<6+10; as w3 <-log2(typel.)> store instr+work f64
 as w3     ,f66<6+10; as w3 <log2(typel.)>  store instr+work f66
 rx w3     ,0<6  +12; rx w3 0               store instr+modif
 c95.+4096 ,22<6  +2; ds w0 x1+literal      call store literal (app=22)
g87=k-g0            ; store bounds

 jl.   ( ),8<6    +9; jl.  (end addr expr): store instr+rsentry 8
g80=k-g0            ; subscr expr
 jl.   ( ),6<6    +9; jl. (end reg expr):   store instr+rsentry 6
g81=k-g0            ; reg expr
jl.    ( ),7<6    +9; jl. (end uv expr):    store instr+rsentry 7
g82=k-g0            ; uv expr

g2=k                ; modifier table, g2 to g2+44
g60=g2+46           ; first element of stack
\f

                                                                   
; rc  12.2.1971                              algol 6, pass 8, page ...46...

; initialisation of pass 8.
w.   a0=k-1900          ;   define stepping stone
c100:al. w1    a0.      ; entry pass 8: via stepping stone c99.
     jl  w3  x1+e2-a0   ;   w1:=stepping stone;
     rs  w2  x1+f10-a0  ;   no.of exts:=inbyte(no of std procs);
     rl  w3  x1+e9+4-a0 ;   w3:=last work for pass;
     rs  w2  x3         ;   no. of catalog exts:=no of std procs;
     rl  w0  x1+f17-a0  ;
     rs  w0  x3-8       ;   entry point:=1 shift 23; segment 0.
     ls  w0    -9       ;
     rs  w0  x3-2       ;   item kind:=4,0;
     al  w0    0        ;   kind and spec:=0; normal program.
     rs  w0  x3-6       ;
     wm. w2    b40.     ;   w2:=first std proc:=
     al  w1  x3-12      ;   no of std procs*(-12)+last work-12;
     wa  w2    2        ;   w1:=last work-12;
     rs. w2    b40.     ;
     sh. w2    b40.     ;   if first std proc<=last of pass 8 then
     jl.       a91.     ;   goto stack alarm;

b. f10, b2  w.          ; compute date and clock
     rs. w1    b1.      ;   save w1;
     jd      1<11+36    ;   w0-1:=get clock;
     nd  w1    3        ;   w0-1:=secs:=
     fd. w1    f8.      ;   fix(float(clock)/10 000);
     bl  w2    3        ;
     ad  w1  x2-47      ;

     wd. w1    f6.      ;   w1:=day:=secs//(60*60*24);
     al  w3    0        ;   w3-0:=secs:=secs mod (60*60*24);
     wd. w0    f1.      ;   w3-0:=minutes:=secs//60;
     ld  w3    24       ;   w2:=second:=secs mod 60;
     wd. w0    f1.      ;   w0:=hour:=minutes//60;
     rs. w3    b0.      ;   work0:=minute:=minutes mod 60;
     wm. w0    f2.      ;
     wa. w0    b0.      ;
     wm. w0    f2.      ;
     wa  w0    4        ;   w0:=clock:=(hour*100+minute)*100+second;
     am.      (b1.)     ;
     rs  w0   +2        ;   core(last work-10):=clock;
\f


                                                         
; rc  1976.06.29                     algol 6, pass 8, page ...47...

     ld  w1    26       ;
     wa. w0    f7.      ;
     al  w3    0        ;   w0:=year:=(days*4+99111)//1461;
     wd. w0    f4.      ;   w3:=days:=((days*4+99111)mod 1461)//4;
     as  w3    -2       ;
     wm. w3    f0.      ;
     al  w3  x3+461     ;
     wd. w3    f3.      ;   w3:=month:=(days*5 + 461)//153;
     al  w1  x2+5       ;   w1:=day:=(days*5 + 461)mod 153 + 5;
     sl  w3  13        ;   if month>13 then
     al  w3  x3+88     ;   month:=month-twelvemonth+oneyear;
     wm. w3  f2.       ;   month:=month*100;
     rx  w2  0         ;   
     wd. w1  f0.       ;   day:=day//5;
     wa  w3  2         ;   date:=day+month;
     wm. w2  f5.       ;   year:=year*10000;
     wa  w3  4         ;   date:=date+year;
     rl. w1    b1.      ;
     rs  w3  x1         ;   reestablish w1; core(last work-12):=date;
     jl.       a92.     ;   continue

f0:            5        ;
f1:           60        ;
f2:          100        ;
f3:          153        ;
f4:         1461        ;
f5:        10000        ;
f6:        86400        ;   60*60*24
f7:        99111        ; to adjust for 1.1.68 being start date
           10000<9      ;
f8:   4096+14-47        ; 10000*2**(-47) as floating point number
b0:            0        ; work0, saved minute
b1:            0        ; saved w1
e.                      ; end date and clock

\f


; rc 14.06.72                              algol 6, pass 8, page ...48...

a92: am.       a0.      ; rep:
     jl  w3    e2-a0    ;   inbyte;
     sh. w1   (b40.)    ;   if w1>first std proc then
     jl.       a93.     ;   begin
     al  w1  x1-1       ;    w1:=w1-1;
     hs  w2  x1         ;    std proc suite:=byte read;
     jl.       a92.     ;    goto rep;
a93: al. w1    a0.      ;   end;  w1:=stepping stone;
     am    (x1+e9+4-a0) ;
     hs  w2    +0       ;   no.of points:=byte read;
     al  w0    -2       ;
     wa. w0    b40.     ;   last global:=first std proc-2;
     rs  w0  x1+f62-a0  ;
     ac  w3  x2+1       ;
     ls  w3    1        ;   global base:=-(no of points+1)*2
     wa. w3    b40.     ;   + first std proc;
     rs  w3  x1+f33-a0  ;
     wa  w2  x1+f10-a0  ;   no.of exts:=no.of exts+no.of points;
     rs  w2  x1+f10-a0  ;
     al. w0    g0.      ;   main table base:=abs address;
     rs  w0  x1+f40-a0  ;
     al. w0    g60.     ;   stack top:=abs address;
     rs  w0  x1+f35-a0  ;
     rl  w0  x1+e6-a0   ;   prev line:=line count;
     rs  w0  x1+f28-a0  ;
     rl  w0  x1+e17-a0  ;   w0:=mode bits;
     al  w2    c4-j5+1  ;
     sz  w0    1<6      ;   if integer overflow then
     hs  w2  x1+j5-a0   ;   int overflow:=store opand;
     al  w0    0        ;
     al. w2    g2.      ;
a94: rs  w0  x2         ;   clear modifier table;
     al  w2  x2+2       ;
     sh. w2    g2.+44   ;
     jl.       a94.     ;
     al  w2  x1+c2-a0   ;
     rs. w2    b24.     ;   return from change segment:=interprete next;
     jl      x1+c101-a0 ;   goto in change out segment;
a91: am        c90-c41  ;
     al. w2    c41.     ; stack alarm:
     al  w1  x2+e10-c90 ;   w1:=addr of <:stack:>;
     jl      x2+e5-c90  ;   goto alarm;
b40: -12                ;
     h10=k-e0           ;   h10=no of bytes in pass
e30=e30+h10
i.  ; id list
e.                          ; end pass 8
m. jz 1979.12.18 algol 8, pass 8
\f

▶EOF◀