begin
include "inc:fs.imp"
include "inc:util.imp"
ownbytearray b(0:540)=0(*)
integer rs,rp,lp,i,j,k
integer expect=0
integerfn bit(integer word)
integer i=0
cycle
result =i if 1<<i&word#0
i = i+1
repeat
end
routine rec(integer port)
integer skew=0,i
j = etherread(port,b(0),256)
unless port=0 start
printstring("Port "); phex2(port); printsymbol(':'); return
finish
returnunless port=0
if b(0)=0 start
printstring("Channel "); phex2(b(1)); space
j = j-2; skew = 2
finish
printstring("From "); phex2(b(i+skew)) for i=0,1,5
printsymbol(':')
j = j-6; skew = skew+6
b(i) = b(i+skew) for i=0,1,j-1
end
routine trans(integer port)
etherwrite(port,b(0),j)
expect = expecT!1<<port
end
printstring("O to Open, S to Send, anything else to stop"); newline
cycle
i = testsymbol; i = i!32 if i!31=95
if i='`' start
prompt("Station address:"); rhex(i)
twait; ethc = 16_07 {ssa}; twait; ethd = i
twait; ethc = 2; twait
elseif i='o'
prompt("Open port:"); rhex(lp)
prompt("To remote address (sspp):"); rhex(i)
etheropen(lp,i)
elseif i='s'
prompt("Send on port:"); rhex(lp); readsymbol(i)
prompt("Data (_ escapes to hex):"); j = 0
cycle
readsymbol(i); exitif i=nl
rhex(i) if i='_' and nextsymbol#'_'
b(j) = i; j = j+1
repeat
trans(lp)
elseif dtx#0
rec(bit(dtx))
for i=0,1,j-1 cycle
k = b(i)
if ' '<=k<=126 start
printsymbol(k); printsymbol('_') if k='_'
else
printsymbol('_'); phex2(k)
finish
repeat
newline
elseif ack&expect#0
i = bit(ack&expect); j = 1<<i
expect = expect-j
printstring("Port "); phex2(i); printsymbol(':')
if nak&j#0 start
nak = nak-j; printstring(" Nak"); newline
else
printstring(" Ack"); newline
finish
else
stopif i>=' '
finish
repeat
endofprogram