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

⟦7019cc91f⟧ TextFile

    Length: 21504 (0x5400)
    Types: TextFile
    Names: »translat4tx «

Derivation

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

TextFile

; fgs 1988.09.16                               translated page ...1...

;b.                 ; dummy outer block for fpnames;
d.
p.<:fpnames:>
l.

b. g3               ; block for insertproc;
w.
d.
p.<:fpnames:>
l.
k=h55

s. a30, b30, c30, d30, e30
w.

; a-names: alarm 
; b-names. labels in program
; c-names: texts for alarm 
; d-names: constants and texts
; e-names: work loc

e0 : 0              ;   addr of sep in front of next param
e1 : 0              ;   addr of sep in front of program name
e2 : 0              ;   error text addr
e3 : 0              ;   addr compiler name
e4 : 0              ;   addr of date
e5 : 0              ;   work loc
e6 : 0              ;   work loc
e7 : 0, r.10        ;   lookup area no. 1
e8 : 0, r.10        ;   lookup area no. 2
e9 : 0, 0           ;   saved shortclock
e10: 0, r.4         ;   saved name
e11: 0              ;   spec. out zone

\f


; fgs 1988.10.04                               translated page ...2...


g3:  jl. w1  b20.   ;   init program;
     jl. w3  b28.   ;   if left side then connect output;
b7:  rs. w1  e11.   ;   save output zone address;
     al. w1  h19.   ;   w1:=addr(cur prog zone);
     jl. w3  h79.   ;   terminate zone;
     am      +2000  ;
     al. w3  c27.   ;   first shared(cur prog zone):=
     rs. w3  h80.+2 ;   addr of buffer start;
     al  w3  x3-1   ;   base buf(cur prog zone):=
     rs  w3  x1+h0  ;   first of buffer-1;
     al  w3  x3+512 ;   last buf(cur prog zone):=
     rs  w3  x1+h0+2;   base buf+512;

b0:  al. w1  h19.   ; paramloop:
     jl. w3  h79.   ;   terminate cur prog zone;
     rl. w1  e0.    ;
     bl  w2  x1     ;
     sh  w2  3      ;   if endparam then
     jl.     b4.    ;     goto exit;
     bl  w2  x1+1   ;
     wa  w1  4      ;
     rs. w1  e0.    ;   update param pointer;
     se  w2  10     ;   if param<>text then
     jl.     a2.    ;     alarm (param);
     rl. w3  e0.    ;
     al. w1  e7.    ;
     al  w3  x3-8   ;
     jd      1<11+42;   lookup param;
     se  w0  0      ;   if not found then
     jl.     a4.    ;     alarm (unknown);
     rl. w1  e7.    ;   lookup area no. 2.size :=
     rs. w1  e8.    ;     entry.size;
     bl. w1  e7.+16 ;
     sl  w1  2      ;   if entry.contents < 2
     sl  w1  4      ;   or entry.contents > 3 then
     jl.     a5.    ;     alarm (not program);
\f


; fgs 1988.09.16                               translated page ...3...


     rl. w1  e7.    ;
     sl  w1  0      ;   if entry.size < 0 then
     jl.     a7.    ;   begin <*bs entry*>
     al. w1  e8.    ; 
     al. w3  e7.+2  ; 
     jd      1<11+42;     lookup (entry.docname, lookup area no. 2);
     se  w0  0      ;     if not found then
     jl.     a4.    ;       alarm  (not found);
a7:  rl. w1  e0.    ;   end <*bs entry*>;
     al  w2  x1-8   ;
     al. w1  h19.   ;   zone := spec. out zone;
     jl. w3  h27.   ;   connect (curr prog, entry);
     se  w0  0      ;   if not connected then
     jl.     a3.    ;     alarm (error);
     zl. w1  e7.+17 ;   
     se  w1  0      ;   if entry.entry point = 0 then
     jl.     a8.    ;   begin <*pascal*>
     al. w0  d9.    ;     compiler addr :=
     rs. w0  e3.    ;       addr <:pascal:>;
     rl. w0  e7.+18 ;     rel addr := entry.load length;
     sl  w0  4      ;     if rel addr < 4 
     sl  w0  510    ;     or rel addr > 510 then
     jl.     b10.   ;       goto take shortclock;
     rl. w2  h19.+h0;     addr first :=
     al  w2  x2+6   ;       addr first + 6;
     jl.     a11.   ;     goto print;
                    ;   end <*pascal*> else
