'=========================================================================== ' Subject: CALCULATE 32-BIT CRC IN PB/ASM Date: 12-15-99 (17:47) ' Author: Randall L. Glass Code: PB ' Origin: rlglass@yahoo.com Packet: PB.ABC '=========================================================================== ' ' -- CRC32.BAS -- ' ' Public Domain by Randall L Glass ' ' $CPU 8086 'make compatible with XT systems $LIB ALL OFF 'turn off all PowerBASIC libraries $ERROR ALL OFF 'turn off all PowerBASIC error checking $OPTIMIZE SIZE 'optimize for smaller code DEFDWD A-Z ' calculates the 32 bit Crc using the byte method CLS LOCATE 5,1 SHARED CRC??? CRC??? = &H0FFFFFFFF File$ = COMMAND$ PRINT "CRC is " OPEN File$ FOR BINARY AS #1 Ln??? = LOF(1) MTimer DO IF Ln??? >= 32000 THEN GET$ #1,32000,Block$ DECR Ln???,32000 CrcVal??? = CRC32???(Block$) ELSE GET$ #1,Ln???,Block$ CrcVal??? = CRC32???(Block$) EXIT LOOP END IF LOOP CLOSE Y! = MTIMER PRINT Y!/1E+6;" Seconds CRC=";DHex$(NOT CrcVal???) END ' compute updated CRC FUNCTION Crc32???(Block$) PUBLIC 'CRC??? = Crc32Table(Crc??? XOR ByteVal?) XOR (SiftRight(Crc???,8) AND &H00FFFFFF) DIM CharByte AS DWORD,ByteVal AS BYTE Ln?? = LEN(Block$) CharByte??? = STRPTR32(Block$) 'compute CRC ! MOV CX,Ln?? ! MOV DX,CRC???[2] ! MOV AX,CRC???[0] ! LES DI,CharByte??? NEWCRC: ! MOV BL,ES:[DI] ! INC DI ! XOR BL,AL ! MOV AL,AH ! MOV AH,DL ;CrcShifted??? = SHIFT RIGHT CRC???,8 ! MOV DL,DH ! MOV DH,0 ! MOV BH,0 ! SHL BX,1 ! SHL BX,1 ! XOR AX,Crcdata??[BX] ! XOR DX,Crcdata??[BX+2] ;Crc??? = Crc32Table???(Index?) XOR (Temp??? AND FACTOR???) ! LOOP NewCrc ! MOV CRC???[2],DX ! MOV CRC???[0],AX Crc32??? = CRC??? END FUNCTION FUNCTION DHex(HexDWord???) AS STRING DIM Lo AS WORD DIM Hi AS WORD ! les bx, [bp+6] ! mov ax, es:[bx+0] ! mov Lo??, ax ! mov ax, es:[bx+2] ! mov Hi??, ax DHex = RIGHT$("000" + HEX$(Hi??), 4) + RIGHT$("000" + _ HEX$(Lo??), 4) END FUNCTION CrcData: ! dw &H00 ! dw &H00 ! dw &H03096 ! dw &H07707 ! dw &H0612C ! dw &H0EE0E ! dw &H051BA ! dw &H09909 ! dw &H0C419 ! dw &H076D ! dw &H0F48F ! dw &H0706A ! dw &H0A535 ! dw &H0E963 ! dw &H095A3 ! dw &H09E64 ! dw &H08832 ! dw &H0EDB ! dw &H0B8A4 ! dw &H079DC ! dw &H0E91E ! dw &H0E0D5 ! dw &H0D988 ! dw &H097D2 ! dw &H04C2B ! dw &H09B6 ! dw &H07CBD ! dw &H07EB1 ! dw &H02D07 ! dw &H0E7B8 ! dw &H01D91 ! dw &H090BF ! dw &H01064 ! dw &H01DB7 ! dw &H020F2 ! dw &H06AB0 ! dw &H07148 ! dw &H0F3B9 ! dw &H041DE ! dw &H084BE ! dw &H0D47D ! dw &H01ADA ! dw &H0E4EB ! dw &H06DDD ! dw &H0B551 ! dw &H0F4D4 ! dw &H085C7 ! dw &H083D3 ! dw &H09856 ! dw &H0136C ! dw &H0A8C0 ! dw &H0646B ! dw &H0F97A ! dw &H0FD62 ! dw &H0C9EC ! dw &H08A65 ! dw &H05C4F ! dw &H01401 ! dw &H06CD9 ! dw &H06306 ! dw &H03D63 ! dw &H0FA0F ! dw &H0DF5 ! dw &H08D08 ! dw &H020C8 ! dw &H03B6E ! dw &H0105E ! dw &H04C69 ! dw &H041E4 ! dw &H0D560 ! dw &H07172 ! dw &H0A267 ! dw &H0E4D1 ! dw &H03C03 ! dw &H0D447 ! dw &H04B04 ! dw &H085FD ! dw &H0D20D ! dw &H0B56B ! dw &H0A50A ! dw &H0A8FA ! dw &H035B5 ! dw &H0986C ! dw &H042B2 ! dw &H0C9D6 ! dw &H0DBBB ! dw &H0F940 ! dw &H0ACBC ! dw &H06CE3 ! dw &H032D8 ! dw &H05C75 ! dw &H045DF ! dw &H0DCF ! dw &H0DCD6 ! dw &H03D59 ! dw &H0ABD1 ! dw &H030AC ! dw &H026D9 ! dw &H03A ! dw &H051DE ! dw &H05180 ! dw &H0C8D7 ! dw &H06116 ! dw &H0BFD0 ! dw &H0F4B5 ! dw &H021B4 ! dw &H0C423 ! dw &H056B3 ! dw &H09599 ! dw &H0CFBA ! dw &H0A50F ! dw &H0B8BD ! dw &H0B89E ! dw &H02802 ! dw &H08808 ! dw &H05F05 ! dw &H0D9B2 ! dw &H0C60C ! dw &H0E924 ! dw &H0B10B ! dw &H07C87 ! dw &H02F6F ! dw &H04C11 ! dw &H05868 ! dw &H01DAB ! dw &H0C161 ! dw &H02D3D ! dw &H0B666 ! dw &H04190 ! dw &H076DC ! dw &H07106 ! dw &H01DB ! dw &H020BC ! dw &H098D2 ! dw &H0102A ! dw &H0EFD5 ! dw &H08589 ! dw &H071B1 ! dw &H0B51F ! dw &H06B6 ! dw &H0E4A5 ! dw &H09FBF ! dw &H0D433 ! dw &H0E8B8 ! dw &H0C9A2 ! dw &H07807 ! dw &H0F934 ! dw &H0F00 ! dw &H0A88E ! dw &H09609 ! dw &H09818 ! dw &H0E10E ! dw &H0DBB ! dw &H07F6A ! dw &H03D2D ! dw &H086D ! dw &H06C97 ! dw &H09164 ! dw &H05C01 ! dw &H0E663 ! dw &H051F4 ! dw &H06B6B ! dw &H06162 ! dw &H01C6C ! dw &H030D8 ! dw &H08565 ! dw &H04E ! dw &H0F262 ! dw &H095ED ! dw &H06C06 ! dw &H0A57B ! dw &H01B01 ! dw &H0F4C1 ! dw &H08208 ! dw &H0C457 ! dw &H0F50F ! dw &H0D9C6 ! dw &H065B0 ! dw &H0E950 ! dw &H012B7 ! dw &H0B8EA ! dw &H08BBE ! dw &H0887C ! dw &H0FCB9 ! dw &H01DDF ! dw &H062DD ! dw &H02D49 ! dw &H015DA ! dw &H07CF3 ! dw &H08CD3 ! dw &H04C65 ! dw &H0FBD4 ! dw &H06158 ! dw &H04DB2 ! dw &H051CE ! dw &H03AB5 ! dw &H074 ! dw &H0A3BC ! dw &H030E2 ! dw &H0D4BB ! dw &H0A541 ! dw &H04ADF ! dw &H095D7 ! dw &H03DD8 ! dw &H0C46D ! dw &H0A4D1 ! dw &H0F4FB ! dw &H0D3D6 ! dw &H0E96A ! dw &H04369 ! dw &H0D9FC ! dw &H0346E ! dw &H08846 ! dw &H0AD67 ! dw &H0B8D0 ! dw &H0DA60 ! dw &H02D73 ! dw &H04404 ! dw &H01DE5 ! dw &H03303 ! dw &H04C5F ! dw &H0AA0A ! dw &H07CC9 ! dw &H0DD0D ! dw &H0713C ! dw &H05005 ! dw &H041AA ! dw &H02702 ! dw &H01010 ! dw &H0BE0B ! dw &H02086 ! dw &H0C90C ! dw &H0B525 ! dw &H05768 ! dw &H085B3 ! dw &H0206F ! dw &H0D409 ! dw &H0B966 ! dw &H0E49F ! dw &H0CE61 ! dw &H0F90E ! dw &H05EDE ! dw &H0C998 ! dw &H029D9 ! dw &H09822 ! dw &H0B0D0 ! dw &H0A8B4 ! dw &H0C7D7 ! dw &H03D17 ! dw &H059B3 ! dw &H0D81 ! dw &H02EB4 ! dw &H05C3B ! dw &H0B7BD ! dw &H06CAD ! dw &H0C0BA ! dw &H08320 ! dw &H0EDB8 ! dw &H0B3B6 ! dw &H09ABF ! dw &H0E20C ! dw &H03B6 ! dw &H0D29A ! dw &H074B1 ! dw &H04739 ! dw &H0EAD5 ! dw &H077AF ! dw &H09DD2 ! dw &H02615 ! dw &H04DB ! dw &H01683 ! dw &H073DC ! dw &H0B12 ! dw &H0E363 ! dw &H03B84 ! dw &H09464 ! dw &H06A3E ! dw &H0D6D ! dw &H05AA8 ! dw &H07A6A ! dw &H0CF0B ! dw &H0E40E ! dw &H0FF9D ! dw &H09309 ! dw &H0AE27 ! dw &H0A00 ! dw &H09EB1 ! dw &H07D07 ! dw &H09344 ! dw &H0F00F ! dw &H0A3D2 ! dw &H08708 ! dw &H0F268 ! dw &H01E01 ! dw &H0C2FE ! dw &H06906 ! dw &H0575D ! dw &H0F762 ! dw &H067CB ! dw &H08065 ! dw &H03671 ! dw &H0196C ! dw &H06E7 ! dw &H06E6B ! dw &H01B76 ! dw &H0FED4 ! dw &H02BE0 ! dw &H089D3 ! dw &H07A5A ! dw &H010DA ! dw &H04ACC ! dw &H067DD ! dw &H0DF6F ! dw &H0F9B9 ! dw &H0EFF9 ! dw &H08EBE ! dw &H0BE43 ! dw &H017B7 ! dw &H08ED5 ! dw &H060B0 ! dw &H0A3E8 ! dw &H0D6D6 ! dw &H0937E ! dw &H0A1D1 ! dw &H0C2C4 ! dw &H038D8 ! dw &H0F252 ! dw &H04FDF ! dw &H067F1 ! dw &H0D1BB ! dw &H05767 ! dw &H0A6BC ! dw &H06DD ! dw &H03FB5 ! dw &H0364B ! dw &H048B2 ! dw &H02BDA ! dw &H0D80D ! dw &H01B4C ! dw &H0AF0A ! dw &H04AF6 ! dw &H03603 ! dw &H07A60 ! dw &H04104 ! dw &H0EFC3 ! dw &H0DF60 ! dw &H0DF55 ! dw &H0A867 ! dw &H08EEF ! dw &H0316E ! dw &H0BE79 ! dw &H04669 ! dw &H0B38C ! dw &H0CB61 ! dw &H0831A ! dw &H0BC66 ! dw &H0D2A0 ! dw &H0256F ! dw &H0E236 ! dw &H05268 ! dw &H07795 ! dw &H0CC0C ! dw &H04703 ! dw &H0BB0B ! dw &H016B9 ! dw &H02202 ! dw &H0262F ! dw &H05505 ! dw &H03BBE ! dw &H0C5BA ! dw &H0B28 ! dw &H0B2BD ! dw &H05A92 ! dw &H02BB4 ! dw &H06A04 ! dw &H05CB3 ! dw &H0FFA7 ! dw &H0C2D7 ! dw &H0CF31 ! dw &H0B5D0 ! dw &H09E8B ! dw &H02CD9 ! dw &H0AE1D ! dw &H05BDE ! dw &H0C2B0 ! dw &H09B64 ! dw &H0F226 ! dw &H0EC63 ! dw &H0A39C ! dw &H0756A ! dw &H0930A ! dw &H026D ! dw &H06A9 ! dw &H09C09 ! dw &H0363F ! dw &H0EB0E ! dw &H06785 ! dw &H07207 ! dw &H05713 ! dw &H0500 ! dw &H04A82 ! dw &H095BF ! dw &H07A14 ! dw &H0E2B8 ! dw &H02BAE ! dw &H07BB1 ! dw &H01B38 ! dw &H0CB6 ! dw &H08E9B ! dw &H092D2 ! dw &H0BE0D ! dw &H0E5D5 ! dw &H0EFB7 ! dw &H07CDC ! dw &H0DF21 ! dw &H0BDB ! dw &H0D2D4 ! dw &H086D3 ! dw &H0E242 ! dw &H0F1D4 ! dw &H0B3F8 ! dw &H068DD ! dw &H0836E ! dw &H01FDA ! dw &H016CD ! dw &H081BE ! dw &H0265B ! dw &H0F6B9 ! dw &H077E1 ! dw &H06FB0 ! dw &H04777 ! dw &H018B7 ! dw &H05AE6 ! dw &H08808 ! dw &H06A70 ! dw &H0FF0F ! dw &H03BCA ! dw &H06606 ! dw &H0B5C ! dw &H01101 ! dw &H09EFF ! dw &H08F65 ! dw &H0AE69 ! dw &H0F862 ! dw &H0FFD3 ! dw &H0616B ! dw &H0CF45 ! dw &H0166C ! dw &H0E278 ! dw &H0A00A ! dw &H0D2EE ! dw &H0D70D ! dw &H08354 ! dw &H04E04 ! dw &H0B3C2 ! dw &H03903 ! dw &H02661 ! dw &H0A767 ! dw &H016F7 ! dw &H0D060 ! dw &H0474D ! dw &H04969 ! dw &H077DB ! dw &H03E6E ! dw &H06A4A ! dw &H0AED1 ! dw &H05ADC ! dw &H0D9D6 ! dw &H0B66 ! dw &H040DF ! dw &H03BF0 ! dw &H037D8 ! dw &H0AE53 ! dw &H0A9BC ! dw &H09EC5 ! dw &H0DEBB ! dw &H0CF7F ! dw &H047B2 ! dw &H0FFE9 ! dw &H030B5 ! dw &H0F21C ! dw &H0BDBD ! dw &H0C28A ! dw &H0CABA ! dw &H09330 ! dw &H053B3 ! dw &H0A3A6 ! dw &H024B4 ! dw &H03605 ! dw &H0BAD0 ! dw &H0693 ! dw &H0CDD7 ! dw &H05729 ! dw &H054DE ! dw &H067BF ! dw &H023D9 ! dw &H07A2E ! dw &H0B366 ! dw &H04AB8 ! dw &H0C461 ! dw &H01B02 ! dw &H05D68 ! dw &H02B94 ! dw &H02A6F ! dw &H0BE37 ! dw &H0B40B ! dw &H08EA1 ! dw &H0C30C ! dw &H0DF1B ! dw &H05A05 ! dw &H0EF8D ! dw &H02D02