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

⟦476c1eeac⟧ TextFile

    Length: 37632 (0x9300)
    Types: TextFile
    Names: »do31tx      «

Derivation

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

TextFile


\f



; dotext part 1 (of 2)
c.h57<3
b. g5, i2 w.  ; for insertproc
d.
p.<:fpnames:>
l.
z.
c.h57<2
b. g5, i2 w.   ; for insertproc
z.

m. dotext begin version for system 2 and 3

; do, an rc 4000 fp utility program
; torkild glaven
; rc 14.11.70
; changes: jens ramsbøl
; rc 27.06.75


b.g99w.
s.g0,q1,k=h55w.
b.j0w.                  ; helping block
w.g1:   g0              ; length, saved return
  g2:   <:***:>         ; three stars
  g36:  0 ; g2+2        ; empty text
  g3:   0               ; ok bit
  g5:   2<12+2          ; the parameter: <nl>
; g7:   jl    x3+0      ; return instruction
  g8=h57                ; fp version

; variables
; g10:  0               ; param addr
; g11:  0               ; prog name addr
; g12:  0               ; item
; g13:  0               ; out name addr
; g14:  0               ; saved register
; g15:  0               ; saved register
; g16:  0               ; param

; procedure outchar(44);
; procedure outchar(47);
; procedure outend(10);
; procedure outchar(32);
; procedure outchar(61);
; procedure outchar(46);
;       call:           exit:
; w0                    unchanged
; w1                    destroyed
; w2                    destroyed
; w3    link            unchanged;
  g20:  am    44-47     ; char:= 44
  g21:  am    47-10     ;     or 47
  g22:  am    10-32     ;     or 10
  g23:  am    32-61     ;     or 32
  g24:  am    61-46     ;     or 61
  g25:  al w2 46        ;     or 46;
        rl.w1 q1.       ;  q1=g61
        jl.   h26.      ;  outchar(char);

; procedure end program(sorry);
w.g28:  am    j0        ; ok bit:= false;

; procedure end program(ok bit);
w.g26:  rl.w2 g3.
        se w2 -1        ; if ok bit<>-1 then
        jl.w3 h7.       ;   end program(ok bit)
        jl.   h10.+h76  ; else goto fp interrupt service addr;

; procedure outinteger(<<d>,value);
;       call:           exit:
; w0    value           destroyed
; w1                    destroyed
; w2    link            unchanged
; w3                    destroyed;
w.g27:  rl.w1 q1.       ;  q1=g61
        jl.w3 h32.  
        1
        jl    x2+0
  j0=g27+4-g3

; procedure init program;
; comment: saves param address, program name address, and output
; name address, and generates names for eventually stack chains.
; may only be called once before any variable is assigned.
;       call:           exit:
; w0                    delim
; w1    link            unchanged
; w2                    out name addr
; w3    call pointer    destroyed;
w.g30:                  ; begin
  g10:  rs.w3 g10.      ;   param addr:= call pointer;
  g11:  al w2 x3+2      ;   prog name addr:= call pointer+2;
  g12:  ds.w3 g12.      ;   item:= call pointer;
  g13:  bl w0 x3+0      ;   out name addr:=
  g14:  sn w0 6         ;       if byte(call pointer)=6 then
  g15:  am    x3-8      ;       call pointer-8
  g16:  al w2 0         ;       else 0;
        rs.w2 g13.
        jl    x1+0      ; end;

; error texts
w.g31:  <:connect <0>:>
  g32:  <:param <0>:>
  g33:  <:call<10><0>:>
  g34:  <:syntax<0>:>
  g35:  <:end medium<10><0>:>
; g36:  <:<0>:>  (g36=g2+2)

; procedure error(text addr);
;       call:           exit:
; w0                    unchanged
; w1                    destroyed
; w2    text addr       destroyed
; w3    link            destroyed;
w.g46:  am    g36-g35   ; empty error entry:  text:= <::>
  g45:  am    g35-g34   ; end medium error entry: or <:end medium<10>:>
  g44:  am    g34-g33   ; syntax error entry:     or <:syntax:>
  g43:  am    g33-g32   ; call error entry:       or <:call<10>:>
  g42:  am    g32-g31   ; param error entry:      or <:param :>
  g41:  al.w2 g31.      ; connect error entry:    or <:connect :>;
  g40:  ds.w0 g15.      ; error entry:
        al.w0 g2.
        jl.w3 h31.-2    ;   outtext(<:***:>);
        rl.w0 g11.
        jl.w3 h31.-2    ;   outtext(prog name addr);
        al w0 x2+0
        jl.w3 g23.      ;   outchar(32);
        jl.w3 h31.-2    ;   outtext(text addr)
        rl.w0 g15.
        jl.  (g14.)     ; end;

