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

⟦617e76e26⟧ TextFile

    Length: 123648 (0x1e300)
    Types: TextFile
    Names: »pnumber4tx  «

Derivation

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

TextFile

; eah  10.5.81  algol 8,  text procedures                       page 0.1
;
m.  release 1.0,  11.6.81
;
;     contents                                page
;
;     slang names                            
;        a-names, local labels                 
;        b-names,   -   constants              
;        c-names, global labels                
;        d-names, global subroutines          0.3
;        e-names, procedure entries           0.4
;        f-names, global constants            0.5
;        g-names, tails, headword              
;        h-names, fp                           
;        i-names, variables in stack          0.6
;        j-names, rs-entries                   
;        n-names, segment references           
;        p-names, own permanent core          0.9
;        r-names, chain for rel                
;     
;     code segments
;        segment 1:
;          entry of put procedures            1.2
;            -   -  get     -                 1.3
;          check of parameters                1.4
;        segment 2:
;          put_char                           2.2
;          put_text                           2.3
;         subprocedure outchar                2.7
;              -       outdigit               2.10
;              -       outspaces              2.11
;         return from put/get proc            2.13
;       segment 3:
;         put_num (integer, long)             3.2
;       segment 4:
;         put_num (real)                      4.2
;       segment 5:
;         get_text                            5.2
;         subprocedure inchar                 5.5
;              -       packchar               5.8
;       segment 6:
;         read_number                         6.2
;       segment 7:
;         get_num                             7.2
;         finis_getnum                        7.5
;         alarm messages (param errors)       7.6

\f


; eah  1.3.81   algol 8, text procedures                   page 0.2



b. e20,f60,g1             ; insertproc block
w.

d.
p.<:fpnames:>
l.

s. d100, i40              ; slang segment
w.


;     slang names
;
;     a-names
;
; procedure or subroutine block
; used for labels at the innermost block level
;
;
;
;     b-names
;
; procedure or subroutine block
; used for variables and constants at the innermost blocklevel.
;
;
;
;     c-names
;
; code segment block
; used for labels global on segment
;
\f


; eah  10.3.81   algol 8, text procedures                     page 0.3
;
;     d-names
;
; slang segment
; global entries of subroutines and other global labels.
; two d-names are used for each entry or label:
;
;     d<2n>     normal slang label, used for reference from own segment
;     d<2n+1>   relative address on segment, used for reference from
;               other segments.
;
; d-names       subroutine                                page
;
; d0  - d1      normal return from putproc                2.13
; d2  - d3      error return                              2.14
; d4  - d5      put_char_cont                             2.2
; d6  - d7      put_text_cont                             2.3
; d8  - d9      put_num_cont                              3.2
;
; d10 - d11     outchar                                   2.7
; d12 - d13     outdigit                                  2.10
; d14 - d15     outspaces_as_digits                       2.11
; d16 - d17     outspaces                                 2.11
;
; d20 - d21     param_error                               7.6
; d22 - d23     print_number                              3.6
; d24 - d25     print_real                                4.2
; d26 - d27     print_exp                                 4.6
; d28 - d29     all_spaces_out                            4.8
;
; d30 - d31     end_number                                3.11
;
;
;
; d42 - d43     get_text_cont                             5.2
; d44 - d45     get_num_cont                              7.2
; d46 - d47     finis_getnum                              7.5
;
; d50 - d51     inchar                                    5.5
; d52 - d53     pack_char                                 5.8
;
; d60 - d61     normal return from gettext/char           2.13
; d62 - d63       -      -     -   getnum                 2.13
;
;
\f


; eah  1.3.81   algol 8, text procedures                  page 0.4
;
;     e-names
;
; insertproc block
; only used for the procedure entries
; two e-names are used for each entry, only used in tails.
;
;     e<2n>     segment number (rel.to first code segment)
;     e<2n+1>   relative entry address on code segment
;
; e-names       code procedure                       page
;
; e0 -e1        put_number                           1.2
; e2 -e3        put_fixed                            1.2
; e4 -e5        put_char                             1.2
; e6 -e7        put_text                             1.2
;
; e8 -e9        get_number                           1.3
; e10-e11       get_fixed                            1.3
; e12-e13       get_char                             1.3
; e14-e15       get_text                             1.3
;
;
\f


; eah  1.3.81   algol 8, text procedures                  page 0.5
;
;     f-names
;
; insertproc block
; used for global constants
;
; f-name        ; use

f0 = 0          ; segment count

; f1            ; number of externals (def.segm.1)
; f2            ; start of external list (def.segm.1)
; f3            ; number of hw in permanent core (def.p-names)

f4 = 10000      ; first k-value on code segment

; f5            ; number of hw reserved in stack (def.i-names)
; f6            ; check     -     -     -    -        -

f32 = 32        ; char val. of space
f39 = 39        ;  -    -   -  exponent mark
f43 = 43        ;  -    -   -  plus
f45 = 45        ;  -    -   -  minus
f46 = 46        ;  -    -   -  dec.point

;
;
;
;     g-names
;
; insertproc block

; g0            first tail
; g1            last tail
;
; code segment block:
; g1            rel of last point
; g2             -  -   -   absword
; g3            administration at end segment
;
;
\f


; eah  1.3.81   algol 8, text procedures                    page 0.6
;
;
;     i-names
;
; slang segment
; used for variables in stack 
;

f5 = 76

; i-names for put-procedures

i0 = -f5        ; word    ; curr_inx (hw-index of curr.charpos in dest)
i1 = i0 + 2     ; word    ; txt_inx  (  -      -   -      -    -  text)

                          ;   putnum                         puttext
i2 = i1 + 4     ; double  ; spaces remaining             _ string portion
i3 = i2 + 2     ; half    ; b  dig.tot. )                  text array base
i4 = i3 + 1     ;  -      ; h  d.bef.pt.) i3 to i9
i5 = i4 + 1     ;  -      ; d  d.aft.pt.) must be          text array upper index
i6 = i5 + 1     ;  -      ; pnfn        ) consecutive    _
i7 = i6 + 1     ;  -      ; s  dig.exp. )
i8 = i7 + 1     ;  -      ; pefe        )                  save text param pair
i9 = i8 + 1     ; word    ; spaces in layout             _ 

i10 = i9 + 2    ; half    ; procstate:
                          ;  getbit<10 + layouttype<8 + arraytype<6 + 1<procno
                          ;  getbit:     2.0  = put-procedure
                          ;              2.1  = get-procedure
                          ;  layouttype: 2.00 = no layout
                          ;              2.01 = integer layout
                          ;              2.10 = real layout
                          ;  arraytype:  2.0  = 8-bits char
                          ;              2.1  = 12-bits char
                          ;  procno:     2.0001 = put/get_number
                          ;              2.0010 = put/get_fixed
                          ;              2.0100 = put/get_char
                          ;              2.1000 = put/get_text

i11 = i10 + 1   ;  -      ; sign_char                    short string (1=yes,0=no)
\f


; eah  1.5.81   algol 8, text procedures                      page 0.7


i12 = i11 + 1   ; word    ; following zeroes / new_s     text_ref (segm<12+rel)
i13 = i12 + 2   ;  -      ; exp10 / rep / length
i14 = i13 + 2   ;  -      ; last formal addr, later h_addr
i15 = i14 + 2   ;  -      ; conv_table base  (0 = no conv_table)
i16 = i15 + 2   ;  -      ;      -     upper index
i17 = i16 + 2   ;  -      ;      -     lower index-2
i18 = i17 + 2   ;  -      ; last literal addr
i19 = i18 + 2   ;  -      ; save general return addr
i20 = i19 + 2   ;  -      ; dest base
i21 = i20 + 2   ;  -      ;  -   upper index
i22 = i21 + 2   ;  -      ; char count
i23 = i22 + 2   ;  -      ; max charcount
i24 = i23 + 2   ;  -      ; converted char value
i25 = i24 + 2   ;  -      ; char value
i26 = i25 + 2   ; half    ; stop, <>0 when last elem of dest filled
i27 = i26 + 1   ;  -      ; char pointer (-16, -8, or 0)
i28 = i27 + 1   ; word    ; save general return2 addr
i29 = i28 + 2   ;  -      ; save num.param.type    save num.value
i30 = i29 + 2   ;  -      ;  -    -    -   addr      -   -    -
i31 = i30 + 2   ;  -      ; remaining bits in spaceword
i32 = i31 + 2   ;  -      ; d_addr
i33 = i32 + 2   ;  -      ; digit_base  (digit_index)
i34 = i33 + 2   ; half    ; exp.sign_char

; the last 15 hw's before stackref are reserved for holding the digits
; of the converted number part  (see explanation segm.3)

f6 = -i34

c. 15-f6
   m. too few hw reserved in stack
z.

\f


; eah  1.5.81   algol 8, text procedures                    page 0.8
;
;
; i-names used for get procedures:
;
; i0            ; word    ; curr_inx (hw-index of curr.charpos in source)
; i1            ;  -      ; txt_inx  (  -      -   -      -    -  text)
;
;                         ;   get_num                  get_text
; i2            ; duble   ; save layin, number
; i3            ; half    ; no.of decimals(layin)    text array base
; i4            ;  -      ; first letter  (layin)
; i5            ; word    ; factor, save_ovfl        text array upper index
; i7            ;  -      ; digit                    save textparam.type
; i9            ;  -      ; digit (doubleword)       save textparam.addr
;
; i10           ; half    ; procstate
; i11           ;  -      ; error_in_getnum          stop text, <>0 when last elem filled
;
; i12           ; word    ; exp                      save char value extract 8
; i13           ;  -      ; exp_sign, save unfl / rep / length
; i14           ;  -      ; last formal addr
; i15           ;  -      ; conv_table base  (0=no conv_table)
; i16           ;  -      ;     -      upper index
; i17           ;  -      ;     -      lower index-2
; i18           ;  -      ; last literal addr
; i19           ;  -      ; save general return addr
; i20           ;  -      ; source base
; i21           ;  -      ;    -   upper index
; i22           ;  -      ; charcount
; i23           ;  -      ; max_charcount (positions in layin)
; i24           ;  -      ; save class<12 + char
; i25           ;  -      ; pack_count (no.of packed characters)
;
; i26           ; half    ; stop source, <> 0 when last elem of source exhausted
; i27           ;  -      ; char pointer (in source)
;
; i28           ; word    ; general return2
; i29           ;  -      ; save numparam type
; i30           ;  -      ; save num/char param addr
; i31           ;  -      ; sign
; i32           ;  -      ; state
; i33           ;  -      ; save char_class
; i34           ;  -      ; save char_value          char_pointer (in text)
\f


; eah  1.3.81   algol 8, text procedures                       page 0.9
;
;
;     j-names
;
; code segment block
; used for rs-entries (abs words and points)
;
; j0             head word, segm.table.addr of own segm.
; j<n>           ref.to rs-entry no <n>
;
;
;
;     n-names
;
; code segment block
; used for abswords for reference to other segments
;
; n<n>           ref.to segment no <n>
;
;
;
;     p-names
; 
; code segment block
; used for reference to own permanent core
;
;                hw.no      contents
; p1             1          put_get_error

f3 = 1+1         ; number of halfwords in own permanent core

;
;
;     r-names
;
; code segment block
; used for chain for rel
;



\f


; eah  1.5.81   algol 8, text procedures                      page 0.10
;

b. j0                       ; begin segment 0,  external list

f1 = 0                      ; no. of externals
k  = 0

w.
j0:   0                     ; head word

h.
      0, r.494 + j0. - (:f1*12:)   ; zerofill
w.


f2 = k-j0                   ; rel. start of external list

      f1                    ;   no.of externals
      0                     ;   no.of hw to initialize in own core

; external list empty

      s3, s4                ;   date and clock
      0, r.5                ;   continueword, alarmtext

e.                          ; end segment 0
\f


; eah  1.3.81   algol 8, text procedures                  page 1.1


b. c30, g3, j100, n10, p1

f0 = f0 + 1               ; segment count
f1 = 0                    ; no.of externals
k  = 10000                ;

h.
j0:   g1, g2              ; head word: last point, last absword

                           ; rs-entries:
j3:   f1+ 3, 0             ; rs.3,  reserve
j4:   f1+ 4, 0             ; rs.4,  take expression
j13:  f1+13, 0             ; rs.13, last used
j30:  f1+30, 0             ; rs.30, save stackref, w3

n2:   1<11 o.(:2-f0:), 0   ; ref. to segment 2
n3:   1<11 o.(:3-f0:), 0   ;  -   -     -    3
n5:   1<11 o.(:5-f0:), 0   ;  -   -     -    5     
n7:   1<11 o.(:7-f0:), 0   ;  -   -     -    7


g2 = k-2-j0                ; rel of last absword
g1 = k-2-j0                ; rel of last point

w.
\f


; eah  1.3.81   algol 8, text procedures                    page 1.2
;

b. a30, b20               ; begin  block start put/get procedures
w.

;
; integer procedure
;   put_number (dest, pos, conv_table, <<layout>, numparam);
;   put_fixed  (dest, pos, conv_tabel, <<layout>, int_long_param);
;   put_char   (dest, pos, conv_table, char_param, rep);
;   put_text   (dest, pos, conv_table, text_param, length);
;
;      array               dest          (boolean, long, or real)
;      integer             pos
;      integer array       conv_table    (may be left out)
;      string              <<layout>     ( -   -   -   - )
;      integer/long/real   num_param
;      integer/long        int_long_param
;      integer/boolean     char_param
;      integer             rep           ( -   -   -   - )
;      string/array        text_param
;      integer             length        ( -   -   -   - )
;


e0 = f0-1                 ; put_number:
e1 = k-j0                 ;   procno := 0;
      am      1  -1<1     ;

e2 = f0-1                 ; put_fixed:
e3 = k-j0                 ;   procno := 1;
      am      1<1-1<2     ;

e4 = f0-1                 ; put_char:
e5 = k-j0                 ;   procno := 2;
      am      1<2-1<3     ;

e6 = f0-1                 ; put_text:
e7 = k-j0                 ;   procno := 3;
      al  w0  1<3         ;   w0:= procstate := 1 shift procno;
      jl.     c0.         ;   goto start;

\f


; eah  1.5.81   algol 8, text procedures                     page 1.3
;
; integer procedure
;   get_number (source, pos, conv_table, <<layin>, num_param);
;   get_fixed  (source, pos, conv_table, <<layin>, int_long_param);
;   get_char   (source, pos, conv_table, char_param);
;   get_text   (source, pos, conv_table, text_array, length);
;
;      array                 source        (boolean, long, or real)
;      integer               pos
;      integer array         conv_table    (may be left out)
;      string                <<layin>      ( -  -   -    - )
;      integer/long/real     num_param
;      integer/long          int_long_param
;      integer/boolean       char_param
;      array (any type)      text_array
;      integer               length        (may be left out)


e8 = f0-1                   ; get_number:
e9 = k-j0                   ;   procno:= 0
      am      1  -1<1       ;

e10 = f0-1                  ; get_fixed:
e11 = k-j0                  ;   procno:= 1
      am      1<1-1<2       ;

e12 = f0-1                  ; get_char:
e13 = k-j0                  ;   procno:= 2
      am      1<2-1<3       ;

e14 = f0-1                  ; get_text:
e15 = k-j0                  ;   procno:= 3
      al  w0  1<3    + 1<10 ;   w0:= procstate:= 1 shift procno + getbit;

\f


; eah  1.5.81   algol 8, text procedures     (dest/source)          page 1.4
;
; start:
;
c0:                       ; start:
      rl. w2 (j13.)       ;   w2:= stackref;
      ds. w3 (j30.)       ;   save stackref, w3
      al  w1  -f5         ;   reserve working locations
      jl. w3 (j3.)        ;     in stack
      hs  w0  x2+i10      ;   save procstate
      al  w0  0           ;
      al  w1  -1          ;   max_charcount := -1;
      ds  w1  x2+i23      ;   charcount     := 0;
      rs  w0  x2+i2       ;   layout:= no layout
      hs  w0  x2+i26      ;   stop  := false;