a8:  rl. w1  e7.+12 ;   
     se  w1  0      ;   if entry.file count = 0 then
     jl.     a9.    ;   begin <*slang*>
     al. w0  d8.    ;     addr compiler name :=
     rs. w0  e3.    ;       addr <:slang:>;
     jl.     a11.   ;     goto print;
                    ;   end <*slang*>;
a9:  zl. w0  e7.+13 ;   rel addr := entry.word7.rel; 
     el. w1  e7.+12 ;   segm     := entry.word7.segm;
\f


; fgs 1988.09.16                               translated page ...4...


     sl  w1  6      ;   if segm >= 6  and
     sl  w1  12     ;      segm <  12 then
     jl.     a12.   ;   begin <*program descriptor vector*>
     wa. w1  e7.+14 ;     curr prog.segm count      :=
     am.     h19.   ;       segm              +
     rs  w1  h1+16  ;       entry.block count ;
     al. w1  h19.   ;     zone := spec. out zone;
     jl. w3  h22.   ;     inblock;
     rl. w2  h19.+h0;     addr first := curr prog.base buffer area;
     am     (0)     ;     modeword2 :=
     rl  w1  x2+3   ;       prog descriptor vector.modeword2;
     ls  w1 -5      ;     addr compiler :=
     al. w3  d7.    ;       if modeword shift (-5) = 1 then
     sz  w1  1      ;         addr <:fortran:>
     al. w3  d6.    ;       else
     rs. w3  e3.    ;         addr <:algol:>;
     am     (0)     ;     segm  := 
     zl  w1  x2+19  ;       prog descr vect.entry point.segm; 
     am     (0)     ;     rel addr :=
     zl  w0  x2+20  ;       prog descr vect.entry point.rel ;
     sl  w1  12     ;     if segm < 12
     sl. w1 (e8.)   ;     or segm >= lookup area no. 2.size then
     jl.     b10.   ;       goto take shortclock;
     jl.     a10.   ;     goto print0;
                    ;   end <*program descriptor vector*>;
a12: sh  w1  11     ;   if segm >= 12 then
     jl.     a13.   ;   begin <*entry point to main program*>
     sl. w1 (e8.)   ;     if segm >= lookup area no. 2.size then
     jl.     b10.   ;       goto take shortclock;
     al. w3  d12.   ;     addr compiler :=
     rs. w3  e3.    ;       addr <:algol/fortran:>;
     rl. w2  h19.+h0;     addr.first := curr prog.base buffer area;
     jl.     a10.   ;     goto print0;
                    ;   end <*entry point to main program*>;

\f


; fgs 1988.09.16                               translated page ...5...


a13: al. w1  h19.   ;   <*search program entry point in rts segment 0*>
     jl. w3  h22.   ;   inblock (curr prog, segm 0);
     rl. w2  h19.+h0;   addr first := curr prog.base buffer area;
     rl  w1  x2+1   ;   first := (addr first);
     se  w1  4      ;   if first = 4
     sn  w1  0      ;   or first = 0 then
     jl.     b6.    ;     goto ok
     jl.     a5.    ;   else 
                    ;     alarm  (not program); 
                    ;
b6:  al. w1  d12.   ; ok:
     rs. w1  e3.    ;   addr compiler := addr <:algol/fortran:>;
     al  w1 -1      ;

