|
|
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: 46080 (0xb400)
Types: TextFile
Names: »tcrossload «
└─⟦01e83a425⟧ Bits:30008166 Bånd med SW8010 og SW8500 source code
└─⟦75ff9bef3⟧
└─⟦this⟧ »tcrossload «
crossl=algol list.no xref.no blocks.no connect.no
begin
<* crossload release 3 lbj 861110
Revision history:
850801 lbj Release 1.0 of SW8740 and SW8741
860224 lbj Floppy handler included in connect
860320 lbj Console and printer included in link
860514 lbj reserve printer and printlog
860724 lbj Streamer handler included in link
860804 lbj release 2.0 of SW8740
861110 lbj Error in disconnect device
861201 lbj release 3.0 of sw8740
871026 kak copy core changed (system(5,..)): fielding nessary if lower ind<>1
880209 kak Release 5.0:
connect and disconnect commands are changed to createlink and removelink
the commands timeout and reset are removed as visible commands
printer commands are removed
this program is used to load an IFP801/IFP802 and/or an ADP. After the
ADP is loaded, links can be createed to the devices on ADP.
call:
(<outfile>=) crossload (test) main.<ifpmain>,
rc8410,
rc8411,
rc8420,
lib.<libfile>,
createlink.3270.<in_device>.<in_name>.<out_device>.<out_name>,
createlink.imc.<devno>.<name>,
createlink.mailbox.<in_device>.<in_name>.<out_device>.<out_name>,
createlink.mirror.<devno>.<devname>,
createlink.floppy.<devno>.<devname>,
createlink.printer.<printername>.<devno>.(<devname>),
createlink.console.<consolename>.<devno>.(<devname>) (printlog),
createlink.streamer.<devno>.<devname>,
removelink.(<devno>)!(<devname>)
<outfile> ::= Current output
test ::= Inclusion of test output.
lib.<libname> ::= The library is searched if the names are not found in
the catalog. Default name for the library is 'crosslib'.
main.<ifpmain> ::= The name of the main process for the controller. If the
main clause appear several times, the described functions
(load, connect) will be executed on the main processes
listed.
ifp.<ifpfw> ::= The IFP is loaded with FirmWare in the mentioned file.
There is no default filename. If no filename is specified
a dummy record is sent to the IFP in order to read a
filename
adp.<pi3file> ::= The ADP is loaded with a PI-3 basis system, and the
necessary programs and configuration files. Default name
for the basis system is 's8410'.
rc8410 ::= The ADP is loaded with the PI-3 basis system, and the
necessary programs and configuration file in accordance
with rc8410. Before the adp is loaded the ifp is sensed
and if it is not already loaded, it is loaded with the
suggested filename.
rc8411 ::= Same as rc8410.
rc8420 ::= The ADP is loaded with a basis system and configuration
file according to rc8420.
timeout.<seconds> ::= After an eventual load of IFP and ADP the timeout super
vision is started with the mentioned period. A period
of 0 seconds will disable the timeout supervision.
reset ::= The main process is reset.
createlink.3270 ::= A link to 3270 input and output handlers are
created. A RC8000 device number may be specified for
the input as well as the output process. If no device
number is specified the first free device is selected.
The processes may also be given a name.
createlink.imc ::= A link to a IMC port handler is created. Same
possibilities as the 3270 device handler for selecting
device number and name.
createlink.mailbox ::= A link to mailbox input and output handlers are created.
The mailbox handlers are used in connection with RC SHIPPING.
createlink.mirror ::= A link to a mirror device is created. The mirror
device is used in connection with the RC8000 testsystem.
createlink.floppy ::= A link to the floppy handler is created.
createlink.printer ::= A link to a printer is created.
createlink.console ::= A link to the console is created.
createlink.streamer::= A link to the streamer is created
removelink.<devno> ::= A link to a device, addressed with number,
is removed.
removelink.<name> ::= A link to a device, addressed with name, is
removed.
*>
integer startparam,i;
long array param(1:2);
procedure crossload(z_write,startparam,echo);
zone z_write;
integer startparam;
boolean echo;
begin
zone z(1,1,stderror);
integer i,j,k,timecount,point_integer,point_name,space_name;
integer mainparam,system4,ext_char,adp_boot,time_base;
long l;
long array field laf;
boolean test,ifp,main,ok,createlink,removelink,more;
boolean reset,time;
long array param1,param,main_name,lib_name,ifp_name,adp_name(1:2);
integer array ia(1:20);
procedure type_info;
begin
write(z_write,
<:<10>program call:<10><10>:>,
<:(<outfile>=) crossload main.<ifpmainprocess> default = ifpmain1,<10>:>,
<: rc8410 ; sense ifp, bootfile = s8410,<10>:>,
<: rc8411 ; sense ifp, bootfile = s8410,<10>:>,
<: rc8420 ; sense ifp, bootfile = s8420,<10>:>,
<: lib.<libfile> ; default library = crosslib,<10>:>,
<: createlink.3270(.<i_devno>)(.<i_name>)(.<o_devno>)(.<o_name>),<10>:>,
<: createlink.imc(.<devno>)(.<name>),<10>:>,
<: createlink.mailbox(.<i_devno>)(.<i_name>)(.<o_devno>)(.<o_name>),<10>:>,
<: createlink.mirror(.<devno>)(.<devname>),<10>:>,
<: createlink.floppy(.<devno>)(.<devname>),<10>:>,
<: createlink.printer.<printername>(.<devno>)(.<devname>),<10>:>,
<: createlink.console.<consolename>(.<devno>)(.<devname>) (printlog),<10>:>,
<: createlink.streamer(.<devno>)(.<devname>),<10>:>,
<: removelink.(<devno>!<devname>)<10>:>);
end;
boolean procedure create_peripheral(name,devno);
long array name;
integer devno;
begin
zone z(1,1,stderror);
integer array ia(1:12);
integer i;
open(z,0,name,0);
close(z,true);
i:= monitor(54)create peripheral process:(z,devno,ia);
if i <> 0 then
write(z_write,<:<10>***crossload create peripheral process, :>,
case i of (<:function forbidden:>,<:not user:>,<:name conflict:>,
<:device number does not exist:>,<:device reserved:>,
<:name format illegal:>));
create_peripheral:= i=0;
end;
boolean procedure remove_device(devno,devname,print);
integer devno;
long array devname;
boolean print;
begin
integer array ia(1:12);
zone z(1,1,stderror);
integer i,j;
i:= -1; remove_device:= false;
if devno <> -1 then
i:= devno
else
begin
open(z,0,devname,0);
close(z,false);
j:= monitor(4)process description:(z,1,ia);
if j <> 0 then
begin
integer array start(1:2);
integer peripherals;
system(5)copy core:(74,start);
peripherals:= (start(2)-start(1))/2 - 1;
begin
integer array field iaf;
integer array nametable(0:peripherals);
iaf:=-2;
system(5)copy core:(start(1),nametable.iaf);
for i:= 0,i+1 while i <= peripherals and
nametable(i) <> j do;
if i = peripherals then
begin
i:= -1;
if print then write(z_write,
<:<10>***crossload remove device, process not a device<10>:>);
end;
end;
end else
if print then write(z_write,
<:<10>***crossload remove device, process does not exist<10>:>);
end;
if i <> -1 then
begin
open(z,0,mainname,0);
close(z,false);
getshare6(z,ia,1);
ia(4):= 10 shift 12;
ia(5):= i;
setshare6(z,ia,1);
i:= monitor(16)send message:(z,1,ia);
if i=0 then system(9)run time alarm:(1,<:<10>send mes:>);
if timeout(i,time_base) then
begin
monitor(82)regret message:(z,1,ia);
write(z_write,<:<10>***crossload remove device, timeout<10>:>);
end else
begin
i:= monitor(18)wait answer:(z,1,ia);
j:= 1 shift i + ia(1);
if j = 2 then
begin
if print then
begin
if devno=-1 then write(z_write, devname)
else write(z_write, <:device :>,<<ddd>,devno);
write(z_write, <: removed<10>:>);
end;
remove_device:= true;
end else if print then
begin
write(z_write,<:<10>***crossload remove device, :>,
case i of (<:status = :>,<:reserve error:>,<:illegal device:>,
<:receiver malfunction:>,<:mainprocess unknown:>));
if i = 1 then for i:= 0 step 1 until 23 do
write(z_write,if j shift i < 1 then <:1:> else <:.:>);
write(z_write,"nl",1);
end;
end;
end;
end remove_device;
boolean procedure link_device(type,device,net_name,dev_name,text);
integer type,device;
long array net_name,dev_name;
string text;
begin
integer i,j;
integer array ia(1:12);
zone z(1,1,stderror);
open(z,0,main_name,0);
close(z,false);
link_device:= false;
getshare6(z,ia,1);
ia(4):= 6 shift 12 + 1;
ia(5):= type;
ia(6):= 255; <* select the first free *>
ia(7):= device;
if type = 9 then
ia(8):= 1 shift 12 + 1 <* link streamer *>
else if type=8 or type=1 then begin
laf:=14;
ia.laf(1):=net_name(1);
ia.laf(2):=net_name(2);
end else
ia(8):= 2 shift 12 + 4;
setshare6(z,ia,1);
i:= monitor(16)send message:(z,1,ia);
if i=0 then system(9)run time alarm:(1,<:<10>send mes:>);
if timeout(i,time_base) then
begin
monitor(82)regret message:(z,1,ia);
write(z_write,<:<10>***crossload link device, timeout<10>:>);
end else
begin
i:= 1 shift monitor(18)wait answer:(z,1,ia) + ia(1);
if i = 2 then
begin
device:= ia(2); <* return devicenumber *>
if dev_name(1) <> long<::> then
begin
if -,create_peripheral(dev_name,ia(2)) then
remove_device(ia(2),dev_name,false)
else
begin
link_device:= true;
if type=1 or type=8 then begin
i:=write(z_write,net_name);
write(out,"sp",11-i);
end else write(z_write,text);
write(z_write,<< dddd>,ia(5));
write(z_write,<: linked to:>,ia(2),
<: called :>,dev_name,"nl",1);
end;
end else
begin
link_device:= true;
if type=1 or type=8 then begin
i:=write(z_write,net_name);
write(out,"sp",11-i);
end else write(z_write,text);
write(z_write,<< dddd>,ia(5));
write(z_write,<: linked to:>,ia(2),"nl",1);
end;
end else
begin
j:= ia(1) shift (-8) extract 6;
write(z_write,<:<10>***crossload link device: :>);
if j=4 and (type=1 or type=8) then write(z_write,net_name,"sp",2) else write(z_write,dev_name,"sp",2);
if j>0 and j<=4 then
write(z_write,case j of (<:device troubles:>,
<:status = ..............1.......1.:>,
<:no resources at RC8000:>,<:no resources at ADP:>),"nl",1)
else
begin
write(z_write,<:status = :>);
for j:= 0 step 1 until 23 do
write(z_write,if i shift j < 0 then <:1:> else <:.:>);
write(z_write,"nl",1);
end;
end;
end if not timeout;
end link_device;
boolean procedure boot(boot_name);
long array boot_name;
begin
long array field name;
boolean finis,em,found,basisfile,ext_name,host_name_set;
integer ia12,i,status,blockcount;
integer array ia(1:20),tail(1:10);
zone z_in,z_out(128,1,blockproc);
long array param,wrk_name(1:2);
procedure set_host_name;
begin
long array field laf;
integer array z_in_descr(1:20);
integer i,j,k,e_count;
if test then write(z_write,<: : try name from monitor:>);
close(z_in,true);
getzone6(z_in,z_in_descr);
z_in_descr(2):=0;
setzone6(z_in,z_in_descr);
for j:=1 step 1 until 10 do tail(j):=0;
tail(1):=2;
monitor(40,z_in,1,tail);
getzone6(z_in,z_in_descr);
laf:=2;
wrk_name(1):=z_in_descr.laf(1);
wrk_name(2):=z_in_descr.laf(2);
open(z_in,4,wrk_name,0);
outrec6(z_in,512);
for j:=1 step 1 until 128 do z_in(j):=real<::>;
system(5,1192,z_in);
j:=1;
get_char(z_in,j,k);
if k>126 or k<97 then k:=6 else
repeat
get_char(z_in,j,k);
if k=0 then else
if (k>126 or k<97) and (k<48 or k>57) then k:=6;
until k=6 or k=0 or j>9;
if k=6 then begin
z_in(2):=real<::>;
puttext(z_in,1,<:rc8000<26>:>); <*default value*>
end else putchar(z_in,j-1,26);
close(z_in,true);
open(z_in,4,wrk_name,1 shift 18);
fpproc(27,j,z_in,wrk_name);
param(1):=wrk_name(1); param(2):=wrk_name(2);
inrec6(z_in,512);
end;
procedure blockproc(z,s,b);
zone z;
integer s,b;
begin
integer array field iaf,iaf1;
integer array tail(1:10);
integer i,block,katseg,mask;
system(14,0,ia);
if test then
begin
write(z_write,"sp",14-
write(z_write,<:<10>:>,param));
for i:= 0 step 1 until 23 do
write(z_write,if s shift i <0 then <:1:> else <:.:>);
end;
em:= true; b:= 512;
if s shift 19 < 0 then
status:= 5
else if s shift 5 < 0 then
status:= 1
else if s shift 18 < 0 then
begin
status:= 1;
found:= false;
close(z_in,true);
open(z_in,4,lib_name,1 shift 18);
if (monitor(42)lookup entry:(z_in,1,tail)=0) then
<* file does not exist, search in lib *>
begin
iaf:= 0;
inrec6(z_in,512);
i:= z_in.iaf(1); <* version *>
katseg:= z_in.iaf(2);
setposition(z_in,0,katseg+1);
inrec6(z_in,512);
if z_in.iaf(1) < i then
setposition(z_in,0,1);
for i:= 1,i+1 while -,found and i<=katseg do
begin
inrec6(z_in,512);
iaf1:= 14;
iaf:= 0;
laf:= 6;
mask:= z_in.iaf(256);
while -,found and (mask<>0) do
begin
mask:= mask shift (-1);
if mask extract 1 = 1 then
begin
found:= z_in.laf(1)=param(1) and z_in.laf(2)=param(2);
block:= z_in.iaf(1)//8;
blockcount:= z_in.iaf1(1);
end;
iaf:= iaf+34; laf:= laf+34; iaf1:= iaf1 + 34;
end;
end;
if found then
begin
if test then write(z_write,<: : found in lib:>);
setposition(z_in,0,block);
inrec6(z_in,512);
em:= false;
end else
if -,ext_name then
begin <* try with a name extended with the last char in mainproc *>
ext_name:= true;
if test then write(z_write,<: : try extended name:>);
if param(1) extract 8 <> 0 then
begin
if param(2) extract 16 <> 0 then
param(2):=param(2) shift (-16) shift (16);
i:= -48;
repeat
i:= i + 8;
j:= (param(2) shift i) extract 8
until j = 0;
param(2):= logor(param(2),(extend ext_char) shift (-i));
end else
begin
i:= -48;
repeat
i:= i + 8;
j:= (param(1) shift i) extract 8
until j = 0;
param(1):= logor(param(1),(extend ext_char) shift (-i));
end;
close(z_in,true);
open(z_in,4,param,1 shift 18);
fpproc(27,i,z_in,param); <* connect input zone *>
em:= false;
inrec6(z_in,512);
end else if -,hostname_set and param(1)=long<:hostn:> add 'a' and
param(2) shift (-32) shift 32 =long<:me:> then begin
set_host_name;
hostname_set:=true;
em:=false;
end;
end lib;
end else if s shift 9 < 0 then
status:= 2
else if s shift 2 < 0 then
status:= 3
else
stderror(z,s,b);
end blockproc;
procedure send_to_ifp;
begin
integer i;
i:= monitor(16)send message:(z_out,1,ia);
if i=0 then system(9)run time alarm:(1,<:<10>send mes:>);
if timeout(i,6*time_base) then
begin
reset_main;
blockproc(z_out,1 shift 21,512); <* generate timeout status *>
monitor(18)wait answer:(z_out,1,ia);
end else
check(z_out);
end;
open(z_out,0,main_name,1 shift 4 + 1 shift 14 + 1 shift 18 + 1 shift 21);
host_name_set:=false;
wrk_name(1):=wrk_name(2):=long<::>;
name:= 8;
outrec6(z_out,512);
getzone6(z_out,ia);
i:= ia(14);
getshare6(z_out,ia,1);
ia12:= ia(12);
ia(4):= 5 shift 12;
ia(5):= i + 1;
ia(6):= ia(5) + 510;
ia(7):=ia(8):=ia(9):=ia(10):=ia(11):= 0;
setshare6(z_out,ia,1);
em:= finis:= boot:= false;
ext_name:= true;
if boot_name(1) = long<::> then
begin
z_out(1):= real<::> add ( 765 shift (-8) + ((765 extract 8) shift 8)) shift 24;
for i:= 2 step 1 until 128 do z_out(i):= real<::>;
z_out(128):= real <::> add 1; <* checksum is zero *>
send_to_ifp;
<* send a dummy record to the ifp, it will answer with a default
filename of the firmware *>
system(14,0,ia);
if em then
begin
if test then write(z_write,<: : ifp status -:>);
end else if ia(5) <> 0 then
begin
boot_name(1):= ia.name(1); boot_name(2):= ia.name(2);
end;
end;
param(1):= boot_name(1); param(2):= boot_name(2);
open(z_in,4,param,1 shift 18);
fpproc(27,i,z_in,param); <* connect input zone *>
basisfile:= true;
blockcount:= 8 000 000;
repeat
while -,em do
begin
inrec6(z_in,512);
tofrom(z_out,z_in,512);
blockcount:= blockcount - 1;
if (blockcount < 0) and -,em then blockproc(z_in, 1 shift 18, 0);
getshare6(z_out,ia,1);
ia(12):= ia12;
if em then
begin
if test then write(z_write,<: : disc status:>);
ia(8):= 2;
setshare6(z_out,ia,1);
status:= 4;
if -,basisfile then
begin
em:= false;
send_to_ifp;
if em and test then write(z_write,<: : ifp status -:>);
end;
end else
begin
ia(8):= 0;
setshare6(z_out,ia,1);
send_to_ifp;
if em and test then write(z_write,<: : ifp status -:>);
end;
end;
case status of
begin
begin
finis:= ia(5)=0;
if test then
write(z_write,if finis then <: end load<10>:> else
<: get next file:>);
if finis then
begin
boot:= true;
write(z_write,<:boot :>,boot_name,<: ok<10>:>);
end;
end;
begin
finis:= true;
write(z_write,if test then <: load error<10>:>
else <:<10>***crossload load error<10>:>);
end;
begin
finis:= true;
write(z_write,if test then <: timeout<10>:>
else <:<10>***crossload timeout in load<10>:>);
end;
begin
finis:= true;
if boot_name(1) <> long<::> then
write(z_write,<:<10>***crossload :>,boot_name,<: does not exist<10>:>)
else
boot:= true;
end;
begin
<* result 4 *>
finis:= true;
write(z_write,if test then <: result 4<10>:> else
<: <10>***crossload receiver malfunction<10>:>);
end;
end;
param(1):= ia.name(1); param(2):= ia.name(2);
if -,finis then
begin
ext_name:= em:= found:= false;
close(z_in,true);
basisfile:= false;
<* if (param(1) = long<:confi:> add 'g') and (param(2) = long<:cst:>) then
param(2):= case adp_boot of (long<:cst:>,long<:8410:>,long<:8420:>); *>
open(z_in,4,param,1 shift 18);
fpproc(27,i,z_in,param); <* connect input zone *>
blockcount := 8 000 000;
end;
until finis;
close(z_in,true);
changerec6(z_out,0);
if wrk_name(1)<>long<::> then begin
close(z_in,true);
open(z_in,4,wrk_name,0);
close(z_in,true);
monitor(48,z_in,1,tail);
end;
end boot;
boolean procedure reset_main;
begin
integer i;
integer array ia(1:12);
zone z(1,1,stderror);
open(z,0,main_name,0);
close(z,false);
getshare6(z,ia,1);
ia(4):= 4 shift 12;
setshare6(z,ia,1);
i:= monitor(16)send message:(z,1,ia);
if i=0 then system(9)run time alarm:(1,<:<10>send mes:>);
if monitor(18)wait answer:(z,1,ia) = 1 then
begin
delay(1);
reset_main:= true;
end else
begin
reset_main:= false;
write(z_write,<:<10>***crossload reset error<10>:>);
end;
end reset_main;
boolean procedure timeout(buf,count);
value buf,count;
integer buf,count;
begin
integer i,j;
integer array ia(1:12);
zone z(1,1,stderror);
open(z,2,<:clock:>,0);
getshare6(z,ia,1);
ia(4):= 2;
ia(5):= 0;
ia(6):= count*10000;
setshare6(z,ia,1);
i:=monitor(16)send message:(z,1,ia);
if i=0 then system(9)run time alarm:(1,<:<10>send mes:>);
j:= 0;
while (j<>buf) and (j<>i) do
monitor(24)wait event:(z,j,ia);
if i = j then <* timeout *>
begin
monitor(18)wait answer:(z,1,ia);
timeout:= true;
end else
begin
monitor(82)regret message:(z,1,ia);
timeout:= false;
end;
end timeout;
procedure read_device_and_name(par_no,device,name);
integer par_no,device;
long array name;
begin
integer j;
device:= -1;
name(1):= name(2):= long <::>;
j:= system(4,par_no+1,param);
if j = point_integer <* .<integer> *> then
begin
par_no:= par_no+1;
device:= round param(1);
if echo then write(z_write,<:.:>,<<d>,device);
j:= system(4,par_no+1,param);
end;
if j = point_name then <* .<name> *>
begin
name(1):= param(1);
name(2):= param(2);
if echo then write(z_write,<:.:>,name);
par_no:= par_no+1;
end;
end read_device_and_name;
procedure read_name(par_no,name);
integer par_no;
long array name;
begin
integer j;
name(1):= name(2):= long <::>;
j:= system(4,par_no+1,param);
if j = point_name then <* .<name> *>
begin
name(1):= param(1);
name(2):= param(2);
if echo then write(z_write,<:.:>,name);
par_no:= par_no+1;
end;
end read_name;
boolean procedure set_timeout(count);
value count;
integer count;
begin
integer i;
integer array ia(1:12);
zone z(1,1,stderror);
open(z,0,main_name,0);
close(z,false);
getshare6(z,ia,1);
ia(4):= 2 shift 12;
ia(5):= count;
setshare6(z,ia,1);
i:= monitor(16)send message:(z,1,ia);
if i=0 then system(9)run time alarm:(1,<:<10>send mes:>);
if timeout(i,time_base) then
begin
monitor(82)regret message:(z,1,ia);
write(z_write,<:<10>***crossload timeout error<10>:>);
set_timeout:= false
end else
begin
i:= monitor(18)wait answer:(z,1,ia);
if (i = 1) and (ia(1) = 0) then
begin
write(z_write,<:timeout ok<10>:>);
set_timeout:= true;
end else
begin
write(z_write,<:<10>***crossload timeout error<10>:>);
set_timeout:= false;
end;
end;
end set_timeout;
procedure delay(count);
value count;
integer count;
begin
integer i;
integer array ia(1:12);
zone z(1,1,stderror);
open(z,2,<:clock:>,0);
getshare6(z,ia,1);
ia(4):= 2;
ia(5):= 0;
ia(6):= count*10000;
setshare6(z,ia,1);
i:=monitor(16)send message:(z,1,ia);
if i=0 then system(9)run time alarm:(1,<:<10>send mes:>);
monitor(18)wait answer:(z,1,ia);
end delay;
procedure param_error(param,kind);
long array param;
integer kind;
begin
write(z_write,<:<10>***crossload parameter error, :>,
case (kind shift (-12))/2+1 of (<:(:>,<: :>,<: :>,<:=:>,<:.:>));
if kind extract 12 = 4 then write(z_write,<<d>,round param(1)) else
write(z_write,param); write(z_write,"nl",1);
ok:= false;
type_info;
end param_error;
point_integer:= 8 shift 12 + 4;
point_name := 8 shift 12 + 10;
space_name := 4 shift 12 + 10;
ok := true;
if echo then write(z_write,<:*crossload<10>:>);
if system(4,startparam,param) = 0 then
type_info; <* no parameters *>
test:= false;
time_base:=10;
ext_char:=1;
main_name(1):= long<:ifpma:> add 'i'; main_name(2):= long<:n1:>;
mainparam:= startparam;
while (system(4,startparam,param) <> 0) and ok do
<* repeat for each main *>
begin
more:= true;
removelink:= ifp:= createlink:= reset:= time:= false;
adp_boot:= 0;
lib_name(1):= long<:cross:> add 'l'; lib_name(2):= long<:ib:>;
ifp_name(1):= long<::> ; ifp_name(2):= long<::>;
adp_name(1):= long<:s8410:> ; adp_name(2):= long<::>;
main:=false;
system4:= system(4,startparam,param);
while (system4 <> 0) and more do
begin
if system4 <> space_name then
begin
param_error(param,system4);
more:= false;
end else
if param(1) = long<:test:>
and param(2) = long<::> then
begin
if echo then write(z_write,<:*test<10>:>);
test:= true;
end else
if (param(1) = long<:timeo:> add 'u')
and (param(2) = long<:t:>)
and (system(4,startparam+1,param1)=point_integer) then
begin
timecount:= round param1(1);
time:= true;
startparam:= startparam + 1;
end else
if (param(1) = long<:main:>)
and (param(2) = long<::>)
and (system(4,startparam+1,param1) = point_name) then
begin
if main then
begin
more:= false;
startparam:= startparam - 1;
end else
begin
main_name(1):= param1(1);
main_name(2):= param1(2);
if main_name(2) <> long<::> then
l:= main_name(2)
else
l:= main_name(1);
repeat
ext_char:= l extract 8;
l:= l shift (-8);
until ext_char<>0;
startparam:= startparam + 1;
main:= true;
end;
end else
if param(1) = long<:ifp:> and param(2)=long<::>
and adp_boot <= 1 then
begin
if system(4,startparam+1,param) = point_name then
begin
ifp_name(1):= param(1);
ifp_name(2):= param(2);
startparam:= startparam+1;
end;
ifp:= true;
end else
if param(1) = long<:adp:> and param(2)=long<::>
and adp_boot = 0 then
begin
if system(4,startparam+1,param)=point_name then
begin
adp_name(1):= param(1);
adp_name(2):= param(2);
startparam:=startparam+1;
end;
adp_boot:= 1;
end else
if ((param(1) = long<:rc841:> add '0')
or (param(1) = long<:rc841:> add '1'))
and -,ifp and adp_boot = 0 then
begin
adp_name(1):= long<:s8410:>;
adp_name(2):= long<::>;
adp_boot:= 2;
end else
if (param(1) = long<:rc842:> add '0')
and -,ifp and adp_boot = 0 then
begin
adp_name(1):= long<:s8420:>;
adp_name(2):= long<::>;
adp_boot:= 3;
end else
if (param(1) = long<:lib:>)
and (param(2) = long<::>)
and (system(4,startparam+1,param1) = point_name) then
begin
lib_name(1):= param1(1);
lib_name(2):= param1(2);
startparam:= startparam+1;
end else
if ( (param(1) = long<:conne:> add 'c') and (param(2) = long<:t:>)
or (param(1) = long<:creat:> add 'e') and (param(2) = long<:link:>) )
and (system(4,startparam+1,param1) shift(-12) = 8) then
begin
createlink:= true;
while system(4,startparam+1,param) shift (-12) = 8 do
<* repeat while point separator *>
startparam:= startparam+1;
end else
if ( (param(1) = long<:disco:> add 'n') and (param(2) = long<:nect:>)
or (param(1) = long<:remov:> add 'e') and (param(2) = long<:link:>) )
then
begin
removelink:= true;
while system(4,startparam+1,param) shift (-12) = 8 do
<* repeat while point separator *>
startparam:= startparam+1;
end else
if (param(1) = long<:reset:>)
and (param(2) = long<::>) then
reset:= true
else
if (param(1) = long<:reser:> add 'v')
and (param(2) = long<:e:>) then
begin
if system(4,startparam+1,param) = pointname then
startparam:= startparam + 1;
end else
if (param(1) <> long<:print:> add 'l')
or (param(2) <> long<:og:>) then
begin
param_error(param,system4);
more:= false;
end;
startparam:= startparam+1;
system4:= system(4,startparam,param);
end while more;
if ok then
begin
open(z,0,main_name,0);
close(z,false);
if echo then write(z_write,<:*main.:>,main_name,"nl",1);
i:= monitor(8)reserve process:(z,i,ia);
if (i<>0) and (i<>2) then
begin
write(z_write,<:<10>***crossload :>, main_name,
case i of (<: reserved by another process:>,<: can not be reserved:>,
<: does not exist:>),"nl",1);
ok:= false;
end;
if -,ok then errorbits:= log_or(errorbits,1 shift 0); <* ok.no *>
if ok and reset then begin
if echo then write(z_write,<:*reset<10>:>);
ok:= reset_main;
if ok then
write(z_write,<:reset ok<10>:>);
end;
if -,ok then errorbits:= log_or(errorbits,1 shift 0); <* ok.no *>
i:= mainparam; j:= system(4,mainparam,param);
while (j<>0) and ok and removelink and i < startparam do
begin
if ( (param(1) = long<:disco:> add 'n') and (param(2) = long<:nect:>)
or (param(1) = long<:remov:> add 'e') and (param(2) = long<:link:>) )
and j = space_name then
begin
j:= system(4,i+1,param);
if j = point_integer then
ok:=remove_device(round param(1),param,true)
else if j = point_name then
ok:=remove_device(-1,param,true)
else
param_error(param,j);
i:= i + 1;
end;
if -,ok then errorbits:= log_or(errorbits,1 shift 0); <* ok.no *>
ok:=true; <* disconnect of illegal devices don't stop the program *>
i:= i+1;
j:= system(4,i,param);
end;
if ifp and ok then
begin
if echo then write(z_write,<:*ifp.:>,ifp_name,<: lib.:>,lib_name,"nl",1);
reset_main;
ok:= boot(ifp_name);
if ok and ifp_name(1)=long<::> then
begin
ifp_name(1):= long<:ifp80:> add '1';
ifp_name(2):= long<::>;
ok:= boot(ifp_name);
end;
end;
if -,ok then errorbits:= log_or(errorbits,1 shift 0); <* ok.no *>
if (adp_boot<>0) and ok then
begin
if echo then
begin
write(z_write, case adp_boot of (<:*adp.:>,<:*rc8410:>,<:*rc8420:>));
if adp_boot = 1 then write(z_write, adp_name);
write(z_write,<: lib.:>,lib_name,"nl",1);
end;
reset_main;
if adp_boot > 1 then
ok:= boot(ifp_name);
if ok then ok:= boot(adp_name);
end;
if -,ok then errorbits:= log_or(errorbits,1 shift 0); <* ok.no *>
if time and ok then begin
if echo then write(z_write,<:*timeout.:>,<<d>,timecount,"nl",1);
ok:= set_timeout(timecount);
end;
i:= mainparam; j:= system(4,mainparam,param);
while (j<>0) and ok and createlink and i < startparam do
begin
if ( (param(1) = long<:conne:> add 'c') and (param(2) = long<:t:>)
or (param(1) = long<:creat:> add 'e') and (param(2) = long<:link:>) )
and j = space_name then
begin
integer devin,devout;
long array n_name,i_name,o_name(1:2);
i:= i+1;
j:= system(4,i,param);
if (param(1) = long<:imc:>)
and (param(2) = long<::>) then
begin
if echo then write(z_write,<:*createlink.imc:>);
read_device_and_name(i,devout,o_name);
if echo then write(z_write,"nl",1);
ok:= link_device(2,devout,n_name,o_name,<:imc port :>);
end else
if (param(1) = long<:mailb:> add 'o')
and (param(2) = long<:x:>) then
begin
if echo then write(z_write,<:*createlink.mailbox:>);
read_device_and_name(i,devin,i_name);
read_device_and_name(i,devout,o_name);
if echo then write(z_write,"nl",1);
ok:= link_device(3,devout,n_name,o_name,<:mailbox out:>);
if ok then ok:= link_device(3,devin,n_name,i_name,<:mailbox in :>);
end else
if (param(1) = long<:adp32:> add '7')
and (param(2) = long<:0:>) or (param(1)=3270) then
begin
if echo then write(z_write,<:*createlink.3270:>);
read_device_and_name(i,devin,i_name);
read_device_and_name(i,devout,o_name);
if echo then write(z_write,"nl",1);
ok:= link_device(4,devin,n_name,i_name, <:3270 in :>);
if ok then ok:= link_device(5,devout,n_name,o_name,<:3270 out:>);
end else
if (param(1) = (long<:mirro:> add 'r'))
and (param(2) = long<::>) then
begin
if echo then write(z_write,<:*createlink.mirror:>);
read_device_and_name(i,devout,o_name);
if echo then write(z_write,"nl",1);
ok:= link_device(6,devout,n_name,o_name,<:adp mirror :>);
end else
if (param(1) = (long<:flopp:> add 'y'))
and (param(2) = long<::>) then
begin
if echo then write(z_write,<:*createlink.floppy:>);
read_device_and_name(i,devout,o_name);
if echo then write(z_write,"nl",1);
ok:= link_device(7,devout,n_name,o_name,<:floppy :>);
end else
if (param(1) = (long<:print:> add 'e'))
and (param(2) = long<:r:>) then
begin
if echo then write(z_write,<:*createlink.printer:>);
read_name(i,n_name);
ok:=n_name(1)<>long<::>;
if ok then begin
read_device_and_name(i,devout,o_name);
if echo then write(z_write,"nl",1);
ok:= link_device(8,devout,n_name,o_name,<:printer :>);
j:= system(4,i+1,param);
if ok and (j=space_name) and (param(1)=long<:reser:> add 'v')
and (param(2)=long<:e:>) then
begin
zone z(1,1,stderror);
i:= i + 1;
system(4,i+1,param);
if echo then write(z_write,<:*reserve.:>,param,"nl",1);
i:= i + 1;
if o_name(1) = long<::> then
begin
o_name(1):= param(1);
o_name(2):= param(2);
ok:= create_peripheral(o_name,devout);
end;
if ok then
begin
open(z,14,o_name,0);
getshare6(z,ia,1);
ia(4):= 8 shift 12;
ia(5):= ia(6):= ia(7):= 0;
laf:= 14;
ia.laf(1):= param(1); ia.laf(2):= param(2);
setshare6(z,ia,1);
monitor(16)send message:(z,1,ia);
j:= 1 shift monitor(18)wait answer:(z,1,ia) + ia(1);
if j<>2 then
begin
write(z_write,<:***crossload reserve printer, status = :>);
for k:= 0,k+1 while k<24 do
write(z_write,if j shift k < 0 then <:1:> else <:.:>);
write(z_write,"nl",1);
remove_device(devout,o_name,true);
end;
close(z,true);
end;
end;
end else write(z_write,<:*** crossload createlink.printer no printer name<10>:>);
end else
if (param(1) = (long<:conso:> add 'l'))
and (param(2) = long<:e:>) then
begin
if echo then write(z_write,<:*createlink.console:>);
read_name(i,n_name);
ok:=n_name(1)<>long<::>;
if ok then begin
read_device_and_name(i,devout,o_name);
if echo then write(z_write,"nl",1);
ok:= link_device(1,devout,n_name,o_name,<:console :>);
j:= system(4,i+1,param);
if ok and (j=space_name) and (param(1) = long<:print:> add 'l')
and (param(2) = long<:og:>) then
begin <* print s-log *>
zone z1,z2(128,1,stderror),z3(1,1,stderror);
integer array mess,answ,tail(1:20);
integer char,cl_wait;
open(z1,4,<:slogarea:>,0);
open(z2,8,o_name,0);
if echo then write(z_write,<:*printlog<10>:>);
if o_name(1) = long<::> then
begin
monitor(68)generate name:(z2,1,tail);
laf:= 2;
getzone6(z2,tail);
o_name(1):= tail.laf(1);
o_name(2):= tail.laf(2);
create_peripheral(o_name,devout);
end;
if (monitor(42)lookup entry:(z1,1,tail) = 0) and (tail(1)>0) then
begin
cl_wait:=10;
open(z3,0,<:clock:>,0);
close(z3,true);
repeat
getshare6(z2,mess,1);
mess(4):=0; <* sense console *>
setshare6(z2,mess,1);
monitor(16,z2,1,answ);
monitor(18,z2,1,answ);
if answ(1)<>0 then begin
getshare6(z3,mess,1);
mess(4):=0;
mess(5):=5; <* wait in 5.sec *>
setshare6(z3,mess,1);
monitor(16,z3,1,answ);
monitor(18,z3,1,answ);
end else cl_wait:=0;
cl_wait:=cl_wait-1;
until cl_wait<=0 ;
repeat
read_char(z1,char);
out_char(z2,char);
until char=25;
out_char(z2,10);
end;
close(z1,true);
setposition(z2,0,0);
close(z2,true);
getzone6(z_write,tail);
laf:= 2;
<* change output document to console *>
tail(1):= 8; <* kind *>
tail.laf(1):= o_name(1);
tail.laf(2):= o_name(2);
setzone6(z_write,tail);
end;
end else write(z_write,<:*** crossload createlink.console no console name<10>:>);
end else
if (param(1) = (long<:strea:> add 'm'))
and (param(2) = long<:er:>) then
begin
if echo then write(z_write,<:*createlink.streamer:>);
read_device_and_name(i,devout,o_name);
if echo then write(z_write,"nl",1);
ok:= link_device(9,devout,n_name,o_name,<:streamer :>);
end else
param_error(param,j);
end createlink;
i:= i+1;
j:= system(4,i,param);
if -,ok then errorbits:= log_or(errorbits,1 shift 0); <* ok.no *>
ok:=true; <* goto next createlink: not ok don't stop the program *>
end while;
monitor(10)release process:(z,i,ia);
end <* if ok *>;
mainparam:= startparam;
ok:=true; <* goto next main: not ok don't stop the program *>
end for each main;
end crossload;
i:= 1;
if system(4,1,param) shift (-12) = 6 <*=*> then
begin
fpproc(29,0,in,0); <* stack current input zone *>
system(4,0,param);
i:= 1 shift 1 + 1; <* one segment preferably on disc *>
fpproc(28,i,in,param); <* connect output *>
setposition(in,0,0);
if i <> 0 then
begin
write(out,<:<10>***crossload connect output, :>, case i of
(<:no resources:>,<:malfunction:>,<:not user:>,
<:convention error:>,<:not allowed:>,<:name format error:>),"nl",1);
end;
startparam:=2;
end else
startparam:= 1;
if i = 0 then
begin
crossload(in,startparam,true);
fpproc(34,0,in,'em'); <* close up *>
<* fp will unstack current input zone *>
end else
crossload(out,startparam,false);
end
▶EOF◀