NAME: CRC-16 for PBDOS
CREATOR: n/a
PB AUTHOR: Dave Navarro
DESCRIPTION: CRC-16 algorithm for calculating checksums
NOTES: Compiles in PBDOS; not directly compatible with PBCC\PBDLL\PBWIN.
SOURCE: http://www.powerbasic.com/support/forums/Forum7/HTML/000098.html
Viewing source from crc16-dos.bas   4552 bytes   Last modified Wed, 20 September 2006

; pbtCRC16 routine for PowerBASIC
; Copyright (c) 1993,94 by Dave Navarro, Jr.
; Last Revision: January 1, 1994
; PROC:    pbtCRC16
; CLASS:   STRING
; DECLARE: FUNCTION pbtCRC16(BYVAL string, BYVAL integer) AS INTEGER
; DESC:    Calculate an Xmodem compatible 16 bit CRC for string.
; EXAMP:   Seed = -1
;          Crc = pbtCRC16(Block$, Seed)
Extrn   Get$Loc: Far
Extrn   Rls$Alloc: Far
pbtString Segment Byte
        Assume  CS: pbtString
CrcTable DW     00000h, 01021h, 02042h, 03063h, 04084h, 050a5h, 060c6h, 070e7h
        DW      08108h, 09129h, 0a14ah, 0b16bh, 0c18ch, 0d1adh, 0e1ceh, 0f1efh
        DW      01231h, 00210h, 03273h, 02252h, 052b5h, 04294h, 072f7h, 062d6h
        DW      09339h, 08318h, 0b37bh, 0a35ah, 0d3bdh, 0c39ch, 0f3ffh, 0e3deh
        DW      02462h, 03443h, 00420h, 01401h, 064e6h, 074c7h, 044a4h, 05485h
        DW      0a56ah, 0b54bh, 08528h, 09509h, 0e5eeh, 0f5cfh, 0c5ach, 0d58dh
        DW      03653h, 02672h, 01611h, 00630h, 076d7h, 066f6h, 05695h, 046b4h
        DW      0b75bh, 0a77ah, 09719h, 08738h, 0f7dfh, 0e7feh, 0d79dh, 0c7bch
        DW      048c4h, 058e5h, 06886h, 078a7h, 00840h, 01861h, 02802h, 03823h
        DW      0c9cch, 0d9edh, 0e98eh, 0f9afh, 08948h, 09969h, 0a90ah, 0b92bh
        DW      05af5h, 04ad4h, 07ab7h, 06a96h, 01a71h, 00a50h, 03a33h, 02a12h
        DW      0dbfdh, 0cbdch, 0fbbfh, 0eb9eh, 09b79h, 08b58h, 0bb3bh, 0ab1ah
        DW      06ca6h, 07c87h, 04ce4h, 05cc5h, 02c22h, 03c03h, 00c60h, 01c41h
        DW      0edaeh, 0fd8fh, 0cdech, 0ddcdh, 0ad2ah, 0bd0bh, 08d68h, 09d49h
        DW      07e97h, 06eb6h, 05ed5h, 04ef4h, 03e13h, 02e32h, 01e51h, 00e70h
        DW      0ff9fh, 0efbeh, 0dfddh, 0cffch, 0bf1bh, 0af3ah, 09f59h, 08f78h
        DW      09188h, 081a9h, 0b1cah, 0a1ebh, 0d10ch, 0c12dh, 0f14eh, 0e16fh
        DW      01080h, 000a1h, 030c2h, 020e3h, 05004h, 04025h, 07046h, 06067h
        DW      083b9h, 09398h, 0a3fbh, 0b3dah, 0c33dh, 0d31ch, 0e37fh, 0f35eh
        DW      002b1h, 01290h, 022f3h, 032d2h, 04235h, 05214h, 06277h, 07256h
        DW      0b5eah, 0a5cbh, 095a8h, 08589h, 0f56eh, 0e54fh, 0d52ch, 0c50dh
        DW      034e2h, 024c3h, 014a0h, 00481h, 07466h, 06447h, 05424h, 04405h
        DW      0a7dbh, 0b7fah, 08799h, 097b8h, 0e75fh, 0f77eh, 0c71dh, 0d73ch
        DW      026d3h, 036f2h, 00691h, 016b0h, 06657h, 07676h, 04615h, 05634h
        DW      0d94ch, 0c96dh, 0f90eh, 0e92fh, 099c8h, 089e9h, 0b98ah, 0a9abh
        DW      05844h, 04865h, 07806h, 06827h, 018c0h, 008e1h, 03882h, 028a3h
        DW      0cb7dh, 0db5ch, 0eb3fh, 0fb1eh, 08bf9h, 09bd8h, 0abbbh, 0bb9ah
        DW      04a75h, 05a54h, 06a37h, 07a16h, 00af1h, 01ad0h, 02ab3h, 03a92h
        DW      0fd2eh, 0ed0fh, 0dd6ch, 0cd4dh, 0bdaah, 0ad8bh, 09de8h, 08dc9h
        DW      07c26h, 06c07h, 05c64h, 04c45h, 03ca2h, 02c83h, 01ce0h, 00cc1h
        DW      0ef1fh, 0ff3eh, 0cf5dh, 0df7ch, 0af9bh, 0bfbah, 08fd9h, 09ff8h
        DW      06e17h, 07e36h, 04e55h, 05e74h, 02e93h, 03eb2h, 00ed1h, 01ef0h
        Public  pbtCRC16
pbtCRC16 Proc   Far
ARG     Seed:   WORD, StrHandle: WORD = Retbytes
        push    BP                      ;
        mov     BP,SP                   ;
        push    DS                      ;
        push    Word Ptr StrHandle      ; push string handle on the stack
        call    Get$Loc                 ; call PowerBASIC
        mov     DS,DX                   ; put segment in DS
        mov     SI,AX                   ; put offset in SI
        xor     AX,AX                   ; assume null string
        jcxz    Exit                    ; is string null?
        mov     AX,Seed                 ; put Seed in AX
CalcCRC:
        xor     BH,BH                   ; clear BH
        mov     BL,AH                   ; put LSB of seed in BL
        mov     AH,AL                   ; move MSB of seed to AH
        lodsb                           ; get character from string
        shl     BX,1                    ; multiply BX * 2
        xor     AX,CS: [CrcTable+BX]    ; xor character with word in table
        loop    CalcCRC                 ; loop until CX=0
        push    AX                      ; push return value
        push    Word Ptr StrHandle      ; push string handle
        call    Rls$Alloc               ; release it
        pop     AX                      ; restore return value
Exit:
        pop     DS                      ;
        pop     BP                      ;
        retf    Retbytes                ;
pbtCRC16 EndP
pbtString EndS
        End

Back to The Archives