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

⟦136854653⟧ TextFile

    Length: 27648 (0x6c00)
    Types: TextFile
    Names: »comprlib3tx «

Derivation

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

TextFile



; fgs 1986.07.04  compress algol library       page 1




s. b20, c20, f20, g20, w. ; start segment...

d.
p.<:fpnames:>
l.

k = h55

     g0.   ,    0      ; length, not used

      jl.     g1.        ; entry: goto initialize;

; definitions of zones and shares:

b. a5, w. ; a-names used for initialization-chain...

; b0 = inputzone , b1 = input share

h.a0:4     ,    g2.    ; h0+0: base buffer area = g2
     0     ,    0      ;   +2: last of buffer = last of process = h8
     2     ,    b1.    ;   +4: used share =
     2     ,    b1.    ;   +6: first share =
     a1.   ,    b1.    ;   +8: last share = b1

     0     ,  r.18     ; h1+0: process description

     0     ,    0      ; h2+0: give up mask = 0
  a1:4     ,    f0.    ;   +2: give up action = f0
     0     ,    0      ;   +4
     a2.   ,    h22.   ;   +6: free parameter = abs addr of fp inblock

b0:  0     ,  r.6      ; h3+0: record description

b1:  0     ,    0      ; s+0: share state = 0
  a2:a3.   ,    g3.    ;  +2: first shared = g3
     0     ,  r.20     ;  +4

; b2 = output zone , b3 = output share

  a3:4     ,    g2.    ; h0+0: base buffer area = g2
     0     ,    0      ;   +2: last of buffer = last of process = h8
     2     ,    b3.    ;   +4: used share =
     2     ,    b3.    ;   +6: first share =
     a4.   ,    b3.    ;   +8: last share = b2

     0     ,  r.18     ; h1+0: process description

     0     ,    0      ; h2+0: give up mask = 0
  a4:4     ,    f1.    ;   +2: give up action = f1
     0     ,    0      ;   +4
     a5.   ,    h23.   ;   +6: free parameter = abs addr of fp outblock

b2:  0     ,  r.6      ; h3+0: record description

b3:  0     ,    0      ; s+0: share state = 0
  a5:a0.   ,    g3.    ;  +2: first shared = g3
     0     ,  r.20     ;  +4

e. w.     ; end a-names

\f


; fgs 1986.07.04  compress algol library       page 2



; other variables

b4:  0     ,  r.17     ; lookup area, 
b5:  0                 ; parameter pointer (points at item before
                         ;   current parameter, right byte)
b6:  1<23  +  4        ; constant = <bs>
     0, r.9            ; room for tail in connect;
b7:  4095-32           ; largest byte value - 32;
b8:  0                 ; saved return from c7
b9:  0                 ; fp result
b11: 0                 ; saved object entry base (1);
b12: 0                 ; -     -      -     -    (2);
b13: 0     , r.4       ; -     -      doc   name (1:4);




; remove parameter from parameter list

c6:   rl. w3  b5.        ; remove from area list:
      ba  w3  x3         ;
      ba  w3  x3         ;
      ws. w3  b5.        ;
      hs. w3 (b5.)       ;

; find the next legal item (i.e. a name not followed by a
; point) in the parameter list.
; (illegal items are removed from the parameter-chain)

c0:   rl. w3  b5.        ; next param:
      ba  w3  x3         ;   w3 := item head(param);

      bl  w0  x3-1       ;   w0 := preceding separator;
      sh  w0  3          ;   if end param-list then
      jl.     c1.        ;     goto change descriptors;

      bl  w0  x3         ;   if parameter <> <name> then
      se  w0  10         ;     alarm(parameter);
      jl.     f2.        ;

      ba  w3  x3         ;   w3 := item head(following);
      bl  w0  x3-1       ;   w0 := following separator;
      sn  w0  8          ;   if point then
      jl.     f2.        ;     alarm(parameter);

; the parameter must describe a bs-area, with content = 4
; and with an entry interval equal to the catalog base.

      al  w3  x3-9       ;   w3 := addr of parameter name;
      jl. w2  c7.        ;   check param(w2,w3); <*w0 never zero*>
      se  w1  0          ;   if result <> ok then
      jl.     f5.        ;     alarm(error on input, w1);

      rl. w0  b2.+h1+16  ; move segment count in output zone into
      sl. w0 (b7.)       ;   if segment > max possible
      jl.     f11.       ;   then goto alarm(too many);
      rs. w0  b2.+h1+14  ;   blockcount of output zone 
      rl. w3  b5.        ;     ...and into separator byte of current
      ba  w3  x3         ;     parameter head;
      hs  w0  x3-1       ;

