! file 'gen_pclo4s/clocky' ! programmable clock program ! date: 18.sep.81 %control 1 %include "deimosperm" %begin %conststring (13) vsn = "clok:vsn001 " %recordformat clockf(%integer status, data) %constrecord (clockf) %name clock == k'112540'; ! in seg 4 %recordformat pf(%byteinteger ser, reply, %integer a, b, c) %record (pf) p %integer i,j,k,n, sum, maxi, sumn, ssum, flag, ticks %owninteger repf %integerarray tasks(0:75) %integerarray super(0:75) %bytearray pr(0:75) %routine print name(%integer task) %recordformat psectf(%byteinteger x, y, id, state, %byteintegerarray %c name(0:3), %byteinteger prio, %integer poffq, %c %integerarray r(0:8), %c %integer trpv) ! nb: r(0-8) are r0, r1, r2, r3, r4, r5, pc, ps, sp %record (psectf) %name p %integer pst, i %if task < 30 %start %if task = 1 %start printstring("sys "); %return %finish %else printstring("sysi") %and %return %finish pst = map psect(5, task) %if pst = 0 %start printstring("????") %return %finish p == record(pst) printsymbol(p_name(i)) %for i = 0, 1, 3 %end ! %routine octal(%integer i) ! %integer n ! printsymbol((i>>n)&7+'0') %for n = 15,-3,0 ! %end %routine outp(%integer n, s, p) !! output n as a percentage of s, places p %integer x,y n = n+s//200; ! final fig is rounded %if n < 320 %start write(n*100//s, p) %else %if n < 3200 %start write(n*10//(s//10), p) %else write(n//(s//100), p) %finish %finish %end printstring(vsn) map hwr(4) linkin(-10) clock_data = 23210; ! int every 2.321 secs clock_status = k'113'; ! count down, repeated, 10khz, run, int ticks = 23210 %cycle p_ser = 0; poff(p) %if p_ser&x'80' # 0 %start flag = 0 i = p_c&x'ff'; ! task id %continue %if i > 75; ! task limit ************** %if i >= 30 %start p_b = p_b-2; ! look at previous instr j = map virt(i, p_b>>13, 3); ! map on his pc %if j # 0 %start; ! ok j = integer(p_b&k'17777'!k'060000') %if j&k'177000' = k'104000' %then flag = 1; ! emt j = map virt(i, 0, 3) %finish %finish tasks(i) = tasks(i)+1 super(i) = super(i)+1 %if flag = 1 n = n+1 %if repf # 0 %and n = 375 %then int = '?' %unless 0<=i<=75 %start printstring("funny task:"); write(i, 1); newline %finish %finish %continue %if int = 0 %if int = 'S' %or int = 'Z' %or int = 'A' %then clock_status = 0 %and %stop %if int = '?' %start clock_status = 0 write(n, 1); newline sum = 0; maxi = 0; ssum = 0 %cycle i = 0, 1, 75 j = tasks(i) sum = sum+j ssum = ssum+super(i) %if j > tasks(maxi) %then maxi = i %if j < 0 %then maxi = i pr(I) = 0 %repeat sumn = sum-tasks(maxi); ! assumed to be idle printstring("Name Total (Sys) %Cpu (sys) %non-idle (sys) ") %cycle k = 0, 1, 75 j = 5 %cycle i = 0, 1, 75 %if pr(i)=0 %and tasks(i) > tasks(j) %then j = i %repeat %exit %if pr(j) # 0 %or j = 5 i = j; pr(i) = pr(i)+1 print name(i) write(tasks(i), 5); space printsymbol('('); write(super(i), 3); printsymbol(')') outp(tasks(i), sum, 5); printsymbol('%') printstring(" ("); outp(super(i), sum, 2) printstring("%)") %unless i = maxi %start outp(tasks(i), sumn, 5); printstring("% (") outp(super(i), sumn, 2); printstring("%)") %finish newline %repeat printstring("User ="); outp(sumn-ssum, sum, 2) printstring("%, Super ="); outp(ssum, sum, 2) printstring("%, Idle ="); outp(tasks(maxi), sum, 2) printstring("% ") clock_data = ticks clock_status = k'113' %finish %if int = 'R' %start repf = repf!!1 n = 0 %finish %if int = 'C' %start tasks(i) = 0 %for i = 0, 1, 75 super(i) = 0 %for i = 0, 1, 75 %finish %if int = 'F' %start clock_status = 0 clock_data = 01234; ! .1234 sec ticks = 01234 clock_status = k'113' %finish %if int = 'N' %start ticks = 23210 clock_status = 0 clock_data = ticks clock_status = k'113' %finish int = 0 %repeat %endofprogram