;
; first parameter, zone or array of type boolean, long, or real:
;
      al  w1  2.11111     ;
      la  w1  x2+6        ;   w1:= kind (formal1);
      sh  w1  23          ;   if kind > zone  or
      sh  w1  16          ;      kind < boolean array  or
      jl.     c10.        ;      kind = integer array
      sn  w1  18          ;   then
      jl.     c10.        ;     goto param_error (arraytype);
      zl  w3  x2+i10      ;   w3:= procstate;
      sn  w1  17          ;   if kind = boolean array then
      al  w3  x3+1<6      ;     procstate := procstate + 12-bitstext;
      hs  w3  x2+i10      ;
      al  w1  x2+7        ;   w1:= last literal addr :=
      ea  w1  x2+4        ;        addr of first formal + appetite;
      rs  w1  x2+i18      ;
      rl  w1  x2+8        ;   w1:= param addr;
      sh  w1 (x2+i18)     ;   if param addr <= last literal addr then
      rs  w1  x2+i18      ;      last literal addr := w1;
;
; second parameter, start position:
;
      dl  w1  x2+12       ;   w0w1 := formal2;
      sz  w0  16          ;   if expression then
      jl.     a0.         ;   begin
      jl. w3 (j4.)        ;     take expression;
      ds. w3 (j30.)       ;     save stackref, w3;
      rs  w1  x2+12       ;     save addr of result in formal2.2;
a0:                       ;   end;
      sl  w1  x2+12       ;   if param addr > formal addr
      sl  w1 (x2+i18)     ;         and     < last literal addr then
      jl.     a1.         ;     last literal addr := param addr;
      rs  w1  x2+i18      ;
\f


; eah  1.3.81   algol 8, text procedures     (pos param)             page 1.5
;
; check start position inside dest/source:
;
;
;   in an 8-bits text hw-index corresponds to character position
;   and charpointer in the following way:
;
;    hw-index  : ! -3, -2 ! -1,  0 ! 1  , 2 ! 3  , 4 !
;                !--------!--------!--------!--------!
;         pos  : !-5,-4,-3!-2,-1, 0! 1, 2, 3! 4, 5, 6!
;                !        !        !        !        !
;   charpointer: !-16,-8,0!-16,-8,0!-16,-8,0!-16,-8,0!
;
;
a1:
      rl  w1  x1          ;   w1:= startpos:= value (formal2);
      zl  w0  x2+i10      ;   w0:= procstate;
      sz  w0  1<6         ;   if 8-bitstext then
      jl.     a3.         ;   begin
      al  w1  x1+2        ;     w1:= curr_inx :=
      el  w0  2           ;          (startpos + 2)
      el  w0  0           ;
      wd. w1  b1.         ;          // 3
      ls  w1  1           ;          *  2;  <*hw-index of startpos*>
      sl  w0  0           ;     if remainder < 0 then
      jl.     a2.         ;     begin
      al  w1  x1-2        ;       curr_inx:= curr_inx - 2;
      wa. w0  b1.         ;       remainder:= remainder + 3;
a2:                       ;     end;
      ws. w0  b2.         ;     w0:= charpointer :=
      ls  w0  3           ;          (remainder - 2) * 8;
      hs  w0  x2+i27      ;     save charpointer;
                          ;   end 8-bits text
a3:                       ;   else  curr_inx = startpos;
      rs  w1  x2+i0       ;   save curr_inx;
      rl  w3  x2+8        ;   w3:= addr of baseword(dest);
      rl  w0  x3          ;   w0:= dest_base:= baseword
      ea  w3  x2+6        ;   w3:= dope addr;
      sh  w1 (x3-2)       ;   if curr_inx > upper index  or
      sh  w1 (x3)         ;               < lower index  then
      jl.     c11.        ;     param_error (charpos);
      rl  w1  x3-2        ;   w1:= upper index of dest;
      ds  w1  x2+i21      ;   save dest_base and upper index;
\f


; eah  1.3.81   algol 8, text procedures     (conv_table)            page 1.6
;
; third parameter, possibly conv_table:
;
      al  w3  x2+16       ;   w3:= last formal addr:= addr.formal3;
      al  w1  2.11111     ;
      la  w1  x2+14       ;   w1:= kind(formal3);
      se  w1  18          ;   if kind = integer array then
      jl.     a4.         ;   begin
      rl  w1  x2+16       ;     w1:= addr of baseword;
      rl  w0  x1          ;     w0:= convtable_base:= baseword;
      ds  w0  x2+i15      ;     save convtable_base and last formal addr;
      jl. w3  c3.         ;     call save_last_literal_addr;
      ea  w1  x2+14       ;     w1:= baseword addr + doperel;
      dl  w1  x1          ;     w0w1:= upper,lower index:=
      ds  w1  x2+i17      ;            dope vector;
      jl.     a5.         ;   end
                          ;   else
a4:                       ;   begin  <*no convtable*>
      al  w0  0           ;     convtable_base:= 0;
      al  w3  x3-4        ;     w3:= last formal addr := previous formal;
      ds  w0  x2+i15      ;     save last formal addr;
                          ;   end;
;
; switch procedure type:
;       (w3 = next param addr)
;
a5:
      zl  w1  x2+i10      ;   w1:= procstate;
      sz  w1  1<2         ;   if proc = put/get_char then
      jl.     c5.         ;     goto char_params;
      sz  w1  1<3         ;   if proc = put/get_text then
      jl.     c6.         ;     goto text_params;
\f


; eah  1.3.81   algol 8, text procedures     (num params)         page 1.7
;
;
; num_params:
;
                          ; layout parameter:
      jl. w3  c1.         ;   get_next_parameter;
      se  w0  8           ;   if param kind = string then
      jl.     a11.        ;   begin  <*layout*>
      dl  w1  x1          ;     w0w1 := string portion;
      sl  w1  0           ;     if w1 < 0  or
      sl  w0  0           ;        w0 >= 0 then
      jl.     c12.        ;       param_error (string not layout);
      ds  w1  x2+i2       ;     save layout in stack;
      jl. w3  c1.         ;     get_next_parameter;
                          ;   end;

a11:                      ; num parameter:
      sl  w0  10          ;   if param kind < integer  or
      sl  w0  13          ;                 > long  then
      jl.     c12.        ;     param_error (num type);
      zl  w3  x2+i10      ;   w3:= procstate;
      so  w3  1<1         ;   if procedure = put_fixed 
      jl.     a12.        ;      and
      sn  w0  11          ;      param kind = real then
      jl.     c12.        ;     param_error (num type);
a12:
      jl. w3  c2.         ;   check_last_parameter;
      ds  w1  x2+i30      ;   save num.param pair;
      zl  w1  x2+i10      ;   w1:= procstate;
      rl. w3 (n7.)        ;
      sz  w1  1<10        ;   if proc = get_num then
      jl      x3+d45      ;     goto get_num_cont (on segm.7)
      rl. w3 (n3.)        ;   else
      jl      x3+d9       ;     goto put_num_cont (on segm.3);
\f


; eah  1.3.81   algol 8, text procedures     (char params)        page 1.8
;
; char_params:
;
c5:                       ; char parameter:
      jl. w3  c1.         ;   get_next_parameter;
      sl  w0  9           ;   if param kind <> boolean  and
      sl  w0  11          ;                 <> integer  then
      jl.     c12.        ;     param_error (char type);
      zl  w3  x2+i10      ;   w3:= procstate;
      sz  w3  1<10        ;   if proc = put_char then
      jl.     a15.        ;   begin
      zl  w0  x1          ;     w0:= char := param value
      la. w0  b0.         ;                  extract 8;
      rs  w0  x2+i25      ;     save char;
      al  w1  1           ;     w1:= rep:= 1;  <*default rep-param*>
      jl. w3  c4.         ;     get_rep_param;

      rl. w3 (n2.)        ;     goto put_char_cont;
      jl      x3+d5       ;          (on segm.2)
                          ;   end put_char_params
                          ;   else
a15:                      ;   begin  <*get_char*>
      se  w0  10          ;     if param_kind <> integer then
      jl.     c12.        ;       param_error (char_type);
      rs  w1  x2+i30      ;     save char_param_addr;
      jl. w3  c2.         ;     check_last_parameter;
      rl. w3 (n5.)        ;     call inchar (on segm.5)
      jl  w3  x3+d51      ;       <*w0:=class,w1:=char*>
      rs  w1 (x2+i30)     ;     char_param:= char_value;
      rl. w3 (n2.)        ;     goto normal_return_from getproc
      jl      x3+d61      ;            (on segm.2)
                          ;   end get_char;
\f


; eah  10.3.81   algol 8, text procedures     (text_params)       page 1.9
;
;
; text_params:
;
c6:                       ; text parameter:
      jl. w3  c1.         ;   get_next_parameter;
      se  w0  0           ;   if paramtype = zone array
      sl  w0  9           ;       or variable  
      jl.     c12.        ;       or integer array
      sn  w0  2           ;   then
      jl.     c12.        ;     param_error (text type);
      ds  w1  x2+i9       ;   save text parameter in stack
      se  w0  8           ;   if paramtype = string then
      jl.     a20.        ;   begin
      zl  w0  x2+i10      ;     w0:= procstate;
      sz  w0  1<10        ;     if proc = get_text then
      jl.     c12.        ;       param_error (texttype = string);
      rl  w0  x1-2        ;     w0:= first word of text portion;
      sh  w0  -1          ;     if w0 < 0 then
      jl.     c12.        ;       param_error (texttype = layout);
      jl.     a22.        ;   end
                          ;   else
a20:                      ;   begin
      al  w3  1           ;     txt_inx:=
      se  w0  1           ;       if boolean array then 1
      al  w3  x3+1        ;                        else 2;
      rs  w3  x2+i1       ;
      dl  w1 (x2+i14)     ;     w0w1 := param pair textparam;
      rl  w3  x1          ;     w3:= textbase:= baseword;
      ea  w1  0           ;     w1:= dope address;
      al  w0  1           ;
      sh  w0 (x1-2)       ;     if 1 > upper_index  or
      sh  w0 (x1)         ;          < lower_index  then
      jl.     c30.        ;       param_error (text index);
      rl  w0  x1-2        ;     w0:= upper index;
      ds  w0  x2+i5       ;     save textbase, upper index;
                          ;   end array param;
\f


; eah  1.5.81   algol 8, text procedures     (text_params)     page 1.10

a22:                      ;
      al  w1  0           ;   w1:= length:= 0;  <*default length param*>
      jl. w3  c4.         ;   get_length_param;
      rs  w1  x2+i13      ;   save length;
      sh  w1  -1          ;   w1:= maxcount:=
      ac  w1  x1          ;          abs(length);
      sn  w1  0           ;   if maxcount = 0 then
      al  w1  -1          ;     maxcount:= -1;
      rs  w1  x2+i23      ;   save maxcount;
                          ;
      zl  w0  x2+i10      ;   w0:= procstate;
      rl. w3 (n5.)        ;
      sz  w0  1<10        ;   if proc = get_text then
      jl      x3+d43      ;     goto get_text_cont (on segm.5)
      rl. w3 (n2.)        ;   else
      jl      x3+d7       ;     goto put_text_cont (on segm.2);

;
;
; local constants:
;
b0:   2.11111111          ; mask for char extract 8;
b1:   3                   ;
b2:   2                   ;

e.                        ;
\f


; eah  1.3.81   algol 8, text procedures    (get_next_param)      page 1.11
;
;
; local subroutine get_next_parameter
;
;     call                return
; w0  undef               param type (kind extract 4)
; w1  undef               abs addr of param
; w2  stackref            unchanged
; w3  return              undef
;
b. a1                     ; begin block  get_next_parameter:
w.
c1:                       ;
      ac. w0  j0.         ;   w3:= rel.return :=
      wa  w3  0           ;        abs return - segment start;
      rs  w3  x2+i19      ;   save rel.return;
      rl  w1  x2+i14      ;   w1:= last_formal_addr :=
      al  w1  x1+4        ;        last_formal_addr + 4;
      rs  w1  x2+i14      ;
      al  w0  x1+2        ;
      sl  w0 (x2+i18)     ;   if last_formal_addr+2 > last_literal_addr then
      jl.     c12.        ;     param_error (too few parameters);
      dl  w1  x1          ;   w0w1:= formal pair;
      sz  w0  16          ;   if kind < 16 then
      jl.     a1.         ;   begin
      so  w0  8           ;     if kind < 8 then
      jl.     c12.        ;       param_error (kind procedure or label);
      jl. w3 (j4.)        ;     take expression;
      ds. w3 (j30.)       ;   save stackref, w3;
a1:                       ;   end;
      jl. w3  c3.         ;   save_last_literal_addr;
      al  w0  2.1111      ;   w0:= param type :=
      am     (x2+i14)     ;        param kind extract 4;
      la  w0  -2          ;
      am     (x2+i19)     ; general return on this segment:
      jl.     j0.         ;   goto segment start + rel.return;
e.                        ; end get_next_parameter;
\f


; eah  10.3.81   algol 8, text procedures     (check_last)        page 1.12
;
;
; local subroutine check_last_parameter:
;
b.                        ; begin block  check_last_parameter
w.
c2:                       ;
      rs  w3  x2+i19      ;   save return addr
      rl  w3  x2+i14      ;   w1:= next_param :=
      al  w3  x3+6        ;        last_formal_addr + 6;
      sl  w3 (x2+i18)     ;   if next_param > last_literal addr then
      jl     (x2+i19)     ;     goto return;
      rs  w3  x2+i14      ;   save next_param_addr;
      jl.     c12.        ;   param_error (too many parameters);
e.                        ; end check_last_parameter;

;
;
; local subroutine save_last_literal_addr;
;
;     call                return
; w0  undef               unchanged
; w1  abs param addr          -
; w2  stackref                -
; w3  return                  -
;
b.                        ; begin block  save_last_literal
w.
c3:
      sl  w1 (x2+i14)     ;   if param addr > last formal addr
      sl  w1 (x2+i18)     ;        and      < last literal addr  then
      jl      x3          ;   then
      rs  w1  x2+i18      ;     last literal addr := param addr;
      jl      x3          ;   goto return;
e.                        ; end save_last_literal;
\f


; eah  11.3.81   algol 8, text procedures     (get_rep)       page 1.13
;
;
;
; local subroutine get_rep_parameter
;
;     call                return
; w0  undef               undef
; w1  default rep         value of rep param / unchanged
; w2  stackref            unchanged
; w3  return              undef
;
b. a1                     ; begin block  get_rep_parameter
w.                        ;
c4:   ac. w0  j0.         ;   w3:= rel.return:=
      wa  w3  0           ;        abs return - segment start;
      rs  w3  x2+i28      ;   save in general return2;
      rl  w3  x2+i14      ;   w3:= last formal addr;
      al  w3  x3+6        ;   if next formal addr <
      sl  w3 (x2+i18)     ;       last literal addr  then
      jl.     a1.         ;   begin
      jl. w3  c1.         ;     get_next_parameter;
      se  w0  10          ;     if param_inf <> integer then
      jl.     c12.        ;       param_error (rep_type);
      jl. w3  c2.         ;     check_last_parameter;
      rl  w1  x1          ;     w1:= rep:= param_value;
a1:                       ;   end;
      am     (x2+i28)     ; general return2 on this segment:
      jl.     j0.         ;   goto segment start + rel.return;
e.                        ; end get_rep_parameter;

\f


; eah  1.5.81   algol 8, text procedures                    page 1.14

;
; parameter errors:
;

b.                        ; begin block  call param_error
w.

c10:  am      0 -1        ; param_1:
c11:  am      1 -2        ; charpos:
c12:  am      2 -3        ; param_n:
c30:  al  w1  3           ; text_index:
      rl. w3 (n7.)        ;   w1:= errortype;
      jl      x3+d21      ;   goto param_error (on segment 7);

e.                        ; end block  call param_error;

\f


; eah  10.3.81   algol 8, text procedures                 page 1.15



g3 = k-j0

c. g3-506
   m. code on segment 1 too long
z.

c. 502-g3
   0, r. 252 - g3>1
z.

<:text proc.1:>
e.

\f


; eah  1.3.81  algol 8, text procedures                         page 2.1
;

b. c30, g3, j100, n10, p1  ; begin  segment 2

f0 = f0+1                  ; segment count
k = 10000

