|
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: 6912 (0x1b00) Types: TextFile Names: »tparentmess«
└─⟦667bb35d6⟧ Bits:30007480 RC8000 Dump tape fra HCØ. └─⟦4334b4c0b⟧ └─⟦this⟧ »tparentmess«
parent message 82.04.15 Anders Lindgård :3: parent message: claiming basic maxcoru:=maxcoru+1; maxsemch:=maxsemch+1; maxop:=maxop+maxpmess; maxnettoop:=maxnettoop+8*maxpmess; :4: parent message global variables and procedures algol list.on; boolean pmess; integer pmessline; algol list.on copy.treadjob; procedure receive_parent_message; begin integer i,j,res,cbn,op,mode,word,job; integer array M,A(1:8); integer array field bufref,parentref,child_pda,cur,fi, bufd,reg,ct,bref; long array field nf; integer field interrupt_address; long array name,text(1:3); boolean pause,batch; zone pz(17,1,noerror); stackclaim(750); interruptaddress:=38; for i:=1 step 1 until 8 do A(i):=0; fi:=0; <*+2*> if testop(1) then writelog(<:parent message started:>,0,<::>); <*-2*> repeat waitch(pmessline,parentref,pmess,0); bufref:=d.parentref(2); child_pda:=core.bufref(4); <*+2*> if testop(1) then writelog(<:parent message:>,childpda,<::>); <*-2*> if childpda<0 then send_answer(1,bufref,A) else begin cbn:=0; ct:=-ct_size; repeat cbn:=cbn+1; ct:=ct+ct_size; until cbn>maxchildren or childpda=childtable.ct.ct_childpda; if cbn<=maxchildren then wait(childtable.ct.ct_sem); if cbn>maxchildren or childtable.ct.ct_childpda<>childpda then sendanswer(2,bufref,A) else begin <*it was a child*> op:=core.bufref(5) shift (-12) extract 12; mode:=core.bufref(5) extract 12; pause:=mode extract 1=1; if op mod 2=1 or op>42 then sendanswer(3,bufref,A) else if op=0 then sendanswer(1,bufref,A) else begin nf:=childpda+2; for i:=1,2 do name(i):=core.nf(i); cur:=childtable.ct.ct_ref; <*console description*> batch:=childtable.ct.ct_batch>0; if op//2<3 then childtable.ct.ct_bufref:=bufref; if batch then begin open(pz,8,q.cur.condesterm,tw_mask); <*+2*> if testop(7) then disable write(pz,"nl",1,<:parent mess : batch:>, cbn,cur,ct,q.cur.concurchild); <*-2*> if pause then begin waitch(bmessline,bref,free,0); d.bref(1):=1; <*signal to clock driver*> d.bref(2):=-1; <*stop*> d.bref(3):=ct; signalch(bmessline,bref,cmess); end pause; end else begin wait(condesc.cur.conaccess); if condesc.cur.concurchildpda<>childpda then begin for i:=1,2 do condesc.cur.conprocname(i):=name(i); condesc.cur.concurchildpda:=childpda; condesc.cur.concurchild:=childtable.ct.ct_childno; end; open(pz,8,condesc.cur.condesterm,tw_mask); <*+2*> if testop(2) then disable write(pz,"nl",1, <:parent mess: online :>,cbn,cur,ct,childtable.ct.ctbatch); <*-2*> if pause then res:=stopchild(condesc.cur); end; write(pz,"nl",1,if pause then <:pause:> else <:message:>, "sp",1,name,"sp",1); op:=op//2; mode:=mode shift (-5); text(2):=0; bufd:=bufref+10; for i:=1 step 1 until 7 do begin word:=core.bufd(i); if mode shift (i-7)=1 then write(pz,word) else begin text.fi(1):=word; text.fi(2):=0; write(pz,text); if word=0 then write(pz,"sp",1); end text; end write buffer content; if op<3 then childtable.ct.ct_bufref:=bufref; case op of begin begin <*finis*> if batch then begin waitch(bmessline,bref,free,0); d.bref(1):=1; <*clock*> d.bref(2):=-5; <*finis*> d.bref(3):=ct; signalch(bmessline,bref,cmess); end batch else begin res:=stopchild(condesc.cur); if res<>0 then disable write(pz,<:**stop int :>,condesc.cur.conprocname,res); res:=removechild(condesc.cur,pz); if res<>0 then write(pz,<:**remove error :>,name,res, childtable.ct.ct_state); end online; end finis; begin <*break*> if core.childpda(40+7)>0 and core.childpda(40+7)<18 then write(pz,core.childpda(40+7),<: ic :>,core.childpda(40+6), <: w0 :>,core.childpda(41), <: w1 :>,core.childpda(42), <: w2 :>,core.childpda(43), <: w3 :>,core.childpda(44)); if batch then begin waitch(bmessline,bref,free,0); d.bref(1):=1; d.bref(2):=-4; d.bref(3):=ct; signalch(bmessline,bref,cmess); end else begin res:=stopchild(condesc.cur); childtable.ct.ct_state:=state_breaked; end; end break; begin <*hard error*> end hard error; begin <*account*> end account; begin <*replace*> end replace; begin <*new job*> read_job_file(ct,bufref,A,pz); end newjob; begin <*mount tape*> end mount; begin <*print*> end print; begin <*mount ring*> end ring; begin <*suspend tape*> end suspend; begin <*release tape*> end release; begin <*load*> end load; begin <*change paper*> end change; begin <*timer*> end timer; begin <*convert*> end convert; begin <*mount special*> end mount special; begin <*mount kit*> end kit; begin <*lock*> lock:=true; end lock; begin <*open*> lock:=false; end open; begin <*remove*> end remove; begin <*swop and wait*> end swop and wait; end case; if op>=3 then sendanswer(1,bufref,A); if -,batch then signal(condesc.cur.conaccess); close(pz,true); end legal operation; end it was a child; if cbn<=maxchildren then signal(childtable.ct.ctsem); end childpda>0; signalch(pmessline,parentref,free); until false; end parent message; algol list.off; :5: parent message: program algol list.on; pmess:=false add (1 shift 4); pmessline:=nextsemch; for i:=1 step 1 until maxpmess do begin j:=nextop(8); signalch(pmessline,j,free); end; j:=nextcoru(3,300,true); newactivity(j,j,receive_parent_message); <*+2*> if testop(2) or testop(7) then write(out,"nl",1,<:parentmess coroutine :>,j); <*-2*> algol list.off; ▶EOF◀