chiark / gitweb /
Initial revision
[ssr] / StraySrc / Libraries / Steel / s / crc32
1 ;
2 ; crc32.s
3 ;
4 ; 32-bit CRC calculation
5 ;
6 ;  © 1993-1998 Straylight
7 ;
8
9 ;----- Licensing note -------------------------------------------------------
10 ;
11 ; This file is part of Straylight's Steel library.
12 ;
13 ; Steel is free software; you can redistribute it and/or modify
14 ; it under the terms of the GNU General Public License as published by
15 ; the Free Software Foundation; either version 2, or (at your option)
16 ; any later version.
17 ;
18 ; Steel is distributed in the hope that it will be useful,
19 ; but WITHOUT ANY WARRANTY; without even the implied warranty of
20 ; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
21 ; GNU General Public License for more details.
22 ;
23 ; You should have received a copy of the GNU General Public License
24 ; along with Steel.  If not, write to the Free Software Foundation,
25 ; 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
26
27                 GET     libs:header
28                 GET     libs:swis
29
30                 AREA    |C$$Code|,CODE,READONLY
31
32 ;----- crc32 ----------------------------------------------------------------
33 ;
34 ; Calculates 32-bit Cyclic Redundancy Check values for a given chunk of
35 ; data.  A calculation may be performed in stages.
36 ;
37 ; The method used is the PKZip/Ethernet algorithm.  For reference, the
38 ; parameters to the Rocksoft^tm Model CRC Algorithm are:
39 ;
40 ; Name   : Straylight Cyclic Redundancy Check algorithm
41 ; Width  : 32
42 ; Poly   : 04C11DB7
43 ; Init   : FFFFFFFF
44 ; RefIn  : True
45 ; RefOut : True
46 ; XorOut : FFFFFFFF
47 ; Check  : CBF43926
48 ;
49 ; The routine is very small (and hopefully pretty quick, too).  The table
50 ; is rather large, though.
51 ;
52 ; The code can be called from any APCS-conformant langauge.  The C prototype
53 ; is
54 ;
55 ;       long crc32(     long seed,      /* R0==seed value (0 to start)  */
56 ;                       void *data,     /* R1==pointer to data to check */
57 ;                       size_t size,    /* R2==length of data           */
58 ;                       int diff);      /* R3==diff between check bytes */
59 ;
60 ; In normal use, the seed is 0 for the first call, and the previoud returned
61 ; value for subsequent calculations.
62 ;
63 ; The 'diff' value gives the difference in address between bytes to check,
64 ; so diff==1 means check all bytes, diff==2 means check every other byte,
65 ; and so on.
66 ;
67
68                 EXPORT  crc32
69 crc32           ROUT
70
71                 STMFD   R13!,{R1-R4,R14}
72                 MVN     R0,R0                   ;R0 = R0 XOR &FFFFFFFF!
73                 ADR     R4,crctable             ;Point to my magic table
74
75 00              LDRB    R14,[R1],R3             ;Get byte from stream
76                 EOR     R14,R14,R0              ;XOR register with byte
77                 AND     R14,R14,#&FF            ;Multiply to word, and mask
78                 LDR     R14,[R4,R14,LSL #2]     ;Get word from table
79                 EOR     R0,R14,R0,LSR #8        ;EOR with shifted register
80                 SUBS    R2,R2,R3                ;Decrement counter
81                 BGT     %b00                    ;If necessary, branch back
82                 MVN     R0,R0                   ;R0 = R0 XOR &FFFFFFFF again
83                 LDMFD   R13!,{R1-R4,PC}^
84
85                 LTORG
86
87 ;----- The magic table ------------------------------------------------------
88 ;
89 ; The numbers in this table were generated using the Rocksoft^tm Model CRC
90 ; Algorithm Table Generation Table Program V1.0, written by Ross Williams.
91 ; Our thanks to him for placing this program in the public domain.
92 ;
93
94 crctable        DCD     &00000000,&77073096,&EE0E612C,&990951BA
95                 DCD     &076DC419,&706AF48F,&E963A535,&9E6495A3
96                 DCD     &0EDB8832,&79DCB8A4,&E0D5E91E,&97D2D988
97                 DCD     &09B64C2B,&7EB17CBD,&E7B82D07,&90BF1D91
98                 DCD     &1DB71064,&6AB020F2,&F3B97148,&84BE41DE
99                 DCD     &1ADAD47D,&6DDDE4EB,&F4D4B551,&83D385C7
100                 DCD     &136C9856,&646BA8C0,&FD62F97A,&8A65C9EC
101                 DCD     &14015C4F,&63066CD9,&FA0F3D63,&8D080DF5
102
103                 DCD     &3B6E20C8,&4C69105E,&D56041E4,&A2677172
104                 DCD     &3C03E4D1,&4B04D447,&D20D85FD,&A50AB56B
105                 DCD     &35B5A8FA,&42B2986C,&DBBBC9D6,&ACBCF940
106                 DCD     &32D86CE3,&45DF5C75,&DCD60DCF,&ABD13D59
107                 DCD     &26D930AC,&51DE003A,&C8D75180,&BFD06116
108                 DCD     &21B4F4B5,&56B3C423,&CFBA9599,&B8BDA50F
109                 DCD     &2802B89E,&5F058808,&C60CD9B2,&B10BE924
110                 DCD     &2F6F7C87,&58684C11,&C1611DAB,&B6662D3D
111
112                 DCD     &76DC4190,&01DB7106,&98D220BC,&EFD5102A
113                 DCD     &71B18589,&06B6B51F,&9FBFE4A5,&E8B8D433
114                 DCD     &7807C9A2,&0F00F934,&9609A88E,&E10E9818
115                 DCD     &7F6A0DBB,&086D3D2D,&91646C97,&E6635C01
116                 DCD     &6B6B51F4,&1C6C6162,&856530D8,&F262004E
117                 DCD     &6C0695ED,&1B01A57B,&8208F4C1,&F50FC457
118                 DCD     &65B0D9C6,&12B7E950,&8BBEB8EA,&FCB9887C
119                 DCD     &62DD1DDF,&15DA2D49,&8CD37CF3,&FBD44C65
120
121                 DCD     &4DB26158,&3AB551CE,&A3BC0074,&D4BB30E2
122                 DCD     &4ADFA541,&3DD895D7,&A4D1C46D,&D3D6F4FB
123                 DCD     &4369E96A,&346ED9FC,&AD678846,&DA60B8D0
124                 DCD     &44042D73,&33031DE5,&AA0A4C5F,&DD0D7CC9
125                 DCD     &5005713C,&270241AA,&BE0B1010,&C90C2086
126                 DCD     &5768B525,&206F85B3,&B966D409,&CE61E49F
127                 DCD     &5EDEF90E,&29D9C998,&B0D09822,&C7D7A8B4
128                 DCD     &59B33D17,&2EB40D81,&B7BD5C3B,&C0BA6CAD
129
130                 DCD     &EDB88320,&9ABFB3B6,&03B6E20C,&74B1D29A
131                 DCD     &EAD54739,&9DD277AF,&04DB2615,&73DC1683
132                 DCD     &E3630B12,&94643B84,&0D6D6A3E,&7A6A5AA8
133                 DCD     &E40ECF0B,&9309FF9D,&0A00AE27,&7D079EB1
134                 DCD     &F00F9344,&8708A3D2,&1E01F268,&6906C2FE
135                 DCD     &F762575D,&806567CB,&196C3671,&6E6B06E7
136                 DCD     &FED41B76,&89D32BE0,&10DA7A5A,&67DD4ACC
137                 DCD     &F9B9DF6F,&8EBEEFF9,&17B7BE43,&60B08ED5
138
139                 DCD     &D6D6A3E8,&A1D1937E,&38D8C2C4,&4FDFF252
140                 DCD     &D1BB67F1,&A6BC5767,&3FB506DD,&48B2364B
141                 DCD     &D80D2BDA,&AF0A1B4C,&36034AF6,&41047A60
142                 DCD     &DF60EFC3,&A867DF55,&316E8EEF,&4669BE79
143                 DCD     &CB61B38C,&BC66831A,&256FD2A0,&5268E236
144                 DCD     &CC0C7795,&BB0B4703,&220216B9,&5505262F
145                 DCD     &C5BA3BBE,&B2BD0B28,&2BB45A92,&5CB36A04
146                 DCD     &C2D7FFA7,&B5D0CF31,&2CD99E8B,&5BDEAE1D
147
148                 DCD     &9B64C2B0,&EC63F226,&756AA39C,&026D930A
149                 DCD     &9C0906A9,&EB0E363F,&72076785,&05005713
150                 DCD     &95BF4A82,&E2B87A14,&7BB12BAE,&0CB61B38
151                 DCD     &92D28E9B,&E5D5BE0D,&7CDCEFB7,&0BDBDF21
152                 DCD     &86D3D2D4,&F1D4E242,&68DDB3F8,&1FDA836E
153                 DCD     &81BE16CD,&F6B9265B,&6FB077E1,&18B74777
154                 DCD     &88085AE6,&FF0F6A70,&66063BCA,&11010B5C
155                 DCD     &8F659EFF,&F862AE69,&616BFFD3,&166CCF45
156
157                 DCD     &A00AE278,&D70DD2EE,&4E048354,&3903B3C2
158                 DCD     &A7672661,&D06016F7,&4969474D,&3E6E77DB
159                 DCD     &AED16A4A,&D9D65ADC,&40DF0B66,&37D83BF0
160                 DCD     &A9BCAE53,&DEBB9EC5,&47B2CF7F,&30B5FFE9
161                 DCD     &BDBDF21C,&CABAC28A,&53B39330,&24B4A3A6
162                 DCD     &BAD03605,&CDD70693,&54DE5729,&23D967BF
163                 DCD     &B3667A2E,&C4614AB8,&5D681B02,&2A6F2B94
164                 DCD     &B40BBE37,&C30C8EA1,&5A05DF1B,&2D02EF8D
165
166                 END