-- File: PupChecksums.mesa, Last Edit: HGM October 16, 1979 7:25 PM

-- Copyright Xerox Corporation 1979, 1980

DIRECTORY
AltoRamDefs: FROM "AltoRamDefs" USING [PupChecksum],
PupRouterDefs: FROM "PupRouterDefs" USING [Checksum],
BufferDefs: FROM "BufferDefs" USING [PupBuffer];

PupChecksums: PROGRAM
IMPORTS AltoRamDefs
EXPORTS PupRouterDefs =
BEGIN

checksum:
PUBLIC PupRouterDefs.Checksum ← software;


SetPupChecksum: PUBLIC PROCEDURE [b: BufferDefs.PupBuffer] =
BEGIN
size:
CARDINAL ← (b.pupLength-1)/2;
checksumLoc: POINTER ← @b.pupLength+size;
cs, t: CARDINAL;
SELECT checksum FROM
alto =>
BEGIN
where: POINTER ← @b.pupLength;
checksumLoc↑ ← AltoRamDefs.PupChecksum[0,where,size];
END;
none =>
BEGIN
checksumLoc↑ ← 177777B;
END;
software =>
BEGIN
p: POINTER TO ARRAY [0..0) OF WORD = LOOPHOLE[@b.pupLength];
i: CARDINAL;
cs ← 0;
FOR i IN [0..size) DO
t ← cs+p[i];
cs ← (IF cs>t THEN t+1 ELSE t);
cs ← (IF cs>=100000B THEN cs*2+1 ELSE cs*2);
ENDLOOP;
IF cs=177777B THEN cs ← 0;
checksumLoc↑ ←
cs;
END;
ENDCASE => NULL;
END;

TestPupChecksum: PUBLIC PROCEDURE [b: BufferDefs.PupBuffer] RETURNS [BOOLEAN] =
BEGIN
size: CARDINAL ← ((LOOPHOLE
[b.pupLength-1,CARDINAL])/2);
checksumLoc: POINTER ← @b.pupLength+size;
cs, t: CARDINAL;
IF checksumLoc↑=177777B THEN RETURN[TRUE];
SELECT checksum FROM
alto =>
BEGIN
where: POINTER ← @b.pupLength;
-- BEWARE: The stack must be empty. Dont try RETURN[xx↑=PupChecksum[xxx]];
cs ← AltoRamDefs.PupChecksum[0,where,size];
END;
none =>
BEGIN
RETURN[TRUE];
END;
software =>
BEGIN
p: POINTER TO ARRAY [0..0) OF WORD = LOOPHOLE[@b.pupLength];
i: CARDINAL;
cs ← 0;
FOR i IN [0..size) DO
t ← cs+p[i];
cs ← (IF cs>t THEN t+1 ELSE t);
cs ← (IF cs>=100000B THEN cs*2+1 ELSE cs*2);
ENDLOOP;
IF cs=177777B THEN cs ← 0;
END;
ENDCASE => NULL;
RETURN[checksumLoc↑=cs];
END;


-- Initialization
END. -- PupChecksums