|
|
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: 44544 (0xae00)
Types: TextFile
Names: »palgoltext«
└─⟦621cfb9a2⟧ Bits:30002817 RC8000 Dump tape fra HCØ. Detaljer om "HC8000" projekt.
└─⟦0364f57e3⟧
└─⟦9929d5d85⟧ »cpsys«
└─⟦00964e8f7⟧ Bits:30007478 RC8000 Dump tape fra HCØ.
└─⟦b2ec5d50f⟧
└─⟦9929d5d85⟧ »cpsys«
└─⟦this⟧
; Heinrich Bjerregaard. 12. april 1975.
; p, Kurt Ludvigsen, 8 september 1972
; changed by Anders Lindgård 11 marts 1976
prun=algol index.no message.no
begin
integer buff, i, j, res, f, lastevent, instr, sh,
operatorbuf, clockbuf,
changebuf, type, act, sysstate,
maxproc, maxTB, maxT,
mess, recadr, sendadr, kind,
state, tbstate, procno,
childsegm, childfirstadr, childlastadr, childkey,
syspda, clockpda, pdumpareapda, pdumpareapda2, fppda,
firstcommarea, lastcommarea,
catkey, time, timeint, timeslice,
currproc, nextproc, sysconpda,c1,
noshift, totalruntime, maxdrumproc,maxbc,maxac,
ignoretimes,bytesmove,cpuused,TBsize;
boolean terminalmode, oscomm, return, tobedumped,
disc,TEST;
integer array M, DES(1:17), Bfname(1:7), Bname(1:1);
redefarray(Bname,firstaddr(Bfname)+6,4);
TEST:=lookupentry(<:ptest:>)>0;
maxT:=18;
TBsize:=52;
childsegm:=27;
catkey:=22;
timeint:=1;
timeslice:=7;
ignoretimes:=3;
cpuused:=30;
terminalmode:=true;
maxdrumproc:=12;
syspda:=owndescr;
maxproc:=maxTB:=byteload(syspda+28);
sysconpda:=description(<:console1:>);
c1:=description(<:console1:>);
if c1=0 then c1:=sysconpda;
if maxdrumproc>maxproc then maxdrumproc:=maxproc;
if TEST then
begin
comment check resources;
boolean error;
integer i,j,k,l,m,pbuf,parea,pint,psize,pk,pr,pcat,pf;
zone c1(128,1,ignore);
procedure ignore(z,s,b);
zone z; integer s,b;
;
procedure check(act,cor,txt);
value act,cor; integer act,cor;
string txt;
if act<cor then
begin
write(c1,<:<10>too few :>,txt,<:, is :>,act,
<: should be :>,cor);
setposition(c1,0,0);
error:=true;
end;
error:=false;
pbuf:=byteload(syspda+26)+3;
parea:=byteload(syspda+27)+3;
pint:=byteload(syspda+28);
psize:=wordload(syspda+24)-wordload(syspda+22);
pr:=byteload(syspda+32); pk:=byteload(syspda+33);
pf:=byteload(syspda+29);
pcat:=wordload(syspda+30);
open(c1,8,<:console1:>,0);
check(pbuf,61,<:buffers:>);
check(parea,44,<:areas:>);
check(pint,6,<:internals:>);
check(psize,20000,<:bytes:>);
if pk<>2 then begin
write(c1,<:<10>pk<>2:>);
error:=true;
end;
i:=j:=k:=0;
for m:=2,3, 0 step 1 until 11, 23-0 step -1 until 23-20 do
begin
if j=0 and k=0 then l:=1 else
if k=0 then l:=2 else l:=3;
if -,testbit(case l of (pr,pf,pcat),m) then
begin
write(c1,<:<10>wrong :>,case l of (<:protection:>,
<:function:>,<:catalog:>),<: mask, bit :>,
case l of (m,12-m,23-m),<: is missing:>);
end;
if m=3 then j:=1;
if m=11 then k:=1;
end;
if error then begin
rep:
write(c1,<:<10>remove p and create it with the correct resources:>,
<:<10>as agreed with the RC4000 department:>);
setposition(c1,0,0);
wait (20);
goto rep;
end;
end;
begin
integer array Ppda, Pstate, Pterm, Pin, Pout, Pbufadr,
Pignore(1:maxproc),
TBstate, TBtermbuf, TBprocbuf,
TBfirstadr(1:maxTB),
TBarea(1:maxTB,1:TBsize//2),
Tpda(1:maxT),
COMMAREA(1:25);
boolean array Ptorun, Ptobemod(1:maxproc), CHILD(1:childsegm*512),
Tallow(1:maxT);
procedure error(str,type);
value type; integer type;
string str;
begin
integer array mess(1:8);
array field a;
cleararray(M);
M(1):=13 shift 13 add type;
a:=2;
movestring(M.a,1,str);
waitanswer(sendmessage(parent,M),M);
end error;
\f
comment initialisation;
f:=firstaddr(TBarea)-1;
for i:=1 step 1 until maxTB do
begin
TBfirstadr(i):=f+(i-1)*TBsize;
end init of TB;
cleararray(TBstate); cleararray(TBtermbuf); cleararray(TBprocbuf);
cleararray(TBarea);
cleararray(Ppda); cleararray(Pstate); cleararray(Pbufadr);
cleararray(Pterm); cleararray(Pin); cleararray(Pout);
cleararray(Ptorun); cleararray(Ptobemod);
cleararray(Tpda); cleararray(Tallow);
cleararray(Pignore);
Tpda(1):=sysconpda;
Tallow(1):=true;
messadd:=firstaddr(M);
childfirstadr:=firstaddr(CHILD);
childlastadr:=childfirstadr+childsegm*512-2;
\f
for i:=1 step 1 until 12 do M(i):=0;
if lookuptail(<:pdumparea:>,M)=0 then
begin
if M(1)<maxdrumproc*childsegm then
begin
i:=removeentry(<:pdumparea:>);
if i<>0 and i<>3 then system(9,i,<:remove:>);
end
else goto PERMENTRY;
end;
M(1):=maxdrumproc*childsegm;
i:=createentry(<:pdumparea:>,M);
if i<>0 then system(9,i,<:pdumparea:>);
PERMENTRY:
i:=permentry(<:pdumparea:>,catkey);
if i<>0 then system(9,i,<:permanent:>);
i:=careaproc(<:pdumparea:>);
if i<>0 and i<>3 then system(9,i,<:creation:>);
i:=reserveproc(<:pdumparea:>,0);
if i<>0 then system(9,i,<:reservation:>);
if maxdrumproc<maxproc then
begin
if lookuptail(<:pdumparea2:>,M)=0 then
begin
if M(1)<(maxproc-maxdrumproc)*childsegm then
begin
i:=removeentry(<:pdumparea2:>);
if i<>0 and i<>3 then system(9,i,<:remove2:>);
end
else
goto PERMENTRY2;
end;
M(1):=(maxproc-maxdrumproc)*childsegm;
if createentry(<:pdumparea2:>,M)<>0 then error(<:pdumparea2:>,3);
PERMENTRY2:
if permentry(<:pdumparea2:>,catkey)<>0 then error(<:permanent2:>,3);
i:=careaproc(<:pdumparea2:>);
if i<>0 and i<>3 then error(<:pdumparea2:>,3);
if reserveproc(<:pdumparea2:>,0)<>0 then error(<:reservation2:>,3);
end;
\f
reserveproc(program-2,0);
pdumpareapda2:=description(<:pdumparea2:>);
fppda:=description(<:fp:>);
pdumpareapda:=description(<:pdumparea:>);
i:=byteload(syspda+32) shift 12;
for j:=12 step 1 until 23 do
if -,testbit(i,j) then
begin childkey:=19-j; goto OUTK; end;
OUTK:
firstcommarea:=firstaddr(COMMAREA);
lastcommarea:=firstcommarea+50-2;
movetext(firstaddr(Bfname),<:<10>dump on :>);
operatorbuf:=att;
changebuf:=0;
blocksread:=totalruntime:=noshift:=0;
sysstate:=0;
time:=0;
terminalmode:=true;
oscomm:=false;
currproc:=nextproc:=0;
clockpda:=description(<:clock:>);
M(1):=0; M(2):=timeint;
clockbuf:=sendmessage(clockpda,M);
changebuf:=sendmessage(pdumpareapda,M);
for i:=1 step 1 until 17 do DES(i):=0;
for i:=12 do DES(1):=setbit(DES(1),i,1);
for i:=7, 9, 12 do DES(2):=setbit(DES(2),i,1);
for i:=5, 10, 11 do DES(3):=setbit(DES(3),i,1);
for i:=7, 8, 9, 12 do DES(4):=setbit(DES(4),i,1);
for i:=1, 4, 12 do DES(5):=setbit(DES(5),i,1);
for i:=1, 2, 4, 7, 9, 12 do DES(6):=setbit(DES(6),i,1);
for i:=1, 2, 4, 5, 10, 11 do DES(7):=setbit(DES(7),i,1);
for i:=1, 2, 4, 7, 8, 9, 12 do DES(8):=setbit(DES(8),i,1);
for i:=1, 3, 12 do DES(9):=setbit(DES(9),i,1);
for i:=1, 3, 7, 9, 12 do DES(10):=setbit(DES(10),i,1);
for i:=1, 3, 5, 10, 11 do DES(11):=setbit(DES(11),i,1);
for i:=1, 3, 7, 8, 9, 12 do DES(12):=setbit(DES(12),i,1);
for i:=0, 1, 4, 12 do DES(13):=setbit(DES(13),i,1);
for i:=0, 1, 2, 4, 7, 9, 12 do DES(14):=setbit(DES(14),i,1);
for i:=0, 1, 2, 4, 5, 10, 11 do DES(15):=setbit(DES(15),i,1);
for i:=0, 1, 2, 4, 7,8,9, 12 do DES(16):=setbit(DES(16),i,1);
for i:=0, 12 do DES(17):=setbit(DES(17),i,1);
\f
begin
\f
procedure initp;
begin
integer i, ba, j;
M(1):=3 shift 12;
M(2):=childfirstadr;
M(3):=childfirstadr+510;
M(4):=0;
if careaproc(<:pinitarea:>) <>0 or
waitanswer(sendmessage(<:pinitarea:>,M),M)<>1 then error(<:pinit:>,0) else
begin
for i:=1 step 1 until 10 do
begin
j:=childfirstadr+(i-1)*48;
if byteload(j)<>0 then interprete(j,j+46,sysconpda);
end i;
removeproc(<:pinitarea:>);
end;
messall(<:p has been removed
is now restarted:>,1,false);
end initp;
procedure messall(text,time,readc1);
value time,readc1; integer time;
boolean readc1;
string text;
if TEST or readc1 then
begin
integer pda,nt,i,ba;
integer array M,A(1:8),buff(1:maxT);
array txt(1:20);
real t1,t2;
zone z(20,1,dummy);
procedure dummy(z,i,j);
zone z; integer i,j;
;
open(z,0,<:dummy:>,-1);
outrec(z,20);
cleararray(z);
setposition(z,0,0);
cleararray(txt);
nt:=wordload(74);
M(1):=5 shift 12;
M(2):=firstaddr(txt);
M(3):=M(2)+78;
txt(1):=txt(20):=real <:<10>:>;
if readc1 then begin
integer array c1M(1:8);
c1M(1):=3 shift 12;
c1M(2):=M(2)+4;
c1M(3):=M(2)+80;
waitanswer(sendmessage(c1,c1M),c1M);
end else
movestring(txt,2,text);
if time<>0 then begin
systime(1,0,t1);
t1:=systime(2,t1,t2);
write(z,<< dd dd dd>,t1,t2);
close(z,false);
for i:=1,2,3 do txt(15+i):=z(i);
end;
j:=1;
for i:=2,10,48 step 1 until 63 do begin
pda:=wordload(nt+2*i);
buff(j):=sendmessage(pda,M);
j:=j+1;
end;
waitanswer(buff(1),A);
wait(10);
for j:=2 step 1 until maxT do
if buff(j)=0 then else
if checkbuf(buff(j)) then getevent(buff(j))
else regretmess(buff(j));
end messall;
procedure readtext(pda,txt,bytes);
value pda,bytes; integer pda,bytes; array txt;
begin
integer array M,A(1:8);
cleararray(txt);
M(1):=3 shift 12;
M(2):=firstaddr(txt);
M(3):=M(2)+bytes;
waitanswer(sendmessage(pda,M),A);
end readtext;
procedure checkmess;
begin
pda:=wordload(buff+6);
if wordload(buff+8)=7 shift 12 and
wordload(buff+16)=351417 then begin
if oscomm or sysstate<>0 then goto NEXTEVENT else
proccommand(buff,c1);
end else begin
getevent(buff);
ba:=buff;
result:=2;
senda;
end;
goto FIRSTEVENT;
end;
procedure writestat(pda);
value pda; integer pda;
begin zone z(((6+8)*3)//6+5,1,noerror);
real array N(1:1); integer i,j,k;
procedure noerror(z,i,j);
zone z; integer i,j;
;
redefarray(N,pda+2,2);
i:=1;
open(z,8,string N(increase(i)),-1);
k:=(getclock-doubleload(syspda+60))/600000;
i:=k//(24*60);
j:=(k-i*(24*60))//60;
write(z,<:<10>p:>,<< dd>,i,j,k mod 60);
k:=doubleload(syspda+56)/10000;
i:=k//3600;
j:=(k-i*3600)//60;
write(z,<:, :>,<< dd>,i,j,k mod 60);
write(z,<< ddd ddd>,<:<10>total:>,totalruntime,
<:<10>shift:>,noshift,<:<10>block:>,blocksread,
<:<10>:>);
close(z,true);
end writestat;
procedure startorremove(B,pda,no);
value B,pda,no; boolean B; integer pda,no;
begin
integer i,j; real t1,t2; real array CHILD(1:2),N(1:1);
long k;
zone z(15,1,noerror);
procedure noerror(z,s,b);
zone z; integer s,b; ;
if pda>0 then
begin
redefarray(N,pda+2,2);
i:=1;
open(z,8,string N(increase(i)),-1);
i:=1; nameload(Ppda(no)+2,CHILD);
systime(1,0,t1);
write(z,<:<10>:>,string CHILD(increase(i)),
if B then <: started:> else <: removed:>,
<< dd dd dd>,systime(2,t1,t2),t2,<:.<10>:>);
if -,B then
begin
k:=doubleload(Ppda(no)+56)/10;
write(z,<:Run time:>);
if k<1000 then write(z,k,<: ms:>) else
if k<120000 then write(z,<< ddd.dd>,k/1000,<: s:>) else
begin
k:=k/1000;
i:=k//3600; k:=k-i*3600;
j:=k//60; k:=k-j*60;
if i>0 then write(z,i,<:h:>);
if j>0 then write(z,j,<:m:>);
if k>0 then write(z,k,<:s:>);
end;
write(z,<:.<10>:>);
end -,B;
close(z,true);
end;
end startorremove;
\f
boolean procedure proccommand(buff,terminal);
value buff, terminal;
integer buff, terminal;
comment takes care of a command from a p-process;
begin
integer ba, res, f, l;
integer array NAME(1:4);
proccommand:=true;
for ba:=1 step 1 until 4 do NAME(ba):=wordload(buff+8+ba*2);
if careaproc(NAME)<>0 then
begin
res:=2;
goto EPC;
end;
begin
boolean array C(1:512);
M(1):=3 shift 12;
f:=M(2):=firstaddr(C);
l:=M(3):=f+510;
M(4):=0;
ba:=sendmessage(description(NAME),M);
if ba=0 then
begin proccommand:=false; removeproc(NAME); goto ENDPC; end;
proccommand:=true;
res:=waitanswer(ba,M);
interprete(f,l,terminal);
res:=if COMMAREA(1)=114 shift 8 add 101 shift 8 add 97 then 1 else 3;
removeproc(NAME);
end;
EPC:
getevent(buff);
sendanswer(res,buff,M);
ENDPC:
end proccommand;
boolean procedure changeio(ioaddr,child);
value ioaddr,child; integer ioaddr,child;
begin
comment changes the input/output for the childprocess given by the
number child to the terminal given by the address ioaddr.
The result is true if trouble, otherwise false;
changeio:=false;
if -,checkpda(ioaddr) then goto E1;
for j:=1 step 1 until child-1,child+1 step 1 until maxproc do
if Pterm(child)=Pterm(j) then goto Used;
Tpda(Pterm(child)):=0;
Used:
j:=findterm(ioaddr);
if j=0 then
for j:=1 step 1 until maxT do
if Tpda(j)=0 then begin Tpda(j):=ioaddr; goto Found; end;
Found:
if j>maxT then
E1:begin changeio:=true; goto OUT; end;
Pterm(child):=j;
OUT:
end changeio;
\f
procedure interprete(firstadr,lastadr,sendadr);
value firstadr, lastadr, sendadr;
integer firstadr, lastadr, sendadr;
comment interpretes the commands in the area from firstadr to
lastadr,
deliveres the appropriate answer in the COMMAREA;
begin
integer i, bufferclaim, areaclaim, funcmask, catalogmask,
inpda, outpda, procpda, ba, procno, termno, type,
char,charlast,charshift,charno;
integer array NAME, HNAME(1:4), BUF(1:1);
real r;
boolean pass, perunits,convert;
procedure nextchar;
begin
if charshift>0 then
begin
charno:=charno + 1;
if charno > charlast then
begin char:=10; goto OUT; end;
charshift:=-16;
end;
char:=BUF(charno) shift charshift extract 8;
charshift:=charshift + 8;
if (char<=45 and char<>10 and char<>32 and char<>0)
or (char>=58 and char<=96)
or char>=126 then goto SYNER;
OUT:
end nextchar;
integer procedure readint;
begin
for i:=0 while char=32 or char=0 do nextchar;
if char=10 then
begin readint:=-2; goto ENDRI; end;
readint:=-1;
if -,(char>47 and char<58) then goto ENDRI;
REPI:
if char<>32 and char<>10 and char<>46 and char<>47 then
begin
if -,(char>47 and char<58) then goto SYNER;
i:=i*10+(char-48);
nextchar;
goto REPI;
end;
readint:=i;
ENDRI:
end readint;
\f
integer procedure readname(NAME);
integer array NAME;
comment reads a textstring into NAME;
begin
integer nidx, nsh;
for i:=0 while char=32 or char=0 do nextchar;
if char=10 then begin readname:=-2; goto OUT; end;
if char>=48 and char<=57 then begin readname:=-1; goto OUT; end;
for nidx:=1 step 1 until 4 do NAME(nidx):=0;
nidx:=1; nsh:=16;
REPN:
if char<>32 and char<>10 and char<>46 and char<>47 then
begin
if -,((char>96 and char<126)or(char>47 and char<58)) then
goto SYNER;
NAME(nidx):=NAME(nidx) add (char shift nsh);
if nsh=0 then
begin
nidx:=nidx+1;
if nidx>4 then goto SYNER;
nsh:=16;
end
else nsh:=nsh-8;
nextchar;
goto REPN;
end;
readname:=nidx;
OUT:
end readname;
\f
charlast:=(lastadr-firstadr) shift (-1) + 1;
redefarray(BUF,firstadr,charlast);
charno:=1; charshift:=-16;
nextchar;
if sendadr<0 or char=10 then goto OK;
disc:=pass:=perunits:=convert:=false;
bufferclaim:=5;
areaclaim:=6;
maxbc:=10;
maxac:=7;
catalogmask:=1 shift 23;
inpda:=outpda:=sendadr;
funcmask:=1 shift 11+1 shift 10+1 shift 9+1 shift 8+1 shift 7
+1 shift 6+1 shift 5;
termno:=findterm(sendadr);
if termno=0 then
begin
for termno:=1 step 1 until maxT do
if Tpda(termno)=0 then
begin
Tpda(termno):=sendadr;
goto OUTT;
end;
end;
OUTT:
if termno>maxT then goto NORESOURCES;
NEXT:
i:=readname(HNAME);
if i=-2 then goto OK;
if i=-1 then goto SYNER;
NEXT2:
HNAME(2):=HNAME(2) - HNAME(2) extract 8;
r:=0.0 shift 24 add HNAME(1) shift 24 add HNAME(2);
for type:=1 step 1 until 23 do
if r=real(case type of (
<:conso:>,<:list:>,<:pass:>,<:stat:>,<:user:>,
<:offus:>,<:timei:>,<:slice:>,<:main:>,<:chang:>,<:cpuus:>,
<:new:>,<:proc:>,<:call:>,<:mode:>,<:inter:>,<:pstop:>,
<:relt:>,<:rest:>,<:mess:>,<:end:>,<:submi:>,<:conve:>)) then
goto ACTION;
goto SYNER;
ACTION:
case type of
begin
\f
begin
comment consolename;
nameload(sendadr+2,COMMAREA);
COMMAREA(5):=10 shift 8 add 114 shift 8 add 101;
COMMAREA(6):=97 shift 8 add 100 shift 8 add 121;
bytesmove:=12;
goto ENDINT;
end;
begin zone z(60,1,noerror);
integer i,j,k; real array N(1:1);
procedure noerror(z,i,j); zone z; integer i,j; ;
comment list;
redefarray(N,sendadr+2,2); i:=1;
open(z,8,string N(increase(i)),-1);
for j:=1 step 1 until maxproc do
if Ppda(j)<>0 then
begin
redefarray(N,Ppda(j)+2,2); i:=1;
write(z,false add 32,12-
write(z,<:<10>:>,string N(increase(i))));
redefarray(N,Tpda(Pterm(j))+2,2); i:=1;
write(z,Pstate(j),TBstate(j),Pignore(j),
<: :>,string N(increase(i)));
end j;
write(z,<:<10>max:>);
i:=byteload(syspda+26) - maxproc;
j:=byteload(syspda+27) - 1;
k:=byteload(syspda+28);
for i:=i,j,k do write(z,if i<0 then 0 else i);
write(z,<:<10>:>);
close(z,true);
goto OK;
end list;
T3:begin
comment password;
if readname(NAME)<0 then goto SYNER;
if description(NAME)<>0 then goto NAMECONFL;
T3a: if headandtail(NAME,M)<>0 or M(8)<>0 then goto UNKNOWN;
if M(1) extract 12<>21 then
begin
if -,Tallow(termno) then goto NOTALLOW;
end;
if M(13)>0 then bufferclaim:=M(13);
if M(14)>0 then areaclaim:=M(14);
if M(15)<>0 then funcmask:=M(15)extract 12;
catalogmask:=M(16);
perunits:=M(17)=1;
pass:=true;
goto T12;
end;
begin
comment stat;
if sendadr<>sysconpda then goto NOTALLOW;
writestat(sendadr);
goto NEXT;
end;
\f
begin
comment user;
i:=readint; if i<0 then goto SYNER;
if lookuptail(<:catalog:>,M)<>0 or
i<>M(10) extract 12 then goto NOTALLOW;
Tallow(termno):=true;
goto NEXT;
end;
begin comment offuser;
Tallow(termno):=false;
goto NEXT;
end;
begin
comment timeint;
i:=readint; if i<0 then goto SYNER;
if i>0 and i<timeslice and sendadr=sysconpda and Tallow(termno)
then timeint:=i else goto NOTALLOW;
goto NEXT;
end;
begin
comment slice;
i:=readint; if i<0 then goto SYNER;
if i>0 and i>timeint and sendadr=sysconpda and Tallow(termno)
then timeslice:=i else goto NOTALLOW;
goto NEXT;
end;
begin
comment change sysconsole. main.
it is checked that the calling console is console1 or console2;
if Tpda(termno)=description(<:console1:>) or
Tpda(termno)=description(<:console2:>) then sysconpda:=sendadr else
goto NOTALLOW;
goto NEXT;
end;
begin comment change frequency;
i:=readint; if i<0 then goto SYNER;
if i>=0 and i<100 and sendadr=sysconpda and Tallow(termno)
then ignoretimes:=i else goto NOTALLOW;
goto NEXT;
end;
begin comment max cpu allowed to use;
i:=readint; if i<0 then goto SYNER;
if i>0 and i<101 and sendadr=sysconpda and Tallow(termno)
then cpuused:=i else goto NOTALLOW;
goto NEXT;
end;
begin
comment new;
if sendadr<>sysconpda then goto SYNER;
readname(NAME);
T12:
REPNEW:
i:=readname(HNAME); if i=-1 then goto SYNER;
if i=-2 and pass then HNAME(1):=real<:run:>;
if HNAME(1)=112 shift 8 add 101 shift 8 add 114 then
begin
comment peripheral units;
if -,Tallow(termno) then goto NOTALLOW;
perunits:=true;
goto REPNEW;
end
else
if HNAME(1)=98 shift 8 add 117 shift 8 add 102 then
begin
comment buf;
if -,(Tallow(termno) or pass) then goto NOTALLOW;
i:=readint; if i<0 then goto SYNER;
if -,pass or i<bufferclaim
or (pass and Tallow(termno)) then bufferclaim:=i;
if -,Tallow(termno) and pass and bufferclaim>maxbc then
bufferclaim:=maxbc;
goto REPNEW;
end
else
if HNAME(1)=97 shift 8 add 114 shift 8 add 101 then
begin
comment area;
i:=readint; if i<0 then goto SYNER;
if -,pass or i<areaclaim
or (pass and Tallow(termno)) then areaclaim:=i;
if -,Tallow(termno) and (pass and areaclaim>maxac) then
areaclaim:=maxac;
goto REPNEW;
end
else
if HNAME(1)=99 shift 8 add 97 shift 8 add 116 then
begin
comment cat;
if -,Tallow(termno) then goto NOTALLOW;
REPCAT:
i:=readint;
if i<0 then goto REPNEW;
if i>23 then goto SYNER else
begin
catalogmask:=setbit(catalogmask,23-i,1);
goto REPCAT;
end;
end
else
if HNAME(1)=102 shift 8 add 117 shift 8 add 110 then
begin
comment func;
if -,Tallow(termno) then goto NOTALLOW;
REPFUNC:
i:=readint;
if i<0 then goto REPNEW;
if i>11 then goto SYNER else
begin
funcmask:=setbit(funcmask,11-i,1);
goto REPFUNC;
end
end
\f
else
if HNAME(1)=105 shift 8 add 110 shift 8 add 0 then
begin
comment in;
if readname(HNAME)<0 then goto SYNER;
inpda:=description(HNAME);
if inpda=0 then
begin
if lookuptail(HNAME,M)<>0 then goto IOER;
if careaproc(HNAME)<>0 then goto IOER;
inpda:=description(HNAME);
end;
goto REPNEW;
end
else
if HNAME(1)=111 shift 8 add 117 shift 8 add 116 then
begin
comment out;
if readname(HNAME)<0 then goto SYNER;
outpda:=description(HNAME);
if outpda=0 then
begin
if lookuptail(HNAME,M)<>0 then goto IOER;
if careaproc(HNAME)<>0 then goto IOER;
outpda:=description(HNAME);
end;
goto REPNEW;
end
else
if HNAME(1)=116 shift 8 add 101 shift 8 add 114 then
begin
integer pda;
comment term;
if -,Tallow(termno) then goto NOTALLOW;
if readname(HNAME)<0 then goto SYNER;
pda:=description(HNAME);
if pda=0 then goto IOER;
termno:=findterm(pda);
if termno=0 then
begin
for termno:=1 step 1 until maxT do
if Tpda(termno)=0 then
begin
Tpda(termno):=pda;
goto OUTTT;
end;
end;
OUTTT: if termno>maxT then goto NORESOURCES;
goto REPNEW;
end
else
if HNAME(1)=100 shift 8 add 105 shift 8 add 115 then
begin
comment disc;
disc:=true;
goto REPNEW;
end
else
\f
if HNAME(1)=114 shift 8 add 117 shift 8 add 110 or pass then
begin
comment run;
M(1):=childfirstadr;
M(2):=childlastadr+2;
if bufferclaim>
wordload(syspda+26)shift(-12)-maxproc or
areaclaim>
(wordload(syspda+26)extract 12 )-1 then goto NORESOURCES;
M(3):=bufferclaim shift 12 add areaclaim;
M(4):=funcmask;
M(5):=catalogmask;
M(6):=setbit((-1)extract 8,7-childkey,0) shift 12 add childkey;
procno:=0;
if disc then begin
for i:=maxdrumproc+1 step 1 until maxproc do
if Ppda(i)=0 then
begin procno:=i; goto OUTP; end;
end;
for i:=1 step 1 until maxproc do
if Ppda(i)=0 then
begin procno:=i; goto OUTP; end;
OUTP:
if procno=0 then goto NORESOURCES;
i:=createint(NAME,M);
if i=3 then goto NAMECONFL else if i<>0 then goto NORESOURCES;
Pstate(procno):=7;
Pterm(procno):=termno;
Pin(procno):=inpda;
Pout(procno):=outpda;
Pbufadr(procno):=0;
M(1):=if inpda<>sendadr then inpda else syspda;
M(2):=syspda;
M(3):=if outpda<>sendadr then outpda else syspda;
M(4):=Ppda(procno):=description(NAME);
M(5):=0;
M(6):=childfirstadr+2;
if modifyint(NAME,M)<>0 then error(<:modify:>,3);
if perunits then includeall(Ppda(procno)) else
for i:=0 step 1 until 12,48 step 1 until 67 do
include(Ppda(procno),i);
startorremove(true,Tpda(termno),procno);
bytesmove:=0;
goto ENDINT;
end run else goto UNKNOWN;
end new;
\f
begin
comment proc <name> remove, start, stop, dump, break,
include <no>, exclude <no>, remove <next>;
if readname(NAME)<0 then goto SYNER;
procpda:=description(NAME);
if readname(HNAME)<0 then goto SYNER;
procno:=0;
for i:=0,i+1 while i<maxproc and Ppda(i)<>procpda do;
if procpda<>0 and Ppda(i)=procpda then procno:=i else goto UNKNOWN;
if sendadr<>Tpda(Pterm(procno)) and sendadr<>sysconpda then
goto NOTALLOW;
if HNAME(1)=115 shift 8 add 116 shift 8 add 97 then
begin
comment start;
Pstate(procno):=1;
end
else
if HNAME(1)=115 shift 8 add 116 shift 8 add 111 then
begin
comment stop;
Pstate(procno):=6;
end
else
if HNAME(1)=100 shift 8 add 117 shift 8 add 109 then
begin comment dump;
Pstate(procno):=9;
end
else
if HNAME(1)=98 shift 8 add 114 shift 8 add 101 then
begin comment break;
Pstate(procno):=12;
end
else
if HNAME(1)=105 shift 8 add 110 shift 8 add 99 then
begin
comment include;
REPINC:
i:=readint;
if i<0 then goto NEXT;
i:=include(procpda,i);
if i<>0 then goto DEVUNKNOWN;
goto REPINC;
end
else
if HNAME(1)=101 shift 8 add 120 shift 8 add 99 then
begin
comment exclude;
REPEXC:
i:=readint;
if i<0 then goto NEXT;
i:=exclude(procpda,i);
if i<>0 then goto DEVUNKNOWN;
goto REPEXC;
end
else
if HNAME(1)=116 shift 8 add 101 shift 8 add 114 then
begin comment term <name>;
if readname(HNAME)<0 then goto SYNER;
i:=description(HNAME); if i=0 then goto UNKNOWN;
if changeio(i, procno) then goto NORESOURCES;
goto NEXT;
end
else goto SYNER;
end proc;
begin integer i;
comment call;
REPCALL:
i:=readint;
if i<0 then goto NEXT;
if i<8 or i>9 then begin
if -,Tallow(termno) then goto NOTALLOW; end;
if readname(NAME)<0 then goto SYNER;
i:=createper(NAME,i);
if i=3 then goto NAMECONFL else
if i=4 then goto DEVUNKNOWN else
if i>0 then goto NOTALLOW;
goto REPCALL;
end call;
begin
comment mode;
if Tallow(termno) and sendadr=sysconpda then begin
readname(HNAME);
if HNAME(1)=121 shift 8 add 101 shift 8 add 115 then
terminalmode:=true else
if HNAME(1)=110 shift 8 add 111 shift 8 add 10 then
terminalmode:=false else goto SYNER;
end else goto NOTALLOW;
goto NEXT;
end mode;
begin
comment pseudointerrupt;
if Tallow(termno) or sendadr=sysconpda then begin
if readname(HNAME)<0 then goto SYNER;
i:=pseudoint(HNAME);
if i<>0 then goto NOTALLOW;
end else goto NOTALLOW;
goto NEXT;
end interrupt;
begin
comment pstop;
if sendadr=c1 then begin
array start(1:3);
boolean stopcount;
pda:=Ppda(currproc);
stopcount:=byteload(pda+10)=0;
if stopcount then ba:=stopint(pda,0);
error(<:pstop:>,0);
releaseproc(<:ptext:>);
removeproc(<:ptext:>);
messall(<:p is stopped :>,1,false);
rep:
waitanswer(att,M);
if M(2)<>c1 then goto rep;
readtext(c1,start,8);
if start(1)<>real <:pstar:> add 116 then goto rep;
messall(<:now p is running again:>,1,false);
careaproc(<:ptext:>);
reserveproc(<:ptext:>,0);
if stopcount then begin
waitanswer(ba,M);
startint(pda);
end;
end else goto SYNER;
end pstop;
begin
comment releasetext;
if Tallow(termno) and sendadr=sysconpda then
releaseproc(<:ptext:>) else goto NOTALLOW;
end;
begin
comment reservetext;
careaproc(<:ptext:>);
reserveproc(<:ptext:>,0);
end;
begin
comment messall from console1;
if sendadr<>c1 then goto NOTALLOW;
messall(<::>,0,true);
end;
begin
comment endprogram;
if sendadr<>c1 or -,Tallow(termno) then goto NOTALLOW;
write(out,<:<12>blocksread :>,blocksread);
endprogram(true);
end;
begin comment submit <bsfile>/submit <bsfile>.print;
REPSUB:
i:=readname(NAME);
if i=-2 then goto OK;
if i=-1 then goto SYNER;
j:=0;
if char=46 or char=47 or convert then begin
goto NOTALLOW;
j:=30000;
if -,convert then begin
if readname(HNAME)<0 then goto SYNER;
if HNAME(1)<>112 shift 8 add 114 shift 8 add 105
then goto SYNER;
end submit.print;
end;
M(1):=12 shift 12+(if j=0 then 1 else 0);
for i:=1,2,3,4 do M(i+1):=NAME(i);
M(6):=j;
if waitanswer(sendmessage(<:kø:>,M),M)<>1 or M(1)<>0 then goto SERROR;
j:=M(2);
for i:=1 step 1 until 4 do COMMAREA(i):=NAME(i);
COMMAREA(5):=32 shift 8 add 106 shift 8 add 111;
COMMAREA(6):=98 shift 8 add 32 shift 8 add (j//1000+48);
i:=j mod 1000; j:=i mod 100;
COMMAREA(7):=(i//100+48) shift 8 add (j//10+48) shift 8
add(j mod 10+48);
bytesmove:=14;
goto ENDINT;
end;
begin
comment convert <bsfile>;
convert:=true;
type:=22;
goto REPSUB;
end convert;
end case;
\f
OK:
COMMAREA(1):=114 shift 8 add 101 shift 8 add 97;
COMMAREA(2):=100 shift 8 add 121 shift 8 add 0;
bytesmove:=3;
comment ready;
goto ENDINT;
SYNER:
COMMAREA(1):=115 shift 8 add 121 shift 8 add 110;
COMMAREA(2):=116 shift 8 add 97 shift 8 add 120;
COMMAREA(3):=32 shift 8 add 101 shift 8 add 114;
COMMAREA(4):=114 shift 8 add 111 shift 8 add 114;
bytesmove:=8;
comment syntax error;
goto ENDINT;
UNKNOWN:
COMMAREA(1):=117 shift 8 add 110 shift 8 add 107;
COMMAREA(2):=110 shift 8 add 111 shift 8 add 119;
COMMAREA(3):=110 shift 8 add 0 shift 8 add 0;
bytesmove:=5;
comment unknown;
goto ENDINT;
IOER:
COMMAREA(1):=105 shift 8 add 110 shift 8 add 32;
COMMAREA(2):=111 shift 8 add 117 shift 8 add 116;
COMMAREA(3):=32 shift 8 add 101 shift 8 add 114;
COMMAREA(4):=114 shift 8 add 111 shift 8 add 114;
bytesmove:=8;
comment in out error;
goto ENDINT;
NAMECONFL:
COMMAREA(1):=110 shift 8 add 97 shift 8 add 109;
COMMAREA(2):=101 shift 8 add 32 shift 8 add 99;
COMMAREA(3):=111 shift 8 add 110 shift 8 add 102;
COMMAREA(4):=108 shift 8 add 105 shift 8 add 99;
COMMAREA(5):=116 shift 8 add 0 shift 8 add 0;
bytesmove:=9;
comment name conflict;
goto ENDINT;
NOTALLOW:
COMMAREA(1):=110 shift 8 add 111 shift 8 add 116;
COMMAREA(2):=32 shift 8 add 97 shift 8 add 108;
COMMAREA(3):=108 shift 8 add 111 shift 8 add 119;
COMMAREA(4):=101 shift 8 add 100 shift 8 add 0;
bytesmove:=7;
comment not allowed;
goto ENDINT;
NORESOURCES:
COMMAREA(1):=110 shift 8 add 111 shift 8 add 32;
COMMAREA(2):=114 shift 8 add 101 shift 8 add 115;
COMMAREA(3):=111 shift 8 add 117 shift 8 add 114;
COMMAREA(4):=99 shift 8 add 101 shift 8 add 115;
bytesmove:=8;
comment no resources;
goto ENDINT;
DEVUNKNOWN:
COMMAREA(1):=100 shift 8 add 101 shift 8 add 118;
COMMAREA(2):=105 shift 8 add 99 shift 8 add 101;
COMMAREA(3):= 32 shift 8 add 117 shift 8 add 110;
COMMAREA(4):=107 shift 8 add 110 shift 8 add 111;
COMMAREA(5):=119 shift 8 add 110 shift 8 add 0;
bytesmove:=9;
comment device unknown;
SERROR:
COMMAREA(1):=115 shift 8 add 117 shift 8 add 98;
COMMAREA(2):=109 shift 8 add 105 shift 8 add 116;
COMMAREA(3):= 32 shift 8 add 101 shift 8 add 114;
COMMAREA(4):=114 shift 8 add 111 shift 8 add 114;
bytesmove:=8;
comment submit error;
goto ENDINT;
ENDINT:
if bytesmove<0 then
begin bytesmove:=2; COMMAREA(1):=0; end else
if bytesmove extract 1=1 then
begin bytesmove:=bytesmove+1;
COMMAREA(bytesmove//2):=COMMAREA(bytesmove//2) add 10;
end else
begin bytesmove:=bytesmove+2; COMMAREA(bytesmove//2):=10; end;
end interprete;
boolean procedure Breakexec;
begin
Breakexec:=false;
if Pstate(currproc)=9 then
begin
if generaten(Bname)<>0 or reservesegm(Bname,(M(3)+2-M(2))//512)<>0
or careaproc(Bname)<>0 or reserveproc(Bname,0)<>0 then
begin Pstate(currproc):=6; removeproc(Bname); Breakexec:=true; end;
M(2):=firstaddr(Bfname); M(3):=M(2)+14;
pda:=Tpda(Pterm(currproc));
sysstate:=4; Pstate(currproc):=10;
end else
if Pstate(currproc)=10 then
begin
M(4):=0; pda:=description(Bname);
sysstate:=4; Pstate(currproc):=11;
end else
begin
permentry(Bname,0);
removeproc(Bname); Pstate(currproc):=10;
Breakexec:=true;
end;
end Breakexec;
\f
procedure remove(procno);
value procno;
integer procno;
comment removes procno;
begin
integer tbstate, pda;
tbstate:=TBstate(procno);
if tbstate>0 and TBtermbuf(procno)>0 then TBstate(procno):=21else
TBstate(procno):=TBtermbuf(procno):=TBprocbuf(procno):=0;
tbstate:=TBstate(procno);
pda:=Ppda(procno);
removeproc(pda);
for pda:=Pin(procno),Pout(procno) do
begin
if pda<>syspda then
begin
if wordload(pda)=4 then removeproc(pda);
end;
end;
if tbstate=0 then Ppda(procno):=0;
Pstate(procno):=Pterm(procno):=Pin(procno):=
Pout(procno):=Pbufadr(procno):=Pignore(procno):=0;
Ptobemod(procno):=Ptorun(procno):=false;
end remove;
\f
boolean procedure command(buff);
value buff;
integer buff;
comment takes care of the OS communication;
begin
own integer times, sendadr;
if times=0 then
begin
comment answer from operator;
waitanswer(buff,M);
sendadr:=M(2);
M(1):=3 shift 12;
M(2):=firstcommarea;
M(3):=lastcommarea;
operatorbuf:=sendmessage(sendadr,M);
times:=1;
command:=true;
oscomm:=true;
end
else
if times=1 then
begin
comment a serie of commands in COMMAREA;
if sysstate=0 then
begin
waitanswer(buff,M);
interprete(firstcommarea,lastcommarea,
if M(3)=0 then -1 else sendadr);
M(1):=5 shift 12;
M(2):=firstcommarea;
M(3):=firstcommarea+bytesmove-2;
operatorbuf:=sendmessage(sendadr,M);
times:=2;
command:=true;
end
else command:=false;
end
else
if times=2 then
begin
comment communication finished;
waitanswer(buff,M);
operatorbuf:=att;
times:=0;
command:=true;
oscomm:=false;
end
else error(<:command:>,3);
end command;
\f
boolean procedure parent_mess(buff,procno);
value buff, procno;
integer buff, procno;
comment takes action of a parentmessage, as follows from the
BOSS manual;
begin
boolean pause;
integer ba, i, res, pda;
integer array T(1:4);
if mess=7 shift 12 then
begin
if sysstate=0 then parent_mess:=proccommand(buff,Tpda(Pterm(procno)))
else parent_mess:=false;
goto ENDPL;
end;
pause:= mess extract 1 = 1;
if Pstate(procno)=0 or Pstate(procno)=6 or Pstate(procno)>=8 then
goto ENDPAR;
for i:=4 step 1 until 6 do
COMMAREA(i):= case (i-3) of (
if pause then 10 shift 8 add 112 shift 8 add 97
else 10 shift 8 add 109 shift 8 add 101,
if pause then 117 shift 8 add 115 shift 8 add 101
else 115 shift 8 add 115 shift 8 add 97,
if pause then 32 shift 8 add 0 shift 8 add 0
else 103 shift 8 add 101 shift 8 add 32 );
nameload(Ppda(procno)+2,T);
T(4):=T(4) add 32;
for i:=7 step 1 until 10 do
COMMAREA(i):=T(i-6);
for i:=11 step 1 until 17 do
COMMAREA(i):=wordload(buff+8+(i-10)*2);
M(1):=5 shift 12;
M(2):=firstcommarea+6;
M(3):=firstcommarea+32;
ba:=sendmessage(Tpda(Pterm(procno)),M);
if ba=0 then
begin parent_mess:=false; goto ENDPL; end;
res:=waitanswer(ba,M);
if mess=1 shift 13 add 1 then Pstate(procno):=8 else
if pause then Pstate(procno):=6;
ENDPAR:
parent_mess:=true;
getevent(buff);
M(1):=M(2):=M(3):=0;
sendanswer(1,buff,M);
ENDPL:
end parent_mess;
\f
integer procedure findterm(pda);
value pda;
integer pda;
comment finds the number of the terminal with PDA=pda,
0 if none;
begin
integer i;
if pda>0 then
for i:=1 step 1 until maxT do
if Tpda(i)=pda then
begin
findterm:=i;
goto FTEND;
end;
findterm:=0;
FTEND:
end findterm;
boolean procedure sense(buff,procno);
value buff, procno;
integer buff, procno;
comment executes sense of a terminal;
begin
integer pda, res, ba;
sense:=false;
M(1):=0;
ba:=sendmessage(Tpda(Pterm(procno)),M);
if ba=0 then goto ENDS;
res:=waitanswer(ba,M);
getevent(buff);
sendanswer(res,buff,M);
sense:=true;
ENDS:
end sense;
\f
integer procedure modify(procno);
value procno;
integer procno;
comment modifyes procno for input or output;
begin
integer tbfirst, state, firstadr, lastadr, procbuf;
state:=TBstate(procno);
procbuf:=TBprocbuf(procno);
tbfirst:=TBfirstadr(procno);
coreaddr:=procbuf+10;
firstadr:=wordl;
from:=to:=tbfirst;
bytes:=0;
if state=4 then
begin
coreaddr:=procbuf+12;
lastadr:=wordl;
bytes:=lastadr-firstadr+2;
if bytes>TBsize then bytes:=TBsize;
from:=firstadr;
TBstate(procno):=5;
end
else
if state=3 then
begin
ba:=TBtermbuf(procno);
result:=waita;
bytes:=M(2);
to:=firstadr;
getevent(procbuf);
M(1):=0;
ba:=procbuf;
TBstate(procno):=TBtermbuf(procno):=TBprocbuf(procno):=0;
end;
if bytes>0 then moveb;
if state=3 then senda;
modify:=bytes;
Ptobemod(procno):=false;
end modify;
\f
initp;
goto FIRSTEVENT;
\f
MESSAGE:
procno:=0;
coreaddr:=buff+6;
pda:=wordl;
if pda>0 then
for i:=1 step 1 until maxproc do
if Ppda(i)=pda then procno:=i;
if procno=0 then check_mess
else
begin
coreaddr:=buff+8;
mess:=wordl;
if mess=0 then
goto (if sense(buff,procno) then FIRST_EVENT else NEXT_EVENT)
else
if mess=3 shift 12 or mess=5 shift 12 then goto I_O_MESSAGE
else
if -,oscomm then
begin if parent_mess(buff,procno) then goto FIRSTEVENT; end;
goto NEXTEVENT;
end;
\f
I_O_MESSAGE:
tbstate:=TBstate(procno);
if tbstate>=6 then goto NEXT_EVENT;
if tbstate=0 then
begin
TBstate(procno):=tbstate:=if mess =3 shift 12 then 1 else 4;
TBprocbuf(procno):=buff;
end;
tobedumped:=currproc=procno;
if tbstate=4 and tobedumped then
begin
tobedumped:=modify(currproc)>16;
tbstate:=TBstate(procno):=5;
end
else
if tbstate=4 then Ptobemod(procno):=true;
if tbstate=1 or tbstate=5 then
begin
M(1):=if tbstate=1 then 19 shift 12 else 21 shift 12;
i:=M(2):=TBfirstadr(procno);
coreaddr:=buff+12;
j:=wordl;
coreaddr:=coreaddr-2;
j:=j-wordl;
if j>TBsize-2 then j:=TBsize-2;
M(3):=i+j;
M(4):=Ppda(procno);
pda:=Tpda(Pterm(procno));
i:=sendm;
if i=0 then goto NEXT_EVENT;
TBtermbuf(procno):=i;
tbstate:=TBstate(procno):=tbstate+1;
if tobedumped then goto FIND_NEXT;
end;
goto NEXT_EVENT;
\f
comment buff = the BA,
mess = the answer;
COMM_ANSWER:
if command(buff) then goto FIRST_EVENT else goto NEXT_EVENT;
\f
I_O_ANSWER:
tbstate:=TBstate(procno);
if tbstate=2 then
begin
TBstate(procno):=3;
Ptobemod(procno):=true;
if procno=currproc then
begin modify(currproc); goto FIRST_EVENT; end;
if terminalmode then Ptorun(procno):=true;
goto NEXT_EVENT;
end;
if tbstate=6 then
begin
i:=TBprocbuf(procno);
getevent(i);
ba:=buff;
result:=waita;
M(1):=0;
ba:=i;
senda;
end
else
if tbstate=21 and Pstate(procno)=0 then
begin
ba:=buff;
waita;
Ppda(procno):=0;
end
else goto NEXT_EVENT;
TBstate(procno):=TBprocbuf(procno):=TBtermbuf(procno):=0;
if procno<>currproc and terminalmode and tbstate<>21 then
Ptorun(procno):=true;
goto FIRST_EVENT;
\f
CLOCK:
time:=time+1;
if time<timeslice then
begin
if terminalmode and sysstate=0 then
for i:=1 step 1 until maxproc do
if i<>currproc and Ptorun(i) then goto FIND_NEXT;
totalruntime:=totalruntime+timeint;
ba:=clockbuf;
waita;
M(1):=0;
M(2):=timeint;
pda:=clockpda;
clockbuf:=sendm;
goto FIRST_EVENT;
end;
FIND_NEXT:
time:=0;
nextproc:=0; return:=false;
for procno:=currproc+1 step 1 until maxproc,
1 step 1 until currproc do
if Pignore(procno)>0 then Pignore(procno):=Pignore(procno)-1 else
if Pstate(procno)>0 then
begin
case Pstate(procno) of
begin
begin nextproc:=procno; goto FOUND; end;
;
begin
comment waiting for message, state=3;
coreaddr:=lastevent:=Ppda(procno)+14;
for coreaddr:=wordl while coreaddr<>lastevent and -,return do
begin
coreaddr:=coreaddr+4;
i:=wordl;
return:=i<0 or i>5;
coreaddr:=coreaddr-4;
end;
end;
begin
comment waiting for answer, state=4,
Pbufadr holds then BA of the answer;
return:=Ptobemod(procno) and Pbufadr(procno)=TBprocbuf(procno);
coreaddr:=lastevent:=Ppda(procno)+14;
for coreaddr:=wordl while -,return and coreaddr<>lastevent do
return:=Pbufadr(procno)=coreaddr;
end;
\f
begin
comment waiting for event, state=5,
Pbufadr holds the BA of lastbuffer;
coreaddr:=Pbufadr(procno);
return:=(Ptobemod(procno) and coreaddr=TBprocbuf(procno))
or (wordl)<>Ppda(procno)+14;
end;
;
begin nextproc:=procno; goto FOUND; end;
if currproc<>procno then begin nextproc:=procno; goto FOUND; end;
begin nextproc:=procno; goto FOUND; end break;
begin comment break is executed; end;
end case;
if return then
begin Pstate(procno):=1;
nextproc:=procno; goto FOUND;
end;
end for;
FOUND:
i:=if currproc=0 then 1 else
if Pstate(currproc)=8 then 3 else
if Ptobemod(currproc) then 4 else 2;
j:=if nextproc=0 then 1 else
if Pstate(nextproc)=8 then 3 else
if Ptobemod(nextproc) then 4 else 2;
type:=DES(if i=4 and currproc=nextproc then 17 else
if i=2 and j=2 and currproc=nextproc then 1 else (i-1)*4+j);
if nextproc>0 then Ptorun(nextproc):=false;
if currproc<>nextproc then noshift:=noshift+1;
\f
CHANGE:
for act:=sysstate step 1 until 12 do
if testbit(type,act) then
begin
case act+1 of
begin
modify(currproc);
begin
comment stop current, act=1;
pda:=Ppda(currproc);
Pignore(currproc):=if doubleload(pda+56)*100
//(getclock-doubleload(pda+60))<cpuused then 0
else ignoretimes;
ba:=changebuf;
waita;
changebuf:=stopi;
sysstate:=2;
goto FIRST_EVENT;
end 1;
begin
comment check instr, act=2;
coreaddr:=Ppda(currproc)+48;
coreaddr:=wordl;
instr:=wordl;
if (instr shift (-18)) extract 6=14 and
(instr shift (-11)) extract 1 =1 and
Pstate(currproc)=1 then
begin
instr:=instr extract 10;
i:=Pstate(currproc):=if instr=20 then 3 else
if instr=18 then 4 else
if instr=24 then 5 else 1;
coreaddr:=Ppda(currproc)+42;
if i>3 then Pbufadr(currproc):=wordl;
if i=5 and Pbufadr(currproc)=0 then
Pbufadr(currproc):=Ppda(currproc)+14;
end;
end 2;
remove(currproc);
begin
comment dump current, break act=4;
ba:=changebuf;
waita;
M(1):=5 shift 12;
M(2):=childfirstadr;
M(3):=childlastadr;
if Pstate(currproc)<9 then
A: begin
M(4):=childsegm*
((if currproc>maxdrumproc then currproc-maxdrumproc
else currproc)-1);
pda:=if currproc>maxdrumproc then pdumpareapda2
else pdumpareapda;
sysstate:=5;
end else if Breakexec then goto A;
changebuf:=sendm;
goto FIRST_EVENT;
end 4;
if currproc<>nextproc then remove(nextproc);
;
begin
comment load next, act=7;
ba:=changebuf;
waita;
M(1):=3 shift 12;
M(2):=childfirstadr;
M(3):=childlastadr;
M(4):=childsegm*
((if nextproc>maxdrumproc then nextproc-maxdrumproc
else nextproc)-1);
pda:=if nextproc>maxdrumproc then pdumpareapda2
else pdumpareapda;
if Pstate(nextproc)=7 then
begin
M(3):=childfirstadr+3584;
M(4):=0;
pda:=fppda;
Pstate(nextproc):=1;
end;
changebuf:=sendm;
sysstate:=8;
goto FIRSTEVENT;
end 7;
modify(nextproc);
if Pstate(nextproc)<9 then
begin
comment start next, act=9;
pda:=Ppda(nextproc);
starti;
end 9;
currproc:=0;
begin
comment goto FINDNEXT, act=11;
sysstate:=0;
goto FIND_NEXT;
end 11;
begin
comment return, act=12;
totalruntime:=totalruntime+timeint;
ba:=clockbuf;
waita;
M(1):=0;
M(2):=timeint;
pda:=clockpda;
clockbuf:=sendm;
sysstate:=0;
currproc:=nextproc;
goto FIRSTEVENT;
end 12;
end case;
end for-if;
\f
FIRST_EVENT: buff:=0;
NEXT_EVENT: res:=wait_event(buff);
if res=0 and sysstate=0 then goto MESSAGE else
if res=0 then goto NEXT_EVENT else
if buff=changebuf and sysstate>0 then goto CHANGE else
if buff=changebuf then goto NEXT_EVENT else
if buff=operatorbuf then goto COMM_ANSWER
else
if buff=clockbuf and sysstate=0 then goto CLOCK
else
if buff=clockbuf then begin time:=0; goto CLOCK end else
begin
for procno:=1 step 1 until maxTB do
if TBtermbuf(procno)=buff then goto IO_ANSWER;
getevent(buff);
goto FIRSTEVENT;
end;
end;
end;
ENDPROG:
end
head
(end
prun 0)
▶EOF◀