h.
j0:   g1, g2              ; head word: last point, last absword

j6:   f1+ 6, 0            ; rs. 6, end register expr
j13:  f1+13, 0            ; rs.13, last used
j16:  f1+16, 0            ; rs.16, segm.table.base
j21:  f1+21, 0            ; rs.21, general alarm
j60:  f1+60, 0            ; rs.60, last of segm.table

n7:   1<11 o.(:7-f0:), 0  ; ref.to segment 7

p1:   0, 1                ; own perm.core: put_get_error

g2 = k-2-j0               ; rel of last absword
g1 = k-2-j0               ; rel of last point

w.
\f


; eah  10.3.81   algol 8, text procedures     (put_char)          page 2.2
;
b. a1                     ; begin block  put_char
w.

;
; put_char_continued:
;
d4:
d5 = k-j0


a1:   sh  w1  0           ;   while rep > 0 do
      jl.     d0.         ;   begin  <*exit to normal_return*>
      al  w1  x1-1        ;     w1:= rep:= rep - 1;
      rs  w1  x2+i13      ;
      rl  w0  x2+i25      ;     w0:= char value;
      jl. w3  d10.        ;     call outchar;
      rl  w1  x2+i13      ;     w1:= rep;
      jl.     a1.         ;   end  while rep>0;
e.                        ; end block put_char_cont.

\f


; eah  10.3.81   algol 8, text procedures     (put_text)          page 2.3
;
b. a40, b10               ; begin block put_text
w.
; 
; put_text_continued:
;
d6:
d7 = k-j0
      dl  w1  x2+i9       ;   w0w1:= paramtype, -addr of text
      sn  w0  8           ;   if paramtype = string then
      jl.     a20.        ;     goto put_string;
      rl  w1  x2+i1       ;   w1:= txt_inx;
      jl.     a3.         ;   goto first_array_element;
;
; put_from_text_array:
;
a1:                       ; next_element:
      rl  w0  x2+i7       ;   w0:= param type;
      rl  w1  x2+i1       ;   w1:= txt_inx:=
      se  w0  1           ;        if boolean array then
      al  w1  x1+1        ;             txt_inx + 1
      al  w1  x1+1        ;        else txt_inx + 2;
      rs  w1  x2+i1       ;
      sh  w1 (x2+i5)      ;   if txt_inx > upper_index then
      jl.     a3.         ;   begin
      rl  w0  x2+i22      ;     w0:= charcount;
      sl  w0 (x2+i13)     ;     if charcount >= length then
      jl.     d0.         ;       goto normal_return
      al  w1  -2          ;     else
      jl.     d2.         ;       goto error_return (-2);  <*put exh.*>
                          ;   end;
;
; 12-bit text array:
;
a3:                       ; first_array_element:
      se  w0  1           ;   if from boolean array then
      jl.     a10.        ;   begin
      am     (x2+i3)      ; 
      zl  w0  x1          ;     w0:= char:= ba(txt_inx)
      la. w0  b0.         ;                    extract 8;
      jl. w3  c0.         ;     check_null_char;
      jl. w3  d10.        ;     call outchar;
      jl.     a1.         ;     goto next_element;
                          ;   end boolean array;
\f


; eah  11.3.81   algol 8, text procedures     (put_text)         page 2.4
;
; 8-bit text array:
;
a10:                      ;
      am     (x2+i3)      ;
      rl  w0  x1          ;   w0:= tx_word:= ia(txt_inx);
      al  w1  -16         ;   w1:= charpointer;
a11:                      ; next_char:
      ds  w1  x2+i2       ;   save tx_word, charpointer;
      ls  w0  x1          ;   w0:= char:= tx_word shift (-16,-8,0)
      la. w0  b0.         ;                   extract 8;
      jl. w3  c0.         ;   check_null_char;
      jl. w3  d10.        ;   call outchar;
      dl  w1  x2+i2       ;   w0w1:= tx_word, charpointer;
      sl  w1  0           ;   if charpointer = 0 then
      jl.     a1.         ;     goto next_element;
      al  w1  x1+8        ;   charpointer :+ 8;
      jl.     a11.        ;   goto next_char;
;
; put_string:
;
a20:                      ; put_string:
      dl  w1  x1          ;   w0w1:= first textportion;
      sl  w1  0           ;   if w1 >= 0 then 
      jl.     a30.        ;     goto put_short_string;
      al  w3  0           ;   short_string:= false;
      hs  w3  x2+i11      ;
a21:                      ; new_string_pointer:
      rl  w3  0           ;   w3:= textref;  (= text_segm<12 + reladdr)
a22:                      ; next_string_portion:
      rs  w3  x2+i12      ;   save textref;
      hs. w3  a24.        ;   store rel_addr;
      zl  w3  6           ;   w3:= text_segm  
      ls  w3  1           ;          * 2
      wa. w3 (j16.)       ;          + segm_table_base;
      rl. w1 (j60.)       ;   w1:= last_of_segm_table;
      sl  w3  x1          ;   if text_segm_addr > last_of_segm_table
      jl.     a35.        ;     then goto param_error (illegal string);
      rl  w3  x3          ;   w3:= segm_table_word;
a24 = k+1
      dl  w1  x3+ 0       ;   w0w1:= string_portion;
      sh  w1  -1          ;   if string pointer then
      jl.     a21.        ;     goto new_string_pointer;
\f


; eah  11.3.81   algol 8, text procedures     (put_text)         page 2.5
;
;
; unpack_string_portion:
;
a25:                      ;   repeat
      ds  w1  x2+i2       ;     save string portion;
      ls  w0  -16         ;     w0:= first char of portion;
      sn  w0  0           ;     if char = 0 then
      jl.     d0.         ;       goto normal_return;
      jl. w3  d10.        ;     call outchar;
      dl  w1  x2+i2       ;     w0w1:= rest_string:=
      ld  w1  8           ;            saved string portion shift 8
      al  w1  x1+255      ;             + 2.11111111;
      se  w0  -1          ;   until string portion exhausted
      jl.     a25.        ;     (rest_string = -1)
;
      zl  w0  x2+i11      ;   if short_string 
      se  w0  0           ;     then goto normal_return;
      jl.     d0.         ;
      rl  w3  x2+i12      ;   w3:= textref:= textref - 4;
      al  w3  x3-4        ;     <*string portions stored backwards*>
      jl.     a22.        ;   goto next_string_portion;
;
; put_short_string:
;
a30:                      ; put_short_string:
      al  w3  1           ;   short_string:= true;
      hs  w3  x2+i11      ;
      jl.     a25.        ;   goto unpack_string_portion;
;
; param_error:
;
a35:                      ; text_param: illegal textref;
      al  w1  4           ;   errortype:= string
      rl. w3 (n7.)        ;   goto parameter error
      jl      x3+d21      ;          (on segm.7)

b0:   2.11111111          ; mask for char extract 8;

e.                        ; end block put_text;
\f


; eah  10.3.81   algol 8, text procedures     (check_null)           page 2.6
;
;
; local subroutine  check_null_char:
;
;     call                return
; w0  char                unchanged
; w1  undef               length
; w2  stackref            unchanged
; w3  return              unchanged
;
b.                        ; begin  block check_null_char
w.                        ;
c0:   rl  w1  x2+i13      ;   w1:= length;
      se  w0  0           ;   if char = 0
      jl      x3          ;        and
      sh  w1  0           ;      length <= 0
      jl.     d0.         ;   then  goto normal_return;
      jl      x3          ;
e.                        ; end check_null_char;

\f


; eah  1.3.81   algol 8, text procedures     (outchar)         page 2.7
;
; global subroutine outchar
;
;
; the subroutine inserts one character (after possible conversion by 
; convtable)  at the next character position in dest.
; characters are inserted as 12-bits characters in a boolean array,
; or packed as three 8-bits characters in one word otherwise.
;
;        call             return
; w0     char value       undef
; w1     undef            undef
; w2     stackref         unchanged
; w3     abs return       undef
;

b. a20, b10               ; begin block outchar
w.

d10:                      ; outchar:
d11 = k-j0
      rl  w1  x2+i15      ;   w1:= convtable_base;
      sn  w1  0           ;   if convtable_base <> 0 then
      jl.     a1.         ;   begin
      ls  w0  1           ;     w0:= conv_index:= char * 2;
      sh  w0 (x2+i16)     ;     if conv_index > upper index
      sh  w0 (x2+i17)     ;           or      <=lower index then
      jl      x3          ;       return  (no character put);
      wa  w0  2           ;     w0:= entry := conv_index + convtable_base;
      zl  w0 (0)          ;     w0:= converted_char := convtable(entry);
      sz  w0  -1<8        ;     if char > 255 or < 0 then
      jl      x3          ;       goto return;
                          ;   end convtable_base <> 0;
\f


; eah  11.3.81   algol 8, text procedures     (outchar)         page 2.8
;
;
; put (converted) character:
;
a1:
      zl  w1  x2+i26      ;   w1:= stop_mark;
      se  w1  0           ;   if stop then
      jl.     c21.        ;     goto return (dest array full)
      rl  w1  x2+i22      ;   w1:= charcount;
      se  w1 (x2+i23)     ;   if charcount = maxcount then
      jl.     a2.         ;   begin
      zl  w0  x2+i10      ;     w1:= procstate;
      sz  w0  2.1100      ;     if proc=put_char or proc=put_text then
      jl.     d0.         ;       goto normal_return_from_putproc
      jl.     c23.        ;     else  goto error_return (layout);
a2:                       ;   end;
      al  w1  x1+1        ;   charcount:= charcount + 1;
      rs  w1  x2+i22      ;
      rl  w1  x2+i0       ;   w1:= curr_inx;
      rs  w3  x2+i19      ;   save return address;
;
; 12-bits dest:
;
      zl  w3  x2+i10      ;   w3:= procstate;
      so  w3  1<6         ;   if 12-bits dest then
      jl.     a5.         ;   begin
      am     (x2+i20)     ;     dest(curr_inx) :=
      hs  w0  x1          ;       converted_char;
      al  w1  x1+1        ;     curr_inx:= curr_inx + 1;
      jl.     a10.        ;     goto check_curr_inx;
                          ;   end 12-bits text;
\f


; eah  11.3.81   algol 8, text procedures     (outchar)           page 2.9
;
;
; 8-bits dest:
;

a5:                       ; 8-bits dest:
      rs  w0  x2+i24      ;   save converted_char;
      el  w3  x2+i27      ;   w3:= char_pointer;  (-16, -8, or 0);
      am     (x2+i20)     ;   w0:= curr_word :=
      rl  w0  x1          ;        dest(curr_inx);
      al  w1  0           ;
      ld  w1  x3          ;   w0w1:= curr_word shift charpointer;
      la. w0  b0.         ;   remove old character and insert
      lo  w0  x2+i24      ;      converted char in rightmost 8 bits
      ac  w3  x3          ;   w0:= new curr_word :=
      ld  w1  x3          ;        w0w1 shift (-charpointer);
      ac  w3  x3-8        ;   charpointer:= charpointer + 8;

      rl  w1  x2+i0       ;   w1:= curr_inx;
      am     (x2+i20)     ;   dest(curr_inx):=
      rs  w0  x1          ;     new curr_word;
      sh  w3  0           ;   if charpointer > 0 then
      jl.     a11.        ;   begin  <*prepare for next word of dest*>
      al  w3  -16         ;     charpointer:= first char in word;
      al  w1  x1+2        ;     curr_inx :+ 2;

a10:                      ; check_curr_inx:   <*jump from 12-bits dest*>
      rs  w1  x2+i0       ;     save curr_inx;
      am     (x2+i21)     ;     
      sl  w1  +1          ;     if curr_inx > upper index (dest) then
      hs  w3  x2+i26      ;       stop := true;
                          ;   end next word of dest;
a11:                      ;
      hs  w3  x2+i27      ;   save charpointer;
      jl     (x2+i19)     ;   goto return;

;
; local constants:
;
b0:   -1<8                ; mask for remove last char in word

e.                        ; end block outchar;
\f


; eah  20.3.81   algol 8, text procedures     (outdigit)           page 2.10
;
;
; global subroutine outdigit
;
; the subroutine outputs one digit as a character, possibly followed
; by a space according to the spaceword of the layout.
;
;     call                return
; w0  undef               undef
; w1  digit               undef
; w2  stackref            unchanged
; w3  abs return          undef
;
b.                        ; begin block outdigit
w.

d12:                      ; outdigit:
d13 = k-j0                ;
      rs  w3  x2+i28      ;   save return addr;
      al  w0  x1+48       ;   w0:= char:= digit + 48;
      jl. w3  d10.        ;   call outchar (digit);
      rl  w1  x2+i31      ;   w1:= remaining_bits_in_spaceword:=
      ls  w1  1           ;        spaceword shift 1;
      rs  w1  x2+i31      ;
      al  w0  f32         ;   w0:= char:= space;
      sh  w1  -1          ;   if spaceword < 0 then
      jl. w3  d10.        ;     call outchar (space);
      jl     (x2+i28)     ;   goto return;
e.                        ; end outdigit;
\f


; eah  20.3.81   algol 8, text procedures     (outspaces)             page 2.11
;
;
; global subroutine outspaces
;
; the subroutine outputs a number of space characters.
; two entries to the subroutine:
;
; d14-d15: outspaces_as_digits:
;          outputs space chars in unused digit positions in the
;          start or the end of the layout.
;
; d16-d17: outspaces:
;          outputs leading spaces before first digit position of
;          the layout, or ending spaces after the last digit position.
;
;     call                return
; w0  undef               undef
; w1  no.of spaces        undef
; w2  stack ref           unchanged
; w3  abs return          undef
;
b. a10                    ; begin block outspaces
w.

d14:                      ; outspaces_as_digits:
d15 = k-j0                ;
      rs  w3  x2+i28      ;   save return
      rl  w0  x2+i31      ;   w0:= spaceword;
      al  w3  x1          ;   w3:= i:= no_of_digits  (no.of spaces)
a1:                       ;   repeat
      ls  w0  1           ;     spaceword:= spaceword shift 1;
      sh  w0  -1          ;     if spaceword < 0 then
      al  w1  x1+1        ;       no_of_spaces :+ 1;
      al  w3  x3-1        ;     i:= i-1;
      sl  w3  1           ;   until i<1;
      jl.     a1.         ;
      rs  w0  x2+i31      ;   save spaceword;
      jl.     a2.         ;
\f


; eah  20.3.81   algol 8, text procedures     (outspaces)         page 2.12


d16:                      ; outspaces:
d17 = k-j0                ;
      rs  w3  x2+i28      ;   save return;
a2:                       ;
      al  w1  x1-1        ;   for spaces := spaces - 1
      sh  w1  -1          ;       while spaces >= 0 do
      jl     (x2+i28)     ;   begin   <*at loop end goto return*>
      rs  w1  x2+i2       ;     save spaces remaining;
      al  w0  f32         ;     w0:= char:= 'sp';
      jl. w3  d10.        ;     call outchar (space);
      rl  w1  x2+i2       ;
      jl.     a2.         ;   end;
                          ;   goto return;
e.                        ; end block outspaces;

\f


; eah  10.3.81   algol 8, text procedures     (return)          page 2.13
;
b. a10, b10               ; begin block  return_to_algol
w. 
;
; normal_return from getproc:
;
d62:                      ; return_from_getnum:
d63 = k-j0
      el  w1  x2+i11      ;   w1:= error_in_getnum;
      se  w1  0           ;   if error then
      jl.     d2.         ;     goto error_return;
      dl  w1  x2+i2       ;   w0w1:= number;
      rs  w1 (x2+i30)     ;   param:= integer number;
      rl  w3  x2+i29      ;   w3:= param_type;
      se  w3  10          ;   if paramtype <> integer then
      ds  w1 (x2+i30)     ;     param:= double number;


d60:                      ; return_from_gettext/getchar/getnum_default:
d61 = k-j0
      am      4           ;   w1:= result:= last class,value;

;
; normal_return from putproc:
; 
d0:                       ; return_from_putproc:
d1 = k-j0                 ;
      rl  w1  x2+i22      ;   w1:= result:= charcount;
