OPT MODULE
OPT PREPROCESS

EXPORT PROC crcchecksum(mem:PTR TO CHAR,len,crc=0)

 /*
  * updcrc macro derived from article Copyright (C) 1986 Stephen Satchell.
  *  NOTE: First argument must be in range 0 to 255.
  *        Second argument is referenced twice.
  *
  * Programmers may incorporate any or all code into their programs,
  * giving proper credit within the source. Publication of the
  * source routines is permitted so LONG as proper credit is given
  * to Stephen Satchell, Satchell Evaluations and Chuck Forsberg,
  * Omen Technology.
  */

   MOVEM.L D1-D7/A0-A6,-(A7)
   MOVE.L  mem,A0
   MOVE.L  len,D3
   MOVE.L  crc,D2
   BRA     lab2
lab1:
   LEA     crctab(PC),A6
   MOVEQ   #0,D7
   MOVE.W  D2,D7
   ASR.L   #$8,D7
   AND.L   #$FF,D7
   MOVEQ   #0,D6
   MOVEQ   #0,D5
   MOVE.L  D7,D5
   LSL.L   #1,D5
   MOVE.W  0(A6,D5.L),D6
   MOVEQ   #0,D7
   MOVE.W  D2,D7
   ASL.L   #$8,D7
   EOR.L   D7,D6
   MOVEQ   #0,D7
   MOVE.B  (A0)+,D7
   EOR.L   D7,D6
   MOVE.W  D6,D2
lab2:
   MOVE.L  D3,D7
   SUBQ.L  #1,D3
   CMP.L   #0,D7
   BGT.B   lab1

   MOVEQ   #0,D0
   MOVE.L  D2,D0
   MOVEM.L (A7)+,D1-D7/A0-A6
ENDPROC D0


 /* crctab calculated by Mark G. Mendel,
    Network Systems Corporation
  */
crctab:
  INT  $0000,$1021,$2042,$3063,$4084,$50A5,$60C6,$70E7
  INT  $8108,$9129,$A14A,$B16B,$C18C,$D1AD,$E1CE,$F1EF
  INT  $1231,$0210,$3273,$2252,$52B5,$4294,$72F7,$62D6
  INT  $9339,$8318,$B37B,$A35A,$D3BD,$C39C,$F3FF,$E3DE
  INT  $2462,$3443,$0420,$1401,$64E6,$74C7,$44A4,$5485
  INT  $A56A,$B54B,$8528,$9509,$E5EE,$F5CF,$C5AC,$D58D
  INT  $3653,$2672,$1611,$0630,$76D7,$66F6,$5695,$46B4
  INT  $B75B,$A77A,$9719,$8738,$F7DF,$E7FE,$D79D,$C7BC
  INT  $48C4,$58E5,$6886,$78A7,$0840,$1861,$2802,$3823
  INT  $C9CC,$D9ED,$E98E,$F9AF,$8948,$9969,$A90A,$B92B
  INT  $5AF5,$4AD4,$7AB7,$6A96,$1A71,$0A50,$3A33,$2A12
  INT  $DBFD,$CBDC,$FBBF,$EB9E,$9B79,$8B58,$BB3B,$AB1A
  INT  $6CA6,$7C87,$4CE4,$5CC5,$2C22,$3C03,$0C60,$1C41
  INT  $EDAE,$FD8F,$CDEC,$DDCD,$AD2A,$BD0B,$8D68,$9D49
  INT  $7E97,$6EB6,$5ED5,$4EF4,$3E13,$2E32,$1E51,$0E70
  INT  $FF9F,$EFBE,$DFDD,$CFFC,$BF1B,$AF3A,$9F59,$8F78
  INT  $9188,$81A9,$B1CA,$A1EB,$D10C,$C12D,$F14E,$E16F
  INT  $1080,$00A1,$30C2,$20E3,$5004,$4025,$7046,$6067
  INT  $83B9,$9398,$A3FB,$B3DA,$C33D,$D31C,$E37F,$F35E
  INT  $02B1,$1290,$22F3,$32D2,$4235,$5214,$6277,$7256
  INT  $B5EA,$A5CB,$95A8,$8589,$F56E,$E54F,$D52C,$C50D
  INT  $34E2,$24C3,$14A0,$0481,$7466,$6447,$5424,$4405
  INT  $A7DB,$B7FA,$8799,$97B8,$E75F,$F77E,$C71D,$D73C
  INT  $26D3,$36F2,$0691,$16B0,$6657,$7676,$4615,$5634
  INT  $D94C,$C96D,$F90E,$E92F,$99C8,$89E9,$B98A,$A9AB
  INT  $5844,$4865,$7806,$6827,$18C0,$08E1,$3882,$28A3
  INT  $CB7D,$DB5C,$EB3F,$FB1E,$8BF9,$9BD8,$ABBB,$BB9A
  INT  $4A75,$5A54,$6A37,$7A16,$0AF1,$1AD0,$2AB3,$3A92
  INT  $FD2E,$ED0F,$DD6C,$CD4D,$BDAA,$AD8B,$9DE8,$8DC9
  INT  $7C26,$6C07,$5C64,$4C45,$3CA2,$2C83,$1CE0,$0CC1
  INT  $EF1F,$FF3E,$CF5D,$DF7C,$AF9B,$BFBA,$8FD9,$9FF8
  INT  $6E17,$7E36,$4E55,$5E74,$2E93,$3EB2,$0ED1,$1EF0
  INT  $0
