head     1.1;
access   paws bayes jws larry quist brad;
symbols  ;
locks    ; strict;
comment  @# @;


1.1
date     88.02.04.10.47.56;  author larry;  state tmp;
branches ;
next     ;


desc
@Base file for PWS 3.2 release.

@



1.1
log
@Initial revision
@
text
@$SYSPROG$
PROGRAM HASH1(INPUT,OUTPUT);
VAR
  LINK_ADDR : STRING[12];
  LA     : ARRAY[0..47] OF INTEGER;
  CRC    : ARRAY[0..32] OF INTEGER;
  I,M,N,T: INTEGER;

  FUNCTION XOR(I1,I2:INTEGER):INTEGER;
  BEGIN
    IF ((I1=1) AND (I2=0)) OR ((I1=0) AND (I2=1)) THEN XOR := 1
						  ELSE XOR := 0;
  END;
BEGIN
  WRITE('LINK ADDRESS = ? '); READLN(LINK_ADDR);
  IF STRLEN(LINK_ADDR)<>12 THEN
  BEGIN WRITE('MUST BE 12 HEX DIGITS'); ESCAPE(0); END;
  M := 0;
  FOR I := 0 TO 47 DO LA[I]:=0;
  FOR N :=12 DOWNTO 1 DO { CONVERT ASCII HEX TO BINARY }
  BEGIN
    IF LINK_ADDR[N] IN ['0'..'9','A'..'F'] THEN
    BEGIN
      IF LINK_ADDR[N] IN ['1','3','5','7','9','B','D','F'] THEN LA[M]:=1;
      IF LINK_ADDR[N] IN ['2','3','6','7','A','B','E','F'] THEN LA[M+1]:=1;
      IF LINK_ADDR[N] IN ['4'..'7','C'..'F'] THEN LA[M+2]:=1;
      IF NOT (LINK_ADDR[N] IN ['0'..'7']) THEN LA[M+3]:=1;
      M := M + 4;
    END
    ELSE
    BEGIN
      WRITELN(LINK_ADDR[N],' IS NOT A HEX DIGIT ');
      ESCAPE(0);
    END;
  END;

  FOR I := 0 TO 31 DO CRC[I]:=1; { INIT CRC }
  FOR N := 0 TO 47 DO
  BEGIN
    FOR I := 32 DOWNTO 1 DO CRC[I]:=CRC[I-1]; { LEFT SHIFT BY 1 }
    CRC[0]:=0;
    T := XOR(CRC[32],LA[N]);
    IF T=1 THEN
    BEGIN
     CRC[1]:=XOR(CRC[1],1); CRC[2]:=XOR(CRC[2],1); CRC[4]:=XOR(CRC[4],1);
     CRC[5]:=XOR(CRC[5],1); CRC[7]:=XOR(CRC[7],1); CRC[8]:=XOR(CRC[8],1);
     CRC[10]:=XOR(CRC[10],1); CRC[11]:=XOR(CRC[11],1); CRC[12]:=XOR(CRC[12],1);
     CRC[16]:=XOR(CRC[16],1); CRC[22]:=XOR(CRC[22],1); CRC[23]:=XOR(CRC[23],1);
     CRC[26]:=XOR(CRC[26],1);
     CRC[0]:=1;
    END
  END;
  WRITELN('HASH NUMBER IS',
	32*CRC[0]+16*CRC[1]+8*CRC[2]+4*CRC[3]+2*CRC[4]+CRC[5]);
END.
@
