home *** CD-ROM | disk | FTP | other *** search
- ;YAM89.CSM (YAM8 & YAM9 combined for BDSC v1.46)
- ;
- ;>>:yam8.asm 9-30-81
- ;
- ;CRCK is a program to read any CP/M file and print
- ;a CYCLIC-REDUNDANCY-CHECK number based on the
- ;CCITT standard polynominal:
- ; X^16 + X^15 + X^13 + X^7 + X^4 + X^2 + X + 1
- ;
- ;Useful for checking accuracy of file transfers.
- ;More accurate than a simple checksum.
- ;
- ;**************************************************
- ;
- ; unsigned crck(buffer, bufsize, oldcrc)
- ;
- ; At start of packet, oldcrc is set to 0
- ;
- ; crc is accumulated by:
- ; oldcrc=crck(buffer, bufsize, oldcrc);
- ;
- ; crck for file is final value of oldcrc
- ;
- ; A Short History of this function and crckfile() in yam7.c"
- ;
- ; 1. First version used getc and called crck once per char.
- ; this took 39.2 seconds to crck all the yam C files (12357)
- ;
- ; 2. Then crckfile was recoded to use read() instead of getc.
- ; Time: 19.1 seconds
- ;
- ; 3. Several small changes in crckfile were unsuccessful in
- ; reducing this time.
- ;
- ; 4. crck and crckfile recoded to call crck once per sector.
- ; This reduced time to 11.7 seconds, same as crck itself.
- ; That is the current version. Note that the CRC polynomial used
- ; here is somewhat unusual; the only thing I know sure is that
- ; the answers agree with those given by the CRCK program -hence the
- ; function name.
- ;
- maclib bds
-
- function crck
-
- call arghak
- push b
- bytlop: lhld arg1
- mov c,m
- inx h ;fetch (next) byte from buffer
- shld arg1
- lhld arg3 ; get accumulated checksum
- ;
- ;---------------------------------------------
- ;An 8080 routine for generating a CYCLIC-
- ;REDUNDANCY-CHECK. Character leaves that
- ;character in location REM. By Fred Gutman.
- ;From 'EDN' magazine, June 5, 1979 issue, page 84.
- ;
- DIVP:
- MOV A,H
- ANI 128 ;Q-BIT MASK
- PUSH PSW ;SAVE STATUS
- DAD H ;2 X R(X)
- mov a,c
- ADD L
- MOV L,A
- POP PSW
- JZ QB2 ;IF Q-BIT IS ZERO
- MOV A,H
- XRI 0A0H ;MS HALF OF GEN. POLY
- MOV H,A
- MOV A,L
- XRI 97H ;LS HALF OF GEN. POLY
- MOV L,A
- QB2:
- shld arg3 ;store in accumulator
- lhld arg2
- dcx h
- shld arg2 ;count number of bytes in buffer
- mov a,h
- ora l
- jnz bytlop
- lhld arg3 ;return with accumulated crck in HL
- pop b ;pull up ur shorts
- RET
-
- endfunction
- ;>>:yam9.asm 9-30-81
- ;************************************************************************
- ;* CRCSUBS (Cyclic Redundancy Code Subroutines) version 1.20 *
- ;* 8080 Mnemonics *
- ;* *
- ;* This subroutine will compute and check a true 16-bit *
- ;* Cyclic Redundancy Code for a message of arbitrary length. *
- ;* *
- ;* The use of this scheme will guarantee detection of all *
- ;* single and double bit errors, all errors with an odd *
- ;* number of error bits, all burst errors of length 16 or *
- ;* less, 99.9969% of all 17-bit error bursts, and 99.9984% *
- ;* of all possible longer error bursts. (Ref: Computer *
- ;* Networks, Andrew S. Tanenbaum, Prentiss-Hall, 1981) *
- ;* *
- ;* *
- ;************************************************************************
- ;* *
- ;* From: CRCSUB12.ASM *
- ;* Designed & coded by Paul Hansknecht, June 13, 1981 *
- ;* *
- ;* *
- ;* Copyright (c) 1981, Carpenter Associates *
- ;* Box 451 *
- ;* Bloomfield Hills, MI 48013 *
- ;* 313/855-3074 *
- ;* *
- ;* This program may be freely reproduced for non-profit use. *
- ;* *
- ;************************************************************************
- ;
- ; unsigned updcrc(char, oldcrc)
- ;
- ; At start of packet, oldcrc is set to initial value
- ; oldcrc=0;
- ;
- ; crc is accumulated by:
- ; oldcrc=updcrc(char, oldcrc);
- ;
- ; at end of packet,
- ; oldcrc=updcrc(0,updcrc(0,oldcrc));
- ; send(oldcrc>>8); send(oldcrc);
- ;
- ; on receive, the return value of updcrc is checked after the
- ; last call (with the second CRC byte); 0 indicates no error detected
- ;
-
- function updcrc
-
- push b ;save stack frame
- call ma2toh ;get char
- mov c,a
- call ma3toh ;and olde crc value
- MVI B,8
- UPDLOOP:MOV A,C
- RLC
- MOV C,A
- MOV A,L
- RAL
- MOV L,A
- MOV A,H
- RAL
- MOV H,A
- JNC SKIPIT
- MOV A,H ; The generator is X^16 + X^12 + X^5 + 1
- XRI 10H ; as recommended by CCITT.
- MOV H,A ; An alternate generator which is often
- MOV A,L ; used in synchronous transmission protocols
- XRI 21H ; is X^16 + X^15 + X^2 + 1. This may be
- MOV L,A ; used by substituting XOR 80H for XOR 10H
- SKIPIT: DCR B ; and XOR 05H for XOR 21H in the adjacent code.
- JNZ UPDLOOP
- POP B
- RET ; return with latest crc in hl
-
- endfunction