/* 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();
};