crc.inc
mxlgv_KolibriDev/src/kernel/crc.inc
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;                                                              ;;
;; Copyright (C) KolibriOS team 2004-2017. All rights reserved. ;;
;;  Distributed under terms of the GNU General Public License.  ;;
;;                                                              ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

$Revision: 8130 $

; This crc32 routine doesn't use precomputed table to allow different
; polynomials, which is the first param.
; Partial hash in assumed to be eax (both in and out).
; Usage:
; 1. mov eax, -1
; 2. stdcall crypto.crc32 zero or more times
; 3. xor eax, -1
proc crc_32 _poly, _buffer, _length
        push    ebx ecx edx esi

        mov     esi, [_buffer]
.next_byte:
        dec     [_length]
        js      .done
        movzx   ebx, byte[esi]
        inc     esi
        mov     ecx, 8
.next_bit:
        mov     edx, eax
        xor     edx, ebx
        shr     eax, 1
        test    edx, 1
        jz      @f
        xor     eax, [_poly]
@@:
        shr     ebx, 1
        dec     ecx
        jnz     .next_bit
        jmp     .next_byte
.done:
        pop     esi edx ecx ebx
        ret
endp