\f


; rc 27.03.73    compress algol library       page 3


      dl  w1  x3+3       ;   move name of area
      ds. w1  b6.+4      ;   to connection tail;
      dl  w1  x3+7       ;
      ds. w1  b6.+8      ;
      al. w3  g3.        ;   input.first shared:=
      rs. w3  b1.+2      ;     first buffer;
      al. w1  b0.        ;   zone:= input;
      al. w2  b6.        ;   descr:= connection tail;
      jl. w3  h27.       ;   connect input (zone, descr);
      se  w0  0          ;   if not ok
      jl.     f6.        ;   then connect alarm;
      bz. w3  b4.+32     ;
      ls  w3  9          ;   last transport:=
      wa. w3  b1.+2      ;   segments*512+first shared;
      al  w3  x3-2       ;
      sl. w3 (b0.+h0+2)  ; if last transport > last buffer
      jl.     f4.        ;   then goto alarm(processes too small);
      rs. w3  b1.+4      ;   input. last shared:=
      rs. w3  b1.+10     ;   input.last transf:=
      rs. w3  b3.+10     ;   output.last transf:= last transport;
      jl  w3 (x1+h2+6)   ;   inblock (zone);
      jl. w3  c2.        ;   ps processes ext list;
      al. w1  b0.        ;
      jl. w3  h79.       ;   terminate inputzone;
      al. w1  b2.        ;   zone:= output;
      jl  w3 (x1+h2+6)   ;   outblock (zone);

;  increase param pointer...
; and goto next param...

      rl. w3  b5.        ;   increase parameter pointer;
      ba  w3  x3         ;
      rs. w3  b5.        ;

      jl.     c0.        ;   goto next param;

\f


; fgs 1986.07.04  compress algol library       page 4




; at end of parameter list: terminate the output zone and
; change the output entry so that it describes all the output
b. a5 w.               ;   local block;

c1:   al  w3  x3-1       ; change descriptors:
      rs. w3  b5.        ;   save end param address...
      al. w1  b2.        ;
      jl. w3  h79.       ;   terminate outputzone;

      al. w1  b4.        ;   w1 := lookup area;
      al. w3  b2.+h1+2   ;  w3 := output area name;
      jd      1<11+42    ;   lookup entry(w1,w3);

      rl. w0  b2.+h1+16  ; length in tail :=
      rs  w0  x1         ;           segm count;

      jd      1<11+44    ;   change entry(w1,w3);

a2:   rl. w3  h8.        ;   w3 := start of area chain;
      ba  w3  x3+1       ;

      sn. w3 (b5.)       ;   if start = end param addr then
      jl.     c5.        ;     goto finis program;
      rs. w3  h8.        ;   area chain start:= this area;
      al  w3  x3+2       ;   w3:= name addr;
      al  w0  1          ;   ensure w0 <> 0;
      jl. w2  c7.        ;   check entry;
      se  w1  0          ;   if not ok
      jl.     f9.        ;   then goto alarm;
      al. w3  b4.+6      ;   w3:= entry.name addr;
      jd      1<11+48    ;   remove entry;
      al. w1  b4.+14     ;   w1:= tail addr;
      dl  w0  x1+4       ;   move document name
      ds. w0  b13.+2     ;     from tail
      dl  w0  x1+8       ;     to saved object docname
      ds. w0  b13.+6     ;     for use by permanent into auxcat;
      dl. w0  b2.+h1+4   ; move name of output
      ds  w0  x1+4       ;   to document name;
      dl. w0  b2.+h1+8   ; 
      ds  w0  x1+8       ;
      bz. w2 (h8.)       ;
      al  w2  x2+32      ;   content:= startsegm + 32;
      hs  w2  x1+16      ;
      rl. w0  b6.        ;   modekind:= bs;
      rs  w0  x1+0       ;
      al. w3  b4.+6      ;   w3:=address of entry name;
      jd      1<11+40    ;   create entry;
      se  w0  0          ;   if result <> 0 then
      jl.     a5.        ;     goto alarm;
      al. w2  b13.       ;   w2 := addr old document name;
      al  w1  2.111      ;
      la. w1  b4.        ;
      se  w1  0          ;   if key <> 0
      jd      1<11+90    ;   then permanent entry into auxcat;
      se  w0  0          ;   if result <> 0 then
      jl.     a4.        ;     goto alarm;
      dl. w1  b12.       ;   
      jd      1<11+74    ;   set entry base (saved base);
      se  w0  0          ;   if result <> 0 then
      jl.     a3.        ;     goto alarm;


      jl.     a2.        ;   goto next entry;

