|
|
1.1 ! root 1: /* ! 2: ** Packet check bytes calculation ! 3: */ ! 4: ! 5: #ifdef vax ! 6: /* ! 7: ** Vax "crc" instruction look-up table for polynomial = 0120001 ! 8: */ ! 9: ! 10: unsigned long crc16t[] = ! 11: { ! 12: 0, 0146001, 0154001, 012000, 0170001, 036000, 024000, 0162001 ! 13: ,0120001, 066000, 074000, 0132001, 050000, 0116001, 0104001, 042000 ! 14: }; ! 15: ! 16: /*ARGSUSED*/ ! 17: int ! 18: crc(s, n) ! 19: unsigned char * s; ! 20: int n; ! 21: { ! 22: asm(" crc _crc16t,$0,8(ap),*4(ap) "); ! 23: asm(" cmpw r0,(r3) "); ! 24: asm(" beqlu OK "); ! 25: asm(" movw r0,(r3) "); ! 26: asm(" movl $1,r0 "); ! 27: asm(" ret "); ! 28: asm("OK:movw r0,(r3) "); ! 29: return 0; ! 30: } ! 31: ! 32: #else vax ! 33: ! 34: ! 35: /* ! 36: ** crc-16: x**16 + x**15 + x**2 + 1 ! 37: */ ! 38: ! 39: typedef unsigned char uchar; ! 40: typedef unsigned short ushort; ! 41: ! 42: #define lobyte(X) (X&0xff) ! 43: #define hibyte(X) ((X>>8)&0xff) ! 44: ! 45: ushort crc16t_32[2][16] = ! 46: { ! 47: 0, 0140301, 0140601, 0500, 0141401, 01700, 01200, 0141101, ! 48: 0143001, 03300, 003600, 0143501, 02400, 0142701, 0142201, 02100, ! 49: 0, 0146001, 0154001, 012000, 0170001, 036000, 024000, 0162001, ! 50: 0120001, 066000, 074000, 0132001, 050000, 0116001, 0104001, 042000 ! 51: }; ! 52: ! 53: /*#ifndef mc68000*/ ! 54: int ! 55: crc(buffer, nbytes) ! 56: register uchar *buffer; ! 57: int nbytes; ! 58: { ! 59: register ushort tcrc = 0; ! 60: register int temp; ! 61: register int i; ! 62: ! 63: if ( (i = nbytes) > 0 ) ! 64: do ! 65: { ! 66: temp = tcrc ^ *buffer++; ! 67: tcrc = crc16t_32[0][temp & 017] ! 68: ^ crc16t_32[1][(temp>>4) & 017] ! 69: ^ (tcrc>>8); ! 70: } ! 71: while ! 72: ( --i > 0 ); ! 73: ! 74: if ( lobyte(tcrc) != *buffer ) ! 75: i++; ! 76: *buffer++ = lobyte(tcrc); ! 77: ! 78: if ( hibyte(tcrc) != *buffer ) ! 79: i++; ! 80: *buffer++ = hibyte(tcrc); ! 81: ! 82: return i; ! 83: } ! 84: /*#else mc68000 ! 85: asm(" text "); ! 86: asm(" global crc "); ! 87: asm("crc: "); ! 88: asm(" link %fp,&crcF "); ! 89: asm(" movm.l &crcM,crcS(%fp) "); ! 90: asm(" mov.l 8(%fp),%a2 "); ! 91: asm(" mov.l &0,%d2 "); ! 92: asm(" mov.w 12(%fp),%d4 "); ! 93: asm(" ble crc%140 "); ! 94: asm("crc%170: "); ! 95: asm(" mov.b (%a2)+,%d3 "); ! 96: asm(" eor.b %d2,%d3 "); ! 97: asm(" mov.l &15,%d0 "); ! 98: asm(" and.b %d3,%d0 "); ! 99: asm(" add.l %d0,%d0 "); ! 100: asm(" mov.l &crc16t_3,%a1 "); ! 101: asm(" mov.w 0(%a1,%d0.l),%d0"); ! 102: asm(" lsr.b &3,%d3 "); ! 103: asm(" and.w &30,%d3 "); ! 104: asm(" mov.l &crc16t_3+32,%a0"); ! 105: asm(" mov.w 0(%a0,%d3.w),%d1"); ! 106: asm(" eor.w %d0,%d1 "); ! 107: asm(" lsr.w &8,%d2 "); ! 108: asm(" eor.w %d1,%d2 "); ! 109: asm(" sub.w &1,%d4 "); ! 110: asm(" bgt crc%170 "); ! 111: asm("crc%140: "); ! 112: asm(" cmp.b %d2,(%a2) "); ! 113: asm(" beq crc%180 "); ! 114: asm(" add.w &1,%d4 "); ! 115: asm("crc%180: "); ! 116: asm(" mov.b %d2,(%a2)+ "); ! 117: asm(" lsr.w &8,%d2 "); ! 118: asm(" cmp.b %d2,(%a2) "); ! 119: asm(" beq crc%190 "); ! 120: asm(" add.w &1,%d4 "); ! 121: asm("crc%190: "); ! 122: asm(" mov.b %d2,(%a2)+ "); ! 123: asm(" mov.w %d4,%d0 "); ! 124: asm(" movm.l crcS(%fp),&crcM "); ! 125: asm(" unlk %fp "); ! 126: asm(" rts "); ! 127: asm(" set crcS,-16 "); ! 128: asm(" set crcF,-22 "); ! 129: asm(" set crcM,02034 "); ! 130: #endif mc68000 */ ! 131: #endif vax
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.