2021-03-02 02:13:17 +00:00
|
|
|
// Project64 - A Nintendo 64 emulator
|
|
|
|
// http://www.pj64-emu.com/
|
|
|
|
// Copyright(C) 2001-2021 Project64
|
|
|
|
// Copyright(C) 2003-2009 Sergey 'Gonetz' Lipski
|
|
|
|
// Copyright(C) 2002 Dave2001
|
|
|
|
// GNU/GPLv2 licensed: https://gnu.org/licenses/gpl-2.0.html
|
2013-04-04 21:22:19 +00:00
|
|
|
#define CRC32_POLYNOMIAL 0x04C11DB7
|
|
|
|
|
2016-01-25 11:26:42 +00:00
|
|
|
unsigned int CRCTable[256];
|
2013-04-04 21:22:19 +00:00
|
|
|
|
2016-01-25 11:26:42 +00:00
|
|
|
unsigned int Reflect(unsigned int ref, char ch)
|
2013-04-04 21:22:19 +00:00
|
|
|
{
|
2016-01-25 11:26:42 +00:00
|
|
|
unsigned int value = 0;
|
2013-04-04 21:22:19 +00:00
|
|
|
|
2016-01-25 11:26:42 +00:00
|
|
|
// Swap bit 0 for bit 7
|
|
|
|
// bit 1 for bit 6, etc.
|
|
|
|
for (char i = 1; i < (ch + 1); i++)
|
|
|
|
{
|
|
|
|
if (ref & 1)
|
|
|
|
value |= 1 << (ch - i);
|
|
|
|
ref >>= 1;
|
|
|
|
}
|
|
|
|
return value;
|
2013-04-04 21:22:19 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
void CRC_BuildTable()
|
|
|
|
{
|
|
|
|
unsigned int crc;
|
|
|
|
|
|
|
|
for (unsigned i = 0; i <= 255; i++)
|
2016-01-25 11:26:42 +00:00
|
|
|
{
|
|
|
|
crc = Reflect(i, 8) << 24;
|
2013-04-04 21:22:19 +00:00
|
|
|
for (unsigned j = 0; j < 8; j++)
|
2016-01-25 11:26:42 +00:00
|
|
|
crc = (crc << 1) ^ (crc & (1 << 31) ? CRC32_POLYNOMIAL : 0);
|
|
|
|
|
|
|
|
CRCTable[i] = Reflect(crc, 32);
|
2013-04-04 21:22:19 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
//*/
|
|
|
|
//*
|
2016-01-25 11:26:42 +00:00
|
|
|
unsigned int CRC32(unsigned int crc, void *buffer, unsigned int count)
|
2013-04-04 21:22:19 +00:00
|
|
|
{
|
2016-01-25 11:26:42 +00:00
|
|
|
unsigned int orig = crc;
|
|
|
|
unsigned char * p = reinterpret_cast<unsigned char*>(buffer);
|
|
|
|
while (count--)
|
|
|
|
crc = (crc >> 8) ^ CRCTable[(crc & 0xFF) ^ *p++];
|
|
|
|
return crc ^ orig;
|
2013-04-04 21:22:19 +00:00
|
|
|
}
|
|
|
|
//*/
|
|
|
|
|
|
|
|
/*
|
2016-01-20 06:14:48 +00:00
|
|
|
uint32_t CRC_Calculate( uint32_t crc, void *buffer, uint32_t count )
|
2013-04-04 21:22:19 +00:00
|
|
|
{
|
2016-01-25 11:26:42 +00:00
|
|
|
uint32_t Crc32=crc;
|
|
|
|
__asm {
|
|
|
|
mov esi, buffer
|
|
|
|
mov ecx, count
|
|
|
|
mov edx, crc
|
|
|
|
xor eax, eax
|
2013-04-04 21:22:19 +00:00
|
|
|
|
|
|
|
loop1:
|
2016-01-25 11:26:42 +00:00
|
|
|
inc esi
|
|
|
|
mov al, dl
|
|
|
|
xor al, byte ptr [esi]
|
|
|
|
shr edx, 8
|
|
|
|
mov ebx, [CRCTable+eax*4]
|
|
|
|
xor edx, ebx
|
2013-04-04 21:22:19 +00:00
|
|
|
|
2016-01-25 11:26:42 +00:00
|
|
|
loop loop1
|
2013-04-04 21:22:19 +00:00
|
|
|
|
2016-01-25 11:26:42 +00:00
|
|
|
xor Crc32, edx
|
|
|
|
}
|
|
|
|
return Crc32;
|
2013-04-04 21:22:19 +00:00
|
|
|
}
|
|
|
|
*/
|
|
|
|
|
|
|
|
/*
|
|
|
|
unsigned int CRC_Calculate( unsigned int crc, void *buffer, unsigned int count )
|
|
|
|
{
|
2016-01-25 11:26:42 +00:00
|
|
|
unsigned int Crc32=crc;
|
|
|
|
__asm {
|
|
|
|
mov esi, buffer
|
|
|
|
mov edx, count
|
|
|
|
add edx, esi
|
|
|
|
mov ecx, crc
|
2013-04-04 21:22:19 +00:00
|
|
|
|
|
|
|
loop1:
|
2016-01-25 11:26:42 +00:00
|
|
|
mov bl, byte ptr [esi]
|
|
|
|
movzx eax, cl
|
|
|
|
inc esi
|
|
|
|
xor al, bl
|
|
|
|
shr ecx, 8
|
|
|
|
mov ebx, [CRCTable+eax*4]
|
|
|
|
xor ecx, ebx
|
2013-04-04 21:22:19 +00:00
|
|
|
|
2016-01-25 11:26:42 +00:00
|
|
|
cmp edx, esi
|
|
|
|
jne loop1
|
2013-04-04 21:22:19 +00:00
|
|
|
|
2016-01-25 11:26:42 +00:00
|
|
|
xor Crc32, ecx
|
2013-04-04 21:22:19 +00:00
|
|
|
}
|
2016-01-25 11:26:42 +00:00
|
|
|
return Crc32;
|
|
|
|
}
|
|
|
|
//*/
|