b1:  al  w1  x1+2   ; loop: if(0,-8388698,511) not found
     sl  w1  451    ;   among words (0:450) then
     jl.     b10.   ;     goto take shortclock;
     am      x2     ;   word :=
     rl  w3  x1     ;     cont (first);
     se  w3  0      ;   if word<>0 then
     jl.     b1.    ;     goto loop;
     am      x2     ;   word :=
     rl  w3  x1+2   ;     cont (first + 2);
     se. w3 (d1.)   ;   if word<>-8388608 then
     jl.     b1.    ;     goto loop;
     am      x2     ;   word :=
     rl  w3  x1+4   ;     cont (first + 4);
     se  w3  511    ;   if word<>511 then
     jl.     b1.    ;     goto loop;
     am      x1     ;   addr nextword :=
     al  w3  x2+6   ;     addr of next word;
     rl  w1  x3     ;   nextword := cont (addr nextword);
     al. w0  d7.    ;   addr compiler := addr <:algol:>;
     sn  w1  0      ;   if nextword = 0 then
     al. w0  d6.    ;     addr compiler := addr <:fortran:>;
     rs. w0  e3.    ;   save addr compiler;
     sn  w1  0      ;   if nextword = 0 then
     al  w3  x3+12  ;     addr nextword := addr nextword + 12 (fortran);
     bl  w1  x3     ;   rel segm := nextword.segm;
     bl  w0  x3+1   ;   rel addr := nextword.addr;
\f


; fgs 1988.09.16                               translated page ...6...


     rl. w3  e3.    ;
     se  w1  0      ;   if rel segm = 0
     sn  w0  0      ;   or rel addr = 0 then
     al. w3  d12.   ;     addr compiler := addr <:algol/fortran:>;
     rs. w3  e3.    ;
     sl  w1  6      ;   if rel segm < 6
     sl. w1 (e8.)   ;   or rel segm > lookup area no. 2.size then
     jl.     b10.   ;     goto take shortclock;
a10: sl  w0  4      ;   if rel addr < 4 
     sl  w0  510    ;   or rel addr > 510 then
     jl.     b10.   ;     goto take shortclock;
a11: wa. w1  e7.+14 ;     curr prog.segm count      :=
     am.     h19.   ;       rel segm          +
     rs  w1  h1+16  ;       entry.block count ;
     al. w1  h19.   ;   zone := curr prog zone;
     jl. w3  h22.   ;   inblock (curr prog);
     am     (0)     ;   addr of date :=
     al  w1  x2-3   ;     addr of first +
     rs. w1  e4.    ;     rel addr    -3;
     rl. w1  e3.    ;
     sn. w1  d8.    ;   if slang then
     jl. w3  b11.   ;     get shortclock;
     rl. w0 (e4.)   ;
     sh  w0  0      ;   if date <= 0 then
     jl. w3  b11.   ;     get shortclock;

\f


; fgs 1988.09.16                               translated page ...7...


a14: rl. w1  e0.    ; print:
     dl  w0  x1-6   ;   move name
     lo. w3  d10.   ;     from parameter
     lo. w0  d10.   ;     to   saved name
     ds. w0  e10.+2 ;   and
     dl  w0  x1-2   ;   extend
     lo. w3  d10.   ;     with spaces
     lo. w0  d11.   ;     to 12 positions;
     ds. w0  e10.+6 ;   
     al. w0  e10.   ;
     rl. w1  e11.   ;   zone := spec. out zone;
     jl. w3  h31.   ;   outtext (saved name);
     al. w0  d5.    ;
     jl. w3  h31.   ;   outtext (translated by);
     rl. w0  e3.    ;
     jl. w3  h31.   ;   outtext ((addr compiler));
     rl. w0 (e4.)   ;
     sh. w0 (d14.)  ;   if date > 991231
     sh. w0 (d13.)  ;   or date <= 750100 then
     jl. w3  b11.   ;     goto take shortclock;
     al. w1  d4.    ;
     al  w2  46     ;
     jl. w3  b2.    ;   print(dd.);
     al. w1  d3.    ;
     al  w2  46     ;
     jl. w3  b2.    ;   print(mm.);
     al. w1  d2.    ;
     al  w2  32     ;
     jl. w3  b2.    ;   print(yy );
     rl. w1  e4.    ;
     rl  w0  x1+2   ;
     rl. w1  e3.    ; 
     sn. w1  d9.    ;   if pascal then
     jl.     b3.    ;     goto printnl;
     al. w1  d4.    ;
     al  w2  46     ;
     jl. w3  b2.    ;   print(hours.);
     al. w1  d3.    ;
     al  w2  10     ;
     jl. w3  b2.    ;   print(min<10>);
     jl.     b0.    ;   goto paramloop

\f


; fgs 1988.09.16                               translated page ...8...