a2:                       ;
      rl  w3 (x2+12)      ;   w3:= pos_param:=
      wa  w3  x2+i22      ;        startpos + charcount;
      rs  w3 (x2+12)      ;
      rs. w2 (j13.)       ;   last_used:= old stack top;
      jl.    (j6.)        ;   goto end_register_expression;
\f


; eah  10.5.81   algol 8, text procedures                      page 2.14
;
;
; error_return:
;
d2:                       ; error_return:   (w0w1 = result)
d3 = k-j0                 ;
      rl. w3 (p1.)        ;   w3:= put_get_error
      ls  w3  x1          ;          shift error_value;
      so  w3  1           ;   if put_get_error.bit_error_value = 0 then
      jl.     a2.         ;     goto normal_return;
      rl  w3 (x2+12)      ;   w3:= pos_param:=
      wa  w3  x2+i22      ;        start_pos + charcount;
      rs  w3 (x2+12)      ;
      ac  w0  x1          ;   w0:= abs(error_value) 
      ls  w0  3           ;          * 6;
      wa  w0  2           ;
      wa  w0  2           ;
      am     (0)          ;
      al. w0  b10.        ;   w0:= addr. of alarm text;
      jl. w3 (j21.)       ;   goto general_alarm;
;
; error_return  (from this segment):
;
c21:  am      -1 +3       ; dest_array_full:  result:= -1;
c23:  al  w1  -3          ; layout_error:     result:= -3;
      jl.     d2.         ;   goto error_return;

;
;
; alarm texts for error return
;

b10 = k-6
      <:<10>put_full:>    ;   -1
      <:<10>put exh.:>    ;   -2
      <:<10>p.layout:>    ;   -3
      <:<10>get exh.:>    ;   -4
      <:<10>get full:>    ;   -5
      <:<10>getvalue:>    ;   -6

e.                        ; end block return_to_algol
\f


; eah  1.3.81  algol 8, text procedures                      page 2.15
;


g3 = k-j0

c. g3-506
   m. code on segment 2 too long
z.

c. 502-g3
   0, r. 252 - g3>1      ; zerofill
z.

<:text procs:>
e.

\f


; eah  20.3.81   algol 8, text procedures                    page 3.1
;

b. c30, g3, j100, n10, r1 ; begin  segment 3
f0 = f0+1                 ;   segment count
k  = 10000

h.
j0:   g1, g2              ; head word: last point, last absword

j46:  f1+46, r1           ; rs.46, float long, chain for rel

n2:   1<11 o.(:2-f0:), 0  ; ref. to segment 2
n4:   1<11 o.(:4-f0:), 0  ;  -   -     -    4   

g2 = k-2-j0               ; rel of last absword
g1 = k-2-j0               ; rel of last point

w.
\f


; eah  20.3.81   algol 8, text procedures     (putnum)          page 3.2
;

b. a40, b30               ; begin block put_num
w.

;
; put_num_continued:
;
d8:                       ; put_num_cont:
d9 = k-j0                 ;
      dl  w1  x2+i2       ;   w0w1:= saved layout;
      sn  w1  0           ;   if layout specified then
      jl.     a1.         ;   begin
      rs  w0  x2+i9       ;     spaces_in_layout:= first layout word;
      al  w0  0           ;
      ld  w1  6           ;
      hs  w0  x2+i3       ;     b:= b-bits;
      al  w0  0           ;         <*tot.no.of significant digits*>
      ld  w1  4           ;     h:= h-bits;
      hs  w0  x2+i4       ;         <*no.of digits before point*>
      zl  w3  x2+i10      ;     w3:= procstate;
      es  w0  x2+i3       ;
      sn  w0  0           ;     if h-b = 0  and
      sz. w1 (b10.)       ;        d = s = pefe = 0
      am      1<9 -1<8    ;     then  layouttype:= integer layout
      al  w3  x3  +1<8    ;     else  layouttype:= real layout;
      hs  w3  x2+i10      ;     save layouttype in procstate;
      al  w0  0           ;
      ld  w1  4           ;
      hs  w0  x2+i5       ;     d:= d-bits;
      al  w0  0           ;         <*no.of digits after point*>
      ld  w1  4           ;
      hs  w0  x2+i6       ;     pnfn:= pnfn-bits;
      al  w0  0           ;         <*first letter and sign of number part*>
      ld  w1  2           ;     s:= s-bits;
      hs  w0  x2+i7       ;         <*no.of digits in exponent*>
      ls  w1  -20         ;
      hs  w1  x2+i8       ;     pefe:= pefe-bits;
                          ;         <*first letter and sign of exp.part*>
                          ;   end;
\f


; eah  20.3.81   algol 8, text procedures     (putnum)           page 3.3

a1:
      dl  w0  x2+i30      ;   w3w0:= num_param pair;
      al  w3  x3-10       ;   w3:= param_type:= integer/real/long;
      zl  w1  x2+i10      ;   w1:= procstate;
      zl. w3  x3+b20.     ;   case param_type of
c0:   jl.     x3          ;   begin

;
; integer:
;
c1:                       ; 10: integer
      rl  w1 (0)          ;     w1:= integer value;
      so  w3  1<9 + 1<0   ;     if real layout and proc = put_number then
      jl.     a3.         ;     begin
      ci  w1  0           ;       convert integer to real;
      jl.     a7.         ;       goto real number;
a3:                       ;     end;
      el  w0  2           ;     w0w1:= extend num_value;
      el  w0  0           ;
      jl.     c5.         ;     goto whole_number;

;
; real:
;
c2:                       ; 11: real
      dl  w1 (0)          ;     w0w1:= real value;
a7:   rl. w3 (n4.)        ; real_number:
      jl      x3+d25      ;     goto print_real (on segm.4);

;
; long:
;
c3:                       ; 12: long
      dl  w1 (0)          ;     w0w1:= long value;
      so  w3  1<9 + 1<0   ;     if real layout and proc=put_number then
      jl.     c5.         ;     begin
      rl. w3 (j46.)       ;       convert_long_to_real
      jl  w3  x3 +0       ;
r1 = k-j0-1               ;          (chain for rel)
      jl.     a7.         ;       goto real_number;
                          ;     end
                          ;     else  goto whole_number;
                          ;   end case param_type;

\f


