|
|
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: 7680 (0x1e00)
Types: TextFile
Names: »tnetcollect«
└─⟦00964e8f7⟧ Bits:30007478 RC8000 Dump tape fra HCØ.
└─⟦b2ec5d50f⟧
└─⟦fd91a6c89⟧ »tm68net«
└─⟦this⟧
;ali time 2 0
;copyright Anders Lindgård, march 1979;
mode list.yes
lookup netalglist
if ok.yes
mode 15.yes
lookup tnetcollect
netcollect=set 100
permanent netcollect.22
netcollect=hcalg
Call:
<ls>=netcollect micro.<name> <parameters>
<ls> outputarea. If it does not exist an area of 150 segments
is created. If it does exist it must be a backing store file
<parameters>::=program.<name>/block.<no>/
header.<option>/key.<no>/<parameters>
micro.<name> name of a microcomputer in the network.
program.<name> name of a program for a local microcomputer. If this
parameter is specified the microcomputer is loaded from scratch.
block.<no> If specified this block number is used instead of the block
number from the tail of <ls>.
header.<option> if specified the header information is not used when
<option> is no.
key.<no> if specified <ls> is permanented with this key.
maxbuf.<no> if specified <no> of buffers will
be used in the datacollection else double buffering
is used. Legal values of <no> are 1,2,3.
begin
integer i,j,res,pda,block,segm,lastsegm,key,first,attbuf,buf,
status,remaining,bufi,no,nextblock,maxbuf;
boolean endblock,statuserror,repeat,header,test,testout,listblock;
integer array tail(1:10),M,Mbs,A(1:8),
m,a(1:256);
array outn,name,program,bs(1:3),command(1:10);
integer array field ia;
testout:=readsfp(<:out:>,outn);
test:=lookupentry(<:netcoltest:>)=0 or true or testout;
if -,readbfp(<:listblock:>,listblock) then listblock:=test;
cleanbuf(0);
if -,readlsfp(bs) then alarm(nl,1,star,3,<:left side missing:>);
res:=lookuptail(bs,tail);
if res<>0 then
begin
cleararray(tail);
tail(1):=150;
res:=createentry(bs,tail);
if res<>0 then alarm(nl,1,star,3,string inc(bs),<: create entry :>,res);
end else
if tail(1)<1 or tail(7)>tail(1) then
alarm(nl,1,star,3,<:tail error segm :>,tail(1),<: block :>,tail(7));
if readifp(<:key:>,key) then permentry(bs,key);
if -,readsfp(<:micro:>,name) then alarm(nl,1,star,3,<:micro not specified in call:>);
res:=reserveproc(name,0);
if res<>0 then alarm(nl,1,string inc(name),<: reservation error:>,res);
pda:=description(name);
i:=wordload(pda);
if i<>114 then alarm(nl,1,star,3,string inc(name),<: is not a local microcomputer:>);
if readsfp(<:program:>,program) then
begin
res:=netprogload(string inc(name),string inc(program));
end else
begin
res:=netoperat(string inc(name),opautoload,0);
end;
if res<>1 then alarm(nl,1,star,3,<:initialisation error:>);
res:=netoperat(string inc(name),opstart,0);
if res<>1 then alarm(nl,1,star,3,string inc(name),<: start error:>,res);
if -,readbfp(<:header:>,header) then header:=true;
if -,readifp(<:block:>,block) then block:=if header then tail(7) else 0;
res:=careaproc(bs);
if res<>0 then alarm(nl,1,star,3,string inc(bs),<: create area process:>,res);
res:=reserveproc(bs,0);
if res<>0 then alarm(nl,1,star,3,string inc(bs),<: reserve area process :>,res);
if -,readifp(<:maxbuf:>,maxbuf) then maxbuf:=2 else
if maxbuf>3 then maxbuf:=3 else
if maxbuf<1 then maxbuf:=1;
begin
integer array ba,sb(1:maxbuf),data(1:maxbuf*256);
for i:=1 step 1 until maxbuf do sb(i):=ba(i):=0;
endblock:=statuserror:=false;
Mbs(1):=opoutput;
M(1):=opinput+2;
first:=M(2):=firstaddr(data);
M(3):=M(2)+510;
sb(1):=M(4):=block shift 1;
lastsegm:=tail(1);
ba(1):=sendmessage(pda,M);
if maxbuf>=2 then
begin
M(2):=first+512;
M(3):=M(2)+510;
sb(2):=M(4):=(block+1) shift 1;
ba(2):=sendmessage(pda,M);
nextblock:=block+1;
end;
if maxbuf>=3 then
begin
M(2):=first+1024;
M(3):=M(2)+510;
sb(3):=M(4):=(block+2) shift 1;
nextblock:=block+2;
ba(3):=sendmessage(pda,M);
end;
attbuf:=att;
if ba(1)=0 or ba(maxbuf)=0 or attbuf=0 then
begin
cleanbuf(0);
alarm(nl,1,star,3,<:too few buffers:>);
end;
remaining:=0;
if testout then
begin
stackcuro;
res:=connectcuro(outn);
if res<>0 then unstackcuro;
end;
no:=0;
for no:=no+1 while
(remaining>0 or -,endblock) and -,statuserror do
begin
if test then write(out,nl,2,<:run :>,no,block);
buf:=0;
res:=waitevent(buf);
if res=0 then
begin
getevent(buf);
sendanswer(buf,2,A);
end
else
if buf=attbuf then
begin
comment attbuf;
cleararray(command);
if header then
begin
readstring(in,command,1);
if command(1)=real <:end:> then
begin
end
else
begin write(out,nl,1,star,2,<:unknown command:>); outend(0); end;
end else endblock:=true;
getevent(attbuf);
attbuf:=att;
end
else
begin
bufi:=if buf=ba(1) then 1 else
if buf=ba(2) then 2 else
if buf=ba(3) then 3 else 0;
if bufi=0 then getevent(buf) else
begin
ia:=(bufi-1)*512;
if testout then
begin
write(out,nl,1);
for i:=8 step 2 until 22 do
begin
j:=wordload(ba(bufi)+i);
if i=8 then writebinary(out,j) else
if i=10 then write(out,nl,1,<<dddddd>,j) else
write(out,<< dddddd>,j,<< dd>,j shift (-16) extract 8,
j shift (-8) extract 8, j extract 8, j extract 16,<:;:>);
end write;
end testout;
res:=waitanswer(ba(bufi),A);
remaining:=remaining-1;
repeat:=false;
if res=1 and A(1)=0 and A(2)=0 then repeat:=true else
if res>1 then alarm(nl,1,string inc(name),<: result transfer :>,res) else
if A(1)<>0 then
begin
write(out,nl,1,star,3,string inc(name),<: status:>);
writebinary(out,A(1));
alarm(<::>);
end;
if listblock and -,repeat then write(out,nl,1,<:block no (read):>,data.ia(3));
if header then
begin
block:=data.ia(3);
status:=data.ia(6);
if testbit(status,10) then endblock:=true else
if status<>0 then statuserror:=true;
if statuserror then
begin
write(out,nl,1,star,2,string inc(name),<: status in block:>);
writebinary(out,status);
alarm(<::>);
end;
end header;
M(2):=Mbs(2):=first+ia;
M(3):=Mbs(3):=Mbs(2)+510;
Mbs(4):=block;
if repeat then
begin
M(4):=sb(bufi);
if test then write(out,nl,1,<:wait block :>,block,M(4)extract 16);
end
else
if block>lastsegm or block<0 then
alarm(nl,1,star,3,<:blocknumber range:>,block,<: last segment :>,lastsegm)
else
begin
for res:=waitanswer(sendmessage(bs,Mbs),A) while
res=1 and A(1)=0 and A(2)=0 do;
if res>1 then alarm(nl,1,star,3,string inc(bs),<: transfererror:>,res) else
if A(1)<>0 then
begin
write(out,nl,1,star,3,string inc(bs),<: status:>);
writebinary(out,A(1));
alarm(<::>);
end;
tail(7):=block;
res:=changeentry(bs,tail);
if res<>0 then alarm(nl,1,star,3,string inc(bs),<: changeentry:>,res);
if test then
begin write(out,nl,1,<:segment :>,block); outend(10); end;
block:=block+1;
sb(bufi):=M(4):=(nextblock+1) shift 1;
nextblock:=nextblock+1;
end -,repeat;
ba(bufi):=if endblock then 0 else send_message(pda,M);
remaining:=remaining+(if endblock then 0 else 1);
end bufi<>0;
end answer;
end
if testout then closeout;
end array block;
end
▶EOF◀