'===========================================================================
' Subject: CRC-32                             Date: Year of 1989 (00:00:00)
'  Author: Samuel H. Smith                    Code: TASM, MASM             
'  Origin: ASM,CRC-32                       Packet: ASMCODE.ABC
'===========================================================================
;
; Copyright 1987, 1989 Samuel H. Smith;  All rights reserved
;
; This is a component of the ProDoor System.
; Do not distribute modified versions without my permission.
; Do not remove or alter this notice or any other copyright notice.
; If you use this in your own program you must distribute source code.
; Do not use any of this in a commercial product.
;
;
; CRC32 - Quick 32-bit crc calculation
;         Used by CRC32 unit.
;
; Written by Samuel Smith, 03-20-89
;

code segment word public
        assume cs:code
        public crcstr

crctable label word
   dd  000000000h, 077073096h, 0ee0e612ch, 0990951bah, 0076dc419h
   dd  0706af48fh, 0e963a535h, 09e6495a3h, 00edb8832h, 079dcb8a4h
   dd  0e0d5e91eh, 097d2d988h, 009b64c2bh, 07eb17cbdh, 0e7b82d07h
   dd  090bf1d91h, 01db71064h, 06ab020f2h, 0f3b97148h, 084be41deh
   dd  01adad47dh, 06ddde4ebh, 0f4d4b551h, 083d385c7h, 0136c9856h
   dd  0646ba8c0h, 0fd62f97ah, 08a65c9ech, 014015c4fh, 063066cd9h
   dd  0fa0f3d63h, 08d080df5h, 03b6e20c8h, 04c69105eh, 0d56041e4h
   dd  0a2677172h, 03c03e4d1h, 04b04d447h, 0d20d85fdh, 0a50ab56bh
   dd  035b5a8fah, 042b2986ch, 0dbbbc9d6h, 0acbcf940h, 032d86ce3h
   dd  045df5c75h, 0dcd60dcfh, 0abd13d59h, 026d930ach, 051de003ah
   dd  0c8d75180h, 0bfd06116h, 021b4f4b5h, 056b3c423h, 0cfba9599h
   dd  0b8bda50fh, 02802b89eh, 05f058808h, 0c60cd9b2h, 0b10be924h
   dd  02f6f7c87h, 058684c11h, 0c1611dabh, 0b6662d3dh, 076dc4190h
   dd  001db7106h, 098d220bch, 0efd5102ah, 071b18589h, 006b6b51fh
   dd  09fbfe4a5h, 0e8b8d433h, 07807c9a2h, 00f00f934h, 09609a88eh
   dd  0e10e9818h, 07f6a0dbbh, 0086d3d2dh, 091646c97h, 0e6635c01h
   dd  06b6b51f4h, 01c6c6162h, 0856530d8h, 0f262004eh, 06c0695edh
   dd  01b01a57bh, 08208f4c1h, 0f50fc457h, 065b0d9c6h, 012b7e950h
   dd  08bbeb8eah, 0fcb9887ch, 062dd1ddfh, 015da2d49h, 08cd37cf3h
   dd  0fbd44c65h, 04db26158h, 03ab551ceh, 0a3bc0074h, 0d4bb30e2h
   dd  04adfa541h, 03dd895d7h, 0a4d1c46dh, 0d3d6f4fbh, 04369e96ah
   dd  0346ed9fch, 0ad678846h, 0da60b8d0h, 044042d73h, 033031de5h
   dd  0aa0a4c5fh, 0dd0d7cc9h, 05005713ch, 0270241aah, 0be0b1010h
   dd  0c90c2086h, 05768b525h, 0206f85b3h, 0b966d409h, 0ce61e49fh
   dd  05edef90eh, 029d9c998h, 0b0d09822h, 0c7d7a8b4h, 059b33d17h
   dd  02eb40d81h, 0b7bd5c3bh, 0c0ba6cadh, 0edb88320h, 09abfb3b6h
   dd  003b6e20ch, 074b1d29ah, 0ead54739h, 09dd277afh, 004db2615h
   dd  073dc1683h, 0e3630b12h, 094643b84h, 00d6d6a3eh, 07a6a5aa8h
   dd  0e40ecf0bh, 09309ff9dh, 00a00ae27h, 07d079eb1h, 0f00f9344h
   dd  08708a3d2h, 01e01f268h, 06906c2feh, 0f762575dh, 0806567cbh
   dd  0196c3671h, 06e6b06e7h, 0fed41b76h, 089d32be0h, 010da7a5ah
   dd  067dd4acch, 0f9b9df6fh, 08ebeeff9h, 017b7be43h, 060b08ed5h
   dd  0d6d6a3e8h, 0a1d1937eh, 038d8c2c4h, 04fdff252h, 0d1bb67f1h
   dd  0a6bc5767h, 03fb506ddh, 048b2364bh, 0d80d2bdah, 0af0a1b4ch
   dd  036034af6h, 041047a60h, 0df60efc3h, 0a867df55h, 0316e8eefh
   dd  04669be79h, 0cb61b38ch, 0bc66831ah, 0256fd2a0h, 05268e236h
   dd  0cc0c7795h, 0bb0b4703h, 0220216b9h, 05505262fh, 0c5ba3bbeh
   dd  0b2bd0b28h, 02bb45a92h, 05cb36a04h, 0c2d7ffa7h, 0b5d0cf31h
   dd  02cd99e8bh, 05bdeae1dh, 09b64c2b0h, 0ec63f226h, 0756aa39ch
   dd  0026d930ah, 09c0906a9h, 0eb0e363fh, 072076785h, 005005713h
   dd  095bf4a82h, 0e2b87a14h, 07bb12baeh, 00cb61b38h, 092d28e9bh
   dd  0e5d5be0dh, 07cdcefb7h, 00bdbdf21h, 086d3d2d4h, 0f1d4e242h
   dd  068ddb3f8h, 01fda836eh, 081be16cdh, 0f6b9265bh, 06fb077e1h
   dd  018b74777h, 088085ae6h, 0ff0f6a70h, 066063bcah, 011010b5ch
   dd  08f659effh, 0f862ae69h, 0616bffd3h, 0166ccf45h, 0a00ae278h
   dd  0d70dd2eeh, 04e048354h, 03903b3c2h, 0a7672661h, 0d06016f7h
   dd  04969474dh, 03e6e77dbh, 0aed16a4ah, 0d9d65adch, 040df0b66h
   dd  037d83bf0h, 0a9bcae53h, 0debb9ec5h, 047b2cf7fh, 030b5ffe9h
   dd  0bdbdf21ch, 0cabac28ah, 053b39330h, 024b4a3a6h, 0bad03605h
   dd  0cdd70693h, 054de5729h, 023d967bfh, 0b3667a2eh, 0c4614ab8h
   dd  05d681b02h, 02a6f2b94h, 0b40bbe37h, 0c30c8ea1h, 05a05df1bh
   dd  02d02ef8dh


