home *** CD-ROM | disk | FTP | other *** search
/ rtsi.com / 2014.01.www.rtsi.com.tar / www.rtsi.com / OS9 / OSK / TELECOM / rzsz_3_24_3_src.lzh / crctab.c < prev    next >
Text File  |  1993-11-03  |  11KB  |  248 lines

  1. /*
  2.  *  Crc calculation stuff
  3.  */
  4.  
  5. /* crctab calculated by Mark G. Mendel, Network Systems Corporation */
  6. #ifdef OS9
  7. #ifdef m6809
  8. unsigned crctab[256] = {
  9. #else
  10. unsigned short crctab[256] = {
  11. #endif
  12. #else
  13. static unsigned short crctab[256] = {
  14. #endif
  15.     0x0000,  0x1021,  0x2042,  0x3063,  0x4084,  0x50a5,  0x60c6,  0x70e7,
  16.     0x8108,  0x9129,  0xa14a,  0xb16b,  0xc18c,  0xd1ad,  0xe1ce,  0xf1ef,
  17.     0x1231,  0x0210,  0x3273,  0x2252,  0x52b5,  0x4294,  0x72f7,  0x62d6,
  18.     0x9339,  0x8318,  0xb37b,  0xa35a,  0xd3bd,  0xc39c,  0xf3ff,  0xe3de,
  19.     0x2462,  0x3443,  0x0420,  0x1401,  0x64e6,  0x74c7,  0x44a4,  0x5485,
  20.     0xa56a,  0xb54b,  0x8528,  0x9509,  0xe5ee,  0xf5cf,  0xc5ac,  0xd58d,
  21.     0x3653,  0x2672,  0x1611,  0x0630,  0x76d7,  0x66f6,  0x5695,  0x46b4,
  22.     0xb75b,  0xa77a,  0x9719,  0x8738,  0xf7df,  0xe7fe,  0xd79d,  0xc7bc,
  23.     0x48c4,  0x58e5,  0x6886,  0x78a7,  0x0840,  0x1861,  0x2802,  0x3823,
  24.     0xc9cc,  0xd9ed,  0xe98e,  0xf9af,  0x8948,  0x9969,  0xa90a,  0xb92b,
  25.     0x5af5,  0x4ad4,  0x7ab7,  0x6a96,  0x1a71,  0x0a50,  0x3a33,  0x2a12,
  26.     0xdbfd,  0xcbdc,  0xfbbf,  0xeb9e,  0x9b79,  0x8b58,  0xbb3b,  0xab1a,
  27.     0x6ca6,  0x7c87,  0x4ce4,  0x5cc5,  0x2c22,  0x3c03,  0x0c60,  0x1c41,
  28.     0xedae,  0xfd8f,  0xcdec,  0xddcd,  0xad2a,  0xbd0b,  0x8d68,  0x9d49,
  29.     0x7e97,  0x6eb6,  0x5ed5,  0x4ef4,  0x3e13,  0x2e32,  0x1e51,  0x0e70,
  30.     0xff9f,  0xefbe,  0xdfdd,  0xcffc,  0xbf1b,  0xaf3a,  0x9f59,  0x8f78,
  31.     0x9188,  0x81a9,  0xb1ca,  0xa1eb,  0xd10c,  0xc12d,  0xf14e,  0xe16f,
  32.     0x1080,  0x00a1,  0x30c2,  0x20e3,  0x5004,  0x4025,  0x7046,  0x6067,
  33.     0x83b9,  0x9398,  0xa3fb,  0xb3da,  0xc33d,  0xd31c,  0xe37f,  0xf35e,
  34.     0x02b1,  0x1290,  0x22f3,  0x32d2,  0x4235,  0x5214,  0x6277,  0x7256,
  35.     0xb5ea,  0xa5cb,  0x95a8,  0x8589,  0xf56e,  0xe54f,  0xd52c,  0xc50d,
  36.     0x34e2,  0x24c3,  0x14a0,  0x0481,  0x7466,  0x6447,  0x5424,  0x4405,
  37.     0xa7db,  0xb7fa,  0x8799,  0x97b8,  0xe75f,  0xf77e,  0xc71d,  0xd73c,
  38.     0x26d3,  0x36f2,  0x0691,  0x16b0,  0x6657,  0x7676,  0x4615,  0x5634,
  39.     0xd94c,  0xc96d,  0xf90e,  0xe92f,  0x99c8,  0x89e9,  0xb98a,  0xa9ab,
  40.     0x5844,  0x4865,  0x7806,  0x6827,  0x18c0,  0x08e1,  0x3882,  0x28a3,
  41.     0xcb7d,  0xdb5c,  0xeb3f,  0xfb1e,  0x8bf9,  0x9bd8,  0xabbb,  0xbb9a,
  42.     0x4a75,  0x5a54,  0x6a37,  0x7a16,  0x0af1,  0x1ad0,  0x2ab3,  0x3a92,
  43.     0xfd2e,  0xed0f,  0xdd6c,  0xcd4d,  0xbdaa,  0xad8b,  0x9de8,  0x8dc9,
  44.     0x7c26,  0x6c07,  0x5c64,  0x4c45,  0x3ca2,  0x2c83,  0x1ce0,  0x0cc1,
  45.     0xef1f,  0xff3e,  0xcf5d,  0xdf7c,  0xaf9b,  0xbfba,  0x8fd9,  0x9ff8,
  46.     0x6e17,  0x7e36,  0x4e55,  0x5e74,  0x2e93,  0x3eb2,  0x0ed1,  0x1ef0
  47. };
  48.  
  49. /*
  50.  * updcrc macro derived from article Copyright (C) 1986 Stephen Satchell. 
  51.  *  NOTE: First srgument must be in range 0 to 255.
  52.  *        Second argument is referenced twice.
  53.  * 
  54.  * Programmers may incorporate any or all code into their programs, 
  55.  * giving proper credit within the source. Publication of the 
  56.  * source routines is permitted so long as proper credit is given 
  57.  * to Stephen Satchell, Satchell Evaluations and Chuck Forsberg, 
  58.  * Omen Technology.
  59.  */
  60.  
  61. #ifdef OS9
  62. #ifdef m6809
  63. unsigned
  64. updcrc(cp, crc)
  65. unsigned cp, crc;
  66. {
  67. #asm
  68. * pshs u
  69.  ldd 6,s
  70. * pshs d
  71. * ldd #8
  72. * lbsr cclsr
  73.  tfr a,b new code to >> 8
  74. * PrJ - fcb $1f,$45
  75.  clra
  76.  aslb
  77.  rola
  78.  leax crctab,y
  79.  leax d,x
  80.  ldd 0,x
  81.  pshs d
  82.  ldd 8,s
  83. * pshs d
  84. * ldd #8
  85. * lbsr ccasl to do << 8
  86.  tfr b,a new code skips lib call
  87. * PrJ - fcb $1f,$54
  88.  clrb new code skips lib call
  89.  eora ,s+
  90.  eorb ,s+
  91.  eora 4,s
  92.  eorb 5,s
  93. * puls u,pc
  94. #endasm
  95. }
  96. #else
  97. unsigned long
  98. updcrc(cp, crc)
  99. unsigned long cp, crc;
  100. {
  101.     return(crctab[((crc >> 8) & 255)] ^ (crc << 8) ^ cp);
  102. }
  103. #endif
  104. #else
  105. #define updcrc(cp, crc) ( crctab[((crc >> 8) & 255)] ^ (crc << 8) ^ cp)
  106. #endif
  107.  
  108. /*
  109.  * Copyright (C) 1986 Gary S. Brown.  You may use this program, or
  110.  * code or tables extracted from it, as desired without restriction.
  111.  */
  112.  
  113. /* First, the polynomial itself and its table of feedback terms.  The  */
  114. /* polynomial is                                                       */
  115. /* X^32+X^26+X^23+X^22+X^16+X^12+X^11+X^10+X^8+X^7+X^5+X^4+X^2+X^1+X^0 */
  116. /* Note that we take it "backwards" and put the highest-order term in  */
  117. /* the lowest-order bit.  The X^32 term is "implied"; the LSB is the   */
  118. /* X^31 term, etc.  The X^0 term (usually shown as "+1") results in    */
  119. /* the MSB being 1.                                                    */
  120.  
  121. /* Note that the usual hardware shift register implementation, which   */
  122. /* is what we're using (we're merely optimizing it by doing eight-bit  */
  123. /* chunks at a time) shifts bits into the lowest-order term.  In our   */
  124. /* implementation, that means shifting towards the right.  Why do we   */
  125. /* do it this way?  Because the calculated CRC must be transmitted in  */
  126. /* order from highest-order term to lowest-order term.  UARTs transmit */
  127. /* characters in order from LSB to MSB.  By storing the CRC this way,  */
  128. /* we hand it to the UART in the order low-byte to high-byte; the UART */
  129. /* sends each low-bit to hight-bit; and the result is transmission bit */
  130. /* by bit from highest- to lowest-order term without requiring any bit */
  131. /* shuffling on our part.  Reception works similarly.                  */
  132.  
  133. /* The feedback terms table consists of 256, 32-bit entries.  Notes:   */
  134. /*                                                                     */
  135. /*     The table can be generated at runtime if desired; code to do so */
  136. /*     is shown later.  It might not be obvious, but the feedback      */
  137. /*     terms simply represent the results of eight shift/xor opera-    */
  138. /*     tions for all combinations of data and CRC register values.     */
  139. /*                                                                     */
  140. /*     The values must be right-shifted by eight bits by the "updcrc"  */
  141. /*     logic; the shift must be unsigned (bring in zeroes).  On some   */
  142. /*     hardware you could probably optimize the shift in assembler by  */
  143. /*     using byte-swap instructions.                                   */
  144.  
  145. static long cr3tab[] = { /* CRC polynomial 0xedb88320 */
  146. 0x00000000, 0x77073096, 0xee0e612c, 0x990951ba, 0x076dc419, 0x706af48f, 0xe963a535, 0x9e6495a3,
  147. 0x0edb8832, 0x79dcb8a4, 0xe0d5e91e, 0x97d2d988, 0x09b64c2b, 0x7eb17cbd, 0xe7b82d07, 0x90bf1d91,
  148. 0x1db71064, 0x6ab020f2, 0xf3b97148, 0x84be41de, 0x1adad47d, 0x6ddde4eb, 0xf4d4b551, 0x83d385c7,
  149. 0x136c9856, 0x646ba8c0, 0xfd62f97a, 0x8a65c9ec, 0x14015c4f, 0x63066cd9, 0xfa0f3d63, 0x8d080df5,
  150. 0x3b6e20c8, 0x4c69105e, 0xd56041e4, 0xa2677172, 0x3c03e4d1, 0x4b04d447, 0xd20d85fd, 0xa50ab56b,
  151. 0x35b5a8fa, 0x42b2986c, 0xdbbbc9d6, 0xacbcf940, 0x32d86ce3, 0x45df5c75, 0xdcd60dcf, 0xabd13d59,
  152. 0x26d930ac, 0x51de003a, 0xc8d75180, 0xbfd06116, 0x21b4f4b5, 0x56b3c423, 0xcfba9599, 0xb8bda50f,
  153. 0x2802b89e, 0x5f058808, 0xc60cd9b2, 0xb10be924, 0x2f6f7c87, 0x58684c11, 0xc1611dab, 0xb6662d3d,
  154. 0x76dc4190, 0x01db7106, 0x98d220bc, 0xefd5102a, 0x71b18589, 0x06b6b51f, 0x9fbfe4a5, 0xe8b8d433,
  155. 0x7807c9a2, 0x0f00f934, 0x9609a88e, 0xe10e9818, 0x7f6a0dbb, 0x086d3d2d, 0x91646c97, 0xe6635c01,
  156. 0x6b6b51f4, 0x1c6c6162, 0x856530d8, 0xf262004e, 0x6c0695ed, 0x1b01a57b, 0x8208f4c1, 0xf50fc457,
  157. 0x65b0d9c6, 0x12b7e950, 0x8bbeb8ea, 0xfcb9887c, 0x62dd1ddf, 0x15da2d49, 0x8cd37cf3, 0xfbd44c65,
  158. 0x4db26158, 0x3ab551ce, 0xa3bc0074, 0xd4bb30e2, 0x4adfa541, 0x3dd895d7, 0xa4d1c46d, 0xd3d6f4fb,
  159. 0x4369e96a, 0x346ed9fc, 0xad678846, 0xda60b8d0, 0x44042d73, 0x33031de5, 0xaa0a4c5f, 0xdd0d7cc9,
  160. 0x5005713c, 0x270241aa, 0xbe0b1010, 0xc90c2086, 0x5768b525, 0x206f85b3, 0xb966d409, 0xce61e49f,
  161. 0x5edef90e, 0x29d9c998, 0xb0d09822, 0xc7d7a8b4, 0x59b33d17, 0x2eb40d81, 0xb7bd5c3b, 0xc0ba6cad,
  162. 0xedb88320, 0x9abfb3b6, 0x03b6e20c, 0x74b1d29a, 0xead54739, 0x9dd277af, 0x04db2615, 0x73dc1683,
  163. 0xe3630b12, 0x94643b84, 0x0d6d6a3e, 0x7a6a5aa8, 0xe40ecf0b, 0x9309ff9d, 0x0a00ae27, 0x7d079eb1,
  164. 0xf00f9344, 0x8708a3d2, 0x1e01f268, 0x6906c2fe, 0xf762575d, 0x806567cb, 0x196c3671, 0x6e6b06e7,
  165. 0xfed41b76, 0x89d32be0, 0x10da7a5a, 0x67dd4acc, 0xf9b9df6f, 0x8ebeeff9, 0x17b7be43, 0x60b08ed5,
  166. 0xd6d6a3e8, 0xa1d1937e, 0x38d8c2c4, 0x4fdff252, 0xd1bb67f1, 0xa6bc5767, 0x3fb506dd, 0x48b2364b,
  167. 0xd80d2bda, 0xaf0a1b4c, 0x36034af6, 0x41047a60, 0xdf60efc3, 0xa867df55, 0x316e8eef, 0x4669be79,
  168. 0xcb61b38c, 0xbc66831a, 0x256fd2a0, 0x5268e236, 0xcc0c7795, 0xbb0b4703, 0x220216b9, 0x5505262f,
  169. 0xc5ba3bbe, 0xb2bd0b28, 0x2bb45a92, 0x5cb36a04, 0xc2d7ffa7, 0xb5d0cf31, 0x2cd99e8b, 0x5bdeae1d,
  170. 0x9b64c2b0, 0xec63f226, 0x756aa39c, 0x026d930a, 0x9c0906a9, 0xeb0e363f, 0x72076785, 0x05005713,
  171. 0x95bf4a82, 0xe2b87a14, 0x7bb12bae, 0x0cb61b38, 0x92d28e9b, 0xe5d5be0d, 0x7cdcefb7, 0x0bdbdf21,
  172. 0x86d3d2d4, 0xf1d4e242, 0x68ddb3f8, 0x1fda836e, 0x81be16cd, 0xf6b9265b, 0x6fb077e1, 0x18b74777,
  173. 0x88085ae6, 0xff0f6a70, 0x66063bca, 0x11010b5c, 0x8f659eff, 0xf862ae69, 0x616bffd3, 0x166ccf45,
  174. 0xa00ae278, 0xd70dd2ee, 0x4e048354, 0x3903b3c2, 0xa7672661, 0xd06016f7, 0x4969474d, 0x3e6e77db,
  175. 0xaed16a4a, 0xd9d65adc, 0x40df0b66, 0x37d83bf0, 0xa9bcae53, 0xdebb9ec5, 0x47b2cf7f, 0x30b5ffe9,
  176. 0xbdbdf21c, 0xcabac28a, 0x53b39330, 0x24b4a3a6, 0xbad03605, 0xcdd70693, 0x54de5729, 0x23d967bf,
  177. 0xb3667a2e, 0xc4614ab8, 0x5d681b02, 0x2a6f2b94, 0xb40bbe37, 0xc30c8ea1, 0x5a05df1b, 0x2d02ef8d
  178. };
  179.  
  180. #ifdef OS9
  181. #ifdef m6809
  182. long
  183. UPDC32(b, c)
  184. long c;
  185. { /* this bracket causes a pshs u to be emmitted */
  186. /* This asm code optimized by Gene Heskett, Delphi's WOAY */
  187. #asm
  188.  ldd 8,s '(int)c' to d & sp-2
  189. * eora 4,s is this required? no! works w/o
  190.  eorb 5,s '^ b'
  191.  clra & 0xff,in view of this?
  192.  aslb crctab is 4 byte values
  193.  rola dbl once
  194.  aslb
  195.  rola dbl again to 4
  196.  leax cr3tab,y
  197.  leax d,x
  198.  ldd 2,x get lsint of crctab
  199.  pshs d sp-4 
  200.  ldd ,x get msint of crctab
  201.  pshs d sp-6
  202.  leax 10,s point at passed crc now 
  203. * pshs x sp-8 old shifter call 
  204. * ldd #8 
  205. * lbsr  _lshr sp-10 to here
  206.  ldd 1,x the first 8 bit shift
  207. * WOAY! and I still don't know if we need this next one
  208.  std 2,x via load and store at +1, 
  209.  pshs d WOAY! gets rid of an ldd 2,x below
  210.  ldb ,x WOAY! now shift the msint
  211. * sta 1,x WOAY!
  212.  clra  WOAY! was ,x with zero fill
  213.  std ,x WOAY! or this, puts b at 1,x! makes 2 copies on the stack
  214. * ldd 2,x WOAY! saves 5~
  215. * pshs d sp-8 WOAY! already done
  216. * ldd 0,x WOAY! saves 5~ 
  217.  pshs d sp-10 
  218.  bsr _3 sp-12
  219.  fdb 255,-1 =#$00FF,#$FFFF
  220. _3 puls x sp-10 and x->#$00FFFFFF
  221.  lbsr  _land incs sp by 4? sp-6
  222.  lbsr  _lxor incs sp by 4? sp-2
  223. #endasm
  224. } /* and this one causes a puls u,pc so stack s/b ok */
  225. #else
  226. long
  227. UPDC32(b, c)
  228. long c;
  229. {
  230.     return (cr3tab[((int)c ^ b) & 0xff] ^ ((c >> 8) & 0x00FFFFFF));
  231. }
  232. #endif
  233. #else
  234. #ifdef NFGM
  235. long
  236. UPDC32(b, c)
  237. long c;
  238. {
  239.     return (cr3tab[((int)c ^ b) & 0xff] ^ ((c >> 8) & 0x00FFFFFF));
  240. }
  241. #else
  242.  
  243. #define UPDC32(b, c) (cr3tab[((int)c ^ b) & 0xff] ^ ((c >> 8) & 0x00FFFFFF))
  244. #endif
  245. #endif
  246.  
  247. /* End of crctab.c */
  248.