-- 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(2048)\376b14B107b1B653b15B146b1B