home *** CD-ROM | disk | FTP | other *** search
- From "EDN" magazine, June 5, 1979, page 84
- ------------------------------------------
-
- 8080 ROUTINE GENERATES CRC CHARACTER
- by Fred Gutman
- California Microwave, Inc., Sunnyvale, CA
-
- Communications and magnetic-storage controllers often use cyclic
- redundancy checking (CRC) to enhance data-transmission accuracy;
- this method's popularity is due, in part, to its easy implementa-
- tion with shift registers and exclusive-OR gates (EDN, Sept 5,
- 1978, pgs 119-123).
-
- Many software methods can emulate this hardware mechanization.
- The more natural software method discussed here directly executes
- the division of a message by a generating polynomial. An example,
- programmed on the 8080, appears in the figure.
-
- CRC divides a message M(x) of any length by a generating
- polynomial P(x) to form a quotient Q(x) and a remainder R(x):
- M(x)/P(x)=Q(x)+R(x). R(x) is appended to the message and checked
- at the receiving end of the communication channel or upon read-
- back of magnetic-storage information.
-
- In these operations, addition and division are based on the
- exclusive-OR function without carry; only bit-by-bit differences
- are important, not their arithmetic sum. Thus, while this
- process resembles nonrestoring binary division, its mechanization
- is somewhat simpler. Note that you don't have to store the
- quotient - the remainder is the only useful part. This versatile
- method accepts different generating polynomials (table); you
- simply insert them into the routine in the figure. In each case,
- an R-bit remainder is left in location REM for transmission or
- checking. (R is the order of the generating polynomial.)
-
-
- TABLE
-
- POLYNOMIAL MASK HEX FORM
-
- CR16: x16+x15+x2+1 H=128 8005
- SDLC: x16+x12+x5+1 H=128 1021
- CCITT: x16+x15+x10+x6+x5+1 H=128 8461
- x16+x15+x13+x7+x4+x2+x+1 H=128 A097
- HDLC: x14+x2+x+1 H=128 4007
- x8+x7+x2+1 L=128 0185
- CR12: x12+x11+x3+x2+x+1 H=8 180F
- BCC: x8+1 L=128 0101
- CR16 REVERSE: x15+x14+x+1 H=128 4003
- CCIT REVERSE: x16+x11+x4+1 H=128 0811
- x8+x7+x5+x4+1 L=128 01B1
-
-
- FIGURE
-
- 011F MESS DS 1
- 0120 0000 REM DW 0
- 0122 DIVP LHLD REM ;REMAINDER
- 0125 7C MOV A,H
- 0126 E680 ANI 128 ;Q-BIT MASK SEE TABLE
- 0128 F5 PUSH PSW ;SAVE STATUS
- 0129 29 DAD H ;2 X R(X)
- 012A 3A1F01 LDA MESS ;MESSAGE BIT IN LSB
- 012D 85 ADD L
- 012E 6F MOV L,A
- 012F F1 POP PSW
- 0130 CA3B01 JZ $+11 ;IF Q-BIT IS ZERO
- 0133 7C QB MOV A,H
- 0134 EE10 XRI 10H ;MS HALF OF GEN. POLY
- 0136 67 MOV H,A
- 0137 7D MOV A,L
- 0138 EE21 XRI 21H ;LS HALF
- 013A 6F MOV L,A
- 013B 222001 SHLD REM
- 013E C9 RET
- 013F END 100H
-
- An 8080 routine for generating a cyclic-redundancy-check
- character leaves that character in location REM.
-
- END