> CRC32  CRC32 test code : (2 mem% &FFF:"LOAD CRCs/htm "+~mem%:num%=&A6D 2 mem%=PAGE:num%=TOP-PAGE <: F @%=&90A P8"BASIC CRC-32: ";:S%=-1:T%=:crc:T%=-T%:S%= S% Z"&";~S%;" in ";T%/100;"s"' d: n @%=&2040A x Asm1 EA$;" CRC-32: ";:T%=: L%=1 N%:S%=-1:crcAsm::T%=-T%:S%= S% *(7-A$)"&";~S%;" in ";T%/100/N%;"s"' : Asm2 EA$;" CRC-32: ";:T%=: L%=1 N%:S%=-1:crcAsm::T%=-T%:S%= S% *(7-A$)"&";~S%;" in ";T%/100/N%;"s"'  : copy ?S%=-1 : CRC starts as &FFFFFFFF  ? num%=#in%-#in% : Number of bytes to transfer  num%>max% num%=max% 7 gbpb(rd%,in%,mem%,num%,0) : Read block of data / crc : Update CRC 8 gbpb(wr%,out%,mem%,num%,0) : Write block of data "7 num%&8000:-256="W":crc86:A$="80x86":N%=100: %>&8000:crcARM:A$="ARM":N%=10: ,?&FFF7=&6C:crc65v1:A$="6502 v1":N%=1: &?&FFF7=&C3:crc80:A$="Z80":N%=1:  :  Asm2 >&8000: ,?&FFF7=&6C:crc65v2:A$="6502 v2":N%=1:   : 9crc65v2: Calcv2 63:addr=&70:num=&72:crc=&74:P=01 &P%=Calc:[OPT P*2 0 .bytelp :@LDX #8 :\ Prepare to rotate CRC 8 bits D8LDA (addr-8 &FF,X) :\ Fetch byte from memory N: XF\ The following code updates the CRC with the byte in A ---------+ bF\ If used in isolation, requires LDX #8 here | lB crc+0 :\ byte into CRC bottom byte | vF.rotlp :\ | FLSR crc+3:ROR crc+2 :\ Rotate CRC clearing bit 31 | FROR crc+1:ROR A :\ | FBCC clear :\ b0 was zero | FTAY :\ Hold CRC low byte in Y | DLDA crc+3: #&ED:STA crc+3 :\ CRC=CRC &EDB88320, ZIP polynomic DLDA crc+2: #&B8:STA crc+2 :\ | DLDA crc+1: #&83:STA crc+1 :\ | DTYA: #&20 :\ Get CRC low byte back from Y | F.clear :\ | FDEX:BNE rotlp :\ Loop for 8 bits | F\ If used in isolation, requires STA crc+0 here | F\ ---------------------------------------------------------------+ : 5INC addr:BNE next:INC addr+1 :\ Step to next byte  .next 9STA crc+0 :\ Store CRC bottom byte  : *\ Now do a 16-bit decrement 4ILDA num+0:BNE skip :\ num.lo<>0, not wrapping from 00 to FF >JDEC num+1 :\ Wrapping from 00 to FF, dec. high byte H .skip RFDEC num+0:BNE bytelp :\ Dec. low byte, loop until num.lo=0 \4LDA num+1:BNE bytelp :\ Loop until num=0 fRTS p ]:: z: 7crc65v1: Calc 79:addr=&70:num=&72:crc=&74:P=01 P%=Calc:[OPT P*2 7LDY #0 :\ Point to first byte  .bytelp =LDA (addr),Y: crc:STA crc :\ byte into CRC bottom byte @LDX #8 :\ Prepare to rotate CRC 8 bits  .rotlp .LSR crc+3:ROR crc+2 :\ Rotate CRC ROR crc+1:ROR crc+0 /BCC clear :\ b0 was zero DLDA crc+3: #&ED:STA crc+3 :\ CRC=CRC &EDB88320, ZIP polynomic LDA crc+2: #&B8:STA crc+2 LDA crc+1: #&83:STA crc+1 LDA crc+0: #&20:STA crc+0  .clear 3DEX:BNE rotlp :\ Loop for 8 bits $5INY:BNE next:INC addr+1 :\ Step to next byte . .next 8SEC B-LDA num+0:SBC #1:STA num+0 :\ num=num-1 LLDA num+1:SBC #0:STA num+1 V3A num:BNE bytelp :\ Loop until num=0 `RTS j ]:: t: ~5crc80: Calc 79:addr=&70:num=&72:crc=&74:P=01 P%=Calc:[OPT P*2 /LD IX,(addr):LD BC,(num) :\ Address, Count -LD DE,(crc):LD HL,(crc+2) :\ Incoming CRC : ;\ Enter here with IX=>data, BC=count, HLDE=incoming CRC  .bytelp +PUSH BC :\ Save count 7LD A,(IX) :\ Fetch byte from memory : F\ The following code updates the CRC with the byte in A ---------+ FXOR E :\ XOR byte into CRC bottom byte | FLD B,8 :\ Prepare to rotate 8 bits | F.rotlp :\ |  FSRL H:RR L:RR D:RRA :\ Rotate CRC | FJP NC,clear :\ b0 was zero | FLD E,A :\ Put CRC low byte back into E | (FLD A,H:XOR &ED:LD H,A :\ CRC=CRC XOR &EDB88320, ZIP polynomic| 2FLD A,L:XOR &B8:LD L,A :\ | STR R2,crc:MOV R15,R14 :\ Store outgoing CRC and return ..xor:EQUD &EDB88320 :\ ZIP polynomic .addr:EQUD 0:.num:EQUD 0 .crc:EQUD 0  ]:: : crc86: Calc 63:P=01 P%=Calc:[OPT P*2  .crc32 ,MOV ESI,[addr] ; ESI=>start of data -MOV EBX,[num] ; EBX= length of data +MOV ECX,[crc] ; ECX= incoming CRC &; 0 .bytelp :0MOV AL,[ESI] ; Fetch byte from memory D; NC; The following code updates the CRC with the byte in AL -----+ XCXOR CL,AL ; XOR byte into bottom of CRC | bCMOV AL,8 ; Prepare to rotate 8 bits | lC.rotlp ; | vCSHR ECX,1 ; Rotate CRC | CJNC clear ; b0 was zero | CXOR ECX,&EDB88320 ; If b0 was set, XOR with ZIP polymonic | C.clear ; | CDEC AL:JNZ rotlp ; Loop for 8 bits | C; ------------------------------------------------------------+ ; ,INC SI ; Point to next byte 5DEC EBX:JNE bytelp ; num=num-1, loop until num=0 ,MOV [crc],ECX ; Store outgoing CRC RETF .addr:DD 0  .num:DD 0  .crc:DD 0  ]::  :