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. |