ASMB,R,L,C
* 
* 
*  ***************************************************************
*  * (C) COPYRIGHT HEWLETT-PACKARD COMPANY 1979.  ALL RIGHTS     *
*  * RESERVED.  NO PART OF THIS PROGRAM MAY BE PHOTOCOPIED,      *
*  * REPRODUCED OR TRANSLATED TO ANOTHER PROGRAM LANGUAGE WITHOUT*
*  * THE PRIOR WRITTEN CONSENT OF HEWLETT-PACKARD COMPANY.       *
* 
*     SOURCE PART NUMBER :92067-18392 
* 
*     RELOCATABLE PART NUMBER : 92067-16361 
* 
*     PROGRAMER(S)   : J.M.N. 
* 
*  ***************************************************************
* 
      NAM ACGBT,8 92067-16361 REV.1940 780807 
* 
* 
*     ACGBT IS A ROUTINE TO RETURN THE BIT POSITION OF THE NEXT 
*     BIT WHOSE VALUE IS ZERO, SCANNING FROM BIT 0 TO BIT 15, OR
*     FROM BIT 15 TO BIT 0.  ACGBT WILL UPDATE THE WORD, CHANGING 
*     THE VALUE OF THE BIT FROM 0 TO 1. 
* 
*     CALLING SEQUENCE:  CALL ACGBT (WORD,DIREC,BITNO)
*                WHERE
*                        WORD = WORD TO BE SCANNED
*                        DIREC= DIRECTION TO SCAN, -1 MEANS 0 TO 15 
*                                                   1 MEANS 15 TO 0 
*                        BITNO= BIT POSITION (0-15) OF BIT
*                             = -1 IF NONE FOUND WITH VALUE 0 
* 
* 
      ENT ACGBT 
      EXT .ENTR 
* 
WORD  NOP 
DIREC NOP 
BITNO NOP 
ACGBT NOP           ENTRY 
      JSB .ENTR     GET PARAMETER ADDRESSES 
      DEF WORD
      LDA M16       INITIALIZE BIT COUNT
      STA COUNT     SAVE IT 
      LDA WORD,I    GET WORD TO BE SCANNED
NEXT  LDB DIREC,I   GET DIRECTION TO SCAN 
      SSB,RSS       SCAN 0 TO 15? 
      JMP *+3       NO, SO GET NEXT BIT FROM HIGH END 
      ERA           YES, GET NEXT BIT FROM LOW END
      RSS 
      ELA 
      SEZ,RSS       BIT=0?
      JMP FOUND     YES, FOUND A FREE BIT 
      ISZ COUNT     NO, INCREMENT BIT COUNT 
      JMP NEXT      CONTINUE WITH NEXT BIT
      CCA           DONE WITH ALL 16 BITS, NONE FOUND 
      STA BITNO,I   RETURN NONE FOUND 
      JMP ACGBT,I 
* 
FOUND LDB COUNT     GET BIT COUNT 
      ADB .16       COMPUTE NUMBER OF SHIFTS DONE 
      CMB           AND MAKE NEGATIVE 
      STB CNT2      SAVE IT TO REVERSE THE SHIFTS 
      LDB DIREC,I   GET DIRECTION 
      CCE           SET THE BIT TO 1
SHIFT SSB,RSS       IF SCANNED 15 TO 0, THEN
      JMP *+3       REVERSE SHIFT BY MOVING E TO HIGH END 
      ELA           ELSE REVERSE BY MOVING E TO LOW END 
      RSS 
      ERA 
      ISZ CNT2      CONTINUE REVERSE SHIFT
      JMP SHIFT 
      STA WORD,I    RETURN UPDATED WORD 
* 
      LDA COUNT     GET BIT COUNT 
      LDB DIREC,I   GET DIRECTION 
      SSB,RSS       IF SCANNED 15 TO 0, THEN
      CMA,RSS       MAKE COUNT POSITIVE TO GET BIT POSITION 
      ADA .16       ELSE ADD 16 TO GET BIT POSITION 
      STA BITNO,I   RETURN BIT POSITION (0-15)
      JMP ACGBT,I   RETURN
* 
M16   DEC -16 
.16   DEC 16
COUNT NOP 
CNT2  NOP 
      END 
                                                                                              