#pragma inline /* tell turbo assemble to use inline assembly */ #ifndef LINT static char sccsid[]="$Source: /usr/home/dhesi/zoo/RCS/addbftcc.c,v $\n\ $Id: addbftcc.c,v 1.1 91/07/07 18:40:11 dhesi Exp $"; #endif /* LINT */ extern unsigned int crccode; extern unsigned crctab[]; void addbfcrc(buffer,count) char *buffer; int count; { (void) kbhit(); /* allow keyboard interrupt to occur */ _AX = crccode; /* ax holds crccode value */ _CX = count; /* cx holds byte count */ asm les di,buffer /* es:di holds buffer address */ asm jcxz done /* if zero bytes, just skip */ /* loop begins here */ xloop: asm sub bh,bh asm mov bl,al asm xor bl,es:[di] /* now bx = (crccode xor c) & 0x00ff */ /* next statement shifts _BX left (2-byte items) */ _DX = crctab[_BX]; /* dx <= *buffer == exp2 */ asm sub bh,bh /* bh = 0 */ asm mov bl,ah /* bx <- exp1 */ asm xor bx,dx /* bx <- exp1 xor exp2 */ asm mov ax,bx /* crccode <- exp1 xor exp2 */ asm inc di /* inc buffer pointer */ asm loop xloop /* dec CX, jump if not zero */ /* loop ends here */ crccode = _AX; /* put back calculated CRC value */ done: ; } #if 0 ; The following (edited) code was generated by Turbo C from the ; preceding code. It is supplied here for porting to other systems ; and for user education. _TEXT segment byte public 'CODE' _TEXT ends DGROUP group _DATA,_BSS assume cs:_TEXT,ds:DGROUP _DATA segment word public 'DATA' _DATA ends _BSS segment word public 'BSS' _BSS ends _TEXT segment byte public 'CODE' assume cs:_TEXT _addbfcrc proc near push bp mov bp,sp push di call near ptr _kbhit mov ax,word ptr DGROUP:_crccode mov cx,word ptr [bp+8] les di,[bp+4] jcxz short @1@362 @1@98: sub bh,bh mov bl,al xor bl,es:[di] shl bx,1 mov dx,word ptr DGROUP:_crctab[bx] sub bh,bh mov bl,ah xor bx,dx mov ax,bx inc di loop short @1@98 mov word ptr DGROUP:_crccode,ax @1@362: pop di pop bp ret _addbfcrc endp _TEXT ends extrn _crccode:word extrn _kbhit:near extrn _crctab:word public _addbfcrc end #endif