;
; Copyright (c) 1999, Klaudiusz Kulik <kulikk@zeus.polsl.gliwice.pl>
; All rights reserved.
;
; Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:
;
;   Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
;   Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation
;   and/or other materials  provided with the distribution.
; 
; THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
; THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS
; BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
; GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
; LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH
; DAMAGE.

DSEG AT 0020h

CRCHi:		ds 01h			; CRC starszy bajt
CRCLo:		ds 01h			; CRC mlodszy bajt
index:		ds 01h			; wskaznik danych

CSEG
USING 0

; obliczanie crc16
; wejscie: r0 = adres bufora
;          r1 = dlugosc bufora
; wyjscie: CRCHi i CRCLo

crc16:

mov CRCHi,#0FFh
mov CRCLo,#0FFh

crc16_1:
; najpierw obliczenie index
mov a,@r0
xrl a,CRCHi
mov index,a			; index = CRCHi ^ bufor[r0]

inc r0				; nastepny znak z bufora


mov dptr,#CRCHiTable
movc a,@a+dptr			; acc = CRCHiTable[index]
xrl a,CRCLo
mov CRCHi,a			; CRCHi = CRCLo ^
; CRCHiTable[index]


mov dptr,#CRCLoTable
mov a,index
movc a,@a+dptr
mov CRCLo,a			; CRCLo = CRCLoTable[index]


djnz r1,crc16_1			; czy juz caly bufor?

ret


; Tablice kodow do algorytmu CRC16

CRCHiTable:
db      000h, 0C1h, 081h, 040h, 001h, 0C0h, 080h, 041h, 001h, 0C0h
db      080h, 041h, 000h, 0C1h, 081h, 040h, 001h, 0C0h, 080h, 041h
db      000h, 0C1h, 081h, 040h, 000h, 0C1h, 081h, 040h, 001h, 0C0h
db      080h, 041h, 001h, 0C0h, 080h, 041h, 000h, 0C1h, 081h, 040h
db      000h, 0C1h, 081h, 040h, 001h, 0C0h, 080h, 041h, 000h, 0C1h
db      081h, 040h, 001h, 0C0h, 080h, 041h, 001h, 0C0h, 080h, 041h
db      000h, 0C1h, 081h, 040h, 001h, 0C0h, 080h, 041h, 000h, 0C1h
db      081h, 040h, 000h, 0C1h, 081h, 040h, 001h, 0C0h, 080h, 041h
db      000h, 0C1h, 081h, 040h, 001h, 0C0h, 080h, 041h, 001h, 0C0h
db      080h, 041h, 000h, 0C1h, 081h, 040h, 000h, 0C1h, 081h, 040h
db      001h, 0C0h, 080h, 041h, 001h, 0C0h, 080h, 041h, 000h, 0C1h
db      081h, 040h, 001h, 0C0h, 080h, 041h, 000h, 0C1h, 081h, 040h
db      000h, 0C1h, 081h, 040h, 001h, 0C0h, 080h, 041h, 001h, 0C0h
db      080h, 041h, 000h, 0C1h, 081h, 040h, 000h, 0C1h, 081h, 040h
db      001h, 0C0h, 080h, 041h, 000h, 0C1h, 081h, 040h, 001h, 0C0h
db      080h, 041h, 001h, 0C0h, 080h, 041h, 000h, 0C1h, 081h, 040h
db      000h, 0C1h, 081h, 040h, 001h, 0C0h, 080h, 041h, 001h, 0C0h
db      080h, 041h, 000h, 0C1h, 081h, 040h, 001h, 0C0h, 080h, 041h
db      000h, 0C1h, 081h, 040h, 000h, 0C1h, 081h, 040h, 001h, 0C0h
db      080h, 041h, 000h, 0C1h, 081h, 040h, 001h, 0C0h, 080h, 041h
db      001h, 0C0h, 080h, 041h, 000h, 0C1h, 081h, 040h, 001h, 0C0h
db      080h, 041h, 000h, 0C1h, 081h, 040h, 000h, 0C1h, 081h, 040h
db      001h, 0C0h, 080h, 041h, 001h, 0C0h, 080h, 041h, 000h, 0C1h
db      081h, 040h, 000h, 0C1h, 081h, 040h, 001h, 0C0h, 080h, 041h
db      000h, 0C1h, 081h, 040h, 001h, 0C0h, 080h, 041h, 001h, 0C0h
db      080h, 041h, 000h, 0C1h, 081h, 040h

