|
|
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: 6912 (0x1b00)
Types: TextFile
Names: »tchangedisc «
└─⟦01e83a425⟧ Bits:30008166 Bånd med SW8010 og SW8500 source code
└─⟦75ff9bef3⟧
└─⟦this⟧ »tchangedisc «
changedisc = algol index.no; list.yes details.8.8 xref.yes blocks.yes bossline.yes
begin
<*changedisk, dh 86.01.07 page ...01...*>
message program for moving areas from one disk to another.
call:
changedisk (<filename>.<discname>) 0/*
the error messages should be self explanatory;
long array diskname, filename(1:2);
integer paramno, i, zsize, spname, ptname, progsize, centralloop,
files, errors;
centralloop := 7; progsize := 24;
comment the values of progsize and centralloop are best obtained from
the segmentation yielded by a translation with details.8.8, and
the survey from pass 9. remember that inrec and outrec use one
running system segment (check), and that zone declaration uses
another. if in doubt keep centralloop low and progsize high;
spname := 4 shift 12 + 10; ptname := 8 shift 12 + 10;
files := errors := 0; paramno := 1;
i := (system(2)free_core:(i, filename) - 200)//512;
zsize := (if i <= centralloop then 1 else
if i <= (4*progsize-centralloop+4)//3 then (i-centralloop)//4+1
else (i - progsize) ) * 512;
comment at least one segment, but if there is room for the central
loop, take one extra buffer segment whenever there is room for 4
extra segments, until there is room for the whole loop stepping
through the parameters. -
\f
<*changedisk, dh 86.01.07 page ...02...*>
- the following for statement with all its procedures etc. is
what should be contained in progsize ;
for i := system(4)fpparam:(paramno, filename) while i = spname do
begin
zone z(zsize//4, 1, stderror);
integer array todesc, fromdesc(1:20), entry(1:17), base(1:2);
integer j, key, err; integer field size;
integer array field iaf; long array field laf;
procedure blpr(z, s, b); zone z; integer s, b;
begin own boolean called; integer array zdesc(1:20);
if called then b := 2 else
begin
called := true; getzone6(z, zdesc);
if zdesc(13<*z.state*>) = 5<*after inrec*> then
begin
flip; errmess(<:input trouble:>);
end else errmess(<:output trouble:>);
close(z<*out*>, true);
monitor(48)remove:(z<*out*>, 0, zdesc); flop;
close(z<*in*>, true);
called := false;
goto opgiv;
end;
end blpr;
procedure errmess(s); string s;
err := write(out, "sp", 12-write(out, filename), <:cannot be moved to :>,
diskname, <:, :>, s, <:!<10>:>);
procedure flip;
begin
getzone6(z<*in*>, fromdesc); setzone6(z<*out*>, todesc);
end;
procedure flop;
begin
getzone6(z<*out*>, todesc); setzone6(z<*in*>, fromdesc);
end;
getzone6(z<*empty*>, todesc);
size := 16;
open(z<*in*>, 4, filename, 0);
paramno := paramno + 2;
laf := 16; iaf := err := 0;
if system(4)fpparam:(paramno-1, diskname) <> ptname
then err:=write(out, filename,
<: not followed by proper diskname<10>:>) else
if monitor(76)headandtail:(z<*in*>, 0, entry) <> 0
then errmess(<:cannot be found:>) else
\f
<*changedisk, dh 86.01.07 page ...03...*>
begin
key := entry(1) extract 2;
base(1) := entry(2); base(2) := entry(3);
if entry.size >= 0 then
begin
entry.laf(1) := diskname(1); entry.laf(2) := diskname(2);
end;
size := 2;
for j := 1 step 1 until 10 do entry(j) := entry(j+7);
flip;
open(z<*out*>, 4, <::>, 0);
if monitor(40)create:(z<*out*>, 0, entry) <> 0
then errmess(<:no temporary claims:>) else
if monitor(if entry.size<0 and key>1 then 90 else 50)permanent:(
z<*out*>, key, diskname.iaf) <> 0 then
begin
monitor(48)remove:(z<*out*>, 0, entry);
errmess(<:no permanent claims:>);
end else
if monitor(74)set_bases:(z<*out*>, 0, base) <> 0 then
begin
monitor(48)remove:(z<*out*>, 0, entry);
errmess(<:bases improper:>);
end else
begin
if entry.size <= 0 then flop else
begin
monitor(52)create:(z<*out*>, 0, entry);
monitor(8)reserve:(z<*out*>, 0, entry);
flop;
monitor(52)create:(z<*in*>, 0, entry);
comment as the monitor procedure segments are in core, it may be
faster to create and reserve the area processes "by hand", in stead
of letting the standard error actions perform this. -
\f
<*changedisk, dh 86.01.07 page ...04...*>
- the following for statement with all its procedures except
close is considered to be the central loop;
for j := inrec6(z<*in*>, 0) while j > 2 do
begin
inrec6(z<*in*>, j); flip;
outrec6(z<*out*>, j);
if j = zsize then outrec6(z<*out*>, 0)
else close(z<*out*>, true); flop;
end;
close(z<*in*>, true); flip;
close(z<*out*>, true); flop;
end moving of data, i.e. central loop;
if monitor(48)remove:(z<*in*>, 0, entry) <> 0 then
begin
flip; monitor(48)remove:(z<*out*>, 0, entry);
errmess(<:rename trouble:>);
end
else
begin
iaf := 0; laf := 2; flip;
if monitor(46)rename:(z<*out*>, 0, filename.iaf) <> 0 then
err:=write(out, <:rename trouble!!! new name: :>, todesc.laf,
<: in stead of :>, filename, <:!!!<10>:>)
else write(out, "sp", 12-write(out, filename),
<:moved to :>, diskname, <:<10>:>);
end renaming;
end moving the file or the descriptor;
end determining keys and bases;
opgiv:
if err <> 0 then errors := errors+1 else files := files+1;
end going through parameters, i.e. progsize;
\f
<*changedisk, dh 86.01.07 page ...05...*>
if files + errors = 0 then errorbits := 1
else if files = 0 then
begin
errorbits := 3;
write(out,
<:no files moved because of errors, see above!:>);
end
else if errors = 0 then write(out, files,
if files=1 then <: file:> else <: files:>, <: moved correctly.:>)
else
begin
errorbits := 2;
write(out, files, if files = 1 then <: file:> else <: files:>,
<: moved correctly, but:>, errors,
if errors = 1 then <: file was:> else <: files were:>,
<: in error, see above!:>);
end;
if i <> 0 then
begin
errorbits := errorbits extract 1 + 2;
write(out, <:<10>parameter pair:>, (paramno+1)//2,
<: not proper, moving stopped!:>);
end;
end*; program
end ; possible unstacking of current in
finis
▶EOF◀