|
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: 29184 (0x7200) Types: TextFile Names: »lmitxt075«
└─⟦2c55ea56f⟧ Bits:30001844 SW-save af projekt 1000, Alarm-system └─⟦093e2ad1c⟧ └─⟦this⟧ »lmitxt075«
;; ;; begin lmitxt075 ;; ;; ;; usage of registers in process synchronizing instructions ;; ;; generally z means base, and r means disp ;; ;; w2=level ;; w1=pu ;; ;; w21 and w65 are used as addr and data in the read procedures ;; ra=rawork ;; ir=0300: w=01, x=10 ;; ;; z/rd0: lbd b ;; z/rd1= z/rdw: shptr ;; z/rd2= z/rdx: lbd a ;; z/rd3= z/rd: share ;; w43: nbd ;; w87: hbd a ;; w109: hbd b ;; w11: share + semrel ;; w0: ;; .p ; cget2: ;; ,,cjs readluc ; w0:=bd,h w s,cjs readluct ; w1:=bd,h w s,cjs terror ; ; setrair: ; ir:=300,,, ; ra:=rawork,,,crtn ; ;; ;; procedure cget4 ;; ;; entry: - ;; exit : w10= w87= op1, w32= zrdw= op2, ra= rawork, ir= 300, w0=undef; ;; cget4: ;; ,,cjs setrair ; ,,cjs readlucq ; w7:=q,,cjs readlucq ; w87:=hbd:=semaphore w0:=q,,cjs readlucq ; rdw:=q,,cjs readlucq ; shptr w8:=w0,, ; zdw:=q,,crtn ; ; cfin4: ;cfin4: ir:=,,cjs setslice ; setslice must not update stat slu:=slu-8,, ; sync itr; slu:= slu-8; sic:=sic++,,cjp fetch ; sic:= sic+1; goto fetch; ; cfin22: ;cfin22: ,,cjs setslice ; setslice must not update stat ir:=4,slu:=slu-4,, ; sync itr; slu:= slu-4; sic:=sic+2,, ; sic:= sic+2; ,,cjp fetch ; goto fetch; ; cfin0: ;cfin0: ir:=,,cjs setslice ; setslice must not update stat sic:=sic++,,cjp fetch ; sic:= sic+1; goto fetch; .p ; ;; ;; procedure getshare ;; ;; entry: rzdw= shptraddr; ;; exit : zrd= w21= mem(shptraddr); stat(w2) set; ;; getshare: ;; w6:=zdw,s,ldct nillerr ; if nill(refadr) then goto nillerror w5:=rdw,,jsrp not b1 cread21; else ref:= cread(refadr); zd:=w2,s, ; ref rd:=w1,,crtn not b0 ; if -,locked(ref) then return; ,,cjp lockerr ; goto lockerror; ;; ;; procedure reservea ;; ;; entry: w87= hbd a; ra,ir= work; ;; exit : w87= w65= hbd a; zrdx= w21= lbd a; stat(lb a) set; ;; ; reservea: ; return: zrdx= w21= lbd a; stat(lb a) set; w6:=w8,s,ldct nillerr ; if nill(hbd a) then goto nillerror w5:=w7,,jsrp not b1 cread21; else lbd a:= cread(hbd a); zdx:=w2,s, ; lbd a rdx:=w1,,crtn ; ;; ;; procedure reserveb ;; ;; entry: w109= hbd b; ra,ir= work; ;; exit : w109= w65= hbd b; zrd0= w21= lbd b; stat(lb b) set; ;; ; reserveb: ; return: zrd0= w21= ldb b; stat(lb b) set; w6:=w10,s,ldct nillerr ; if nill(hbd b) then goto nillerr w5:=w9,,jsrp not b1 cread21; else lbd b:= cread(hbd b); zd0:=w2,s, ; lbd b rd0:=w1,,crtn ; .p ; setrefshwt: ;; sets ref (share waited) of receiver (=nbd) w5:=w3+shwt,, ; w6:=w4,,cjs cread21 ; w21:=ref w5:=rd,, ; w65:=share w6:=zd,,cjp cwrite65 ; ref(share waited):=share ; setchhead: ;; mem(nbd.chainhead):=hbd b w5:=w3+chainhead,, ; w6:=w4,, ; w1:=w9,, ; chainhead:=hbd b w2:=w10,,cjp cwrite21 ; ;; ;; procedure unchain ;; hbd a -> lbd a -> nbd -> fbd a (* nbd to be unchained *) ;; ;; entry: w43=nbd; w87= hbd a; zrdx= lbd a; ra,ir= work; ;; exit : w43= w87= zrdx= ra,ir= unch; ;; unchain: ;proc unchain; rdx-w3,s, ; test lbd a - nbd zdx-w4,s,cjp not zro unchain2; bus:=40,,, ; w6:=swp,,cjp zro unchain3 ; ; unchain2: ;; w5:=w3,, ; w6:=w4,,cjs cread21 ; w21:=fbd w5:=rdx,, ; w65:=lbd a w6:=zdx,,cjp cwrite21 ;mem(lbd a):=fbd; return; unchain3: ;; w2:=w8,, ; w21:=hbd a w1:=w7,,cjp cwrite6 ; sem:= nill; return; ; changeab: ;; rdx,w9:=w7,, ; hbd b:=hbd a swp,w10:=w8,, ; rd0:=swp,,, ; lbd b:=lbd a q:=zdx,, ; zd0:=q,,crtn ; .p ; ;; procedure chain ;; ;; entry: w43= nbd; w109= hbd b; zrd0= lbd b; cry= setlevel(monitor); ;; chain nbd to hbd b, lbd b ;; if cry and lbd b was nill then setlevel(membyte(nbd+puno),1) ;; chain: ;proc chain; w6:=zd0,s, ; w65:=lbd b w5:=rd0,, ; w2:=w4,, ; w21:=nbd w1:=w3,,cjp b1 chain3 ; ,,cjs cexch21 ; w21:=:mem(lbd b) w6:=w4,, ; w65:=nbd w5:=w3,,cjs cwrite21 ; mem(nbd):=w21 ; chain2: ;; w2:=w10,, ; w21:=hbd b w1:=w9,,cjp cwrite65 ; mem(hbd b):=nbd ; chain3: ;; sem=nill w6:=w4,, ; w5:=w3,,cjs cwrite21 ; mem(nbd):=nbd ,,cjp not cry chain2 ; ; setlevel(monitor); w0:=monitrlev,, ; ,,cjs setlint ; ra:=rawork,,, ; w5:=w3,,cjp chain2 ; ; chainfirst: ; w6:=zd0,s, ; w2:=w4,,cjp b1 chain ; if nil(lbd b) then goto chain w5:=rd0,, ; w65:=lbd b; w21:=nbd w1:=w3,,cjs cexch21 ; w21:=:mem(lbd b) w6:=w4,, ; w5:=w3,,cjp cwrite21 ; mem(nbd):=w21; return; ; putelemptr: ;; mem(elemptr):=nbd w5:=rdw,, ; w65:=elemptr w6:=zdw,, ; w1:=w3,, ; w21:=nbd w2:=w4,,cjp cwrite21 ; mem(elemptr):=nbd .p ; signal: ;; ,,cjs reservea ; lbd a:=w21:=mem(hbd a) rdx,,s,cjp b1 sig5 ; jump if passive ; ,,cjp not b15 sig5 ; jump if open ,,cjs cread65 ; w21=lbd a w3:=w5,, ; w43=nbd w5:=w5+level,, ; w4:=w6,,cjs creadbyte1 ; w2:=w1,s, ; w2:=level ,,cjp not zro sig4 ; jump if level>0 w5:=w3+actq,, ; ,,cjs cread21 ; w9:=w1,, ; w109:=hbd b:=active queue w10:=w2,,cjs reserveb ; ,,cjs setrefshwt ; ref(nbd.shwt):=share ,,cjs setchhead ; mem(nbd.chainhead):=hbd b ,,cjs unchain ; unchain nbd from hbd a, lbd a c:w0-w0,,cjs chain ; cry means setlevel ,,cjp sig6 ; sig4: ; signal to receiver on level>0 w10:=w2,,cjs setrefshwt ; save level; ref(nbd.share waited):=share w0:=w10,,cjs setlint ; w5:=w3+chainhead,, ; w6:=w4,,cjs nill ; w1:=swp,,cjs cwrite1 ; mem(nbd.chainhead):=nill ,,cjs unchain ; ,,cjp sig6 ; sig5: ; signal to an empty or an open semaphore ,,cjs changeab ; w4:=c:zd,, ; c=0 means no setlevel w3:=rd,,cjs chain ; nbd:=share sig6: ; w5:=rdw,,cjs nill ; w1:=swp,, ; w6:=zdw,,cjp cwrite1 ; shptr:=nill .p ; ;; entry: cry= multible wait, exception iff sem locked. ;; exit: w0<>0 = proc descheduled wait0: ;; ,,cjs getshare ; share:=mem(shptr) ,,cjpp not b1 waitxept ; if shptr not nill then goto waitxept ,,cjs reservea ; lbd a:=w21:=mem(hbd a) rdx,,s,cjp b1 wait2 ; jump if passive ,,cjp b15 wait2a ; jump if locked wait1a: ; sem open ,,cjs cread65 ; w21=lbdfrom w3:=w5,, ; w43:=nbd w4:=w6,,cjs unchain ; w0:=,,cjp putelemptr ; mem(shptr):=share; return; wait2a: ;lockedsem: ,,cjp not cry wait2 ; if mwait then q:=mwse1,, ; exception(mtse1); ,,cjp xept ; wait2: ; nill ra:=reg,, ; w4:=zd2,, ; w43:=nbd:=this process w3:=rd1,, ; ra:=rawork,w6:=w4,, ; w5:=w3+shwt,, ; w1:=rdw,,cjs changeab ; w21:=shptr w2:=zdw,,cjs cwrite21 ; mem(nbd.shwt):=shptr reg xor 7,s, ; ,,cjp zro wait3 ; jump if lev=0 ,,cjs clear ; clear level ,,cjp wait5 ; goto wait5 ; wait3: ; lev=0 w5:=w3+chainhead,, ; ,,cjs cread21 ; ,,cjs desched10 ; deschedule10; wait5: ;; chain process to sem w0:=w0--w0,,cjs setchhead ; mem(nbd.chainhead):=hbd b c:=,,cjp chain ; return; waitxept: ; q:=waite,, ; ,,cjp xept ; exception(waite); .p ; .instruction csign ; ,,cjs cget4 ; ,,cjs getshare ; share:=mem(shptr) ,,cjp b1 csign1 ; ,,cjs signal ; ,,cjp cfin4 ; ; csign1: ;; q:=csigne,, ; ,,cjp xept ; ; .instruction crele ; ,,cjs readbcont ; w4:=semrel ,,cjs cget2 ; rdw:=w0,, ; z/rdw := shptr zdw:=w1,,cjs getshare ; z/rd := share w7:=rd+w4,,cjp b1 csign1 ; hbd a := share + semrel; jump if shptr=nill w8:=zd,,cjs reservea ; reserve pointer to sem w7:=rdx,, ; w8:=zdx,,cjs signal ; hbd a:=sem ,,cjp cfin22 ; .instruction cwait ; ,,cjs cget4 ; c:=,,cjs wait0 ; wait0(normal wait); ,,cjp cfin0 ; ; .instruction csens ; ,,cjs cget4 ; ,,cjs getshare ; ,,cjp not b1 waitxept ; if shptr<>nill then goto waitxept ,,cjs reservea ; rdx,,s,cjp b1 csens3 ; ,,cjp b15 csens3 ; jump if not open ,,cjs wait1a ; ,,cjp cfin4 ; ; .p ; .instruction cwtac ; ,,cjs cget4 ; w6:=zdw,, ; w65:=shptr w5:=rdw,,cjs cread1 ; w6:=w8,h ,cjp not b1 cfin4 ; jump if not nill ,h ,cjs clear ; ,,cjp sfetch ; ; .instruction cllst ; ,,cjs cget4 ; w10:=w8,, ; hbdb:=hbda w9:=w7,,cjs reserveb ; ,,cjs getshare ; w3:=rd,, ; nbd:=share w4:=c:zd,,cjs chain ; cry:=false ,,cjp cfin4 ; ; csens3: ; bus:=40,,, ; w4:=swp,,cjs putelemptr ; mem(elemptr):=nbd ,,cjp cfin4 ; .p ; .instruction csell ; ,,cjs readluc ; newlevel:=unstack w11:=bd,h w s,cjs terror ; w3:=rd1,, ; nbd:= (spb, pr) w4:=spb,, ; w5:=w3+actq,, ; w6:=w4,,cjs cread21 ; hbd a:=mem2(nbdü.actq); w7:=w1,,cjs setrair ; w8:=w2,,cjs reservea ; reserve a w0:=lev,,cjs clear ; clear(lev) w11,s, ; ,,cjp not zro csell3 ; jump if newlevel<>0 reg xor 7,s, ; ,,cjp zro csell4 ; jump if lev=0 ; newlevel=0, lev<>0 ,,cjs changeab ; change a b ,,cjs setchhead ; setchhead c:=,,cjs chainfirst ; chainfirst(false) ,,cjp csell4 ; csell3: ; newlevel<>0 w0:=w11,,cjs setlint ; setlint(newlevel) reg xor 7,s, ; ,,cjp not zro csell4 ; jump if lev<>0 bus:=40,,, ; ; newlevel<>0, lev=0 w10:=swp,,cjs setchhead ; hbd b.base:=nill; setchhead ,,cjs unchain ; unchain w0:=monitrlev,, ; ,,cjs setlint ; setlint(monitrlev) .p ; csell4: ; w2:=w4,, ; levelm1= level - 1 ; w1:=w3+levelm1,, ; w3:=w11,,cjs writebnext ; membyte(nbdü.level):=newlevel w3:=w1-level,, ; ra:=reg,,cjs dumpregs ; dumpregs(reg) ,,cjs loadregs ; loadregs(nbd); w7:=nbdü.level reg:=w11,,push 2 ; ra:=reg:=reg++reg,,rfct ; reg:= newlevel * 8 + 7; w0:=4,, ; ,,cjs clearbits ; to:=false lev:=w11,,cjs setslice ; lev:=newlevel slu:=slu-2,, ; sic:=sic++,,cjp fetch ; goto fetch ;; .instruction cskip ; ;; ;; param:: none; ;; stack:: headadr: addr-> ; ;; ,,cjs readlucq ; w1:=q,,cjs readlucq ; bus:=w2:=q,s,ldct nillerr ; h:= w21:= (readlucq,readlucq); w4:=w2,,jsrp not b1 cread65; if nill(h) then exception(nilade) bus:=w6,s,ldct cskip10 ; else l:= w65:= cread(h); w3:=w1,,jsrp not b1 cread21; if -,nill(l) then w6:=w4,, ; w5:=w3,,cjs cwrite21 ; cwrite(h,cread(l)); cskip10: ; ,,cjpp fetch ; goto fetch; .p ; .instruction cstop ; ,,cjs cget4 ; hbda:=addr; shptr:=process descr w5:=rdw,, ; w5:=w5+chainhead,, ; w6:=zdw,,cjs cread21 ; w10:=w2,s, ; hbdb:=shptr.chainhead ,,cjp b1 cupro20 ; jump if chainhead nill w9:=w1,,cjs reserveb ; w8,s, ; ,,cjp not b1 cupro3 ; jump if not nill cupro4: ; first loop w7:=rd0,, ; hbda:=lbdb w8:=zd0,, ; ,,cjp cupro5 ; cupro3: ; not first loop w5:=w7,, ; test if the process 'hbda' has been moved w5:=w5+chainhead,, ; away from the semaphore w6:=w8,,cjs cread21 ; w10-w2,s, ; w9-w1,s,cjp not zro cupro4 ; the process has been moved ,,cjp not zro cupro4 ; cupro5: ;; w6:=w8,, ; w5:=w7,, ; cupro6: ;; ,,cjs cread21 ; w1-rdw,s, ; w2-zdw,s,cjp not zro cupro7; ,,cjp zro cupro8 ; cupro7: ; the process has not been found yet int,w5:=w1,h ,cjs testint1 ; ir:=300,w6:=w2,, ; sync intrp; ,,cjp zro cupro6 ; goto cupro6 if no higher interrupts ; ;; higher interrupts pending ; w4:=w6,,cjs setslice ; slu:=slu-4,, ; rewrite workp on stack w3:=w5,,cjp wr34fetch ; .p ; cupro8: ;; the process has been found ;; w65= process just before this process ;; w21= z/rdw= this process ;; w109= the semaphore ;; z/rd0= last w5-w1,s, ; w6-w2,s,cjp not zro cupro9 ; ,,cjp not zro cupro9 ; ;; only this process in the queue bus:=40,w6:=w10,, ; w2:=swp,,cjp cupro11 ; last:=nill cupro9: ;; w4:=w6,, ; w43:=the process just before this process w3:=w5,,cjs cread65 ; w65:= process after this process w2:=w4,, ; w1:=w3,,cjs cwrite65 ; unchain q:=rd0,, ; last process q-rdw,s, ; this process q:=zd0,, ; q-zdw,s,cjp not zro cupro20; w6:=w10,,cjp not zro cupro20; cupro11: ;; w6:=w10,, ; w65:= head w5:=w9,,cjs cwrite21 ; .p ; cupro20: ;; chainhead=nill w5:=rdw,, ; w5:=w5+level,, ; w6:=zdw,,cjs creadbyte1 ; w1:=level w1,s,push 2 ; ra:=w1:=w1++w1,,rfct ; ,,cjs not zro dumpregs ; dumpregs(level * 8 + 7) ;; ;; clear p.dumpps.wait ;; ,,cjs setrair ; setrair; w5:=rdw,, ; w5:=w5+dumpps,, ; w6:=zdw,,cjs cread1 ; ps:= cread1(p.dumpps); w1:=w1 clr pswait,, ; ps:= ps and -,pswait; ,,cjs cwrite1 ; cwrite1(p.dumpps,ps); ,,cjp cfin4 ; ;; .instruction cexch ; ;; ;; param:: none; ;; stack:: ad1, ad2: addr -> ; ;; ,,cjs cget4 ; ad1, ad2:= cget4; ,,cjs getshare ; ref:= getshare(ad2); w6:=w8,s,ldct nillerr ; if nill(ad1) then goto nillerror w5:=w7,,jsrp not b1 cexch21; else ref :=: exch(ad1); w2,s,ldct xept ; if locked(w21) then w6:=zdw,,cjp b0 cexch10 ; goto cexchxept; w5:=rdw,,cjs cwrite21 ; cwrite(ad2,ref); ,,cjp cfin4 ; goto cfin4; cexch10: ;cexchxept: w6:=w8,,cjs cwrite21 ; cwrite21(ad1,ref); (* reestablish ref *) ,,cjp lockerr ; goto lockerror; .p ; ;; ;; procedure setpswait ;; ;; entry: w0= wcause; ra= reg; ;; exit : q= undf; w0= ra= unch; ;; setpswait: ;proc setpswait; q:=zd1,, ; reg.ps.wait:= q:=q clr pswait,, ; (reg.ps.wait and -,wait) or wcause; zd1:=q ior w0,,crtn ; return; ;; ;; procedure deschedule ;; ;; entry: ra= reg; ;; exit : w0-w8,ra,q,ir= undf; ;; deschedule: ;proc deschedule; reg xor 7,s, ; if reg <> 7 then w6:=slb,,cjp not zro clear ; begin clear; return; end; w3:=rd1,, ; (* deschedule level 0 proc *) w5:=w3+chainhead,, ; nbd a:= own; 40,w4:=w6,, ; hbd a:= nill w2:=swp,,cjs cexch21 ; own.chainhead :=: hbd a; ,,cjs setrair ; setrair; ;; ;; proc desched10 ;; ;; entry: w21= hbd a= actqueue, w43= nbd= proc; ra,ir= work; ;; exit : w43= w109= w0= unch, ra,ir= work; ;; desched10: ;proc deschedule10; w7:=w1,, ; w8:=w2,,cjs reservea ; lbd a:= reservea(hbd a); ,,cjs unchain ; unchain(own,hbd a,lbd a); w0:=monitrlev,, ; setinterrupt(monitor); ,,cjp setlint ; return; ;; ;; proc testtimer ;; ;; entry: ra= reg; spb def; ;; exit : w1= own.timer; stat(w1) set; w65= undf; ;; testtimer: ;proc testtimer; w5:=rd1,, ; w5:=w5+timer,, ; w6:=spb,,cjp cread1 ; t:= cread1(own.timer); return; ; setpsw: ; 3fe,w0:=<w0+w0,, ; w0:=wcause from the instruction code w0:=w0 clr swp,,cjs setpswait; ,,jmap not 8 ; switch to the instruction .p ; ;; .instruction mwi , setpsw ;; (* at level 0 = suicide *) ;; ;; param:: none; ;; stack:: -> ; ;; ,,cjs deschedule ; deschedule; ,,cjp cfin0 ; goto cfin0; ;; .instruction mwt , setpsw ; ;; ;; param:: none; ;; stack:: -> ; ;; mwt10: ; ,,cjs testtimer ; if own.timer>0 then ,,cjp b0 mwt20 ; ,,cjs not zro deschedule ; deschedule; mwt20: ; ra:=reg,,cjp mwc ; goto sendcontrol; ;; .instruction mwis , setpsw ; ;; ;; param:: none; ;; stack:: semadr, refadr: addr -> semadr, refadr: addr; ;; mwis10: ; w0 and pst,s, ; if timer in wcause ,,cjp zro mwis20 ; and own.timer<=0 then ,,cjs testtimer ; goto sendcontrol; ,,cjp zro mwc ; ,,cjp b0 mwc ; mwis20: ; ,,cjs cget4 ; semadr,refadr:= cget4; c:w0-w0,,cjs wait0 ; wait0(mwait,semadr,refadr); ra:=reg,,cjp mwc ; goto sendcontrol; .p ; ;; .instruction mwit , setpsw , mwt10 ; ;; ;; param:: none; ;; stack:: -> ; ;; ;; .instruction mwst , setpsw , mwis10 ; ;; ;; param:: none; ;; stack:: semadr,refadr: addr -> semadr,refadr: addr; ;; ;; .instruction mwist , setpsw , mwis10 ; ;; ;; param:: none; ;; stack:: semadr,refadr: addr -> semadr,refadr: addr; ;; .p ; ;; ;; sendcontrol ;; ;; entry: ra= reg; ;; exit : to cfin0; ;; mwc: ;sendcontrol: q:=zd1,, ; q and psc,s, ; if control in reg.ps.wait then slu:=zd,,cjp zro cfin0 ; begin q and pss,s, ; if sem in reg.ps.wait then ,,cjp zro mwc10 ; slu:= slu-8; (* unstack sem,ref *) slu:=slu-8,, ; mwc10: ; slb:=zd2,, ; ,,cjs readluc ; (spb,slu):= (pb,lu); readluc; c:=w4:=0c0,h , ; func:= control; w3:=bd,h w s,cjs terror ; control:= waitmem; terror; w0:=reg,,push 2 ; w0:=>w0,,rfct ; dev:= reg shift (-3); ,,cjs xmitword ; xmitword(dev,func,control); ,,cjp cfin0 ; end; goto cfin0; ;; .instruction mcis , setpsw , mwis10 ; ;; ;; param:: none; ;; stack:: semadr, refadr: addr; control: word -> ;; semadr, refadr: addr; control: word; ;; .p ; ;; .instruction mcit , setpsw , mwt10 ; ;; ;; param:: none; ;; stack:: -> ; ;; ;; .instruction mcist , setpsw , mwis10 ; ;; ;; param:: none; ;; stack:: semadr, refadr: addr; control: word -> ;; semadr, refadr: addr; control: word; ;; .p ; ;; .instruction mwtac ; ;; ;; param:: none; ;; stack:: semadr,refadr: addr or empty -> caseval: word; ;; caseval: 0: interrupt ;; 1: message ;; 2: timer ;; w4:=zd1,, ; w4 and pss,s, ; if -,(sem in reg.ps.wait) w2:=spb,,cjp zro mwtac20 ; then goto testtimer; w1:=slu-7,, ; ,,cjs cread65 ; refadr:= cread65(slu-3); ,,cjs cread1 ; ref.b:= cread1(refadr); ra:=reg,,cjp b1 mwtac20 ; if nill(ref.b) then goto testtimer; w3:=1,, ; caseval:= msgcase; mwtac10: ;pfetch: (*w3= caseval *) ra:=reg,,cjs setslice1 ; setslice; w4:=zd1,, ; w4 and pss,s, ; if sem in reg.ps.wait then slu:= slu - 8; ,,cjp zro mwtac15 ; slu:=slu-8,, ; mwtac15: ; w4 and psc,s, ; ,,cjp zro mwtac16 ; if control in reg.ps.wait then slu:=slu-2,, ; slu:= slu - 2; mwtac16: ; w0:=,,cjs setpswait ; setpswait((..)); sic:=sic++,,cjp wrfetch ; goto wrfetch(caseval); mwtac20: ;testtimer:(*ra=reg,w4=reg.ps.wait,w6=spb*) w4 and pst,s, ; if -,(timer in reg.ps.wait) ,,cjp zro mwtac30 ; then goto inttest; w5:=rd1,, ; w5:=w5+timer,, ; (* mtime already removed p from sem *) ,,cjs cread1 ; t:= cread1(own.timer); w3:=2,, ; if t > 0 then goto inttest; ,,cjp zro mwtac10 ; caseval:= timercase; goto pfetch; ,,cjp b0 mwtac10 ; .p ; mwtac30: ;inttest: w4 and psi,s, ; if -,(intrp in reg.ps.wait) ,,cjp zro mwtac40 ; then goto repeatins; w4 and pss,s, ; if sem in reg.ps.wait then w3:=,,cjp zro mwtac10 ; begin (* unlink own from sem *) w4:=zd2,, ; w10:=rd1,, ; w43:= nbd:= own; ,,cjs cget4 ; refadr,semadr:= cget4; w3:=w10,,cjs reservea ; lbd a:= reservea(hbd a=semadr);; ,,cjs unchain ; unchain(mbd,hbd a,lbd a); ,,cjs nill ; setchainhead(nill); w10:=swp,,cjs setchhead ; end; (* unlink own from sem *) w3:=,,cjp mwtac10 ; caseval:= intrpcase; goto pfetch; ;; ;; no criteria fullfilled. ;; repeat instruction at next activation. ;; mwtac40: ;repeatins: ra:=reg,,cjs deschedule ; deschedule; ,,cjp sfetch ; goto sfetch; .p ; ;; .instruction mtime ; ;; ;; (* must execute on level 0 with system-sem locked *) ;; param:: none; ;; stack:: p: addr -> ; ;; ,,cjs readluc ; readluc; w3:=bd,h w s,cjs readluct ; p.d:= waitmem; readluct; w4:=bd,h w s,cjs rterror ; p.b:= waitmem; therror; mctc10: ;rep: (*w43=p, stat(p.b) set *) w3:=w3++,,cjp b1 fetch ; if nill(p) then goto fetch; w5:=w3+timer,, ; w6:=w4,,cjs cread1 ; t:= cread1(p.timer); ,,cjp zro mctc70 ; if t<=0 then goto nextp; w1:=w1--,s,cjs not b0 cwrite1; cwrite1(p.timer,t-1); ,,cjp not zro mctc70 ; if t-1<>0 then goto nextp; w5:=w3+level,, ; ,,cjs creadbyte1 ; l:= creadbyte1(p.level); w11:=w1,,cjp zro mctc20 ; if l<>0 then ,,push 2 ; begin (* driver timeout *) ra:=w1:=w1++w1,,rfct ; ra:= l*8+7; rd2,,s, ; if p.reg.ib.dummyreg then ,,cjp b1 mctc50 ; goto alreadyscheduled; w1:=zd1,, ; ps:= p.reg.ps; w1:=w1 ior 4,, ; p.reg.ps:= ps ior to; zd1:=w1,, ; w0:=w11,,cjs setlint ; setinterrupt(l); ra:=reg,,cjp mctc30 ; end (* driver timeout *) mctc20: ; else (* level 0 proc timeout *) w5:=w3+dumpps,, ; ,,cjs cread1 ; ps:= cread1(p.dumpps); mctc30: ; w1 and pst,s, ; if not(timer in ps) then ,,cjp zro mctc50 ; goto alreadyscheduled; w10:=w1,,cjs setrair ; setrair; w5:=w3+chainhead,, ; ,,cjs cread21 ; w21:= cread21(p.chainhead); w10 and pss,s, ; if sem in ps w2,s,cjp zro mctc40 ; and -,nill(p.chainhead) w1,s,cjp b1 mctc40 ; and semtype(p.chainhead) then w8:=w2,,cjp b15 mctc40 ; begin (* unlink(p.chainhead) *) w7:=w1,,cjs reservea ; lbd a:= reservea(hbd a=p.chainhead); ,,cjs unchain ; unchain(p,hbd a,lbd a); w6:=w4,,cjs nill ; p.chainhead:= nill; w2:=swp,, ; w5:=w3+chainhead,, ; w1:=w2,,cjs cwrite1 ; mem(p.chainhead):= nill; mctc40: ; end; (* unlink p from sem *) ;; ;; schedule p ;; w11,s, ; if p.level=0 then w2,s,cjp not zro mctc50 ; begin (* linklast p to p.actqueue *) w1,s,cjp b1 mctc45 ; if -,nill(p.chainhead) and ,,cjp b15 mctc50 ; -,semtype(p.chainhead) mctc45: ; then goto alreadyscheduled; w1:=w3+actq,, ; w2:=w4,,cjs cread65 ; hbd b:= cread65(p.actqueue); w9:=w5,, ; w10:=w6,,cjs reserveb ; lbd b:= reserveb(hbd b); ,,cjs setchhead ; setchainhead(p.actqueue); c:w0-w0,,cjs chain ; chain(p,hbd b,lbd b,true); mctc50: ; end else (* startdriver *) ; ra:=reg,,cjs setslice1 ;alreadyscheduled: slu:=slu-4,, ; setslice; slu:= slu-4; sic:=sic++,, ; sic:= sic+1; mctc70: ;nextp: w1:=w3+tchain,, ; ir:=w2:=w4,,cjs cread65 ; sync itr; p:= cread65(p.tchain); int,w3:=w5,h ,cjs testint1 ; w4:=w6,s,cjp zro mctc10 ; if -,testint then goto rep; sic:=sic--,,cjp wr34fetch ; sic:= sic-1; goto wr34fetch(p); ;; ;; end of lmitxt075 ;; .p ; ▶EOF◀