⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 crc.c

📁 CRC16的源程序
💻 C
字号:
/***************************************************************************\
	CRC-16 Calculcations
		
	Author : Greg Young, Z-World.

	These functions compute the 1021-CRC used in many applications
	(XModem, Opto-22 Networking, Etc.) These perform the same function
	as getcrc in MATH.LIB, but can work on larger blocks of memory.
\***************************************************************************/

unsigned			CRCByte ( char cByte );
unsigned			CRCBlock ( void *pMem,unsigned wCount );

#asm

; .CRCByte : Shift One Byte into Current CRC-CCITT
;
; INPUT  :
;          HL = CRC Accumulator
;          DE = Pointer to Data
; OUTPUT :
;          HL = CRC Accumulator
;          DE = DE + 1

.CRCByte::     push     bc             ; Protect BC
               ld       b,8            ; B = Bit Counter
               ld       a,(de)         ; C = Next Data Byte
               ld       c,a
               inc      de             ; Bump Input Pointer
.CRCB0:        ld       a,c            ; A.7 = Data.7 ^ CRC.15
               xor      h
               add      hl,hl          ; Accumulator <<= 1
               jp       p,.CRCB1       ; If A.7 Clear, Move to Next Bit
               ld       a,10h          ; Accumulator ^= 0x1021
               xor      h
               ld       h,a
               ld       a,21h
               xor      l
               ld       l,a
.CRCB1:        rl       c              ; Ready Next Bit
               djnz     .CRCB0         ; Continue til All Bits Shifted
               pop      bc             ; Restore BC
               ret                     ; Done

; .CRCBlock : Compute CRC-CCITT for Block
;
; INPUT  :
;          HL = Accumulator
;          DE = Data Input Pointer
;          BC = Byte Counter
; OUTPUT :
;          HL = Accumulator
;          DE = DE + BC

.CRCBlock::    call     .CRCByte       ; Shift in Next Byte
               dec      bc             ; Adjust Byte Count
               ld       a,b            ; Continue til Zero
               or       c
               jr       nz,.CRCBlock
               ret                     ; Done

; CRCByte : C Interface to .CRCByte

CRCByte::      ld       hl,2           ; DE = &Byte
               add      hl,sp
               ex       de,hl
               ld       hl,0           ; HL = Accumulator
               jr       .CRCByte       ; Compute CRC              

; CRCBlock : C Interface to .CRCBlock

CRCBlock::     call     .param2        ; HL = Input Pointer, DE = Byte Count
               ld       b,d            ; BC = Byte Count
               ld       c,e
               ex       de,hl          ; DE = Input Data Pointer
               ld       hl,0           ; HL = Accumulator
               jp       .CRCBlock      ; Compute CRC
#endasm

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -