home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 9 Archive / 09-Archive.zip / unzip511.zip / amiga / crc_68.a < prev    next >
Text File  |  1994-06-20  |  2KB  |  65 lines

  1. ; Not copyrighted by Paul Kienitz, 18 Jun 94.
  2. ;
  3. ; Return an updated 32 bit CRC value, given the old value and a block of data.
  4. ; This substitutes for the following lines at the top of flush() in file_io.c
  5. ; in UnZip, or a similar loop in updcrc() in util.c in Zip:
  6. ;
  7. ;    register ulg crcval = crc32val;
  8. ;    register ulg n = size;
  9. ;    register uch *p=rawbuf;
  10. ;    while (n--)
  11. ;        crcval = crc_32_tab[((uch)crcval ^ (*p++)) & 0xff] ^ (crcval >> 8);
  12. ;    crc32val = crcval;
  13. ;
  14. ; Those lines are replace with this call:
  15. ;
  16. ;    crc32val = CalcCRC(crc_32_tab, crc32val, rawbuf, size);
  17. ;
  18. ; We have here the CalcCRC() code for Amiga.  Define REGARGS if you can cause
  19. ; your compiler to put the four args in the registers A0, D0, A1, D1.  I'm not
  20. ; sure, but I think you should define ATSIGN when using the SAS/C assembler.
  21. ; I wrote this because I found that, at least with the Aztec compiler, this loop
  22. ; was occupying about a quarter of the CPU time with UnZip -t commands.
  23.  
  24.     xdef    _CalcCRC
  25.  
  26. temp        equr    d2
  27.  
  28. crc_table    equr    a0    array of unsigned long
  29. crcval        equr    d0    unsigned long initial value
  30. rawbuf        equr    a1    array of unsigned char
  31. rawbufsize    equr    d1    unsigned long (count of bytes in rawbuf)
  32.  
  33.  
  34.     IFD    REGARGS
  35.       IFD    ATSIGN
  36.       xdef    @CalcCRC
  37. @CalcCRC:
  38.       ELSE
  39. _CalcCRC:            ; args already in registers as named above
  40.       ENDC
  41.     ELSE    ; !REGARGS
  42. _CalcCRC:
  43.     move.l    4(sp),crc_table
  44.     move.l    8(sp),crcval
  45.     move.l    12(sp),rawbuf
  46.     move.l    16(sp),rawbufsize
  47.     ENDC
  48.  
  49.     move.l    temp,-(sp)
  50. loop:
  51.     subq.l    #1,rawbufsize
  52.     blt.s    done            ; we treat it as signed
  53.     moveq    #0,temp
  54.     move.b    (rawbuf)+,temp
  55.     eor.b    crcval,temp
  56.     lsl.w    #2,temp
  57.     move.l    0(crc_table,temp.w),temp
  58.     lsr.l    #8,crcval
  59.     eor.l    temp,crcval
  60.     bra.s    loop
  61. done:
  62. ;;;    move.l    crcval,d0        ; crcval already is d0
  63.     move.l    (sp)+,temp
  64.     rts
  65.