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

⟦334e40f2b⟧ TextFile

    Length: 65280 (0xff00)
    Types: TextFile
    Names: »ass31tx     «

Derivation

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

TextFile

\f



m.                slang text 1
b. g4
d.
p.<:fpnames:>
l.
m.                slang text 1
m.rc 1985.03.28

s.k=10000,j44,i37,g82,e63,d12,c56
; use of slang names:
;   a  local labels
;   b  local variables and constants
;   c  constants
;   d  labels
;   e  procedures
;   f  assembly variables
;   g  variables
;   h  fp-names
;   i  control variables
;   j  code modifications
; control variables:
  i0=-1                 ; local listing = true
  i1=20                 ; standard work area size
c. h57 < 3 ; if system 3 then
  i1=1<1+1              ;   standard work area size, and -device
z.
t.

; variables 1
w.g63:  i11             ; length         ; current word
                                         ; g64 and g65 used together
  g64:  d7.             ; entry:         ; current word addr
  g65:  am.  (-2)       ;   goto init;   ; last word addr
  g34:  jl.   -4                         ; source
  g36:  0               ; slang generated name
  g37:  0               ; segments
        2<12+4          ; content=2, entry=4
  g38:  0               ; bytes
  g39:  0,r.4           ; source chain
  g40:  -1              ; inblock addr-2
  g41:  -1              ; outblock addr
  g46:  -1              ; saved size
  g43:  0,r.4           ; result name

w.                      ; xref zone descriptor:

        0,r.5           ; z+h0+0:  base buffer area
                        ; z+h0+2:  last of buffer
                        ; z+h0+4:  used share
                        ; z+h0+6:  first share (=g71)
                        ; z+h0+8:  last share  (=g71)

        i1              ; z+h1+0:  std sortarea size (in system 2)
        0,r.8           ; z+h1+2:  document name
                        ; z+h1+10: name table address
                        ; z+h1+12: file count (not used)
                        ; z+h1+14: block count
                        ; z+h1+16: segment count

        0,r.4           ; z+h2+0:  give up mask (=0)
                        ; z+h2+2:  give up action
                        ; z+h2+4:  partial word
                        ; z+h2+6:  free parameter (=saved record base)

  g70:  -1,r.3          ; z+h3+0:  record base (=-1, if not used...)
                        ; z+h3+2:  last byte
                        ; z+h3+4:  record length
                        ; z+h3+6:  free parameter (omitted)

                        ; users parameters (omitted)

h.g71:  0,r.h6,w.       ; s+0:     state
                        ; s+2:     first shared (=d8)
                        ; s+4:     last shared
                        ; s+6:     latest message
                        ; s+22:    top transferred


; procedure outsegment;
; comment: outputs a slang segment by means of the fp
;   outblock procedure.
;       call:           exit:
; w0                    destroyed
; w1    seg addr        destroyed
; w2    prog top        destroyed
; w3    return          destroyed;
b.b5,a4
w.                      ; outsegment zone descriptor:

        0,r.5           ; z+h0+0:  base buffer area
                        ; z+h0+2:  last of buffer
                        ; z+h0+4:  used share
                        ; z+h0+6:  first share
                        ; z+h0+8:  last share

        0,r.9           ; z+h1+0:  1<11 + mode, kind
                        ; z+h1+2:  document name
                        ; z+h1+10: name addr
                        ; z+h1+12: file count
                        ; z+h1+14: block count
                        ; z+h1+16: segment count

        0,r.4           ; z+h2+0:  give up mask
                        ; z+h2+2:  give up action
                        ; z+h2+4:  partial word
                        ; z+h2+6:  free parameter (=buffer addr)

  g35:  0,r.3           ; z+h3+0:  record base
                        ; z+h3+2:  last byte
                        ; z+h3+4:  record length
                        ; z+h3+6:  free parameter (omitted)

                        ; users parameters (omitted)

h.      0,r.h6          ; s+0:     state
                        ; s+2:     first shared
                        ; s+4:     last shared
                        ; s+6:     latest message
                        ; s+22:    top transferred

w.b0:   0               ; saved prog top
  b1:   0               ; saved return
  b2:   0               ; next out
  b3:   0               ; base
  b4:   0               ; saved seg addr
  b5:   1               ; outsize
  e0:   ds.w3 b1.       ; begin
        rs.w1 b4.
        rl.w0 b2.       ;   if tape version then
;       jl.   j20-e0-4  ;     goto tape version;
        ws w1 0
        rs.w1 b3.       ;   base:= seg addr-next out;
        sh w0 0         ;   if next out<=0 then
        jl.   a2.       ;     goto test more;
        rl.w2 g35.+h2+6 ;   first shared:= buffer addr;
        rs.w2 g35.+6+2
        al w3 x2+510    ;   last addr of transfer:=
        rs.w3 g35.+6+10 ;       first shared+510;

; test if it is nescesarry to output the xref buffer...
        al.w1 g70.      ; save xref buffer:
        rl w3 x1+h3+0   ;   save xref record base;
        rs w3 x1+h2+6   ;
        sl.w3(g71.+2)   ;   if record base >= first shared then
        jl.w3(g41.)     ;     outblock;

        al.w1 g35.
        al w3 -1
        wa.w3 g35.+h1+16;   segment count:=
        rs.w3 g35.+h1+16;       segment count-1;
        rl.w3 g40.
        jl w3 x3+2      ;   inblock;
        al w3 -1
        wa.w3 g35.+h1+16;   segment count:=
        rs.w3 g35.+h1+16;       segment count-1;
        rl.w3 b0.
        ws.w3 b3.
        sl w3 514       ;   limit:= min(prog top
        al w3 512       ;       -base,512);
        al w3 x3-2      ;   limit:= limit-2;
        hs.w3 a1.
        rl.w1 b3.
        rl.w2 b2.
        rl.w3 g35.+6+2
  a0:   al w2 x2+2      ; again:
        am    x2-2      ;   next out:= next out+2;
        rl w0 x1+0
        am    x2-2      ;   word(first shared+next out-2):=
        rs w0 x3+0      ;       word(base+next out-2);
  a1=k+1
        sh w2;limit     ;   if next out<=limit then
        jl.   a0.       ;     goto again;
        al w1 x1+512    ;   base:= base+512;
        rs.w1 b3.
        al.w1 g35.
        jl.w3(g41.)     ;   outblock;
        al w3 510
        la w2 6         ;   next out:= next out
        rs.w2 b2.       ;       and 510;

; test if the xref buffer is to be reestablished...
        rl.w0 g70.+h2+6 ; restore xref buffer:
        sn.w0(g70.+h3+0);   if record base <> saved record base then
        jl.   a2.       ;     begin
        rl.w2 g70.+h1+16;     segment count := segment count - 1;
        al w2 x2-1      ;
        rs.w2 g70.+h1+16;
        al.w1 g70.      ;
        am.  (g40.)     ;     inblock(xref zone);
        jl w3 +2        ;     reset segment count;
        rs.w0 g70.+h3+0 ;     record base := saved record base;
        rs.w2 g70.+h1+16;     end;

  a2:   rl.w2 b0.       ; test more:
        rl.w1 b3.
        sh w2 x1+0      ;   if prog top<=base then
        jl.   a4.       ;     goto exit;
        ws w2 2         ;   first shared:= base;
        al w2 x2+510    ;   outsize:= (prog top
        ls w2 -9        ;       -base+510)//512;
c. h57 < 2 ; if system 2 then include the following:
        rl.w3 g46.
        ws.w3 g35.+h1+16;   room:= saved size-segment count;
        sh w2 x3+0      ;   if outsize>room then
        jl.   a3.       ;     begin
        rl.w0 g46.      ;       bytes:= saved size
        ls w0 9         ;           *512-prog top
        ws.w0 b0.       ;           +seg addr;
        wa.w0 b4.
        rs.w0 g38.
        al w2 x3+0      ;       outsize:= room;
        al.w3 c1.
        rl w0 x3+i14    ;       kill outsegment;
        rs.w0 e0.       ;       write error return(
        al w0 x3+i22    ;           <:program too big:>)
        jl w3 x3+i21    ;     end;
z.         ; end system 2;
  a3:   rs.w2 b5.
        ls w2 9         ;   last addr of transfer:= base
        wa w2 2         ;       +outsize*512-2;
                        ;   goto outblock;
  j20:  al w3 x2-2      ; tape version:
        rs.w1 g35.+6+2  ;   first shared:= seg addr;
        rs.w3 g35.+6+4  ;   last shared:= prog top-2;
        rs.w3 g35.+6+10 ;   last addr of transfer:= prog top-2;
        al.w1 g35.      ; outblock:
        sl.w3(g35.+6+2) ;   if last addr of transfer>=first shared then
        jl.w3(g41.)     ;     outblock;
        rl.w3 b0.
        ws.w3 b3.
        al w0 510       ;   next out:=
        la w0 6         ;       (prog top-base)
        rs.w0 b2.       ;       and 510;
  a4:   rl.w2 b0.       ; exit:
        ws.w2 b4.
        wa.w2 g38.      ;   bytes:= bytes
        rs.w2 g38.      ;       +prog top-seg addr;
        rl.w2 b5.
        se w2 0         ;   if outsize<>0 then
        am    1
        al w2 0
        wa.w2 g37.      ;     segments:= segments+1;
        rs.w2 g37.
        jl.  (b1.)      ; end outsegment;
  j21:  jl.   j20-e0-4
c.i0i.z.
e.

b.b2,a7
w.b0:   -1              ; saved w3
  b1:   -1              ; saved w3
  b2:   -1              ; saved w0

; procedure stack in(current chain);
; comment: sets chain to current chain and continues with e32;
w.e38:  am    -2

; procedure stack in(chain);
; comment: uses the corresponding fp procedure.
;       call:           exit:
; w0                    destroyed
; w1                    in descr
; w2    chain
; w3    return          destroyed;
w.e32:  al w0 h29-2     ; begin
        al w1 1
        wa.w0 g52.
        rs.w0 b0.
        al w0 -1        ;   record base:=
        aa.w1 g65.      ;       current word addr-1;
        am.  (g52.)     ;   last byte:=
        ds w1 h20+h3+2  ;       last word addr+1;
        rl.w1 g63.      ;   partial word:= current word;
        am.  (g52.)
        rs w1 h20+h2+4  ;   stack input(chain)
        jl.  (b0.)      ; end;

; procedure init in;
; comment: initialises the variables for character reading.
;       call:           exit:
; w0                    0
; w1    in descr
; w2                    destroyed
; w3    return          destroyed;
w.e37:  al w0 0         ; begin
        rs.w3 b0.       ;   result:= 0;
  a3:   dl w3 x1+h3+2   ;   save(return);
        al w2 x2+1      ;   current word addr:=
        al w3 x3-1      ;       record base+1;
        ds.w3 g65.      ;   last word addr:=
        rl w3 x1+h2+4   ;       last byte-1;
        sn w3 0         ;   if partial word=0 then
        al w3 1         ;     partial word:= 1;
        rs.w3 g63.      ;   current word:= partial word;
        rl w3 x1+h1
        am.   c1.
        se w3(i18)
        am    -2        ;   typewriter medium:=
        rl.w3 j14.      ;       kind=8;
        rs.w3 j13.
  a0:   sn w0 0         ; check result:
        jl.  (b0.)      ;   if result=0 then
        rl.w0 j12.      ;     goto exit;
        rs.w0 e5.       ;   end source list:= true;
        al w0 2
        hs.w0 j27.      ;   kill write end source;
        al.w2 c1.       ;
        rl w1 x2+i25    ;   write term file(
                        ;       <:connect :>,
        al w0 x2+i10    ;       <source file>);
                        ; exit:
        jl    x2+i21    ; end;

; procedure select n input;
; comment:
;       call:           exit:
; w0                    0
; w1                    in descr
; w2                    destroyed
; w3    return;
w.e1:   rs.w3 b1.       ; begin
        am.   c1.
        rl w0 i15
        se w0 0         ;   if normal then
        jl    x3+0      ;     goto exit;
        jl.w3 e38.      ;   stack in(current chain);
        al.w2 g39.      ;   normal:= true;
        al w0 -1        ;   goto unstack;
                        ; exit:
        jl.   a1.       ; end;

; procedure select t input;
; comment:
;       call:           exit:
; w0                    0
; w1                    in descr
; w2                    destroyed
; w3    return;
w.e2:   rs.w3 b1.       ; begin
        al.w1 c1.
        rl w0 x1+i15
        sn w0 0         ;   if -,normal then
        jl    x3+0      ;     goto exit;

        rl w0 x1+i24   ;
        am.  (g52.)     ;   if procedure source then
        sn w0(+h20+h2+6);     goto exit;
        jl    x3+0      ;

        al w0 x1+i20
        jl w3 x1+i21    ;   write error return(<:type :>);
        rl.w1 g41.      ;   outend(null);
        jl w3 x1+h59-h23;
        al.w2 g39.
        jl.w3 e32.      ;   stack in(source chain);
        al w0 0         ;   normal:= false;
  a1:   am.   c1.       ; unstack:
        rs w0 i15
        rl.w3 b1.       ;   if normal then
        se w0 0         ;     unstack in(source chain)
                        ;   else unstack in(current chain);
                        ;   init in;
        am    2         ; exit:

; procedure unstack current chain
;       call:           exit:
; w0                    0
; w1                    in descr
; w2                    destroyed
; w3    return          destroyed
w.e62:  am    h30-h27-2 ; end;

; connect in(medium);
; comment: uses the corresponding fp procedure and init in.
;       call:           exit:
; w0                    0
; w1                    in descr
; w2    name addr       destroyed
; w3    return          destroyed;
w.a6:   al w1 h27-2
        al w0 0         ;   result := 0;
        rs.w3 b0.
        am.  (g52.)
        jl w3 x1+0
        jl.   a3.

b. f3 w.
e36: al  w0  0          ;  entry from procsource
a5:  rs. w0  f1.        ; entry from source:  save file
     rs. w3  b0.        ;   save w3
     rs. w2  f2.        ;   save w2
     am.     (g52.)     ;
     al  w1  h54        ;   w1:=tail addr
     al  w3  x2         ;   w3:=name addr
     jd       1<11+42   ;   lookup
     se  w0  0          ;
     jl.     a7.        ;   if not found then alarm
     al  w2  x1         ;   w2:=tail addr
     rl  w0  x1         ;
     sl   w0  0         ;   if size>0 then
     jl.      f3.       ;   goto exit;
     rl. w0  f1.
     wa  w0  x2+12      ;   filecount:=filecount+file;
     rs  w0  x2+12      ;
     rl. w3  b0.        ;    restore w3
     jl.     a6.        ;   goto connect in
f1:  0
f2:  0
f3:  rl. w2  f2.         ;   restore w2
     rl. w3  b0.         ;   restore w3
     jl.    a6.          ;   goto connect
a7:  al. w2  c1.        ;
     rl  w1  x2+i25     ;   w1:=source addr
     al  w0  x2+i30     ;   w0:=<:source unknown:>
     jl      x2+i21     ;   goto alarm
e.

; procedure select next source(empty);
; comment: connects the next item in the source list. if the
;   list is empty, the procedure next symbol is modified to
;   deliver an infinite number of <z.>s and <e.>s and the
;   procedure returns to empty.
;       call:           exit:           empty:
; w0
; w1                    destroyed       destroyed
; w2                    source          10
; w3    return          destroyed       6;
w.b.f1
w.f0:   1<15            ; list.on == true
  f1:   -1-1<15-1<7     ; mask for removing markbits from sourcename
