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