CRCLoTable:
db      000h, 0C0h, 0C1h, 001h, 0C3h, 003h, 002h, 0C2h, 0C6h, 006h
db      007h, 0C7h, 005h, 0C5h, 0C4h, 004h, 0CCh, 00Ch, 00Dh, 0CDh
db      00Fh, 0CFh, 0CEh, 00Eh, 00Ah, 0CAh, 0CBh, 00Bh, 0C9h, 009h
db      008h, 0C8h, 0D8h, 018h, 019h, 0D9h, 01Bh, 0DBh, 0DAh, 01Ah
db      01Eh, 0DEh, 0DFh, 01Fh, 0DDh, 01Dh, 01Ch, 0DCh, 014h, 0D4h
db      0D5h, 015h, 0D7h, 017h, 016h, 0D6h, 0D2h, 012h, 013h, 0D3h
db      011h, 0D1h, 0D0h, 010h, 0F0h, 030h, 031h, 0F1h, 033h, 0F3h
db      0F2h, 032h, 036h, 0F6h, 0F7h, 037h, 0F5h, 035h, 034h, 0F4h
db      03Ch, 0FCh, 0FDh, 03Dh, 0FFh, 03Fh, 03Eh, 0FEh, 0FAh, 03Ah
db      03Bh, 0FBh, 039h, 0F9h, 0F8h, 038h, 028h, 0E8h, 0E9h, 029h
db      0EBh, 02Bh, 02Ah, 0EAh, 0EEh, 02Eh, 02Fh, 0EFh, 02Dh, 0EDh
db      0ECh, 02Ch, 0E4h, 024h, 025h, 0E5h, 027h, 0E7h, 0E6h, 026h
db      022h, 0E2h, 0E3h, 023h, 0E1h, 021h, 020h, 0E0h, 0A0h, 060h
db      061h, 0A1h, 063h, 0A3h, 0A2h, 062h, 066h, 0A6h, 0A7h, 067h
db      0A5h, 065h, 064h, 0A4h, 06Ch, 0ACh, 0ADh, 06Dh, 0AFh, 06Fh
db      06Eh, 0AEh, 0AAh, 06Ah, 06Bh, 0ABh, 069h, 0A9h, 0A8h, 068h
db      078h, 0B8h, 0B9h, 079h, 0BBh, 07Bh, 07Ah, 0BAh, 0BEh, 07Eh
db      07Fh, 0BFh, 07Dh, 0BDh, 0BCh, 07Ch, 0B4h, 074h, 075h, 0B5h
db      077h, 0B7h, 0B6h, 076h, 072h, 0B2h, 0B3h, 073h, 0B1h, 071h
db      070h, 0B0h, 050h, 090h, 091h, 051h, 093h, 053h, 052h, 092h
db      096h, 056h, 057h, 097h, 055h, 095h, 094h, 054h, 09Ch, 05Ch
db      05Dh, 09Dh, 05Fh, 09Fh, 09Eh, 05Eh, 05Ah, 09Ah, 09Bh, 05Bh
db      099h, 059h, 058h, 098h, 088h, 048h, 049h, 089h, 04Bh, 08Bh
db      08Ah, 04Ah, 04Eh, 08Eh, 08Fh, 04Fh, 08Dh, 04Dh, 04Ch, 08Ch
db      044h, 084h, 085h, 045h, 087h, 047h, 046h, 086h, 082h, 042h
db      043h, 083h, 041h, 081h, 080h, 040h

