******************************** * CRC PROTOCOL CALCULATION * * FOR COMMODORE COMPUTERS * * By Tom Brown * ******************************** calc = $1021 ************************************ * THE POLYNOMIAL $1021 IS FOR THE * * CALCULATION 2^16 + 2^12 + 2^5 + 1* * THE NUMBER IS GOTTEN BY USING A * * 1 IN EACH BIT CORRESPONDING TO * * THE POLYNOMIAL. * * EG: $1021 HAS A 1 IN BIT 0,5,& 12* ************************************ org $1300 * * FIRST, WE HAVE TO ERASE THE OLD * CRC VALUE AND INITIALIZE THE * POLYNOMIAL WE WILL USE FOR THE * CALCULATION. NOTE THAT THE POLY * VARIABLE CAN BE CHANGED IN ONE * PLACE TO BE USED BY THE WHOLE * ROUTINE. * A CALLING ROUTINE WILL CALL THIS * ONLY ONCE. SUBSEQUENT CALLS WILL * BE TO crcalc. * initcrc lda #0 sta crc ;CRC CALCULATION sta crc+1 lda #<calc sta poly ;POLYNOMIAL lda #>calc sta poly+1 rts * * THIS ROUTINE WILL CALCULATE THE * CRC CHECKSUM WITH THE BYTE CURRENTLY * IN THE ACCUMULATOR. * crcalc ldx #8 ;COUNT 8 BITS loop pha ;SAVE DATA * * FIRST, WE xor BIT 7 OF DATA WITH * BIT 15 OF CRC (BIT 7 OF HIGH BYTE) * and #127 ;GET BIT 7 eor crc+1 ;HIGH BYTE sta crc+1 * * NOW WE SHIFT CRC (HI & LOW BYTES) * LEFT ONE BIT. THE asl PUTS A 0 INTO * BIT 0 OF CRC LOW,SHIFTS CRC LOW BYTE * LEFT ONE BIT, BIT 7 FALLING INTO THE * CARRY. THE rol SHIFTS THE CRC HIGH * BYTE LEFT 1 BIT, THE CARRY IS MOVED * INTO BIT 0 OF CRC HIGH BYTE, AND BIT * 7 FALLS INTO THE NOW-EMPTY CARRY * clc ;CLEAR CARRY asl crc ;SHIFT LOW BYTE rol crc+1 ;NOW HIGH bcc crcalc1 * * BIT 15 (BIT 7 OF HIGH CRC BYTE) OF * CRC WAS SHIFTED INTO THE CARRY. * IF THIS BIT WAS 1 THEN EXCLUSIVE-OR * THE CRC WITH THE POLYNOMIAL * lda poly ;POLYNOMIAL LOW eor crc ;CRC LOW BYTE sta crc lda poly+1 ;POLYNOMIAL HIGH eor crc+1 sta crc+1 * * NOW WE SHIFT THE DATA BYTE LEFT 1 BIT * AND DECREMENT OUR BIT COUNTER * AS LONG AS IT'S NOT ZERO, WE CONTINUE * OUR BITWISE CALCULATION * crcalc1 pla ;RESTORE DATA asl ;NEW BIT 7 dex ;DEC BIT COUNT bne loop rts ;WHEW! DONE. * * THESE ARE THE DATA BYTES * crc hex 0000 poly hex 0000 ******************************** * THIS SOURCECODE WOULD NOT BE * * POSSIBLE WITHOUT THE HELP OF * * BOB UMFER AND PETE BOSWELL * * (AKA topper), BOTH OF plink * ******************************** ******************************** * THIS CODE WAS WRITTEN ON THE * * merlin ASSEMBLER, FOR THE * * COMMODORE 128. JUST CHANGE * * THE LOAD LOCATION FOR THE 64 * * AS THERE ARE NO MACHINE * * SPECIFIC ROUTINES USED * ******************************** The following is the BASIC sourcecode in Basic 7.0 for the C-128 to test the machine language CRC calculation routine. Answer 1 to the prompt each time & you should get the following sequence of numbers: HIGH BYTE LOW BYTE COMBINED VALUE ========= ======== ============== 16 33 4129 35 16 8976 20 32 5152 98 148 25236 All values are, of course, in decimal 10 SYS(DEC("1300")) 20 INPUT"ENTER VALUE";A$:A=VAL(A$) 30 SYS(DEC("1313")),A:A=PEEK(DEC("1340")):B=PEEK(DEC("133F")) 40 C=(A*256)+B 50 PRINTA,B,C 60 GOTO20
Amiga7878