/* ewatch.c
   L. Stewart February 20, 1983  4:15 PM
 */

extern Alloc();

static int dhost;
static int leftover, any;

struct ccb {
  char cmda;
  char *addra;
  char counta;
  char stata;
  };

struct ccb rxccb;
int buf[130];

main()
  {
  char c;
  InitOS();
  dhost = 0x004a;
  wf("EtherWatch.\r");
  for(;;) {
      wf("@ ");
      while (!Chav()) Block();
      c = GetChar();
      switch (c) {
        case 'h': host(); break;
        case 'i': initew(); break;
        case 'l': listen(); break;
        case 'p': PutStat(" req"); break;
        case 'z': zerobuf(); break;
        default: help(); break;
        };
      };
  };

static help()
  {
  wf("h: host, i: init, l: listen, p: print, z: zerobuf\r");
  };

static zerobuf()
  {
  Zero(buf, 130);
  };

static host()
  {
  wf(" host: ");
  dhost = gethex();
  wf1(" (= %x)\r", dhost);
  };

static int gethex()
  {
  int v;
  v = 0;
  any = 0;
  for (;;) {
    eGetChar();
    if (IsDigit(leftover)) {
      v = (v<<4);
      v += (leftover-'0');
      any = 1;
      continue;
      };
    leftover = LC(leftover);
    if (leftover>='a' && leftover<='f') {
      v = (v<<4);
      v += (leftover-'a'+10);
      any = 1;
      continue;
      };
    break;
    };
  return(v);
  };

static int eGetChar()  /* GetChar with echo */
  {
  leftover = GetChar() & 0177;
  PutCRChar(leftover);
  return(leftover);
  };

initew()
  {
  SLCInit(dhost);
  };

listen()
  {
  rxccb.cmda = 0x00;
  rxccb.addra = buf;
  rxccb.counta = 0;
  rxccb.stata = 0;
  SLRStart(&rxccb);
  for (;;) {
    if (Chav()) {
      GetChar();
      PutStat("fail");
      break;
      };
    if (rxccb.stata) {
      PutStat("  ok");
      break;
      };
    };
  };

PutStat(s)
  char *s;
  {
  int i;
  wf1("%s", s);
  wf4("%02x %04x %02x %02x\r", rxccb.cmda, rxccb.addra, rxccb.counta, rxccb.stata);
  for (i = 0; i<12; i+=1) {
    wf1("%04x ", buf[i]);
    };
  wfcr();
  };