]> git.sur5r.net Git - cc65/blob - libsrc/zlib/crc32.s
Fixed _textcolor definition.
[cc65] / libsrc / zlib / crc32.s
1 ;
2 ; 2001-11-14, Piotr Fusik
3 ; 2018-05-20, Christian Kruger
4 ;
5 ; unsigned long __fastcall__ crc32 (unsigned long crc, unsigned char* buf,
6 ;                                   unsigned len);
7 ;
8
9         .export _crc32
10
11         .import         compleax, incsp2, incsp4, popptr1, popeax
12         .importzp       sreg, ptr1, ptr2, tmp1, tmp2
13
14 POLYNOMIAL      =       $EDB88320
15
16 make_table:
17         ldx     #0
18 @L1:    lda     #0
19         sta     tmp2
20         sta     sreg
21         sta     sreg+1
22         ldy     #8
23         txa
24 @L2:    sta     tmp1
25         lsr     a
26         bcc     @L3
27         lda     sreg+1
28         lsr     a
29         eor     #(POLYNOMIAL>>24)&$FF
30         sta     sreg+1
31         lda     sreg
32         ror     a
33         eor     #(POLYNOMIAL>>16)&$FF
34         sta     sreg
35         lda     tmp2
36         ror     a
37         eor     #(POLYNOMIAL>>8)&$FF
38         sta     tmp2
39         lda     tmp1
40         ror     a
41         eor     #POLYNOMIAL&$FF
42         bcs     @L4     ; branch always
43 @L3:    rol     a
44         lsr     sreg+1
45         ror     sreg
46         ror     tmp2
47         ror     a
48 @L4:    dey
49         bne     @L2
50         sta     table_0,x
51         lda     tmp2
52         sta     table_1,x
53         lda     sreg
54         sta     table_2,x
55         lda     sreg+1
56         sta     table_3,x
57         inx
58         bne     @L1
59         inc     table_initialised
60 RET:
61         rts
62
63 _crc32:
64 ; ptr2 = (len & 0xff) == 0 ? len : len + 0x100;
65         tay
66         beq     @L1
67         inx
68 @L1:    sta     ptr2
69         stx     ptr2+1
70 ; ptr1 = buf
71         jsr     popptr1
72 ; if (buf == NULL) return 0;
73         ora     ptr1+1
74         beq     @L0
75 ; if (!tables_initialised) make_tables();
76         lda     table_initialised
77         bne     @dont_make
78         jsr     make_table
79 @dont_make:
80 ; eax = crc
81         jsr     popeax
82 ; if (len == 0) return crc;
83         ldy     ptr2
84         bne     @L2
85         ldy     ptr2+1
86         beq     RET
87 @L2:
88 ; eax = ~crc
89         jsr     compleax
90         stx     tmp2
91         ldy     #0
92 ; crc = (crc >> 8) ^ table[(crc & 0xff) ^ *p++];
93 @L3:    eor     (ptr1),y
94         tax
95         lda     table_0,x
96         eor     tmp2
97         sta     tmp1
98         lda     table_1,x
99         eor     sreg
100         sta     tmp2
101         lda     table_2,x
102         eor     sreg+1
103         sta     sreg
104         lda     table_3,x
105         sta     sreg+1
106         lda     tmp1
107         iny
108         bne     @L4
109         inc     ptr1+1
110 @L4:    dec     ptr2
111         bne     @L3
112         dec     ptr2+1
113         bne     @L3
114         ldx     tmp2
115         jmp     compleax
116
117 ; return 0L
118 @L0:    sta     sreg
119         sta     sreg+1
120         tax             ; (popptr1 doesn't set .X)
121 ; ignore crc
122         jmp     incsp4
123
124                 .data
125 table_initialised:
126                 .byte   0
127
128                 .bss
129 table_0:        .res    256
130 table_1:        .res    256
131 table_2:        .res    256
132 table_3:        .res    256