! file 'rolls' !********************** !* rolles/rolley * !* date: 29.may.81 * !* ring vsn * !********************* %conststring (7) vsn = "vsn001b" !! stack = 300, streams = 1 %control 1 %include "deimosperm" %recordformat xf(%byteinteger unit,fsys,%byteintegerarray fname(0:5)) %begin %owninteger mon = 0 %recordformat rjef(%byteintegerarray data(0:239)) %recordformat nsi1f(%integer st, ds, rc, tc, 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(nsi1f) nsl) %recordformat pf(%byteinteger service,reply,fn,port, %c %record(mef)%name mes,%byteinteger len,s1) %recordformat p2f(%byteinteger service,reply,fn,port,%record(me2f)%name mes, %c %byteinteger len,s1) %recordformat p3f(%byteinteger service,reply,fn,port,facility,flag,node,term) %record(pf) p %constinteger connected = 1 %constinteger title = 2 %constinteger getting = 3 %constinteger ready = 4 %constinteger closing = 5 %ownstring (127) user, pass, file, disc %ownstring (5) usern = "USER " %ownstring (5) passn = "PASS " %ownstring (5) filen = "FILE " %ownstring (5) rl01n = "RL01" %ownstring (5) rk05n = "RK05" %ownstring (5) rx02n = "RX02" %ownstring (5) tu58n = "TU58" %ownstring (5) testn = "TEST" %ownstring (5) dollar = "$$$$$" %constintegerarray ddrive(0:4) = 3, 3, 8, 14, 28 %constinteger tt ser=1, gate ser=16, buffer manager=17 %constinteger rd=0, echo off=10 %constinteger request buffer=0, release buffer=1 %constinteger enable facility=1, disable facility=2, call reply=3 %constinteger enable input=4, 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 %integer i, node, term, strm, k, flag %owninteger initf %owninteger users, sta, cpu, pkts, sbr, byt, rjei, tim, rjeo %owninteger conn ok, g port, power, kill it, maxc, ntim, obl %ownbyteintegerarray buff(0:511) %owninteger pt, block, last block, drive, goah, disc ser, state %owninteger blext = 0 %routine get buffer(%integer reason, r2) p_service=buffer manager; p_reply=id p_fn=request buffer; p_len=0; p_s1=reason p_port = r2 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 to gate(%integer fn, %record (mef) %name mes, %c %integer flag) p_service = gate ser; p_reply = id p_fn = fn; p_port = g port; p_mes == mes; p_s1 = flag pon(p) %end %routine do connect(%integer type) %recordformat p3f(%byteinteger ser, reply, %c fn, port, node, flag, term, facility) %record (p3f) p3 p3_ser = gate ser; p3_reply = id p3_fn = open call; p3_port = type p3_node = node; p3_term = term p3_flag = power p3_facility = strm pon(p3) %end %routine get next disc block %integer i, j, k %recordformat pf(%byteinteger ser, reply, %c %integer a, %byteintegername b, %integer c) %constbyteintegername nil == 0 %record (pf) p %if block = 0 %start; ! disc check turn off required p_ser = disc ser; p_reply = id p_a = 0; p_b == nil ponoff(p) %if p_a # 9 %start printstring("Failed to turn Disc check off") write(p_a, 1); newline %stop %finish %finish %if block > last block %start end of disc: printstring("Whole disc written ") to gate(close call, null, 0) state = closing %return %finish p_ser = disc ser; p_reply = id p_a = 0; p_b == buff(0); p_c = block!blext ponoff(p) %if p_a # 0 %start printstring("Failed to read Block"); WRITE(BLOCK, 2) printstring(" from the disc - "); WRITE(P_A, 1) newline %if p_a = 4 %then -> end of disc buff(i) = 0 %for i = 0, 1, 511 %finish block = block+1 %if goah > 0 %then get buffer(0, 0) state = ready %end %routine do title(%record (mef) %name mes) %record (rjef) %name rje %integer pt, opt, i %routine plant(%string(*) %name s, %integername ptx) %integer len, i len = length(s) %return %if len = 0 %cycle i = 1, 1, len rje_data(ptx) = charno(s, i) ptx = ptx+1 %repeat %end rje == mes_nsl_rje pt = 3; opt = 2 rje_data(0)=1; rje_data(1) = nl; ! plant a blank line plant(usern, pt); plant(user, pt) rje_data(opt) = pt-opt-1 opt = pt; pt = pt+1 plant(passn, pt); plant(pass, pt) rje_data(opt) = pt-opt-1 opt = pt; pt = pt+1 plant(filen, pt); plant(file, pt) rje_data(opt) = pt-opt-1 opt = pt; pt=pt+1 plant(dollar, pt) rje_data(opt) = pt-opt-1 mes_len = pt+2 mes_nsl_uflag = 5; ! iso to gate(put output, mes, 0) state = getting get next disc block %end %routine do block(%record (mef) %name mes, %integer cnsl) %integer i, j, k %record (rjef) %name rje %record (nsi1f) %name nsi %integer a, b, c, len %if cnsl # 0 %then do title(mes) %and %return rje == mes_nsl_rje pkts = pkts+1 a = pt+199 %if a > 511 %then a = 511 len = a-pt+1 b = 2 rje_data(0) = 128; rje_data(1) = len %cycle pt = pt, 1, a rje_data(b) = buff(pt) b = b+1 %repeat mes_len = len+2+2 mes_nsl_uflag = 1; ! binary to gate(put output, mes, 0) goah = goah-1 %if pt = 511 %start state = getting get next disc block pt = 0 %finish %else pt = pt+1 %end %routine read line(%string(255) %name s) %integer i length(s) = 0 %cycle readsymbol(i) s = s.to string(i) %if i = nl %then %return %repeat %end charno(dollar, 5) = nl i = map virt(buffer manager,4, 3) i = map virt(buffer manager, 5, 4) i = map virt(buffer manager, 6, 5) printstring("Roll Disc Image to Filestore ") node = 90; term = 90; ! filestore strm = 13 power = x'30'; ! ask for 3 nsi send aheads prompt("Disc Type?"); READ LINE(DISC) prompt("Disc Drive?"); READ(DRIVE); SKIPSYMBOL prompt("User Name?"); READ LINE(USER) prompt("User Pass?"); READ LINE(PASS) prompt("File Name?"); READ LINE(FILE) length(disc) = length(disc)-1 %if disc = testn %start prompt("Node?"); READ(NODE) prompt("Term?"); READ(TERM) prompt("Fac?"); READ(STRM) last block = 100 %finish %if drive < 0 %or drive > 4 %start printstring("Valid Drives are 0, 1, 2, 3 or 4 ") %stop %finish bl ext = 0 bl ext = k'020000' %if drive = 1 disc ser = ddrive(drive) %if disc = rk05n %then last block = 4700 %if disc = rx02n %then last block = 999 %if disc = tu58n %start %if drive # 2 %start printstring("TU58 on drive 2 ! ") %stop %finish last block = 511 %finish %if disc = rl01n %start last block = 9301 %finish %if last block = 0 %start printstring(" Discs - RL01, RK05 and RX02 ") %stop %finish do connect(0) alarm(4*50) %cycle p_service = 0; poff(p) %if p_reply = 0 %start; ! clock %if int = 'a' %start kill it = -1 printstring("KILLING IT ") to gate(abort call, null, 0) %if conn ok # 0 int = 0 %continue %finish alarm(50); ! 1 secs %if 'M' <= int <= 'P' %start mon = int-'O'; int = 0 %finish %if int='?' %start write(pkts, 1) write(block, 4); newline int = 0 %finish %if g port # 0 %start ntim = ntim+1 %if ntim = 60*5 %start write(block-obl, 1); printstring(" blocks transmitted in 5 minutes ") ntim = 0; obl = block %finish %finish %continue %finish %if mon < 0 %start select output(1) printstring("POFF:"); WRITE(P_REPLY, 1) write(p_fn, 1); write(p_port, 1); write(p_len, 1); write(p_s1, 1) newline select output(0) %finish %if p_reply = buffer manager %start %if kill it < 0 %then free buffer(p_mes) %and %continue do block(p_mes, p_s1) %continue %finish %if p_reply = gate ser %start %if p_fn = open reply a %start; ! 1st reply i = p_port; ! my port number k = p_s1; ! gate port number %if k = 0 %start printstring("roll: gate refused ") %stop %finish %continue; ! wait for reply b %finish %if p_fn = open reply b %start; ! 2nd reply %stop %if kill it < 0 g port = p_port; ! gate port number !! flag = p_s1 %if p_s1 # 0 %start; ! failed %if tim&255 = 0 %start printstring("Connect fails"); write(p_s1, 1) printstring(" will keep trying ") %finish tim = tim+1 do connect(0); ! try again %continue %finish printstring("Call Accepted by Filestore ") goah = 2 conn ok = 1 get buffer(1, 0); ! get buffer for title %continue %finish %if p_fn=call aborted %start; ! my end i hope printstring("Call has been lost ") %stop %finish %if p_fn = call closed %start printstring("File closed successfully ") p_service = 0; poff(p); ! wait for clock tick %stop %finish %if p_fn = output transmitted %start goah = goah+1 %if mon # 0 %start select output(1) printstring("ot - goah ="); write(goah, 1); newline select output(0) %finish get buffer(0, 0) %if state = ready %continue %finish %if p_fn = input recd %start pkts = pkts+1 printstring("Input ??? ") %continue %finish printstring("FUNNY FN"); WRITE(P_FN, 1); NEWLINE %continue %finish %repeat %endofprogram