|
|
DataMuseum.dkPresents historical artifacts from the history of: RC4000/8000/9000 |
This is an automatic "excavation" of a thematic subset of
See our Wiki for more about RC4000/8000/9000 Excavated with: AutoArchaeologist - Free & Open Source Software. |
top - metrics - download
Length: 19200 (0x4b00)
Types: TextFile
Names: »uti32«
└─⟦00964e8f7⟧ Bits:30007478 RC8000 Dump tape fra HCØ.
└─⟦b2ec5d50f⟧
└─⟦f8e4b63af⟧ »trcfput«
└─⟦this⟧
; rc 01.03.73 compress algol library page 1
s. b20, c20, f20, g20, w. ; start segment...
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
; rc 06.03.73 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
; 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);
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
; rc 27.03.73 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;
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 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;
al w1 2.111 ;
la. w1 b4. ;
se w1 0 ; if key <> 0
jd 1<11+50 ; then permanent entry;
jl. a2. ; goto next entry;
e. ; end a-names of catalog scan
\f
; rc 76.10.27 compress algol library page ...5...
; finis program: set result and return to fp...
c5: rl. w3 h8. ; for all parameters left in
al w0 4 ; paramlist do
hs w0 x3 ; preceding separator (param)
ba w3 x3+1 ; := <s>;
se. w3 (b5.) ;
jl. -6 ;
rl. w2 b9. ; w2 := fp result;
jl. h7. ; goto fp end 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, d3 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 ;
rx. w1 d1. ; nb:= word(k+j);
wm. w1 d3. ;
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;
d0: b10: 0 ; saved return
d1: 0 , d2:0 ; ne, ng
d3: 6 ; constant 6
e. ; end ps process ext list;
\f
; rc 09.08.73 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.
; 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 w.
c7: al. w1 b4. ; w1 := lookup area;
jd 1<11+76; check single entry:
se w0 0 ; if unknown then
jl. a4. ; result := 1 else
am (66) ;
dl w0 +70 ; if entry interval is not equal to
sn w3 (x1+2) ; the catalog 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 x2 ; return;
e.
\f
; rc 06.03.73 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;
rl. w3 h8. ;
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. a11 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
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>:>
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 01.03.73 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. a1 w.
g1: am -1000 ;
rs. w3 h8.+1000; initialize: 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;
jl. w2 c7. ; check entry(w3);
se w1 0 ; if not ok then
jl. f9. ; alarm(error on output);
; check catalog base and standard interval...
a0: rl w3 66 ;
dl w1 x3+70 ; w0w1 := catalog base;
al w1 x1-1 ;
sl w0 (x3+76) ; if catalog base is outside
sl w1 (x3+78) ; the standard interval then
jl. f8. ; alarm(intervals);
\f
; rc 01.03.73 compress algol library page 11
; 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)
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...
i. e.
m. compresslib 27.03.73
e. ; end fp names
▶EOF◀