; procedure get param(end list);
; comment: delivers the next parameter as the value of an integer
; or the address of a name.
;       call:           exit:
; w0                    length
; w1                    delim
; w2                    param
; w3    link            next delim;
w.g50:                  ; begin
        rl.w2 g10.      ;   addr:= param addr;
        ba w2 x2+1      ;   addr:= addr+byte(addr+1);
        rs.w2 g10.      ;   param addr:= addr;
        bl w1 x2+0      ;   delim:= byte(addr);
        bl w0 x2+1      ;   length:= byte(addr+1);
        sh w1 2         ;   if delim<=2 then
  g7:   jl    x3+0      ;     goto end list;
        al w3 x3+2
        rs.w3 g14.
        am   (0)        ;   next delim:= byte(addr+length);
        bl w3 x2+0
        al w2 x2+2      ;   param:= addr+2;
        sn w0 4         ;   if length=4 then
        rl w2 x2+0      ;     param:= word(param)
        rs.w2 g16.
        jl.  (g14.)     ; end;

; procedure just list param(end list);
; comment: executes the procedure list param except for the call of
; param error and the terminating new line.

; procedure list param(end list);
; comment: lists the current parameter as a parameter error and the
; following parameters up to the first space. the procedure continues
; with get param.
;       call:           exit:
; w0                    length
; w1                    delim
; w2                    param
; w3    link            next delim;
b.a6w.                  ; begin
w.g51:  am    a0        ; just list param entry:
  g52:  al w2 a5        ;   destroy outend(10) at exit;
        rs.w3 g1.       ;   goto start;
        hs.w2 a4.       ; list param entry:
        se w2 2         ;   param error;
        jl.w3 g42.      ; start:
  a6:   rl.w1 g10.      ;   addr:= param addr;
        bl w0 x1+1      ;   length:= byte(addr+1);
        bl w1 x1+0      ;   delim:= byte(addr);
        jl.w3 x1+g22.-2 ;   outchar(character(delim));
        rl.w3 g10.
        se w0 4         ;   if length=4 then
        jl.   a1.
        rl w0 x3+2
        jl.w2 g27.      ;     outinteger(<<d>,param)
        jl.   a2.
  a1:   al w0 x3+2
        rl.w1 q1.       ;  q1=g61
        jl.w3 h31.      ;   else outtext(param);
  a2:   jl.w3 g50.      ;   get param(exit);
        jl.   a3.
        se w1 4         ;   if delim<>4 then
        jl.   a6.       ;     goto start;
  a4=k+1
  a3:   jl.w3 g22.      ; exit:
  a5=g22-a3,a0=2-a5     ;   if not destroyed then
        rl.w2 g10.      ;     outend(10);
        rl.w3 g1.       ;   param addr:= param addr-length;
        jl.   g50.+4    ;   get param(end list)
i.e.                    ; end;

; g60 and g61 are used for determinig the output zone;
  g60:  0                ;
  g61:  0                ;
q1=g61


i.e.                    ; end helping block

b.a42,b80,c16,d23,e39,f99,i1


; assembly variables
  f0=4<12+10            ; space,name
  f1=17                 ; x words
  f2=28                 ; first compound
  f3=3                  ; format niveaus
  f4=6                  ; names per line
  f5=30                 ; repeat niveaus
w.f10:  jl.   a3.       ; goto after interrupt

; procedure increase addr;
;       call:           exit:
; w0                    unchanged
; w1                    next addr
; w2                    unchanged
; w3    link            unchanged;
w.b1:   rl.w1 e15.      ; begin
        sh w1 7         ;   if next addr<=7 then
        jl.   a28.      ;     goto core addr error;
        rs.w1 e13.      ;   write addr:= next addr;
        sl.w1(e14.)     ;   if next addr>=write top then
        jl.  (e32.)     ;     goto return(write item);
        al w1 x1+2      ;   next addr:= next addr+2;
        rs.w1 e15.      ; exit:
        jl    x3+0      ; end;

; procedure write word;
; procedure write bytes;
; procedure write text;
; procedure write octets;
; procedure write sixtets;
; procedure write octal;
; procedure write binary;
;       call:           exit:
; w0                    destroyed
; w1                    destroyed
; w2                    unchanged
; w3    link            destroyed;
b.j5                    ; begin
  b4=k-10
w.b5: am 24<6-12<6+ 8- 5; word:       bits:= 24; digits:=  8;
  b6: am 12<6- 8<6+ 5-16; bytes:   or bits:= 12; digits:=  5;
  b7: am  8<6- 8<6+16- 4; text:    or bits:=  8; digits:= 16;
  b8: am  8<6- 6<6+ 4- 3; octets:  or bits:=  8; digits:=  4;
  b9: am  6<6- 3<6+ 3-12; sixtets: or bits:=  6; digits:=  3;
  b10:am  3<6- 1<6+12-10; octal:   or bits:=  3; digits:= 12;
  b11:al  1<6     +10   ; binary:  or bits:=  1; digits:= 10;
        ld w1 -6
        hs.w0 j1.
        ls w1 -18
        hs.w1 j2.
        rs.w2 j5.       ;
        rs.w3 e30.
        sl w1 10        ;   if digits>=10 then
        jl.w3 g23.      ;     outchar(32);
        jl.w3 g23.      ;   outchar(32);
        al w2 0         ;   bit:= 0;
  j0:   rl.w1 e16.      ; next:
        ls w1 x2+0      ;   word:= value shift bit;
        al w0 0
  j1=k+1
        ld w1;bits      ;   byte:= word(0:bits-1);
        bl.w1 j2.
        sl w1 10        ;   if digits>=10 then
        jl.   j3.       ;     goto characters;
        rl.w1 g61.      ;
        jl.w3 h32.      ;   outinteger(<digits>,byte);
  j2=k+1
        1<23+32<12;+digits
        jl.   j4.       ;   goto exit;
  j3:                   ; characters:
        rx w2 0         ;   if digits=10 and byte<>0
        jl.   x1-8      ;       or digits=12 then
        se w2 0         ;   byte:= byte+2;
        am    2         ;   if digits<16 then
        al w2 x2+46     ;     byte:= byte+46;
        sh w2 126       ;   if byte>126
        sh w2 31        ;       or byte<=31 then
        al w2 32        ;     byte:=32;
        rl.w1 g61.      ;
        jl.w3 h26.      ;   outchar(byte);
        rl w2 0         ; exit:
  j4:   ba.w2 j1.       ;   bit:= bit+bits;
        sh w2 23        ;   if bit<=23 then
        jl.   j0.       ;     goto next
        rl.w2 j5.       ;
        jl.  (e30.)     ; end;
  j5:   0
