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 