w.e16:  rs.w0 b1.       ; begin
        rs.w3 b2.
        al w1 x3+0
        rl.w2 g34.      ;   save(return);
        am    2047
        rs.w2 i34.      ;   source name := source;
        bl w3 x2+0
        sh w3 15        ;   if byte(source)<=15 then
        jl.   a2.       ;     goto end source list;
        rl.w3 g52.
        jl w3 x3+h79-4  ;   terminate zone(current input);

        rl w1 x2        ;   if list-on-off mode then
        so w1 1<7       ;     begin
        jl.   a4.       ;     comment in the first word of
                        ;       sourcename bit 1<7 and 1<15 are
                        ;       special bits ... see initialization;
        sz.w1(f0.)      ;     list := saved list :=
        am    4         ;       if list.on then true 
        am    2047
        rl.w3 i26.       ;       else false;
        am    2047
        rs.w3 i27.      ;
        rs.w3 j11.      ;
        la.w1 f1.       ;     remove markbits from sourcename;
        rs w1 x2        ;     end;
e.

  a4:   rl  w0  x2+8      ;   w0:=file;
      jl.w3 a5.      ;   connect in(source);
        dl.w1 b2.       ;   restore(return);
        al w2 10
        wa.w2 g34.      ;   source:= source+1;
        rs.w2 g34.
        jl    x1+2      ;   goto exit;
  a2:   rl.w2 j12.      ; end source list:
        rs.w2 e5.       ;   insert end generator;
        rl.w2 j15.      ;   end source list:= true;
        rs.w2 g44.      ;   intext:= false;
        am    2047
        jl.w3 i37.      ;   if list then
        al w0 0         ;     writeaddr;
        am.   c1.       ;   char state:= 0;
        rs w0 i8        ;   delim state:= 0;
        al w2 10        ;   symbol:= nl;
        al w3 14        ;   symbol type:= end line;
        jl    x1+0      ;   goto empty
c.i0i.z.                ; exit:
e.                      ; end;

; procedure next symbol;
; comment:
;       call:           exit:
; w0
; w1    return
; w2                    symbol
; w3                    symbol type
b.b8,a7
w.e5:   rl.w3 g63.      ; begin
;       jl.   a1-e5     ;   if end source list then
                        ;     goto end generation;
        sn.w3(b4.)      ;   if current word=end word then
        jl.   a3.       ;     goto next word;
        al w2 0         ;   symbol:= current word(0:7);
        ld w3 8         ;   current word:= current word shift 8;
  a2:   rs.w3 g63.      ; return word:
  a0:   bl.w3 x2+d0.    ; look up: symbol type := char table(symbol);

        sn w3 14        ;   if symbol type = <newline> then
        jl.   a7.       ;     goto newline;
        sl w2 33        ;   if grafic symbol then
        sl w2 126       ;     grafic := true;
        jl.   j11.      ;
        hs.w3 5         ;
        jl.   j11.      ;   goto test line;
  a7:   sn w3 14;grafic ; newline: if <newline> and last char was
        jl.   j11.      ;     grafic then
        hs.w3 a7.+1     ;     begin
        am    2047
        rx.w1 i29.      ;
        al w1 x1+1      ;     lineno := lineno + 1;
        am    2047
        rx.w1 i29.      ;     save (lineno);

; here may be inserted any test on linenumber or k-value,
; controlling e.g. listing or xref...

  j11:  jl    x1+0      ; test line:
;       am    0         ;   if -,list then
        ds.w0 b0.       ;     goto exit;
  i7:   jl.w3 e13.;2    ;   if empty line then
        al w0 x2+0      ;     writeaddr;
        sn w2 10
        jl.   a6.       ;   if symbol<>25
        se w2 25        ;       and symbol<>10 then
        jl.w3 e9.       ;     writechar(symbol);
        se w2 12        ;
  j29:  am    i4
  a6:   al w0 i5        ;   empty line:= symbol=10 or symbol=12;
        hs.w0 i7.+1
        dl.w0 b0.       ;   goto exit;
        jl    x1+0
  j12:  jl.   2-e5.
  a1:   rl.w3 b5.       ; end generation:
        se w3 46        ;   delivers alternating
        jl.   8         ;       <z.> and <e.>;
        dl.w3 b6.
        rx w3 4
        ds.w3 b6.
        dl.w3 b1.
        rx w3 4
        ds.w3 b1.
        jl.   a0.       ;   goto look up;
        -1              ; saved w3
  b0:   -1              ; saved w3 and saved w0
  b5:   46              ; <.>
  b1:   101             ; <e>
  b6:   122             ; <z>
  b2:   -1              ; saved w1
  b3:   24<16+24<8+24   ; cancel characters
  b8:   <:cancel<0>:>
  b4:   1<16            ; end word
  b7:   1<23+1<15+1<7
  a3:   rl.w3 g64.      ; next word:
        sl.w3(g65.)     ;   if current word addr
        jl.   a4.       ;       >=last word addr then
        al w3 x3+2      ;     goto next block;
        rs.w3 g64.      ;   current word addr:=
        rl w3 x3+0      ;       current word addr+2;
        sz.w3(b7.)      ;   if any char>127 then
        jl.   a5.       ;     goto no text;
        al w2 0         ;   symbol:= current word(0:7);
        ld w3 8         ;   current word:= current word
        al w3 x3+1      ;       shift 8+1;
        jl.   a2.       ;   goto return word;
  a4:   rs.w1 b2.       ; next block:
        jl.w3(g40.)     ;   save(w1);
        dl w3 x1+h3+2   ;   inblock;
        al w2 x2-1      ;   current word addr:=
        al w3 x3-1      ;       record base-1;
        ds.w3 g65.      ;   last word addr:=
        rl.w1 b2.       ;       last byte-1;
  j13:  jl.   a3.       ;   restore(w1);
;       rl w3 x3+0      ;   if typewriter medium then
        lx.w3 b3.       ;     begin
        sz w3 255       ;       word:= word(last word addr);
        ls w3 -8        ;       if word(16:23)=24
        sz w3 255       ;           or word(8:15)=24
        ls w3 -8        ;           or word(0:7)=24 then
        sz w3 255       ;         begin
        jl.   a3.       ;           write warn(<:cancel:>);
        rs.w0 b0.       ;           goto next block
        al.w0 b8.       ;         end
        jl.w3 e15.      ;     end;
        rl.w0 b0.       ;   goto next word;
        jl.   a4.
  a5:   rl.w1 g34.      ; no text:
        al w1 x1-8      ;   write term file(
        al.w2 c1.       ;       <:no text :>,
        al w0 x2+i23    ;       <source file>)
        jl.   e15.
        jl.   a3-j13    ; exit:
  j14:  rl w3 x3+0      ; end;
c.i0i.z.
e.

; end slang
b.a9,b1
w.b0:   10<12
  b1:   25<16+25<8+1    ; end medium characters
  d6:   al.w1 g35.
        rl.w2 g52.
        al w0 0
  j25:  am    0         ;   if output connected then
;       jl w3 x2+h79    ;     terminate zone(file mark);
        jl.w3 e1.       ;   select n input;
        rl.w3 g52.
        al w0 -1
  j24:  jl w3 x3+h79-4  ;   if source list then
;       am    0         ;     terminate zone(current input);
                        ;   record base:=
        al w1 1         ;       current word addr-1;
        aa.w1 g65.      ;   last byte:=
        rl.w2 g52.      ;       last word addr+1;
        ds w1 x2+h20+h3+2
        rl.w1 g63.      ;   partial word:= current word;
        rl.w0 e5.
        se.w0(j12.)     ;   if end source list then
        jl.   10        ;     begin
        rl.w1 b1.       ;       partial word:=
        am.   c1.       ;           em characters;
        al w0 i17       ;       if write end source not killed then
  j27=k+1               ;         write error return(
        jl.w3 e15.      ;           <:end source:>)
;       jl.w3 2
        rs w1 x2+h20+h2+4
                        ;     end;
  j22:  jl.   a1.       ;   if entry.no  then