i.e.

; procedure new line;
;       call:           exit:
; w0                    destroyed
; w1                    destroyed
; w2                    destroyed
; w3    link            destroyed;
w.b12:  rl.w0 e15.      ; begin
        rs.w0 e13.      ;   write addr:= next addr;
        jl.   g22.      ;   outend(10)
                        ; end;

; procedure write empty;
;       call:           exit:
; w0                    write addr
; w1                    unchanged
; w2                    unchanged
; w3                    unchanged;
w.b13:  rl.w0 e14.      ; begin
        rs.w0 e13.      ;   write addr:= write top;
        jl.  (e32.)     ;   goto return(write item)
                        ; end;

; procedure write index;
;       call:           exit:
; w0                    destroyed
; w1                    destroyed
; w2                    destroyed
; w3    link            destroyed;
b.j1                    ; begin
w.b14:                  ;   if w or z=-2 then
        rl.w0 e27.      ;     goto return(write item);
        sn w0 -2        ;   if w or z<>0 then
        jl.  (e32.)     ;     begin
        sn w0 0         ;       w or z:= -2;
        jl.   j1.       ;       goto exit
        al w0 -2        ;     end;
        rs.w0 e27.
        jl    x3+0
  j1:   rs.w3 e30.
        jl.w3 b1.       ;   increase addr;
        rl.w0 e13.
        ws.w0 e12.      ;   index:= write addr-write base;
        sh w0 -1        ;   sign:=
        am    2         ;       if index<=-1 then 45
        al w2 43        ;       else 43;
        hs.w2 j0.
        sh w0 -1        ;   if index<=-1 then
        ac w0(0)        ;     index:= -index;
        sh w0 9         ;   if index<=9 then
        jl.w3 g23.      ;     outchar(32);
        sh w0 99        ;   if index<=99 then
        jl.w3 g23.      ;     outchar(32);
  j0=k+1
        al w2;sign      ;   if index<=999 then
        rl.w1 g61.      ;
        sh w0 999       ;     outchar(sign);
        jl.w3 h26.      ;   outinteger(<<d>,index);
        jl.w2 g27.      ; exit:
        jl.  (e30.)     ; end;
i.e.

; procedure write double;
;       call:           exit:
; w0                    destroyed
; w1                    destroyed
; w2                    destroyed
; w3    link            destroyed;
b.j3                    ; begin
w.j0:   al w1 0         ; procedure first group(value);
        hs.w1 j1.       ; begin
        al w1 32        ;   test:= 0;
        hs.w1 j2.       ;   char:= 32;
  j1=k+1                ;   group(value)
                        ; end;
        se w0 0 ; test  ; procedure group(value);
        jl.   j2.       ; if value=test then
        al.w0 c4.       ;   outtext(<:      :>)
        rl.w1 g61.      ;
        jl.   h31.      ; else last group(value);
  j2=k+1                ; procedure last group(value);
        al w1 32; char  ; begin
        hs.w1 j3.       ;   fill:= char;
        al w1 48        ;   char:= 48;
        hs.w1 j2.
        al w1 -1        ;   test:= -1;
        hs.w1 j1.
        rs.w3 e35.      ;   outinteger(value)
        rl.w1 g61.      ;
        jl.w3 h32.      ; end;
  j3:   32<12+6 ; fill
        jl.  (e35.)
  b15:  rs.w3 e35.
        jl.w3 b1.       ;   increase addr;
        jl.w3 b14.      ;   write index;
        rl.w3 e35.
        rs.w3 e30.      ;   a:= word(write addr-2);
        dl.w0(e13.)     ;   b:= word(write addr);
        ld w2 -65       ;   a1:= a/1000000;
        wd.w3 c2.       ;   a2:= a mod 1000000;
        wd.w2 c15.      ;   d1:= a2/500000;
        ls w2 23        ;   d1:= d1 shift 23;
        rx w2 2         ;   d2:= a2 mod 500000;
        rx w3 4         ;   b1:= (d2*2**24+b)/1000000;
        wd.w0 c2.       ;   b2:= (d2*2**24+b) mod 1000000;
        wa w0 2         ;   b1:= b1+d1;
        rx w3 4         ;   c1:= (a1*2**24+b1)/1000000;
        wd.w0 c2.       ;   c2:= (a1*2**24+b1) mod 1000000;
        rs.w3 e31.      ;   comment: the double value is now
        jl.w3 j0.       ;     c1*10**12+c2*10**6+b2;
        rl.w0 e31.      ;   first group(c1);
        jl.w3 j1.       ;   group(c2);
        al w0 x2+0
        jl.w3 j2.       ;   last group(b2)
        jl.  (e30.)
