|
|
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: 10752 (0x2a00)
Types: TextFile
Names: »kkmaster«
└─⟦667bb35d6⟧ Bits:30007480 RC8000 Dump tape fra HCØ.
└─⟦4334b4c0b⟧
└─⟦this⟧ »kkmaster«
(o kkmt
master=pascal list.yes codesize.1000
scope user master
o c
finis)
program masterprocess (input,output);
label 10,20,30,40,50,60,70,80,90;
const m1=' '; m2=' '; m3=' '; m4=' '; m5=' ';
m6=' '; m7=' '; m8=' '; m9=' ';
m10=' ';
one_shift_22 = 4194304;
one_shift_23 = -8388608;
three_shift_12=12288;
mirror = 8388603;
buf_stack_top=200;
first_proc=-14;
first_buff=-10;
type halfword = -2048 .. 2047;
linkb = ^mes_buf;
linkp = ^proc_descr;
linkw1 = ^w1_area;
linkw3 = ^w3_area;
bsclaims = record
key0,key1,key2,key3: record slices,entries: integer;
end;
end;
base = record lower,upper: integer; end;
link = record next,prev: integer; end;
size = record first,last: integer; end;
save = record addr,g20,g21,g22,g23,g24,b18,b19:integer; end;
i_lev = packed record mon,user: halfword; end;
proc_descr= record
pda_oc: integer;
type_oc: 0 .. 5;
pda_master: integer;
ci:packed record comp_no,i_claim:halfword; end;
cpu_mask:packed record running,allowed: halfword; end;
proc_base: base;
kind: 0 .. 64;
name: alfa;
ss: packed record stopcount,state:halfword; end;
id_bit:packed record rel,bit: halfword;
end;
event: link;
time_slice: link;
addr_space: size;
claims: packed record buff,area,ip,func_m:halfword end;
priority: -1 .. 8388606;
mode: integer;
int_mask: integer;
userexc,useresc,i_cpa,i_base: integer;
wr_limits: size;
int_level: i_lev;
parent: integer;
quantum: integer;
runtime,starttime,startwait: real;
waitaddr: integer;
cat_base,max_base,std_base: base;
w0,w1,w2,w3: integer;
status,ic,cause,sb: integer;
curr_cpa,curr_base: integer;
curr_wr_lim: size;
curr_int_level: i_lev;
save_area: save;
drum,drum1,disc,disc1,disc2,disc3: bsclaims;
end;
mes_buf = record
addr_oc: integer;
r_s:packed record rec,sen:halfword; end;
rec_oc: integer;
sen_oc: integer;
flag_w2: integer;
buf: link;
receiver: integer;
sender: integer;
om:packed record op,mode:halfword; end;
m8,m10,m12,m14,m16,m18,m20,m22: integer;
end;
w1_area = record
addr_space: size;
claims:packed record buf,area:halfword end;
internal_oc: integer;
p_type: integer;
max: base;
std: base;
claims_oc:packed record
buf,area,ip,func:halfword;
end;
end;
w3_area = record name: alfa;
table_addr: integer;
end;
var proc:linkp;
buf,buf1:linkb;
pw1:linkw1;
pw3:linkw3;
sysrec_addr,wreg2,
computer_no,buf_a1,res1,res2,res3,f_a_buf1,buff_addr1,
buf_pointer,f_a_pw1,f_a_pw3,buff_addr,this_comp_no,xx,m_p_n,
pda_this_proc,systrm_addr,addr,f_a_proc,f_a_buf,res:integer;
mess: arrayÆ1..8Å of integer;
answ: arrayÆ1..8Å of integer;
buf_stack: arrayÆ1..200Å of integer;
sysdma,name1,wreg1,wreg3:alfa;
procedure move_buff(var a,ba:integer);
begin
sendfurther(a,ba);
end;
procedure stack_buf(a:integer);
begin
xx:=buf_stackÆbuf_pointerÅ;
buf_stackÆbuf_pointerÅ:=a;
buf_pointer:=xx;
end;
begin
buf_pointer:=1;
for xx:=1 to buf_stack_top do
buf_stackÆxxÅ:=xx+1;
buf_stackÆbuf_stack_topÅ:=1;
this_comp_no:=0;
systrm_addr:=description('systrm');
sysrec_addr:=description('sysrec');
pda_this_proc:=description('master');
f_a_proc:=firstaddress(proc);
f_a_pw1:=firstaddress(pw1);
f_a_pw3:=firstaddress(pw3);
f_a_buf:=firstaddress(buf);
f_a_buf1:=firstaddress(buf1);
sysdma:='sysdma';
10:
buff_addr:=0;
res:=waitevent(buff_addr);
addr:=buff_addr+first_buff;
wordstore(f_a_buf,addr);
(* res=1 normal answer to this proc
res=0 message from
1) monitor at this computer
2) a master process (another computer)
a) to a real process (this computer)
(i) message
(ii) answer
b) to master (this computer)
3) systrm at this computer
4) a useal process to
a) a mirror process (this computer)
b) master process (another computer)
c) master process (this computer)
*)
if res=1 then goto 20; (* answer to this proc*)
if buf^.m8>=one_shift_22 then
begin
if buf^.rec_oc=-1 then
goto 30; (*moncall this computer else*)
goto 40 (*moncall another computer*)
end;
if buf^.receiver=pda_this_proc then goto 50; (*message to master*)
if buf^.addr_oc=1 then goto 90; (*command is transmitted*)
if buf^.addr_oc=-1 then
begin
stack_buf(buff_addr);
goto 10;
end; (*stack buffer*)
if buf^.addr_oc=-2 then goto 60; (*transfer rejected*)
if (buf^.addr_oc>0) and (buf^.receiver>10) then
goto 70; (*message from another computer*)
(* else a buffer (answer or message) from an useal process (this computer)
to a mirror process (a real process on another computer) *)
if buf^.receiver>10 then
begin
addr:=buf^.receiver+first_proc;
wordstore(f_a_proc,addr);
if proc^.pda_master<>pda_this_proc then goto 80; (*reject message*)
buf^.addr_oc:=buff_addr;
buf^.r_s.sen:=this_comp_no;
buf^.r_s.rec:=proc^.ci.comp_no;
buf^.rec_oc:=proc^.pda_oc;
addr:=buf^.sender+first_proc;
wordstore(f_a_proc,addr);
buf^.sen_oc:=proc^.pda_oc;
end;
move_buff(systrm_addr,buff_addr);
goto 10; (* wait event *)
20: (*answer to this proc *)
goto 10; (* wait event*)
30: (* moncall this computer *)
buf^.r_s.sen:=computer_no;
m_p_n:=buf^.m8-one_shift_22;
wordstore(f_a_pw1,buf^.m12);
wordstore(f_a_pw3,buf^.m16);
if (m_p_n<>64) or ((m_p_n=64) and (pw1^.p_type=mirror)) then
begin
buf^.r_s.rec:=pw1^.p_type-one_shift_23;
buf^.r_s.sen:=this_comp_no;
move_buff(systrm_addr,buff_addr);
end;
if m_p_n=56 then
begin
(* create an internal mirrorprocess (this computer) *)
pw1^.p_type:=0;
wreg3:=pw3^.name;
buf^.m10:=createinternalprocess(wreg3,ord(pw1));
wordstore(f_a_proc,pw3^.table_addr);
proc^.type_oc:=5;
proc^.pda_master:=pda_this_proc;
end;
stack_buf(buff_addr);
goto 10;
40: (* moncall another computer *)
messÆ5Å:=buf^.r_s.sen;
messÆ1Å:=three_shift_12;
if buf^.m8-one_shift_22=64 then
begin
messÆ2Å:=ord(pw1);
messÆ3Å:=messÆ2Å+18;
messÆ4Å:=buf^.m12;
buf_a1:=sendmessage(wreg2,sysdma,mess);
res1:=waitanswer(buf_a1,answ);
end;
messÆ2Å:=ord(pw3);
messÆ3Å:=messÆ2Å+10;
messÆ4Å:=buf^.m16;
buf_a1:=sendmessage(wreg2,sysdma,mess);
res2:=waitanswer(buf_a1,answ);
wreg3:=pw3^.name;
case (buf^.m8-one_shift_22) of
56: res3:=createinternalprocess(wreg3,pw1^);
(*58: res3:=startinternalprocess(wreg3);*)
(*60: res3:=modyfiinternalprocess(wreg3);*)
(*62: res3:=stopinternalprocess(wreg3);*)
64: res3:=removeprocess(wreg3);
end;
goto 10;
50: (*command*)
if buf^.om.op in Æ2,4,5,6,7,8,10,12Å then
begin
move_buff(systrm_addr,buff_addr);
stack_buf(buff_addr);
goto 10; (*wait event*)
end else goto 80; (*message rejected*)
60: (*disconnected*)
sendanswer(4,buff_addr,answ);
70: (* message from another computer *)
if buf^.receiver>10 then
begin (* a message *)
xx:=buf^.sen_oc;
buf^.sen_oc:=buf^.sender;
buf^.sender:=xx;
xx:=buf^.rec_oc;
buf^.rec_oc:=buf^.receiver;
buf^.receiver:=xx;
move_buff(buf^.receiver,buff_addr);
end else
begin (* an answer *)
buff_addr1:=0;
repeat buff_addr1:=buff_addr1+1 until
(buff_addr1>buf_stack_top) or (buf_stackÆbuff_addr1Å=buf^.addr_oc);
if buff_addr1>buf_stack_top then
begin writeln('buffer error',buf^.addr_oc); goto 10 end;
addr:=buff_addr+first_buff;
wordstore(f_a_buf1,addr);
buf1^.addr_oc:=buf^.addr_oc;
buf1^.r_s.sen:=buf^.r_s.sen;
buf1^.r_s.rec:=buf^.r_s.rec;
buf1^.rec_oc:=buf^.receiver;
buf1^.sen_oc:=buf^.sender;
buf1^.flag_w2:=buf^.flag_w2;
buf1^.receiver:=buf^.receiver;
buf1^.sender:=buf^.sen_oc;
buf1^.om.op:=buf^.om.op;
buf1^.om.mode:=buf^.om.mode;
buf1^.m8:=buf^.m8; buf1^.m10:=buf^.m10; buf1^.m12:=buf^.m12;
buf1^.m14:=buf^.m14; buf1^.m16:=buf^.m16; buf1^.m18:=buf^.m18;
buf1^.m20:=buf^.m20; buf1^.m22:=buf^.m22;
move_buff(sysrec_addr,buff_addr);
move_buff(buf^.sender,buff_addr1);
end;
goto 10;
80: (*message rejected*)
sendanswer(2,buff_addr,answ);
goto 10; (* wait event *)
90: (*command is transmitted*)
sendanswer(1,buff_addr,answ);
goto 10;
end.
▶EOF◀