;       am    0         ;     goto out;
c. h57 < 2 ; if system 2 then include the following:
        dl.w1 g38.
        am.   c1.
        rl w3 i19
        sn w3 -1        ;   if fp note then
        jl.   a3.       ;     begin
        ds w1 x3+20     ;       fp note(18:20):=
        rl.w0 g36.      ;           (2.4,bytes);
        sn w0 0         ;       if slang generated name then
        jl.   a1.       ;         begin
        rl.w2 g38.      ;           fp note(2):=
        al w2 x2+510    ;               (bytes+510)//512;
        ls w2 -9
        rx w2 x3+2      ;           change entry(document name);
        al w1 x3+2
        al w3 x3+4      ;           fp note(2):= bs
        jd    1<11+44   ;         end
        rs w2 x3-2      ;     end
        jl.   a2.       ;   else
z.         ; end system 2;
  a3:   al.w3 g43.      ;     begin
        al.w1 g35.   
        jd    1<11+42   ;       lookup entry(result name);
        dl  w0  110
        ld  w0  5
        rs  w3  x1+10   ;   tail(10):=shortclock;
        dl.w3 g38.
        ds w3 x1+18     ;       tail(16:18):= (2.4,bytes);
        al.w3 g43.      ;       change entry(result name)
  a2:   jd    1<11+44   ;     end;

c. h57 < 3 ; if system 3 then include the following:
        al.w3 g35.+h1+2 ;   if <outfile> is backing storage then
        jd    1<11+42   ;     reduce the area to the used size;
        rl.w0 g35.+h1+16;
        rs w0 x1
        bz.w0 g35.+h1+1
        sn w0 4
        jd    1<11+44
z.         ; end system 3;

  a1:   am.   c1.       ; out:
        rl w2 i6
        sn w2 0         ;   if error or warn then
        jl.   a4.       ;     writetext(<:<10>***slang sorry:>)
        am    2047
        al.w0 i35.
        jl.w3 e11.      ;   else if warning.yes then
        jl.   a5.       ;     writetext(<:<10>slang ok:>);
  a4:   bl.w0 j19.      ;   <*warning.no => warn and error untouched and no of errors = 0*>
        sz w0 2.1
        jl.   a7.
        am    4
  a5:   am    2047
        al.w0 i36.
        jl.w3 e11.

        am    2047
        rl.w0 i31.      ;   if no of error messages > 0 then
        se w0 0         ;
        jl.w3 e17.      ;     writeinteger1(no of error messages);

  a7:   al.w3 g35.+h1+2 ;   if slang generated name
        la.w2 g36.      ;       and error
        sz w2 2.1       ;       and remove.yes then
  j23:  jd    1<11+48   ;     remove entry(document name);
;       am    0
c. h57 < 2 ; if system 2 then include the following:
        rl.w2 g37.
        sn w2 0
        sn.w2(g36.)     ;   if slang generated name
        jl.   4         ;       and segments=0 then
        jd    1<11+48   ;     remove entry(document name);
        am.   c1.
        rl w1 i19       ;   if fpnote then
        sn w1 -1        ;     begin
        jl.   a6.
        al.w1 d0.
        jd    1<11+42   ;       lookup entry(document name);
        se w0 3
        jl.   a6.       ;       if result=3 then
        al w0 0         ;         fpnote(4):= 0
        am.   c1.
        rl w1 i19       ;     end;
        rs w0 x1+4