i.e.                    ; end;

; procedure write name;
;       call:           exit:
; w0                    destroyed
; w1                    destroyed
; w2                    destroyed
; w3    link            destroyed;
w.b16:  rs.w3 e30.      ; begin
        jl.w3 g23.      ;   outchar(32);
        jl.w3 g23.      ;   outchar(32);
        rl.w0 e13.      ;   addr:= write addr;
        jl.w3 b1.       ;   increase addr;
        jl.w3 b1.       ;   increase addr;
        jl.w3 b1.       ;   increase addr;
  b3:   rl w1 116       ; write name without spaces:
        sl w0 8         ;   if addr>=8
        sl w0 x1-6      ;       and addr<core top-6 then
        jl.  (e30.)     ;     outtext(addr)
        rl.w1 g61.      ;
        jl.w3 h31.  
        jl.  (e30.)     ; end;

; procedure write procname;
;       call:           exit:
; w0                    destroyed
; w1                    destroyed
; w2                    destroyed
; w3    link            destroyed;
w.b17:  rs.w3 e31.      ; begin
        jl.w3 b5.       ;   write word;
        jl.w3 g25.      ;   outchar(46);
        rl.w1 e16.      ;   addr:= value;
        sh w1 -1        ;   if addr<=-1 then
        ac w1 x1+0      ;     addr:= -addr;
        al w0 x1+2      ;   addr:= addr+2;
        rl.w3 e31.
  b2:   rs.w3 e30.      ;   goto write name without spaces
        jl.   b3.       ; end;

; procedure write procnames;
;       call:           exit:
; w0                    destroyed
; w1                    destroyed
; w2                    destroyed
; w3    link            destroyed;
b.j5                    ; begin
w.b18:  rs.w3 e31.
        jl.w3 b11.      ;   write binary;
        rl w1 78        ;   pointer:= first internal;
        al w2 0         ;   names:= 0;
  j0:   ds.w1 j3.       ; next:
        rs.w2 j4.
        rl w3 x1+0      ;   addr:= word(pointer);
        rl.w0 e16.      ;   if value and word(addr+12)
        so w0(x3+12)    ;       =word(addr+12) then
        jl.   j2.       ;     begin
        al w0 x3+2      ;       addr:= addr+2;
        sh w2 f4-1      ;       if names>=names per line then
        jl.   j1.       ;         begin
        rs.w0 j5.
        al.w0 c10.      ;           outtext(<:<10>    :>);
        rl.w1 g61.      ;
        jl.w3 h31.      ;           names:= -1
        al w2 -1        ;         end;
        rl.w0 j5.
  j1:   al w2 x2+1      ;       names:= names+1;
        rs.w2 j4.
        jl.w3 g23.      ;       outchar(32);
        jl.w3 g23.      ;       outchar(32);
        jl.w3 b2.       ;       write name without spaces
        rl.w2 j4.
  j2:   dl.w1 j3.       ;     end;
        al w1 x1+2      ;   pointer:= pointer+2;
        se w1(80)       ;   if pointer<>name table end then
        jl.   j0.       ;     goto next
        jl.  (e31.)     ; end;
        0
  j3:   0
  j4:   0
  j5:   0
i.e.

