2 ; Piotr Fusik, 18.11.2001
\r
4 ; unsigned long __fastcall__ adler32 (unsigned long adler, unsigned char* buf,
\r
10 .import incsp2, incsp4, popax, popeax
\r
11 .importzp sreg, ptr1, ptr2, tmp1
\r
13 BASE = 65521 ; largest prime smaller than 65536
\r
16 ; ptr2 = (len & 0xff) == 0 ? len : len + 0x100;
\r
26 ; if (buf == NULL) return 1L;
\r
29 ; s1 = adler & 0xFFFF; s2 = adler >> 16;
\r
31 ; if (len == 0) return adler;
\r
37 ; s1 += *ptr++; if (s1 >= BASE) s1 -= BASE;
\r
42 beq @L5 ; C flag is set
\r
48 @L5: sbc #<BASE ; C flag is set
\r
51 ; s2 += s1; if (s2 >= BASE) s2 -= BASE;
\r
52 adc sreg ; C flag is clear
\r
64 sbc #<BASE ; C flag is set
\r
77 ; return (s2 << 16) | s1;
\r