a3:   am      1          ; alarm set entry base:
a4:   am      1          ; alarm permanent into auxcat
a5:   al  w1  10         ; alarm create entry:
      jl.     f5.        ;   goto alarm;

e.   ; end a-names of catalog scan

\f


; fgs 1986.07.03 compress algol library       page ...5...



; finis program: set result and return to fp...
b. a1         w.         ; begin block finis program;
c5:   rl. w3  h8.        ;   for all parameters left in
      al  w0  4          ;     paramlist do
a0:   hs  w0  x3         ;       preceding separator (param) := <s>;
      am     (x3+1)      ;
      sn  w3  x3         ;    if separator = 0 then
      jl.     a1.        ;      goto finis;
      ea  w3  x3+1       ;         
      se. w3 (b5.)       ;
      jl.     a0.        ;
a1:   rl. w2  b9.        ;   w2 := fp result;
      jl.     h7.        ;   goto fp end program;
e.                       ; end block finis program;


; procedure pseudo process external list;
; call: jl. w3  c2.
; return: all registers spoiled.
; the procedure inputs one extra segment
; for each segment occupied by the external list,
; and corrects the output zone accordingly;

b.   a5, d10   w.        ;
c2:   rs. w3  d0.        ; entry: save return
c4:   bz. w3  b4.+31     ; entry, return saved:  k:= rel start ext list;
      al. w2  g3.        ;   j:= first segm start;
      sl  w3  502        ;   if k >= 502
      jl. w3  c3.        ;   then input extra segm;
      am      x2         ;
      rl  w0  x3         ;
      bz  w1  0          ;   ne:= byte(k+j+1);
      bz  w0  1          ;   ng:= byte(k+j);
      ds. w1  d2.        ;
      al  w3  x3+2       ;   k:= k + 2;
      sl  w3  502        ;   if k >= 502
      jl. w3  c3.        ;   then input extra segm;
      am      x2         ;
      rl  w1  x3         ;   nb := word (k + j);
      rl. w0  b4.+26     ;   w0 := kind and spec (1);
      sl  w0  0          ;   if fortran subroutine then
      jl.     a1.        ;   begin
      rs. w1  d3.        ;     save nc, nz;
      zl  w1  2          ;     nb :=
      wm. w1  d5.        ;       nc * 12;
      rx. w1  d3.        ;     nb :=
      zl  w1  3          ;       nz *
      wm. w1  d6.        ;       18 +
      wa. w1  d3.        ;       nb;
a1:   rx. w1  d1.        ;   end <*fortran subroutine*>;
      wm. w1  d4.        ;
      wa. w1  d2.        ;   i:= (ne*6+ng)*2+nb;
      ls  w1  1          ;   comment i + 6 is
      wa. w1  d1.        ;   number of unprocessed
      al  w0  x1         ;   bytes in ext list;
a0:   wa  w0  6          ; rep: i:= i + k;
      sh  w0  502-7      ;   if i + 6 < 502 - 2
      jl.    (d0.)       ;   then return;
                         ;   comment if there is only one word left
                         ;   then it is used as continuation word
      jl. w3  c3.        ;   input extra segm;
      al  w3  x3-502     ;   i:= i - 502;
      jl.     a0.        ;   goto rep;

b10:
d0:    0                 ; saved return;
d1:    0                 ; ne
d2:    0                 ; ng
d3:    0                 ; work for nc, nz
d4:    6                 ; constant  6
d5:   12                 ; -        12
d6:   18                 ; -        18

e.                     ;   end ps process ext list;

\f


; fgs 1986.07.04  compress algol library       page 6



