!Lance transmit test
%begin
%option "-nons-low"
%include "inc:util.imp"
!include "ether:lance.inc-list"
%include "ether:ethutil.inc-list"

@16_106c %integer ipl3 vector
%integer oldvector
%integer pr=0,pt=0

%conststring(17)our dte = "AA-00-03-01-17-37"
%conststring(17)vms dte = "FF-FF-FF-FF-FF-FF"
%bytearray dte(1:6)

%record(ibf)ib
%record(drf)%name rring,tring

@16_fe0000 %half lance address register, lance data register

%routine wcsr(%half r,v)
  lance address register = r
  lance data register = v
%end

%integerfn rcsr(%half r)
  lance address register = r
  %result = lance data register
%end

%routine setup data structure
%integer i
%record(df)%name d
  ib = 0
  set dte(dte(1), our dte)
  convert dte to halfwords(dte(1), ib_pa0)
  rring == new ring
  tring == new ring
  point(ib_highrad,ib_lowrad,rring)
  point(ib_hightad,ib_lowtad,tring)
  ib_tcount = 16_e0
  ib_rcount = 0
  %for i = 0,1,127 %cycle
    d == tring_desc(i)
    d = 0; d_minus = -512
    point(d_highad,d_lowad,new buffer)
  %repeat
  d == rring_desc(0)
  d = 0; d_minus = -512
  point(d_highad,d_lowad,new buffer)
%end

%routine setup device
%half l
%byte h
  point(h,l,ib)
  wcsr(0, c stop)
  wcsr(1,l)
  wcsr(2,h)
  wcsr(3, bswp)
  wcsr(0, c init ! c strt ! c inea)
%end

%predicate it is due
%owninteger timer=0
%true;never:
  %if cputime>timer %start
    timer = cputime %if timer=0
    timer = timer+250
    %true
  %finish
  %false
%end

%routine scan tring
%integer i
%record(bf)%name b
%record(df)%name d
%ownhalf seqno = 0
%owninteger getpos=0,putpos=0
  %while getpos#putpos %cycle
    d == tring_desc(getpos)
    %if d_control & t own = 0 %start
      %if d_control # t stp ! t enp %start
        printsymbol('T'); phex2(getpos); printsymbol(':'); phex2(d_control)
        space; phex4(d_plus); newline
      %finish
      getpos = (getpos+1)&127
    %finishelseexit
  %repeat
  %if it is due %start
    d == tring_desc(putpos)
    %if d_control & t own = 0 %start
      printsymbol('T'); phex2(putpos); space; phex4(seqno); space
      phex(addr(d)); newline
      b == buffer of (d)
      set dte(b_ddte(1),vmsdte)
      set dte(b_sdte(1),ourdte)
      b_decpty = 16_0806
      b_isolength = 16_0900
      b_data(1) = seqno&255
      b_data(2) = seqno>>8
      seqno = seqno+1
      b_data(i) = i %for i = 3,1,9
      d_control = t own ! t stp ! t enp
      putpos = (putpos+1)&127
    %finish
  %finish
%end

%ownhalf intcsr=0,idon=0,rint=0,tint=0

%routine intwait
! *move.w #16_2000,d0; *trap#0; *stop #16_2000; *mtsr #0
  intcsr = lance data register
  idon = intcsr
  rint = intcsr
  tint = intcsr
%end

%owninteger lives=9

%onevent 0 %start
  lives = lives-1
  %if lives>=0 %start
    %if event_sub=2 %start
      printstring("Bus error at "); phex(event_extra); newline
    %elseunless event_sub=1
      printstring("Event 0 "); write(event_sub,1); newline
    %finish
    write(pr,0); write(pt,1); printstring(" R T"); newline
    phex4(intcsr); space; phex4(lance data register)
    printstring("Int Csr"); newline
    wcsr(0,c stop)
  %finish
  ipl3 vector = oldvector
  %stop
%finish

->begin

handler:
  *move.w d0,-(sp)
  *move.w lance data register, d0
  *move.w d0,intcsr
  *and.w #(cbabl!ccerr!cmiss!cmerr!crint!ctint!cidon!cinea),d0
  *move.w d0,lance data register
  *move.w (sp)+,d0
  *rte

begin:

  printstring("Starting")
    oldvector = ipl3 vector
    ipl3 vector = addr(handler)
    setup data structure
    ib_mode = m prom ! m drx
    setup device
  newline

  %cycle
    intwait
    %stop %if testsymbol>=0
    %if intcsr& c err # 0 %or intcsr&(c rxon ! c txon) # c txon %start
      printstring("Int: "); phex4(intcsr); newline
    %finish
    %if idon & c idon # 0 %start
      idon = 0
      lance data register = (intcsr & c inea) ! c idon
    %finish
    %if rint & c rint # 0 %start
      rint = 0
      lance data register = (intcsr & c inea) ! c rint
      printstring("R INT ?"); newline
    %finish
    %if tint & c tint # 0 %start
      tint = 0
      lance data register = (intcsr & c inea) ! c tint
    %finish
      scan t ring
  %repeat
  
%endofprogram
