home *** CD-ROM | disk | FTP | other *** search
- ; ::[[ @(#) addbfcrc.asm 1.1 89/07/08 10:48:28 ]]::
- ; assembly implementation of addbfcrc() for Turbo C 2.0 -- small memory model
-
- ; The following code was obtained from compiling addbfcrc.c using
- ; Turbo C 2.0, then hand-optimized. In the interest of making
- ; faster CRC-32 calculations available to all, I hereby release
- ; the contents of this file to the public domain. This code is for
- ; the small memory model only. It will probably need to be revised
- ; for use with other C compilers.
- ; -- Rahul Dhesi 1989/07/08
-
- _DATA segment word public 'DATA'
- _DATA ends
-
- extrn _crccode:word
- extrn _crctab:word
- public _addbfcrc
-
- _TEXT segment byte public 'CODE'
-
- DGROUP group _DATA
- assume cs:_TEXT,ds:DGROUP,ss:DGROUP
-
- ;void addbfcrc (buf, size) char *buf, int size
-
- _addbfcrc proc near
- push bp
- mov bp,sp
- sub sp,2
- push si
- push di
- mov cx,word ptr [bp+6] ;cx = size
- mov si,word ptr [bp+4] ;si = buf
-
- xor di,di ;i = 0
-
- jcxz done ;if size = 0, nothing to do
- @loop:
-
- ; crccode = crctab[(int) ((crccode) ^ (buf[i])) & 0xff] ^
- ; (((crccode) >> 8) & 0x00FFFFFFL);
-
- ; (dx,ax) <- ((crccode) >> 8) & 0x00FFFFFFL
- mov dx,word ptr DGROUP:_crccode+2
- mov ax,word ptr DGROUP:_crccode
- mov al,ah
- mov ah,dl
- mov dl,dh
- xor dh,dh
-
- mov bx,di ;bx <= i
-
- mov bl,byte ptr [bx+si] ;bl <- buf[i]
-
- xor bl,byte ptr DGROUP:_crccode ;bl <- (bl ^ crccode) & 0xff
- xor bh,bh ;bx <- bl
- shl bx,1
- shl bx,1 ;bx <- 4 * bx (for subscript)
-
- xor ax,word ptr DGROUP:_crctab[bx]
- xor dx,word ptr DGROUP:_crctab[bx+2]
- mov word ptr DGROUP:_crccode+2,dx
- mov word ptr DGROUP:_crccode,ax
-
- inc di ; i++
- loop @loop
- done:
-
- pop di
- pop si
- mov sp,bp
- pop bp
- ret
- _addbfcrc endp
-
- _TEXT ends
- end
-