; procedure input extra segment;
; the procedure inputs one extra segment after
; the last and sets the zone variables:
; k:= input.first shared:= input.first transfer:= input.last transfer+2;
; input.last shared:= output.last transfer:= input.last transfer:= k + 510;
; call:  w2 : some machine address
;        w3 : return address;
; return w0 : unchanged; w1: spoiled
;        w2 : w2(entry)+512; w3: byte(x2(entry)+503);
b.   d1  w.            ;
c3:   ds. w3  d1.        ; entry: save registers;
      al. w1  b0.        ;
      rl. w2  b1.+10     ;   set share variables;
      al  w2  x2+2       ;
      al  w3  x2+510     ;
      ds. w3  b1.+4      ;
      ds. w3  b1.+10     ;
      rs. w3  b3.+10     ;
      sl  w3 (x1+h0+2)   ;   if k + 510 > last buffer
      jl.     f4.        ;   then alarm (process too small);
      jl  w3 (x1+h2+6)   ;
      rl. w2  d0.        ;   w2:= saved w2;
      bz  w3  x2+503     ;   w3:= byte(x2+503);
      al  w2  x2+512     ;   w2:= w2 + 512;
      jl.    (d1.)       ;   return
d0:     0 , d1: 0      ;   saved w2, return;
e.                     ; end input extra segm;



; procedure check entry.
;  call:  jl. w2  c7.  ; w3 = addr of entry name.
;                      ; w0 = 0 => check and save object entry base
; the procedure checks that the entry is a legal compress-parameter.
; at return w1 is the result of the check:
;   w1 = 0  ==  normal return, entry is ok
;   w1 = 1  ==  entry is unknown
;   w1 = 2  ==  wrong interval
;   w1 = 3  ==  illegal content
;   w1 = 4  ==  not area

b. a5, d1 w.

c7:   rs. w2  b8.        ; entry: save return;
      rl  w2  0          ;   w2 := w0;
      al. w1  b4.        ;   w1 := lookup area;
      jd      1<11+76    ; check single entry:
      se  w0  0          ;   if unknown then
      jl.     a4.        ;     result := 1 else
      se  w2  0          ;   if object entry then
      jl.     a5.        ;   begin
      dl  w1  x1+4       ;   
      al  w3  0          ;     w3 := own process;
      rs. w3  d1.        ; 
      al. w3  d1.        ;
      jd      1<11+72    ;     set catalog base (entry base);
      se  w0  0          ;     if catbase not set then
      jl.     a3.        ;       result := 2
      al. w1  b4.        ;     else
      dl  w0  x1+4       ;     begin
      ds. w0  b12.       ;       save entry base;
      am          -2000  ;
      am.    (h16.+2000) ;       set catbase (std base);
      dl  w1  +78        ; 
      al. w3  d1.        ;       w3 := own process;
      jd      1<11+72    ;     end;
a5:   al. w1  b4.        ;   end;
      dl. w0  b12.       ;   if entry interval is not equal to
      sn  w3 (x1+2)      ;     the saved base then
      se  w0 (x1+4)      ;     result := 2 else
      jl.     a3.        ;
      bz  w0  x1+30      ;   if content <> 4 then
      se  w0  4          ;     result := 3 else
      jl.     a2.        ;
      rl  w0  x1+14      ;   if size > 0 then
      sl  w0  1          ;     result := 0 else
      am      0-4        ;     result := 4
      am      4-3        ;   ;
a2:   am      3-2        ;
a3:   am      2-1        ;
a4:   al  w1  1          ;
      jl.    (b8.)       ; return;

d1:   0                  ; work;
e.

\f


; fgs 1986.07.04  compress algol library       page 7


; alarms ..........



; procedure alarm head.
;
; the procedure writes <:***<program name> :> on current out...
;
;  call:  jl. w2  f10. ;

b. a1 w.
f10:  al. w0  a0.        ;   w0 := <:***<0>:>;
      jl. w3  h31.-2     ;   outtext;
      am         -2000   ;
      rl. w3  h8.+2000   ;
      al  w0  x3+2       ;
      jl. w3  h31.       ;   outtext(program name);

      al. w0  a1.        ;
      jl. w3  h31.       ;   outtext(<: :>);

      al  w0  1          ;   fp result := sorry;
      rs. w0  b9.        ;

      jl      x2         ;   return;

a0:  <:***<0>:>
a1:  <: :>
e.

; alarmtexts.............

b. a20 w.

