*DECK LFGCKSM 
          IDENT  LFGCKSM
          COMMENT            LFGCKSM - ROUTINE TO CALCULATE THE CHECKSUM
          TITLE              LFGCKSM - ROUTINE TO CALCULATE THE CHECKSUM
          ENTRY  LFGCKSM
*IF DEF,IMS 
**    LFGCKSM - CALCULATE CHECKSUM. 
* 
*     JJ MCAFEE 75/07/01
*     M. E. VATCHER  81/02/24 
* 
*     LFGCKSM FORMS A CHECKSUM BY TAKING THE ONE"S COMPLEMENT OF
*     THE INTEGER SUM OF N 16 BIT WORDS.
* 
*     LFGCKSM(BUFADD,BITPOS,NWDS,CKSM)
* 
*     ENTRY BUFADD    ADDRESS OF BUFFER CONTAINING DATA 
*           BITPOS    BIT POSITION (0-59) OF MOST SIGNIFICANT BIT OF
*                     FIRST WORD
*           NWDS      NUMBER OF 16 BIT WORDS TO CHECKSUM
* 
*     EXIT  CKSM      WORD WHERE CHECKSUM IS RETURNED, RIGHT JUSTIFIED
* 
*     METHOD
* 
*     GIVEN THE INPUT BUFFER DATA AND THE NUMBER OF 16 BIT WORDS
*     IN THE BUFFER, CALCULATE THE CHECKSUM, MAPPING AND SHIFTING 
*     BITS AS NEEDED.  REGISTERS USED: ALL B AND X REGISTERS, AND 
*     A1,A2,A4,A5,A6,A7.
* 
*ENDIF
 LFGCKSM  DATA   0           ENTRY
          B7=1
          SB7    1
* 
*         PICK UP AND SAVE ENTRY PARAMETERS 
* 
          SA2    X1          BUFFER ADDRESS ADDRESS 
          SA2    X2          BUFFER FWA 
          SA1    A1+B7
          SA5    X1          STARTING BIT POSITION
          SB2    X5            INTO B2
          SA1    A1+B7
          SA5    X1          NUMBER OF 16 BIT WORDS 
          SB3    X5            INTO B3
          SA1    A1+B7       CKSUM STORAGE ADDRESS
          SA5    X1            INTO A5
* 
*         FORM CONSTANTS AND SUCH 
* 
          SB1    16 
          SB4    60          HANDY COUNT TO HAVE IN A 60 BIT MACHINE
          MX6    0           CLEAR X6 FOR CHECKSUM
          SB2    B2+B7       INCREMENT START BIT COUNT BY 1 
          LT     B2,B1,SPEC   WRAP AROUND START, SPECIAL PROCESS
* 
* 
*         PICK UP WORDS AND DROP OUT 16 BIT CHECKSUM WORDS
* 
* 
 CKS1     MX5    16          FORM MASK FOR 16 BIT WORD
          LX5    B2,X5       SHIFT MASK 
          BX3    X5*X2       GET 16 BIT WORD FROM BUFFER
          SB5    B4-B2       GET SHIFT COUNT TO POS. WORD IN LOW BITS 
          SB5    B5+B1
          LX7    B5,X3       POSITION WORD IN LOW 16 BITS 
          IX6    X6+X7       INTEGER ADD FOR CHECKSUM 
          MX5    1           CHECK FOR OVERFLOW 
          LX5    17 
          BX5    X6*X5
          ZR     X5,CKS2     NONE, CONTINUE 
          MX5    44 
          BX6    -X5*X6      MASK OUT LOW 16 BITS 
          SX6    X6+B7       AND  ADD IN OVERFLOW 
* 
*         MOVE, SHIFT, REPOSITION AND START AGAIN 
* 
 CKS2     SB3    B3-B7       SEE IF FINISHED
          ZR     B3,EXIT
          SB2    B2-B1       DECREMENT START BY 16
          GE     B2,B1,CKS1  IF START .GE. 16, BACK TO MAIN LOOP
          NZ     B2,SPEC     IF START .LT. 16, BUT .GT. 0, SPECIAL PROC.
          SB2    B4          RESET START
          SA2    A2+B7       GET NEXT BUFFER WORD 
          EQ     CKS1        BACK TO MAIN LOOP
* 
*         SPECIAL PROCESSING FOR END WORD WRAPAROUND
* 
 SPEC     MX5    16          FORM MASK
          LX4    B2,X5       POSITION MASK
          MX7    16 
          LX7    16          SET UP MASK MASK 
          BX4    X4*X7       NOW HAVE MASK FOR LOW BITS OF WD 1 
          BX3    X4*X2       GET LOW BITS 
          SB5    B1-B2       SEE HOW MANY TO MOVE 
          LX3    B5,X3       MOVE LOWER BITS TO ALLOW FOR UPPER BITS
          LX5    B2,X5       POSITION MASK FOR UPPER BITS 
          BX5    -X7*X5      REMOVE ALL BUT UPPER BITS
          SA2    A2+B7       GET NEW BUFFER WORD
          BX4    X5*X2        AND PICK UP UPPER BITS
          LX4    B5,X4       MOVE TO LOW POSITION 
          BX7    X3+X4       ADD TO UPPER BITS
          IX6    X6+X7       INTEGER ADD FOR CHECKSUM 
          MX5    1           CHECK FOR OVERFLOW 
          LX5    17 
          BX5    X6*X5
          ZR     X5,SPEC1    NONE, CONTINUE 
          MX5    44 
          BX6    -X5*X6      MASK OUT LOW 16 BITS 
          SX6    X6+B7       AND  ADD IN OVERFLOW 
* 
*         RESET EVERYTHING
* 
 SPEC1    SB3    B3-B7
          ZR     B3,EXIT     EXIT IF FINISHED 
          SB2    B4-B5       RESET B2 FOR NEXT WORD 
          EQ     CKS1        GO BACK TO MAIN LOOP 
* 
*         FINISHED, STORE CHECKSUM AND EXIT 
 EXIT     MX7    16          TAKE COMPLEMENT OF SUM 
          LX7    16 
          BX6    -X6*X7 
          SA6    A5 
          EQ     LFGCKSM
          END 
