! Ethernet Interface Module

%constinteger  Undefined Error   =  0,
               Success           =  1,
               Bad Function Code =  2,
               Bad Port Number   =  3,
               Port not owned    =  4,
               No Free Port      =  5,
               Port already owned=  6,
               Packet was NAKed  =  7,
               Port was closed   =  8,
               Port was open     =  9,
               Bad Transmit Length=10,
               abort             = 11,
               bus error         = 12

%conststring(31)%array  errors(0:12) = 
   "undefined error",
   "success",
   "bad function code",
   "bad port number",
   "port not owned",
   "no free port",
   "port already owned",
   "packet was NAKed",
   "port was closed",
   "port was open",
   "bad transmit length",
   "receive abort",
   "bus error"

%Include "moose:mouse.inc"

%systemroutinespec phex(%integer what)

%Recordformat reqfm (%Record(messagefm) msg,
                     %Integer tag,
                     (%Byte code %or %byte result),
                     %Byte port,
                     (%Byte rdte %or %Byte port0mode),
                     (%Byte rsap %or %Byte channel),
                     %bytename buffer,
                     (%Integer length %OrInteger maxbytes %orinteger resbytes))

%Ownrecord(mailboxfm)%Name  ombox==NIL
!Ownrecord(reqfm)%Name      rep

%Externalroutine Ether Start
   %Integer t

   t = Find Entry ("ETHER_REQ",poa_logdict)
   %Signal 3,0,0,"Failed to find ETHER_REQ" %if t = 0
   ombox == record(integer(t))
%End

%Routine Transact (%Record(reqfm)%name req)
   %integer i
   %record(semaphorefm)     sem
   %record(mailboxfm)       imbox
   %Record(reqfm)%name      rep

   %on 0 %start
      printstring("IO_Eth: unexpected event ")
      write(event_event, 0);  space;  write(event_sub, 0)
      space;  phex(event_extra);  space
      printstring(event_message);  newline
      %signal 15, 12, req_code, "Unexpected bus error"
   %finish
   ether start %if ombox == NIL
   req_tag = 0
   setup semaphore (sem)
   setup mailbox (imbox,sem)
   send message (req,ombox,imbox)
   rep == receive message (imbox)
   i = rep_result
   %Signal 15,i,0,errors(i) %If i # 1
%End

%externalroutine EtherTransmitBlock(%integer Port,Bytes,%bytename Buffer)
   %record(reqfm) req=0
   req_code    = 5
   req_port    = port
   req_length  = bytes
   req_buffer  == buffer
   transact (req)
%end

%externalroutine EtherReceiveBlock(%integer Port,MaxBytes,%integername Bytes,%ByteName Buffer)
   %Record(reqfm) req=0
   req_code    = 6
   req_port    = port
   req_maxbytes= maxbytes
   req_buffer  == buffer
   transact (req)
   bytes = req_resbytes
%end

%externalroutine EtherOpenPort(%integer Port,RemoteStation,RemotePort)
   %Record(reqfm) req=0
   req_code = 3
   req_port = port
   req_rdte = Remote Station
   req_rsap = Remote Port
   transact (req)
%end

%externalroutine EtherClosePort(%integer Port)
   %Record(reqfm) req=0
   req_code = 4
   req_port = port
   transact (req)
%end

%externalroutine EtherClaimPort(%integer port)
   %Record(reqfm) req=0
   req_code = 1
   req_port = port
   transact (req)
%end

%externalintegerfn EtherAllocatePort
   %Record(reqfm) req=0
   req_code =1
   req_port = 255
   transact(req)
   %Result = req_port
%end

%externalroutine Ether Allocate Zero
   Ether Claim Port (0)
%End

%externalroutine EtherFreePort(%integer Port)
   %Record(reqfm) req=0
   req_code = 2
   req_port = port
   transact (req)
%end

%externalintegerfn EtherStationAddress
   %Record(reqfm) req=0
   req_code = 7
   transact (Req)
   %Result = req_port
%end