a0: h. a1  ; result = 0 , connect error
       a2  ;          1 , unknown
       a3  ;          2 , interval
       a4  ;          3 , content
       a5  ;          4 , not area
       a6  ;          5 , intervals
       a7  ;          6 , no collection area
       a8  ;          7 , transport error
       a9  ;          8 , process too small
       a11 ;          9 , too many segments
       a12 ;          10, create entry
       a13 ;          11, permanent into auxcat
       a14 ;          12, setentry base
w.
a1=k-a0 , <: connect error<10><0>:>
a2=k-a0 , <: unknown<10><0>:>
a3=k-a0 , <: interval<10><0>:>
a4=k-a0 , <: content<10><0>:>
a5=k-a0 , <: not area<10><0>:>
a6=k-a0 , <: intervals<10><0>:>
a7=k-a0 , <: no collection area<10><0>:>
a8=k-a0 , <: transport error<10><0>:>
a9=k-a0 , <: process too small<10><0>:>
a11=k-a0, <: too many segments<10><0>:>
a12=k-a0, <: create entry<10><0>:>
a13=k-a0, <: permanent into auxcat<10><0>:>
a14=k-a0, <: set entry base<10><0>:>

a10:    0              ; saved errortext

\f


; rc 06.03.73    compress algol library       page 8



; process too small...
f4:   am      1          ; process too small: result := 8;

; transport error on input...
f0:   al  w2  -2         ;   result:=7
      al. w1  b0.        ;   terminate input zone...
      jl. w3  h79.       ;
      am      x2         ;

; alarms on input parameters...
f11:  am      9          ; too many segments: result:=9;

f6:   al  w1  0          ; connect error: result := 0;

f5:   bl. w1  x1+a0.     ; other error, result is in w1...
      al. w0  x1+a0.     ;   w0 := alarmtext
      rs. w0  a10.       ;

      jl. w2  f10.       ;   alarm head...

      rl. w3  b5.        ;
      ba  w3  x3         ;   w0 := parameter address;
      al  w0  x3+1       ;
      jl. w3  h31.       ;   outtext(parameter);

      rl. w0  a10.       ;   w0 := saved alarmtext;
      jl. w3  h31.       ;   outtext.

      jl.     c6.        ;   goto remove item...

; alarms on output parameter...
f1:   am      7          ; transport error: result:=7;

f3:   al  w1  0          ; connect error: result := 0;

f9:   bl. w1  x1+a0.     ; other error: result is in w1...
      al. w0  x1+a0.     ;   w0 := alarmtext;
      rs. w0  a10.       ;

      jl. w2  f10.       ;   alarm head

      al. w0  b2.+h1+2   ;  w0 := outfile name;
      jl. w3  h31.       ;   outtext;

      rl. w0  a10.       ;   w0 := saved alarmtext;
      jl. w3  h31.       ;

      jl.     c5.        ;   goto finis program;

\f


; rc 01.03.73    compress algol library       page 9




; other alarms...
f7:   am      1          ; no left side: result := 6;

f8:   al  w1  5          ; intervals: result := 5;
      al  w0  0          ;
      rs. w0  b2.+h1+2   ;  outfilename := 0;
      jl.     f9.        ;   goto other error on output parameter...

e.   ; end a-names for alarms...

; parameter error...

b. a10 w.
f2:   jl. w2  f10.       ;   alarm head...

      al. w0  a0.        ;
      jl. w3  h31.       ;   outtext (<:param :>);

a1:   rl. w2  b5.        ; next: w2 := param pointer;
      ba  w2  x2         ;
      bl  w1  x2         ;   w1 := parameter kind;
      se  w1  10         ;   if <name> then
      jl.     a2.        ;
      al  w0  x2+1       ;     outtext(param name)
      jl. w3  h31.-2     ;
      jl.     a3.        ;   else
a2:   rl  w0  x2+1       ;
      jl. w3  h32.-2     ;     outinteger(param);
             0         ;     ...layout...

a3:   ba  w2  x2         ;
      bl  w1  x2-1       ;   w1 := following separator;
      ws. w2  b5.        ;   remove item from parameterlist...
      hs. w2 (b5.)       ;

      al  w2  46         ;   w2 := point-character;
      al. w3  a1.        ;   set return to next;
      sn  w1  8          ;   if separator is point then
      jl.     h26.-2     ;     outchar(point);

      al  w2  10         ;
      jl. w3  h26.-2     ;   outchar(<10>);

      jl.     c0.        ;   goto next param;

