ASMB
       NAM CRC16,7 . 92903-16001 REV.1805  770718 
* 
*     SOURCE 92903-18010
* 
      SPC 2 
**************************************************************
* (C) COPYRIGHT HEWLETT-PACKARD COMPANY 1978.  ALL RIGHTS    *
* RESERVED.  NO PART OF THIS PROGRAM MAY BE PHOTOCOPIED, RE- *
* PRODUCED, OR TRANSLATED TO ANOTHER PROGRAM LANGUAGE WITH-  *
* OUT THE PRIOR WRITTEN CONSENT OF HEWLETT-PACKARD COMPANY.  *
**************************************************************
      SPC 2 
* 
**********************************************************************
*                                                                    *
*                 THIS SUBROUTINE IS USED TO COMPUTE THE CRC-16      *
*   CHECKSUM OF A BUFFER                                             *
*                                                                    *
*           CALLING PARAMETERS :                                     *
*                                                                    *
*                 IBUF : BUFFER                                      *
*                 IL   : BUFFER LENGTH IN BYTES                      *
*                 IWD  : CHECKSUM WORD                               *
*                                                                    *
**********************************************************************
* 
* 
      ENT CRC16 
      EXT .ENTR 
* 
* GET CALLING PARAMETER ADDRESS 
* 
IBUF  NOP           BUFFER ADDRESS
IL    NOP           BUFER LENGTH IN BYTES 
IWD   NOP           CHECKSUM WORD 
CRC16 NOP           ENTRY POINT 
      JSB .ENTR 
      DEF IBUF
* 
      LDA IL,I      GET # OF BYTES
      CMA,INA       MAKE IT NEGATIVE
      SSA,RSS       IS POSITIVE 
      JMP CRC16,I   YES ERROR ! 
      STA COUNT     OK STORE IN COUNTER 
      LDB IBUF      GET BUFFER ADDRESS
      CLE,ELB       MULTIPLY BY TWO TO HAVE BYTE ADDRESS
* 
LP1   LBT           GET NEXT BYTE IN BUFFER 
      STB IBUF      SAVE ADDRESS OF NEXT BYTE 
      LDB A         SWAP A AND B REGISTER 
      LDA IWD,I     GET OLD CHECKSUM WORD 
      JSB EBCLC     COMPUTE NEW CHECSUM 
      STA IWD,I     STORE IT
      LDB IBUF      RESTORE B REGISTER
      ISZ COUNT     INCREMENT COUNTER 
      JMP LP1       NOT FINISHED GO TO NEXT BYTE
      JMP CRC16,I   FINISHED RETURN 
* 
*  SUBROUTINE TO COMPUTE CRC-16 CHECKSUM
* 
EBCLC NOP           ENTRY POINT 
      XOR B 
      SLA,RAR 
      XOR POLY
      SLA,RAR 
      XOR POLY
      SLA,RAR 
      XOR POLY
      SLA,RAR 
      XOR POLY
      SLA,RAR 
      XOR POLY
      SLA,RAR 
      XOR POLY
      SLA,RAR 
      XOR POLY
      SLA,RAR 
      XOR POLY
      JMP EBCLC,I   RETURN
* 
*  DATA,CONSTANTS,STORAGE...
* 
A     EQU 0 
B     EQU 1 
COUNT NOP 
POLY  OCT 20001 
* 
      END CRC16 
                                                                                                                                                                                                                          