home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
ftp.barnyard.co.uk
/
2015.02.ftp.barnyard.co.uk.tar
/
ftp.barnyard.co.uk
/
cpm
/
walnut-creek-CDROM
/
BEEHIVE
/
COMMS
/
YAM.ARC
/
YAM89.CSM
< prev
next >
Wrap
Text File
|
1990-09-20
|
5KB
|
165 lines
;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