a0:  <:param <0>:>

e.

\f


; rc 03.04.74    compress algol library       page 10


; initialisation of program ....... 

c8:   bz. w2  b4.+32     ; finish init:
      wa. w2  b0.+h1+16  ; 
      al  w2  x2-1       ;   output.segmentcount :=
      rs. w2  b2.+h1+16  ;  codesegments + length of extlist - 1;
      jl.     c0.        ;   goto next praram;

; define the copy-buffer:

g2 = k-1  ; base buffer area
g3 = k    ; first shared
     0     ,  r.17     ; secondary lookup area

; initialize outputname
b. a20, d20
w.
d0:   <:catalog:>, 0, 0      ; name of catalog, name tab addr
           0                 ; message buffer address(first);
d1:      3<12                ; first message(input)
           0  ;g0            ; first buff(first);
           0  ;g0+510        ; last buff(first);
           0                 ; segment(first);

           0                 ; mess buff addr(second);
d2:      3<12                ; second message(input);
           0  ;g0+512        ; first buff(second);
           0  ;g0+512+510    ; last buff(second);
          -1                 ; segment(second); init to -1;

d3:        0, r. 8           ; answer area

d4:        0                 ; current message
d5:        0                 ; other message
d6:       -1<2               ; dangerous bits in status
d7:    1<18 + 1<1            ; end document+normal answer
d8:        0                 ; last entry(current buffer);


\f



; fgs 1986.07.04  compress algol library        page 11


g1:   am      -1000      ; initialize:
      rs. w3  h8.+1000   ;   current command := program name...
      al  w0  x3+1       ;   param pointer:=
      rs. w0  b5.        ;   byte before program;
      sn  w2  x3         ;   if no leftside then
      jl.     f7.        ;     alarm (no leftside)
      al  w3  x3-8       ;     w3 := outfile name;
      dl  w1  x3+2       ;     move outfile name to output zone...
      ds. w1  b2.+h1+4   ;
      ds. w1  b6.+4      ;     and connection tail;
      dl  w1  x3+6       ;
      ds. w1  b2.+h1+8   ;
      ds. w1  b6.+8      ;
      al  w0  0          ;     check entry base and save it;
      jl. w2  c7.        ;     check entry(w3);
      se  w1  0          ;     if not  ok then
      jl.     f9.        ;       alarm(error on output);




; initialize abs addresses in zones...

      al. w1  b0.+h0+1   ;  w1 := chain start;
      bl  w0  x1-1       ;

a1:   wa  w1  0          ; next: w1 := next element;
      bl  w2  x1         ;
      bl  w0  x1-1       ;
      wa  w2  2          ;   w2 := abs address of element;
      rs  w2  x1         ;
      se. w1  b0.+h0+1   ;  if not chain start then
      jl.     a1.        ;     goto next;
      rl. w3  b5.        ;
      al  w3  x3-3       ;   initialize last of buffer in zones...
      rs. w3  b0.+h0+2   ;
      rs. w3  b2.+h0+2   ;

; connect output zone...

      al  w0  0          ;   define area-size;
      al. w1  b2.        ;   w1 := output zone;
      al. w2  b6.        ;   w2 := outfile;
      jl. w3  h28.       ;   connect output;
      se  w0  0          ;   if not ok then
      jl.     f3.        ;     alarm(connect error);
      al. w1  b0.        ;
      jl. w3  h27.       ;   connect input (outfile);
      se  w0  0          ;   if not ok then
      jl.     f9.        ;   alarm (error on output)


\f


;fgs 1986.07.04    compress algol library,      page 12




;scan catalog to see if left side already compressed ...



      al. w3  d0.        ;start cat scan:
      jd      1<11+52    ;   create area process
      al. w1  g0.        ;              (<:catalog:>);
      al  w2  x1+510     ;
      ds. w2  d1.+4      ;   initialize buffer addresses(first);
      al  w1  x1+512     ;
      al  w2  x1+510     ;
      ds. w2  d2.+4      ;   initialize buffer addresses(second);
      sl. w2 (b0.+h0+2)  ;   if last buf(catscan) >  last buf(input) then
      jl.     f4.        ;    alarm(process too small);
      al. w1  d1.        ;   current message:=first;
      al. w2  d2.        ;   other message:=second;
      ds. w2  d5.        ;

      al. w1  d1.        ;   send message(first buffer);
      jd      1<11+16    ;
      rs  w2  x1-2       ;   save mess buff addr(first);
      al. w1  d2.        ;   message:=second;

