alanm@bprcsitu.UUCP (Alan McIvor) (06/20/91)
Hi,
Sorry if these are FAQs, but I am a new reader of this list.
1) Can someone please give me a working algorithm for doing the CRC
calculation. I have tried the one in Dibble but can't get it to work.
2) How do I go about getting code from places like smilodon, preferably from a
mail server, as we don't have ftp access yet.
Thanks,
Dr Alan M. McIvor
BP International Ltd ...{mcsun,uunet}!ukc!bprcsitu!alanm
Research Centre Sunbury alanm%bprcsitu.uucp@uk.ac.ukc
Chertsey Road bprcsitu!alanm@relay.eu.net
Sunbury-on-Thames Tel: +44 932 764252
Middlesex TW16 7LN Fax: +44 932 762999
U.K. ekuns@kilroy.chi.il.us (Eddie Kuns) (06/23/91)
Here's a fragment of a program I had lying around. It's a sample CRC
calculation under OS-9/6809 and it updates the CRC when done. It's
a very simplistic program just as an example. It assumes the entire
file is a single module. Bells and whistles can easily be added, but
I never needed them. Here's the program:
========================= 8< ===================== 8< ========================
/* calc_crc.c */
/*
* I cut calc_crc.c out of a larger program. I release this code into
* the public domain as a demonstration of how to calculate CRC's in OS-9.
* Anyone is free to copy and distribute this code as freely as desired,
* including using it in commercial applications without my explicit
* permission. (That's what PD means!) When distributing this file without
* any changes to the code, please leave this header unchanged as well.
*
* This code was written and tested under OS-9/6809 and may or may not work
* under OS-9/680x0 or OS-9000; however, the basic principles should be the
* same. This program, as written, depends on Carl Krieder's clib.l for
* OS-9/6809.
*
* Eddie Kuns
*
* School: EKuns@zodiac.rutgers.edu (domain) EKuns@zodiac (bitnet)
* Home : ekuns@kilroy.chi.il.us kilroy!ekuns@linac.fnal.gov
* Home : ...!{linac,liltyke}!kilroy!ekuns Delphi: EddieKuns
*/
#include <stdio.h>
#include <os9.h>
#define ctoi(x) ((x) & 0xff)
main(argc, argv)
int argc;
char *argv[];
{
struct registers regs;
char CRC[3], *iobuf, *file, *malloc();
long length, left, _gs_size();
int path, count, bufsiz, err;
if (argc != 2)
{
printf("This program calculates and updates the CRC of a module.\n");
printf("In this simple version, it assumes the file it is given\n");
printf("only contains a single module.\n\n");
printf("Usage: calc_crc filename\n");
exit(0);
}
file = argv[1];
/* Initialize CRC */
CRC[0] = CRC[1] = CRC[2] = 0xff;
if ((path = open(file, _READ | _WRITE)) == -1)
exit(errno);
/* find out how long the file is, excepting CRC bytes */
left = length = _gs_size(path) - 3L;
bufsiz = 25600; /* 25k buffer */
if ((iobuf = malloc(bufsiz)) == NULL)
exit(207); /* Out of memory */
/* Calculate the CRC on the file incrementally */
while (left > 0L)
{
count = (left < (long) bufsiz) ? (int) left : bufsiz;
if ((count = read(path, iobuf, count)) <= 0)
{
err = errno;
printf("Disk read failure, CRC calculation aborted\n");
exit(err);
}
left -= (long) count;
regs.rg_x = iobuf;
regs.rg_y = count;
regs.rg_u = CRC;
_os9(F_CRC, ®s);
}
/* Calculate one's complement */
CRC[0] = ~CRC[0];
CRC[1] = ~CRC[1];
CRC[2] = ~CRC[2];
printf("The new CRC = $%02X%02X%02X\n\n", ctoi(CRC[0]), ctoi(CRC[1]),
ctoi(CRC[2]));
/*
* Update the CRC
*/
lseek(path, length, 0);
write(path, CRC, 3);
close(path);
}
========================= 8< ===================== 8< ========================