hedgewars/adler32.pas
changeset 6580 6155187bf599
parent 3744 543412536b7b
child 6926 6e832f8f4d8e
equal deleted inserted replaced
6579:fc52f7c22c9b 6580:6155187bf599
    63 (*
    63 (*
    64 As per the license above, noting that this implementation of adler32 was stripped of everything we didn't need.
    64 As per the license above, noting that this implementation of adler32 was stripped of everything we didn't need.
    65 That means no btypes, file loading, and the assembly version disabled.
    65 That means no btypes, file loading, and the assembly version disabled.
    66 *)
    66 *)
    67 
    67 
    68 procedure Adler32Update(var adler: longint; Msg: pointer; Len: longint);
    68 procedure Adler32Update ( var adler     :longint; Msg     :pointer; Len     :longint );
    69 
    69 
    70 implementation
    70 implementation
    71 
    71 
    72 (*
    72 (*
    73 $ifdef BASM16
    73 $ifdef BASM16
    74 
    74 
    75 procedure Adler32Update(var adler: longint; Msg: pointer; Len: longint);
    75 procedure Adler32Update(var adler: longint; Msg: pointer; Len: longint);
    76   //-update Adler32 with Msg data
    76     //-update Adler32 with Msg data
    77 const
    77 const
    78   BASE = 65521; // max. prime < 65536
    78     BASE = 65521; // max. prime < 65536
    79   NMAX =  5552; // max. n with 255n(n+1)/2 + (n+1)(BASE-1) < 2^32
    79     NMAX =  5552; // max. n with 255n(n+1)/2 + (n+1)(BASE-1) < 2^32
    80 type
    80 type
    81   LH    = packed record
    81     LH    = packed record
    82             L,H: word;
    82             L,H: word;
    83           end;
    83             end;
    84 var
    84 var
    85   s1,s2: longint;
    85     s1,s2: longint;
    86   n: integer;
    86     n: integer;
    87 begin
    87 begin
    88   s1 := LH(adler).L;
    88     s1 := LH(adler).L;
    89   s2 := LH(adler).H;
    89     s2 := LH(adler).H;
    90   while Len > 0 do begin
    90     while Len > 0 do
    91     if Len<NMAX then n := Len else n := NMAX;
    91         begin
       
    92     if Len<NMAX then
       
    93         n := Len
       
    94     else
       
    95         n := NMAX;
    92     //BASM increases speed from about 52 cyc/byte to about 3.7 cyc/byte
    96     //BASM increases speed from about 52 cyc/byte to about 3.7 cyc/byte
    93     asm
    97     asm
    94                     mov  cx,[n]
    98                     mov  cx,[n]
    95             db $66; mov  ax,word ptr [s1]
    99             db $66; mov  ax,word ptr [s1]
    96             db $66; mov  di,word ptr [s2]
   100             db $66; mov  di,word ptr [s2]
    97                     les  si,[msg]
   101                     les  si,[msg]
    98       @@1:  db $66, $26, $0f, $b6, $1c      // movzx ebx,es:[si]
   102         @@1:  db $66, $26, $0f, $b6, $1c      // movzx ebx,es:[si]
    99                     inc  si
   103                     inc  si
   100             db $66; add  ax,bx              // inc(s1, pByte(Msg)^)
   104             db $66; add  ax,bx              // inc(s1, pByte(Msg)^)
   101             db $66; add  di,ax              // inc(s2, s1
   105             db $66; add  di,ax              // inc(s2, s1
   102                     dec  cx
   106                     dec  cx
   103                     jnz  @@1
   107                     jnz  @@1
   109             db $66; sub  dx,dx
   113             db $66; sub  dx,dx
   110             db $66; mov  ax,di
   114             db $66; mov  ax,di
   111             db $66; div  cx
   115             db $66; div  cx
   112             db $66; mov  word ptr [s2],dx   // s2 := s2 mod BASE
   116             db $66; mov  word ptr [s2],dx   // s2 := s2 mod BASE
   113                     mov  word ptr [msg],si  // save offset for next chunk
   117                     mov  word ptr [msg],si  // save offset for next chunk
       
   118         end;
       
   119     dec(len, n);
   114     end;
   120     end;
   115     dec(len, n);
   121     LH(adler).L := word(s1);
   116   end;
   122     LH(adler).H := word(s2);
   117   LH(adler).L := word(s1);
       
   118   LH(adler).H := word(s2);
       
   119 end;
   123 end;
   120 *)
   124 *)
   121 
   125 
   122 procedure Adler32Update(var adler: longint; Msg: pointer; Len: longint);
   126 procedure Adler32Update(var adler: longint; Msg: pointer; Len :longint);
   123   {-update Adler32 with Msg data}
   127     {-update Adler32 with Msg data}
   124 const
   128     const
   125   BASE = 65521; {max. prime < 65536 }
   129         BASE = 65521; {max. prime < 65536 }
   126   NMAX =  3854; {max. n with 255n(n+1)/2 + (n+1)(BASE-1) < 2^31}
   130         NMAX = 3854; {max. n with 255n(n+1)/2 + (n+1)(BASE-1) < 2^31}
   127 type
   131     type
   128   LH    = packed record
   132         LH = packed record
   129             L,H: word;
   133             L, H: word;
   130           end;
   134             end;
   131 var
   135     var
   132   s1,s2: longint;
   136         s1, s2: longint;
   133   i,n: integer;
   137         i, n: integer;
   134 begin
   138     begin
   135   s1 := LH(adler).L;
   139         s1 := LH(adler).L;
   136   s2 := LH(adler).H;
   140         s2 := LH(adler).H;
   137   while Len > 0 do begin
   141         while Len>0 do
   138     if Len<NMAX then n := Len else n := NMAX;
   142             begin
   139     for i:=1 to n do begin
   143             if Len<NMAX then
   140       inc(s1, pByte(Msg)^);
   144                 n := Len
   141       inc(Msg);
   145             else
   142       inc(s2, s1);
   146                 n := NMAX;
       
   147 
       
   148             for i := 1 to n do
       
   149                 begin
       
   150                 inc(s1, pByte(Msg)^);
       
   151                 inc(Msg);
       
   152                 inc(s2, s1);
       
   153                 end;
       
   154             s1 := s1 mod BASE;
       
   155             s2 := s2 mod BASE;
       
   156             dec(len, n);
       
   157             end;
       
   158         LH(adler).L := word(s1);
       
   159         LH(adler).H := word(s2);
   143     end;
   160     end;
   144     s1 := s1 mod BASE;
       
   145     s2 := s2 mod BASE;
       
   146     dec(len, n);
       
   147   end;
       
   148   LH(adler).L := word(s1);
       
   149   LH(adler).H := word(s2);
       
   150 end;
       
   151 
   161 
   152 end.
   162 end.