z.         ; end system 2;
  a6:   jl.w3 e3.       ;   writechar(bl);
        rl.w0 g37.
        jl.w3 e10.      ;   writeinteger(segments);
        al w0 47
        jl.w3 e9.       ;   writechar(/);
        rl.w0 g38.
        jl.w3 e10.      ;   writeinteger(bytes);
        al w0 47
        jl.w3 e9.       ;   writechar(/);
        al w0 510
        wa.w0 g38.
        ls w0 -9
        jl.w3 e10.      ;   writeinteger((bytes+510)//512);
        jl.w3 e4.       ;   writechar(nl);

        am    2047
        rl.w0 i32.      ;   if no of xref records > 0 then
        sn w0 0         ;     begin
        jl.   a0.       ;     comment: prepare a call of the
        rl.w2 g52.      ;       output-program, slangxref, like this:
        rl w3 x2+h8     ;       slangxref <xref area> <no of recs>;
  a8:   ba w3 x3+1      ;   upspace fp stack pointer;
        bl w1 x3+0      ;     upspace stack to end list
        sn w1 -4        ;     or next command line;
        jl.   a9.       ;
        sz w1 -3        ;
        jl.   a8.       ;
  a9:   al w3 x3-26     ;     stack := stack-26;
        rs w3 x2+h8     ;     stack := stack-26;
        rs w0 x3+24     ;     stack(24) := no of xref records;
        dl.w1 c51.      ;     stack(0:2) := (2<12+2,2<12+10);
        ds w1 x3+2      ;
        dl.w1 c53.      ;     stack(4:10) := <:slangxref:>;
        ds w1 x3+6      ;
        dl.w1 c54.      ;
        ds w1 x3+10     ;
        rl.w1 c52.      ;     stack(12) := 4<12+10;
        rs w1 x3+12     ;
        hl w1 2         ;     stack(22) := 4<12+4;
        rs w1 x3+22     ;
        dl.w1 g70.+h1+4 ;     stack(14:20) := <xref area name>;
        ds w1 x3+16     ;
        dl.w1 g70.+h1+8 ;
        ds w1 x3+20     ;

        al.w1 g70.      ;     if record base >= first shared then
        rl w3 x1+h3+0   ;
        sl.w3(g71.+2)   ;       outblock(xref zone);
        jl.w3(g41.)     ;     end;

  a0:   al w2 3         ;   w2 := warning, error;
        am    2047
        la.w2 i33.      ;
        rl.w1 g52.
        jl w3 x1+h7     ;   end program;
c.i0i.z.
e.

; tables

; char table
; in the table below each character is described by a byte
; giving the character type.
; input: iso value
; output: character type
                        ; value    graph    type
h.d0:   8               ;    0      nul     blind
        12              ;    1      soh     illegal
        12              ;    2      stx     illegal
        12              ;    3      etx     illegal
        12              ;    4      eot     illegal
        12              ;    5      enq     illegal
        12              ;    6      ack     illegal
        12              ;    7      bel     illegal
        12              ;    8       bs     illegal
        8               ;    9       ht     blind
        14              ;   10       nl     end line
        14              ;   11       vt     end line
        14              ;   12       ff     end line
        8               ;   13       cr     blind
        12              ;   14       so     illegal
        12              ;   15       si     illegal
        12              ;   16      dle     illegal
        12              ;   17      dc1     illegal
        12              ;   18      dc2     illegal
        12              ;   19      dc3     illegal
        12              ;   20      dc4     illegal
        12              ;   21      nak     illegal
        12              ;   22      syn     illegal
        12              ;   23      etb     illegal
        12              ;   24      can     illegal
        13              ;   25       em     end medium
        12              ;   26      sub     illegal
        12              ;   27      esc     illegal
        12              ;   28       fs     illegal
        12              ;   29       gs     illegal
        12              ;   30       rs     illegal
        12              ;   31       us     illegal
        7               ;   32       bl     blank
        4               ;   33       !      special
        4               ;   34       "      special
        4               ;   35       #      special
        4               ;   36       $      special
        4               ;   37       %      special
        4               ;   38       &      special
  j28:  11              ;   39       '      exponent
        9               ;   40       (      left par
        7               ;   41       )      blank
        4               ;   42       *      special
        3               ;   43       +      sign
        4               ;   44       ,      special
        3               ;   45       -      sign
        2               ;   46       .      point
        4               ;   47       /      special
        1               ;   48       0      digit
        1               ;   49       1      digit
        1               ;   50       2      digit
        1               ;   51       3      digit
        1               ;   52       4      digit
        1               ;   53       5      digit
        1               ;   54       6      digit
        1               ;   55       7      digit
        1               ;   56       8      digit
        1               ;   57       9      digit
        10              ;   58       :      colon
        6               ;   59       ;      semicolon
        5               ;   60       <      less gr
        4               ;   61       =      special
        5               ;   62       >      less gr
        4               ;   63       ?      special
        4               ;   64       @      special
        0               ;   65       a      letter
        0               ;   66       b      letter
        0               ;   67       c      letter
        0               ;   68       d      letter
        0               ;   69       e      letter
        0               ;   70       f      letter
        0               ;   71       g      letter
        0               ;   72       h      letter
        0               ;   73       i      letter
        0               ;   74       j      letter
        0               ;   75       k      letter
        0               ;   76       l      letter
        0               ;   77       m      letter
        0               ;   78       n      letter
        0               ;   79       o      letter
        0               ;   80       p      letter
        0               ;   81       q      letter
        0               ;   82       r      letter
        0               ;   83       s      letter
        0               ;   84       t      letter
        0               ;   85       u      letter
        0               ;   86       v      letter
        0               ;   87       w      letter
        0               ;   88       x      letter
        0               ;   89       y      letter
        0               ;   90       z      letter
        0               ;   91       æ      letter
        0               ;   92       ø      letter
        0               ;   93       å      letter
        4               ;   94       ^      special
        4               ;   95       _      special
        4               ;   96       `      special
        0               ;   97       a      letter
        0               ;   98       b      letter
        0               ;   99       c      letter
        0               ;  100       d      letter
        0               ;  101       e      letter
        0               ;  102       f      letter
        0               ;  103       g      letter
        0               ;  104       h      letter
        0               ;  105       i      letter
        0               ;  106       j      letter
        0               ;  107       k      letter
        0               ;  108       l      letter
        0               ;  109       m      letter
        0               ;  110       n      letter
        0               ;  111       o      letter
        0               ;  112       p      letter
        0               ;  113       q      letter
        0               ;  114       r      letter
        0               ;  115       s      letter
        0               ;  116       t      letter
        0               ;  117       u      letter
        0               ;  118       v      letter
        0               ;  119       w      letter
        0               ;  120       x      letter
        0               ;  121       y      letter
        0               ;  122       z      letter
        0               ;  123       æ      letter
        0               ;  124       ø      letter
        0               ;  125       å      letter
        4               ;  126       ü      special
        8               ;  127      del     blind

c.d0.+128-1m.char table short
z.
c.-d0.-128-1m.char table long
z.

b.f42                   ; begin f names for next char and next delim

; char matrix
; the transition matrix below contains a byte for each combination
; of the char state and the symbol type. the byte is an address of
; a working action. the meaning of the char states are:
;   0: start
;   1: after letter
;   2: after digit
;   3: after less
;   4: after left par
;   5: after colon
; table look-up: the character type is used to select an entry in
; the matrix. the entry contains one byte for each state value.
b.a14
h.d1:   a0,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13,a14
  a0=-d1.               ; letter:
        f1              ;   0:  letter again
        f8              ;   1:  compound
        f6              ;   2:  not compound
        f6              ;   3:  not compound
        f6              ;   4:  not compound
        f5              ;   5:  colon
  a1=-d1.               ; digit:
        f0              ;   0:  digit again
        f7              ;   1:  register
        f6              ;   2:  not compound
        f6              ;   3:  not compound
        f6              ;   4:  not compound
        f5              ;   5:  colon
  a2=-d1.               ; point:
        f18             ;   0:  exit
        f8              ;   1:  compound
        f17             ;   2:  digit point
        f6              ;   3:  not compound
        f6              ;   4:  not compound
        f5              ;   5:  colon
  a3=-d1.               ; sign:
        f18             ;   0:  exit
        f6              ;   1:  not compound
        f6              ;   2:  not compound
        f6              ;   3:  not compound
        f6              ;   4:  not compound
        f5              ;   5:  colon
  a4=-d1.               ; special:
        f18             ;   0:  exit
        f6              ;   1:  not compound
        f6              ;   2:  not compound
        f6              ;   3:  not compound
        f6              ;   4:  not compound
        f5              ;   5:  colon
  a5=-d1.               ; less gr:
        f10             ;   0:  less gr
        f6              ;   1:  not compound
        f6              ;   2:  not compound
        f6              ;   3:  not compound
        f6              ;   4:  not compound
        f15             ;   5:  colon less gr
  a6=-d1.               ; semicolon:
        f12             ;   0:  comment
        f6              ;   1:  not compound
        f6              ;   2:  not compound
        f6              ;   3:  not compound
        f6              ;   4:  not compound
        f5              ;   5:  colon
  a7=-d1.               ; blank:
        f19             ;   0:  blank
        f19             ;   1:  blank
        f19             ;   2:  blank
        f19             ;   3:  blank
        f19             ;   4:  blank
        f9              ;   5:  colon blank
  a8=-d1.               ; blind:
        f3              ;   0:  read
        f3              ;   1:  read
        f3              ;   2:  read
        f3              ;   3:  read
        f3              ;   4:  read
        f3              ;   5:  read
  a9=-d1.               ; left par:
        f11             ;   0:  left par
        f6              ;   1:  not compound
        f6              ;   2:  not compound
        f6              ;   3:  not compound
        f6              ;   4:  not compound
        f5              ;   5:  colon
  a10=-d1.              ; colon:
        f4              ;   0:  colon read
        f6              ;   1:  not compound
        f6              ;   2:  not compound
        f16             ;   3:  less colon
        f8              ;   4:  compound
        f5              ;   5:  colon
  a11=-d1.              ; exponent:
        f18             ;   0:  exit
        f6              ;   1:  not compound
        f6              ;   2:  not compound
        f6              ;   3:  not compound
        f6              ;   4:  not compound
        f5              ;   5:  colon
  a12=-d1.              ; illegal:
        f13             ;   0:  illegal
        f13             ;   1:  illegal
        f13             ;   2:  illegal
        f13             ;   3:  illegal
        f13             ;   4:  illegal
        f13             ;   5:  illegal
  a13=-d1.              ; end medium:
        f14             ;   0:  end medium
        f14             ;   1:  end medium
        f14             ;   2:  end medium
        f14             ;   3:  end medium
        f14             ;   4:  end medium
        f14             ;   5:  end medium
  a14=-d1.              ; end line:
        f20             ;   0:  end line
        f6              ;   1:  not compound
        f6              ;   2:  not compound
        f6              ;   3:  not compound
        f6              ;   4:  not compound
        f5              ;   5:  colon

c.d1.+15*7-1m.char matrix short
z.
c.-d1.-15*7-1m.char matrix long
z.
c.i0i.z.
e.

; delim matrix
; the transition matrix below contains a byte for each combination
; of the delimiter state and the character type. the leftmost 6 bits
; defines a new state and the rightmost 6 bits is a switch to a
; working action. the meaning of the delimiter states are:
;   0: after error
;   1: start not real
;   2: after id digit
;   3: delim expected
;   4: after digit
;   5: after id letter
;   6: in text
;   7: in num
;   8: start real
;   9: after frac sign
;  10: after point
;  11: after exponent
;  12: after exp sign
;  30: irrelevant
;  31: unused
; table look-up: the character type is used to select an entry in
; the matrix. the entry contains one byte for each state value.
b.a11
h.d2:   a0,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11
  a0=-d2.               ; letter:
         0<6+ 0         ;   0:   0     cont scan
         5<6+ 4         ;   1:   5     init id
         0<6+19         ;   2:   0     unknown
         0<6+19         ;   3:   0     unknown
         0<6+19         ;   4:   0     unknown
        31<6+22         ;   5:  31     slang fault
         6<6+17         ;   6:   6     text char
         0<6+20         ;   7:   0     text unknown
         5<6+ 4         ;   8:   5     init id
         0<6+19         ;   9:   0     unknown
         0<6+19         ;  10:   0     unknown
         0<6+19         ;  11:   0     unknown
         0<6+19         ;  12:   0     unknown
  a1=-d2.               ; digit:
         0<6+ 0         ;   0:   0     cont scan
         4<6+ 2         ;   1:   4     init dec
         2<6+ 3         ;   2:   2     conv radix
         0<6+19         ;   3:   0     unknown
         4<6+ 3         ;   4:   4     conv radix
         2<6+ 3         ;   5:   2     conv radix
         6<6+17         ;   6:  16     text char
         7<6+ 3         ;   7:   7     conv radix
         9<6+ 9         ;   8:   9     before point
         9<6+ 9         ;   9:   9     before point
        10<6+ 8         ;  10:  10     after point
        12<6+13         ;  11:  12     after exp
        12<6+13         ;  12:  12     after exp
  a2=-d2.               ; point:
        30<6+ 7         ;   0:  30     single
        30<6+ 7         ;   1:  30     single
        31<6+22         ;   2:  31     slang fault
        30<6+ 7         ;   3:  30     single
        31<6+22         ;   4:  31     slang fault
         0<6+19         ;   5:   0     unknown
         6<6+17         ;   6:   6     text char
         0<6+20         ;   7:   0     text unknown
        10<6+10         ;   8:  10     set real
        10<6+ 0         ;   9:  10     cont scan
        30<6+ 7         ;  10:  30     single
        30<6+ 7         ;  11:  30     single
        30<6+ 7         ;  12:  30     single
  a3=-d2.               ; sign:
        30<6+ 7         ;   0:  30     single
        30<6+ 7         ;   1:  30     single
        30<6+ 7         ;   2:  30     single
        30<6+ 7         ;   3:  30     single
        30<6+ 7         ;   4:  30     single
         0<6+19         ;   5:   0     unknown
         6<6+17         ;   6:   6     text char
         0<6+20         ;   7:   0     text unknown
         9<6+11         ;   8:   9     sign
        30<6+ 7         ;   9:  30     single
        30<6+ 7         ;  10:  30     single
        12<6+11         ;  11:  12     sign
        30<6+ 7         ;  12:  30     single
  a4=-d2.               ; special:
        30<6+ 7         ;   0:  30     single
        30<6+ 7         ;   1:  30     single
        30<6+ 7         ;   2:  30     single
        30<6+ 7         ;   3:  30     single
        30<6+ 7         ;   4:  30     single
         0<6+19         ;   5:   0     unknown
         6<6+17         ;   6:   6     text char
         0<6+20         ;   7:   0     text unknown
        30<6+ 7         ;   8:  30     single
        30<6+ 7         ;   9:  30     single
        30<6+ 7         ;  10:  30     single
        30<6+ 7         ;  11:  30     single
        30<6+ 7         ;  12:  30     single
  a5=-d2.               ; less gr:
        30<6+ 7         ;   0:  30     single
        30<6+ 7         ;   1:  30     single
        30<6+ 7         ;   2:  30     single
        30<6+ 7         ;   3:  30     single
        30<6+ 7         ;   4:  30     single
         0<6+19         ;   5:   0     unknown
         6<6+15         ;   6:   6     init num
         6<6+16         ;   7:   6     end num
        30<6+ 7         ;   8:  30     single
        30<6+ 7         ;   9:  30     single
        30<6+ 7         ;  10:  30     single
        30<6+ 7         ;  11:  30     single
        30<6+ 7         ;  12:  30     single
  a6=-d2.               ; end line:
        30<6+21         ;   0:  30     end line
        30<6+21         ;   1:  30     end line
        30<6+21         ;   2:  30     end line
        30<6+21         ;   3:  30     end line
        30<6+21         ;   4:  30     end line
         0<6+19         ;   5:   0     unknown
         6<6+17         ;   6:   6     text char
         0<6+20         ;   7:   0     text unknown
        30<6+21         ;   8:  30     end line
        30<6+21         ;   9:  30     end line
        30<6+21         ;  10:  30     end line
        30<6+21         ;  11:  30     end line
        30<6+21         ;  12:  30     end line
  a7=-d2.               ; blank:
        31<6+22         ;   0:  31     slang fault
        31<6+22         ;   1:  31     slang fault
        31<6+22         ;   2:  31     slang fault
        31<6+22         ;   3:  31     slang fault
        31<6+22         ;   4:  31     slang fault
        31<6+22         ;   5:  31     slang fault
         6<6+17         ;   6:   6     text char
         7<6+ 0         ;   7:   7     cont scan
        31<6+22         ;   8:  31     slang fault
        31<6+22         ;   9:  31     slang fault
        31<6+22         ;  10:  31     slang fault
        31<6+22         ;  11:  31     slang fault
        31<6+22         ;  12:  31     slang fault
  a8=-d2.               ; syllable:
        30<6+ 6         ;   0:  30     pair
        30<6+ 6         ;   1:  30     pair
        30<6+ 6         ;   2:  30     pair
        30<6+ 6         ;   3:  30     pair
        30<6+ 6         ;   4:  30     pair
         0<6+19         ;   5:   0     unknown
        31<6+22         ;   6:  31     slang fault
        31<6+22         ;   7:  31     slang fault
        30<6+ 6         ;   8:  30     pair
        30<6+ 6         ;   9:  30     pair
        30<6+ 6         ;  10:  30     pair
        30<6+ 6         ;  11:  30     pair
        30<6+ 6         ;  12:  30     pair
  a9=-d2.               ; digit point:
         0<6+ 0         ;   0:   0     cont scan
         4<6+ 1         ;   1:   4     init radix
         3<6+ 5         ;   2:   3     rel id
         0<6+19         ;   3:   0     unknown
         4<6+ 1         ;   4:   4     init radix
         3<6+ 5         ;   5:   3     rel id
        31<6+22         ;   6:  31     slang fault
        31<6+22         ;   7:  31     slang fault
        10<6+ 9         ;   8:  10     before point
        10<6+ 9         ;   9:  10     before point
         0<6+19         ;  10:   0     unknown
         0<6+19         ;  11:   0     unknown
         0<6+19         ;  12:   0     unknown
  a10=-d2.              ; text term:
         0<6+ 0         ;   0:   0     cont scan
         6<6+14         ;   1:   6     init text
         0<6+20         ;   2:   0     text unknown
         0<6+20         ;   3:   0     text unknown
         0<6+20         ;   4:   0     text unknown
         0<6+20         ;   5:   0     text unknown
         3<6+18         ;   6:   3     end text
         0<6+20         ;   7:   0     text unknown
         0<6+20         ;   8:   0     text unknown
         0<6+20         ;   9:   0     text unknown
         0<6+20         ;  10:   0     text unknown
         0<6+20         ;  11:   0     text unknown
         0<6+20         ;  12:   0     text unknown
  a11=-d2.              ; exponent:
         0<6+ 0         ;   0:   0     cont scan
         0<6+19         ;   1:   0     unknown
         0<6+19         ;   2:   0     unknown
         0<6+19         ;   3:   0     unknown
         0<6+19         ;   4:   0     unknown
         0<6+19         ;   5:   0     unknown
         6<6+17         ;   6:   6     text char
         0<6+20         ;   7:   0     text unknown
        11<6+12         ;   8:  11     exponent
        11<6+12         ;   9:  11     exponent
        11<6+12         ;  10:  11     exponent
         0<6+19         ;  11:   0     unknown
         0<6+19         ;  12:   0     unknown

c.d2.+12*14-1m.delim matrix short
z.
c.-d2.-12*14-1m.delim matrix long
z.
c.i0i.z.
e.

; syllable list
; in the table below each delimiter is described by 2 bytes of 2
; characters each: the rightmost byte contain internal values of
; the characters in the syllable (for a single character delimiter
; the second character is set to zero). the leftmost byte contain
; an internal description of the value and the type of the 
; delimiter. the meaning of the delimiter types are:
;   0: control          s.  b.  c.  e.  h.  w.  f.  t.  n.  x.  y.
;                       æ.  ø.  i.  m.  j.  z.  carret  p.  u.  l.  d.
;   1: comma            ,
;   2: label            :
;   3: assign           =  r.
;   4: op code          ac  ad  ....  xl  xs
;   5: op mod           .  (  w0  w1  w2  w3  x0  x1  x2  x3
;   6: sign             +  -
;   7: operator         *  /  <  >  o.  a.
;   8: left par         (:
;   9: right par        :)
; table look-up: an index is formed by the sum modulo 16 of the
; two characters. this is used to select an entry in the syllable 
; list. from this entry a search for the delimiter is performed.
b.a15
h.d3:   a0,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13,a14,a15
w.a0=-d3.
; group 0:                              ; value   type     syllable
        54<18+ 4<12+36<6+44             ;  54     op code     dl
         1<18+ 0<12+34<6+14             ;   1     control     b.
        39<18+ 4<12+44<6+36             ;  39     op code     ld
         0<18+ 3<12+50<6+14             ;   0     assign      r.
        30<18+ 4<12+45<6+51             ;  30     op code     ms
  a1=-d3.
; group 1:                              ; value   type     syllable
        43<18+ 4<12+51<6+46             ;  43     op code     sn
         2<18+ 0<12+35<6+14             ;   2     control     c.
         0<18+ 0<12+51<6+14             ;   0     control     s.
        34<18+ 4<12+46<6+51             ;  34     op code     ns
         2<18+ 4<12+37<6+44             ;   2     op code     el
        30<18+ 4<12+33<6+48             ;  30     op code     ap
        61<18+ 4<12+41<6+56             ;  61     op code     ix
        31<18+ 4<12+53<6+44             ;  31     op code     ul
        12<18+ 4<12+56<6+41             ;  12     op code     xi
  a2=-d3.
; group 2:                              ; value   type     syllable
        44<18+ 4<12+51<6+47             ;  44     op code     so
        35<18+ 4<12+46<6+36             ;  35     op code     nd
        56<18+ 4<12+33<6+33             ;  56     op code     aa
        16<18+ 8<12+ 8<6+26             ;  16     left par    (:
         7<18+ 0<12+52<6+14             ;   7     control     t.
        21<18+ 0<12+36<6+14             ;  21     control     d.
  a3=-d3.
; group 3:                              ; value   type     syllable
        18<18+ 4<12+34<6+33             ;  18     op code     ba
        50<18+ 4<12+38<6+45             ;  50     op code     fm
         3<18+ 0<12+37<6+14             ;   3     control     e.
        17<18+ 9<12+26<6+ 9             ;  17     right par   :)
        21<18+ 4<12+51<6+48             ;  21     op code     sp
        29<18+ 4<12+48<6+51             ;  29     op code     ps
        19<18+ 0<12+53<6+14             ;  19     control     u.
         1<18+ 4<12+36<6+47             ;   1     op code     do
  a4=-d3.
; group 4:                              ; value   type     syllable
        33<18+ 4<12+33<6+35             ;  33     op code     ac
        16<18+ 4<12+56<6+44             ;  16     op code     xl
         6<18+ 4<12+44<6+56             ;   6     op code     lx
        10<18+ 4<12+55<6+45             ;  10     op code     wm
        36<18+ 4<12+33<6+51             ;  36     op code     as
         6<18+ 0<12+38<6+14             ;   6     control     f.
         3<18+ 4<12+40<6+44             ;   3     op code     hl
        58<18+ 4<12+36<6+48             ;  58     op code     dp
  a5=-d3.
; group 5:                              ; value   type     syllable
        23<18+ 4<12+50<6+51             ;  23     op code     rs
        17<18+ 4<12+34<6+51             ;  17     op code     bs
         5<18+ 0<12+55<6+14             ;   5     control     w.
        37<18+ 4<12+33<6+36             ;  37     op code     ad
        59<18+ 4<12+45<6+40             ;  59     op code     mh
  a6=-d3.
; group 6:                              ; value   type     syllable
        13<18+ 4<12+42<6+44             ;  13     op code     jl
         4<18+ 0<12+40<6+14             ;   4     control     h.
        57<18+ 4<12+51<6+51             ;  57     op code     ss
         9<18+ 0<12+56<6+14             ;   9     control     x.
        18<18+ 4<12+37<6+33             ;  18     op code     ea
        19<18+ 4<12+58<6+44             ;  19     op code     zl
  a7=-d3.
; group 7:                              ; value   type     syllable
         8<18+ 5<12+55<6+16             ;   8     op mod      w0
        55<18+ 4<12+36<6+51             ;  55     op code     ds
        48<18+ 4<12+38<6+33             ;  48     op code     fa
        22<18+ 4<12+43<6+44             ;  22     op code     kl
        10<18+ 0<12+57<6+14             ;  10     control     y.
        13<18+ 0<12+41<6+14             ;  13     control     i.
        60<18+ 4<12+44<6+43             ;  60     op code     lk
        22<18+ 4<12+50<6+37             ;  22     op code     re
        47<18+ 4<12+39<6+48             ;  47     op code     gp
  a8=-d3.
; group 8:                              ; value   type     syllable
        24<18+ 5<12+55<6+17             ;  24     op mod      w1
         1<18+ 5<12+56<6+16             ;   1     op mod      x0
        34<18+ 5<12+ 8<6+ 0             ;  34     op mod      (
        42<18+ 4<12+51<6+37             ;  42     op code     se
         7<18+ 4<12+55<6+33             ;   7     op code     wa
         1<18+ 4<12+41<6+47             ;   1     op code     io
         0<18+ 4<12+33<6+55             ;   0     op code     aw
        15<18+ 0<12+42<6+14             ;  15     control     j.
        16<18+ 0<12+58<6+14             ;  16     control     z.
        17<18+ 4<12+37<6+51             ;  17     op code     es
  a9=-d3.
; group 9:                              ; value   type     syllable
        40<18+ 5<12+55<6+18             ;  40     op mod      w2
        17<18+ 5<12+56<6+17             ;  17     op mod      x1
        49<18+ 4<12+38<6+51             ;  49     op code     fs
        53<18+ 4<12+35<6+38             ;  53     op code     cf
        12<18+ 4<12+45<6+44             ;  12     op code     ml
        11<18+ 0<12+59<6+14             ;  11     control     æ.
  a10=-d3.
; group 10:                             ; value   type     syllable
        56<18+ 5<12+55<6+19             ;  56     op mod      w3
         0<18+ 2<12+26<6+ 0             ;   0     label       :
        33<18+ 5<12+56<6+18             ;  33     op mod      x2
         8<18+ 4<12+55<6+51             ;   8     op code     ws
        52<18+ 4<12+38<6+36             ;  52     op code     fd
        25<18+ 4<12+50<6+56             ;  25     op code     rx
        10<18+ 7<12+10<6+ 0             ;  10     operator    *
        12<18+ 0<12+60<6+14             ;  12     control     ø.
        20<18+ 0<12+44<6+14             ;  20     control     l.
  a11=-d3.
; group 11:                             ; value   type     syllable
         9<18+ 6<12+11<6+ 0             ;   9     sign        +
        26<18+ 4<12+40<6+51             ;  26     op code     hs
        49<18+ 5<12+56<6+19             ;  49     op mod      x3
        40<18+ 4<12+51<6+40             ;  40     op code     sh
        46<18+ 4<12+51<6+56             ;  46     op code     sx
         5<18+ 4<12+44<6+47             ;   5     op code     lo
        24<18+ 4<12+55<6+36             ;  24     op code     wd
        27<18+ 4<12+56<6+51             ;  27     op code     xs
        14<18+ 0<12+45<6+14             ;  14     control     m.
        12<18+ 4<12+50<6+41             ;  12     op code     ri
  a12=-d3.
; group 12:                             ; value   type     syllable
        17<18+ 1<12+12<6+ 0             ;  17     comma       ,
        19<18+ 4<12+34<6+58             ;  19     op code     bz
        14<18+ 7<12+28<6+ 0             ;  14     operator    <
        32<18+ 4<12+35<6+41             ;  32     op code     ci
        28<18+ 4<12+48<6+44             ;  28     op code     pl
        31<18+ 4<12+41<6+51             ;  31     op code     is
        47<18+ 4<12+41<6+35             ;  47     op code     ic
         8<18+ 0<12+46<6+14             ;   8     control     n.
  a13=-d3.
; group 13:                             ; value   type     syllable
        11<18+ 4<12+33<6+44             ;  11     op code     al
         8<18+ 6<12+13<6+ 0             ;   8     sign        -
         4<18+ 4<12+44<6+33             ;   4     op code     la
        45<18+ 4<12+51<6+58             ;  45     op code     sz
         1<18+ 3<12+29<6+ 0             ;   1     assign      =
        13<18+ 7<12+47<6+14             ;  13     operator    o.
        29<18+ 4<12+36<6+41             ;  29     op code     di
  a14=-d3.
; group 14:                             ; value   type     syllable
        36<18+ 5<12+14<6+ 0             ;  36     op mod      .
        20<18+ 4<12+50<6+44             ;  20     op code     rl
         2<18+ 4<12+34<6+44             ;   2     op code     bl
         9<18+ 4<12+33<6+45             ;   9     op code     am
        14<18+ 4<12+42<6+36             ;  14     op code     jd
        15<18+ 7<12+30<6+ 0             ;  15     operator    >
        51<18+ 4<12+43<6+51             ;  51     op code     ks
        18<18+ 0<12+48<6+14             ;  18     control     p.
        28<18+ 4<12+39<6+39             ;  28     op code     gg
  a15=-d3.
; group 15:                             ; value   type     syllable
        41<18+ 4<12+51<6+44             ;  41     op code     sl
        38<18+ 4<12+44<6+51             ;  38     op code     ls
        12<18+ 7<12+33<6+14             ;  12     operator    a.
        15<18+ 4<12+42<6+37             ;  15     op code     je
        11<18+ 7<12+15<6+ 0             ;  11     operator    /
  d4:   0                               ; last syllable

c.d3.+258-1m.syllable list short
z.
c.-d3.-258-1m.syllable list long
z.
c.i0i.z.
e.

; program matrix
; the transition matrix below contains a byte for each combination
; of the program state and the delimiter type. the leftmost 6 bits
; defines a new state and the rightmost 6 bits is a switch to a
; working action. the meaning of the program states are:
;   0: after error
;   1: after begin
;   2: after halfword
;   3: after byte instruction
;   4: after word
;   5: after word instruction
;   6: after real
;   7: after left paranthesis
;   8: after operator
;   9: after right paranthesis
;  31: irrelevant
; table look-up: the character type is used to select an entry in
; the matrix. the entry contains one byte for each state value.
b.a9
h.d5:   a0,a0,a2,a3,a4,a5,a6,a7,a8,a9
  a0=-d5.               ; control:
        31<6+22         ;   0:  31     restore
         1<6+ 0         ;   1:   1     declare 1
         2<6+ 7         ;   2:   2     byte 1
         2<6+ 9         ;   3:   2     byte instr
         4<6+10         ;   4:   4     word 1
         4<6+12         ;   5:   4     word instr
         6<6+ 5         ;   6:   6     real 1
         7<6+18         ;   7:   7     terminator 2
         7<6+18         ;   8:   7     terminator 2
         7<6+17         ;   9:   7     terminator 1
c.-1; comma has got the same syntactical position as control...
  a1=-d5.               ; comma:
        31<6+22         ;   0:  31     restore
         1<6+ 1         ;   1:   1     declare 2
         2<6+ 8         ;   2:   2     byte 2
         2<6+ 9         ;   3:   2     byte instr
         4<6+11         ;   4:   4     word 2
         4<6+12         ;   5:   4     word instr
         6<6+ 6         ;   6:   6     real 2
         7<6+18         ;   7:   7     terminator 2
         7<6+18         ;   8:   7     terminator 2
         7<6+17         ;   9:   7     terminator 1
z.
  a2=-d5.               ; label:
         0<6+24         ;   0:   0     next delim
         1<6+ 2         ;   1:   1     label
         2<6+ 2         ;   2:   2     label
         0<6+23         ;   3:   0     syntax error
         4<6+ 2         ;   4:   2     label
         0<6+23         ;   5:   0     syntax error
         6<6+ 2         ;   6:   6     label
         0<6+23         ;   7:   0     syntax error
         0<6+23         ;   8:   0     syntax error
         0<6+23         ;   9:   0     syntax error
  a3=-d5.               ; assign:
         0<6+24         ;   0:   0     next delim
         7<6+15         ;   1:   7     assign expr 1
         7<6+16         ;   2:   7     assign expr 2
         0<6+23         ;   3:   0     syntax error
         7<6+16         ;   4:   7     assign expr 2
         0<6+23         ;   5:   0     syntax error
         7<6+16         ;   6:   7     assign expr 2
         0<6+23         ;   7:   0     syntax error
         0<6+23         ;   8:   0     syntax error
         0<6+23         ;   9:   0     syntax error
  a4=-d5.               ; op code:
         0<6+24         ;   0:   0     next delim
         0<6+23         ;   1:   0     syntax error
         3<6+ 3         ;   2:   3     op code
         0<6+23         ;   3:   0     syntax error
         5<6+ 3         ;   4:   5     op code
         0<6+23         ;   5:   0     syntax error
         0<6+23         ;   6:   0     syntax error
         0<6+23         ;   7:   0     syntax error
         0<6+23         ;   8:   0     syntax error
         0<6+23         ;   9:   0     syntax error
  a5=-d5.               ; op mod:
         0<6+24         ;   0:   0     next delim
         0<6+23         ;   1:   0     syntax error
         0<6+23         ;   2:   0     syntax error
         3<6+ 4         ;   3:   3     op mod
         0<6+23         ;   4:   0     syntax error
         5<6+ 4         ;   5:   5     op mod
         0<6+23         ;   6:   0     syntax error
         0<6+23         ;   7:   0     syntax error
         0<6+23         ;   8:   0     syntax error
         0<6+23         ;   9:   0     syntax error
  a6=-d5.               ; sign:
         0<6+24         ;   0:   0     next delim
         0<6+23         ;   1:   0     syntax error
         2<6+13         ;   2:   2     data sign
         0<6+23         ;   3:   0     syntax error
         4<6+13         ;   4:   4     data sign
         5<6+13         ;   5:   5     data sign
         0<6+23         ;   6:   0     syntax error
         8<6+20         ;   7:   8     expr sign
         8<6+21         ;   8:   8     operator 2
         8<6+19         ;   9:   8     operator 1
  a7=-d5.               ; operator:
         0<6+24         ;   0:   0     next delim
         0<6+23         ;   1:   0     syntax error
         8<6+14         ;   2:   8     data expr
         0<6+23         ;   3:   0     syntax error
         8<6+14         ;   4:   8     data expr
         8<6+14         ;   5:   8     data expr
         0<6+23         ;   6:   0     syntax error
         8<6+21         ;   7:   8     operator 2
         8<6+21         ;   8:   8     operator 2
         8<6+19         ;   9:   8     operator 1
  a8=-d5.               ; left par:
         0<6+24         ;   0:   0     next delim
         0<6+23         ;   1:   0     syntax error
         7<6+14         ;   2:   7     data expr
         0<6+23         ;   3:   0     syntax error
         7<6+14         ;   4:   7     data expr
         7<6+14         ;   5:   7     data expr
         0<6+23         ;   6:   0     syntax error
         7<6+19         ;   7:   7     operator 1
         7<6+19         ;   8:   7     operator 1
         0<6+23         ;   9:   0     syntax error
  a9=-d5.               ; right par:
         0<6+24         ;   0:   0     next delim
         0<6+23         ;   1:   0     syntax error
         0<6+23         ;   2:   0     syntax error
         0<6+23         ;   3:   0     syntax error
         0<6+23         ;   4:   0     syntax error
         0<6+23         ;   5:   0     syntax error
         0<6+23         ;   6:   0     syntax error
         9<6+21         ;   7:   9     operator 2
         9<6+21         ;   8:   9     operator 2
         9<6+19         ;   9:   9     operator 1
d5=d5-10 ; simulate the presence of the a1-action (comma)

c.d5.+10*11-1m.program matrix short
z.
c.-d5.-10*11-1m.program matrix long
z.
d5=d5+10 ; simulate the presence of the a1-action (comma)
c.i0i.z.
e.

m.                slang text 1 included
▶EOF◀