; procedure write code;
;       call:               exit:
; w0                    destroyed
; w1                    destroyed
; w2                    destroyed
; w3    link            destroyed;
b.j4                    ; begin
w.b19:  rs.w3 e30.
        rl.w0 e16.      ;   instruction:= value;
        al w3 0
        ld w0 7
        rl.w2 x3+c0.    ;   load mnemonic code;
        la.w3 2.1
        ld w0 2
        sz w3 2.1
        al w2 x2+14     ;   add relative bit;
        am    1000
        rl.w3 x3+f94.   ;   load register part;
        so w2 2.1       ;   if w0 irrelevant then
        jl.   j0.       ;     begin
        am    1000
        sn.w3(f94.)     ;       if w0 then remove register part;
        rl.w3 c12.      ;       remove irrelevant mark
        al w2 x2+32-39  ;     end;
  j0:   sh w0 -1        ;   if indirect mark then
        am    40-32     ;     add left par
        al w3 x3+32     ;   else add space;
        ds.w3 e35.
        ld w0 2.11      ;   displ:= instruction(12:23);
        la.w3 c13.
        am    x3+1000
        rl.w2 x3+f95.   ;   load index part;
        sn w3 0         ;   if index=0 then
        al w2 0         ;     remove index part;
        sl w0 0         ;   if displ>=0
        al w2 x2+43     ;       and index<>0 then
        rs.w2 e36.      ;     add plus;
        bl w2 0
        al.w0 e34.
        rl.w1 g61.      ;
        jl.w3 h31.      ;   outtext(instruction addr);
        al w0 x2+0
        la.w2 c16.
        al w2 x2+1
        rs.w2 j4.
        rl.w1 g61.      ;
        jl.w3 h32.      ;   outinteger(<<d>,displ);
  j4:   1<23+1
        bl.w1 e16.
        sz w1 2.100     ;   if indirect instruction then
        am    41-32     ;     outchar(41)
        al w2 32        ;   else outchar(32);
        rl.w1 g61.      ;
        jl.w3 h26.  
        bl.w0 e39.
        bl.w1 e16.
        sl w0 0         ;   if displ>=0
        sz w1 2.11      ;       and index=0 then
        jl.   j1.       ;     outchar(32);
        jl.w3 g23.
  j1:   sh w0 -1        ;   if displ<=-1 then
        ac w0(0)        ;     displ:= -displ;
        sh w0 9         ;   if displ<=9 then
        jl.w3 g23.      ;     outchar(32);
        sh w0 99        ;   if displ<=99 then
        jl.w3 g23.      ;     outchar(32);
        sh w0 999       ;   if displ<=999 then
        jl.w3 g23.      ;     outchar(32);
        bl.w1 e16.
        sz w1 2.11      ;   if index<>0 then
        jl.   j2.       ;     outtext(<:    :>)
        so w1 2.1000    ;   else if -,relative instruction then
        jl.   j3.       ;     outtext(<:      :>)
        bl.w0 e39.      ;   else
        wa.w0 e13.      ;     begin
        rl.w1 g61.      ;
        jl.w3 h32.      ;       rel:= instruction(12:23)
        32<12+6         ;           +write addr;
        jl.  (e30.)     ;       outinteger(<<dddddd>,rel)
  j2:   jl.w3 g23.      ;     end
        am    +2
  j3:   al.w0 c4.
        rl.w1 g61.      ;
        jl.w3 h31.  
        jl.  (e30.)
i.e.                    ; end;

; procedure write words5;
; procedure write bytes10;
;       call:               exit:
; w0                    destroyed
; w1                    destroyed
; w2                    destroyed
; w3    link            destroyed;
b.j1
w.j0:   0
  j1:   rs.w3 j0.       ;  store link;
        rl.w1 e15.      ;
        sl.w1(e14.)     ;   if next addr>=top then
        jl.  (e31.)     ;     return to link;
        jl.w3 b1.       ;  increase addr;
        rl.w3(e13.)     ;
        rs.w3 e16.      ;  value:=word(write addr);
        jl.w3 x2+b5.    ;  write word or bytes;
        jl.  (j0.)      ;
  b21:  am    2         ; write bytes10:
  b20:  al w2 0         ; write words5:
        rs.w3 e31.      ;  store link;
        jl.w3 x2+b5.    ;  write word or bytes;
        jl.w3 j1.       ;
        jl.w3 j1.       ;
        jl.w3 j1.       ;
        jl.w3 j1.       ;
        jl.  (e31.)     ;
i.e.


; constants
; ' means w0 is irrelevant in write code
w.c0:   <:aw'do el hl la lo lx wa ws am'wm al ri'jl'jd'je':>
        <:xl'es ea zl rl sp're'rs wd rx hs xs'gg di ms'is':>
        <:ci ac ns nd as ad ls ld sh sl se sn so sz sx'gp :>
        <:fa fs fm ks fd cf dl ds aa ss 58'59'60'61'62'63':>
        <:aw'io bl hl la lo lx wa ws am'wm al ml'jl'jd'je':>
        <: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':>
  c2:   1000000
  c3:   <: =<0>:>
  c4:   <:      :>      ; 6 spaces (terminated by null)
  c5:   63              ; last 6 bits
  c6:   <:niveau<0>:>
  c7:   <:no core<0>:>
  c8:   <:core addr<0>:>
  c9:   <:format<0>:>
  c10:  <:<10>  :>
; c11 used
  c12:  <:  <0>:>
  c13:  3               ; last 2 bits
  c14:  <:clock:>,0,0,0
  c15:  500000
  c16:  1<23

; references
; f8 used
; f9 used
  f11:  jl.   g22.      ; outend(10);
  f12:  jl.   g27.      ; outinteger;
  f13:  rl.w1 g61.      ;
        jl.   h31.      ; outtext;
  f14:  rl.w1 g61.      ;
        jl.   h33.      ; outend;
  f15:  jl.   g25.      ; outchar(46);
; f96 used
; f97 used
; f98 used
; f99 used

; variables             ; w3 copy
w.e0=k+2                ; w0 addr
  e1=e0+2               ; w1 addr
  e2=e0+4               ; w2 addr
  e3=e0+6               ; w3 addr
                        ; z3 copy
                        ; z0 addr
                        ; z1 addr
                        ; z2 addr
                        ; z3 addr
  e4=e0+8+10            ; x0 addr
  e5=e4+2*f1            ; x1 addr
  e6=e4+4*f1            ; x2 addr
  e7=e4+6*f1            ; x3 addr
