|
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: 9216 (0x2400) Types: TextFile Names: »tadd «
└─⟦110021343⟧ Bits:30007476 RC8000 Backup tape fra HT's bus-radio system └─⟦a957ba283⟧ └─⟦this⟧ »tadd «
( mp=set 1 mp=algol message.no lookup add if ok.no ( fl=algol message.no connect.no add=algol message.no connect.no ) end ) external integer procedure mp(to_file,from_file); long array to_file,from_file; <* output file name; input file name *> begin <* mp return value: 0 copying ok. 1 no core. <lookup result> * 1000 + 2 no input file. <lookup result> * 1000 + 3 no output file. <ch.entry result>* 1000 + 4 change entry output file impossible. 5 create area process impossible, area claims exceeded. 6 input file reserved by other process. <lookup result> = 0 means non-area entry looked up. WARNING: the output file is changed partly when result 6 is returned. Carsten Palvig 1981.06.22 NHP 880422 *> integer procedure slice_size(device_name); long array device_name; begin integer array core(1:18); integer size,bs_devices; size:= 0; <* result value for non-existing devices *> system(5,92,core); bs_devices:= (core(3)-core(1))//2; begin integer array name_table(1:bs_devices); integer device_no; long array field name; system(5,core(1),name_table); name:= 18; for device_no:= 1 step 1 until bs_devices do begin system(5,name_table(device_no)-36,core); if core.name(1)=device_name(1) and core.name(2)=device_name(2) then begin size:= core(15); device_no:= bs_devices; end; end; end; slice_size:= size; end slice_size; <* mp page 2 *> procedure error(error_code); value error_code; integer error_code; begin mp:= error_code; goto terminate; end error; integer block_size, segm_in, segm_out; long array file_in, file_out(1:2); begin <* calculate the optimal blocksize *> zone z, z_bs(1,1,stderror); integer array tail_in, tail_out, tail_out_bs(1:10), _ tail_in_bs(6:10), ia(1:1); long array docname(1:2); long array field device; integer max_blockfactor, slice, s, kind_in, kind_out, i; boolean bs_in, bs_out; device:= 2; for i:= 1,2 do begin file_in(i):= from_file(i); file_out(i):= to_file(i) end; max_blockfactor:= system(2,0,docname)//512-14; if max_blockfactor<1 then error(1); <* no core *> open(z,0,file_in,0); close(z,false); i:= monitor(42,z,0,tail_in); if i<>0 then error(2+i*1000); <* no input file *> bs_in:= tail_in(1)=1 shift 23+4; kind_in:= tail_in(9) shift (-12); if bs_in then begin for i:= 6,7,8,9,10 do tail_in_bs(i):= tail_in(i); for i:= 1,2 do file_in(i):= tail_in.device(i); segm_in:= if kind_in=4 then 0 else _ if kind_in<32 then tail_in(8) else kind_in-32; open(z,0,file_in,0); close(z,false); i:= monitor(42,z,0,tail_in); if i<>0 or tail_in(1)<0 then error(2+i*1000) <* no input file *> end else if tail_in(1)<0 then error(2) <* no input file *> else segm_in:= 0; if monitor(52,z,0,ia)<>0 then error(5); <* create area process impossible *> open(z,0,file_out,0); close(z,false); i:= monitor(42,z,0,tail_out); if i=3 then begin tail_out(1):= tail_in(1)-segm_in; tail_out(2):= 1; for i:= 3 step 1 until 10 do tail_out(i):= 0; i:= monitor(40,z,0,tail_out) end; if i<>0 then error(3+i*1000); <* no output file *> bs_out:= tail_out(1)=1 shift 23+4; kind_out:= tail_out(9) shift (-12); if bs_out then begin open(z_bs,0,file_out,0); close(z_bs,false); for i:= 1 step 1 until 10 do tail_out_bs(i):= tail_out(i); for i:= 1,2 do file_out(i):= tail_out.device(i); segm_out:= if kind_out=4 then 0 else _ if kind_out<32 then tail_out(8) else kind_out-32; open(z,0,file_out,0); close(z,false); i:= monitor(42,z,0,tail_out); if i<>0 or tail_out(1)<0 then error(3+i*1000) <* no output file *> end else if tail_out(1)<0 then error(3) <* no output file *> else segm_out:= 0; if monitor(52,z,0,ia)<>0 then error(5); <* create area process impossible *> slice:= slice_size(tail_in.device); s:= slice_size(tail_out.device); if s>slice then slice:= s; tail_out(1):= segm_out-segm_in+tail_in(1); if bs_out then begin if bs_in then begin for i:= 6,7,8,9,10 do tail_out_bs(i):= tail_in_bs(i); if kind_in=4 then error(2) else if kind_in<=32 then tail_out_bs(8):= segm_out else tail_out_bs(9):= (segm_out+32) shift 12+(tail_in_bs(9) extract 12) end else begin for i:= 6,7,8,9,10 do tail_out_bs(i):= tail_in(i); if kind_in>32 then error(2) else if kind_in<>4 then tail_out_bs(8):= segm_out else tail_out_bs(9):= (segm_out+32) shift 12+(tail_in(9) extract 12) end; i:= monitor(44,z_bs,0,tail_out_bs); if i<>0 then error(4+i*1000) <* change entry output file impossible *> end else if bs_in then begin for i:= 6,7,8,9,10 do tail_out(i):= tail_in_bs(i); if kind_in=4 then error(2) else if kind_in<=32 then tail_out(8):= 0 else tail_out(9):= 4 shift 12+(tail_out(9)extract 12) end else begin for i:= 6,7,8,9,10 do tail_out(i):= tail_in(i); if kind_in>32 then error(2) end; i:= monitor(44,z,0,tail_out); if i<>0 then error(4+i*1000); <* change entry output file impossible *> if tail_out(1)=0 then error(0);<* nothing to move (no error) *> monitor(8,z,0,ia); <* reserve output file *> block_size:= (if max_blockfactor>=tail_in(1) then tail_in(1) else if max_blockfactor>slice then max_blockfactor//slice*slice else max_blockfactor ) * 512; if docname(1)=long<:testm:> add 'o' then <* 'testmove' *> _ write(out,<:mp blocksize: max, used =:>,max_blockfactor,block_size//512,<:<10>:>); end; begin <* mp page 3 *> procedure block_proc(z,s,b); zone z; integer s,b; begin if false add (s shift(-2)) then error(6); <* input file reserved by other process *> stderror(z,s,b); end; zone z(block_size//4,1,block_proc); integer array to, from(1:20); integer i; getzone6(z,to); open(z,4,file_in,1 shift 2); <* giveup: rejected *> getzone6(z,from); from(9):= segm_in; setzone6(z,to); open(z,4,file_out,0); getzone6(z,to); to(9):= segm_out; setzone6(z,from); copy: i:= inrec6(z,0); if i>2 then begin inrec6(z,i); getzone6(z,from); setzone6(z,to); outrec6(z,i); if i=block_size then begin outrec6(z,0); getzone6(z,to); setzone6(z,from); goto copy; end; getzone6(z,to); setzone6(z,from); end; close(z,true); <* input *> setzone6(z,to); close(z,true); <* output *> end; mp:= 0; <* move ok *> terminate: end procedure mp; end end begin array o,s,p(1:2); integer i; long array field l; l:= 0; system(4,0,o); if system(4,1,p)<>6 shift 12+10 then write(out,<:***:>,o.l,<: intet målområde:>) else if system(4,2,s)<>4 shift 12+10 then write(out,<:***:>,p.l,<: ingen kilde:>) else begin i:= mp(o.l,s.l); if i>0 then write(out,<:***:>,p.l,<< bddd>,i,<: :>,case i mod 1000 of( _ <:processtørrelse:>,<:kildeområde:>,<:målområde:>,<:change entry:>, _ <:create area process:>,<:kilde reserveret:>)) end; fpproc(7,0,0,0) end begin integer item,sep,i; long array field l,m; array field r; integer array field ii; array o,s,p(1:2); integer array t(1:17); zone z,z1(1,1,stderror); procedure q(i); value i; integer i; if i>1000 then system(9,i,<:<10>moncall:>); l:= 0; m:= 6; r:= 2; ii:= 0; system(4,0,o); if system(4,1,p)<>6 shift 12+10 then write(out,<:***:>,o.l,<: intet målområde:>) else begin item:= 2; sep:= system(4,item,s); if sep<>4 shift 12+10 then write(out,<:***:>,p.l,<: har intet at tilføje:>) else repeat if sep extract 12<>10 then write(out,<:***:>,p.l,<: kan ikke tilføje:>,s(1)) else if s(1)=o(1) and s(2)=o(2) then write(out,<:***:>,p.l,<: :>,s.l,<: kan ikke tilføjes sig selv:>) else begin open(z,0,o,0); close(z,true); q(1000*monitor(42,z,0,t)+42); if t(1)<0 then system(9,t(1),<:<10>objekt:>); t(8):= t(1); t.r(1):= o(1); t.r(2):= o(2); t(1):= 1 shift 23+4; t(6):= t(7):= t(9):= t(10):= 0; q(1000*monitor(68,z,0,t)+68); q(1000*monitor(40,z,0,t)+40); q(1000*monitor(76,z,0,t)+76); i:= mp(t.m,s.l); if i=0 then begin open(z1,0,s,0); close(z1,true); monitor(48,z1,0,t); q(1000*monitor(46,z,0,s.ii)+46); end else write(out,<:***:>,p.l,<< bddd>,i,<: :>,case i mod 1000 of( _ <:processtørrelse:>,<:kildeområde:>,<:målområde:>,<:change entry:>, _ <:create area process:>,<:kilde reserveret:>)) end; item:= item+1; sep:= system(4,item,s) until sep=0 end; fpproc(7,0,0,0) end ▶EOF◀