annotate zlib/crc32.c @ 2690:9ef72ee5c0b0

Update vendored zlib to 1.3.1
author Michael Pavone <pavone@retrodev.com>
date Sun, 15 Jun 2025 15:39:33 -0700
parents 00d788dac91a
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
1530
00d788dac91a Added support for reading gzipped ROMs
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1 /* crc32.c -- compute the CRC-32 of a data stream
2690
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
2 * Copyright (C) 1995-2022 Mark Adler
1530
00d788dac91a Added support for reading gzipped ROMs
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
3 * For conditions of distribution and use, see copyright notice in zlib.h
00d788dac91a Added support for reading gzipped ROMs
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
4 *
2690
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
5 * This interleaved implementation of a CRC makes use of pipelined multiple
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
6 * arithmetic-logic units, commonly found in modern CPU cores. It is due to
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
7 * Kadatch and Jenkins (2010). See doc/crc-doc.1.0.pdf in this distribution.
1530
00d788dac91a Added support for reading gzipped ROMs
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
8 */
00d788dac91a Added support for reading gzipped ROMs
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
9
00d788dac91a Added support for reading gzipped ROMs
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
10 /* @(#) $Id$ */
00d788dac91a Added support for reading gzipped ROMs
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
11
00d788dac91a Added support for reading gzipped ROMs
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
12 /*
00d788dac91a Added support for reading gzipped ROMs
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
13 Note on the use of DYNAMIC_CRC_TABLE: there is no mutex or semaphore
00d788dac91a Added support for reading gzipped ROMs
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
14 protection on the static variables used to control the first-use generation
2690
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
15 of the crc tables. Therefore, if you #define DYNAMIC_CRC_TABLE, you should
1530
00d788dac91a Added support for reading gzipped ROMs
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
16 first call get_crc_table() to initialize the tables before allowing more than
00d788dac91a Added support for reading gzipped ROMs
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
17 one thread to use crc32().
00d788dac91a Added support for reading gzipped ROMs
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
18
2690
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
19 MAKECRCH can be #defined to write out crc32.h. A main() routine is also
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
20 produced, so that this one source file can be compiled to an executable.
1530
00d788dac91a Added support for reading gzipped ROMs
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
21 */
00d788dac91a Added support for reading gzipped ROMs
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
22
00d788dac91a Added support for reading gzipped ROMs
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
23 #ifdef MAKECRCH
00d788dac91a Added support for reading gzipped ROMs
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
24 # include <stdio.h>
00d788dac91a Added support for reading gzipped ROMs
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
25 # ifndef DYNAMIC_CRC_TABLE
00d788dac91a Added support for reading gzipped ROMs
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
26 # define DYNAMIC_CRC_TABLE
00d788dac91a Added support for reading gzipped ROMs
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
27 # endif /* !DYNAMIC_CRC_TABLE */
00d788dac91a Added support for reading gzipped ROMs
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
28 #endif /* MAKECRCH */
00d788dac91a Added support for reading gzipped ROMs
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
29
2690
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
30 #include "zutil.h" /* for Z_U4, Z_U8, z_crc_t, and FAR definitions */
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
31
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
32 /*
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
33 A CRC of a message is computed on N braids of words in the message, where
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
34 each word consists of W bytes (4 or 8). If N is 3, for example, then three
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
35 running sparse CRCs are calculated respectively on each braid, at these
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
36 indices in the array of words: 0, 3, 6, ..., 1, 4, 7, ..., and 2, 5, 8, ...
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
37 This is done starting at a word boundary, and continues until as many blocks
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
38 of N * W bytes as are available have been processed. The results are combined
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
39 into a single CRC at the end. For this code, N must be in the range 1..6 and
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
40 W must be 4 or 8. The upper limit on N can be increased if desired by adding
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
41 more #if blocks, extending the patterns apparent in the code. In addition,
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
42 crc32.h would need to be regenerated, if the maximum N value is increased.
1530
00d788dac91a Added support for reading gzipped ROMs
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
43
2690
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
44 N and W are chosen empirically by benchmarking the execution time on a given
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
45 processor. The choices for N and W below were based on testing on Intel Kaby
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
46 Lake i7, AMD Ryzen 7, ARM Cortex-A57, Sparc64-VII, PowerPC POWER9, and MIPS64
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
47 Octeon II processors. The Intel, AMD, and ARM processors were all fastest
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
48 with N=5, W=8. The Sparc, PowerPC, and MIPS64 were all fastest at N=5, W=4.
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
49 They were all tested with either gcc or clang, all using the -O3 optimization
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
50 level. Your mileage may vary.
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
51 */
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
52
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
53 /* Define N */
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
54 #ifdef Z_TESTN
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
55 # define N Z_TESTN
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
56 #else
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
57 # define N 5
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
58 #endif
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
59 #if N < 1 || N > 6
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
60 # error N must be in 1..6
1530
00d788dac91a Added support for reading gzipped ROMs
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
61 #endif
2690
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
62
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
63 /*
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
64 z_crc_t must be at least 32 bits. z_word_t must be at least as long as
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
65 z_crc_t. It is assumed here that z_word_t is either 32 bits or 64 bits, and
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
66 that bytes are eight bits.
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
67 */
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
68
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
69 /*
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
70 Define W and the associated z_word_t type. If W is not defined, then a
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
71 braided calculation is not used, and the associated tables and code are not
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
72 compiled.
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
73 */
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
74 #ifdef Z_TESTW
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
75 # if Z_TESTW-1 != -1
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
76 # define W Z_TESTW
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
77 # endif
1530
00d788dac91a Added support for reading gzipped ROMs
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
78 #else
2690
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
79 # ifdef MAKECRCH
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
80 # define W 8 /* required for MAKECRCH */
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
81 # else
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
82 # if defined(__x86_64__) || defined(__aarch64__)
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
83 # define W 8
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
84 # else
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
85 # define W 4
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
86 # endif
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
87 # endif
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
88 #endif
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
89 #ifdef W
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
90 # if W == 8 && defined(Z_U8)
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
91 typedef Z_U8 z_word_t;
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
92 # elif defined(Z_U4)
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
93 # undef W
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
94 # define W 4
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
95 typedef Z_U4 z_word_t;
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
96 # else
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
97 # undef W
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
98 # endif
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
99 #endif
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
100
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
101 /* If available, use the ARM processor CRC32 instruction. */
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
102 #if defined(__aarch64__) && defined(__ARM_FEATURE_CRC32) && W == 8
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
103 # define ARMCRC32
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
104 #endif
1530
00d788dac91a Added support for reading gzipped ROMs
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
105
2690
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
106 #if defined(W) && (!defined(ARMCRC32) || defined(DYNAMIC_CRC_TABLE))
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
107 /*
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
108 Swap the bytes in a z_word_t to convert between little and big endian. Any
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
109 self-respecting compiler will optimize this to a single machine byte-swap
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
110 instruction, if one is available. This assumes that word_t is either 32 bits
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
111 or 64 bits.
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
112 */
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
113 local z_word_t byte_swap(z_word_t word) {
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
114 # if W == 8
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
115 return
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
116 (word & 0xff00000000000000) >> 56 |
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
117 (word & 0xff000000000000) >> 40 |
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
118 (word & 0xff0000000000) >> 24 |
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
119 (word & 0xff00000000) >> 8 |
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
120 (word & 0xff000000) << 8 |
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
121 (word & 0xff0000) << 24 |
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
122 (word & 0xff00) << 40 |
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
123 (word & 0xff) << 56;
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
124 # else /* W == 4 */
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
125 return
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
126 (word & 0xff000000) >> 24 |
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
127 (word & 0xff0000) >> 8 |
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
128 (word & 0xff00) << 8 |
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
129 (word & 0xff) << 24;
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
130 # endif
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
131 }
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
132 #endif
1530
00d788dac91a Added support for reading gzipped ROMs
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
133
00d788dac91a Added support for reading gzipped ROMs
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
134 #ifdef DYNAMIC_CRC_TABLE
2690
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
135 /* =========================================================================
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
136 * Table of powers of x for combining CRC-32s, filled in by make_crc_table()
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
137 * below.
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
138 */
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
139 local z_crc_t FAR x2n_table[32];
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
140 #else
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
141 /* =========================================================================
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
142 * Tables for byte-wise and braided CRC-32 calculations, and a table of powers
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
143 * of x for combining CRC-32s, all made by make_crc_table().
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
144 */
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
145 # include "crc32.h"
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
146 #endif
1530
00d788dac91a Added support for reading gzipped ROMs
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
147
2690
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
148 /* CRC polynomial. */
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
149 #define POLY 0xedb88320 /* p(x) reflected, with x^32 implied */
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
150
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
151 /*
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
152 Return a(x) multiplied by b(x) modulo p(x), where p(x) is the CRC polynomial,
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
153 reflected. For speed, this requires that a not be zero.
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
154 */
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
155 local z_crc_t multmodp(z_crc_t a, z_crc_t b) {
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
156 z_crc_t m, p;
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
157
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
158 m = (z_crc_t)1 << 31;
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
159 p = 0;
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
160 for (;;) {
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
161 if (a & m) {
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
162 p ^= b;
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
163 if ((a & (m - 1)) == 0)
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
164 break;
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
165 }
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
166 m >>= 1;
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
167 b = b & 1 ? (b >> 1) ^ POLY : b >> 1;
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
168 }
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
169 return p;
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
170 }
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
171
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
172 /*
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
173 Return x^(n * 2^k) modulo p(x). Requires that x2n_table[] has been
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
174 initialized.
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
175 */
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
176 local z_crc_t x2nmodp(z_off64_t n, unsigned k) {
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
177 z_crc_t p;
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
178
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
179 p = (z_crc_t)1 << 31; /* x^0 == 1 */
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
180 while (n) {
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
181 if (n & 1)
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
182 p = multmodp(x2n_table[k & 31], p);
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
183 n >>= 1;
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
184 k++;
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
185 }
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
186 return p;
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
187 }
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
188
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
189 #ifdef DYNAMIC_CRC_TABLE
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
190 /* =========================================================================
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
191 * Build the tables for byte-wise and braided CRC-32 calculations, and a table
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
192 * of powers of x for combining CRC-32s.
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
193 */
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
194 local z_crc_t FAR crc_table[256];
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
195 #ifdef W
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
196 local z_word_t FAR crc_big_table[256];
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
197 local z_crc_t FAR crc_braid_table[W][256];
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
198 local z_word_t FAR crc_braid_big_table[W][256];
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
199 local void braid(z_crc_t [][256], z_word_t [][256], int, int);
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
200 #endif
1530
00d788dac91a Added support for reading gzipped ROMs
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
201 #ifdef MAKECRCH
2690
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
202 local void write_table(FILE *, const z_crc_t FAR *, int);
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
203 local void write_table32hi(FILE *, const z_word_t FAR *, int);
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
204 local void write_table64(FILE *, const z_word_t FAR *, int);
1530
00d788dac91a Added support for reading gzipped ROMs
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
205 #endif /* MAKECRCH */
2690
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
206
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
207 /*
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
208 Define a once() function depending on the availability of atomics. If this is
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
209 compiled with DYNAMIC_CRC_TABLE defined, and if CRCs will be computed in
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
210 multiple threads, and if atomics are not available, then get_crc_table() must
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
211 be called to initialize the tables and must return before any threads are
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
212 allowed to compute or combine CRCs.
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
213 */
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
214
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
215 /* Definition of once functionality. */
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
216 typedef struct once_s once_t;
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
217
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
218 /* Check for the availability of atomics. */
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
219 #if defined(__STDC__) && __STDC_VERSION__ >= 201112L && \
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
220 !defined(__STDC_NO_ATOMICS__)
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
221
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
222 #include <stdatomic.h>
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
223
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
224 /* Structure for once(), which must be initialized with ONCE_INIT. */
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
225 struct once_s {
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
226 atomic_flag begun;
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
227 atomic_int done;
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
228 };
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
229 #define ONCE_INIT {ATOMIC_FLAG_INIT, 0}
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
230
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
231 /*
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
232 Run the provided init() function exactly once, even if multiple threads
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
233 invoke once() at the same time. The state must be a once_t initialized with
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
234 ONCE_INIT.
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
235 */
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
236 local void once(once_t *state, void (*init)(void)) {
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
237 if (!atomic_load(&state->done)) {
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
238 if (atomic_flag_test_and_set(&state->begun))
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
239 while (!atomic_load(&state->done))
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
240 ;
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
241 else {
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
242 init();
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
243 atomic_store(&state->done, 1);
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
244 }
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
245 }
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
246 }
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
247
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
248 #else /* no atomics */
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
249
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
250 /* Structure for once(), which must be initialized with ONCE_INIT. */
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
251 struct once_s {
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
252 volatile int begun;
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
253 volatile int done;
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
254 };
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
255 #define ONCE_INIT {0, 0}
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
256
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
257 /* Test and set. Alas, not atomic, but tries to minimize the period of
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
258 vulnerability. */
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
259 local int test_and_set(int volatile *flag) {
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
260 int was;
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
261
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
262 was = *flag;
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
263 *flag = 1;
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
264 return was;
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
265 }
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
266
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
267 /* Run the provided init() function once. This is not thread-safe. */
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
268 local void once(once_t *state, void (*init)(void)) {
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
269 if (!state->done) {
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
270 if (test_and_set(&state->begun))
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
271 while (!state->done)
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
272 ;
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
273 else {
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
274 init();
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
275 state->done = 1;
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
276 }
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
277 }
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
278 }
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
279
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
280 #endif
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
281
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
282 /* State for once(). */
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
283 local once_t made = ONCE_INIT;
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
284
1530
00d788dac91a Added support for reading gzipped ROMs
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
285 /*
00d788dac91a Added support for reading gzipped ROMs
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
286 Generate tables for a byte-wise 32-bit CRC calculation on the polynomial:
00d788dac91a Added support for reading gzipped ROMs
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
287 x^32+x^26+x^23+x^22+x^16+x^12+x^11+x^10+x^8+x^7+x^5+x^4+x^2+x+1.
00d788dac91a Added support for reading gzipped ROMs
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
288
00d788dac91a Added support for reading gzipped ROMs
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
289 Polynomials over GF(2) are represented in binary, one bit per coefficient,
2690
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
290 with the lowest powers in the most significant bit. Then adding polynomials
1530
00d788dac91a Added support for reading gzipped ROMs
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
291 is just exclusive-or, and multiplying a polynomial by x is a right shift by
2690
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
292 one. If we call the above polynomial p, and represent a byte as the
1530
00d788dac91a Added support for reading gzipped ROMs
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
293 polynomial q, also with the lowest power in the most significant bit (so the
2690
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
294 byte 0xb1 is the polynomial x^7+x^3+x^2+1), then the CRC is (q*x^32) mod p,
1530
00d788dac91a Added support for reading gzipped ROMs
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
295 where a mod b means the remainder after dividing a by b.
00d788dac91a Added support for reading gzipped ROMs
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
296
00d788dac91a Added support for reading gzipped ROMs
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
297 This calculation is done using the shift-register method of multiplying and
2690
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
298 taking the remainder. The register is initialized to zero, and for each
1530
00d788dac91a Added support for reading gzipped ROMs
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
299 incoming bit, x^32 is added mod p to the register if the bit is a one (where
2690
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
300 x^32 mod p is p+x^32 = x^26+...+1), and the register is multiplied mod p by x
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
301 (which is shifting right by one and adding x^32 mod p if the bit shifted out
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
302 is a one). We start with the highest power (least significant bit) of q and
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
303 repeat for all eight bits of q.
1530
00d788dac91a Added support for reading gzipped ROMs
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
304
2690
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
305 The table is simply the CRC of all possible eight bit values. This is all the
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
306 information needed to generate CRCs on data a byte at a time for all
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
307 combinations of CRC register values and incoming bytes.
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
308 */
1530
00d788dac91a Added support for reading gzipped ROMs
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
309
2690
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
310 local void make_crc_table(void) {
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
311 unsigned i, j, n;
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
312 z_crc_t p;
1530
00d788dac91a Added support for reading gzipped ROMs
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
313
2690
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
314 /* initialize the CRC of bytes tables */
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
315 for (i = 0; i < 256; i++) {
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
316 p = i;
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
317 for (j = 0; j < 8; j++)
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
318 p = p & 1 ? (p >> 1) ^ POLY : p >> 1;
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
319 crc_table[i] = p;
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
320 #ifdef W
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
321 crc_big_table[i] = byte_swap(p);
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
322 #endif
1530
00d788dac91a Added support for reading gzipped ROMs
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
323 }
00d788dac91a Added support for reading gzipped ROMs
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
324
2690
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
325 /* initialize the x^2^n mod p(x) table */
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
326 p = (z_crc_t)1 << 30; /* x^1 */
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
327 x2n_table[0] = p;
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
328 for (n = 1; n < 32; n++)
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
329 x2n_table[n] = p = multmodp(p, p);
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
330
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
331 #ifdef W
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
332 /* initialize the braiding tables -- needs x2n_table[] */
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
333 braid(crc_braid_table, crc_braid_big_table, N, W);
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
334 #endif
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
335
1530
00d788dac91a Added support for reading gzipped ROMs
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
336 #ifdef MAKECRCH
00d788dac91a Added support for reading gzipped ROMs
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
337 {
2690
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
338 /*
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
339 The crc32.h header file contains tables for both 32-bit and 64-bit
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
340 z_word_t's, and so requires a 64-bit type be available. In that case,
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
341 z_word_t must be defined to be 64-bits. This code then also generates
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
342 and writes out the tables for the case that z_word_t is 32 bits.
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
343 */
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
344 #if !defined(W) || W != 8
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
345 # error Need a 64-bit integer type in order to generate crc32.h.
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
346 #endif
1530
00d788dac91a Added support for reading gzipped ROMs
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
347 FILE *out;
2690
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
348 int k, n;
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
349 z_crc_t ltl[8][256];
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
350 z_word_t big[8][256];
1530
00d788dac91a Added support for reading gzipped ROMs
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
351
00d788dac91a Added support for reading gzipped ROMs
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
352 out = fopen("crc32.h", "w");
00d788dac91a Added support for reading gzipped ROMs
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
353 if (out == NULL) return;
2690
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
354
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
355 /* write out little-endian CRC table to crc32.h */
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
356 fprintf(out,
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
357 "/* crc32.h -- tables for rapid CRC calculation\n"
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
358 " * Generated automatically by crc32.c\n */\n"
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
359 "\n"
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
360 "local const z_crc_t FAR crc_table[] = {\n"
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
361 " ");
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
362 write_table(out, crc_table, 256);
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
363 fprintf(out,
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
364 "};\n");
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
365
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
366 /* write out big-endian CRC table for 64-bit z_word_t to crc32.h */
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
367 fprintf(out,
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
368 "\n"
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
369 "#ifdef W\n"
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
370 "\n"
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
371 "#if W == 8\n"
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
372 "\n"
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
373 "local const z_word_t FAR crc_big_table[] = {\n"
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
374 " ");
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
375 write_table64(out, crc_big_table, 256);
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
376 fprintf(out,
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
377 "};\n");
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
378
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
379 /* write out big-endian CRC table for 32-bit z_word_t to crc32.h */
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
380 fprintf(out,
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
381 "\n"
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
382 "#else /* W == 4 */\n"
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
383 "\n"
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
384 "local const z_word_t FAR crc_big_table[] = {\n"
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
385 " ");
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
386 write_table32hi(out, crc_big_table, 256);
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
387 fprintf(out,
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
388 "};\n"
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
389 "\n"
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
390 "#endif\n");
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
391
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
392 /* write out braid tables for each value of N */
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
393 for (n = 1; n <= 6; n++) {
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
394 fprintf(out,
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
395 "\n"
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
396 "#if N == %d\n", n);
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
397
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
398 /* compute braid tables for this N and 64-bit word_t */
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
399 braid(ltl, big, n, 8);
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
400
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
401 /* write out braid tables for 64-bit z_word_t to crc32.h */
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
402 fprintf(out,
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
403 "\n"
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
404 "#if W == 8\n"
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
405 "\n"
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
406 "local const z_crc_t FAR crc_braid_table[][256] = {\n");
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
407 for (k = 0; k < 8; k++) {
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
408 fprintf(out, " {");
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
409 write_table(out, ltl[k], 256);
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
410 fprintf(out, "}%s", k < 7 ? ",\n" : "");
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
411 }
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
412 fprintf(out,
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
413 "};\n"
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
414 "\n"
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
415 "local const z_word_t FAR crc_braid_big_table[][256] = {\n");
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
416 for (k = 0; k < 8; k++) {
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
417 fprintf(out, " {");
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
418 write_table64(out, big[k], 256);
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
419 fprintf(out, "}%s", k < 7 ? ",\n" : "");
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
420 }
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
421 fprintf(out,
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
422 "};\n");
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
423
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
424 /* compute braid tables for this N and 32-bit word_t */
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
425 braid(ltl, big, n, 4);
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
426
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
427 /* write out braid tables for 32-bit z_word_t to crc32.h */
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
428 fprintf(out,
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
429 "\n"
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
430 "#else /* W == 4 */\n"
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
431 "\n"
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
432 "local const z_crc_t FAR crc_braid_table[][256] = {\n");
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
433 for (k = 0; k < 4; k++) {
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
434 fprintf(out, " {");
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
435 write_table(out, ltl[k], 256);
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
436 fprintf(out, "}%s", k < 3 ? ",\n" : "");
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
437 }
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
438 fprintf(out,
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
439 "};\n"
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
440 "\n"
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
441 "local const z_word_t FAR crc_braid_big_table[][256] = {\n");
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
442 for (k = 0; k < 4; k++) {
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
443 fprintf(out, " {");
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
444 write_table32hi(out, big[k], 256);
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
445 fprintf(out, "}%s", k < 3 ? ",\n" : "");
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
446 }
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
447 fprintf(out,
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
448 "};\n"
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
449 "\n"
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
450 "#endif\n"
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
451 "\n"
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
452 "#endif\n");
1530
00d788dac91a Added support for reading gzipped ROMs
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
453 }
2690
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
454 fprintf(out,
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
455 "\n"
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
456 "#endif\n");
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
457
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
458 /* write out zeros operator table to crc32.h */
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
459 fprintf(out,
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
460 "\n"
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
461 "local const z_crc_t FAR x2n_table[] = {\n"
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
462 " ");
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
463 write_table(out, x2n_table, 32);
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
464 fprintf(out,
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
465 "};\n");
1530
00d788dac91a Added support for reading gzipped ROMs
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
466 fclose(out);
00d788dac91a Added support for reading gzipped ROMs
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
467 }
00d788dac91a Added support for reading gzipped ROMs
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
468 #endif /* MAKECRCH */
00d788dac91a Added support for reading gzipped ROMs
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
469 }
00d788dac91a Added support for reading gzipped ROMs
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
470
00d788dac91a Added support for reading gzipped ROMs
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
471 #ifdef MAKECRCH
2690
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
472
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
473 /*
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
474 Write the 32-bit values in table[0..k-1] to out, five per line in
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
475 hexadecimal separated by commas.
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
476 */
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
477 local void write_table(FILE *out, const z_crc_t FAR *table, int k) {
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
478 int n;
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
479
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
480 for (n = 0; n < k; n++)
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
481 fprintf(out, "%s0x%08lx%s", n == 0 || n % 5 ? "" : " ",
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
482 (unsigned long)(table[n]),
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
483 n == k - 1 ? "" : (n % 5 == 4 ? ",\n" : ", "));
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
484 }
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
485
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
486 /*
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
487 Write the high 32-bits of each value in table[0..k-1] to out, five per line
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
488 in hexadecimal separated by commas.
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
489 */
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
490 local void write_table32hi(FILE *out, const z_word_t FAR *table, int k) {
1530
00d788dac91a Added support for reading gzipped ROMs
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
491 int n;
00d788dac91a Added support for reading gzipped ROMs
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
492
2690
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
493 for (n = 0; n < k; n++)
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
494 fprintf(out, "%s0x%08lx%s", n == 0 || n % 5 ? "" : " ",
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
495 (unsigned long)(table[n] >> 32),
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
496 n == k - 1 ? "" : (n % 5 == 4 ? ",\n" : ", "));
1530
00d788dac91a Added support for reading gzipped ROMs
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
497 }
2690
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
498
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
499 /*
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
500 Write the 64-bit values in table[0..k-1] to out, three per line in
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
501 hexadecimal separated by commas. This assumes that if there is a 64-bit
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
502 type, then there is also a long long integer type, and it is at least 64
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
503 bits. If not, then the type cast and format string can be adjusted
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
504 accordingly.
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
505 */
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
506 local void write_table64(FILE *out, const z_word_t FAR *table, int k) {
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
507 int n;
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
508
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
509 for (n = 0; n < k; n++)
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
510 fprintf(out, "%s0x%016llx%s", n == 0 || n % 3 ? "" : " ",
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
511 (unsigned long long)(table[n]),
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
512 n == k - 1 ? "" : (n % 3 == 2 ? ",\n" : ", "));
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
513 }
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
514
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
515 /* Actually do the deed. */
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
516 int main(void) {
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
517 make_crc_table();
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
518 return 0;
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
519 }
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
520
1530
00d788dac91a Added support for reading gzipped ROMs
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
521 #endif /* MAKECRCH */
00d788dac91a Added support for reading gzipped ROMs
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
522
2690
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
523 #ifdef W
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
524 /*
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
525 Generate the little and big-endian braid tables for the given n and z_word_t
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
526 size w. Each array must have room for w blocks of 256 elements.
1530
00d788dac91a Added support for reading gzipped ROMs
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
527 */
2690
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
528 local void braid(z_crc_t ltl[][256], z_word_t big[][256], int n, int w) {
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
529 int k;
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
530 z_crc_t i, p, q;
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
531 for (k = 0; k < w; k++) {
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
532 p = x2nmodp((n * w + 3 - k) << 3, 0);
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
533 ltl[k][0] = 0;
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
534 big[w - 1 - k][0] = 0;
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
535 for (i = 1; i < 256; i++) {
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
536 ltl[k][i] = q = multmodp(i << 24, p);
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
537 big[w - 1 - k][i] = byte_swap(q);
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
538 }
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
539 }
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
540 }
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
541 #endif
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
542
1530
00d788dac91a Added support for reading gzipped ROMs
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
543 #endif /* DYNAMIC_CRC_TABLE */
00d788dac91a Added support for reading gzipped ROMs
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
544
00d788dac91a Added support for reading gzipped ROMs
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
545 /* =========================================================================
2690
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
546 * This function can be used by asm versions of crc32(), and to force the
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
547 * generation of the CRC tables in a threaded application.
1530
00d788dac91a Added support for reading gzipped ROMs
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
548 */
2690
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
549 const z_crc_t FAR * ZEXPORT get_crc_table(void) {
1530
00d788dac91a Added support for reading gzipped ROMs
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
550 #ifdef DYNAMIC_CRC_TABLE
2690
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
551 once(&made, make_crc_table);
1530
00d788dac91a Added support for reading gzipped ROMs
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
552 #endif /* DYNAMIC_CRC_TABLE */
00d788dac91a Added support for reading gzipped ROMs
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
553 return (const z_crc_t FAR *)crc_table;
00d788dac91a Added support for reading gzipped ROMs
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
554 }
00d788dac91a Added support for reading gzipped ROMs
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
555
2690
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
556 /* =========================================================================
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
557 * Use ARM machine instructions if available. This will compute the CRC about
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
558 * ten times faster than the braided calculation. This code does not check for
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
559 * the presence of the CRC instruction at run time. __ARM_FEATURE_CRC32 will
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
560 * only be defined if the compilation specifies an ARM processor architecture
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
561 * that has the instructions. For example, compiling with -march=armv8.1-a or
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
562 * -march=armv8-a+crc, or -march=native if the compile machine has the crc32
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
563 * instructions.
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
564 */
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
565 #ifdef ARMCRC32
1530
00d788dac91a Added support for reading gzipped ROMs
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
566
2690
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
567 /*
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
568 Constants empirically determined to maximize speed. These values are from
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
569 measurements on a Cortex-A57. Your mileage may vary.
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
570 */
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
571 #define Z_BATCH 3990 /* number of words in a batch */
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
572 #define Z_BATCH_ZEROS 0xa10d3d0c /* computed from Z_BATCH = 3990 */
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
573 #define Z_BATCH_MIN 800 /* fewest words in a final batch */
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
574
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
575 unsigned long ZEXPORT crc32_z(unsigned long crc, const unsigned char FAR *buf,
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
576 z_size_t len) {
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
577 z_crc_t val;
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
578 z_word_t crc1, crc2;
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
579 const z_word_t *word;
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
580 z_word_t val0, val1, val2;
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
581 z_size_t last, last2, i;
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
582 z_size_t num;
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
583
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
584 /* Return initial CRC, if requested. */
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
585 if (buf == Z_NULL) return 0;
1530
00d788dac91a Added support for reading gzipped ROMs
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
586
00d788dac91a Added support for reading gzipped ROMs
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
587 #ifdef DYNAMIC_CRC_TABLE
2690
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
588 once(&made, make_crc_table);
1530
00d788dac91a Added support for reading gzipped ROMs
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
589 #endif /* DYNAMIC_CRC_TABLE */
00d788dac91a Added support for reading gzipped ROMs
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
590
2690
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
591 /* Pre-condition the CRC */
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
592 crc = (~crc) & 0xffffffff;
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
593
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
594 /* Compute the CRC up to a word boundary. */
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
595 while (len && ((z_size_t)buf & 7) != 0) {
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
596 len--;
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
597 val = *buf++;
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
598 __asm__ volatile("crc32b %w0, %w0, %w1" : "+r"(crc) : "r"(val));
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
599 }
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
600
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
601 /* Prepare to compute the CRC on full 64-bit words word[0..num-1]. */
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
602 word = (z_word_t const *)buf;
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
603 num = len >> 3;
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
604 len &= 7;
1530
00d788dac91a Added support for reading gzipped ROMs
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
605
2690
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
606 /* Do three interleaved CRCs to realize the throughput of one crc32x
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
607 instruction per cycle. Each CRC is calculated on Z_BATCH words. The
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
608 three CRCs are combined into a single CRC after each set of batches. */
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
609 while (num >= 3 * Z_BATCH) {
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
610 crc1 = 0;
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
611 crc2 = 0;
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
612 for (i = 0; i < Z_BATCH; i++) {
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
613 val0 = word[i];
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
614 val1 = word[i + Z_BATCH];
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
615 val2 = word[i + 2 * Z_BATCH];
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
616 __asm__ volatile("crc32x %w0, %w0, %x1" : "+r"(crc) : "r"(val0));
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
617 __asm__ volatile("crc32x %w0, %w0, %x1" : "+r"(crc1) : "r"(val1));
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
618 __asm__ volatile("crc32x %w0, %w0, %x1" : "+r"(crc2) : "r"(val2));
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
619 }
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
620 word += 3 * Z_BATCH;
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
621 num -= 3 * Z_BATCH;
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
622 crc = multmodp(Z_BATCH_ZEROS, crc) ^ crc1;
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
623 crc = multmodp(Z_BATCH_ZEROS, crc) ^ crc2;
1530
00d788dac91a Added support for reading gzipped ROMs
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
624 }
2690
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
625
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
626 /* Do one last smaller batch with the remaining words, if there are enough
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
627 to pay for the combination of CRCs. */
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
628 last = num / 3;
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
629 if (last >= Z_BATCH_MIN) {
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
630 last2 = last << 1;
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
631 crc1 = 0;
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
632 crc2 = 0;
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
633 for (i = 0; i < last; i++) {
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
634 val0 = word[i];
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
635 val1 = word[i + last];
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
636 val2 = word[i + last2];
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
637 __asm__ volatile("crc32x %w0, %w0, %x1" : "+r"(crc) : "r"(val0));
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
638 __asm__ volatile("crc32x %w0, %w0, %x1" : "+r"(crc1) : "r"(val1));
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
639 __asm__ volatile("crc32x %w0, %w0, %x1" : "+r"(crc2) : "r"(val2));
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
640 }
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
641 word += 3 * last;
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
642 num -= 3 * last;
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
643 val = x2nmodp(last, 6);
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
644 crc = multmodp(val, crc) ^ crc1;
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
645 crc = multmodp(val, crc) ^ crc2;
1530
00d788dac91a Added support for reading gzipped ROMs
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
646 }
2690
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
647
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
648 /* Compute the CRC on any remaining words. */
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
649 for (i = 0; i < num; i++) {
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
650 val0 = word[i];
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
651 __asm__ volatile("crc32x %w0, %w0, %x1" : "+r"(crc) : "r"(val0));
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
652 }
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
653 word += num;
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
654
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
655 /* Complete the CRC on any remaining bytes. */
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
656 buf = (const unsigned char FAR *)word;
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
657 while (len) {
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
658 len--;
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
659 val = *buf++;
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
660 __asm__ volatile("crc32b %w0, %w0, %w1" : "+r"(crc) : "r"(val));
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
661 }
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
662
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
663 /* Return the CRC, post-conditioned. */
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
664 return crc ^ 0xffffffff;
1530
00d788dac91a Added support for reading gzipped ROMs
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
665 }
00d788dac91a Added support for reading gzipped ROMs
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
666
2690
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
667 #else
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
668
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
669 #ifdef W
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
670
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
671 /*
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
672 Return the CRC of the W bytes in the word_t data, taking the
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
673 least-significant byte of the word as the first byte of data, without any pre
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
674 or post conditioning. This is used to combine the CRCs of each braid.
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
675 */
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
676 local z_crc_t crc_word(z_word_t data) {
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
677 int k;
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
678 for (k = 0; k < W; k++)
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
679 data = (data >> 8) ^ crc_table[data & 0xff];
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
680 return (z_crc_t)data;
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
681 }
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
682
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
683 local z_word_t crc_word_big(z_word_t data) {
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
684 int k;
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
685 for (k = 0; k < W; k++)
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
686 data = (data << 8) ^
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
687 crc_big_table[(data >> ((W - 1) << 3)) & 0xff];
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
688 return data;
1530
00d788dac91a Added support for reading gzipped ROMs
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
689 }
00d788dac91a Added support for reading gzipped ROMs
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
690
2690
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
691 #endif
1530
00d788dac91a Added support for reading gzipped ROMs
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
692
00d788dac91a Added support for reading gzipped ROMs
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
693 /* ========================================================================= */
2690
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
694 unsigned long ZEXPORT crc32_z(unsigned long crc, const unsigned char FAR *buf,
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
695 z_size_t len) {
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
696 /* Return initial CRC, if requested. */
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
697 if (buf == Z_NULL) return 0;
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
698
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
699 #ifdef DYNAMIC_CRC_TABLE
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
700 once(&made, make_crc_table);
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
701 #endif /* DYNAMIC_CRC_TABLE */
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
702
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
703 /* Pre-condition the CRC */
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
704 crc = (~crc) & 0xffffffff;
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
705
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
706 #ifdef W
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
707
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
708 /* If provided enough bytes, do a braided CRC calculation. */
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
709 if (len >= N * W + W - 1) {
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
710 z_size_t blks;
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
711 z_word_t const *words;
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
712 unsigned endian;
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
713 int k;
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
714
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
715 /* Compute the CRC up to a z_word_t boundary. */
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
716 while (len && ((z_size_t)buf & (W - 1)) != 0) {
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
717 len--;
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
718 crc = (crc >> 8) ^ crc_table[(crc ^ *buf++) & 0xff];
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
719 }
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
720
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
721 /* Compute the CRC on as many N z_word_t blocks as are available. */
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
722 blks = len / (N * W);
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
723 len -= blks * N * W;
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
724 words = (z_word_t const *)buf;
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
725
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
726 /* Do endian check at execution time instead of compile time, since ARM
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
727 processors can change the endianness at execution time. If the
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
728 compiler knows what the endianness will be, it can optimize out the
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
729 check and the unused branch. */
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
730 endian = 1;
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
731 if (*(unsigned char *)&endian) {
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
732 /* Little endian. */
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
733
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
734 z_crc_t crc0;
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
735 z_word_t word0;
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
736 #if N > 1
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
737 z_crc_t crc1;
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
738 z_word_t word1;
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
739 #if N > 2
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
740 z_crc_t crc2;
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
741 z_word_t word2;
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
742 #if N > 3
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
743 z_crc_t crc3;
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
744 z_word_t word3;
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
745 #if N > 4
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
746 z_crc_t crc4;
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
747 z_word_t word4;
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
748 #if N > 5
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
749 z_crc_t crc5;
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
750 z_word_t word5;
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
751 #endif
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
752 #endif
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
753 #endif
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
754 #endif
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
755 #endif
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
756
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
757 /* Initialize the CRC for each braid. */
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
758 crc0 = crc;
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
759 #if N > 1
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
760 crc1 = 0;
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
761 #if N > 2
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
762 crc2 = 0;
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
763 #if N > 3
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
764 crc3 = 0;
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
765 #if N > 4
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
766 crc4 = 0;
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
767 #if N > 5
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
768 crc5 = 0;
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
769 #endif
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
770 #endif
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
771 #endif
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
772 #endif
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
773 #endif
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
774
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
775 /*
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
776 Process the first blks-1 blocks, computing the CRCs on each braid
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
777 independently.
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
778 */
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
779 while (--blks) {
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
780 /* Load the word for each braid into registers. */
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
781 word0 = crc0 ^ words[0];
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
782 #if N > 1
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
783 word1 = crc1 ^ words[1];
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
784 #if N > 2
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
785 word2 = crc2 ^ words[2];
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
786 #if N > 3
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
787 word3 = crc3 ^ words[3];
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
788 #if N > 4
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
789 word4 = crc4 ^ words[4];
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
790 #if N > 5
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
791 word5 = crc5 ^ words[5];
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
792 #endif
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
793 #endif
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
794 #endif
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
795 #endif
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
796 #endif
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
797 words += N;
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
798
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
799 /* Compute and update the CRC for each word. The loop should
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
800 get unrolled. */
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
801 crc0 = crc_braid_table[0][word0 & 0xff];
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
802 #if N > 1
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
803 crc1 = crc_braid_table[0][word1 & 0xff];
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
804 #if N > 2
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
805 crc2 = crc_braid_table[0][word2 & 0xff];
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
806 #if N > 3
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
807 crc3 = crc_braid_table[0][word3 & 0xff];
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
808 #if N > 4
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
809 crc4 = crc_braid_table[0][word4 & 0xff];
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
810 #if N > 5
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
811 crc5 = crc_braid_table[0][word5 & 0xff];
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
812 #endif
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
813 #endif
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
814 #endif
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
815 #endif
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
816 #endif
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
817 for (k = 1; k < W; k++) {
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
818 crc0 ^= crc_braid_table[k][(word0 >> (k << 3)) & 0xff];
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
819 #if N > 1
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
820 crc1 ^= crc_braid_table[k][(word1 >> (k << 3)) & 0xff];
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
821 #if N > 2
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
822 crc2 ^= crc_braid_table[k][(word2 >> (k << 3)) & 0xff];
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
823 #if N > 3
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
824 crc3 ^= crc_braid_table[k][(word3 >> (k << 3)) & 0xff];
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
825 #if N > 4
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
826 crc4 ^= crc_braid_table[k][(word4 >> (k << 3)) & 0xff];
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
827 #if N > 5
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
828 crc5 ^= crc_braid_table[k][(word5 >> (k << 3)) & 0xff];
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
829 #endif
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
830 #endif
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
831 #endif
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
832 #endif
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
833 #endif
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
834 }
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
835 }
1530
00d788dac91a Added support for reading gzipped ROMs
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
836
2690
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
837 /*
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
838 Process the last block, combining the CRCs of the N braids at the
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
839 same time.
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
840 */
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
841 crc = crc_word(crc0 ^ words[0]);
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
842 #if N > 1
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
843 crc = crc_word(crc1 ^ words[1] ^ crc);
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
844 #if N > 2
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
845 crc = crc_word(crc2 ^ words[2] ^ crc);
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
846 #if N > 3
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
847 crc = crc_word(crc3 ^ words[3] ^ crc);
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
848 #if N > 4
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
849 crc = crc_word(crc4 ^ words[4] ^ crc);
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
850 #if N > 5
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
851 crc = crc_word(crc5 ^ words[5] ^ crc);
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
852 #endif
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
853 #endif
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
854 #endif
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
855 #endif
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
856 #endif
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
857 words += N;
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
858 }
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
859 else {
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
860 /* Big endian. */
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
861
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
862 z_word_t crc0, word0, comb;
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
863 #if N > 1
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
864 z_word_t crc1, word1;
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
865 #if N > 2
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
866 z_word_t crc2, word2;
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
867 #if N > 3
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
868 z_word_t crc3, word3;
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
869 #if N > 4
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
870 z_word_t crc4, word4;
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
871 #if N > 5
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
872 z_word_t crc5, word5;
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
873 #endif
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
874 #endif
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
875 #endif
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
876 #endif
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
877 #endif
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
878
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
879 /* Initialize the CRC for each braid. */
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
880 crc0 = byte_swap(crc);
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
881 #if N > 1
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
882 crc1 = 0;
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
883 #if N > 2
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
884 crc2 = 0;
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
885 #if N > 3
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
886 crc3 = 0;
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
887 #if N > 4
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
888 crc4 = 0;
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
889 #if N > 5
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
890 crc5 = 0;
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
891 #endif
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
892 #endif
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
893 #endif
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
894 #endif
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
895 #endif
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
896
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
897 /*
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
898 Process the first blks-1 blocks, computing the CRCs on each braid
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
899 independently.
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
900 */
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
901 while (--blks) {
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
902 /* Load the word for each braid into registers. */
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
903 word0 = crc0 ^ words[0];
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
904 #if N > 1
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
905 word1 = crc1 ^ words[1];
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
906 #if N > 2
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
907 word2 = crc2 ^ words[2];
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
908 #if N > 3
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
909 word3 = crc3 ^ words[3];
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
910 #if N > 4
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
911 word4 = crc4 ^ words[4];
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
912 #if N > 5
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
913 word5 = crc5 ^ words[5];
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
914 #endif
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
915 #endif
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
916 #endif
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
917 #endif
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
918 #endif
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
919 words += N;
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
920
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
921 /* Compute and update the CRC for each word. The loop should
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
922 get unrolled. */
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
923 crc0 = crc_braid_big_table[0][word0 & 0xff];
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
924 #if N > 1
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
925 crc1 = crc_braid_big_table[0][word1 & 0xff];
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
926 #if N > 2
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
927 crc2 = crc_braid_big_table[0][word2 & 0xff];
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
928 #if N > 3
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
929 crc3 = crc_braid_big_table[0][word3 & 0xff];
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
930 #if N > 4
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
931 crc4 = crc_braid_big_table[0][word4 & 0xff];
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
932 #if N > 5
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
933 crc5 = crc_braid_big_table[0][word5 & 0xff];
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
934 #endif
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
935 #endif
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
936 #endif
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
937 #endif
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
938 #endif
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
939 for (k = 1; k < W; k++) {
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
940 crc0 ^= crc_braid_big_table[k][(word0 >> (k << 3)) & 0xff];
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
941 #if N > 1
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
942 crc1 ^= crc_braid_big_table[k][(word1 >> (k << 3)) & 0xff];
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
943 #if N > 2
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
944 crc2 ^= crc_braid_big_table[k][(word2 >> (k << 3)) & 0xff];
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
945 #if N > 3
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
946 crc3 ^= crc_braid_big_table[k][(word3 >> (k << 3)) & 0xff];
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
947 #if N > 4
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
948 crc4 ^= crc_braid_big_table[k][(word4 >> (k << 3)) & 0xff];
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
949 #if N > 5
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
950 crc5 ^= crc_braid_big_table[k][(word5 >> (k << 3)) & 0xff];
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
951 #endif
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
952 #endif
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
953 #endif
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
954 #endif
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
955 #endif
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
956 }
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
957 }
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
958
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
959 /*
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
960 Process the last block, combining the CRCs of the N braids at the
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
961 same time.
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
962 */
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
963 comb = crc_word_big(crc0 ^ words[0]);
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
964 #if N > 1
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
965 comb = crc_word_big(crc1 ^ words[1] ^ comb);
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
966 #if N > 2
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
967 comb = crc_word_big(crc2 ^ words[2] ^ comb);
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
968 #if N > 3
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
969 comb = crc_word_big(crc3 ^ words[3] ^ comb);
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
970 #if N > 4
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
971 comb = crc_word_big(crc4 ^ words[4] ^ comb);
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
972 #if N > 5
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
973 comb = crc_word_big(crc5 ^ words[5] ^ comb);
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
974 #endif
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
975 #endif
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
976 #endif
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
977 #endif
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
978 #endif
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
979 words += N;
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
980 crc = byte_swap(comb);
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
981 }
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
982
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
983 /*
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
984 Update the pointer to the remaining bytes to process.
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
985 */
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
986 buf = (unsigned char const *)words;
1530
00d788dac91a Added support for reading gzipped ROMs
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
987 }
00d788dac91a Added support for reading gzipped ROMs
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
988
2690
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
989 #endif /* W */
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
990
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
991 /* Complete the computation of the CRC on any remaining bytes. */
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
992 while (len >= 8) {
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
993 len -= 8;
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
994 crc = (crc >> 8) ^ crc_table[(crc ^ *buf++) & 0xff];
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
995 crc = (crc >> 8) ^ crc_table[(crc ^ *buf++) & 0xff];
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
996 crc = (crc >> 8) ^ crc_table[(crc ^ *buf++) & 0xff];
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
997 crc = (crc >> 8) ^ crc_table[(crc ^ *buf++) & 0xff];
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
998 crc = (crc >> 8) ^ crc_table[(crc ^ *buf++) & 0xff];
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
999 crc = (crc >> 8) ^ crc_table[(crc ^ *buf++) & 0xff];
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
1000 crc = (crc >> 8) ^ crc_table[(crc ^ *buf++) & 0xff];
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
1001 crc = (crc >> 8) ^ crc_table[(crc ^ *buf++) & 0xff];
1530
00d788dac91a Added support for reading gzipped ROMs
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1002 }
2690
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
1003 while (len) {
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
1004 len--;
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
1005 crc = (crc >> 8) ^ crc_table[(crc ^ *buf++) & 0xff];
1530
00d788dac91a Added support for reading gzipped ROMs
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1006 }
00d788dac91a Added support for reading gzipped ROMs
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1007
2690
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
1008 /* Return the CRC, post-conditioned. */
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
1009 return crc ^ 0xffffffff;
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
1010 }
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
1011
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
1012 #endif
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
1013
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
1014 /* ========================================================================= */
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
1015 unsigned long ZEXPORT crc32(unsigned long crc, const unsigned char FAR *buf,
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
1016 uInt len) {
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
1017 return crc32_z(crc, buf, len);
1530
00d788dac91a Added support for reading gzipped ROMs
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1018 }
00d788dac91a Added support for reading gzipped ROMs
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1019
00d788dac91a Added support for reading gzipped ROMs
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1020 /* ========================================================================= */
2690
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
1021 uLong ZEXPORT crc32_combine64(uLong crc1, uLong crc2, z_off64_t len2) {
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
1022 #ifdef DYNAMIC_CRC_TABLE
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
1023 once(&made, make_crc_table);
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
1024 #endif /* DYNAMIC_CRC_TABLE */
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
1025 return multmodp(x2nmodp(len2, 3), crc1) ^ (crc2 & 0xffffffff);
1530
00d788dac91a Added support for reading gzipped ROMs
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1026 }
00d788dac91a Added support for reading gzipped ROMs
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1027
00d788dac91a Added support for reading gzipped ROMs
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1028 /* ========================================================================= */
2690
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
1029 uLong ZEXPORT crc32_combine(uLong crc1, uLong crc2, z_off_t len2) {
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
1030 return crc32_combine64(crc1, crc2, (z_off64_t)len2);
1530
00d788dac91a Added support for reading gzipped ROMs
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1031 }
00d788dac91a Added support for reading gzipped ROMs
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1032
00d788dac91a Added support for reading gzipped ROMs
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1033 /* ========================================================================= */
2690
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
1034 uLong ZEXPORT crc32_combine_gen64(z_off64_t len2) {
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
1035 #ifdef DYNAMIC_CRC_TABLE
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
1036 once(&made, make_crc_table);
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
1037 #endif /* DYNAMIC_CRC_TABLE */
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
1038 return x2nmodp(len2, 3);
1530
00d788dac91a Added support for reading gzipped ROMs
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1039 }
00d788dac91a Added support for reading gzipped ROMs
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1040
00d788dac91a Added support for reading gzipped ROMs
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1041 /* ========================================================================= */
2690
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
1042 uLong ZEXPORT crc32_combine_gen(z_off_t len2) {
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
1043 return crc32_combine_gen64((z_off64_t)len2);
1530
00d788dac91a Added support for reading gzipped ROMs
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1044 }
00d788dac91a Added support for reading gzipped ROMs
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1045
2690
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
1046 /* ========================================================================= */
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
1047 uLong ZEXPORT crc32_combine_op(uLong crc1, uLong crc2, uLong op) {
9ef72ee5c0b0 Update vendored zlib to 1.3.1
Michael Pavone <pavone@retrodev.com>
parents: 1530
diff changeset
1048 return multmodp(op, crc1) ^ (crc2 & 0xffffffff);
1530
00d788dac91a Added support for reading gzipped ROMs
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1049 }