b2:  rs. w3  e6.    ;   procedure print
     al  w3  0      ;
     wd  w0  x1     ;
     rs. w3  e5.    ;
     rl. w1  e11.   ;   zone := spec. out zone;
     jl. w3  h32.   ;
     48<12+2        ;
     jl. w3  h26.   ;
     rl. w0  e5.    ;
     jl.     (e6.)  ;

b3:  al  w2  10     ; printnl:
     rl. w1  e11.   ;   zone := spec. out zone;
     jl. w3  h26.   ;   outchar (zone, 'nl');
     jl.     b0.    ;   goto paramloop;

b4:  rl. w1  e11.   ; exit:
     se  w1  0      ;   if no sec zone
     sn. w1  h21.   ;   or zone = cur out then
     jl.     b8.    ;   begin <*terminate sec out*>
     bz  w3  x1+h1+1;
     se  w3  4      ;     char := if kind=bs
     sn  w3  18     ;     or if kind=mt then em
     am      25     ;     else
     al  w2  0      ;     null
     jl. w3  h34.   ;     close up (char);
     jl. w3  h79.   ;     terminate zone;
     bz  w0  x1+h1+1;
     se  w0  4      ;     if kind = bs
     jl.     b9.    ;     begin <*cut down*>
     al  w3  x1+h1+2;
     al. w1  c17.   ;       lookup entry(outfile); 
     jd      1<11+42;       size(tail) :=          
     rl  w0  x3+14  ;       segment count;         
     rs. w0  c17.   ;       change entry;          
     jd      1<11+44;     end <*cut down*>;        
\f


; fgs 1988.09.16                               translated page ...9...


b9:  rl. w3  h8.    ;     <*set contents*>
     al  w3  x3+2   ;
     al. w1  c17.   ;     lookup entry(outfile);
     jd      1<11+42;
     al  w0  0      ;
     am      16     ;
     rs. w0  c17.   ;     content := text;
     jd      1<11+44;     change entry(outfile);
b8:                 ;   end <*terminate sec. out*>
     rl. w1  d0.    ;
     al  w2  0      ;
     se  w1  0      ;
     al  w2  1      ;   if errors then ok no
     am        -2000;
     jl.    h7.+2000;     goto fp;


b10: jl. w3  b11.   ; take shortclock:
     jl.     a14.   ;   get shortclock and goto print;

b. b0               ; begin block get shortclock;
w.
b11: rs. w3  b0.    ;get shortclock: save return;
     rl. w0  e7.+10 ;   shortclock := entry.shortclock;
     jl. w3  b12.   ;   convert clock (shortclock);
     rs. w0  e9.    ;   save converted date;
     rs. w3  e9.+2  ;   save converted clock;
     al. w3  e9.    ;   addr of date :=
     rs. w3  e4.    ;     addr converted shortclock;
     jl.     (b0.)  ;   return;

b0:  0              ; saved return

e.                  ; end block get shortclock;
\f


; fgs 1988.09.16                               translated page ...10...


; procedure convert clock  (short clock)
;
; (taken from lookup)
;
; this procedure is an inversion of the following algorithm
; for computing day-number from a date  (year,month,date)
; extended with a conversion of the time of the day:
;
;
;    if month<3 then
;    begin
;      month:=month+12;
;      year:=year-1;
;    end;
;    dayno:=(1461*year)//4 + (153*month+3)//5 + day;
;
;
;
;      call:               return:
;
; w0   short clock         year*10000+month *100+date
; w1   irrelevant          destroyed
; w2   irrelevant          destroyed
; w3   return              hour*10000+minute*100
;
;
;


b.  a13, b0  w.     ; begin block convert clock

b12: ld  w2    -100 ;    clear w1,w2;
     rs. w3     a8. ;    save return address;
     al  w3     0   ;    clear w3;
     ld  w0     10  ;    w3,w0:=short clock<10 (=truncated clock>9);
     wd. w0     a2. ;    w0:=dayno;
     al  w3  x3+a13 ;    add minute rounding;
     wd. w3     a1. ;    w3:=hour;
     wd. w2     a0. ;    w2:=minute;
     ds. w3     a10.;    save minute,hour;
\f


