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

⟦4f4533e12⟧ TextFile

    Length: 72192 (0x11a00)
    Types: TextFile
    Names: »write2tx    «

Derivation

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

TextFile


; rc 75.11.04.  list of pageheads;                      write(seg. ); page  0


; list of pageheads;                      write(seg. ); page  0
; definition of stack variables;          write(seg. ); page  1
; start write; take the zone;             write(seg.1); page  2
; take next formal; type switch;          write(seg.1); page  3
; long;  string;                          write(seg.1); page  4
; unpack layout; unpack string portion;   write(seg.1); page  5
; boolean; long array; integer;           write(seg.1); page  6
; real; return; kind error;               write(seg.1); page  7
; start segment 2; explanation;           write(seg.2); page  8
; conv. number: utility procedures;       write(seg.2); page  9
; outchar; variables for conv. number;    write(seg.2); page 10
; start number conversion;                write(seg.2); page 11
; conv. number: generate digits;          write(seg.2); page 12
; print digits before the point;          write(seg.2); page 13
; print digits after the point;           write(seg.2); page 14
; all spaces out for b-format;            write(seg.2); page 15
; conv. real: const. and variables;       write(seg.3); page 16
; real to number, exp10, and zeroes;      write(seg.3); page 17
; real to number, exp10, and zeroes;      write(seg.3); page 18
; print the exponent part;                write(seg.3); page 19
; print the exponent part;                write(seg.3); page 20
; prodedures outchar, -text, -integer;    write(seg.4); page 21
; prodedures outchar, -text, -integer;    write(seg.4); page 22
; prodedures outchar, -text, -integer;    write(seg.4); page 23
; prodedures outchar, -text, -integer;    write(seg.4); page 24
; prodedures outchar, -text, -integer;    write(seg.4); page 25
; prodedures outchar, -text, -integer;    write(seg.4); page 26
; prodedures outchar, -text, -integer;    write(seg.4); page 27
; prodedures outchar, -text, -integer;    write(seg.4); page 28
; definition of entry points;             write(seg.4); page 29
; tails for catalog;                      write(seg. ); page 30

\f


; jz 81.06.23..  definition of stack variables;          write(seg. ); page  1




;b. h100               ; outer block with fp names
b. g10,d15 w.
 
d.
p. <:fpnames:>
l.

s. a102,b69,c25,e39,f11,g34,i42,j56

w.
 
 
;constants
g0=68                 ; number of reserved bytes

;stack variable and constant addresses relative to sref
 i0=  -g0 ;word        ; param addr
 i2= 4-g0 ;double word ; string;  spaces remaining
 i3= 6-g0 ;byte        ; b           )
 i4= 7-g0 ;  -         ; h,          ) must
 i5= 8-g0 ;  -         ; d           ) be
 i6= 9-g0 ;  -         ; pnfn(rt.byte) consecutive
 i7=10-g0 ;  -         ; s           )
 i8=11-g0 ;  -         ; pefe        )
 i9=12-g0 ;word        ; spaces in layout
i10=14-g0 ;byte        ; state:  procedure < 6 +layouttype
                       ;    procedure = 1   means write
                       ;        -     = 0     -   writeint
                       ;   layouttype = 2.00  -   no     layout
                       ;        -     = 2.01  -   integer   -
                       ;        -     = 2.10  -   real      -
i11=15-g0 ;byte        ; sign (character);
i12=16-g0 ;word        ; following zeroes, new s
i13=18-g0 ;  -         ; exp10
i14=20-g0 ;  -         ; haddr
i15=8     ;  -         ; record base addr
i16=6     ;  -         ; partial word addr
i17=26-g0 ;  -         ; last formal addr
i18=28-g0 ;  -         ; last literal addr
i19=30-g0 ;  -         ; general return save
i20=32-g0 ;  -         ; boolchar
i21=34-g0 ;  -         ; remaining bits in spaceword
i22=22-g0 ;double      ; character count
i23=24-g0 ;word        ; error (1=false, -1=true)
i24=36-g0 ;word        ; pointer, long array; daddr
i25=38-g0 ;  -         ; upper index, long array; digit base
 
i32=40-g0  ; leading space char
i33=41-g0  ; space in number char
i34=42-g0  ; positive sign char
i35=43-g0  ; negative sign char
i36=44-g0  ; decimal point char
i37=45-g0  ; exponent mark char
i38=46-g0  ; ending space
i39=47-g0  ; termination star
i40=48-g0  ; terminating sign (even=false, odd=true)
i41=49-g0  ; exponent sign
i42=51-g0  ; max char count
 
                       ; now follow 15 bytes to hold digits of converted
                       ; number part i.e. g0 must be  >= 40 + 15;
;    notice   in the code below it is used that h3=0, that
;             is that the address of base address = zone descriptor
;             address
\f



; jz.fgs 1981.06.09               segment 0           write, page 1a
 
 
k = 0 , g1 = 0          ; no of externals = 0
h.                      ;
 
g31:        g32 , g33   ; rel of last point , rel of last absword
j41: 1<11 +   1 ,   0   ; segment 1 address
j42:   g1 +  21 ,   0   ; rs entry 21 : general alarm
j44:   g1 +  13 ,   0   ; rs entry 13 : last used
j45:   g1 +  30 ,   0   ; rs entry 30 : (saved sref, saved w3)
j46:   g1 +   6 ,   0   ; rs entry  6 : end register expression
j47:   g1 +   4 ,   0   ; rs entry  4 : take expression
j55:   g1 +  29 ,   0   ; rs entry 29 : param alarm
j48:          0 ,   0   ; own core    : own base
j52:          0 , e29   ; own core    : outtable base
j53:          0 , e31   ; own core    : outtable(lower index)
 
g33 = k - 2 - g31       ; rel of last abs word
 
j43: 1<11+0 , e19       ; alarm text point
 
g32 = k - 2 - g31       ; rel of last point
  
 
w.                      ;
 
f2:  0                  ; start external list:
     e28                ; no of owns to initialize = e28
h.                      ;
 
f11: 32, 32, 43     , 45; leading space, space in number, plus     , minus
     46, 39, 32     , 42; point        , exp mark       , ending sp, star
      1,  1, 2.11<10,  0; std int layout: b=h=1, leading sp=1, rest=0
      0, 32, 43     ,  0;
 
w.                      ;
 
\f


 
; jz.fgs 1981.06.23              segment 0                write, page 1b
 
 
 
b61: e29 = k-f11 , 0   ; outtable base
b62: e30 = k-f11 , 0   ; upper index(outtable)
b63: e31 = k-f11 , 0   ; lower index(outtable)
b65: e33 = k-f11 , 0   ; outindex


e34 = k-f11            ; entry convert char:
 
     sz  w0  -1<8      ; convert char:
     jl       x1       ;   if char shift (-8) <> 0
     am.     (b61.)    ;    then return;
     sn  w3   x3       ;   if base = 0 then
     jl       x1+2     ;    return 2;
     hs. w0  b69.      ;   save char;

a101:wa. w0   b65.     ; lookup: field := ( char + outindex )
     ls  w0   1        ;          * 2;
     sh. w0  (b62.)    ; if field > upper field or
     sh. w0  (b63.)    ;    field <=lower field
     jl       x1       ; then return0 (= skip char)
     wa. w0   b61.     ; entry := field + outtable base
     rl  w0 (0)        ;   w0 := class shift 12 + value;
     hs. w0  b68.      ;   save value;
     zl  w0  0         ;   w0 := class;
     se  w0  1         ;   if class = 1 <* shift character *> then
     jl.     a102.     ;    begin
     zl. w0  b68.      ;     outindex := value;
     rs. w0  b65.      ;     goto lookup;
b69 = k + 1; saved char
     al  w0  0         ;     w0 := saved char;
     jl.     a101.     ;    end;
b68 = k + 1; saved value
a102:al  w0  0         ;   w0 := value;
     sz  w0  -1<8      ; if conv char shift (-8) <> 0
     jl       x1       ; then return0 (= skip char)
     jl       x1+2     ; else return2 (= normal char)
 
e28 = k - f11          ;   no of owns to initialize
     s3    ,   s4      ;   time and date
; end external list
 
 
e24: rl  w1  0         ; zone alarm:
     al. w0  b0.       ;   w1 := zone state;
     jl.    (j42.)     ;   general alarm(<:z. state:>);
b0:  <:<10>z. state:>  ;
 
e23: rl. w0  j43.      ; kind error:
     al  w1  -1        ;   w0 := alarm text point;
     rs  w1  x2+i23    ;   error := -1;
     rl. w3 (j41.)     ;
     jl      x3+e25    ;   goto long string (segment 1);
 
     <:aram<10><0>:>   ; alarm text: (stored backwords)
     <:ite: p:>        ;
     <:<10>***wr:>     ;
 
e19 = k - 2            ; address of string point
 
