! file 'node_ncon10s' !********************** !* ncon10s/node * !* date: 02.sep.82 * !********************* %conststring (13) vsn = "node:vsn010h " !! stack = 400, streams = 1 %control 1 %include "deimosperm" %recordformat xf(%byte unit,fsys,%bytearray fname(0:5)) %begin %constinteger control ser = 11 %constinteger kernel ser = 29 %constintegername node number == k'060016'; ! in buffer seg %recordformat rjef(%byteintegerarray data(0:239)) %recordformat nsi1f(%byteinteger fn,sufl,st,ss,flag,uflag, %c %record(rjef) itp) %recordformat nsi2f(%byteinteger fn,sufl,st,ss,flag,uflag, %c %record(rjef) rje) %recordformat mef(%record(mef)%name link,%byteinteger len,type, %c %record(nsi1f) nsl) %recordformat me2f(%record(me2f)%name link,%byteinteger len,type, %c %record(nsi2f) nsl) %recordformat pf(%byteinteger service,reply,fn,port, %c %record(me2f)%name mes,%byteinteger len,s1) %recordformat p2f(%byteinteger service,reply,fn,port, %c %integer address, %byteinteger len,s1) %recordformat p3f(%byteinteger service,reply,fn,port,facility,flag,node,term) %recordformat p4f(%byteinteger ser, reply, a1, a2, b1, b2, c1, c2) %recordformat ff(%byteintegerarray fn(0:5)) %recordformat p5f(%byteinteger ser, reply, %record (ff) fname) %record(pf) p; %record(p2f)%name p2; %record(p3f)%name p3 %record (p4f) %name p4; %record (p5f) %name p5 %record(rjef)%name block %record(rjef)%name frame %constinteger tt=0,lo=1,cr=2,lp=3,bt=7 %recordformat lnf(%integer state, node, term, ser no, %c line type, rx int, tx int, address) %ownrecord (lnf) %name ln %ownrecord (lnf) %array lna(0:64) %ownstring (9) %array sta(0:6) = "", "starting", "halted", "prot up", "attached", "removed", "down" %constinteger present=1, halted=2, lup=3, att=4, rem=5, down=6 %owninteger node, term, strm %recordformat hostf(%integer number, %c %integerarray port(cr:lp),status(lo:lp), %c %integer cr count,cr k,lp count,lp k, node) %recordformat strdf(%integer a,b,c,d,%record(xf) file,%integer e,f,g,h) %recordformat strpf(%record(strdf)%name strd) %record(strdf)%name strd %recordformat d1f(%integer x); %record(d1f) d1 %recordformat d2f(%record(strpf)%name x); %record(d2f)%name d2 %recordformat d3f(%byteintegername n); %record (d3f) %name d3 %recordformat d5f(%string (255) %name s); %record (d5f) %name d5 %record (xf) %name file %record(xf) cr file %string (255) %name linex %constbyteintegerarray status(0:6)=6,'S','T','A','T','U','S' %constbyteintegerarray printer(0:2)=2,'L','P' %constbyteintegerarray fep(0:2) = 2, 'F', 'E' %constbyteintegerarray emas name(0:5)=4,'E','M','A','S',0 %constbyteintegerarray e2970 name(0:5)=4,'2','9','7','2',0 %constbyteintegerarray e2980 name(0:5) = 4,'2','9','8','0', 0 %constinteger emas number=34, e2970 number=72 %constinteger e2980t = 80 %byteintegerarrayname buff %owninteger setbflag, binflag %constinteger set pr = 13; ! paper tape reader stream %constinteger max com = 11 %switch sw(0:max com) %conststring (3) %array coms(0:max com) = " ", "TT", "OP", "CR", "LP", "SM", "HA", "ST", "MO", "DI", "DL", "RL" %ownstring (3) new = " " %ownbyteintegerarray line(0:119) %owninteger lptr,line length,i,j %owninteger no of files,nlp ser, nlp add, ncr ser, ncr add, dl ser %ownstring (80) s; %owninteger li, first prot, xid %constinteger tt ser=1, gate ser=16, buffer manager=17, load ser = 5 %constinteger rd=0 %constinteger request buffer=0, release buffer=1 %constinteger enable facility=1, call reply=3 %constinteger put output=5, close call=6 %constinteger abort call=7, open call=8, open message=9 %constinteger open call reply=1, incoming call=2, input recd=3 %constinteger output transmitted=4, call closed=5, call aborted=6 %constinteger open reply a=7, open reply b=8, message in=9, message reply=10 %constinteger cr data=7, social call=8 %constinteger reject=0 %constinteger idle=0, starting=1, running=2, opened=3, stopping=4, stopping2=5 %conststring(9)%array stat(0:6)="idle","starting","running", "enabled", "stopping"(2), "running" %constinteger buffer size=230 %ownbyteintegerarray buffer(0:230) %owninteger cr strm %owninteger put, get, end, len posn %owninteger cr status, cr port, cr count, cr k %predicatespec match(%byteintegerarrayname master) %integerfnspec exist(%record (xf) %name file) %predicate read fname(%record(xf)%name file) %integer unit,fsys,i %integerarray fname(0:5) %constbyteintegername df==k'160055' skip symbol %while next symbol=' ' %if '0'<=next symbol<='4' %start unit=next symbol-'0'; skip symbol ->false %unless next symbol='.' skip symbol %finish %else unit=0 ->false %unless 'A'<=next symbol<='Z' fname(i)=' ' %for i=0,1,5 i=0 %while 'A'<=next symbol<='Z' %or '0'<=next symbol<='9' %cycle fname(i)=next symbol %if i<6; skip symbol i=i+1 %repeat %if next symbol='(' %start skip symbol ->false %unless '0'<=next symbol<='9' fsys=next symbol-'0'; skip symbol fsys=8*fsys+next symbol-'0' %and skip symbol %if '0'<=next symbol<='9' ->false %if next symbol#')'; skip symbol %finish %else fsys=df skip symbol %while next symbol=' ' ->false %unless next symbol=nl skip symbol file_unit=unit; file_fsys=fsys file_fname(i)=fname(i) %for i=0,1,5 %true false:skip symbol %until next symbol=nl skip symbol %false %end %routine to tt(%integer fn) %recordformat pf(%byteinteger service,reply,%integer a1,%byteintegerarrayname %c a2,%integer a3) %record(pf) p p_service=tt ser; p_reply=id p_a1=fn; p_a2==line; p_a3=120 pon(p) %end %integerfn read address !! uses globals node, term and strm %integer k %integerfn sig lptr = lptr+1 %while line(lptr)=' ' %result = line(lptr) %end %integerfn r num %integer j, n n=0 %cycle j=line(lptr) %unless '0' <= j <= '9' %then %result = n lptr = lptr+1 n = n*10+j-'0' %repeat %end %if match(emas name) %start term = emas number add node: node = term %result = 1 %finish %if match(e2970name) %then term=e2970number %and ->add node %if match(e2980 name) %start term = e2980t; ->add node %finish node = 0; ! depends on user specifing k = sig; lptr = lptr+1 %if k = 'N' %start; ! specify node number node = rnum k = line(lptr); lptr = lptr+1 %finish %result = 0 %unless k='T' term = rnum; k=line(lptr); lptr=lptr+1 %if k='S' %start strm = rnum; k=line(lptr); lptr=lptr+1 %finish %result = 0 %unless k = ' ' lptr = lptr-1 %result = 1 %end %predicate match(%byteintegerarrayname master) %integer i lptr=lptr+1 %while line(lptr)=' ' %cycle i=1,1,master(0) %false %if line(lptr+i-1)#master(i) %repeat lptr=lptr+i %true %end %routine set stream(%integer stream,%record(xf)%name file) %constintegerarray disc(0:3)=3,3,8,14 d1_x=k'160032'+stream<<1 strd == d2_x_strd strd_a=0; strd_b=2; strd_c=0; strd_d=id<<8!disc(file_unit) strd_file=file; strd_e=0; strd_f=0; strd_g=0; strd_h=k'172' %end %routine print count(%integer k,units) print symbol(',') write(k,0) %and print string("k +") %if k>0 write(units,0); print string(" chars") %end %routine set cr file %cycle prompt("cr file:") skipsymbol %if nextsymbol=nl %if nextsymbol='.' %start skipsymbol %if nextsymbol='T' %start skipsymbol; skipsymbol; skipsymbol cr file_unit = 255 set b flag = 0; ! allways in iso %return %finish %finish %if exist(cr file) = 1 %then %exit %repeat set stream(1, cr file) %end %routine read buffer %integer char, i, f %on %event 9 %start; -> eof; %finish %routine bump i=i+1 put=put+1 put=0 %if put = buffer size %end end=-1; f=0 i=buffer(len posn) select input(1) %unless cr file_unit = 255 %cycle readsymbol(char) %if (set b flag=0 %and char=4) %or char<0 %start eof: no of files = no of files-1 %if no of files > 0 %start; ! more to go printstring("cr: file done ") select input(0) set bflag = bin flag set cr file select input(1) %unless cr file_unit=255 %continue; ! get next symbol %finish cr status=stopping %if f=0 put=-1 %exit %finish f = 1; ! character planted this time round buffer(put)=char end=put %if char=nl %or char=12 %or char=13 bump %if char=10 %or char=12 %or char=13 %start insert: buffer(len posn)=i i=i+cr count i=i-1024 %and cr k=cr k+1 %if %c i>=1024 cr count=i buffer(put)=x'80'; bump len posn=put; bump i=0 %finish %exit %if put<=get %and put+5>get %exit %if put>get %and put+5-buffer size>get %repeat %if end = -1 %start %if put = 0 %then end = buffer size-1 %else %c end = put-1 -> insert %finish buffer(len posn)=i select input(0) %end %routine fill buffer %integer i,j cr status=stopping %if put=-1 %cycle i=0,1,buffer size-1 block_data(i)=buffer(get) j=get; get=get+1 get=0 %if get = buffer size %exit %if j=end %repeat p_mes_len=i+7 %end %integerfn exist(%record(xf)%name file) %recordformat pf(%byteinteger service,reply,%integer a1, %c %record(xf)%name a2,%integer a3) %record(pf) p %constintegerarray dirt(0:3)=4,4,9,15 %if read fname(file) %start p_service=dirt(file_unit); p_reply=id p_a1=0; p_a2==file; p_a3=0 ponoff(p) %result=1 %if p_a1#0 %finish printstring("cr: no file ") %result=0 %end %routine get buffer(%integer reason) p_service=buffer manager; p_reply=id p_fn=request buffer; p_len=0; p_s1=reason pon(p) %end %routine free buffer(%record(mef)%name mes) p_service=buffer manager; p_reply=id p_fn=release buffer; p_mes==mes pon(p) %end %routine connect(%integer host no,facility) p3_service=gate ser; p3_reply=id p3_fn=open call; p3_port=1; p3_facility=facility p3_flag=x'48'; p3_node=node; p3_term=host no pon(p) %end %routine to gate(%integer fn,%record(mef)%name mes,%integer flag) p_service=gate ser; p_reply=id p_fn=fn; p_mes==mes; p_s1=flag pon(p) %end %routine from gate %integer i,j,k,l %switch sw(open call reply:message reply) ->sw(p_fn) sw(open call reply):%return sw(incoming call): to gate(call reply,null,reject) sw(input recd): %return sw(output transmitted): %if cr status=stopping %start to gate(close call,null,0) cr status=stopping2 %else p_port=1 get buffer(cr data) %finish %return sw(call closed): printstring("cr: finished") print count(cr k,cr count) newline cr status=idle %return sw(call aborted): to gate(abort call,null,0) printstring("cr: aborted ") cr status = idle %return sw(open reply a): cr port = p_s1 %return sw(open reply b): %if p_s1#0 %start printstring("cr:connect fails"); write(p_s1,0); newline cr status=idle %else printstring("cr: connected ") cr count=0; cr k=0 p_port=1 set b flag = bin flag set cr file j=0 get=0 buffer(0)=x'80'; buffer(1) = 0 len posn=1; put=2 get buffer(cr data) read buffer cr status=running %finish read agn: to tt(rd) %return sw(message in): buff==p_mes_nsl_rje_data i=p_mes_nsl_st write(i,1) print symbol(':') k=buff(3) i=4; l=0 %cycle spaces(3) %unless i=4 %if buff(i)>127 %then i=i+1; j=buff(i) %cycle i=i+1,1,i+j l=buff(i) print symbol(l) %repeat newline %unless l=nl; i=i+1 %repeat %until i+6 >= p_mes_len to gate(call reply,p_mes,128) %return sw(message reply): ! gate vsn 3 onwards printstring("sm:") %if p_mes_nsl_sufl=0 %then printstring(" ok") %else %c write(p_mes_nsl_sufl, 3) newline free buffer(p_mes) %end %routine from buffer manager %integer i %record (me2f) %name mes mes == p_mes block==mes_nsl_rje %if p_s1 = social call %start block_data(i+4)=line(lptr+i) %for i=1,1,line length-lptr-1 block_data(3)=5; block_data(4)=line length-lptr-1 i=p_port; p_port=0; p3_node=node block_data(1) = strm mes_len=10+line length-lptr to gate(open message,p_mes,i) to tt(rd) %else fill buffer %if setbflag=0 %then p_mes_nsl_uflag=5 %else %c p_mes_nsl_uflag = 1 p_port=cr port to gate(put output,p_mes,0) read buffer %finish %end %integerfn do op(%integer stream) %integer i strm = stream %if read address # 0 %start p_port=term get buffer(social call) %result=2 %finish %result=0 %end %integerfn do cr %integer i %constbyteintegerarray filesx(0:6) = 5, 'F','I','L','E','S',0 %constbyteintegerarray binx(0:4) = 3, 'B', 'I', 'N', 0 %if match(status) %start printstring("cr:"); printstring(stat(cr status)) %if cr status=running %start print count(cr k,cr count) %finish newline %result=1 %finish %if cr status=idle %start %result = 0 %if read address=0 bin flag = 0 %if match(binx) %then bin flag = 1 %if match(printer) %then cr strm=4 %else %start %if match(fep) %then cr strm = 9 %else %start cr strm=set pr %finish %finish %if match(filesx) %start no of files = line(lptr+1)-'0' %finish %else no of files = 1 connect(term,cr strm) cr status=starting %result=2 %finish %result=0 %end %integerfn call loader(%string (255) %name s) %recordformat pe(%byteinteger service, reply, %byteinteger a1, a2, %c %integer b, %byteinteger c1, c2) %integer res %record (pe)p charno(s, length(s)) = nl; ! ENSURE nl at end p_service = load ser; p_reply = id p_a1 = 1; p_a2 = fsys; p_b = addr(s)+1; p_c1 = 4 ! nb: p_b points to 1st byte of data p_c2 = ttno ponoff(p) res = p_a1 p_service = 34; p_reply = id; ! reply to is cli of tt !!! !!! !!! p_a1 = 3; ! tell cli extra task loaded pon(p) %result = res %end %routine print ln(%integer n) ln == lna(n) %if ln_state >= present %start printstring("ln"); write(n, 1) space; printstring(sta(ln_state)) %if ln_state >= att %start printstring(" n"); write(ln_node, 1) printstring(" t"); write(ln_term, 1) %finish newline %finish %end %routine from kern %switch sw(0:4) %integer i, j, k, n %constbyteintegerarray fac nos(1:3) = 1, 2, 7 p4 == p %if p4_a2 > 64 %start printstring("illegal line no ") write(p4_a2, 1); newline %return %finish ln == lna(p4_a2) -> sw(p4_a1) sw(2): ! hello ln_ser no = p4_c2 ln_state = present %return sw(0): ! line up ln_state = lup; ln_node = p4_b1 %return sw(3): ! att %if ln_state # att %start ln_state = att; ln_node = p4_b1; ln_term = p4_b2 n = p4_a2 %if n = 62 %start; ! internal gate p4_a2 = 0; ! gate demands this to gate(enable facility, null, fac nos(i)) %for i=1,1,3 %finish print ln(n) %finish %return sw(4): ! rem %if p4_b1 = ln_node %and p4_b2 = ln_term %c %and ln_state # halted %start ln_state = rem %finish %return sw(1): ! line down k = ln_state ln_state = down print ln(p4_a2) ln_node = 0; ln_term = 0 %if k = halted %then ln_state = halted %else %c ln_state = present %end %integer %fn do control(%integer type) %integer j,k,n,ty,i %ownstring (9) downi = "DOWNY A@" %ownstring (9) rdown = "RLESY A@" %switch sw(6:max com) %integerfn analyse line %constbyteintegerarray all(0:4) = 3, 'A','L','L',0 %constbyteintegerarray act(0:4) = 3, 'A','C','T',0 %constbyteintegerarray ln(0:3) = 2, 'L', 'N', 0 %integer j,k %if type # 11 %start; ! format for rl is different %result = -3 %if line length < 6 %if match(all) %then %result = -1 %if match(act) %then %result = -2 %unless match(ln) %then %result = -3 %finish j=line(lptr)-'0'; k=line(lptr+1)-'0' lptr = lptr+1 %unless 0<=j<=9 %then %result = -3 %if 0<=k<=9 %start lptr = lptr+1; j = 10*j+k %if j > 64 %then %result = -3 %result = j %finish %result = j %end ty = analyse line %result = 0 %if ty = -3 %if type = 11 %start; ! special for ring load dlser = call loader(rdown) ln == lna(29); ! fake it ln_line type = ty; ! pass the ring station address -> dl com %finish j = ty %if j >= 0 %then k=j %else j=0 %and k=63 %cycle i = j, 1, k ln == lna(i) %continue %unless ln_state >= present -> sw(type) sw(7): ! start line %if ln_state = halted %start ln_state = present -> com %finish %continue sw(6): ! halt line ln_state = halted; -> com sw(8): ! monitor %if ty = -2 %and ln_state # att %then %continue com: p_service = ln_ser no; p_reply = id p_fn = type-2 p_port = i; ! pass line number through pon(p) %continue sw(9): ! display %if ty = -2 %and ln_state # att %then %continue print ln(i) %repeat %result = 1 sw(10): ! down line load, format: dl ln1 tcpoy1 %result = 0 %unless j >= 0 dlser = call loader(downi) dl com: %if dlser = 0 %start printstring("failed to load down line loader ") %result = 1 %finish printstring("loading tcp ") p4_ser = dlser; p4_reply = id %if type = 11 %then p4_a1 = ln_line type %else %c p4_a1 = (ln_line type)!j<<3; ! bottom 3 bits type, top 5 line number ! on ring, station address is passed p4_a2 = k'16'; ! use file sys 16 for now p2_address = ln_address p4_c1 = ln_rx int p4_c2 = ln_tx int pon(p4) lptr = lptr+1 %cycle i = 0, 1, 5 p5_fname_fn(i) = ' ' %repeat %cycle i = 0, 1, 5 n = line(lptr); lptr = lptr+1 %if n = ' ' %or n = nl %then %exit p5_fname_fn(i) = n %repeat p5_ser = dlser; p_reply = id pon(p) %result = 1 %end %integerfn roctal %integer i, n, sum sum = 0 skipsymbol %while nextsymbol = ' ' %or nextsymbol = nl %cycle n = nextsymbol %result = sum %if n < '0' %or n > '7' sum = (sum << 3)!(n-'0') skipsymbol %repeat %end %routine read string(%string (255) %name s) !! terminates on either a nl or a semi colon %integer n length(s) = 0 %cycle n = nextsymbol %if n = nl %or n = ';' %thenreturn s = s.tostring(n) skipsymbol %repeat %end p2==p; p3==p; p4==p; p5 == p4 d2==d1; d3 == d2; d5 == d3 d3_n == line(0) linex == d5_s printstring(vsn) linkin(control ser) set prio(2); ! set prio = 2 to start off with %begin %recordformat p2f(%byteinteger ser, reply, line, line type, %c %integer ad, %byteinteger rx int, txint) %record (p2f) p2 %integer line, line type, address, rxint, txint, xid, cou %owninteger first prot = 0 select input(1) %cycle readsymbol(i); printsymbol(i) %exitif i = nl %repeat %cycle readstring(s) %if s = "END" %then %exit %if s -> ("NODE ").s %start node = charno(s, 1)-'0' skipsymbol %continue %finish length(s) = length(s)+1 xid = call loader(s) readsymbol(i) %if s->("BUF").s %start; ! need to find the buff man i = map virt(xid, 4, 3) ! cant map to 'buffer manager' as it may not have started yet %if i = 0 %start printstring("Failed to map to buffer manager ") %stop %finish node number = node %finish cou = 0 %if i = ';' %start all lines: cou = cou+1 %if first prot = 0 %then first prot = xid read(li); read(line type) read(rxint); read(txint) address = roctal p2_ser = xid; p2_reply = id p2_line = li; p2_line type = line type p2_ad = address&k'017777'; ! address in segment #0 !! p2_rx int = rxint; p2_txint = txint ! nb: only 8 bits passed pon(p2); ! tell prot its params skipsymbol ln == lna(li) ln_line type = line type ln_rx int = rxint; ln_tx int = tx int ln_address = address&k'077777' ! possible multiple lines %if nextsymbol = ';' %start; ! ie no prog to load skipsymbol; ! skip the ';' -> all lines; ! and get the next set of params %finish; ! if multiple, then say 'end' %if cou > 1 %start; ! ie, was p2_ser = xid; p2_reply = id p2_line = 255; ! end flag pon(p2) %finish %finish %repeat printstring(" System Loaded ") select input(0) %end i =map virt(buffer manager,5,4) i =map virt(buffer manager, 6, 5) to tt(rd) %cycle p_service=0; poff(p) %if p_reply=gate ser %start from gate %finish %else %if p_reply =buffer manager %start from buffer manager %finish %else %if p_reply = kernel ser %start from kern %finish %else %if p_reply=tt ser %start set prio(1); ! put prio down again line length=0 line length=line length+1 %while line(line length)#nl line length=line length+1 lptr=3 i = line(2) %if i = '/' %or i = ' ' %or i = nl %start i=0 charno(new, 1) = line(0); charno(new, 2) = line(1) %cycle j = 1, 1, max com ->sw(j) %if coms(j) = new %repeat ->bot sw(2): ! op i = do op(11) ->bot sw(3): ! cr i = do cr; -> bot sw(4): ! lp i=0 %if nlp ser # 0 %start p_service= nlp ser; p_reply = control ser i = map virt(nlp ser, nlp add>>13, 0); ! map its 7 to my 0 %if i # 0 %start; ! seg exists d1_x = nlp add&k'17777'!k'000000'; ! in seg 0 line(0) = line length; ! this overwrites 1st byte d5_s = linex; ! copy the string p_mes == d2_x pon(p) %finish nlp ser = 0 i = 1 i = map virt(nlp ser, -1, 0); ! map off it again %finish -> bot sw(5): ! sm (send message) i = do op(2); ->bot sw(6): ! start line sw(7): ! halt line sw(8): ! monitor sw(9): ! display sw(10): ! down line load sw(11): ! ring load, format: rl 8 tcpcri i = do control(j) sw(1): ! tt bot: to tt(rd) %if i=1 %continue %if i>0 %finish spaces(lptr) printstring("! invalid ") to tt(rd) %else %if p_fn = rd %start; ! nlps or ncrs %if p_port = 1 %start; ! nlps nlp ser = p_reply d2_x == p_mes nlp add = d1_x %finish %finish %if int = '?' %then int=0 %and to tt(rd) %finish %repeat %endofprogram %finish d1_x = nlp add&k'17777'!k'000000'; ! in seg 0