GLES2N64 (from mupen64plus-ae) plugin. Compile and run on the OpenPandora
[mupen64plus-pandora.git] / source / gles2n64 / src / CRC.cpp
1 #include "Types.h"
2
3 #define CRC32_POLYNOMIAL     0x04C11DB7
4
5 #ifdef __CRC_OPT
6 unsigned int CRCTable[ 256 * 4];
7 #else
8 unsigned int CRCTable[ 256 ];
9 #endif
10
11 u32 Reflect( u32 ref, char ch )
12 {
13      u32 value = 0;
14
15      // Swap bit 0 for bit 7
16      // bit 1 for bit 6, etc.
17      for (int i = 1; i < (ch + 1); i++)
18      {
19           if(ref & 1)
20                value |= 1 << (ch - i);
21           ref >>= 1;
22      }
23      return value;
24 }
25
26 void CRC_BuildTable()
27 {
28     u32 crc;
29
30     for (int i = 0; i < 256; i++)
31     {
32         crc = Reflect( i, 8 ) << 24;
33         for (int j = 0; j < 8; j++)
34             crc = (crc << 1) ^ (crc & (1 << 31) ? CRC32_POLYNOMIAL : 0);
35
36         CRCTable[i] = Reflect( crc, 32 );
37     }
38
39 #ifdef __CRC_OPT
40     for (int i = 0; i < 256; i++)
41     {
42         for(int j = 0; j < 3; j++)
43         {
44             CRCTable[256*(j+1) + i] = (CRCTable[256*j + i]>>8) ^ CRCTable[CRCTable[256*j + i]&0xFF];
45         }
46     }
47 #endif
48
49 }
50
51 u32 CRC_Calculate( u32 crc, void *buffer, u32 count )
52 {
53     u8 *p;
54     u32 orig = crc;
55
56     p = (u8*) buffer;
57
58 #ifdef __CRC_OPT
59     while(count > 3)
60     {
61         crc ^= *(unsigned int*) p; p += 4;
62         crc = CRCTable[3*256 + (crc&0xFF)]
63           ^ CRCTable[2*256 + ((crc>>8)&0xFF)]
64           ^ CRCTable[1*256 + ((crc>>16)&0xFF)]
65           ^ CRCTable[0*256 + ((crc>>24))];
66
67         count -= 4;
68     }
69 #endif
70
71     while (count--)
72         crc = (crc >> 8) ^ CRCTable[(crc & 0xFF) ^ *p++];
73
74     return crc ^ orig;
75 }
76
77 u32 CRC_CalculatePalette( u32 crc, void *buffer, u32 count )
78 {
79     u8 *p;
80     u32 orig = crc;
81
82     p = (u8*) buffer;
83     while (count--)
84     {
85         crc = (crc >> 8) ^ CRCTable[(crc & 0xFF) ^ *p++];
86         crc = (crc >> 8) ^ CRCTable[(crc & 0xFF) ^ *p++];
87
88         p += 6;
89     }
90
91     return crc ^ orig;
92 }
93