\f


 
; jz 1980.01.07             segment 0            write, page 1c
 
  
e27: rl. w2 (j44.)     ; replace char:
     ds. w3 (j45.)     ;   (saved w2,w3) := lastused,call
 
     dl  w1  x2+8      ; first param:
     so  w0  16        ;
     jl. w3 (j47.)     ;
     ds. w3 (j45.)     ;
     rl  w1  x1        ;   charindex := w1 := value(first param);
     al. w0  b67.      ;
     sl  w1  0         ;   if charindex < 0
     sl  w1  8         ;   or charindex >= 8
     jl. w3 (j42.)     ;   general alarm(<:replace:>);
     wa. w1  j48.      ;   charaddr := charindex + ownbase;
     rs  w1  x2+6      ;
 
     dl  w1  x2+12     ; second param:
     so  w0  16        ;
     jl. w3 (j47.)     ;
     ds. w3 (j45.)     ;
     rl  w0  x1        ;
     bl  w1 (x2+6)     ;   replacechar:=w1:=core(charaddr);
     hs  w0 (x2+6)     ;   core(charaddr) := value(second param extract 8;
 
     rl. w3  j48.      ;
     bz  w0  x3+2      ;
     hs  w0  x3+14     ;   plus in signtable := plus;
     bz  w0  x3+0      ;
     hs  w0  x3+13      ;   space in signtable := leading space;
 
     jl.    (j46.)     ;   goto end reg. expression;
 
b67: <:<10>replace:>
 
\f


 
; jz.fgs 1981.06.09                segment 0             write, page  1d
 
 

  
e35: rl. w2 (j44.)     ; entry outtable:
     ds. w3 (j45.)     ;   (saved sref,saved w3) := (last used,return);
 
     al  w0  2.11111   ;   type :=
     la  w0  x2+6      ;    first word of param extract 5;
     se  w0  18        ;   if type <> 18 them
     jl.     e36.      ;    goto check integer;
 
     rl  w1  (x2+8)    ; integer array:
     rs. w1  (j52.)    ;   outtable base := base word(array);
     bl  w1  x2+6      ;   dope address :=
     wa  w1  x2+8      ;    base word address + dope rel;
     dl  w1  x1        ;   (upper,lower) of outtable :=
     ds. w1 (j53.)     ;   dope vector(array);
     jl.    (j46.)     ;   goto end register expression;
 
e36: sn  w0  10        ; check integer:
     jl.     e37.      ;   if type <> integer expression
     se  w0  26        ;   and type <> integer variable 
     jl. w3 (j55.)     ;   then param alarm;
e37: al  w0  0         ;
     rs. w0 (j52.)     ;   outtable base := 0;
     jl.    (j46.)     ;   goto end register expression;
\f


  
; jz 1980.01.09               segment 0                 write, page 1e
 
 
 
e7:  rl. w2 (j44.)     ; entry isotable:
     ds. w3 (j45.)     ;   (saved sref,saved w3) := (last used,this seg);
     rl  w3  x2+8      ;
     ba  w3  x2+6      ;   w3 := addr(dope vector(param));
     al  w1  0         ; check array bounds:
     sh  w1 (x3-2)     ;   if 0 > upper index
     sh  w1 (x3)       ;   or 0 <=lower index then
     jl.     a9.       ;   index alarm;
     al  w1  254       ;
     sh  w1 (x3-2)     ;   if 254 > upper index
     sh  w1 (x3)       ;   or 254 <=lower index then
     jl.     a9.       ;   index alarm;
 
     rl  w3 (x2+8)     ;   index := addr(array(0,...));
     al  w2  0         ;   char := 0;
     al  w1  -2        ;   table_index :=
     rs. w1  b2.       ;    -1;
 
a6:  sz  w2  2.111     ; next char:
     jl.     a8.       ;   if char extract 3 = 0 then
     rl. w1  b2.       ;    begin
     al  w1  x1+2      ;     table_index := table_index + 1;
     rs. w1  b2.       ;     entry := class_table(table_index);
     rl. w1  x1+b1.    ;    end;
 
a8:  al  w0  0         ;   class :=
     ld  w1  3         ;    bits(0,2,entry);
     hs  w0  4         ;   entry := entry shift 3;
     rs  w2  x3        ;   array(index) := class shift 12 + char;
     al  w2  x2+1      ;   char := char + 1;
     al  w3  x3+2      ;   index := index + 1;
     sz  w2  2.1111111 ;   if char extract 7 <> 0 then
     jl.     a6.       ;    goto next char;
 
\f


 
; jz 1980.01.09             segment 0                 write, page 1f
 
 
 
 
      al  w1  8         ;
      rl. w2 (j44.)     ;   restore w2;
      rl  w3 (x2+8)     ;
      hs  w1  x3+19     ;   array(10) := 8 shift 12 + 10;
      hs  w1  x3+23     ;   array(12) := 8 shift 12 + 12;
      hs  w1  x3+49     ;   array(25) := 8 shift 12 + 25; em;
      jl.    (j46.)     ;   goto end register expression;
 
b4:   <:<10>index   :>
 
a9:   al. w0  b4.       ; index alarm:
      ls  w1  -1        ;
      jl. w3 (j42.)     ;
 
 
 
; class table:
 
b1:   8.07777777, 8.77070077, 8.77777777, 8.70777777 ; 0  -31
      8.77777775, 8.77737347, 8.22222222, 8.22777777 ; 32 - 63
      8.76666666, 8.66666666, 8.66666666, 8.66666677 ; 64 - 95
      8.76666666, 8.66666666, 8.66666666, 8.66666670 ; 96 -127
 
b2:   0  ; table_index
 
  
  
g34: c. g34 - 506,
        m. seg. 0 code too long
     z.
 
m. segment 0
 
     c. 502-g34, 0, r.252-g34>1 z.  ; fill segment
 
     <:write:>,0,0
 
\f


; jz.fgs 1981.06.09.  start write; take the zone;       write(seg.1); page  2


k=0
h.

 g2:     g15,        g3; rel. last point, rel. last abs word
 j0:  g1+30 ,    0     ; rs entry 30, save sref
 j1:  g1+ 3 ,    0     ;     -     3, reserve
 j3:  g1+ 4 ,    0     ;     -     4, take expression
 j4:  g1+13 ,    0     ;     -    13, last used
 j5:  g1+16 ,    0     ;     -    16, seg table base
 j7:  g1+ 6 ,    0     ;     -     6, end reg expr
j24:  g1+60 ,    0     ;     -    60, last of segment table
 j8:  1<11+1,    0     ; seg. 2 addr
 j9:  1<11+2,    0     ; seg. 3 addr
 j10: 1<11 o. (:-1:),0 ; seg. 0 addr
j36:      0 ,    3     ; own core: fillchars(1:4);
j37:      0 ,    7     ; own core: fillchars(5:8);
j23:  g1+46 ,    j30   ; rs entry 46, float long, chain for rel
g3=k-g2-2
 g15=k-g2-2

w.
f3:
e0: am       1<6       ; entry write: state := 1<6; skip next;
e18:al  w0     0       ; entry writeint: state := 0;

    rl.  w2    (j4.)   ; write(z, any number of variables
    ds.  w3    (j0.)   ;       or expressions);
    al   w1    -g0-6   ;    w2:=saved sref:=last used;
    jl.  w3    (j1.)   ;    reserve local variables;
    al  w1  x1+6       ;   check room for 3 words for
    rs. w1 (j4.)       ;   take expression(outblock);
    hs  w0  x2+i10     ;   save state
    dl.  w1  (j36.)    ;   move fillchars
    ds   w1   x2+i35   ;
    dl.  w1  (j37.)    ;   to
    ds   w1   x2+i39   ;   stack;
    al   w0    0       ; initialize char count
    al   w1    1       ;
    ds   w1  x2+i23    ;    char count :=0; error:=1;
    al   w1    -1      ;
    rs   w1  x2+i42    ;   maxcount := -1;
    rl   w1  x2+8      ; get zone formals:  w1:=zone descr;
    rl   w0  x1+h2+6   ;    w0:=zone state;
    se   w0    3       ;    if zone state=after write
    sn   w0    0       ;     or zone state=after open
    jl.        a2.     ;    then goto zone addr;
    rl. w3     (j10.)  ;
    jl  w3  x3+e24     ;   goto zone alarm (segment 0)
a2: al   w0  x1+h2+4   ;    partial woerd addr:=
    rs   w0  x2+i16    ;     zone descr+h2+4;
    al   w0    3       ;    zone state:=
    rs   w0  x1+h2+6   ;     after write;

    al   w1  x2+9      ; init formal count:
    rs   w1  x2+i17    ;    last formal addr:=2nd word of
    ba   w1  x2+4      ;     first formal addr;
    al   w1  x1-2      ;    last literal addr:=1st word of
    rs   w1  x2+i18    ;     first formal addr+appetite;




\f


; jz 79.01.30.  take next formal; type switch;          write(seg.1); page  3


c25:al   w3    0       ; take formal1: w3:=0;
e13:rs   w3  x2+i19    ;    save state after boolean
    rl   w1  x2+i17    ; 
    al   w1  x1+4      ;    w1:=last formal addr+4;
    sl   w1  (x2+i18)  ;    if w1>=last literal addr
    jl.        e2.     ;    then goto end write;

    rs   w1  x2+i17    ; check formal: save last formal addr;
    dl   w1  x1        ;    w01:=formal;
    al   w3     2.11111;    kind:= first formal
    la   w3     0      ;       extract 5
    sn  w3     20      ;   if kind = 20 then
    jl.        c6.     ;   goto long array;
    sl   w3     16     ;   if (kind > 16
    sl   w3     23     ;    and kind <= 23)
    sn   w3     0      ;    or kind = 0
    jl.         e4.    ;   then goto kind error
    so   w0     16     ;   if expression
    jl.  w3    (j3.)   ;     then take expression;
    ds.  w3    (j0.)   ;     w2:=saved sref; 
a21:sl   w1  (x2+i17)  ;    if last formal addr<
    sl   w1  (x2+i18)  ;     abs addr of result<
    jl.        a0.     ;     last literal addr
    rs   w1  x2+i18    ;    then last literal addr:=abs addr;
 a0:rs  w1   x2+i0     ;    param addr:=abs addr;

    al   w3    7       ; type switch:
    am       (x2+i17)  ;    w3:=type;
    la   w3    -2      ;
    sl   w3     5      ;   if type>=5
    jl.         e4.    ;    then goto kind error
    ls   w3    1       ;    type:=2*type;
    am       (x2+i19)  ;    if general return<>0 then
    jl.        a61.    ;    goto after boolean return (a17)
a61:jl.      x3+a1.    ;    else goto case(type) of
 a1:jl.        c0.     ;     string,
    jl.        c3.     ;     boolean,
    jl.        c4.     ;     integer,
    jl.        c5.     ;     real,
                       ;     long; 
\f


; jz 79.01.30.  long;  string;                          write(seg.1); page  4


    dl   w1  x1        ; long:  w0w1 := long;
    bz  w3  x2+i10     ;   if state = real layout
    so  w3  1<6+1<1    ;   and procedure = write then
    jl.        a18.    ;   begin
    rl. w3 (   j23.)   ;     convert long
    jl  w3  x3+0       ;    goto real jump;
j30=k-1                ;     comment chain for rel;
    jl.        a25.    ;   end;
a18:rl  w3  x2+i17     ; number taken:
    ds  w1  x3         ;   formal(last formal) := number;
    rs  w3  x2+i0      ;   param addr := last formal;
    rl. w3 (   j8.)    ;   goto integer
    jl      x3+e5      ;    on segment 2;

e25:  ; entered from segment 0 (kind alarm)
 c1:rl   w3    0       ; long string:  w3:=addr bytes;
 a5:rs  w3   x2+i0     ; save addr bytes:
    hs.  w3    a22.    ;    store rel addr;
    bz   w3    6       ;    w3:=2*seg. table entry
    ls   w3    1       ;     +seg. table base;
    wa.  w3    (j5.)   ;
    rl.  w1    (j24.)  ;
    sl   w3     x1     ;   if w3 >= last of segment table
    jl.         e4.    ;     then kind error
    rl   w3  x3        ;    w3:=seg. table word;
a22=k+1
    dl   w1  x3        ;    w01:=string words;
    sh   w1    -1      ;    if w1=string pointer
    jl.        c1.     ;    then goto long string;
    jl.  w3    e12.     ;    unpack string;
    rl   w3  x2+i0     ;    w3:=seg. number shift 12
    al   w3  x3-4      ;     +rel addr-4;
    jl.        a5.     ;    goto save addr bytes;

c2: jl.  w3     e12.   ; short string:  unpack string
    dl   w1  (x2+i17)  ;  take string formal
    sz   w0     16     ;   if not expression
    jl.         e1.    ;   then goto take formal
    jl.  w3    (j3.)   ;   take expression
    ds.  w3    (j0.)   ;    save sref

c0: dl   w1    x1      ; string:  take portion
c7: sh   w1    -1      ;   if long string
    jl.        c1.     ;   then goto long string
    sl   w0     0      ;   if short string
    jl.        c2.     ;   then goto short string
                       ;   else continue unpack layout;
\f


; jz 79.01.30.  unpack layout; unpack string portion;   write(seg.1); page  5


; unpack layout:
    rs  w0  x2+i9      ;   spaces in layout := first layoutword;
    al  w0     0       ;
    ld  w1     6       ;   b :=  b-bits;
    hs  w0  x2+i3      ;
    al  w0     0       ;
    ld  w1     4       ;
    hs  w0  x2+i4      ;   h :=  h-bits;
    bs  w0  x2+i3      ;
    sn  w0     0       ;   if h-b = 0 and
    sz. w1 (   b10.)   ;     d = s = pefe = 0 then
    am       1<1-1     ;   newstate := integer layout
    al  w3       1     ;   else newstate := real layout;
    bz  w0  x2+i10     ;
    sz  w0     1<6     ;   if state = in writeinteger then
    al  w3  x3+1<6     ;   state := newstate  else
    hs  w3  x2+i10     ;   state := newstate + 1<6;
    al  w0     0       ;
    ld  w1     4       ;
    hs  w0  x2+i5      ;   d := d-bits;
    al  w0     0       ;
    ld  w1     4       ;
    hs  w0  x2+i6      ;   pnfn :=  pnfn-bits;
    al  w0     0       ;
    ld  w1     2       ;   s := s-bits;
    hs  w0  x2+i7      ;
    ls  w1    -20      ;   pefe :=  pefe-bits;
    hs  w1  x2+i8      ;
    jl.       c25.     ;   goto take formal1;

b10:  2.1111 0000 11 1111 < 10; mask to determine if layout is integer
;          d pnfn  s pefe     ; the selected bits must be null.

e12:rs   w3    x2+i13  ; procedure unpack string
    ac.  w3    a7.     ;      relative return:=
    wa   w3    x2+i13  ;    -abs addr of a7
    rs   w3    x2+i13  ;    + abs addr of return

a7: ds   w1    x2+i2   ; repeat :   rest:=string
    ls   w0    -16     ;   char:=rest.first part shift(-16)
    sn   w0      0     ;   if char = 0
    jl.         e1.    ;   then goto take formal
    rl. w3 (   j8.)    ;
    jl   w3  x3+e15    ;   outchar(char)
    ds.  w3    (j0.)   ;    save sref
    dl   w1    x2+i2   ;   string:=rest
    ld   w1     8      ;     shift 8 add 255
a50:al   w1  x1+2.11111111; nb! mask 8 bits; 
    sn   w0    -1      ;  if string = -1
    am      (x2+i13)   ;  then return
    jl.        a7.     ;  else goto repeat
\f


; jz 1979.08.15 boolean; long array; integer;   write(seg.1); page  6


 c3:bz   w0  x1        ; boolean:
    hs   w0  x2+i20    ;     boolchar:=boolean parameter extract 8;
    al   w3    a62     ;    w3:=after boolean rel. ret.
    jl.        e13.    ;    after boolean;
a17:rl   w1  x1        ;    w1:=index:=new param;
  a62=a17-a61
    se   w3    4       ;    if param type<>integer
    jl.        e4.     ;    then goto kind error;
 
    bl  w0  x2+i20     ;
    sl  w0  0          ;   if boolchar >= 0
    jl.     a16.       ;   then goto index test;
    wa  w1  x2+i22     ;
    rs  w1  x2+i42     ;   maxcount := index+charcount;
    jl.     c25.       ;   goto take formal1;
 
e1: bz  w0  x2+i38     ; take formal:
    hs  w0  x2+i20     ;   boolchar := ending space;
    al  w1  -1         ;   index :=
    rx  w1  x2+i42     ;    maxcharcount - charcount;
    ws  w1  x2+i22     ;   maxcharcount := -1;;
    sh  w0  255        ;   if boolchar>255 then goto formal1
 
a16:sh   w1    0       ; index test:  if index<=0
    jl.       c25.     ;    then goto take formal1;
    al   w1  x1-1      ;    index:=index-1;
    rs   w1  x2+i13    ;    save index;
    bz   w0  x2+i20    ;    load boolchar;
    la. w0     a50.    ;   char := boolchar extract 8;
    rl. w3 (   j8.)    ;
    jl   w3  x3+e15    ;    outchar;
    ds.  w3   (j0.)    ;   save sref
    rl   w1  x2+i13    ;    load index;
    jl.        a16.    ;    goto index test;


c6: rl  w3  x1         ; long array:
    sh  w1 (x2+i18)    ;   if baseword addr <= last litteral addr
    rs  w1  x2+i18     ;   then last litteral addr := baseword addr;
    ba  w1     0       ;
    al  w0  x1-2       ;   if dope addr - 2 <= 
    sh  w0 (x2+i18)    ;       last litteral addr then
    rs  w0  x2+i18     ;   last litteral addr := dope addr - 2;
    dl  w1  x1         ;   if lower index > 1 
    sl  w1     2       ;   then goto kind error;
    jl.       e4.      ;
    wa  w0     6       ;
    al  w3  x3+3       ;   pointer := baseword + 3;
    ds  w0  x2+i25     ;   upper bound := upper index + baseword;
a24:rl  w3  x2+i24     ;   while upper index not reached do
    sl  w3 (x2+i25)    ;    begin
    jl.        e1.     ;     comment exit to take formal;
    al  w3  x3+4       ;     pointer := pointer + 4;
    rs  w3  x2+i24     ;
    dl  w1  x3-3       ;     text portion := element (pointer - 3);
    sl  w0     0       ;     if first word < 0
    sh  w1    -1       ;     or second word < 0 then
    jl.        c7.     ;     goto string, portion taken;
    jl. w3     e12.    ;     unpack string;
    jl.        a24.    ;    end;
                       ;   goto take formal;


c4: rl  w1  x1         ; integer:
    bz  w0  x2+i10     ;   take number;
    so  w0  1<6+1<1    ;   if real layout and procedure is write then
    jl.        a19.    ;    begin  convert integer to real;
    ci  w1     0       ;     goto real taken;
    jl.        a25.    ;    end;
a19:bl  w0     2       ;   extend integer;
    bl  w0     0       ;
    jl.        a18.    ;   goto number taken;



\f


; rc 75.11.04.  real; return; kind error;               write(seg.1); page  7


c5: bz  w0  x2+i10     ; real:
    so  w0     1<6     ;   if procedure not write then
    jl.        e4.     ;   goto kind error;
    dl  w1  x1         ;   take number;
a25:rl. w3 (   j9.)    ; real taken:
    jl      x3+e6      ;   goto real on segment 3;

 e2:rl   w0  x2+i19    ; end write:  wo:=general return;
    se   w0    0       ;    if general return<>0
    jl.        e4.     ;    then goto kind error;
    rl   w1  x2+i15    ;    
    rs   w0  x1+h3+4   ;   record length:=0
    rl   w1  x2+i23    ;write:=
    wm   w1  x2+i22    ;    charcount*error
    rs.  w2    (j4.)   ;    last used:=sref;
    jl.        (j7.)   ;    end reg expr;


e4: rl. w3 (j10.)      ; kind error:
    jl     x3+e23      ;   goto kind error on segment 0;

 g8:
c. g8-506,
m. seg. 1 code too long
z.
 
m. segment 1
 
c. 502-g8, 0, r. 252-g8>1
z.
g11:<:write:>,0,0


\f


; jz 80.01.07.  start segment 2; explanation;           write(seg.2); page  8


k=0                      ; start segment 2;
h.
g4:       g7 ,     g5    ; headword: last point, last absword;
j11:      -1 ,      0    ;   segment 1 address
j12:  1<11+1 ,      0    ;   segment 3 address
j13:   g1+30 ,      0    ;   rs entry 30, save sref,w3;
j38:       0 ,     11    ; own core: std int layout,  sign table(0:3);
j49:       0 ,    e34    ; own core: entry convert char
j16:   g1+ 4 ,      0    ;   rs entry 4,  take expression;
g5=j16-g4                ; last absword;
j18:   g1+35 ,      0    ;   rs entry 35, outblock;
g7=j18-g4                ; last point;
w.

;explanation of integer write:
;    this code is also used to write reals after they have been converted
; to one binary long, representing the significant digits, and two binary 
; integers giving the ten's exponent to be used, and the number of un-
; used digit positions following the number part.
;    in case of realy integer write, the ten's exponent and the following
; zero positions are set to null.
;    the significant digits of the - possibly long - integer are generated
; from the least significant end, and stored into the stack in the positions:
; sref-1, sref-2, ... etc.
;    when the conversion has been made, the stack variable digit base points 
; at the position just before the most significant digit.
;    a logical position of the decimal point, daddr, is calculated as 
; daddr = sref + following zeroes - d.
;    the logical position in which printing starts is called haddr, and it
; is calculated as haddr = min ( daddr + h,  base + 1).
;    the logical position where printing ends is always  sref - 1 + following
; zeroes;
;    now, starting with the first logical position and ending with the last
; logical position, all positions before base+1 are printed as either null 
; or space, depending on the layout.  all positions between base+1 and sref-1
; are printed as converted digits, and all positions after sref-1 are 
; printed as null if they come before daddr and as space otherwise. 
;    during the printing, sign, decimal point, and intermediate spaces are
; output according to the layout. the conversion of a possible exponent 
; part is explained on segment 3.
\f


; jz 80.01.08  conv. number: utility procedures;       write(seg.2); page  9
 
 
e9:  ac. w0  g4.       ; procedure outdigit:
     wa  w3  0         ;   rel of return :=
     rs  w3  x2+i19    ;    abs return - segment base;
     al  w0  x1+48     ;
     jl. w3  e15.      ;   comment make return relative on this segment;
     ds. w3 (j13.)     ;   char := digit + 48; outchar;
     rl  w1  x2+i21    ;   
     ls  w1  1         ;   bitword := bitword shift 1;
     rs  w1  x2+i21    ;
     bz  w0  x2+i33    ;   char := space in number;
     sh  w1  -1        ;   if bitword < 0 then
     jl. w3  e15.      ;   outchar;
     ds. w3 (j13.)     ;
c15: am     (x2+i19)   ; general return on this segment:
     jl.      g4.      ;   goto segment start + relative return;

e26: al. w3  c14.      ; outspaces as digits: (called from segment 3)
                       ;   set return(end number);
 
e17: rl  w0  x2+i21    ; procedure outspaces as digits:
     rs  w3  x2+i19    ;   save return;
     al  w3  x1        ;   call: w1>0: digit positions, w3=return on this seg;
a13: ls  w0  1         ;   i := digit positions;
     sh  w0  -1        ;   repeat
     al  w1  x1+1      ;     bitword := bitword shift 1;
     al  w3  x3-1      ;     if  bitword < 0 then
     sl  w3  1         ;     digit positions := digit positions + 1;
     jl.     a13.      ;     i:= i- 1;
     rl  w3  x2+i19    ;   until i < 1;
     rs  w0  x2+i21    ;   spaces := digit positions;
 
e14: am         i32-i38; outspaces: boolchar := leading space else
e22: bz  w0  x2+i38    ; ending spaces: boolchar := endingspace;
c23: hs  w0  x2+i20    ; spaces: save boolchar;
     ac. w0  g4.       ;   rel of return :=
     wa  w3  0         ;    abs return - segment base;
     rs  w3  x2+i19    ;   comment make return relative on this segment;
a12: al  w1  x1-1      ;   for spaces := spaces - 1 while spaces > -1 do
     sh  w1  -1        ;
     jl.     c15.      ;   begin
     rs  w1  x2+i2     ;     comment ends via general return;
     bz  w0  x2+i20    ;     char := boolchar;
     jl. w3  e15.      ;     outchar;
     ds. w3 (j13.)     ;
     rl  w1  x2+i2     ;   end;
     jl.     a12.      ;   goto general return on this segment;



\f


; jz 80.01.07 outchar; variables for conv. number;  write(seg.2); page 10


e15: jl. w1 (j49.)     ; outchar: char := convert char(char);
     jl      x3+2      ;   if char<0 or char > 255 then return;
     rl  w1  x2+i22    ; check count:
     sn  w1 (x2+i42)   ;   if charcount=maxcharcount then
     jl.     e11.      ;    goto finis;
     hs. w0  b9.       ;   save char;
     al  w1  x1+1      ;   charcount :=
     rs  w1  x2+i22    ;    charcount + 1;
     sn  w1 (x2+i42)   ;   if charcount=maxcharcount then
     bz  w0  x2+i39    ;   char := star; (alarmprint)
     sh  w0  255       ;   if char <= 255 then
     hs. w0  b9.       ;    save char;
 
     rl  w1 (x2+i16)   ; pack char:
     al  w0  0         ;   w0 := 0;
     ld  w1  8         ;   partial word :=
b9=k+1; saved char     ;   partial word shift 8
     al  w1  x1+0      ;   + saved char;
     rs  w1 (x2+i16)   ;
     se  w0  1         ;   if partial word not full
     jl      x3+2      ;   then return;
 
     rx  w0 (x2+i16)   ; next word:
     rl  w1 (x2+i15)   ;   record base := record base + 2;
     al  w1  x1+2      ;   buffer(record base) := partial word;   
     rs  w0  x1        ;   partial word := 1;
     rs  w1 (x2+i15)   ;
     am     (x2+i15)   ;
     sl  w1 (2)        ;   if buffer not filled
     jl.     a10.      ;   then goto return + 2;
     jl      x3+2      ;
    
                       ; next block:
a10: rl  w0  x2+i15    ;   w0 := zone shift 4;
     ls  w0  4         ;   w1 := outblock;
     rl. w1  j18.      ;   take expression and return directly to
     jl.    (j16.)     ;   outchar return;


; constants and variables in convert long integer:

b30:    1<23           ;   constant to test for -2**47;
b51:      10           ;   ten
b52:      20           ;   twenty;
         -10           ; pair used in long div:
b53:       1           ;   (-10, 1);


\f


; jz 79.01.18.  start number conversion;                write(seg.2); page 11


e5: bz  w3  x2+i10     ; convert integer:
     sz  w3  2.11      ;
     jl.     a63.      ;   if state = no layout then
     dl. w0 (j38.)     ;   begin
     ld  w1  -24       ;
     ds  w0  x2+i6     ;    layout := unpacked << d>
     ds  w1  x2+i9     ;   end;
     dl  w1 (x2+i0)    ;
a63: al  w3  2.11      ;   comment it is used here that pnfn 
     la  w3  x2+i6     ;           is a right hand byte;
     am.    (j38.)     ;
     bz  w3  x3+1      ;   sign := leading char for
     sh  w0  -1        ;             positive numbers (pefe extract 2);
     bz  w3  x2+i35    ;   if number is negative then
     hs  w3  x2+i11    ;   sign := -;
     sn. w0 (b30.)     ;   a:=number;
     se  w1  0         ;   if  a <> -2**47
     sl  w0  0         ;   and a < 0 then
     jl.     a64.      ;   a := -a;
     ld  w1  -100      ;   comment beware of overflow
     ss  w1 (x2+i0)    ;
     ds  w1 (x2+i0)    ;   number := a;
a64: ld  w1  -100      ;   zeroes := 0;
     ds  w1  x2+i13    ;   exp10 := 0;
 
e20: al  w0  2.11111   ; start for reals:
     la  w0  x2+i9     ;   max := spaceword extract 5;
     wa  w0  x2+i22    ;   
     se  w0 (x2+i22)   ;   if max <> 0 then
     rs  w0  x2+i42    ;    maxcount := max + charcount;
     al  w0  -64       ;
     la  w0  x2+i9     ;   remaining bits in space word :=
     ns  w0  3         ;         normalized spaces in 
     ls  w0  1         ;         bits(0,22,layout) shift 1; 
     rs  w0  x2+i21    ;   leading spaces :=
     bl  w1  3         ;         -normalization(spaces in layout);
     ac  w1  x1        ; 
     jl. w3  e14.      ;   outspace(leading spaces);
     dl  w1 (x2+i0)    ; 
     sn  w1  0         ;
     se  w0  0         ;   if number = 0 then
     jl.     a65.      ;    begin
     bz  w3  x2+i6     ;     if first letter = b then
     so  w3  2.1100    ;      goto all spaces out(segment 3);
     jl.     a65.      ;    
     hs  w0  x2+i11    ;   sign := 0;
     rl. w3 (j12.)     ;
     jl     x3+c16     ;    end;
a65: al  w3  x2-1      ;   digit index := sref -1;
\f


; jz 1980.01.08 conv. number: generate digits;     write(seg.2); page 12


;long division:
;         w0           w1           w3
; a = (   a1     ,     a2     )
;         --           --            0
;       a1 // 10 ,     --        a1 mod 10
; a3= (a1 mod 10 ,     --     )   a1 // 10
;      a3 mod 20 ,  a3 // 20         --
;         --      2*(a3//20)         --
; if    >= 10     then
;      a3 mod 10    a3 // 10         --
;     (       a//10           )  a mod 10
a66: rs  w3  x2+i25    ; long division:
     sn  w0  0         ;   if not long then 
     jl.     a67.      ;   goto short division;
     al  w3  0         ;   digit := a mod 10;
     wd. w0  b51.      ;
     rx  w3  0         ;   a := a//10;
     wd. w1  b52.      ;
     ls  w1  1         ;
     sl  w0  10        ;   stack (digit index) := digit;
     aa. w1  b53.      ;
     rx  w3  0         ;   digit index := digit index - 1;
     hs  w3 (x2+i25)   ;
     rl  w3  x2+i25    ; 
     al  w3  x3-1      ;   goto long division;
     jl.     a66.      ;

a67: sn  w1  0         ; short division:
     jl.     a68.      ;   while a <> 0 do
     al  w0  0         ;    begin
     wd. w1  b51.      ;     stack (digit index) := a mod 10;
     hs  w0  x3        ;     a := a // 10;
     al  w3  x3-1      ;     digit index := digit index - 1;
     jl.     a67.      ;    end;
 
a68: rs  w3  x2+i25    ;   digit base := digit index;
     al  w1  x2        ;
     wa  w1  x2+i12    ;   daddr := sref + zeroes - d;
     bs  w1  x2+i5     ;   comment the decimal point is to be
     rs  w1  x2+i24    ;           placed just before daddr;
     bs  w1  x2+i4     ;   haddr := min(daddr-h,
     sl  w1  x3+1      ;                base +1);
     al  w1  x3+1      ;   comment this will yield at least one
     rs  w1  x2+i14    ;           position before the point;
     bz  w3  x2+i6     ; switch on first letter:
     ls  w3  -2        ;   goto case pn + 1 of
     bl. w3  x3+c12.   ;        ( dandb, f, z, dandb);
c8:  jl.     x3        ;   comment integer zero and b sorted out;


\f


; jz 79.06.20.  print digits before the point;          write(seg.2); page 13


c9:  jl. w3  c21.      ; f:
     ds. w3 (j13.)     ;   printsign;

c10: dl  w1  x2+i25    ; dandb:
     rl  w3  x2+i14    ;
     sl  w3  x1+1      ;   if haddr < base + 1 then
     jl.     c11.      ;    begin
     sl  w0  x1+2      ;     if daddr < base + 1
     jl.     a69.      ;      then
     rl  w1  0         ;       leading := daddr - haddr - 1
     al  w1  x1-2      ;      else
a69: ws  w1  6         ;       leading := base - haddr + 1;
     al  w1  x1+1      ;     if leading > 0 then
     wa  w3  2         ;      begin
     sh  w1  0         ;       haddr := haddr + leading;
     jl.     c11.      ;       outspace as digits(leading);
     rs  w3  x2+i14    ;      end;
     jl. w3  e17.      ;    end;


c11: jl. w3  c21.      ; z:
     ds. w3 (j13.)     ;   printsign;
a71: rl  w3  x2+i14    ; zout:
     sl  w3 (x2+i24)   ;   while haddr < daddr do
     jl.     a72.      ;    begin
     al  w3  x3+1      ;     haddr := haddr + 1;
     rs  w3  x2+i14    ;     digit := stack(haddr-1);
     bz  w1  x3-1      ;
     am     (x2+i25)   ;     if haddr <= base
     sl  w3  +2        ;     or haddr > last digit
     sl  w3  x2+1      ;     then
     al  w1  0         ;       digit := 0;
     jl. w3  e9.       ;      outdigit(digit);
     jl.    a71.       ;    end;

\f


; jz 79.01.18.  print digits after the point;           write(seg.2); page 14


a72: bz  w3  x2+i5     ;   if d <> 0 then
     sn  w3  0         ;    begin
     jl.     a44.      ;
     bz  w0  x2+i36    ;     outchar(decimal point);
     jl. w3  e15.      ;  
     ds. w3 (j13.)     ;
a73: rl  w3  x2+i14    ;     while haddr < sref do 
     sl  w3  x2        ;      begin
     jl.     a43.      ;
     bz  w1  x3        ;       digit := stack(haddr);
     sh  w3 (x2+i25)   ;       if  haddr <= digit base then 
     al  w1  0         ;       digit := 0;
     al  w3  x3+1      ;
     rs  w3  x2+i14    ;       haddr := haddr + 1;
     jl. w3  e9.       ;       outdigit(digit);
     jl.     a73.      ;      end;
a43: rl  w1  x2+i12    ;     
     ac  w3  x2        ;     zeroes := if daddr > sref 
     wa  w3  x2+i24    ;            then zeroes
     sl  w3  1         ;            else zeroes - daddr + sref;
     ws  w1  6         ;     if zeroes > 1 then
     sl  w1  1         ;     outspace as digits(zeroes);
     jl. w3  e17.      ;    end;

a44: bz  w1  x2+i7     ;   if s <> 0 
     lo  w1  x2+i13    ;   or exp10 <> 0 then
     rl. w3 (j12.)     ;   goto print exp
     se  w1  0         ;       on segment 3
     jl      x3+e10    ;   else end number:
\f


; jz 79.01.30.                                     write(seg.2); page 15




e21:
c14: bz  w0  x2+i6     ; end number:
     ls  w0  -2        ;
     se  w0  1         ;   if pn <> 1 <* f *> then
     jl.     c24.      ;    goto print ending sign;
     rl  w1  x2+i42    ; fill:
     ws  w1  x2+i22    ;   count :=
     al  w1  x1-2      ;    maxcount - charcount - 2;
     jl. w3  e22.      ;   outspace(count,ending space);
 
c24: jl. w3  c22.      ; print ending sign:
     ds. w3 (j13.)     ;   printsign1;
e11: rl. w3 (j11.)     ; finis: 
     jl     x3+e1      ;   goto take formal on segment 1;
 
c21: rl  w0  x2+i9     ; print sign:
     sz  w0  1<5       ;   if front sign not wanted
     jl      x3+2      ;   then return;
c22: bz  w0  x2+i11    ; printsign1:
     sn  w0  0         ;   if sign = 0 then
     jl      x3+2      ;   return;
     al  w1  0         ;   char := sign;
     hs  w1  x2+i11    ;   sign := 0;
     jl.     e15.      ;   goto outchar;
 

h.                     ; switch on first letter pn:
c12: c10-c8,  c9-c8    ;     d,     f,
     c11-c8, c10-c8    ;     z,     b;
w.

g9: c. g9-506
m. segment 2: code too long
z.
 
m. segment 2
 
c. 502 - g9, 0, r. 252 - g9 > 1
z.
<:write:>, 0, 0        ;  alarm text


\f


; jz.fgs 1981.06.09.  conv. real: const. and variables;       write(seg.3); page 16


k=0
h.

 g6:    g16,        g16; rel. last point, rel. last abs word
j14:     -1,          0; seg. 2 addr
j39:      0,         12; own core: sign table(0:3);
j15:  g1+30,          0; rs entry 30, save sref
 g16=k-2-g6

       1024,          0;
b25:      0,          0; 0.5
       1024,          0;
b17:      0,          1; 1
       1280,          0;
b24:      0,          4; 10**(2**0)
       1600,          0;
          0,          7; 10**(2**1)
       1250,          0;
          0,         14; 10**(2**2)
       1525,       3600;
          0,         27; 10**(2**3)
       1136,       3556;
       3576,         54; 10**(2**4)
       1262,        726;
       3393,        107; 10**(2**5)
       1555,       3087;
       2640,        213; 10**(2**6)
       1181,       3363;
       3660,        426; 10**(2**7)
       1363,      3957 ;
       4061,      851  ; 10**(2**8)
       1816,     3280  ;
b20:   1397,     1701  ; 10**(2**9)
b21=b24+44
b18=b24+88
b14: 0,  9,  99, 999   ; exp limits

w.
b16:                  0; new zeroes
b15:                  0; exp10 and also nlim
b19:              -1233; -l=-entier(log 2*2**12)
                      0;
 b3:                  0; real


e6: ds.  w1    b3.     ; convert real:  save real;
    bz   w3  x2+i10    ;
    sz   w3     2.11   ;
    jl.         a40.   ;   if state = no layout then
    dl.  w1     b40.   ;
    ds   w1  x2+i6     ;   layout :=
    dl.  w1     b41.   ;           << -dd.dddd>;
    ds   w1  x2+i9     ;
    rl.  w0     b3.-2  ;   comment it is now used that
a40:al   w3     2.11   ;           pnfn is a right hand byte;
    la   w3  x2+i6     ; 
    am.      (j39.)    ;
    bz  w3    x3       ;   sign := leading char for positive
    sh   w0    -1      ;            numbers(pefe extract 2);
    bz  w3  x2+i35     ;   sign := negative sign;
    hs   w3  x2+i11    ;   sign := <minus>;


\f


; rc 75.11.04.  real to number, exp10, and zeroes;      write(seg.3); page 17


    sn   w0     0      ;   if number = 0 then
    jl.         e3.    ;   goto real zero;
    bl   w1  x2+i7     ;    w1:=s;
    bl.  w1  x1+b14.   ;    w1:=10**s;
    al   w3     1      ;
    bs   w3  x2+i3     ;
    sh   w3    -12     ;   w3 := 1 +
    al   w3    -11     ;           if  b <= 12
    ba   w3  x2+i5     ;           then  d + h - b
    ba   w3  x2+i4     ;           else  d + h - 12;
    al   w0    0       ;    w0:=0;
    ds.  w0    b15.    ;    nlim:=0; new zeroes:=zeroes+1;
    al   w3  x1        ;    w3:=10**s;
    wd.  w1    b16.    ;    w0:=(10**s)mod new zeroes
    ws   w0    6       ;     -10**s+1
    bs   w0  x2+i5     ;     -d;
    hs.  w0    b15.    ;    nlim:=w0;

    bl   w0  x2+i3     ;    w0:=
    sl   w0     13     ;    if b<=12 then b
    al   w0      12    ;    else 12

    dl.  w3    b17.    ;    w23:=1;
    al   w1    -1      ;    w01:=first sig. bit of b;
    ns   w0    3       ;    w1:=bit no.:=no.sig.bits-23;
    as   w1    2       ;    w1:=4*bit no.;
a27:ls   w0   1        ; shift bits:
    sh   w0    -1      ;    if bit=1
    fm.  w3  x1+b18.   ;    then w23:=w23*10**(2**(bit no.+22));
    al   w1  x1-4      ;    bit no.:=bit no.-1;
    sl   w1    -88     ;    if bit no.>=-22
    jl.        a27.    ;    then goto shift bits;
                       ;    comment:  w23=10**b;
    dl.  w1    b3.     ;    w01:=real;
    ds.  w3    b3.     ;    number:=10**b;
    bl   w3    7       ;
    bs   w3    3       ;    w3:=(newexp-exp-2)
    al   w3  x3-2      ;     *(-l)*2**12;
    wm.  w3    b19.    ;    comment:  0<(log2-l)<0.000005;
    sh.  w3    (b15.)  ;
    rl.  w3    b15.    ;    w3:=max(w3, nlim*2**12);
    rs.  w3    b15.    ;    nlim:=entier(max((exp-newexp+2)*l, nlim));

    al   w2    -1      ;    w3(1):=first sig. bit of n;
    ns   w3    5       ;    w2:=bit no.:=no.of sig.bits-11;
    as   w2    2       ;    w2:=4*bit no.;
    sh   w3    -1      ;    if n<0
    jl.        a28.    ;    then goto multiply;
    sh   w2    -48     ; 
    al   w2    -44     ;    bit no.:=max(bit no., -11);
    sh   w2    -8      ;    if bit no.>-2
    jl.        a29.    ;    then begin
    fd.  w1    b20.    ;     w01:=w01/10**(2**9);
    am         -4      ;     end;
a29:fd.  w1  x2+b21.   ;    w01:=w01/10**(2**(bit no.+11));
\f


; rc 79.03.06.  real to number, exp10, and zeroes;      write(seg.3); page 18


a28:al   w2  x2-4      ; multiply:  bit no.:bit no.-1;
    sh   w2    -48     ;    if bit no.=-12
    jl.        a30.    ;    then goto next;
    ls   w3    1       ;    w3(0):=next bit;
    sl  w3     0       ;    if bit=0
    fm.  w1  x2+b21.   ;    then w01:=w01*10**(2**(bit no.+11));
    jl.        a28.    ;    goto multiply;  wo1=real*10**(2**(-n-1));


a30:sl   w0    0       ; next:  if w01<0
    jl.        a31.    ;    then
    ld   w3    50      ;     begin
    fs   w3    2       ;     w23:=0;
    ds   w3    2       ;    w01:=-w01 end;
a31:dl.  w3    (j15.)  ;    w2:=sref;
    bl.  w3    b15.    ;    w3:=n;
    ba   w3  x2+i5     ;    w3:=n+d;
    hs.  w3    b15.    ;    n:=n+d;

    dl.  w3    b3.     ;    w23:=number;
    ds.  w1    b3.     ;    digits:=w01;
    fm.  w1    b24.    ;    w01:=10*digits;
    fa.  w1    b25.    ;    w01:=10*digits+0.5;
    fs   w3    2       ;    w23:=digits-10*digits-0.5;
    bl.  w3    b15.    ;    w3:=n;
    sl   w2    1       ;    if 10*digits>=number
    jl.        a32.    ;    then
    dl.  w1    b3.     ;     begin 
    fa.  w1    b25.    ;     w01:=digits+0.5;
    al   w3  x3+1      ;    n:=n+1; end;
    hs.  w3    b15.    ;
a32:bl   w2    6       ;    extend sign of w3 to w2
    bl   w2    4       ;
    wd.  w3    b16.    ;    w2:=n mod new zeroes;
    sh   w2    -1      ;    if w2 < 0 then
    wa.  w2    b16.    ;      w2:=w2+new zeroes;
    bl.  w3    b15.    ;    w3:=n;
    ws   w3    4       ;    w3:=exp10:=n-k;
    rs.  w3    b15.    ;
    bl   w3    3       ;    w3:=exp2;
    sh   w3    0       ;    if w01<=1
    jl.        e3.     ;    then goto real zero ;
    rs.  w2    b16.    ;    new zeroes:=w2;
    ad   w1  x3-47     ;    w0:=last 6 digits;
a34:dl.  w3 (   j15.)  ; end conversion:
    rl   w3  x2+i17    ;   reestablish w2
    ds   w1  x3        ;   last formal := number;
    rs   w3  x2+i0     ;   param addr := last formal;
    dl.  w1     b15.   ;   following zeroes := new zeroes;
    ds   w1  x2+i13    ;   exp10(stack := exp10(this segment);
    rl.  w3 (   j14.)  ;   goto start for reals 
    jl       x3+e20    ;       on segment 2;

e3: ld   w1    -100    ; real zero:
    ds.  w1     b15.   ;   exp10 := new zeroes := 0;
    jl.         a34.   ;   number := 0;
                       ;   goto end conversion;

\f


; jz 1979.01.30  print the exponent part;        write(seg.3); page 19


e10:rl   w0  x2+i13    ; print exp:
    bz   w1  x2+i8     ; 
    sn   w0     0      ;   if exp10 = 0 
    sz   w1     2.1000 ;   and first letter <> z then
    jl.         a3.   ;    begin comment b cannot occur;
    al   w1     0      ;     spaces := 0;
    jl.         c13.   ;   goto exp as space;
a3: la.  w1     b43.   ;   sign := signswitch(fe);
    am.      (j39.)    ;
    bz  w1  x1         ;
    sl  w0      0      ;   if exp10 < 0 then
    jl.         a4.    ;    begin
    ac   w0 (   0)     ;     exp10 := -exp10;
    rs   w0  x2+i13    ;     sign := <minus>;
    bz  w1  x2+i35     ;    end;
a4: hs   w1  x2+i41    ;   store sign for later use;
    bz  w0  x2+i37     ;   char := exponent mark;
    rl.  w3 (   j14.)  ;
    jl   w3  x3+e15    ;   outchar ( char);
    ds.  w3 (   j15.)  ;
    rl   w0  x2+i13    ;   news := s;
    bz   w1  x2+i7     ;
a14:rs   w1  x2+i12    ;
    bz.  w3  x1+b44.   ;   while 10**news <= exp10 do
    al   w1  x1+1      ;        news := news + 1;
    sl   w0  x3        ;
    jl.         a14.   ;
    bz   w3  x2+i8     ;   comment  notice please that first letter
    ls   w3    -2      ;            b cannot occur legally;
    bz.  w3  x3+b45.   ;   goto case pe+1 of
a15:jl.      x3        ;      (d,  f,  z,  z);


a45:bz   w0  x2+i41    ; f:
    rl.  w3 (   j14.)  ;
    se   w0     0      ;   if sign <> 0 then
    jl   w3  x3+e15    ;   outchar(sign);
    ds.  w3 (   j15.)  ;   sign := 0;
    al   w0      0     ;   comment  continue as for d;
    hs   w0  x2+i41    ;


a46:dl   w0  x2+i13    ; d:
    bz.  w1  x3+b46.   ;   comment notice please news >= 1 always;
    sl   w0  x1        ;   while  exp10 < 10**(news-1)  do
    jl.         a47.   ;    begin
    al   w3  x3-1      ;
    rs   w3  x2+i12    ;     news := news - 1;
    rl.  w3 (   j14.)  ;
    bz  w0  x2+i32     ;     outchar(leading space);
    jl   w3  x3+e15    ;
    ds.  w3 (   j15.)  ;    end;
    jl.         a46.   ;   comment continue as z;

\f


; jz 79.01.30.  print the exponent part;                write(seg.3); page 20


a47:bz   w0  x2+i41    ; z:  char := sign;
a42:rl.  w3 (   j14.)  ; rep:
    se   w0     0      ;   if char <> 0 then
    jl   w3  x3+e15    ;   outchar(char);
    ds.  w3 (   j15.)  ;
    dl   w1  x2+i13    ;
    sn   w0     0      ;   if news = 0 then
    jl.         a48.   ;   goto finito;
    bs.  w0     1      ;   news := news - 1;
    rs   w0  x2+i12    ;
    am      (   0)     ;
    bz.  w3    +b44.   ;   divisor := 10 ** news;
    al   w0     0      ;   
    wd   w1     6      ;   number := number mod divisor;
    rs   w0  x2+i13    ;
    al   w0  x1+48     ;   char := number // divisor + 48;
    jl.         a42.   ;  goto rep;

a48:rl.  w3 (   j14.)  ; finito:
    jl       x3+e21    ;   goto end number on segm 2;

\f



; jz 1979.03.06                          write(seg.3); page 20a






c16: bz  w1  x2+i4     ;   spaces := 
     ba  w1  x2+i5     ;               h+d;
     bz  w0  x2+i5     ;   spaces := spaces +
     se  w0  0         ;              (if d <> 0 then
     al  w1  x1+1      ;               1 else 0) +
     bz  w3  x2+i6     ;
     sz  w3  2.11      ;              (if fn <> 0 then
     al  w1  x1+1      ;               1 else 0 );
c13: bz  w3  x2+i7     ; exp as space:
     se  w3  0         ;   spaces := spaces +
     am      x3+1      ;              (if s <> 0 then
     al  w1  x1        ;               s + 1 else 0) +
     bz  w3  x2+i8     ;
     sz  w3  2.11      ;              (if fe <> 0 then 
     al  w1  x1+1      ;               1 else 0);
     rl. w3  (j14.)    ;
     jl     x3+e26     ;   goto outspaces(segment 2);


                       ; standard real layout:
      6<12 +   2       ;   b=6, h=2,
b40:  4<12 +   1       ;   d=4, pnfn=1,
      0<12 +   0       ;   s=0, pefe=0,
b41:  2.11 < 22        ;   one leading space;

b43:    2.11           ; mask: last two bits;
h.
b44:   1, 10, 100, 1000; list of powers of ten;

                       ; switch on first letter pe:
b45: a46-a15,  a45-a15 ;  d,   f,
     a47-a15,  a47-a15 ;  z,   b handled as z;

b46 = b44 - 1          ; powers-1 of ten;
w.

g12:
c. g12 - 506
m. segment 3: code too long
z.
 
m. segment 3
 
c. 502 - g12, 0, r. 252 - g12 > 1
z.
<:write:>, 0, 0         ; alarm text;
m. jz 80.01.09 algol8,  write and writeint
\f


; jz 80.01.07  prodedures outchar, -text, -integer;    write(seg.4); page 21



;the three code procedures outchar, outtext, and outinteger
;are stored on 1 segment. the usage of these procedures is found
;in the publication rcsl 31-d72.
;contents:
;label, page, name
;       22    initiate first two parameters of proc
;e2     22    entry outchar
;e3     22    entry outtext
;e4     22    entry outinteger
;e5     23    write into zone(space)
;e6     23    write into zone(char)
;e1     24    outchar
;e8     24    outtext
;e9     26    outinteger
;e10    28    store in stack
;       29    definition of entry points
 
 
b.b8,c4,e12,f1,g2,i20,j74; slang block for procedures
k=10000
i6=6,i8=8,i10=10,i12=12,i14=14,i16=16,i18=18,i20=20

h.
g0=0                    ; g0=number of externals
e0:  g2      ,  g1      ; rel of point, rel of abs words
;
;abs words:
j3:  g0+3    ,  0       ; rs entry  3, reserve
j4:  g0+4    ,  0       ;           4, take expression
j8:  g0+8    ,  0       ;           8, end address expression
j13: g0+13   ,  0       ;          13, last used
j17: g0+17   ,  0       ;          17, index alarm
j21: g0+21   ,  0       ;          21, general alarm
j29: g0+29   ,  0       ;          29, param alarm
j30: g0+30   ,  0       ;          30, saved stack ref, saved w3
j41:        0,  6       ;  own core: ending space
j42:        0,  3       ;  own core: negative sign;
j43:        0,  4       ;  own core: decimal point;
j44:        0,  0       ;  own core: leading space
j50:        0,  e34     ;  own core: entry convert char
j51: -4      ,  0       ;  segment 0 address
 
g1=k-2-e0               ; end abs words
;points:
j35: g0+35   ,  0       ; rs entry 35, outblock
g2=k-2-e0               ; end rel words
w.

;global variables
f0:  0                  ; dec for outinteger
f1:  0                  ; print for store in stack
\f


; jz 80.01.08.  prodedures outchar, -text, -integer;    write(seg.4); page 22



;constants and texts
b3=132          ; max number of char per line
b0:  10         ;
b1:  20         ;
    -10         ;
b2:  1          ;
b4:  1<16       ; end mark
b5:  1<23       ; bit(0)=1
b7:  255        ; bit(16:23)=ones

;initiate first two parameters of proc(zone,integer,...)
;saves the stack reference and checks the validity of the
;formal parameters for the zone. partial word addr and
;record base addr are stored in the words +i6 and +i8
;of the stack, respectively. the integer parameter is
;evaluated both as an integer and as a result addr.
;      entry:          exit:
;w0:                   integer mod 2**24
;w1:                   result addr.integer
;w2:                   stack
;w3:
;stack
; +i6: zone param      partial word addr
;  i8:                 record base addr
;+i10: integer param   unchanged
;+i12:                 destroyed
 
b.a1 w.
;c1=e7-e8,c2=e8-e9,c3=e9-e11
 
e2:  am      c1        ; entry outchar:
e3:  am      c2        ; entry outtext:
e4:  al  w1  c3        ; entry outinteger:
     rl. w2 (j13.)     ;   w2 := last used;
     ds. w3 (j30.)     ;   (saved sref, saved w3) := (w2,return);
 
     rx  w1  x2+8      ;   swap(proc selector,word 1 of zone param);
     rl  w0  x1+h2+6   ;   state := zone.state;
     sn  w0  0         ;   if state = 0 then
     al  w0  3         ;    state := 3 (after char print);
     sn  w0  3         ;   if state <> 3 then
     jl.     a1.       ;
     rl. w3 (j51.)     ;   call zone state alarm
     jl  w3  x3+e24    ;   on segment 0;
 
a1:  rs  w0  x1+h2+6   ;   zone.state := state;
     al  w0  x1+h2+4   ;   partial word address :=
     rs  w0  x2+6      ;    zone.partial word address;
     rx  w1  x2+8      ;   swap(proc selector,word 1 of zone param);
     rx  w1  x2+12     ;   swap(proc selector,word 1 of int param);
     rl  w0  x2+10     ;   w0 := word 0 of int param;
     so  w0  16        ;   if expression then
     jl. w3 (j4.)      ;    take expression;
     ds. w3 (j30.)     ;   (saved sref,w3) := (w2,return);
     rl  w0  x1        ;   w0 := value (integer param);
     am     (x2+12)    ;   goto
e11: jl.     0         ;    procedure.proc selector;


e.                     ; end initiate first two parameters
\f


; jz 80.01.07  prodedures outchar, -text, -integer;    write(seg.4); page 23


;procedure write into zone(char);   procedure writechar(char);
;outputs the right-most 8 bits of the character to the zone 
;buffer. the block is changed if necessary.
;     entry:      exit:   writeintozone          writechar
;w0:  char                destroyed              dstroyed
;w1:                      unchanged              destroyed
;w2:  stack ref           stack ref               stackref
;w3:  link                destroyed              destroyed
;stack
; +i6: partial word addr  partial word addr
; +i8: record base addr   record base addr
;+i10:                    destroyed              unchanged
;+i12:                    destroyed              unchanged
 
b.a3 w.
 
e12: bz. w0    (j44.)  ; leading sp:
     jl.        e6.    ;   char := leading space else
 
e5:  bz. w0    (j41.)  ;   char := ending space;
e6:  rs  w1  x2+i10    ;   save w1
     ac. w1     e0.    ;   relative return:=
     wa  w1     6      ;     link - segment start
     rs  w1  x2+i12    ;
     jl. w1 (j50.)     ;   char := convert char(char);
     jl.     a3.       ;   if char > 255 then goto finis;
 
     rl  w1  (x2+i6)   ; pack char:   
     hs. w0     b8.    ;    save char;
     al  w0     0      ;
     ld  w1     8      ;    partial word :=
b8 = k + 1 ; saved char
     al  w1   x1+0     ;     partial word shift 8
     rs  w1  (x2+i6)   ;     + saved char;
     se  w0     1      ;    if partial word not full
     jl.      a3.      ;     then return;
 
     rx  w0  (x2+i6)   ; next word:
     rl  w1  (x2+i8)   ;    record base := record base + 2;
     al  w1   x1+2     ;
     rs  w1  (x2+i8)   ;    buffer(record base) := partial word;
     rs  w0    x1      ;    partial word := 1;
     am      (x2+i8)   ; check block change:
     sl  w1    (2)     ;    if buffer filled
     jl.       a2.     ;    then goto output buffer
     jl.       a3.     ;    else goto finis
 
a2:  rl  w0   x2+i8    ; output buffer:
     ls  w0     4      ;    w0:=zone shift 4
     rl. w1    j35.    ;    w1:=outblock
     jl. w3   (j4.)    ;   take expression;
 
a3:  rl  w3  x2+i8     ; finis:
     al  w0  0         ;   zone.record length := 0;
     rs  w0  x3+h3+4   ;
     rl  w1  x2+i10    ;   restore w1;
     am     (x2+i12)   ;
     jl.     e0.       ;   return;
e.                     ; end write into zone;
 
 
\f


; jz 79.08.15  prodedures outchar, -text, -integer;    write(seg.4); page 24



;code procedure outchar(z,i); zone z; integer i;
;      entry:              usage:
;w0:   integer mod 2**24
;w1:   result addr.integer
;w2:   stack
; +i6: partial word addr   partial word addr
; +i8: record base addr    record base addr
;+i10: formal i            for write into zone
;+i12: undefined           for write into zone
b.w.
e1:  la. w0     b7.     ;   i := i extract 8;
     jl. w3     e6.     ;   write into zone(i);
     jl.       (j8.)    ;   end address expression;
e.                      ; end outchar

;code procedure outtext(z,pos,ra,i)
;   zone z; integer pos,i; real array ra;
;      entry:              usage:
;w0:   integer mod 2**24
;w1:   result addr.integer
;w2:   stack
; +i6: partial word addr   partial word addr
; +i8: record base addr    record base addr
;+i10: formal pos          pos, for write into zone
;+i12: undefined           for write into zone
;+i14: formal  ra          last addr of ra
;+i16:                     current addr of ra
;+i18: formal i            current value of pos
;+i20:                     upper index
b. a7 w.
e8:  rs  w0  x2+i10     ; begin
     dl  w1  x2+i20     ; take i parameter:
     so  w0     16      ;   if expression then
     jl. w3    (j4.)    ;     take expression;
     ds. w3    (j30.)   ;   saved stack ref:= w2;
     rl  w1  x1         ;   index:= i;

     rl  w3  x2+i16     ; take ra parameter:
     ba  w3  x2+i14     ;   dope addr:= base addr+dope rel;
     ls  w1     2       ;   index:= index*4;
     sh  w1 (x3-2)      ;   if index>upper
     sh  w1 (x3)        ;     or index<lower
a1:  jl. w3    (j17.)   ;     then begin
                        ; index error: index alarm(alarm)
                        ;     end;
     wa  w1 (x2+i16)    ;
     al  w1  x1-2       ;   cur word addr:= index+base addr-2;
     rl  w0  x3-2       ;
     rs  w0  x2+i20     ;
     wa  w0 (x2+i16)    ;   upper addr:= upper+base addr;
     ds  w1  x2+i16     ;
\f


; jz 79.08.16  prodedures outchar, -text, -integer;  write(seg.4); page 25



     rl  w1  x2+i10    ;
     sn  w1     0      ; if pos=0 then
     jl.       (j8.)   ;   end address expression;
     al  w0     10     ;
     sh  w1     -1     ;   if pos <0 then
     jl. w3     e6.    ;     write into zone(nl);
     sl  w1     1      ;   if pos >=0 then
     ac  w1  x1        ;     pos:= -pos;
     sh  w1    -b3-1   ;   if pos <-max number then
     al  w1    -b3     ;     pos:= -max number;
     rs  w1  x2+i18    ;

a2:  rl  w1 (x2+i16)   ; next word:
     ld  w1     8      ;   word:= word shift 8
     al  w1  x1+1      ;            + endmark;
     jl.        a4.    ;   goto test;
 
a3:  ld  w1     8      ; next char: word := word shift 8;
a4:  la. w0     b7.    ;   char := next char extract 8;
     sn  w0     0      ;
     jl.        a6.    ;    goto spaces;
 
a5:  jl. w3     e6.    ;   write into zone(char);
     rl  w3  x2+i18    ;
     al  w3  x3+1      ;   pos:= pos+1;
     sn  w3     0      ;   if pos=0 then
     jl.       (j8.)   ;     end address expression;
     rs  w3  x2+i18    ;
     se. w1    (b4.)   ;   if not end mark then
     jl.        a3.    ;     goto next char;
     rl  w3  x2+i16    ;
     al  w3  x3+2      ;   cur word addr:= cur word addr+2;
     rs  w3  x2+i16    ;   if cur word addr
     sh  w3 (x2+i14)   ;     <=last addr then
     jl.        a2.    ;     goto next word;
     rl  w1  x2+i20    ;   index:= upper;
     jl.        a1.    ;   goto index error;

a6:                    ; spaces:
     rl  w1  x2+i18    ;   char:= ending space;
a7:  jl. w3     e5.    ; next space:
     al  w1  x1+1      ;   write into z(space);
     se  w1     0      ;   pos:= pos+1;
     jl.        a7.    ;   goto if pos >0
     jl.       (j8.)   ;     then next space
                       ;     else end address expression;
e.                     ; end outtext
\f


; jz 1979.08.16 prodedures outchar, -text, -integer write(seg.4); page 26



;code procedure outinteger(z,pos,dec,i);
;value i; zone z; integer pos, dec,i;
;      entry:              usage:
;w0:   pos
;w1:   result addr.pos
;w2:   stack
;w3:
;stack
; +i6: partial word addr   partial word addr
; +i8: record base addr    record base addr
;+i10: formal pos          pos.for write into zone
;+i12: undefined           for write into zone
;+i14: formal dec          dec
;+i16:                     print
;+i18: formal i            i
;+i20:
 
 
b. a11 w.
e9:  rs  w0  x2+i10    ; begin
     dl  w1  x2+i16    ; take dec parameter:
     so  w0     16     ;   if expression then
     jl. w3    (j4.)   ;     take expression;
     ds. w3    (j30.)  ;   saved stack ref:= w2;
     rl  w1  x1        ; 
     sh  w1     15     ;
     sh  w1    -1      ;   if dec>15 or dec<0
     jl. w3    (j29.)  ;    then param alarm;
     sn  w1      0     ;    if dec=0
     al  w1     -1     ;     then dec:=-1
     rs  w1  x2+i14    ;

     al  w1    -18     ; reserve buffer:
     jl. w3    (j3.)   ;   reserve 18 bytes in stack;
 
     al  w0    2.1111  ; take i parameter:
     la  w0  x2+i20-2  ;   type := formal(0) extract 4;
     se  w0    10      ;   if  type <> 10 <*integer *>
     sn  w0    12      ;   and type <> 12 <* long   *>
     jl.       a4.     ;    then
     jl. w3   (j29.)   ;      param alarm;
 
a4:  dl  w1  x2+i20    ;   (w0,w1) := formal;
     so  w0     16     ;   if expression then
     jl. w3    (j4.)   ;     take expression;
     ds. w3    (j30.)  ;   saved stack ref:=w2;
     dl  w1  x1        ;
     rl  w3  x2+i18    ;
     sz  w3     4      ;   if kind=integer then
     jl.        a0.    ;     convert i to long;
     sh  w1    -1      ;
     am        -1      ;
     al  w0     0      ;
a0:  rs. w2     f1.    ;   print:= stack ref;
     ds  w1  x2+i20    ; 
\f


; jz 79.08.16 prodedures outchar, -text, -integer  write(seg.4); page 27



     rl  w3  x2+i10    ;
     sn  w1     0      ;   if i=0 and pos<0
     se  w0     0      ;     then goto determine spaces;
     jl.        a1.    ;
     sh  w3    -1      ;
     jl.        a10.   ;
a1:  sn. w0    (b5.)   ;   if i<0 and i<>-2**47
     se  w1     0      ;     then i:= -i;
     sl  w0     0      ;   comment avoid, integer overflow;
     jl.        a2.    ;
     ld  w1    -100    ;
     ss  w1  x2+i20    ;
a2:  al  w3  x2        ;
     ws  w3  x2+i14    ;
     rs. w3     f0.    ;   dec:= stack ref - dec;
     al  w3     0      ;

;calculate the digits corresponding to positive i.
;long division of a long integer a is performed as follows
;        w0          w1           w3
; a= (   a1    ,     a2    )
;        --          --            0
;      a1//10        --      a1 mod 10
; a3=(a1 mod 10,     --    )  a1//10
;     a3 mod 20    a3//20       --
;        --      2*(a3//20)     --
; if   >= 10  then
;     a3 mod 10    a3//10       --
;    (       a//10        )  a mod 10

a3:  wd. w0     b0.    ; long division:
     rx  w3     0      ;
     wd. w1     b1.    ;   digit:= i mod 10; i:= i//10;
     ls  w1     1      ;
     sl  w0     10     ;   store in stack (digit);
     aa. w1     b2.    ;
     rx  w3     0      ;
     jl. w2     e10.   ;   <* at return: w3=0 *>
     rl. w2     f1.    ;
     al  w2  x2+1      ;
     sn  w0     0      ;
     se  w1     0      ;   if i <> 0 then
     jl.        a3.    ;    goto long division;
     sl. w2    (f0.)   ;   if print+1 >= dec then
     jl.        a3.    ;    goto long division;

     dl. w2    (j30.)  ; sign:
     sh  w0 (x1+i18)   ;   if i<0 then
     jl.        a6.    ;   begin
     bz. w3  (j42.)     ;     char := negative sign;
     jl. w2     c4.    ;     stack sign(char);
a6:  al  w2  x1        ;   end;
\f


; jz 79.01.18.  prodedures outchar, -text, -integer;    write(seg.4); page 28



a10: rl. w1     f1.    ; determine spaces:
     rs  w1  x2+i16    ;
     rl  w1  x2+i10    ; 
     sl  w1     1      ;   if pos>0 then
     ac  w1  x1        ;     pos:= -pos;
     sh  w1    -b3-1   ;   if pos <=132 then
     al  w1    -b3     ;     pos:= -132;
     wa  w1     4      ;   pos:= pos+stack ref;
     sl  w1 (x2+i16)   ;   if pos>=print then
     jl.        a11.   ;     goto unbuffer stack;
a7:                    ; spaces:
     jl. w3    e12.    ;   write into zone(leading space);
     al  w1  x1+1      ;   pos:= pos+1;
     se  w1 (x2+i16)   ;   if pos<>print then
     jl.        a7.    ;     goto spaces;
a11: rl  w1  x2+i16    ; unbuffer stack:
a8:  sn  w1  x2        ; move stack:
     jl.        a9.    ;   if print=stack ref then
     bz  w0  x1        ;     goto finish;
     jl. w3     e6.    ;   write into zone(stack buf(print));
     al  w1  x1+1      ;   print:= print+1;
     jl.        a8.    ;   goto move  stack;
                       ; finish:
a9:  rs. w2    (j13.)  ;   last used:= stack ref;
     jl.       (j8.)   ;   end address expression;

;procedure store in stack(digit);
;converts the digit to the corresponding iso-character and 
;stores it in the halfword stack(print). furthermore, the 
;procedure inserts the decimal point as defined by dec.
;      entry:          exit:
;w0:                   unchanged
;w1:                   unchanged
;w2:   link            link
;w3:   digit           0
;st(f1):print          print
 
b. a0 w.
e10: al  w3  x3+48     ; stack char:
c4:  rx. w2     f1.    ; stack sign:
a0:  al  w2  x2-1      ; stack char1: print:=print-1;
     hs  w3  x2        ;   char:= digit+48;
     bz. w3  (j43.)    ;   stack(print) := char;
     sn. w2    (f0.)   ;   if print=dec then
     jl.        a0.    ;   begin
     al  w3     0      ;     char:= decimal point;
     rx. w2     f1.    ;     goto stack char;
     jl      x2        ;   end;
                       ;   return;

e.                     ; end store in stack
e.                     ; end outinteger
\f


; jz 80.01.09.  definition of entry points;             write(seg.4); page 29



e7:
c. e7-e0-506
  m. code on segment 4 too long
z.
 
m. segment 4
 
c. 502-e7+e0,-1,r. 252-(:e7-e0:)>1
;  fill the rest of the segment with -1
z.
<:outchar  <0>:>       ;   alarm text

c1=e1-e8,c2=e8-e9,c3=e9-e11
d4=e2-e0               ;     entry point outchar
d5=e3-e0               ;     entry point outtext
d6=e4-e0               ;     entry point outinteger
m. jz 80.01.08 algol8,  outchar, outtext and outinteger
i.
e.                     ;     end block for outchar outtext outinteger


d0=e18                 ;     entry point writeint
d3=f3                  ;     entry point write
d2=f2                  ;     external list
d11=e27                ;     entry point: replace char
d12=e28                ;     no of owns
d13=e33                ;     outindex (rel addr in own core)
d14=e35                ;     entry point: outtable
d15=e7                 ;     entry point: isotable
i.
e.                     ;     end slang segments

\f


; jz 80.01.07  tails for catalog               write(seg. ); page 30


;tails to be inserted in catalog

;write
g0: 
    5                  ; 5 segments
    0,0,0,0            ; room for name
    1<23 + d3 + 1<12   ; entry point
    3<18+40<12+8<6     ; integer proc ( zone, gen. addr.)
    0                  ;
    4<12 + d2          ; code proc, ext list
    5<12 +d12          ; 5 segments , owns
; writeint
    1<23 + 4           ; modekind = backing store;
    0, 0, 0, 0         ; room for name;
    1<23 + d0 + 1<12    ; entry point on first segment;
    3<18+40<12+8<6, 0  ; integer procedure(zone, general address);
    4<12 + d2          ; code procedure, ext list;
    5<12 +d12          ; 5 segments , owns
;outchar
     1<23+4            ; modekind=backing store
     0,0,0,0           ; fill for name
     1<23+4<12+d4      ; entry point
     1<18+3<12+8<6     ; no type proc(integer,zone)
     0                 ;
     4<12+d2           ; code proc, ext list
     5<12 +d12         ; 5 code segments , owns
;outtext
     1<23+4            ; modekind=backing store
     0,0,0,0           ; fill for name
     1<23+4<12+d5      ; entry point
     1<18+3<12+26<6+3  ; no type proc(integer, real array,
     8<18              ;   integer, zone)
     4<12+d2           ; code proc, ext list
     5<12 +d12         ; 5 code segments , owns
;outinteger
     1<23+4            ; modekind=backing store
     0,0,0,0           ; fill for name
     1<23+4<12+d6      ; entry point
     1<18+41<12+3<6+3  ; no type proc(general,integer,
     8<18              ;   integer,zone)
     4<12+d2           ; code proc, ext list
     5<12 +d12         ; 5 code segments , owns
\f



; jz.fgs 1981.06.09                  tails for insertp. (1)      page 31
 
 

 
; replace char:
 
     1<23+4            ; modekind = backing store
     0,0,0,0           ; fill for name
     1<23 + d11        ; entry point (segment 0)
     3<18+19<12+19< 6,0; integer procedure replacechar(intaddr,intaddr);
     4<12 + d2         ; code proc , start ext list
     5<12 +d12         ; 5 code segments , owns
 
; outindex:
     1<23 + 4          ; modekind = backing store
     0,0,0,0           ; fill for doc name
     d13               ; rel address in own core
     9<18 , 0          ; integer variable
     4<12 + d2         ; code proc, start ext list
     5<12 + d12        ; 5 code segments + owns
 
; outtable:
     1<23 + 4          ; modekind = backing store
     0,0,0,0           ; fill for docname
     1<23+0<12+d14     ; entry point(segment 0)
     1<18 + 41<12 , 0  ; procedure(undef)
     4<12 + d2         ; code proc , start ext list
     5<12 + d12        ; 5 code segments + owns
 
; isotable:
g1:  1<23 + 4          ; modekind = backing store
     0,0,0,0           ; fill for doc name
     1<23 +0<12 +d15   ; entry point(segment 0)
     1<18 +25<12 , 0   ; procedure(integer array)
     4<12 + d2         ; code proc , start ext list
     5<12 + d12        ; 5 code segments + owns
 
 
; use of own core            initialized to
 
; 0  leading space           space       (=32)
; 1  space in number         space       (=32)
; 2  positive sign           +           (=43)
; 3  negative sign           -           (=45)
; 4  decimal point           .           (=46)
; 5  exponent mark           '           (=39)
; 6  ending space            space       (=32)
; 7  termination star        *           (=42)
; 8  integer layout: b       1
; 9  integer layout: h       1
; 10 integer layout: spaceword(0:11)      2.11<10
; 11 integer layout: spaceword(12:23)     0
; 12 signtable(0)            null        (= 0)
; 13 signtable(1)            space       (=32)
; 14 signtable(2)            +           (=43)
; 15 signtable(3)            null        (= 0)
 
m. jz 81.06.23 algol8,  write, writeint, outchar, outtext,
m.                      outinteger, replacechar, outindex, isotable, outtable
 
d.
p. <:insertproc:>

▶EOF◀