|
|
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: 19968 (0x4e00)
Types: TextFile
Names: »uti31«
└─⟦00964e8f7⟧ Bits:30007478 RC8000 Dump tape fra HCØ.
└─⟦b2ec5d50f⟧
└─⟦f8e4b63af⟧ »trcfput«
└─⟦this⟧
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
; other variables
b4: 0 , r.17 ; lookup area, and top entry (during cat-scan)
b5: 0 ; parameter pointer (points at item before
; current parameter, right byte)
b6: 1<23 + 4 ; constant = <bs>
b7: <:catalog:>, 0, 0 ; name and name table address for catalog
b8: 0 ; saved return from c7
b9: 0 ; fp result
\f
; 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);
; prepare for changing the catalog entry into a
; file descriptor
rl. w0 b6. ; size(catalog entry) := <bs>;
rs. w0 b4.+14 ;
dl. w1 b2.+h1+4; move areaname from output zone
ds. w1 b4.+18 ; to tail...
dl. w1 b2.+h1+8;
ds. w1 b4.+22 ;
rl. w0 b2.+h1+16; move segment count in output zone into
rs. w0 b2.+h1+14; blockcount of output zone and
rs. w0 b4.+28 ; into tail
rl. w3 b5. ; ...and into separator byte of current
ba w3 x3 ; parameter head;
hs w0 x3-1 ;
; move the file described by the parameter to output
al. w1 b0. ; connect input(input zone,
al w2 x3+1 ; parameter name);
jl. w3 h27. ;
se w0 0 ; if not ok then
jl. f6. ; alarm(connect input);
jl. w2 c2. ; readfile;
jl. w3 h79. ; terminate inputzone;
al. w1 b2. ;
jl. w2 c3. ; writefile;
\f
; change catalog entry of parameter, and increase param pointer...
; and goto next param...
al. w3 b4.+6 ; w3 := name of entry;
al. w1 b4.+14 ; w1 := tail;
jd 1<11+44; change entry(w1,w3);
sn w0 0 ; if ok then
jl. c6. ; goto remove from area list;
jd 1<11+48; remove entry(w3);
jd 1<11+40; create entry(w1,w3);
al w1 2.111 ; w1 := catalog key (param);
la. w1 b4. ;
se w1 0 ; if key > 0 then
jd 1<11+50; permanent entry(w1,w3);
rl. w3 b5. ; increase parameter pointer;
ba w3 x3 ;
rs. w3 b5. ;
jl. c0. ; goto next param;
; at end of parameter list: terminate the output zone and
; change the output entry so that it describes all the output
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 :=
ls w0 9 ; segment count * 512;
rs w0 x1+18 ;
jd 1<11+44; change entry(w1,w3);
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;
; prepare catalog scan
al. w3 b7. ; w3 := <:catalog:>;
jd 1<11+6 ; initialize process(w3)
sn w0 3 ; or
jd 1<11+52; create area process(w3);
se w0 0 ; if not ok then
jl. f7. ; alarm(cat-scan impossible);
rs. w0 b1.+12 ; segment count in input message := 0;
al. w0 g3. ; first address in message := g3;
rs. w0 b1.+8 ;
\f
; scan the catalog and find the entries whose kind is <bs>,
; and whose entry interval is equal to the catalog base, and
; whose content is not 4.
b. a5 w.
a0: al. w1 b1.+6 ; next transport:
al. w3 b7. ; w1,w3 := message and name addresses;
jd 1<11+16; send ...
al. w1 b4. ;
jd 1<11+18; and wait message;
bl w0 x1 ; if end document then
sn w0 1<6 ; goto finis program;
jl. c4. ;
rl w0 x1+2 ; segment no in message :=
ls w0 -9 ; bytes transferred // 512
wa. w0 b1.+12 ; + segment no in message;
rs. w0 b1.+12 ;
rl. w2 b1.+8 ; top entry := first of transfer
wa w2 x1+2 ; + bytes transferred;
rs. w2 b4. ;
a1: rl. w2 b4. ; next segment:
sh. w2 (b1.+8) ; if top entry <= first of transfer then
jl. a0. ; goto next transfer;
al w0 x2-512 ; entry := top entry;
rs. w0 b4. ; first of segment := top entry := top entry - 512;
a2: al w2 x2-34 ; next entry: entry := entry - 34;
sh. w2 (b4.) ; if entry <= first of segment then
jl. a1. ; goto next segment;
rl w0 x2-2 ; if empty entry then
sn w0 -1 ; goto next entry;
jl. a2. ;
; w2 now points at the lower interval of a nonempty entry...
rl w0 x2+12 ; if kind <> <bs>
bl w1 x2+28 ; or content = 4 then
sn. w0 (b6.) ; goto next entry;
sn w1 4 ;
jl. a2. ;
am (66) ; if entry interval is not equal to
dl w1 +70 ; the catalog base then
sn w0 (x2) ; goto next entry;
se w1 (x2+2) ;
jl. a2. ;
\f
; scan the area chain in the parameter list to find an areaname
; equal to the documentname of the entry
rl. w3 h8. ; w3 := base of arealist;
a3: dl w1 x2+16 ; next area name:
a4: ba w3 x3+1 ; w0w1 := first part of documentname of entry;
sn. w3 (b5.) ; increase area name pointer;
jl. a2. ; if end of list then goto next entry;
sn w0 (x3+2) ; if area name is different from document name
se w1 (x3+4) ; of entry then
jl. a4. ; goto next area name;
dl w1 x2+20 ;
sn w0 (x3+6) ;
se w1 (x3+8) ;
jl. a3. ;
; change the documentname of the entry into the name of the
; output area and increase the blockcount in the entry
dl. w1 b2.+h1+4; move documentname from output zone...
ds w1 x2+16 ;
dl. w1 b2.+h1+8;
ds w1 x2+20 ;
bz w0 x3 ; increase blockcount in entry
wa w0 x2+26 ; by block no of area name;
rs w0 x2+26 ;
al w1 x2+12 ; w1 := tail of entry;
al w3 x2+4 ; w3 := name of entry;
jd 1<11+44; change entry(w1,w3);
jl. a2. ; goto next entry;
e. ; end a-names of catalog scan
\f
; finis program: set result and return to fp...
c4: jd 1<11+64; remove process(<:catalog:>);
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 ;
c5: rl. w2 b9. ; w2 := fp result;
jl. h7. ; goto fp end program;
\f
; procedure readfile and writefile.
;
; call: jl. w2 c2. ; w1 = input zone => readfile
; jl. w2 c3. ; w1 = output zone => writefile
;
; the procedure transfers a whole number of segments, as
; described by the length-field of the param-entry.
;
; at return w1 and w2 are unchanged.
c3:
c2: rl. w3 b4.+32 ; w3 := length in tail of parameter;
sn w3 0 ; if length is zero then
jl x2 ; return;
al w3 x3+511 ;
as w3 -9 ;
as w3 9 ; last of transfer :=
al w3 x3-2 ; (length + 511) // 512 * 512
al. w0 x3+g3. ; + first shared - 2;
sl. w0 (b0.+h0+2); if last of transfer >=
jl. f4. ; last of buffer then alarm(process too small);
am (x1+h0+4) ; save last of transfer in share...;
rs w0 +10 ;
jl w3 (x1+h2+6) ; call fp-block...
am (x1+h0+4) ;
rl w3 +22 ; w3 := top transferred;
se w0 x3-2 ; if top transferred-2 <> last of transfer then
jl (x1+h2+2) ; call error procedure;
jl x2 ; return;
\f
; 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;
rs. w2 b8. ; save return;
jl. w2 a1. ; check single entry(w1,w3);
se w1 -1 ; if entry kind is <> bs then
jl. (b8.) ; return;
al. w1 g3. ; check the docname entry...
al. w3 b4.+16 ;
jl. w2 a1. ; if again the kind is <bs> then
sn w1 -1 ; result := 4;
al w1 4 ;
jl. (b8.) ; return;
a1: 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 is 4 then
sn w0 4 ; result := 3 else
jl. a2. ;
rl w0 x1+14 ; if size >= 0 then
sl w0 0 ; result := 0 else
jl. a5. ;
se. w0 (b6.) ; if kind <> <bs> then
am 4+1 ; result := 4
am -1-3 ; else result := -1;
a2: am 3-2 ;
a3: am 2-1 ;
a4: am 1-0 ;
a5: al w1 0 ;
jl x2 ; return;
e.
\f
; 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.
\f
; alarms.............
b. a10 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 , catalog scan impossible
a8 ; 7 , transport error
a9 ; 8 , process too small
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 , <: catalog scan impossible<10><0>:>
a8=k-a0 , <: transport error<10><0>:>
a9=k-a0 , <: process too small<10><0>:>
a10: 0 ; saved errortext
; process too small...
f4: am 1 ; process too small: result := 8;
; transport error on input...
f0: al w2 0 ;
al. w1 b0. ; terminate input zone...
jl. w3 h79. ;
am x2 ;
; transport error on output...
f1: al w2 7 ; result := 7;
rl. w1 b2.+h1+14; segment count of output zone
rs. w1 b2.+h1+16; := block count of output zone;
am x2 ;
; alarms on input parameters...
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...
\f
; alarms on output parameter...
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;
; other alarms...
f7: am 1 ; catalog scan impossible: 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...
\f
; 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
; 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...
sn w2 x3 ; if leftside then
jl. a0. ; begin
al w3 x3-8 ; w3 := outfile name;
dl w1 x3+2 ; move outfile name to output zone...
ds. w1 b2.+h1+4;
dl w1 x3+6 ;
ds. w1 b2.+h1+8;
jl. w2 c7. ; check entry(w3);
sl w1 2 ; if not (unknown or ok) then
jl. f9. ; alarm(error on output);
; end;
; 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
; 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;
am -1000 ;
rl. w3 h8.+1000; param pointer := current command, rigth byte;
al w3 x3+1 ;
rs. 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 1<1+1 ; define area-size;
al. w1 b2. ; w1 := output zone;
al w2 x1+h1+2 ; w2 := outfile name;
jl. w3 h28. ; connect output;
se w0 0 ; if not ok then
jl. f3. ; alarm(connect error);
rl. w2 b4.+32 ; segment count of output zone :=
al w2 x2+511 ; (length + 511) // 512;
ls w2 -9 ;
rs w2 x1+h1+14 ;
rs w2 x1+h1+16 ;
jl. c0. ; goto next param;
e. ; end a-names of initialization.
g0: 0 ; length of segment, length of next segment...
i. e.
m. compress 25.1.72
e. ; end fpnames
\f
▶EOF◀