]> git.sur5r.net Git - cc65/blob - libsrc/zlib/adler32.s
Changed most "backticks" (grave accents) into apostrophes.
[cc65] / libsrc / zlib / adler32.s
1 ;
2 ; 2001-11-18, Piotr Fusik
3 ; 2018-05-20, Christian Kruger
4 ;
5 ; unsigned long __fastcall__ adler32 (unsigned long adler, unsigned char* buf,
6 ;                                     unsigned len);
7 ;
8
9         .export _adler32
10
11         .import         incsp2, incsp4, popptr1, popeax
12         .importzp       sreg, ptr1, ptr2, tmp1
13
14 BASE    =       65521   ; largest prime smaller than 65536
15
16 _adler32:
17 ; ptr2 = (len & 0xff) == 0 ? len : len + 0x100;
18         tay
19         beq     @L1
20         inx
21 @L1:    sta     ptr2
22         stx     ptr2+1
23 ; ptr1 = buf
24         jsr     popptr1
25 ; if (buf == NULL) return 1L;
26         ora     ptr1+1
27         beq     @L0
28 ; s1 = adler & 0xFFFF; s2 = adler >> 16;
29         jsr     popeax
30 ; if (len == 0) return adler;
31         ldy     ptr2
32         bne     @L2
33         ldy     ptr2+1
34         beq     @RET
35 @L2:    ldy     #0
36 ; s1 += *ptr++; if (s1 >= BASE) s1 -= BASE;
37 @L3:    clc
38         adc     (ptr1),y
39         bcc     @L4
40         inx
41         beq     @L5     ; C flag is set
42 @L4:    cpx     #>BASE
43         bcc     @L6
44         cmp     #<BASE
45         bcc     @L6
46         inx             ; ldx #0
47 @L5:    sbc     #<BASE  ; C flag is set
48         clc
49 @L6:    sta     tmp1
50 ; s2 += s1; if (s2 >= BASE) s2 -= BASE;
51         adc     sreg    ; C flag is clear
52         sta     sreg
53         txa
54         adc     sreg+1
55         sta     sreg+1
56         bcs     @L7
57         cmp     #>BASE
58         bcc     @L8
59         lda     sreg
60         cmp     #<BASE
61         bcc     @L8
62 @L7:    lda     sreg
63         sbc     #<BASE  ; C flag is set
64         sta     sreg
65         lda     sreg+1
66         sbc     #>BASE
67         sta     sreg+1
68 @L8:    lda     tmp1
69         iny
70         bne     @L9
71         inc     ptr1+1
72 @L9:    dec     ptr2
73         bne     @L3
74         dec     ptr2+1
75         bne     @L3
76 ; return (s2 << 16) | s1;
77 @RET:   rts
78
79 ; return 1L
80 @L0:    sta     sreg
81         sta     sreg+1
82         tax             ; (popptr1 doesn't set .X)
83         lda     #1
84 ; ignore adler
85         jmp     incsp4