|
|
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: 99072 (0x18300)
Types: TextFile
Names: »initamx4tx «
└─⟦01e83a425⟧ Bits:30008166 Bånd med SW8010 og SW8500 source code
└─⟦75ff9bef3⟧
└─⟦this⟧ »initamx4tx «
begin
<* this program is used for ncp testing ncp revision 6.00 and later versions
version 3.0 date 84.07.02 release 13 of system utility
version 3.1 date 85.03.05 hlv minirocs command
dump high core error for more than
129 words
printer command defaults defined
version 3.2 date 85.05.24 lbj a dumpprogram can be loaded in a rc3600
which returns the coredump to rc8000.
from version 2.0 knowledge is used about the layout
of the printer coroutines. The name of the amx-driver
and amx-channel is read from the ssp-printerdrivers process-
description. This is all done in the procedure 'terminal'*>
integer array kind(0:100),alphabet(0:127),shdescr(1:12),zdescr(1:20);
real array ra(0:100),param(1:2),ncptest_name(1:2);
integer sep,space_name,point_name,space_integer,point_integer,
s_text,p_text,s_number,p_number,type,paramno,start_pos,
last,anything,i,j,int,byte,text,octal,bit,all,
supdev_pointer,max_link,prog_chain,proc_chain,
record_length,giveup, last_get_addr,dump_size,
mask,words,firstcore,lastcore,file;
boolean ok,not_online,morelines,sp,nl,host_connected,coredump,
ncptest,syntax_error;
zone supdev(43,1,blockproc),dumpz(128,1,blockproc);
real array field raf;
integer array field iaf;
procedure commands;
begin
write(out,<:info :>,nl,1,
<:typein :>,nl,1,
<:end :>,nl,1,
<:host :>,nl,1,
<:core :>,nl,1,
<:set :>,nl,1,
<:prog :>,nl,1,
<:proc :>,nl,1,
<:table :>,nl,1,
<:devicetable :>,nl,1,
<:bufferpool :>,nl,1,
<:buf :>,nl,1,
<:dump :>,nl,1,
<:movedump :>,nl,1,
<:diagnostic :>,nl,1,
<:sendwait :>,nl,1,
<:terminal :>,nl,1,
<:printer :>,nl,1,
<:hdlcstat :>,nl,1,
<:minirocs :>,nl,1,
<:format :>,nl,1);
end;
procedure info;
begin
next_param(s_text);
write(out,<:call:<10>:>,sp,7,case convert_to_number(param) of (
<:ncptest typein<10>
' makes the program enter the conversational mode ':>,
<:end<10>
' makes the program leave the conversational mode ':>,
<::>,<::>,
<:host <devicehost no><10>
' connects the program to devicehost no <devicehost no> ':>,
<:core <first address>(.<last address>)<10>
' prints the core from <first address> to <last address> ':>,
<:set <word address>.<content1> ... <contenti><10>
' modifies the contents from <word address> and on
with <content1>.. ':>,
<:prog.<item>(.<chainstart>) <first address>(.<last address>)<10>
' prints from <first address> to <last address>
relative to program <item>. if <chainstart> is entered the value
is used as start of the programchain, in all later calls the value
is used ':>,
<:proc.<item>(.<chainstart>) <first address>(.<last address>)<10>
' prints from <first address> to <last address>
relative to process <item>. if <chainstart> is entered the value
is used as start of processchain, and the corresponding value for
programchain is calculated ':>,
<:table.<table number> (entry.<first entry>(.<last entry>)) ,
(<first address>(.<last address>))<10>
' prints <first entry> to <last entry> of NCP's table no <table no> ':>,
<:devicetable (<first entry>(.<last entry>)
(<first address>(.<last address>)))<10>
' prints <first entry> to <last entry> of NCP's devicetable
each entry from <first address> to <last address>':>,
<:bufferpool (<first descr>(.<last descr>))<10>
' prints <first descr> to <last descr> of NCP's bufferpool descriptions ':>,
<:buf receiver.<name>
sender.<name> receiver.<name>
sender.<name><10>
' prints MUS message buffers ':>,
<:dump.<file name><10>
' changes the input to a file containing a coredump ':>,
<:movedump tape.<mt name> file.<bs name>,
main.<mainproc> file.<bs name><10>
' moves a rc3600 coredump from the tape <mt name> to
the bs file <bs name> or loads the rc3600 with a dump
program and reads the coredump ':>,
<:diagnostic (process.all!<proc name>(.event)),
(list.running.delay.proc.prog),
(corout.<firstcor> (<first>(.<last>))),
(buffer.<head>),
(chain.<firstitem>(.<chainoffset>) (<first>(.<last>)))<10>
' prints a diagnostic of process description and their event
queue, the running queue and the delay queue, the process
chain and the program chain ':>,
<:sendwait name.<name> mess.<mess0>.<mess1>.<mess2>.<mess3><10>
' send a message and waits for an answer ':>,
<:terminal dhlink.<no> (lookup) ! ((type.<termtype>),
(timer.<intimer>(.<outtimer>)) (s.<stopbits>) (p.<parity>),
(l.<charlength>) (r.<inrate>(.<outrate>)) (dc1.<dctype>) (echo.<quest>),
(prompt.<char>) (cont.<quest>) (cont.<quest>) (conv.<quest>) (att.<att>)
(mess.<quest>))<10>
' initialises the terminalcoroutine with devicehost linkno. <no> '
<termtype>= 0..9 <intimer>,<outtimer>= 0..255
<stopbits>=(1,2) <parity>=(n,o,e) <charlength>=(5,6,7,8)
<inrate>,<outrate>=(40,50,75,110,134,150,200,220,300,600,
1200,2400,4800,9600)
<dctype>=(input,output,both,no)
<quest>=(yes,no) <att>=(ena,disa)
Default values = current terminal specs:>,
<:printer dhlink.<no> (timer.<timer>) (s.<stopbits>),
(p.<parity>) (l.<charlength>) (r.<bitrate>) (dc1.<quest>)
' initializes the terminalprinter with devicehost linkno. <no> '
<stopbits>=(1,2) <parity>=(n,o,e) <charlength>=(5,6,7,8)
<bitrate>=(40,50,75,110,134,150,200,220,300,600,1200,2400,4800,9600)
<quest>=(yes,no)
Defalut specs = timer.60 s.2 p.e l.7 r.1200 dc1.no:>,
<:hdlcstat name.<driver> chan.<no>,
<driver>=(hlc,hlc1,hlc2,hlc3) <no>=(0,1,2,3)
' the command writes the statistics from the hdlc driver':>,
<:minirocs,
' the command writes the minirocs device tables'
contents of table 1 and 2 are displayed in decimal and
all displayed numbers are in the interval 0..max:>,
<:format octal.decimal.byte.bit.text.all.words.<words per line>.window.<first>(.<last>)<10>
' changes the layout of coredumps'
- the different presentations of 16 bit words
words - the number of words printed on a line
window - the first and last address to be printed of coreitems:>,
<:command not found:>
),nl,1);
end;
procedure host;
begin
integer devicehost;
next_param(s_number);
if coredump then close(dumpz,true);
coredump:=false;
devicehost:=round param(1);
link_host(devicehost);
supdev_pointer:=0;
end host;
procedure core;
begin
integer first,last;
check_host_online;
write(out,nl,1,<:*** core ***:>,nl,1);
core_specifications(first,last);
first:=octal_to_decimal(first);
last:=octal_to_decimal(last);
print_core(0,first,last,mask,words);
end;
procedure prog;
begin
real r;
check_host_online;
next_param(p_text);
r:= param(1);
write(out,nl,1,<:*** program :>,string param(1),<: ***:>,nl,1);
type:= anything;
next_param(type);
if type=p_number then
prog_chain:= octal_to_decimal(round param(1))
else
paramno:= paramno-1;
print_item(12 shift 12,r);
end prog;
procedure proc;
begin
real r;
check_host_online;
next_param(p_text);
r:= param(1);
write(out,nl,1,<:*** process :>,string param(1),<: ***:>,nl,1);
type:= anything;
next_param(type);
if type=p_number then
begin
proc_chain:= octal_to_decimal(round param(1));
set_3600_address(proc_chain+10);
prog_chain:= get_3600_word;
end
else
paramno:= paramno-1;
print_item(10 shift 12,r);
end proc;
procedure set;
begin
integer i;
if host_connected then
begin
next_param(s_number);
i:=octal_to_decimal(round param(1));
next_param(p_number);
setposition(supdev,0,0);
getshare6(supdev,shdescr,1);
shdescr(4):= 8 shift 12;
shdescr(5):= i;
setshare6(supdev,shdescr,1);
monitor(16)send message:(supdev,1,shdescr);
monitor(18)wait answer :(supdev,1,shdescr);
supdev_pointer:= max_link;
setposition(supdev,0,0);
i:=octal_to_decimal(round param(1));
outrec6(supdev,2);
supdev.iaf(1):=i shift 8;
type:=anything;
next_param(type);
while type=s_number do
begin
i:=octal_to_decimal(round param(1)) extract 16;
setposition(supdev,0,0);
outrec6(supdev,2);
supdev.iaf(1):=i shift 8;
type:=anything;
next_param(type);
end;
paramno:=paramno-1;
setposition(supdev,0,0);
supdev_pointer:=0;
end
else
begin
write(out,nl,1,<:***ncptest: :>,if -,coredump then <:no devicehost connected:>
else <:coredump mode:>,nl,1);
ok:= false;
end;
end set;
procedure table;
begin
integer tabno,first,last,word,first_entry,last_entry;
integer array tabdescr(0:5);
boolean first_type;
next_param(p_number);
tabno:=round param(1);
type:=anything;
next_param(type);
first_entry:=last_entry:=-1;
if param(1)=real<:entry:> and type=s_text then
begin
next_param(p_number);
first_entry:=last_entry:=round param(1);
type:=anything;
next_param(type);
if type=p_number then
last_entry:=round param(1)
else
paramno:=paramno-1;
end
else
paramno:=paramno-1;
check_host_online;
write(out,nl,1,<:*** table :>,tabno,<: ***:>,nl,1);
if get_tabdescr(tabdescr,tabno) then
begin
addr_specifications(first,last);
first:=octal_to_decimal(first);
last:=octal_to_decimal(last);
if first_entry=-1 then
begin
first_entry:=0;
last_entry:=tabdescr(5)-1;
end;
if last>= tabdescr(2)//2 then last:=tabdescr(2)//2-1;
if first>last then first:=last;
if last_entry>= tabdescr(5) then last_entry:=tabdescr(5)-1;
if first_entry>last_entry then first_entry:=last_entry;
first_type:=true;
for i:=first_entry step 1 until last_entry do
begin
word:=tab_start(tabdescr,i);
if word<>0 then
begin
if -,first_type then typein else first_type:=false;
write(out,nl,1,<:entry no : :>,<<dddd>,i,nl,1);
print_core(word,first,last,mask,words);
end;
end for i;
end else type_text(<:table not found:>);
end table;
procedure devicetable;
begin
integer first,last,first_addr,last_addr,word,i;
integer array tabdescr(0:5);
boolean first_type;
long l;
check_host_online;
write(out,nl,1,<:*** devicetable, table 120 ***:>,nl,1);
if get_tabdescr(tabdescr,120) then
begin
addr_specifications(first,last);
if last>=tabdescr(5) then last:=tabdescr(5)-1;
if first>last then first:=last;
addr_specifications(first_addr,last_addr);
first_addr:=octal_to_decimal(first_addr);
last_addr:=octal_to_decimal(last_addr);
if last_addr>= tabdescr(2)//2 then
last_addr:= tabdescr(2)//2 - 1;
if first_addr > last_addr then first_addr:=last_addr;
first_type:=true;
for i:=first step 1 until last do
begin
if -,first_type then typein else first_type:=false;
word:=tab_start(tabdescr,i);
write(out,nl,1,<:entry no : :>,<<dddd>,i,nl,2,<:core : :>);
write_formatted(word,octal); write(out,nl,1);
for j:=1 step 1 until last_addr+1 do
begin
if j>first_addr then
begin
case j of
begin
begin
write(out,<: 0: device semaphore:>,sp,4,<:: :>);
write_formatted(get_3600_word,octal);
write(out,nl,1);
end;
begin
word:=get_3600_word;
write(out,<: 1: link request:>,sp,8,<:: :>,
case (word shift (-11) extract 3)+1 of
(<:lookup reserve:>,<:lookup link local:>,<:lookup link remote:>,
<:lookup:>,<:lookup release:>,<:create link:>,<::>,<::>),nl,1,
<: link kind:>,sp,11,<:: :>,case (word shift (-6) extract 2)+1 of
(<:no link:>,<:remote link:>,<:central link:>,<::>),nl,1,
<: link state:>,sp,10,<:: :>,case (word extract 5)+1 of
(<:online:>,<:reserving:>,<:repeat reserving:>,<:creating:>,
<:opening:>,<:opening no link:>,<:closing:>,<:removing:>,
<:closing no link:>,<:regret reservation:>,<:regret creation:>,
<:regret opening:>,<:offline:>,<:prepare:>,<::>,<::>),nl,1);
end;
write(out,<: 2: reserver host:>,sp,7,<:: :>,<<dddddd>,get_3600_word,nl,1);
write(out,<: 3: job host id:>,sp,9,<:: :>,<<dddddd>,get_3600_word,nl,1);
begin
word:=get_3600_word;
write(out,<: 4: link events:>,sp,9,<:: :>,
case (word shift (-10) extract 5)+1 of
(<:none:>,<:timeout:>,<:answer reserve ok:>,<:answer reserve not ok:>,
<:answer create ok:>,<:answer create not ok:>,<:answer open:>,
<:prepare:>,<:answer close:>,<:answer remove:>,<:request create:>,
<:request remove:>,<:job host down:>,<:reserver host down:>,
<:lookup link local:>,<:release link:>,<:answer reserve link local:>,
<:answer reserve lookup reserve:>,<:answer reserve repeat:>),nl,1,
<: job host linkno:>,sp,5,<:: :>,<<dddddd>,word extract 10,nl,1);
end;
write(out,<: 5: max buffersize:>,sp,6,<:: :>,<<dddddd>,
get_3600_word extract 13,nl,1);
begin
word:=get_3600_word;
write(out,<: 6: no of buffers:>,<<dddddd>,sp,7,<:: :>,
word shift (-8) extract 8,nl,1,
<: timer:>,sp,15,<:: :>,word extract 8,nl,1);
end;
begin
write(out,<: 7: device name:>,sp,9,<:: :>);
write_formatted(get_3600_word,text);
end;
write_formatted(get_3600_word,text);
write_formatted(get_3600_word,text);
write_formatted(get_3600_word,text);
write_formatted(get_3600_word,text);
begin
word:=get_3600_word;
write_formatted(word shift (-8),text);
write(out,nl,1,<:14: kind:>,sp,16,<:: :>,<<dddddd>,word extract 8,nl,1);
end;
begin
word:=get_3600_word;
write(out,<:15: access count:>,sp,8,<:: :>,<<dddddd>,word,nl,1);
end;
begin
l:= extend get_3600_word shift 16 add get_3600_word;
write(out,<:16: bytes transferred:>,sp,3,<:: :>,<<dddddd>,l,nl,1);
end;
;
end case;
end
else word:= get_3600_word;
end for j;
end for i;
end else type_text(<:devicetable not found:>);
end devicetable;
procedure bufferpool;
begin
integer first,last,word,i,j;
integer array tabdescr(0:5);
boolean first_type;
check_host_online;
write(out,nl,1,<:*** bufferpool descriptions, table 121 ***:>,nl,1);
if get_tabdescr(tabdescr,121) then
begin
addr_specifications(first,last);
if last>= tabdescr(5) then last:=tabdescr(5)-1;
if first>=last then first:=last;
first_type:=true;
for i:=first step 1 until last do
begin
word:=tab_start(tabdescr,i);
if word<>0 then
begin
if -,first_type then typein else first_type:=false;
write(out,nl,1,<:entry no : :>,<<dddd>,i extract 12,nl,1,case i+1 of(
<:terminal:>,<:mp0:>,<:mp1:>,<:mp2:>,<:mp3:>,<:mp4:>,<:mp5:>,<:ap0:>,
<:ap1:>,<:ap2:>,<:ap3:>,<:rtci:>,<:test:>,<:xmt hdlc:>,<:rec hdlc:>,<:router:>),
<: pool:>,nl,2);
write(out,<:core : :>);
write_formatted(word,octal);
type_text(<::>);
for j:=1 step 1 until tabdescr(2)//2 do
begin
case j of
begin
write(out,<: 0: type:>,sp,16,<:: :>,<<dddddd>,get_3600_word extract 3);
begin
write(out,<: 1: :>,sp,20,<:: :>);
write_formatted(get_3600_word,octal);
end;
begin
write(out,<: 2: pool semaphore:>,sp,6,<:: :>);
write_formatted(get_3600_word,octal);
end;
begin
write(out,<: 3: chain:>,sp,15,<:: :>);
write_formatted(get_3600_word,octal);
end;
write(out,<: 4: no of free buffers:>,sp,2,<:: :>,<<dddddd>,get_3600_word);
write(out,<: 5: no of buffers:>,sp,7,<:: :>,<<dddddd>,get_3600_word);
write(out,<: 6: size of buffers:>,sp,5,<:: :>,<<dddddd>,get_3600_word);
write(out,<: 7: minimal free count:>,sp,2,<:: :>,<<dddddd>,get_3600_word);
write(out,<:10: access count:>,sp,8,<:: :>,<<dddddd>,get_3600_word);
write(out,<:11: wait count:>,sp,10,<:: :>,<<dddddd>,get_3600_word);
end case;
type_text(<::>);
end for j;
end if word<>0;
end for i;
end else type_text(<:bufferpool not found:>);
end bufferpool;
procedure buf;
begin
check_host_online;
begin
real sender;
integer receiver,word,i,j,l,k,addr;
integer array messbuf(1:max_link);
boolean first_type;
real array field raf;
first_type:=true;
receiver:=0;
sender:=real<:ncp:>;
raf:=0;
type:=anything;
next_param(type);
if type=s_text and (param(1)=real<:sende:> add 'r') then
begin
next_param(p_text);
sender:=param(1);
end else paramno:=paramno-1;
type:=anything;
next_param(type);
if (type=s_text) and (param(1)=real<:recei:> add 'v') and (param(2)=real<:er:>) then
begin
next_param(p_text);
receiver:=description(param(1),10 shift 12);
end else paramno:=paramno-1;
addr:=description(sender,10 shift 12);
if addr <> 0 then
begin
set_3600_address(addr+9);
word:=get_3600_word;
if word<>0 then
begin
write(out,nl,1,<:*** message buffers ***:>,nl,1);
repeat
set_3600_address(word);
for i:= 1 step 1 until max_link do
messbuf(i):=get_3600_word;
i:= -1;
repeat
i:=i+1;
if messbuf(i*10+6)=receiver or receiver=0 or messbuf(i*10+6)=(-receiver) extract 16 then
begin
if -,first_type then typein else first_type:=false;
print_buf(word,i,messbuf);
end;
until messbuf(10*i+3)=0 or 10*(i+2)>maxlink or messbuf(i*10+3)<>word+(i+1)*10;
word:=messbuf(10*i+3);
until messbuf(10*i+3)=0;
end if word<>0;
end else write(out,nl,1,<:sender not found:>,nl,1);
end;
end buf;
procedure dump;
begin
integer array tail(1:10);
integer i,j,modekind;
zone z(1,1,stderror);
next_param(p_text);
if host_connected then remove_link;
if coredump then begin close(dumpz,true); coredump:= false end;
j:=i:=1;
open(z,0,string param(increase(i)),0);
i:=monitor(42)lookup entry:(z,1,tail);
close(z,true);
if i= 0 then
begin
if tail(1)<0 then
begin
real array field raf;
modekind:= tail(1) extract 23;
raf:=2;
j:=1;
open(dumpz,modekind,string tail.raf(increase(j)),giveup);
dump_size:= 0;
file:= tail(7);
setposition(dumpz,file,0);
end
else
begin
open(dumpz,4,string param(increase(j)),giveup);
dump_size:= tail(1);
file:= 0;
setposition(dumpz,0,0);
end;
j:=1;
write(out,nl,1,<:dump : :>,string param(increase(j)),nl,1);
record_length:=inrec6(dumpz,0);
max_link:=((record_length*3)//4) shift (-1) shift 1;
supdev_pointer:=0;
coredump:= true;
end
else
write(out,nl,1,<:***ncptest: dumpentry not found:>,nl,1);
end dump;
procedure movedump;
begin
integer field iff;
integer i,j,transferred,words,halfwords;
integer array tail(1:10);
boolean em;
procedure blockproc(z,s,b);
zone z;
integer s,b;
if s shift 7 < 0 then
em:= true else
if s shift 16 > 0 then
stderror(z,s,b);
next_param(s_text);
if param(1)<>real<:main:> then
begin
zone savezone(2*128,2*1,stderror),dumpzone(2*128,2*1,blockproc);
next_param(p_text);
i:=j:=1;
open(dumpzone,0,string param(increase(i)),0);
i:= monitor(42) lookup entry:(dumpzone,1,tail);
close(dumpzone,true);
if i = 0 and tail(1) < 0 then
begin
real array field raf;
i:= 1; raf:= 2;
open(dumpzone,tail(1) extract 23,string tail.raf(increase(i)),giveup);
setposition(dumpzone,tail(7),tail(8));
end else
begin
open(dumpzone,18,string param(increase(j)),giveup);
setposition(dumpzone,0,0);
end;
next_param(s_text); <* file. *>
i:=1;
next_param(p_text);
open(savezone,4,string param(increase(i)),0);
i:=monitor(42)lookup entry:(savezone,1,tail);
if i<>0 then
begin
tail(1):=1;
tail(2):=1;
for i:=3 step 1 until 10 do tail(i):=0;
i:=monitor(40)create entry:(savezone,1,tail);
end;
if i=0 then
begin
setposition(savezone,0,0);
transferred:=0;
halfwords:=inrec6(dumpzone,0); <* blocklength *>
words:=((halfwords*3)//4) shift (-1) shift 1;
<* convert to 16 bits words *>
em:= false;
inrec6(dumpzone,halfwords);
while (transferred < 65535) and -,em do
begin
iff:=2;
for j:=3 step 3 until words*2 do
begin
outchar(savezone,dumpzone.iff shift (-16));
outchar(savezone,dumpzone.iff shift (-8) extract 8);
outchar(savezone,dumpzone.iff extract 8);
iff:=iff+2;
end;
j:=3-j+words*2;
for i:=1,2 do if j>=i then
outchar(savezone,dumpzone.iff shift ((i-3)*8) extract 8);
transferred:=transferred+words;
inrec6(dumpzone,halfwords);
end;
write(savezone,false,768);
getposition(savezone,i,j);
monitor(42)lookup entry:(savezone,1,tail);
tail(1):= j+1;
tail(6):= systime(7,0,0.0);
monitor(44)change entry:(savezone,1,tail);
end
else
write(out,nl,1,<:***ncptest: error in create entry:>,nl,1);
close(savezone,true);
close(dumpzone,true);
end <* tapedump *>
else begin
zone savezone (128,1,stderror), dumpzone (128,1,stderror);
integer array field iaf;
iaf:= 0;
next_param(p_text);
i:=j:= 1;
open(dumpzone,14,string param(increase(i)),0);
next_param(s_text); <* file. *>
i:=1;
next_param(p_text);
open(savezone,4,string param(increase(i)),0);
i:=monitor(42)lookup entry:(savezone,1,tail);
if i<>0 then
begin
tail(1):= 171;
tail(2):= 1;
for i:=3 step 1 until 10 do tail(i):=0;
i:=monitor(40)create entry:(savezone,1,tail);
end;
if i=0 then
begin
monitor(8)reserve process :(dumpzone,1,shdescr);
getshare6(dumpzone,shdescr,1);
shdescr(4):= 4 shift 12; <* reset *>
setshare6(dumpzone,shdescr,1);
monitor(16)send message:(dumpzone,1,shdescr);
monitor(18)wait answer:(dumpzone,1,shdescr);
getshare6(dumpzone,shdescr,1);
shdescr(4):= 6 shift 12 + 1; <* autoload, receive status *>
setshare6(dumpzone,shdescr,1);
outrec6(dumpzone,342);
monitor(16)send message :(dumpzone,1,shdescr);
monitor(18)wait answer:(dumpzone,1,shdescr);
getzone6(dumpzone,zdescr);
getshare6(dumpzone,shdescr,1);
shdescr(4):= 5 shift 12 + 0; <* transmit block *>
shdescr(5):= zdescr(19)+1;
shdescr(6):= zdescr(19)+1+342-2;
shdescr(7):= 512; <* size in bytes *>
shdescr(8):= 0; <* startbyte *>
setshare6(dumpzone,shdescr,1);
; <* .loc 0 *>
dumpzone.iaf(1):= 257 shift 8 + 26049 shift (-8) ; <* jmp .+1 *>
dumpzone.iaf(2):= 26049 shift 16 + 12317 ; <* dicp 0,1 enable hic *>
; <* lda 2,addr *>
dumpzone.iaf(3):= 14366 shift 8 + 10267 shift (-8) ; <* lda 3,buf *>
dumpzone.iaf(4):= 10267 shift 16 +8704 ; <* lda 1,m384 *>
; <* lda 0,0,2 *>
dumpzone.iaf(5):= 17152 shift 8 + 54016 shift (-8) ; <* sta 0,0,3 *>
dumpzone.iaf(6):= 54016 shift 16 + 64256 ; <* inc 2,2 *>
; <* inc 3,3 *>
dumpzone.iaf(7):= 43780 shift 8 + 5 shift (-8) ; <* inc 1,1,szr *>
dumpzone.iaf(8):= 5 shift 16 + 257 ; <* jmp 5 *>
; <* jmp .+1 *>
dumpzone.iaf(9):= 8222 shift 8 + 25088 shift (-8) ; <* lda 0,buf *>
dumpzone.iaf(10):= 25088 shift 16 + 8220 ; <* doa 0,0 *>
; <* lda 0,m768 *>
dumpzone.iaf(11):= 25600 shift 8 + 28224 shift (-8) ; <* dob 0,0 *>
dumpzone.iaf(12):=28224 shift 16 + 26432 ; <* docs 1,0 *>
; <* skpbz 0 *>
dumpzone.iaf(13):=511 shift 8 + 25856 shift (-8) ; <* jmp .-1 *>
dumpzone.iaf(14):=25856 shift 16 + 33284 ; <* dic 0,0 *>
; <* mov 0,0,szr *>
dumpzone.iaf(15):=26175 shift 8 + 8219 shift (-8) ; <* halt *>
dumpzone.iaf(16):=8219 shift 16 + 12317 ; <* lda 0,m384 *>
; <* lda 2,addr *>
dumpzone.iaf(17):=38144 shift 8 + 20509 shift (-8) ; <* sub 0,2 *>
dumpzone.iaf(18):=20509 shift 16 + 2 ; <* sta 2,addr *>
; <* jmp 2 *>
dumpzone.iaf(19):=65152 shift 8 + 64768 shift (-8) ; <*m384: -384 *>
dumpzone.iaf(20):=64768 shift 16 + 0 ; <*m768: -768 *>
; <*addr: 0 *>
dumpzone.iaf(21):= 32320 shift 8 ; <*buf: 8'77100 *>
; <* .loc 8'277 *>
dumpzone.iaf(128):= 63 ; <* 8'77 *>
dumpzone.iaf(129):=26943 shift 8 + 8702 shift (-8) ; <* reads 1 *>
dumpzone.iaf(130):=8702 shift 16 + 42752 ; <* lda 0,.-2 *>
; <* and 1,0 *>
dumpzone.iaf(131):=10454 shift 8 + 36352 shift (-8) ; <* lda 1,8'326 *>
dumpzone.iaf(132):=36352 shift 16 + 18646 ; <* add 0,1 *>
; <* sta 1,8'326 *>
dumpzone.iaf(133):=33536 shift 8 + 10253 shift (-8) ; <* inc 0,0 *>
dumpzone.iaf(134):=10253 shift 16 + 36352 ; <* lda 1,13. *>
; <* add 0,1 *>
dumpzone.iaf(135):=18445 shift 8 + 10255 shift (-8) ; <* sta 1,13. *>
dumpzone.iaf(136):=10255 shift 16 +36352 ; <* lda 1,15. *>
; <* add 0,1 *>
dumpzone.iaf(137):=18447 shift 8 + 10256 shift (-8) ; <* sta 1,15. *>
dumpzone.iaf(138):=10256 shift 16 + 36352 ; <* lda 1,16. *>
; <* add 0,1 *>
dumpzone.iaf(139):=18448 shift 8 + 10257 shift (-8) ; <* sta 1,16. *>
dumpzone.iaf(140):=10257 shift 16 + 36352 ; <* lda 1,17. *>
; <* add 0,1 *>
dumpzone.iaf(141):=18449 shift 8 + 10259 shift (-8) ; <* sta 1,17. *>
dumpzone.iaf(142):=10259 shift 16 + 36352 ; <* lda 1,19. *>
; <* add 0,1 *>
dumpzone.iaf(143):=18451 shift 8 + 26432 shift (-8) ; <* sta 1,19. *>
dumpzone.iaf(144):=26432 shift 16 + 511 ; <* skpbz 0 *>
; <* jmp .-1 *>
dumpzone.iaf(145):=10470 shift 8 + 36352 shift (-8) ; <* lda 1,346 *>
dumpzone.iaf(146):=36352 shift 16 + 18662 ; <* add 0,1 *>
; <* sta 1,346 *>
dumpzone.iaf(147):=10467 shift 8 + 36352 shift (-8) ; <* lda 1,343 *>
dumpzone.iaf(148):=36352 shift 16 + 18659 ; <* add 0,1 *>
; <* sta 1,343 *>
dumpzone.iaf(149):=10468 shift 8 +36352 shift (-8) ; <* lda 1,344 *>
dumpzone.iaf(150):=36352 shift 16 + 18660 ; <* add 0,1 *>
; <* sta 1,344 *>
dumpzone.iaf(151):= 34128 shift 8 + 33472 shift (-8); <* subzl 0,0 *>
dumpzone.iaf(152):= 33472 shift 16 + 26176 ; <* movs 0,0 *>
; <* docs 0,0 *>
dumpzone.iaf(153):=26432 shift 8 + 511 shift (-8) ; <* skpbz 0 *>
dumpzone.iaf(154):=511 shift 16 + 25856 ; <* jmp .-1 *>
; <* dic 0,0 *>
dumpzone.iaf(155):=33284 shift 8 + 26175 shift (-8) ; <* mov 0,0,szr *>
dumpzone.iaf(156):=26175 shift 16 + 0 ; <* halt *>
; <* jmp 0 *>
; <* .loc 8'377 *>
dumpzone.iaf(171):= 192 shift 8 ; <* jmp 8'300 *>
monitor(16)send message :(dumpzone,1,shdescr);
check(dumpzone);
changerec6(dumpzone,512);
getshare6(dumpzone,shdescr,1);
shdescr(4):= 3 shift 12 + 1; <* send statusbyte *>
shdescr(6):= shdescr(5) + 512 -2;
shdescr(7):= 768; <* bytecount *>
shdescr(8):= 0; <* statusbyte *>
setshare6(dumpzone,shdescr,1);
monitor(16) send message :(dumpzone,1,shdescr);
check(dumpzone);
<* the first message will give a reset status *>
for i:= 1 step 1 until 171 do
begin
outrec6(savezone,512);
monitor(16)send message :(dumpzone,1,shdescr);
check(dumpzone);
tofrom(savezone,dumpzone,512);
end;
changerec6(dumpzone,0);
close(savezone,true);
close(dumpzone,false);
monitor(10)release process:(dumpzone,1,shdescr);
monitor(42)lookup entry:(savezone,1,tail);
tail(1):= 171;
tail(6):= systime(7,0,0.0);
monitor(44)change entry:(savezone,1,tail);
end
else
write(out,nl,1,<:***ncptest: error in create entry:>,nl,1);
end;
end movedump;
procedure diagnostic;
begin
integer word,process,first,last,i;
boolean first_type,event,all_process,more_diagnostic;
check_host_online;
event:=all_process:=false;
first_type:=more_diagnostic:=true;
while more_diagnostic do
begin
type:=anything;
next_param(type);
if type=s_text and param(1)=(real<:proce:> add 's') and param(2)=real<:s:> then
begin
next_param(p_text);
if param(1)=real<:all:> and param(2)=real<::> then
all_process:=true
else
process:=description(param(1),10 shift 12);
type:=anything;
next_param(type);
if type=p_text and param(1)=real<:event:> and param(2)=real<::> then
event:=true
else paramno:=paramno-1;
write(out,nl,1,<:*** processes in process chain ***:>,nl,1);
if -,all_process then
begin
if process<>0 then
begin
print_process(process,event);
end
else write(out,nl,1,<:process not found:>,nl,1);
end else
begin
if proc_chain=0 then
begin
set_3600_address(44);
word:= get_3600_word;
end else
word:= proc_chain;
set_3600_address(word+2);
word:=get_3600_word;
while word<>0 do
begin
if -,first_type then typein else first_type:=false;
print_process(word,event);
set_3600_address(word+2);
word:=get_3600_word;
end;
end;
end else
if type=s_text and param(1)=real<:list:> then
begin
next_param(p_text);
repeat
if param(1)=(real<:runni:> add 'n') and param(2)=real<:g:> then
begin
write(out,nl,1,<:*** processes in running queue ***:>,nl,2);
print_process_queue(32);
end else
if param(1)=real<:delay:> then
begin
write(out,nl,1,<:*** processes in delay queue ***:>,nl,2);
print_process_queue(39);
end else
if param(1)=real<:proc:> then
begin
write(out,nl,1,<:*** process chain ***:>,nl,2);
print_process_chain(34);
end else
if param(1)=real<:prog:> then
begin
write(out,<:<10>*** program chain ***<10><10>:>);
print_process_chain(42);
end;
type:= anything;
next_param(type);
until type<>p_text;
paramno:= paramno-1;
end else
if param(1) = real<:corou:> add 't' then
begin
integer first_corout;
next_param(p_number);
write(out,nl,1,<:*** coroutine chain ***:>,nl,1);
word:= octal_to_decimal(round param(1));
core_specifications(first,last);
print_chain(word,first,last,0,true);
end else
if param(1) = real<:buffe:> add 'r' then
begin
next_param(p_number);
write(out,nl,1,<:*** buffer queue ***:>,nl,1);
word:= octal_to_decimal(round param(1));
print_buffer_queue(word);
end else
if param(1) = real<:chain:> then
begin
next_param(p_number);
write(out,nl,1,<:*** chain ***:>,nl,1);
word:= octal_to_decimal(round param(1));
type:= anything;
next_param(type);
if type = p_number then
i:= octal_to_decimal(round param(1))
else
begin
i:= 0;
paramno:= paramno-1;
end;
core_specifications(first,last);
print_chain(word,first,last,i,false);
end else
begin
paramno:= paramno-1;
more_diagnostic:= false;
end;
end while more_diagnostic;
end diagnostic;
procedure sendwait;
begin
real work; integer i,j;
if host_connected then
begin
next_param(s_text);
getshare6(supdev,shdescr,1);
if param(1)=real<:name:> and param(2)=real<::> then
begin
next_param(p_text);
work:=param(1);
for i:=1 step 1 until 6 do
begin
j:=work shift (-40) extract 8;
if j>=97 and j<=122 then j:=j-32;
work:=(work shift 8) add j;
end;
shdescr(4):=14 shift 12;
shdescr(6):=work shift (-24) extract 24;
shdescr(7):=work extract 24;
next_param(s_text);
if param(1)=real<:mess:> and param(2)=real<::> then
begin
next_param(p_number); <* mess0 *>
i:=octal_to_decimal(round param(1)) extract 2;
<* input = 1; output = 3 *>
shdescr(8):= (octal_to_decimal(round param(1))) shift 8;
next_param(p_number); <* mess1 *>
j:=octal_to_decimal(round param(1));
<* bytecount *>
shdescr(9):= octal_to_decimal(round param(1));
next_param(p_number); <* mess2 *>
shdescr(10):= (octal_to_decimal(round param(1))) shift 8;
next_param(p_number); <* mess3 *>
shdescr(11):= octal_to_decimal(round param(1));
setshare6(supdev,shdescr,1);
monitor(16)send message:(supdev,1,shdescr);
monitor(18)wait answer:(supdev,1,shdescr);
if i = 1 then
begin <* input message *>
if j > max_link * 2 then j:=max_link * 2;
j:=((j+2)//3)*2;
if j > record_length -2 then j:=record_length -2
else
if j = 0 then j:=2;
getzone6(supdev,zdescr);
getshare6(supdev,shdescr,1);
shdescr(4):= 3 shift 12 + 1;
shdescr(5):= zdescr(19) + 1;
shdescr(6):= zdescr(19) + 1 + (j-2);
setshare6(supdev,shdescr,1);
zdescr(14):= zdescr(19);
zdescr(15):= zdescr(19) + zdescr(20);
zdescr(16):= j+2;
setzone6(supdev,zdescr);
monitor(16)send message :(supdev,1,shdescr);
monitor(18)wait answer :(supdev,1,shdescr);
write(out,nl,1,<:*** input ***:>,nl,2,<:status : :>);
write_formatted(shdescr(1) shift (-12),bit);
write(out,nl,1,<:bytecount : :>,shdescr(3),nl,1);
supdev_pointer:= 0;
j:= (shdescr(3) + 1)// 2;
for i:= 1 step 1 until j do
begin
write(out,nl,1,<<ddd>,i-1,<: : :>);
write_formatted(get_3600_word,all);
end;
supdev_pointer:= max_link;
write(out,nl,1);
end
else if i = 3 then
begin <* output *>
<* later *>
end else
begin <* control *>
if shdescr(1)<>0 then
write(out,nl,1,<:***ncptest: sequence error:>,nl,1)
else
begin
write(out,nl,1,<:*** answer ***:>,nl,2,<:mess0: :>);
write_formatted(shdescr(5) shift (-8),all);
write(out,nl,1,<:mess1: :>);
write_formatted(shdescr(6),all);
write(out,nl,1,<:mess2: :>);
write_formatted(shdescr(7) shift (-8),all);
write(out,nl,1,<:mess3: :>);
write_formatted(shdescr(8),all);
write(out,nl,1);
end;
end;
end else paramno:=paramno-1;
end else paramno:=paramno-1;
end else
begin
write(out,nl,1,<:***ncptest: :>);
write(out,if -,coredump then <:no devicehost connected:>
else <:coredump mode:>,nl,1);
ok:= false;
end;
end sendwait;
procedure terminal(device);
integer device;
begin
integer procedure convert_speed(speed);
integer speed;
begin
integer j;
convert_speed:= 2;
for j:=1 step 1 until 14 do
if speed= (case j of (9600,4800,2400,1200,600,300,220,200,
150,134,110,75,50,40)) then convert_speed:=j-1;
end convert_speed;
procedure write_speed(spec);
integer spec;
write(out,case spec extract 4 +1 of (<:9600:>,
<:4800:>,<:2400:>,<:1200:>,<:600:>,<:300:>,<:220:>,<:200:>,<:150:>,
<:134:>,<:110:>,<:75:>,<:50:>,<:40:>,<::>,<::>));
integer l;
l:= 1;
if host_connected then
begin
integer linkno,timer,otimer,termtype,spec,i,j,k,status,chan,prompt,att;
integer array tabdescr(0:5);
boolean finis_terminal;
next_param(s_text);
if param(1)=real<:dhlin:> add 'k' and param(2)=real<::> then
begin
next_param(p_number);
linkno:= round param(1);
if device = 0 then <* terminal *>
begin
getshare6(supdev,shdescr,1);
shdescr(4):= 18 shift 12; <* lookup specs *>
shdescr(8):= linkno shift 8;
setshare6(supdev,shdescr,1);
monitor(16)send message:(supdev,1,shdescr);
i:=monitor(18)wait answer:(supdev,1,shdescr);
if shdescr(1)<> 0 or i<>1 then <* old release of ncp *>
begin
otimer:=timer:= 60; prompt:= 7;
att:= 0;
termtype:= 12 shift 8 + 1;
spec:= 1 shift 15 + 1 shift 12 + 1 shift 10 + 1 shift 8 +
2 shift 4 + 2;
end else
begin
otimer:=timer:= shdescr(7) shift (-8);
att:= shdescr(3);
termtype:= shdescr(2);
spec:= shdescr(8);
prompt:= shdescr(4) shift (-8);
end;
end else
begin <* printer defaults *>
timer:= 60;
spec:= 1 shift 15 + 1 shift 12 + 1 shift 10 + 1 shift 8 +
3 shift 4 + 3;
end;
finis_terminal:= false;
while -,finis_terminal do
begin
type:=anything;
next_param(type);
if type=s_text and param(1)=real<:type:> and param(2)=real<::> then
begin
next_param(p_number);
if round param(1) < 10 then
termtype:= termtype - termtype extract 8 + round param(1);
end else
if type=s_text and param(1)=real<:timer:> and param(2)=real<::> then
begin
next_param(p_number);
timer:= timer - timer extract 8 + round param(1);
type:=anything;
next_param(type);
if type=p_number then
otimer:= round param(1)
else
paramno:= paramno-1;
end else
if type=s_text and param(1)=real<:s:> and param(2)=real<::> then
begin
next_param(p_number);
spec:= spec - spec extract 13 + spec extract 12;
if round param(1) <> 1 then spec:= spec + 1 shift 12;
end else
if type=s_text and param(1)=real<:p:> and param(2)=real<::> then
begin
next_param(p_text);
spec:= spec - spec extract 12 + spec extract 10;
termtype:= termtype - termtype extract 11 + termtype extract 10;
if param(1)=real<:n:> and param(2)=real<::> then i:=2 else
if param(1)=real<:o:> and param(2)=real<::> then i:= 0 else
begin <* even parity *>
i:= 1;
termtype:= termtype + 1 shift 10; <* soft parity *>
end;
spec:=spec+ i shift 10;
end else
if type=s_text and param(1)=real<:l:> and param(2)=real<::> then
begin
next_param(p_number);
spec:= spec - spec extract 10 + spec extract 8;
i:=round param(1);
j:= 0;
if i<=8 and i>0 then
begin
case i of
begin
;
;
;
;
j:= 0;
j:= 2;
j:= 1;
j:= 3;
end case;
end;
spec:= spec + j shift 8;
end else
if type=s_text and param(1)=real<:r:> and param(2)=real<::> then
begin
next_param(p_number);
spec:= spec - spec extract 8;
j:=k:=convert_speed(round param(1));
type:= anything;
next_param(type);
if type=p_number then
k:= convert_speed(round param(1))
else
paramno:=paramno-1;
spec:= spec + j shift 4 + k;
end else
if type=s_text and param(1)=real<:dc1:> and param(2)=real<::> then
begin
next_param(p_text);
spec:= spec - spec extract 15 + spec extract 13;
i:= 0;
if device = 0 then
begin
if param(1)=real<:input:> then i:= 2 else
if param(1)=real<:outpu:> add 't' then i:= 3 else
if param(1)=real<:both:> then i:= 1;
end else <* printer *>
if param(1)=real<:yes:> then i:= 3;
spec:= spec + i shift 13;
end else
if type=s_text and param(1)=real<:echo:> then
begin
next_param(p_text);
termtype:=termtype-termtype extract 12 + termtype extract 11;
if param(1)=real<:yes:> then
termtype:= termtype+1 shift 11;
end else
if type=s_text and param(1)=real<:conv:> then
begin
termtype:= termtype-termtype extract 16 + termtype extract 15;
next_param(p_text);
if param(1)=real<:yes:> then
termtype:= termtype + 1 shift 15;
end else
if type=s_text and param(1)=real<:promp:> add 't' then
begin
next_param(p_number);
prompt:= round param(1);
end else
if type = s_text and param(1)=real<:cont:> then
begin
next_param(p_text);
termtype:= termtype-termtype extract 14 + termtype extract 13;
if param(1)=real<:yes:> then
termtype:= termtype+1 shift 13;
end else
if type = s_text and param(1)=real<:att:> then
begin
next_param(p_text);
att:= att - att extract 22 + att extract 21;
if param(1)=real<:disa:> then
att:= att + 1 shift 21;
end else
if type = s_text and param(1)=real<:mess:> then
begin
next_param(p_text);
att:= att - att extract 21 + att extract 20;
if param(1)=real<:no:> then
att:= att + 1 shift 20;
end else
finis_terminal:= true;
end while;
if ((param(1)=real<:looku:> add 'p') and device=0) then
begin
write(out,<<d>,<:terminal dhlink.:>,linkno,<: type.:>,termtype extract 8,
<: timer.:>,timer extract 8,<: s.:>,if spec shift(-12) extract 1=1
then <:2:> else <:1:>,<: p.:>,case spec shift(-10) extract 2 +1 of
(<:o:>,<:e:>,<:n:>,<::>),<: l.:>,case spec shift(-8) extract 2 + 1 of
(<:5:>,<:7:>,<:6:>,<:8:>),<: r.:>);
i:= spec extract 4;
j:= ( spec shift (-4) ) extract 4;
write_speed(j);
if i<>j then
begin
write(out,<:.:>);
write_speed(i);
end;
write(out,<<d>,<: dc1.:>,case spec shift(-13) extract 2 +1 of
(<:no:>,<:both:>,<:input:>,<:output:>),<:<10>:>,
<:echo.:>,if termtype shift(-11) extract 1<>0 then <:yes:>
else <:no:>,<: conv.:>,if termtype shift(-15) extract 1<>0 then <:yes:>
else <:no:>,<: prompt.:>,prompt extract 8,<: cont.:>,
if termtype shift(-13) extract 1<>0 then <:yes:> else <:no:>,
<: att.:>,if att shift 2 >= 0 then <:ena:> else <:disa:>,
<: mess.:>,if att shift 3 >= 0 then <:yes:> else <:no:>,<:<10>:>);
end else
begin
paramno:=paramno-1;
if device=0 then <* terminal *>
begin <* init input channel and coroutine parameters *>
getshare6(supdev,shdescr,1);
shdescr(4):= 16 shift 12 + 3;
<* mode=3 indicates to core3600 release 3.0 of ncptest *>
shdescr(5):= termtype;
shdescr(6):= att;
shdescr(7):= prompt shift 8;
shdescr(8):= linkno shift 8;
shdescr(9):= otimer shift 8;
shdescr(10):= timer shift 8;
shdescr(11):= spec;
setshare6(supdev,shdescr,1);
monitor(16)send message:(supdev,1,shdescr);
monitor(18)wait answer:(supdev,1,shdescr);
if shdescr(1)<>0 then
write(out,nl,1,<:***:>,string ncptest_name(increase(l)),
<:: terminal not found:>,nl,1);
end else <* printer *>
begin
if get_tabdescr(tabdescr,120) and tabdescr(5)> linkno then
begin <* devicetable *>
i:= tab_start(tabdescr,linkno);
i:= get_3600_word; <* entry semaphore *>
set_3600_address(i+17); <* address of ssp name *>
i:= get_3600_word;
set_3600_address(i);
i:= get_3600_word;
i:= description(supdev.raf(1)<*ssp name*>,10 shift 12);
if i<>0 then
begin
set_3600_address(i+26);
i:= get_3600_word;
param(1):= supdev.raf(1); <* name of amx driver *>
chan:= supdev.iaf(11) extract 8; <* amx channel *>
getshare6(supdev,shdescr,1);
shdescr(4):= 14 shift 12;
shdescr(6):= param.iaf(1);
shdescr(7):= param.iaf(2);
shdescr(8):= (chan shift 8 + 32) shift 8;
shdescr(10):= (timer shift 8 + timer) shift 8;
shdescr(11):= spec;
setshare6(supdev,shdescr,1);
monitor(16)send message:(supdev,1,shdescr);
monitor(18)wait answer:(supdev,1,shdescr);
status:= shdescr(5) shift (-8);
if status<>0 then
begin
write(out,nl,1,<:***:>,string ncptest_name(increase(l)),
<:: status: :>);
write_formatted(status,octal);
write(out,nl,1);
end;
end;
end else
write(out,nl,1,<:***:>,string ncptest_name(increase(l)),
<:: printer not found:>,nl,1);
end;
end;
end else
begin
write(out,nl,1,<:***:>,string ncptest_name(increase(l)),
<:: no linknumber specified:>,nl,1);
ok:= false;
end;
end else
begin
write(out,nl,1,<:***:>,string ncptest_name(increase(l)),<:::>,
if -,coredump then <: no devicehost connected:>
else <: coredump mode:>,nl,1);
ok:= false;
end;
end terminal;
procedure hdlcstat;
begin
integer i,j,chan;
long l;
real work;
if host_connected then
begin
next_param(s_text);
getshare6(supdev,shdescr,1);
if param(1)=real<:name:> and param(2)=real<::> then
begin
next_param(p_text);
work:=param(1);
for i:=1 step 1 until 6 do
begin
j:=work shift (-40) extract 8;
if j>=97 and j<=122 then j:=j-32;
work:=(work shift 8) add j;
end;
shdescr(4):=14 shift 12;
shdescr(6):=work shift (-24) extract 24;
shdescr(7):=work extract 24;
next_param(s_text);
if param(1)=real<:chan:> and param(2)=real<::> then
begin
next_param(p_number);
chan:=round param(1) extract 2;
<* mess0 *>
shdescr(8):= (chan shift 6 + 1) shift 8;
<* bytecount *>
shdescr(9):= 50;
setshare6(supdev,shdescr,1);
monitor(16)send message:(supdev,1,shdescr);
monitor(18)wait answer:(supdev,1,shdescr);
getzone6(supdev,zdescr);
getshare6(supdev,shdescr,1);
shdescr(4):= 3 shift 12 + 1;
shdescr(5):= zdescr(19) + 1;
shdescr(6):= zdescr(19) + 1 + 50-2;
setshare6(supdev,shdescr,1);
zdescr(14):= zdescr(19);
zdescr(15):= zdescr(19) + zdescr(20);
zdescr(16):= 50+2;
setzone6(supdev,zdescr);
monitor(16)send message :(supdev,1,shdescr);
monitor(18)wait answer :(supdev,1,shdescr);
write(out,nl,1,<:*** hdlc statistics ***:>,nl,1,
<:name.:>,string work,<: chan.:>,chan,nl,1);
if shdescr(1) shift(-12) <> 0 then
begin
write(out,<:status ::>);
write_formatted(shdescr(1) shift(-12),bit);
write(out,nl,1);
end else
begin
supdev_pointer:= 0;
j:= (shdescr(3) + 1)// 2;
if j>17 then j:= 17;
for i:= 1 step 1 until j do
begin
case i of
begin
begin
l:= extend get_3600_word shift 16 add get_3600_word;
write(out,<:rec errorfree packets : :>,<<dddddd>,l,nl,1);
end;
;
begin
l:= extend get_3600_word shift 16 add get_3600_word;
write(out,<:xmt errorfree packets : :>,<<dddddd>,l,nl,1);
end;
;
begin
l:= extend get_3600_word shift 16 add get_3600_word;
write(out,<:rec error packets : :>,<<dddddd>,l,nl,1);
end;
;
begin
l:= extend get_3600_word shift 16 add get_3600_word;
write(out,<:re xmt packets : :>,<<dddddd>,l,nl,1);
end;
;
write(out,<:rec RNR packets : :>,<<dddddd>,get_3600_word,nl,1);
write(out,<:xmt RNR packets : :>,<<dddddd>,get_3600_word,nl,1);
write(out,<:rec REJ packets : :>,<<dddddd>,get_3600_word,nl,1);
write(out,<:xmt REJ packets : :>,<<dddddd>,get_3600_word,nl,1);
write(out,<:re xmt by timeout : :>,<<dddddd>,get_3600_word,nl,1);
write(out,<:DSR being off : :>,<<dddddd>,get_3600_word,nl,1);
write(out,<:CD being off : :>,<<dddddd>,get_3600_word,nl,1);
write(out,<:CI being off : :>,<<dddddd>,get_3600_word,nl,1);
write(out,<:RFS being off : :>,<<dddddd>,get_3600_word,nl,1);
end case;
end;
supdev_pointer:= max_link;
end;
end else begin
write(out,<:***ncptest: no channel:>,nl,1);
ok:= false;
end;
end else begin
write(out,<:***ncptest: no driver:>,nl,1);
ok:= false;
end;
end else begin write(out,<:***ncptest: :>,if -,coredump then
<:no devicehost connected:> else <:coredump mode:>,nl,1);
ok:= false;
end;
end hdlcstat;
procedure minirocs;
begin
integer e, i, j, k, l, tableadr, ibmdv, tab1, tab2, links, lines, dispno;
real array name(1:2);
procedure wo( text, v, n );
value v, n; string text; integer v, n;
begin
integer i;
write( out, text );
for i:= 15 step -3 until 0 do
write(out, <<d>, v shift (-i) extract 3 );
write(out, nl, n );
end;
l:= 1;
tableadr:= 0; ibmdv:= 0; tab1:= 0; tab2:= 0; links:= 0; lines:= 0;
check_host_online;
tableadr:= description( real<:TABLE:>, 10 shift 12 );
if tableadr = 0 then
begin
write(out,nl,1,<:***:>,string ncptest_name(increase(l)),<:::>,
<: MINIROCS module TABLE not found:>,nl,1);
ok:= false; goto exit;
end;
set_3600_address( tableadr-10 );
links:= get_3600_word; lines:= get_3600_word;
wo( <:links : :>, links , 0 );
wo( <: lines : :>, lines , 1 );
wo( <:menuchar: :>, get_3600_word , 1 );
tab1:= get_3600_word; tab2:= get_3600_word;
wo( <:tab1 : :>, tab1, 0 );
wo( <: tab2 : :>, tab2, 1 );
wo( <:menuaddr: :>, get_3600_word, 0 );
wo( <: menusize: :>, get_3600_word, 1 );
ibmdv:= description( real<:IBMDV:>, 12 shift 12 );
if ibmdv = 0 then
begin
write(out,nl,1,<:***:>,string ncptest_name(increase(l)),<:::>,
<: MINIROCS module IBMDV not found:>,nl,1);
ok:= false; goto exit;
end;
if (links = 0) or (links > 8) or (lines = 0) or (lines > 8) then
begin
write(out,nl,1,<:***:>,string ncptest_name(increase(l)),<:::>,
<: MINIROCS lines/links inconsistency:>, nl,1);
ok:= false; goto exit;
end;
write(out, <:konfiguration table::> );
<* display ibmdv konfiguration table *>
set_3600_address( ibmdv+15 );
for i:= 1 step 1 until 8 do
begin
write( out, nl, 1, <: line :>, i, <: : :> );
for j:= 1 step 1 until 16 do
begin
k:= get_3600_word;
if (k shift (-8) extract 8) <> 0 then
write(out, sp, 1, k shift (-8) extract 8 );
if (k extract 8) <> 0 then
write(out, sp, 1, k extract 8 );
end;
end;
write(out, nl, 1);
if (tab1 < ibmdv) or (tab2 < ibmdv) then
begin
write(out,nl,1,<:***:>,string ncptest_name(increase(l)),<:::>,
<: MINIROCS tab1/tab2 address inconsistency:>, nl,1);
ok:= false; goto exit;
end;
typein; dispno:= 0;
write(out, <:Table 1 : RC8000 -> Line Address Transformation:>,nl,1,
<:lnk C:DV-lin C:DV ! :>,
<:lnk C:DV-lin C:DV ! :>,
<:lnk C:DV-lin C:DV ! :>,
<:lnk C:DV-lin C:DV:>,nl,1);
set_3600_address( tab1 );
for i:= 0 step 1 until links-1 do
begin <* scan links *>
for j:= 0 step 1 until 7 do
begin <* scan cu's for link *>
for k:= 0 step 1 until 63 do
begin <* scan dev's for cu *>
e:= get_3600_word;
if e < 16384 then
begin
if dispno mod 4 = 0 then write(out,nl,1);
if increase(dispno) > 15*4 then begin typein; dispno:= 0; end;
write(out, <<dd>, i, <: :>, j, <:::>, k,
<:-:>, e shift (-11) extract 3,
<: :>, e shift (-6) extract 5,
<:::>, e extract 6, <: ! :> );
end;
end; <* scan dev's *>
end; <* scan cu's *>
end; <* scan links *>
write(out, nl,1 ); typein; dispno:= 0;
write(out, <:Table 2 : Line -> RC8000 Address Transformation:>,nl,1,
<:lin C:DV-lnk C:DV ! :>,
<:lin C:DV-lnk C:DV ! :>,
<:lin C:DV-lnk C:DV ! :>,
<:lin C:DV-lnk C:DV:>,nl,1);
set_3600_address( tab2 );
for i:= 0 step 1 until lines-1 do
begin <* scan lines *>
for j:= 0 step 1 until 7 do
begin <* scan cu's for line *>
for k:= 0 step 1 until 63 do
begin <* scan dev's for cu *>
e:= get_3600_word;
if e < 2048 then
begin
if dispno mod 4 = 0 then write(out,nl,1);
if increase(dispno) > 15*4 then begin typein; dispno:= 0; end;
write(out, <<dd>, i, <: :>, j, <:::>, k,
<:-:>, e shift (-9) extract 3,
<: :>, e shift (-6) extract 3,
<:::>, e extract 6, <: ! :> );
end;
end; <* scan dev's *>
end; <* scan cu's *>
end; <* scan lines *>
write(out, nl,1 );
exit:
end;
procedure format;
begin
integer tmask;
integer procedure get_format;
get_format:= if param(1) = real<:octal:> then 1 else
if param(1) = real<:decim:> add 'a' and
param(2) = real<:l:> then 2 else
if param(1) = real<:byte:> then 3 else
if param(1) = real<:bit:> then 4 else
if param(1) = real<:text:> then 5 else
if param(1) = real<:all:> then 6 else
if param(1) = real<:words:> then 7 else
if param(1) = real<:windo:> add 'w' then 8 else 9;
type:=anything;
tmask:= 0;
next_param(type);
repeat
case get_format of
begin
tmask:=tmask add octal;
tmask:=tmask add int;
tmask:=tmask add byte;
tmask:=tmask add bit;
tmask:=tmask add text;
tmask:=all;
begin
next_param(p_number);
words:= round param(1);
end;
begin
next_param(p_number);
firstcore:=lastcore:= round param(1);
type:= anything;
nextparam(type);
if type = p_number then
lastcore:= round param(1)
else paramno:= paramno - 1;
if firstcore > lastcore then firstcore:= lastcore;
end;
type_text(<:illegal format:>);
end case;
type:=anything;
next_param(type);
until type <> p_text;
paramno:= paramno - 1;
if tmask <> 0 then mask:= tmask;
end format;
procedure typein;
begin
integer i,j;
if -,not_online then
begin
write(out, <:Type <CR> to continue, f<CR> to discard: :>);
setposition(out,0,0);
readchar(in,i);
if i<>10 then repeat readchar(in,j) until j=10;
if i=102 then goto nextline;
end;
end typein;
procedure blockproc(z,s,b);
zone z;
integer s,b;
begin
write(out,nl,1);
for i:= 0 step 1 until 23 do
write(out,s shift (-i) extract 1);
setposition(out,0,0);
if s shift 16 > 0 then
stderror(z,s,b);
end;
integer procedure search(chain,name);
integer chain;
real name;
begin
integer word,i,next;
boolean found;
if chain= 12 shift 12 then <* program *>
begin
word:= 57;
i:= prog_chain;
end else
begin
word:= 44;
i:= proc_chain;
end;
next:= -1; found:=false;
if i=0 then
begin
set_3600_address(word);
word:= get_3600_word;
end else
word:= i;
while word<>0 and -,found do
begin
set_3600_address(word+2);
next:=get_3600_word;
search:=word;
set_3600_address(word+4);
i:=0;
while i<3 and name shift ((i-2)*16) extract 16 = get_3600_word do i:=i+1;
found:=i=3;
word:=next;
end;
if -,found then search:=0;
end search;
procedure core_specifications(first,last);
integer first,last;
begin
type:=anything;
next_param(type);
if type=s_number then
begin
last:=first:=round param(1);
type:=anything;
next_param(type);
if type=p_number then
last:=round param(1)
else
paramno:=paramno-1; <* try again *>
end
else
begin
paramno:=paramno-1;
first:= firstcore;
last:= lastcore;
end;
if first>last then first:=last;
end core_specifications;
procedure addr_specifications(first,last);
integer first,last;
begin
type:=anything;
next_param(type);
paramno:=paramno-1;
if type=s_number then
core_specifications(first,last)
else
begin
first:=0;
last:=77777;
end;
end addr_specifications;
procedure print_item(mode,name);
value mode,name;
integer mode;
real name;
begin
integer first,last,addr;
addr:=description(name,mode);
if addr <> 0 then
begin
core_specifications(first,last);
first:=octal_to_decimal(first);
last:=octal_to_decimal(last);
print_core(addr,first,last,mask,words);
end
else
write(out,<:not found:>,nl,1);
end print_item;
procedure print_buffer_queue(head);
value head;
integer head;
begin
integer event,last_event,i;
integer array messbuf(1:10);
boolean first_type;
first_type:=true;
set_3600_address(head);
messbuf(1):=get_3600_word;
last_event:=get_3600_word;
event:= 0;
if last_event=head then write(out,nl,1,<:queue empty:>,nl,1)
else
begin
while event<>last_event do
begin
event:=messbuf(1);
set_3600_address(event);
for i:=1 step 1 until 10 do
messbuf(i):=get_3600_word;
if -,first_type then typein else first_type:=false;
print_buf(event,0,messbuf);
end;
end;
end print_buffer_queue;
procedure print_chain(first_item,first,last,offset,corout);
integer first_item,first,last,offset;
boolean corout;
begin
integer next;
boolean first_type;
first_type:= true; next:= first_item;
while next <> 0 do
begin
if -,first_type then typein else first_type:= false;
if corout then
begin
set_3600_address(next-1);
write(out,nl,1,<:ident :>);
write_formatted(get_3600_word,octal+int);
end;
write(out,nl,1);
print_core(next,first,last,mask,words);
set_3600_address(next+offset);
next:= get_3600_word;
write(out,nl,1);
end while next<>0;
end print_chain;
procedure print_buf(addr,index,messbuf);
value addr,index;
integer addr,index;
integer array messbuf;
begin
integer i,j,k;
write(out,nl,2,<:core : :>);
write_formatted(addr+10*index,octal);
for i:=1 step 1 until 10 do
begin
j:=messbuf(index*10+i);
case i of
begin
write(out,nl,1,<: 0: next : :>);
write(out,<: 1: prev : :>);
write(out,<: 2: chain : :>);
write(out,<: 3: size : :>,<<dddddd>,j);
write(out,<: 4: sender : :>);
write(out,<: 5: receiver : :>);
write(out,<: 6: mess0 : :>);
write(out,<: 7: mess1 : :>);
write(out,<:10: mess2 : :>);
write(out,<:11: mess3 : :>);
end case;
case i of
begin
write_formatted(j,octal); <* next *>
write_formatted(j,octal); <* prev *>
write_formatted(j,octal); <* chain *>
; <* size *>
begin <* sender *>
write_formatted(j,octal);
if j<>0 then
begin
set_3600_address(j+4);
for k:=0,1,2 do
write_formatted(get_3600_word,text);
end;
end;
begin <* receiver *>
write_formatted(j,octal);
if j<>0 then
begin
if j shift 8<0 then
j:=(-j) extract 16;
set_3600_address(j+4);
for k:=0,1,2 do
write_formatted(get_3600_word,text);
end;
end;
write_formatted(j,all); <* mess0 *>
write_formatted(j,all); <* mess1 *>
write_formatted(j,all); <* mess2 *>
write_formatted(j,all); <* mess3 *>
end case;
type_text(<::>);
end for i;
end print_buf;
procedure print_process(process,event);
value process;
integer process;
boolean event;
begin
integer k,i;
integer array proc_descr(1:26);
set_3600_address(process);
for i:= 1 step 1 until 26 do proc_descr(i):=get_3600_word;
write(out,nl,2,<:core : :>);
write_formatted(process,octal);
for i:= 1 step 1 until 26 do
begin
case i of
begin
write(out,nl,1,<: 0: next:>,sp,16,<:: :>);
write(out,nl,1,<: 1: previous:>,sp,12,<:: :>);
write(out,nl,1,<: 2: chain:>,sp,15,<:: :>);
write(out,nl,1,<: 3: size:>,sp,16,<:: :>);
write(out,nl,1,<: 4: name:>,sp,16,<:: :>);
;
;
write(out,nl,1,<: 7: first event:>,sp,9,<:: :>);
write(out,nl,1,<:10: last event:>,sp,10,<:: :>);
write(out,nl,1,<:11: message buffers:>,sp,5,<:: :>);
write(out,nl,1,<:12: program start:>,sp,7,<:: :>);
write(out,nl,1,<:13: state:>,sp,15,<:: :>);
write(out,nl,1,<:14: timer:>,sp,15,<:: :>);
write(out,nl,1,<:15: priority:>,sp,12,<:: :>);
write(out,nl,1,<:16: break address:>,sp,7,<:: :>);
write(out,nl,1,<:17: ac0:>,sp,17,<:: :>);
write(out,nl,1,<:20: ac1:>,sp,17,<:: :>);
write(out,nl,1,<:21: ac2:>,sp,17,<:: :>);
write(out,nl,1,<:22: ac3:>,sp,17,<:: :>);
write(out,nl,1,<:23: psw:>,sp,17,<:: :>);
write(out,nl,1,<:24: save:>,sp,16,<:: :>);
write(out,nl,1,<:25: buf:>,sp,17,<:: :>);
write(out,nl,1,<:26: address:>,sp,13,<:: :>);
write(out,nl,1,<:27: count:>,sp,15,<:: :>);
write(out,nl,1,<:30: reserver:>,sp,12,<:: :>);
write(out,nl,1,<:31: conversiontable:>,sp,5,<:: :>);
end case;
case i of
begin
write_formatted(proc_descr(i),octal); <* next *>
write_formatted(proc_descr(i),octal); <* prev *>
write_formatted(proc_descr(i),octal); <* chain *>
write_formatted(proc_descr(i),octal+int); <* size *>
write_formatted(proc_descr(i),text); <* name(0) *>
write_formatted(proc_descr(i),text); <* name(1) *>
write_formatted(proc_descr(i),text); <* name(2) *>
write_formatted(proc_descr(i),octal); <* first event *>
write_formatted(proc_descr(i),octal); <* last event *>
write_formatted(proc_descr(i),octal); <* message buffers *>
write_formatted(proc_descr(i),octal); <* program start *>
write_formatted(proc_descr(i),octal); <* state *>
write_formatted(proc_descr(i),octal+int); <* timer *>
write_formatted(proc_descr(i),octal); <* priority *>
write_formatted(proc_descr(i),octal); <* break address *>
write_formatted(proc_descr(i),all); <* ac0 *>
write_formatted(proc_descr(i),all); <* ac1 *>
write_formatted(proc_descr(i),all); <* ac2 *>
write_formatted(proc_descr(i),all); <* ac3 *>
begin
write_formatted(proc_descr(i),octal);
write_formatted(proc_descr(i) shift (-1),octal);
write(out,if proc_descr(i) extract 1<>0 then 1 else 0);
end;
write_formatted(proc_descr(i),all); <* save *>
write_formatted(proc_descr(i),octal); <* buf *>
write_formatted(proc_descr(i),octal); <* address *>
write_formatted(proc_descr(i),octal+int); <* count *>
begin <* reserver *>
write_formatted(proc_descr(i),octal);
if proc_descr(i) > 0 and proc_descr(i) < 32768 then
begin
set_3600_address(proc_descr(i)+4);
for k:=0,1,2 do
write_formatted(get_3600_word,text);
end;
end;
write_formatted(proc_descr(i),octal); <* conversion table *>
end case;
end for i;
type_text(<::>);
if event then
begin
typein;
write(out,nl,1,<:messagebuffers in event queue:>,nl,1);
print_buffer_queue(process+7);
end;
end print_process;
procedure print_process_queue(head);
value head;
integer head;
begin
integer first,last,k;
first:=head;
set_3600_address(head+1);
last:=get_3600_word;
while first<>last do
begin
set_3600_address(first);
first:=get_3600_word;
set_3600_address(first+4);
for k:=0,1,2 do
write_formatted(get_3600_word,text);
write_formatted(first,octal);
write(out,nl,1);
end;
end print_process_queue;
procedure print_process_chain(head);
value head;
integer head;
begin
integer first,next,i;
set_3600_address(head);
first:= get_3600_word;
while first<>0 do
begin
set_3600_address(first+2);
next:= get_3600_word;
set_3600_address(first+4);
for i:= 0,1,2 do
write_formatted(get_3600_word,text);
write_formatted(first,octal);
write(out,nl,1);
first:= next;
end;
end print_process_chain;
integer procedure get_3600_word;
begin
integer i;
real field rf;
if supdev_pointer>=max_link then
begin
if coredump then
begin
supdev_pointer:= 0;
inrec6(dumpz,record_length);
end
else
begin
setposition(supdev,0,0);
getshare6(supdev,shdescr,1);
shdescr(4):=8 shift 12;
last_get_addr:= last_get_addr + max_link;
shdescr(5):= last_get_addr;
setshare6(supdev,shdescr,1);
monitor(16)send message:(supdev,1,shdescr);
monitor(18)wait answer:(supdev,1,shdescr);
inrec6(supdev,record_length);
supdev_pointer:=0;
end; <* not coredump *>
end;
i:=(2-supdev_pointer mod 3)*16;
rf:=(supdev_pointer//3+1)*4;
get_3600_word:= if coredump then dumpz.rf shift (-i) extract 16
else supdev.rf shift (-i) extract 16;
supdev_pointer:=supdev_pointer+1;
end get_3600_word;
procedure set_3600_address(addr);
integer addr;
begin
if coredump then
begin
if (dump_size <> 0) and (addr//maxlink >= dump_size) then
begin
write(out,nl,1,<:***ncptest: positioning outside dump:>,nl,1);
if not_online then goto end_program else
goto next_line;
end;
setposition(dumpz,file,addr//max_link);
supdev_pointer:=addr mod max_link;
inrec6(dumpz,record_length);
end
else
begin
last_get_addr:= addr - max_link;
supdev_pointer:=max_link;
end;
end set_3600_address;
procedure print_core(base,first,last,mask,words);
integer base,first,last,mask,words;
begin
integer i,j,word;
word:=words;
set_3600_address(base+first);
for i:= first step word until last do
begin
if base<>0 then
write_formatted(base+i,octal);
write_formatted(i,octal);
write(out,<:: :>);
if i+word > last+1 then word:= (last-first+1) mod word;
for j:=1 step 1 until word do
write_formatted(get_3600_word,mask);
type_text(<::>);
end;
end print_core;
boolean procedure get_tabdescr(tabdescr,tabno);
value tabno;
integer tabno;
integer array tabdescr;
begin
integer addr,word,i,j;
addr:=description(real<:ncp:>,12 shift 12);
set_3600_address(addr+7);
word:=get_3600_word;
set_3600_address(word);
j:= -1;
repeat
j:=get_3600_word;
tabdescr(0):=j;
for i:=1 step 1 until 5 do
tabdescr(i):=get_3600_word;
until (j=65535 or tabno=j);
if j= 65535 then
get_tabdescr:=false
else
get_tabdescr:=true;
end get_tabdescr;
integer procedure tab_start(tabdescr,entry);
value entry;
integer entry;
integer array tabdescr;
begin
integer organisation,i,j,chain;
organisation:=tabdescr(1) extract 2;
tab_start:=0;
case organisation+1 of
begin
i:=tab_start:=tabdescr(4)+tabdescr(2)//2*entry; <* simple not chained *>
begin <* chained *>
i:=tabdescr(4);
if entry<>0 then
for j:=1 step 1 until entry do
begin
chain:=i+tabdescr(3);
set_3600_address(chain);
i:=get_3600_word;
end;
tab_start:=i;
end;
begin <* indexed *>
i:=tabdescr(4)+entry;
set_3600_address(i);
i:=tab_start:=get_3600_word;
end;
; <* skip *>
end case;
set_3600_address(i);
end tab_start;
procedure link_host(devicehost);
value devicehost;
integer devicehost;
begin
integer peripherals,i,j,hoststatus;
integer array start(1:2),process_description(0:5);
integer array field iaf;
iaf := -2;
if host_connected then remove_link;
hoststatus:=-1;
system(5)copy core:(74,start);
peripherals:=(start(2)-start(1))/2-1;
begin
integer array nametable(0:peripherals);
integer array field iaf;
iaf := -2;
system(5)copy core:(start(1),nametable.iaf);
for i:=0,i+1 while (-,host_connected and i<=peripherals) do
begin
system(5)copy core:(nametable(i),process_description.iaf);
if process_description(0)=82 and <* kind=subhost *>
process_description.raf(1)=real<:host3:> add '6' then
begin
j:=linkup(i,devicehost);
if j<>-1 then hoststatus:=j;
end;
end;
if -,host_connected then
begin
i:= 1;
write(out,<:***:>,string ncptest_name(increase(i)),<:::>);
if hoststatus = -1 then write(out,<: devicehost no :>,devicehost,<: not found:>,nl,1) else
write(out,<: link error : :>,case hoststatus extract 4 +1 of (<:devicehost reserved:>,
<:supervisor device not present:>,<:supervisor device reserved:>,
<:no resources at jobhost:>,
<:no resources at devicehost:>,<:timeout:>,<:priority:>,<:link present:>,
<:devicehost unknown:>,<:job cannot be user of the device:>,
<:links exceeded:>,<::>,<::>,<::>,<::>),
<: , connecting to devicehost no :>,devicehost,nl,1);
ok:= false;
end;
end;
end link_host;
integer procedure linkup(hostno,devicehost);
value hostno, devicehost;
integer hostno,devicehost;
begin
integer array process_description(1:10);
zone z(6,1,stderror);
integer i,j,process;
real array field raf;
raf:=0;
open(z,0,<:host:>,0);
getzone6(z,zdescr);
getshare6(z,shdescr,1);
shdescr(4):=1 shift 12 + 6 shift 1 +0;
shdescr(5):=zdescr(19)+1;
shdescr(6):=zdescr(19)+1+20;
shdescr(7):=hostno;
shdescr(8):=devicehost;
shdescr(9):=0;
setshare6(z,shdescr,1);
zdescr(14):=zdescr(19);
zdescr(15):=zdescr(19)+zdescr(20);
zdescr(16):=24;
setzone6(z,zdescr);
z.iaf(1):=12; <* devicekind *>
z.iaf(2):= 1; <* buffers *>
z.iaf(3):=258; <* bufferlength *>
z.iaf(4):= real<:cor:> shift (-24) extract 24;
z.raf(3):= real<:e3600:>;
z.iaf(7):= 0; <* devicename *>
z.iaf(9):=0;
z.iaf(10):=0;
monitor(16)send message:(z,1,shdescr);
i:=monitor(18)wait answer:(z,1,shdescr);
hostconnected := false;
linkup := -1; <*shdescr(1) was 0 before wait answer *>
if i <> 1 then
linkup:= 0
else
if shdescr(1) extract 12<>0 then
linkup:=shdescr(1) extract 12
else
begin
process:=z.iaf(11);
max_link:= (z.iaf(3)//6)*3;
record_length:= 172;
system(5,process,process_description);
raf:=2;
close(z, true);
i :=1; open(supdev, 12, string process_description.raf(increase(i)),giveup);
j:=monitor(8)reserve process:(supdev,1,shdescr);
getshare6(supdev, shdescr, 1);
shdescr(4) := 8 shift 12; shdescr(5) := 0;
setshare6(supdev, shdescr, 1);
monitor(16)send_message:(supdev, 1, shdescr);
i := monitor(18)wait_answer:(supdev, 1, shdescr);
linkup:= 0;
if i > 1 or shdescr(1)<>0 or j<> 0 then
begin
close(supdev,true);
monitor(64)remove_process:(supdev, 1, shdescr);
end else
begin
host_connected := true;
write(out,nl,1,<:connected to devicehost no: :>,devicehost,nl,1);
end
end;
end linkup;
procedure link_to_console;
begin
integer array process_description(0:25),name(1:12);
zone z(6,1,stderror);
integer array field iaf;
iaf := -2;
open(z,8,<:console1:>,0);
if monitor(4,z,1,name)<>0 then
begin
system(5,monitor(4,z,1,name),process_description.iaf);
link_host(process_description(25) extract 16);
end;
end link_to_console;
procedure remove_link;
begin
close(supdev,true);
monitor(64)remove process:(supdev,i,shdescr);
host_connected:=false;
end remove_link;
integer procedure description(name,chain);
value chain;
integer chain;
real name;
begin
real work;
work:= name;
for i:=1 step 1 until 6 do
begin
j:=work shift (-40) extract 8;
if j>=97 and j<=122 then j:=j-32; <* convert to capital letters *>
work:=(work shift 8) add j;
end;
if coredump then
description:=search(chain,work)
else
begin
setposition(supdev,0,0);
supdev_pointer:=max_link;
getshare6(supdev,shdescr,1);
shdescr(4):=chain;
shdescr(6):=work shift (-24) extract 24;
shdescr(7):=work extract 24;
setshare6(supdev,shdescr,1);
monitor(16)send message:(supdev,1,shdescr);
monitor(18)wait answer:(supdev,1,shdescr);
description:=shdescr(2) extract 16;
end;
end description;
integer procedure octal_to_decimal(word);
value word;
integer word;
begin
integer i,j,k;
k:=word mod 200000;
j:=0;
for i:=100000,10000,1000,100,10,1 do
begin
j:= j*8 + k//i;
k:=k-(k//i)*i;
end;
octal_to_decimal:=j extract 16;
end octal_to_decimal;
procedure write_formatted(word,mask);
value word,mask ;
integer word,mask ;
begin <* writes the contents of 'word' according to format specification
given in 'mask' *>
integer i,j,char;
for i:= 0 step 1 until 4 do
begin
if mask shift (-i) extract 1 = 1 then
begin
case i+1 of
begin
begin <* octal *>
for j:= 15 step -3 until 0 do
write(out,<<d>,word shift(-j) extract 3);
write(out,sp,2);
end;
write(out,<<ddddd>,word,sp,2); <* decimal *>
write(out,<<ddd>,word shift (-8) extract 8,
sp,1,word extract 8,sp,2); <* byte *>
begin <* bit *>
for j:= 8 step 1 until 23 do
write(out,if word shift j < 0 then <:1:> else <:.:>);
write(out,sp,2);
end;
begin <* text *>
for j:= 8 step -8 until 0 do
begin
char:= word shift (-j) extract 8;
if char > 32 and char < 127
then outchar(out,char)
else outchar(out,32);
end;
end;
end case;
end;
end for-loop;
end write_formatted;
procedure check_host_online;
begin
if -,host_connected and -,coredump then
begin
link_to_console;
if -,host_connected then
begin
if not_online then goto endprogram
else goto nextline;
end;
end;
end check_host_online;
procedure type_text(text);
string text ;
begin
write(out,text,nl,1);
end;
boolean procedure next_param(type);
integer type ;
begin <* this procedure returns the next call parameter in array
'param' .
1<= type <= 4 :
type checking is performed as follows:
type=1 (call): space_name is demanded
type=2 - : point_name -
type=3 - : space_integer -
type=4 - : point_integer -
in case of errors error messages are written
on current output.
type = 5 : any type is accepted. the actual type value
(1,2,3 or 4) is returned.
the procedure returns true as long as the next parameter exists,
otherwise false. *>
procedure conv_error(number,i,type,delim);
value number,i,type,delim ;
integer number,i,type,delim ;
begin <* error-messages in conversational mode *>
write(out,<:<10>***ncptest: illegal parameter no. :>,paramno,
<: , read: :>);
if delim = 0
then write(out,<:<integer>:>)
else outchar(out,delim);
if kind(i) = 6 <* text *>
then write(out,string ra(increase(i)))
else
if kind(i) = 2 <* legal number *>
then write(out,round ra(i))
else write(out,<: illegal number :>);
syntax_error:= true;
goto next_line;
end conv_error;
integer sep,action,number,delim,separator;
if not_online then
begin <* fp_mode *>
sep:= system(4,paramno,param);
case type of
begin
syntax_error:= sep <> space_name;
syntax_error:= sep <> point_name;
syntax_error:= sep <> space_integer;
syntax_error:= sep <> point_integer;
begin <* return actual type *>
type:= if sep = space_name then 1 else
if sep = point_name then 2 else
if sep = space_integer then 3 else
if sep = point_integer then 4 else 5;
syntax_error:= sep<>0 and type=5 ;
end;
end;
if syntax_error then
begin
separator:= 5;
for i:= 1 step 1 until 4 do
if sep = ( case i of (space_name,point_name,space_integer,
point_integer)) then separator:= i ;
i:= 1;
write(out,<:<10>***:>,string ncptest_name(increase(i)),
<:: illegal fpparameter no. :>,
paramno,<: , read: :>,case separator of (<: :>,<:.:>,
<: :>,<:.:>,<::>));
if separator < 3 <* name *> then
begin
i:= 1;
write(out,string param(increase(i)));
end
else if separator <> 5 then
write(out,round param(1));
ok:= false;
goto endprogram;
end syntax_error;
next_param:= sep <> 0;
end
else
begin <* conversational mode *>
delim:= 0;
number:= -1;
<* search item *>
for i:= 0,i + 1 while kind(i) <> 8 and number < paramno do
begin
action:= case ((kind(i)-1)*8 + kind(i+1)) of
<* kind(i+1) *>
( 3 , 3 , 3 , 3 , 3 , 2 , 2 , 2 ,
3 , 3 , 3 , 3 , 3 , 2 , 2 , 2 ,
3 , 3 , 3 , 3 , 3 , 3 , 3 , 3 ,
<* kind(i) *> 3 , 3 , 3 , 3 , 3 , 3 , 3 , 3 ,
3 , 3 , 3 , 3 , 3 , 3 , 3 , 3 ,
3 , 3 , 3 , 3 , 3 , 2 , 2 , 2 ,
1 , 1 , 3 , 3 , 3 , 1 , 2 , 2 ) ;
case action of
begin
number:= number + 1; <* text or integer found *>
; <* skip *>
begin <* error *>
write(out,<:<10>action-table in error:>);
goto endprogram;
end;
end;
end for-loop;
if number = paramno then
begin <* now 'i' points at the first element of the
item in array 'ra' . get the item and check it . *>
if kind(i-1) = 7 then delim:= round ra(i-1);
case type of
begin
<* space-name *> if delim <> 32 or kind(i) <> 6
then conv_error(number,i,1,delim);
<* point-name *> if delim <> 46 or kind(i) <> 6
then converror(number,i,2,delim);
<* space-int. *> if delim <> 32 or kind(i) <> 2
then conv_error(number,i,3,delim);
<* point-int. *> if delim <> 46 or kind(i) <> 2
then conv_error(number,i,4,delim);
<* any type *> begin
if delim=32 and kind(i)=6 then type:= 1 else
if delim=46 and kind(i)=6 then type:= 2 else
if delim=32 and kind(i)=2 then type:= 3 else
if delim=46 and kind(i)=2 then type:= 4 else
conv_error(number,i,5,delim);
end;
end case;
<* return item in 'param' *>
if type < 3 then
begin <* text *>
param(1):= ra(i);
param(2):= if kind(i+1) <> 6 then real <::> else
ra(i+1) shift(-8) shift 8; <* max 11 chars *>
end
else
param(1):= ra(i);
end
else if type<>5 then
begin
syntax_error:= true;
goto next_line;
end;
next_param:= number = paramno;
end conversational mode;
paramno:= paramno + 1;
end next_param;
integer procedure convert_to_number(param);
array param ;
begin
integer i,j;
j:= 23;
for i:= 1 step 1 until 22 do
begin
if param(1) = ( case i of ( real<:typei:> add 'n' ,
real<:end:> ,
real<:comma:> add 'n' ,
real<:info:> ,
real<:host:> ,
real<:core:> ,
real<:set:> ,
real<:prog:> ,
real<:proc:> ,
real<:table:> ,
real<:devic:> add 'e' ,
real<:buffe:> add 'r' ,
real<:buf:> ,
real<:dump:> ,
real<:moved:> add 'u' ,
real<:diagn:> add 'o' ,
real<:sendw:> add 'a' ,
real<:termi:> add 'n' ,
real<:print:> add 'e' ,
real<:hdlcs:> add 't' ,
real<:minir:> add 'o' ,
real<:forma:> add 't' )) and
param(2) = ( case i of ( real<::> ,
real<::> ,
real<:ds:> ,
real<::> ,
real<::> ,
real<::> ,
real<::> ,
real<::> ,
real<::> ,
real<::> ,
real<:table:> ,
real<:pool:> ,
real<::> ,
real<::> ,
real<:mp:> ,
real<:stic:> ,
real<:it:> ,
real<:al:> ,
real<:r:> ,
real<:at:> ,
real<:cs:> ,
real<::> ))
then
j:= i;
end;
if -,ncptest and j<>4 and j<>5 and j<>18 and j<>19 and j<>21 then
j:= 23;
ok:= j<>23;
syntax_error:= -,ok;
convert_to_number:= j;
end convert_to_number;
procedure outtable(alphabet,length);
value length ;
integer length ;
integer array alphabet ;
begin <* enter 'class shift 12 + value' corresponding to the 'length'
first characters of the current alphabet in array 'alphabet'.
used for later call of 'intable' . *>
zone alpha(25,1,blockproc);
integer class,char,i;
procedure blockproc(z,s,b);
zone z ;
integer s,b ;
if (s shift (-5)) extract 1 <> 1 then stderror(z,s,b) else b:= 25*4;
if length < 0 or length > 127 then length:= 127;
open(alpha,0,<::>,1 shift 5);
for i:= 0 step 1 until length do write(alpha,false add i,1);
write(alpha,false add 10,1);
setposition(alpha,0,0);
for i:= 0 step 1 until length do
begin
class:= readchar(alpha,char);
if char <> i then
begin
class:= 0;
repeatchar(alpha);
end;
alphabet(i):= class shift 12 + i;
end;
end outtable;
<* start of program *>
trapmode:= 0; <* write all alarms *>
trap(after_error);
errorbits:= 1; <* ok.no *>
raf:=0;
iaf:= 0;
<* constant definitions *>
s_text:= 1;
p_text:= 2;
s_number:= 3;
p_number:= 4;
anything:= 5;
octal:= 1;
int:= 1 shift 1;
byte:= 1 shift 2;
bit := 1 shift 3;
text:= 1 shift 4;
all:= 31;
sp:= false add 32;
nl:= false add 10;
space_name:= 4 shift 12 + 10;
point_name:= 8 shift 12 + 10;
space_integer:= 4 shift 12 + 4;
point_integer:= 8 shift 12 + 4;
giveup:= 1 shift 16 + 1 shift 7;
proc_chain:=prog_chain:= 0;
mask:= all; words:= 1; firstcore:= 0; lastcore:= 10;
not_online:= true;
host_connected:= false;
coredump:= false;
syntax_error:= false;
kind(0):= 7; <* delimiter *>
ra(0):= 32 ; <* space *>
system(4,0,param);
ncptest_name(1):= param(1); ncptest_name(2):= param(2);
ncptest:= (param(1)=real<:ncpte:> add 115) and (param(2)=real<:t:>);
paramno:= 1;
next_param(s_text);
<* decide action *>
if convert_to_number(param)=1 then
begin <* typein - enter conversational mode *>
write(out,<:*** ncptest version 3.2 850524 ***<10>:>);
not_online:= false;
<* modify standardalphabet *>
outtable(alphabet,127);
for i:= 39,43,46 do alphabet(i):= 7 shift 12 + i;
intable(alphabet);
tableindex:= 0;
next_line:
if syntax_error then
write(out,nl,1,<:try 'commands' and 'info <commands>':>,nl,1);
syntax_error:= false;
write(out,<:*:>);
setposition(out,0,0);
morelines:= true;
start_pos:= 1;
while morelines do
begin <* read lines of command *>
i:= readall(in,ra,kind,start_pos);
if i < 0 then
begin <* array bounds exceeded *>
write(out,<:<10>command too long - last line skipped<10>:>);
setposition(out,0,0);
kind(start_pos):= 8; <* terminates inf. in 'ra' and 'kind'*>
morelines:= false;
end
else
begin <* check if current line terminates command *>
for i:= 0,i+1 while round ra(i) = 32 do;
if kind(i) = 8 then goto next_line; <* skip if no command *>
for i:= startpos,i+1 while kind(i) <> 8 do;
last:= i;
ra(last):= 32;
kind(last):= 7;
for i:= i,i-1 while kind(i) = 7 and round ra(i) = 32 do;
if (kind(i) = 7 and round ra(i) = 44) <* comma *> then
begin
ra(i):= ra(i+1):= 32; <* space *>
kind(i):= kind(i+1):= 7;
startpos:= i+1;
end
else
begin
morelines:= false;
kind(last):= 8;
end;
end;
end while_loop;
<* start execution of command *>
paramno:= 0;
next_param(s_text);
case convert_to_number(param) of
begin
<* typein ignored *> ;
goto endprogram ; <* end *>
commands ;
info ;
host ;
core ;
set ;
prog ;
proc ;
table ;
devicetable ;
bufferpool ;
buf ;
dump ;
movedump ;
diagnostic ;
sendwait ;
terminal(0) ; <* initialize terminal *>
terminal(1) ; <* initialize printer *>
hdlcstat ;
minirocs ;
format ;
begin <* illegal command *>
i:= 1;
write(out,<:<10>***ncptest: illegal command , read: :>,
string param(increase(i)),<:<10>:>);
end;
end case;
goto next_line;
end conv_mode ;
repeat
case convert_to_number(param) of
begin
<* typein *>;
<* end *> ;
commands ;
info ;
host ;
core ;
set ;
prog ;
proc ;
table ;
devicetable;
bufferpool ;
buf ;
dump ;
movedump ;
diagnostic ;
sendwait ;
terminal(0); <* initialize terminal *>
terminal(1); <* initialize printer *>
hdlcstat ;
minirocs ;
format ;
begin <* illegal fpparameter *>
i:= j:= 1;
write(out,<:<10>***:>,string ncptest_name(increase(i)),
<:: illegal command, fpparameter no. :>,paramno,
<: , read: :>,string param(increase(j)),nl,1);
goto endprogram;
end;
end case;
type:=anything
until -,ok or -,next_param(type);
endprogram:
if ok then errorbits:= 0; <* ok.yes *>
after_error:
if syntax_error and ncptest then
write(out,nl,1,<:try 'ncptest commands' and 'ncptest info <commands>':>,nl,1);
if host_connected then remove_link;
end;
▶EOF◀