crc_68.a
上传用户:andy_li
上传日期:2007-01-06
资源大小:1019k
文件大小:4k
源码类别:

压缩解压

开发平台:

MultiPlatform

  1. ; Not copyrighted by Paul Kienitz, last modified 04 Jan 96.
  2. ;
  3. ; Return an updated 32 bit CRC value, given the old value and a block of data.
  4. ; The CRC table used to compute the value is gotten by calling get_crc_table().
  5. ; This replaces the older updcrc() function used in Zip and fUnZip.  The
  6. ; prototype of the function is:
  7. ;
  8. ;    ulg crc32(ulg crcval, uch *text, extent textlen);
  9. ;
  10. ; On the Amiga, type extent is always unsigned long, not unsigned int, because
  11. ; int can be short or long at whim, but size_t is long.
  12. ;
  13. ; If using this source on a non-Amiga 680x0 system, note that we treat
  14. ; a0/a1/d0/d1 as scratch registers not preserved across function calls.
  15. ; We do not bother to support registerized arguments for crc32() -- the
  16. ; textlen parm is usually large enough so that savings outside the loop
  17. ; are pointless.
  18. ;
  19. ; Define NO_UNROLLED_LOOPS to use a simple short loop which might be more
  20. ; efficient on certain machines with dinky instruction caches ('020?), or for
  21. ; processing short strings.  If loops are unrolled, the textlen parm must be
  22. ; less than 512K; if not unrolled, it must be less than 64K.
  23.         xdef    _crc32          ; (ulg val, uch *buf, extent bufsize)
  24. DO_CRC0 MACRO
  25.         moveq  #0,ltemp
  26.         move.b (textbuf)+,ltemp
  27.         eor.b  crcval,ltemp
  28.         lsl.w  #2,ltemp
  29.         move.l (crc_table,ltemp.w),ltemp
  30.         lsr.l  #8,crcval
  31.         eor.l  ltemp,crcval
  32.         ENDM
  33.         machine mc68020
  34. DO_CRC2 MACRO
  35.         move.b (textbuf)+,btemp
  36.         eor.b  crcval,btemp
  37.         lsr.l  #8,crcval
  38.         move.l (crc_table,btemp.w*4),ltemp
  39.         eor.l  ltemp,crcval
  40.         ENDM
  41. crc_table       equr    a0      array of unsigned long
  42. crcval          equr    d0      unsigned long initial value
  43. textbuf         equr    a1      array of unsigned char
  44. textbufsize     equr    d1      unsigned long (count of bytes in textbuf)
  45. btemp           equr    d2
  46. ltemp           equr    d3
  47.         xref    _get_crc_table  ; ulg *get_crc_table(void)
  48.         NOLIST
  49.         INCLUDE 'exec/execbase.i'
  50.         LIST
  51.         xref    _SysBase        ; struct ExecBase *
  52. _crc32:
  53.         move.l  8(sp),d0
  54.         bne.s   valid
  55.          moveq  #0,d0
  56.          rts
  57. valid:  movem.l btemp/ltemp,-(sp)
  58.         jsr     _get_crc_table
  59.         move.l  d0,ltemp
  60.         move.l  12(sp),crcval
  61.         move.l  16(sp),textbuf
  62.         move.l  20(sp),textbufsize
  63.         not.l   crcval
  64.         move.l  _SysBase,crc_table
  65.         move.w  AttnFlags(crc_table),btemp
  66.         move.l  ltemp,crc_table
  67.         btst    #AFB_68020,btemp
  68.         bne     twenty
  69.     IFD     NO_UNROLLED_LOOPS
  70.         bra.s   decr
  71. loop:    DO_CRC0
  72. decr:    dbra   textbufsize,loop
  73.         bra.s   done
  74. twenty: moveq   #0,btemp
  75.         bra.s   decr2
  76. loop2:   DO_CRC2
  77. decr2:   dbra   textbufsize,loop2
  78.     ELSE    ; !NO_UNROLLED_LOOPS
  79.         move.l  textbufsize,btemp
  80.         lsr.l   #3,textbufsize
  81.         bra     decr8
  82. loop8:   DO_CRC0
  83.          DO_CRC0
  84.          DO_CRC0
  85.          DO_CRC0
  86.          DO_CRC0
  87.          DO_CRC0
  88.          DO_CRC0
  89.          DO_CRC0
  90. decr8:   dbra   textbufsize,loop8
  91.         and.w   #7,btemp
  92.         bra.s   decr1
  93. loop1:   DO_CRC0
  94. decr1:   dbra   btemp,loop1
  95.         bra     done
  96. twenty: moveq   #0,btemp
  97.         move.l  textbufsize,-(sp)
  98.         lsr.l   #3,textbufsize
  99.         bra     decr82
  100. loop82:  DO_CRC2
  101.          DO_CRC2
  102.          DO_CRC2
  103.          DO_CRC2
  104.          DO_CRC2
  105.          DO_CRC2
  106.          DO_CRC2
  107.          DO_CRC2
  108. decr82:  dbra   textbufsize,loop82
  109.         move.l  (sp)+,textbufsize
  110.         and.w   #7,textbufsize
  111.         bra.s   decr12
  112. loop12:  DO_CRC2
  113. decr12:  dbra   textbufsize,loop12
  114.     ENDC    ; ?NO_UNROLLED_LOOPS
  115. done:   movem.l (sp)+,btemp/ltemp
  116.         not.l   crcval
  117. ;;;;;   move.l  crcval,d0               ; crcval already is d0
  118.         rts