; fgs 1988.09.16                               translated page ...11...


     al  w3     0   ;    clear w3;
     ld  w2    -100 ;    clear w1,w2;
     ls  w0     2   ;    w0:=dayno*4;
     wa. w0     a5. ;    add offset;
     wd. w0     a4. ;    w0:=year;
     ls  w3    -2   ;    w3 is converted ;
     wm. w3     a6. ;    to fifthdays;
     al  w3  x3+a11 ;    w3:=w3+three months offset;
     wd. w3     a3. ;    w3:=month;
     sh  w3     12  ;    if month>12 then
     jl.        b0. ;    begin
     ba. w0     1   ;      increase year;
     al  w3  x3-12  ;      decrease month
b0:  al  w2  x2+a12 ;    end;
     wd. w2     a6. ;    w2:=date;
     rs  w3     2   ;    save month (in w1);
     wm. w0     a7. ;    w0:=year*100
     wa  w0     2   ;      + month
     wm. w0     a7. ;      * 100
     wa  w0     4   ;      + date;
     rl. w3     a10.;    w3:=hour
     wm. w3     a7. ;      * 100
     wa. w3     a9. ;      + minute
     wm. w3     a7. ;      * 100;
     jl.       (a8.);    return;

a0:  1172           ;    units per minute
a1:  70313          ;    units per hour
a2:  1687500        ;    units per day
a3:  153            ;    days in the five months (march-july)
a4:  1461           ;    days in four years
a5:  99111          ;    offset for computing year 
a6:  5              ;
a7:  100            ;    constant for packing date and time
a8:  0              ;    saved return address
a9:  0              ;    saved minute
a10: 0              ;    saved hour

a11=461             ;    three months offset
a12=5               ;    one days offset
a13=586             ;    half a minute

e.                  ; end block convert clock;
\f


; fgs 1988.09.16                               translated page ...12...


c0:  <:***<0>:>
c1:  <: connect:>
c2:  <: param <0>:>
c3:  <: connect<10><0>:>
c4:  <: unknown<10><0>:>
c5:  <: not program<10><0>:>
c6:  <: date not found<10><0>:>

a1:  am      c1-c2  ;   alarm  (connect);
a2:  am      c2-c3  ;   alarm  (param);
a3:  am      c3-c4  ;   alarm  (connect);
a4:  am      c4-c5  ;   alarm  (unknown);
a5:  am      c5-c6  ;   alarm  (not program);
a6:  al. w0  c6.    ;   alarm  (date not found);
     rs. w0  e2.    ;   save alarm  cause
     al. w0  c0.    ;
     jl. w3  h31.-2 ;   outtext (***);
     rl. w3  e1.    ;   
     al  w0  x3+2   ;
     jl. w3  h31.-2 ;   outtext (programname);
     rl. w1  e2.    ;
     sh. w1  c2.    ;   if not connect out and
     jl.     b5.    ;   if not param      then
     al  w2  32     ;
     jl. w3  h26.-2 ;     outsp;
     rl. w1  e2.    ;   
b5:  se. w1  c1.    ;   if connect out alarm then
     jl.     b13.   ;   begin
     am        -2000;
     rl. w3 h8.+2000; 
     al  w0  x3+2   ;
     jl. w3  h31.-2 ;     outtext (out, outfile.name);
     jl.     b15.   ;   end else
b13: sn. w1  c2.    ;   if not param alarm then
     jl.     b15.   ;   begin
     rl. w3  e0.    ;
     al  w0  x3-8   ;     outtext (param);
     jl. w3  h31.-2 ;   end;
\f


; fgs 1988.09.16                               translated page ...13...


b15: rl. w0  e2.    ;
     jl. w3  h31.-2 ;   outtext (error cause);
     rl. w2  d0.    ;
     al  w2  x2+1   ;   errors:=errors+1;
     rs. w2  d0.    ;
     rl. w0  e2.    ;
     sn. w0  c2.    ;   if not param alarm then
     jl.     b14.   ;   begin
     al  w2  10     ;     outcr;
     jl. w3  h26.-2 ;   
     rl. w0  e2.    ;   end;
