!%include "crc32.inc"

! crc32.imp -- compute the CRC-32 of a data stream
! Copyright (C) 1995-1998 Mark Adler
! For conditions of distribution and use, see copyright notice in zlib.h 

! ========================================================================
! Table of CRC-32's of all single-byte values (made by make_crc table)

own integer array crc table(0:255) =
  16_00000000, 16_77073096, 16_ee0e612c, 16_990951ba, 16_076dc419,
  16_706af48f, 16_e963a535, 16_9e6495a3, 16_0edb8832, 16_79dcb8a4,
  16_e0d5e91e, 16_97d2d988, 16_09b64c2b, 16_7eb17cbd, 16_e7b82d07,
  16_90bf1d91, 16_1db71064, 16_6ab020f2, 16_f3b97148, 16_84be41de,
  16_1adad47d, 16_6ddde4eb, 16_f4d4b551, 16_83d385c7, 16_136c9856,
  16_646ba8c0, 16_fd62f97a, 16_8a65c9ec, 16_14015c4f, 16_63066cd9,
  16_fa0f3d63, 16_8d080df5, 16_3b6e20c8, 16_4c69105e, 16_d56041e4,
  16_a2677172, 16_3c03e4d1, 16_4b04d447, 16_d20d85fd, 16_a50ab56b,
  16_35b5a8fa, 16_42b2986c, 16_dbbbc9d6, 16_acbcf940, 16_32d86ce3,
  16_45df5c75, 16_dcd60dcf, 16_abd13d59, 16_26d930ac, 16_51de003a,
  16_c8d75180, 16_bfd06116, 16_21b4f4b5, 16_56b3c423, 16_cfba9599,
  16_b8bda50f, 16_2802b89e, 16_5f058808, 16_c60cd9b2, 16_b10be924,
  16_2f6f7c87, 16_58684c11, 16_c1611dab, 16_b6662d3d, 16_76dc4190,
  16_01db7106, 16_98d220bc, 16_efd5102a, 16_71b18589, 16_06b6b51f,
  16_9fbfe4a5, 16_e8b8d433, 16_7807c9a2, 16_0f00f934, 16_9609a88e,
  16_e10e9818, 16_7f6a0dbb, 16_086d3d2d, 16_91646c97, 16_e6635c01,
  16_6b6b51f4, 16_1c6c6162, 16_856530d8, 16_f262004e, 16_6c0695ed,
  16_1b01a57b, 16_8208f4c1, 16_f50fc457, 16_65b0d9c6, 16_12b7e950,
  16_8bbeb8ea, 16_fcb9887c, 16_62dd1ddf, 16_15da2d49, 16_8cd37cf3,
  16_fbd44c65, 16_4db26158, 16_3ab551ce, 16_a3bc0074, 16_d4bb30e2,
  16_4adfa541, 16_3dd895d7, 16_a4d1c46d, 16_d3d6f4fb, 16_4369e96a,
  16_346ed9fc, 16_ad678846, 16_da60b8d0, 16_44042d73, 16_33031de5,
  16_aa0a4c5f, 16_dd0d7cc9, 16_5005713c, 16_270241aa, 16_be0b1010,
  16_c90c2086, 16_5768b525, 16_206f85b3, 16_b966d409, 16_ce61e49f,
  16_5edef90e, 16_29d9c998, 16_b0d09822, 16_c7d7a8b4, 16_59b33d17,
  16_2eb40d81, 16_b7bd5c3b, 16_c0ba6cad, 16_edb88320, 16_9abfb3b6,
  16_03b6e20c, 16_74b1d29a, 16_ead54739, 16_9dd277af, 16_04db2615,
  16_73dc1683, 16_e3630b12, 16_94643b84, 16_0d6d6a3e, 16_7a6a5aa8,
  16_e40ecf0b, 16_9309ff9d, 16_0a00ae27, 16_7d079eb1, 16_f00f9344,
  16_8708a3d2, 16_1e01f268, 16_6906c2fe, 16_f762575d, 16_806567cb,
  16_196c3671, 16_6e6b06e7, 16_fed41b76, 16_89d32be0, 16_10da7a5a,
  16_67dd4acc, 16_f9b9df6f, 16_8ebeeff9, 16_17b7be43, 16_60b08ed5,
  16_d6d6a3e8, 16_a1d1937e, 16_38d8c2c4, 16_4fdff252, 16_d1bb67f1,
  16_a6bc5767, 16_3fb506dd, 16_48b2364b, 16_d80d2bda, 16_af0a1b4c,
  16_36034af6, 16_41047a60, 16_df60efc3, 16_a867df55, 16_316e8eef,
  16_4669be79, 16_cb61b38c, 16_bc66831a, 16_256fd2a0, 16_5268e236,
  16_cc0c7795, 16_bb0b4703, 16_220216b9, 16_5505262f, 16_c5ba3bbe,
  16_b2bd0b28, 16_2bb45a92, 16_5cb36a04, 16_c2d7ffa7, 16_b5d0cf31,
  16_2cd99e8b, 16_5bdeae1d, 16_9b64c2b0, 16_ec63f226, 16_756aa39c,
  16_026d930a, 16_9c0906a9, 16_eb0e363f, 16_72076785, 16_05005713,
  16_95bf4a82, 16_e2b87a14, 16_7bb12bae, 16_0cb61b38, 16_92d28e9b,
  16_e5d5be0d, 16_7cdcefb7, 16_0bdbdf21, 16_86d3d2d4, 16_f1d4e242,
  16_68ddb3f8, 16_1fda836e, 16_81be16cd, 16_f6b9265b, 16_6fb077e1,
  16_18b74777, 16_88085ae6, 16_ff0f6a70, 16_66063bca, 16_11010b5c,
  16_8f659eff, 16_f862ae69, 16_616bffd3, 16_166ccf45, 16_a00ae278,
  16_d70dd2ee, 16_4e048354, 16_3903b3c2, 16_a7672661, 16_d06016f7,
  16_4969474d, 16_3e6e77db, 16_aed16a4a, 16_d9d65adc, 16_40df0b66,
  16_37d83bf0, 16_a9bcae53, 16_debb9ec5, 16_47b2cf7f, 16_30b5ffe9,
  16_bdbdf21c, 16_cabac28a, 16_53b39330, 16_24b4a3a6, 16_bad03605,
  16_cdd70693, 16_54de5729, 16_23d967bf, 16_b3667a2e, 16_c4614ab8,
  16_5d681b02, 16_2a6f2b94, 16_b40bbe37, 16_c30c8ea1, 16_5a05df1b,
  16_2d02ef8d


! =========================================================================

external long fn crc32 ch (long crc, byte integer c)
  crc = crc !! 16_FFFFFFFF
  !printstring("> crc = crc table((");write(crc,0);printstring(" !! ");write(c,0);printstring(") & 16_ff) !! (");write(crc,0);printstring(" >> 8)");newline
  crc = crc table((crc !! c) & 16_ff) !! (crc >> 8)
  !printstring("< crc = crc table((");write((crc!!c)&255,0);printstring(") !! ");write(crc>>8,0);newline
  result = crc !! 16_FFFFFFFF
end

external long fn crc32 mem (long crc, integer memp, integer length)
!printstring("addr: "); write(memp,0);
!newline
!printstring("length: "); write(length,0);
!newline
  while length > 0 cycle
    crc = crc32 ch(crc, byteinteger(memp))
    memp = memp+1
    length = length-1
  repeat
!printstring("result: "); write(crc,0);newline
  result = crc
end

external long fn crc32 (name memp, integer length)
  integer crc = 0
  result = crc32 mem(crc, ADDR(memp), length)
end

!%begin
!  print string("test: "); write(crc32(crc table, 256*4), 0); newline
!%end %of %program

end of file