; eah  20.3.81   algol 8, text procedures     (putnum)          page 3.4
;
;
; explanation of integer put_num:
;
; this code is also used to output reals after they have been converted
; to one binary long representing the significant digits, and two binary
; integers giving the ten's exponent and the number of unused digit
; positions following the number part.
;
; in case of ordinary integer, 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 in 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. 
;
; the logical position of the decimal point, d_addr, is calculated as
;    d_addr:= sref + following_zeroes - d.
;
; the logical position in which printing starts is called h_addr, which
; is calculated as
;    h_addr:= min (d_addr + h, digit_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 digit_base+1 are printed as 
; either zero or space, depending on the layout. all positions between 
; digit_base+1 and sref-1 are printed as converted digits, and all
; positions after sref-1 are printed as zero if they come before d_addr
; 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 performed on segment 4.
;
\f


; eah  20.3.81   algol 8, text procedures     (putnum)          page 3.5
;
;
; whole number:
;
c5:                       ; whole number:
      ds  w1  x2+i30      ;   save number;
      zl  w3  x2+i10      ;   w3:= procstate;
      sz  w3  2.11<8      ;   if state = no layout then
      jl.     a10.        ;   begin
      dl. w0  b0.         ;     layout:= unpacked << d>
      ld  w1  -24         ;
      ds  w0  x2+i6       ;       b,h,d,pnfn
      ds  w1  x2+i9       ;       s,pefe,spaces
      dl  w1  x2+i30      ;     w0w1:= number;
a10:                      ;   end;
      al  w3  2.11        ;   w3:= code for sign printing
      la  w3  x2+i6       ;        := pnfn extract 2;
      zl. w3  x3+b1.      ;   w3:= sign_char (code);
      sh  w0  -1          ;   if number < 0 then
      al  w3  f45         ;     w3:= sign_char:= minus;
      hs  w3  x2+i11      ;   save sign_char;
;
      sn. w0 (b2.)        ;   if number <> -2**47
      se  w1  0           ;        and
      sl  w0  0           ;      number < 0 
      jl.     a12.        ;   then
      ld  w1  -100        ;     number:= abs number;
      ss  w1  x2+i30      ;
      ds  w1  x2+i30      ;
a12:
      ld  w1  -100        ;
      ds  w1  x2+i13      ;   zeroes := exp10:= 0;
\f


; eah  20.3.81   algol 8, text procedures     (putnum)            page 3.6
;
;
; print_number:
;
d22:                      ; print_number:  
d23 = k-j0                ;       <*jump from segm.4*>
      al  w0  2.11111     ;
      la  w0  x2+i9       ;   w0:= ending_spaces:= spaceword extract 5;
      wa  w0  x2+i22      ;   if ending_spaces <> 0 then
      se  w0 (x2+i22)     ;     max_count := ending_spaces + charcount;
      rs  w0  x2+i23      ;
;
      al  w0  -64         ;
      la  w0  x2+i9       ;   w0:= remaining bits in spaceword:=
      ns  w0  3           ;        bitmask for spaces between digits;
      ls  w0  1           ;          <*i.e. normalized spaces in
      rs  w0  x2+i31      ;            bits(0,17,layout) shift 1*>
      el  w1  3           ;   w1:= leading_spaces:=
      ac  w1  x1          ;        abs normalization (spaces in layout);
      rl. w3 (n2.)        ;
      jl  w3  x3+d17      ;   call outspaces (leading_spaces);
;
      dl  w1  x2+i30      ;   w0w1:= number;
      sn  w1  0           ;
      se  w0  0           ;   if number = 0 then
      jl.     a15.        ;   begin
      zl  w3  x2+i6       ;     w3:= pnfn;
      so  w3  2.1100      ;     if pn = 11  (first letter = b) then
      jl.     a15.        ;     begin
      hs  w0  x2+i11      ;       sign_char:= 0;
      rl. w3 (n4.)        ;       goto all_spaces_out  (segm.4);
      jl      x3+d29      ;     end;
                          ;   end number = 0;
a15:
      al  w3  x2-1        ;   digit_index:= sref - 1;
\f


; eah 20.3.81   algol 8, text procedures     (putnum)            page 3.7
;
;
; long division:
;
; now the digits are extracted from the number in w0w1 to be stored
; in the stack for later printing. the scheme below shows the contents
; of the registers during each step in the long division.
;
a16:                      ; long division:
      rs  w3  x2+i33      ;   save digit_index;
      sn  w0  0           ;   while long number (w0<>0) do
      jl.     a17.        ;   begin
                          ;     digit:= number mod 10;
                          ;     a:= number:= number // 10;
                          ;
                          ;         w0          w1         w3
                          ; --------------------------------------
      al  w3  0           ;  a= (   a1    ,     a2   )      0
      wd. w0  b11.        ;     (a1 //  10,     --   )  a1 mod 10
      rx  w3  0           ; a3= (a1 mod 10,     --   )  a1 //  10
      wd. w1  b12.        ;     (a3 mod 20,   a3//20 )     --
      ls  w1  1           ;     (   --    ,2*(a3//20))     --
      sl  w0  10          ;   if w0 >= 10 then
      aa. w1  b13.        ;     (a3 mod 10,   a3//10 )     --
      rx  w3  0           ;     (        a // 10     )  a mod 10
                          ; ---------------------------------------
      hs  w3 (x2+i33)     ;     stack(digit_index) := digit;
      rl  w3  x2+i33      ;     digit_index := 
      al  w3  x3-1        ;       digit_index - 1;
      jl.     a16.        ;   end long number;
; 
; short division:
;
a17:                      ; short_division:
      sn  w1  0           ;   while number <> 0 do
      jl.     a18.        ;   begin
      al  w0  0           ;     w0:= digit:= number mod 10;
      wd. w1  b11.        ;     w1:= number:= number // 10;
      hs  w0  x3          ;     stack(digit_index):= digit;
      al  w3  x3-1        ;     digit_index :- 1;
      jl.     a17.        ;   end;
\f


; eah  20.3.81   algol 8, text procedures     (putnum)          page 3.8
;
a18:
      rs  w3  x2+i33      ;   save digit_base  (=last digit_index)
      al  w1  x2          ;   w1:= d_addr:=
      wa  w1  x2+i12      ;        stackref + following_zeroes
      es  w1  x2+i5       ;        - d;
      rs  w1  x2+i32      ;   <*the decimal point is to be placed
                          ;     just before d_addr*>
      es  w1  x2+i4       ;   w1:= h_addr:=
      sl  w1  x3+1        ;        min (d_addr - h, digit_base + 1);
      al  w1  x3+1        ;   <*this will yield at least one position
      rs  w1  x2+i14      ;     before the dec.point*>
;
      zl  w3  x2+i6       ;   w3:= first_letter:= pnfn shift (-2);
      ls  w3  -2          ;   goto case first_letter of
      zl. w3  x3+b21.     ;        (d_b, f, z, d_b);
c8:   jl.     x3          ;

c9:                       ; f:     <*print sign in first layout pos*>
      jl. w3  c21.        ;   call print_front_sign;

c10:                      ; d_b:   <*print unused digit positions as space*>
      dl  w1  x2+i33      ;   w0:= d_addr;  w1:= digit_base;
      rl  w3  x2+i14      ;   w3:= h_addr;
      sl  w3  x1+1        ;   if h_addr <= digit_base then
      jl.     c11.        ;   begin
      sl  w0  x1+2        ;     w1:= leading_sp:=
      jl.     a20.        ;          if d_addr <= base + 1
      rl  w1  0           ;          then
      al  w1  x1-2        ;            d_addr - h_addr - 1
a20:                      ;          else
      ws  w1  6           ;            digit_base - h_addr + 1;
      al  w1  x1+1        ;
      sh  w1  0           ;     if leading_sp > 0 then
      jl.     c11.        ;     begin
      wa  w3  2           ;       w3:= h_addr:= h_addr + leading_sp;
      rs  w3  x2+i14      ;
      rl. w3 (n2.)        ;       call outspaces_as_digits (leading_sp);
      jl  w3  x3+d15      ;     end leading_sp > 0;
                          ;   end h_addr <= digit_base;

\f


; eah  20.3.81   algol 8, text procedures     (putnum)             page 3.9
;

c11:                      ; z:     <*print sign before first digit*>
      jl. w3  c21.        ;   call print_front_sign;

a21:  
      rl w3  x2+i14      ;   w3:= h_addr;
      sl  w3 (x2+i32)     ;   while h_addr < d_addr do
      jl.     a22.        ;   begin
      al  w3  x3+1        ;     h_addr:= h_addr + 1;
      rs  w3  x2+i14      ;
      zl  w1  x3-1        ;     digit:= stack (h_addr-1);
      am     (x2+i33)     ;
      sl  w3   +2         ;     if h_addr <= digit_base  or
      sl  w3  x2+1        ;        h_addr > last_digit   then
      al  w1  0           ;          digit:= 0;  <*leading/ending zeroes*>
      rl. w3 (n2.)        ;
      jl  w3  x3+d13      ;     call outdigit(digit)  on segm.2;
      jl.     a21.        ;   end;
\f


; eah  20.3.81   algol 8, text procedures     (putnum)          page 3.10


a22:                      ;
      zl  w3  x2+i5       ;   if d <> 0 then
      sn  w3  0           ;   begin
      jl.     a25.        ;
      al  w0  f46         ;     w0:= dec.point char;
      rl. w3 (n2.)        ;
      jl  w3  x3+d11      ;     call outchar (dec.point);

a23:                      ;
      rl  w3  x2+i14      ;     while h_addr < sref do
      sl  w3  x2          ;     begin
      jl.     a24.        ;
      zl  w1  x3          ;       w1:= digit:= stack(h_addr);
      sh  w3 (x2+i33)     ;       if h_addr <= digit_base then
      al  w1  0           ;         digit := 0;
      al  w3  x3+1        ;        h_addr:= h_addr + 1;
      rs  w3  x2+i14      ;
      rl. w3 (n2.)        ;
      jl  w3  x3+d13      ;       call outdigit (digit);
      jl.     a23.        ;     end h_addr < sref;

a24:
      rl  w1  x2+i12      ;     w1:= following_zeroes;
      ac  w3  x2          ;     w3:= d_addr - sref;
      wa  w3  x2+i32      ;
      sl  w3  1           ;     if d_addr - sref > 0 then
      ws  w1  6           ;       zeroes:= zeroes - (d_addr - sref);
      rl. w3 (n2.)        ;
      sl  w1  1           ;     if zeroes > 0 then
      jl  w3  x3+d15      ;       outspaces_as_digits (zeroes);
                          ;   end d <> 0;

a25:
      zl  w1  x2+i7       ;   if s <> 0  or
      lo  w1  x2+i13      ;      exp10 <> 0
      rl. w3 (n4.)        ;   then
      se  w1  0           ;     goto print_exp (on segm.4);
      jl      x3+d27      ;
\f


; eah  20.3.81   algol 8, text procedures     (putnum)          page 3.11
;
;
; end_number:
;
d30:                      ; end_number:
d31 = k-j0                ;     <*jump from segm.4*>
      zl  w0  x2+i6       ;   w0:= pnfn shift (-2);
      ls  w0  -2          ;
      se  w0  1           ;   if pn = f then
      jl.     c20.        ;   begin
      rl  w1  x2+i23      ;     w1:= count:= maxcount
      ws  w1  x2+i22      ;          - charcount
      al  w1  x1-2        ;          - 2;
      rl. w3 (n2.)        ;
      jl  w3  x3+d17      ;     outspaces (count);
                          ;   end;

c20:                      ; print_ending_sign:
      jl. w3  c22.        ;   call print_sign;
      rl. w3 (n2.)        ;

      rl  w1  x2+i23      ;   w1:= count:= 
      ws  w1  x2+i22      ;        maxcount - charcount;
      sh  w1  0           ;   if count > 0 then
      jl      x3+d1       ;   begin
      jl  w3  x3+d17      ;     call outspaces (count);
      rl. w3 (n2.)        ;   end;
      jl      x3+d1       ;   goto normal_return (segm.2);
\f


; eah  20.3.81   algol 8, text procedures     (putnum)          page 3.12
;
; local constants:
;
h.
      1, 1                ; standard integer layout << d>:
b0:   2.11<10, 0          ;   b=h=1, lead_sp=1, rest = 0

b1:   0, f32, f43, 0      ; char values for sign printing:
                          ;   nothing/space/plus
w.

b2:   1<23                ; const. to test for -2**27

b10:  2.1111 0000 11 1111 ; mask for test integer/real layout
;          d pnfn  s pefe

b11:  10                  ; constants used for long division
b12:  20                  ;
      -10                 ;
b13:  1                   ; pair (-10, 1)

h.

b20:                      ; table rel.addr for case num.type
      c1 - c0             ; 10: integer
      c2 - c0             ; 11: real
      c3 - c0             ; 12: long
      0                   ;

b21:                      ; table rel.addr for switch first_letter pn:
      c10- c8             ;    d
      c9 - c8             ;    f
      c11- c8             ;    z
      c10- c8             ;    b

e.                        ; end block put_num;

\f


; eah  20.3.81   algol 8, text procedures     (print_sign)              page 3.13
;
;
; local subroutine print_sign
;
; the routine has two entries:
; c21: print_front_sign
;      outputs the sign character if the layout denotes a front sign
; c22: print_sign
;      outputs the sign character if this isn't null.
;
;     call                return
; w0  undef               undef
; w1  undef               undef
; w2  stackref            unchanged
; w3  abs return          undef
;
b.w.
c21:                      ; print_front_sign
      rl  w0  x2+i9       ;   w0:= spaces_in_layout
      sz  w0  1<5         ;   if front_sign not wanted then
      jl      x3          ;     goto return

c22:                      ; print_sign:
      zl  w0  x2+i11      ;   w0:= char := sign_char;
      sn  w0  0           ;   if sign_char = 0 then
      jl      x3          ;     goto return;
      al  w1  0           ;
      hs  w1  x2+i11      ;   sign_char:= 0;
      rs  w3  x2+i28      ;   save return addr;
      rl. w3 (n2.)        ;
      jl  w3  x3+d11      ;   call outchar (char);
      jl     (x2+i28)     ;   goto return;

e.                        ; end print_sign;

\f


; eah  20.3.81   algol 8, text procedures                   page 3.14
;


g3 = k-j0

c. g3-506
   m. code on segment 3 too long
z.

c. 502-g3
   0, r. 252 - g3>1
z.

<:text proc.3:>
e.
\f


; eah  1.4.81   algol 8, text procedures                  page 4.1
;

b.c30, g3, j100, n10      ; begin  segment 4

f0 = f0+1                 ; segment count
k  = 10000                ;

h.
j0:   g1, g2              ; head word: last point, last absword

j30:  f1+30, 0            ; rs.30: saved stackref, w3

n2:   1<11 o.(:2-f0:), 0  ; ref.to segment 2
n3:   1<11 o.(:3-f0:), 0  ;  -  -     -    3

g2 = k-2-j0               ; rel of last absword
g1 = k-2-j0               ; rel of last point

w.
\f


; eah  1.4.81   algol 8, text procedures     (put_real)             page 4.2

b. a40, b40               ; begin  block put_real
w.


;
; print_real:
;
d24:                      ; print_real:
d25 = k-j0                ;       <*jump from segm.3*>

      ds. w1  b20.        ;   save real_number;
      zl  w3  x2+i10      ;   w3:= proc_state;
      sz  w3  2.11<8      ;   if state = no layout then
      jl.     a1.         ;   begin
      dl. w1  b0.         ;     layout:= unpacked << -dd.dddd>;
      ds  w1  x2+i6       ;       b,d,h,pnfn
      dl. w1  b1.         ;       s,pefe, spaces
      ds  w1  x2+i9       ; 
      dl. w1  b20.        ;     w0w1:= saved real_number;
                          ;   end;
a1:
      al  w3  2.11        ;   w3:= code for sign printing :=
      la  w3  x2+i6       ;        pnfn extract 2;
      zl. w3  x3+b2.      ;   w3:= signchar(code);
      sh  w0  -1          ;   if real_number < 0 then
      al  w3  f45         ;     w3:= signchar:= minus;
      hs  w3  x2+i11      ;   save signchar;

      sn  w0  0           ;   if number = 0 then
      jl.     c1.         ;     goto real_zero;

      el  w1  x2+i7       ;   w1:= s; <*number of digits in exponent*>
      el. w1  x1+b14.     ;   w1:= exp_limit:= 10**s - 1;
      al  w3  1           ;   w3:= new_zeroes:=
      es  w3  x2+i3       ;        (if b<=12 then 1-b
      sh  w3  -12         ;         else
      al  w3  -11         ;           -11)
      ea  w3  x2+i5       ;        +  d
      ea  w3  x2+i4       ;        +  h;
      al  w0  0           ;   w0:= nlim:= 0;
      ds. w0  b16.        ;   save new_zeroes, nlim;

\f


; eah  1.4.81   algol 8, text procedures     (put_real)              page 4.3

      al  w3  x1          ;   w3:= exp_limit;
      wd. w1  b15.        ;   w0:= exp_limit mod new_zeroes
      ws  w0  6           ;        - exp_limit
      es  w0  x2+i5       ;        - d;
      hs. w0  b16.        ;   nlim:= w0;
                          ;     <*nlim is stored in left half of the word
                          ;       for later use as  nlim * 2**12      *>
      el  w0  x2+i3       ;   w0:=
      sl  w0  13          ;        if b<=12 then  b
      al  w0  12          ;                 else  12;
      dl. w3  b4.         ;   w2w3:= 1.0;
      al  w1  -1          ;   w0w1:= first significant bit of b;
      ns  w0  3           ;   w1  := bitno:= no.of signif.bits - 23;
      as  w1  2           ;   w1:= bitno * 4;

a5:                       ;   repeat
      ls  w0  1           ;     w0(0) := next bit;
      sh  w0  -1          ;     if bit = 1 then
      fm. w3  x1+b8.      ;       w2w3:= w2w3 * 10**(2**(bitno+22));
      al  w1  x1-4        ;     bitno:= bitno - 1;
      sl  w1  -88         ;   until bitno < -22;
      jl.     a5.         ;     <*now w2w3 = number = 10**b *>
   
      dl. w1  b20.        ;   w0w1:= saved real_number;
      ds. w3  b20.        ;   save number;

      el  w3  7           ;   w3:= (new_exp
      es  w3  3           ;        - exp
      al  w3  x3-2        ;        - 2)
      wm. w3  b19.        ;             * (-l)*2**12;
                          ;     comment 0 < (log2 - l) < 0.000005;

      sh. w3 (b16.)       ;   if w3 <= nlim * 2**12 then
      rl. w3  b16.        ;     w3:= nlim * 2**12;
      rs. w3  b16.        ;   nlim:= entier(max((exp-newexp+2)*l, nlim));
\f


; eah  1.4.81   algol 8, text procedures     (put_real)            page 4.4

      al  w2  -1          ;   w3:= first signif.bit of n;
      ns  w3  5           ;   w2:= bitno:= no.of signif.bits - 11;
      as  w2  2           ;   w2:= bitno * 4;
      sh  w3  -1          ;   if n >= 0 then
      jl.     a8.         ;   begin
      sh  w2  -48         ;     if bitno > -11 then
      al  w2  -44         ;       bitno:= -11;
      sh  w2  -8          ;     if bitno > -2 then
      jl.     a7.         ;     begin
      fd. w1  b6.         ;       w0w1:= w0w1 / 10**(2**9);
      am      -4          ;     end;
a7:   fd. w1  x2+b7.      ;     w0w1:= w0w1 / 10**(2**(bitno+11));
                          ;   end n >= 0;
a8:
      al  w2  x2-4        ;   for bitno:= bitno - 1 
      sh  w2  -48         ;       while bitno > -12 do
      jl.     a10.        ;   begin
      ls  w3  1           ;     w3(0) := next bit;
      sl  w3  0           ;     if bit = 0 then
      fm. w1  x2+b7.      ;       w0w1:= w0w1 * 10**(2**(bitno+11));
      jl.     a8.         ;   end while;

a10:
      sl  w0  0           ;   if w0w1 < 0 then
      jl.     a11.        ;   begin
      ld  w3  -100        ;     w2w3:= 0;
      fs  w3  2           ;     w0w1:= -w0w1;
      ds  w3  2           ;   end;

a11:
      dl. w3 (j30.)       ;   w2:= stackref;
      el. w3  b16.        ;   w3:= nlim:= 
      ea  w3  x2+i5       ;          nlim + d;
      hs. w3  b16.        ;   save nlim;
\f


; eah  1.5.81   algol 8, text procedures     (put_real)           page 4.5

      dl. w3  b20.        ;   w2w3:= saved number;
      ds. w1  b20.        ;   save digits (= w0w1);
      fm. w1  b5.         ;   w0w1:= digits * 10.0
      fa. w1  b3.         ;          + 0.5;
      fs  w3  2           ;   w2w3:= number - digits*10-0.5;
      el. w3  b16.        ;   w3:= nlim;
      sl  w2  1           ;   if number <= digits * 10 then
      jl.     a12.        ;   begin
      dl. w1  b20.        ;     w0w1:= digits
      fa. w1  b3.         ;            + 0.5;
      al  w3  x3+1        ;     w3:= nlim := nlim + 1;
      hs. w3  b16.        ;   end;

a12:
      el  w2  6           ;   w2w3:= extend nlim;
      el  w2  4           ;
      wd. w3  b15.        ;   w2:= k:= nlim mod new_zeroes;
      sh  w2  -1          ;   if k < 0 then
      wa. w2  b15.        ;     k:= k + new_zeroes;
      el. w3  b16.        ;   w3:= exp10:=
      ws  w3  4           ;        nlim - k;
      rs. w3  b16.        ;

      el  w3  3           ;   w3:= exp(w0w1);
      sh  w3  0           ;   if w0w1 <= 1 then   <*exp <= 0*>
      jl.     c1.         ;     goto real_zero;
      rs. w2  b15.        ;   new_zeroes:= w2;
      ad  w1  x3-47       ;   w0:= last 6 digits;

c0:                       ; end_conversion:
      dl. w3 (j30.)       ;   w2:= stackref;
      ds  w1  x2+i30      ;   num_value(stack):= number;
      dl. w1  b16.        ;   following_zeroes(stack):= new_zeroes;
      ds  w1  x2+i13      ;   exp10(stack)           := exp10(this segm);
      rl. w3 (n3.)        ;   goto print_number
      jl      x3+d23      ;        (on segm.3);

c1:                       ; real_zero:
      ld  w1  -100        ;   w0w1:= number:= 0;
      ds. w1  b16.        ;   new_zeroes:= exp10:= 0;
      jl.     c0.         ;   goto end_conversion;
\f


; eah  1.4.81   algol 8, test procedures     (put_real)           page 4.6

;
; print_exp:
;
d26:                      ; print_exp:
d27 = k-j0                ;       <*jump from segm.3*>

      rl  w0  x2+i13      ;   w0:= exp10(stack);
      zl  w1  x2+i8       ;   w1:= pefe;
      sn  w0  0           ;   if exp10 = 0 and
      sz  w1  2.1000      ;      first_letter_exp <> z then
      jl.     a20.        ;   begin
      al  w1  0           ;     w1:= spaces:= 0;
      jl.     c5.         ;     goto exp_as_spaces;
a20:                      ;   end;
      la. w1  b21.        ;   w1:= code for sign printing := pefe extract 2;
      zl. w1  x1+b2.      ;   w1:= signchar(code);
      sl  w0  0           ;   if exp10 < 0 then
      jl.     a22.        ;   begin
      ac  w0 (0)          ;     w0:= exp10:= - exp10;
      rs  w0  x2+i13      ;    
      al  w1  f45         ;     w1:= signchar:= minus;
a22:                      ;   end;
      hs  w1  x2+i34      ;   save signchar of exponent;
      al  w0  f39         ;   w0:= char:= exponent mark;
      rl. w3 (n2.)        ;   call outchar(exp.mark);
      jl  w3  x3+d11      ;
      rl  w0  x2+i13      ;   w0:= exp10
      zl  w1  x2+i7       ;   w1:= new_s:= s;

a24:                      ;   repeat
      rs  w1  x2+i12      ;     save new_s;
      zl. w3  x1+b10.     ;     w3:= 10**new_s;
      al  w1  x1+1        ;     w1:= new_s + 1;
      sl  w0  x3          ;   until exp10 < 10**new_s;
      jl.     a24.        ;

      zl  w3  x2+i8       ;   w3:= first_letter_exp:=
      ls  w3  -2          ;        pefe shift (-2);
      zl. w3  x3+b22.     ;   goto case first_letter_exp of
a25:  jl.     x3          ;        (d, f, z, z);
\f


; eah  1.4.81   algol 8, text procedures     (put_real)           page 4.7

a26:                      ; f:    <*print sign in first layout pos*>
      zl  w0  x2+i34      ;   w0:= saved exp.signchar;
      rl. w3 (n2.)        ;
      se  w0  0           ;   if signchar <> 0 then
      jl  w3  x3+d11      ;     outchar (signchar);
      al  w0  0           ;   exp.signchar:= 0;
      hs  w0  x2+i34      ;       comment continue as d;

a27:                      ; d:    <*print unused digit positions as space*>
      dl  w0  x2+i13      ;   w3:= new_s;  w0:= exp10;
      zl. w1  x3+b11.     ;   w1:= 10**(new_s-1);  <* new_s > 0 *>
      sl  w0  x1          ;   while exp10 < 10**(new_s-1) do
      jl.     a28.        ;   begin
      al  w3  x3-1        ;     w3:= new_s:=
      rs  w3  x2+i12      ;          new_s - 1;
      al  w0  f32         ;     w0:= char:= leading_space;
      rl. w3 (n2.)        ;  
      jl  w3  x3+d11      ;     call outchar (leading_space);
      jl.     a27.        ;   end;
                          ;         comment  continue as z;

a28:                      ; z:    <*print sign before first digit*>
      zl  w0  x2+i34      ;   w0:= char:= exp.sign;
a29:                      ;   for x:= x, new_s while new_s <> 0 do
      rl. w3 (n2.)        ;   begin
      se  w0  0           ;     if char <> 0 then
      jl  w3  x3+d11      ;       call outchar (char);
      dl  w1  x2+i13      ;     w0:= new_s;  w1:= exp10;
      sn  w0  0           ;     if new_s <> 0 then
      jl.     a30.        ;     begin
      es. w0  1           ;       w0:= new_s := new_s - 1;
      rs  w0  x2+i12      ;
      am     (0)          ;
      zl. w3  +b10.       ;       w3:= divisor:= 10**new_s;
      al  w0  0           ;
      wd  w1  6           ;       w1:= digit:= exp10 // divisor;
      rs  w0  x2+i13      ;       w0:= exp10:= exp10 mod divisor;
      al  w0  x1+48       ;       w0:= char:= digit + 48;
                          ;     end new_s <> 0;
      jl.     a29.        ;   end while;
                          ;   goto finito;
\f


; eah  1.4.81   algol 8, text procedures     (put_real)           page 4.8

; 
; all_spaces_out:
;
d28:                      ; all_spaces_out:
d29 = k-j0                ;     <*jump from segm.3*>

      zl  w1  x2+i4       ;   w1:= spaces:=
      ea  w1  x2+i5       ;        h + d;
      zl  w0  x2+i5       ; 
      se  w0  0           ;   if d <> 0 then
      al  w1  x1+1        ;     spaces:= spaces + 1;
      zl  w3  x2+i6       ;   
      sz  w3  2.11        ;   if pnfn extract 2 <> 0 then
      al  w1  x1+1        ;     spaces:= spaces + 1;

c5:                       ; exp_as_spaces:
      zl  w3  x2+i7       ;
      se  w3  0           ;   if s <> 0 then
      am      x3+1        ;     w1:= spaces:= spaces + s + 1;
      al  w1  x1          ;
      zl  w3  x2+i8       ;
      sz  w3  2.11        ;   if pefe extract 2 <> 0 then 
      al  w1  x1+1        ;     spaces:= spaces + 1;
      rl. w3 (n2.)        ;   call outspace_as_digits;
      jl  w3  x3+d15      ;         (on segm.2)

;
; finito:
;
a30:                      ; finito:
      rl. w3 (n3.)        ;   goto end_number;
      jl      x3+d31      ;         (on segm.3)

\f


; eah  1.4.81   algol 8, text procedures     (put_real)           page 4.9

;
; local constants:
;

w.
                          ; standard layout for reals: << -dd.dddd>
      6<12 + 2            ;   b=6,    h=2
b0:   4<12 + 1            ;   d=4, pnfn=1
      0<12 + 0            ;   s=0, pefe=0
b1:   2.11<22             ;   one leading space

h.
b2:   0, f32, f43, 0      ; char values for sign printing

                          ; floating point values:
      1024,    0          ;
b3:      0,    0          ;   0.5

      1024,    0          ;
b4:      0,    1          ;   1.0

                          ; tens exponents
      1280,    0          ;
b5:      0,    4          ; 10 ** (2**0)      10**1

      1600,    0          ;
         0,    7          ; 10 ** (2**1)      10**2

      1250,    0          ;
         0,   14          ; 10 ** (2**2)      10**4

      1525, 3600          ;
         0,   27          ; 10 ** (2**3)      10**8

      1136, 3556          ;
      3576,   54          ; 10 ** (2**4)      10**16

      1262,  726          ;
      3393,  107          ; 10 ** (2**5)      10**32

      1555, 3087          ;
      2640,  213          ; 10 ** (2**6)      10**64

      1181, 3363          ;
      3660,  426          ; 10 ** (2**7)      10**128

      1363, 3957          ;
      4061,  851          ; 10 ** (2**8)      10**256

      1816, 3280          ;
b6:   1397, 1701          ; 10 ** (2**9)      10**512

b7 = b5+44
b8 = b5+88

b10:  1, 10, 100, 1000    ; powers of ten
b11 = b10-1               ; powers-1 of ten

b14:  0, 9, 99, 999       ; exp_limits

w.
b15:  0                   ; new_zeroes
b16:  0                   ; exp10  or nlim (in left half of word)

b19:  -1233               ; -l  = -entier (log2 * 2**12)

      0                   ;
b20:  0                   ; save real / number / digits

b21:  2.11                ; mask for extract last two bits

h.
b22:                      ; table rel.addr for switch first_letter_pe:
      a27 - a25           ;   d
      a26 - a25           ;   f
      a28 - a25           ;   z
      a28 - a25           ;   b (not used)

e.                        ; end block put_real;

\f


; eah  1.4.81   algol 8, text procedures                       page 4.10


g3 = k-j0

c. g3-506
   m. code on segment 2 too long
z.

c. 502-g3
   0, r. 252 - g3>1      ; zerofill
z.

<:text proc.4:>
e.
\f


; eah  1.5.81   algol 8, text procedures                             page 5.1
;

b. b10, c30, g3, j100, n10 ; begin  segment 5

f0 = f0 + 1                ; segment count
k  = 10000                 ;

h.
j0:   g1, g2               ; head word: last point, last absword

j17:   f1+17, 0            ; rs.17, index alarm


n2:   1<11 o.(:2-f0:), 0   ; ref. to segment 2

g2 = k-2-j0                ; rel of last absword
g1 = k-2-j0                ; rel of last point

w.
\f


; eah  1.5.81   algol 8, text procedures     (get_text)           page 5.2
;
b. a30                    ; begin block get_text
w.

;
; get_text_continued:
;
d42:                      ; get_text:
d43 = k-j0                ;
      al  w0  -16         ;   charpointer_text := first_char;
      hs  w0  x2+i34      ;
      al  w0  0           ;
      rs  w0  x2+i25      ;   pack_count:= 0;
      hs  w0  x2+i11      ;   stop_text := 0;
;
; length > 0:   (copy text)
;
      rl  w3  x2+i13      ;   w3:= length;
      sh  w3  0           ;   if length > 0 then
      jl.     a10.        ;   begin    <*copy text*>
a1:                       ;     repeat
      jl. w3  d50.        ;       call inchar; (w0:=class,w1:=char)
      jl. w3  d52.        ;       call packchar(char);
      rl  w3  x2+i25      ;       w3:= pack_count;
      se  w3 (x2+i13)     ;     until pack_count = length;
      jl.     a1.         ;
      jl.     c1.         ;     goto text_return;
                          ;   end length > 0
                          ;   else
\f


; eah  1.5.81   algol 8, text procedures     (get_text)           page 5.3

;
; length = 0:   (like readstring)
;
a10:
      se  w3  0           ;   if length = 0 then
      jl.     a20.        ;   begin
a11:                      ;     repeat   <*skip leading delimiters*>
      jl. w3  d50.        ;       call inchar (w0:=class,w1:=char)
      sl  w0  7           ;     until  class < 7;
      jl.     a11.        ;
a12:                      ;     repeat    <*pack text, skip blind*>
      sl  w0  2           ;       if class > 1 then
      jl. w3  d52.        ;         call pack_char(char);
      jl. w3  d50.        ;       call inchar; (w0:=class,w1:=char)
      sh  w0  6           ;     until  class > 6;
      jl.     a12.        ;
      jl.     c1.         ;     goto text_return;
                          ;   end length = 0
                          ;   else
;
; length < 0:   (read until terminator)
;
a20:                      ;   begin  <*length < 0*>
      ac  w3  x3          ;     w3:= length:= abs length;
      rs  w3  x2+i13      ;
a21:                      ;     repeat
      jl. w3  d50.        ;       call inchar; (w0:=class,w1:=char)
      sl  w0  8           ;       if class >= 8 then  <*terminator*>
      jl.     c1.         ;         goto text_return;
      sl  w0  2           ;       if class > 1 then
      jl. w3  d52.        ;         call pack_char (char);
      rl  w3  x2+i25      ;       w3:= pack_count;
      se  w3 (x2+i13)     ;     until pack_count = abs length;
      jl.     a21.        ;     (continue at text_return)
                          ;   end length < 0;

e.                        ; end block gettext;
\f


; eah  1.5.81   algol 8, text procedures     (return)             page 5.4

;
; text_return:
;
c1:                       ; text_return:
      al  w1  0           ;   char:= null;
      jl. w3  d52.        ;   pack_char (null);
      rl  w0  x2+i25      ;   w0:= no_of_characters:= 
      es. w0  1           ;        pack_count - 1;
      rl. w3 (n2.)        ;   goto normal_return_from_getproc;
      jl      x3+d61      ;           (on segment 2)

;
; error_return:
;
c11:  am      -4 +5       ; source_exhausted:  result:= -4;
c12:  al  w1  -5          ; text_array_full:   result:= -5;
      al  w0  -1          ;   extend negative resultvalue;
      rl. w3 (n2.)        ;
      jl      x3+d3       ;   goto error_return; (on segm.2)
\f


; eah  1.5.81   algol 8, text procedures     (inchar)             page 5.5
;
; global subroutine inchar
;
;
; the subroutine takes one character from the next character position
; in source. the character is read as a 12-bits character from a
; boolean array, or as an 8-bits character otherwise.
;
; if convtable has been specified, the character value and class are
; taken from there, otherwise the standard iso character class is
; returned.
;
;        call             return
; w0     undef            character class
; w1     undef            character value
; w2     stackref         unchanged
; w3     abs return       undef
;
; the packed  char_class<12 + char_value  is stored in x2+i24
;
b. a20                    ; begin block  inchar
w.

d50:                      ; inchar:
d51 = k-j0
      zl  w1  x2+i26      ;   w1:= stop_mark;
      se  w1  0           ;   if stop then
      jl.     c11.        ;     goto error_return (source exhausted);
      rs  w3  x2+i19      ;   save return address;
      rl  w1  x2+i22      ;   w1:= charcount:=
      al  w1  x1+1        ;        charcount + 1;
      rs  w1  x2+i22      ;
      rl  w1  x2+i0       ;   w1:= curr_inx;
;
; use of registers:
; w0  char
; w1  curr_inx
; w2  stackref
; w3  charpointer
;
\f


; eah  1.5.81   algol 8, text procedures     (inchar)            page 5.6
;
; 12-bits source:
;
      zl  w0  x2+i10      ;   w0:= procstate;
      so  w0  1<6         ;   if 12-bits source then
      jl.     a2.         ;   begin
      am     (x2+i20)     ;     w0:= char:=
      zl  w0  x1          ;          source(curr_inx)
      la. w0  b0.         ;            extract 8;
      al  w1  x1+1        ;     curr_inx:= curr_inx + 1;
      jl.     a10.        ;     goto check_curr_inx;
                          ;   end;
;
; 8-bits source:
;
a2:                       ;
      am     (x2+i20)     ;   w0:= curr_word:=
      rl  w0  x1          ;        source(curr_inx);
      el  w3  x2+i27      ;   w3:= charpointer;  (-16, -8, or 0)
      ls  w0  x3          ;   w0:= char:= curr_word shift charpointer
      la. w0  b0.         ;                 extract 8;
      al  w3  x3+8        ;   w3:= charpointer :+ 8;
      sh  w3  0           ;   if charpointer > 0 then
      jl.     a12.        ;   begin
      al  w3  -16         ;     charpointer:= first char in word;
      al  w1  x1+2        ;     curr_inx :+ 2;

a10:                      ; check_curr_inx:   (jump from 12-bits source)
      rs  w1  x2+i0       ;     save curr_inx;
      am     (x2+i21)     ;
      sl  w1  +1          ;     if curr_inx > upper index (source) then
      hs  w3  x2+i26      ;       stop:= true;
a12:                      ;   end next word of source;
      hs  w3  x2+i27      ;   save charpointer;   <*dummy when 12-bits source*>
\f


; eah  1.5.81   algol 8, text procedures        (inchar)          page 5.7
;
; find character class:
;
      rl  w1  0           ;   w1:= char;
      rl  w3  x2+i15      ;   w3:= convtable_base;
      se  w3  0           ;   if convtable_base = 0  (this 0 is used by index alarm)
      jl.     a15.        ;   then  begin
      sl  w1  128         ;     if char > 127 then
      jl. w3 (j17.)       ;        goto index_alarm;
      zl. w0  x1+b2.      ;     w0:= class:= std_table(char);
      hs  w0  x2+i24      ;     save packed class
      hs  w1  x2+i24+1    ;             and char;
      jl     (x2+i19)     ;     goto return;
                          ;   end no convtable
                          ;   else
a15:                      ;   begin
      ls  w1  1           ;     w1:= conv_index:= char*2;  (this 1 is used by index alarm)
      sh  w1 (x2+i16)     ;     if conv_index > upper index
      sh  w1 (x2+i17)     ;           or      <=lower index  then
      jl. w3 (j17.)       ;       goto index_alarm;
      wa  w1  x2+i15      ;     w1:= entry:= conv_index + convtable_base;
      rl  w0  x1          ;     w0:= conv_table(char);
      rs  w0  x2+i24      ;     save class,char;
      el  w1  1           ;     w1:= converted_char:= signed hw2;
      zl  w0  0           ;     w0:= class         := unsigned hw1;
      jl     (x2+i19)     ;     goto return;
                          ;   end convtable
e.                        ; end block inchar;

\f


; eah  1.5.81   algol 8, text procedures     (pack_char)        page 5.8
;
; global subroutine pack_char
;
;
; the subroutine inserts one character at the next character position
; in array text.
; characters are inserted as 12-bits characters in a boolean text array,
; or packed as three 8-bits characters in one word otherwise.
;
;          call            return
; w0     undef            undef
; w1     char value       undef
; w2     stack ref        unchanged
; w3     abs return       undef
;
b. a20                    ; begin block  pack_char
w.

d52:                      ; pack_char:
d53 = k-j0
      zl  w0  x2+i11      ;   w0:= stop_text;
      se  w0  0           ;   if stop then
      jl.     c12.        ;     goto error_return (text full);
      rs  w3  x2+i19      ;   save return addr;
      rl  w3  x2+i25      ;   pack_count:=
      al  w3  x3+1        ;     pack_count + 1;
      rs  w3  x2+i25      ;
      rl  w3  x2+i1       ;   w3:= txt_inx;
      la. w1  b0.         ;   w1:= char:= char_value extract 8;
;
; 12-bits text:
;
      zl  w0  x2+i8       ;   w0:= text array kind;
      se  w0  1           ;   if 12-bits text then
      jl.     a5.         ;   begin
      am     (x2+i3)      ;     text(txt_inx):=
      hs  w1  x3          ;        char;
      al  w1  x3+1        ;     w1:= txt_inx:= txt_inx + 1;
      jl.     a10.        ;     goto check_txt_inx;
                          ;   end 12-bits text;
\f


; eah  1.5.81   algol 8, text procedures     (pack_text)        page 5.9
;
; 8-bits text:
;
a5:                       ; 8-bits text:
      rs  w1  x2+i12      ;   save char;
      am     (x2+i3)      ;   w0:= curr_word:=
      rl  w0  x3          ;        text(txt_inx);
      el  w3  x2+i34      ;   w3:= char_pointer_text;
      sn  w3  -16         ;   if char_pointer = first_char then
      al  w0  0           ;     curr_word:= 0;
      al  w1  0           ;
      ld  w1  x3          ;   w0w1:= curr_word shift charpointer;
      lo  w0  x2+i12      ;   insert char in rightmost 8 bits of w0
      ac  w3  x3          ;   w0:= new curr_word:=
      ld  w1  x3          ;        w0w1 shift (-charpointer);
      ac  w3  x3-8        ;   w3:= charpointer:= charpointer + 8;

      rl  w1  x2+i1       ;   w1:= txt_inx;
      am     (x2+i3)      ;   text(txt_inx):=
      rs  w0  x1          ;     new curr_word;
      sh  w3  0           ;   if charpointer > 0 then
      jl.     a12.        ;   begin  <*prepare for next word of text*>
      al  w3  -16         ;     charpointer:= first char in word;
      al  w1  x1+2        ;     txt_inx :+ 2;

a10:                      ; check_txtinx:   <*jump from 12-bits text*>
      rs  w1  x2+i1       ;     save txt_inx;
      am     (x2+i5)      ;
      sl  w1  +1          ;     if txt_inx > upper index (text) then
      hs  w3  x2+i11      ;       stop_text:= true;
                          ;   end next word of text;
a12:                      ;
      hs  w3  x2+i34      ;   save charpointer_text;
      jl     (x2+i19)     ;   goto return;
e.                        ; end block pack_text;
\f


; eah  1.5.81   algol 8, text procedures                     page 5.10
;
; global constants for segment 5:
;
w.
b0:   2.11111111          ; mask for extract one character;

;
; iso standard character classes:
;
h.
b2:

;  0 nul   1 soh   2 stx   3 etx   4 eot   5 enq   6 ack   7 bel
   0,      7,      7,      7,      7,      7,      7,      7
;  8 bs    9 ht   10 nl   11 vt   12 ff   13 cr   14 so   15 si
   7,      7,      8,      7,      8,      0,      7,      7
; 16 dle  17 dc1  18 dc2  19 dc3  20 dc4  21 nak  22 syn  23 etb
   7,      7,      7,      7,      7,      7,      7,      7
; 24 can  25 em   26 sub  27 esc  28 fs   29 gs   30 rs   31 us
   7,      8,      7,      7,      7,      7,      7,      7
; 32 sp   33 !    24 "    35      36 $    37 %    38 &    39 '
   7,      7,      7,      7,      7,      7,      7,      5
; 40 (    41 )    42 *    43 +    44 ,    45 -    46 .    47 /
   7,      7,      7,      3,      7,      3,      4,      7
; 48 0    49 1    50 2    51 3    52 4    53 5    54 6    55 7
   2,      2,      2,      2,      2,      2,      2,      2
; 56 8    57 9    58 :    59 ;    60 <    61 =    62 >    63 ?
   2,      2,      7,      7,      7,      7,      7,      7
; 64 @    65 A    66 B    67 C    68 D    69 E    70 F    71 G
   7,      6,      6,      6,      6,      6,      6,      6
; 72 H    73 I    74 J    75 K    76 L    77 M    78 N    79 O
   6,      6,      6,      6,      6,      6,      6,      6
; 80 P    81 Q    82 R    83 S    84 T    85 U    86 V    87 W
   6,      6,      6,      6,      6,      6,      6,      6
; 88 X    89 Y    90 Z    91 Æ    92 Ø    93 Å    94      95 _
   6,      6,      6,      6,      6,      6,      7,      7
; 96 `    97 a    98 b    99 c   100 c   101 e   102 f   103 g
   7,      6,      6,      6,      6,      6,      6,      6
;104 h   105 i   106 j   107 k   108 l   109 m   110 n   111 o
   6,      6,      6,      6,      6,      6,      6,      6
;112 p   113 q   114 r   115 s   116 t   117 u   118 v   119 w
   6,      6,      6,      6,      6,      6,      6,      6
;120 x   121 y   122 z   123 æ   124 ø   125 å   126     127 del
   6,      6,      6,      6,      6,      6,      7,      0

w.
\f


; eah  1.5.81   algol 8, text procedures                        page 5.11
;

g3 = k-j0

c. g3-506
   m. code on segment 2 too long
z.

c. 502-g3
   0, r. 252 - g3>1        ; zerofill
z.

<:text proc.5:>
e.                         ; end segment 5
\f


; eah  10.5.81   algol 8, textprocedures     (read_number)         page 6.1
;

b. c30, g3, j100, n10      ; begin  segment 6

f0 = f0+1                  ; segment count
k  = 10000                 ;

h.
j0:   g1, g2               ; head word: last point, last absword

j22:  f1+22, 0             ; rs.22, underflows
j30:  f1+30, 0             ; rs.30, saved stackref,w3
j37:  f1+37, 0             ; rs.37, overflows

n2:   1<11 o.(:2-f0:), 0   ; ref.to segment 2
n5:   1<11 o.(:5-f0:), 0   ; ref.to segment 5
n7:   1<11 o.(:7-f0:), 0   ; ref.to segment 7

g2 = k-2-j0                ; rel of last absword
g1 = k-2-j0                ; rel of last point

w.
\f


; eah  10.5.81     algol 8, text procedures     (read_number)      page 6.2
;
b. a30, b20, c20, g10     ; begin block   read_number
w.
;
; this code is used for reading a number and converting it to the
; required type.
;
; number limits:
; integer: abs number <= 2**23-1 = 8 388 607
; long   : abs number <= 2**47-1 = 140 737 488 355 327
; real   : the range given by the 48-bits integer can be used in spite
;          of the fact, that a standard procedure is not allowed to
;          cause an integer overflow interrupt.
;          so, the test to avoid this must be performed before the
;          statement:
;              number:= number * 10 + digit.
;          the test is carried out by first testing the double word
;          against  (maxlong//10). if less, there are no troubles.
;          if greater, troubles will come. if equal, digit is tested
;          against 7  (number*10 + digit  <= (maxlong//10)*10 + 7).
;
; in short, the full range of positive longs becomes available to
; abs number.
;
; register contents at entry:
; w0 = class of first char
; w1 = value -    -    -
; w2 = stackref
; w3 = undef.
\f


; eah  10.5.81   algol 8, text procedures     (read number)        page 6.3
;
; local constants:
;

f.
b0:   -1                  ; -1.0 floated
b8:   10                  ; 10.0 floated

w.
b1:   9                   ; number of states
b2:   0, 1<10             ; round const
b3:   0, 1                ; 1   long
b4:   10                  ; 10  integer

         838 860          ; first word of  maxlong//10
b5:   -3 355 444          ; sec.   -   -   maxlong//10


w.

\f


; eah  1.5.81   algol 8, text procedures     (read_number)        page 6.4
;
c0:                       ; digit_after_point:
      rl  w3  x2+i5       ;   w3:= factor:=
      al  w3  x3+1        ;        factor + 1;
      rs  w3  x2+i5       ;
      jl. w3  d56.        ;   call mult_number;
      al  w3  4           ;   state:= 4;  <*following digit after point*>
      jl.     a2.         ;   goto next_char;

c1:                       ; digit_before_point:
      jl. w3  d56.        ;   call mult_number;
      al  w3  2           ;   state:= 2;  <*following digit before point*>

a2:                       ; next_char:
      rs  w3  x2+i32      ;   save state;
      al  w0  6           ;
      rl  w3  x2+i25      ;   w3:= pack_count;
      sn  w3 (x2+i23)     ;   if pack_count = maxcount then 
      jl.     a5.         ;     goto after_inchar;
                          ;       <*simulate terminator with class=6*>
      al  w3  x3+1        ;   pack_count:= pack_count + 1;
      rs  w3  x2+i25      ;
a3:                       ;   repeat
      rl. w3 (n5.)        ;     call inchar;  (on segm.5)
      jl  w3  x3+d51      ;       <*w0:=class,w1:=char*>
      sh  w0  1           ;   until class > 1;
      jl.     a3.         ;

a5:                       ; after_inchar:
      ds  w1  x2+i34      ;   save char, value;

;
; start read_number:
;
d54:                      ; first_char:
d55 = k-j0

      al  w1  x1-48       ;   w1:= digit:=
      rs  w1  x2+i9       ;        char_value - 48;
      sl  w0  7           ;   if class > 6 then
      al  w0  6           ;     class:= 6;
      wm. w0  b1.         ;
      rl  w3  0           ;   w3:= class * no_of_states
      wa  w3  x2+i32      ;          + state;
      el. w3  x3+g0.      ;   action:= action table (class, state);
      jl.     x3+c0.      ;   goto action;
\f


; eah  10.5.81   algol 8, text procedures     (read number)        page 6.6

c2:                       ; digit_in_exp:
      rl  w0  x2+i12      ;   w0:= exp:=
      wm. w0  b4.         ;        exp * 10
      wa  w0  x2+i9       ;            + digit;
      rs  w0  x2+i12      ;
      sl  w0  1000        ;   if exp >= 1000 then
      am      1           ;          state:= 8   <*after error*>
      al  w3  7           ;   else   state:= 7;  <*following exponent digit*>
      jl.     a2.         ;   goto next_char;

c3:                       ; ten_1:
      dl. w1  b3.+2       ;   w0w1:= number:= 1;
      ds  w1  x2+i2       ;   <*continue at ten_2*>

c4:                       ; ten_2:
      al  w3  5           ;   state:= 5;  <*following exponent base*>
      jl.     a2.         ;   goto next_char;

c8:                       ; exp_sign:
      rs  w1  x2+i13      ;   exp_sign:= digit; <*pos=-5 (43-48), neg=-3 (45-48)*>
      am      6 -8        ;   state:= 6;  <*following exponent sign*>
                          ;   goto next_char;

c5:                       ; error_1:  <*error in not yet finished number*>
      am      8 -3        ;   state:= 8;  <*after error*>
                          ;   goto next_char;

c6:                       ; point:
      al  w3  3           ;   state:= 3;  <*following point*>
      jl.     a2.         ;   goto next_char;

c9:                       ; sign:
      rs  w1  x2+i31      ;   sign:= digit; <*pos=-5 (43-48), neg=-3 (45-48)*>
      al  w3  1           ;   state:= 1;  <*following sign before number*>
      jl.     a2.         ;   goto next_char;

c10:                      ; error_2:
      al  w1  -6          ;   error_in_getnum:= true;
      jl.     a22.        ;   goto terminate;
\f


; eah  10.5.81   algol 8, text procedures     (read number)         page 6.7

c11:                      ; finish_integer:
      rl  w3  x2+i29      ;   w3:= param_type;
      sn  w3  11          ;   if param_type = real then
      jl.     c13.        ;     goto finish_real;
      zl  w3  x2+i10      ;   w3:= procstate;
      so  w3  2.10        ;   if proc = get_fixed then
      jl.     a11.        ;   begin
      al  w3  0          ;     digit := 0;
      rs  w3  x2+i9       ;
a10:                      ;
      el  w3  x2+i3       ;     while no_of_decimals > 0 do
      sh  w3  0           ;     begin
      jl.     a11.        ;
      al  w3  x3-1        ;       no_of_decimals :- 1;
      hs  w3  x2+i3       ;
      jl. w3  d56.        ;       call mult_number (0);
      jl.     a10.        ;     end;
a11:                      ;   end get_fixed;
      dl  w1  x2+i2       ;   w0w1:= number;

a12:                      ; finish_no_real_type:
      rl  w3  x2+i29      ;   w3:= param_type;
      se  w3  10          ;   if param_type = long then
      jl.     c12.        ;     goto finish_long;
      sn  w0  0           ;
      sh  w1  -1          ;   if number > max_integer then
      jl.     c10.        ;     goto error_2;
      rl  w3  x2+i31      ;   w3:= sign;
      se  w3  -5          ;   if sign <> pos then
      ac  w1  x1          ;     number:= - number;
      rs  w1  x2+i2       ;   save number;
      jl.     a21.        ;   goto terminate_ok;

c12:                      ; finish_long:
      rl  w3  x2+i31      ;   w3:= sign;
      sn  w3  -5          ;   if sign <> pos then
      jl.     a20.        ;   begin
      ld  w1  100         ;     w0w1:= number:= - number;
      ss  w1  x2+i2       ;   end;
      jl.     a20.        ;   goto save_number;
\f


; eah  10.5.81   algol 8, text procedures     (finish real)       page 6.8

c13:                      ; finish_real:
      dl  w0  x2+i13      ;   w3:= exp; w0:= exp_sign;
      se  w0  -5          ;   if sign = neg then
      ac  w3  x3          ;     exp:= - exp;
      ws  w3  x2+i5       ;   exp:= exp - factor;
      rs  w3  x2+i12      ;
                          ; convert:
      dl  w1  x2+i2       ;   w0w1:= number;
      nd. w1  b10.        ;   normalize (number);
b10 = k+1
      al  w3              ;   norm_exp:= -no_of_shifts;
      sn  w3  -2048       ;   if norm_exp <> -2048 then
      jl.     a13.        ;   begin     <*number <> 0*>
      al  w3  x3+48       ;     norm_exp:= norm_exp + 48;
      ld  w1  -1          ;     number:= number shift (-1)
      aa. w1  b2.+2       ;               + round_const;
      nd  w1  3           ;     exponent:= normalize (number);
      ea  w3  3           ;     norm_exp:= norm_exp + exponent;
                          ;   end number<>0;

a13:                      ; set_exp:
      hs  w3  3           ;   number.exppart:= norm_exp;
      rl. w3 (j37.)       ;   save overflows;
      rs  w3  x2+i5       ;
      rl. w3 (j22.)       ;   save underflows;
      rs  w3  x2+i13      ;
      al  w3  0           ;
      rs. w3 (j37.)       ;   overflows:=
      rs. w3 (j22.)       ;   underflows:= 0;
      rl  w3  x2+i12      ;   w3:= exp;
      ns  w3  5           ;     <*obs. stackref in w2 destroyed*>
      el  w2  5           ;   n:= number of significant bits.abs(exp);
                          ;   l:= 14;
      ls  w2  2           ;     <*if positive exp then w2 uneven,
      al  w2  x2+1+14<2   ;       so bool: exp<-512 not true for pos exp*>
      sl  w3  0           ;   if exp < 0 then
      jl.     a14.        ;   begin
      ls  w3  1           ;     l:= 23 - (n-2);
      al  w2  x2-5        ;     number:= number / 10**(2**n);
      sn  w2  0           ;
      am      -4          ;
      fd. w1  x2+g2.      ;   end;
\f


; eah  10.5.81   algol 8, text procedures     (finish real)       page 6.9

a14:                      ;
      hs. w2  b12.        ;   save bool: exp<-512
a15:                      ;
      ls  w3  1           ;   for j:= l step 1 until 23 do
      al  w2  x2-4        ;   begin
      sn  w3  0           ;
      jl.     a16.        ;
      sh  w3  0           ;     if bit(j).exp = 1 then
      fm. w1  x2+g1.      ;       number:= number * 10**(2**(23-j));
      jl.     a15.        ;   end;

a16:                      ;
b12 = k+1                 ; bool:exp<-512
      sn  w1  x1 +0       ;   if exp<-512 then
      fd. w1  g1.         ;     number:= number / 10**(2**9);
      dl. w3 (j30.)       ;   w2:= saved stackref;
      zl  w3  x2+i10      ;   w3:= procstate;
      so  w3  2.10        ;   if proc = get_fixed then
      jl.     a18.        ;   begin
      el  w3  x2+i3       ;     w3:= no_of_decimals_in_layin;
a17:                      ;
      sh  w3  0           ;     while no_of_decimals > 0 do
      jl.     a18.        ;     begin
      al  w3  x3-1        ;       no_of_decimals :- 1;
      fm. w1  b8.         ;       number:= number * 10;
      jl.     a17.        ;     end while;
                          ;   end get_fixed;
a18:                      ;
      rl. w3 (j37.)       ;   w3:= ofl_ufl := new_overflows
      wa. w3 (j22.)       ;                +  new_underflows;
      rx  w3  x2+i5       ;
      rs. w3 (j37.)       ;   overflows:= saved overflows;
      rl  w3  x2+i13      ;
      rs. w3 (j22.)       ;   underflows:= saved underflows;
      rl  w3  x2+i5       ;   w3:= ofl_ufl;
      se  w3  0           ;   if ofl_ufl > 0 then
      jl.     c10.        ;     goto error_2;
                          ;       <*floating over/underflow or
                          ;         underflow has occurred*>
\f


; eah  10.5.81   algol 8, text procedures     (terminate number)     page 6.10

                          ; check_type:
      rl  w3  x2+i29      ;   w3:= param_type;
      sn  w3  11          ;   if param_type <> real then
      jl.     a19.        ;   begin   <*check that assembled real can be 
                          ;             converted into a long*>
      el  w3  3           ;     w3:= number.exp_part;
      sl  w3  48          ;     if exponent >= 48 then
      jl.     c10.        ;       goto error2;
      ld  w1  -12         ;     clear exponent;
      ld  w1  x3-34       ;
      aa. w1  b3.+2       ;     number := entier (number + 0.5);
      ld  w1  -1          ;
      rl  w3  x2+i29      ;     w3:= param_type;
      jl.     a12.        ;     goto finish_no_real_type;
                          ;   end not real;



a19:                      ; exit_signed_float:
      rl  w3  x2+i31      ;   w3:= sign;
      se  w3  -5          ;   if sign <> pos then
      fm. w1  b0.         ;     number:= -number;
a20:                      ; save_number:
      ds  w1  x2+i2       ;   save number;
;
; terminate number:
;
a21:                      ; terminate_ok:
      al  w1  0           ;   error_in_getnum:= false;

a22:                      ; terminate:
      hs  w1  x2+i11      ;   save error_in_getnum;
      rl  w1  x2+i25      ;   w1:= pack_count;
      rl. w3 (n2.)        ;
      sl  w1 (x2+i23)     ;   if pack_count >= maxcount then
      jl      x3+d63      ;     goto return_from_getnum (on segm.2)
      rl. w3 (n7.)        ;   else
      jl      x3+d47      ;     goto finis_getnum (on segm.7);


\f


; eah  10.5.81   algol 8, text procedures   (mult number)        page 6.11
;
;
; local subroutine mult_number
;
; call:   x2+i2 = number, x2+i9 = digit
; return: x2+i2 = number * 10 + digit
;
b. a1                     ; begin block  mult_number
w.

d56:                      ; mult_number:
d57 = k-j0
      dl  w1  x2+i2       ;   w0w1:= number
      ss. w1  b5.         ;          - (maxlong//10);
      sh  w0  -1          ;   if f.w.(number) < f.w.(maxlong//10) then
      jl.     a1.         ;     goto number_ok;
                          ; maybe_error:
      sn  w0  0           ;   if number > (maxlong//10) then
      se  w1  0           ;     goto error_1;
      jl.     c5.         ;
      rl  w0  x2+i9       ;   <*number = (maxlong//10) *>
      sl  w0  8           ;   if digit >= 8 then
      jl.     c5.         ;     goto error_1;

a1:                       ; number_ok:
      dl  w1  x2+i2       ;   w0w1:= number :=
      ad  w1  2           ;     number
      aa  w1  x2+i2       ;       * 10
      ad  w1  1           ;       
      aa  w1  x2+i9       ;       + digit;
      ds  w1  x2+i2       ;
      jl      x3          ;   goto return;
e.                        ; end block mult_number;
\f


; eah  10.5.81   algol 8, text procedures   (read number)        page 6.12
;
;
; action table for number reading
;
; the states are:
;   0  before number
;   1  following sign before number
;   2      -     digit before point
;   3      -     point
;   4      -     digit after point
;   5      -     exponent base
;   6      -     exponent sign
;   7      -     exponent digit
;   8  in erroneous number
;
;
; action adresses relative to c0:

c1 = c1 -c0      ; digit before point
c2 = c2 -c0      ; digit in exp
c3 = c3 -c0      ; ten_1
c4 = c4 -c0      ; ten_2
c5 = c5 -c0      ; error_1
c6 = c6 -c0      ; point
c8 = c8 -c0      ; exp_sign
c9 = c9 -c0      ; sign
c10= c10-c0      ; error_2
c11= c11-c0      ; finish_integer
c13= c13-c0      ; finish_real
c0 = c0 -c0      ; digit after point

h.
g0 = k-18        ; action table base

; action table:

; state
; 0     1     2     3     4     5     6     7     8     class
 c1  , c1  , c1  , c0  , c0  , c2  , c2  , c2  , c5  ;  2  digit
 c9  , c5  , c5  , c5  , c5  , c8  , c5  , c5  , c5  ;  3  sign
 c6  , c6  , c6  , c5  , c5  , c5  , c5  , c5  , c5  ;  4  point
 c3  , c3  , c4  , c5  , c4  , c5  , c5  , c5  , c5  ;  5  exp.ten
 c5  , c10 , c11 , c10 , c13 , c10 , c10 , c13 , c10 ;  6  terminator

\f


; eah  10.5.81   algol 8, text procedures   (read number)        page 6.13

w.h.                            ; ensure even start address

; exponent table for generating real numbers:

     1280,     0,     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,  1397,  1701  ; 10 ** (2**9)

g1 = k-2
g2 = g1+4

i.e.                      ; end block read number;
\f


; eah  10.5.81   algol 8, text procedures                        page 6.14
;


g3 = k-j0

c. g3-506
   m. code on segment 6 too long
z.

c. 502-g3
   0, r. 252 - g3>1       ; zerofill
z.

<:text proc.6:>
e.
\f


; eah  10.5.81   algol 8, text procedures     (getnum)           page 7.1 


b. c30, g3, j100, n10     ; begin  segment 7
w.

f0 = f0+1                 ; segment count
k  = 10000

h.
j0:   g1, g2              ; head word: last point, last absword

                          ; rs.entries:
j18:  f1+18, 0            ; rs.18, index alarm
j21:  f1+21, 0            ; rs.21, general alarm

n2:   1<11 o.(:2-f0:), 0  ; ref.to segment 2
n5:   1<11 o.(:5-f0:), 0  ;  -   -    -    5
n6:   1<11 o.(:6-f0:), 0  ;  -   -    -    6

g2 = k-2-j0               ; rel of last absword
g1 = k-2-j0               ; rel of last point

w.
\f


; eah  10.5.81   algol 8, text procedures     (getnum)          page 7.2

b. a30, b1                ; begin block  getnum
w.
;
; get_num_continued:
;
d44:
d45 = k-j0
                          ; unpack_layin:
      dl  w0  x2+i2       ;   w3w0:= saved layin;
;ks-701
      se  w0  0           ;   if no layin then
      jl.     a1.         ;   begin
      rs  w0  x2+i3       ;     no_of_decimals:= 0; first_letter:= 'd';
      jl.     a2.         ;   end
                          ;   else
a1:                       ;   begin
      al  w1  0           ;     w1:= sign_and_exppart;
      ld  w1  -8          ;
      se  w1  0           ;     if sign_and_exppart <> 0 then
      jl.     c10.        ;       goto param_error (layin);
      al  w1  2.11        ;     w1:= first_letter:=
      la  w1  0           ;          layin.bit14-15;
      se  w1  2.10        ;     if first_letter = z
      sn  w1  2.01        ;        or f  then
      jl.     c10.        ;       goto param_error(layin);
      hs  w1  x2+i4       ;
      ls  w0  -2          ;
      al  w1  2.1111      ;     w1:= decimals:=
      la  w1  0           ;          layin.bit10-13;
      hs  w1  x2+i3       ;
      ls  w0  -8          ;     w0:= positions_in_layin:= 
      se  w1  0           ;          significant digits
      ea. w0  1           ;          + if decimals > 0 then 1 else 0;
      rs  w0  x2+i23      ;     maxcount:= positions_in_layin;
      ld  w0  -5          ;
      se. w3 (b1.)        ;     if spaces_in_layin <> 0 then
      jl.     c10.        ;       goto param_error (layin);
      al  w3  -1          ;
      se  w0  0          ;     if termspace <> 0 then  <*open layin*>
      rs  w3  x2+i23      ;       maxcount:= -1;
      al  w0  0           ;   end unpack layin;
a2:                       ;
      rs  w0  x2+i25      ;   pack_count:= 0;
\f


; eah  10.5.81   algol 8, text procedures     (getnum)         page 7.3
;

a5:                       ; read_first_char:
      rl. w3 (n5.)        ; read_next_char:
      jl  w3  x3+d51      ;   call inchar (w0:=class, w1:=char);
      sh  w0  1           ;   if blind char then
      jl.     a5.         ;   goto read_next_char;
      rl  w3  x2+i25      ;   w3:= pack_count:=
      al  w3  x3+1        ;        pack_count + 1;
      rs  w3  x2+i25      ;
      sh  w0  5           ;   if class <= 5 then
      jl.     a10.        ;     goto read_number;
      zl  w1  x2+i4       ;   w1:= first_letter_of_layin;
      se  w1  0           ;   if first_letter = d then
      jl.     a7.         ;   begin
      se  w3 (x2+i23)     ;     if pack_count <> maxcount then
      jl.     a5.         ;       goto read_next_char
      jl.     c12.        ;     else goto stop_num (syntax error);
                          ;   end
                          ;   else
a7:                       ;   begin  <*first letter = b*>
      rl  w1  x2+i23      ;     w1:= maxcount;
      se  w1  -1          ;     if maxcount = -1  <*open layin*>  or
      sn  w1  x3          ;        maxcount = packcount           then
      jl.     c2.         ;       goto return_num_default;
      jl.     a5.         ;     else goto read_next_char;
                          ;   end;

a10:                      ; init_read_num:
      ds  w1  x2+i34      ;   save char_class, _value;
      ld  w1  100         ;
      ds  w1  x2+i2       ;   number:=
      ds  w1  x2+i7       ;   factor:= f.w.digit:=
      rs  w1  x2+i12      ;   exp   :=
      rs  w1  x2+i32      ;   state := 0;
      al  w3  -5          ;
      rs  w3  x2+i31      ;   sign    :=
      rs  w3  x2+i13      ;   exp_sign:= pos;
      dl  w1  x2+i34      ;   w0w1:= saved class,char;

      rl. w3 (n6.)        ;   goto read_number
      jl      x3+d55      ;          (on segm.6);

\f


; eah  10.5.81   algol 8, text procedures     (getnum)            page 7.4

; 
; return_num_default:
;
c2:                       ; return_num_default:
      rl. w3 (n2.)        ;   goto return_from_getnum_default
      jl      x3+d61      ;          (on segm.2)

;
; error_return:
;
c10:                      ; param_error (layin):
      al  w1  5           ;   errortype:= layin;
      jl.     d20.        ;   goto param_error;

c12:                      ; stop_num (syntax error in number):
      al  w1  -6          ;   error_in_getnum:= true;
      hs  w1  x2+i11      ;   
      rl. w3 (n2.)        ;   goto return_from_getnum;
      jl      x3+d63      ;          (on segm.2)

; 
; local constants:
;
b1:   1<18                ; mask for check spaces in layin

e.                        ; end block getnum;
\f


; eah  10.5.81   algol 8, text procedures    (finis getnum)       page 7.5

b. a10                    ; begin block  finis_getnum
w.

;
; finis_getnum:   read following delimiters if "closed" layin
;
d46:                      ; finis_getnum:
d47 = k-j0

a1:                       ;    repeat
      rl. w3 (n5.)        ;     call inchar;  (on segm.5)
      jl  w3  x3+d51      ;       <*w0:=class,w1:=char*>
      sh  w0  1           ;     if class > blind then
      jl.     a1.         ;     begin
      al  w3  -6          ;
      sh  w0  5           ;       if class <= 5 then
      hs  w3  x2+i11      ;         error_in_getnum:= true;
      rl  w1  x2+i25      ;       w1:= pack_count:=
      al  w1  x1+1        ;            pack_count + 1;
      rs  w1  x2+i25      ;     end not blind;
      se  w1 (x2+i23)     ;   until packcount = maxcount;
      jl.     a1.         ;
      rl. w3 (n2.)        ;   goto return_from_getnum;
      jl      x3+d63      ;           (on segm.2)

e.                        ; end block finis_getnum;

\f


; eah  1.5.81   algol 8, text procedures     (alarm)         page 7.6

b. a20, b20               ; begin block  alarm messages
w.

d20:                      ; param_error:
d21 = k-j0

      zl. w1  x1+b0.      ;   case error_type of
a0:   jl.     x1          ;   begin

a1:                       ; 0: param <1>
      al  w1  1           ;
      jl.     a5.         ;

a2:                       ; 1: charpos:
      al. w0  b2.         ;   w0:= addr of alarm text <:charpos:>
      rl  w1 (x2+12)      ;   w1:= value of pos-param
      jl. w3 (j21.)       ;   goto general alarm;

a3:                       ; 2: param_n:
      rl  w1  x2+i14      ;   w1:= paramno:= (last_formal_addr
      ws  w1  4           ;         - stackref
      al  w1  x1-4        ;         - 4 )
      ls  w1  -2          ;        // 4;
a5:
      al. w0  b3.         ;   w0:= addr of alarmtext <:param:>
      jl. w3 (j21.)       ;   goto general alarm;

a10:                      ; 3: text_index:
      al  w1  1           ;   goto index(1);
      jl. w3 (j18.)       ;
a11:                      ; 4: illegal string
      am      -6          ;   w0:= addr of alarmtext <:string:>

a12:                      ; 5: layin:
      al. w0  b5.         ;   w0:= addr of alarmtext <:layin:>
      al  w1  0           ;
      jl. w3 (j21.)       ;   goto general alarm;
\f


; eah  10.5.81   algol 8, text procedures     (alarm)           page 7.7

;
; local alarm constants
;

h.
b0:                       ; table rel.addr for case error_type
      a1 - a0             ; 0: param_1
      a2 - a0             ; 1: charpos
      a3 - a0             ; 2: param_n
      a10- a0             ; 3: text_index
      a11- a0             ; 4: illegal string
      a12- a0             ; 5: illegal layin

w.
b2:  <:<10>charpos :>     ; charpos     alarmtext
b3:  <:<10>param   :>     ; param error     -
b4:  <:<10>string  :>     ; illegal string  -
b5:  <:<10>layin   :>     ; layin           -

e.                        ; end block  alarm messages;
\f


; eah  1.5.81   algol 8, text procedures                   page 7.8



g3 = k-j0

c. g3-506
   m. code on segment 0 too long
z.

c. 502-g3
   0, r. 252 - g3>1
z.

<:text procs:>
e.


\f


; eah  1.4.81   algol 8, text procedures                    page t.0

i.e.                     ; end slang segment
\f


; eah  1.3.81   algol 8, text procedures                    page t.1
;
;
; tails to be inserted in catalog:
;

g0:                             ; first tail:

; put_number:            
      f0+1                      ; no of segments (incl external list)
      0,0,0,0                   ;
      1<23 + e0<12 + e1         ; put_number:
      3<18 + 40<12 + 3<6 + 41   ;   int.proc(general,int.addr,undef)
      0                         ;
      4<12 + f2                 ; reladdr on first segment for start of ext.list
      f0<12 + f3                ; no of segments + no of own hw

; put_fixed:
      1<23 + 4
      0,0,0,0
      1<23 + e2<12 +e3          ; put_fixed:
      3<18 + 40<12 + 3<6 + 41   ;   int.proc(general,int.addr,undef)
      0
      4<12 + f2
      f0<12 + f3

; put_char:
      1<23 + 4
      0,0,0,0
      1<23 + e4<12 + e5         ; put_char:
      3<18 + 40<12 + 3<6 + 41   ;   int.proc(general,int.addr,undef)
      0
      4<12 + f2
      f0<12 + f3

; put_text:
      1<23 + 4
      0,0,0,0
      1<23 + e6<12 + e7         ; put_text:
      3<18 + 40<12 + 3<6 + 41   ;   int.proc(general,int.addr,undef)
      0
      4<12 + f2
      f0<12 + f3
\f


; eah  1.5.81   algol 8, text procedures                 page t.2

; get_number:
      1<23 + 4
      0,0,0,0
      1<23 + e8<12 + e9         ; get_number:
      3<18 + 40<12 + 3<6 + 41   ;   int.proc(general, int.addr,undef)
      0
      4<12 + f2
      f0<12 + f3

; get_fixed:
      1<23 + 4
      0,0,0,0
      1<23 + e10<12 + e11       ; get_fixed:
      3<18 + 40<12 + 3<6 + 41   ;   int.proc(general,int.addr,undef)
      0
      4<12 + f2
      f0<12 + f3

; get_char:
      1<23 + 4
      0,0,0,0
      1<23 + e12<12 + e13       ; get_char:
      3<18 + 40<12 + 3<6 + 41   ;   int.proc(general,int.addr,undef)
      0
      4<12 + f2
      f0<12 + f3

; get_text:
      1<23 + 4
      0,0,0,0
      1<23 + e14<12 + e15       ; get_text:
      5<18 + 40<12 + 3<6 + 41   ;   long.proc(general,int.addr,undef)
      0
      4<12 + f2
      f0<12 + f3

g1:
; get_put_error:
      1<23 + 4
      0,0,0,0
      1                         ; put_get_error:  addr hw 1
      9<18                      ;   integer variable
      0
      4<12 + f2
      f0<12 + f3

d.
p.<:insertproc:>



▶EOF◀