b14: sn. w0  c1.    ;   if connect output error then
     jl.     b7.    ;     goto continue; <*w1 = curr. out zone*>
     se. w0  c2.    ;   if not param alarm then
     jl.     b0.    ;     goto paramloop;
     rl. w1  e0.    ;
     rl  w0  x1-2   ;
     jl. w3  h32.-2 ;   outinteger (param);
     1              ;
     al  w2  10     ;
     jl. w3  h26.-2 ;   outcr;
     jl.     b0.    ;   goto paramloop;

\f


; fgs 1988.09.16                               translated page ...14...


;procedure init program
;
;called just after entry   nb: link w1
;

b20: ds. w3  e1.    ;   save stack pointers;

     al  w2  x3+10  ;   addr next param :=
     rs. w2  e0.    ;     addr program name + 10;
     bz  w2  x3     ;
     se  w2  6      ;   return:=
     am      2      ;   if delim <> 6 then link+2
     al  w3  x1     ;   else link;
     al. w1  h21.   ;   w1:=addr of curr out zone;
     jl      x3     ;   goto return;
                                                                               
;connect special output zone
;
b. j4               ;
w.

j0:   0             ; save return

b28: rs. w3  j0.    ;
     jl. w3  h29.-4 ;   stack curr in;
     rl. w2  e1.    ;
     al  w2  x2-8   ;   w2:=addr(outfile name);
     al  w0  1<2+0  ;   
     jl. w3  h28.   ;   connect cur in (outfile);
     se  w0  0      ;   if troubles then
     jl.     a1.    ;     goto connect output alarm;
     bl  w0  x1+h1+1;
     se  w0  4      ;   if not bs  and
     sn  w0  18     ;      not mt then
     jl.     b29.   ;     return;
     jl.     (j0.)  ;
b29: al. w1  h54.   ;   w1:=lookup area;
     rl. w2  e1.    ;
     al  w2  x2-8   ;
     jl. w3  b30.   ; prepare output
     am        -2000;
     al.w1 h20.+2000;   w1:=cur in
     jl.     (j0.)  ;   return;  comment: now w1
                    ;   points to cur out zone;

e.  ; end of connect second out

\f


; fgs 1988.09.16                               translated page ...15...


; procedure prepare entry for textoutput
;  w0  not used
;  w1  lookup area
;  w2  name addr, entry must be present
;  w3  return addr

b. a2 w.

b30:  ds. w1  a1.   ;   save w0.w1
      ds. w3  a2.   ;   save w2.w3
      al  w3  x2    ;   w3:=name addr
      jd     1<11+42;   lookup
      bz  w2  x1+16 ;
      sh  w2  32    ;   if contents=4 or
      sn  w2  4     ;   contents>=32
      jl.     4     ;   then
      jl.     a0.   ;   file:=block:=0;
      rs  w0  x1+12 ;
      rs  w0  x1+14 ;
a0:   rs  w0  x1+16 ;   contents.entry:=0;
      rs  w0  x1+18 ;   loadlength:=0;
      dl  w1  110   ;
      ld  w1  5     ;   shortclock;
      rl. w1  a1.   ;
      rs  w0  x1+10 ;
      jd     1<11+44;   changeentry;
      dl. w1  a1.   ;   restore w0,w1
      dl. w3  a2.   ;   restore w2,w3
      jl      x3    ;   return

      0             ;   saved w0
a1:   0             ;   saved w1
      0             ;   saved w2
a2:   0             ;   saved w3

e.                  ; end prepare entry for text output

\f


; fgs 1988.09.16                               translated page ...16...


d0 : 0              ;   errors  
d1 : -8388608       ;
d2 : 1              ;
d3 : 100            ;
d4 : 10000          ;
d5 : <: translated by <0>:>
d6 : <: fortran       <0>:>
d7 : <: algol         <0>:>
d8 : <: slang         <0>:>
d9 : <: pascal        <0>:>
d10: <:<32><32><32>:>
d11: <:<32><32><00>:>
d12: <: algol/fortran <0>:>
d13: 750100
d14: 991231

g2=k-h55

c17:  0               ; start buffer program zone
c27 = c17 - 2000      ;

m.translated 1988.10.04
e.

g0:g1: (:g2+511:)>9   ; segm
       0, r.4         ; doc
       s2             ; date
       0, 0           ; file, block
       2<12+(:g3-h55:); contents.entry
       g2             ; loadlength
d.
p.<:insertproc:>
▶EOF◀