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