home *** CD-ROM | disk | FTP | other *** search
- ********************************
- * CRC PROTOCOL CALCULATION *
- * FOR COMMODORE COMPUTERS *
- * By Tom Brown *
- * *
- * *
- * THIS FILE MAY BE UPLOADED TO *
- * ANY BBS OR PAY SERVICE, PRO- *
- * VIDED THAT ALL COMMENTS RE- *
- * MAIN INTACT, AND THAT THE *
- * AUTHOR BE GIVEN FULL CREDIT *
- * WHEN ANY OF THIS CALCULATION *
- * IS USED. *
- ********************************
-
-
-
- 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 (AKA cbm*bob) 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
-