Replace Tmem_nasm.asm with C++ code. Patch by pyro.
[Glide64.git] / CRC.h
blob700e54016ea23034c9efbe437420e210faddef2c
1 /*
2 * Glide64 - Glide video plugin for Nintendo 64 emulators.
3 * Copyright (c) 2002 Dave2001
4 * Copyright (c) 2008 Günther <guenther.emu@freenet.de>
6 * This program is free software; you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License as published by
8 * the Free Software Foundation; either version 2 of the License, or
9 * any later version.
11 * This program is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 * GNU General Public License for more details.
16 * You should have received a copy of the GNU General Public License
17 * along with this program; if not, write to the Free Software
18 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
21 //****************************************************************
23 // Glide64 - Glide Plugin for Nintendo 64 emulators (tested mostly with Project64)
24 // Project started on December 29th, 2001
26 // To modify Glide64:
27 // * Write your name and (optional)email, commented by your work, so I know who did it, and so that you can find which parts you modified when it comes time to send it to me.
28 // * Do NOT send me the whole project or file that you modified. Take out your modified code sections, and tell me where to put them. If people sent the whole thing, I would have many different versions, but no idea how to combine them all.
30 // Official Glide64 development channel: #Glide64 on EFnet
32 // Original author: Dave2001 (Dave2999@hotmail.com)
33 // Other authors: Gonetz, Gugaman
35 //****************************************************************
37 // CRC32 calculation functions
39 // Created by Gonetz, 2004
41 //****************************************************************
43 #if !defined(WIN32) && defined(GCC)
44 #define Crc32 _Crc32
45 #define CRCTable _CRCTable
46 #endif
48 extern unsigned int CRCTable[ 256 ];
50 void CRC_BuildTable();
52 inline unsigned int CRC_Calculate( unsigned int crc, const void *buffer, unsigned int count )
54 #ifndef GCC
55 unsigned int Crc32=crc;
56 __asm {
57 mov esi, buffer
58 mov edx, count
59 add edx, esi
60 mov ecx, crc
62 loop1:
63 mov bl, byte ptr [esi]
64 movzx eax, cl
65 inc esi
66 xor al, bl
67 shr ecx, 8
68 mov ebx, [CRCTable+eax*4]
69 xor ecx, ebx
71 cmp edx, esi
72 jne loop1
74 xor Crc32, ecx
76 return Crc32;
77 #else // _WIN32
78 unsigned int result = crc;
79 for (const char * p = (const char*)buffer; p != (const char*)buffer + count; ++p)
81 unsigned char al = result;
82 al ^= *p;
83 result >>= 8;
84 result ^= CRCTable[al];
86 result ^= crc;
87 return result;
88 #endif // _WIN32