a3:   rl  w2  x1+6       ; next segment:  comment throughout this loop
      al  w2  x2+2       ;                w3 points at <:catalog:>;
      rs  w2  x1+6       ;   segment(message):=segment(message)+2;
      jd      1<11+16    ;   send message(message);
      rs  w2  x1-2       ;   save mess buff addr;

      rl. w2  d4.        ;   message buffer address :=
      rl  w2  x2-2       ;         mess buff addr(current);
a4:   al. w1  d3.        ; wait and check:
      jd      1<11+18    ;   wait answer(answer area, buff);
      al  w2  1          ;
      ls  w2 (0)         ;   logical status:=
      lo  w2  x1         ;       status + 1<result;
      sz. w2 (d6.)       ;   if dangerous bits then
      jl.     a8.        ;     goto end catscan;
      rl  w2  x1+2       ;   if bytes transferred <> 512
      sn  w2  512        ;   then
      jl.     a5.        ;     begin
      rl. w1  d4.        ;       send message(current);
      jd      1<11+16    ;       goto wait and check;
      jl.     a4.        ;     end;
a5:   rl. w2  d4.        ;   entry := first of entry;
      rl  w2  x2+2       ;
      al  w1  x2+15*34-34;   last entry:=(entries per segment - 1)
      rs. w1  d8.        ;                  * entry length + first  of buffer;

a6:   bl  w0  x2+0       ;   test entry:
      sn  w0  -1         ;   if entry = free then
      jl.     a7.        ;    goto next entry;
      dl. w1  b12.       ; 
      sn  w0 (x2+2)      ;   if entry base <> saved entry base then
      se  w1 (x2+4)      ;     goto next entry;
      jl.     a7.        ;
      dl. w1  b0.+h1+4   ;   if entry. docname (1:2) <>
      sn  w0 (x2+16)     ;      input.procname (1:2) then
      se  w1 (x2+18)     ;      goto next_entry;
      jl.     a7.        ;
      dl. w1  b0.+h1+8   ;   if entry. docname (3:4) <>
      sn  w0 (x2+20)     ;      input.procname (3:4) then
      se  w1 (x2+22)     ;      goto next_entry;
      jl.     a7.        ;
      bz  w1  x2+30      ;
      al  w1  x1-32      ;   first segm := entry.content - 32;
      sl  w1  1          ;   if first segm <=0
      sh. w1 (b0.+h1+16) ;   or first segm < input zone.segment count
      jl.     a7.        ;   then goto next entry;
      rs. w1  b0.+h1+16  ;   input zone.segm:=first segm;
      bz  w1  x2+32      ;   input entry.code length :=
      hs. w1  b4.+32     ;     entry.code length;
\f


; rc 24.03.83    compress algol library,              page 13




a7:   al  w2  x2+34      ; next entry: entry:=entry + entry length;
      sh. w2 (d8.)       ;    if entry <= last entry
      jl.     a6.        ;   then goto test entry;

      rl. w1  d5.        ;   message := current message;
      rx. w1  d4.        ;   current message := other message;
      rs. w1  d5.        ;   other message := message;
      jl.     a3.        ;   goto next segment;

a8:   al. w1  d0.        ; end catscan:
      al  w3  -2000      ;   comment stepping stone;
      so. w2 (d7.)       ;   if status <> end of document
      jl.     x3+h7.+2000;   then goto giveup the run;
      rl. w2  d5.        ;  
      rl  w2  x2-2       ;   w2:= buff address of other message;
      al. w1  d3.        ;   
      jd      1<11+18    ;   fetch answer to other message;
      al. w1  b0.        ;

      al. w3  c8.        ;   set return addresses to go
      rs. w3  b10.       ;    via pseudo process ext list 
      al. w3  c4.        ;    to finish init and then call
      jl     (x1+h2+6)   ;   inblock;

e.                     ; end a-names of initialization.

g0:  0                 ; length of segment, length of next segment...

e.                     ; end block for fpnames

m.compresslib 1986.07.04

i.
e.                     ; end segment


▶EOF◀