-- File: TedIn.mesa, Last Edit: HGM February 24, 1980 5:34 AM

-- Copyright Xerox Corporation 1979, 1980

DIRECTORY
CommUtilDefs: FROM "CommUtilDefs" USING [GetTicks, msPerTick],
TedDefs: FROM "TedDefs",
AltoEthernetDefs: FROM "AltoEthernetDefs",
BufferDefs: FROM "BufferDefs",
DriverTypes: FROM "DriverTypes" USING [pupEthernetPacket];

TedIn: MONITOR LOCKS TedDefs.lock
IMPORTS CommUtilDefs, AltoEthernetDefs, TedDefs
EXPORTS TedDefs
SHARES BufferDefs, DriverTypes =
BEGIN O
PEN BufferDefs, AltoEthernetDefs, TedDefs;

Watcher: PUBLIC PROCEDURE =
BEGIN
UNTIL tedPleaseStop DO
THROUGH [0..25) DO
IF myD
evice.postData=EthernetNotPosted THEN EXIT;
-- If the post location is not zero, an interrupt should be pending. Since the interrupt routine is higher priority than we are, it should get processed before we can see it. If we get here, an interrupt has probably been lost. It could have been generated between the time we started decoding the instruction and the time that the data is actually fetched. That is why we look at the post location several times. Of course, if it is still not zero when we look again, it coul
d be a new interrupt that has just arrived.
REPEAT FINISHED =>
BEGIN
WatcherNotify[];
END;
ENDLOOP;
IF currentOutputBuffer#NIL
AND (CommUtilDefs.GetTicks[]-timeSendStarted)>250/CommUtilDefs.msPerTick THEN
StartIO[resetCommand]; -- interrupt code will flush
it
Wat
cherWait[];
ENDLOOP;
END;

WatcherWait: ENTRY PROCE
DURE = INLINE
BEGIN
WAIT timer;
END;

WatcherNotify: ENTRY PROCEDURE
= INLINE
BEGIN
NOTIFY hardware;
END;

DecapsulateBuffer: PUBLIC PROCEDURE [b: Buffer] RETURNS [BufferType] =
BEGIN
SELECT b.encapsulation.ethernetType FROM
DriverTypes.pupEthernetPacket =>
BEGIN
IF b.length#((b.pupLength+1+ethernetEncapsulationBytes)/2) THEN
BEGIN
RETURN[rejected];
END;
RETURN[pup];
END;
ENDCASE => RETURN[rejected];
END;

END. -- TedIn