CRC-ML.TXT

(3 KB) Pobierz
********************************
*   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

Zgłoś jeśli naruszono regulamin