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