include  "inc:util.imp"
include  "inc:fs.imp"
begin 

bytename  status,data,control
constinteger  tbe=8,rd=4,rc=2,rbf=1
integer  sym

 status == byteinteger(16_7fffc)
   data == byteinteger(16_7fffd)
control == byteinteger(16_7ffff)

constinteger  cr=13,esc=27

routine  put(integer  x)
  newline and  printsymbol('^') unless  x&255=x
  if  ' '<=x<=126 or  x=nl or  x=cr then  printsymbol(x) elsestart 
    printsymbol('_') if  x&255=x
    phex2(x)
  finish 
end 

integerfn  hex
integer  n1,n2
  n1 = testsymbol until  n1>=0
  n1 = n1-7 if  n1>'?'; n1 = n1&15
  n2 = testsymbol until  n2>=0
  n2 = n2-7 if  n2>'?'; n2 = n2&15
  result  = n1<<4+n2
end 

routine  reset
  status = 16_40
end 

routine  disable
integer  zero=0
  status = zero
end 

routine  twait
  cycle 
    returnif  status&tbe#0
  repeat 
end 

routine  putc(integer  x)
  control = x; twait
end 

routine  putd(integer  x)
  data = x; twait
end 

constinteger  filebeg=16_1000
bytearray  file(filebeg:16_3fff)
integer  fileend

routine  preload
integer  sym
  onevent  9 start 
    closeinput; selectinput(0); return 
  finish 
  selectinput(1)
  fileend = filebeg
  cycle 
    readsymbol(sym); file(fileend) = sym; fileend = fileend+1
  repeat 
end 

routine  load
integer  sym,ad
  putc(16_03)
  ad = 16_1000
  while  ad<fileend cycle 
    sym = file(ad); putd(sym); ad = ad+1
  repeat 
  putc(16_0b)
end 

integerfn  getd
  cycle 
  repeatuntil  status&rbf#0
  result  = data if  status&rd#0
  result  = control
end 

routine  getc(integer  x)
integer  y
  cycle 
    cycle 
    repeatuntil  status&rbf#0
    if  status&rd#0 start 
      y = data
      unless  x=16_0b start 
        printsymbol('['); phex2(y); printsymbol(']')
      finish 
    finishelsestart 
      y = control
      returnif  x=y
      unless  x!!y=16_f0 start ; !?????
        printstring("[^"); phex2(y); printsymbol(']')
      finish 
    finish 
  repeat 
end 

constinteger  ptr=8,peek=13,poke=14

routine  at(integer  x)
  putc(ptr); putd(x&255); putd(x>>8&255)
end 

integerfn  byte
  putc(peek); getc(poke); result =getd
end 

integerfn  word
integer  x
  x = byte; result =byte<<8+x
end 

routine  do long
integer  x
  x = word; x = word<<16+x
  space; phex(x); newline
end 

routine  do word
  space; phex4(word); newline
end 

routine  do byte
  spaces(3); phex2(byte); newline
end 

routine  temp
@16_3734 integer  dtx
@16_3740 integer  ack
integer  n,r=0,w=0,times=0,t
bytearray  b(1:520)
  status = 6
  putc(2)
  etheropen(5,16_6789)
  cycle 
    t = cputime
    etherwrite(5,b(1),520)
    w = cputime-t+w
    ack = ack!1<<5
    cycle 
    repeatuntil  dtx&1<<5#0
    t = cputime
    n = etherread(5,b(1),520)
    r = cputime-t+r
    times = times+1
  repeatuntil  testsymbol>=0
  etherclose(5)
  disable
  printstring("Microseconds per packet"); newline
  printstring("Write:"); write((w*1000)//times,5); newline
  printstring("Read: "); write((r*1000)//times,5); newline
end 

openinput(1,"ether:tunefirm.obj"); selectinput(0)
preload
load
temp
putc(15)
status = 6
etheropen(lsap,rdte<<8+rsap)

endofprogram