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