2 ; 2001-11-18, Piotr Fusik
3 ; 2018-05-20, Christian Kruger
5 ; unsigned long __fastcall__ adler32 (unsigned long adler, unsigned char* buf,
11 .import incsp2, incsp4, popptr1, popeax
12 .importzp sreg, ptr1, ptr2, tmp1
14 BASE = 65521 ; largest prime smaller than 65536
17 ; ptr2 = (len & 0xff) == 0 ? len : len + 0x100;
25 ; if (buf == NULL) return 1L;
28 ; s1 = adler & 0xFFFF; s2 = adler >> 16;
30 ; if (len == 0) return adler;
36 ; s1 += *ptr++; if (s1 >= BASE) s1 -= BASE;
41 beq @L5 ; C flag is set
47 @L5: sbc #<BASE ; C flag is set
50 ; s2 += s1; if (s2 >= BASE) s2 -= BASE;
51 adc sreg ; C flag is clear
63 sbc #<BASE ; C flag is set
76 ; return (s2 << 16) | s1;
82 tax ; (popptr1 doesn't set .X)