; -------------------------------------------------------------
;
;   procedure crcstr(var src;
;                    var crcout: longint;
;                    len: integer);
;      {calculate crc-32 of a buffer}
;

; structure of stack frame --
srcptr  equ     dword ptr [bp+0ch]      ;pointer to source buffer
crcptr  equ     dword ptr [bp+08h]      ;pointer to crc_out
srclen  equ     word  ptr [bp+06h]      ;length of source buffer


crcstr  proc    far
        push    bp
        mov     bp,sp           ;create stack frame

        les     si,crcptr
        mov     ax,es:[si]
        mov     dx,es:[si+2]    ;dx:ax -> crcout

        mov     cx,srclen       ;cx    -> source length
        les     si,srcptr       ;es:si -> source buffer
        mov     di,offset crctable     ;cs:di -> crctable

crcNext:
        mov     bh,al           ;save crcout & 0x000000ff
        mov     al,ah           ;(crcout >> 8) & 0x00ffffff
        mov     ah,dl
        mov     dl,dh
        xor     dh,dh
        mov     bl,es:[si]  ;*src++
        inc     si
        xor     bl,bh       ;crcval & 0x000000ff
        xor     bh,bh
        shl     bx,1
        shl     bx,1
        xor     ax,cs:[di+bx]
        xor     dx,cs:[di+bx+2]

        dec     cx
        jcxz    crcDone

        mov     bh,al       ;save crcout & 0x000000ff
        mov     al,ah       ;(crcout >> 8) & 0x00ffffff
        mov     ah,dl
        mov     dl,dh
        xor     dh,dh
        mov     bl,es:[si]  ;*src++
        inc     si
        xor     bl,bh       ;crcval & 0x000000ff
        xor     bh,bh
        shl     bx,1
        shl     bx,1
        xor     ax,cs:[di+bx]
        xor     dx,cs:[di+bx+2]

        dec     cx
        jcxz    crcDone

        mov     bh,al       ;save crcout & 0x000000ff
        mov     al,ah       ;(crcout >> 8) & 0x00ffffff
        mov     ah,dl
        mov     dl,dh
        xor     dh,dh
        mov     bl,es:[si]  ;*src++
        inc     si
        xor     bl,bh       ;crcval & 0x000000ff
        xor     bh,bh
        shl     bx,1
        shl     bx,1
        xor     ax,cs:[di+bx]
        xor     dx,cs:[di+bx+2]

        dec     cx
        jcxz    crcDone

        mov     bh,al       ;save crcout & 0x000000ff
        mov     al,ah       ;(crcout >> 8) & 0x00ffffff
        mov     ah,dl
        mov     dl,dh
        xor     dh,dh
        mov     bl,es:[si]  ;*src++
        inc     si
        xor     bl,bh       ;crcval & 0x000000ff
        xor     bh,bh
        shl     bx,1
        shl     bx,1
        xor     ax,cs:[di+bx]
        xor     dx,cs:[di+bx+2]

        loop    crcNext

crcDone:
        les     si,crcptr
        mov     es:[si],ax
        mov     es:[si+2],dx

        pop     bp
        ret     10                  ;dispose of 10 parameter bytes
crcstr endp

code ends
end
