// Copyright (C) 2002, Wayne Diamond ?>

; 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