! file 'cli1s' !************** !* cli1s * !* 26.feb.81 * !************** %control 1 %recordformat dumrec(%integer x) %constrecord (*) %name null == 0 %externalintegerfnspec map virt %alias "$FMAPVIRT"(%integer id, fromseg,toseg) %begin %constinteger delete = 5 %constinteger schedule t = 9 %constinteger map psect = 16 %constinteger r0=0,r1=1,r2=2,r3=3 %constinteger task low limit = 30 ! see supervisor for updates %owninteger task limit = 75 %constinteger t poff = 2 %owninteger tt ser = 1; ! tt handler (shareable code !!) %constinteger load ser = 5; ! main loader service %recordformat uregsf((%integer r0, r1, r2, r3, r4, r5, pc, ps, sp %or %c %integerarray r(0:8))) %recordformat segf(%integer par, pdr, dadd, use) %recordformat psectf(%integer q, %c %byteinteger id, state, %byteintegerarray %c name(0:3), %byteinteger prio, %integer poffq, %record (uregsf %c )urs, %integer trapv, %record (segf) %array seg(0:7)) %recordformat pf(%byteinteger service, reply, (%integer a, b, c %or %c %byte a1, a2, b1, b2, c1, c2)) %constbytename int char == k'100060'; ! In seg4 %constbyteintegername change out zero == k'160310' %record (pf)p %owninteger id, inpt, nchar %integer oseg, cksm %owninteger read flag = 0, fsys = 0, prog = 1 %ownbyteintegerarray store(0:70) = 0, 'L', 'O', 'A', 'D', 'U', 'P', NL, 0(*) %routinespec pri %routinespec put read on(%integer type) %routinespec octal(%integer n) %record (psectf) %map %spec get psect(%integer id) %record (psectf) %map %spec get name(%byteintegername st) %routinespec pname(%byteintegerarrayname name) %integerfnspec cli %if tt ser#1 %start change out zero = tt ser; ! switch to new console store(6) = 'u'; ! loades 'loaduu' %finish id = getid -> from out; ! initial specs load %cycle put read on(0) %if read flag = 0 p_service = 0 poff(p) %if p_reply = tt ser %start; ! reply from keyboard nchar = p_a; ! get no of chars read flag = 0 %if store(1) = nl %thencontinue prog = prog+1; ! count loaded progs from out: ! entry for external calls %if cli = 0 %then prog = prog-1 %and %continue ! not an instruction, so pass to loader p_service = load ser; p_reply = id p_a1 = 1; p_a2 = fsys; p_b = addr(store(1)) p_c1 = 0; p_c2 = tt ser pon(p) %else %if p_a = 3 %start; ! loaded extra prog prog = prog+1 %continue %finish %if p_a = 2 %start; ! prog stopping %if p_c = 0 %start %if prog # 1 %then printstring("STOPPED ") %else %if p_c #- 2 %start printstring("f a u l t "); write(p_c, 1) %else printstring("TERM REQ.") %finish newline %finish %else %if p_a = 0 %start %if p_b = 3 %start printstring("*NO "); pri %else printsymbol('*'); pri printstring(" FAULT ") printsymbol(p_b+'0') %finish newline %finish %finish prog = prog-1 %if prog <= 0 %then prog = 0 %and put read on(1) %finish %repeat %routine schedule(%integer task id, param) *mov_r1, r0; ! id is in r1 *mov_r2, r1; ! param is in r2 *emt_schedule t %end %routine delete task(%integer id) *mov_r1,r0; ! id is in r1 *emt_delete %end %routine pri %integer i, j %cycle i = 1, 1, 6 j = store(i) %exit %if j<= ' ' printsymbol(j) %repeat %end %routine put read on(%integer type) %recordformat p3f(%byteinteger service, reply, %integer a, %c %byteintegername b, %integer c) %record (p3f)p3 p3_service = tt ser; p3_reply = id p3_b == store(1) %if type = 0 %then p3_a = 2 %else p3_a = 5 %if prog < 0 %then prog = 0 p3_c = prog; ! system idle flag read flag = 1; ! waiting for reply pon(p3) %end %routine octal(%integer n) %integer i space printsymbol(n >> i&7+'0') %for i = 15, -3, 0 %end %record (psectf) %map get psect(%integer id) %integer n *mov_#5,r1 *mov_id,r0 *emt_map psect *mov_r0,n %result == record(n) %end %record (psectf) %map get name(%byteintegername st) %record (psectf) %name pst %integer pt, id, j, char, match %cycle id = task low limit, 1, task limit pst == get psect(id) %unless pst == null %start %cycle j = 0, 1, 3 char = byteinteger(addr(st)+j); match = pst_name(j) %exitif char <= ' ' >= match -> no %if char # match %repeat %result == pst %unless pst_state = 0 %finish no: %repeat %result == null %end %routine pname(%byteintegerarrayname name) %integer i printsymbol(name(i)) %for i = 0, 1, 3 %end %integerfn cli %record (psectf) %name pst %integer i, j, k, id, char, type %constinteger com limit = 10 %conststring (5) %array comms(0:com limit) = "LOGON", %C "TASKS", "REGS", "SEGS", "PURGE", "KILL", "FREE", "HOLD", "INT", "KICK", "ABORT" %switch comsw(0:com limit) %conststring (2) %array regs(0:8) = "r0", "r1", "r2", "r3", %c "r4", "r5", "pc", "ps", "sp" %record (segf) %name seg %cycle i = 1, 1, nchar %if 'a' <= store(i) <='z' %then store(i) = store(i)-'a'+'A' %repeat inpt = 1 inpt = inpt+1 %while 'A' <= store(inpt) <= 'Z' %and inpt <= %c nchar store(0) = inpt-1 %cycle i = 0, 1, com limit %if comms(i) = string(addr(store(0))) %start %if i = 8 %start char = store(inpt+1); inpt = inpt+2 %finish %if i >= 2 %start pst == get name(store(inpt+1)) %if pst == null %start printstring("task? ") %result = 0 %finish %finish -> comsw(i) %finish %repeat %result = 1 comsw(1): ! tasks %cycle id = task low limit, 1, task limit pst == get psect(id) %unless pst == null %start pname(pst_name) octal(pst_id); octal(pst_state) newline %finish %repeat -> ok comsw(2): ! regs of nominated task %cycle i = 0, 1, 8 printstring(regs(i)); octal(pst_urs_r(i)); space newline %if i = 4 %repeat newline -> ok comsw(3): ! segs %cycle i = 0, 1, 7 seg == pst_seg(i) octal(seg_par); octal(seg_pdr) octal(seg_dadd); newline %repeat ok: %result = 0 comsw(4): ! purge prog = prog-1 schedule( pst_id, 1); ! hold it pname(pst_name) printstring(" PURGED ") delete task(pst_id) -> ok comsw(5): ! kill schedule( pst_id, 1) schedule( pst_id, k'020000') -> ok comsw(0): ! log fsys = (store(inpt+1)-'0') << 3+store(inpt+2)-'0' newline -> ok comsw(6): ! free task (put on cpuq comsw(9): ! kick task type = 0 kick it: schedule( pst_id, 0); ! remove hold %if pst_state # t poff %then ->ok p_service = pst_id; p_reply = 7; p_a = type; pon(p) -> ok comsw(10): ! abort task type = 1 -> kick it comsw(7): ! wait process schedule( pst_id, 1); ! hold it -> ok comsw(8): ! int 'char' 'task' %if pst_id > k'42' %start; ! not system tasks i = map virt(pst_id, 7, 4) -> ok %if i = 0; ! in fact, dont do it, as there is no segment int char = char i = map virt(0, -1, 4); ! release the seg %finish -> ok %end %endofprogram