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