📄 crc16.asm
字号:
;
;****************************************************************************
;
; Purpose:
; Calculate CRC-8 Values. Uses The CCITT-8 Polynomial, Expressed As
; X^8 + X^5 + X^4 + 1
;
; Date:
; 08/03/93
;
; Author:
; John C. Wren
;
; Modications:
; 02/04/97 - Added Description Fields For Archive
;
; Processor:
; Generic 8031
;
; Assembler:
; Avocet AVA51
;
; Dependencies:
; None
;
; Files:
; None
;
; Philosophic:
; None
;
;****************************************************************************
;
;
; Includes
;
; %include "equates.inc"
seg code
;
;****************************************************************************
;
; Publics
;
public CRC16_INIT
public CRC16_ADD
public CRC16_GET
;
extrn UTIL_ADCAD
;
;****************************************************************************
;
; Description:
; Initializes CRC Calculator. Should Be Called To Reset The Running
; Value.
;
; Entry Requirements:
; None
;
; On Exit:
; None
;
; Affected:
; None
;
; Stack:
; 0 Bytes, Not Including Space Used By Called Routines
;
; Comments:
; None
;
CRC16_INIT proc
mov D_CRC16_HI,#0 ; Clear CRC16 High
mov D_CRC16_LO,#0 ; Clear CRC16 Low
ret ; Return To Caller
endproc
;
;****************************************************************************
;
; Description:
; Adds Value In Acc To Running CRC Total
;
; Entry Requirements:
; Acc Has Value To Add To CRC
;
; On Exit:
; None
;
; Affected:
; PSW.CY
;
; Stack:
; 0 Bytes, Not Including Space Used By Called Routines
;
; Comments:
; None
;
CRC16_ADD proc
jmp CRC16_ADD_CALC ; Use Calculation Method
endproc
;
;****************************************************************************
;
; Description:
; Returns The Accumulated CRC Value
;
; Entry Requirements:
; None
;
; On Exit:
; DPTR Has Accumulated CRC Value
;
; Affected:
; DPTR
;
; Stack:
; 0 Bytes, Not Including Space Used By Called Routines
;
; Comments:
; None
;
CRC16_GET proc
mov dph,D_CRC16_HI ; Get CRC16 High
mov dpl,D_CRC16_LO ; Get CRC16 Low
ret ; Return To Caller
endproc
;
;****************************************************************************
;
; Description:
; Calculates Value In Acc Into The Running CRC Total, Using The
; Calculation Method (Slower But Smaller).
;
; Entry Requirements:
; Acc Has Value To Add To CRC
;
; On Exit:
; None
;
; Affected:
; PSW.CY
;
; Stack:
; 2 Bytes, Not Including Space Used By Called Routines
;
; Comments:
; Must Use Register Bank 0. The Routine Saves R0 By Pushing Location
; 0 (Since R0 Can't Be Pushed By Reference). If Alternate Register
; Banks Need To Be Used, R0 Could Be Moved To Acc And Pushed.
;
CRC16_ADD_CALC proc
push 0 ; Save R0
push acc ; Save Acc
mov r0,#8 ; 8 Bits In A Byte
xrl D_CRC16_HI,a ; HI ^= Data
l?p1 clr c ; 0 Into Low Bit
mov a,D_CRC16_LO ; D_CRC << 1
rlc a ; Shift Left
mov D_CRC16_LO,a ; Store Back
mov a,D_CRC16_HI ; Get High Byte
rlc a ; Shift Left
mov D_CRC16_HI,a ; Store Back
jnc l?p2 ; Skip If Bit 15 Wasn't Set
xrl D_CRC16_HI,#10h ; XOR In Polynomial High
xrl D_CRC16_LO,#21h ; XOR In Polynomial Low
l?p2 djnz r0,l?p1 ; Repeat R0 More Times
pop acc ; Recover Acc
pop 0 ; Recover R0
ret ; Return To Caller
endproc
;
;****************************************************************************
;
; Description:
; Calculates Value In Acc Into The Running CRC Total, Using The Table
; Method. (Faster But Larger)
;
; Entry Requirements:
; Acc Has Value To Add To CRC
;
; On Exit:
; None
;
; Affected:
; PSW.CY
;
; Stack:
; 5 Bytes, Not Including Space Used By Called Routines
;
; Comments:
; None
;
CRC16_ADD_TABLE proc
push dph ; Save DPH
push dpl ; Save DPL
push acc ; Save Acc
;
mov dptr,#CRC16_DATA ; Point To Table
xrl a,D_CRC16_HI ; XOR High Of CRC With Character
call UTIL_ADCAD ; Add 'A' To 'DPTR'
call UTIL_ADCAD ; Add 'A' To 'DPTR' (Yes, Twice)
;
clr a ; Clear For MOVC
movc a,@a+dptr ; Get High Of Table Entry
xrl a,D_CRC16_LO ; XOR With Low
mov D_CRC16_HI,a ; Store To High
;
mov a,#1 ; Get Low Byte
movc a,@a+dptr ; Get Low Of Table Entry
mov D_CRC16_LO,a ; Store To Low Of CRC
;
pop acc ; Recover Acc
pop dpl ; Recover DPL
pop dph ; Recover DPH
ret ; Return To Caller
endproc
;
;****************************************************************************
;
; Data For Table Method
;
CRC16_DATA 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
;
;****************************************************************************
;
; Data Area
;
seg data
D_CRC16_HI ds 1
D_CRC16_LO ds 1
;
;****************************************************************************
;
end
;UTIL_ADCAD UTIL_ADCAD
;
;****************************************************************************
;
; Purpose:
; Add Value In Acc To DPTR
;
; Date:
; 05/11/85
;
; Author:
; John C. Wren
;
; Modications:
; 02/04/97 - Added Description Fields For Archive
;
; Processor:
; Generic 8031
;
; Assembler:
; Avocet AVA51
;
; Dependencies:
; None
;
; Files:
; None
;
; Philosophic:
; None
;
;****************************************************************************
;
; Includes
;
seg code
;
;****************************************************************************
;
; Publics, Externs
;
public UTIL_ADCAD
;
;****************************************************************************
;
; Description:
; Add Value In Acc To DPTR
;
; Entry Requirements:
; Value In Acc To Add To DPTR
;
; On Exit:
; DPTR = DPTR + Acc
;
; Affected:
; PSW.CY, DPTR
;
; Stack:
; 0 Bytes, Not Including Called Routines
;
; Comments:
; CY == 1 If DPTR + Acc > 0xffff
;
UTIL_ADCAD proc
push acc ; Make Sure Acc Gets Saved
add a,dpl ; Add 'A' To DPL
mov dpl,a ; Move Result To DPL
mov a,dph ; Get DPH
addc a,#000h ; If Carry Set, This Will Increment
mov dph,a ; Move Bck To DPH
pop acc ; Recover Original 'A'
ret ; Return To Caller
endproc
;
;****************************************************************************
;
end
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -