]> git.sur5r.net Git - cc65/blob - libsrc/zlib/adler32.s
don't use constructor to setup runtime stack
[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, popax, 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     popax
24         sta     ptr1
25         stx     ptr1+1
26 ; if (buf == NULL) return 1L;
27         ora     ptr1+1
28         beq     @L0
29 ; s1 = adler & 0xFFFF; s2 = adler >> 16;
30         jsr     popeax
31 ; if (len == 0) return adler;
32         ldy     ptr2
33         bne     @L2
34         ldy     ptr2+1
35         beq     @RET
36 @L2:    ldy     #0
37 ; s1 += *ptr++; if (s1 >= BASE) s1 -= BASE;
38 @L3:    clc
39         adc     (ptr1),y
40         bcc     @L4
41         inx
42         beq     @L5     ; C flag is set
43 @L4:    cpx     #>BASE
44         bcc     @L6
45         cmp     #<BASE
46         bcc     @L6
47         inx             ; ldx #0
48 @L5:    sbc     #<BASE  ; C flag is set
49         clc
50 @L6:    sta     tmp1
51 ; s2 += s1; if (s2 >= BASE) s2 -= BASE;
52         adc     sreg    ; C flag is clear
53         sta     sreg
54         txa
55         adc     sreg+1
56         sta     sreg+1
57         bcs     @L7
58         cmp     #>BASE
59         bcc     @L8
60         lda     sreg
61         cmp     #<BASE
62         bcc     @L8
63 @L7:    lda     sreg
64         sbc     #<BASE  ; C flag is set
65         sta     sreg
66         lda     sreg+1
67         sbc     #>BASE
68         sta     sreg+1
69 @L8:    lda     tmp1
70         iny
71         bne     @L9
72         inc     ptr1+1
73 @L9:    dec     ptr2
74         bne     @L3
75         dec     ptr2+1
76         bne     @L3
77 ; return (s2 << 16) | s1;
78 @RET:   rts
79
80 ; return 1L
81 @L0:    sta     sreg
82         sta     sreg+1
83         lda     #1
84 ; ignore adler
85         jmp     incsp4