b.j0
w.g70:  rs.w1 e23.      ; init do;
        rs.w2 e11.      ;  cur com:= current command;
        jl.w1 g30.      ;  init program;
        al.w1 e9.       ;
        wa.w1 e9.       ;
        se w2 0         ; if left side in call then
        al w1 x1+512    ;    save addr:=first free addr+share
        rs.w1 e9.       ;  else save addr:=first free addr;
        al w1 x1+18+8*f1;
        rs.w1 e10.      ;  buf addr:=save addr+variable length;
        rl.w2 e11.      ;
        sl w1 x2+2      ;   if buf addr>=cur com+2 then
        jl.   a27.      ;     goto no core error;
        al.w1 d0.       ;   set address of fpnames;
        rx.w1 e29.
        am    h10+h76-h55
        rx.w1 h55.      ;   save(fp interrupt instruction);
        rs.w1 e37.      ;   insert(goto after interrupt);
        al.w1 f8.
        al w1 x1+2      ;   set table references;
        al w0 x1+0
        wa w0 x1+0
        rs w0 x1+0
        sh.w1 f9.
        jl.   -10
        al.w1 e38.      ;
        wa.w1 e38.      ;   set param addr reference;
        rs.w1 e38.
        am    -2000     ;
        al.w1 h21.+2000 ;
        rs.w1 g60.      ;  g60:=h21;
        rs.w1 g61.      ;  g61:=h21;
        rl.w2 g13.      ; if word(g13)=0 <=>
        sn w2 0         ;  no left side in call of do
        jl.   j0.       ;    then goto restore;
        am    -2000     ;
        al.w1 h19.+2000 ;
        rs.w1 g60.      ;  g60:=h19
        jl.w3 h79.      ;  terminate cur prog zone;
        rl.w3 e9.       ;
        al w3 x3-512    ;
        am    -2000     ;
        rs.w3 h80.+2+2000;  insert share addr in sh descr;
        al w0 1<1+1     ;
        jl.w3 h28.      ;  connect output;
        sn w0 0         ;  if no error then 
        jl.   j0.       ;    goto restore;
                        ; error:
        jl.w3 g41.      ;  error text;
        al w2 48        ;  w2:=
        wa w2 0         ;      error cause+48;
        jl.w3 h26.-2    ;  outchar current;
        jl.w3 g23.      ;  outchar(<sp>);
        rl.w0 g13.      ;  outtext
        jl.w3 h31.-2    ;    call-name;
        jl.w3 g22.      ;  outchar <nl>;
        jl.   g28.      ;  end program(sorry);
  j0:   al.w3 a34.      ;  restore variables;
        jl.   d19.      ;  goto do;
i.e.

