/* dtslc.c L. Stewart April 30, 1983 2:01 PM, created L. Stewart April 30, 1983 2:03 PM, new EtherHost */ #include <Lark.h> #include <Ec.h> #include <Env.h> #include <Queue.h> #include <Pup.h> struct ccb { char cmda; char *addra; char counta; char stata; }; /* Runtime */ extern InByte(); extern Swab(); /* Timer package */ extern SetTmr(); extern TmrExp(); /* Ethernet machine language */ extern SLCInit(); extern SLTStart(); extern SLRStart(); /* Receive packets */ static struct ccb rxccb; static struct PBI *rxPBI; static int rxLength; static int rxTmr; SStartRx(pbi, length) struct PBI *pbi; int length; { rxPBI = pbi; rxLength = length; rxccb.cmda = 0x00; rxccb.addra = rxPBI->pup; rxccb.addra = rxccb.addra - 4; rxccb.counta = (-rxLength) & 0x00ff; rxccb.stata = 0; SLRStart(&rxccb); SetTmr(10000, &rxTmr); }; struct PBI *SCheckRx() { struct EtherEncapsulation *ee; int temp; if (rxccb.stata & 0x80) { if (rxccb.stata == 0x88) { temp = (int) rxPBI->pup; temp -= 4; ee = (struct EtherEncapsulation *) temp; if (ee->type == 2) return(rxPBI); /* Swabbed typePup */ }; SStartRx(rxPBI, rxLength) }; if (TmrExp(&rxTmr)) { SLCReset(); /* violent ! */ SStartRx(rxPBI, rxLength) return (0); }; return (0); }; /* Utility */ int EtherHost() { return (FetchW(0xFFFE)); }; SLCReset() { SLCInit(EtherHost()); }; /* Transmit packets */ static struct ccb txccb; static int txTmr; SStartTx(pbi) struct PBI *pbi; { int len; len = Swab(pbi->pup->length); len = (len + 5) & 0x0fffe; txccb.cmda = 0x50; txccb.addra = pbi->pup; txccb.addra = txccb.addra - 4; txccb.counta = len & 0x00ff; txccb.stata = 0; SLTStart(&txccb); SetTmr(200, &txTmr); }; SCheckTx() { if (txccb.stata & 0x80) return(true); if (TmrExp(&txTmr)) { SLCReset(); /* violent ! */ return(true); }; return(false); };