! Test program for new 2meg ether module

%include "Moose:Mouse.Inc"
%include "GDMR_E:2Meg.Inc"

%externalpredicatespec FS lookup(%string(31) what, %integername value)

%ownrecord(mailbox fm)%name ether mailbox == nil
%ownrecord(mailbox fm) reply mailbox = 0
%ownrecord(semaphore fm) reply semaphore = 0

%routine xprint symbol(%integer what)
   %if ' ' <= what <= '~' %start
      print symbol(what)
   %else
      print symbol('<')
      write(what, 0)
      print symbol('>')
   %finish
%end

%ownbytearray test data(1 : 23) =
      'T', 'h', 'e', ' ', 'q', 'u', 'i', 'c', 'k', ' ', 'b', 'r', 'o', 'w', 'n',
{16}  ' ', 'f', 'o', 'x', ' ', 'e', 't', 'c'

%routine do send
   %record(ether request fm) r = 0
   %record(ether request fm)%name a
      setup message(r, size of(r))
      r_code = ether old write
      r_buffer == test data(1)
      r_bytes = 23
      prompt("Context: ");  read(r_context)
      send message(r, ether mailbox, reply mailbox)
      a == receive message(reply mailbox)
      printstring("Sent, status ");  write(a_status, 0);  newline
%end

%routine do receive
   %record(ether request fm) r = 0
   %record(ether request fm)%name a
   %integer i
   %bytearray buffer(1 : 532)
      setup message(r, size of(r))
      r_code = ether old read
      r_timeout = 50;  ! deciseconds
      r_buffer == buffer(1)
      r_bytes = 532
      prompt("Context: ");  read(r_context)
      send message(r, ether mailbox, reply mailbox)
      a == receive message(reply mailbox)
      printstring("Received, status ");  write(a_status, 0);  newline
      %if a_status = 0 %start
         xprint symbol(buffer(i)) %for i = 1, 1, a_bytes
      %finish
      newline
%end

%routine do define
   %record(ether request fm) r = 0
   %record(ether request fm)%name a
      setup message(r, size of(r))
      r_code = ether old define
      prompt("RA: ");  read(r_ra)
      prompt("RP: ");  read(r_rp)
      send message(r, ether mailbox, reply mailbox)
      a == receive message(reply mailbox)
      printstring("Sent, status ");  write(a_status, 0);  newline
      %if a_status = 0 %start
         printstring("Got LP ");  write(a_lp, 0)
         printstring(", context ");  write(a_context, 0);  newline
      %finish
%end

%routine do redefine
   %record(ether request fm) r = 0
   %record(ether request fm)%name a
      setup message(r, size of(r))
      r_code = ether old redefine
      prompt("Context: ");  read(r_context)
      prompt("New RP: ");  read(r_rp)
      send message(r, ether mailbox, reply mailbox)
      a == receive message(reply mailbox)
      printstring("Sent, status ");  write(a_status, 0);  newline
%end

%routine do undefine
   %record(ether request fm) r = 0
   %record(ether request fm)%name a
      setup message(r, size of(r))
      r_code = ether old undefine
      prompt("Context: ");  read(r_context)
      send message(r, ether mailbox, reply mailbox)
      a == receive message(reply mailbox)
      printstring("Sent, status ");  write(a_status, 0);  newline
%end

%begin
   %integer i, op
      open input(2, ":T");  select input(2)
      open output(2, ":T");  select output(2)
      %if FS lookup(ether mailbox name, i) %start
         ether mailbox == record(i)
      %else
         printstring("No ether mailbox??");  newline
         %cycle;  %repeat
      %finish
      setup semaphore(reply semaphore)
      setup mailbox(reply mailbox, reply semaphore)
      %cycle
         prompt("Op: ")
         read symbol(op)
         %if op = 's' %or op = 'S' %start
            do send
         %else %if op = 'r' %or op = 'R'
            do receive
         %else %if op = 'd' %or op = 'D'
            do define
         %else %if op = 'u' %or op = 'U'
            do undefine
         %else %if op = 'n' %or op = 'N'
            do redefine
         %finish
      %repeat
%end %of %program