h.r.e4.+8*f1+1
w.e9:   e8.             ; save addr
  e10:  0               ; buf addr
  e11:  0               ; cur com
  e23:  0               ; fp base
  e29:  jl.   f10-h10-h76; fpnames       , goto after interrupt
  e12:  0               ; operator      , write base  , slang addr
  e13:  0               ; word          , write addr  , instruction
  e14:  0               ; base          , write top   , slang mode
  e15:  0               ; xy index      , next addr
  e16:  0               ; step          , value       , begin name
  e39=e16+1
  e17:  0               ; value index   , text addr   , end name
  e18:  0               ; old operator  , niveau      , skip level
  e19:  0,r.f5          ; repeat(niveau)
  e20:  0               ; written
        0               ; addr(niveau)
  e21:  0               ; shift(niveau)
  e22:  0,r.f3*3-2      ; index(niveau)
        d5.             ; last action table addr
  e24:  d4.             ; last output table addr
        d3.             ; last format table addr
        d2.             ; last word table addr
  f8=e24-4
  f9=e24+2
  e25:  0               ; next delim
  e26:  0,r.f5          ; procedure(number)
  e27:  0               ; w or z
  e28:  0               ; write index
  e30:  0               ; saved link
  e31:  0               ; saved link
  e32:  0               ; saved link
  e34:  <:  <127>:>
        <:al.:>
  e35:  <:w2(:>
  e36:  <:x1+:>
  e33:  -2              ; repeat niveau
  e37:  0               ; saved fp interrupt instruction
  e38:  g10.            ; param addr reference

; procedure lookup word(index,wz,xy,operator,special,other name);
;       call:           exit:
; w0                    exit
; w1                    index
; w2                    unchanged
; w3    link            unchanged;
b.j1                    ; begin
w.d10:  rl.w0(g16.)     ;   word:= word(param);
        rs.w0 d2.       ;   word table(last):= word;
        al w1 -2        ;   index:= -2;
  j0:                   ; next word:
        al w1 x1+2      ;   index:= index+2;
        se.w0(x1+d1.)   ;   if word<>word table(index) then
        jl.   j0.       ;     goto next word;
        rs.w1 e17.
        al.w1 x1+d1.    ;   text addr:= index+word table start;
        rx.w1 e17.
        sl w1 32        ;   if index>=32 then
        jl.   j1.       ;     goto not variable;
        sl w1 16        ;   return:= if index>=16 then
        al w3 x3+2      ;       xy else wz;
        sl w1 16        ;   if index>=16 then
        al w1 x1-16     ;     index:= index-16;
        sl w1 8         ;   if index>=8 then
        al w1 x1+2      ;     index:= index+2;
        jl    x3+0      ;   goto return;
  j1:                   ; not variable:
        al w1 x1-32     ;   index:= index-32;
        sh w1 30        ;   if index<=30 then
        jl    x3+4      ;     goto operator;
        al w1 x1-32     ;   index:= index-32;
        sh w1 6         ;   if index<=6 then
        jl    x3+6      ;     goto special;
        jl    x3+8      ;   goto other name
i.e.                    ; end;

; procedure lookup format(index,sorry);
; procedure lookup output(index,sorry);
; procedure lookup action(index,sorry);
;       call:           exit:
; w0                    -1
; w1                    index
; w2                    pointer
; w3    link            destroyed;
b.j3                    ; begin
w.d11:  am    2         ;   last:= last addr(format, output,
  d12:  am    2         ;       or action table);
  d13:  dl.w1 e24.      ;   entry:= first addr(format, output,
        ds.w0 e31.      ;       or action table);
        al w3 x1+0      ; next entry:
  j0:   al w3 x3+2      ;   entry:= entry+2;
        rl.w2 g16.      ;   pointer:= param;
        al w1 x3+0      ;   index:= entry
        wa w1 x1+0      ;       +word(entry);
        rs.w1 e17.      ;   text addr:= index;
  j1:   rl w0 x1+0      ; test word:
        se w0(x2+0)     ;   if word(index)<>word(pointer) then
        jl.   j2.       ;     goto not equal;
        al w2 x2+2      ;   pointer:= pointer+2;
        al w1 x1+2      ;   index:= index+2;
        jl.   j1.       ;   goto test word;
  j2:                   ; not equal:
        se w0 -1        ;   if word(index)<>-1 then
        jl.   j0.       ;     goto next entry;
        sl.w1(e31.)     ;   if index>=last then
        jl.  (e30.)     ;     goto sorry;
        rl.w3 g10.
  j3:   rs.w3 g10.      ;   while pointer>=param addr+2 do
        ba w3 x3+1      ;     param addr:= param addr
        sl w2 x3+2      ;         +byte(param addr+1);
        jl.   j3.
        rl.w3 e30.
        jl    x3+2      ; end;
i.e.

; procedure stack pointer;
;       call:           exit:
; w0                    unchanged
; w1                    destroyed
; w2                    unchanged
; w3    link            unchanged;
w.d14:  rl.w1 e33.      ; begin
        al w1 x1+2      ;   niveau:= repeat niveau+2;
        sl w1 2*f5      ;   if niveau>=2*repeat niveaus then
        jl.   a1.       ;     goto list;
        rs.w1 e33.      ;   repeat niveau:= niveau;
        rs.w3 x1+e19.   ;
        rl.w3 g10.      ;   repeat(niveau):= param addr
        rx.w3 x1+e19.   ;
        jl    x3+0      ; end;

; procedure next param(end list,space integer,
;     space name,point name,point integer);
; procedure list and next param(end list,space integer,
;     space name,point name,point integer);
;       call:           exit:
; w0                    length
; w1                    destroyed
; w2                    param
; w3    link            next delim;
b.j2                    ; begin
w.d15:  rs.w3 e30.      ; next param entry:
        jl.   j1.       ;   get param
  d16:  rs.w3 e30.      ;       or
  j0:   am    g52-g50   ; list and next param entry:
  j1:   jl.w3 g50.      ;   list param
        jl.  (e30.)     ;       (end list);
        rs.w3 e25.      ;   save(next delim);
        sn w1 8         ;   if delim=8 then
        jl.   j2.       ;     goto point;
        rl.w1 e30.      ;   if length=4 then
        sn w0 4         ;     goto space integer;
        jl    x1+2
        jl    x1+4      ;   goto space name;
  j2:   rl.w1 e30.      ; point:
        se w0 4         ;   if length<>4 then
        jl    x1+6      ;     goto point name;
        jl    x1+8      ;   goto point integer
i.e.                    ; end;

; procedure write item;
;       call:           exit:
; w0                    destroyed
; w1                    destroyed
; w2                    destroyed
; w3    link            destroyed;
b.j6                    ; begin
w.d17:  rs.w3 e32.
        dl.w2 e14.
        al w2 x2-1
        sl w1 0         ;   if write addr<0
        sl w2(116)      ;       or write top-1>=core top then
        jl.   a28.      ;     goto core addr error;
        al w3 0         ;   niveau:= 0;
        jl.   4         ;   if false then
  j0:   jl.   a29.      ;     goto format error;
        rl.w1 e22.      ;   index:= format index;
; j0+4:                 ; new niveau:
        rs.w1 x3+e22.   ;   index(niveau):= index;
; j0+6:                 ; repeat compound:
        rl.w1 x3+e22.   ;   index:= index(niveau);
        al w1 x1+2      ;   addr(niveau):= index+2;
; j0+10:                ; repeat compound word:
        al w2 -18       ;   shift(niveau):= -18;
        jl.   j2.       ;   goto next format;
; j0+14:                ; old niveau:
        al w3 x3-6      ;   niveau:= niveau-6;
        sh w3 -6        ;   if niveau<=-6 then
        jl.  (e32.)     ;     goto exit;
  j1:   dl.w2 x3+e21.   ; next format:
  j2:   rl w0 x1+0      ;   word:= word(addr(niveau));
        ls w0 x2+0      ;   word:= word shift shift(niveau);
        la.w0 c5.       ;   format:= word(18:23);
        sh w0 4         ;   if format<=4 then
        jl.   j3.       ;     goto test format;
        al w2 x2+6      ;   shift(niveau):= shift(niveau)+6;
        sh w2 0         ;   if shift(niveau)<=0 then
        jl.   j3.       ;     goto test format;
        al w1 x1+2      ;   addr(niveau):= addr(niveau)+2;
        al w2 -18       ;   shift(niveau):= -18
  j3:   ds.w2 x3+e21.   ; test format:
        rs.w3 e18.
        sl w0 f2        ;   if format>=first compound then
        jl.   j6.       ;     goto compound;
        rl w2 0         ;   value:= word(write addr);
        rl.w0(e13.)     ;   
        rs.w0 e16.      ;     
        sl w2 5         ;   if format>=5 then
        al.w3 j5.       ;     w3:=link j5
        bl.w2 x2+4      ;   case format of
  b0:   jl.   x2        ;     begin
h.      j0+0-b0         ;       0:  goto format error;
        j0+4-b0         ;       1:  goto new niveau;
        j0+6-b0         ;       2:  goto repeat compound;
        j0+10-b0        ;       3:  goto repeat compound word;
        j0+14-b0        ;       4:  goto old niveau;
        b5-b0           ;       5:  write word;
        b6-b0           ;       6:  write bytes;
        b7-b0           ;       7:  write text;
        b8-b0           ;       8:  write octets;
        b9-b0           ;       9:  write sixtets;
        b10-b0          ;      10:  write octal;
        b11-b0          ;      11:  write binary;
        b12-b0          ;      12:  write new line;
        b13-b0          ;      13:  write empty;
        b14-b0          ;      14:  write index;
        b15-b0          ;      15:  write double;
        b16-b0          ;      16:  write name;
        b17-b0          ;      17:  write procname;
        b18-b0          ;      18:  write procnames;
        b19-b0          ;      19:  write code;
        b20-b0          ;      20:  write words5;
        b21-b0          ;      21:  write bytes10;
w.j5:   rl.w3 e18.      ;     end;
        jl.   j1.       ;   goto next format;
  j6:   am   (0)        ; compound:
        al w1 -64
        ls w1 1         ;   index:= format index table(format);
        al.w1 x1+d0.
        wa w1 x1+0      ;   niveau:= niveau+6;
        al w3 x3+6
        sl w3 f3*6      ;   if niveau>=format niveaus*6 then
        jl.   a26.      ;     goto niveau error;
        jl.   j0.+4     ;   goto new niveau;
                        ; exit:
i.e.                    ; end;

; procedure save variables;
; procedure restore variables;
;       call:           exit:
; w0                    destroyed
; w1                    destroyed
; w2                    destroyed
; w3    link            unchanged;
b.j0                    ; begin
w.d18:  al.w1 e0.       ; save variables entry:
        rl.w2 e9.       ;   from:= w0 addr;
        jl.   j0.       ;   to:= save addr;
  d19:  rl.w1 e9.       ;   goto move;
        al.w2 e0.       ; restore variables entry:
  j0:   rl w0 x1+0      ;   from:= save addr;
        rs w0 x2+0      ;   to:= w0 addr;
        al w1 x1+2      ; move:
        al w2 x2+2      ;   word(to):= word(from);
        se.w1(e10.)     ;   from:= from+2;
        sn.w2(e10.)     ;   to:= to+2;
        jl    x3+0      ;   if to<>buf addr and from<>buf addr then
        jl.   j0.       ;     goto move
i.e.                    ; end;

; procedure skip block(begin name,end name);
;       call:           exit:
; w0    begin name      destroyed
; w1    end name        destroyed
; w2                    destroyed
; w3    link            destroyed;
b.j3                    ; begin
w.d20:  rs.w3 e31.      ;
        ds.w1 e17.      ;
        al w0 1         ;   skip level:= 1;
        rs.w0 e18.      ; skip:
  j0:   jl.w3 d15.      ;   next param(
        jl.   a4.       ;       terminate,
        jl.   j0.       ;       skip,
        jl.   j1.       ;       space name,
        jl.   j0.       ;       skip,
        jl.   j0.       ;       skip);
  j1:   rl w0 x2+0      ; space name:
        sn.w0(j3.)      ;   if name=<:go:> then
        jl.   j0.       ;     goto skip;
        sn.w0(e16.)     ;   if name=begin name then
        jl.   j2.       ;     goto increase level;
        se.w0(e17.)     ;   if name<>end name then
        jl.   j0.       ;     goto skip;
        am    -2        ;   skip level:= skip level-2;
  j2:   al w1 1         ; increase level:
        wa.w1 e18.      ;   skip level:= skip level+1;
        rs.w1 e18.      ;
        sl w1 1         ;   if skip level>=1 then
        jl.   j0.       ;     goto skip
        jl.  (e31.)     ;
j3:     <:go:>          ;
i.e.                    ; end;
▶EOF◀