%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
