|
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◀